@atlashub/smartstack-cli 3.36.0 → 3.38.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.
Files changed (219) hide show
  1. package/dist/index.js +16 -24
  2. package/dist/index.js.map +1 -1
  3. package/dist/mcp-entry.mjs +201 -256
  4. package/dist/mcp-entry.mjs.map +1 -1
  5. package/package.json +3 -2
  6. package/scripts/extract-api-endpoints.ts +325 -0
  7. package/scripts/extract-business-rules.ts +440 -0
  8. package/scripts/generate-doc-with-mock-ui.ts +804 -0
  9. package/scripts/health-check.sh +168 -0
  10. package/scripts/postinstall.js +18 -0
  11. package/templates/agents/ba-reader.md +9 -9
  12. package/templates/agents/ba-writer.md +12 -15
  13. package/templates/agents/code-reviewer.md +1 -1
  14. package/templates/agents/docs-context-reader.md +1 -1
  15. package/templates/agents/gitflow/merge.md +0 -4
  16. package/templates/agents/gitflow/pr.md +0 -4
  17. package/templates/agents/gitflow/start.md +30 -5
  18. package/templates/mcp-scaffolding/frontend/nav-routes.ts.hbs +20 -20
  19. package/templates/mcp-scaffolding/frontend/routes.tsx.hbs +16 -24
  20. package/templates/mcp-scaffolding/migrations/seed-roles.cs.hbs +2 -2
  21. package/templates/skills/_resources/mcp-validate-documentation-spec.md +3 -3
  22. package/templates/skills/_shared.md +15 -17
  23. package/templates/skills/ai-prompt/SKILL.md +1 -1
  24. package/templates/skills/ai-prompt/steps/step-00-init.md +47 -0
  25. package/templates/skills/apex/SKILL.md +3 -4
  26. package/templates/skills/apex/_shared.md +10 -20
  27. package/templates/skills/apex/references/analysis-methods.md +141 -0
  28. package/templates/skills/apex/references/challenge-questions.md +1 -21
  29. package/templates/skills/apex/references/core-seed-data.md +35 -57
  30. package/templates/skills/apex/references/examine-build-validation.md +87 -0
  31. package/templates/skills/apex/references/execution-frontend-gates.md +177 -0
  32. package/templates/skills/apex/references/execution-frontend-patterns.md +105 -0
  33. package/templates/skills/apex/references/execution-layer1-rules.md +96 -0
  34. package/templates/skills/apex/references/initialization-challenge-flow.md +110 -0
  35. package/templates/skills/apex/references/planning-layer-mapping.md +151 -0
  36. package/templates/skills/apex/references/post-checks.md +145 -40
  37. package/templates/skills/apex/references/smartstack-api.md +35 -51
  38. package/templates/skills/apex/references/smartstack-frontend.md +17 -17
  39. package/templates/skills/apex/references/smartstack-layers.md +38 -62
  40. package/templates/skills/apex/steps/step-00-init.md +14 -26
  41. package/templates/skills/apex/steps/step-01-analyze.md +10 -143
  42. package/templates/skills/apex/steps/step-02-plan.md +10 -92
  43. package/templates/skills/apex/steps/step-03-execute.md +47 -249
  44. package/templates/skills/apex/steps/step-04-examine.md +14 -78
  45. package/templates/skills/apex/steps/step-05-deep-review.md +2 -2
  46. package/templates/skills/apex/steps/step-08-run-tests.md +2 -0
  47. package/templates/skills/application/SKILL.md +6 -7
  48. package/templates/skills/application/references/backend-controller-hierarchy.md +16 -16
  49. package/templates/skills/application/references/backend-seeding-and-dto-output.md +83 -0
  50. package/templates/skills/application/references/backend-table-prefix-mapping.md +79 -0
  51. package/templates/skills/application/references/backend-verification.md +1 -1
  52. package/templates/skills/application/references/frontend-i18n-and-output.md +67 -0
  53. package/templates/skills/application/references/frontend-route-naming.md +117 -0
  54. package/templates/skills/application/references/frontend-route-wiring-app-tsx.md +107 -0
  55. package/templates/skills/application/references/frontend-verification.md +12 -12
  56. package/templates/skills/application/references/init-parameter-detection.md +120 -0
  57. package/templates/skills/application/references/migration-checklist-troubleshooting.md +100 -0
  58. package/templates/skills/application/references/nav-fallback-procedure.md +5 -6
  59. package/templates/skills/application/references/provider-template.md +2 -6
  60. package/templates/skills/application/references/roles-client-project-handling.md +55 -0
  61. package/templates/skills/application/references/roles-fallback-procedure.md +149 -0
  62. package/templates/skills/application/references/test-coverage-requirements.md +213 -0
  63. package/templates/skills/application/references/test-frontend.md +3 -3
  64. package/templates/skills/application/steps/step-00-init.md +11 -141
  65. package/templates/skills/application/steps/step-01-navigation.md +3 -3
  66. package/templates/skills/application/steps/step-02-permissions.md +4 -4
  67. package/templates/skills/application/steps/step-03-roles.md +18 -175
  68. package/templates/skills/application/steps/step-03b-provider.md +1 -2
  69. package/templates/skills/application/steps/step-04-backend.md +19 -110
  70. package/templates/skills/application/steps/step-05-frontend.md +17 -143
  71. package/templates/skills/application/steps/step-06-migration.md +12 -60
  72. package/templates/skills/application/steps/step-07-tests.md +9 -76
  73. package/templates/skills/application/templates-backend.md +29 -27
  74. package/templates/skills/application/templates-frontend.md +48 -48
  75. package/templates/skills/application/templates-seed.md +57 -131
  76. package/templates/skills/business-analyse/SKILL.md +27 -30
  77. package/templates/skills/business-analyse/_architecture.md +6 -6
  78. package/templates/skills/business-analyse/_shared.md +60 -88
  79. package/templates/skills/business-analyse/questionnaire/04-data.md +3 -3
  80. package/templates/skills/business-analyse/questionnaire/06-security.md +1 -1
  81. package/templates/skills/business-analyse/questionnaire/13-cross-module.md +1 -1
  82. package/templates/skills/business-analyse/react/application-viewer.md +12 -12
  83. package/templates/skills/business-analyse/react/components.md +8 -12
  84. package/templates/skills/business-analyse/react/schema.md +11 -11
  85. package/templates/skills/business-analyse/references/agent-module-prompt.md +2 -3
  86. package/templates/skills/business-analyse/references/analysis-semantic-checks.md +190 -0
  87. package/templates/skills/business-analyse/references/cache-warming-strategy.md +2 -2
  88. package/templates/skills/business-analyse/references/cadrage-challenge-patterns.md +41 -0
  89. package/templates/skills/business-analyse/references/cadrage-coverage-matrix.md +74 -0
  90. package/templates/skills/business-analyse/references/cadrage-shared-modules.md +69 -0
  91. package/templates/skills/business-analyse/references/cadrage-structure-cards.md +1 -1
  92. package/templates/skills/business-analyse/references/compilation-structure-cards.md +297 -0
  93. package/templates/skills/business-analyse/references/consolidation-structural-checks.md +2 -2
  94. package/templates/skills/business-analyse/references/deploy-modes.md +5 -5
  95. package/templates/skills/business-analyse/references/detection-strategies.md +7 -7
  96. package/templates/skills/business-analyse/references/handoff-file-templates.md +14 -22
  97. package/templates/skills/business-analyse/references/handoff-mappings.md +4 -4
  98. package/templates/skills/business-analyse/references/handoff-seeddata-generation.md +312 -0
  99. package/templates/skills/business-analyse/references/init-schema-deployment.md +3 -3
  100. package/templates/skills/business-analyse/references/naming-conventions.md +22 -24
  101. package/templates/skills/business-analyse/references/prd-generation.md +2 -2
  102. package/templates/skills/business-analyse/references/review-data-mapping.md +2 -2
  103. package/templates/skills/business-analyse/references/robustness-checks.md +1 -1
  104. package/templates/skills/business-analyse/references/spec-auto-inference.md +3 -3
  105. package/templates/skills/business-analyse/references/team-orchestration.md +49 -6
  106. package/templates/skills/business-analyse/references/ui-dashboard-spec.md +1 -1
  107. package/templates/skills/business-analyse/references/ui-resource-cards.md +18 -18
  108. package/templates/skills/business-analyse/references/validate-incremental-html.md +2 -2
  109. package/templates/skills/business-analyse/references/validation-checklist.md +2 -2
  110. package/templates/skills/business-analyse/schemas/application-schema.json +4 -5
  111. package/templates/skills/business-analyse/schemas/project-schema.json +1 -6
  112. package/templates/skills/business-analyse/schemas/sections/metadata-schema.json +2 -3
  113. package/templates/skills/business-analyse/schemas/sections/specification-schema.json +4 -4
  114. package/templates/skills/business-analyse/steps/step-00-init.md +8 -17
  115. package/templates/skills/business-analyse/steps/step-01-cadrage.md +35 -198
  116. package/templates/skills/business-analyse/steps/step-01b-applications.md +16 -20
  117. package/templates/skills/business-analyse/steps/step-02-decomposition.md +1 -1
  118. package/templates/skills/business-analyse/steps/step-03a1-setup.md +4 -4
  119. package/templates/skills/business-analyse/steps/step-03a2-analysis.md +1 -1
  120. package/templates/skills/business-analyse/steps/step-03b-ui.md +4 -4
  121. package/templates/skills/business-analyse/steps/step-03c-compile.md +66 -140
  122. package/templates/skills/business-analyse/steps/step-03d-validate.md +2 -2
  123. package/templates/skills/business-analyse/steps/step-04a-collect.md +2 -2
  124. package/templates/skills/business-analyse/steps/step-04b-analyze.md +42 -160
  125. package/templates/skills/business-analyse/steps/step-04c-decide.md +1 -1
  126. package/templates/skills/business-analyse/steps/step-05a-handoff.md +74 -104
  127. package/templates/skills/business-analyse/steps/step-05b-deploy.md +13 -11
  128. package/templates/skills/business-analyse/steps/step-06-review.md +3 -3
  129. package/templates/skills/business-analyse/templates/tpl-frd.md +13 -13
  130. package/templates/skills/business-analyse/templates/tpl-handoff.md +12 -12
  131. package/templates/skills/business-analyse/templates-frd.md +25 -25
  132. package/templates/skills/business-analyse/templates-react.md +15 -21
  133. package/templates/skills/controller/SKILL.md +1 -1
  134. package/templates/skills/controller/postman-templates.md +1 -1
  135. package/templates/skills/controller/references/controller-code-templates.md +2 -2
  136. package/templates/skills/controller/references/mcp-scaffold-workflow.md +209 -0
  137. package/templates/skills/controller/references/permission-sync-templates.md +13 -16
  138. package/templates/skills/controller/steps/step-00-init.md +11 -11
  139. package/templates/skills/controller/steps/step-03-generate.md +64 -103
  140. package/templates/skills/controller/templates.md +67 -71
  141. package/templates/skills/debug/SKILL.md +13 -218
  142. package/templates/skills/debug/steps/step-00-init.md +57 -0
  143. package/templates/skills/debug/steps/step-01-analyze.md +219 -0
  144. package/templates/skills/debug/steps/step-02-resolve.md +85 -0
  145. package/templates/skills/documentation/SKILL.md +49 -345
  146. package/templates/skills/documentation/data-schema.md +11 -8
  147. package/templates/skills/documentation/steps/step-00-init.md +70 -0
  148. package/templates/skills/documentation/steps/step-01-scan.md +113 -0
  149. package/templates/skills/documentation/steps/step-02-generate.md +231 -0
  150. package/templates/skills/documentation/steps/step-03-validate.md +238 -0
  151. package/templates/skills/documentation/templates.md +480 -322
  152. package/templates/skills/efcore/references/both-contexts.md +32 -0
  153. package/templates/skills/efcore/references/database-operations.md +67 -0
  154. package/templates/skills/efcore/references/destructive-operations.md +38 -0
  155. package/templates/skills/efcore/references/reset-operations.md +81 -0
  156. package/templates/skills/efcore/references/seed-methods.md +86 -0
  157. package/templates/skills/efcore/references/shared-init-functions.md +250 -0
  158. package/templates/skills/efcore/references/sql-objects-injection.md +61 -0
  159. package/templates/skills/efcore/references/troubleshooting.md +81 -0
  160. package/templates/skills/efcore/steps/db/step-deploy.md +1 -32
  161. package/templates/skills/efcore/steps/db/step-reset.md +7 -103
  162. package/templates/skills/efcore/steps/db/step-seed.md +10 -132
  163. package/templates/skills/efcore/steps/db/step-status.md +5 -44
  164. package/templates/skills/efcore/steps/migration/step-03-validate.md +8 -62
  165. package/templates/skills/efcore/steps/rebase-snapshot/step-03-create.md +1 -57
  166. package/templates/skills/efcore/steps/shared/step-00-init.md +11 -254
  167. package/templates/skills/efcore/steps/squash/step-03-create.md +1 -58
  168. package/templates/skills/feature-full/SKILL.md +1 -1
  169. package/templates/skills/feature-full/steps/step-00-init.md +57 -0
  170. package/templates/skills/feature-full/steps/step-01-implementation.md +1 -1
  171. package/templates/skills/gitflow/SKILL.md +1 -1
  172. package/templates/skills/gitflow/_shared.md +23 -0
  173. package/templates/skills/gitflow/references/commit-message-generation.md +58 -0
  174. package/templates/skills/gitflow/references/commit-migration-validation.md +49 -0
  175. package/templates/skills/gitflow/references/finish-cleanup.md +51 -0
  176. package/templates/skills/gitflow/references/finish-version-bumping.md +45 -0
  177. package/templates/skills/gitflow/references/init-environment-detection.md +41 -0
  178. package/templates/skills/gitflow/references/init-questions.md +185 -0
  179. package/templates/skills/gitflow/references/init-structure-creation.md +71 -0
  180. package/templates/skills/gitflow/references/init-version-detection.md +21 -0
  181. package/templates/skills/gitflow/references/init-workspace-detection.md +43 -0
  182. package/templates/skills/gitflow/references/merge-ci-status.md +36 -0
  183. package/templates/skills/gitflow/references/merge-execution.md +62 -0
  184. package/templates/skills/gitflow/references/merge-pr-context.md +76 -0
  185. package/templates/skills/gitflow/references/pr-build-checks.md +60 -0
  186. package/templates/skills/gitflow/references/pr-generation.md +58 -0
  187. package/templates/skills/gitflow/references/start-branch-normalization.md +28 -0
  188. package/templates/skills/gitflow/references/start-worktree-creation.md +50 -0
  189. package/templates/skills/gitflow/references/sync-push-verify.md +44 -0
  190. package/templates/skills/gitflow/references/sync-rebase-conflicts.md +38 -0
  191. package/templates/skills/gitflow/steps/step-commit.md +12 -91
  192. package/templates/skills/gitflow/steps/step-finish.md +15 -159
  193. package/templates/skills/gitflow/steps/step-init.md +24 -326
  194. package/templates/skills/gitflow/steps/step-merge.md +17 -176
  195. package/templates/skills/gitflow/steps/step-pr.md +10 -116
  196. package/templates/skills/gitflow/steps/step-start.md +16 -109
  197. package/templates/skills/gitflow/steps/step-sync.md +6 -69
  198. package/templates/skills/ralph-loop/SKILL.md +6 -0
  199. package/templates/skills/ralph-loop/references/category-completeness.md +185 -0
  200. package/templates/skills/ralph-loop/references/compact-loop.md +1 -1
  201. package/templates/skills/ralph-loop/references/init-resume-recovery.md +127 -0
  202. package/templates/skills/ralph-loop/references/module-transition.md +151 -0
  203. package/templates/skills/ralph-loop/references/multi-module-queue.md +171 -0
  204. package/templates/skills/ralph-loop/references/parallel-execution.md +246 -0
  205. package/templates/skills/ralph-loop/references/task-transform-legacy.md +6 -9
  206. package/templates/skills/ralph-loop/references/team-orchestration.md +45 -3
  207. package/templates/skills/ralph-loop/steps/step-00-init.md +36 -109
  208. package/templates/skills/ralph-loop/steps/step-01-task.md +15 -163
  209. package/templates/skills/ralph-loop/steps/step-02-execute.md +8 -154
  210. package/templates/skills/ralph-loop/steps/step-04-check.md +21 -73
  211. package/templates/skills/review-code/references/owasp-api-top10.md +5 -5
  212. package/templates/skills/review-code/references/smartstack-conventions.md +11 -11
  213. package/templates/skills/validate-feature/references/api-smoke-tests.md +140 -0
  214. package/templates/skills/validate-feature/references/db-validation-checks.md +180 -0
  215. package/templates/skills/validate-feature/steps/step-01-compile.md +5 -2
  216. package/templates/skills/validate-feature/steps/step-04-api-smoke.md +34 -145
  217. package/templates/skills/validate-feature/steps/step-05-db-validation.md +74 -260
  218. package/templates/skills/workflow/SKILL.md +1 -1
  219. package/templates/skills/workflow/steps/step-00-init.md +57 -0
@@ -54,160 +54,14 @@ writeJSON('.ralph/prd.json', prd);
54
54
 
55
55
  #### 3a. Parallel Mode (if `-p` flag)
56
56
 
57
- **IF `{parallel_mode}` == true:**
58
-
59
- ##### Phase 0: Foundation (Ralph sequential)
60
-
61
- ```javascript
62
- // Collect ALL entities from ALL modules
63
- const allEntities = [];
64
- const allModules = [];
65
- for (const prdFile of glob('.ralph/prd-*.json')) {
66
- const modulePrd = readJSON(prdFile);
67
- const moduleEntities = modulePrd.tasks
68
- .filter(t => t.category === 'domain')
69
- .map(t => extractEntityName(t.description));
70
- allEntities.push(...moduleEntities);
71
- allModules.push({
72
- code: modulePrd.project.module,
73
- application: modulePrd.project.application,
74
- prdFile: prdFile,
75
- entityCount: moduleEntities.length
76
- });
77
- }
78
-
79
- console.log(`PARALLEL MODE: Phase 0 — Foundation`);
80
- console.log(` Generating ${allEntities.length} entities from ${allModules.length} modules`);
81
- console.log(` Entities: ${allEntities.join(', ')}`);
82
-
83
- // Ralph generates ALL entities via apex foundation mode
84
- // INVOKE: /apex --foundation -d .ralph/prd.json
85
- //
86
- // Apex will:
87
- // - Generate ALL entity classes
88
- // - Generate ALL EF configurations
89
- // - Register ALL DbSets in DbContext
90
- // - Create ONE migration with all entities
91
- // - Skip services/controllers/frontend/tests
92
-
93
- console.log(`Phase 0 completed. ModelSnapshot contains ${allEntities.length} entities.`);
94
- console.log(`Committing foundation...`);
95
-
96
- // Git commit
97
- // bash: git add . && git commit -m "chore(foundation): entities for all modules"
98
- ```
99
-
100
- ##### Phase 1-N: Spawn Teammates (parallel)
101
-
102
- ```javascript
103
- // Determine granularity: 1 teammate per APPLICATION or per MODULE
104
- const teammates = [];
105
- const applicationsMap = {}; // group modules by application
106
-
107
- for (const mod of allModules) {
108
- if (!applicationsMap[mod.application]) {
109
- applicationsMap[mod.application] = [];
110
- }
111
- applicationsMap[mod.application].push(mod);
112
- }
113
-
114
- for (const [appName, modules] of Object.entries(applicationsMap)) {
115
- if (modules.length <= 3) {
116
- // 1 teammate per APPLICATION
117
- teammates.push({
118
- name: `apex-${kebabCase(appName)}`,
119
- application: appName,
120
- modules: modules.map(m => m.code),
121
- prdFiles: modules.map(m => m.prdFile)
122
- });
123
- } else {
124
- // Application has >3 modules → 1 teammate per MODULE
125
- for (const mod of modules) {
126
- teammates.push({
127
- name: `apex-${kebabCase(appName)}-${kebabCase(mod.code)}`,
128
- application: appName,
129
- modules: [mod.code],
130
- prdFiles: [mod.prdFile]
131
- });
132
- }
133
- }
134
- }
57
+ See `references/parallel-execution.md` for complete parallel protocol:
135
58
 
136
- console.log(`Spawning ${teammates.length} teammates:`);
137
- for (const t of teammates) {
138
- console.log(` - ${t.name}: ${t.modules.join(', ')}`);
139
- }
140
-
141
- // Create team
142
- TeamCreate({
143
- team_name: `smartstack-${kebabCase(prd.project.name || 'project')}`,
144
- description: `Parallel development for ${teammates.length} modules`
145
- });
146
-
147
- // Spawn teammates
148
- for (const teammate of teammates) {
149
- Task({
150
- subagent_type: "apex",
151
- name: teammate.name,
152
- team_name: `smartstack-${kebabCase(prd.project.name || 'project')}`,
153
- prompt: `
154
- You are teammate ${teammate.name}.
155
-
156
- CONTEXT:
157
- - Application: ${teammate.application}
158
- - Modules: ${teammate.modules.join(', ')}
159
- - PRD files: ${teammate.prdFiles.join(', ')}
160
-
161
- ENTITIES ALREADY EXIST (Phase 0 completed by Ralph):
162
- All entity classes, EF configurations, and migrations are already created.
163
- The ModelSnapshot is complete and the database is ready.
164
-
165
- YOUR TASK:
166
- For each module, generate:
167
- - Services (Application layer)
168
- - Controllers (API layer)
169
- - Seed data (Navigation + Permissions + Business data)
170
- - Frontend (Pages + Routes + i18n for all 4 languages)
171
- - Tests (Unit + Integration)
172
-
173
- DO NOT:
174
- - Create new entities (already done)
175
- - Create migrations (ModelSnapshot already complete)
176
-
177
- EXECUTE:
178
- For each PRD file: invoke /apex -d {prdFile}
179
- Apex will see existing entities and skip domain/infrastructure layers.
180
-
181
- When done, send a message to team lead with results.
182
- `
183
- });
184
- }
185
-
186
- // Ralph waits for teammates to complete
187
- // Each teammate will send a message when done
188
- // Ralph collects results and proceeds to validation
189
- ```
190
-
191
- ##### Collect Results
192
-
193
- ```javascript
194
- // Wait for all teammates to send completion messages
195
- // Ralph receives SendMessage from each teammate with status
196
-
197
- const teammateResults = []; // populated from teammate messages
198
-
199
- console.log(`All teammates completed:`);
200
- for (const result of teammateResults) {
201
- console.log(` - ${result.name}: ${result.status}`);
202
- }
203
-
204
- // Cleanup team
205
- TeamDelete();
206
-
207
- // Proceed to step-03 for global validation
208
- ```
59
+ **IF `{parallel_mode}` == true:**
209
60
 
210
- > See `references/team-orchestration.md` for full parallel execution protocol.
61
+ 1. Phase 0 (Ralph sequential): Generate ALL entities from ALL modules + ONE migration
62
+ 2. Phase 1-N (Teams parallel): Spawn teammates per application/module for services/controllers/frontend/tests
63
+ 3. Collect results from teammates
64
+ 4. Cleanup team, proceed to step-03
211
65
 
212
66
  **ELSE (not parallel mode):**
213
67
 
@@ -230,7 +84,7 @@ if (prd._sectionSplit?.enabled) {
230
84
  );
231
85
 
232
86
  if (!depsOk) {
233
- console.warn(`Phase ${nextPhase.phase} blocked by incomplete dependencies`);
87
+ console.warn(`Phase ${nextPhase.phase} blocked dependencies incomplete`);
234
88
  goto STEP_04;
235
89
  }
236
90
 
@@ -261,7 +115,7 @@ if (prd._sectionSplit?.enabled) {
261
115
 
262
116
  This delegates ALL remaining tasks for the current module to apex:
263
117
 
264
- - Apex reads the PRD, extracts context (`context_code`, `app_name`, `module_code`, `entities`, `sections`)
118
+ - Apex reads the PRD, extracts context (`app_name`, `module_code`, `entities`, `sections`)
265
119
  - Apex executes ALL layers: domain → infrastructure → migration → application → api → seed data → frontend → tests
266
120
  - Apex runs full POST-CHECKs (50 checks from `references/post-checks.md`)
267
121
  - Apex commits per layer (atomic commits)
@@ -33,7 +33,10 @@ const allDone = (tasksCompleted + tasksSkipped) === tasksTotal;
33
33
  ```bash
34
34
  # Quick build check (quiet mode)
35
35
  dotnet build --no-restore --verbosity quiet
36
- if [ $? -ne 0 ]; then
36
+ BUILD_RC=$?
37
+ # Cleanup WSL Roslyn artifacts (literal bin\Debug folders)
38
+ for d in src/*/bin?Debug bin?Debug; do [ -d "$d" ] && rm -rf "$d"; done
39
+ if [ $BUILD_RC -ne 0 ]; then
37
40
  echo "BUILD REGRESSION detected between apex invocations"
38
41
  # Inject fix task — apex will handle the actual fix
39
42
  prd.tasks.push({ id: maxId+1, description: "Fix build regression",
@@ -45,51 +48,18 @@ fi
45
48
 
46
49
  ### 1.7. Category Completeness Check (RUNS EVERY ITERATION)
47
50
 
48
- > **CRITICAL:** This check runs REGARDLESS of allDone status.
49
- > In test-v4-005, allDone was never true (PRD status not updated), so the
50
- > module completeness check in section 3b never triggered, and missing
51
- > frontend/test categories were never detected.
51
+ See `references/category-completeness.md` for detailed implementation.
52
52
 
53
53
  ```javascript
54
- const presentCategories = new Set(prd.tasks.map(t => t.category));
55
- const REQUIRED_CATEGORIES = ['domain', 'infrastructure', 'application', 'api', 'seedData', 'frontend', 'test'];
56
- const missingFromPrd = REQUIRED_CATEGORIES.filter(c => !presentCategories.has(c));
57
-
58
- if (missingFromPrd.length > 0) {
59
- console.warn(`PRD MISSING CATEGORIES: ${missingFromPrd.join(', ')}`);
60
-
61
- // Inject guardrail tasks for missing categories
62
- let maxIdNum = Math.max(...prd.tasks.map(t => parseInt(t.id.replace(/[^0-9]/g, ''), 10) || 0));
63
- const prefix = prd.tasks[0]?.id?.replace(/[0-9]+$/, '') || 'GUARD-';
64
- const lastApiTask = prd.tasks.filter(t => t.category === 'api').pop()?.id;
65
- const lastSeedDataTask = prd.tasks.filter(t => t.category === 'seedData').pop()?.id;
66
-
67
- for (const cat of missingFromPrd) {
68
- maxIdNum++;
69
- const taskId = `${prefix}${String(maxIdNum).padStart(3, '0')}`;
70
- prd.tasks.push({
71
- id: taskId,
72
- description: `[GUARDRAIL] Generate missing ${cat} layer for ${prd.project?.module || 'module'}`,
73
- status: 'pending', category: cat,
74
- dependencies: lastSeedDataTask ? [lastSeedDataTask] : (lastApiTask ? [lastApiTask] : []),
75
- acceptance_criteria: [
76
- cat === 'frontend' ? 'React pages + routes wired to App.tsx' :
77
- cat === 'test' ? 'Unit + integration tests passing' :
78
- `${cat} layer complete`
79
- ],
80
- started_at: null, completed_at: null, iteration: null,
81
- commit_hash: null, files_changed: [], validation: null, error: null
82
- });
83
- console.log(` Injected [${taskId}] ${cat} guardrail`);
84
- }
85
- writeJSON('.ralph/prd.json', prd);
54
+ const { missing, guardrailsNeeded } = checkCategoryCompleteness(prd);
86
55
 
87
- // Re-count after injection
88
- const newPending = prd.tasks.filter(t => t.status === 'pending').length;
89
- console.log(`PRD updated: +${missingFromPrd.length} guardrails, ${newPending} pending tasks`);
56
+ if (guardrailsNeeded.length > 0) {
57
+ prd.tasks.push(...guardrailsNeeded);
58
+ writeJSON('.ralph/prd.json', prd);
59
+ console.log(`PRD updated: +${guardrailsNeeded.length} guardrails, ${prd.tasks.filter(t => t.status === 'pending').length} pending tasks`);
90
60
  }
91
61
 
92
- // Also check: artifact existence for categories with completed tasks
62
+ // Artifact verification (check if completed tasks have files)
93
63
  const completedCats = new Set(prd.tasks.filter(t => t.status === 'completed').map(t => t.category));
94
64
  const artifactChecks = {
95
65
  'frontend': () => glob.sync('**/src/pages/**/*.tsx').length > 0,
@@ -98,9 +68,13 @@ const artifactChecks = {
98
68
  };
99
69
  for (const [cat, check] of Object.entries(artifactChecks)) {
100
70
  if (completedCats.has(cat) && !check()) {
101
- console.warn(`ARTIFACT MISSING: ${cat} tasks marked completed but no files found — resetting`);
71
+ console.warn(`ARTIFACT MISSING: ${cat} tasks marked completed but no files found — resetting to pending`);
102
72
  prd.tasks.filter(t => t.category === cat && t.status === 'completed')
103
- .forEach(t => { t.status = 'pending'; t.error = 'Artifacts missing — re-execute'; t.completed_at = null; });
73
+ .forEach(t => {
74
+ t.status = 'pending';
75
+ t.error = 'Artifacts missing — re-execute';
76
+ t.completed_at = null;
77
+ });
104
78
  writeJSON('.ralph/prd.json', prd);
105
79
  }
106
80
  }
@@ -141,6 +115,8 @@ if ({team_active}) {
141
115
 
142
116
  ### 3b. Sequential Multi-Module (modules-queue.json)
143
117
 
118
+ See `references/module-transition.md` for complete module advancement protocol.
119
+
144
120
  ```javascript
145
121
  const queuePath = '.ralph/modules-queue.json';
146
122
  if (fileExists(queuePath)) {
@@ -156,36 +132,8 @@ if (fileExists(queuePath)) {
156
132
  console.log(`Module ${currentModule.code}: missing categories ${missing.join(', ')} — continuing loop`);
157
133
  // Fall through to section 5 (compact loop)
158
134
  } else {
159
- // Module complete — advance
160
- currentModule.status = 'completed';
161
- queue.completedModules++;
162
- const nextIndex = queue.currentIndex + 1;
163
-
164
- if (nextIndex < queue.totalModules) {
165
- queue.currentIndex = nextIndex;
166
- queue.modules[nextIndex].status = 'in-progress';
167
- writeJSON(queuePath, queue);
168
-
169
- writeJSON('.ralph/module-changed.json', {
170
- fromModule: currentModule.code, toModule: queue.modules[nextIndex].code,
171
- timestamp: new Date().toISOString()
172
- });
173
-
174
- prd.status = 'completed';
175
- writeJSON('.ralph/prd.json', prd);
176
- const nextPrd = readJSON(queue.modules[nextIndex].prdFile);
177
- nextPrd.config.current_iteration = 1;
178
- nextPrd.config.max_iterations = prd.config.max_iterations;
179
- writeJSON('.ralph/prd.json', nextPrd);
180
-
181
- console.log(`MODULE COMPLETE: ${currentModule.code} → NEXT: ${queue.modules[nextIndex].code}`);
182
- // → step-01 (module transition)
183
- return;
184
- }
185
-
186
- // ALL MODULES COMPLETE
187
- writeJSON(queuePath, queue);
188
- console.log(`ALL ${queue.totalModules} MODULES COMPLETE`);
135
+ // All categories complete — advance to next module
136
+ // (detailed logic in references/module-transition.md)
189
137
  }
190
138
  }
191
139
  ```
@@ -25,7 +25,7 @@ public async Task<ActionResult<OrderDto>> Get(Guid id)
25
25
 
26
26
  // GOOD: Tenant filter via EF Core global filter + explicit check
27
27
  [HttpGet("{id}")]
28
- [RequirePermission(Permissions.Business.Orders.Read)]
28
+ [RequirePermission(Permissions.Orders.Read)]
29
29
  public async Task<ActionResult<OrderDto>> Get(Guid id)
30
30
  {
31
31
  var order = await _context.Orders
@@ -76,7 +76,7 @@ public async Task<ActionResult> Update(Guid id, [FromBody] User user) { ... }
76
76
 
77
77
  // GOOD: DTO limits writable fields
78
78
  [HttpPut("{id}")]
79
- [RequirePermission(Permissions.Business.Users.Update)]
79
+ [RequirePermission(Permissions.Users.Update)]
80
80
  public async Task<ActionResult> Update(Guid id, [FromBody] UpdateUserDto dto) { ... }
81
81
 
82
82
  public record UpdateUserDto(string Name, string Email); // No Role, no TenantId
@@ -117,8 +117,8 @@ public async Task<ActionResult<PaginatedResult<OrderDto>>> GetAll(
117
117
  **Risk:** Regular users access admin-level API functions.
118
118
 
119
119
  **SmartStack check:**
120
- - [ ] Admin endpoints use `platform.administration.*` permissions
121
- - [ ] Area-based routing enforced (Admin, Support, Business, User)
120
+ - [ ] Admin endpoints use `administration.*` permissions
121
+ - [ ] Application-based routing enforced (Administration, Support, etc.)
122
122
  - [ ] System account protection (UserType.System, UserType.LocalAdmin)
123
123
  - [ ] No permission bypass via direct URL manipulation
124
124
 
@@ -130,7 +130,7 @@ public async Task<ActionResult> Delete(Guid id) { ... }
130
130
 
131
131
  // GOOD: Explicit permission check
132
132
  [HttpDelete("{id}")]
133
- [RequirePermission(Permissions.Platform.Administration.Users.Delete)]
133
+ [RequirePermission(Permissions.Administration.Users.Delete)]
134
134
  public async Task<ActionResult> Delete(Guid id) { ... }
135
135
  ```
136
136
  </api5_broken_function_auth>
@@ -335,10 +335,10 @@ Rules:
335
335
  **NavRoute attribute** (preferred):
336
336
  ```csharp
337
337
  [ApiController]
338
- [NavRoute("platform.administration.users")]
338
+ [NavRoute("administration.users")]
339
339
  public class UsersController : ControllerBase // MUST be ControllerBase, NOT Controller
340
340
  {
341
- // Routes generated from NavRoute: /api/platform/administration/users
341
+ // Routes generated from NavRoute: /api/administration/users
342
342
  }
343
343
  ```
344
344
 
@@ -369,14 +369,14 @@ public class UsersController : ControllerBase
369
369
  **NavRoute format:**
370
370
  - Lowercase only
371
371
  - Dot-separated hierarchy
372
- - Minimum 2 levels: `context.application`
373
- - Full path: `context.application.module`
372
+ - Minimum 2 levels: `application.module`
373
+ - Full path: `application.module`
374
374
 
375
375
  **Examples:**
376
- - `platform.administration.users`
377
- - `platform.administration.roles`
378
- - `business.crm.contacts`
379
- - `personal.myspace.dashboard`
376
+ - `administration.users`
377
+ - `administration.roles`
378
+ - `crm.contacts`
379
+ - `myspace.dashboard`
380
380
  </controllers>
381
381
 
382
382
  <services>
@@ -434,9 +434,9 @@ var users = await _context.Users
434
434
  - Actions: `read`, `create`, `update`, `delete`, `*` (wildcard)
435
435
 
436
436
  **Example permissions:**
437
- - `platform.administration.users.read`
438
- - `platform.administration.users.create`
439
- - `platform.administration.users.*` (all actions)
437
+ - `administration.users.read`
438
+ - `administration.users.create`
439
+ - `administration.users.*` (all actions)
440
440
  </authorization>
441
441
 
442
442
  <input_validation>
@@ -0,0 +1,140 @@
1
+ # API Smoke Test Procedure
2
+
3
+ > **Reference for:** step-04-api-smoke.md
4
+ > **Purpose:** Validate CRUD endpoints with real HTTP requests
5
+ > **Scope:** GET all, POST create, GET by ID, PUT update, DELETE, GET verify deleted
6
+
7
+ ---
8
+
9
+ ## Startup Sequence
10
+
11
+ ```bash
12
+ # Start API on test port
13
+ dotnet run --project {ApiProject} --urls "http://localhost:5099" > /tmp/api-smoke-output.log 2>&1 &
14
+ API_PID=$!
15
+
16
+ # Wait for readiness (with crash detection)
17
+ API_CRASHED=false
18
+ for i in $(seq 1 30); do
19
+ if ! kill -0 $API_PID 2>/dev/null; then
20
+ echo "API PROCESS CRASHED during startup"
21
+ cat /tmp/api-smoke-output.log 2>/dev/null
22
+ API_CRASHED=true
23
+ break
24
+ fi
25
+
26
+ HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:5099/health 2>/dev/null)
27
+ if [ "$HTTP_CODE" != "000" ]; then
28
+ echo "API is ready (HTTP $HTTP_CODE)"
29
+ break
30
+ fi
31
+ sleep 1
32
+ done
33
+
34
+ # If API_CRASHED=true → Jump to section "Crash Classification" below
35
+ ```
36
+
37
+ ---
38
+
39
+ ## CRUD Test Sequence
40
+
41
+ ```bash
42
+ # Get auth token (optional)
43
+ TOKEN=$(curl -s -X POST http://localhost:5099/api/auth/login \
44
+ -H "Content-Type: application/json" \
45
+ -d '{"email":"admin@smartstack.io","password":"Admin123!"}' \
46
+ | jq -r '.token // .accessToken // empty')
47
+
48
+ # Headers
49
+ AUTH_HEADER="Authorization: Bearer $TOKEN"
50
+ TENANT_HEADER="X-Tenant-Id: 11111111-1111-1111-1111-111111111111"
51
+ CONTENT_TYPE="Content-Type: application/json"
52
+ ```
53
+
54
+ ### Test 1: GET All (expect 200)
55
+ ```bash
56
+ curl -s -w "\nHTTP %{http_code}" \
57
+ -H "$AUTH_HEADER" -H "$TENANT_HEADER" \
58
+ http://localhost:5099/api/{entity_code}
59
+ ```
60
+
61
+ ### Test 2: POST Create (expect 201 or 200)
62
+ ```bash
63
+ CREATED=$(curl -s -X POST \
64
+ -H "$AUTH_HEADER" -H "$TENANT_HEADER" -H "$CONTENT_TYPE" \
65
+ -d '{"code":"smoke-test-01","name":"Smoke Test Entity"}' \
66
+ http://localhost:5099/api/{entity_code})
67
+ ENTITY_ID=$(echo "$CREATED" | jq -r '.id // .Id')
68
+ ```
69
+
70
+ ### Test 3: GET By ID (expect 200)
71
+ ```bash
72
+ curl -s -w "\nHTTP %{http_code}" \
73
+ -H "$AUTH_HEADER" -H "$TENANT_HEADER" \
74
+ http://localhost:5099/api/{entity_code}/$ENTITY_ID
75
+ ```
76
+
77
+ ### Test 4: PUT Update (expect 200)
78
+ ```bash
79
+ curl -s -X PUT -w "\nHTTP %{http_code}" \
80
+ -H "$AUTH_HEADER" -H "$TENANT_HEADER" -H "$CONTENT_TYPE" \
81
+ -d '{"code":"smoke-test-01","name":"Updated Name"}' \
82
+ http://localhost:5099/api/{entity_code}/$ENTITY_ID
83
+ ```
84
+
85
+ ### Test 5: DELETE (expect 204)
86
+ ```bash
87
+ curl -s -X DELETE -w "\nHTTP %{http_code}" \
88
+ -H "$AUTH_HEADER" -H "$TENANT_HEADER" \
89
+ http://localhost:5099/api/{entity_code}/$ENTITY_ID
90
+ ```
91
+
92
+ ### Test 6: GET Deleted (expect 404)
93
+ ```bash
94
+ curl -s -w "\nHTTP %{http_code}" \
95
+ -H "$AUTH_HEADER" -H "$TENANT_HEADER" \
96
+ http://localhost:5099/api/{entity_code}/$ENTITY_ID
97
+ ```
98
+
99
+ ---
100
+
101
+ ## HTTP Error Classification
102
+
103
+ | Status | Error | Cause | Fix |
104
+ |--------|-------|-------|-----|
105
+ | 401 | Unauthorized | Auth not configured | Check JWT token generation |
106
+ | 403 | Forbidden | Permissions missing | Verify PermissionConfiguration seeding |
107
+ | 404 | Not Found | Route not registered | Check NavRoute attribute on controller |
108
+ | 500 | Internal Server Error | Unhandled exception | Check API startup logs |
109
+ | Connection refused | API won't start | Startup config error | Review appsettings.json |
110
+
111
+ ---
112
+
113
+ ## Crash Classification
114
+
115
+ If API process dies during startup, classify error from `/tmp/api-smoke-output.log`:
116
+
117
+ | Error Pattern | Category | Fix |
118
+ |---------------|----------|-----|
119
+ | `FileNotFoundException: Could not load file or assembly '{Name}, Version={V}'` | MISSING_PACKAGE | `dotnet add {ApiProject} package {Name} --version {Major.Minor.Patch}` |
120
+ | `FileNotFoundException: Could not load file or assembly '{Name}'` | MISSING_ASSEMBLY | Check .csproj references |
121
+ | `TypeLoadException: Could not load type '{Type}'` | VERSION_MISMATCH | Update package to correct version |
122
+ | `MissingMethodException` | VERSION_MISMATCH | Update package |
123
+ | `InvalidOperationException: Unable to resolve service for type '{Type}'` | MISSING_DI | Add DI registration in Program.cs |
124
+ | `SqlException` or connection errors | DATABASE_ERROR | Check appsettings.json connection string |
125
+
126
+ **For MISSING_PACKAGE:**
127
+ 1. Extract assembly name (text between single quotes)
128
+ 2. Extract version (Version=X.X.X.X segment)
129
+ 3. Map to NuGet: assembly name usually equals package name
130
+ 4. Output: `FIX: dotnet add {ApiProject} package {PackageName} --version {Major.Minor.Patch}`
131
+
132
+ ---
133
+
134
+ ## Cleanup
135
+
136
+ ```bash
137
+ kill $API_PID 2>/dev/null
138
+ wait $API_PID 2>/dev/null
139
+ rm -f /tmp/api-smoke-output.log
140
+ ```