@contentrain/mcp 1.8.1 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/README.md +5 -1
  2. package/dist/{annotations-BFJbfSKe.mjs → annotations-DSzewhL4.mjs} +42 -20
  3. package/dist/annotations-DSzewhL4.mjs.map +1 -0
  4. package/dist/{apply-manager-BRmB27H5.mjs → apply-manager-BnPbPXFG.mjs} +1 -1
  5. package/dist/{apply-manager-BRmB27H5.mjs.map → apply-manager-BnPbPXFG.mjs.map} +1 -1
  6. package/dist/{astro-parser-B-nLl0zE.mjs → astro-parser-BVoGjA6M.mjs} +3 -3
  7. package/dist/{astro-parser-B-nLl0zE.mjs.map → astro-parser-BVoGjA6M.mjs.map} +1 -1
  8. package/dist/availability-Bj9zOfEn.mjs +47 -0
  9. package/dist/availability-Bj9zOfEn.mjs.map +1 -0
  10. package/dist/{branch-lifecycle-7dQoF22r.d.mts → branch-lifecycle-AwBJIheA.d.mts} +1 -1
  11. package/dist/{branch-lifecycle-7dQoF22r.d.mts.map → branch-lifecycle-AwBJIheA.d.mts.map} +1 -1
  12. package/dist/{compiler-k4yttlzM.mjs → compiler-BZXAN4Ir.mjs} +2 -2
  13. package/dist/{compiler-k4yttlzM.mjs.map → compiler-BZXAN4Ir.mjs.map} +1 -1
  14. package/dist/{compiler-sfc.cjs-D0d_OicF.mjs → compiler-sfc.cjs-tFlmtjrJ.mjs} +2 -2
  15. package/dist/{compiler-sfc.cjs-D0d_OicF.mjs.map → compiler-sfc.cjs-tFlmtjrJ.mjs.map} +1 -1
  16. package/dist/{content-manager-DqDLSNQ-.d.mts → content-manager-BExZy6Eu.d.mts} +2 -2
  17. package/dist/{content-manager-DqDLSNQ-.d.mts.map → content-manager-BExZy6Eu.d.mts.map} +1 -1
  18. package/dist/core/apply-manager.mjs +1 -1
  19. package/dist/core/config.d.mts +1 -1
  20. package/dist/core/content-manager.d.mts +1 -1
  21. package/dist/core/context.d.mts +1 -1
  22. package/dist/core/contracts/index.d.mts +1 -1
  23. package/dist/core/doctor.mjs +2 -2
  24. package/dist/core/graph-builder.mjs +2 -2
  25. package/dist/core/model-manager.d.mts +1 -1
  26. package/dist/core/ops/index.d.mts +2 -2
  27. package/dist/core/overlay-reader.d.mts +1 -1
  28. package/dist/core/overlay-reader.mjs +1 -1
  29. package/dist/core/scan-config.mjs +1 -1
  30. package/dist/core/scanner.mjs +3 -3
  31. package/dist/core/validator/index.d.mts +1 -1
  32. package/dist/core/validator/index.mjs +1 -1
  33. package/dist/{detect-eWS6lvoH.mjs → detect-wVSI9VuY.mjs} +1 -1
  34. package/dist/{detect-eWS6lvoH.mjs.map → detect-wVSI9VuY.mjs.map} +1 -1
  35. package/dist/{doctor-qiUKCy9b.mjs → doctor-BTToHt0y.mjs} +2 -2
  36. package/dist/{doctor-qiUKCy9b.mjs.map → doctor-BTToHt0y.mjs.map} +1 -1
  37. package/dist/git/branch-lifecycle.d.mts +1 -1
  38. package/dist/git/transaction.d.mts +1 -1
  39. package/dist/{graph-builder-DXv2JEp-.mjs → graph-builder-CRUX_8mA.mjs} +2 -2
  40. package/dist/{graph-builder-DXv2JEp-.mjs.map → graph-builder-CRUX_8mA.mjs.map} +1 -1
  41. package/dist/index-6yasXNLQ.d.mts +2 -0
  42. package/dist/index.mjs +10 -10
  43. package/dist/{node-DN9hZeil.mjs → node-wC-z3NoZ.mjs} +1 -1
  44. package/dist/{node-DN9hZeil.mjs.map → node-wC-z3NoZ.mjs.map} +1 -1
  45. package/dist/{overlay-reader-CUs9jgqk.mjs → overlay-reader-BOb105gS.mjs} +1 -1
  46. package/dist/{overlay-reader-CUs9jgqk.mjs.map → overlay-reader-BOb105gS.mjs.map} +1 -1
  47. package/dist/{paths-C3xNyc7z.mjs → paths-BU6E-oDs.mjs} +1 -1
  48. package/dist/{paths-C3xNyc7z.mjs.map → paths-BU6E-oDs.mjs.map} +1 -1
  49. package/dist/providers/github/index.d.mts +1 -1
  50. package/dist/providers/github/index.mjs +1 -1
  51. package/dist/providers/gitlab/index.d.mts +1 -1
  52. package/dist/providers/gitlab/index.mjs +1 -1
  53. package/dist/providers/local/index.d.mts +2 -2
  54. package/dist/providers/local/index.d.mts.map +1 -1
  55. package/dist/{scan-config-jC6XmiqF.mjs → scan-config-BGUflS8t.mjs} +1 -1
  56. package/dist/{scan-config-jC6XmiqF.mjs.map → scan-config-BGUflS8t.mjs.map} +1 -1
  57. package/dist/{scanner-DKMwc03k.mjs → scanner-VOwrKLGC.mjs} +6 -6
  58. package/dist/{scanner-DKMwc03k.mjs.map → scanner-VOwrKLGC.mjs.map} +1 -1
  59. package/dist/server/http/index.d.mts +11 -1
  60. package/dist/server/http/index.d.mts.map +1 -1
  61. package/dist/server/http/index.mjs +20 -12
  62. package/dist/server/http/index.mjs.map +1 -1
  63. package/dist/{server-DZBcZWhE.d.mts → server-B1KfvywF.d.mts} +25 -10
  64. package/dist/server-B1KfvywF.d.mts.map +1 -0
  65. package/dist/{server-CXZFrEyu.mjs → server-B6_fzRmK.mjs} +47 -18
  66. package/dist/{server-CXZFrEyu.mjs.map → server-B6_fzRmK.mjs.map} +1 -1
  67. package/dist/server.d.mts +2 -2
  68. package/dist/server.mjs +11 -11
  69. package/dist/{source-map-generator-BWDva49I.mjs → source-map-generator-BIEiz3If.mjs} +1 -1
  70. package/dist/{source-map-generator-BWDva49I.mjs.map → source-map-generator-BIEiz3If.mjs.map} +1 -1
  71. package/dist/{svelte-parser-Dr9mmZuk.mjs → svelte-parser-Bll-1SK0.mjs} +3 -3
  72. package/dist/{svelte-parser-Dr9mmZuk.mjs.map → svelte-parser-Bll-1SK0.mjs.map} +1 -1
  73. package/dist/templates/index.mjs +1 -1
  74. package/dist/{templates-VrLVqfe5.mjs → templates-D6EllixQ.mjs} +1 -1
  75. package/dist/{templates-VrLVqfe5.mjs.map → templates-D6EllixQ.mjs.map} +1 -1
  76. package/dist/tools/annotations.d.mts +3 -0
  77. package/dist/tools/annotations.d.mts.map +1 -1
  78. package/dist/tools/annotations.mjs +1 -1
  79. package/dist/tools/availability.d.mts +36 -0
  80. package/dist/tools/availability.d.mts.map +1 -0
  81. package/dist/tools/availability.mjs +2 -0
  82. package/dist/{tsx-parser-CQc6nr-o.mjs → tsx-parser-B_aI_C2r.mjs} +1 -1
  83. package/dist/{tsx-parser-CQc6nr-o.mjs.map → tsx-parser-B_aI_C2r.mjs.map} +1 -1
  84. package/dist/tsx-parser-ChduVwKJ.mjs +2 -0
  85. package/dist/util/detect.mjs +1 -1
  86. package/dist/{validator-Z3DGNWQ6.mjs → validator-8vaPxSba.mjs} +1 -1
  87. package/dist/{validator-Z3DGNWQ6.mjs.map → validator-8vaPxSba.mjs.map} +1 -1
  88. package/dist/{vue-parser-COgjArqv.mjs → vue-parser-COig4Y1a.mjs} +3 -3
  89. package/dist/{vue-parser-COgjArqv.mjs.map → vue-parser-COig4Y1a.mjs.map} +1 -1
  90. package/package.json +10 -4
  91. package/dist/annotations-BFJbfSKe.mjs.map +0 -1
  92. package/dist/index-D0wQJSgs.d.mts +0 -2
  93. package/dist/server-DZBcZWhE.d.mts.map +0 -1
  94. package/dist/tsx-parser-BOMZE_yQ.mjs +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"templates-VrLVqfe5.mjs","names":[],"sources":["../src/templates/blog.ts","../src/templates/landing.ts","../src/templates/docs.ts","../src/templates/ecommerce.ts","../src/templates/saas.ts","../src/templates/i18n.ts","../src/templates/mobile.ts","../src/templates/index.ts"],"sourcesContent":["import type { ScaffoldTemplate } from '@contentrain/types'\n\nexport const blogTemplate: ScaffoldTemplate = {\n id: 'blog',\n models: [\n {\n id: 'blog-post',\n name: 'Blog Post',\n kind: 'document',\n domain: 'blog',\n i18n: true,\n fields: {\n title: { type: 'string', required: true, max: 120 },\n slug: { type: 'slug', required: true, unique: true },\n excerpt: { type: 'text', max: 280 },\n cover: { type: 'image' },\n author: { type: 'relation', model: 'authors', required: true },\n category: { type: 'relation', model: 'categories' },\n tags: { type: 'array', items: 'string' },\n published_at: { type: 'datetime' },\n },\n },\n {\n id: 'categories',\n name: 'Categories',\n kind: 'collection',\n domain: 'blog',\n i18n: true,\n fields: {\n name: { type: 'string', required: true },\n slug: { type: 'slug', required: true, unique: true },\n description: { type: 'text' },\n },\n },\n {\n id: 'authors',\n name: 'Authors',\n kind: 'collection',\n domain: 'blog',\n i18n: false,\n fields: {\n name: { type: 'string', required: true },\n email: { type: 'email' },\n bio: { type: 'text' },\n avatar: { type: 'image' },\n social: {\n type: 'object',\n fields: {\n twitter: { type: 'url' },\n linkedin: { type: 'url' },\n github: { type: 'url' },\n },\n },\n },\n },\n ],\n sample_content: {\n categories: {\n en: {\n 'cat-engineering': { name: 'Engineering', slug: 'engineering', description: 'Technical deep dives' },\n 'cat-product': { name: 'Product', slug: 'product', description: 'Product updates and news' },\n },\n },\n authors: {\n data: {\n 'author-1': { name: 'Team', email: 'team@example.com', bio: 'The team behind the product' },\n },\n },\n },\n vocabulary: {\n 'read-more': { en: 'Read More' },\n 'published-on': { en: 'Published on' },\n 'by-author': { en: 'By' },\n 'categories': { en: 'Categories' },\n 'tags': { en: 'Tags' },\n },\n}\n","import type { ScaffoldTemplate } from '@contentrain/types'\n\nexport const landingTemplate: ScaffoldTemplate = {\n id: 'landing',\n models: [\n {\n id: 'hero',\n name: 'Hero Section',\n kind: 'singleton',\n domain: 'marketing',\n i18n: true,\n fields: {\n title: { type: 'string', required: true, max: 120 },\n subtitle: { type: 'text', max: 280 },\n cta_text: { type: 'string' },\n cta_url: { type: 'url' },\n background: { type: 'image' },\n },\n },\n {\n id: 'features',\n name: 'Features Section',\n kind: 'singleton',\n domain: 'marketing',\n i18n: true,\n fields: {\n title: { type: 'string', required: true },\n subtitle: { type: 'text' },\n items: {\n type: 'array',\n items: {\n type: 'object',\n fields: {\n title: { type: 'string', required: true },\n description: { type: 'text' },\n icon: { type: 'icon' },\n },\n },\n },\n },\n },\n {\n id: 'pricing',\n name: 'Pricing Plans',\n kind: 'collection',\n domain: 'marketing',\n i18n: true,\n fields: {\n name: { type: 'string', required: true },\n price: { type: 'number', required: true },\n currency: { type: 'string', default: 'USD' },\n period: { type: 'select', options: ['monthly', 'yearly'] },\n features: { type: 'array', items: 'string' },\n highlighted: { type: 'boolean', default: false },\n },\n },\n {\n id: 'faq',\n name: 'FAQ',\n kind: 'collection',\n domain: 'marketing',\n i18n: true,\n fields: {\n question: { type: 'string', required: true },\n answer: { type: 'text', required: true },\n order: { type: 'integer' },\n },\n },\n {\n id: 'testimonials',\n name: 'Testimonials',\n kind: 'collection',\n domain: 'marketing',\n i18n: true,\n fields: {\n name: { type: 'string', required: true },\n role: { type: 'string' },\n company: { type: 'string' },\n quote: { type: 'text', required: true },\n avatar: { type: 'image' },\n rating: { type: 'rating' },\n },\n },\n ],\n sample_content: {\n hero: {\n en: {\n title: 'Build something amazing',\n subtitle: 'The fastest way to launch your product',\n cta_text: 'Get Started',\n cta_url: '/signup',\n },\n },\n pricing: {\n en: {\n 'plan-free': { name: 'Free', price: 0, currency: 'USD', period: 'monthly', features: ['1 project', 'Basic support'], highlighted: false },\n 'plan-pro': { name: 'Pro', price: 29, currency: 'USD', period: 'monthly', features: ['Unlimited projects', 'Priority support', 'Advanced analytics'], highlighted: true },\n },\n },\n },\n vocabulary: {\n 'get-started': { en: 'Get Started' },\n 'learn-more': { en: 'Learn More' },\n 'per-month': { en: '/month' },\n 'most-popular': { en: 'Most Popular' },\n },\n}\n","import type { ScaffoldTemplate } from '@contentrain/types'\n\nexport const docsTemplate: ScaffoldTemplate = {\n id: 'docs',\n models: [\n {\n id: 'doc-page',\n name: 'Documentation Page',\n kind: 'document',\n domain: 'docs',\n i18n: true,\n fields: {\n title: { type: 'string', required: true, max: 120 },\n slug: { type: 'slug', required: true, unique: true },\n category: { type: 'relation', model: 'doc-categories' },\n order: { type: 'integer' },\n excerpt: { type: 'text', max: 280 },\n },\n },\n {\n id: 'doc-categories',\n name: 'Doc Categories',\n kind: 'collection',\n domain: 'docs',\n i18n: true,\n fields: {\n name: { type: 'string', required: true },\n slug: { type: 'slug', required: true, unique: true },\n order: { type: 'integer' },\n },\n },\n ],\n sample_content: {\n 'doc-categories': {\n en: {\n 'cat-getting-started': { name: 'Getting Started', slug: 'getting-started', order: 1 },\n 'cat-guides': { name: 'Guides', slug: 'guides', order: 2 },\n 'cat-api': { name: 'API Reference', slug: 'api', order: 3 },\n },\n },\n },\n vocabulary: {\n 'on-this-page': { en: 'On This Page' },\n 'edit-this-page': { en: 'Edit this page' },\n 'next': { en: 'Next' },\n 'previous': { en: 'Previous' },\n },\n}\n","import type { ScaffoldTemplate } from '@contentrain/types'\n\nexport const ecommerceTemplate: ScaffoldTemplate = {\n id: 'ecommerce',\n models: [\n {\n id: 'products',\n name: 'Products',\n kind: 'collection',\n domain: 'shop',\n i18n: true,\n fields: {\n name: { type: 'string', required: true },\n slug: { type: 'slug', required: true, unique: true },\n description: { type: 'text' },\n price: { type: 'decimal', required: true },\n currency: { type: 'string', default: 'USD' },\n image: { type: 'image' },\n category: { type: 'relation', model: 'product-categories' },\n brand: { type: 'relation', model: 'brands' },\n in_stock: { type: 'boolean', default: true },\n },\n },\n {\n id: 'product-categories',\n name: 'Product Categories',\n kind: 'collection',\n domain: 'shop',\n i18n: true,\n fields: {\n name: { type: 'string', required: true },\n slug: { type: 'slug', required: true, unique: true },\n description: { type: 'text' },\n image: { type: 'image' },\n },\n },\n {\n id: 'brands',\n name: 'Brands',\n kind: 'collection',\n domain: 'shop',\n i18n: false,\n fields: {\n name: { type: 'string', required: true },\n slug: { type: 'slug', required: true, unique: true },\n logo: { type: 'image' },\n website: { type: 'url' },\n },\n },\n ],\n sample_content: {\n 'product-categories': {\n en: {\n 'cat-electronics': { name: 'Electronics', slug: 'electronics', description: 'Electronic devices and accessories' },\n 'cat-clothing': { name: 'Clothing', slug: 'clothing', description: 'Apparel and fashion' },\n },\n },\n brands: {\n data: {\n 'brand-acme': { name: 'Acme Corp', slug: 'acme', website: 'https://example.com' },\n },\n },\n },\n vocabulary: {\n 'add-to-cart': { en: 'Add to Cart' },\n 'out-of-stock': { en: 'Out of Stock' },\n 'price': { en: 'Price' },\n 'category': { en: 'Category' },\n },\n}\n","import type { ScaffoldTemplate } from '@contentrain/types'\n\nexport const saasTemplate: ScaffoldTemplate = {\n id: 'saas',\n models: [\n {\n id: 'hero',\n name: 'Hero Section',\n kind: 'singleton',\n domain: 'marketing',\n i18n: true,\n fields: {\n title: { type: 'string', required: true, max: 120 },\n subtitle: { type: 'text', max: 280 },\n cta_text: { type: 'string' },\n cta_url: { type: 'url' },\n background: { type: 'image' },\n },\n },\n {\n id: 'features',\n name: 'Features',\n kind: 'singleton',\n domain: 'marketing',\n i18n: true,\n fields: {\n title: { type: 'string', required: true },\n subtitle: { type: 'text' },\n items: {\n type: 'array',\n items: {\n type: 'object',\n fields: {\n title: { type: 'string', required: true },\n description: { type: 'text' },\n icon: { type: 'icon' },\n },\n },\n },\n },\n },\n {\n id: 'pricing',\n name: 'Pricing Plans',\n kind: 'collection',\n domain: 'marketing',\n i18n: true,\n fields: {\n name: { type: 'string', required: true },\n price: { type: 'number', required: true },\n currency: { type: 'string', default: 'USD' },\n period: { type: 'select', options: ['monthly', 'yearly'] },\n features: { type: 'array', items: 'string' },\n highlighted: { type: 'boolean', default: false },\n },\n },\n {\n id: 'changelog',\n name: 'Changelog',\n kind: 'document',\n domain: 'product',\n i18n: true,\n fields: {\n title: { type: 'string', required: true },\n slug: { type: 'slug', required: true, unique: true },\n version: { type: 'string' },\n published_at: { type: 'date' },\n tags: { type: 'array', items: 'string' },\n },\n },\n {\n id: 'faq',\n name: 'FAQ',\n kind: 'collection',\n domain: 'marketing',\n i18n: true,\n fields: {\n question: { type: 'string', required: true },\n answer: { type: 'text', required: true },\n order: { type: 'integer' },\n },\n },\n ],\n sample_content: {\n hero: {\n en: {\n title: 'Ship faster with our platform',\n subtitle: 'Everything you need to build, deploy, and scale',\n cta_text: 'Start Free Trial',\n cta_url: '/signup',\n },\n },\n pricing: {\n en: {\n 'plan-starter': { name: 'Starter', price: 0, currency: 'USD', period: 'monthly', features: ['Up to 3 projects', 'Community support'], highlighted: false },\n 'plan-team': { name: 'Team', price: 49, currency: 'USD', period: 'monthly', features: ['Unlimited projects', 'Priority support', 'Team collaboration'], highlighted: true },\n 'plan-enterprise': { name: 'Enterprise', price: 199, currency: 'USD', period: 'monthly', features: ['Everything in Team', 'SSO', 'SLA', 'Dedicated support'], highlighted: false },\n },\n },\n },\n vocabulary: {\n 'start-free': { en: 'Start Free Trial' },\n 'contact-sales': { en: 'Contact Sales' },\n 'per-month': { en: '/month' },\n 'changelog': { en: 'Changelog' },\n },\n}\n","import type { ScaffoldTemplate } from '@contentrain/types'\n\nexport const i18nTemplate: ScaffoldTemplate = {\n id: 'i18n',\n models: [\n {\n id: 'navigation',\n name: 'Navigation',\n kind: 'singleton',\n domain: 'ui',\n i18n: true,\n fields: {\n brand: { type: 'string', required: true },\n items: {\n type: 'array',\n items: {\n type: 'object',\n fields: {\n label: { type: 'string', required: true },\n url: { type: 'url', required: true },\n },\n },\n },\n },\n },\n {\n id: 'form-labels',\n name: 'Form Labels',\n kind: 'singleton',\n domain: 'ui',\n i18n: true,\n fields: {\n name: { type: 'string' },\n email: { type: 'string' },\n password: { type: 'string' },\n submit: { type: 'string' },\n cancel: { type: 'string' },\n },\n },\n {\n id: 'error-messages',\n name: 'Error Messages',\n kind: 'dictionary',\n domain: 'system',\n i18n: true,\n },\n {\n id: 'app-strings',\n name: 'App Strings',\n kind: 'dictionary',\n domain: 'system',\n i18n: true,\n },\n ],\n sample_content: {\n navigation: {\n en: {\n brand: 'My App',\n items: [\n { label: 'Home', url: '/' },\n { label: 'About', url: '/about' },\n { label: 'Contact', url: '/contact' },\n ],\n },\n },\n 'form-labels': {\n en: {\n name: 'Name',\n email: 'Email',\n password: 'Password',\n submit: 'Submit',\n cancel: 'Cancel',\n },\n },\n 'error-messages': {\n en: {\n 'required-field': 'This field is required',\n 'invalid-email': 'Please enter a valid email',\n 'server-error': 'Something went wrong, please try again',\n },\n },\n 'app-strings': {\n en: {\n 'welcome': 'Welcome',\n 'loading': 'Loading...',\n 'no-results': 'No results found',\n },\n },\n },\n vocabulary: {\n 'language': { en: 'Language' },\n 'switch-locale': { en: 'Switch language' },\n },\n}\n","import type { ScaffoldTemplate } from '@contentrain/types'\n\nexport const mobileTemplate: ScaffoldTemplate = {\n id: 'mobile',\n models: [\n {\n id: 'app-strings',\n name: 'App Strings',\n kind: 'dictionary',\n domain: 'system',\n i18n: true,\n },\n {\n id: 'error-messages',\n name: 'Error Messages',\n kind: 'dictionary',\n domain: 'system',\n i18n: true,\n },\n {\n id: 'onboarding',\n name: 'Onboarding Screens',\n kind: 'collection',\n domain: 'app',\n i18n: true,\n fields: {\n title: { type: 'string', required: true },\n description: { type: 'text' },\n image: { type: 'image' },\n order: { type: 'integer', required: true },\n },\n },\n ],\n sample_content: {\n 'app-strings': {\n en: {\n 'welcome': 'Welcome',\n 'loading': 'Loading...',\n 'retry': 'Retry',\n 'ok': 'OK',\n 'cancel': 'Cancel',\n },\n },\n 'error-messages': {\n en: {\n 'network-error': 'No internet connection',\n 'server-error': 'Something went wrong',\n 'auth-error': 'Please sign in again',\n },\n },\n onboarding: {\n en: {\n 'step-1': { title: 'Welcome', description: 'Get started with our app', order: 1 },\n 'step-2': { title: 'Discover', description: 'Explore all features', order: 2 },\n 'step-3': { title: 'Ready', description: 'You are all set!', order: 3 },\n },\n },\n },\n vocabulary: {\n 'get-started': { en: 'Get Started' },\n 'skip': { en: 'Skip' },\n 'next': { en: 'Next' },\n },\n}\n","import type { ScaffoldTemplate } from '@contentrain/types'\nimport { blogTemplate } from './blog.js'\nimport { landingTemplate } from './landing.js'\nimport { docsTemplate } from './docs.js'\nimport { ecommerceTemplate } from './ecommerce.js'\nimport { saasTemplate } from './saas.js'\nimport { i18nTemplate } from './i18n.js'\nimport { mobileTemplate } from './mobile.js'\n\nconst templates: Record<string, ScaffoldTemplate> = {\n blog: blogTemplate,\n landing: landingTemplate,\n docs: docsTemplate,\n ecommerce: ecommerceTemplate,\n saas: saasTemplate,\n i18n: i18nTemplate,\n mobile: mobileTemplate,\n}\n\nexport function getTemplate(id: string): ScaffoldTemplate | null {\n return templates[id] ?? null\n}\n\nexport function listTemplates(): string[] {\n return Object.keys(templates)\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"templates-D6EllixQ.mjs","names":[],"sources":["../src/templates/blog.ts","../src/templates/landing.ts","../src/templates/docs.ts","../src/templates/ecommerce.ts","../src/templates/saas.ts","../src/templates/i18n.ts","../src/templates/mobile.ts","../src/templates/index.ts"],"sourcesContent":["import type { ScaffoldTemplate } from '@contentrain/types'\n\nexport const blogTemplate: ScaffoldTemplate = {\n id: 'blog',\n models: [\n {\n id: 'blog-post',\n name: 'Blog Post',\n kind: 'document',\n domain: 'blog',\n i18n: true,\n fields: {\n title: { type: 'string', required: true, max: 120 },\n slug: { type: 'slug', required: true, unique: true },\n excerpt: { type: 'text', max: 280 },\n cover: { type: 'image' },\n author: { type: 'relation', model: 'authors', required: true },\n category: { type: 'relation', model: 'categories' },\n tags: { type: 'array', items: 'string' },\n published_at: { type: 'datetime' },\n },\n },\n {\n id: 'categories',\n name: 'Categories',\n kind: 'collection',\n domain: 'blog',\n i18n: true,\n fields: {\n name: { type: 'string', required: true },\n slug: { type: 'slug', required: true, unique: true },\n description: { type: 'text' },\n },\n },\n {\n id: 'authors',\n name: 'Authors',\n kind: 'collection',\n domain: 'blog',\n i18n: false,\n fields: {\n name: { type: 'string', required: true },\n email: { type: 'email' },\n bio: { type: 'text' },\n avatar: { type: 'image' },\n social: {\n type: 'object',\n fields: {\n twitter: { type: 'url' },\n linkedin: { type: 'url' },\n github: { type: 'url' },\n },\n },\n },\n },\n ],\n sample_content: {\n categories: {\n en: {\n 'cat-engineering': { name: 'Engineering', slug: 'engineering', description: 'Technical deep dives' },\n 'cat-product': { name: 'Product', slug: 'product', description: 'Product updates and news' },\n },\n },\n authors: {\n data: {\n 'author-1': { name: 'Team', email: 'team@example.com', bio: 'The team behind the product' },\n },\n },\n },\n vocabulary: {\n 'read-more': { en: 'Read More' },\n 'published-on': { en: 'Published on' },\n 'by-author': { en: 'By' },\n 'categories': { en: 'Categories' },\n 'tags': { en: 'Tags' },\n },\n}\n","import type { ScaffoldTemplate } from '@contentrain/types'\n\nexport const landingTemplate: ScaffoldTemplate = {\n id: 'landing',\n models: [\n {\n id: 'hero',\n name: 'Hero Section',\n kind: 'singleton',\n domain: 'marketing',\n i18n: true,\n fields: {\n title: { type: 'string', required: true, max: 120 },\n subtitle: { type: 'text', max: 280 },\n cta_text: { type: 'string' },\n cta_url: { type: 'url' },\n background: { type: 'image' },\n },\n },\n {\n id: 'features',\n name: 'Features Section',\n kind: 'singleton',\n domain: 'marketing',\n i18n: true,\n fields: {\n title: { type: 'string', required: true },\n subtitle: { type: 'text' },\n items: {\n type: 'array',\n items: {\n type: 'object',\n fields: {\n title: { type: 'string', required: true },\n description: { type: 'text' },\n icon: { type: 'icon' },\n },\n },\n },\n },\n },\n {\n id: 'pricing',\n name: 'Pricing Plans',\n kind: 'collection',\n domain: 'marketing',\n i18n: true,\n fields: {\n name: { type: 'string', required: true },\n price: { type: 'number', required: true },\n currency: { type: 'string', default: 'USD' },\n period: { type: 'select', options: ['monthly', 'yearly'] },\n features: { type: 'array', items: 'string' },\n highlighted: { type: 'boolean', default: false },\n },\n },\n {\n id: 'faq',\n name: 'FAQ',\n kind: 'collection',\n domain: 'marketing',\n i18n: true,\n fields: {\n question: { type: 'string', required: true },\n answer: { type: 'text', required: true },\n order: { type: 'integer' },\n },\n },\n {\n id: 'testimonials',\n name: 'Testimonials',\n kind: 'collection',\n domain: 'marketing',\n i18n: true,\n fields: {\n name: { type: 'string', required: true },\n role: { type: 'string' },\n company: { type: 'string' },\n quote: { type: 'text', required: true },\n avatar: { type: 'image' },\n rating: { type: 'rating' },\n },\n },\n ],\n sample_content: {\n hero: {\n en: {\n title: 'Build something amazing',\n subtitle: 'The fastest way to launch your product',\n cta_text: 'Get Started',\n cta_url: '/signup',\n },\n },\n pricing: {\n en: {\n 'plan-free': { name: 'Free', price: 0, currency: 'USD', period: 'monthly', features: ['1 project', 'Basic support'], highlighted: false },\n 'plan-pro': { name: 'Pro', price: 29, currency: 'USD', period: 'monthly', features: ['Unlimited projects', 'Priority support', 'Advanced analytics'], highlighted: true },\n },\n },\n },\n vocabulary: {\n 'get-started': { en: 'Get Started' },\n 'learn-more': { en: 'Learn More' },\n 'per-month': { en: '/month' },\n 'most-popular': { en: 'Most Popular' },\n },\n}\n","import type { ScaffoldTemplate } from '@contentrain/types'\n\nexport const docsTemplate: ScaffoldTemplate = {\n id: 'docs',\n models: [\n {\n id: 'doc-page',\n name: 'Documentation Page',\n kind: 'document',\n domain: 'docs',\n i18n: true,\n fields: {\n title: { type: 'string', required: true, max: 120 },\n slug: { type: 'slug', required: true, unique: true },\n category: { type: 'relation', model: 'doc-categories' },\n order: { type: 'integer' },\n excerpt: { type: 'text', max: 280 },\n },\n },\n {\n id: 'doc-categories',\n name: 'Doc Categories',\n kind: 'collection',\n domain: 'docs',\n i18n: true,\n fields: {\n name: { type: 'string', required: true },\n slug: { type: 'slug', required: true, unique: true },\n order: { type: 'integer' },\n },\n },\n ],\n sample_content: {\n 'doc-categories': {\n en: {\n 'cat-getting-started': { name: 'Getting Started', slug: 'getting-started', order: 1 },\n 'cat-guides': { name: 'Guides', slug: 'guides', order: 2 },\n 'cat-api': { name: 'API Reference', slug: 'api', order: 3 },\n },\n },\n },\n vocabulary: {\n 'on-this-page': { en: 'On This Page' },\n 'edit-this-page': { en: 'Edit this page' },\n 'next': { en: 'Next' },\n 'previous': { en: 'Previous' },\n },\n}\n","import type { ScaffoldTemplate } from '@contentrain/types'\n\nexport const ecommerceTemplate: ScaffoldTemplate = {\n id: 'ecommerce',\n models: [\n {\n id: 'products',\n name: 'Products',\n kind: 'collection',\n domain: 'shop',\n i18n: true,\n fields: {\n name: { type: 'string', required: true },\n slug: { type: 'slug', required: true, unique: true },\n description: { type: 'text' },\n price: { type: 'decimal', required: true },\n currency: { type: 'string', default: 'USD' },\n image: { type: 'image' },\n category: { type: 'relation', model: 'product-categories' },\n brand: { type: 'relation', model: 'brands' },\n in_stock: { type: 'boolean', default: true },\n },\n },\n {\n id: 'product-categories',\n name: 'Product Categories',\n kind: 'collection',\n domain: 'shop',\n i18n: true,\n fields: {\n name: { type: 'string', required: true },\n slug: { type: 'slug', required: true, unique: true },\n description: { type: 'text' },\n image: { type: 'image' },\n },\n },\n {\n id: 'brands',\n name: 'Brands',\n kind: 'collection',\n domain: 'shop',\n i18n: false,\n fields: {\n name: { type: 'string', required: true },\n slug: { type: 'slug', required: true, unique: true },\n logo: { type: 'image' },\n website: { type: 'url' },\n },\n },\n ],\n sample_content: {\n 'product-categories': {\n en: {\n 'cat-electronics': { name: 'Electronics', slug: 'electronics', description: 'Electronic devices and accessories' },\n 'cat-clothing': { name: 'Clothing', slug: 'clothing', description: 'Apparel and fashion' },\n },\n },\n brands: {\n data: {\n 'brand-acme': { name: 'Acme Corp', slug: 'acme', website: 'https://example.com' },\n },\n },\n },\n vocabulary: {\n 'add-to-cart': { en: 'Add to Cart' },\n 'out-of-stock': { en: 'Out of Stock' },\n 'price': { en: 'Price' },\n 'category': { en: 'Category' },\n },\n}\n","import type { ScaffoldTemplate } from '@contentrain/types'\n\nexport const saasTemplate: ScaffoldTemplate = {\n id: 'saas',\n models: [\n {\n id: 'hero',\n name: 'Hero Section',\n kind: 'singleton',\n domain: 'marketing',\n i18n: true,\n fields: {\n title: { type: 'string', required: true, max: 120 },\n subtitle: { type: 'text', max: 280 },\n cta_text: { type: 'string' },\n cta_url: { type: 'url' },\n background: { type: 'image' },\n },\n },\n {\n id: 'features',\n name: 'Features',\n kind: 'singleton',\n domain: 'marketing',\n i18n: true,\n fields: {\n title: { type: 'string', required: true },\n subtitle: { type: 'text' },\n items: {\n type: 'array',\n items: {\n type: 'object',\n fields: {\n title: { type: 'string', required: true },\n description: { type: 'text' },\n icon: { type: 'icon' },\n },\n },\n },\n },\n },\n {\n id: 'pricing',\n name: 'Pricing Plans',\n kind: 'collection',\n domain: 'marketing',\n i18n: true,\n fields: {\n name: { type: 'string', required: true },\n price: { type: 'number', required: true },\n currency: { type: 'string', default: 'USD' },\n period: { type: 'select', options: ['monthly', 'yearly'] },\n features: { type: 'array', items: 'string' },\n highlighted: { type: 'boolean', default: false },\n },\n },\n {\n id: 'changelog',\n name: 'Changelog',\n kind: 'document',\n domain: 'product',\n i18n: true,\n fields: {\n title: { type: 'string', required: true },\n slug: { type: 'slug', required: true, unique: true },\n version: { type: 'string' },\n published_at: { type: 'date' },\n tags: { type: 'array', items: 'string' },\n },\n },\n {\n id: 'faq',\n name: 'FAQ',\n kind: 'collection',\n domain: 'marketing',\n i18n: true,\n fields: {\n question: { type: 'string', required: true },\n answer: { type: 'text', required: true },\n order: { type: 'integer' },\n },\n },\n ],\n sample_content: {\n hero: {\n en: {\n title: 'Ship faster with our platform',\n subtitle: 'Everything you need to build, deploy, and scale',\n cta_text: 'Start Free Trial',\n cta_url: '/signup',\n },\n },\n pricing: {\n en: {\n 'plan-starter': { name: 'Starter', price: 0, currency: 'USD', period: 'monthly', features: ['Up to 3 projects', 'Community support'], highlighted: false },\n 'plan-team': { name: 'Team', price: 49, currency: 'USD', period: 'monthly', features: ['Unlimited projects', 'Priority support', 'Team collaboration'], highlighted: true },\n 'plan-enterprise': { name: 'Enterprise', price: 199, currency: 'USD', period: 'monthly', features: ['Everything in Team', 'SSO', 'SLA', 'Dedicated support'], highlighted: false },\n },\n },\n },\n vocabulary: {\n 'start-free': { en: 'Start Free Trial' },\n 'contact-sales': { en: 'Contact Sales' },\n 'per-month': { en: '/month' },\n 'changelog': { en: 'Changelog' },\n },\n}\n","import type { ScaffoldTemplate } from '@contentrain/types'\n\nexport const i18nTemplate: ScaffoldTemplate = {\n id: 'i18n',\n models: [\n {\n id: 'navigation',\n name: 'Navigation',\n kind: 'singleton',\n domain: 'ui',\n i18n: true,\n fields: {\n brand: { type: 'string', required: true },\n items: {\n type: 'array',\n items: {\n type: 'object',\n fields: {\n label: { type: 'string', required: true },\n url: { type: 'url', required: true },\n },\n },\n },\n },\n },\n {\n id: 'form-labels',\n name: 'Form Labels',\n kind: 'singleton',\n domain: 'ui',\n i18n: true,\n fields: {\n name: { type: 'string' },\n email: { type: 'string' },\n password: { type: 'string' },\n submit: { type: 'string' },\n cancel: { type: 'string' },\n },\n },\n {\n id: 'error-messages',\n name: 'Error Messages',\n kind: 'dictionary',\n domain: 'system',\n i18n: true,\n },\n {\n id: 'app-strings',\n name: 'App Strings',\n kind: 'dictionary',\n domain: 'system',\n i18n: true,\n },\n ],\n sample_content: {\n navigation: {\n en: {\n brand: 'My App',\n items: [\n { label: 'Home', url: '/' },\n { label: 'About', url: '/about' },\n { label: 'Contact', url: '/contact' },\n ],\n },\n },\n 'form-labels': {\n en: {\n name: 'Name',\n email: 'Email',\n password: 'Password',\n submit: 'Submit',\n cancel: 'Cancel',\n },\n },\n 'error-messages': {\n en: {\n 'required-field': 'This field is required',\n 'invalid-email': 'Please enter a valid email',\n 'server-error': 'Something went wrong, please try again',\n },\n },\n 'app-strings': {\n en: {\n 'welcome': 'Welcome',\n 'loading': 'Loading...',\n 'no-results': 'No results found',\n },\n },\n },\n vocabulary: {\n 'language': { en: 'Language' },\n 'switch-locale': { en: 'Switch language' },\n },\n}\n","import type { ScaffoldTemplate } from '@contentrain/types'\n\nexport const mobileTemplate: ScaffoldTemplate = {\n id: 'mobile',\n models: [\n {\n id: 'app-strings',\n name: 'App Strings',\n kind: 'dictionary',\n domain: 'system',\n i18n: true,\n },\n {\n id: 'error-messages',\n name: 'Error Messages',\n kind: 'dictionary',\n domain: 'system',\n i18n: true,\n },\n {\n id: 'onboarding',\n name: 'Onboarding Screens',\n kind: 'collection',\n domain: 'app',\n i18n: true,\n fields: {\n title: { type: 'string', required: true },\n description: { type: 'text' },\n image: { type: 'image' },\n order: { type: 'integer', required: true },\n },\n },\n ],\n sample_content: {\n 'app-strings': {\n en: {\n 'welcome': 'Welcome',\n 'loading': 'Loading...',\n 'retry': 'Retry',\n 'ok': 'OK',\n 'cancel': 'Cancel',\n },\n },\n 'error-messages': {\n en: {\n 'network-error': 'No internet connection',\n 'server-error': 'Something went wrong',\n 'auth-error': 'Please sign in again',\n },\n },\n onboarding: {\n en: {\n 'step-1': { title: 'Welcome', description: 'Get started with our app', order: 1 },\n 'step-2': { title: 'Discover', description: 'Explore all features', order: 2 },\n 'step-3': { title: 'Ready', description: 'You are all set!', order: 3 },\n },\n },\n },\n vocabulary: {\n 'get-started': { en: 'Get Started' },\n 'skip': { en: 'Skip' },\n 'next': { en: 'Next' },\n },\n}\n","import type { ScaffoldTemplate } from '@contentrain/types'\nimport { blogTemplate } from './blog.js'\nimport { landingTemplate } from './landing.js'\nimport { docsTemplate } from './docs.js'\nimport { ecommerceTemplate } from './ecommerce.js'\nimport { saasTemplate } from './saas.js'\nimport { i18nTemplate } from './i18n.js'\nimport { mobileTemplate } from './mobile.js'\n\nconst templates: Record<string, ScaffoldTemplate> = {\n blog: blogTemplate,\n landing: landingTemplate,\n docs: docsTemplate,\n ecommerce: ecommerceTemplate,\n saas: saasTemplate,\n i18n: i18nTemplate,\n mobile: mobileTemplate,\n}\n\nexport function getTemplate(id: string): ScaffoldTemplate | null {\n return templates[id] ?? null\n}\n\nexport function listTemplates(): string[] {\n return Object.keys(templates)\n}\n"],"mappings":"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"}
@@ -4,6 +4,9 @@ import { ToolAnnotations } from "@modelcontextprotocol/sdk/types.js";
4
4
  /**
5
5
  * Centralized tool annotations registry.
6
6
  * MCP clients use these hints to distinguish read-only vs. write vs. destructive tools.
7
+ * `openWorldHint` is `false` across the board: every tool operates on the
8
+ * configured content repository only — none reaches out to arbitrary
9
+ * external systems.
7
10
  *
8
11
  * Also serves as the **single source of truth for the tool name list**. Consumers
9
12
  * that need to enumerate every registered tool (e.g. parity tests in
@@ -1 +1 @@
1
- {"version":3,"file":"annotations.d.mts","names":[],"sources":["../../src/tools/annotations.ts"],"mappings":";;;;;AAWA;;;;;AAyIA;;cAzIa,gBAAA,EAAkB,MAAA,SAAe,eAAA;;;;;;;;cAyIjC,UAAA"}
1
+ {"version":3,"file":"annotations.d.mts","names":[],"sources":["../../src/tools/annotations.ts"],"mappings":";;;;;AAcA;;;;;AA4JA;;;;;cA5Ja,gBAAA,EAAkB,MAAA,SAAe,eAAA;;;;;;;;cA4JjC,UAAA"}
@@ -1,2 +1,2 @@
1
- import { n as TOOL_NAMES, t as TOOL_ANNOTATIONS } from "../annotations-BFJbfSKe.mjs";
1
+ import { n as TOOL_NAMES, t as TOOL_ANNOTATIONS } from "../annotations-DSzewhL4.mjs";
2
2
  export { TOOL_ANNOTATIONS, TOOL_NAMES };
@@ -0,0 +1,36 @@
1
+ import { ProviderCapabilities } from "@contentrain/types";
2
+
3
+ //#region src/tools/availability.d.ts
4
+ /**
5
+ * Declarative availability requirements for capability-gated tools.
6
+ *
7
+ * This is the single source of truth `createServer` uses to decide which
8
+ * tools to register for a given provider + projectRoot combination. Tools
9
+ * absent from this map are always available. The requirements mirror the
10
+ * call-time guards inside each tool handler (`capabilityError`) — those
11
+ * guards remain as defense in depth, but a client talking to a remote
12
+ * provider no longer sees tools that could never succeed in `tools/list`.
13
+ *
14
+ * `contentrain_validate` is intentionally NOT listed: read-only validate
15
+ * works over any provider; only `fix: true` needs a local worktree and
16
+ * keeps its call-time guard.
17
+ */
18
+ interface ToolRequirements {
19
+ /** Tool needs a local project root on disk (worktree git transactions, IDE config, AST scans). */
20
+ projectRoot?: boolean;
21
+ /** Provider capability flags that must all be `true`. */
22
+ capabilities?: readonly (keyof ProviderCapabilities)[];
23
+ }
24
+ declare const TOOL_REQUIREMENTS: Readonly<Record<string, ToolRequirements>>;
25
+ /**
26
+ * Whether a tool can ever succeed for this provider + projectRoot pair.
27
+ * Used by `createServer` to filter registration; also exported for
28
+ * embedders (e.g. Studio) that want to reason about the effective tool
29
+ * surface without spinning up a server.
30
+ */
31
+ declare function isToolAvailable(name: string, provider: {
32
+ capabilities: ProviderCapabilities;
33
+ }, projectRoot: string | undefined): boolean;
34
+ //#endregion
35
+ export { TOOL_REQUIREMENTS, ToolRequirements, isToolAvailable };
36
+ //# sourceMappingURL=availability.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"availability.d.mts","names":[],"sources":["../../src/tools/availability.ts"],"mappings":";;;;;AAgBA;;;;;;;;;AAOA;;;UAPiB,gBAAA;EAOwB;EALvC,WAAA;EAKsC;EAHtC,YAAA,mBAA+B,oBAAA;AAAA;AAAA,cAGpB,iBAAA,EAAmB,QAAA,CAAS,MAAA,SAAe,gBAAA;;;;AAsBxD;;;iBAAgB,eAAA,CACd,IAAA,UACA,QAAA;EAAY,YAAA,EAAc,oBAAA;AAAA,GAC1B,WAAA"}
@@ -0,0 +1,2 @@
1
+ import { n as isToolAvailable, t as TOOL_REQUIREMENTS } from "../availability-Bj9zOfEn.mjs";
2
+ export { TOOL_REQUIREMENTS, isToolAvailable };
@@ -232,4 +232,4 @@ function buildSurrounding(lines, lineIdx) {
232
232
  //#endregion
233
233
  export { parseTsx as t };
234
234
 
235
- //# sourceMappingURL=tsx-parser-CQc6nr-o.mjs.map
235
+ //# sourceMappingURL=tsx-parser-B_aI_C2r.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"tsx-parser-CQc6nr-o.mjs","names":[],"sources":["../src/core/ast-scanner/tsx-parser.ts"],"sourcesContent":["import ts from 'typescript'\nimport type { ExtractedString, StructuralContext } from './types.js'\n\n// ─── Constants ───\n\nconst SURROUNDING_MAX = 120\n\n// ─── Public API ───\n\n/**\n * Parse a TSX/JSX/TS/JS file and extract all string literals with structural context.\n *\n * Uses TypeScript's syntax-only parser (no type checking, no tsconfig needed).\n * Walks the AST and classifies each string by its parent chain.\n */\nexport function parseTsx(content: string, fileName: string): ExtractedString[] {\n const scriptKind = getScriptKind(fileName)\n const sourceFile = ts.createSourceFile(\n fileName,\n content,\n ts.ScriptTarget.Latest,\n /* setParentNodes */ true,\n scriptKind,\n )\n\n const results: ExtractedString[] = []\n const lines = content.split('\\n')\n\n visit(sourceFile, sourceFile, lines, results)\n\n return results\n}\n\n// ─── Script kind detection ───\n\nfunction getScriptKind(fileName: string): ts.ScriptKind {\n const lower = fileName.toLowerCase()\n if (lower.endsWith('.tsx')) return ts.ScriptKind.TSX\n if (lower.endsWith('.jsx')) return ts.ScriptKind.JSX\n if (lower.endsWith('.ts')) return ts.ScriptKind.TS\n return ts.ScriptKind.JS\n}\n\n// ─── AST Walker ───\n\nfunction visit(\n node: ts.Node,\n sourceFile: ts.SourceFile,\n lines: string[],\n results: ExtractedString[],\n): void {\n // Handle JsxText nodes\n if (ts.isJsxText(node)) {\n const text = node.text.trim()\n // Skip whitespace-only or empty JsxText\n if (text.length > 0) {\n const { line: lineIdx, character } = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile))\n const parent = getJsxParentTag(node)\n results.push({\n value: text,\n line: lineIdx + 1,\n column: character + 1,\n context: 'jsx_text',\n scope: 'script',\n parent,\n surrounding: buildSurrounding(lines, lineIdx),\n })\n }\n return\n }\n\n // Handle string literals\n if (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node)) {\n const value = node.text\n // Skip empty strings\n if (value.length === 0) return\n\n const { line: lineIdx, character } = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile))\n const classification = classifyByParentChain(node, sourceFile)\n\n results.push({\n value,\n line: lineIdx + 1,\n column: character + 1,\n context: classification.context,\n scope: 'script',\n parent: classification.parent,\n parentProperty: classification.parentProperty,\n surrounding: buildSurrounding(lines, lineIdx),\n })\n return\n }\n\n // Handle template literals with expressions — extract static head/spans\n if (ts.isTemplateExpression(node)) {\n extractTemplateParts(node, sourceFile, lines, results)\n return\n }\n\n ts.forEachChild(node, (child) => {\n visit(child, sourceFile, lines, results)\n })\n}\n\n// ─── Template literal parts extraction ───\n\nfunction extractTemplateParts(\n node: ts.TemplateExpression,\n sourceFile: ts.SourceFile,\n lines: string[],\n results: ExtractedString[],\n): void {\n const classification = classifyByParentChain(node, sourceFile)\n\n // Head: text before first ${...}\n const headText = node.head.text\n if (headText.length > 0) {\n const { line: lineIdx, character } = sourceFile.getLineAndCharacterOfPosition(node.head.getStart(sourceFile))\n results.push({\n value: headText,\n line: lineIdx + 1,\n column: character + 1,\n context: classification.context,\n scope: 'script',\n parent: classification.parent,\n parentProperty: classification.parentProperty,\n surrounding: buildSurrounding(lines, lineIdx),\n })\n }\n\n // Template spans: text after each ${...} expression\n for (const span of node.templateSpans) {\n const spanText = span.literal.text\n if (spanText.length > 0) {\n const { line: lineIdx, character } = sourceFile.getLineAndCharacterOfPosition(span.literal.getStart(sourceFile))\n results.push({\n value: spanText,\n line: lineIdx + 1,\n column: character + 1,\n context: classification.context,\n scope: 'script',\n parent: classification.parent,\n parentProperty: classification.parentProperty,\n surrounding: buildSurrounding(lines, lineIdx),\n })\n }\n\n // Visit the expression inside ${...} for nested strings\n visit(span.expression, sourceFile, lines, results)\n }\n}\n\n// ─── Parent chain classification ───\n\ninterface Classification {\n context: StructuralContext\n parent: string\n parentProperty?: string\n}\n\nfunction classifyByParentChain(node: ts.Node, sourceFile: ts.SourceFile): Classification {\n let current = node.parent\n\n while (current) {\n // Import / Export declaration → import_path\n if (ts.isImportDeclaration(current) || ts.isExportDeclaration(current)) {\n return { context: 'import_path', parent: 'import' }\n }\n\n // Import specifier module path (dynamic import)\n if (ts.isCallExpression(current) && current.expression.kind === ts.SyntaxKind.ImportKeyword) {\n return { context: 'import_path', parent: 'import' }\n }\n\n // require() calls\n if (\n ts.isCallExpression(current)\n && ts.isIdentifier(current.expression)\n && current.expression.text === 'require'\n ) {\n return { context: 'import_path', parent: 'require' }\n }\n\n // JSX attribute → jsx_attribute or css_class\n if (ts.isJsxAttribute(current)) {\n const attrName = ts.isIdentifier(current.name) ? current.name.text : current.name.getText(sourceFile)\n // className / class / style → CSS, not content\n if (attrName === 'className' || attrName === 'class' || attrName === 'style') {\n return { context: 'css_class', parent: attrName }\n }\n return { context: 'jsx_attribute', parent: attrName, parentProperty: attrName }\n }\n\n // Variable declaration → variable_assignment\n if (ts.isVariableDeclaration(current)) {\n const varName = ts.isIdentifier(current.name) ? current.name.text : current.name.getText(sourceFile)\n return { context: 'variable_assignment', parent: varName }\n }\n\n // Property assignment → object_property\n if (ts.isPropertyAssignment(current)) {\n const key = ts.isIdentifier(current.name)\n ? current.name.text\n : ts.isStringLiteral(current.name)\n ? current.name.text\n : current.name.getText(sourceFile)\n return { context: 'object_property', parent: key, parentProperty: key }\n }\n\n // Enum member → enum_value\n if (ts.isEnumMember(current)) {\n const enumName = ts.isIdentifier(current.name) ? current.name.text : current.name.getText(sourceFile)\n return { context: 'enum_value', parent: enumName }\n }\n\n // Call expression → function_argument or css_utility_call or console_call or test_assertion\n if (ts.isCallExpression(current)) {\n const callee = getCalleeName(current.expression, sourceFile)\n // CSS utility functions\n if (['cn', 'clsx', 'classNames', 'twMerge', 'twJoin', 'cva', 'cx'].includes(callee)) {\n return { context: 'css_utility_call', parent: callee }\n }\n // Console calls\n if (callee.startsWith('console.')) {\n return { context: 'console_call', parent: callee }\n }\n // Test assertions\n if (['describe', 'it', 'test', 'expect', 'beforeEach', 'afterEach', 'beforeAll', 'afterAll'].includes(callee)) {\n return { context: 'test_assertion', parent: callee }\n }\n return { context: 'function_argument', parent: callee }\n }\n\n // Array literal → array_element\n if (ts.isArrayLiteralExpression(current)) {\n return { context: 'array_element', parent: 'array' }\n }\n\n // Case clause → switch_case\n if (ts.isCaseClause(current)) {\n return { context: 'switch_case', parent: 'case' }\n }\n\n // Type contexts → type_annotation\n if (\n ts.isTypeAliasDeclaration(current)\n || ts.isTypeReferenceNode(current)\n || ts.isInterfaceDeclaration(current)\n || ts.isTypeLiteralNode(current)\n || ts.isLiteralTypeNode(current)\n || ts.isUnionTypeNode(current)\n || ts.isIntersectionTypeNode(current)\n ) {\n return { context: 'type_annotation', parent: 'type' }\n }\n\n // Property declaration with type context (e.g., `as const` typed properties)\n // Check if we're inside a type annotation specifically\n if (ts.isPropertySignature(current)) {\n return { context: 'type_annotation', parent: 'type' }\n }\n\n current = current.parent\n }\n\n return { context: 'other', parent: '' }\n}\n\n// ─── Callee name extraction ───\n\nfunction getCalleeName(expr: ts.Expression, sourceFile: ts.SourceFile): string {\n if (ts.isIdentifier(expr)) {\n return expr.text\n }\n if (ts.isPropertyAccessExpression(expr)) {\n // e.g., console.log → \"console.log\"\n const obj = getCalleeName(expr.expression, sourceFile)\n return obj ? `${obj}.${expr.name.text}` : expr.name.text\n }\n return expr.getText(sourceFile)\n}\n\n// ─── JSX parent tag extraction ───\n\nfunction getJsxParentTag(node: ts.Node): string {\n let current = node.parent\n\n while (current) {\n if (ts.isJsxElement(current)) {\n const tagName = current.openingElement.tagName.getText()\n return tagName\n }\n if (ts.isJsxFragment(current)) {\n return 'Fragment'\n }\n current = current.parent\n }\n\n return ''\n}\n\n// ─── Surrounding code builder ───\n\nfunction buildSurrounding(lines: string[], lineIdx: number): string {\n const start = Math.max(0, lineIdx - 1)\n const end = Math.min(lines.length - 1, lineIdx + 1)\n\n const parts: string[] = []\n for (let i = start; i <= end; i++) {\n const line = lines[i]\n if (line !== undefined) {\n parts.push(line)\n }\n }\n\n const joined = parts.join('\\n')\n if (joined.length > SURROUNDING_MAX) {\n return joined.slice(0, SURROUNDING_MAX)\n }\n return joined\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"tsx-parser-B_aI_C2r.mjs","names":[],"sources":["../src/core/ast-scanner/tsx-parser.ts"],"sourcesContent":["import ts from 'typescript'\nimport type { ExtractedString, StructuralContext } from './types.js'\n\n// ─── Constants ───\n\nconst SURROUNDING_MAX = 120\n\n// ─── Public API ───\n\n/**\n * Parse a TSX/JSX/TS/JS file and extract all string literals with structural context.\n *\n * Uses TypeScript's syntax-only parser (no type checking, no tsconfig needed).\n * Walks the AST and classifies each string by its parent chain.\n */\nexport function parseTsx(content: string, fileName: string): ExtractedString[] {\n const scriptKind = getScriptKind(fileName)\n const sourceFile = ts.createSourceFile(\n fileName,\n content,\n ts.ScriptTarget.Latest,\n /* setParentNodes */ true,\n scriptKind,\n )\n\n const results: ExtractedString[] = []\n const lines = content.split('\\n')\n\n visit(sourceFile, sourceFile, lines, results)\n\n return results\n}\n\n// ─── Script kind detection ───\n\nfunction getScriptKind(fileName: string): ts.ScriptKind {\n const lower = fileName.toLowerCase()\n if (lower.endsWith('.tsx')) return ts.ScriptKind.TSX\n if (lower.endsWith('.jsx')) return ts.ScriptKind.JSX\n if (lower.endsWith('.ts')) return ts.ScriptKind.TS\n return ts.ScriptKind.JS\n}\n\n// ─── AST Walker ───\n\nfunction visit(\n node: ts.Node,\n sourceFile: ts.SourceFile,\n lines: string[],\n results: ExtractedString[],\n): void {\n // Handle JsxText nodes\n if (ts.isJsxText(node)) {\n const text = node.text.trim()\n // Skip whitespace-only or empty JsxText\n if (text.length > 0) {\n const { line: lineIdx, character } = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile))\n const parent = getJsxParentTag(node)\n results.push({\n value: text,\n line: lineIdx + 1,\n column: character + 1,\n context: 'jsx_text',\n scope: 'script',\n parent,\n surrounding: buildSurrounding(lines, lineIdx),\n })\n }\n return\n }\n\n // Handle string literals\n if (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node)) {\n const value = node.text\n // Skip empty strings\n if (value.length === 0) return\n\n const { line: lineIdx, character } = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile))\n const classification = classifyByParentChain(node, sourceFile)\n\n results.push({\n value,\n line: lineIdx + 1,\n column: character + 1,\n context: classification.context,\n scope: 'script',\n parent: classification.parent,\n parentProperty: classification.parentProperty,\n surrounding: buildSurrounding(lines, lineIdx),\n })\n return\n }\n\n // Handle template literals with expressions — extract static head/spans\n if (ts.isTemplateExpression(node)) {\n extractTemplateParts(node, sourceFile, lines, results)\n return\n }\n\n ts.forEachChild(node, (child) => {\n visit(child, sourceFile, lines, results)\n })\n}\n\n// ─── Template literal parts extraction ───\n\nfunction extractTemplateParts(\n node: ts.TemplateExpression,\n sourceFile: ts.SourceFile,\n lines: string[],\n results: ExtractedString[],\n): void {\n const classification = classifyByParentChain(node, sourceFile)\n\n // Head: text before first ${...}\n const headText = node.head.text\n if (headText.length > 0) {\n const { line: lineIdx, character } = sourceFile.getLineAndCharacterOfPosition(node.head.getStart(sourceFile))\n results.push({\n value: headText,\n line: lineIdx + 1,\n column: character + 1,\n context: classification.context,\n scope: 'script',\n parent: classification.parent,\n parentProperty: classification.parentProperty,\n surrounding: buildSurrounding(lines, lineIdx),\n })\n }\n\n // Template spans: text after each ${...} expression\n for (const span of node.templateSpans) {\n const spanText = span.literal.text\n if (spanText.length > 0) {\n const { line: lineIdx, character } = sourceFile.getLineAndCharacterOfPosition(span.literal.getStart(sourceFile))\n results.push({\n value: spanText,\n line: lineIdx + 1,\n column: character + 1,\n context: classification.context,\n scope: 'script',\n parent: classification.parent,\n parentProperty: classification.parentProperty,\n surrounding: buildSurrounding(lines, lineIdx),\n })\n }\n\n // Visit the expression inside ${...} for nested strings\n visit(span.expression, sourceFile, lines, results)\n }\n}\n\n// ─── Parent chain classification ───\n\ninterface Classification {\n context: StructuralContext\n parent: string\n parentProperty?: string\n}\n\nfunction classifyByParentChain(node: ts.Node, sourceFile: ts.SourceFile): Classification {\n let current = node.parent\n\n while (current) {\n // Import / Export declaration → import_path\n if (ts.isImportDeclaration(current) || ts.isExportDeclaration(current)) {\n return { context: 'import_path', parent: 'import' }\n }\n\n // Import specifier module path (dynamic import)\n if (ts.isCallExpression(current) && current.expression.kind === ts.SyntaxKind.ImportKeyword) {\n return { context: 'import_path', parent: 'import' }\n }\n\n // require() calls\n if (\n ts.isCallExpression(current)\n && ts.isIdentifier(current.expression)\n && current.expression.text === 'require'\n ) {\n return { context: 'import_path', parent: 'require' }\n }\n\n // JSX attribute → jsx_attribute or css_class\n if (ts.isJsxAttribute(current)) {\n const attrName = ts.isIdentifier(current.name) ? current.name.text : current.name.getText(sourceFile)\n // className / class / style → CSS, not content\n if (attrName === 'className' || attrName === 'class' || attrName === 'style') {\n return { context: 'css_class', parent: attrName }\n }\n return { context: 'jsx_attribute', parent: attrName, parentProperty: attrName }\n }\n\n // Variable declaration → variable_assignment\n if (ts.isVariableDeclaration(current)) {\n const varName = ts.isIdentifier(current.name) ? current.name.text : current.name.getText(sourceFile)\n return { context: 'variable_assignment', parent: varName }\n }\n\n // Property assignment → object_property\n if (ts.isPropertyAssignment(current)) {\n const key = ts.isIdentifier(current.name)\n ? current.name.text\n : ts.isStringLiteral(current.name)\n ? current.name.text\n : current.name.getText(sourceFile)\n return { context: 'object_property', parent: key, parentProperty: key }\n }\n\n // Enum member → enum_value\n if (ts.isEnumMember(current)) {\n const enumName = ts.isIdentifier(current.name) ? current.name.text : current.name.getText(sourceFile)\n return { context: 'enum_value', parent: enumName }\n }\n\n // Call expression → function_argument or css_utility_call or console_call or test_assertion\n if (ts.isCallExpression(current)) {\n const callee = getCalleeName(current.expression, sourceFile)\n // CSS utility functions\n if (['cn', 'clsx', 'classNames', 'twMerge', 'twJoin', 'cva', 'cx'].includes(callee)) {\n return { context: 'css_utility_call', parent: callee }\n }\n // Console calls\n if (callee.startsWith('console.')) {\n return { context: 'console_call', parent: callee }\n }\n // Test assertions\n if (['describe', 'it', 'test', 'expect', 'beforeEach', 'afterEach', 'beforeAll', 'afterAll'].includes(callee)) {\n return { context: 'test_assertion', parent: callee }\n }\n return { context: 'function_argument', parent: callee }\n }\n\n // Array literal → array_element\n if (ts.isArrayLiteralExpression(current)) {\n return { context: 'array_element', parent: 'array' }\n }\n\n // Case clause → switch_case\n if (ts.isCaseClause(current)) {\n return { context: 'switch_case', parent: 'case' }\n }\n\n // Type contexts → type_annotation\n if (\n ts.isTypeAliasDeclaration(current)\n || ts.isTypeReferenceNode(current)\n || ts.isInterfaceDeclaration(current)\n || ts.isTypeLiteralNode(current)\n || ts.isLiteralTypeNode(current)\n || ts.isUnionTypeNode(current)\n || ts.isIntersectionTypeNode(current)\n ) {\n return { context: 'type_annotation', parent: 'type' }\n }\n\n // Property declaration with type context (e.g., `as const` typed properties)\n // Check if we're inside a type annotation specifically\n if (ts.isPropertySignature(current)) {\n return { context: 'type_annotation', parent: 'type' }\n }\n\n current = current.parent\n }\n\n return { context: 'other', parent: '' }\n}\n\n// ─── Callee name extraction ───\n\nfunction getCalleeName(expr: ts.Expression, sourceFile: ts.SourceFile): string {\n if (ts.isIdentifier(expr)) {\n return expr.text\n }\n if (ts.isPropertyAccessExpression(expr)) {\n // e.g., console.log → \"console.log\"\n const obj = getCalleeName(expr.expression, sourceFile)\n return obj ? `${obj}.${expr.name.text}` : expr.name.text\n }\n return expr.getText(sourceFile)\n}\n\n// ─── JSX parent tag extraction ───\n\nfunction getJsxParentTag(node: ts.Node): string {\n let current = node.parent\n\n while (current) {\n if (ts.isJsxElement(current)) {\n const tagName = current.openingElement.tagName.getText()\n return tagName\n }\n if (ts.isJsxFragment(current)) {\n return 'Fragment'\n }\n current = current.parent\n }\n\n return ''\n}\n\n// ─── Surrounding code builder ───\n\nfunction buildSurrounding(lines: string[], lineIdx: number): string {\n const start = Math.max(0, lineIdx - 1)\n const end = Math.min(lines.length - 1, lineIdx + 1)\n\n const parts: string[] = []\n for (let i = start; i <= end; i++) {\n const line = lines[i]\n if (line !== undefined) {\n parts.push(line)\n }\n }\n\n const joined = parts.join('\\n')\n if (joined.length > SURROUNDING_MAX) {\n return joined.slice(0, SURROUNDING_MAX)\n }\n return joined\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { t as parseTsx } from "./tsx-parser-B_aI_C2r.mjs";
2
+ export { parseTsx };
@@ -1,3 +1,3 @@
1
1
  import "../fs-DLbVB-Ek.mjs";
2
- import { n as detectStackInfo, r as inferPlatform, t as detectStack } from "../detect-eWS6lvoH.mjs";
2
+ import { n as detectStackInfo, r as inferPlatform, t as detectStack } from "../detect-wVSI9VuY.mjs";
3
3
  export { detectStack, detectStackInfo, inferPlatform };
@@ -932,4 +932,4 @@ async function validateProject(input, options) {
932
932
  //#endregion
933
933
  export { validateContent as i, validateScheduleFields as n, checkRelationIntegrity as r, validateProject as t };
934
934
 
935
- //# sourceMappingURL=validator-Z3DGNWQ6.mjs.map
935
+ //# sourceMappingURL=validator-8vaPxSba.mjs.map