@yss123/cage-cli 0.1.0 → 0.3.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/README.md +69 -3
- package/bin/cage.js +5 -0
- package/bin/create-cage-app.js +5 -0
- package/dist/analyze.d.ts +16 -0
- package/dist/analyze.js +20 -2
- package/dist/analyze.js.map +1 -1
- package/dist/baseline.d.ts +8 -0
- package/dist/baseline.js +13 -0
- package/dist/baseline.js.map +1 -1
- package/dist/bootstrap.d.ts +20 -0
- package/dist/bootstrap.js +75 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/budget.d.ts +7 -0
- package/dist/budget.js +49 -5
- package/dist/budget.js.map +1 -1
- package/dist/capabilities.d.ts +38 -0
- package/dist/capabilities.js +133 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/config.d.ts +33 -4
- package/dist/config.js +22 -1
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +86 -0
- package/dist/context.js +235 -0
- package/dist/context.js.map +1 -0
- package/dist/create-prompt.d.ts +12 -0
- package/dist/create-prompt.js +62 -0
- package/dist/create-prompt.js.map +1 -0
- package/dist/create.d.ts +38 -1
- package/dist/create.js +52 -13
- package/dist/create.js.map +1 -1
- package/dist/derive.d.ts +23 -0
- package/dist/derive.js +40 -0
- package/dist/derive.js.map +1 -1
- package/dist/dev.d.ts +6 -0
- package/dist/dev.js +23 -51
- package/dist/dev.js.map +1 -1
- package/dist/doctor.d.ts +98 -0
- package/dist/doctor.js +93 -0
- package/dist/doctor.js.map +1 -0
- package/dist/env.d.ts +6 -0
- package/dist/env.js +11 -0
- package/dist/env.js.map +1 -1
- package/dist/findings.d.ts +27 -0
- package/dist/findings.js +20 -0
- package/dist/findings.js.map +1 -1
- package/dist/gen/contracts.d.ts +28 -0
- package/dist/gen/contracts.js +81 -20
- package/dist/gen/contracts.js.map +1 -1
- package/dist/gen/index.d.ts +26 -0
- package/dist/gen/index.js +112 -4
- package/dist/gen/index.js.map +1 -1
- package/dist/gen/zod-code.d.ts +43 -1
- package/dist/gen/zod-code.js +180 -16
- package/dist/gen/zod-code.js.map +1 -1
- package/dist/graph-approvals.d.ts +60 -0
- package/dist/graph-approvals.js +80 -0
- package/dist/graph-approvals.js.map +1 -0
- package/dist/graph-business.d.ts +135 -0
- package/dist/graph-business.js +404 -0
- package/dist/graph-business.js.map +1 -0
- package/dist/graph-command.d.ts +28 -0
- package/dist/graph-command.js +88 -0
- package/dist/graph-command.js.map +1 -0
- package/dist/graph-model.d.ts +65 -0
- package/dist/graph-model.js +134 -0
- package/dist/graph-model.js.map +1 -0
- package/dist/graph-presentation.d.ts +27 -0
- package/dist/graph-presentation.js +34 -0
- package/dist/graph-presentation.js.map +1 -0
- package/dist/graph-query.d.ts +266 -0
- package/dist/graph-query.js +304 -0
- package/dist/graph-query.js.map +1 -0
- package/dist/graph-relations.d.ts +34 -0
- package/dist/graph-relations.js +172 -0
- package/dist/graph-relations.js.map +1 -0
- package/dist/graph-search.d.ts +56 -0
- package/dist/graph-search.js +99 -0
- package/dist/graph-search.js.map +1 -0
- package/dist/graph-snapshot.d.ts +28 -4
- package/dist/graph-snapshot.js +32 -20
- package/dist/graph-snapshot.js.map +1 -1
- package/dist/graph.d.ts +13 -2
- package/dist/graph.js +78 -5
- package/dist/graph.js.map +1 -1
- package/dist/impact.d.ts +56 -0
- package/dist/impact.js +90 -18
- package/dist/impact.js.map +1 -1
- package/dist/index.d.ts +15 -1
- package/dist/index.js +15 -1
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +18 -0
- package/dist/init.js +146 -0
- package/dist/init.js.map +1 -0
- package/dist/load.d.ts +10 -0
- package/dist/load.js +15 -0
- package/dist/load.js.map +1 -1
- package/dist/main.d.ts +6 -0
- package/dist/main.js +170 -37
- package/dist/main.js.map +1 -1
- package/dist/migrate.d.ts +15 -6
- package/dist/migrate.js +31 -53
- package/dist/migrate.js.map +1 -1
- package/dist/ontology.d.ts +69 -2
- package/dist/ontology.js +101 -4
- package/dist/ontology.js.map +1 -1
- package/dist/process-rules.d.ts +21 -0
- package/dist/process-rules.js +100 -0
- package/dist/process-rules.js.map +1 -0
- package/dist/process.d.ts +32 -0
- package/dist/process.js +32 -0
- package/dist/process.js.map +1 -1
- package/dist/project-structure.d.ts +13 -0
- package/dist/project-structure.js +104 -0
- package/dist/project-structure.js.map +1 -0
- package/dist/registration.d.ts +16 -0
- package/dist/registration.js +56 -0
- package/dist/registration.js.map +1 -0
- package/dist/rules.d.ts +52 -0
- package/dist/rules.js +58 -0
- package/dist/rules.js.map +1 -1
- package/dist/runtime-diagnostics.d.ts +27 -0
- package/dist/runtime-diagnostics.js +60 -0
- package/dist/runtime-diagnostics.js.map +1 -0
- package/dist/snapshots.d.ts +40 -0
- package/dist/snapshots.js +62 -0
- package/dist/snapshots.js.map +1 -0
- package/dist/static-check.d.ts +33 -0
- package/dist/static-check.js +38 -5
- package/dist/static-check.js.map +1 -1
- package/dist/sync.d.ts +11 -0
- package/dist/sync.js +139 -10
- package/dist/sync.js.map +1 -1
- package/dist/upgrade.d.ts +16 -0
- package/dist/upgrade.js +21 -0
- package/dist/upgrade.js.map +1 -1
- package/dist/verify.d.ts +14 -0
- package/dist/verify.js +19 -0
- package/dist/verify.js.map +1 -1
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -1
- package/graph-ui/app.js +367 -35
- package/graph-ui/approval-flow.js +165 -0
- package/graph-ui/business.css +985 -0
- package/graph-ui/business.js +549 -0
- package/graph-ui/flowchart-interaction.js +177 -0
- package/graph-ui/flowchart.js +1059 -0
- package/graph-ui/graph-approvals.js +79 -0
- package/graph-ui/graph-business.js +403 -0
- package/graph-ui/graph-model.js +133 -0
- package/graph-ui/graph-relations.js +171 -0
- package/graph-ui/graph-search.js +98 -0
- package/graph-ui/index.html +26 -12
- package/graph-ui/model.js +47 -77
- package/graph-ui/relations.js +6 -125
- package/graph-ui/structure.js +48 -1
- package/graph-ui/style.css +33 -0
- package/package.json +10 -8
- package/templates/app/.dockerignore +2 -0
- package/templates/app/.env.example +68 -14
- package/templates/app/AGENTS.md +135 -12
- package/templates/app/Dockerfile +2 -0
- package/templates/app/README.md +49 -16
- package/templates/app/_gitignore +9 -0
- package/templates/app/apps/api/package.json +2 -2
- package/templates/app/apps/api/src/main.ts +5 -1
- package/templates/app/apps/api/src/worker.ts +3 -0
- package/templates/app/apps/web/index.html +1 -0
- package/templates/app/apps/web/package.json +7 -3
- package/templates/app/apps/web/src/app/app.tsx +128 -0
- package/templates/app/apps/web/src/{style.css → app/styles/global.css} +88 -8
- package/templates/app/apps/web/src/app/use-session.ts +43 -0
- package/templates/app/apps/web/src/app/workspace-layout.tsx +109 -0
- package/templates/app/apps/web/src/main.tsx +9 -543
- package/templates/app/apps/web/src/modules/approval/hooks/use-approval-tasks.ts +31 -0
- package/templates/app/apps/web/src/modules/approval/index.ts +6 -0
- package/templates/app/apps/web/src/modules/approval/pages/approval-tasks-page.tsx +73 -0
- package/templates/app/apps/web/src/modules/auth/index.ts +5 -0
- package/templates/app/apps/web/src/modules/auth/pages/login-page.tsx +71 -0
- package/templates/app/apps/web/src/modules/inventory/index.ts +5 -0
- package/templates/app/apps/web/src/modules/inventory/pages/inventory-page.tsx +102 -0
- package/templates/app/apps/web/src/modules/purchase/components/approval-history.tsx +32 -0
- package/templates/app/apps/web/src/modules/purchase/components/order-attachments.tsx +29 -0
- package/templates/app/apps/web/src/modules/purchase/components/purchase-assistant-context.tsx +17 -0
- package/templates/app/apps/web/src/modules/purchase/components/purchase-order-form.css +6 -0
- package/templates/app/apps/web/src/modules/purchase/components/purchase-order-form.tsx +82 -0
- package/templates/app/apps/web/src/modules/purchase/index.ts +7 -0
- package/templates/app/apps/web/src/modules/purchase/lib/presentation.ts +20 -0
- package/templates/app/apps/web/src/modules/purchase/pages/purchase-intelligence.css +15 -0
- package/templates/app/apps/web/src/modules/purchase/pages/purchase-order-detail-page.tsx +154 -0
- package/templates/app/apps/web/src/modules/purchase/pages/purchase-orders-page.tsx +240 -0
- package/templates/app/apps/web/src/modules/workspace/index.ts +5 -0
- package/templates/app/apps/web/src/modules/workspace/pages/home-page.tsx +44 -0
- package/templates/app/apps/web/src/shared/hooks/use-command.ts +42 -0
- package/templates/app/apps/web/src/shared/lib/error-message.ts +24 -0
- package/templates/app/apps/web/src/shared/lib/navigation.ts +21 -0
- package/templates/app/apps/web/src/shared/ui/assistant-markdown.tsx +19 -0
- package/templates/app/apps/web/src/shared/ui/assistant-panel.css +134 -0
- package/templates/app/apps/web/src/shared/ui/assistant-panel.tsx +200 -0
- package/templates/app/apps/web/src/shared/ui/assistant-scope.tsx +72 -0
- package/templates/app/apps/web/src/shared/ui/attachment-upload.css +28 -0
- package/templates/app/apps/web/src/shared/ui/attachment-upload.tsx +163 -0
- package/templates/app/apps/web/src/shared/ui/notice.tsx +20 -0
- package/templates/app/apps/web/src/shared/ui/page-heading.tsx +35 -0
- package/templates/app/apps/web/src/shared/ui/page-state.css +47 -0
- package/templates/app/apps/web/src/shared/ui/page-state.tsx +76 -0
- package/templates/app/apps/web/src/shared/ui/require-capability.tsx +34 -0
- package/templates/app/apps/web/vite.config.ts +8 -0
- package/templates/app/cage.config.json +10 -1
- package/templates/app/db/migrations/0002_draft.sql +12 -0
- package/templates/app/db/migrations/0003_draft.sql +8 -0
- package/templates/app/deploy/nginx.conf +52 -0
- package/templates/app/docs/ai/README.md +98 -0
- package/templates/app/docs/ai/architecture.md +148 -0
- package/templates/app/docs/ai/commenting.md +203 -0
- package/templates/app/docs/ai/diagnostics.md +80 -0
- package/templates/app/docs/ai/files.md +93 -0
- package/templates/app/docs/ai/intelligence.md +348 -0
- package/templates/app/docs/ai/ontology-context.md +172 -0
- package/templates/app/docs/ai/primitives.md +282 -0
- package/templates/app/docs/ai/project-structure.md +128 -0
- package/templates/app/docs/ai/purchase-example.md +111 -0
- package/templates/app/docs/ai/recipes.md +89 -0
- package/templates/app/docs/ai/relations.md +160 -0
- package/templates/app/docs/ai/routing.md +86 -0
- package/templates/app/docs/ai/transfers.md +92 -0
- package/templates/app/docs/ai/troubleshooting.md +65 -0
- package/templates/app/docs/ai/workflow.md +152 -0
- package/templates/app/docs/errors/CAGE-AI-001.md +61 -0
- package/templates/app/docs/errors/CAGE-APPR-001.md +48 -0
- package/templates/app/docs/errors/CAGE-APPR-002.md +47 -0
- package/templates/app/docs/errors/CAGE-APPR-003.md +47 -0
- package/templates/app/docs/errors/CAGE-APPR-004.md +47 -0
- package/templates/app/docs/errors/CAGE-APPR-005.md +47 -0
- package/templates/app/docs/errors/CAGE-APPR-006.md +53 -0
- package/templates/app/docs/errors/CAGE-APPR-007.md +50 -0
- package/templates/app/docs/errors/CAGE-APPR-010.md +48 -0
- package/templates/app/docs/errors/CAGE-AUDIT-001.md +53 -0
- package/templates/app/docs/errors/CAGE-AUTH-001.md +47 -0
- package/templates/app/docs/errors/CAGE-BIZ-001.md +51 -0
- package/templates/app/docs/errors/CAGE-BIZ-002.md +49 -0
- package/templates/app/docs/errors/CAGE-BUDGET-001.md +47 -0
- package/templates/app/docs/errors/CAGE-BUDGET-002.md +47 -0
- package/templates/app/docs/errors/CAGE-BUDGET-003.md +47 -0
- package/templates/app/docs/errors/CAGE-CMD-002.md +47 -0
- package/templates/app/docs/errors/CAGE-CMD-003.md +47 -0
- package/templates/app/docs/errors/CAGE-CONN-001.md +47 -0
- package/templates/app/docs/errors/CAGE-CONN-002.md +47 -0
- package/templates/app/docs/errors/CAGE-CONN-003.md +47 -0
- package/templates/app/docs/errors/CAGE-CONN-004.md +47 -0
- package/templates/app/docs/errors/CAGE-CONN-005.md +47 -0
- package/templates/app/docs/errors/CAGE-CONN-006.md +47 -0
- package/templates/app/docs/errors/CAGE-CONN-007.md +47 -0
- package/templates/app/docs/errors/CAGE-CONN-008.md +47 -0
- package/templates/app/docs/errors/CAGE-CONN-009.md +47 -0
- package/templates/app/docs/errors/CAGE-CONN-010.md +47 -0
- package/templates/app/docs/errors/CAGE-CONN-011.md +47 -0
- package/templates/app/docs/errors/CAGE-CONN-012.md +47 -0
- package/templates/app/docs/errors/CAGE-CONN-013.md +49 -0
- package/templates/app/docs/errors/CAGE-CONN-014.md +48 -0
- package/templates/app/docs/errors/CAGE-CONN-015.md +49 -0
- package/templates/app/docs/errors/CAGE-CREATE-001.md +53 -0
- package/templates/app/docs/errors/CAGE-DECL-001.md +48 -0
- package/templates/app/docs/errors/CAGE-DECL-002.md +48 -0
- package/templates/app/docs/errors/CAGE-DECL-003.md +47 -0
- package/templates/app/docs/errors/CAGE-DECL-004.md +47 -0
- package/templates/app/docs/errors/CAGE-DEP-001.md +48 -0
- package/templates/app/docs/errors/CAGE-DEP-002.md +47 -0
- package/templates/app/docs/errors/CAGE-DEP-003.md +47 -0
- package/templates/app/docs/errors/CAGE-DEP-004.md +47 -0
- package/templates/app/docs/errors/CAGE-DEP-005.md +47 -0
- package/templates/app/docs/errors/CAGE-DIAG-001.md +53 -0
- package/templates/app/docs/errors/CAGE-DLQ-001.md +48 -0
- package/templates/app/docs/errors/CAGE-ENV-001.md +52 -0
- package/templates/app/docs/errors/CAGE-ENV-002.md +51 -0
- package/templates/app/docs/errors/CAGE-ENV-003.md +48 -0
- package/templates/app/docs/errors/CAGE-EVENT-001.md +47 -0
- package/templates/app/docs/errors/CAGE-EVENT-002.md +50 -0
- package/templates/app/docs/errors/CAGE-FIELD-001.md +47 -0
- package/templates/app/docs/errors/CAGE-FIELD-002.md +47 -0
- package/templates/app/docs/errors/CAGE-FIELD-003.md +47 -0
- package/templates/app/docs/errors/CAGE-FIELD-004.md +47 -0
- package/templates/app/docs/errors/CAGE-FILE-001.md +56 -0
- package/templates/app/docs/errors/CAGE-GEN-001.md +48 -0
- package/templates/app/docs/errors/CAGE-GEN-002.md +47 -0
- package/templates/app/docs/errors/CAGE-GEN-003.md +53 -0
- package/templates/app/docs/errors/CAGE-GRANT-001.md +49 -0
- package/templates/app/docs/errors/CAGE-GRANT-002.md +48 -0
- package/templates/app/docs/errors/CAGE-GRANT-003.md +48 -0
- package/templates/app/docs/errors/CAGE-IMPACT-001.md +48 -0
- package/templates/app/docs/errors/CAGE-IMPACT-002.md +52 -0
- package/templates/app/docs/errors/CAGE-INIT-001.md +47 -0
- package/templates/app/docs/errors/CAGE-INIT-002.md +49 -0
- package/templates/app/docs/errors/CAGE-INIT-003.md +48 -0
- package/templates/app/docs/errors/CAGE-INIT-004.md +48 -0
- package/templates/app/docs/errors/CAGE-INIT-005.md +52 -0
- package/templates/app/docs/errors/CAGE-JOB-001.md +47 -0
- package/templates/app/docs/errors/CAGE-JOB-002.md +47 -0
- package/templates/app/docs/errors/CAGE-JOB-003.md +47 -0
- package/templates/app/docs/errors/CAGE-LINT-001.md +47 -0
- package/templates/app/docs/errors/CAGE-MIG-001.md +47 -0
- package/templates/app/docs/errors/CAGE-MIG-002.md +47 -0
- package/templates/app/docs/errors/CAGE-MIG-003.md +5 -0
- package/templates/app/docs/errors/CAGE-MIG-004.md +5 -0
- package/templates/app/docs/errors/CAGE-MIG-005.md +47 -0
- package/templates/app/docs/errors/CAGE-NAME-001.md +47 -0
- package/templates/app/docs/errors/CAGE-NAME-002.md +47 -0
- package/templates/app/docs/errors/CAGE-NAME-003.md +47 -0
- package/templates/app/docs/errors/CAGE-NAME-004.md +47 -0
- package/templates/app/docs/errors/CAGE-NAME-005.md +47 -0
- package/templates/app/docs/errors/CAGE-NAME-006.md +47 -0
- package/templates/app/docs/errors/CAGE-ORG-001.md +50 -0
- package/templates/app/docs/errors/CAGE-PAIR-002.md +51 -0
- package/templates/app/docs/errors/CAGE-QUERY-001.md +47 -0
- package/templates/app/docs/errors/CAGE-QUERY-002.md +47 -0
- package/templates/app/docs/errors/CAGE-QUERY-003.md +50 -0
- package/templates/app/docs/errors/CAGE-REACT-001.md +47 -0
- package/templates/app/docs/errors/CAGE-REACT-002.md +47 -0
- package/templates/app/docs/errors/CAGE-REACT-003.md +50 -0
- package/templates/app/docs/errors/CAGE-READS-001.md +50 -0
- package/templates/app/docs/errors/CAGE-REG-001.md +54 -0
- package/templates/app/docs/errors/CAGE-REG-002.md +49 -0
- package/templates/app/docs/errors/CAGE-REG-003.md +47 -0
- package/templates/app/docs/errors/CAGE-REL-001.md +64 -0
- package/templates/app/docs/errors/CAGE-ROUTE-001.md +48 -0
- package/templates/app/docs/errors/CAGE-SCOPE-001.md +47 -0
- package/templates/app/docs/errors/CAGE-SCOPE-002.md +47 -0
- package/templates/app/docs/errors/CAGE-SECRET-001.md +48 -0
- package/templates/app/docs/errors/CAGE-SECRET-002.md +47 -0
- package/templates/app/docs/errors/CAGE-SENS-001.md +48 -0
- package/templates/app/docs/errors/CAGE-SQL-001.md +47 -0
- package/templates/app/docs/errors/CAGE-SQL-002.md +47 -0
- package/templates/app/docs/errors/CAGE-STATE-001.md +49 -0
- package/templates/app/docs/errors/CAGE-STATE-002.md +47 -0
- package/templates/app/docs/errors/CAGE-STATE-003.md +47 -0
- package/templates/app/docs/errors/CAGE-STATE-004.md +47 -0
- package/templates/app/docs/errors/CAGE-STATE-005.md +49 -0
- package/templates/app/docs/errors/CAGE-STATE-010.md +48 -0
- package/templates/app/docs/errors/CAGE-STATE-011.md +48 -0
- package/templates/app/docs/errors/CAGE-STRUCT-001.md +51 -0
- package/templates/app/docs/errors/CAGE-STRUCT-002.md +51 -0
- package/templates/app/docs/errors/CAGE-SYNC-001.md +49 -0
- package/templates/app/docs/errors/CAGE-TEST-001.md +47 -0
- package/templates/app/docs/errors/CAGE-TEST-002.md +50 -0
- package/templates/app/docs/errors/CAGE-TEST-003.md +52 -0
- package/templates/app/docs/errors/CAGE-UNSAFE-001.md +49 -0
- package/templates/app/docs/errors/CAGE-UPGRADE-001.md +48 -0
- package/templates/app/docs/errors/CAGE-WORKER-001.md +48 -0
- package/templates/app/docs/errors/CAGE-WORKER-002.md +50 -0
- package/templates/app/docs/errors/CAGE-WORKER-003.md +48 -0
- package/templates/app/docs/errors/README.md +357 -0
- package/templates/app/docs/errors/runtime.md +50 -0
- package/templates/app/package.json +4 -7
- package/templates/app/packages/contracts/package.json +1 -1
- package/templates/app/packages/contracts/src/{dept.ts → aggregates/dept/index.ts} +11 -11
- package/templates/app/packages/contracts/src/{inventory.ts → aggregates/inventory/index.ts} +6 -6
- package/templates/app/packages/contracts/src/{inventory-lock.ts → aggregates/inventory-lock/index.ts} +5 -5
- package/templates/app/packages/contracts/src/aggregates/purchase-order/index.ts +86 -0
- package/templates/app/packages/contracts/src/{role.ts → aggregates/role/index.ts} +16 -16
- package/templates/app/packages/contracts/src/aggregates/user/index.ts +89 -0
- package/templates/app/packages/contracts/src/index.ts +20 -14
- package/templates/app/packages/contracts/src/{queries.ts → queries/index.ts} +2 -2
- package/templates/app/packages/domain/package.json +5 -4
- package/templates/app/packages/domain/src/index.ts +8 -7
- package/templates/app/packages/domain/src/{erp.ts → integrations/erp.ts} +16 -1
- package/templates/app/packages/domain/src/integrations/intelligence.ts +20 -0
- package/templates/app/packages/domain/src/modules/inventory/index.ts +3 -0
- package/templates/app/packages/domain/src/{inventory.ts → modules/inventory/inventory.ts} +12 -0
- package/templates/app/packages/domain/src/modules/purchase/approvals.ts +39 -0
- package/templates/app/packages/domain/src/modules/purchase/index.ts +7 -0
- package/templates/app/packages/domain/src/modules/purchase/intelligence.test.ts +62 -0
- package/templates/app/packages/domain/src/{jobs.ts → modules/purchase/jobs.ts} +5 -0
- package/templates/app/packages/domain/src/{purchase-order.test.ts → modules/purchase/purchase-order.test.ts} +11 -2
- package/templates/app/packages/domain/src/modules/purchase/purchase-order.ts +192 -0
- package/templates/app/packages/domain/src/{queries.ts → modules/purchase/queries.ts} +5 -0
- package/templates/app/packages/domain/src/{reactions.ts → workflows/purchase-inventory.ts} +8 -2
- package/templates/app/packages/domain/src/workflows/purchase-process.ts +42 -0
- package/templates/blank/.dockerignore +12 -0
- package/templates/blank/.env.example +71 -0
- package/templates/blank/.github/workflows/cage.yml +44 -0
- package/templates/blank/AGENTS.md +136 -0
- package/templates/blank/Dockerfile +25 -0
- package/templates/blank/README.md +40 -0
- package/templates/blank/_gitignore +9 -0
- package/templates/blank/apps/api/package.json +15 -0
- package/templates/blank/apps/api/src/main.ts +14 -0
- package/templates/blank/apps/api/src/worker.ts +10 -0
- package/templates/blank/apps/api/tsconfig.json +5 -0
- package/templates/blank/apps/web/index.html +14 -0
- package/templates/blank/apps/web/package.json +26 -0
- package/templates/blank/apps/web/src/app/app.tsx +106 -0
- package/templates/blank/apps/web/src/app/styles/global.css +606 -0
- package/templates/blank/apps/web/src/app/use-session.ts +43 -0
- package/templates/blank/apps/web/src/app/workspace-layout.tsx +95 -0
- package/templates/blank/apps/web/src/main.tsx +18 -0
- package/templates/blank/apps/web/src/modules/auth/index.ts +5 -0
- package/templates/blank/apps/web/src/modules/auth/pages/login-page.tsx +104 -0
- package/templates/blank/apps/web/src/modules/directory/index.ts +7 -0
- package/templates/blank/apps/web/src/modules/directory/pages/user-detail-page.tsx +78 -0
- package/templates/blank/apps/web/src/modules/directory/pages/users-page.tsx +93 -0
- package/templates/blank/apps/web/src/modules/workspace/index.ts +5 -0
- package/templates/blank/apps/web/src/modules/workspace/pages/home-page.tsx +62 -0
- package/templates/blank/apps/web/src/shared/lib/error-message.ts +22 -0
- package/templates/blank/apps/web/src/shared/lib/navigation.ts +21 -0
- package/templates/blank/apps/web/src/shared/ui/brand.tsx +19 -0
- package/templates/blank/apps/web/src/shared/ui/page-state.css +47 -0
- package/templates/blank/apps/web/src/shared/ui/page-state.tsx +76 -0
- package/templates/blank/apps/web/src/shared/ui/require-capability.tsx +34 -0
- package/templates/blank/apps/web/tsconfig.json +11 -0
- package/templates/blank/apps/web/vite.config.ts +24 -0
- package/templates/blank/cage.config.json +14 -0
- package/templates/blank/db/migrations/0001_init.sql +63 -0
- package/templates/blank/deploy/nginx.conf +52 -0
- package/templates/blank/docs/ai/README.md +98 -0
- package/templates/blank/docs/ai/architecture.md +148 -0
- package/templates/blank/docs/ai/commenting.md +203 -0
- package/templates/blank/docs/ai/diagnostics.md +80 -0
- package/templates/blank/docs/ai/files.md +93 -0
- package/templates/blank/docs/ai/intelligence.md +348 -0
- package/templates/blank/docs/ai/ontology-context.md +172 -0
- package/templates/blank/docs/ai/primitives.md +282 -0
- package/templates/blank/docs/ai/project-structure.md +128 -0
- package/templates/blank/docs/ai/purchase-example.md +111 -0
- package/templates/blank/docs/ai/recipes.md +89 -0
- package/templates/blank/docs/ai/relations.md +160 -0
- package/templates/blank/docs/ai/routing.md +86 -0
- package/templates/blank/docs/ai/transfers.md +92 -0
- package/templates/blank/docs/ai/troubleshooting.md +65 -0
- package/templates/blank/docs/ai/workflow.md +152 -0
- package/templates/blank/docs/errors/CAGE-AI-001.md +61 -0
- package/templates/blank/docs/errors/CAGE-APPR-001.md +48 -0
- package/templates/blank/docs/errors/CAGE-APPR-002.md +47 -0
- package/templates/blank/docs/errors/CAGE-APPR-003.md +47 -0
- package/templates/blank/docs/errors/CAGE-APPR-004.md +47 -0
- package/templates/blank/docs/errors/CAGE-APPR-005.md +47 -0
- package/templates/blank/docs/errors/CAGE-APPR-006.md +53 -0
- package/templates/blank/docs/errors/CAGE-APPR-007.md +50 -0
- package/templates/blank/docs/errors/CAGE-APPR-010.md +48 -0
- package/templates/blank/docs/errors/CAGE-AUDIT-001.md +53 -0
- package/templates/blank/docs/errors/CAGE-AUTH-001.md +47 -0
- package/templates/blank/docs/errors/CAGE-BIZ-001.md +51 -0
- package/templates/blank/docs/errors/CAGE-BIZ-002.md +49 -0
- package/templates/blank/docs/errors/CAGE-BUDGET-001.md +47 -0
- package/templates/blank/docs/errors/CAGE-BUDGET-002.md +47 -0
- package/templates/blank/docs/errors/CAGE-BUDGET-003.md +47 -0
- package/templates/blank/docs/errors/CAGE-CMD-002.md +47 -0
- package/templates/blank/docs/errors/CAGE-CMD-003.md +47 -0
- package/templates/blank/docs/errors/CAGE-CONN-001.md +47 -0
- package/templates/blank/docs/errors/CAGE-CONN-002.md +47 -0
- package/templates/blank/docs/errors/CAGE-CONN-003.md +47 -0
- package/templates/blank/docs/errors/CAGE-CONN-004.md +47 -0
- package/templates/blank/docs/errors/CAGE-CONN-005.md +47 -0
- package/templates/blank/docs/errors/CAGE-CONN-006.md +47 -0
- package/templates/blank/docs/errors/CAGE-CONN-007.md +47 -0
- package/templates/blank/docs/errors/CAGE-CONN-008.md +47 -0
- package/templates/blank/docs/errors/CAGE-CONN-009.md +47 -0
- package/templates/blank/docs/errors/CAGE-CONN-010.md +47 -0
- package/templates/blank/docs/errors/CAGE-CONN-011.md +47 -0
- package/templates/blank/docs/errors/CAGE-CONN-012.md +47 -0
- package/templates/blank/docs/errors/CAGE-CONN-013.md +49 -0
- package/templates/blank/docs/errors/CAGE-CONN-014.md +48 -0
- package/templates/blank/docs/errors/CAGE-CONN-015.md +49 -0
- package/templates/blank/docs/errors/CAGE-CREATE-001.md +53 -0
- package/templates/blank/docs/errors/CAGE-DECL-001.md +48 -0
- package/templates/blank/docs/errors/CAGE-DECL-002.md +48 -0
- package/templates/blank/docs/errors/CAGE-DECL-003.md +47 -0
- package/templates/blank/docs/errors/CAGE-DECL-004.md +47 -0
- package/templates/blank/docs/errors/CAGE-DEP-001.md +48 -0
- package/templates/blank/docs/errors/CAGE-DEP-002.md +47 -0
- package/templates/blank/docs/errors/CAGE-DEP-003.md +47 -0
- package/templates/blank/docs/errors/CAGE-DEP-004.md +47 -0
- package/templates/blank/docs/errors/CAGE-DEP-005.md +47 -0
- package/templates/blank/docs/errors/CAGE-DIAG-001.md +53 -0
- package/templates/blank/docs/errors/CAGE-DLQ-001.md +48 -0
- package/templates/blank/docs/errors/CAGE-ENV-001.md +52 -0
- package/templates/blank/docs/errors/CAGE-ENV-002.md +51 -0
- package/templates/blank/docs/errors/CAGE-ENV-003.md +48 -0
- package/templates/blank/docs/errors/CAGE-EVENT-001.md +47 -0
- package/templates/blank/docs/errors/CAGE-EVENT-002.md +50 -0
- package/templates/blank/docs/errors/CAGE-FIELD-001.md +47 -0
- package/templates/blank/docs/errors/CAGE-FIELD-002.md +47 -0
- package/templates/blank/docs/errors/CAGE-FIELD-003.md +47 -0
- package/templates/blank/docs/errors/CAGE-FIELD-004.md +47 -0
- package/templates/blank/docs/errors/CAGE-FILE-001.md +56 -0
- package/templates/blank/docs/errors/CAGE-GEN-001.md +48 -0
- package/templates/blank/docs/errors/CAGE-GEN-002.md +47 -0
- package/templates/blank/docs/errors/CAGE-GEN-003.md +53 -0
- package/templates/blank/docs/errors/CAGE-GRANT-001.md +49 -0
- package/templates/blank/docs/errors/CAGE-GRANT-002.md +48 -0
- package/templates/blank/docs/errors/CAGE-GRANT-003.md +48 -0
- package/templates/blank/docs/errors/CAGE-IMPACT-001.md +48 -0
- package/templates/blank/docs/errors/CAGE-IMPACT-002.md +52 -0
- package/templates/blank/docs/errors/CAGE-INIT-001.md +47 -0
- package/templates/blank/docs/errors/CAGE-INIT-002.md +49 -0
- package/templates/blank/docs/errors/CAGE-INIT-003.md +48 -0
- package/templates/blank/docs/errors/CAGE-INIT-004.md +48 -0
- package/templates/blank/docs/errors/CAGE-INIT-005.md +52 -0
- package/templates/blank/docs/errors/CAGE-JOB-001.md +47 -0
- package/templates/blank/docs/errors/CAGE-JOB-002.md +47 -0
- package/templates/blank/docs/errors/CAGE-JOB-003.md +47 -0
- package/templates/blank/docs/errors/CAGE-LINT-001.md +47 -0
- package/templates/blank/docs/errors/CAGE-MIG-001.md +47 -0
- package/templates/blank/docs/errors/CAGE-MIG-002.md +47 -0
- package/templates/blank/docs/errors/CAGE-MIG-003.md +5 -0
- package/templates/blank/docs/errors/CAGE-MIG-004.md +5 -0
- package/templates/blank/docs/errors/CAGE-MIG-005.md +47 -0
- package/templates/blank/docs/errors/CAGE-NAME-001.md +47 -0
- package/templates/blank/docs/errors/CAGE-NAME-002.md +47 -0
- package/templates/blank/docs/errors/CAGE-NAME-003.md +47 -0
- package/templates/blank/docs/errors/CAGE-NAME-004.md +47 -0
- package/templates/blank/docs/errors/CAGE-NAME-005.md +47 -0
- package/templates/blank/docs/errors/CAGE-NAME-006.md +47 -0
- package/templates/blank/docs/errors/CAGE-ORG-001.md +50 -0
- package/templates/blank/docs/errors/CAGE-PAIR-002.md +51 -0
- package/templates/blank/docs/errors/CAGE-QUERY-001.md +47 -0
- package/templates/blank/docs/errors/CAGE-QUERY-002.md +47 -0
- package/templates/blank/docs/errors/CAGE-QUERY-003.md +50 -0
- package/templates/blank/docs/errors/CAGE-REACT-001.md +47 -0
- package/templates/blank/docs/errors/CAGE-REACT-002.md +47 -0
- package/templates/blank/docs/errors/CAGE-REACT-003.md +50 -0
- package/templates/blank/docs/errors/CAGE-READS-001.md +50 -0
- package/templates/blank/docs/errors/CAGE-REG-001.md +54 -0
- package/templates/blank/docs/errors/CAGE-REG-002.md +49 -0
- package/templates/blank/docs/errors/CAGE-REG-003.md +47 -0
- package/templates/blank/docs/errors/CAGE-REL-001.md +64 -0
- package/templates/blank/docs/errors/CAGE-ROUTE-001.md +48 -0
- package/templates/blank/docs/errors/CAGE-SCOPE-001.md +47 -0
- package/templates/blank/docs/errors/CAGE-SCOPE-002.md +47 -0
- package/templates/blank/docs/errors/CAGE-SECRET-001.md +48 -0
- package/templates/blank/docs/errors/CAGE-SECRET-002.md +47 -0
- package/templates/blank/docs/errors/CAGE-SENS-001.md +48 -0
- package/templates/blank/docs/errors/CAGE-SQL-001.md +47 -0
- package/templates/blank/docs/errors/CAGE-SQL-002.md +47 -0
- package/templates/blank/docs/errors/CAGE-STATE-001.md +49 -0
- package/templates/blank/docs/errors/CAGE-STATE-002.md +47 -0
- package/templates/blank/docs/errors/CAGE-STATE-003.md +47 -0
- package/templates/blank/docs/errors/CAGE-STATE-004.md +47 -0
- package/templates/blank/docs/errors/CAGE-STATE-005.md +49 -0
- package/templates/blank/docs/errors/CAGE-STATE-010.md +48 -0
- package/templates/blank/docs/errors/CAGE-STATE-011.md +48 -0
- package/templates/blank/docs/errors/CAGE-STRUCT-001.md +51 -0
- package/templates/blank/docs/errors/CAGE-STRUCT-002.md +51 -0
- package/templates/blank/docs/errors/CAGE-SYNC-001.md +49 -0
- package/templates/blank/docs/errors/CAGE-TEST-001.md +47 -0
- package/templates/blank/docs/errors/CAGE-TEST-002.md +50 -0
- package/templates/blank/docs/errors/CAGE-TEST-003.md +52 -0
- package/templates/blank/docs/errors/CAGE-UNSAFE-001.md +49 -0
- package/templates/blank/docs/errors/CAGE-UPGRADE-001.md +48 -0
- package/templates/blank/docs/errors/CAGE-WORKER-001.md +48 -0
- package/templates/blank/docs/errors/CAGE-WORKER-002.md +50 -0
- package/templates/blank/docs/errors/CAGE-WORKER-003.md +48 -0
- package/templates/blank/docs/errors/README.md +357 -0
- package/templates/blank/docs/errors/runtime.md +50 -0
- package/templates/blank/docs/examples/purchase-admin/README.md +5 -0
- package/templates/blank/docs/examples/purchase-admin/apps/api/src/main.ts +14 -0
- package/templates/blank/docs/examples/purchase-admin/apps/api/src/worker.ts +17 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/app/app.tsx +128 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/app/styles/global.css +743 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/app/use-session.ts +43 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/app/workspace-layout.tsx +109 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/main.tsx +18 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/approval/hooks/use-approval-tasks.ts +31 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/approval/index.ts +6 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/approval/pages/approval-tasks-page.tsx +73 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/auth/index.ts +5 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/auth/pages/login-page.tsx +71 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/inventory/index.ts +5 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/inventory/pages/inventory-page.tsx +102 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/components/approval-history.tsx +32 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/components/order-attachments.tsx +29 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/components/purchase-assistant-context.tsx +17 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/components/purchase-order-form.css +6 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/components/purchase-order-form.tsx +82 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/index.ts +7 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/lib/presentation.ts +20 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/pages/purchase-intelligence.css +15 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/pages/purchase-order-detail-page.tsx +154 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/pages/purchase-orders-page.tsx +240 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/workspace/index.ts +5 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/workspace/pages/home-page.tsx +44 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/hooks/use-command.ts +42 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/lib/error-message.ts +24 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/lib/navigation.ts +21 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/assistant-markdown.tsx +19 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/assistant-panel.css +134 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/assistant-panel.tsx +200 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/assistant-scope.tsx +72 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/attachment-upload.css +28 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/attachment-upload.tsx +163 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/notice.tsx +20 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/page-heading.tsx +35 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/page-state.css +47 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/page-state.tsx +76 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/require-capability.tsx +34 -0
- package/templates/blank/docs/examples/purchase-admin/cage.config.json +123 -0
- package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/dept/index.ts +74 -0
- package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/inventory/index.ts +57 -0
- package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/inventory-lock/index.ts +52 -0
- package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/purchase-order/index.ts +86 -0
- package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/role/index.ts +85 -0
- package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/user/index.ts +89 -0
- package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/index.ts +87 -0
- package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/queries/index.ts +17 -0
- package/templates/blank/docs/examples/purchase-admin/packages/domain/src/index.ts +10 -0
- package/templates/blank/docs/examples/purchase-admin/packages/domain/src/integrations/erp.ts +51 -0
- package/templates/blank/docs/examples/purchase-admin/packages/domain/src/integrations/intelligence.ts +20 -0
- package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/inventory/index.ts +3 -0
- package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/inventory/inventory.ts +55 -0
- package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/approvals.ts +39 -0
- package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/index.ts +7 -0
- package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/intelligence.test.ts +62 -0
- package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/jobs.ts +18 -0
- package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/purchase-order.test.ts +146 -0
- package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/purchase-order.ts +192 -0
- package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/queries.ts +15 -0
- package/templates/blank/docs/examples/purchase-admin/packages/domain/src/workflows/purchase-inventory.ts +30 -0
- package/templates/blank/docs/examples/purchase-admin/packages/domain/src/workflows/purchase-process.ts +42 -0
- package/templates/blank/package.json +22 -0
- package/templates/blank/packages/contracts/package.json +16 -0
- package/templates/blank/packages/contracts/src/aggregates/dept/index.ts +74 -0
- package/templates/blank/packages/contracts/src/aggregates/role/index.ts +85 -0
- package/templates/blank/packages/contracts/src/aggregates/user/index.ts +89 -0
- package/templates/blank/packages/contracts/src/index.ts +55 -0
- package/templates/blank/packages/contracts/src/queries/index.ts +13 -0
- package/templates/blank/packages/contracts/tsconfig.json +5 -0
- package/templates/blank/packages/domain/package.json +24 -0
- package/templates/blank/packages/domain/src/index.ts +5 -0
- package/templates/blank/packages/domain/tsconfig.json +5 -0
- package/templates/blank/pnpm-workspace.yaml +10 -0
- package/templates/blank/renovate.json +5 -0
- package/templates/blank/tsconfig.base.json +8 -0
- package/dist/database.d.ts +0 -5
- package/dist/database.js +0 -70
- package/dist/database.js.map +0 -1
- package/managed/errors/CAGE-APPR-001.md +0 -32
- package/managed/errors/CAGE-APPR-002.md +0 -32
- package/managed/errors/CAGE-APPR-003.md +0 -32
- package/managed/errors/CAGE-APPR-004.md +0 -32
- package/managed/errors/CAGE-APPR-005.md +0 -32
- package/managed/errors/CAGE-APPR-006.md +0 -32
- package/managed/errors/CAGE-APPR-007.md +0 -32
- package/managed/errors/CAGE-APPR-010.md +0 -32
- package/managed/errors/CAGE-AUTH-001.md +0 -32
- package/managed/errors/CAGE-BUDGET-001.md +0 -32
- package/managed/errors/CAGE-BUDGET-002.md +0 -32
- package/managed/errors/CAGE-BUDGET-003.md +0 -32
- package/managed/errors/CAGE-CMD-002.md +0 -32
- package/managed/errors/CAGE-CMD-003.md +0 -34
- package/managed/errors/CAGE-CONN-001.md +0 -32
- package/managed/errors/CAGE-CONN-002.md +0 -32
- package/managed/errors/CAGE-CONN-003.md +0 -32
- package/managed/errors/CAGE-CONN-004.md +0 -32
- package/managed/errors/CAGE-CONN-005.md +0 -32
- package/managed/errors/CAGE-CONN-006.md +0 -32
- package/managed/errors/CAGE-CONN-007.md +0 -32
- package/managed/errors/CAGE-CONN-008.md +0 -32
- package/managed/errors/CAGE-CONN-009.md +0 -32
- package/managed/errors/CAGE-CONN-010.md +0 -32
- package/managed/errors/CAGE-CONN-011.md +0 -32
- package/managed/errors/CAGE-CONN-012.md +0 -32
- package/managed/errors/CAGE-CREATE-001.md +0 -32
- package/managed/errors/CAGE-DECL-001.md +0 -34
- package/managed/errors/CAGE-DECL-002.md +0 -34
- package/managed/errors/CAGE-DECL-003.md +0 -34
- package/managed/errors/CAGE-DECL-004.md +0 -34
- package/managed/errors/CAGE-DEP-001.md +0 -34
- package/managed/errors/CAGE-DEP-002.md +0 -34
- package/managed/errors/CAGE-DEP-003.md +0 -34
- package/managed/errors/CAGE-DEP-004.md +0 -34
- package/managed/errors/CAGE-DEP-005.md +0 -34
- package/managed/errors/CAGE-DLQ-001.md +0 -32
- package/managed/errors/CAGE-ENV-001.md +0 -32
- package/managed/errors/CAGE-EVENT-001.md +0 -32
- package/managed/errors/CAGE-EVENT-002.md +0 -32
- package/managed/errors/CAGE-FIELD-001.md +0 -32
- package/managed/errors/CAGE-FIELD-002.md +0 -32
- package/managed/errors/CAGE-FIELD-003.md +0 -32
- package/managed/errors/CAGE-FIELD-004.md +0 -32
- package/managed/errors/CAGE-GEN-001.md +0 -33
- package/managed/errors/CAGE-GEN-002.md +0 -33
- package/managed/errors/CAGE-GRANT-001.md +0 -32
- package/managed/errors/CAGE-GRANT-002.md +0 -32
- package/managed/errors/CAGE-GRANT-003.md +0 -32
- package/managed/errors/CAGE-IMPACT-001.md +0 -32
- package/managed/errors/CAGE-JOB-001.md +0 -32
- package/managed/errors/CAGE-JOB-002.md +0 -32
- package/managed/errors/CAGE-JOB-003.md +0 -32
- package/managed/errors/CAGE-LINT-001.md +0 -32
- package/managed/errors/CAGE-MIG-001.md +0 -32
- package/managed/errors/CAGE-MIG-002.md +0 -32
- package/managed/errors/CAGE-MIG-003.md +0 -32
- package/managed/errors/CAGE-MIG-004.md +0 -32
- package/managed/errors/CAGE-MIG-005.md +0 -32
- package/managed/errors/CAGE-NAME-001.md +0 -32
- package/managed/errors/CAGE-NAME-002.md +0 -32
- package/managed/errors/CAGE-NAME-003.md +0 -32
- package/managed/errors/CAGE-NAME-004.md +0 -32
- package/managed/errors/CAGE-NAME-005.md +0 -32
- package/managed/errors/CAGE-NAME-006.md +0 -32
- package/managed/errors/CAGE-ORG-001.md +0 -32
- package/managed/errors/CAGE-PAIR-002.md +0 -33
- package/managed/errors/CAGE-QUERY-001.md +0 -32
- package/managed/errors/CAGE-QUERY-002.md +0 -32
- package/managed/errors/CAGE-QUERY-003.md +0 -32
- package/managed/errors/CAGE-REACT-001.md +0 -32
- package/managed/errors/CAGE-REACT-002.md +0 -32
- package/managed/errors/CAGE-READS-001.md +0 -32
- package/managed/errors/CAGE-REG-001.md +0 -32
- package/managed/errors/CAGE-REG-002.md +0 -32
- package/managed/errors/CAGE-REG-003.md +0 -32
- package/managed/errors/CAGE-ROUTE-001.md +0 -32
- package/managed/errors/CAGE-SCOPE-001.md +0 -32
- package/managed/errors/CAGE-SCOPE-002.md +0 -32
- package/managed/errors/CAGE-SECRET-001.md +0 -32
- package/managed/errors/CAGE-SECRET-002.md +0 -32
- package/managed/errors/CAGE-SENS-001.md +0 -32
- package/managed/errors/CAGE-SQL-001.md +0 -32
- package/managed/errors/CAGE-SQL-002.md +0 -32
- package/managed/errors/CAGE-STATE-001.md +0 -32
- package/managed/errors/CAGE-STATE-002.md +0 -32
- package/managed/errors/CAGE-STATE-003.md +0 -32
- package/managed/errors/CAGE-STATE-004.md +0 -32
- package/managed/errors/CAGE-STATE-005.md +0 -32
- package/managed/errors/CAGE-STATE-010.md +0 -32
- package/managed/errors/CAGE-STATE-011.md +0 -32
- package/managed/errors/CAGE-SYNC-001.md +0 -35
- package/managed/errors/CAGE-TEST-001.md +0 -33
- package/managed/errors/CAGE-UNSAFE-001.md +0 -32
- package/managed/errors/CAGE-UPGRADE-001.md +0 -32
- package/managed/errors/README.md +0 -99
- package/templates/app/compose.yaml +0 -39
- package/templates/app/packages/contracts/src/purchase-order.ts +0 -72
- package/templates/app/packages/contracts/src/user.ts +0 -89
- package/templates/app/packages/domain/src/approvals.ts +0 -18
- package/templates/app/packages/domain/src/purchase-order.ts +0 -122
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# CAGE-REACT-001
|
|
2
|
-
|
|
3
|
-
## 什么时候出现
|
|
4
|
-
|
|
5
|
-
命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
|
|
6
|
-
|
|
7
|
-
来源:[packages/kernel/src/primitives/flow.ts:46](../../packages/kernel/src/primitives/flow.ts)
|
|
8
|
-
|
|
9
|
-
```ts
|
|
10
|
-
if (def.target && def.target !== def.command.agg) {
|
|
11
|
-
throw declError('CAGE-REACT-001', `反应的 target 与 command 所属聚合不一致`);
|
|
12
|
-
}
|
|
13
|
-
return Object.freeze({
|
|
14
|
-
[REACTION]: true as const,
|
|
15
|
-
event: ev,
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## 怎么修
|
|
19
|
-
|
|
20
|
-
反应的目标聚合必须与 command 一致,目标命令需从统一入口导出。
|
|
21
|
-
|
|
22
|
-
## 正例
|
|
23
|
-
|
|
24
|
-
```text
|
|
25
|
-
reaction(Approved, { command: acquireLock, map: e => ({ id: e.orderId }) })
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## 反例
|
|
29
|
-
|
|
30
|
-
```text
|
|
31
|
-
reaction(Approved, { target: Order, command: acquireLock, map })
|
|
32
|
-
```
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# CAGE-REACT-002
|
|
2
|
-
|
|
3
|
-
## 什么时候出现
|
|
4
|
-
|
|
5
|
-
命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
|
|
6
|
-
|
|
7
|
-
来源:[packages/kernel/src/kernel.ts:193](../../packages/kernel/src/kernel.ts)
|
|
8
|
-
|
|
9
|
-
```ts
|
|
10
|
-
const agg = cmd.agg;
|
|
11
|
-
if (depth > this.maxDepth) throw new Error(`[CAGE-REACT-002] 同事务反应嵌套超过 ${this.maxDepth} 层`);
|
|
12
|
-
|
|
13
|
-
// 第 1 关:认证
|
|
14
|
-
if (!ctx.actor || (ctx.actor.kind === 'anonymous' && !cmd.public)) throw cageError('UNAUTHENTICATED');
|
|
15
|
-
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## 怎么修
|
|
19
|
-
|
|
20
|
-
反应的目标聚合必须与 command 一致,目标命令需从统一入口导出。
|
|
21
|
-
|
|
22
|
-
## 正例
|
|
23
|
-
|
|
24
|
-
```text
|
|
25
|
-
reaction(Approved, { command: acquireLock, map: e => ({ id: e.orderId }) })
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## 反例
|
|
29
|
-
|
|
30
|
-
```text
|
|
31
|
-
reaction(Approved, { target: Order, command: acquireLock, map })
|
|
32
|
-
```
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# CAGE-READS-001
|
|
2
|
-
|
|
3
|
-
## 什么时候出现
|
|
4
|
-
|
|
5
|
-
命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
|
|
6
|
-
|
|
7
|
-
来源:[packages/kernel/src/pipeline/load.ts:83](../../packages/kernel/src/pipeline/load.ts)
|
|
8
|
-
|
|
9
|
-
```ts
|
|
10
|
-
if (typeof prop === 'string' && !(prop in target) && prop !== 'then' && prop !== 'toJSON') {
|
|
11
|
-
throw new Error(`[CAGE-READS-001] handler 使用了未声明的读依赖 ${prop}(详见 docs/errors/CAGE-READS-001.md)`);
|
|
12
|
-
}
|
|
13
|
-
return (target as any)[prop];
|
|
14
|
-
},
|
|
15
|
-
});
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## 怎么修
|
|
19
|
-
|
|
20
|
-
在 reads 中声明所有读依赖,并确认目标聚合也从入口导出。
|
|
21
|
-
|
|
22
|
-
## 正例
|
|
23
|
-
|
|
24
|
-
```text
|
|
25
|
-
reads: { stock: Inventory }
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## 反例
|
|
29
|
-
|
|
30
|
-
```text
|
|
31
|
-
reads: {} // handler 却读取 deps.stock
|
|
32
|
-
```
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# CAGE-REG-001
|
|
2
|
-
|
|
3
|
-
## 什么时候出现
|
|
4
|
-
|
|
5
|
-
命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
|
|
6
|
-
|
|
7
|
-
来源:[packages/kernel/src/kernel.ts:109](../../packages/kernel/src/kernel.ts)
|
|
8
|
-
|
|
9
|
-
```ts
|
|
10
|
-
if (!rc) {
|
|
11
|
-
throw new Error(`[CAGE-REG-001] 找不到命令 ${typeof ref === 'string' ? ref : ref.agg.name + '.?'},它是否从 domain 导出了?`);
|
|
12
|
-
}
|
|
13
|
-
return rc;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## 怎么修
|
|
19
|
-
|
|
20
|
-
检查统一入口中的聚合/命令引用及名称是否重复,所有依赖都必须在注册表中。
|
|
21
|
-
|
|
22
|
-
## 正例
|
|
23
|
-
|
|
24
|
-
```text
|
|
25
|
-
export * from './purchase-order.js';
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## 反例
|
|
29
|
-
|
|
30
|
-
```text
|
|
31
|
-
// 命令引用了没有从入口导出的聚合
|
|
32
|
-
```
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# CAGE-REG-002
|
|
2
|
-
|
|
3
|
-
## 什么时候出现
|
|
4
|
-
|
|
5
|
-
命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
|
|
6
|
-
|
|
7
|
-
来源:[packages/kernel/src/registry.ts:86](../../packages/kernel/src/registry.ts)
|
|
8
|
-
|
|
9
|
-
```ts
|
|
10
|
-
if (aggregates.some((a) => a.name === (v as AnyAggregate).name)) {
|
|
11
|
-
throw declError('CAGE-REG-002', `聚合名重复:${(v as AnyAggregate).name}`);
|
|
12
|
-
}
|
|
13
|
-
aggregates.push(v as AnyAggregate);
|
|
14
|
-
break;
|
|
15
|
-
case 'COMMAND': {
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## 怎么修
|
|
19
|
-
|
|
20
|
-
检查统一入口中的聚合/命令引用及名称是否重复,所有依赖都必须在注册表中。
|
|
21
|
-
|
|
22
|
-
## 正例
|
|
23
|
-
|
|
24
|
-
```text
|
|
25
|
-
export * from './purchase-order.js';
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## 反例
|
|
29
|
-
|
|
30
|
-
```text
|
|
31
|
-
// 命令引用了没有从入口导出的聚合
|
|
32
|
-
```
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# CAGE-REG-003
|
|
2
|
-
|
|
3
|
-
## 什么时候出现
|
|
4
|
-
|
|
5
|
-
命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
|
|
6
|
-
|
|
7
|
-
来源:[packages/kernel/src/registry.ts:133](../../packages/kernel/src/registry.ts)
|
|
8
|
-
|
|
9
|
-
```ts
|
|
10
|
-
if (!aggSet.has(c.cmd.agg)) throw declError('CAGE-REG-001', `命令 ${c.capability} 所属的聚合 ${c.cmd.agg.name} 没有从 domain 导出`);
|
|
11
|
-
if (caps.has(c.capability)) throw declError('CAGE-REG-003', `能力点重复:${c.capability},可用 command({ name }) 区分`);
|
|
12
|
-
caps.add(c.capability);
|
|
13
|
-
for (const [alias, a] of Object.entries(c.cmd.reads)) {
|
|
14
|
-
if (!aggSet.has(a)) throw declError('CAGE-REG-001', `命令 ${c.capability} 的 reads.${alias} 引用的聚合没有导出`);
|
|
15
|
-
}
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## 怎么修
|
|
19
|
-
|
|
20
|
-
检查统一入口中的聚合/命令引用及名称是否重复,所有依赖都必须在注册表中。
|
|
21
|
-
|
|
22
|
-
## 正例
|
|
23
|
-
|
|
24
|
-
```text
|
|
25
|
-
export * from './purchase-order.js';
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## 反例
|
|
29
|
-
|
|
30
|
-
```text
|
|
31
|
-
// 命令引用了没有从入口导出的聚合
|
|
32
|
-
```
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# CAGE-ROUTE-001
|
|
2
|
-
|
|
3
|
-
## 什么时候出现
|
|
4
|
-
|
|
5
|
-
命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
|
|
6
|
-
|
|
7
|
-
来源:[packages/lint/src/rules/no-manual-routes.ts:11](../../packages/lint/src/rules/no-manual-routes.ts)
|
|
8
|
-
|
|
9
|
-
```ts
|
|
10
|
-
docs: { description: '禁止在业务项目里手写 HTTP 路由' },
|
|
11
|
-
messages: { route: '[CAGE-ROUTE-001] 不要手写路由 {{call}}:在 domain 里声明命令或查询,路由由框架生成' },
|
|
12
|
-
schema: [],
|
|
13
|
-
},
|
|
14
|
-
create(context) {
|
|
15
|
-
return {
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## 怎么修
|
|
19
|
-
|
|
20
|
-
在 domain 声明 command/query,让框架生成 HTTP 路由。
|
|
21
|
-
|
|
22
|
-
## 正例
|
|
23
|
-
|
|
24
|
-
```text
|
|
25
|
-
export const submit = command(Order, definition);
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## 反例
|
|
29
|
-
|
|
30
|
-
```text
|
|
31
|
-
app.post('/api/order/submit', handler);
|
|
32
|
-
```
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# CAGE-SCOPE-001
|
|
2
|
-
|
|
3
|
-
## 什么时候出现
|
|
4
|
-
|
|
5
|
-
命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
|
|
6
|
-
|
|
7
|
-
来源:[packages/kernel/src/scope/index.ts:66](../../packages/kernel/src/scope/index.ts)
|
|
8
|
-
|
|
9
|
-
```ts
|
|
10
|
-
default:
|
|
11
|
-
throw new Error('[CAGE-SCOPE-001] 未知的范围组合子');
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/** 多个授权取并集:用 OR 连接;外层始终加租户条件。 */
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## 怎么修
|
|
19
|
-
|
|
20
|
-
选择内置范围组合子,引用聚合中真实存在的部门/创建人字段。
|
|
21
|
-
|
|
22
|
-
## 正例
|
|
23
|
-
|
|
24
|
-
```text
|
|
25
|
-
scope: scope.deptSubtree('deptId')
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## 反例
|
|
29
|
-
|
|
30
|
-
```text
|
|
31
|
-
scope: scope.deptSubtree('missingField')
|
|
32
|
-
```
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# CAGE-SCOPE-002
|
|
2
|
-
|
|
3
|
-
## 什么时候出现
|
|
4
|
-
|
|
5
|
-
命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
|
|
6
|
-
|
|
7
|
-
来源:[packages/kernel/src/primitives/aggregate.ts:96](../../packages/kernel/src/primitives/aggregate.ts)
|
|
8
|
-
|
|
9
|
-
```ts
|
|
10
|
-
for (const f of [sc.deptField, ownerField]) {
|
|
11
|
-
if (f && f !== 'id' && !(f in fields)) throw declError('CAGE-SCOPE-002', `${name} 的范围字段 ${f} 不存在`);
|
|
12
|
-
}
|
|
13
|
-
const scope: ScopeSpec = Object.freeze({ ...sc, ownerField });
|
|
14
|
-
|
|
15
|
-
return Object.freeze({
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## 怎么修
|
|
19
|
-
|
|
20
|
-
选择内置范围组合子,引用聚合中真实存在的部门/创建人字段。
|
|
21
|
-
|
|
22
|
-
## 正例
|
|
23
|
-
|
|
24
|
-
```text
|
|
25
|
-
scope: scope.deptSubtree('deptId')
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## 反例
|
|
29
|
-
|
|
30
|
-
```text
|
|
31
|
-
scope: scope.deptSubtree('missingField')
|
|
32
|
-
```
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# CAGE-SECRET-001
|
|
2
|
-
|
|
3
|
-
## 什么时候出现
|
|
4
|
-
|
|
5
|
-
命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
|
|
6
|
-
|
|
7
|
-
来源:[packages/connectors/src/runtime.ts:22](../../packages/connectors/src/runtime.ts)
|
|
8
|
-
|
|
9
|
-
```ts
|
|
10
|
-
const v = process.env[name];
|
|
11
|
-
if (!v) throw new Error(`[CAGE-SECRET-001] 缺少密钥 ${name}(由密钥管理服务或环境变量注入)`);
|
|
12
|
-
return v;
|
|
13
|
-
},
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## 怎么修
|
|
19
|
-
|
|
20
|
-
配置中只写密钥名;密钥值通过运行环境注入,移除源码中的字面量。
|
|
21
|
-
|
|
22
|
-
## 正例
|
|
23
|
-
|
|
24
|
-
```text
|
|
25
|
-
secret: 'ERP_API_TOKEN'
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## 反例
|
|
29
|
-
|
|
30
|
-
```text
|
|
31
|
-
secret: 'a-real-token-in-source'
|
|
32
|
-
```
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# CAGE-SECRET-002
|
|
2
|
-
|
|
3
|
-
## 什么时候出现
|
|
4
|
-
|
|
5
|
-
命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
|
|
6
|
-
|
|
7
|
-
来源:[packages/lint/src/rules/no-secret-literal.ts:19](../../packages/lint/src/rules/no-secret-literal.ts)
|
|
8
|
-
|
|
9
|
-
```ts
|
|
10
|
-
docs: { description: '禁止密钥字面量' },
|
|
11
|
-
messages: { secret: '[CAGE-SECRET-002] 疑似{{what}}写在了代码里:密钥只写名字,值由密钥管理服务注入' },
|
|
12
|
-
schema: [],
|
|
13
|
-
},
|
|
14
|
-
create(context) {
|
|
15
|
-
const check = (node: any, value: string, name?: string) => {
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## 怎么修
|
|
19
|
-
|
|
20
|
-
配置中只写密钥名;密钥值通过运行环境注入,移除源码中的字面量。
|
|
21
|
-
|
|
22
|
-
## 正例
|
|
23
|
-
|
|
24
|
-
```text
|
|
25
|
-
secret: 'ERP_API_TOKEN'
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## 反例
|
|
29
|
-
|
|
30
|
-
```text
|
|
31
|
-
secret: 'a-real-token-in-source'
|
|
32
|
-
```
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# CAGE-SENS-001
|
|
2
|
-
|
|
3
|
-
## 什么时候出现
|
|
4
|
-
|
|
5
|
-
命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
|
|
6
|
-
|
|
7
|
-
来源:[packages/cli/src/rules.ts:114](../../packages/cli/src/rules.ts)
|
|
8
|
-
|
|
9
|
-
```ts
|
|
10
|
-
|
|
11
|
-
/** CAGE-SENS-001:敏感字段不得原样进入事件载荷 */
|
|
12
|
-
export function checkSensitiveEvents(g: Ontology): Finding[] {
|
|
13
|
-
const { get, out } = index(g);
|
|
14
|
-
const findings: Finding[] = [];
|
|
15
|
-
for (const c of g.nodes.filter((n) => n.kind === 'command')) {
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## 怎么修
|
|
19
|
-
|
|
20
|
-
从事件移除敏感字段,或保留与聚合一致的 sensitive 标注,让运行时脱敏。
|
|
21
|
-
|
|
22
|
-
## 正例
|
|
23
|
-
|
|
24
|
-
```text
|
|
25
|
-
event('OrderChanged', { phone: text().sensitive('phone') })
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## 反例
|
|
29
|
-
|
|
30
|
-
```text
|
|
31
|
-
event('OrderChanged', { phone: text() }) // 来源字段是敏感电话
|
|
32
|
-
```
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# CAGE-SQL-001
|
|
2
|
-
|
|
3
|
-
## 什么时候出现
|
|
4
|
-
|
|
5
|
-
命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
|
|
6
|
-
|
|
7
|
-
来源:[packages/lint/src/rules/no-sql-concat.ts:19](../../packages/lint/src/rules/no-sql-concat.ts)
|
|
8
|
-
|
|
9
|
-
```ts
|
|
10
|
-
messages: {
|
|
11
|
-
concat: '[CAGE-SQL-001] 不要拼接 SQL 字符串,改用 sql 标签模板或查询构建器(值会自动参数化)',
|
|
12
|
-
raw: '[CAGE-SQL-002] sql.raw() 只能接收字面量',
|
|
13
|
-
},
|
|
14
|
-
schema: [],
|
|
15
|
-
},
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## 怎么修
|
|
19
|
-
|
|
20
|
-
使用参数化 SQL 或查询构建器;sql.raw 只接收固定 SQL 片段。
|
|
21
|
-
|
|
22
|
-
## 正例
|
|
23
|
-
|
|
24
|
-
```text
|
|
25
|
-
sql`select * from safe.purchase_order where id = ${id}`
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## 反例
|
|
29
|
-
|
|
30
|
-
```text
|
|
31
|
-
'select * from safe.purchase_order where id = ' + input
|
|
32
|
-
```
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# CAGE-SQL-002
|
|
2
|
-
|
|
3
|
-
## 什么时候出现
|
|
4
|
-
|
|
5
|
-
命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
|
|
6
|
-
|
|
7
|
-
来源:[packages/lint/src/rules/no-sql-concat.ts:20](../../packages/lint/src/rules/no-sql-concat.ts)
|
|
8
|
-
|
|
9
|
-
```ts
|
|
10
|
-
concat: '[CAGE-SQL-001] 不要拼接 SQL 字符串,改用 sql 标签模板或查询构建器(值会自动参数化)',
|
|
11
|
-
raw: '[CAGE-SQL-002] sql.raw() 只能接收字面量',
|
|
12
|
-
},
|
|
13
|
-
schema: [],
|
|
14
|
-
},
|
|
15
|
-
create(context) {
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## 怎么修
|
|
19
|
-
|
|
20
|
-
使用参数化 SQL 或查询构建器;sql.raw 只接收固定 SQL 片段。
|
|
21
|
-
|
|
22
|
-
## 正例
|
|
23
|
-
|
|
24
|
-
```text
|
|
25
|
-
sql`select * from safe.purchase_order where id = ${id}`
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## 反例
|
|
29
|
-
|
|
30
|
-
```text
|
|
31
|
-
'select * from safe.purchase_order where id = ' + input
|
|
32
|
-
```
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# CAGE-STATE-001
|
|
2
|
-
|
|
3
|
-
## 什么时候出现
|
|
4
|
-
|
|
5
|
-
命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
|
|
6
|
-
|
|
7
|
-
来源:[packages/kernel/src/primitives/command.ts:130](../../packages/kernel/src/primitives/command.ts)
|
|
8
|
-
|
|
9
|
-
```ts
|
|
10
|
-
if (from !== 'new' && !hasStates(agg, from)) {
|
|
11
|
-
throw declError('CAGE-STATE-001', `${agg.name} 的命令 from 里有未声明的状态:${[from].flat().join(', ')}`);
|
|
12
|
-
}
|
|
13
|
-
// 回执等异步元数据可能在单据取消/完成后到达。允许显式保留当前状态,
|
|
14
|
-
// 避免业务 handler 通过篡改 status 绕过状态机;新建命令必须有实际目标状态。
|
|
15
|
-
if (from === 'new' && def.to === null) {
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## 怎么修
|
|
19
|
-
|
|
20
|
-
让 from/to 引用已声明的状态,初始状态可达,非终态有出边,结束状态列入 terminal。
|
|
21
|
-
|
|
22
|
-
## 正例
|
|
23
|
-
|
|
24
|
-
```text
|
|
25
|
-
states('draft', 'done', { terminal: ['done'] });
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## 反例
|
|
29
|
-
|
|
30
|
-
```text
|
|
31
|
-
command(Order, { from: 'missing', to: 'done', handler: o => o });
|
|
32
|
-
```
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# CAGE-STATE-002
|
|
2
|
-
|
|
3
|
-
## 什么时候出现
|
|
4
|
-
|
|
5
|
-
命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
|
|
6
|
-
|
|
7
|
-
来源:[packages/kernel/src/primitives/states.ts:22](../../packages/kernel/src/primitives/states.ts)
|
|
8
|
-
|
|
9
|
-
```ts
|
|
10
|
-
const values = all.filter((a): a is S => typeof a === 'string');
|
|
11
|
-
if (values.length === 0) throw declError('CAGE-STATE-002', 'states() 至少需要一个状态');
|
|
12
|
-
for (const v of values) {
|
|
13
|
-
if (!/^[a-z][a-z0-9_]*$/.test(v)) throw declError('CAGE-STATE-003', `状态名 ${v} 必须是小写下划线`);
|
|
14
|
-
}
|
|
15
|
-
if (new Set(values).size !== values.length) throw declError('CAGE-STATE-004', '状态名重复');
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## 怎么修
|
|
19
|
-
|
|
20
|
-
让 from/to 引用已声明的状态,初始状态可达,非终态有出边,结束状态列入 terminal。
|
|
21
|
-
|
|
22
|
-
## 正例
|
|
23
|
-
|
|
24
|
-
```text
|
|
25
|
-
states('draft', 'done', { terminal: ['done'] });
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## 反例
|
|
29
|
-
|
|
30
|
-
```text
|
|
31
|
-
command(Order, { from: 'missing', to: 'done', handler: o => o });
|
|
32
|
-
```
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# CAGE-STATE-003
|
|
2
|
-
|
|
3
|
-
## 什么时候出现
|
|
4
|
-
|
|
5
|
-
命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
|
|
6
|
-
|
|
7
|
-
来源:[packages/kernel/src/primitives/states.ts:24](../../packages/kernel/src/primitives/states.ts)
|
|
8
|
-
|
|
9
|
-
```ts
|
|
10
|
-
for (const v of values) {
|
|
11
|
-
if (!/^[a-z][a-z0-9_]*$/.test(v)) throw declError('CAGE-STATE-003', `状态名 ${v} 必须是小写下划线`);
|
|
12
|
-
}
|
|
13
|
-
if (new Set(values).size !== values.length) throw declError('CAGE-STATE-004', '状态名重复');
|
|
14
|
-
const terminal = opts.terminal ?? [];
|
|
15
|
-
for (const t of [...terminal, ...(opts.initial ? [opts.initial] : [])]) {
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## 怎么修
|
|
19
|
-
|
|
20
|
-
让 from/to 引用已声明的状态,初始状态可达,非终态有出边,结束状态列入 terminal。
|
|
21
|
-
|
|
22
|
-
## 正例
|
|
23
|
-
|
|
24
|
-
```text
|
|
25
|
-
states('draft', 'done', { terminal: ['done'] });
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## 反例
|
|
29
|
-
|
|
30
|
-
```text
|
|
31
|
-
command(Order, { from: 'missing', to: 'done', handler: o => o });
|
|
32
|
-
```
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# CAGE-STATE-004
|
|
2
|
-
|
|
3
|
-
## 什么时候出现
|
|
4
|
-
|
|
5
|
-
命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
|
|
6
|
-
|
|
7
|
-
来源:[packages/kernel/src/primitives/states.ts:26](../../packages/kernel/src/primitives/states.ts)
|
|
8
|
-
|
|
9
|
-
```ts
|
|
10
|
-
}
|
|
11
|
-
if (new Set(values).size !== values.length) throw declError('CAGE-STATE-004', '状态名重复');
|
|
12
|
-
const terminal = opts.terminal ?? [];
|
|
13
|
-
for (const t of [...terminal, ...(opts.initial ? [opts.initial] : [])]) {
|
|
14
|
-
if (!values.includes(t)) throw declError('CAGE-STATE-001', `状态 ${t} 未在 states 中声明`);
|
|
15
|
-
}
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## 怎么修
|
|
19
|
-
|
|
20
|
-
让 from/to 引用已声明的状态,初始状态可达,非终态有出边,结束状态列入 terminal。
|
|
21
|
-
|
|
22
|
-
## 正例
|
|
23
|
-
|
|
24
|
-
```text
|
|
25
|
-
states('draft', 'done', { terminal: ['done'] });
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## 反例
|
|
29
|
-
|
|
30
|
-
```text
|
|
31
|
-
command(Order, { from: 'missing', to: 'done', handler: o => o });
|
|
32
|
-
```
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# CAGE-STATE-005
|
|
2
|
-
|
|
3
|
-
## 什么时候出现
|
|
4
|
-
|
|
5
|
-
命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
|
|
6
|
-
|
|
7
|
-
来源:[packages/kernel/src/primitives/aggregate.ts:78](../../packages/kernel/src/primitives/aggregate.ts)
|
|
8
|
-
|
|
9
|
-
```ts
|
|
10
|
-
if (isStates(v)) {
|
|
11
|
-
if (k !== 'status') throw declError('CAGE-STATE-005', `状态集只能放在 status 字段上(发现 ${name}.${k})`);
|
|
12
|
-
if (st) throw declError('CAGE-STATE-005', `${name} 同时在 states 和 fields.status 里声明了状态`);
|
|
13
|
-
st = v;
|
|
14
|
-
continue;
|
|
15
|
-
}
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## 怎么修
|
|
19
|
-
|
|
20
|
-
让 from/to 引用已声明的状态,初始状态可达,非终态有出边,结束状态列入 terminal。
|
|
21
|
-
|
|
22
|
-
## 正例
|
|
23
|
-
|
|
24
|
-
```text
|
|
25
|
-
states('draft', 'done', { terminal: ['done'] });
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## 反例
|
|
29
|
-
|
|
30
|
-
```text
|
|
31
|
-
command(Order, { from: 'missing', to: 'done', handler: o => o });
|
|
32
|
-
```
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# CAGE-STATE-010
|
|
2
|
-
|
|
3
|
-
## 什么时候出现
|
|
4
|
-
|
|
5
|
-
命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
|
|
6
|
-
|
|
7
|
-
来源:[packages/cli/src/rules.ts:67](../../packages/cli/src/rules.ts)
|
|
8
|
-
|
|
9
|
-
```ts
|
|
10
|
-
|
|
11
|
-
/** CAGE-STATE-010:每个状态都能从初始状态到达;CAGE-STATE-011:非终态必须有出边 */
|
|
12
|
-
export function checkStates(g: Ontology): Finding[] {
|
|
13
|
-
const { get } = index(g);
|
|
14
|
-
const findings: Finding[] = [];
|
|
15
|
-
for (const a of g.nodes.filter((n) => n.kind === 'aggregate')) {
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## 怎么修
|
|
19
|
-
|
|
20
|
-
让 from/to 引用已声明的状态,初始状态可达,非终态有出边,结束状态列入 terminal。
|
|
21
|
-
|
|
22
|
-
## 正例
|
|
23
|
-
|
|
24
|
-
```text
|
|
25
|
-
states('draft', 'done', { terminal: ['done'] });
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## 反例
|
|
29
|
-
|
|
30
|
-
```text
|
|
31
|
-
command(Order, { from: 'missing', to: 'done', handler: o => o });
|
|
32
|
-
```
|