@atlashub/smartstack-cli 4.80.0 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.documentation/agents.html +124 -585
- package/.documentation/ba-develop.html +852 -0
- package/.documentation/ba-skills.html +465 -0
- package/.documentation/business-analyse.html +385 -1570
- package/.documentation/cli-commands.html +162 -799
- package/.documentation/commands.html +902 -1338
- package/.documentation/css/styles.css +34 -1
- package/.documentation/efcore.html +161 -2599
- package/.documentation/gitflow.html +62 -105
- package/.documentation/hooks.html +94 -343
- package/.documentation/index.html +116 -385
- package/.documentation/init.html +217 -1566
- package/.documentation/installation.html +121 -1470
- package/.documentation/license.html +90 -450
- package/.documentation/ralph-loop.html +105 -602
- package/dist/index.js +9421 -79036
- package/dist/index.js.map +1 -1
- package/package.json +5 -20
- package/scripts/generate-docs/README.md +87 -0
- package/scripts/generate-docs/index.ts +175 -0
- package/scripts/generate-docs/lib/context-builder.ts +81 -0
- package/scripts/generate-docs/lib/handlebars-setup.ts +162 -0
- package/scripts/generate-docs/lib/markdown-parser.ts +86 -0
- package/scripts/generate-docs/lib/sidebar-builder.ts +80 -0
- package/scripts/generate-docs/lib/skill-parser.ts +171 -0
- package/scripts/generate-docs/lib/stats.ts +32 -0
- package/scripts/generate-docs/lib/version.ts +17 -0
- package/scripts/generate-docs/templates/layout.hbs +33 -0
- package/scripts/generate-docs/templates/pages/_generic.hbs +12 -0
- package/scripts/generate-docs/templates/pages/ba-develop.hbs +10 -0
- package/scripts/generate-docs/templates/pages/ba-skills.hbs +8 -0
- package/scripts/generate-docs/templates/pages/business-analyse.hbs +1 -0
- package/scripts/generate-docs/templates/pages/commands.hbs +13 -0
- package/scripts/generate-docs/templates/pages/gitflow.hbs +2164 -0
- package/scripts/generate-docs/templates/pages/index.hbs +5 -0
- package/scripts/generate-docs/templates/partials/breadcrumb.hbs +6 -0
- package/scripts/generate-docs/templates/partials/header.hbs +22 -0
- package/scripts/generate-docs/templates/partials/sidebar.hbs +32 -0
- package/scripts/generate-docs/templates/partials/skill-card.hbs +22 -0
- package/scripts/generate-docs/templates/partials/skill-grid.hbs +5 -0
- package/scripts/generate-docs/templates/partials/skill-table.hbs +18 -0
- package/scripts/generate-docs/templates/partials/stats-bar.hbs +20 -0
- package/scripts/test-migration-program-cs.mts +94 -0
- package/templates/agents/explore-codebase.md +2 -3
- package/templates/agents/explore-docs.md +5 -5
- package/templates/hooks/hooks.json +0 -9
- package/templates/project/Program.cs.template +17 -5
- package/templates/project/appsettings.json.template +208 -195
- package/templates/project/claude-md/api.CLAUDE.md.template +27 -2
- package/templates/project/patch-smartstack-theme.cjs.template +42 -0
- package/templates/scripts/statusline/README.md +47 -0
- package/templates/scripts/statusline/index.js +224 -0
- package/templates/skills/CLAUDE.md +235 -0
- package/templates/skills/ba-develop/SKILL.md +310 -0
- package/templates/skills/ba-develop/cli/compute-page-diff/__tests__/compute-page-diff.test.ts +177 -0
- package/templates/skills/ba-develop/cli/compute-page-diff/compute-diff.ts +51 -0
- package/templates/skills/ba-develop/cli/compute-page-diff/disk-drift.ts +55 -0
- package/templates/skills/ba-develop/cli/compute-page-diff/index.ts +89 -0
- package/templates/skills/ba-develop/cli/compute-page-diff/scan-pagespecs.ts +115 -0
- package/templates/skills/ba-develop/cli/compute-page-diff/types.ts +63 -0
- package/templates/skills/ba-develop/cli/compute-page-diff/validate.ts +20 -0
- package/templates/skills/ba-develop/cli/update-snapshot/__tests__/update-snapshot.test.ts +73 -0
- package/templates/skills/ba-develop/cli/update-snapshot/execute.ts +24 -0
- package/templates/skills/ba-develop/cli/update-snapshot/index.ts +61 -0
- package/templates/skills/ba-develop/cli/update-snapshot/types.ts +40 -0
- package/templates/skills/ba-develop/cli/update-snapshot/validate.ts +17 -0
- package/templates/skills/ba-develop/references/anti-patterns.md +101 -0
- package/templates/skills/ba-develop/references/auto-healing.md +191 -0
- package/templates/skills/ba-develop/references/commit-checkpoints.md +79 -0
- package/templates/skills/ba-develop/references/gates.md +380 -0
- package/templates/skills/ba-develop/references/output-contract.md +95 -0
- package/templates/skills/ba-develop/references/phases-detail.md +592 -0
- package/templates/skills/ba-develop-plan/SKILL.md +239 -0
- package/templates/skills/ba-develop-plan/cli/preflight-develop-plan/__tests__/validate.test.ts +225 -0
- package/templates/skills/ba-develop-plan/cli/preflight-develop-plan/index.ts +102 -0
- package/templates/skills/ba-develop-plan/cli/preflight-develop-plan/types.ts +121 -0
- package/templates/skills/ba-develop-plan/cli/preflight-develop-plan/validate.ts +261 -0
- package/templates/skills/business-analyse/_workflow/README.md +34 -0
- package/templates/skills/business-analyse/_workflow/ba-files.md +174 -0
- package/templates/skills/business-analyse/_workflow/code-discipline.md +104 -0
- package/templates/skills/business-analyse/_workflow/communication.md +63 -0
- package/templates/skills/business-analyse/_workflow/completeAuto-discipline.md +79 -0
- package/templates/skills/business-analyse/_workflow/context-documents.md +45 -0
- package/templates/skills/business-analyse/_workflow/doc-templates.md +318 -0
- package/templates/skills/business-analyse/audit-actors/SKILL.md +97 -0
- package/templates/skills/business-analyse/audit-cross-dimension/SKILL.md +127 -0
- package/templates/skills/business-analyse/audit-cross-ref-code/SKILL.md +119 -0
- package/templates/skills/business-analyse/audit-data-model/SKILL.md +343 -0
- package/templates/skills/business-analyse/audit-menu/SKILL.md +97 -0
- package/templates/skills/business-analyse/audit-prd/SKILL.md +479 -0
- package/templates/skills/business-analyse/audit-pre-dev/SKILL.md +135 -0
- package/templates/skills/business-analyse/audit-rbac/SKILL.md +93 -0
- package/templates/skills/business-analyse/audit-rules/SKILL.md +182 -0
- package/templates/skills/business-analyse/audit-screens/SKILL.md +169 -0
- package/templates/skills/business-analyse/audit-sections/SKILL.md +174 -0
- package/templates/skills/business-analyse/audit-use-cases/SKILL.md +245 -0
- package/templates/skills/business-analyse/create-actors/SKILL.md +129 -0
- package/templates/skills/business-analyse/create-ba-order/SKILL.md +182 -0
- package/templates/skills/business-analyse/create-ba-order/cli/create-ba-order/__tests__/generate.test.ts +151 -0
- package/templates/skills/business-analyse/create-ba-order/cli/create-ba-order/__tests__/graph.test.ts +173 -0
- package/templates/skills/business-analyse/create-ba-order/cli/create-ba-order/generate.ts +273 -0
- package/templates/skills/business-analyse/create-ba-order/cli/create-ba-order/graph.ts +193 -0
- package/templates/skills/business-analyse/create-ba-order/cli/create-ba-order/index.ts +108 -0
- package/templates/skills/business-analyse/create-ba-order/cli/create-ba-order/types.ts +106 -0
- package/templates/skills/business-analyse/create-ba-order/cli/create-ba-order/validate.ts +79 -0
- package/templates/skills/business-analyse/create-business-rules/SKILL.md +302 -0
- package/templates/skills/business-analyse/create-business-rules/levels/access-rules.md +105 -0
- package/templates/skills/business-analyse/create-business-rules/levels/elaborate.md +193 -0
- package/templates/skills/business-analyse/create-business-rules/levels/identify.md +157 -0
- package/templates/skills/business-analyse/create-business-rules/levels/link.md +86 -0
- package/templates/skills/business-analyse/create-data-model/SKILL.md +319 -0
- package/templates/skills/business-analyse/create-data-model/levels/attributes.md +130 -0
- package/templates/skills/business-analyse/create-data-model/levels/identify.md +100 -0
- package/templates/skills/business-analyse/create-data-model/levels/relationships.md +97 -0
- package/templates/skills/business-analyse/create-menu/SKILL.md +191 -0
- package/templates/skills/business-analyse/create-menu/levels/applications.md +85 -0
- package/templates/skills/business-analyse/create-menu/levels/modules.md +81 -0
- package/templates/skills/business-analyse/create-menu/levels/resources.md +75 -0
- package/templates/skills/business-analyse/create-menu/levels/sections.md +82 -0
- package/templates/skills/business-analyse/create-plan-development/SKILL.md +93 -0
- package/templates/skills/business-analyse/create-plan-development/cli/create-plan-development/__tests__/graph.test.ts +271 -0
- package/templates/skills/business-analyse/create-plan-development/cli/create-plan-development/__tests__/parse.test.ts +177 -0
- package/templates/skills/business-analyse/create-plan-development/cli/create-plan-development/generate.ts +317 -0
- package/templates/skills/business-analyse/create-plan-development/cli/create-plan-development/graph.ts +233 -0
- package/templates/skills/business-analyse/create-plan-development/cli/create-plan-development/index.ts +106 -0
- package/templates/skills/business-analyse/create-plan-development/cli/create-plan-development/parse.ts +346 -0
- package/templates/skills/business-analyse/create-plan-development/cli/create-plan-development/types.ts +160 -0
- package/templates/skills/business-analyse/create-plan-development/cli/create-plan-development/validate.ts +118 -0
- package/templates/skills/business-analyse/create-prd/SKILL.md +228 -0
- package/templates/skills/business-analyse/create-rbac/SKILL.md +255 -0
- package/templates/skills/business-analyse/create-rbac/levels/detail.md +86 -0
- package/templates/skills/business-analyse/create-rbac/levels/discovery.md +63 -0
- package/templates/skills/business-analyse/create-rbac/levels/review.md +66 -0
- package/templates/skills/business-analyse/create-screen/SKILL.md +386 -0
- package/templates/skills/business-analyse/create-screen/levels/dashboard-screens.md +94 -0
- package/templates/skills/business-analyse/create-screen/levels/form-screens.md +142 -0
- package/templates/skills/business-analyse/create-screen/levels/home-screens.md +151 -0
- package/templates/skills/business-analyse/create-screen/levels/kanban-screens.md +86 -0
- package/templates/skills/business-analyse/create-screen/levels/list-screens.md +134 -0
- package/templates/skills/business-analyse/create-screen/references/post-check.md +101 -0
- package/templates/skills/business-analyse/create-screen/references/react-templates.md +252 -0
- package/templates/skills/business-analyse/create-screen/references/smartcomponents.md +419 -0
- package/templates/skills/business-analyse/create-screen/references/type-mapping.md +150 -0
- package/templates/skills/business-analyse/create-use-case/SKILL.md +347 -0
- package/templates/skills/business-analyse/create-use-case/levels/detail.md +136 -0
- package/templates/skills/business-analyse/create-use-case/levels/discovery.md +110 -0
- package/templates/skills/business-analyse/loop/SKILL.md +401 -0
- package/templates/skills/business-analyse/modeling-detail/SKILL.md +241 -0
- package/templates/skills/business-analyse/modeling-inventory/SKILL.md +174 -0
- package/templates/skills/business-analyse/reconcile-menu/SKILL.md +180 -0
- package/templates/skills/business-analyse/reconcile-menu/cli/reconcile-menu/__tests__/clean.test.ts +266 -0
- package/templates/skills/business-analyse/reconcile-menu/cli/reconcile-menu/__tests__/detect.test.ts +231 -0
- package/templates/skills/business-analyse/reconcile-menu/cli/reconcile-menu/__tests__/scan.test.ts +154 -0
- package/templates/skills/business-analyse/reconcile-menu/cli/reconcile-menu/clean.ts +319 -0
- package/templates/skills/business-analyse/reconcile-menu/cli/reconcile-menu/detect.ts +256 -0
- package/templates/skills/business-analyse/reconcile-menu/cli/reconcile-menu/index.ts +126 -0
- package/templates/skills/business-analyse/reconcile-menu/cli/reconcile-menu/scan.ts +175 -0
- package/templates/skills/business-analyse/reconcile-menu/cli/reconcile-menu/types.ts +136 -0
- package/templates/skills/business-analyse/reconcile-menu/cli/reconcile-menu/validate.ts +32 -0
- package/templates/skills/check-version/SKILL.md +196 -196
- package/templates/skills/cli-app-sync/SKILL.md +9 -9
- package/templates/skills/cli-app-sync/references/comparison-map.md +4 -4
- package/templates/skills/cli-app-sync/references/diff-entities.md +6 -6
- package/templates/skills/conventions/SKILL.md +64 -0
- package/templates/skills/dev-start/SKILL.md +190 -237
- package/templates/skills/development/SKILL.md +87 -0
- package/templates/skills/development/audit/SKILL.md +156 -0
- package/templates/skills/development/audit/routing-dynamic/SKILL.md +196 -0
- package/templates/skills/development/audit-dev-api/SKILL.md +331 -0
- package/templates/skills/development/audit-dev-api/cli/audit-dev-api/__tests__/end-to-end.test.ts +364 -0
- package/templates/skills/development/audit-dev-api/cli/audit-dev-api/audit.ts +646 -0
- package/templates/skills/development/audit-dev-api/cli/audit-dev-api/index.ts +140 -0
- package/templates/skills/development/audit-dev-api/cli/audit-dev-api/types.ts +158 -0
- package/templates/skills/development/audit-dev-api/cli/audit-dev-api/validate.ts +45 -0
- package/templates/skills/development/audit-dev-core/SKILL.md +182 -0
- package/templates/skills/development/audit-dev-data/SKILL.md +195 -0
- package/templates/skills/development/audit-dev-domain/SKILL.md +184 -0
- package/templates/skills/development/audit-dev-frontend/SKILL.md +530 -0
- package/templates/skills/development/audit-dev-frontend/cli/audit-dev-actions-alignment/__tests__/end-to-end.test.ts +202 -0
- package/templates/skills/development/audit-dev-frontend/cli/audit-dev-actions-alignment/apply.ts +31 -0
- package/templates/skills/development/audit-dev-frontend/cli/audit-dev-actions-alignment/audit.ts +734 -0
- package/templates/skills/development/audit-dev-frontend/cli/audit-dev-actions-alignment/index.ts +125 -0
- package/templates/skills/development/audit-dev-frontend/cli/audit-dev-actions-alignment/types.ts +165 -0
- package/templates/skills/development/audit-dev-frontend/cli/audit-dev-actions-alignment/validate.ts +36 -0
- package/templates/skills/development/audit-dev-frontend/cli/audit-dev-frontend/__tests__/dev-ui-022.test.ts +193 -0
- package/templates/skills/development/audit-dev-frontend/cli/audit-dev-frontend/apply.ts +374 -0
- package/templates/skills/development/audit-dev-frontend/cli/audit-dev-frontend/audit.ts +1126 -0
- package/templates/skills/development/audit-dev-frontend/cli/audit-dev-frontend/index.ts +141 -0
- package/templates/skills/development/audit-dev-frontend/cli/audit-dev-frontend/types.ts +218 -0
- package/templates/skills/development/audit-dev-frontend/cli/audit-dev-frontend/validate.ts +80 -0
- package/templates/skills/development/audit-dev-tests/SKILL.md +82 -0
- package/templates/skills/development/audit-dev-tests/cli/audit-dev-tests/__tests__/audit.test.ts +220 -0
- package/templates/skills/development/audit-dev-tests/cli/audit-dev-tests/audit.ts +185 -0
- package/templates/skills/development/audit-dev-tests/cli/audit-dev-tests/index.ts +84 -0
- package/templates/skills/development/audit-dev-tests/cli/audit-dev-tests/types.ts +48 -0
- package/templates/skills/development/audit-dev-tests/cli/audit-dev-tests/validate.ts +36 -0
- package/templates/skills/development/audit-dev-wire/SKILL.md +144 -0
- package/templates/skills/development/audit-dev-wire/cli/audit-dev-wire/__tests__/audit.test.ts +171 -0
- package/templates/skills/development/audit-dev-wire/cli/audit-dev-wire/audit.ts +307 -0
- package/templates/skills/development/audit-dev-wire/cli/audit-dev-wire/index.ts +139 -0
- package/templates/skills/development/audit-dev-wire/cli/audit-dev-wire/types.ts +110 -0
- package/templates/skills/development/audit-dev-wire/cli/audit-dev-wire/validate.ts +16 -0
- package/templates/skills/development/backend/business-layer/SKILL.md +255 -0
- package/templates/skills/development/backend/business-layer/cli/scaffold-business/__tests__/generate.test.ts +254 -0
- package/templates/skills/development/backend/business-layer/cli/scaffold-business/generate.ts +842 -0
- package/templates/skills/development/backend/business-layer/cli/scaffold-business/index.ts +56 -0
- package/templates/skills/development/backend/business-layer/cli/scaffold-business/types.ts +112 -0
- package/templates/skills/development/backend/business-layer/cli/scaffold-business/validate.ts +24 -0
- package/templates/skills/development/backend/controller/SKILL.md +154 -0
- package/templates/skills/development/backend/controller/cli/scaffold-controller/__tests__/generate.test.ts +345 -0
- package/templates/skills/development/backend/controller/cli/scaffold-controller/generate.ts +280 -0
- package/templates/skills/development/backend/controller/cli/scaffold-controller/index.ts +49 -0
- package/templates/skills/development/backend/controller/cli/scaffold-controller/types.ts +72 -0
- package/templates/skills/development/backend/controller/cli/scaffold-controller/validate.ts +14 -0
- package/templates/skills/development/backend/core-seed/SKILL.md +177 -0
- package/templates/skills/development/backend/core-seed/cli/scaffold-core-seed/__tests__/build-spec.test.ts +163 -0
- package/templates/skills/development/backend/core-seed/cli/scaffold-core-seed/__tests__/generate.test.ts +330 -0
- package/templates/skills/development/backend/core-seed/cli/scaffold-core-seed/__tests__/validate.test.ts +126 -0
- package/templates/skills/development/backend/core-seed/cli/scaffold-core-seed/build-spec.ts +287 -0
- package/templates/skills/development/backend/core-seed/cli/scaffold-core-seed/generate.ts +826 -0
- package/templates/skills/development/backend/core-seed/cli/scaffold-core-seed/index.ts +188 -0
- package/templates/skills/development/backend/core-seed/cli/scaffold-core-seed/types.ts +163 -0
- package/templates/skills/development/backend/core-seed/cli/scaffold-core-seed/validate.ts +129 -0
- package/templates/skills/development/backend/data-layer/SKILL.md +163 -0
- package/templates/skills/development/backend/data-layer/cli/scaffold-entity/__tests__/generate.test.ts +155 -0
- package/templates/skills/development/backend/data-layer/cli/scaffold-entity/generate.ts +232 -0
- package/templates/skills/development/backend/data-layer/cli/scaffold-entity/index.ts +34 -0
- package/templates/skills/development/backend/data-layer/cli/scaffold-entity/types.ts +60 -0
- package/templates/skills/development/backend/data-layer/cli/scaffold-entity/validate.ts +42 -0
- package/templates/skills/development/backend/data-layer/cli/scaffold-migration/execute.ts +13 -0
- package/templates/skills/development/backend/data-layer/cli/scaffold-migration/index.ts +25 -0
- package/templates/skills/development/backend/data-layer/cli/scaffold-migration/types.ts +11 -0
- package/templates/skills/development/backend/data-layer/cli/scaffold-migration/validate.ts +9 -0
- package/templates/skills/development/backend/screen-controller/SKILL.md +169 -0
- package/templates/skills/development/backend/screen-controller/cli/scaffold-screen-controller/__tests__/generate.test.ts +329 -0
- package/templates/skills/development/backend/screen-controller/cli/scaffold-screen-controller/__tests__/hub-views.test.ts +105 -0
- package/templates/skills/development/backend/screen-controller/cli/scaffold-screen-controller/__tests__/parse-pagespec.test.ts +137 -0
- package/templates/skills/development/backend/screen-controller/cli/scaffold-screen-controller/generate.ts +437 -0
- package/templates/skills/development/backend/screen-controller/cli/scaffold-screen-controller/index.ts +108 -0
- package/templates/skills/development/backend/screen-controller/cli/scaffold-screen-controller/parse-pagespec.ts +104 -0
- package/templates/skills/development/backend/screen-controller/cli/scaffold-screen-controller/types.ts +101 -0
- package/templates/skills/development/backend/screen-controller/cli/scaffold-screen-controller/validate.ts +26 -0
- package/templates/skills/development/backend/seed-data/SKILL.md +91 -0
- package/templates/skills/development/backend/seed-data/cli/scaffold-seed/generate.ts +471 -0
- package/templates/skills/development/backend/seed-data/cli/scaffold-seed/index.ts +74 -0
- package/templates/skills/development/backend/seed-data/cli/scaffold-seed/types.ts +104 -0
- package/templates/skills/development/backend/seed-data/cli/scaffold-seed/validate.ts +63 -0
- package/templates/skills/development/backend/structure/SKILL.md +47 -0
- package/templates/skills/development/debug/SKILL.md +62 -0
- package/templates/skills/development/debug/audit-bug/SKILL.md +185 -0
- package/templates/skills/development/debug/backend/SKILL.md +114 -0
- package/templates/skills/development/debug/discuss-bug/SKILL.md +193 -0
- package/templates/skills/development/debug/fix-bug/SKILL.md +172 -0
- package/templates/skills/development/debug/frontend/SKILL.md +215 -0
- package/templates/skills/development/frontend/api-client/SKILL.md +158 -0
- package/templates/skills/development/frontend/api-client/cli/scaffold-api-client/__tests__/generate.test.ts +1180 -0
- package/templates/skills/development/frontend/api-client/cli/scaffold-api-client/__tests__/screen-strata-contract.test.ts +261 -0
- package/templates/skills/development/frontend/api-client/cli/scaffold-api-client/__tests__/url-parity.test.ts +201 -0
- package/templates/skills/development/frontend/api-client/cli/scaffold-api-client/generate.ts +875 -0
- package/templates/skills/development/frontend/api-client/cli/scaffold-api-client/index.ts +36 -0
- package/templates/skills/development/frontend/api-client/cli/scaffold-api-client/types.ts +251 -0
- package/templates/skills/development/frontend/api-client/cli/scaffold-api-client/validate.ts +10 -0
- package/templates/skills/development/frontend/auth/SKILL.md +77 -0
- package/templates/skills/development/frontend/auth/cli/scaffold-frontend-auth/generate.ts +306 -0
- package/templates/skills/development/frontend/auth/cli/scaffold-frontend-auth/index.ts +179 -0
- package/templates/skills/development/frontend/auth/cli/scaffold-frontend-auth/types.ts +22 -0
- package/templates/skills/development/frontend/auth/cli/scaffold-frontend-auth/validate.ts +37 -0
- package/templates/skills/development/frontend/component/SKILL.md +347 -0
- package/templates/skills/development/frontend/component/cli/scaffold-component/__tests__/generate.test.ts +1237 -0
- package/templates/skills/development/frontend/component/cli/scaffold-component/generate.ts +1923 -0
- package/templates/skills/development/frontend/component/cli/scaffold-component/index.ts +155 -0
- package/templates/skills/development/frontend/component/cli/scaffold-component/types.ts +290 -0
- package/templates/skills/development/frontend/component/cli/scaffold-component/validate.ts +16 -0
- package/templates/skills/development/frontend/component/cli/validate-page/__tests__/execute.test.ts +231 -0
- package/templates/skills/development/frontend/component/cli/validate-page/execute.ts +598 -0
- package/templates/skills/development/frontend/component/cli/validate-page/index.ts +88 -0
- package/templates/skills/development/frontend/component/cli/validate-page/types.ts +58 -0
- package/templates/skills/development/frontend/component/cli/validate-page/validate.ts +28 -0
- package/templates/skills/development/frontend/component/patterns/README.md +42 -0
- package/templates/skills/development/frontend/component/patterns/detail-page.md +133 -0
- package/templates/skills/development/frontend/component/patterns/entity-card.md +148 -0
- package/templates/skills/development/frontend/component/patterns/form-page.md +191 -0
- package/templates/skills/development/frontend/component/patterns/kanban-board.md +195 -0
- package/templates/skills/development/frontend/component/patterns/list-page.md +175 -0
- package/templates/skills/development/frontend/extension-config/SKILL.md +108 -0
- package/templates/skills/development/frontend/extension-config/cli/scaffold-extension-config/generate.ts +64 -0
- package/templates/skills/development/frontend/extension-config/cli/scaffold-extension-config/index.ts +70 -0
- package/templates/skills/development/frontend/extension-config/cli/scaffold-extension-config/types.ts +27 -0
- package/templates/skills/development/frontend/extension-config/cli/scaffold-extension-config/validate.ts +16 -0
- package/templates/skills/development/frontend/layout/SKILL.md +52 -0
- package/templates/skills/development/frontend/layout/cli/scaffold-layout/__tests__/generate.test.ts +66 -0
- package/templates/skills/development/frontend/layout/cli/scaffold-layout/generate.ts +175 -0
- package/templates/skills/development/frontend/layout/cli/scaffold-layout/index.ts +104 -0
- package/templates/skills/development/frontend/layout/cli/scaffold-layout/types.ts +17 -0
- package/templates/skills/development/frontend/layout/cli/scaffold-layout/validate.ts +37 -0
- package/templates/skills/development/frontend/routes/SKILL.md +152 -0
- package/templates/skills/development/frontend/routes/cli/aggregate-component-registry/generate.ts +216 -0
- package/templates/skills/development/frontend/routes/cli/aggregate-component-registry/index.ts +121 -0
- package/templates/skills/development/frontend/routes/cli/aggregate-component-registry/types.ts +69 -0
- package/templates/skills/development/frontend/routes/cli/aggregate-component-registry/validate.ts +23 -0
- package/templates/skills/development/frontend/routes/cli/scaffold-routes/__tests__/generate.test.ts +292 -0
- package/templates/skills/development/frontend/routes/cli/scaffold-routes/generate.ts +270 -0
- package/templates/skills/development/frontend/routes/cli/scaffold-routes/index.ts +42 -0
- package/templates/skills/development/frontend/routes/cli/scaffold-routes/types.ts +114 -0
- package/templates/skills/development/frontend/routes/cli/scaffold-routes/validate.ts +68 -0
- package/templates/skills/development/frontend/structure/SKILL.md +119 -0
- package/templates/skills/development/frontend/theme/SKILL.md +48 -0
- package/templates/skills/development/frontend/theme/cli/scaffold-theme/__tests__/generate.test.ts +53 -0
- package/templates/skills/development/frontend/theme/cli/scaffold-theme/generate.ts +129 -0
- package/templates/skills/development/frontend/theme/cli/scaffold-theme/index.ts +102 -0
- package/templates/skills/development/frontend/theme/cli/scaffold-theme/types.ts +48 -0
- package/templates/skills/development/frontend/theme/cli/scaffold-theme/validate.ts +37 -0
- package/templates/skills/development/frontend/ui-polish/SKILL.md +192 -0
- package/templates/skills/development/frontend/ui-polish/cli/ui-polish/__tests__/r18.test.ts +153 -0
- package/templates/skills/development/frontend/ui-polish/cli/ui-polish/__tests__/r19.test.ts +307 -0
- package/templates/skills/development/frontend/ui-polish/cli/ui-polish/__tests__/r20.test.ts +167 -0
- package/templates/skills/development/frontend/ui-polish/cli/ui-polish/__tests__/shared-scan.test.ts +262 -0
- package/templates/skills/development/frontend/ui-polish/cli/ui-polish/apply.ts +580 -0
- package/templates/skills/development/frontend/ui-polish/cli/ui-polish/audit.ts +825 -0
- package/templates/skills/development/frontend/ui-polish/cli/ui-polish/index.ts +133 -0
- package/templates/skills/development/frontend/ui-polish/cli/ui-polish/types.ts +121 -0
- package/templates/skills/development/frontend/ui-polish/cli/ui-polish/validate.ts +73 -0
- package/templates/skills/development/frontend/ui-polish/tokens.json +292 -0
- package/templates/skills/development/frontend/ui-primitives/SKILL.md +88 -0
- package/templates/skills/development/frontend/ui-primitives/cli/scaffold-ui-primitives/__tests__/generate.test.ts +158 -0
- package/templates/skills/development/frontend/ui-primitives/cli/scaffold-ui-primitives/generate.ts +345 -0
- package/templates/skills/development/frontend/ui-primitives/cli/scaffold-ui-primitives/index.ts +142 -0
- package/templates/skills/development/frontend/ui-primitives/cli/scaffold-ui-primitives/types.ts +27 -0
- package/templates/skills/development/frontend/ui-primitives/cli/scaffold-ui-primitives/validate.ts +37 -0
- package/templates/skills/development/run/SKILL.md +61 -0
- package/templates/skills/development/run/backend/SKILL.md +106 -0
- package/templates/skills/development/run/frontend/SKILL.md +116 -0
- package/templates/skills/development/smoke-test/SKILL.md +99 -0
- package/templates/skills/development/smoke-test/cli/run-smoke/execute.ts +424 -0
- package/templates/skills/development/smoke-test/cli/run-smoke/index.ts +75 -0
- package/templates/skills/development/smoke-test/cli/run-smoke/types.ts +100 -0
- package/templates/skills/development/testing/SKILL.md +148 -0
- package/templates/skills/development/testing/cli/scaffold-tests/generate.ts +530 -0
- package/templates/skills/development/testing/cli/scaffold-tests/index.ts +83 -0
- package/templates/skills/development/testing/cli/scaffold-tests/types.ts +51 -0
- package/templates/skills/development/testing/cli/scaffold-tests/validate.ts +33 -0
- package/templates/skills/development/testing/cli/scaffold-tests-from-ac/__tests__/generate.test.ts +188 -0
- package/templates/skills/development/testing/cli/scaffold-tests-from-ac/__tests__/parse-ac.test.ts +191 -0
- package/templates/skills/development/testing/cli/scaffold-tests-from-ac/generate.ts +190 -0
- package/templates/skills/development/testing/cli/scaffold-tests-from-ac/index.ts +138 -0
- package/templates/skills/development/testing/cli/scaffold-tests-from-ac/parse-ac.ts +172 -0
- package/templates/skills/development/testing/cli/scaffold-tests-from-ac/types.ts +104 -0
- package/templates/skills/development/testing/cli/scaffold-tests-from-ac/validate.ts +57 -0
- package/templates/skills/development/testing/cli/test-report/execute.ts +140 -0
- package/templates/skills/development/testing/cli/test-report/index.ts +96 -0
- package/templates/skills/development/testing/cli/test-report/types.ts +52 -0
- package/templates/skills/development/testing/cli/test-report/validate.ts +26 -0
- package/templates/skills/development/testing/fix-build/SKILL.md +81 -0
- package/templates/skills/development/testing/smoke-http/SKILL.md +123 -0
- package/templates/skills/development/testing/smoke-http/cli/smoke-http/execute.ts +129 -0
- package/templates/skills/development/testing/smoke-http/cli/smoke-http/index.ts +113 -0
- package/templates/skills/development/testing/smoke-http/cli/smoke-http/types.ts +62 -0
- package/templates/skills/development/testing/smoke-http/cli/smoke-http/validate.ts +36 -0
- package/templates/skills/development/testing/ui-test/SKILL.md +128 -0
- package/templates/skills/development/testing/ui-test/cli/build-manifest/generate.ts +129 -0
- package/templates/skills/development/testing/ui-test/cli/build-manifest/index.ts +80 -0
- package/templates/skills/development/testing/ui-test/cli/build-manifest/types.ts +72 -0
- package/templates/skills/development/testing/ui-test/cli/build-manifest/validate.ts +44 -0
- package/templates/skills/development/testing/ui-test/cli/run-ui-test/execute.ts +136 -0
- package/templates/skills/development/testing/ui-test/cli/run-ui-test/index.ts +75 -0
- package/templates/skills/development/testing/ui-test/cli/run-ui-test/lib/dev-browser-driver.ts +250 -0
- package/templates/skills/development/testing/ui-test/cli/run-ui-test/templates/delete.js.hbs +83 -0
- package/templates/skills/development/testing/ui-test/cli/run-ui-test/templates/detail.js.hbs +87 -0
- package/templates/skills/development/testing/ui-test/cli/run-ui-test/templates/edit.js.hbs +91 -0
- package/templates/skills/development/testing/ui-test/cli/run-ui-test/templates/form-submit.js.hbs +82 -0
- package/templates/skills/development/testing/ui-test/cli/run-ui-test/templates/list.js.hbs +125 -0
- package/templates/skills/development/testing/ui-test/cli/run-ui-test/templates/permission-negative.js.hbs +65 -0
- package/templates/skills/development/testing/ui-test/cli/run-ui-test/types.ts +57 -0
- package/templates/skills/development/testing/ui-test/cli/run-ui-test/validate.ts +56 -0
- package/templates/skills/documentation/SKILL.md +168 -139
- package/templates/skills/documentation/cli/extract-doc/__tests__/forbidden.test.ts +136 -0
- package/templates/skills/documentation/cli/extract-doc/__tests__/overflow.test.ts +76 -0
- package/templates/skills/documentation/cli/extract-doc/__tests__/required.test.ts +147 -0
- package/templates/skills/documentation/cli/extract-doc/extract.ts +657 -0
- package/templates/skills/documentation/cli/extract-doc/index.ts +102 -0
- package/templates/skills/documentation/cli/extract-doc/types.ts +133 -0
- package/templates/skills/documentation/cli/extract-doc/validate.ts +35 -0
- package/templates/skills/documentation/cli/scaffold-doc/generate.ts +198 -0
- package/templates/skills/documentation/cli/scaffold-doc/index.ts +61 -0
- package/templates/skills/documentation/cli/scaffold-doc/types.ts +72 -0
- package/templates/skills/documentation/cli/scaffold-doc/validate.ts +33 -0
- package/templates/skills/documentation/data-schema.md +18 -38
- package/templates/skills/documentation/steps/step-01-scan.md +59 -113
- package/templates/skills/documentation/steps/step-02-generate.md +158 -231
- package/templates/skills/documentation/steps/step-03-validate.md +101 -280
- package/templates/skills/documentation/templates.md +403 -92
- package/templates/skills/efcore/SKILL.md +88 -308
- package/templates/skills/efcore/_shared.md +140 -0
- package/templates/skills/efcore/agents/create.md +69 -0
- package/templates/skills/efcore/agents/db-update.md +58 -0
- package/templates/skills/efcore/agents/list.md +35 -0
- package/templates/skills/efcore/agents/rebase-snapshot.md +50 -0
- package/templates/skills/efcore/agents/recreate-db.md +78 -0
- package/templates/skills/efcore/agents/squash.md +78 -0
- package/templates/skills/efcore/agents/status.md +35 -0
- package/templates/skills/efcore/cli/create/execute.ts +164 -0
- package/templates/skills/efcore/cli/create/index.ts +51 -0
- package/templates/skills/efcore/cli/create/types.ts +35 -0
- package/templates/skills/efcore/cli/create/validate.ts +29 -0
- package/templates/skills/efcore/cli/lib/detect-dbcontexts.ts +195 -0
- package/templates/skills/efcore/cli/lib/ef-runner.ts +144 -0
- package/templates/skills/efcore/cli/lib/migration-name.ts +56 -0
- package/templates/skills/efcore/cli/lib/parse-csproj-version.ts +45 -0
- package/templates/skills/efcore/cli/list/execute.ts +83 -0
- package/templates/skills/efcore/cli/list/index.ts +60 -0
- package/templates/skills/efcore/cli/list/types.ts +46 -0
- package/templates/skills/efcore/cli/list/validate.ts +20 -0
- package/templates/skills/efcore/cli/rebase-snapshot/execute.ts +21 -0
- package/templates/skills/efcore/cli/rebase-snapshot/index.ts +53 -0
- package/templates/skills/efcore/cli/rebase-snapshot/types.ts +20 -0
- package/templates/skills/efcore/cli/rebase-snapshot/validate.ts +25 -0
- package/templates/skills/efcore/cli/squash/execute.ts +298 -0
- package/templates/skills/efcore/cli/squash/index.ts +57 -0
- package/templates/skills/efcore/cli/squash/types.ts +38 -0
- package/templates/skills/efcore/cli/squash/validate.ts +30 -0
- package/templates/skills/efcore/cli/status/execute.ts +152 -0
- package/templates/skills/efcore/cli/status/index.ts +45 -0
- package/templates/skills/efcore/cli/status/types.ts +32 -0
- package/templates/skills/efcore/cli/status/validate.ts +20 -0
- package/templates/skills/external/context7/SKILL.md +121 -0
- package/templates/skills/external/dev-browser/SKILL.md +134 -0
- package/templates/skills/gitflow/SKILL.md +139 -392
- package/templates/skills/gitflow/_shared.md +24 -620
- package/templates/skills/gitflow/agents/abort.md +47 -0
- package/templates/skills/gitflow/agents/cleanup.md +50 -0
- package/templates/skills/gitflow/agents/commit.md +41 -0
- package/templates/skills/gitflow/agents/finish.md +47 -0
- package/templates/skills/gitflow/agents/init.md +41 -0
- package/templates/skills/gitflow/agents/merge.md +44 -0
- package/templates/skills/gitflow/agents/pr.md +39 -0
- package/templates/skills/gitflow/agents/start.md +42 -0
- package/templates/skills/gitflow/agents/status.md +39 -0
- package/templates/skills/gitflow/agents/sync.md +38 -0
- package/templates/skills/gitflow/cli/abort/execute.ts +61 -0
- package/templates/skills/gitflow/cli/abort/index.ts +116 -0
- package/templates/skills/gitflow/cli/abort/types.ts +21 -0
- package/templates/skills/gitflow/cli/abort/validate.ts +38 -0
- package/templates/skills/gitflow/cli/cleanup/execute.ts +107 -0
- package/templates/skills/gitflow/cli/cleanup/index.ts +122 -0
- package/templates/skills/gitflow/cli/cleanup/types.ts +26 -0
- package/templates/skills/gitflow/cli/cleanup/validate.ts +33 -0
- package/templates/skills/gitflow/cli/commit/execute.ts +146 -0
- package/templates/skills/gitflow/cli/commit/index.ts +77 -0
- package/templates/skills/gitflow/cli/commit/types.ts +36 -0
- package/templates/skills/gitflow/cli/commit/validate.ts +38 -0
- package/templates/skills/gitflow/cli/finish/execute.ts +127 -0
- package/templates/skills/gitflow/cli/finish/index.ts +106 -0
- package/templates/skills/gitflow/cli/finish/types.ts +25 -0
- package/templates/skills/gitflow/cli/finish/validate.ts +44 -0
- package/templates/skills/gitflow/cli/generate-msg/execute.ts +51 -0
- package/templates/skills/gitflow/cli/generate-msg/index.ts +73 -0
- package/templates/skills/gitflow/cli/generate-msg/types.ts +37 -0
- package/templates/skills/gitflow/cli/generate-msg/validate.ts +42 -0
- package/templates/skills/gitflow/cli/init/execute.ts +186 -0
- package/templates/skills/gitflow/cli/init/index.ts +127 -0
- package/templates/skills/gitflow/cli/init/types.ts +63 -0
- package/templates/skills/gitflow/cli/init/validate.ts +56 -0
- package/templates/skills/gitflow/cli/lib/branch.ts +83 -0
- package/templates/skills/gitflow/cli/lib/config.ts +149 -0
- package/templates/skills/gitflow/cli/lib/efcore.ts +136 -0
- package/templates/skills/gitflow/cli/lib/git.ts +212 -0
- package/templates/skills/gitflow/cli/lib/output.ts +49 -0
- package/templates/skills/gitflow/cli/lib/paths.ts +54 -0
- package/templates/skills/gitflow/cli/lib/platform.ts +44 -0
- package/templates/skills/gitflow/cli/lib/provider.ts +147 -0
- package/templates/skills/gitflow/cli/lib/types.ts +189 -0
- package/templates/skills/gitflow/cli/lib/version.ts +152 -0
- package/templates/skills/gitflow/cli/lib/worktree.ts +170 -0
- package/templates/skills/gitflow/cli/merge/execute.ts +93 -0
- package/templates/skills/gitflow/cli/merge/index.ts +109 -0
- package/templates/skills/gitflow/cli/merge/types.ts +24 -0
- package/templates/skills/gitflow/cli/merge/validate.ts +33 -0
- package/templates/skills/gitflow/cli/pr/execute.ts +131 -0
- package/templates/skills/gitflow/cli/pr/index.ts +115 -0
- package/templates/skills/gitflow/cli/pr/types.ts +27 -0
- package/templates/skills/gitflow/cli/pr/validate.ts +27 -0
- package/templates/skills/gitflow/cli/start/execute.ts +98 -0
- package/templates/skills/gitflow/cli/start/index.ts +75 -0
- package/templates/skills/gitflow/cli/start/types.ts +26 -0
- package/templates/skills/gitflow/cli/start/validate.ts +47 -0
- package/templates/skills/gitflow/cli/status/execute.ts +251 -0
- package/templates/skills/gitflow/cli/status/index.ts +154 -0
- package/templates/skills/gitflow/cli/status/types.ts +75 -0
- package/templates/skills/gitflow/cli/status/validate.ts +38 -0
- package/templates/skills/gitflow/cli/sync/execute.ts +84 -0
- package/templates/skills/gitflow/cli/sync/index.ts +75 -0
- package/templates/skills/gitflow/cli/sync/types.ts +25 -0
- package/templates/skills/gitflow/cli/sync/validate.ts +34 -0
- package/templates/skills/gitflow/commit-message.md +46 -0
- package/templates/skills/init/SKILL.md +54 -0
- package/templates/skills/lib/__tests__/canonical-hash.test.ts +45 -0
- package/templates/skills/lib/__tests__/page-spec-actions.test.ts +232 -0
- package/templates/skills/lib/canonical-hash.ts +40 -0
- package/templates/skills/lib/detector.ts +243 -0
- package/templates/skills/lib/dotnet.ts +238 -0
- package/templates/skills/lib/frontend-fixers.ts +151 -0
- package/templates/skills/lib/fs.ts +238 -0
- package/templates/skills/lib/git.ts +134 -0
- package/templates/skills/lib/graph.ts +138 -0
- package/templates/skills/lib/navroute-parser.ts +51 -0
- package/templates/skills/lib/output.ts +117 -0
- package/templates/skills/lib/page-spec-actions.ts +350 -0
- package/templates/skills/lib/skill-slug.ts +121 -0
- package/templates/skills/lib/string-utils.ts +140 -0
- package/templates/skills/lib/template-loader.ts +115 -0
- package/templates/skills/lib/url-conventions.ts +151 -0
- package/templates/skills/package.json +5 -0
- package/templates/skills/quick-search/SKILL.md +99 -99
- package/templates/skills/review/SKILL.md +56 -0
- package/templates/skills/smoke-generation/SKILL.md +18 -16
- package/templates/skills/ui-components/SKILL.md +136 -457
- package/templates/skills/upgrade/SKILL.md +36 -0
- package/templates/skills/utils/SKILL.md +45 -44
- package/templates/skills/utils/subcommands/test-web-config.md +152 -152
- package/templates/skills/utils/subcommands/test-web.md +123 -123
- package/templates/skills/validate-feature/SKILL.md +102 -101
- package/templates/skills/validate-feature/references/api-smoke-tests.md +140 -140
- package/templates/skills/validate-feature/references/db-validation-checks.md +180 -180
- package/templates/skills/validate-feature/steps/step-00-dependencies.md +121 -121
- package/templates/skills/validate-feature/steps/step-01-compile.md +39 -39
- package/templates/skills/validate-feature/steps/step-02-unit-tests.md +45 -45
- package/templates/skills/validate-feature/steps/step-03-integration-tests.md +53 -53
- package/templates/skills/validate-feature/steps/step-04-api-smoke.md +94 -94
- package/templates/skills/validate-feature/steps/step-05-db-validation.md +149 -149
- package/templates/skills/validation/conventions/SKILL.md +193 -0
- package/templates/skills/validation/conventions/cli/validate-conventions/execute.ts +368 -0
- package/templates/skills/validation/conventions/cli/validate-conventions/index.ts +67 -0
- package/templates/skills/validation/conventions/cli/validate-conventions/types.ts +91 -0
- package/templates/skills/validation/conventions/cli/validate-conventions/validate.ts +36 -0
- package/templates/skills/validation/cross-validate/SKILL.md +83 -0
- package/templates/skills/validation/cross-validate/cli/execute.ts +576 -0
- package/templates/skills/validation/cross-validate/cli/index.ts +87 -0
- package/templates/skills/validation/cross-validate/cli/types.ts +85 -0
- package/templates/skills/validation/cross-validate/cli/validate.ts +54 -0
- package/templates/skills/validation/eslint/SKILL.md +65 -0
- package/templates/skills/validation/eslint/cli/execute.ts +413 -0
- package/templates/skills/validation/eslint/cli/index.ts +102 -0
- package/templates/skills/validation/eslint/cli/types.ts +48 -0
- package/templates/skills/validation/eslint/cli/validate.ts +43 -0
- package/templates/skills/validation/project-inventory/SKILL.md +166 -0
- package/templates/skills/validation/project-inventory/cli/project-inventory/execute.ts +397 -0
- package/templates/skills/validation/project-inventory/cli/project-inventory/index.ts +80 -0
- package/templates/skills/validation/project-inventory/cli/project-inventory/types.ts +89 -0
- package/templates/skills/validation/project-inventory/cli/project-inventory/validate.ts +35 -0
- package/templates/skills/validation/readiness-report/SKILL.md +109 -0
- package/templates/skills/validation/readiness-report/cli/execute.ts +236 -0
- package/templates/skills/validation/readiness-report/cli/index.ts +234 -0
- package/templates/skills/validation/readiness-report/cli/types.ts +61 -0
- package/templates/skills/validation/readiness-report/cli/validate.ts +54 -0
- package/templates/skills/validation/roslyn/SKILL.md +103 -0
- package/templates/skills/validation/roslyn/cli/execute.ts +616 -0
- package/templates/skills/validation/roslyn/cli/index.ts +86 -0
- package/templates/skills/validation/roslyn/cli/types.ts +50 -0
- package/templates/skills/validation/roslyn/cli/validate.ts +43 -0
- package/.documentation/apex.html +0 -649
- package/dist/mcp-entry.mjs +0 -68888
- package/dist/mcp-entry.mjs.map +0 -1
- package/scripts/extract-api-endpoints.ts +0 -325
- package/scripts/extract-business-rules.ts +0 -440
- package/scripts/generate-doc-with-mock-ui.ts +0 -804
- package/templates/agents/ba-reader.md +0 -386
- package/templates/agents/ba-writer.md +0 -810
- package/templates/agents/efcore/migration.md +0 -204
- package/templates/agents/efcore/rebase-snapshot.md +0 -202
- package/templates/agents/efcore/squash.md +0 -269
- package/templates/agents/gitflow/abort.md +0 -45
- package/templates/agents/gitflow/cleanup.md +0 -107
- package/templates/agents/gitflow/commit.md +0 -236
- package/templates/agents/gitflow/exec.md +0 -48
- package/templates/agents/gitflow/finish.md +0 -146
- package/templates/agents/gitflow/init-clone.md +0 -199
- package/templates/agents/gitflow/init-detect.md +0 -137
- package/templates/agents/gitflow/init-validate.md +0 -225
- package/templates/agents/gitflow/init.md +0 -509
- package/templates/agents/gitflow/merge.md +0 -145
- package/templates/agents/gitflow/plan.md +0 -42
- package/templates/agents/gitflow/pr.md +0 -191
- package/templates/agents/gitflow/review.md +0 -49
- package/templates/agents/gitflow/start.md +0 -147
- package/templates/agents/gitflow/status.md +0 -95
- package/templates/agents/mcp-healthcheck.md +0 -163
- package/templates/hooks/docs-drift-check.md +0 -96
- package/templates/hooks/ef-migration-check.md +0 -139
- package/templates/hooks/mcp-check.md +0 -64
- package/templates/hooks/ralph-mcp-logger.sh +0 -46
- package/templates/mcp-scaffolding/component.tsx.hbs +0 -318
- package/templates/mcp-scaffolding/controller.cs.hbs +0 -118
- package/templates/mcp-scaffolding/entity-extension.cs.hbs +0 -239
- package/templates/mcp-scaffolding/frontend/api-client.ts.hbs +0 -117
- package/templates/mcp-scaffolding/frontend/nav-routes.ts.hbs +0 -133
- package/templates/mcp-scaffolding/migrations/seed-roles.cs.hbs +0 -261
- package/templates/mcp-scaffolding/service-extension.cs.hbs +0 -53
- package/templates/mcp-scaffolding/tests/controller.test.cs.hbs +0 -436
- package/templates/mcp-scaffolding/tests/entity.test.cs.hbs +0 -239
- package/templates/mcp-scaffolding/tests/repository.test.cs.hbs +0 -441
- package/templates/mcp-scaffolding/tests/security.test.cs.hbs +0 -442
- package/templates/mcp-scaffolding/tests/service.test.cs.hbs +0 -402
- package/templates/mcp-scaffolding/tests/validator.test.cs.hbs +0 -428
- package/templates/skills/_resources/config-safety.md +0 -61
- package/templates/skills/_resources/context-digest-template.md +0 -53
- package/templates/skills/_resources/doc-context-cache.md +0 -60
- package/templates/skills/_resources/docs-manifest-schema.md +0 -155
- package/templates/skills/_resources/formatting-guide.md +0 -124
- package/templates/skills/_resources/mcp-validate-documentation-spec.md +0 -181
- package/templates/skills/_shared.md +0 -228
- package/templates/skills/admin/SKILL.md +0 -48
- package/templates/skills/ai-prompt/SKILL.md +0 -171
- package/templates/skills/ai-prompt/references/ai-agent-modes.md +0 -89
- package/templates/skills/ai-prompt/references/eval-framework.md +0 -129
- package/templates/skills/ai-prompt/steps/step-00-init.md +0 -47
- package/templates/skills/ai-prompt/steps/step-01-implementation.md +0 -122
- package/templates/skills/apex/SKILL.md +0 -234
- package/templates/skills/apex/_shared.md +0 -197
- package/templates/skills/apex/references/analysis-methods.md +0 -178
- package/templates/skills/apex/references/challenge-questions.md +0 -359
- package/templates/skills/apex/references/checks/architecture-checks.sh +0 -154
- package/templates/skills/apex/references/checks/backend-checks.sh +0 -208
- package/templates/skills/apex/references/checks/frontend-checks.sh +0 -560
- package/templates/skills/apex/references/checks/infrastructure-checks.sh +0 -292
- package/templates/skills/apex/references/checks/security-checks.sh +0 -153
- package/templates/skills/apex/references/checks/seed-checks.sh +0 -610
- package/templates/skills/apex/references/code-generation.md +0 -412
- package/templates/skills/apex/references/core-seed-data.md +0 -1502
- package/templates/skills/apex/references/domain-events-pattern.md +0 -45
- package/templates/skills/apex/references/entity-hooks-pattern.md +0 -68
- package/templates/skills/apex/references/error-classification.md +0 -168
- package/templates/skills/apex/references/frontend-route-wiring-app-tsx.md +0 -91
- package/templates/skills/apex/references/licensing-enforcement.md +0 -52
- package/templates/skills/apex/references/parallel-execution.md +0 -187
- package/templates/skills/apex/references/person-extension-pattern.md +0 -619
- package/templates/skills/apex/references/post-checks.md +0 -162
- package/templates/skills/apex/references/smartstack-api.md +0 -591
- package/templates/skills/apex/references/smartstack-frontend-compliance.md +0 -616
- package/templates/skills/apex/references/smartstack-frontend.md +0 -442
- package/templates/skills/apex/references/smartstack-layers.md +0 -551
- package/templates/skills/apex/steps/step-00-init.md +0 -405
- package/templates/skills/apex/steps/step-01-analyze.md +0 -210
- package/templates/skills/apex/steps/step-02-plan.md +0 -303
- package/templates/skills/apex/steps/step-03-execute.md +0 -194
- package/templates/skills/apex/steps/step-03a-layer0-domain.md +0 -144
- package/templates/skills/apex/steps/step-03b-layer1-seed.md +0 -339
- package/templates/skills/apex/steps/step-03c-layer2-backend.md +0 -401
- package/templates/skills/apex/steps/step-03d-layer3-frontend.md +0 -562
- package/templates/skills/apex/steps/step-03e-layer4-devdata.md +0 -46
- package/templates/skills/apex/steps/step-04-examine.md +0 -404
- package/templates/skills/apex/steps/step-05-deep-review.md +0 -140
- package/templates/skills/apex/steps/step-06-resolve.md +0 -120
- package/templates/skills/apex/steps/step-07-tests.md +0 -271
- package/templates/skills/apex/steps/step-08-run-tests.md +0 -135
- package/templates/skills/apex-verify/SKILL.md +0 -110
- package/templates/skills/apex-verify/references/audit-rules.md +0 -50
- package/templates/skills/apex-verify/steps/step-00-init.md +0 -119
- package/templates/skills/apex-verify/steps/step-01-nav-audit.md +0 -96
- package/templates/skills/apex-verify/steps/step-02-crud-audit.md +0 -127
- package/templates/skills/apex-verify/steps/step-03-perm-audit.md +0 -119
- package/templates/skills/apex-verify/steps/step-04-route-audit.md +0 -98
- package/templates/skills/apex-verify/steps/step-05-report.md +0 -110
- package/templates/skills/application/SKILL.md +0 -241
- package/templates/skills/application/references/application-roles-template.md +0 -228
- package/templates/skills/application/references/backend-controller-hierarchy.md +0 -68
- package/templates/skills/application/references/backend-entity-seeding.md +0 -73
- package/templates/skills/application/references/backend-seeding-and-dto-output.md +0 -83
- package/templates/skills/application/references/backend-table-prefix-mapping.md +0 -80
- package/templates/skills/application/references/backend-verification.md +0 -88
- package/templates/skills/application/references/contexts-cheatsheet.md +0 -86
- package/templates/skills/application/references/extensions-system.md +0 -158
- package/templates/skills/application/references/frontend-i18n-and-output.md +0 -67
- package/templates/skills/application/references/frontend-route-naming.md +0 -123
- package/templates/skills/application/references/frontend-route-wiring-app-tsx.md +0 -91
- package/templates/skills/application/references/frontend-verification.md +0 -158
- package/templates/skills/application/references/init-parameter-detection.md +0 -121
- package/templates/skills/application/references/migration-checklist-troubleshooting.md +0 -88
- package/templates/skills/application/references/nav-fallback-procedure.md +0 -198
- package/templates/skills/application/references/provider-template.md +0 -191
- package/templates/skills/application/references/roles-client-project-handling.md +0 -55
- package/templates/skills/application/references/roles-fallback-procedure.md +0 -144
- package/templates/skills/application/references/smartstack-provider.md +0 -118
- package/templates/skills/application/references/test-coverage-requirements.md +0 -213
- package/templates/skills/application/references/test-frontend.md +0 -73
- package/templates/skills/application/references/test-prerequisites.md +0 -72
- package/templates/skills/application/references/themes-db-driven.md +0 -484
- package/templates/skills/application/steps/step-00-init.md +0 -130
- package/templates/skills/application/steps/step-01-navigation.md +0 -170
- package/templates/skills/application/steps/step-02-permissions.md +0 -196
- package/templates/skills/application/steps/step-03-roles.md +0 -182
- package/templates/skills/application/steps/step-03b-provider.md +0 -134
- package/templates/skills/application/steps/step-04-backend.md +0 -174
- package/templates/skills/application/steps/step-05-frontend.md +0 -189
- package/templates/skills/application/steps/step-06-migration.md +0 -189
- package/templates/skills/application/steps/step-07-tests.md +0 -356
- package/templates/skills/application/steps/step-08-documentation.md +0 -137
- package/templates/skills/application/templates-backend.md +0 -463
- package/templates/skills/application/templates-frontend.md +0 -950
- package/templates/skills/application/templates-i18n.md +0 -520
- package/templates/skills/application/templates-seed.md +0 -1110
- package/templates/skills/audit-route/SKILL.md +0 -107
- package/templates/skills/audit-route/references/routing-pattern.md +0 -131
- package/templates/skills/audit-route/steps/step-00-init.md +0 -128
- package/templates/skills/audit-route/steps/step-01-inventory.md +0 -157
- package/templates/skills/audit-route/steps/step-02-conformity.md +0 -193
- package/templates/skills/audit-route/steps/step-03-report.md +0 -201
- package/templates/skills/business-analyse/SKILL.md +0 -252
- package/templates/skills/business-analyse/_shared.md +0 -276
- package/templates/skills/business-analyse/patterns/suggestion-catalog.md +0 -560
- package/templates/skills/business-analyse/questionnaire/01-context.md +0 -43
- package/templates/skills/business-analyse/questionnaire/02-stakeholders-scope.md +0 -111
- package/templates/skills/business-analyse/questionnaire/03-data-ui.md +0 -125
- package/templates/skills/business-analyse/questionnaire/04-risks-metrics.md +0 -6
- package/templates/skills/business-analyse/questionnaire/05-cross-module.md +0 -69
- package/templates/skills/business-analyse/questionnaire.md +0 -156
- package/templates/skills/business-analyse/react/application-viewer.md +0 -242
- package/templates/skills/business-analyse/react/components.md +0 -532
- package/templates/skills/business-analyse/react/i18n-template.md +0 -306
- package/templates/skills/business-analyse/react/schema.md +0 -831
- package/templates/skills/business-analyse/references/03-json-schemas.md +0 -221
- package/templates/skills/business-analyse/references/03-post-check-validation.md +0 -208
- package/templates/skills/business-analyse/references/03-smartstack-entity-guards.md +0 -32
- package/templates/skills/business-analyse/references/04-cross-module-validation.md +0 -95
- package/templates/skills/business-analyse/references/04-file-allocation.md +0 -162
- package/templates/skills/business-analyse/references/04-naming-audit-checks.md +0 -174
- package/templates/skills/business-analyse/references/04-semantic-validation-matrix.md +0 -118
- package/templates/skills/business-analyse/references/acceptance-criteria.md +0 -164
- package/templates/skills/business-analyse/references/analysis-semantic-checks.md +0 -190
- package/templates/skills/business-analyse/references/canonical-json-formats.md +0 -204
- package/templates/skills/business-analyse/references/compilation-structure-cards.md +0 -297
- package/templates/skills/business-analyse/references/consolidation-structural-checks.md +0 -124
- package/templates/skills/business-analyse/references/detection-strategies.md +0 -424
- package/templates/skills/business-analyse/references/domain-research-playbook.md +0 -234
- package/templates/skills/business-analyse/references/entity-architecture-decision.md +0 -240
- package/templates/skills/business-analyse/references/entity-sourcing-presentation.md +0 -166
- package/templates/skills/business-analyse/references/init-resume-logic.md +0 -70
- package/templates/skills/business-analyse/references/init-schema-deployment.md +0 -65
- package/templates/skills/business-analyse/references/module-completeness-challenge.md +0 -174
- package/templates/skills/business-analyse/references/multi-app-detection.md +0 -149
- package/templates/skills/business-analyse/references/naming-conventions.md +0 -253
- package/templates/skills/business-analyse/references/portal-classification.md +0 -52
- package/templates/skills/business-analyse/references/robustness-checks.md +0 -426
- package/templates/skills/business-analyse/references/ui-dashboard-spec.md +0 -85
- package/templates/skills/business-analyse/references/ui-resource-cards.md +0 -259
- package/templates/skills/business-analyse/references/validation-checklist.md +0 -378
- package/templates/skills/business-analyse/schemas/application-schema.json +0 -481
- package/templates/skills/business-analyse/schemas/feature-schema.json +0 -53
- package/templates/skills/business-analyse/schemas/index-schema.json +0 -47
- package/templates/skills/business-analyse/schemas/project-schema.json +0 -481
- package/templates/skills/business-analyse/schemas/sections/analysis-schema.json +0 -245
- package/templates/skills/business-analyse/schemas/sections/discovery-schema.json +0 -80
- package/templates/skills/business-analyse/schemas/sections/handoff-schema.json +0 -82
- package/templates/skills/business-analyse/schemas/sections/metadata-schema.json +0 -70
- package/templates/skills/business-analyse/schemas/sections/specification-schema.json +0 -567
- package/templates/skills/business-analyse/schemas/sections/validation-schema.json +0 -93
- package/templates/skills/business-analyse/schemas/shared/common-defs.json +0 -227
- package/templates/skills/business-analyse/steps/step-00-init.md +0 -463
- package/templates/skills/business-analyse/steps/step-01-cadrage.md +0 -901
- package/templates/skills/business-analyse/steps/step-02-structure.md +0 -315
- package/templates/skills/business-analyse/steps/step-03-specify.md +0 -986
- package/templates/skills/business-analyse/steps/step-04-consolidate.md +0 -928
- package/templates/skills/business-analyse/templates/tpl-frd.md +0 -168
- package/templates/skills/business-analyse/templates/tpl-handoff.md +0 -189
- package/templates/skills/business-analyse/templates/tpl-launch-displays.md +0 -59
- package/templates/skills/business-analyse/templates-frd.md +0 -476
- package/templates/skills/business-analyse/templates-react.md +0 -574
- package/templates/skills/business-analyse-design/SKILL.md +0 -101
- package/templates/skills/business-analyse-design/references/screens-post-check.md +0 -221
- package/templates/skills/business-analyse-design/references/screens-type-mapping.md +0 -138
- package/templates/skills/business-analyse-design/references/smartcomponents-templates.md +0 -225
- package/templates/skills/business-analyse-design/references/spec-auto-inference.md +0 -117
- package/templates/skills/business-analyse-design/steps/step-01-screens.md +0 -108
- package/templates/skills/business-analyse-design/steps/step-02-wireframes.md +0 -155
- package/templates/skills/business-analyse-design/steps/step-03-navigation.md +0 -189
- package/templates/skills/business-analyse-develop/SKILL.md +0 -250
- package/templates/skills/business-analyse-develop/references/category-completeness.md +0 -326
- package/templates/skills/business-analyse-develop/references/category-rules.md +0 -109
- package/templates/skills/business-analyse-develop/references/compact-loop.md +0 -478
- package/templates/skills/business-analyse-develop/references/handoff-quality-gate.md +0 -132
- package/templates/skills/business-analyse-develop/references/init-resume-recovery.md +0 -183
- package/templates/skills/business-analyse-develop/references/module-transition.md +0 -246
- package/templates/skills/business-analyse-develop/references/multi-module-queue.md +0 -171
- package/templates/skills/business-analyse-develop/references/parallel-execution.md +0 -246
- package/templates/skills/business-analyse-develop/references/prd-v3-transformation.md +0 -326
- package/templates/skills/business-analyse-develop/references/quality-gates.md +0 -160
- package/templates/skills/business-analyse-develop/references/report-reconciliation.md +0 -140
- package/templates/skills/business-analyse-develop/references/report-template.md +0 -142
- package/templates/skills/business-analyse-develop/references/section-splitting.md +0 -439
- package/templates/skills/business-analyse-develop/references/task-transform-legacy.md +0 -256
- package/templates/skills/business-analyse-develop/references/team-orchestration.md +0 -547
- package/templates/skills/business-analyse-develop/steps/step-00-init.md +0 -242
- package/templates/skills/business-analyse-develop/steps/step-01-task.md +0 -182
- package/templates/skills/business-analyse-develop/steps/step-01-v4-execute.md +0 -139
- package/templates/skills/business-analyse-develop/steps/step-02-execute.md +0 -216
- package/templates/skills/business-analyse-develop/steps/step-02-v4-verify.md +0 -176
- package/templates/skills/business-analyse-develop/steps/step-03-commit.md +0 -107
- package/templates/skills/business-analyse-develop/steps/step-04-check.md +0 -419
- package/templates/skills/business-analyse-develop/steps/step-05-report.md +0 -137
- package/templates/skills/business-analyse-handoff/SKILL.md +0 -101
- package/templates/skills/business-analyse-handoff/references/acceptance-criteria.md +0 -318
- package/templates/skills/business-analyse-handoff/references/agent-handoff-transform-prompt.md +0 -211
- package/templates/skills/business-analyse-handoff/references/context-isolation-pattern.md +0 -47
- package/templates/skills/business-analyse-handoff/references/entity-canonicalization.md +0 -158
- package/templates/skills/business-analyse-handoff/references/entity-domain-mapping.md +0 -115
- package/templates/skills/business-analyse-handoff/references/handoff-file-inventory.md +0 -49
- package/templates/skills/business-analyse-handoff/references/handoff-file-templates.md +0 -197
- package/templates/skills/business-analyse-handoff/references/handoff-global-validation.md +0 -142
- package/templates/skills/business-analyse-handoff/references/handoff-mappings.md +0 -108
- package/templates/skills/business-analyse-handoff/references/handoff-seeddata-generation.md +0 -314
- package/templates/skills/business-analyse-handoff/references/prd-generation.md +0 -362
- package/templates/skills/business-analyse-handoff/references/prd-validation-checks.md +0 -125
- package/templates/skills/business-analyse-handoff/references/project-index-update.md +0 -98
- package/templates/skills/business-analyse-handoff/references/readiness-scoring.md +0 -95
- package/templates/skills/business-analyse-handoff/schemas/handoff-schema.json +0 -95
- package/templates/skills/business-analyse-handoff/steps/step-00-validate.md +0 -158
- package/templates/skills/business-analyse-handoff/steps/step-01-transform.md +0 -85
- package/templates/skills/business-analyse-handoff/steps/step-02-export.md +0 -169
- package/templates/skills/business-analyse-handoff/templates/tpl-progress.md +0 -172
- package/templates/skills/business-analyse-html/SKILL.md +0 -89
- package/templates/skills/business-analyse-html/html/ba-interactive.html +0 -6134
- package/templates/skills/business-analyse-html/html/build-html.js +0 -137
- package/templates/skills/business-analyse-html/html/src/partials/cadrage-context.html +0 -34
- package/templates/skills/business-analyse-html/html/src/partials/cadrage-scope.html +0 -27
- package/templates/skills/business-analyse-html/html/src/partials/cadrage-stakeholders.html +0 -55
- package/templates/skills/business-analyse-html/html/src/partials/cadrage-success.html +0 -34
- package/templates/skills/business-analyse-html/html/src/partials/consol-datamodel.html +0 -8
- package/templates/skills/business-analyse-html/html/src/partials/consol-flows.html +0 -29
- package/templates/skills/business-analyse-html/html/src/partials/consol-interactions.html +0 -8
- package/templates/skills/business-analyse-html/html/src/partials/consol-permissions.html +0 -8
- package/templates/skills/business-analyse-html/html/src/partials/decomp-dependencies.html +0 -38
- package/templates/skills/business-analyse-html/html/src/partials/decomp-modules.html +0 -43
- package/templates/skills/business-analyse-html/html/src/partials/handoff-summary.html +0 -24
- package/templates/skills/business-analyse-html/html/src/partials/module-spec-container.html +0 -4
- package/templates/skills/business-analyse-html/html/src/scripts/01-data-init.js +0 -313
- package/templates/skills/business-analyse-html/html/src/scripts/02-navigation.js +0 -316
- package/templates/skills/business-analyse-html/html/src/scripts/03-render-cadrage.js +0 -162
- package/templates/skills/business-analyse-html/html/src/scripts/04-render-modules.js +0 -203
- package/templates/skills/business-analyse-html/html/src/scripts/05-render-specs.js +0 -866
- package/templates/skills/business-analyse-html/html/src/scripts/06-render-consolidation.js +0 -196
- package/templates/skills/business-analyse-html/html/src/scripts/06-render-mockups.js +0 -564
- package/templates/skills/business-analyse-html/html/src/scripts/07-render-handoff.js +0 -108
- package/templates/skills/business-analyse-html/html/src/scripts/08-editing.js +0 -137
- package/templates/skills/business-analyse-html/html/src/scripts/09-export.js +0 -138
- package/templates/skills/business-analyse-html/html/src/scripts/10-comments.js +0 -221
- package/templates/skills/business-analyse-html/html/src/scripts/11-review-panel.js +0 -167
- package/templates/skills/business-analyse-html/html/src/scripts/12-render-diagrams.js +0 -162
- package/templates/skills/business-analyse-html/html/src/styles/01-variables.css +0 -38
- package/templates/skills/business-analyse-html/html/src/styles/02-layout.css +0 -216
- package/templates/skills/business-analyse-html/html/src/styles/03-navigation.css +0 -120
- package/templates/skills/business-analyse-html/html/src/styles/04-cards.css +0 -194
- package/templates/skills/business-analyse-html/html/src/styles/05-modules.css +0 -518
- package/templates/skills/business-analyse-html/html/src/styles/06-wireframes.css +0 -263
- package/templates/skills/business-analyse-html/html/src/styles/07-comments.css +0 -184
- package/templates/skills/business-analyse-html/html/src/styles/08-review-panel.css +0 -241
- package/templates/skills/business-analyse-html/html/src/styles/09-mockups-html.css +0 -220
- package/templates/skills/business-analyse-html/html/src/styles/10-diagrams.css +0 -73
- package/templates/skills/business-analyse-html/html/src/template.html +0 -449
- package/templates/skills/business-analyse-html/references/02-embedded-artifacts-building.md +0 -144
- package/templates/skills/business-analyse-html/references/02-feature-data-building.md +0 -143
- package/templates/skills/business-analyse-html/references/02-mapping-tables.md +0 -442
- package/templates/skills/business-analyse-html/references/02-normalization-helpers.md +0 -139
- package/templates/skills/business-analyse-html/references/02-screen-format-detection.md +0 -283
- package/templates/skills/business-analyse-html/references/02-self-check-validation.md +0 -199
- package/templates/skills/business-analyse-html/references/data-build.md +0 -215
- package/templates/skills/business-analyse-html/references/data-mapping.md +0 -452
- package/templates/skills/business-analyse-html/references/output-modes.md +0 -119
- package/templates/skills/business-analyse-html/references/wireframe-svg-style-guide.md +0 -335
- package/templates/skills/business-analyse-html/steps/step-01-collect.md +0 -140
- package/templates/skills/business-analyse-html/steps/step-02-build-data.md +0 -76
- package/templates/skills/business-analyse-html/steps/step-03-render.md +0 -95
- package/templates/skills/business-analyse-html/steps/step-04-verify.md +0 -224
- package/templates/skills/business-analyse-quick/SKILL.md +0 -807
- package/templates/skills/business-analyse-quick/references/domain-heuristics.md +0 -172
- package/templates/skills/business-analyse-quick/references/prd-schema.md +0 -268
- package/templates/skills/business-analyse-review/SKILL.md +0 -71
- package/templates/skills/business-analyse-review/references/review-data-mapping.md +0 -367
- package/templates/skills/business-analyse-review/steps/step-00-init.md +0 -111
- package/templates/skills/business-analyse-review/steps/step-01-apply.md +0 -304
- package/templates/skills/business-analyse-status/SKILL.md +0 -136
- package/templates/skills/cc-agent/SKILL.md +0 -129
- package/templates/skills/cc-agent/references/agent-behavior-patterns.md +0 -95
- package/templates/skills/cc-agent/references/agent-frontmatter.md +0 -213
- package/templates/skills/cc-agent/references/permission-modes.md +0 -102
- package/templates/skills/cc-agent/references/tools-reference.md +0 -144
- package/templates/skills/cc-agent/steps/step-00-init.md +0 -134
- package/templates/skills/cc-agent/steps/step-01-design.md +0 -186
- package/templates/skills/cc-agent/steps/step-02-generate.md +0 -131
- package/templates/skills/cc-agent/steps/step-03-validate.md +0 -130
- package/templates/skills/cc-agent/templates/agent-categorized.md +0 -67
- package/templates/skills/cc-agent/templates/agent-standalone.md +0 -56
- package/templates/skills/cc-agent/templates/agent-with-skills.md +0 -94
- package/templates/skills/cc-audit/SKILL.md +0 -108
- package/templates/skills/cc-audit/references/agent-checklist.md +0 -91
- package/templates/skills/cc-audit/references/hook-checklist.md +0 -110
- package/templates/skills/cc-audit/references/skill-checklist.md +0 -70
- package/templates/skills/cc-audit/steps/step-00-init.md +0 -98
- package/templates/skills/cc-audit/steps/step-01-scan.md +0 -142
- package/templates/skills/cc-audit/steps/step-02-analyze.md +0 -158
- package/templates/skills/cc-audit/steps/step-03-report.md +0 -142
- package/templates/skills/cc-skill/SKILL.md +0 -134
- package/templates/skills/cc-skill/references/best-practices.md +0 -167
- package/templates/skills/cc-skill/references/frontmatter-reference.md +0 -182
- package/templates/skills/cc-skill/references/skill-patterns.md +0 -199
- package/templates/skills/cc-skill/steps/step-00-init.md +0 -119
- package/templates/skills/cc-skill/steps/step-01-design.md +0 -199
- package/templates/skills/cc-skill/steps/step-02-generate.md +0 -145
- package/templates/skills/cc-skill/steps/step-03-steps.md +0 -151
- package/templates/skills/cc-skill/steps/step-04-validate.md +0 -124
- package/templates/skills/cc-skill/templates/skill-forked.md +0 -85
- package/templates/skills/cc-skill/templates/skill-progressive.md +0 -102
- package/templates/skills/cc-skill/templates/skill-simple.md +0 -75
- package/templates/skills/cc-skill/templates/step-template.md +0 -82
- package/templates/skills/controller/SKILL.md +0 -162
- package/templates/skills/controller/postman-templates.md +0 -614
- package/templates/skills/controller/references/controller-code-templates.md +0 -162
- package/templates/skills/controller/references/mcp-scaffold-workflow.md +0 -237
- package/templates/skills/controller/references/permission-sync-templates.md +0 -149
- package/templates/skills/controller/steps/step-00-init.md +0 -193
- package/templates/skills/controller/steps/step-01-analyze.md +0 -152
- package/templates/skills/controller/steps/step-02-plan.md +0 -176
- package/templates/skills/controller/steps/step-03-generate.md +0 -189
- package/templates/skills/controller/steps/step-04-perms.md +0 -80
- package/templates/skills/controller/steps/step-05-validate.md +0 -107
- package/templates/skills/controller/templates.md +0 -1556
- package/templates/skills/debug/SKILL.md +0 -70
- package/templates/skills/debug/references/team-protocol.md +0 -232
- package/templates/skills/debug/steps/step-00-init.md +0 -57
- package/templates/skills/debug/steps/step-01-analyze.md +0 -219
- package/templates/skills/debug/steps/step-02-resolve.md +0 -85
- package/templates/skills/efcore/references/database-operations.md +0 -66
- package/templates/skills/efcore/references/reset-operations.md +0 -81
- package/templates/skills/efcore/references/seed-methods.md +0 -86
- package/templates/skills/efcore/references/shared-init-functions.md +0 -250
- package/templates/skills/efcore/references/sql-objects-injection.md +0 -19
- package/templates/skills/efcore/references/troubleshooting.md +0 -81
- package/templates/skills/efcore/references/zero-downtime-patterns.md +0 -229
- package/templates/skills/explore/SKILL.md +0 -98
- package/templates/skills/feature-full/SKILL.md +0 -111
- package/templates/skills/feature-full/steps/step-00-init.md +0 -57
- package/templates/skills/feature-full/steps/step-01-implementation.md +0 -133
- package/templates/skills/gitflow/phases/abort.md +0 -189
- package/templates/skills/gitflow/phases/cleanup.md +0 -264
- package/templates/skills/gitflow/phases/status.md +0 -192
- package/templates/skills/gitflow/references/commit-message-generation.md +0 -58
- package/templates/skills/gitflow/references/commit-migration-validation.md +0 -53
- package/templates/skills/gitflow/references/finish-cleanup.md +0 -55
- package/templates/skills/gitflow/references/finish-version-bumping.md +0 -45
- package/templates/skills/gitflow/references/init-config-template.md +0 -143
- package/templates/skills/gitflow/references/init-environment-detection.md +0 -41
- package/templates/skills/gitflow/references/init-name-normalization.md +0 -118
- package/templates/skills/gitflow/references/init-questions.md +0 -193
- package/templates/skills/gitflow/references/init-structure-creation.md +0 -75
- package/templates/skills/gitflow/references/init-version-detection.md +0 -23
- package/templates/skills/gitflow/references/init-workspace-detection.md +0 -43
- package/templates/skills/gitflow/references/merge-ci-status.md +0 -36
- package/templates/skills/gitflow/references/merge-execution.md +0 -62
- package/templates/skills/gitflow/references/merge-pr-context.md +0 -76
- package/templates/skills/gitflow/references/plan-template.md +0 -69
- package/templates/skills/gitflow/references/pr-build-checks.md +0 -60
- package/templates/skills/gitflow/references/pr-generation.md +0 -58
- package/templates/skills/gitflow/references/start-branch-normalization.md +0 -28
- package/templates/skills/gitflow/references/start-efcore-preflight.md +0 -70
- package/templates/skills/gitflow/references/start-local-config.md +0 -113
- package/templates/skills/gitflow/references/start-worktree-creation.md +0 -50
- package/templates/skills/gitflow/references/sync-push-verify.md +0 -44
- package/templates/skills/gitflow/references/sync-rebase-conflicts.md +0 -38
- package/templates/skills/gitflow/steps/step-commit.md +0 -199
- package/templates/skills/gitflow/steps/step-finish.md +0 -147
- package/templates/skills/gitflow/steps/step-init.md +0 -230
- package/templates/skills/gitflow/steps/step-merge.md +0 -85
- package/templates/skills/gitflow/steps/step-plan.md +0 -151
- package/templates/skills/gitflow/steps/step-pr.md +0 -247
- package/templates/skills/gitflow/steps/step-start.md +0 -195
- package/templates/skills/gitflow/steps/step-sync.md +0 -161
- package/templates/skills/gitflow/templates/config.json +0 -72
- package/templates/skills/mcp/SKILL.md +0 -62
- package/templates/skills/mcp/steps/step-01-healthcheck.md +0 -108
- package/templates/skills/mcp/steps/step-02-tools.md +0 -73
- package/templates/skills/migrate/SKILL.md +0 -312
- package/templates/skills/migrate/references/v3.34-to-v3.46.md +0 -289
- package/templates/skills/notification/SKILL.md +0 -173
- package/templates/skills/refactor/SKILL.md +0 -56
- package/templates/skills/refactor/steps/step-01-discover.md +0 -60
- package/templates/skills/refactor/steps/step-02-execute.md +0 -67
- package/templates/skills/review-code/SKILL.md +0 -95
- package/templates/skills/review-code/references/clean-code-principles.md +0 -292
- package/templates/skills/review-code/references/code-quality-metrics.md +0 -174
- package/templates/skills/review-code/references/feedback-patterns.md +0 -149
- package/templates/skills/review-code/references/owasp-api-top10.md +0 -243
- package/templates/skills/review-code/references/security-checklist.md +0 -212
- package/templates/skills/review-code/references/smartstack-conventions.md +0 -568
- package/templates/skills/review-code/steps/step-01-smartstack.md +0 -96
- package/templates/skills/review-code/steps/step-02-detailed-review.md +0 -80
- package/templates/skills/review-code/steps/step-03-react.md +0 -44
- package/templates/skills/sketch/SKILL.md +0 -34
- package/templates/skills/ui-components/accessibility.md +0 -170
- package/templates/skills/ui-components/patterns/dashboard-chart.md +0 -327
- package/templates/skills/ui-components/patterns/data-table.md +0 -175
- package/templates/skills/ui-components/patterns/entity-card.md +0 -77
- package/templates/skills/ui-components/patterns/grid-layout.md +0 -91
- package/templates/skills/ui-components/patterns/kanban.md +0 -43
- package/templates/skills/ui-components/references/component-catalog.md +0 -82
- package/templates/skills/ui-components/responsive-guidelines.md +0 -278
- package/templates/skills/ui-components/style-guide.md +0 -113
- package/templates/skills/validate/SKILL.md +0 -181
- package/templates/skills/workflow/SKILL.md +0 -196
- package/templates/skills/workflow/steps/step-00-init.md +0 -57
- package/templates/skills/workflow/steps/step-01-implementation.md +0 -84
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* cli:scaffold-api-client — Generate TypeScript API clients + React Query hooks
|
|
4
|
+
*/
|
|
5
|
+
import { parseArgs } from 'node:util'
|
|
6
|
+
import { mkdirSync, writeFileSync } from 'node:fs'
|
|
7
|
+
import { dirname, resolve, join } from 'node:path'
|
|
8
|
+
import { validate } from './validate.js'
|
|
9
|
+
import { generate } from './generate.js'
|
|
10
|
+
import { generateEnvelope, failGenerate, printEnvelope } from '../../../../../lib/output.js'
|
|
11
|
+
|
|
12
|
+
const COMMAND = 'scaffold-api-client'
|
|
13
|
+
|
|
14
|
+
function main(): void {
|
|
15
|
+
const { values } = parseArgs({ options: { spec: { type: 'string' }, outdir: { type: 'string' }, dry_run: { type: 'boolean', default: false } }, strict: true })
|
|
16
|
+
if (!values.spec) { printEnvelope(failGenerate(COMMAND, ['--spec is required'])); process.exit(1) }
|
|
17
|
+
let raw: unknown
|
|
18
|
+
try { raw = JSON.parse(values.spec) } catch { printEnvelope(failGenerate(COMMAND, ['Invalid JSON'])); process.exit(1) }
|
|
19
|
+
const validation = validate(raw)
|
|
20
|
+
if (!validation.valid) { printEnvelope(failGenerate(COMMAND, validation.errors)); process.exit(1) }
|
|
21
|
+
const spec = raw as any
|
|
22
|
+
const files = generate(spec)
|
|
23
|
+
if (values.dry_run) {
|
|
24
|
+
printEnvelope(generateEnvelope(COMMAND, { data: { dryRun: true, files: files.map(f => f.path) } }))
|
|
25
|
+
process.exit(0)
|
|
26
|
+
}
|
|
27
|
+
const outdir = values.outdir ?? spec.projectPath
|
|
28
|
+
const written: string[] = []
|
|
29
|
+
for (const file of files) { const p = resolve(join(outdir, file.path)); mkdirSync(dirname(p), { recursive: true }); writeFileSync(p, file.content, 'utf-8'); written.push(p) }
|
|
30
|
+
printEnvelope(generateEnvelope(COMMAND, {
|
|
31
|
+
data: { module: spec.module, fileCount: written.length },
|
|
32
|
+
filesCreated: written,
|
|
33
|
+
nextSteps: ['Run npm run build to verify'],
|
|
34
|
+
}))
|
|
35
|
+
}
|
|
36
|
+
main()
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cli:scaffold-api-client — types.ts
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod'
|
|
5
|
+
|
|
6
|
+
export const ApiFieldSchema = z.object({ name: z.string(), type: z.string(), required: z.boolean().default(true) })
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Per-page mode (Step 5 of the per-page vertical-slice refactor): every
|
|
10
|
+
* non-CRUD action declared in the BA's `BaScreen.Config.actions[]` adds:
|
|
11
|
+
* - one method on `{entity}Service` (calls api.post(...))
|
|
12
|
+
* - one React hook (useState/useEffect) wrapping the service call
|
|
13
|
+
*
|
|
14
|
+
* `action.code` is the **business identifier** (kebab-case) used for
|
|
15
|
+
* TypeScript member naming:
|
|
16
|
+
* - service member name = toCamelCase(code) → `toggleActif`
|
|
17
|
+
* - hook name = `use` + toPascalCase(code) + Entity → `useToggleActifEmploye`
|
|
18
|
+
*
|
|
19
|
+
* `action.endpoint` (optional) is the **URL segment** matching the controller
|
|
20
|
+
* route attribute. When omitted, `code` is used as the URL segment
|
|
21
|
+
* (backward-compatible for controllers whose business and route names align).
|
|
22
|
+
* Use `endpoint` when the controller route diverges from the business
|
|
23
|
+
* identifier — e.g.:
|
|
24
|
+
* - `code: 'toggle-actif'` → `endpoint: 'activate'`
|
|
25
|
+
* - `code: 'sync-from-pce'` → `endpoint: 'sync-from-proconcept'`
|
|
26
|
+
* - `code: 'map-to-pce'` → `endpoint: 'map-proconcept'`
|
|
27
|
+
*
|
|
28
|
+
* The single source of truth across the pipeline lives in
|
|
29
|
+
* `lib/page-spec-actions.ts` (`PageCustomActionSchema`). See that file for the
|
|
30
|
+
* full contract; this schema is the per-CLI projection used by api-client
|
|
31
|
+
* generation only. ba-develop's Phase 3a spec-builder reads each controller's
|
|
32
|
+
* `[Http*("…")]` attributes to populate `endpoint` here.
|
|
33
|
+
*
|
|
34
|
+
* Hook name follows the canonical pattern : kebab → PascalCase + entity name.
|
|
35
|
+
* - `archive` row → `useArchiveBudget()` calls POST /api/.../{id}/archive
|
|
36
|
+
* - `bulk-archive` → `useBulkArchiveBudget()` calls POST /api/.../bulk/archive
|
|
37
|
+
* - `export` header → `useExportBudget()` calls POST /api/.../export
|
|
38
|
+
* - `sync-from-proconcept` → `useSyncFromProconceptBudget()` calls POST /api/.../sync-from-proconcept
|
|
39
|
+
* - `toggle-actif` + endpoint:'activate'
|
|
40
|
+
* → `useToggleActifBudget()` calls POST /api/.../{id}/activate
|
|
41
|
+
*
|
|
42
|
+
* @see lib/page-spec-actions.ts (canonical PageCustomActionSchema)
|
|
43
|
+
*/
|
|
44
|
+
export const ApiCustomActionSchema = z.object({
|
|
45
|
+
code: z.string().min(1).regex(/^[a-z][a-z0-9-]*$/, 'code must be kebab-case'),
|
|
46
|
+
/** Distinguishes API-bound actions from pure client-side navigations.
|
|
47
|
+
* `api` → emits the service member + the React hook (the default).
|
|
48
|
+
* `navigate` → emits NOTHING in scaffold-api-client (no service member,
|
|
49
|
+
* no hook). The button is rendered by scaffold-component with
|
|
50
|
+
* an inline `navigate(targetRoute)` call. Without this filter,
|
|
51
|
+
* every "open detail" or "go to dashboard" button in the BA
|
|
52
|
+
* pagespecs produced a phantom `POST /{id}/open` endpoint that
|
|
53
|
+
* does not exist on any controller — 6 entities × 1 button =
|
|
54
|
+
* 6 systematic 404s in the REFERENTIELS post-mortem.
|
|
55
|
+
* Mirrors the canonical `kind` field of `lib/page-spec-actions.ts`. */
|
|
56
|
+
kind: z.enum(['api', 'navigate']).default('api'),
|
|
57
|
+
/** URL segment used in the service call. When omitted, falls back to `code`.
|
|
58
|
+
* Use when the controller route differs from the business identifier:
|
|
59
|
+
* code: 'toggle-actif' → endpoint: 'activate'
|
|
60
|
+
* code: 'sync-from-pce' → endpoint: 'sync-from-proconcept'
|
|
61
|
+
* Accepts single segments (`activate`) or slash-separated paths
|
|
62
|
+
* (`dashboard/consolidated`) — every segment must be kebab-case. */
|
|
63
|
+
endpoint: z
|
|
64
|
+
.string()
|
|
65
|
+
.min(1)
|
|
66
|
+
.regex(/^[a-z][a-z0-9-]*(?:\/[a-z][a-z0-9-]*)*$/, 'endpoint must be kebab-case path segment(s)')
|
|
67
|
+
.optional(),
|
|
68
|
+
scope: z.enum(['row', 'bulk', 'header']).default('row'),
|
|
69
|
+
/** TypeScript payload type emitted in the hook signature (e.g.
|
|
70
|
+
* `ApproveRequest`). When null, the mutation takes no body — just an id
|
|
71
|
+
* for row-scope, or no args for header-scope. */
|
|
72
|
+
payloadType: z.string().nullable().optional(),
|
|
73
|
+
/** Optional shape for the `payloadType` interface. When provided, the
|
|
74
|
+
* scaffolder emits `export interface ${payloadType} { ${field}: ${tsType}; ... }`
|
|
75
|
+
* in `types/index.ts`. When omitted, a permissive placeholder
|
|
76
|
+
* `interface ${payloadType} { [key: string]: unknown }` is emitted with a
|
|
77
|
+
* TODO comment — this keeps TypeScript happy (no TS2304 « cannot find name »)
|
|
78
|
+
* while signalling that BA work is needed to firm up the shape. Builtin
|
|
79
|
+
* types (`string`, `string[]`, etc.) and DTOs already generated for the
|
|
80
|
+
* entity (`${E}ListDto`, …) are never re-emitted. */
|
|
81
|
+
payloadShape: z.record(z.string(), z.string()).optional(),
|
|
82
|
+
/** TypeScript response type for the service method. `void` for 204
|
|
83
|
+
* (no body) endpoints. */
|
|
84
|
+
responseType: z.string().min(1).default('void'),
|
|
85
|
+
/** Optional shape for the `responseType` interface. Same semantics as
|
|
86
|
+
* `payloadShape` above. Skipped when `responseType` is `void`. */
|
|
87
|
+
responseShape: z.record(z.string(), z.string()).optional(),
|
|
88
|
+
/** HTTP method for the service call. Defaults to `post` for mutations.
|
|
89
|
+
* Set to `get` for read-only actions like `export` whose backend
|
|
90
|
+
* controller uses `[HttpGet]`. */
|
|
91
|
+
httpMethod: z.enum(['get', 'post', 'put', 'patch', 'delete']).default('post'),
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* One column from a pagespec — used in screen-driven mode (Wave F1) to shape
|
|
96
|
+
* the TypeScript `${E}ListDto` / `${E}DetailDto` interfaces from the BA contract
|
|
97
|
+
* (`pagespecs/<Entity>.<view>.md` → `columns[]`).
|
|
98
|
+
*
|
|
99
|
+
* - `key` is the property name on the C# DTO (PascalCase on the wire,
|
|
100
|
+
* JSON-serialised camelCase by ASP.NET → matches `key` as-is
|
|
101
|
+
* when the BA author writes camelCase).
|
|
102
|
+
* - `formatHint` mirrors `scaffold-screen-controller`'s `dotnetTypeFor` so the
|
|
103
|
+
* TypeScript field type matches the C# one byte-for-byte:
|
|
104
|
+
* currency/decimal/number → number
|
|
105
|
+
* integer/count → number
|
|
106
|
+
* date/datetime → string (ISO-8601)
|
|
107
|
+
* bool/boolean → boolean
|
|
108
|
+
* guid/uuid → string
|
|
109
|
+
* (default) → string
|
|
110
|
+
*
|
|
111
|
+
* The same shape is used in the backend CLI's `PageSpecColumn` (see
|
|
112
|
+
* `templates/skills/development/backend/screen-controller/cli/scaffold-screen-controller/types.ts`).
|
|
113
|
+
* Drift between the two is caught by the integration test in
|
|
114
|
+
* `__tests__/screen-strata-contract.test.ts` (added in Wave F4).
|
|
115
|
+
*/
|
|
116
|
+
export const ApiScreenColumnSchema = z.object({
|
|
117
|
+
key: z.string().min(1),
|
|
118
|
+
formatHint: z.string().optional(),
|
|
119
|
+
})
|
|
120
|
+
|
|
121
|
+
export const ApiEntitySchema = z.object({
|
|
122
|
+
name: z.string().min(1),
|
|
123
|
+
pluralName: z.string().optional(),
|
|
124
|
+
section: z.string().min(1),
|
|
125
|
+
/**
|
|
126
|
+
* Sub-resource URL template (2026-05-27).
|
|
127
|
+
*
|
|
128
|
+
* When set, the entity is nested under a parent: every service method takes
|
|
129
|
+
* `parentId: string` as its first parameter and the API path is computed
|
|
130
|
+
* by substituting `{parentId}` in this template. Use for sub-resources whose
|
|
131
|
+
* controller route includes a parent ID, e.g.:
|
|
132
|
+
* - Rue under Site: '/api/gaf/referentiels/sites/{parentId}/rues'
|
|
133
|
+
* - Qualificatif under Type: '/api/gaf/referentiels/types-affaire/{parentId}/qualificatifs/audit'
|
|
134
|
+
*
|
|
135
|
+
* When omitted, the standard flat URL applies (derived from `appCode` /
|
|
136
|
+
* `module` / `section` per the `routeMode`). Required substring: `{parentId}`.
|
|
137
|
+
*
|
|
138
|
+
* Constraint: incompatible with `useScreens: true` / `routeMode: 'screens'`
|
|
139
|
+
* (the screen stratum has no nested URL convention). The CLI surfaces an
|
|
140
|
+
* error if both are set.
|
|
141
|
+
*/
|
|
142
|
+
parentPath: z
|
|
143
|
+
.string()
|
|
144
|
+
.min(1)
|
|
145
|
+
.regex(/^\/.*\{parentId\}.*$/, "parentPath must be an absolute URL containing the literal '{parentId}' placeholder")
|
|
146
|
+
.optional(),
|
|
147
|
+
/**
|
|
148
|
+
* Parameter name for the parent ID in emitted service / hook signatures.
|
|
149
|
+
* Defaults to `parentId`. Set to a domain-specific name (e.g. `siteId`,
|
|
150
|
+
* `typeAffaireId`) so generated code reads naturally to humans:
|
|
151
|
+
* useRue(siteId: string, id: string) vs useRue(parentId: string, id: string)
|
|
152
|
+
*/
|
|
153
|
+
parentIdParam: z
|
|
154
|
+
.string()
|
|
155
|
+
.min(1)
|
|
156
|
+
.regex(/^[a-z][a-zA-Z0-9]*$/, 'parentIdParam must be a camelCase identifier')
|
|
157
|
+
.default('parentId'),
|
|
158
|
+
fields: z.array(ApiFieldSchema).default([]),
|
|
159
|
+
customActions: z.array(ApiCustomActionSchema).default([]),
|
|
160
|
+
/**
|
|
161
|
+
* When true, the scaffolder also emits a typed wrapper for the entity's
|
|
162
|
+
* dashboard endpoints :
|
|
163
|
+
* getConsolidated() → GET /api/{module}/{plural-kebab}/dashboard/consolidated
|
|
164
|
+
* getAlerts() → GET /api/{module}/{plural-kebab}/dashboard/alerts
|
|
165
|
+
* Plus a `useDashboard{Entity}` React Query hook bundling both calls
|
|
166
|
+
* (KPIs in `data.consolidated`, alerts in `data.alerts`).
|
|
167
|
+
* The companion `{Entity}DashboardPage.tsx` (scaffold-component view
|
|
168
|
+
* 'dashboard') consumes this hook — never raw axios.
|
|
169
|
+
*/
|
|
170
|
+
hasDashboard: z.boolean().default(false),
|
|
171
|
+
/**
|
|
172
|
+
* Column contract for shaping the TypeScript DTOs (Wave F1, 2026-05-27;
|
|
173
|
+
* extended Wave F5, 2026-05-27).
|
|
174
|
+
*
|
|
175
|
+
* When provided, the `${E}ListDto` and `${E}DetailDto` interfaces are
|
|
176
|
+
* shaped from these pagespec columns — matching the C# DTO returned by the
|
|
177
|
+
* controller — in ALL route modes (direct, integration, screens). The
|
|
178
|
+
* historical `useScreens`-only gate has been removed: drift between the
|
|
179
|
+
* frontend TS interface and the backend C# DTO is a bug class we want
|
|
180
|
+
* eliminated regardless of stratum.
|
|
181
|
+
*
|
|
182
|
+
* The emitted shape:
|
|
183
|
+
* { Id, <each list column>, CreatedAt } (list)
|
|
184
|
+
* { Id, <each detail column>, CreatedAt, UpdatedAt } (detail)
|
|
185
|
+
*
|
|
186
|
+
* `/ba-develop` Phase 3a populates this by parsing every
|
|
187
|
+
* `<MODULE>/pagespecs/<Entity>.<view>.md` for the entity and collecting the
|
|
188
|
+
* `columns[]` JSON block.
|
|
189
|
+
*
|
|
190
|
+
* When absent — only when the spec carries no pagespec column data — the
|
|
191
|
+
* CLI falls back to `entity.fields.slice(0,5)` (legacy heuristic) so older
|
|
192
|
+
* pipelines that haven't wired pagespec extraction yet still emit a
|
|
193
|
+
* well-formed interface.
|
|
194
|
+
*
|
|
195
|
+
* The field name retains the historical `screenColumns` for backward
|
|
196
|
+
* compatibility with existing /ba-develop spec builders; the columns
|
|
197
|
+
* themselves are not screen-mode specific.
|
|
198
|
+
*/
|
|
199
|
+
screenColumns: z.object({
|
|
200
|
+
list: z.array(ApiScreenColumnSchema).optional(),
|
|
201
|
+
detail: z.array(ApiScreenColumnSchema).optional(),
|
|
202
|
+
}).optional(),
|
|
203
|
+
})
|
|
204
|
+
|
|
205
|
+
export const ScaffoldApiClientInputSchema = z.object({
|
|
206
|
+
module: z.string().min(1),
|
|
207
|
+
appCode: z.string().min(1),
|
|
208
|
+
entities: z.array(ApiEntitySchema).min(1),
|
|
209
|
+
projectPath: z.string().min(1),
|
|
210
|
+
/**
|
|
211
|
+
* Route mode — selects which URL convention the api-client emits.
|
|
212
|
+
*
|
|
213
|
+
* 'direct' (default) — `/api/{appCode}/{module}/{section}`.
|
|
214
|
+
* The standard SmartStack controller route emitted by Phase 2a.
|
|
215
|
+
* Path is computed from the spec's `appCode`, `module`, and each
|
|
216
|
+
* entity's `section`. REST CRUD methods.
|
|
217
|
+
*
|
|
218
|
+
* 'integration' — `/api/v1/integration/{plural-kebab}`.
|
|
219
|
+
* Legacy machine-to-machine stratum. Use when the backend
|
|
220
|
+
* controller was generated by `scaffold-controller`.
|
|
221
|
+
*
|
|
222
|
+
* 'screens' — `/api/screens/{plural-kebab}/{view}`.
|
|
223
|
+
* Screen-driven stratum. Set when Phase 2b's screen controllers
|
|
224
|
+
* exist. `delete` and `getLookup` fall back to integration.
|
|
225
|
+
*
|
|
226
|
+
* Backward compat: `useScreens: true` is equivalent to
|
|
227
|
+
* `routeMode: 'screens'`.
|
|
228
|
+
*/
|
|
229
|
+
routeMode: z.enum(['direct', 'integration', 'screens']).default('direct'),
|
|
230
|
+
useScreens: z.boolean().default(false),
|
|
231
|
+
/**
|
|
232
|
+
* HTTP client source. Default 'smartstack' uses `api` from
|
|
233
|
+
* `@atlashub/smartstack` (pre-configured with auth, tenant, retry;
|
|
234
|
+
* returns unwrapped data, not AxiosResponse).
|
|
235
|
+
* 'axios' generates a local axios instance with manual configuration —
|
|
236
|
+
* for projects that don't use the SmartStack npm package.
|
|
237
|
+
*/
|
|
238
|
+
httpClient: z.enum(['smartstack', 'axios']).default('smartstack'),
|
|
239
|
+
/**
|
|
240
|
+
* Relative path from projectPath to the web project root.
|
|
241
|
+
* Defaults to `web/${appCode}-web`.
|
|
242
|
+
*/
|
|
243
|
+
webRoot: z.string().optional(),
|
|
244
|
+
}).strict()
|
|
245
|
+
|
|
246
|
+
export type ApiCustomAction = z.infer<typeof ApiCustomActionSchema>
|
|
247
|
+
export type ApiScreenColumn = z.infer<typeof ApiScreenColumnSchema>
|
|
248
|
+
export type ApiEntity = z.infer<typeof ApiEntitySchema>
|
|
249
|
+
export type ScaffoldApiClientInput = z.infer<typeof ScaffoldApiClientInputSchema>
|
|
250
|
+
export interface GeneratedFile { path: string; content: string }
|
|
251
|
+
export interface ValidationResult { valid: boolean; errors: string[]; warnings: string[] }
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cli:scaffold-api-client — validate.ts
|
|
3
|
+
*/
|
|
4
|
+
import { ScaffoldApiClientInputSchema, type ValidationResult } from './types.js'
|
|
5
|
+
|
|
6
|
+
export function validate(raw: unknown): ValidationResult {
|
|
7
|
+
const result = ScaffoldApiClientInputSchema.safeParse(raw)
|
|
8
|
+
if (result.success) return { valid: true, errors: [], warnings: [] }
|
|
9
|
+
return { valid: false, errors: result.error.issues.map(i => `[${i.path.join('.')}] ${i.message}`), warnings: [] }
|
|
10
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: frontend-auth
|
|
3
|
+
description: Scaffold the per-project useAuth hook + PermissionGuard component
|
|
4
|
+
group: development.frontend
|
|
5
|
+
cli: scaffold-frontend-auth
|
|
6
|
+
allowed-tools: [Read, Glob, Grep, Bash] # Bash: CLI invocation
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Frontend auth scaffold
|
|
10
|
+
|
|
11
|
+
Generates the canonical authentication primitives every SmartStack-generated
|
|
12
|
+
React app needs to gate UI by permission :
|
|
13
|
+
|
|
14
|
+
- `src/business/auth/useAuth.ts` — Zustand-backed hook that loads
|
|
15
|
+
`/api/auth/me` once at mount, exposes `{ user, permissions, isAuthenticated,
|
|
16
|
+
hasPermission(path) }`. The `hasPermission` is a strict
|
|
17
|
+
`permissions.includes(path)` match — the path shape is whatever the DB
|
|
18
|
+
seed emits, so the same string flows BA → PRD → DB → JSX literal →
|
|
19
|
+
hasPermission lookup with no transformation in the pipeline.
|
|
20
|
+
|
|
21
|
+
- `src/components/auth/PermissionGuard.tsx` — wraps children, renders
|
|
22
|
+
`null` when the auth store is still loading or when `hasPermission(path)
|
|
23
|
+
=== false`. Optional `fallback?: ReactNode` for a placeholder.
|
|
24
|
+
|
|
25
|
+
## Why a dedicated CLI
|
|
26
|
+
|
|
27
|
+
The pages emitted by `scaffold-component` reference `<PermissionGuard
|
|
28
|
+
permission="...">` everywhere. Without this companion scaffold the
|
|
29
|
+
component does not exist (Phase 3a fails to build) or worse, it exists
|
|
30
|
+
as an unimplemented stub that always returns its children — letting any
|
|
31
|
+
authenticated user click every action regardless of role. A dedicated
|
|
32
|
+
CLI guarantees the hook + the guard are wired together, ship in a
|
|
33
|
+
known location, and stay overwritable on regeneration via the
|
|
34
|
+
`@customised` marker convention.
|
|
35
|
+
|
|
36
|
+
## Inputs
|
|
37
|
+
|
|
38
|
+
`{ projectPath, appCode }` — the same minimal contract as
|
|
39
|
+
`scaffold-layout`. The hook is project-agnostic ; `appCode` is only
|
|
40
|
+
used to derive the web folder name (`web/{appCode}-web/`).
|
|
41
|
+
|
|
42
|
+
## Outputs
|
|
43
|
+
|
|
44
|
+
| File | Idempotency |
|
|
45
|
+
|------|-------------|
|
|
46
|
+
| `web/{appCode}-web/src/business/auth/useAuth.ts` | Honours `// @customised` marker |
|
|
47
|
+
| `web/{appCode}-web/src/components/auth/PermissionGuard.tsx` | Honours `// @customised` marker |
|
|
48
|
+
| `web/{appCode}-web/src/business/auth/auth-store.ts` | Honours `// @customised` marker |
|
|
49
|
+
|
|
50
|
+
## When the runtime mounts
|
|
51
|
+
|
|
52
|
+
The `useAuth` hook fires `api.get('/api/auth/me')` once on the first
|
|
53
|
+
render of any consumer. The response shape it expects :
|
|
54
|
+
|
|
55
|
+
```json
|
|
56
|
+
{
|
|
57
|
+
"user": { "id": "...", "email": "...", "displayName": "..." },
|
|
58
|
+
"permissions": [
|
|
59
|
+
"restauration.carte.dishes.read",
|
|
60
|
+
"restauration.carte.dishes.create",
|
|
61
|
+
"restauration.carte.dishes.allergens.read"
|
|
62
|
+
]
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
The backend endpoint must return `permissions` as an array of full path
|
|
67
|
+
strings matching whatever `*PermissionsSeedDataProvider.cs` seeded — 4
|
|
68
|
+
or 5 segments, lower-kebab case throughout.
|
|
69
|
+
|
|
70
|
+
## Anti-patterns
|
|
71
|
+
|
|
72
|
+
- ❌ Adding business logic to PermissionGuard. It does ONE thing: hide
|
|
73
|
+
children when the user lacks the permission.
|
|
74
|
+
- ❌ Resolving permissions client-side via heuristics (e.g. inferring
|
|
75
|
+
create from edit). The permission strings are the contract.
|
|
76
|
+
- ❌ Caching beyond the session. If the user's role changes, they must
|
|
77
|
+
re-login to see the new gates.
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scaffold-frontend-auth/generate.ts — Emits the canonical auth primitives.
|
|
3
|
+
*
|
|
4
|
+
* Three files, all under the project's `web/{appCode}-web/src/` tree :
|
|
5
|
+
* - `business/auth/auth-store.ts` — Zustand store (user, permissions,
|
|
6
|
+
* loading, lastFetchedAt).
|
|
7
|
+
* - `business/auth/useAuth.ts` — hook that bootstraps the store on first
|
|
8
|
+
* consumer mount + exposes `hasPermission(path)`.
|
|
9
|
+
* - `components/auth/PermissionGuard.tsx` — wraps children, returns null
|
|
10
|
+
* when the auth store is loading or the permission is missing.
|
|
11
|
+
*
|
|
12
|
+
* The hook expects the backend to expose `GET /api/auth/me` returning :
|
|
13
|
+
* { user: { id, email, displayName }, permissions: string[] }
|
|
14
|
+
* Permissions are full canonical paths (e.g.
|
|
15
|
+
* `restauration.carte.dishes.create` or
|
|
16
|
+
* `restauration.carte.dishes.allergens.create`) and `hasPermission` does
|
|
17
|
+
* a strict `permissions.includes(path)` match — no transformation.
|
|
18
|
+
*/
|
|
19
|
+
import type { GeneratedFile, ScaffoldFrontendAuthInput } from './types.js';
|
|
20
|
+
|
|
21
|
+
const HEADER = '/* generated by scaffold-frontend-auth — overwrite-safe ; add the line `// @customised` at the top to lock against regeneration */\n';
|
|
22
|
+
|
|
23
|
+
export function generate(spec: ScaffoldFrontendAuthInput): GeneratedFile[] {
|
|
24
|
+
const webRoot = `web/${spec.appCode}-web/src`;
|
|
25
|
+
return [
|
|
26
|
+
{ path: `${webRoot}/business/auth/auth-store.ts`, content: authStore() },
|
|
27
|
+
{ path: `${webRoot}/business/auth/useAuth.ts`, content: useAuthHook() },
|
|
28
|
+
{ path: `${webRoot}/components/auth/PermissionGuard.tsx`, content: permissionGuard() },
|
|
29
|
+
];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function authStore(): string {
|
|
33
|
+
return `${HEADER}import { create } from 'zustand';
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Mirror of the backend \`UserInfo\` record returned by \`GET /api/auth/me\`
|
|
37
|
+
* (see \`SmartStack.Application/Auth/DTOs/AuthDtos.cs:UserInfo\`). Fields
|
|
38
|
+
* are kept flat to match the wire format verbatim — no remapping in the
|
|
39
|
+
* fetch layer, so the entire payload is debuggable from a single
|
|
40
|
+
* \`console.log(useAuthStore.getState().user)\`.
|
|
41
|
+
*/
|
|
42
|
+
export interface AuthUser {
|
|
43
|
+
id: string;
|
|
44
|
+
email: string;
|
|
45
|
+
firstName: string | null;
|
|
46
|
+
lastName: string | null;
|
|
47
|
+
roles: string[];
|
|
48
|
+
/** Array of full permission paths returned verbatim by the backend.
|
|
49
|
+
* Canonical shape: \`{app}.{module}.{section}[.{resource}].{action}\`
|
|
50
|
+
* (4 or 5 segments). \`useAuth().hasPermission()\` strips the leading
|
|
51
|
+
* appCode segment when comparing with the page-side path (which is
|
|
52
|
+
* 3 segments for section-scoped, 4 for resource-scoped — see useAuth.ts).
|
|
53
|
+
* Mirrored at the store top level so hasPermission() does not need to
|
|
54
|
+
* dereference user. */
|
|
55
|
+
permissions: string[];
|
|
56
|
+
tenants: TenantSummary[];
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export interface TenantSummary {
|
|
60
|
+
id: string;
|
|
61
|
+
slug: string;
|
|
62
|
+
name: string;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export interface AuthState {
|
|
66
|
+
user: AuthUser | null;
|
|
67
|
+
/** Full permission paths granted to the current user.
|
|
68
|
+
* Format: \`{app}.{module}.{section}[.{resource}].{action}\` (4 or 5 segments).
|
|
69
|
+
* Mirrors \`user.permissions\` for fast lookup without dereferencing user. */
|
|
70
|
+
permissions: string[];
|
|
71
|
+
/** True between the first api.get call and its first response (success or error). */
|
|
72
|
+
loading: boolean;
|
|
73
|
+
/** Wall-clock of the last successful /api/auth/me response. 0 when never fetched. */
|
|
74
|
+
lastFetchedAt: number;
|
|
75
|
+
/** Last error message, when the bootstrap call failed. */
|
|
76
|
+
error: string | null;
|
|
77
|
+
setLoading: (v: boolean) => void;
|
|
78
|
+
setSession: (u: AuthUser | null, perms: string[]) => void;
|
|
79
|
+
setError: (e: string | null) => void;
|
|
80
|
+
reset: () => void;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export const useAuthStore = create<AuthState>((set) => ({
|
|
84
|
+
user: null,
|
|
85
|
+
permissions: [],
|
|
86
|
+
loading: false,
|
|
87
|
+
lastFetchedAt: 0,
|
|
88
|
+
error: null,
|
|
89
|
+
setLoading: (loading) => set({ loading }),
|
|
90
|
+
setSession: (user, permissions) => set({
|
|
91
|
+
user,
|
|
92
|
+
permissions,
|
|
93
|
+
loading: false,
|
|
94
|
+
lastFetchedAt: Date.now(),
|
|
95
|
+
error: null,
|
|
96
|
+
}),
|
|
97
|
+
setError: (error) => set({ error, loading: false }),
|
|
98
|
+
reset: () => set({
|
|
99
|
+
user: null,
|
|
100
|
+
permissions: [],
|
|
101
|
+
loading: false,
|
|
102
|
+
lastFetchedAt: 0,
|
|
103
|
+
error: null,
|
|
104
|
+
}),
|
|
105
|
+
}));
|
|
106
|
+
`;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function useAuthHook(): string {
|
|
110
|
+
return `${HEADER}import { useEffect } from 'react';
|
|
111
|
+
import { api } from '@atlashub/smartstack';
|
|
112
|
+
import { useAuthStore, type AuthUser } from './auth-store';
|
|
113
|
+
|
|
114
|
+
let bootstrapPromise: Promise<void> | null = null;
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Bootstraps the auth store from \`GET /api/auth/me\`. Called by
|
|
118
|
+
* useAuth() on first mount of any consumer. Subsequent calls are
|
|
119
|
+
* no-ops while the first fetch is still in flight (single-flight via
|
|
120
|
+
* bootstrapPromise).
|
|
121
|
+
*
|
|
122
|
+
* The backend returns \`UserInfo\` flat :
|
|
123
|
+
* { id, email, firstName, lastName, roles, permissions, tenants }
|
|
124
|
+
* (see \`SmartStack.Application/Auth/DTOs/AuthDtos.cs\`). We store the
|
|
125
|
+
* whole object as \`user\` and mirror \`permissions\` at the store top
|
|
126
|
+
* level for fast hasPermission() lookups.
|
|
127
|
+
*/
|
|
128
|
+
async function bootstrap(): Promise<void> {
|
|
129
|
+
if (bootstrapPromise) return bootstrapPromise;
|
|
130
|
+
const store = useAuthStore.getState();
|
|
131
|
+
if (store.lastFetchedAt > 0) return; // already loaded once this session
|
|
132
|
+
store.setLoading(true);
|
|
133
|
+
bootstrapPromise = (async () => {
|
|
134
|
+
try {
|
|
135
|
+
const resp = await api.get<AuthUser>('/api/auth/me');
|
|
136
|
+
const permissions = Array.isArray(resp?.permissions) ? resp.permissions : [];
|
|
137
|
+
useAuthStore.getState().setSession(resp ?? null, permissions);
|
|
138
|
+
} catch (err) {
|
|
139
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
140
|
+
useAuthStore.getState().setError(msg);
|
|
141
|
+
} finally {
|
|
142
|
+
bootstrapPromise = null;
|
|
143
|
+
}
|
|
144
|
+
})();
|
|
145
|
+
return bootstrapPromise;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export interface UseAuthReturn {
|
|
149
|
+
user: AuthUser | null;
|
|
150
|
+
permissions: string[];
|
|
151
|
+
isAuthenticated: boolean;
|
|
152
|
+
loading: boolean;
|
|
153
|
+
error: string | null;
|
|
154
|
+
/**
|
|
155
|
+
* True when the user holds the permission. Four match modes, tried in
|
|
156
|
+
* order (first hit wins) :
|
|
157
|
+
*
|
|
158
|
+
* 1. **Super-admin wildcard** — \`permissions\` contains \`"*"\`. Always true.
|
|
159
|
+
* Mirrors SmartStack's \`WILDCARD_PERMISSION\` convention exported from
|
|
160
|
+
* \`@atlashub/smartstack/utils/permissions\`.
|
|
161
|
+
* 2. **Fast strict match** — caller passed a fully-qualified path that
|
|
162
|
+
* matches a store entry verbatim (4-/5-seg with appCode).
|
|
163
|
+
* 3. **Subtree wildcard** — a store entry like \`testv2.budgets.*\` or
|
|
164
|
+
* \`budgets.*\` covers any path under that prefix (canonical or stripped
|
|
165
|
+
* form, so the wildcard also matches the page-side 3-/4-seg input).
|
|
166
|
+
* 4. **Strip-leading-segment match** — the BA convention emits page-side
|
|
167
|
+
* paths without the appCode segment (3-seg section / 4-seg resource).
|
|
168
|
+
* Strip the leading segment of each store entry and compare strictly.
|
|
169
|
+
*
|
|
170
|
+
* Page-side path shape (input to this function):
|
|
171
|
+
* - section-scoped : 3 segments \`{module}.{section}.{action}\`
|
|
172
|
+
* - resource-scoped : 4 segments \`{module}.{section}.{resource}.{action}\`
|
|
173
|
+
*
|
|
174
|
+
* Store-side shape (DB / \`permission.Path\` / \`/api/auth/me\` payload):
|
|
175
|
+
* - super-admin : \`["*"]\`
|
|
176
|
+
* - subtree wildcard : \`["testv2.budgets.*"]\`
|
|
177
|
+
* - section-scoped : \`["{app}.{module}.{section}.{action}"]\`
|
|
178
|
+
* - resource-scoped : \`["{app}.{module}.{section}.{resource}.{action}"]\`
|
|
179
|
+
*
|
|
180
|
+
* Case-sensitive across all passes.
|
|
181
|
+
*/
|
|
182
|
+
hasPermission: (path: string) => boolean;
|
|
183
|
+
/**
|
|
184
|
+
* Force a re-fetch of /api/auth/me. Useful after a role change in the
|
|
185
|
+
* admin UI ; otherwise the bootstrap-once default is enough.
|
|
186
|
+
*/
|
|
187
|
+
refresh: () => Promise<void>;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export function useAuth(): UseAuthReturn {
|
|
191
|
+
useEffect(() => {
|
|
192
|
+
void bootstrap();
|
|
193
|
+
}, []);
|
|
194
|
+
const user = useAuthStore((s) => s.user);
|
|
195
|
+
const permissions = useAuthStore((s) => s.permissions);
|
|
196
|
+
const loading = useAuthStore((s) => s.loading);
|
|
197
|
+
const error = useAuthStore((s) => s.error);
|
|
198
|
+
|
|
199
|
+
const hasPermission = (path: string): boolean => {
|
|
200
|
+
if (!path) return false;
|
|
201
|
+
// 1. Super-admin shortcut. SmartStack convention : \`*\` = all permissions
|
|
202
|
+
// (\`@atlashub/smartstack/utils/permissions\` exports the same constant
|
|
203
|
+
// as WILDCARD_PERMISSION). Without this branch, a platform admin
|
|
204
|
+
// seeded with [\`"*"\`] sees every PermissionGuard return null and the
|
|
205
|
+
// UI renders blank — repro on run fbe07a0c.
|
|
206
|
+
if (permissions.includes('*')) return true;
|
|
207
|
+
// 2. Fast strict match : caller already passed a fully-qualified
|
|
208
|
+
// 4-/5-seg path that matches a store entry verbatim.
|
|
209
|
+
if (permissions.includes(path)) return true;
|
|
210
|
+
// 3. & 4. Per-entry inspection — covers subtree wildcards
|
|
211
|
+
// (\`testv2.budgets.*\`) and the BA convention (page emits 3-seg
|
|
212
|
+
// section / 4-seg resource without the appCode prefix, store carries
|
|
213
|
+
// the canonical 4-/5-seg form). The \`indexOf('.')\` guards against
|
|
214
|
+
// single-segment store entries (defensive — should not occur with
|
|
215
|
+
// seeded data).
|
|
216
|
+
return permissions.some((entry) => {
|
|
217
|
+
// 3. Subtree wildcard. Match against both the canonical prefix
|
|
218
|
+
// (\`testv2.budgets.\`) and the page-side stripped prefix
|
|
219
|
+
// (\`budgets.\`) so the same store entry covers both shapes of
|
|
220
|
+
// input.
|
|
221
|
+
if (entry.endsWith('.*')) {
|
|
222
|
+
const prefix = entry.slice(0, -1); // keeps the trailing dot
|
|
223
|
+
if (path.startsWith(prefix)) return true;
|
|
224
|
+
const dot = prefix.indexOf('.');
|
|
225
|
+
if (dot >= 0) {
|
|
226
|
+
const strippedPrefix = prefix.slice(dot + 1);
|
|
227
|
+
if (strippedPrefix && path.startsWith(strippedPrefix)) return true;
|
|
228
|
+
}
|
|
229
|
+
return false;
|
|
230
|
+
}
|
|
231
|
+
// 4. Strip leading appCode segment, compare strictly with input.
|
|
232
|
+
const dot = entry.indexOf('.');
|
|
233
|
+
if (dot < 0) return false;
|
|
234
|
+
return entry.slice(dot + 1) === path;
|
|
235
|
+
});
|
|
236
|
+
};
|
|
237
|
+
|
|
238
|
+
const refresh = async (): Promise<void> => {
|
|
239
|
+
useAuthStore.getState().reset();
|
|
240
|
+
bootstrapPromise = null;
|
|
241
|
+
await bootstrap();
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
return {
|
|
245
|
+
user,
|
|
246
|
+
permissions,
|
|
247
|
+
isAuthenticated: !!user,
|
|
248
|
+
loading,
|
|
249
|
+
error,
|
|
250
|
+
hasPermission,
|
|
251
|
+
refresh,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
`;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
function permissionGuard(): string {
|
|
258
|
+
return `${HEADER}import type { ReactNode } from 'react';
|
|
259
|
+
import { useAuth } from '@/business/auth/useAuth';
|
|
260
|
+
|
|
261
|
+
interface PermissionGuardProps {
|
|
262
|
+
/**
|
|
263
|
+
* Permission path the user must hold to see the children. **Page-side**
|
|
264
|
+
* shape (no appCode prefix) :
|
|
265
|
+
* - section-scoped : 3 segments \`{module}.{section}.{action}\`
|
|
266
|
+
* - resource-scoped : 4 segments \`{module}.{section}.{resource}.{action}\`
|
|
267
|
+
*
|
|
268
|
+
* The leading appCode segment is added by the auth store entries (which
|
|
269
|
+
* carry the canonical \`permission.Path\` from the DB) and stripped at
|
|
270
|
+
* \`hasPermission()\` time. Pages stay app-agnostic ; the store stays
|
|
271
|
+
* canonical.
|
|
272
|
+
*/
|
|
273
|
+
permission: string;
|
|
274
|
+
children: ReactNode;
|
|
275
|
+
/**
|
|
276
|
+
* Optional placeholder rendered when the user lacks the permission.
|
|
277
|
+
* Default: nothing (the gated block disappears entirely).
|
|
278
|
+
*/
|
|
279
|
+
fallback?: ReactNode;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Hides children when :
|
|
284
|
+
* - the auth bootstrap is still loading (no flash of forbidden UI),
|
|
285
|
+
* - the user is not authenticated,
|
|
286
|
+
* - or hasPermission(permission) returns false.
|
|
287
|
+
*
|
|
288
|
+
* This component does ONE thing on purpose. Business logic that
|
|
289
|
+
* conditionally enables actions per row / per column / per state lives
|
|
290
|
+
* in the consuming component, not here.
|
|
291
|
+
*/
|
|
292
|
+
export function PermissionGuard({
|
|
293
|
+
permission,
|
|
294
|
+
children,
|
|
295
|
+
fallback = null,
|
|
296
|
+
}: PermissionGuardProps): ReactNode {
|
|
297
|
+
const { loading, isAuthenticated, hasPermission } = useAuth();
|
|
298
|
+
if (loading) return null;
|
|
299
|
+
if (!isAuthenticated) return fallback;
|
|
300
|
+
if (!hasPermission(permission)) return fallback;
|
|
301
|
+
return children;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
export default PermissionGuard;
|
|
305
|
+
`;
|
|
306
|
+
}
|