@react-spa-scaffold/mcp 2.0.0 → 2.1.1

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 (93) hide show
  1. package/README.md +3 -4
  2. package/dist/features/definitions/api.d.ts.map +1 -1
  3. package/dist/features/definitions/api.js +1 -10
  4. package/dist/features/definitions/api.js.map +1 -1
  5. package/dist/features/definitions/ci.d.ts.map +1 -1
  6. package/dist/features/definitions/ci.js +0 -10
  7. package/dist/features/definitions/ci.js.map +1 -1
  8. package/dist/features/definitions/core.d.ts.map +1 -1
  9. package/dist/features/definitions/core.js +2 -14
  10. package/dist/features/definitions/core.js.map +1 -1
  11. package/dist/features/definitions/devtools.d.ts.map +1 -1
  12. package/dist/features/definitions/devtools.js +1 -14
  13. package/dist/features/definitions/devtools.js.map +1 -1
  14. package/dist/features/definitions/forms.d.ts.map +1 -1
  15. package/dist/features/definitions/forms.js +1 -9
  16. package/dist/features/definitions/forms.js.map +1 -1
  17. package/dist/features/definitions/i18n.d.ts.map +1 -1
  18. package/dist/features/definitions/i18n.js +2 -14
  19. package/dist/features/definitions/i18n.js.map +1 -1
  20. package/dist/features/definitions/mobile.d.ts.map +1 -1
  21. package/dist/features/definitions/mobile.js +0 -9
  22. package/dist/features/definitions/mobile.js.map +1 -1
  23. package/dist/features/definitions/observability.d.ts.map +1 -1
  24. package/dist/features/definitions/observability.js +2 -12
  25. package/dist/features/definitions/observability.js.map +1 -1
  26. package/dist/features/definitions/performance.d.ts.map +1 -1
  27. package/dist/features/definitions/performance.js +2 -13
  28. package/dist/features/definitions/performance.js.map +1 -1
  29. package/dist/features/definitions/routing.d.ts.map +1 -1
  30. package/dist/features/definitions/routing.js +1 -9
  31. package/dist/features/definitions/routing.js.map +1 -1
  32. package/dist/features/definitions/state.d.ts.map +1 -1
  33. package/dist/features/definitions/state.js +1 -11
  34. package/dist/features/definitions/state.js.map +1 -1
  35. package/dist/features/definitions/testing.d.ts.map +1 -1
  36. package/dist/features/definitions/testing.js +1 -14
  37. package/dist/features/definitions/testing.js.map +1 -1
  38. package/dist/features/definitions/theming.d.ts.map +1 -1
  39. package/dist/features/definitions/theming.js +0 -8
  40. package/dist/features/definitions/theming.js.map +1 -1
  41. package/dist/features/definitions/ui.d.ts.map +1 -1
  42. package/dist/features/definitions/ui.js +2 -15
  43. package/dist/features/definitions/ui.js.map +1 -1
  44. package/dist/features/types.d.ts +2 -3
  45. package/dist/features/types.d.ts.map +1 -1
  46. package/dist/tools/add-features.d.ts +44 -0
  47. package/dist/tools/add-features.d.ts.map +1 -0
  48. package/dist/tools/add-features.js +157 -0
  49. package/dist/tools/add-features.js.map +1 -0
  50. package/dist/tools/add-features.test.d.ts +5 -0
  51. package/dist/tools/add-features.test.d.ts.map +1 -0
  52. package/dist/tools/add-features.test.js +170 -0
  53. package/dist/tools/add-features.test.js.map +1 -0
  54. package/dist/tools/get-features.d.ts +1 -2
  55. package/dist/tools/get-features.d.ts.map +1 -1
  56. package/dist/tools/get-features.js +1 -2
  57. package/dist/tools/get-features.js.map +1 -1
  58. package/dist/tools/get-features.test.js +6 -2
  59. package/dist/tools/get-features.test.js.map +1 -1
  60. package/dist/tools/get-scaffold.d.ts.map +1 -1
  61. package/dist/tools/get-scaffold.js +52 -13
  62. package/dist/tools/get-scaffold.js.map +1 -1
  63. package/dist/tools/get-scaffold.test.js +19 -5
  64. package/dist/tools/get-scaffold.test.js.map +1 -1
  65. package/dist/tools/index.d.ts +1 -0
  66. package/dist/tools/index.d.ts.map +1 -1
  67. package/dist/tools/index.js +1 -0
  68. package/dist/tools/index.js.map +1 -1
  69. package/dist/tools/registry.d.ts.map +1 -1
  70. package/dist/tools/registry.js +8 -0
  71. package/dist/tools/registry.js.map +1 -1
  72. package/dist/utils/scaffold/compute.d.ts.map +1 -1
  73. package/dist/utils/scaffold/compute.js +3 -1
  74. package/dist/utils/scaffold/compute.js.map +1 -1
  75. package/dist/utils/scaffold/dependencies.d.ts +15 -2
  76. package/dist/utils/scaffold/dependencies.d.ts.map +1 -1
  77. package/dist/utils/scaffold/dependencies.js +15 -8
  78. package/dist/utils/scaffold/dependencies.js.map +1 -1
  79. package/dist/utils/scaffold/file-structure.d.ts +12 -0
  80. package/dist/utils/scaffold/file-structure.d.ts.map +1 -1
  81. package/dist/utils/scaffold/file-structure.js +23 -0
  82. package/dist/utils/scaffold/file-structure.js.map +1 -1
  83. package/dist/utils/scaffold/generators.d.ts.map +1 -1
  84. package/dist/utils/scaffold/generators.js +10 -0
  85. package/dist/utils/scaffold/generators.js.map +1 -1
  86. package/dist/utils/scaffold/index.d.ts +3 -2
  87. package/dist/utils/scaffold/index.d.ts.map +1 -1
  88. package/dist/utils/scaffold/index.js +1 -1
  89. package/dist/utils/scaffold/index.js.map +1 -1
  90. package/package.json +1 -1
  91. package/templates/e2e/tests/language.spec.ts +2 -1
  92. package/templates/src/contexts/queryContext.tsx +1 -2
  93. package/templates/src/lib/storage.ts +1 -1
@@ -0,0 +1,157 @@
1
+ /**
2
+ * add_features tool
3
+ *
4
+ * Get files and dependencies for adding features to an existing project.
5
+ * Unlike get_scaffold, this tool does NOT auto-include the `core` feature,
6
+ * as it assumes the project already has core scaffolded.
7
+ */
8
+ import { z } from 'zod';
9
+ import { FEATURE_IDS, FEATURES } from '../features/index.js';
10
+ import { computeDocsForFeatures } from '../utils/docs.js';
11
+ import { collectFeatureFiles, getConfigFiles, mergeDependencies, mergeScripts, resolveFeatureDependencies, } from '../utils/scaffold/index.js';
12
+ import { generateEnvTs, generateRoutesTs, generateViteEnvDts } from '../utils/scaffold/generators.js';
13
+ /** Zod schema for add_features input */
14
+ export const addFeaturesSchema = z.object({
15
+ features: z
16
+ .array(z.string())
17
+ .min(1, 'At least one feature required')
18
+ .max(15, 'Maximum 15 features allowed')
19
+ .check((ctx) => {
20
+ const invalidFeatures = ctx.value.filter((f) => !(f in FEATURES));
21
+ if (invalidFeatures.length > 0) {
22
+ ctx.issues.push({
23
+ code: 'custom',
24
+ message: `Invalid features: ${invalidFeatures.join(', ')}. Valid: ${FEATURE_IDS.join(', ')}`,
25
+ input: ctx.value,
26
+ path: [],
27
+ });
28
+ }
29
+ })
30
+ .describe('List of feature IDs to add (e.g., ["routing", "state", "forms"])'),
31
+ });
32
+ /** Handler function */
33
+ export async function addFeatures(input) {
34
+ const { features } = input;
35
+ // 1. Resolve feature dependencies WITHOUT auto-including core
36
+ // (existing projects already have core scaffolded)
37
+ const resolvedFeatureIds = resolveFeatureDependencies(features, { includeCore: false });
38
+ // 2. Merge dependencies from all features
39
+ const { dependencies, devDependencies, warnings } = await mergeDependencies(resolvedFeatureIds);
40
+ // 3. Merge scripts
41
+ const scripts = mergeScripts(resolvedFeatureIds);
42
+ // 4. Collect file paths from all features
43
+ const { files, testFiles } = collectFeatureFiles(resolvedFeatureIds);
44
+ // 5. Get config files that may need updates
45
+ const configFiles = getConfigFiles(resolvedFeatureIds);
46
+ // 6. Get relevant documentation
47
+ const docs = computeDocsForFeatures(resolvedFeatureIds);
48
+ // 7. Generate code if routing/api/observability included
49
+ const regenerated = {};
50
+ if (resolvedFeatureIds.includes('routing')) {
51
+ regenerated.routesTs = generateRoutesTs();
52
+ }
53
+ // Always generate env files if api or observability is added
54
+ if (resolvedFeatureIds.includes('api') || resolvedFeatureIds.includes('observability')) {
55
+ regenerated.envTs = generateEnvTs(resolvedFeatureIds);
56
+ regenerated.viteEnvDts = generateViteEnvDts(resolvedFeatureIds);
57
+ }
58
+ // 8. Build feature details
59
+ const featureDetails = resolvedFeatureIds.map((id) => {
60
+ const feature = FEATURES[id];
61
+ return {
62
+ id,
63
+ name: feature.name,
64
+ description: feature.description,
65
+ wasExplicitlySelected: features.includes(id),
66
+ wasAutoIncluded: !features.includes(id),
67
+ };
68
+ });
69
+ return {
70
+ // Selected and resolved features
71
+ selectedFeatures: features,
72
+ resolvedFeatures: resolvedFeatureIds,
73
+ featureDetails,
74
+ // Dependencies to install
75
+ dependencies,
76
+ devDependencies,
77
+ // Scripts to add to package.json
78
+ scripts,
79
+ // Files to create (fetch via get_file)
80
+ files,
81
+ testFiles,
82
+ // Config files that may need updates
83
+ configFiles,
84
+ // Documentation files (fetch via get_file)
85
+ docs,
86
+ // Generated code (write directly, no need for get_file)
87
+ regenerated,
88
+ // Warnings (e.g., missing deps in source package.json)
89
+ warnings,
90
+ // Usage instructions
91
+ instructions: generateInstructions(resolvedFeatureIds),
92
+ };
93
+ }
94
+ function generateInstructions(features) {
95
+ const hasRouting = features.includes('routing');
96
+ const hasEnvChanges = features.includes('api') || features.includes('observability');
97
+ return `## Integration Instructions
98
+
99
+ 1. Install dependencies:
100
+ \`npm install <dependencies>\`
101
+ \`npm install -D <devDependencies>\`
102
+
103
+ 2. Add scripts to package.json
104
+
105
+ 3. Write generated content (if any):${hasRouting ? '\n - `src/lib/routes.ts` ← from `regenerated.routesTs`' : ''}${hasEnvChanges ? '\n - `src/lib/env.ts` ← from `regenerated.envTs`\n - `src/vite-env.d.ts` ← from `regenerated.viteEnvDts`' : ''}
106
+
107
+ 4. For EACH file in \`files\` and \`testFiles\`:
108
+ - Fetch content via \`get_file({ path: "..." })\`
109
+ - Create file in project
110
+ - Integrate with existing code as needed
111
+
112
+ 5. Review and update config files:
113
+ - Check each file in \`configFiles\`
114
+ - Merge any feature-specific configurations
115
+
116
+ 6. Update existing files to use new features:
117
+ - Import and use new stores/hooks/components
118
+ - Add providers to App.tsx if needed`;
119
+ }
120
+ /** Tool definition */
121
+ export const addFeaturesToolDefinition = {
122
+ name: 'add_features',
123
+ description: `Get files and dependencies for adding features to an existing project.
124
+
125
+ Returns metadata for incrementally adding features without scaffolding entire project.
126
+ Does NOT auto-include \`core\` feature (assumes project already has core).
127
+
128
+ **Returns:**
129
+ - \`resolvedFeatures\`: Features including auto-resolved dependencies
130
+ - \`featureDetails\`: Details with wasExplicitlySelected/wasAutoIncluded flags
131
+ - \`dependencies\`: npm packages to install (production)
132
+ - \`devDependencies\`: npm packages to install (dev)
133
+ - \`scripts\`: npm scripts to add
134
+ - \`files\`: Source files to create (fetch via get_file)
135
+ - \`testFiles\`: Test files to create (fetch via get_file)
136
+ - \`configFiles\`: Config files that may need updates
137
+ - \`docs\`: Documentation files (fetch via get_file)
138
+ - \`regenerated\`: Generated code (routesTs, envTs, viteEnvDts)
139
+ - \`warnings\`: Any issues encountered
140
+ - \`instructions\`: Integration guidance
141
+
142
+ **Feature Dependencies:**
143
+ - theming → state (auto-included)
144
+
145
+ **Usage Pattern:**
146
+ 1. Call add_features with feature list
147
+ 2. Install dependencies
148
+ 3. Add scripts to package.json
149
+ 4. Write generated content from \`regenerated\`
150
+ 5. Fetch each file via \`get_file({ path: "..." })\`
151
+ 6. Integrate files into existing project
152
+ 7. Update config files as needed
153
+
154
+ **Example:** features: ["theming"] → resolvedFeatures: ["theming", "state"]`,
155
+ inputSchema: z.toJSONSchema(addFeaturesSchema),
156
+ };
157
+ //# sourceMappingURL=add-features.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-features.js","sourceRoot":"","sources":["../../src/tools/add-features.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,0BAA0B,GAC3B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAGtG,wCAAwC;AACxC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,QAAQ,EAAE,CAAC;SACR,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACjB,GAAG,CAAC,CAAC,EAAE,+BAA+B,CAAC;SACvC,GAAG,CAAC,EAAE,EAAE,6BAA6B,CAAC;SACtC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACb,MAAM,eAAe,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC;QAC1E,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;gBACd,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,qBAAqB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAC5F,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,IAAI,EAAE,EAAE;aACT,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;SACD,QAAQ,CAAC,kEAAkE,CAAC;CAChF,CAAC,CAAC;AAIH,uBAAuB;AACvB,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAuB;IACvD,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAE3B,8DAA8D;IAC9D,mDAAmD;IACnD,MAAM,kBAAkB,GAAG,0BAA0B,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;IAExF,0CAA0C;IAC1C,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,GAAG,MAAM,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;IAEhG,mBAAmB;IACnB,MAAM,OAAO,GAAG,YAAY,CAAC,kBAAkB,CAAC,CAAC;IAEjD,0CAA0C;IAC1C,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;IAErE,4CAA4C;IAC5C,MAAM,WAAW,GAAG,cAAc,CAAC,kBAAkB,CAAC,CAAC;IAEvD,gCAAgC;IAChC,MAAM,IAAI,GAAG,sBAAsB,CAAC,kBAAkB,CAAC,CAAC;IAExD,yDAAyD;IACzD,MAAM,WAAW,GAIb,EAAE,CAAC;IAEP,IAAI,kBAAkB,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3C,WAAW,CAAC,QAAQ,GAAG,gBAAgB,EAAE,CAAC;IAC5C,CAAC;IAED,6DAA6D;IAC7D,IAAI,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,kBAAkB,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QACvF,WAAW,CAAC,KAAK,GAAG,aAAa,CAAC,kBAAkB,CAAC,CAAC;QACtD,WAAW,CAAC,UAAU,GAAG,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;IAClE,CAAC;IAED,2BAA2B;IAC3B,MAAM,cAAc,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QACnD,MAAM,OAAO,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC7B,OAAO;YACL,EAAE;YACF,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,qBAAqB,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5C,eAAe,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;SACxC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,iCAAiC;QACjC,gBAAgB,EAAE,QAAQ;QAC1B,gBAAgB,EAAE,kBAAkB;QACpC,cAAc;QAEd,0BAA0B;QAC1B,YAAY;QACZ,eAAe;QAEf,iCAAiC;QACjC,OAAO;QAEP,uCAAuC;QACvC,KAAK;QACL,SAAS;QAET,qCAAqC;QACrC,WAAW;QAEX,2CAA2C;QAC3C,IAAI;QAEJ,wDAAwD;QACxD,WAAW;QAEX,uDAAuD;QACvD,QAAQ;QAER,qBAAqB;QACrB,YAAY,EAAE,oBAAoB,CAAC,kBAAkB,CAAC;KACvD,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,QAAqB;IACjD,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAChD,MAAM,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;IAErF,OAAO;;;;;;;;sCAQ6B,UAAU,CAAC,CAAC,CAAC,0DAA0D,CAAC,CAAC,CAAC,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,8GAA8G,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;wCAahN,CAAC;AACzC,CAAC;AAED,sBAAsB;AACtB,MAAM,CAAC,MAAM,yBAAyB,GAAmB;IACvD,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4EA+B6D;IAC1E,WAAW,EAAE,CAAC,CAAC,YAAY,CAAC,iBAAiB,CAAkC;CAChF,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for add_features tool
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=add-features.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-features.test.d.ts","sourceRoot":"","sources":["../../src/tools/add-features.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,170 @@
1
+ /**
2
+ * Tests for add_features tool
3
+ */
4
+ import { describe, it, expect } from 'vitest';
5
+ import { addFeatures, addFeaturesSchema } from './add-features.js';
6
+ describe('add_features tool', () => {
7
+ describe('schema validation', () => {
8
+ it('requires at least one feature', () => {
9
+ const result = addFeaturesSchema.safeParse({ features: [] });
10
+ expect(result.success).toBe(false);
11
+ if (!result.success) {
12
+ expect(result.error.message).toContain('At least one feature required');
13
+ }
14
+ });
15
+ it('rejects invalid features via schema', () => {
16
+ const result = addFeaturesSchema.safeParse({
17
+ features: ['invalid-feature'],
18
+ });
19
+ expect(result.success).toBe(false);
20
+ if (!result.success) {
21
+ expect(result.error.message).toContain('Invalid features');
22
+ }
23
+ });
24
+ it('accepts valid features', () => {
25
+ const result = addFeaturesSchema.safeParse({
26
+ features: ['state', 'routing'],
27
+ });
28
+ expect(result.success).toBe(true);
29
+ });
30
+ it('rejects more than 15 features', () => {
31
+ const result = addFeaturesSchema.safeParse({
32
+ features: Array(16).fill('state'),
33
+ });
34
+ expect(result.success).toBe(false);
35
+ if (!result.success) {
36
+ expect(result.error.message).toContain('Maximum 15 features');
37
+ }
38
+ });
39
+ });
40
+ describe('feature resolution', () => {
41
+ it('does NOT auto-include core feature', async () => {
42
+ const result = await addFeatures({ features: ['state'] });
43
+ expect(result.resolvedFeatures).not.toContain('core');
44
+ expect(result.resolvedFeatures).toContain('state');
45
+ });
46
+ it('auto-includes feature dependencies (theming → state)', async () => {
47
+ const result = await addFeatures({ features: ['theming'] });
48
+ expect(result.resolvedFeatures).toContain('theming');
49
+ expect(result.resolvedFeatures).toContain('state');
50
+ expect(result.resolvedFeatures).not.toContain('core');
51
+ });
52
+ it('marks auto-included features correctly', async () => {
53
+ const result = await addFeatures({ features: ['theming'] });
54
+ const themingDetail = result.featureDetails.find((f) => f.id === 'theming');
55
+ const stateDetail = result.featureDetails.find((f) => f.id === 'state');
56
+ // Theming was explicitly selected
57
+ expect(themingDetail?.wasExplicitlySelected).toBe(true);
58
+ expect(themingDetail?.wasAutoIncluded).toBe(false);
59
+ // State was auto-included (dependency of theming)
60
+ expect(stateDetail?.wasExplicitlySelected).toBe(false);
61
+ expect(stateDetail?.wasAutoIncluded).toBe(true);
62
+ });
63
+ it('returns only selected features when no dependencies', async () => {
64
+ const result = await addFeatures({ features: ['ui'] });
65
+ expect(result.resolvedFeatures).toEqual(['ui']);
66
+ });
67
+ });
68
+ describe('dependencies', () => {
69
+ it('returns dependencies for selected features', async () => {
70
+ const result = await addFeatures({ features: ['state'] });
71
+ expect(result.dependencies).toHaveProperty('zustand');
72
+ });
73
+ it('returns routing dependencies when routing selected', async () => {
74
+ const result = await addFeatures({ features: ['routing'] });
75
+ expect(result.dependencies).toHaveProperty('react-router');
76
+ });
77
+ it('does NOT include core dependencies', async () => {
78
+ const result = await addFeatures({ features: ['state'] });
79
+ // Core deps like react/react-dom should not be included
80
+ expect(result.dependencies).not.toHaveProperty('react');
81
+ expect(result.dependencies).not.toHaveProperty('react-dom');
82
+ });
83
+ });
84
+ describe('files', () => {
85
+ it('returns files for selected features', async () => {
86
+ const result = await addFeatures({ features: ['state'] });
87
+ expect(result.files).toContain('src/stores/preferencesStore.ts');
88
+ expect(result.files).toContain('src/stores/index.ts');
89
+ });
90
+ it('returns testFiles for selected features', async () => {
91
+ const result = await addFeatures({ features: ['state'] });
92
+ expect(result.testFiles).toContain('src/stores/preferencesStore.test.ts');
93
+ });
94
+ it('includes files from auto-included dependencies', async () => {
95
+ const result = await addFeatures({ features: ['theming'] });
96
+ // Theming files
97
+ expect(result.files).toContain('src/hooks/useThemeEffect.ts');
98
+ // State files (auto-included dependency)
99
+ expect(result.files).toContain('src/stores/preferencesStore.ts');
100
+ });
101
+ it('returns configFiles that may need updates', async () => {
102
+ // Use 'ui' feature which has configFiles defined (components.json)
103
+ const result = await addFeatures({ features: ['ui'] });
104
+ expect(Array.isArray(result.configFiles)).toBe(true);
105
+ expect(result.configFiles).toContain('components.json');
106
+ });
107
+ it('returns empty configFiles when feature has none', async () => {
108
+ // 'state' feature has no configFiles
109
+ const result = await addFeatures({ features: ['state'] });
110
+ expect(Array.isArray(result.configFiles)).toBe(true);
111
+ expect(result.configFiles.length).toBe(0);
112
+ });
113
+ });
114
+ describe('docs', () => {
115
+ it('returns relevant documentation files', async () => {
116
+ const result = await addFeatures({ features: ['testing'] });
117
+ expect(result.docs).toContain('docs/TESTING.md');
118
+ });
119
+ it('includes universal docs', async () => {
120
+ const result = await addFeatures({ features: ['state'] });
121
+ expect(result.docs).toContain('docs/ARCHITECTURE.md');
122
+ });
123
+ });
124
+ describe('regenerated content', () => {
125
+ it('generates routesTs when routing is selected', async () => {
126
+ const result = await addFeatures({ features: ['routing'] });
127
+ expect(result.regenerated.routesTs).toBeDefined();
128
+ expect(result.regenerated.routesTs).toContain('ROUTES');
129
+ });
130
+ it('does NOT generate routesTs when routing is not selected', async () => {
131
+ const result = await addFeatures({ features: ['state'] });
132
+ expect(result.regenerated.routesTs).toBeUndefined();
133
+ });
134
+ it('generates envTs when api is selected', async () => {
135
+ const result = await addFeatures({ features: ['api'] });
136
+ expect(result.regenerated.envTs).toBeDefined();
137
+ expect(result.regenerated.viteEnvDts).toBeDefined();
138
+ });
139
+ });
140
+ describe('instructions', () => {
141
+ it('returns integration instructions', async () => {
142
+ const result = await addFeatures({ features: ['state'] });
143
+ expect(result.instructions).toContain('Integration Instructions');
144
+ expect(result.instructions).toContain('npm install');
145
+ expect(result.instructions).toContain('get_file');
146
+ });
147
+ });
148
+ describe('difference from get_scaffold', () => {
149
+ it('does NOT include core feature or its files', async () => {
150
+ const result = await addFeatures({ features: ['ui'] });
151
+ // Core files should NOT be included
152
+ expect(result.files).not.toContain('src/App.tsx');
153
+ expect(result.files).not.toContain('src/main.tsx');
154
+ // Only UI files
155
+ expect(result.resolvedFeatures).toEqual(['ui']);
156
+ });
157
+ it('does NOT include package.json template', async () => {
158
+ const result = await addFeatures({ features: ['state'] });
159
+ // Should NOT have full packageJson, just deps
160
+ expect(result).not.toHaveProperty('packageJson');
161
+ expect(result).toHaveProperty('dependencies');
162
+ expect(result).toHaveProperty('devDependencies');
163
+ });
164
+ it('does NOT include claudeMd', async () => {
165
+ const result = await addFeatures({ features: ['state'] });
166
+ expect(result).not.toHaveProperty('claudeMd');
167
+ });
168
+ });
169
+ });
170
+ //# sourceMappingURL=add-features.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-features.test.js","sourceRoot":"","sources":["../../src/tools/add-features.test.ts"],"names":[],"mappings":"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"}
@@ -12,12 +12,11 @@ export interface FeatureSummary {
12
12
  name: string;
13
13
  description: string;
14
14
  required: boolean;
15
- includes: string[];
16
15
  }
17
16
  /**
18
17
  * Lists all available features for scaffolding.
19
18
  *
20
- * @returns Array of feature summaries with id, name, description, required flag, and includes
19
+ * @returns Array of feature summaries with id, name, description, and required flag
21
20
  *
22
21
  * @example
23
22
  * ```typescript
@@ -1 +1 @@
1
- {"version":3,"file":"get-features.d.ts","sourceRoot":"","sources":["../../src/tools/get-features.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,qDAAqD;AACrD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,IAAI,cAAc,EAAE,CAW9C;AAED,4DAA4D;AAC5D,eAAO,MAAM,yBAAyB,EAAE,cAuBvC,CAAC"}
1
+ {"version":3,"file":"get-features.d.ts","sourceRoot":"","sources":["../../src/tools/get-features.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,qDAAqD;AACrD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,IAAI,cAAc,EAAE,CAU9C;AAED,4DAA4D;AAC5D,eAAO,MAAM,yBAAyB,EAAE,cAuBvC,CAAC"}
@@ -9,7 +9,7 @@ import { FEATURES, FEATURE_IDS } from '../features/index.js';
9
9
  /**
10
10
  * Lists all available features for scaffolding.
11
11
  *
12
- * @returns Array of feature summaries with id, name, description, required flag, and includes
12
+ * @returns Array of feature summaries with id, name, description, and required flag
13
13
  *
14
14
  * @example
15
15
  * ```typescript
@@ -25,7 +25,6 @@ export function getFeatures() {
25
25
  name: feature.name,
26
26
  description: feature.description,
27
27
  required: feature.required,
28
- includes: feature.includes,
29
28
  };
30
29
  });
31
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"get-features.js","sourceRoot":"","sources":["../../src/tools/get-features.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAY7D;;;;;;;;;;GAUG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,EAAkB,EAAE;QAC5C,MAAM,OAAO,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC7B,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC;YACd,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,4DAA4D;AAC5D,MAAM,CAAC,MAAM,yBAAyB,GAAmB;IACvD,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE;;;;;;;;;;;;;;;uEAewD;IACrE,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,EAAE;QACd,QAAQ,EAAE,EAAE;KACb;CACF,CAAC"}
1
+ {"version":3,"file":"get-features.js","sourceRoot":"","sources":["../../src/tools/get-features.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAW7D;;;;;;;;;;GAUG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,EAAkB,EAAE;QAC5C,MAAM,OAAO,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC7B,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC;YACd,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,4DAA4D;AAC5D,MAAM,CAAC,MAAM,yBAAyB,GAAmB;IACvD,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE;;;;;;;;;;;;;;;uEAewD;IACrE,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,EAAE;QACd,QAAQ,EAAE,EAAE;KACb;CACF,CAAC"}
@@ -23,8 +23,12 @@ describe('get_features tool', () => {
23
23
  expect(feature).toHaveProperty('name');
24
24
  expect(feature).toHaveProperty('description');
25
25
  expect(feature).toHaveProperty('required');
26
- expect(feature).toHaveProperty('includes');
27
- expect(Array.isArray(feature.includes)).toBe(true);
26
+ }
27
+ });
28
+ it('does not include redundant includes property', () => {
29
+ const features = getFeatures();
30
+ for (const feature of features) {
31
+ expect(feature).not.toHaveProperty('includes');
28
32
  }
29
33
  });
30
34
  it('mobile feature exists and is not required', () => {
@@ -1 +1 @@
1
- {"version":3,"file":"get-features.test.js","sourceRoot":"","sources":["../../src/tools/get-features.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;QAE/B,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;QAEnD,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;QAE/B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YACrC,MAAM,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YACvC,MAAM,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;YAC9C,MAAM,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YAC3C,MAAM,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;QAEvD,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7B,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;QAEzD,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9B,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"get-features.test.js","sourceRoot":"","sources":["../../src/tools/get-features.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-scaffold.d.ts","sourceRoot":"","sources":["../../src/tools/get-scaffold.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,kEAAkE;AAClE,eAAO,MAAM,iBAAiB;;;iBAsB5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEjE,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCxD;AAqBD,wFAAwF;AACxF,eAAO,MAAM,yBAAyB,EAAE,cAsBvC,CAAC"}
1
+ {"version":3,"file":"get-scaffold.d.ts","sourceRoot":"","sources":["../../src/tools/get-scaffold.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,kEAAkE;AAClE,eAAO,MAAM,iBAAiB;;;iBAsB5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEjE,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCxD;AAkDD,wFAAwF;AACxF,eAAO,MAAM,yBAAyB,EAAE,cAgCvC,CAAC"}
@@ -72,18 +72,47 @@ function generateInstructions(setupCommands, features) {
72
72
  const hasRouting = features.includes('routing');
73
73
  return `## Setup Instructions
74
74
 
75
- 1. Create project with \`packageJson\`
76
- 2. Use generated content: \`claudeMd\`, \`viteEnvDts\`, \`envTs\`${hasRouting ? ', `routesTs`' : ''}
77
- 3. Fetch ALL files via \`get_file({ path: "..." })\`:
78
- - \`configFiles\`: config file paths
79
- - \`docs\`: documentation paths
80
- - \`fileStructure\`: ALL source file paths
81
- 4. Strip imports/code for features NOT in \`resolvedFeatures\`
82
- 5. Run: ${setupCommands.join(' && ')}
75
+ 1. Create project directory and \`package.json\`
76
+ 2. Write generated content directly:
77
+ - \`CLAUDE.md\` from \`claudeMd\`
78
+ - \`src/vite-env.d.ts\` from \`viteEnvDts\`
79
+ - \`src/lib/env.ts\` from \`envTs\`${hasRouting ? '\n - `src/lib/routes.ts` ← from `routesTs`' : ''}
80
+
81
+ 3. **Create progress tracking file** at project root:
82
+
83
+ \`\`\`markdown
84
+ # scaffold-progress.md
85
+
86
+ ## Source Files
87
+ - [ ] src/App.tsx
88
+ - [ ] src/main.tsx
89
+ ... (list EVERY file from \`fileStructure\`)
90
+
91
+ ## Config Files
92
+ - [ ] vite.config.ts
93
+ - [ ] src/index.css
94
+ ... (list EVERY file from \`configFiles\`)
95
+
96
+ ## Documentation
97
+ - [ ] docs/ARCHITECTURE.md
98
+ ... (list EVERY file from \`docs\`)
99
+ \`\`\`
100
+
101
+ 4. For EACH file in the tracking list:
102
+ - Fetch content via \`get_file({ path: "..." })\`
103
+ - Write file to project
104
+ - Mark \`[x]\` in scaffold-progress.md
105
+
106
+ 5. **Before running setup commands**, scan scaffold-progress.md for any unchecked boxes
107
+ 6. Delete scaffold-progress.md
108
+ 7. Run: ${setupCommands.join(' && ')}
83
109
 
84
110
  ## CRITICAL
85
111
 
86
- Do NOT generate file content. Fetch via \`get_file\`, then adapt for selected features.`;
112
+ - Create scaffold-progress.md BEFORE fetching any files
113
+ - Mark each file [x] IMMEDIATELY after creating it
114
+ - Do NOT run setup commands until ALL boxes are checked
115
+ - Do NOT generate file content - fetch via \`get_file\``;
87
116
  }
88
117
  /** Tool definition derived from Zod schema - single source of truth (Zod v4 native). */
89
118
  export const getScaffoldToolDefinition = {
@@ -93,16 +122,26 @@ export const getScaffoldToolDefinition = {
93
122
  Returns package.json, file structure paths, setup commands, and generated files.
94
123
 
95
124
  **Lazy Loading** - fetch ALL content via \`get_file({ path: "..." })\`:
96
- - \`configFiles\`: config file paths
125
+ - \`fileStructure\`: source files (includes test files, excludes configs)
126
+ - \`configFiles\`: config file paths (vite.config.ts, tsconfig.json, etc.)
97
127
  - \`docs\`: documentation paths
98
- - \`fileStructure\`: ALL source file paths
99
128
 
100
- **Generated Content** (included directly):
129
+ These three lists are **non-overlapping** - concatenate them for complete file list.
130
+
131
+ **Generated Content** (included directly - write these first):
101
132
  - \`claudeMd\`: CLAUDE.md content
102
133
  - \`viteEnvDts\`, \`envTs\`: TypeScript declarations
103
134
  - \`routesTs\`: Route constants (if routing feature selected)
104
135
 
105
- CRITICAL: Do NOT generate file content. Fetch via \`get_file\`, then strip imports/code for features NOT in \`resolvedFeatures\`.
136
+ ## File Tracking Protocol (MUST FOLLOW)
137
+
138
+ After receiving this response, create \`scaffold-progress.md\` at project root:
139
+ 1. List ALL files from fileStructure, configFiles, and docs as unchecked boxes (\`- [ ]\`)
140
+ 2. Fetch each file via get_file and mark [x] after creation
141
+ 3. Before running setup commands, scan for any unchecked boxes
142
+ 4. Delete scaffold-progress.md, then run setup commands
143
+
144
+ CRITICAL: Do NOT skip test files or documentation. ALL files must be created.
106
145
 
107
146
  Feature dependencies: theming → state (auto-included)
108
147
 
@@ -1 +1 @@
1
- {"version":3,"file":"get-scaffold.js","sourceRoot":"","sources":["../../src/tools/get-scaffold.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"get-scaffold.js","sourceRoot":"","sources":["../../src/tools/get-scaffold.ts"],"names":[],"mappings":"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"}
@@ -165,9 +165,12 @@ describe('get_scaffold tool', () => {
165
165
  expect(Array.isArray(result.configFiles)).toBe(true);
166
166
  expect(result.configFiles).toContain('components.json');
167
167
  });
168
- it('always includes .gitignore in fileStructure (core feature)', async () => {
168
+ it('does NOT include config files in fileStructure (separate configFiles array)', async () => {
169
169
  const result = await getScaffold({ features: [] });
170
- expect(result.fileStructure).toContain('.gitignore');
170
+ // Config files should only appear in configFiles, not in fileStructure
171
+ for (const configFile of result.configFiles) {
172
+ expect(result.fileStructure).not.toContain(configFile);
173
+ }
171
174
  });
172
175
  it('always includes .gitignore in configFiles array', async () => {
173
176
  const result = await getScaffold({ features: [] });
@@ -191,11 +194,22 @@ describe('get_scaffold tool', () => {
191
194
  expect(result.docs).toContain('docs/TESTING.md');
192
195
  expect(result.fileStructure).not.toContain('docs/TESTING.md');
193
196
  });
194
- it('instructions reference get_file for lazy loading', async () => {
197
+ it('instructions reference tracking protocol', async () => {
195
198
  const result = await getScaffold({ features: [] });
196
199
  expect(result.instructions).toContain('get_file');
197
- expect(result.instructions).toContain('configFiles');
198
- expect(result.instructions).toContain('docs');
200
+ expect(result.instructions).toContain('scaffold-progress.md');
201
+ expect(result.instructions).toContain('- [ ]');
202
+ expect(result.instructions).toContain('Mark');
203
+ });
204
+ it('instructions include explicit checklist template', async () => {
205
+ const result = await getScaffold({ features: [] });
206
+ expect(result.instructions).toContain('## Source Files');
207
+ expect(result.instructions).toContain('## Config Files');
208
+ expect(result.instructions).toContain('## Documentation');
209
+ });
210
+ it('does not return fileCounts', async () => {
211
+ const result = await getScaffold({ features: [] });
212
+ expect(result).not.toHaveProperty('fileCounts');
199
213
  });
200
214
  });
201
215
  //# sourceMappingURL=get-scaffold.test.js.map