@polymorphism-tech/morph-spec 4.10.7 → 4.10.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/CLAUDE.md +3 -3
  2. package/LICENSE +71 -71
  3. package/README.md +379 -379
  4. package/bin/morph-spec.js +1 -1
  5. package/claude-plugin.json +14 -14
  6. package/docs/CHEATSHEET.md +1 -1
  7. package/docs/QUICKSTART.md +206 -206
  8. package/framework/agents/README.md +14 -14
  9. package/framework/agents/architecture/standards-architect.md +159 -159
  10. package/framework/agents/frontend/blazor-builder.md +13 -0
  11. package/framework/agents/frontend/css-specialist.md +87 -0
  12. package/framework/agents/frontend/nextjs-expert.md +13 -0
  13. package/framework/agents/frontend/nextjs-ui-specialist.md +218 -0
  14. package/framework/agents/frontend/ui-ux-designer.md +80 -10
  15. package/framework/agents/infrastructure/azure-architect.md +149 -149
  16. package/framework/agents/infrastructure/infra-architect.md +48 -48
  17. package/framework/agents.json +2268 -2204
  18. package/framework/hooks/README.md +204 -204
  19. package/framework/hooks/claude-code/session-start/inject-morph-context.js +10 -24
  20. package/framework/hooks/shared/phase-utils.js +139 -139
  21. package/framework/hooks/shared/worktree-helpers.js +30 -8
  22. package/framework/rules/csharp-standards.md +13 -13
  23. package/framework/rules/frontend-standards.md +13 -13
  24. package/framework/rules/infrastructure-standards.md +16 -16
  25. package/framework/rules/testing-standards.md +14 -14
  26. package/framework/skills/level-0-meta/morph-brainstorming/SKILL.md +12 -0
  27. package/framework/skills/level-0-meta/morph-code-review-nextjs/references/review-example-nextjs.md +254 -254
  28. package/framework/skills/level-0-meta/morph-init/SKILL.md +88 -3
  29. package/framework/skills/level-1-workflows/morph-phase-clarify/SKILL.md +247 -247
  30. package/framework/skills/level-1-workflows/morph-phase-codebase-analysis/SKILL.md +270 -270
  31. package/framework/skills/level-1-workflows/morph-phase-design/SKILL.md +515 -499
  32. package/framework/skills/level-1-workflows/morph-phase-implement/SKILL.md +508 -500
  33. package/framework/skills/level-1-workflows/morph-phase-plan/SKILL.md +12 -1
  34. package/framework/skills/level-1-workflows/morph-phase-setup/SKILL.md +272 -262
  35. package/framework/skills/level-1-workflows/morph-phase-tasks/SKILL.md +317 -311
  36. package/framework/skills/level-1-workflows/morph-phase-uiux/SKILL.md +424 -323
  37. package/framework/skills/level-1-workflows/morph-scope-escalation/SKILL.md +1 -1
  38. package/framework/standards/STANDARDS.json +2040 -2040
  39. package/framework/standards/frontend/nextjs/motion-patterns.md +321 -0
  40. package/framework/standards/frontend/nextjs/nextjs-patterns.md +17 -17
  41. package/framework/templates/README.md +814 -814
  42. package/framework/templates/code/dotnet/contracts/Commands.cs +74 -74
  43. package/framework/templates/code/dotnet/contracts/Entities.cs +25 -25
  44. package/framework/templates/code/dotnet/contracts/Queries.cs +74 -74
  45. package/framework/templates/code/dotnet/contracts/README.md +74 -74
  46. package/framework/templates/code/dotnet/contracts/api-contracts.cs +173 -173
  47. package/framework/templates/code/dotnet/frontend/component.razor +239 -239
  48. package/framework/templates/code/dotnet/jobs/agent.cs +163 -163
  49. package/framework/templates/code/dotnet/jobs/job.cs +171 -171
  50. package/framework/templates/code/dotnet/test.cs +239 -239
  51. package/framework/templates/code/sql/rls-policy.sql +57 -57
  52. package/framework/templates/code/sql/supabase-migration.sql +100 -100
  53. package/framework/templates/code/sql/supabase-migration.template.sql +113 -113
  54. package/framework/templates/code/typescript/contracts.ts +168 -168
  55. package/framework/templates/context/CONTEXT.md +181 -181
  56. package/framework/templates/context/design-system.md +211 -0
  57. package/framework/templates/docs/proposal.md +182 -182
  58. package/framework/templates/docs/user-stories.md +34 -34
  59. package/framework/templates/examples/design-system-examples.md +357 -357
  60. package/framework/templates/examples/spec-examples.md +90 -90
  61. package/framework/templates/feature/decisions.md +187 -187
  62. package/framework/templates/feature/recap.md +146 -146
  63. package/framework/templates/feature/tasks.md +199 -199
  64. package/framework/templates/infrastructure/azure/README.md +286 -286
  65. package/framework/templates/infrastructure/azure/deploy-checklist.md +426 -426
  66. package/framework/templates/infrastructure/azure/parameters.dev.json +29 -29
  67. package/framework/templates/infrastructure/azure/parameters.prod.json +29 -29
  68. package/framework/templates/infrastructure/azure/parameters.staging.json +29 -29
  69. package/framework/templates/infrastructure/docker/docker-compose.template.yml +67 -67
  70. package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
  71. package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
  72. package/framework/templates/infrastructure/docker/easypanel.template.json +54 -54
  73. package/package.json +82 -82
  74. package/src/commands/agents/index.js +13 -13
  75. package/src/commands/project/install-plugin-cmd.js +28 -28
  76. package/src/commands/project/setup-infra-cmd.js +12 -12
  77. package/src/commands/project/worktree.js +58 -2
  78. package/src/commands/tasks/index.js +4 -4
  79. package/src/commands/templates/index.js +5 -5
  80. package/src/commands/utils/index.js +3 -3
  81. package/src/commands/validation/index.js +4 -4
  82. package/src/core/state/phase-state-machine.js +217 -217
  83. package/src/lib/generators/design-system-generator.js +298 -298
  84. package/src/lib/generators/index.js +10 -10
  85. package/src/lib/generators/metadata-extractor.js +387 -387
  86. package/src/lib/stack-filter.js +65 -65
  87. package/src/lib/standards/index.js +7 -7
  88. package/src/lib/standards/standards-context-injector.js +302 -302
  89. package/src/lib/validators/architecture/architecture-validator.js +387 -387
  90. package/src/lib/validators/architecture/index.js +7 -7
  91. package/src/lib/validators/blazor/blazor-concurrency-analyzer.js +316 -316
  92. package/src/lib/validators/blazor/blazor-state-validator.js +279 -279
  93. package/src/lib/validators/blazor/blazor-validator.js +369 -369
  94. package/src/lib/validators/blazor/index.js +9 -9
  95. package/src/lib/validators/content/content-validator.js +287 -287
  96. package/src/lib/validators/content/index.js +7 -7
  97. package/src/lib/validators/contracts/index.js +7 -7
  98. package/src/lib/validators/css/css-validator.js +352 -352
  99. package/src/lib/validators/css/index.js +7 -7
  100. package/src/lib/validators/design-system/design-system-validator.js +231 -231
  101. package/src/lib/validators/design-system/index.js +7 -7
  102. package/src/lib/validators/nextjs/index.js +6 -6
  103. package/src/lib/validators/nextjs/next-component-validator.js +183 -183
  104. package/src/lib/validators/packages/index.js +7 -7
  105. package/src/lib/validators/packages/package-validator.js +360 -360
  106. package/src/lib/validators/shared/index.js +12 -12
  107. package/src/lib/validators/shared/issue-counter.js +18 -18
  108. package/src/lib/validators/shared/result-formatter.js +124 -124
  109. package/src/lib/validators/ui/index.js +7 -7
  110. package/src/lib/validators/ui/ui-contrast-validator.js +422 -422
  111. package/src/scripts/global-install.js +58 -58
  112. package/src/scripts/install-plugin.js +126 -126
  113. package/src/utils/claude-md-injector.js +90 -90
  114. package/src/utils/file-copier.js +200 -196
  115. package/src/utils/hooks-installer.js +556 -494
  116. package/src/utils/logger.js +32 -32
  117. package/src/utils/skills-installer.js +178 -178
  118. package/src/utils/version-checker.js +175 -175
  119. package/framework/skills/level-1-workflows/morph-phase-implement/.morph/logs/activity.json +0 -38
  120. package/framework/skills/level-1-workflows/morph-phase-tasks/.morph/logs/activity.json +0 -14
  121. package/framework/templates/.idea/morph-templates.xml +0 -92
  122. package/framework/templates/.vscode/morph-templates.code-snippets +0 -186
@@ -1,270 +1,270 @@
1
- ---
2
- name: morph-phase-codebase-analysis
3
- description: MORPH-SPEC Design sub-phase that analyzes existing codebase and database schema, producing schema-analysis.md with real column names, types, relationships, and field mismatches. Use at the start of Design phase before generating contracts.cs to prevent incorrect field names or types.
4
- user-invocable: false
5
- allowed-tools: Read, Write, Edit, Bash, Glob, Grep, AskUserQuestion
6
- cliVersion: "4.10.7"
7
- ---
8
-
9
- # MORPH Codebase Analysis - Design Sub-phase
10
-
11
- > INTERNAL: Automation skill for schema analysis step within Phase 2 (Design).
12
- > Called by `phase-design.md` Step 2. Not a standalone user command.
13
-
14
- Automates existing code analysis to generate `schema-analysis.md` with real database/code data.
15
-
16
- ## Prerequisites
17
-
18
- - [ ] Phase 1 (Setup) completed
19
- - [ ] Feature has approved `proposal.md`
20
- - [ ] Project context loaded (stack, agents)
21
-
22
- ## Recommended Tools
23
-
24
- > **Ref:** `framework/skills/level-0-meta/morph-tool-usage-guide/SKILL.md` for complete guide.
25
- > **Ref:** `framework/standards/integration/mcp/mcp-tools.md` for MCP reference.
26
-
27
- | Action | Tool | Alternative |
28
- |------|------------|-------------|
29
- | List database tables | **Supabase MCP** `list_tables()` | **Grep** `.from(` in code |
30
- | Get table schema | **Supabase MCP** `get_table_schema()` | **Read** type definitions |
31
- | Get FK relationships | **Supabase MCP** `get_relationships()` | **Grep** JOIN/FK patterns |
32
- | Get RLS policies | **Supabase MCP** `query()` | **Read** policy files |
33
- | Find queries in code | **Grep** `\.from\(` in `*.ts,*.tsx,*.js,*.cs` | — |
34
- | Find type definitions | **Glob** `src/**/types/**/*.ts` or `**/Entities/**/*.cs` | — |
35
- | Read found files | **Read** each file | — |
36
- | Complex multi-file analysis | **Task** (subagent Explore) | Read individual |
37
- | Generate schema-analysis.md | **Write** using template | **Bash** template render |
38
-
39
- **MCPs for this phase:** Supabase (schema — **PRIORITY**), Generic database MCPs.
40
-
41
- ---
42
-
43
- ## Automated Workflow
44
-
45
- ### Step 1: Detect Analysis Method
46
-
47
- **IMPORTANT:** Do not assume the MCP is available and accessible.
48
- Verify first with a test call before attempting to use it.
49
-
50
- ```
51
- 1. IF Supabase MCP configured in settings.json:
52
- → Try mcp__supabase__list_tables() with implicit timeout
53
- → IF returns valid data (array of tables with content):
54
- → Use Method A (direct MCP)
55
- → IF returns error, timeout, empty array, or inaccessible data:
56
- → Log: "Supabase MCP configured but inaccessible (CloudSQL? Auth? Permissions?)"
57
- → Use Method B (static code analysis)
58
-
59
- 2. IF Database MCP (other) configured:
60
- → Test connectivity with trivial query before using
61
- → IF OK: Use adapted Method A
62
- → IF fails: Use Method B
63
-
64
- 3. IF no MCP available:
65
- → Use Method B (static code analysis)
66
- ```
67
-
68
- **Signs of inaccessible MCP:**
69
- - Empty response or `[]` from `list_tables()`
70
- - Authentication error / permission denied
71
- - Returned schema doesn't match code (e.g., tables exist in code but not in MCP)
72
- - Project uses database other than Supabase (CloudSQL, RDS, Azure SQL, etc.)
73
-
74
- ### Step 2A: MCP Method (Preferred)
75
-
76
- **Tools:** Supabase MCP
77
-
78
- ```javascript
79
- // 1. List all tables
80
- const tables = await mcp__supabase__list_tables();
81
-
82
- // 2. For each feature-relevant table:
83
- for (const table of relevantTables) {
84
- // 2a. Complete schema
85
- const schema = await mcp__supabase__get_table_schema({ table: table.name });
86
- // → column_name, data_type, is_nullable, column_default
87
-
88
- // 2b. Relationships
89
- const rels = await mcp__supabase__get_relationships({ table: table.name });
90
- // → foreign_table, foreign_column, constraint_type
91
-
92
- // 2c. Indexes
93
- const indexes = await mcp__supabase__query({
94
- query: `SELECT indexname, indexdef FROM pg_indexes WHERE tablename = '${table.name}'`
95
- });
96
-
97
- // 2d. RLS policies (security)
98
- const policies = await mcp__supabase__query({
99
- query: `SELECT policyname, cmd, qual FROM pg_policies WHERE tablename = '${table.name}'`
100
- });
101
- }
102
- ```
103
-
104
- ### Step 2B: Static Analysis Method (Fallback)
105
-
106
- **Tools:** Grep, Glob, Read, Task (subagent for large projects)
107
-
108
- **Phase B1: Find Queries**
109
-
110
- ```
111
- Grep: "\.from\(|\.select\(|SELECT |supabase\.|context\.|dbContext\.|DbSet<"
112
- Type: ts,tsx,js,jsx,cs
113
- Output: files_with_matches
114
- ```
115
-
116
- **Phase B2: Read Query Files**
117
-
118
- For each found file, use **Read** to extract:
119
- - Table names: `from('leads')`, `DbSet<Lead>`, `FROM leads`
120
- - Column names: `.select('fullname, phonenumber')`, `l.FullName`
121
- - Data types: TypeScript interfaces, C# DTOs
122
- - Relationships: JOIN clauses, navigation properties
123
-
124
- **Phase B3: Find Type Definitions**
125
-
126
- ```
127
- # TypeScript/JavaScript:
128
- Glob: "src/**/types/**/*.ts"
129
- Glob: "src/**/*.d.ts"
130
- Glob: "src/**/interfaces/*.ts"
131
-
132
- # .NET:
133
- Glob: "**/*Dto.cs"
134
- Glob: "**/Entities/**/*.cs"
135
- Glob: "**/Models/**/*.cs"
136
- ```
137
-
138
- **Phase B4: When to use Task (subagent)**
139
-
140
- Use Task subagent **ONLY** when:
141
- - Project has 20+ query files
142
- - Multiple data access patterns (Supabase + EF Core + raw SQL)
143
- - Precise cross-context analysis across many files
144
-
145
- Do not use Task subagent when:
146
- - Project has < 10 query files (direct Read is faster)
147
- - Data access pattern is uniform (only Supabase OR only EF Core)
148
-
149
- ### Step 2B-Format: Standardized Format for Static Analysis
150
-
151
- **IMPORTANT:** When using Method B (static analysis), **always use the official template**.
152
- This ensures `contracts.cs` can be generated mechanically, without manual interpretation.
153
-
154
- The template is at `framework/templates/docs/schema-analysis.md`. Use it via:
155
-
156
- ```bash
157
- npx morph-spec template render docs/schema-analysis \
158
- .morph/features/{feature}/1-design/schema-analysis.md \
159
- '{
160
- "FEATURE_NAME": "{feature}",
161
- "FEATURE_NAME_TITLE": "{Feature Display Name}",
162
- "DATE": "YYYY-MM-DD",
163
- "AUTHOR": "Claude Code (Sonnet 4.6)",
164
- "method": "Static Code Analysis",
165
- "mcpUsed": "No",
166
- "tableCount": N,
167
- "fileCount": N,
168
- "tables": [
169
- {
170
- "name": "table_name",
171
- "codeSource": "path/to/file.ts",
172
- "columns": [
173
- { "name": "column_name", "type": "string", "nullable": false, "notes": "from SELECT query" }
174
- ],
175
- "relationships": [{ "description": "belongs to users via user_id" }],
176
- "indexes": [{ "description": "idx_leads_created_at (created_at DESC)" }]
177
- }
178
- ],
179
- "fieldMismatches": [
180
- { "description": "Code uses user.name but DB column is users.fullname" }
181
- ],
182
- "typeMismatches": [],
183
- "relationshipIssues": [],
184
- "dtoRecommendations": [
185
- {
186
- "tableName": "leads",
187
- "dtoName": "LeadDto",
188
- "fields": [
189
- { "type": "Guid", "name": "Id", "nullable": false, "comment": "PK" },
190
- { "type": "string", "name": "FullName", "nullable": false, "comment": "leads.fullname" }
191
- ]
192
- }
193
- ]
194
- }'
195
- ```
196
-
197
- **If template render is not available**, use **Write** tool to create the file directly
198
- following the structure above. The table and mismatch format is MANDATORY — without standard format
199
- it's not possible to generate contracts.cs mechanically.
200
-
201
- ### Step 3: Map Inconsistencies
202
-
203
- Create a map of:
204
-
205
- | Frontend/Code | Database | Type | Problem |
206
- |----------------|----------------|------|----------|
207
- | user.name | users.fullname | string | MISMATCH |
208
- | lead.phone | leads.phonenumber | string | MISMATCH |
209
- | order.metadata | orders.metadata | JSONB | Type complex |
210
-
211
- ### Step 4: Generate `schema-analysis.md`
212
-
213
- Use the template at `framework/templates/docs/schema-analysis.md`:
214
-
215
- ```bash
216
- npx morph-spec template render docs/schema-analysis \
217
- .morph/features/{feature-name}/1-design/schema-analysis.md \
218
- '{ "FEATURE_NAME": "{feature-name}", "DATE": "..." }'
219
- ```
220
-
221
- OR use **Write** tool to create directly with collected data.
222
-
223
- ### Step 5: Update State
224
-
225
- ```bash
226
- npx morph-spec state mark-output {feature-name} schema-analysis
227
- ```
228
-
229
- ---
230
-
231
- ## Outputs
232
-
233
- - `.morph/features/{feature}/1-design/schema-analysis.md`
234
- - State updated with `schemaAnalysis` output
235
-
236
- ## CHECKPOINT
237
-
238
- Before proceeding to contracts.cs, present results and ask for confirmation using `AskUserQuestion`:
239
-
240
- ```json
241
- {
242
- "questions": [
243
- {
244
- "header": "Schema Review",
245
- "question": "Schema analysis complete: {N} tables, {N} field mismatches, {N} type mismatches, {N} relationships. Is the analysis correct?",
246
- "multiSelect": false,
247
- "options": [
248
- { "label": "Correct", "description": "Schema analysis matches the real database" },
249
- { "label": "Has issues", "description": "I see problems — let me explain" }
250
- ]
251
- },
252
- {
253
- "header": "Contracts",
254
- "question": "May I generate contracts.cs based on this real schema?",
255
- "multiSelect": false,
256
- "options": [
257
- { "label": "Generate contracts", "description": "Proceed to contracts.cs using the analyzed schema" },
258
- { "label": "Wait", "description": "I want to review schema-analysis.md first" }
259
- ]
260
- }
261
- ]
262
- }
263
- ```
264
-
265
- **If "Has issues"** → ask what's wrong, fix schema-analysis.md, re-present checkpoint.
266
- **If "Correct" + "Generate contracts"** → proceed to contracts generation.
267
-
268
- ---
269
-
270
- *MORPH-SPEC by Polymorphism Tech*
1
+ ---
2
+ name: morph-phase-codebase-analysis
3
+ description: MORPH-SPEC Design sub-phase that analyzes existing codebase and database schema, producing schema-analysis.md with real column names, types, relationships, and field mismatches. Use at the start of Design phase before generating contracts.cs to prevent incorrect field names or types.
4
+ user-invocable: false
5
+ allowed-tools: Read, Write, Edit, Bash, Glob, Grep, AskUserQuestion
6
+ cliVersion: "4.10.8"
7
+ ---
8
+
9
+ # MORPH Codebase Analysis - Design Sub-phase
10
+
11
+ > INTERNAL: Automation skill for schema analysis step within Phase 2 (Design).
12
+ > Called by `phase-design.md` Step 2. Not a standalone user command.
13
+
14
+ Automates existing code analysis to generate `schema-analysis.md` with real database/code data.
15
+
16
+ ## Prerequisites
17
+
18
+ - [ ] Phase 1 (Setup) completed
19
+ - [ ] Feature has approved `proposal.md`
20
+ - [ ] Project context loaded (stack, agents)
21
+
22
+ ## Recommended Tools
23
+
24
+ > **Ref:** `framework/skills/level-0-meta/morph-tool-usage-guide/SKILL.md` for complete guide.
25
+ > **Ref:** `framework/standards/integration/mcp/mcp-tools.md` for MCP reference.
26
+
27
+ | Action | Tool | Alternative |
28
+ |------|------------|-------------|
29
+ | List database tables | **Supabase MCP** `list_tables()` | **Grep** `.from(` in code |
30
+ | Get table schema | **Supabase MCP** `get_table_schema()` | **Read** type definitions |
31
+ | Get FK relationships | **Supabase MCP** `get_relationships()` | **Grep** JOIN/FK patterns |
32
+ | Get RLS policies | **Supabase MCP** `query()` | **Read** policy files |
33
+ | Find queries in code | **Grep** `\.from\(` in `*.ts,*.tsx,*.js,*.cs` | — |
34
+ | Find type definitions | **Glob** `src/**/types/**/*.ts` or `**/Entities/**/*.cs` | — |
35
+ | Read found files | **Read** each file | — |
36
+ | Complex multi-file analysis | **Task** (subagent Explore) | Read individual |
37
+ | Generate schema-analysis.md | **Write** using template | **Bash** template render |
38
+
39
+ **MCPs for this phase:** Supabase (schema — **PRIORITY**), Generic database MCPs.
40
+
41
+ ---
42
+
43
+ ## Automated Workflow
44
+
45
+ ### Step 1: Detect Analysis Method
46
+
47
+ **IMPORTANT:** Do not assume the MCP is available and accessible.
48
+ Verify first with a test call before attempting to use it.
49
+
50
+ ```
51
+ 1. IF Supabase MCP configured in settings.json:
52
+ → Try mcp__supabase__list_tables() with implicit timeout
53
+ → IF returns valid data (array of tables with content):
54
+ → Use Method A (direct MCP)
55
+ → IF returns error, timeout, empty array, or inaccessible data:
56
+ → Log: "Supabase MCP configured but inaccessible (CloudSQL? Auth? Permissions?)"
57
+ → Use Method B (static code analysis)
58
+
59
+ 2. IF Database MCP (other) configured:
60
+ → Test connectivity with trivial query before using
61
+ → IF OK: Use adapted Method A
62
+ → IF fails: Use Method B
63
+
64
+ 3. IF no MCP available:
65
+ → Use Method B (static code analysis)
66
+ ```
67
+
68
+ **Signs of inaccessible MCP:**
69
+ - Empty response or `[]` from `list_tables()`
70
+ - Authentication error / permission denied
71
+ - Returned schema doesn't match code (e.g., tables exist in code but not in MCP)
72
+ - Project uses database other than Supabase (CloudSQL, RDS, Azure SQL, etc.)
73
+
74
+ ### Step 2A: MCP Method (Preferred)
75
+
76
+ **Tools:** Supabase MCP
77
+
78
+ ```javascript
79
+ // 1. List all tables
80
+ const tables = await mcp__supabase__list_tables();
81
+
82
+ // 2. For each feature-relevant table:
83
+ for (const table of relevantTables) {
84
+ // 2a. Complete schema
85
+ const schema = await mcp__supabase__get_table_schema({ table: table.name });
86
+ // → column_name, data_type, is_nullable, column_default
87
+
88
+ // 2b. Relationships
89
+ const rels = await mcp__supabase__get_relationships({ table: table.name });
90
+ // → foreign_table, foreign_column, constraint_type
91
+
92
+ // 2c. Indexes
93
+ const indexes = await mcp__supabase__query({
94
+ query: `SELECT indexname, indexdef FROM pg_indexes WHERE tablename = '${table.name}'`
95
+ });
96
+
97
+ // 2d. RLS policies (security)
98
+ const policies = await mcp__supabase__query({
99
+ query: `SELECT policyname, cmd, qual FROM pg_policies WHERE tablename = '${table.name}'`
100
+ });
101
+ }
102
+ ```
103
+
104
+ ### Step 2B: Static Analysis Method (Fallback)
105
+
106
+ **Tools:** Grep, Glob, Read, Task (subagent for large projects)
107
+
108
+ **Phase B1: Find Queries**
109
+
110
+ ```
111
+ Grep: "\.from\(|\.select\(|SELECT |supabase\.|context\.|dbContext\.|DbSet<"
112
+ Type: ts,tsx,js,jsx,cs
113
+ Output: files_with_matches
114
+ ```
115
+
116
+ **Phase B2: Read Query Files**
117
+
118
+ For each found file, use **Read** to extract:
119
+ - Table names: `from('leads')`, `DbSet<Lead>`, `FROM leads`
120
+ - Column names: `.select('fullname, phonenumber')`, `l.FullName`
121
+ - Data types: TypeScript interfaces, C# DTOs
122
+ - Relationships: JOIN clauses, navigation properties
123
+
124
+ **Phase B3: Find Type Definitions**
125
+
126
+ ```
127
+ # TypeScript/JavaScript:
128
+ Glob: "src/**/types/**/*.ts"
129
+ Glob: "src/**/*.d.ts"
130
+ Glob: "src/**/interfaces/*.ts"
131
+
132
+ # .NET:
133
+ Glob: "**/*Dto.cs"
134
+ Glob: "**/Entities/**/*.cs"
135
+ Glob: "**/Models/**/*.cs"
136
+ ```
137
+
138
+ **Phase B4: When to use Task (subagent)**
139
+
140
+ Use Task subagent **ONLY** when:
141
+ - Project has 20+ query files
142
+ - Multiple data access patterns (Supabase + EF Core + raw SQL)
143
+ - Precise cross-context analysis across many files
144
+
145
+ Do not use Task subagent when:
146
+ - Project has < 10 query files (direct Read is faster)
147
+ - Data access pattern is uniform (only Supabase OR only EF Core)
148
+
149
+ ### Step 2B-Format: Standardized Format for Static Analysis
150
+
151
+ **IMPORTANT:** When using Method B (static analysis), **always use the official template**.
152
+ This ensures `contracts.cs` can be generated mechanically, without manual interpretation.
153
+
154
+ The template is at `framework/templates/docs/schema-analysis.md`. Use it via:
155
+
156
+ ```bash
157
+ npx morph-spec template render docs/schema-analysis \
158
+ .morph/features/{feature}/1-design/schema-analysis.md \
159
+ '{
160
+ "FEATURE_NAME": "{feature}",
161
+ "FEATURE_NAME_TITLE": "{Feature Display Name}",
162
+ "DATE": "YYYY-MM-DD",
163
+ "AUTHOR": "Claude Code (Sonnet 4.6)",
164
+ "method": "Static Code Analysis",
165
+ "mcpUsed": "No",
166
+ "tableCount": N,
167
+ "fileCount": N,
168
+ "tables": [
169
+ {
170
+ "name": "table_name",
171
+ "codeSource": "path/to/file.ts",
172
+ "columns": [
173
+ { "name": "column_name", "type": "string", "nullable": false, "notes": "from SELECT query" }
174
+ ],
175
+ "relationships": [{ "description": "belongs to users via user_id" }],
176
+ "indexes": [{ "description": "idx_leads_created_at (created_at DESC)" }]
177
+ }
178
+ ],
179
+ "fieldMismatches": [
180
+ { "description": "Code uses user.name but DB column is users.fullname" }
181
+ ],
182
+ "typeMismatches": [],
183
+ "relationshipIssues": [],
184
+ "dtoRecommendations": [
185
+ {
186
+ "tableName": "leads",
187
+ "dtoName": "LeadDto",
188
+ "fields": [
189
+ { "type": "Guid", "name": "Id", "nullable": false, "comment": "PK" },
190
+ { "type": "string", "name": "FullName", "nullable": false, "comment": "leads.fullname" }
191
+ ]
192
+ }
193
+ ]
194
+ }'
195
+ ```
196
+
197
+ **If template render is not available**, use **Write** tool to create the file directly
198
+ following the structure above. The table and mismatch format is MANDATORY — without standard format
199
+ it's not possible to generate contracts.cs mechanically.
200
+
201
+ ### Step 3: Map Inconsistencies
202
+
203
+ Create a map of:
204
+
205
+ | Frontend/Code | Database | Type | Problem |
206
+ |----------------|----------------|------|----------|
207
+ | user.name | users.fullname | string | MISMATCH |
208
+ | lead.phone | leads.phonenumber | string | MISMATCH |
209
+ | order.metadata | orders.metadata | JSONB | Type complex |
210
+
211
+ ### Step 4: Generate `schema-analysis.md`
212
+
213
+ Use the template at `framework/templates/docs/schema-analysis.md`:
214
+
215
+ ```bash
216
+ npx morph-spec template render docs/schema-analysis \
217
+ .morph/features/{feature-name}/1-design/schema-analysis.md \
218
+ '{ "FEATURE_NAME": "{feature-name}", "DATE": "..." }'
219
+ ```
220
+
221
+ OR use **Write** tool to create directly with collected data.
222
+
223
+ ### Step 5: Update State
224
+
225
+ ```bash
226
+ npx morph-spec state mark-output {feature-name} schema-analysis
227
+ ```
228
+
229
+ ---
230
+
231
+ ## Outputs
232
+
233
+ - `.morph/features/{feature}/1-design/schema-analysis.md`
234
+ - State updated with `schemaAnalysis` output
235
+
236
+ ## CHECKPOINT
237
+
238
+ Before proceeding to contracts.cs, present results and ask for confirmation using `AskUserQuestion`:
239
+
240
+ ```json
241
+ {
242
+ "questions": [
243
+ {
244
+ "header": "Schema Review",
245
+ "question": "Schema analysis complete: {N} tables, {N} field mismatches, {N} type mismatches, {N} relationships. Is the analysis correct?",
246
+ "multiSelect": false,
247
+ "options": [
248
+ { "label": "Correct", "description": "Schema analysis matches the real database" },
249
+ { "label": "Has issues", "description": "I see problems — let me explain" }
250
+ ]
251
+ },
252
+ {
253
+ "header": "Contracts",
254
+ "question": "May I generate contracts.cs based on this real schema?",
255
+ "multiSelect": false,
256
+ "options": [
257
+ { "label": "Generate contracts", "description": "Proceed to contracts.cs using the analyzed schema" },
258
+ { "label": "Wait", "description": "I want to review schema-analysis.md first" }
259
+ ]
260
+ }
261
+ ]
262
+ }
263
+ ```
264
+
265
+ **If "Has issues"** → ask what's wrong, fix schema-analysis.md, re-present checkpoint.
266
+ **If "Correct" + "Generate contracts"** → proceed to contracts generation.
267
+
268
+ ---
269
+
270
+ *MORPH-SPEC by Polymorphism Tech*