@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 @@
|
|
|
1
|
+
{"version":3,"file":"generate-docs.js","sourceRoot":"","sources":["../../src/tools/generate-docs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* codebakers_generate_e2e_tests
|
|
3
|
+
*
|
|
4
|
+
* Playwright E2E Test Generator
|
|
5
|
+
*/
|
|
6
|
+
interface E2EArgs {
|
|
7
|
+
flow_name: string;
|
|
8
|
+
steps: string[];
|
|
9
|
+
}
|
|
10
|
+
export declare function generateE2ETests(args: E2EArgs): Promise<string>;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=generate-e2e-tests.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-e2e-tests.d.ts","sourceRoot":"","sources":["../../src/tools/generate-e2e-tests.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,UAAU,OAAO;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CA+BrE"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* codebakers_generate_e2e_tests
|
|
3
|
+
*
|
|
4
|
+
* Playwright E2E Test Generator
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from 'fs/promises';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
export async function generateE2ETests(args) {
|
|
9
|
+
const cwd = process.cwd();
|
|
10
|
+
const { flow_name, steps } = args;
|
|
11
|
+
const fileName = flow_name.toLowerCase().replace(/\s+/g, '-');
|
|
12
|
+
const code = `import { test, expect } from '@playwright/test';
|
|
13
|
+
|
|
14
|
+
test.describe('${flow_name}', () => {
|
|
15
|
+
test.beforeEach(async ({ page }) => {
|
|
16
|
+
await page.goto('/');
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
test('${flow_name} flow', async ({ page }) => {
|
|
20
|
+
${steps.map((step, i) => `// Step ${i + 1}: ${step}`).join('\n ')}
|
|
21
|
+
|
|
22
|
+
await expect(page).toHaveURL('/');
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
`;
|
|
26
|
+
const filePath = path.join(cwd, `e2e/${fileName}.spec.ts`);
|
|
27
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
28
|
+
await fs.writeFile(filePath, code, 'utf-8');
|
|
29
|
+
return `🍞 CodeBakers: E2E Tests Generated
|
|
30
|
+
|
|
31
|
+
**File:** e2e/${fileName}.spec.ts
|
|
32
|
+
**Flow:** ${flow_name}
|
|
33
|
+
**Steps:** ${steps.length}
|
|
34
|
+
|
|
35
|
+
✅ Playwright test created`;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=generate-e2e-tests.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-e2e-tests.js","sourceRoot":"","sources":["../../src/tools/generate-e2e-tests.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAO7B,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAa;IAClD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAElC,MAAM,QAAQ,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG;;iBAEE,SAAS;;;;;UAKhB,SAAS;MACb,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;;;;;CAKvE,CAAC;IAEA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,QAAQ,UAAU,CAAC,CAAC;IAC3D,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAE5C,OAAO;;gBAEO,QAAQ;YACZ,SAAS;aACR,KAAK,CAAC,MAAM;;0BAEC,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* codebakers_generate_migration
|
|
3
|
+
*
|
|
4
|
+
* Database Migration Generator
|
|
5
|
+
*
|
|
6
|
+
* Generates Supabase/PostgreSQL migration files from entity definitions.
|
|
7
|
+
* Includes: tables, columns, foreign keys, indexes, RLS policies
|
|
8
|
+
*/
|
|
9
|
+
interface MigrationArgs {
|
|
10
|
+
entity: string;
|
|
11
|
+
fields: {
|
|
12
|
+
name: string;
|
|
13
|
+
type: string;
|
|
14
|
+
required?: boolean;
|
|
15
|
+
references?: string;
|
|
16
|
+
}[];
|
|
17
|
+
add_rls?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare function generateMigration(args: MigrationArgs): Promise<string>;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=generate-migration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-migration.d.ts","sourceRoot":"","sources":["../../src/tools/generate-migration.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,UAAU,aAAa;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAClF,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CA4E5E"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* codebakers_generate_migration
|
|
3
|
+
*
|
|
4
|
+
* Database Migration Generator
|
|
5
|
+
*
|
|
6
|
+
* Generates Supabase/PostgreSQL migration files from entity definitions.
|
|
7
|
+
* Includes: tables, columns, foreign keys, indexes, RLS policies
|
|
8
|
+
*/
|
|
9
|
+
import * as fs from 'fs/promises';
|
|
10
|
+
import * as path from 'path';
|
|
11
|
+
export async function generateMigration(args) {
|
|
12
|
+
const cwd = process.cwd();
|
|
13
|
+
const { entity, fields, add_rls = true } = args;
|
|
14
|
+
console.error(`🍞 CodeBakers: Generating migration for ${entity}`);
|
|
15
|
+
try {
|
|
16
|
+
const tableName = entity.toLowerCase() + 's';
|
|
17
|
+
const timestamp = new Date().toISOString().replace(/[-:]/g, '').split('.')[0];
|
|
18
|
+
const filename = `${timestamp}_create_${tableName}.sql`;
|
|
19
|
+
let sql = `-- Create ${entity} table\n-- Generated by CodeBakers\n\n`;
|
|
20
|
+
// Extension
|
|
21
|
+
sql += `CREATE EXTENSION IF NOT EXISTS "uuid-ossp";\n\n`;
|
|
22
|
+
// Create table
|
|
23
|
+
sql += `CREATE TABLE ${tableName} (\n`;
|
|
24
|
+
sql += ` id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),\n`;
|
|
25
|
+
sql += ` user_id UUID REFERENCES auth.users NOT NULL,\n`;
|
|
26
|
+
for (const field of fields) {
|
|
27
|
+
const type = mapType(field.type);
|
|
28
|
+
const nullable = field.required ? ' NOT NULL' : '';
|
|
29
|
+
sql += ` ${field.name} ${type}${nullable},\n`;
|
|
30
|
+
}
|
|
31
|
+
sql += ` created_at TIMESTAMPTZ DEFAULT NOW(),\n`;
|
|
32
|
+
sql += ` updated_at TIMESTAMPTZ DEFAULT NOW()\n`;
|
|
33
|
+
sql += `);\n\n`;
|
|
34
|
+
// Indexes
|
|
35
|
+
sql += `CREATE INDEX idx_${tableName}_user_id ON ${tableName}(user_id);\n`;
|
|
36
|
+
sql += `CREATE INDEX idx_${tableName}_created_at ON ${tableName}(created_at DESC);\n\n`;
|
|
37
|
+
// RLS
|
|
38
|
+
if (add_rls) {
|
|
39
|
+
sql += `ALTER TABLE ${tableName} ENABLE ROW LEVEL SECURITY;\n\n`;
|
|
40
|
+
sql += `CREATE POLICY "Users see own ${tableName}"\nON ${tableName} FOR SELECT\nUSING (auth.uid() = user_id);\n\n`;
|
|
41
|
+
sql += `CREATE POLICY "Users insert own ${tableName}"\nON ${tableName} FOR INSERT\nWITH CHECK (auth.uid() = user_id);\n\n`;
|
|
42
|
+
sql += `CREATE POLICY "Users update own ${tableName}"\nON ${tableName} FOR UPDATE\nUSING (auth.uid() = user_id);\n\n`;
|
|
43
|
+
sql += `CREATE POLICY "Users delete own ${tableName}"\nON ${tableName} FOR DELETE\nUSING (auth.uid() = user_id);\n`;
|
|
44
|
+
}
|
|
45
|
+
// Write file
|
|
46
|
+
const migrationDir = path.join(cwd, 'supabase', 'migrations');
|
|
47
|
+
await fs.mkdir(migrationDir, { recursive: true });
|
|
48
|
+
const migrationPath = path.join(migrationDir, filename);
|
|
49
|
+
await fs.writeFile(migrationPath, sql, 'utf-8');
|
|
50
|
+
return `🍞 CodeBakers: Migration Generated
|
|
51
|
+
|
|
52
|
+
**File:** supabase/migrations/${filename}
|
|
53
|
+
**Table:** ${tableName}
|
|
54
|
+
**Fields:** ${fields.length}
|
|
55
|
+
**RLS:** ${add_rls ? 'Enabled' : 'Disabled'}
|
|
56
|
+
|
|
57
|
+
Migration includes:
|
|
58
|
+
✅ Table creation with UUID primary key
|
|
59
|
+
✅ user_id foreign key (security)
|
|
60
|
+
✅ Timestamps (created_at, updated_at)
|
|
61
|
+
✅ Indexes (user_id, created_at)
|
|
62
|
+
${add_rls ? '✅ RLS policies (user isolation)' : ''}
|
|
63
|
+
|
|
64
|
+
**Apply migration:**
|
|
65
|
+
\`\`\`bash
|
|
66
|
+
supabase db push
|
|
67
|
+
\`\`\`
|
|
68
|
+
|
|
69
|
+
Or manually:
|
|
70
|
+
\`\`\`bash
|
|
71
|
+
psql -f supabase/migrations/${filename}
|
|
72
|
+
\`\`\``;
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
return `🍞 CodeBakers: Migration Failed\n\nError: ${error instanceof Error ? error.message : String(error)}`;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function mapType(type) {
|
|
79
|
+
const lower = type.toLowerCase();
|
|
80
|
+
if (lower === 'string')
|
|
81
|
+
return 'TEXT';
|
|
82
|
+
if (lower === 'number')
|
|
83
|
+
return 'INTEGER';
|
|
84
|
+
if (lower === 'boolean')
|
|
85
|
+
return 'BOOLEAN';
|
|
86
|
+
if (lower === 'date')
|
|
87
|
+
return 'TIMESTAMPTZ';
|
|
88
|
+
if (lower === 'uuid')
|
|
89
|
+
return 'UUID';
|
|
90
|
+
if (lower === 'json')
|
|
91
|
+
return 'JSONB';
|
|
92
|
+
return 'TEXT';
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=generate-migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-migration.js","sourceRoot":"","sources":["../../src/tools/generate-migration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* codebakers_generate_schema
|
|
3
|
+
*
|
|
4
|
+
* Phase 2B: Schema Generation
|
|
5
|
+
* Generates complete database schema from mockup analysis
|
|
6
|
+
*
|
|
7
|
+
* Based on CodeBakers Method Phase 2B requirements:
|
|
8
|
+
* - All tables with full column definitions (name, type, nullable, default, constraints)
|
|
9
|
+
* - All foreign key relationships and join tables
|
|
10
|
+
* - All indexes required for the query patterns revealed by mockups
|
|
11
|
+
* - All enum types and value sets
|
|
12
|
+
* - Row-level security policies where applicable
|
|
13
|
+
* - Seed data requirements for development
|
|
14
|
+
*/
|
|
15
|
+
export declare function generateSchema(args: {
|
|
16
|
+
analysis_file?: string;
|
|
17
|
+
}): Promise<string>;
|
|
18
|
+
//# sourceMappingURL=generate-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-schema.d.ts","sourceRoot":"","sources":["../../src/tools/generate-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA6BH,wBAAsB,cAAc,CAAC,IAAI,EAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAkFtF"}
|
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* codebakers_generate_schema
|
|
3
|
+
*
|
|
4
|
+
* Phase 2B: Schema Generation
|
|
5
|
+
* Generates complete database schema from mockup analysis
|
|
6
|
+
*
|
|
7
|
+
* Based on CodeBakers Method Phase 2B requirements:
|
|
8
|
+
* - All tables with full column definitions (name, type, nullable, default, constraints)
|
|
9
|
+
* - All foreign key relationships and join tables
|
|
10
|
+
* - All indexes required for the query patterns revealed by mockups
|
|
11
|
+
* - All enum types and value sets
|
|
12
|
+
* - Row-level security policies where applicable
|
|
13
|
+
* - Seed data requirements for development
|
|
14
|
+
*/
|
|
15
|
+
import * as fs from 'fs/promises';
|
|
16
|
+
import * as path from 'path';
|
|
17
|
+
export async function generateSchema(args) {
|
|
18
|
+
const cwd = process.cwd();
|
|
19
|
+
const analysisFile = args.analysis_file || '.codebakers/MOCK-ANALYSIS.md';
|
|
20
|
+
const analysisPath = path.join(cwd, analysisFile);
|
|
21
|
+
console.error('🍞 CodeBakers: Phase 2B — Schema Generation');
|
|
22
|
+
console.error(`Reading analysis from: ${analysisPath}`);
|
|
23
|
+
try {
|
|
24
|
+
// 1. CHECK IF ANALYSIS FILE EXISTS
|
|
25
|
+
const exists = await fs.access(analysisPath).then(() => true).catch(() => false);
|
|
26
|
+
if (!exists) {
|
|
27
|
+
return `🍞 CodeBakers: Phase 2B - Schema Generation
|
|
28
|
+
|
|
29
|
+
❌ BLOCKER: Mock analysis file not found
|
|
30
|
+
|
|
31
|
+
Expected location: ${analysisPath}
|
|
32
|
+
|
|
33
|
+
Phase 2B cannot proceed without Phase 2A analysis.
|
|
34
|
+
|
|
35
|
+
Next step: Run Phase 2A first (use tool: codebakers_analyze_mockups_deep)`;
|
|
36
|
+
}
|
|
37
|
+
// 2. READ MOCK-ANALYSIS.md
|
|
38
|
+
const analysisContent = await fs.readFile(analysisPath, 'utf-8');
|
|
39
|
+
// 3. PARSE ANALYSIS FILE TO EXTRACT SCHEMA REQUIREMENTS
|
|
40
|
+
const { tables, enums } = parseAnalysisForSchema(analysisContent);
|
|
41
|
+
if (tables.length === 0) {
|
|
42
|
+
return `🍞 CodeBakers: Phase 2B - Schema Generation
|
|
43
|
+
|
|
44
|
+
⚠️ WARNING: No entities found in analysis file
|
|
45
|
+
|
|
46
|
+
The mock analysis appears incomplete or empty.
|
|
47
|
+
|
|
48
|
+
Please verify Phase 2A analysis contains data fields and entities.`;
|
|
49
|
+
}
|
|
50
|
+
console.error(`Extracted ${tables.length} tables and ${enums.length} enum types`);
|
|
51
|
+
// 4. GENERATE SQL SCHEMA
|
|
52
|
+
const schema = generateSQLSchema(tables, enums);
|
|
53
|
+
// 5. WRITE SCHEMA.sql
|
|
54
|
+
const schemaPath = path.join(cwd, '.codebakers', 'SCHEMA.sql');
|
|
55
|
+
await fs.writeFile(schemaPath, schema, 'utf-8');
|
|
56
|
+
console.error(`✓ Schema generated: ${schemaPath}`);
|
|
57
|
+
// 6. GENERATE SUMMARY
|
|
58
|
+
const summary = generateSchemaSummary(tables, enums);
|
|
59
|
+
return `🍞 CodeBakers: Phase 2B - Schema Generation Complete
|
|
60
|
+
|
|
61
|
+
${summary}
|
|
62
|
+
|
|
63
|
+
📄 Schema written to: .codebakers/SCHEMA.sql
|
|
64
|
+
|
|
65
|
+
Next steps:
|
|
66
|
+
1. Review SCHEMA.sql to verify all tables and relationships
|
|
67
|
+
2. Proceed to Phase 2C: Dependency Mapping (use tool: codebakers_map_dependencies)
|
|
68
|
+
3. Run verification gate before Phase 3
|
|
69
|
+
|
|
70
|
+
Verification gate requirement:
|
|
71
|
+
→ Every data field in mockups has corresponding database column
|
|
72
|
+
→ All entity relationships captured in foreign keys
|
|
73
|
+
→ No unresolved dependencies`;
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
console.error('Error during schema generation:', error);
|
|
77
|
+
return `🍞 CodeBakers: Phase 2B - Schema Generation Failed
|
|
78
|
+
|
|
79
|
+
Error: ${error instanceof Error ? error.message : String(error)}
|
|
80
|
+
|
|
81
|
+
Please check:
|
|
82
|
+
- Mock analysis file exists and is readable
|
|
83
|
+
- Analysis file contains entity and field data
|
|
84
|
+
- File permissions allow writing
|
|
85
|
+
|
|
86
|
+
If issue persists, log to ERROR-LOG.md and request human assistance.`;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Parse MOCK-ANALYSIS.md to extract schema requirements
|
|
91
|
+
*/
|
|
92
|
+
function parseAnalysisForSchema(analysisContent) {
|
|
93
|
+
const tables = [];
|
|
94
|
+
const enums = [];
|
|
95
|
+
const entityFields = new Map();
|
|
96
|
+
const entityTypes = new Map();
|
|
97
|
+
const stateValues = new Map();
|
|
98
|
+
const relationships = [];
|
|
99
|
+
// PARSE DATA FIELDS FROM ANALYSIS
|
|
100
|
+
// Look for markdown tables with field information
|
|
101
|
+
const fieldTableRegex = /\| Field Name \| Data Type \| Source Entity[^\n]*\n\|[-\s|]+\n((?:\|[^\n]+\n)+)/g;
|
|
102
|
+
let match;
|
|
103
|
+
while ((match = fieldTableRegex.exec(analysisContent)) !== null) {
|
|
104
|
+
const tableContent = match[1];
|
|
105
|
+
const rows = tableContent.trim().split('\n');
|
|
106
|
+
for (const row of rows) {
|
|
107
|
+
const cols = row.split('|').map(c => c.trim()).filter(c => c);
|
|
108
|
+
if (cols.length >= 3) {
|
|
109
|
+
const fieldName = cols[0];
|
|
110
|
+
const dataType = cols[1];
|
|
111
|
+
const sourceEntity = cols[2];
|
|
112
|
+
if (!entityFields.has(sourceEntity)) {
|
|
113
|
+
entityFields.set(sourceEntity, new Set());
|
|
114
|
+
entityTypes.set(sourceEntity, new Map());
|
|
115
|
+
}
|
|
116
|
+
entityFields.get(sourceEntity).add(fieldName);
|
|
117
|
+
entityTypes.get(sourceEntity).set(fieldName, dataType);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// PARSE FORM INPUTS
|
|
122
|
+
const inputTableRegex = /\| Input Name \| Type \| Target Entity[^\n]*\n\|[-\s|]+\n((?:\|[^\n]+\n)+)/g;
|
|
123
|
+
while ((match = inputTableRegex.exec(analysisContent)) !== null) {
|
|
124
|
+
const tableContent = match[1];
|
|
125
|
+
const rows = tableContent.trim().split('\n');
|
|
126
|
+
for (const row of rows) {
|
|
127
|
+
const cols = row.split('|').map(c => c.trim()).filter(c => c);
|
|
128
|
+
if (cols.length >= 3) {
|
|
129
|
+
const inputName = cols[0];
|
|
130
|
+
const inputType = cols[1];
|
|
131
|
+
const targetEntity = cols[2];
|
|
132
|
+
if (!entityFields.has(targetEntity)) {
|
|
133
|
+
entityFields.set(targetEntity, new Set());
|
|
134
|
+
entityTypes.set(targetEntity, new Map());
|
|
135
|
+
}
|
|
136
|
+
entityFields.get(targetEntity).add(inputName);
|
|
137
|
+
entityTypes.get(targetEntity).set(inputName, mapInputTypeToSQLType(inputType));
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// PARSE RELATIONSHIPS
|
|
142
|
+
const relTableRegex = /\| From Entity \| To Entity \| Type[^\n]*\n\|[-\s|]+\n((?:\|[^\n]+\n)+)/g;
|
|
143
|
+
while ((match = relTableRegex.exec(analysisContent)) !== null) {
|
|
144
|
+
const tableContent = match[1];
|
|
145
|
+
const rows = tableContent.trim().split('\n');
|
|
146
|
+
for (const row of rows) {
|
|
147
|
+
const cols = row.split('|').map(c => c.trim()).filter(c => c);
|
|
148
|
+
if (cols.length >= 3) {
|
|
149
|
+
relationships.push({
|
|
150
|
+
from: cols[0],
|
|
151
|
+
to: cols[1],
|
|
152
|
+
type: cols[2],
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// PARSE STATE VALUES (for enums)
|
|
158
|
+
const stateTableRegex = /\| Entity \| State Field \| Possible Values[^\n]*\n\|[-\s|]+\n((?:\|[^\n]+\n)+)/g;
|
|
159
|
+
while ((match = stateTableRegex.exec(analysisContent)) !== null) {
|
|
160
|
+
const tableContent = match[1];
|
|
161
|
+
const rows = tableContent.trim().split('\n');
|
|
162
|
+
for (const row of rows) {
|
|
163
|
+
const cols = row.split('|').map(c => c.trim()).filter(c => c);
|
|
164
|
+
if (cols.length >= 3) {
|
|
165
|
+
const entity = cols[0];
|
|
166
|
+
const stateField = cols[1];
|
|
167
|
+
const values = cols[2].split(',').map(v => v.trim());
|
|
168
|
+
const enumName = `${entity}_${stateField}`;
|
|
169
|
+
stateValues.set(enumName, values);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// GENERATE TABLES FROM ENTITIES
|
|
174
|
+
for (const [entityName, fields] of entityFields.entries()) {
|
|
175
|
+
if (entityName === 'unknown')
|
|
176
|
+
continue;
|
|
177
|
+
const table = {
|
|
178
|
+
name: pluralize(entityName),
|
|
179
|
+
columns: [],
|
|
180
|
+
indexes: [],
|
|
181
|
+
relationships: [],
|
|
182
|
+
row_level_security: true,
|
|
183
|
+
};
|
|
184
|
+
// Add standard columns
|
|
185
|
+
table.columns.push({
|
|
186
|
+
name: 'id',
|
|
187
|
+
type: 'uuid',
|
|
188
|
+
nullable: false,
|
|
189
|
+
default_value: 'gen_random_uuid()',
|
|
190
|
+
is_primary_key: true,
|
|
191
|
+
is_foreign_key: false,
|
|
192
|
+
unique: true,
|
|
193
|
+
});
|
|
194
|
+
// Add extracted fields
|
|
195
|
+
const types = entityTypes.get(entityName);
|
|
196
|
+
for (const field of Array.from(fields).sort()) {
|
|
197
|
+
if (field === 'id')
|
|
198
|
+
continue; // Already added
|
|
199
|
+
const dataType = types.get(field) || 'text';
|
|
200
|
+
table.columns.push({
|
|
201
|
+
name: field,
|
|
202
|
+
type: mapToPostgreSQLType(dataType),
|
|
203
|
+
nullable: !isRequiredField(field),
|
|
204
|
+
is_primary_key: false,
|
|
205
|
+
is_foreign_key: field.endsWith('_id'),
|
|
206
|
+
unique: field.includes('email') || field.includes('username'),
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
// Add foreign key relationships
|
|
210
|
+
for (const rel of relationships) {
|
|
211
|
+
if (rel.from === entityName) {
|
|
212
|
+
const fkColumn = `${rel.to}_id`;
|
|
213
|
+
if (!fields.has(fkColumn)) {
|
|
214
|
+
table.columns.push({
|
|
215
|
+
name: fkColumn,
|
|
216
|
+
type: 'uuid',
|
|
217
|
+
nullable: true,
|
|
218
|
+
is_primary_key: false,
|
|
219
|
+
is_foreign_key: true,
|
|
220
|
+
references: { table: pluralize(rel.to), column: 'id' },
|
|
221
|
+
unique: false,
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
table.relationships.push(`${rel.type} relationship to ${pluralize(rel.to)}`);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// Add user_id for multi-tenant RLS
|
|
228
|
+
if (!fields.has('user_id')) {
|
|
229
|
+
table.columns.push({
|
|
230
|
+
name: 'user_id',
|
|
231
|
+
type: 'uuid',
|
|
232
|
+
nullable: false,
|
|
233
|
+
is_primary_key: false,
|
|
234
|
+
is_foreign_key: true,
|
|
235
|
+
references: { table: 'users', column: 'id' },
|
|
236
|
+
unique: false,
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
// Add timestamps
|
|
240
|
+
table.columns.push({
|
|
241
|
+
name: 'created_at',
|
|
242
|
+
type: 'timestamptz',
|
|
243
|
+
nullable: false,
|
|
244
|
+
default_value: 'now()',
|
|
245
|
+
is_primary_key: false,
|
|
246
|
+
is_foreign_key: false,
|
|
247
|
+
unique: false,
|
|
248
|
+
});
|
|
249
|
+
table.columns.push({
|
|
250
|
+
name: 'updated_at',
|
|
251
|
+
type: 'timestamptz',
|
|
252
|
+
nullable: false,
|
|
253
|
+
default_value: 'now()',
|
|
254
|
+
is_primary_key: false,
|
|
255
|
+
is_foreign_key: false,
|
|
256
|
+
unique: false,
|
|
257
|
+
});
|
|
258
|
+
// Add indexes
|
|
259
|
+
table.indexes.push(`CREATE INDEX idx_${table.name}_user_id ON ${table.name}(user_id);`);
|
|
260
|
+
table.indexes.push(`CREATE INDEX idx_${table.name}_created_at ON ${table.name}(created_at);`);
|
|
261
|
+
// Add index for foreign keys
|
|
262
|
+
for (const col of table.columns) {
|
|
263
|
+
if (col.is_foreign_key && col.name !== 'user_id') {
|
|
264
|
+
table.indexes.push(`CREATE INDEX idx_${table.name}_${col.name} ON ${table.name}(${col.name});`);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
tables.push(table);
|
|
268
|
+
}
|
|
269
|
+
// GENERATE ENUMS
|
|
270
|
+
for (const [enumName, values] of stateValues.entries()) {
|
|
271
|
+
enums.push({ name: enumName, values });
|
|
272
|
+
}
|
|
273
|
+
return { tables, enums };
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Generate complete SQL schema
|
|
277
|
+
*/
|
|
278
|
+
function generateSQLSchema(tables, enums) {
|
|
279
|
+
let sql = `-- CodeBakers Generated Schema\n`;
|
|
280
|
+
sql += `-- Generated: ${new Date().toISOString()}\n`;
|
|
281
|
+
sql += `-- Phase: 2B - Schema Generation\n`;
|
|
282
|
+
sql += `-- Stack: Supabase + PostgreSQL\n\n`;
|
|
283
|
+
sql += `-- This schema is derived from UI mockup analysis\n`;
|
|
284
|
+
sql += `-- Every table and column maps to actual UI requirements\n\n`;
|
|
285
|
+
// Enable UUID extension
|
|
286
|
+
sql += `-- Enable UUID extension\n`;
|
|
287
|
+
sql += `CREATE EXTENSION IF NOT EXISTS "uuid-ossp";\n\n`;
|
|
288
|
+
// Generate enums
|
|
289
|
+
if (enums.length > 0) {
|
|
290
|
+
sql += `-- ENUM TYPES\n\n`;
|
|
291
|
+
for (const enumType of enums) {
|
|
292
|
+
sql += `CREATE TYPE ${enumType.name} AS ENUM (\n`;
|
|
293
|
+
sql += enumType.values.map(v => ` '${v}'`).join(',\n');
|
|
294
|
+
sql += `\n);\n\n`;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
// Generate tables
|
|
298
|
+
sql += `-- TABLES\n\n`;
|
|
299
|
+
for (const table of tables) {
|
|
300
|
+
sql += `CREATE TABLE ${table.name} (\n`;
|
|
301
|
+
// Columns
|
|
302
|
+
const columnDefs = [];
|
|
303
|
+
for (const col of table.columns) {
|
|
304
|
+
let def = ` ${col.name} ${col.type}`;
|
|
305
|
+
if (!col.nullable)
|
|
306
|
+
def += ' NOT NULL';
|
|
307
|
+
if (col.default_value)
|
|
308
|
+
def += ` DEFAULT ${col.default_value}`;
|
|
309
|
+
if (col.unique && !col.is_primary_key)
|
|
310
|
+
def += ' UNIQUE';
|
|
311
|
+
columnDefs.push(def);
|
|
312
|
+
}
|
|
313
|
+
// Primary key
|
|
314
|
+
const pkCols = table.columns.filter(c => c.is_primary_key).map(c => c.name);
|
|
315
|
+
if (pkCols.length > 0) {
|
|
316
|
+
columnDefs.push(` PRIMARY KEY (${pkCols.join(', ')})`);
|
|
317
|
+
}
|
|
318
|
+
// Foreign keys
|
|
319
|
+
for (const col of table.columns) {
|
|
320
|
+
if (col.is_foreign_key && col.references) {
|
|
321
|
+
columnDefs.push(` FOREIGN KEY (${col.name}) REFERENCES ${col.references.table}(${col.references.column}) ON DELETE CASCADE`);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
sql += columnDefs.join(',\n');
|
|
325
|
+
sql += `\n);\n\n`;
|
|
326
|
+
// Indexes
|
|
327
|
+
if (table.indexes.length > 0) {
|
|
328
|
+
sql += `-- Indexes for ${table.name}\n`;
|
|
329
|
+
for (const idx of table.indexes) {
|
|
330
|
+
sql += `${idx}\n`;
|
|
331
|
+
}
|
|
332
|
+
sql += `\n`;
|
|
333
|
+
}
|
|
334
|
+
// Row-level security
|
|
335
|
+
if (table.row_level_security) {
|
|
336
|
+
sql += `-- Row-level security for ${table.name}\n`;
|
|
337
|
+
sql += `ALTER TABLE ${table.name} ENABLE ROW LEVEL SECURITY;\n\n`;
|
|
338
|
+
sql += `CREATE POLICY "Users can view their own ${table.name}"\n`;
|
|
339
|
+
sql += ` ON ${table.name}\n`;
|
|
340
|
+
sql += ` FOR SELECT\n`;
|
|
341
|
+
sql += ` USING (auth.uid() = user_id);\n\n`;
|
|
342
|
+
sql += `CREATE POLICY "Users can insert their own ${table.name}"\n`;
|
|
343
|
+
sql += ` ON ${table.name}\n`;
|
|
344
|
+
sql += ` FOR INSERT\n`;
|
|
345
|
+
sql += ` WITH CHECK (auth.uid() = user_id);\n\n`;
|
|
346
|
+
sql += `CREATE POLICY "Users can update their own ${table.name}"\n`;
|
|
347
|
+
sql += ` ON ${table.name}\n`;
|
|
348
|
+
sql += ` FOR UPDATE\n`;
|
|
349
|
+
sql += ` USING (auth.uid() = user_id);\n\n`;
|
|
350
|
+
sql += `CREATE POLICY "Users can delete their own ${table.name}"\n`;
|
|
351
|
+
sql += ` ON ${table.name}\n`;
|
|
352
|
+
sql += ` FOR DELETE\n`;
|
|
353
|
+
sql += ` USING (auth.uid() = user_id);\n\n`;
|
|
354
|
+
}
|
|
355
|
+
sql += `---\n\n`;
|
|
356
|
+
}
|
|
357
|
+
// Seed data section
|
|
358
|
+
sql += `-- SEED DATA\n`;
|
|
359
|
+
sql += `-- Add development seed data below\n\n`;
|
|
360
|
+
return sql;
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Generate summary for tool response
|
|
364
|
+
*/
|
|
365
|
+
function generateSchemaSummary(tables, enums) {
|
|
366
|
+
const totalColumns = tables.reduce((sum, t) => sum + t.columns.length, 0);
|
|
367
|
+
const totalIndexes = tables.reduce((sum, t) => sum + t.indexes.length, 0);
|
|
368
|
+
const totalRelationships = tables.reduce((sum, t) => sum + t.relationships.length, 0);
|
|
369
|
+
let summary = `✓ Generated ${tables.length} tables\n`;
|
|
370
|
+
summary += `✓ Generated ${totalColumns} columns\n`;
|
|
371
|
+
summary += `✓ Generated ${enums.length} enum types\n`;
|
|
372
|
+
summary += `✓ Generated ${totalIndexes} indexes\n`;
|
|
373
|
+
summary += `✓ Generated ${totalRelationships} relationships\n`;
|
|
374
|
+
summary += `✓ Row-level security enabled on all tables\n`;
|
|
375
|
+
return summary;
|
|
376
|
+
}
|
|
377
|
+
// HELPER FUNCTIONS
|
|
378
|
+
function pluralize(word) {
|
|
379
|
+
// Simple pluralization rules
|
|
380
|
+
if (word.endsWith('y'))
|
|
381
|
+
return word.slice(0, -1) + 'ies';
|
|
382
|
+
if (word.endsWith('s'))
|
|
383
|
+
return word + 'es';
|
|
384
|
+
return word + 's';
|
|
385
|
+
}
|
|
386
|
+
function mapToPostgreSQLType(dataType) {
|
|
387
|
+
const typeMap = {
|
|
388
|
+
'text': 'text',
|
|
389
|
+
'email': 'text',
|
|
390
|
+
'phone': 'text',
|
|
391
|
+
'url': 'text',
|
|
392
|
+
'uuid': 'uuid',
|
|
393
|
+
'number': 'integer',
|
|
394
|
+
'decimal': 'numeric',
|
|
395
|
+
'boolean': 'boolean',
|
|
396
|
+
'timestamp': 'timestamptz',
|
|
397
|
+
'date': 'date',
|
|
398
|
+
'json': 'jsonb',
|
|
399
|
+
};
|
|
400
|
+
return typeMap[dataType.toLowerCase()] || 'text';
|
|
401
|
+
}
|
|
402
|
+
function mapInputTypeToSQLType(inputType) {
|
|
403
|
+
const typeMap = {
|
|
404
|
+
'text': 'text',
|
|
405
|
+
'email': 'email',
|
|
406
|
+
'password': 'text',
|
|
407
|
+
'number': 'number',
|
|
408
|
+
'tel': 'phone',
|
|
409
|
+
'url': 'url',
|
|
410
|
+
'date': 'date',
|
|
411
|
+
'datetime-local': 'timestamp',
|
|
412
|
+
'checkbox': 'boolean',
|
|
413
|
+
'textarea': 'text',
|
|
414
|
+
'select': 'text',
|
|
415
|
+
};
|
|
416
|
+
return typeMap[inputType.toLowerCase()] || 'text';
|
|
417
|
+
}
|
|
418
|
+
function isRequiredField(fieldName) {
|
|
419
|
+
const requiredFields = ['id', 'user_id', 'created_at', 'updated_at', 'name', 'title'];
|
|
420
|
+
return requiredFields.includes(fieldName);
|
|
421
|
+
}
|
|
422
|
+
//# sourceMappingURL=generate-schema.js.map
|