@react-spa-scaffold/mcp 0.3.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.
- package/README.md +423 -0
- package/dist/features/index.d.ts +5 -0
- package/dist/features/index.d.ts.map +1 -0
- package/dist/features/index.js +3 -0
- package/dist/features/index.js.map +1 -0
- package/dist/features/registry.d.ts +10 -0
- package/dist/features/registry.d.ts.map +1 -0
- package/dist/features/registry.js +508 -0
- package/dist/features/registry.js.map +1 -0
- package/dist/features/types.d.ts +45 -0
- package/dist/features/types.d.ts.map +1 -0
- package/dist/features/types.js +5 -0
- package/dist/features/types.js.map +1 -0
- package/dist/features/versions.d.ts +16 -0
- package/dist/features/versions.d.ts.map +1 -0
- package/dist/features/versions.js +46 -0
- package/dist/features/versions.js.map +1 -0
- package/dist/features/versions.json +5 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/docs.d.ts +29 -0
- package/dist/resources/docs.d.ts.map +1 -0
- package/dist/resources/docs.js +105 -0
- package/dist/resources/docs.js.map +1 -0
- package/dist/resources/index.d.ts +2 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +2 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/server.d.ts +12 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +115 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/get-example.d.ts +51 -0
- package/dist/tools/get-example.d.ts.map +1 -0
- package/dist/tools/get-example.js +90 -0
- package/dist/tools/get-example.js.map +1 -0
- package/dist/tools/get-features.d.ts +30 -0
- package/dist/tools/get-features.d.ts.map +1 -0
- package/dist/tools/get-features.js +46 -0
- package/dist/tools/get-features.js.map +1 -0
- package/dist/tools/get-scaffold.d.ts +77 -0
- package/dist/tools/get-scaffold.d.ts.map +1 -0
- package/dist/tools/get-scaffold.js +153 -0
- package/dist/tools/get-scaffold.js.map +1 -0
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/utils/docs.d.ts +14 -0
- package/dist/utils/docs.d.ts.map +1 -0
- package/dist/utils/docs.js +64 -0
- package/dist/utils/docs.js.map +1 -0
- package/dist/utils/examples.d.ts +27 -0
- package/dist/utils/examples.d.ts.map +1 -0
- package/dist/utils/examples.js +399 -0
- package/dist/utils/examples.js.map +1 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +5 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/paths.d.ts +28 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +40 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/scaffold.d.ts +50 -0
- package/dist/utils/scaffold.d.ts.map +1 -0
- package/dist/utils/scaffold.js +500 -0
- package/dist/utils/scaffold.js.map +1 -0
- package/dist/version.d.ts +5 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +19 -0
- package/dist/version.js.map +1 -0
- package/package.json +63 -0
- package/templates/.bundled +0 -0
- package/templates/CLAUDE.md +145 -0
- package/templates/docs/API_REFERENCE.md +58 -0
- package/templates/docs/ARCHITECTURE.md +185 -0
- package/templates/docs/CODING_STANDARDS.md +53 -0
- package/templates/docs/COMPONENT_GUIDELINES.md +301 -0
- package/templates/docs/E2E_TESTING.md +116 -0
- package/templates/docs/INTERNATIONALIZATION.md +67 -0
- package/templates/docs/TESTING.md +259 -0
- package/templates/docs/WORKFLOW.md +170 -0
- package/templates/src/App.tsx +42 -0
- package/templates/src/components/layout/Header.tsx +19 -0
- package/templates/src/components/layout/index.ts +1 -0
- package/templates/src/components/shared/ErrorBoundary/ErrorBoundary.tsx +104 -0
- package/templates/src/components/shared/ErrorBoundary/index.ts +1 -0
- package/templates/src/components/shared/LanguageSwitcher/LanguageSwitcher.tsx +45 -0
- package/templates/src/components/shared/LanguageSwitcher/index.ts +1 -0
- package/templates/src/components/shared/SEO/SEO.tsx +55 -0
- package/templates/src/components/shared/SEO/index.ts +1 -0
- package/templates/src/components/shared/ThemeToggle/ThemeToggle.tsx +41 -0
- package/templates/src/components/shared/ThemeToggle/index.ts +1 -0
- package/templates/src/components/shared/index.ts +4 -0
- package/templates/src/components/ui/button.tsx +48 -0
- package/templates/src/components/ui/dropdown-menu.tsx +228 -0
- package/templates/src/components/ui/form-error.tsx +95 -0
- package/templates/src/components/ui/loading.tsx +58 -0
- package/templates/src/components/ui/skeleton.tsx +52 -0
- package/templates/src/components/ui/sonner.tsx +34 -0
- package/templates/src/components/ui/spinner.tsx +40 -0
- package/templates/src/components/ui/visually-hidden.tsx +51 -0
- package/templates/src/contexts/mobileContext.tsx +66 -0
- package/templates/src/contexts/queryContext.tsx +28 -0
- package/templates/src/hooks/index.ts +7 -0
- package/templates/src/hooks/useContactForm.ts +33 -0
- package/templates/src/hooks/useExampleQuery.ts +20 -0
- package/templates/src/hooks/useLanguage.ts +23 -0
- package/templates/src/hooks/useMediaQuery.ts +53 -0
- package/templates/src/hooks/useThemeEffect.ts +31 -0
- package/templates/src/hooks/useTouchSizes.ts +16 -0
- package/templates/src/i18n/config.ts +11 -0
- package/templates/src/i18n/detectLanguage.ts +57 -0
- package/templates/src/i18n/index.ts +20 -0
- package/templates/src/i18n/loadCatalog.ts +30 -0
- package/templates/src/index.css +98 -0
- package/templates/src/lib/api.ts +142 -0
- package/templates/src/lib/config.ts +15 -0
- package/templates/src/lib/constants.ts +8 -0
- package/templates/src/lib/env.ts +53 -0
- package/templates/src/lib/format.ts +119 -0
- package/templates/src/lib/index.ts +24 -0
- package/templates/src/lib/routes.ts +11 -0
- package/templates/src/lib/storage.ts +91 -0
- package/templates/src/lib/storageKeys.ts +10 -0
- package/templates/src/lib/utils.ts +6 -0
- package/templates/src/lib/validations.ts +39 -0
- package/templates/src/locales/de.po +65 -0
- package/templates/src/locales/en.po +65 -0
- package/templates/src/locales/es.po +65 -0
- package/templates/src/main.tsx +107 -0
- package/templates/src/mocks/fixtures/index.ts +1 -0
- package/templates/src/mocks/fixtures/todos.ts +40 -0
- package/templates/src/mocks/handlers/index.ts +7 -0
- package/templates/src/mocks/handlers/todos.ts +59 -0
- package/templates/src/mocks/index.ts +3 -0
- package/templates/src/mocks/node.ts +9 -0
- package/templates/src/pages/Home.tsx +27 -0
- package/templates/src/pages/NotFound.tsx +28 -0
- package/templates/src/pages/index.ts +2 -0
- package/templates/src/stores/index.ts +2 -0
- package/templates/src/stores/preferencesStore.ts +85 -0
- package/templates/src/test/index.ts +8 -0
- package/templates/src/test/mocks.ts +17 -0
- package/templates/src/test/providers.tsx +54 -0
- package/templates/src/test-setup.ts +54 -0
- package/templates/src/types/api.ts +31 -0
- package/templates/src/types/index.ts +2 -0
- package/templates/src/types/preferences.ts +5 -0
- package/templates/src/vite-env.d.ts +10 -0
- package/templates/tests/unit/components/ErrorBoundary.test.tsx +193 -0
- package/templates/tests/unit/components/Header.test.tsx +33 -0
- package/templates/tests/unit/components/LanguageSwitcher.test.tsx +40 -0
- package/templates/tests/unit/components/Loading.test.tsx +76 -0
- package/templates/tests/unit/components/SEO.test.tsx +80 -0
- package/templates/tests/unit/components/ThemeToggle.test.tsx +62 -0
- package/templates/tests/unit/contexts/mobileContext.test.tsx +54 -0
- package/templates/tests/unit/hooks/useContactForm.test.ts +60 -0
- package/templates/tests/unit/hooks/useExampleQuery.test.tsx +94 -0
- package/templates/tests/unit/hooks/useLanguage.test.tsx +75 -0
- package/templates/tests/unit/hooks/useMediaQuery.test.ts +57 -0
- package/templates/tests/unit/hooks/useThemeEffect.test.ts +42 -0
- package/templates/tests/unit/i18n/detectLanguage.test.ts +40 -0
- package/templates/tests/unit/i18n/loadCatalog.test.ts +70 -0
- package/templates/tests/unit/lib/api.test.ts +142 -0
- package/templates/tests/unit/lib/format.test.ts +100 -0
- package/templates/tests/unit/lib/storage.test.ts +90 -0
- package/templates/tests/unit/lib/utils.test.ts +19 -0
- package/templates/tests/unit/lib/validations.test.ts +56 -0
- package/templates/tests/unit/stores/preferencesStore.test.ts +75 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* get_scaffold tool
|
|
3
|
+
*
|
|
4
|
+
* Returns complete scaffold information for selected features.
|
|
5
|
+
* This includes dependencies, file structure, config files,
|
|
6
|
+
* and setup commands needed to create a new project.
|
|
7
|
+
*/
|
|
8
|
+
import { z } from 'zod';
|
|
9
|
+
import { type CodeExample } from '../utils/index.js';
|
|
10
|
+
export declare const getScaffoldSchema: z.ZodObject<{
|
|
11
|
+
features: z.ZodEffects<z.ZodArray<z.ZodString, "many">, string[], string[]>;
|
|
12
|
+
projectName: z.ZodOptional<z.ZodString>;
|
|
13
|
+
includeExamples: z.ZodOptional<z.ZodBoolean>;
|
|
14
|
+
}, "strip", z.ZodTypeAny, {
|
|
15
|
+
features: string[];
|
|
16
|
+
projectName?: string | undefined;
|
|
17
|
+
includeExamples?: boolean | undefined;
|
|
18
|
+
}, {
|
|
19
|
+
features: string[];
|
|
20
|
+
projectName?: string | undefined;
|
|
21
|
+
includeExamples?: boolean | undefined;
|
|
22
|
+
}>;
|
|
23
|
+
export type GetScaffoldInput = z.infer<typeof getScaffoldSchema>;
|
|
24
|
+
export declare function getScaffold(input: GetScaffoldInput): Promise<{
|
|
25
|
+
projectName: string;
|
|
26
|
+
selectedFeatures: string[];
|
|
27
|
+
resolvedFeatures: string[];
|
|
28
|
+
featureDetails: {
|
|
29
|
+
id: string;
|
|
30
|
+
name: string;
|
|
31
|
+
wasExplicitlySelected: boolean;
|
|
32
|
+
wasAutoIncluded: boolean;
|
|
33
|
+
patterns: string[];
|
|
34
|
+
}[];
|
|
35
|
+
packageJson: {
|
|
36
|
+
name: string;
|
|
37
|
+
dependencies: Record<string, string>;
|
|
38
|
+
devDependencies: Record<string, string>;
|
|
39
|
+
scripts: Record<string, string>;
|
|
40
|
+
engines: Record<string, string>;
|
|
41
|
+
};
|
|
42
|
+
fileStructure: string[];
|
|
43
|
+
configFiles: Record<string, string>;
|
|
44
|
+
setupCommands: string[];
|
|
45
|
+
claudeMd: string;
|
|
46
|
+
viteEnvDts: string;
|
|
47
|
+
envTs: string;
|
|
48
|
+
docs: Record<string, string>;
|
|
49
|
+
examples: Record<string, CodeExample[]> | undefined;
|
|
50
|
+
instructions: string;
|
|
51
|
+
}>;
|
|
52
|
+
export declare const getScaffoldToolDefinition: {
|
|
53
|
+
name: string;
|
|
54
|
+
description: string;
|
|
55
|
+
inputSchema: {
|
|
56
|
+
type: "object";
|
|
57
|
+
properties: {
|
|
58
|
+
features: {
|
|
59
|
+
type: "array";
|
|
60
|
+
items: {
|
|
61
|
+
type: "string";
|
|
62
|
+
};
|
|
63
|
+
description: string;
|
|
64
|
+
};
|
|
65
|
+
projectName: {
|
|
66
|
+
type: "string";
|
|
67
|
+
description: string;
|
|
68
|
+
};
|
|
69
|
+
includeExamples: {
|
|
70
|
+
type: "boolean";
|
|
71
|
+
description: string;
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
required: string[];
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=get-scaffold.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-scaffold.d.ts","sourceRoot":"","sources":["../../src/tools/get-scaffold.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAmE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEtH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;EAkB5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEjE,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDxD;AA0CD,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;CAyCrC,CAAC"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* get_scaffold tool
|
|
3
|
+
*
|
|
4
|
+
* Returns complete scaffold information for selected features.
|
|
5
|
+
* This includes dependencies, file structure, config files,
|
|
6
|
+
* and setup commands needed to create a new project.
|
|
7
|
+
*/
|
|
8
|
+
import { z } from 'zod';
|
|
9
|
+
import { FEATURE_IDS, FEATURES } from '../features/index.js';
|
|
10
|
+
import { computeScaffold, resolveFeatureDependencies, getFeatureExamples } from '../utils/index.js';
|
|
11
|
+
export const getScaffoldSchema = z.object({
|
|
12
|
+
features: z
|
|
13
|
+
.array(z.string())
|
|
14
|
+
.max(15, 'Maximum 15 features allowed')
|
|
15
|
+
.refine((features) => features.every((f) => f in FEATURES), (features) => ({
|
|
16
|
+
message: `Invalid features: ${features.filter((f) => !(f in FEATURES)).join(', ')}. Valid: ${FEATURE_IDS.join(', ')}`,
|
|
17
|
+
}))
|
|
18
|
+
.describe('List of feature IDs to include (e.g., ["routing", "ui", "forms"])'),
|
|
19
|
+
projectName: z
|
|
20
|
+
.string()
|
|
21
|
+
.max(50, 'Project name too long')
|
|
22
|
+
.regex(/^[a-z0-9-]*$/, 'Project name must be lowercase letters, numbers, and hyphens only')
|
|
23
|
+
.optional()
|
|
24
|
+
.describe('Name for the new project (defaults to "my-app")'),
|
|
25
|
+
includeExamples: z.boolean().optional().describe('Include code examples for each feature pattern (default: false)'),
|
|
26
|
+
});
|
|
27
|
+
export async function getScaffold(input) {
|
|
28
|
+
const { features, projectName = 'my-app', includeExamples = false } = input;
|
|
29
|
+
// Resolve dependencies
|
|
30
|
+
const resolvedFeatures = resolveFeatureDependencies(features);
|
|
31
|
+
// Get scaffold result
|
|
32
|
+
const scaffold = await computeScaffold(features, projectName);
|
|
33
|
+
// Build feature details
|
|
34
|
+
const featureDetails = resolvedFeatures.map((id) => {
|
|
35
|
+
const feature = FEATURES[id];
|
|
36
|
+
return {
|
|
37
|
+
id,
|
|
38
|
+
name: feature.name,
|
|
39
|
+
wasExplicitlySelected: features.includes(id),
|
|
40
|
+
wasAutoIncluded: !features.includes(id),
|
|
41
|
+
patterns: feature.patterns,
|
|
42
|
+
};
|
|
43
|
+
});
|
|
44
|
+
// Optionally include examples
|
|
45
|
+
let examples;
|
|
46
|
+
if (includeExamples) {
|
|
47
|
+
examples = {};
|
|
48
|
+
for (const id of resolvedFeatures) {
|
|
49
|
+
const feature = FEATURES[id];
|
|
50
|
+
if (feature.patterns.length > 0) {
|
|
51
|
+
examples[id] = await getFeatureExamples(feature.patterns);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
projectName,
|
|
57
|
+
selectedFeatures: features,
|
|
58
|
+
resolvedFeatures,
|
|
59
|
+
featureDetails,
|
|
60
|
+
packageJson: scaffold.packageJson,
|
|
61
|
+
fileStructure: scaffold.structure,
|
|
62
|
+
configFiles: scaffold.configFiles,
|
|
63
|
+
setupCommands: scaffold.setupCommands,
|
|
64
|
+
claudeMd: scaffold.claudeMd,
|
|
65
|
+
viteEnvDts: scaffold.viteEnvDts,
|
|
66
|
+
envTs: scaffold.envTs,
|
|
67
|
+
docs: scaffold.docs,
|
|
68
|
+
examples,
|
|
69
|
+
instructions: generateInstructions(projectName, scaffold.setupCommands),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function generateInstructions(projectName, setupCommands) {
|
|
73
|
+
return `## Setup Instructions
|
|
74
|
+
|
|
75
|
+
1. Create project directory:
|
|
76
|
+
\`\`\`bash
|
|
77
|
+
mkdir ${projectName} && cd ${projectName}
|
|
78
|
+
\`\`\`
|
|
79
|
+
|
|
80
|
+
2. Initialize package.json with the provided dependencies
|
|
81
|
+
|
|
82
|
+
3. Create the file structure as listed
|
|
83
|
+
|
|
84
|
+
4. Create src/vite-env.d.ts using the provided viteEnvDts content
|
|
85
|
+
|
|
86
|
+
5. Create src/lib/env.ts using the provided envTs content
|
|
87
|
+
|
|
88
|
+
6. Create CLAUDE.md using the provided claudeMd content
|
|
89
|
+
|
|
90
|
+
7. Create docs/ directory with the provided docs content
|
|
91
|
+
|
|
92
|
+
8. Run setup commands:
|
|
93
|
+
\`\`\`bash
|
|
94
|
+
${setupCommands.join('\n ')}
|
|
95
|
+
\`\`\`
|
|
96
|
+
|
|
97
|
+
9. Start development:
|
|
98
|
+
\`\`\`bash
|
|
99
|
+
npm run dev
|
|
100
|
+
\`\`\`
|
|
101
|
+
|
|
102
|
+
## Notes
|
|
103
|
+
- Core feature is always included
|
|
104
|
+
- Auto-included features are dependencies of selected features
|
|
105
|
+
- Use get_example tool to get code patterns for each file type
|
|
106
|
+
- CLAUDE.md content is dynamically generated based on selected features
|
|
107
|
+
- vite-env.d.ts content is dynamically generated based on selected features
|
|
108
|
+
- env.ts content is dynamically generated based on selected features
|
|
109
|
+
- docs/ content is filtered based on selected features`;
|
|
110
|
+
}
|
|
111
|
+
export const getScaffoldToolDefinition = {
|
|
112
|
+
name: 'get_scaffold',
|
|
113
|
+
description: `Get complete scaffold information for a new react-spa-scaffold project.
|
|
114
|
+
|
|
115
|
+
Given a list of features, returns:
|
|
116
|
+
- Resolved dependencies (including auto-required features)
|
|
117
|
+
- Complete package.json (dependencies + devDependencies + scripts)
|
|
118
|
+
- File structure to create
|
|
119
|
+
- Config files needed
|
|
120
|
+
- Documentation files (filtered by selected features)
|
|
121
|
+
- Setup commands to run after creation
|
|
122
|
+
|
|
123
|
+
The AI agent should use this information to:
|
|
124
|
+
1. Create the project directory
|
|
125
|
+
2. Write package.json
|
|
126
|
+
3. Create all files using get_example for patterns
|
|
127
|
+
4. Create docs/ with provided documentation
|
|
128
|
+
5. Run setup commands
|
|
129
|
+
|
|
130
|
+
Example usage:
|
|
131
|
+
- features: ["routing", "ui", "forms", "testing"]
|
|
132
|
+
- This will auto-include: core, state (ui requires it)`,
|
|
133
|
+
inputSchema: {
|
|
134
|
+
type: 'object',
|
|
135
|
+
properties: {
|
|
136
|
+
features: {
|
|
137
|
+
type: 'array',
|
|
138
|
+
items: { type: 'string' },
|
|
139
|
+
description: 'List of feature IDs to include',
|
|
140
|
+
},
|
|
141
|
+
projectName: {
|
|
142
|
+
type: 'string',
|
|
143
|
+
description: 'Name for the new project',
|
|
144
|
+
},
|
|
145
|
+
includeExamples: {
|
|
146
|
+
type: 'boolean',
|
|
147
|
+
description: 'Include code examples for patterns',
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
required: ['features'],
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
//# sourceMappingURL=get-scaffold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-scaffold.js","sourceRoot":"","sources":["../../src/tools/get-scaffold.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { getFeatures, getFeaturesToolDefinition, type FeatureSummary } from './get-features.js';
|
|
2
|
+
export { getScaffold, getScaffoldSchema, getScaffoldToolDefinition, type GetScaffoldInput } from './get-scaffold.js';
|
|
3
|
+
export { getExample, getExampleSchema, getExampleToolDefinition, type GetExampleInput } from './get-example.js';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,yBAAyB,EAAE,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEhG,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErH,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { getFeatures, getFeaturesToolDefinition } from './get-features.js';
|
|
2
|
+
export { getScaffold, getScaffoldSchema, getScaffoldToolDefinition } from './get-scaffold.js';
|
|
3
|
+
export { getExample, getExampleSchema, getExampleToolDefinition } from './get-example.js';
|
|
4
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,yBAAyB,EAAuB,MAAM,mBAAmB,CAAC;AAEhG,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,yBAAyB,EAAyB,MAAM,mBAAmB,CAAC;AAErH,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,wBAAwB,EAAwB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Documentation utilities for scaffolding
|
|
3
|
+
*
|
|
4
|
+
* Handles doc selection based on selected features.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Determine which docs to include based on selected features
|
|
8
|
+
*/
|
|
9
|
+
export declare function computeDocsForFeatures(featureIds: readonly string[]): string[];
|
|
10
|
+
/**
|
|
11
|
+
* Read all docs for scaffolding based on selected features
|
|
12
|
+
*/
|
|
13
|
+
export declare function computeDocsContent(featureIds: readonly string[]): Promise<Record<string, string>>;
|
|
14
|
+
//# sourceMappingURL=docs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../src/utils/docs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA2BH;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAU9E;AAeD;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CASvG"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Documentation utilities for scaffolding
|
|
3
|
+
*
|
|
4
|
+
* Handles doc selection based on selected features.
|
|
5
|
+
*/
|
|
6
|
+
import { readFile } from 'fs/promises';
|
|
7
|
+
import { resolveTemplatePath } from './paths.js';
|
|
8
|
+
/**
|
|
9
|
+
* Documentation configuration
|
|
10
|
+
*
|
|
11
|
+
* - If requiredFeatures is set: only included when one of those features is selected
|
|
12
|
+
* - If requiredFeatures is not set: always included (universal reference material)
|
|
13
|
+
*
|
|
14
|
+
* WORKFLOW.md is intentionally excluded - not relevant to scaffolded projects
|
|
15
|
+
*/
|
|
16
|
+
const DOCS_CONFIG = {
|
|
17
|
+
// Universal - always included
|
|
18
|
+
'docs/ARCHITECTURE.md': {},
|
|
19
|
+
'docs/CODING_STANDARDS.md': {},
|
|
20
|
+
'docs/COMPONENT_GUIDELINES.md': {},
|
|
21
|
+
'docs/API_REFERENCE.md': {},
|
|
22
|
+
// Feature-specific
|
|
23
|
+
'docs/TESTING.md': { requiredFeatures: ['testing'] },
|
|
24
|
+
'docs/E2E_TESTING.md': { requiredFeatures: ['testing'] },
|
|
25
|
+
'docs/INTERNATIONALIZATION.md': { requiredFeatures: ['i18n'] },
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Determine which docs to include based on selected features
|
|
29
|
+
*/
|
|
30
|
+
export function computeDocsForFeatures(featureIds) {
|
|
31
|
+
const featureSet = new Set(featureIds);
|
|
32
|
+
return Object.entries(DOCS_CONFIG)
|
|
33
|
+
.filter(([, config]) => {
|
|
34
|
+
if (!config.requiredFeatures)
|
|
35
|
+
return true; // Universal
|
|
36
|
+
return config.requiredFeatures.some((f) => featureSet.has(f));
|
|
37
|
+
})
|
|
38
|
+
.map(([path]) => path)
|
|
39
|
+
.sort();
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Read a documentation file for scaffolding
|
|
43
|
+
*/
|
|
44
|
+
async function readDoc(docPath) {
|
|
45
|
+
const fullPath = resolveTemplatePath(docPath);
|
|
46
|
+
try {
|
|
47
|
+
return await readFile(fullPath, 'utf-8');
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return `<!-- File not found: ${docPath} -->\n<!-- Run MCP server from within react-spa-scaffold repository -->`;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Read all docs for scaffolding based on selected features
|
|
55
|
+
*/
|
|
56
|
+
export async function computeDocsContent(featureIds) {
|
|
57
|
+
const docPaths = computeDocsForFeatures(featureIds);
|
|
58
|
+
const docs = {};
|
|
59
|
+
for (const docPath of docPaths) {
|
|
60
|
+
docs[docPath] = await readDoc(docPath);
|
|
61
|
+
}
|
|
62
|
+
return docs;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=docs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/utils/docs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;;;;GAOG;AACH,MAAM,WAAW,GAAoD;IACnE,8BAA8B;IAC9B,sBAAsB,EAAE,EAAE;IAC1B,0BAA0B,EAAE,EAAE;IAC9B,8BAA8B,EAAE,EAAE;IAClC,uBAAuB,EAAE,EAAE;IAE3B,mBAAmB;IACnB,iBAAiB,EAAE,EAAE,gBAAgB,EAAE,CAAC,SAAS,CAAC,EAAE;IACpD,qBAAqB,EAAE,EAAE,gBAAgB,EAAE,CAAC,SAAS,CAAC,EAAE;IACxD,8BAA8B,EAAE,EAAE,gBAAgB,EAAE,CAAC,MAAM,CAAC,EAAE;CAC/D,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,UAA6B;IAClE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IAEvC,OAAO,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;SAC/B,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE;QACrB,IAAI,CAAC,MAAM,CAAC,gBAAgB;YAAE,OAAO,IAAI,CAAC,CAAC,YAAY;QACvD,OAAO,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC;SACrB,IAAI,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,OAAO,CAAC,OAAe;IACpC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAE9C,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,wBAAwB,OAAO,yEAAyE,CAAC;IAClH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,UAA6B;IACpE,MAAM,QAAQ,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,IAAI,GAA2B,EAAE,CAAC;IAExC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code example utilities
|
|
3
|
+
*
|
|
4
|
+
* Maps pattern types to actual files in the react-spa-scaffold repository.
|
|
5
|
+
* When the MCP server runs, it reads these files to provide real,
|
|
6
|
+
* working examples to AI agents.
|
|
7
|
+
*/
|
|
8
|
+
export interface CodeExample {
|
|
9
|
+
pattern: string;
|
|
10
|
+
description: string;
|
|
11
|
+
filePath: string;
|
|
12
|
+
code: string;
|
|
13
|
+
keyPoints: string[];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get available pattern types
|
|
17
|
+
*/
|
|
18
|
+
export declare function getAvailablePatterns(): string[];
|
|
19
|
+
/**
|
|
20
|
+
* Get code example for a pattern
|
|
21
|
+
*/
|
|
22
|
+
export declare function getCodeExample(pattern: string): Promise<CodeExample | null>;
|
|
23
|
+
/**
|
|
24
|
+
* Get all examples for a feature's patterns
|
|
25
|
+
*/
|
|
26
|
+
export declare function getFeatureExamples(patterns: string[]): Promise<CodeExample[]>;
|
|
27
|
+
//# sourceMappingURL=examples.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"examples.d.ts","sourceRoot":"","sources":["../../src/utils/examples.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AA2WD;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAE/C;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CA4BjF;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAWnF"}
|