@codebakers/mcp 5.2.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/INSTALL.md +221 -0
- package/LICENSE +21 -0
- package/README.md +412 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +236 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +526 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/analyze-mockups.d.ts +18 -0
- package/dist/tools/analyze-mockups.d.ts.map +1 -0
- package/dist/tools/analyze-mockups.js +497 -0
- package/dist/tools/analyze-mockups.js.map +1 -0
- package/dist/tools/autonomous-build.d.ts +19 -0
- package/dist/tools/autonomous-build.d.ts.map +1 -0
- package/dist/tools/autonomous-build.js +287 -0
- package/dist/tools/autonomous-build.js.map +1 -0
- package/dist/tools/check-gate.d.ts +21 -0
- package/dist/tools/check-gate.d.ts.map +1 -0
- package/dist/tools/check-gate.js +446 -0
- package/dist/tools/check-gate.js.map +1 -0
- package/dist/tools/check-scope.d.ts +22 -0
- package/dist/tools/check-scope.d.ts.map +1 -0
- package/dist/tools/check-scope.js +251 -0
- package/dist/tools/check-scope.js.map +1 -0
- package/dist/tools/deploy-vercel.d.ts +18 -0
- package/dist/tools/deploy-vercel.d.ts.map +1 -0
- package/dist/tools/deploy-vercel.js +178 -0
- package/dist/tools/deploy-vercel.js.map +1 -0
- package/dist/tools/diagnose-error.d.ts +20 -0
- package/dist/tools/diagnose-error.d.ts.map +1 -0
- package/dist/tools/diagnose-error.js +351 -0
- package/dist/tools/diagnose-error.js.map +1 -0
- package/dist/tools/enforce-feature.d.ts +25 -0
- package/dist/tools/enforce-feature.d.ts.map +1 -0
- package/dist/tools/enforce-feature.js +387 -0
- package/dist/tools/enforce-feature.js.map +1 -0
- package/dist/tools/execute-atomic-unit.d.ts +23 -0
- package/dist/tools/execute-atomic-unit.d.ts.map +1 -0
- package/dist/tools/execute-atomic-unit.js +107 -0
- package/dist/tools/execute-atomic-unit.js.map +1 -0
- package/dist/tools/fix-commit.d.ts +23 -0
- package/dist/tools/fix-commit.d.ts.map +1 -0
- package/dist/tools/fix-commit.js +213 -0
- package/dist/tools/fix-commit.js.map +1 -0
- package/dist/tools/fix-mockups.d.ts +21 -0
- package/dist/tools/fix-mockups.d.ts.map +1 -0
- package/dist/tools/fix-mockups.js +595 -0
- package/dist/tools/fix-mockups.js.map +1 -0
- package/dist/tools/generate-api-route.d.ts +18 -0
- package/dist/tools/generate-api-route.d.ts.map +1 -0
- package/dist/tools/generate-api-route.js +212 -0
- package/dist/tools/generate-api-route.js.map +1 -0
- package/dist/tools/generate-chatbot.d.ts +20 -0
- package/dist/tools/generate-chatbot.d.ts.map +1 -0
- package/dist/tools/generate-chatbot.js +555 -0
- package/dist/tools/generate-chatbot.js.map +1 -0
- package/dist/tools/generate-component.d.ts +18 -0
- package/dist/tools/generate-component.d.ts.map +1 -0
- package/dist/tools/generate-component.js +159 -0
- package/dist/tools/generate-component.js.map +1 -0
- package/dist/tools/generate-docs.d.ts +21 -0
- package/dist/tools/generate-docs.d.ts.map +1 -0
- package/dist/tools/generate-docs.js +782 -0
- package/dist/tools/generate-docs.js.map +1 -0
- package/dist/tools/generate-e2e-tests.d.ts +12 -0
- package/dist/tools/generate-e2e-tests.d.ts.map +1 -0
- package/dist/tools/generate-e2e-tests.js +37 -0
- package/dist/tools/generate-e2e-tests.js.map +1 -0
- package/dist/tools/generate-migration.d.ts +21 -0
- package/dist/tools/generate-migration.d.ts.map +1 -0
- package/dist/tools/generate-migration.js +94 -0
- package/dist/tools/generate-migration.js.map +1 -0
- package/dist/tools/generate-schema.d.ts +18 -0
- package/dist/tools/generate-schema.d.ts.map +1 -0
- package/dist/tools/generate-schema.js +422 -0
- package/dist/tools/generate-schema.js.map +1 -0
- package/dist/tools/generate-spec.d.ts +18 -0
- package/dist/tools/generate-spec.d.ts.map +1 -0
- package/dist/tools/generate-spec.js +446 -0
- package/dist/tools/generate-spec.js.map +1 -0
- package/dist/tools/generate-store-contracts.d.ts +17 -0
- package/dist/tools/generate-store-contracts.d.ts.map +1 -0
- package/dist/tools/generate-store-contracts.js +356 -0
- package/dist/tools/generate-store-contracts.js.map +1 -0
- package/dist/tools/generate-store.d.ts +16 -0
- package/dist/tools/generate-store.d.ts.map +1 -0
- package/dist/tools/generate-store.js +166 -0
- package/dist/tools/generate-store.js.map +1 -0
- package/dist/tools/generate-unit-tests.d.ts +14 -0
- package/dist/tools/generate-unit-tests.d.ts.map +1 -0
- package/dist/tools/generate-unit-tests.js +85 -0
- package/dist/tools/generate-unit-tests.js.map +1 -0
- package/dist/tools/get-context.d.ts +35 -0
- package/dist/tools/get-context.d.ts.map +1 -0
- package/dist/tools/get-context.js +367 -0
- package/dist/tools/get-context.js.map +1 -0
- package/dist/tools/init-session.d.ts +22 -0
- package/dist/tools/init-session.d.ts.map +1 -0
- package/dist/tools/init-session.js +232 -0
- package/dist/tools/init-session.js.map +1 -0
- package/dist/tools/map-dependencies.d.ts +25 -0
- package/dist/tools/map-dependencies.d.ts.map +1 -0
- package/dist/tools/map-dependencies.js +480 -0
- package/dist/tools/map-dependencies.js.map +1 -0
- package/dist/tools/optimize-performance.d.ts +18 -0
- package/dist/tools/optimize-performance.d.ts.map +1 -0
- package/dist/tools/optimize-performance.js +285 -0
- package/dist/tools/optimize-performance.js.map +1 -0
- package/dist/tools/run-interview.d.ts +23 -0
- package/dist/tools/run-interview.d.ts.map +1 -0
- package/dist/tools/run-interview.js +371 -0
- package/dist/tools/run-interview.js.map +1 -0
- package/dist/tools/run-tests.d.ts +12 -0
- package/dist/tools/run-tests.d.ts.map +1 -0
- package/dist/tools/run-tests.js +30 -0
- package/dist/tools/run-tests.js.map +1 -0
- package/dist/tools/scan-security.d.ts +19 -0
- package/dist/tools/scan-security.d.ts.map +1 -0
- package/dist/tools/scan-security.js +358 -0
- package/dist/tools/scan-security.js.map +1 -0
- package/dist/tools/validate-accessibility.d.ts +18 -0
- package/dist/tools/validate-accessibility.d.ts.map +1 -0
- package/dist/tools/validate-accessibility.js +251 -0
- package/dist/tools/validate-accessibility.js.map +1 -0
- package/dist/tools/validate-mockups.d.ts +21 -0
- package/dist/tools/validate-mockups.d.ts.map +1 -0
- package/dist/tools/validate-mockups.js +433 -0
- package/dist/tools/validate-mockups.js.map +1 -0
- package/dist/tools/verify-completeness.d.ts +13 -0
- package/dist/tools/verify-completeness.d.ts.map +1 -0
- package/dist/tools/verify-completeness.js +68 -0
- package/dist/tools/verify-completeness.js.map +1 -0
- package/dist/tools/verify-mockups.d.ts +14 -0
- package/dist/tools/verify-mockups.d.ts.map +1 -0
- package/dist/tools/verify-mockups.js +85 -0
- package/dist/tools/verify-mockups.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* codebakers_generate_store_contracts
|
|
3
|
+
*
|
|
4
|
+
* Phase 2D: Store Contract Generation
|
|
5
|
+
* Generates TypeScript interfaces for all stores
|
|
6
|
+
*
|
|
7
|
+
* Purpose:
|
|
8
|
+
* - Type-safe store definitions before building
|
|
9
|
+
* - Contract for what each store must implement
|
|
10
|
+
* - Maps from schema + dependency map to TypeScript interfaces
|
|
11
|
+
* - Ensures consistency between database and client state
|
|
12
|
+
*/
|
|
13
|
+
import * as fs from 'fs/promises';
|
|
14
|
+
import * as path from 'path';
|
|
15
|
+
export async function generateStoreContracts(args) {
|
|
16
|
+
const cwd = process.cwd();
|
|
17
|
+
const schemaFile = args.schema_file || '.codebakers/SCHEMA.sql';
|
|
18
|
+
const depMapFile = args.dependency_map_file || '.codebakers/DEPENDENCY-MAP.md';
|
|
19
|
+
const schemaPath = path.join(cwd, schemaFile);
|
|
20
|
+
const depMapPath = path.join(cwd, depMapFile);
|
|
21
|
+
console.error('🍞 CodeBakers: Phase 2D — Store Contract Generation');
|
|
22
|
+
try {
|
|
23
|
+
// 1. CHECK IF REQUIRED FILES EXIST
|
|
24
|
+
const schemaExists = await fs.access(schemaPath).then(() => true).catch(() => false);
|
|
25
|
+
const depMapExists = await fs.access(depMapPath).then(() => true).catch(() => false);
|
|
26
|
+
if (!schemaExists) {
|
|
27
|
+
return `🍞 CodeBakers: Phase 2D - Store Contract Generation
|
|
28
|
+
|
|
29
|
+
❌ BLOCKER: Schema file not found
|
|
30
|
+
|
|
31
|
+
Expected location: ${schemaPath}
|
|
32
|
+
|
|
33
|
+
Phase 2D requires Phase 2B schema to generate store contracts.
|
|
34
|
+
|
|
35
|
+
Next step: Run Phase 2B first (use tool: codebakers_generate_schema)`;
|
|
36
|
+
}
|
|
37
|
+
if (!depMapExists) {
|
|
38
|
+
return `🍞 CodeBakers: Phase 2D - Store Contract Generation
|
|
39
|
+
|
|
40
|
+
❌ BLOCKER: Dependency map not found
|
|
41
|
+
|
|
42
|
+
Expected location: ${depMapPath}
|
|
43
|
+
|
|
44
|
+
Phase 2D requires Phase 2C dependency map to generate store contracts.
|
|
45
|
+
|
|
46
|
+
Next step: Run Phase 2C first (use tool: codebakers_map_dependencies)`;
|
|
47
|
+
}
|
|
48
|
+
// 2. READ SCHEMA AND DEPENDENCY MAP
|
|
49
|
+
const schemaContent = await fs.readFile(schemaPath, 'utf-8');
|
|
50
|
+
const depMapContent = await fs.readFile(depMapPath, 'utf-8');
|
|
51
|
+
console.error('Files loaded. Generating store contracts...');
|
|
52
|
+
// 3. GENERATE STORE CONTRACTS
|
|
53
|
+
const contracts = generateContracts(schemaContent, depMapContent);
|
|
54
|
+
console.error(`Generated ${contracts.length} store contracts`);
|
|
55
|
+
// 4. GENERATE STORE-CONTRACTS.md
|
|
56
|
+
const contractsDoc = generateContractsDocument(contracts);
|
|
57
|
+
const contractsPath = path.join(cwd, '.codebakers', 'STORE-CONTRACTS.md');
|
|
58
|
+
await fs.writeFile(contractsPath, contractsDoc, 'utf-8');
|
|
59
|
+
// 5. GENERATE TYPESCRIPT INTERFACES
|
|
60
|
+
const typescriptInterfaces = generateTypeScriptInterfaces(contracts);
|
|
61
|
+
const interfacesPath = path.join(cwd, '.codebakers', 'store-contracts.ts');
|
|
62
|
+
await fs.writeFile(interfacesPath, typescriptInterfaces, 'utf-8');
|
|
63
|
+
console.error(`✓ Store contracts written: ${contractsPath}`);
|
|
64
|
+
console.error(`✓ TypeScript interfaces written: ${interfacesPath}`);
|
|
65
|
+
// 6. GENERATE SUMMARY
|
|
66
|
+
const summary = generateContractsSummary(contracts);
|
|
67
|
+
return `🍞 CodeBakers: Phase 2D - Store Contract Generation Complete
|
|
68
|
+
|
|
69
|
+
${summary}
|
|
70
|
+
|
|
71
|
+
📄 Documentation: .codebakers/STORE-CONTRACTS.md
|
|
72
|
+
📄 TypeScript interfaces: .codebakers/store-contracts.ts
|
|
73
|
+
|
|
74
|
+
These contracts define:
|
|
75
|
+
✓ State shape for each store
|
|
76
|
+
✓ Required methods (create, update, delete, query)
|
|
77
|
+
✓ Method signatures with types
|
|
78
|
+
✓ Dependencies (which stores this store depends on)
|
|
79
|
+
|
|
80
|
+
Next steps:
|
|
81
|
+
1. Review store contracts to verify completeness
|
|
82
|
+
2. Phase 2 is now COMPLETE
|
|
83
|
+
3. Ready for Phase 3: Foundation Build
|
|
84
|
+
4. When implementing stores, use store-contracts.ts as the interface`;
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
console.error('Error during store contract generation:', error);
|
|
88
|
+
return `🍞 CodeBakers: Phase 2D - Store Contract Generation Failed
|
|
89
|
+
|
|
90
|
+
Error: ${error instanceof Error ? error.message : String(error)}
|
|
91
|
+
|
|
92
|
+
Please check:
|
|
93
|
+
- Schema file and dependency map exist and are readable
|
|
94
|
+
- Files contain valid content
|
|
95
|
+
- File permissions allow writing
|
|
96
|
+
|
|
97
|
+
If issue persists, log to ERROR-LOG.md and request human assistance.`;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Generate store contracts from schema and dependency map
|
|
102
|
+
*/
|
|
103
|
+
function generateContracts(schema, depMap) {
|
|
104
|
+
const contracts = [];
|
|
105
|
+
// Extract tables from schema
|
|
106
|
+
const tables = extractTablesFromSchema(schema);
|
|
107
|
+
// Extract write dependencies from dep map
|
|
108
|
+
const writeDeps = extractWriteDependencies(depMap);
|
|
109
|
+
console.error(`Found ${tables.length} tables`);
|
|
110
|
+
for (const table of tables) {
|
|
111
|
+
const entityName = singularize(table.name);
|
|
112
|
+
const storeName = `${entityName}Store`;
|
|
113
|
+
const contract = {
|
|
114
|
+
name: storeName,
|
|
115
|
+
entity: entityName,
|
|
116
|
+
state_shape: {},
|
|
117
|
+
methods: [],
|
|
118
|
+
dependencies: [],
|
|
119
|
+
};
|
|
120
|
+
// 1. STATE SHAPE
|
|
121
|
+
// Map SQL columns to TypeScript types
|
|
122
|
+
for (const column of table.columns) {
|
|
123
|
+
contract.state_shape[column.name] = mapSQLTypeToTypeScript(column.type);
|
|
124
|
+
}
|
|
125
|
+
// 2. STANDARD CRUD METHODS
|
|
126
|
+
// Create
|
|
127
|
+
contract.methods.push({
|
|
128
|
+
name: `create${capitalize(entityName)}`,
|
|
129
|
+
params: [{ name: 'data', type: `Omit<${capitalize(entityName)}, 'id' | 'created_at' | 'updated_at'>` }],
|
|
130
|
+
return_type: `Promise<${capitalize(entityName)}>`,
|
|
131
|
+
updates: [storeName],
|
|
132
|
+
});
|
|
133
|
+
// Update
|
|
134
|
+
contract.methods.push({
|
|
135
|
+
name: `update${capitalize(entityName)}`,
|
|
136
|
+
params: [
|
|
137
|
+
{ name: 'id', type: 'string' },
|
|
138
|
+
{ name: 'data', type: `Partial<${capitalize(entityName)}>` },
|
|
139
|
+
],
|
|
140
|
+
return_type: `Promise<${capitalize(entityName)}>`,
|
|
141
|
+
updates: [storeName],
|
|
142
|
+
});
|
|
143
|
+
// Delete
|
|
144
|
+
contract.methods.push({
|
|
145
|
+
name: `delete${capitalize(entityName)}`,
|
|
146
|
+
params: [{ name: 'id', type: 'string' }],
|
|
147
|
+
return_type: 'Promise<void>',
|
|
148
|
+
updates: [storeName],
|
|
149
|
+
});
|
|
150
|
+
// Get one
|
|
151
|
+
contract.methods.push({
|
|
152
|
+
name: `get${capitalize(entityName)}`,
|
|
153
|
+
params: [{ name: 'id', type: 'string' }],
|
|
154
|
+
return_type: `Promise<${capitalize(entityName)} | null>`,
|
|
155
|
+
updates: [],
|
|
156
|
+
});
|
|
157
|
+
// Get many
|
|
158
|
+
contract.methods.push({
|
|
159
|
+
name: `get${capitalize(entityName)}s`,
|
|
160
|
+
params: [{ name: 'filters', type: `Partial<${capitalize(entityName)}>` }],
|
|
161
|
+
return_type: `Promise<${capitalize(entityName)}[]>`,
|
|
162
|
+
updates: [],
|
|
163
|
+
});
|
|
164
|
+
// 3. EXTRACT CASCADE UPDATES FROM DEPENDENCY MAP
|
|
165
|
+
const cascades = writeDeps.filter(dep => dep.entity === entityName);
|
|
166
|
+
for (const cascade of cascades) {
|
|
167
|
+
if (cascade.cascade_stores.length > 0) {
|
|
168
|
+
contract.dependencies.push(...cascade.cascade_stores);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
contracts.push(contract);
|
|
172
|
+
}
|
|
173
|
+
return contracts;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Extract tables from schema
|
|
177
|
+
*/
|
|
178
|
+
function extractTablesFromSchema(schema) {
|
|
179
|
+
const tables = [];
|
|
180
|
+
const tableRegex = /CREATE TABLE (\w+) \(([\s\S]*?)\);/g;
|
|
181
|
+
let match;
|
|
182
|
+
while ((match = tableRegex.exec(schema)) !== null) {
|
|
183
|
+
const tableName = match[1];
|
|
184
|
+
const tableBody = match[2];
|
|
185
|
+
const columns = [];
|
|
186
|
+
const columnRegex = /(\w+)\s+(\w+)/g;
|
|
187
|
+
let colMatch;
|
|
188
|
+
while ((colMatch = columnRegex.exec(tableBody)) !== null) {
|
|
189
|
+
const columnName = colMatch[1];
|
|
190
|
+
const columnType = colMatch[2];
|
|
191
|
+
// Skip constraint keywords
|
|
192
|
+
if (['PRIMARY', 'FOREIGN', 'UNIQUE', 'NOT', 'DEFAULT', 'REFERENCES', 'KEY', 'CHECK'].includes(columnName.toUpperCase())) {
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
columns.push({
|
|
196
|
+
name: columnName,
|
|
197
|
+
type: columnType,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
tables.push({ name: tableName, columns });
|
|
201
|
+
}
|
|
202
|
+
return tables;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Extract write dependencies from dependency map
|
|
206
|
+
*/
|
|
207
|
+
function extractWriteDependencies(depMap) {
|
|
208
|
+
const deps = [];
|
|
209
|
+
// Extract from "Write Dependencies" section
|
|
210
|
+
const writeDepsRegex = /### (create|update|delete)(\w+)\n[\s\S]*?- \*\*Cascade Updates:\*\* ([\w\s,]+)/g;
|
|
211
|
+
let match;
|
|
212
|
+
while ((match = writeDepsRegex.exec(depMap)) !== null) {
|
|
213
|
+
const entity = match[2];
|
|
214
|
+
const cascades = match[3].split(',').map(s => s.trim()).filter(s => s.endsWith('Store'));
|
|
215
|
+
deps.push({
|
|
216
|
+
entity: entity.toLowerCase(),
|
|
217
|
+
cascade_stores: cascades,
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
return deps;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Generate STORE-CONTRACTS.md document
|
|
224
|
+
*/
|
|
225
|
+
function generateContractsDocument(contracts) {
|
|
226
|
+
let doc = `# Store Contracts\n\n`;
|
|
227
|
+
doc += `**Generated:** ${new Date().toISOString()}\n`;
|
|
228
|
+
doc += `**Phase:** 2D - Store Contract Generation\n`;
|
|
229
|
+
doc += `**Purpose:** Define type-safe contracts for all stores before implementation\n\n`;
|
|
230
|
+
doc += `---\n\n`;
|
|
231
|
+
doc += `## Purpose\n\n`;
|
|
232
|
+
doc += `This document defines the contract for EVERY store in the application.\n\n`;
|
|
233
|
+
doc += `Before implementing a store, check this contract to ensure:\n`;
|
|
234
|
+
doc += `- State shape matches expectations\n`;
|
|
235
|
+
doc += `- All required methods are implemented\n`;
|
|
236
|
+
doc += `- All cascade updates are handled\n\n`;
|
|
237
|
+
doc += `---\n\n`;
|
|
238
|
+
for (const contract of contracts) {
|
|
239
|
+
doc += `## ${contract.name}\n\n`;
|
|
240
|
+
doc += `**Entity:** ${contract.entity}\n\n`;
|
|
241
|
+
// State shape
|
|
242
|
+
doc += `### State Shape\n\n`;
|
|
243
|
+
doc += `\`\`\`typescript\n`;
|
|
244
|
+
doc += `interface ${capitalize(contract.entity)} {\n`;
|
|
245
|
+
for (const [field, type] of Object.entries(contract.state_shape)) {
|
|
246
|
+
doc += ` ${field}: ${type};\n`;
|
|
247
|
+
}
|
|
248
|
+
doc += `}\n`;
|
|
249
|
+
doc += `\`\`\`\n\n`;
|
|
250
|
+
// Methods
|
|
251
|
+
doc += `### Required Methods\n\n`;
|
|
252
|
+
for (const method of contract.methods) {
|
|
253
|
+
doc += `#### ${method.name}\n\n`;
|
|
254
|
+
doc += `\`\`\`typescript\n`;
|
|
255
|
+
const params = method.params.map(p => `${p.name}: ${p.type}`).join(', ');
|
|
256
|
+
doc += `${method.name}(${params}): ${method.return_type}\n`;
|
|
257
|
+
doc += `\`\`\`\n\n`;
|
|
258
|
+
if (method.updates.length > 0) {
|
|
259
|
+
doc += `**Updates:** ${method.updates.join(', ')}\n\n`;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
// Dependencies
|
|
263
|
+
if (contract.dependencies.length > 0) {
|
|
264
|
+
doc += `### Dependencies\n\n`;
|
|
265
|
+
doc += `This store depends on:\n`;
|
|
266
|
+
for (const dep of contract.dependencies) {
|
|
267
|
+
doc += `- ${dep}\n`;
|
|
268
|
+
}
|
|
269
|
+
doc += `\n`;
|
|
270
|
+
}
|
|
271
|
+
doc += `---\n\n`;
|
|
272
|
+
}
|
|
273
|
+
return doc;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Generate TypeScript interfaces
|
|
277
|
+
*/
|
|
278
|
+
function generateTypeScriptInterfaces(contracts) {
|
|
279
|
+
let ts = `/**\n`;
|
|
280
|
+
ts += ` * Store Contracts\n`;
|
|
281
|
+
ts += ` * Generated: ${new Date().toISOString()}\n`;
|
|
282
|
+
ts += ` * \n`;
|
|
283
|
+
ts += ` * DO NOT EDIT MANUALLY\n`;
|
|
284
|
+
ts += ` * This file is auto-generated from schema and dependency map\n`;
|
|
285
|
+
ts += ` */\n\n`;
|
|
286
|
+
// Generate entity interfaces
|
|
287
|
+
for (const contract of contracts) {
|
|
288
|
+
ts += `export interface ${capitalize(contract.entity)} {\n`;
|
|
289
|
+
for (const [field, type] of Object.entries(contract.state_shape)) {
|
|
290
|
+
ts += ` ${field}: ${type};\n`;
|
|
291
|
+
}
|
|
292
|
+
ts += `}\n\n`;
|
|
293
|
+
}
|
|
294
|
+
// Generate store interfaces
|
|
295
|
+
for (const contract of contracts) {
|
|
296
|
+
ts += `export interface ${contract.name} {\n`;
|
|
297
|
+
for (const method of contract.methods) {
|
|
298
|
+
const params = method.params.map(p => `${p.name}: ${p.type}`).join(', ');
|
|
299
|
+
ts += ` ${method.name}(${params}): ${method.return_type};\n`;
|
|
300
|
+
}
|
|
301
|
+
ts += `}\n\n`;
|
|
302
|
+
}
|
|
303
|
+
return ts;
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Generate summary
|
|
307
|
+
*/
|
|
308
|
+
function generateContractsSummary(contracts) {
|
|
309
|
+
const totalMethods = contracts.reduce((sum, c) => sum + c.methods.length, 0);
|
|
310
|
+
const totalDeps = contracts.reduce((sum, c) => sum + c.dependencies.length, 0);
|
|
311
|
+
let summary = `✓ Generated ${contracts.length} store contracts\n`;
|
|
312
|
+
summary += `✓ Defined ${totalMethods} methods across all stores\n`;
|
|
313
|
+
summary += `✓ Mapped ${totalDeps} store dependencies\n`;
|
|
314
|
+
summary += `✓ All contracts type-safe with TypeScript interfaces\n`;
|
|
315
|
+
return summary;
|
|
316
|
+
}
|
|
317
|
+
// HELPER FUNCTIONS
|
|
318
|
+
function singularize(word) {
|
|
319
|
+
if (word.endsWith('ies'))
|
|
320
|
+
return word.slice(0, -3) + 'y';
|
|
321
|
+
if (word.endsWith('ses'))
|
|
322
|
+
return word.slice(0, -2);
|
|
323
|
+
if (word.endsWith('s'))
|
|
324
|
+
return word.slice(0, -1);
|
|
325
|
+
return word;
|
|
326
|
+
}
|
|
327
|
+
function capitalize(str) {
|
|
328
|
+
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
329
|
+
}
|
|
330
|
+
function mapSQLTypeToTypeScript(sqlType) {
|
|
331
|
+
const typeMap = {
|
|
332
|
+
'uuid': 'string',
|
|
333
|
+
'text': 'string',
|
|
334
|
+
'varchar': 'string',
|
|
335
|
+
'char': 'string',
|
|
336
|
+
'integer': 'number',
|
|
337
|
+
'int': 'number',
|
|
338
|
+
'bigint': 'number',
|
|
339
|
+
'smallint': 'number',
|
|
340
|
+
'numeric': 'number',
|
|
341
|
+
'decimal': 'number',
|
|
342
|
+
'real': 'number',
|
|
343
|
+
'double': 'number',
|
|
344
|
+
'boolean': 'boolean',
|
|
345
|
+
'bool': 'boolean',
|
|
346
|
+
'timestamp': 'string',
|
|
347
|
+
'timestamptz': 'string',
|
|
348
|
+
'date': 'string',
|
|
349
|
+
'time': 'string',
|
|
350
|
+
'json': 'any',
|
|
351
|
+
'jsonb': 'any',
|
|
352
|
+
};
|
|
353
|
+
const lowerType = sqlType.toLowerCase();
|
|
354
|
+
return typeMap[lowerType] || 'any';
|
|
355
|
+
}
|
|
356
|
+
//# sourceMappingURL=generate-store-contracts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-store-contracts.js","sourceRoot":"","sources":["../../src/tools/generate-store-contracts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* codebakers_generate_store
|
|
3
|
+
*
|
|
4
|
+
* Zustand Store Generator
|
|
5
|
+
*
|
|
6
|
+
* Generates stores with DEPENDENCY-MAP.md integration.
|
|
7
|
+
* Ensures all mutations update ALL affected stores.
|
|
8
|
+
*/
|
|
9
|
+
interface StoreArgs {
|
|
10
|
+
entity: string;
|
|
11
|
+
operations: string[];
|
|
12
|
+
dependencies?: string[];
|
|
13
|
+
}
|
|
14
|
+
export declare function generateStore(args: StoreArgs): Promise<string>;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=generate-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-store.d.ts","sourceRoot":"","sources":["../../src/tools/generate-store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,UAAU,SAAS;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAsDpE"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* codebakers_generate_store
|
|
3
|
+
*
|
|
4
|
+
* Zustand Store Generator
|
|
5
|
+
*
|
|
6
|
+
* Generates stores with DEPENDENCY-MAP.md integration.
|
|
7
|
+
* Ensures all mutations update ALL affected stores.
|
|
8
|
+
*/
|
|
9
|
+
import * as fs from 'fs/promises';
|
|
10
|
+
import * as path from 'path';
|
|
11
|
+
export async function generateStore(args) {
|
|
12
|
+
const cwd = process.cwd();
|
|
13
|
+
const { entity, operations, dependencies = [] } = args;
|
|
14
|
+
const storeName = `${entity.toLowerCase()}-store`;
|
|
15
|
+
const code = `import { create } from 'zustand';
|
|
16
|
+
|
|
17
|
+
export interface ${entity} {
|
|
18
|
+
id: string;
|
|
19
|
+
user_id: string;
|
|
20
|
+
created_at: string;
|
|
21
|
+
updated_at: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
interface ${entity}Store {
|
|
25
|
+
${entity.toLowerCase()}s: ${entity}[];
|
|
26
|
+
loading: boolean;
|
|
27
|
+
error: string | null;
|
|
28
|
+
|
|
29
|
+
${operations.includes('list') ? `fetch${entity}s: () => Promise<void>;` : ''}
|
|
30
|
+
${operations.includes('create') ? `create${entity}: (data: Partial<${entity}>) => Promise<void>;` : ''}
|
|
31
|
+
${operations.includes('update') ? `update${entity}: (id: string, data: Partial<${entity}>) => Promise<void>;` : ''}
|
|
32
|
+
${operations.includes('delete') ? `delete${entity}: (id: string) => Promise<void>;` : ''}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export const use${entity}Store = create<${entity}Store>((set, get) => ({
|
|
36
|
+
${entity.toLowerCase()}s: [],
|
|
37
|
+
loading: false,
|
|
38
|
+
error: null,
|
|
39
|
+
|
|
40
|
+
${operations.includes('list') ? generateFetchMethod(entity) : ''}
|
|
41
|
+
${operations.includes('create') ? generateCreateMethod(entity, dependencies) : ''}
|
|
42
|
+
${operations.includes('update') ? generateUpdateMethod(entity, dependencies) : ''}
|
|
43
|
+
${operations.includes('delete') ? generateDeleteMethod(entity, dependencies) : ''}
|
|
44
|
+
}));
|
|
45
|
+
`;
|
|
46
|
+
const filePath = path.join(cwd, `src/stores/${storeName}.ts`);
|
|
47
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
48
|
+
await fs.writeFile(filePath, code, 'utf-8');
|
|
49
|
+
return `🍞 CodeBakers: Store Generated
|
|
50
|
+
|
|
51
|
+
**File:** src/stores/${storeName}.ts
|
|
52
|
+
**Entity:** ${entity}
|
|
53
|
+
**Operations:** ${operations.join(', ')}
|
|
54
|
+
${dependencies.length > 0 ? `**Dependencies:** ${dependencies.join(', ')}` : ''}
|
|
55
|
+
|
|
56
|
+
Includes:
|
|
57
|
+
✅ TypeScript interfaces
|
|
58
|
+
✅ Zustand store
|
|
59
|
+
✅ Loading/error states
|
|
60
|
+
✅ CRUD operations
|
|
61
|
+
${dependencies.length > 0 ? '✅ Dependency updates (from DEPENDENCY-MAP.md)' : ''}`;
|
|
62
|
+
}
|
|
63
|
+
function generateFetchMethod(entity) {
|
|
64
|
+
return `fetch${entity}s: async () => {
|
|
65
|
+
set({ loading: true, error: null });
|
|
66
|
+
try {
|
|
67
|
+
const res = await fetch('/api/${entity.toLowerCase()}s');
|
|
68
|
+
if (!res.ok) throw new Error('Fetch failed');
|
|
69
|
+
const { data } = await res.json();
|
|
70
|
+
set({ ${entity.toLowerCase()}s: data, loading: false });
|
|
71
|
+
} catch (error) {
|
|
72
|
+
set({ error: (error as Error).message, loading: false });
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
`;
|
|
76
|
+
}
|
|
77
|
+
function generateCreateMethod(entity, deps) {
|
|
78
|
+
let code = `create${entity}: async (data) => {
|
|
79
|
+
set({ loading: true, error: null });
|
|
80
|
+
try {
|
|
81
|
+
const res = await fetch('/api/${entity.toLowerCase()}s', {
|
|
82
|
+
method: 'POST',
|
|
83
|
+
headers: { 'Content-Type': 'application/json' },
|
|
84
|
+
body: JSON.stringify(data),
|
|
85
|
+
});
|
|
86
|
+
if (!res.ok) throw new Error('Create failed');
|
|
87
|
+
const { data: new${entity} } = await res.json();
|
|
88
|
+
|
|
89
|
+
set(state => ({
|
|
90
|
+
${entity.toLowerCase()}s: [new${entity}, ...state.${entity.toLowerCase()}s],
|
|
91
|
+
loading: false,
|
|
92
|
+
}));
|
|
93
|
+
`;
|
|
94
|
+
if (deps.length > 0) {
|
|
95
|
+
code += `\n // Update dependent stores (from DEPENDENCY-MAP.md)\n`;
|
|
96
|
+
for (const dep of deps) {
|
|
97
|
+
code += ` ${dep}.getState().refresh();\n`;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
code += ` } catch (error) {
|
|
101
|
+
set({ error: (error as Error).message, loading: false });
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
`;
|
|
105
|
+
return code;
|
|
106
|
+
}
|
|
107
|
+
function generateUpdateMethod(entity, deps) {
|
|
108
|
+
let code = `update${entity}: async (id, data) => {
|
|
109
|
+
set({ loading: true, error: null });
|
|
110
|
+
try {
|
|
111
|
+
const res = await fetch(\`/api/${entity.toLowerCase()}s/\${id}\`, {
|
|
112
|
+
method: 'PATCH',
|
|
113
|
+
headers: { 'Content-Type': 'application/json' },
|
|
114
|
+
body: JSON.stringify(data),
|
|
115
|
+
});
|
|
116
|
+
if (!res.ok) throw new Error('Update failed');
|
|
117
|
+
const { data: updated } = await res.json();
|
|
118
|
+
|
|
119
|
+
set(state => ({
|
|
120
|
+
${entity.toLowerCase()}s: state.${entity.toLowerCase()}s.map(item =>
|
|
121
|
+
item.id === id ? updated : item
|
|
122
|
+
),
|
|
123
|
+
loading: false,
|
|
124
|
+
}));
|
|
125
|
+
`;
|
|
126
|
+
if (deps.length > 0) {
|
|
127
|
+
code += `\n // Update dependent stores\n`;
|
|
128
|
+
for (const dep of deps) {
|
|
129
|
+
code += ` ${dep}.getState().refresh();\n`;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
code += ` } catch (error) {
|
|
133
|
+
set({ error: (error as Error).message, loading: false });
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
`;
|
|
137
|
+
return code;
|
|
138
|
+
}
|
|
139
|
+
function generateDeleteMethod(entity, deps) {
|
|
140
|
+
let code = `delete${entity}: async (id) => {
|
|
141
|
+
set({ loading: true, error: null });
|
|
142
|
+
try {
|
|
143
|
+
const res = await fetch(\`/api/${entity.toLowerCase()}s/\${id}\`, {
|
|
144
|
+
method: 'DELETE',
|
|
145
|
+
});
|
|
146
|
+
if (!res.ok) throw new Error('Delete failed');
|
|
147
|
+
|
|
148
|
+
set(state => ({
|
|
149
|
+
${entity.toLowerCase()}s: state.${entity.toLowerCase()}s.filter(item => item.id !== id),
|
|
150
|
+
loading: false,
|
|
151
|
+
}));
|
|
152
|
+
`;
|
|
153
|
+
if (deps.length > 0) {
|
|
154
|
+
code += `\n // Update ALL dependent stores (CRITICAL - prevents stale UI)\n`;
|
|
155
|
+
for (const dep of deps) {
|
|
156
|
+
code += ` ${dep}.getState().refresh();\n`;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
code += ` } catch (error) {
|
|
160
|
+
set({ error: (error as Error).message, loading: false });
|
|
161
|
+
}
|
|
162
|
+
},
|
|
163
|
+
`;
|
|
164
|
+
return code;
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=generate-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-store.js","sourceRoot":"","sources":["../../src/tools/generate-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* codebakers_generate_unit_tests
|
|
3
|
+
*
|
|
4
|
+
* Vitest Unit Test Generator
|
|
5
|
+
*
|
|
6
|
+
* Generates unit tests for components, stores, and API routes
|
|
7
|
+
*/
|
|
8
|
+
interface TestArgs {
|
|
9
|
+
file_path: string;
|
|
10
|
+
test_type: 'component' | 'store' | 'api';
|
|
11
|
+
}
|
|
12
|
+
export declare function generateUnitTests(args: TestArgs): Promise<string>;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=generate-unit-tests.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-unit-tests.d.ts","sourceRoot":"","sources":["../../src/tools/generate-unit-tests.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,UAAU,QAAQ;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,WAAW,GAAG,OAAO,GAAG,KAAK,CAAC;CAC1C;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CA4EvE"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* codebakers_generate_unit_tests
|
|
3
|
+
*
|
|
4
|
+
* Vitest Unit Test Generator
|
|
5
|
+
*
|
|
6
|
+
* Generates unit tests for components, stores, and API routes
|
|
7
|
+
*/
|
|
8
|
+
import * as fs from 'fs/promises';
|
|
9
|
+
import * as path from 'path';
|
|
10
|
+
export async function generateUnitTests(args) {
|
|
11
|
+
const cwd = process.cwd();
|
|
12
|
+
const { file_path, test_type } = args;
|
|
13
|
+
const testPath = file_path.replace(/\.(tsx?|js)$/, '.test.$1');
|
|
14
|
+
let code = '';
|
|
15
|
+
if (test_type === 'component') {
|
|
16
|
+
code = `import { describe, it, expect, vi } from 'vitest';
|
|
17
|
+
import { render, screen } from '@testing-library/react';
|
|
18
|
+
import { Component } from './component';
|
|
19
|
+
|
|
20
|
+
describe('Component', () => {
|
|
21
|
+
it('renders loading state', () => {
|
|
22
|
+
render(<Component />);
|
|
23
|
+
expect(screen.getByRole('status')).toBeInTheDocument();
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('renders error state', () => {
|
|
27
|
+
render(<Component />);
|
|
28
|
+
expect(screen.getByRole('alert')).toBeInTheDocument();
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it('renders empty state', () => {
|
|
32
|
+
render(<Component />);
|
|
33
|
+
expect(screen.getByText(/No items/)).toBeInTheDocument();
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('renders success state', () => {
|
|
37
|
+
render(<Component />);
|
|
38
|
+
expect(screen.getByText('Item')).toBeInTheDocument();
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
`;
|
|
42
|
+
}
|
|
43
|
+
else if (test_type === 'store') {
|
|
44
|
+
code = `import { describe, it, expect, beforeEach } from 'vitest';
|
|
45
|
+
import { renderHook, act } from '@testing-library/react';
|
|
46
|
+
import { useStore } from './store';
|
|
47
|
+
|
|
48
|
+
describe('Store', () => {
|
|
49
|
+
beforeEach(() => {
|
|
50
|
+
useStore.setState({ items: [], loading: false, error: null });
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it('fetches items', async () => {
|
|
54
|
+
const { result } = renderHook(() => useStore());
|
|
55
|
+
await act(async () => {
|
|
56
|
+
await result.current.fetchItems();
|
|
57
|
+
});
|
|
58
|
+
expect(result.current.items).toHaveLength(0);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
`;
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
code = `import { describe, it, expect } from 'vitest';
|
|
65
|
+
import { GET } from './route';
|
|
66
|
+
|
|
67
|
+
describe('API Route', () => {
|
|
68
|
+
it('returns data', async () => {
|
|
69
|
+
const req = new Request('http://localhost/api/test');
|
|
70
|
+
const res = await GET(req);
|
|
71
|
+
expect(res.status).toBe(200);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
`;
|
|
75
|
+
}
|
|
76
|
+
const fullPath = path.join(cwd, testPath);
|
|
77
|
+
await fs.writeFile(fullPath, code, 'utf-8');
|
|
78
|
+
return `🍞 CodeBakers: Unit Tests Generated
|
|
79
|
+
|
|
80
|
+
**File:** ${testPath}
|
|
81
|
+
**Type:** ${test_type}
|
|
82
|
+
|
|
83
|
+
✅ Test file created (Vitest)`;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=generate-unit-tests.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-unit-tests.js","sourceRoot":"","sources":["../../src/tools/generate-unit-tests.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAO7B,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAc;IACpD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAEtC,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;IAC/D,IAAI,IAAI,GAAG,EAAE,CAAC;IAEd,IAAI,SAAS,KAAK,WAAW,EAAE,CAAC;QAC9B,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;CAyBV,CAAC;IACA,CAAC;SAAM,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QACjC,IAAI,GAAG;;;;;;;;;;;;;;;;;CAiBV,CAAC;IACA,CAAC;SAAM,CAAC;QACN,IAAI,GAAG;;;;;;;;;;CAUV,CAAC;IACA,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC1C,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAE5C,OAAO;;YAEG,QAAQ;YACR,SAAS;;6BAEQ,CAAC;AAC9B,CAAC"}
|