@atlashub/smartstack-cli 4.17.1 → 4.19.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 (167) hide show
  1. package/package.json +1 -1
  2. package/templates/agents/ba-reader.md +86 -80
  3. package/templates/agents/ba-writer.md +321 -413
  4. package/templates/agents/docs-context-reader.md +3 -3
  5. package/templates/mcp-scaffolding/frontend/nav-routes.ts.hbs +133 -0
  6. package/templates/mcp-scaffolding/frontend/routes.tsx.hbs +126 -0
  7. package/templates/skills/apex/SKILL.md +29 -16
  8. package/templates/skills/apex/_shared.md +62 -9
  9. package/templates/skills/apex/references/analysis-methods.md +8 -6
  10. package/templates/skills/apex/references/challenge-questions.md +5 -5
  11. package/templates/skills/apex/references/core-seed-data.md +68 -45
  12. package/templates/skills/apex/references/frontend-route-wiring-app-tsx.md +26 -21
  13. package/templates/skills/apex/references/parallel-execution.md +156 -0
  14. package/templates/skills/apex/references/person-extension-pattern.md +12 -12
  15. package/templates/skills/apex/references/post-checks.md +1748 -1726
  16. package/templates/skills/apex/references/smartstack-api.md +63 -57
  17. package/templates/skills/apex/references/smartstack-frontend-compliance.md +594 -0
  18. package/templates/skills/apex/references/smartstack-frontend.md +1246 -1842
  19. package/templates/skills/apex/references/smartstack-layers.md +98 -145
  20. package/templates/skills/apex/steps/step-00-init.md +30 -6
  21. package/templates/skills/apex/steps/step-01-analyze.md +27 -23
  22. package/templates/skills/apex/steps/step-02-plan.md +12 -12
  23. package/templates/skills/apex/steps/step-03-execute.md +198 -143
  24. package/templates/skills/apex/steps/step-04-examine.md +24 -93
  25. package/templates/skills/apex/steps/step-05-deep-review.md +16 -16
  26. package/templates/skills/apex/steps/step-06-resolve.md +9 -9
  27. package/templates/skills/apex/steps/step-07-tests.md +3 -1
  28. package/templates/skills/apex/steps/step-08-run-tests.md +1 -1
  29. package/templates/skills/business-analyse/SKILL.md +182 -301
  30. package/templates/skills/business-analyse/_shared.md +119 -336
  31. package/templates/skills/business-analyse/html/ba-interactive.html +703 -82
  32. package/templates/skills/business-analyse/html/build-html.js +41 -3
  33. package/templates/skills/business-analyse/html/src/partials/cadrage-context.html +34 -0
  34. package/templates/skills/business-analyse/html/src/partials/cadrage-risks.html +48 -0
  35. package/templates/skills/business-analyse/html/src/partials/cadrage-scope.html +49 -0
  36. package/templates/skills/business-analyse/html/src/partials/cadrage-stakeholders.html +55 -0
  37. package/templates/skills/business-analyse/html/src/partials/cadrage-success.html +34 -0
  38. package/templates/skills/business-analyse/html/src/partials/consol-datamodel.html +8 -0
  39. package/templates/skills/business-analyse/html/src/partials/consol-flows.html +29 -0
  40. package/templates/skills/business-analyse/html/src/partials/consol-interactions.html +8 -0
  41. package/templates/skills/business-analyse/html/src/partials/consol-permissions.html +8 -0
  42. package/templates/skills/business-analyse/html/src/partials/decomp-dependencies.html +38 -0
  43. package/templates/skills/business-analyse/html/src/partials/decomp-modules.html +51 -0
  44. package/templates/skills/business-analyse/html/src/partials/handoff-summary.html +24 -0
  45. package/templates/skills/business-analyse/html/src/partials/module-spec-container.html +4 -0
  46. package/templates/skills/business-analyse/html/src/scripts/01-data-init.js +17 -1
  47. package/templates/skills/business-analyse/html/src/scripts/02-navigation.js +31 -5
  48. package/templates/skills/business-analyse/html/src/scripts/05-render-specs.js +100 -63
  49. package/templates/skills/business-analyse/html/src/scripts/06-render-mockups.js +372 -0
  50. package/templates/skills/business-analyse/html/src/scripts/10-comments.js +41 -13
  51. package/templates/skills/business-analyse/html/src/styles/09-mockups-html.css +136 -0
  52. package/templates/skills/business-analyse/patterns/suggestion-catalog.md +7 -5
  53. package/templates/skills/business-analyse/questionnaire/02-stakeholders-scope.md +142 -0
  54. package/templates/skills/business-analyse/questionnaire/03-data-ui.md +94 -0
  55. package/templates/skills/business-analyse/questionnaire/04-risks-metrics.md +150 -0
  56. package/templates/skills/business-analyse/questionnaire/05-cross-module.md +69 -0
  57. package/templates/skills/business-analyse/questionnaire.md +23 -280
  58. package/templates/skills/business-analyse/react/application-viewer.md +2 -2
  59. package/templates/skills/business-analyse/react/components.md +4 -4
  60. package/templates/skills/business-analyse/react/i18n-template.md +1 -1
  61. package/templates/skills/business-analyse/react/schema.md +14 -14
  62. package/templates/skills/business-analyse/references/acceptance-criteria.md +25 -25
  63. package/templates/skills/business-analyse/references/analysis-semantic-checks.md +3 -3
  64. package/templates/skills/business-analyse/references/compilation-structure-cards.md +1 -1
  65. package/templates/skills/business-analyse/references/consolidation-structural-checks.md +7 -7
  66. package/templates/skills/business-analyse/references/deploy-data-build.md +14 -12
  67. package/templates/skills/business-analyse/references/deploy-modes.md +10 -10
  68. package/templates/skills/business-analyse/references/detection-strategies.md +6 -6
  69. package/templates/skills/business-analyse/references/html-data-mapping.md +15 -15
  70. package/templates/skills/business-analyse/references/naming-conventions.md +4 -4
  71. package/templates/skills/business-analyse/references/review-data-mapping.md +29 -29
  72. package/templates/skills/business-analyse/references/robustness-checks.md +36 -33
  73. package/templates/skills/business-analyse/references/spec-auto-inference.md +2 -2
  74. package/templates/skills/business-analyse/references/ui-dashboard-spec.md +1 -1
  75. package/templates/skills/business-analyse/references/ui-resource-cards.md +1 -1
  76. package/templates/skills/business-analyse/references/validation-checklist.md +9 -6
  77. package/templates/skills/business-analyse/references/wireframe-svg-style-guide.md +2 -2
  78. package/templates/skills/business-analyse/schemas/application-schema.json +8 -8
  79. package/templates/skills/business-analyse/schemas/feature-schema.json +3 -3
  80. package/templates/skills/business-analyse/schemas/index-schema.json +47 -0
  81. package/templates/skills/business-analyse/schemas/project-schema.json +6 -6
  82. package/templates/skills/business-analyse/schemas/sections/analysis-schema.json +1 -1
  83. package/templates/skills/business-analyse/schemas/sections/handoff-schema.json +5 -3
  84. package/templates/skills/business-analyse/schemas/sections/metadata-schema.json +4 -4
  85. package/templates/skills/business-analyse/schemas/sections/specification-schema.json +1 -1
  86. package/templates/skills/business-analyse/schemas/shared/common-defs.json +4 -3
  87. package/templates/skills/business-analyse/steps/step-00-init.md +93 -134
  88. package/templates/skills/business-analyse/steps/step-01-cadrage.md +136 -172
  89. package/templates/skills/business-analyse/steps/step-02-structure.md +175 -0
  90. package/templates/skills/business-analyse/steps/step-03-specify.md +198 -0
  91. package/templates/skills/business-analyse/steps/step-04-consolidate.md +478 -0
  92. package/templates/skills/business-analyse/steps/step-05-deploy.md +220 -0
  93. package/templates/skills/business-analyse/steps/step-06-review.md +51 -69
  94. package/templates/skills/business-analyse/templates/tpl-frd.md +1 -1
  95. package/templates/skills/business-analyse/templates/tpl-handoff.md +20 -17
  96. package/templates/skills/business-analyse/templates/tpl-launch-displays.md +2 -2
  97. package/templates/skills/business-analyse/templates-react.md +2 -2
  98. package/templates/skills/derive-prd/SKILL.md +92 -0
  99. package/templates/skills/derive-prd/references/acceptance-criteria.md +169 -0
  100. package/templates/skills/derive-prd/references/entity-domain-mapping.md +115 -0
  101. package/templates/skills/{business-analyse → derive-prd}/references/handoff-file-templates.md +131 -120
  102. package/templates/skills/{business-analyse → derive-prd}/references/handoff-mappings.md +95 -95
  103. package/templates/skills/{business-analyse → derive-prd}/references/handoff-seeddata-generation.md +312 -312
  104. package/templates/skills/{business-analyse → derive-prd}/references/prd-generation.md +262 -258
  105. package/templates/skills/derive-prd/references/readiness-scoring.md +104 -0
  106. package/templates/skills/derive-prd/schemas/handoff-schema.json +95 -0
  107. package/templates/skills/derive-prd/steps/step-00-validate.md +130 -0
  108. package/templates/skills/derive-prd/steps/step-01-transform.md +206 -0
  109. package/templates/skills/derive-prd/steps/step-02-export.md +181 -0
  110. package/templates/skills/{business-analyse → derive-prd}/templates/tpl-progress.md +172 -172
  111. package/templates/skills/ralph-loop/SKILL.md +10 -4
  112. package/templates/skills/ralph-loop/references/category-completeness.md +20 -4
  113. package/templates/skills/ralph-loop/references/compact-loop.md +80 -48
  114. package/templates/skills/ralph-loop/references/init-resume-recovery.md +4 -2
  115. package/templates/skills/ralph-loop/references/parallel-execution.md +27 -27
  116. package/templates/skills/ralph-loop/steps/step-00-init.md +19 -9
  117. package/templates/skills/ralph-loop/steps/step-01-task.md +12 -4
  118. package/templates/skills/ralph-loop/steps/step-02-execute.md +9 -4
  119. package/templates/skills/ralph-loop/steps/step-03-commit.md +1 -1
  120. package/templates/skills/ralph-loop/steps/step-04-check.md +5 -21
  121. package/templates/skills/ralph-loop/steps/step-05-report.md +6 -1
  122. package/templates/skills/apex/references/agent-teams-protocol.md +0 -203
  123. package/templates/skills/business-analyse/_architecture.md +0 -124
  124. package/templates/skills/business-analyse/_elicitation.md +0 -206
  125. package/templates/skills/business-analyse/_module-loop.md +0 -115
  126. package/templates/skills/business-analyse/_suggestions.md +0 -34
  127. package/templates/skills/business-analyse/questionnaire/00-application.md +0 -160
  128. package/templates/skills/business-analyse/questionnaire/00b-project.md +0 -85
  129. package/templates/skills/business-analyse/questionnaire/02-stakeholders.md +0 -189
  130. package/templates/skills/business-analyse/questionnaire/03-scope.md +0 -164
  131. package/templates/skills/business-analyse/questionnaire/04-data.md +0 -88
  132. package/templates/skills/business-analyse/questionnaire/05-integrations.md +0 -58
  133. package/templates/skills/business-analyse/questionnaire/06-security.md +0 -68
  134. package/templates/skills/business-analyse/questionnaire/07-ui.md +0 -76
  135. package/templates/skills/business-analyse/questionnaire/08-performance.md +0 -42
  136. package/templates/skills/business-analyse/questionnaire/09-constraints.md +0 -45
  137. package/templates/skills/business-analyse/questionnaire/10-documentation.md +0 -43
  138. package/templates/skills/business-analyse/questionnaire/11-data-lifecycle.md +0 -59
  139. package/templates/skills/business-analyse/questionnaire/12-migration.md +0 -58
  140. package/templates/skills/business-analyse/questionnaire/13-cross-module.md +0 -69
  141. package/templates/skills/business-analyse/questionnaire/14-risk-assumptions.md +0 -135
  142. package/templates/skills/business-analyse/questionnaire/15-success-metrics.md +0 -136
  143. package/templates/skills/business-analyse/references/agent-module-prompt.md +0 -362
  144. package/templates/skills/business-analyse/references/agent-pooling-best-practices.md +0 -557
  145. package/templates/skills/business-analyse/references/cache-warming-strategy.md +0 -566
  146. package/templates/skills/business-analyse/references/cadrage-challenge-patterns.md +0 -41
  147. package/templates/skills/business-analyse/references/cadrage-coverage-matrix.md +0 -74
  148. package/templates/skills/business-analyse/references/cadrage-pre-analysis.md +0 -115
  149. package/templates/skills/business-analyse/references/cadrage-shared-modules.md +0 -68
  150. package/templates/skills/business-analyse/references/cadrage-structure-cards.md +0 -85
  151. package/templates/skills/business-analyse/references/team-orchestration.md +0 -1022
  152. package/templates/skills/business-analyse/references/validate-incremental-html.md +0 -121
  153. package/templates/skills/business-analyse/steps/step-01b-applications.md +0 -419
  154. package/templates/skills/business-analyse/steps/step-02-decomposition.md +0 -387
  155. package/templates/skills/business-analyse/steps/step-03a-data.md +0 -16
  156. package/templates/skills/business-analyse/steps/step-03a1-setup.md +0 -506
  157. package/templates/skills/business-analyse/steps/step-03a2-analysis.md +0 -301
  158. package/templates/skills/business-analyse/steps/step-03b-ui.md +0 -425
  159. package/templates/skills/business-analyse/steps/step-03c-compile.md +0 -611
  160. package/templates/skills/business-analyse/steps/step-03d-validate.md +0 -783
  161. package/templates/skills/business-analyse/steps/step-04-consolidation.md +0 -17
  162. package/templates/skills/business-analyse/steps/step-04a-collect.md +0 -415
  163. package/templates/skills/business-analyse/steps/step-04b-analyze.md +0 -163
  164. package/templates/skills/business-analyse/steps/step-04c-decide.md +0 -186
  165. package/templates/skills/business-analyse/steps/step-05a-handoff.md +0 -840
  166. package/templates/skills/business-analyse/steps/step-05b-deploy.md +0 -522
  167. package/templates/skills/business-analyse/steps/step-05c-ralph-readiness.md +0 -703
@@ -1,312 +1,312 @@
1
- # SeedData Core Generation for Handoff
2
-
3
- Complete reference for generating `seedDataCore` from feature.json modules, application roles, and coverage matrix.
4
-
5
- ## Helper Functions
6
-
7
- ### PascalCase to Human Readable
8
-
9
- ```javascript
10
- function toHumanReadable(pascalCase) {
11
- return pascalCase
12
- .replace(/([a-z])([A-Z])/g, '$1 $2')
13
- .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2');
14
- }
15
- ```
16
-
17
- ### PascalCase to Kebab Case
18
-
19
- ```javascript
20
- function toKebabCase(code) {
21
- return code
22
- .replace(/([a-z])([A-Z])/g, '$1-$2')
23
- .toLowerCase();
24
- }
25
- ```
26
-
27
- ## SeedDataCore Template
28
-
29
- ```javascript
30
- const appCode = master.metadata.application;
31
- const appLabel = toHumanReadable(appCode);
32
- const appDesc = master.cadrage?.problem?.split('.')[0] || `Gestion ${appLabel}`;
33
- const lang = master.metadata.language || "fr";
34
-
35
- const seedDataCore = {
36
- // Application-level navigation (MANDATORY — one entry per application)
37
- navigationApplications: (() => {
38
- if (workflow.mode === "project") {
39
- // Multi-app: one navigation entry per application
40
- return projectFeature.applications.map((app, idx) => {
41
- const appLabel = toHumanReadable(app.code);
42
- return {
43
- code: app.code.toLowerCase(),
44
- name: app.code,
45
- labels: {
46
- fr: lang === "fr" ? (app.name || appLabel) : appLabel,
47
- en: lang === "en" ? (app.name || appLabel) : appLabel,
48
- it: appLabel,
49
- de: appLabel
50
- },
51
- description: {
52
- fr: lang === "fr" ? (app.description || `Gestion ${appLabel}`) : `Gestion ${appLabel}`,
53
- en: lang === "en" ? (app.description || `${appLabel} management`) : `${appLabel} management`,
54
- it: `Gestione ${appLabel}`,
55
- de: `${appLabel} Verwaltung`
56
- },
57
- icon: app.icon || inferIconFromApplication({ metadata: { application: app.code } }) || "layout-grid",
58
- iconType: "lucide",
59
- route: `/${toKebabCase(app.code)}`,
60
- displayOrder: (idx + 1) * 10
61
- };
62
- });
63
- } else {
64
- // Single-app: one navigation entry
65
- return [{
66
- code: appCode.toLowerCase(),
67
- name: appCode,
68
- labels: {
69
- fr: lang === "fr" ? (master.cadrage?.applicationName || appLabel) : appLabel,
70
- en: lang === "en" ? (master.cadrage?.applicationName || appLabel) : appLabel,
71
- it: appLabel,
72
- de: appLabel
73
- },
74
- description: {
75
- fr: lang === "fr" ? appDesc : `Gestion ${appLabel}`,
76
- en: lang === "en" ? appDesc : `${appLabel} management`,
77
- it: `Gestione ${appLabel}`,
78
- de: `${appLabel} Verwaltung`
79
- },
80
- icon: inferIconFromApplication(master) || "layout-grid",
81
- iconType: "lucide",
82
- route: `/${toKebabCase(appCode)}`,
83
- displayOrder: 1
84
- }];
85
- }
86
- })(),
87
-
88
- navigationModules: (() => {
89
- if (workflow.mode === "project") {
90
- let order = 0;
91
- return projectFeature.applications.flatMap(app => {
92
- return (app.modules || []).map(m => ({
93
- code: m.code,
94
- applicationCode: app.code,
95
- label: m.name || m.code,
96
- description: m.description,
97
- icon: inferIconFromModule(m) || "folder",
98
- iconType: "lucide",
99
- route: `/${toKebabCase(app.code)}/${toKebabCase(m.code)}`,
100
- displayOrder: (++order) * 10
101
- }));
102
- });
103
- } else {
104
- return master.modules.map((m, i) => ({
105
- code: m.code,
106
- label: m.name || m.code,
107
- description: m.description,
108
- icon: inferIconFromModule(m) || "folder",
109
- iconType: "lucide",
110
- route: `/${toKebabCase(appCode)}/${toKebabCase(m.code)}`,
111
- displayOrder: (i + 1) * 10
112
- }));
113
- }
114
- })(),
115
-
116
- navigationSections: (() => {
117
- const buildSections = (modules, appCode) =>
118
- modules.flatMap(m =>
119
- (m.anticipatedSections || []).map((s, j) => ({
120
- moduleCode: m.code,
121
- code: s.code,
122
- label: s.description?.split(':')[0] || s.code,
123
- description: s.description || "",
124
- route: s.code === "list"
125
- ? `/${toKebabCase(appCode)}/${toKebabCase(m.code)}`
126
- : s.code === "detail"
127
- ? `/${toKebabCase(appCode)}/${toKebabCase(m.code)}/:id`
128
- : `/${toKebabCase(appCode)}/${toKebabCase(m.code)}/${toKebabCase(s.code)}`,
129
- displayOrder: (j + 1) * 10,
130
- navigation: s.code === "detail" ? "hidden" : "visible"
131
- }))
132
- );
133
-
134
- if (workflow.mode === "project") {
135
- return projectFeature.applications.flatMap(app =>
136
- buildSections(app.modules || [], app.code)
137
- );
138
- } else {
139
- return buildSections(master.modules, appCode);
140
- }
141
- })(),
142
-
143
- navigationResources: master.cadrage.coverageMatrix
144
- .filter(cm => cm.module && cm.anticipatedResources?.length > 0)
145
- .flatMap(cm =>
146
- cm.anticipatedResources.map((r, k) => ({
147
- moduleCode: cm.module,
148
- sectionCode: cm.anticipatedSections?.[0] || "list",
149
- code: r,
150
- label: r.replace(/-/g, ' ').replace(/\b\w/g, c => c.toUpperCase()),
151
- displayOrder: (k + 1) * 10
152
- }))
153
- ),
154
-
155
- navigationTranslations: master.modules.flatMap(m => {
156
- const langs = ["fr", "en", "it", "de"];
157
- return langs.map(lang => ({
158
- moduleCode: m.code,
159
- language: lang,
160
- label: lang === master.metadata.language ? (m.name || m.code) : m.code,
161
- description: lang === master.metadata.language ? m.description : ""
162
- }));
163
- }),
164
-
165
- permissions: (() => {
166
- const buildPermissions = (modules, appCode) =>
167
- modules.flatMap(m => {
168
- const basePath = `${toKebabCase(appCode)}.${toKebabCase(m.code)}`;
169
- const actions = ['read', 'create', 'update', 'delete'];
170
- return [
171
- { path: `${basePath}.*`, action: '*', description: `Full ${m.name || m.code} access` },
172
- ...actions.map(action => ({
173
- path: `${basePath}.${action}`,
174
- action: action,
175
- description: `${action.charAt(0).toUpperCase() + action.slice(1)} ${m.name || m.code}`
176
- }))
177
- ];
178
- });
179
-
180
- if (workflow.mode === "project") {
181
- return projectFeature.applications.flatMap(app =>
182
- buildPermissions(app.modules || [], app.code)
183
- );
184
- } else {
185
- return buildPermissions(master.modules, appCode);
186
- }
187
- })(),
188
-
189
- rolePermissions: (() => {
190
- const buildRolePermissions = (roles, modules, appCode) =>
191
- roles.map(role => ({
192
- role: role.role,
193
- level: role.level,
194
- permissions: modules.map(m => `${toKebabCase(appCode)}.${toKebabCase(m.code)}.${
195
- role.level === 'admin' ? '*' :
196
- role.level === 'manager' ? 'read,create,update' :
197
- role.level === 'contributor' ? 'read,create' : 'read'
198
- }`)
199
- }));
200
-
201
- if (workflow.mode === "project") {
202
- return projectFeature.applications.flatMap(app =>
203
- buildRolePermissions(app.applicationRoles || [], app.modules || [], app.code)
204
- );
205
- } else {
206
- return buildRolePermissions(master.cadrage.applicationRoles, master.modules, appCode);
207
- }
208
- })(),
209
-
210
- permissionConstants: (() => {
211
- const buildConstants = (modules, appCode) =>
212
- modules.flatMap(m =>
213
- ['Read', 'Create', 'Update', 'Delete', 'Validate', 'Export'].map(action => ({
214
- module: m.code,
215
- application: appCode,
216
- action: action,
217
- constant: `${appCode}${m.code}${action}`,
218
- path: `${toKebabCase(appCode)}.${toKebabCase(m.code)}.${action.toLowerCase()}`
219
- }))
220
- );
221
-
222
- if (workflow.mode === "project") {
223
- return projectFeature.applications.flatMap(app =>
224
- buildConstants(app.modules || [], app.code)
225
- );
226
- } else {
227
- return buildConstants(master.modules, appCode);
228
- }
229
- })()
230
- };
231
- ```
232
-
233
- ## Icon Inference Functions
234
-
235
- ### Application Level
236
-
237
- ```javascript
238
- function inferIconFromApplication(master) {
239
- const appLC = (master.metadata.application || '').toLowerCase();
240
- const iconMap = {
241
- 'humanresource': 'users', 'rh': 'users', 'hr': 'users', 'personnel': 'users',
242
- 'sales': 'shopping-cart', 'vente': 'shopping-cart', 'commerce': 'shopping-cart',
243
- 'finance': 'wallet', 'comptabilite': 'calculator', 'accounting': 'calculator',
244
- 'inventory': 'warehouse', 'stock': 'package', 'logistic': 'truck',
245
- 'crm': 'building-2', 'customer': 'building', 'client': 'building-2',
246
- 'project': 'folder-kanban', 'task': 'check-square', 'gestion': 'layout-grid',
247
- 'admin': 'shield', 'support': 'headphones', 'maintenance': 'wrench',
248
- 'production': 'factory', 'quality': 'badge-check', 'document': 'file-text',
249
- 'fleet': 'car', 'vehicle': 'car', 'transport': 'truck',
250
- 'education': 'graduation-cap', 'formation': 'graduation-cap', 'training': 'graduation-cap'
251
- };
252
- for (const [keyword, icon] of Object.entries(iconMap)) {
253
- if (appLC.includes(keyword)) return icon;
254
- }
255
- return "layout-grid"; // fallback — NEVER null
256
- }
257
- ```
258
-
259
- ### Module Level
260
-
261
- ```javascript
262
- function inferIconFromModule(module) {
263
- const codeLC = module.code.toLowerCase();
264
- const iconMap = {
265
- 'employee': 'users', 'staff': 'users', 'personnel': 'users', 'user': 'users',
266
- 'project': 'folder-kanban', 'task': 'check-square', 'work': 'briefcase',
267
- 'time': 'clock', 'schedule': 'calendar', 'planning': 'calendar-days',
268
- 'absence': 'calendar-off', 'leave': 'calendar-off', 'vacation': 'palm-tree',
269
- 'finance': 'wallet', 'billing': 'receipt', 'invoice': 'file-text',
270
- 'inventory': 'warehouse', 'stock': 'package', 'product': 'shopping-bag',
271
- 'customer': 'building', 'client': 'building-2', 'contact': 'contact',
272
- 'report': 'bar-chart', 'dashboard': 'layout-dashboard', 'analytics': 'trending-up',
273
- 'document': 'file-text', 'notification': 'bell', 'setting': 'settings',
274
- 'order': 'shopping-cart', 'vehicle': 'car', 'maintenance': 'wrench',
275
- 'audit': 'shield-check', 'workflow': 'git-branch', 'approval': 'check-circle'
276
- };
277
- for (const [keyword, icon] of Object.entries(iconMap)) {
278
- if (codeLC.includes(keyword)) return icon;
279
- }
280
- return "folder"; // fallback — NEVER null
281
- }
282
- ```
283
-
284
- ## POST-CHECK (BLOCKING for icons/application, warning for counts)
285
-
286
- ```javascript
287
- IF !seedDataCore.navigationApplications || seedDataCore.navigationApplications.length === 0:
288
- BLOCKING ERROR: "navigationApplications is empty — Application navigation will NOT be seeded. Menu will show (nothing) → Modules."
289
- IF seedDataCore.navigationApplications[0].icon === null || seedDataCore.navigationApplications[0].icon === undefined:
290
- BLOCKING ERROR: "Application icon is null — ralph-loop will render empty navigation"
291
- IF !seedDataCore.navigationApplications[0].labels?.fr || !seedDataCore.navigationApplications[0].labels?.en:
292
- BLOCKING ERROR: "Application labels missing fr/en — translations will fail"
293
- IF seedDataCore.navigationModules.length !== master.modules.length:
294
- WARNING: seedDataCore has ${seedDataCore.navigationModules.length} nav modules but ${master.modules.length} modules exist
295
- IF seedDataCore.permissions.length === 0:
296
- WARNING: seedDataCore has 0 permissions — applicationRoles may be missing
297
- IF seedDataCore.navigationModules.some(m => !m.icon || m.icon === null):
298
- BLOCKING ERROR: "Navigation modules with null icons detected — ralph-loop will render empty navigation"
299
- → Fix: Re-run inferIconFromModule() for modules with null icons
300
- IF seedDataCore.navigationSections.length === 0:
301
- WARNING: "0 navigation sections — every module should have at least 1 section (e.g., 'list')"
302
- ```
303
-
304
- ## Writing to Feature.json
305
-
306
- ```javascript
307
- ba-writer.enrichSection({
308
- featureId: {feature_id},
309
- section: "seedDataCore",
310
- data: seedDataCore
311
- })
312
- ```
1
+ # SeedData Core Generation for Handoff
2
+
3
+ Complete reference for generating `seedDataCore` from module JSON files, application roles, and coverage matrix.
4
+
5
+ ## Helper Functions
6
+
7
+ ### PascalCase to Human Readable
8
+
9
+ ```javascript
10
+ function toHumanReadable(pascalCase) {
11
+ return pascalCase
12
+ .replace(/([a-z])([A-Z])/g, '$1 $2')
13
+ .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2');
14
+ }
15
+ ```
16
+
17
+ ### PascalCase to Kebab Case
18
+
19
+ ```javascript
20
+ function toKebabCase(code) {
21
+ return code
22
+ .replace(/([a-z])([A-Z])/g, '$1-$2')
23
+ .toLowerCase();
24
+ }
25
+ ```
26
+
27
+ ## SeedDataCore Template
28
+
29
+ ```javascript
30
+ const appCode = master.metadata.application;
31
+ const appLabel = toHumanReadable(appCode);
32
+ const appDesc = master.cadrage?.problem?.split('.')[0] || `Gestion ${appLabel}`;
33
+ const lang = master.metadata.language || "fr";
34
+
35
+ const seedDataCore = {
36
+ // Application-level navigation (MANDATORY — one entry per application)
37
+ navigationApplications: (() => {
38
+ if (workflow.mode === "project") {
39
+ // Multi-app: one navigation entry per application
40
+ return projectFeature.applications.map((app, idx) => {
41
+ const appLabel = toHumanReadable(app.code);
42
+ return {
43
+ code: app.code.toLowerCase(),
44
+ name: app.code,
45
+ labels: {
46
+ fr: lang === "fr" ? (app.name || appLabel) : appLabel,
47
+ en: lang === "en" ? (app.name || appLabel) : appLabel,
48
+ it: appLabel,
49
+ de: appLabel
50
+ },
51
+ description: {
52
+ fr: lang === "fr" ? (app.description || `Gestion ${appLabel}`) : `Gestion ${appLabel}`,
53
+ en: lang === "en" ? (app.description || `${appLabel} management`) : `${appLabel} management`,
54
+ it: `Gestione ${appLabel}`,
55
+ de: `${appLabel} Verwaltung`
56
+ },
57
+ icon: app.icon || inferIconFromApplication({ metadata: { application: app.code } }) || "layout-grid",
58
+ iconType: "lucide",
59
+ route: `/${toKebabCase(app.code)}`,
60
+ displayOrder: (idx + 1) * 10
61
+ };
62
+ });
63
+ } else {
64
+ // Single-app: one navigation entry
65
+ return [{
66
+ code: appCode.toLowerCase(),
67
+ name: appCode,
68
+ labels: {
69
+ fr: lang === "fr" ? (master.cadrage?.applicationName || appLabel) : appLabel,
70
+ en: lang === "en" ? (master.cadrage?.applicationName || appLabel) : appLabel,
71
+ it: appLabel,
72
+ de: appLabel
73
+ },
74
+ description: {
75
+ fr: lang === "fr" ? appDesc : `Gestion ${appLabel}`,
76
+ en: lang === "en" ? appDesc : `${appLabel} management`,
77
+ it: `Gestione ${appLabel}`,
78
+ de: `${appLabel} Verwaltung`
79
+ },
80
+ icon: inferIconFromApplication(master) || "layout-grid",
81
+ iconType: "lucide",
82
+ route: `/${toKebabCase(appCode)}`,
83
+ displayOrder: 1
84
+ }];
85
+ }
86
+ })(),
87
+
88
+ navigationModules: (() => {
89
+ if (workflow.mode === "project") {
90
+ let order = 0;
91
+ return projectFeature.applications.flatMap(app => {
92
+ return (app.modules || []).map(m => ({
93
+ code: m.code,
94
+ applicationCode: app.code,
95
+ label: m.name || m.code,
96
+ description: m.description,
97
+ icon: inferIconFromModule(m) || "folder",
98
+ iconType: "lucide",
99
+ route: `/${toKebabCase(app.code)}/${toKebabCase(m.code)}`,
100
+ displayOrder: (++order) * 10
101
+ }));
102
+ });
103
+ } else {
104
+ return master.modules.map((m, i) => ({
105
+ code: m.code,
106
+ label: m.name || m.code,
107
+ description: m.description,
108
+ icon: inferIconFromModule(m) || "folder",
109
+ iconType: "lucide",
110
+ route: `/${toKebabCase(appCode)}/${toKebabCase(m.code)}`,
111
+ displayOrder: (i + 1) * 10
112
+ }));
113
+ }
114
+ })(),
115
+
116
+ navigationSections: (() => {
117
+ const buildSections = (modules, appCode) =>
118
+ modules.flatMap(m =>
119
+ (m.anticipatedSections || []).map((s, j) => ({
120
+ moduleCode: m.code,
121
+ code: s.code,
122
+ label: s.description?.split(':')[0] || s.code,
123
+ description: s.description || "",
124
+ route: s.code === "list"
125
+ ? `/${toKebabCase(appCode)}/${toKebabCase(m.code)}`
126
+ : s.code === "detail"
127
+ ? `/${toKebabCase(appCode)}/${toKebabCase(m.code)}/:id`
128
+ : `/${toKebabCase(appCode)}/${toKebabCase(m.code)}/${toKebabCase(s.code)}`,
129
+ displayOrder: (j + 1) * 10,
130
+ navigation: s.code === "detail" ? "hidden" : "visible"
131
+ }))
132
+ );
133
+
134
+ if (workflow.mode === "project") {
135
+ return projectFeature.applications.flatMap(app =>
136
+ buildSections(app.modules || [], app.code)
137
+ );
138
+ } else {
139
+ return buildSections(master.modules, appCode);
140
+ }
141
+ })(),
142
+
143
+ navigationResources: master.cadrage.coverageMatrix
144
+ .filter(cm => cm.module && cm.anticipatedResources?.length > 0)
145
+ .flatMap(cm =>
146
+ cm.anticipatedResources.map((r, k) => ({
147
+ moduleCode: cm.module,
148
+ sectionCode: cm.anticipatedSections?.[0] || "list",
149
+ code: r,
150
+ label: r.replace(/-/g, ' ').replace(/\b\w/g, c => c.toUpperCase()),
151
+ displayOrder: (k + 1) * 10
152
+ }))
153
+ ),
154
+
155
+ navigationTranslations: master.modules.flatMap(m => {
156
+ const langs = ["fr", "en", "it", "de"];
157
+ return langs.map(lang => ({
158
+ moduleCode: m.code,
159
+ language: lang,
160
+ label: lang === master.metadata.language ? (m.name || m.code) : m.code,
161
+ description: lang === master.metadata.language ? m.description : ""
162
+ }));
163
+ }),
164
+
165
+ permissions: (() => {
166
+ const buildPermissions = (modules, appCode) =>
167
+ modules.flatMap(m => {
168
+ const basePath = `${toKebabCase(appCode)}.${toKebabCase(m.code)}`;
169
+ const actions = ['read', 'create', 'update', 'delete'];
170
+ return [
171
+ { path: `${basePath}.*`, action: '*', description: `Full ${m.name || m.code} access` },
172
+ ...actions.map(action => ({
173
+ path: `${basePath}.${action}`,
174
+ action: action,
175
+ description: `${action.charAt(0).toUpperCase() + action.slice(1)} ${m.name || m.code}`
176
+ }))
177
+ ];
178
+ });
179
+
180
+ if (workflow.mode === "project") {
181
+ return projectFeature.applications.flatMap(app =>
182
+ buildPermissions(app.modules || [], app.code)
183
+ );
184
+ } else {
185
+ return buildPermissions(master.modules, appCode);
186
+ }
187
+ })(),
188
+
189
+ rolePermissions: (() => {
190
+ const buildRolePermissions = (roles, modules, appCode) =>
191
+ roles.map(role => ({
192
+ role: role.role,
193
+ level: role.level,
194
+ permissions: modules.map(m => `${toKebabCase(appCode)}.${toKebabCase(m.code)}.${
195
+ role.level === 'admin' ? '*' :
196
+ role.level === 'manager' ? 'read,create,update' :
197
+ role.level === 'contributor' ? 'read,create' : 'read'
198
+ }`)
199
+ }));
200
+
201
+ if (workflow.mode === "project") {
202
+ return projectFeature.applications.flatMap(app =>
203
+ buildRolePermissions(app.applicationRoles || [], app.modules || [], app.code)
204
+ );
205
+ } else {
206
+ return buildRolePermissions(master.cadrage.applicationRoles, master.modules, appCode);
207
+ }
208
+ })(),
209
+
210
+ permissionConstants: (() => {
211
+ const buildConstants = (modules, appCode) =>
212
+ modules.flatMap(m =>
213
+ ['Read', 'Create', 'Update', 'Delete', 'Validate', 'Export'].map(action => ({
214
+ module: m.code,
215
+ application: appCode,
216
+ action: action,
217
+ constant: `${appCode}${m.code}${action}`,
218
+ path: `${toKebabCase(appCode)}.${toKebabCase(m.code)}.${action.toLowerCase()}`
219
+ }))
220
+ );
221
+
222
+ if (workflow.mode === "project") {
223
+ return projectFeature.applications.flatMap(app =>
224
+ buildConstants(app.modules || [], app.code)
225
+ );
226
+ } else {
227
+ return buildConstants(master.modules, appCode);
228
+ }
229
+ })()
230
+ };
231
+ ```
232
+
233
+ ## Icon Inference Functions
234
+
235
+ ### Application Level
236
+
237
+ ```javascript
238
+ function inferIconFromApplication(master) {
239
+ const appLC = (master.metadata.application || '').toLowerCase();
240
+ const iconMap = {
241
+ 'humanresource': 'users', 'rh': 'users', 'hr': 'users', 'personnel': 'users',
242
+ 'sales': 'shopping-cart', 'vente': 'shopping-cart', 'commerce': 'shopping-cart',
243
+ 'finance': 'wallet', 'comptabilite': 'calculator', 'accounting': 'calculator',
244
+ 'inventory': 'warehouse', 'stock': 'package', 'logistic': 'truck',
245
+ 'crm': 'building-2', 'customer': 'building', 'client': 'building-2',
246
+ 'project': 'folder-kanban', 'task': 'check-square', 'gestion': 'layout-grid',
247
+ 'admin': 'shield', 'support': 'headphones', 'maintenance': 'wrench',
248
+ 'production': 'factory', 'quality': 'badge-check', 'document': 'file-text',
249
+ 'fleet': 'car', 'vehicle': 'car', 'transport': 'truck',
250
+ 'education': 'graduation-cap', 'formation': 'graduation-cap', 'training': 'graduation-cap'
251
+ };
252
+ for (const [keyword, icon] of Object.entries(iconMap)) {
253
+ if (appLC.includes(keyword)) return icon;
254
+ }
255
+ return "layout-grid"; // fallback — NEVER null
256
+ }
257
+ ```
258
+
259
+ ### Module Level
260
+
261
+ ```javascript
262
+ function inferIconFromModule(module) {
263
+ const codeLC = module.code.toLowerCase();
264
+ const iconMap = {
265
+ 'employee': 'users', 'staff': 'users', 'personnel': 'users', 'user': 'users',
266
+ 'project': 'folder-kanban', 'task': 'check-square', 'work': 'briefcase',
267
+ 'time': 'clock', 'schedule': 'calendar', 'planning': 'calendar-days',
268
+ 'absence': 'calendar-off', 'leave': 'calendar-off', 'vacation': 'palm-tree',
269
+ 'finance': 'wallet', 'billing': 'receipt', 'invoice': 'file-text',
270
+ 'inventory': 'warehouse', 'stock': 'package', 'product': 'shopping-bag',
271
+ 'customer': 'building', 'client': 'building-2', 'contact': 'contact',
272
+ 'report': 'bar-chart', 'dashboard': 'layout-dashboard', 'analytics': 'trending-up',
273
+ 'document': 'file-text', 'notification': 'bell', 'setting': 'settings',
274
+ 'order': 'shopping-cart', 'vehicle': 'car', 'maintenance': 'wrench',
275
+ 'audit': 'shield-check', 'workflow': 'git-branch', 'approval': 'check-circle'
276
+ };
277
+ for (const [keyword, icon] of Object.entries(iconMap)) {
278
+ if (codeLC.includes(keyword)) return icon;
279
+ }
280
+ return "folder"; // fallback — NEVER null
281
+ }
282
+ ```
283
+
284
+ ## POST-CHECK (BLOCKING for icons/application, warning for counts)
285
+
286
+ ```javascript
287
+ IF !seedDataCore.navigationApplications || seedDataCore.navigationApplications.length === 0:
288
+ BLOCKING ERROR: "navigationApplications is empty — Application navigation will NOT be seeded. Menu will show (nothing) → Modules."
289
+ IF seedDataCore.navigationApplications[0].icon === null || seedDataCore.navigationApplications[0].icon === undefined:
290
+ BLOCKING ERROR: "Application icon is null — ralph-loop will render empty navigation"
291
+ IF !seedDataCore.navigationApplications[0].labels?.fr || !seedDataCore.navigationApplications[0].labels?.en:
292
+ BLOCKING ERROR: "Application labels missing fr/en — translations will fail"
293
+ IF seedDataCore.navigationModules.length !== master.modules.length:
294
+ WARNING: seedDataCore has ${seedDataCore.navigationModules.length} nav modules but ${master.modules.length} modules exist
295
+ IF seedDataCore.permissions.length === 0:
296
+ WARNING: seedDataCore has 0 permissions — applicationRoles may be missing
297
+ IF seedDataCore.navigationModules.some(m => !m.icon || m.icon === null):
298
+ BLOCKING ERROR: "Navigation modules with null icons detected — ralph-loop will render empty navigation"
299
+ → Fix: Re-run inferIconFromModule() for modules with null icons
300
+ IF seedDataCore.navigationSections.length === 0:
301
+ WARNING: "0 navigation sections — every module should have at least 1 section (e.g., 'list')"
302
+ ```
303
+
304
+ ## Writing to index.json
305
+
306
+ ```javascript
307
+ ba-writer.enrichSection({
308
+ featureId: {feature_id},
309
+ section: "specification.seedDataCore",
310
+ data: seedDataCore
311
+ })
312
+ ```