@yss123/cage-cli 0.3.1 → 0.4.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 +7 -3
- package/dist/analyze.js +3 -0
- package/dist/analyze.js.map +1 -1
- package/dist/capabilities.js +50 -40
- package/dist/capabilities.js.map +1 -1
- package/dist/config.d.ts +4 -0
- package/dist/config.js.map +1 -1
- package/dist/context.js +2 -2
- package/dist/context.js.map +1 -1
- package/dist/doctor.js +1 -1
- package/dist/doctor.js.map +1 -1
- package/dist/findings.d.ts +1 -1
- package/dist/findings.js +2 -2
- package/dist/findings.js.map +1 -1
- package/dist/graph-business.d.ts +11 -8
- package/dist/graph-business.js +16 -16
- package/dist/graph-business.js.map +1 -1
- package/dist/graph-relations.js +3 -5
- package/dist/graph-relations.js.map +1 -1
- package/dist/impact.js +1 -4
- package/dist/impact.js.map +1 -1
- package/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/dist/ontology-names.d.ts +17 -0
- package/dist/ontology-names.js +42 -0
- package/dist/ontology-names.js.map +1 -0
- package/dist/project-structure.js +2 -2
- package/dist/project-structure.js.map +1 -1
- package/dist/sync.d.ts +5 -1
- package/dist/sync.js +45 -121
- package/dist/sync.js.map +1 -1
- package/graph-ui/app.js +3 -2
- package/graph-ui/business.js +11 -3
- package/graph-ui/graph-business.js +16 -16
- package/graph-ui/graph-relations.js +3 -5
- package/package.json +6 -6
- package/templates/app/.agents/skills/cage-development/SKILL.md +10 -0
- package/templates/app/AGENTS.md +42 -122
- package/templates/app/CLAUDE.md +6 -0
- package/templates/app/README.md +6 -6
- package/templates/app/apps/api/package.json +2 -2
- package/templates/app/apps/web/package.json +3 -1
- package/templates/app/apps/web/src/app/styles/global.css +12 -11
- package/templates/app/apps/web/src/main.tsx +18 -7
- package/templates/app/apps/web/src/shared/lib/error-message.ts +1 -1
- package/templates/app/apps/web/src/shared/ui/approval-member-picker.tsx +1 -1
- package/templates/app/cage.config.json +2 -1
- package/templates/app/docs/README.md +13 -0
- package/templates/app/docs/development/README.md +80 -0
- package/templates/app/docs/development/examples/note/note-detail-page.tsx +106 -0
- package/templates/app/docs/development/examples/note/note.ts +71 -0
- package/templates/app/docs/development/examples/note/notes-page.tsx +87 -0
- package/templates/{blank/docs/ai → app/docs/development/examples}/purchase-example.md +10 -10
- package/templates/{blank/docs/ai → app/docs/development/getting-started}/architecture.md +9 -9
- package/templates/app/docs/development/getting-started/first-feature.md +66 -0
- package/templates/{blank/docs/ai → app/docs/development/getting-started}/workflow.md +22 -27
- package/templates/app/docs/{ai → development/guides}/approvals.md +19 -9
- package/templates/app/docs/development/guides/business-collaboration.md +65 -0
- package/templates/{blank/docs/ai → app/docs/development/guides}/files.md +5 -1
- package/templates/app/docs/development/guides/frontend-ui.md +30 -0
- package/templates/app/docs/{ai → development/guides}/intelligence.md +18 -16
- package/templates/app/docs/development/guides/ontology-modeling.md +83 -0
- package/templates/app/docs/development/guides/recipes.md +123 -0
- package/templates/app/docs/{ai → development/guides}/relations.md +33 -10
- package/templates/{blank/docs/ai → app/docs/development/guides}/routing.md +1 -1
- package/templates/app/docs/{ai → development/guides}/transfers.md +1 -1
- package/templates/{blank/docs/ai → app/docs/development/reference}/commenting.md +8 -5
- package/templates/app/docs/{ai → development/reference}/primitives.md +12 -64
- package/templates/app/docs/{ai → development/reference}/project-structure.md +2 -2
- package/templates/app/docs/development/skills/cage-development/SKILL.md +144 -0
- package/templates/{blank/docs/ai → app/docs/development/tools}/diagnostics.md +7 -4
- package/templates/{blank/docs/ai → app/docs/development/tools}/ontology-context.md +4 -4
- package/templates/app/docs/{ai → development/tools}/troubleshooting.md +10 -4
- package/templates/app/docs/errors/CAGE-AI-001.md +1 -1
- package/templates/app/docs/errors/CAGE-APPR-001.md +2 -2
- package/templates/app/docs/errors/CAGE-APPR-002.md +1 -1
- package/templates/app/docs/errors/CAGE-APPR-003.md +1 -1
- package/templates/app/docs/errors/CAGE-APPR-004.md +1 -1
- package/templates/app/docs/errors/CAGE-APPR-005.md +1 -1
- package/templates/app/docs/errors/CAGE-APPR-006.md +1 -1
- package/templates/app/docs/errors/CAGE-APPR-007.md +2 -2
- package/templates/app/docs/errors/CAGE-APPR-010.md +1 -1
- package/templates/app/docs/errors/CAGE-AUDIT-001.md +1 -1
- package/templates/app/docs/errors/CAGE-AUTH-001.md +1 -1
- package/templates/app/docs/errors/CAGE-BIZ-001.md +1 -1
- package/templates/app/docs/errors/CAGE-BIZ-002.md +1 -1
- package/templates/app/docs/errors/CAGE-BUDGET-001.md +1 -1
- package/templates/app/docs/errors/CAGE-BUDGET-002.md +1 -1
- package/templates/app/docs/errors/CAGE-BUDGET-003.md +1 -1
- package/templates/app/docs/errors/CAGE-CMD-002.md +1 -1
- package/templates/app/docs/errors/CAGE-CMD-003.md +1 -1
- package/templates/app/docs/errors/CAGE-CONN-001.md +1 -1
- package/templates/app/docs/errors/CAGE-CONN-002.md +1 -1
- package/templates/app/docs/errors/CAGE-CONN-003.md +1 -1
- package/templates/app/docs/errors/CAGE-CONN-004.md +1 -1
- package/templates/app/docs/errors/CAGE-CONN-005.md +1 -1
- package/templates/app/docs/errors/CAGE-CONN-006.md +1 -1
- package/templates/app/docs/errors/CAGE-CONN-007.md +1 -1
- package/templates/app/docs/errors/CAGE-CONN-008.md +1 -1
- package/templates/app/docs/errors/CAGE-CONN-009.md +1 -1
- package/templates/app/docs/errors/CAGE-CONN-010.md +1 -1
- package/templates/app/docs/errors/CAGE-CONN-011.md +1 -1
- package/templates/app/docs/errors/CAGE-CONN-012.md +1 -1
- package/templates/app/docs/errors/CAGE-CONN-013.md +1 -1
- package/templates/app/docs/errors/CAGE-CONN-014.md +1 -1
- package/templates/app/docs/errors/CAGE-CONN-015.md +1 -1
- package/templates/app/docs/errors/CAGE-CREATE-001.md +2 -2
- package/templates/app/docs/errors/CAGE-DECL-001.md +1 -1
- package/templates/app/docs/errors/CAGE-DECL-002.md +1 -1
- package/templates/app/docs/errors/CAGE-DECL-003.md +1 -1
- package/templates/app/docs/errors/CAGE-DECL-004.md +1 -1
- package/templates/app/docs/errors/CAGE-DEP-001.md +1 -1
- package/templates/app/docs/errors/CAGE-DEP-002.md +1 -1
- package/templates/app/docs/errors/CAGE-DEP-003.md +1 -1
- package/templates/app/docs/errors/CAGE-DEP-004.md +1 -1
- package/templates/app/docs/errors/CAGE-DEP-005.md +1 -1
- package/templates/app/docs/errors/CAGE-DIAG-001.md +1 -1
- package/templates/app/docs/errors/CAGE-DLQ-001.md +1 -1
- package/templates/app/docs/errors/CAGE-ENV-001.md +1 -1
- package/templates/app/docs/errors/CAGE-ENV-002.md +1 -1
- package/templates/app/docs/errors/CAGE-ENV-003.md +1 -1
- package/templates/app/docs/errors/CAGE-EVENT-001.md +1 -1
- package/templates/app/docs/errors/CAGE-EVENT-002.md +1 -1
- package/templates/app/docs/errors/CAGE-FIELD-001.md +1 -1
- package/templates/app/docs/errors/CAGE-FIELD-002.md +1 -1
- package/templates/app/docs/errors/CAGE-FIELD-003.md +1 -1
- package/templates/app/docs/errors/CAGE-FIELD-004.md +1 -1
- package/templates/app/docs/errors/CAGE-FILE-001.md +1 -1
- package/templates/app/docs/errors/CAGE-GEN-001.md +1 -1
- package/templates/app/docs/errors/CAGE-GEN-002.md +1 -1
- package/templates/app/docs/errors/CAGE-GEN-003.md +1 -1
- package/templates/app/docs/errors/CAGE-GRANT-001.md +19 -13
- package/templates/app/docs/errors/CAGE-GRANT-002.md +3 -3
- package/templates/app/docs/errors/CAGE-GRANT-003.md +4 -4
- package/templates/app/docs/errors/CAGE-IMPACT-001.md +1 -1
- package/templates/app/docs/errors/CAGE-IMPACT-002.md +1 -1
- package/templates/app/docs/errors/CAGE-INIT-001.md +1 -1
- package/templates/app/docs/errors/CAGE-INIT-002.md +1 -1
- package/templates/app/docs/errors/CAGE-INIT-003.md +1 -1
- package/templates/app/docs/errors/CAGE-INIT-004.md +1 -1
- package/templates/app/docs/errors/CAGE-INIT-005.md +1 -1
- package/templates/app/docs/errors/CAGE-JOB-001.md +1 -1
- package/templates/app/docs/errors/CAGE-JOB-002.md +1 -1
- package/templates/app/docs/errors/CAGE-JOB-003.md +1 -1
- package/templates/app/docs/errors/CAGE-LINT-001.md +1 -1
- package/templates/app/docs/errors/CAGE-MIG-001.md +1 -1
- package/templates/app/docs/errors/CAGE-MIG-002.md +1 -1
- package/templates/app/docs/errors/CAGE-MIG-005.md +1 -1
- package/templates/app/docs/errors/CAGE-NAME-001.md +1 -1
- package/templates/app/docs/errors/CAGE-NAME-002.md +1 -1
- package/templates/app/docs/errors/CAGE-NAME-003.md +1 -1
- package/templates/app/docs/errors/CAGE-NAME-004.md +1 -1
- package/templates/app/docs/errors/CAGE-NAME-005.md +1 -1
- package/templates/app/docs/errors/CAGE-NAME-006.md +1 -1
- package/templates/app/docs/errors/CAGE-ONTOLOGY-001.md +52 -0
- package/templates/app/docs/errors/CAGE-ORG-001.md +1 -1
- package/templates/app/docs/errors/CAGE-PAIR-002.md +1 -1
- package/templates/app/docs/errors/CAGE-QUERY-001.md +1 -1
- package/templates/app/docs/errors/CAGE-QUERY-002.md +1 -1
- package/templates/app/docs/errors/CAGE-QUERY-003.md +1 -1
- package/templates/app/docs/errors/CAGE-REACT-001.md +1 -1
- package/templates/app/docs/errors/CAGE-REACT-002.md +1 -1
- package/templates/app/docs/errors/CAGE-REACT-003.md +1 -1
- package/templates/app/docs/errors/CAGE-READS-001.md +1 -1
- package/templates/app/docs/errors/CAGE-REG-001.md +1 -1
- package/templates/app/docs/errors/CAGE-REG-002.md +1 -1
- package/templates/app/docs/errors/CAGE-REG-003.md +1 -1
- package/templates/app/docs/errors/CAGE-REL-001.md +1 -1
- package/templates/app/docs/errors/CAGE-ROUTE-001.md +1 -1
- package/templates/app/docs/errors/CAGE-SCOPE-001.md +1 -1
- package/templates/app/docs/errors/CAGE-SCOPE-002.md +1 -1
- package/templates/app/docs/errors/CAGE-SECRET-001.md +1 -1
- package/templates/app/docs/errors/CAGE-SECRET-002.md +1 -1
- package/templates/app/docs/errors/CAGE-SENS-001.md +1 -1
- package/templates/app/docs/errors/CAGE-SQL-001.md +1 -1
- package/templates/app/docs/errors/CAGE-SQL-002.md +1 -1
- package/templates/app/docs/errors/CAGE-STATE-001.md +1 -1
- package/templates/app/docs/errors/CAGE-STATE-002.md +1 -1
- package/templates/app/docs/errors/CAGE-STATE-003.md +2 -2
- package/templates/app/docs/errors/CAGE-STATE-004.md +1 -1
- package/templates/app/docs/errors/CAGE-STATE-005.md +1 -1
- package/templates/app/docs/errors/CAGE-STATE-010.md +1 -1
- package/templates/app/docs/errors/CAGE-STATE-011.md +1 -1
- package/templates/app/docs/errors/CAGE-STRUCT-001.md +4 -4
- package/templates/app/docs/errors/CAGE-STRUCT-002.md +3 -3
- package/templates/app/docs/errors/CAGE-SYNC-001.md +4 -4
- package/templates/app/docs/errors/CAGE-TEST-001.md +1 -1
- package/templates/app/docs/errors/CAGE-TEST-002.md +1 -1
- package/templates/app/docs/errors/CAGE-TEST-003.md +1 -1
- package/templates/app/docs/errors/CAGE-UNSAFE-001.md +1 -1
- package/templates/app/docs/errors/CAGE-UPGRADE-001.md +1 -1
- package/templates/app/docs/errors/CAGE-WORKER-001.md +1 -1
- package/templates/app/docs/errors/CAGE-WORKER-002.md +1 -1
- package/templates/app/docs/errors/CAGE-WORKER-003.md +1 -1
- package/templates/app/docs/errors/README.md +8 -2
- package/templates/app/docs/errors/runtime.md +2 -2
- package/templates/app/package.json +3 -3
- package/templates/app/packages/contracts/package.json +1 -1
- package/templates/app/packages/contracts/src/aggregates/role/index.ts +2 -2
- package/templates/app/packages/contracts/src/aggregates/user/index.ts +3 -3
- package/templates/app/packages/domain/package.json +5 -5
- package/templates/app/packages/domain/src/modules/purchase/approval-members.ts +1 -1
- package/templates/app/packages/domain/src/modules/purchase/approvals.ts +2 -2
- package/templates/app/packages/domain/src/modules/purchase/intelligence.test.ts +4 -4
- package/templates/app/packages/domain/src/modules/purchase/purchase-order.test.ts +10 -17
- package/templates/app/packages/domain/src/modules/purchase/purchase-order.ts +4 -5
- package/templates/app/packages/domain/src/workflows/purchase-process.ts +1 -1
- package/templates/blank/.agents/skills/cage-development/SKILL.md +10 -0
- package/templates/blank/AGENTS.md +42 -122
- package/templates/blank/CLAUDE.md +6 -0
- package/templates/blank/README.md +3 -3
- package/templates/blank/apps/api/package.json +1 -1
- package/templates/blank/apps/web/package.json +3 -1
- package/templates/blank/apps/web/src/app/styles/global.css +6 -5
- package/templates/blank/apps/web/src/main.tsx +18 -7
- package/templates/blank/cage.config.json +1 -0
- package/templates/blank/docs/README.md +13 -0
- package/templates/blank/docs/development/README.md +80 -0
- package/templates/blank/docs/development/examples/note/note-detail-page.tsx +106 -0
- package/templates/blank/docs/development/examples/note/note.ts +71 -0
- package/templates/blank/docs/development/examples/note/notes-page.tsx +87 -0
- package/templates/{app/docs/ai → blank/docs/development/examples}/purchase-example.md +10 -10
- package/templates/{app/docs/ai → blank/docs/development/getting-started}/architecture.md +9 -9
- package/templates/blank/docs/development/getting-started/first-feature.md +66 -0
- package/templates/{app/docs/ai → blank/docs/development/getting-started}/workflow.md +22 -27
- package/templates/blank/docs/{ai → development/guides}/approvals.md +19 -9
- package/templates/blank/docs/development/guides/business-collaboration.md +65 -0
- package/templates/{app/docs/ai → blank/docs/development/guides}/files.md +5 -1
- package/templates/blank/docs/development/guides/frontend-ui.md +30 -0
- package/templates/blank/docs/{ai → development/guides}/intelligence.md +18 -16
- package/templates/blank/docs/development/guides/ontology-modeling.md +83 -0
- package/templates/blank/docs/development/guides/recipes.md +123 -0
- package/templates/blank/docs/{ai → development/guides}/relations.md +33 -10
- package/templates/{app/docs/ai → blank/docs/development/guides}/routing.md +1 -1
- package/templates/blank/docs/{ai → development/guides}/transfers.md +1 -1
- package/templates/{app/docs/ai → blank/docs/development/reference}/commenting.md +8 -5
- package/templates/blank/docs/{ai → development/reference}/primitives.md +12 -64
- package/templates/blank/docs/{ai → development/reference}/project-structure.md +2 -2
- package/templates/blank/docs/development/skills/cage-development/SKILL.md +144 -0
- package/templates/{app/docs/ai → blank/docs/development/tools}/diagnostics.md +7 -4
- package/templates/{app/docs/ai → blank/docs/development/tools}/ontology-context.md +4 -4
- package/templates/blank/docs/{ai → development/tools}/troubleshooting.md +10 -4
- package/templates/blank/docs/errors/CAGE-AI-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-APPR-001.md +2 -2
- package/templates/blank/docs/errors/CAGE-APPR-002.md +1 -1
- package/templates/blank/docs/errors/CAGE-APPR-003.md +1 -1
- package/templates/blank/docs/errors/CAGE-APPR-004.md +1 -1
- package/templates/blank/docs/errors/CAGE-APPR-005.md +1 -1
- package/templates/blank/docs/errors/CAGE-APPR-006.md +1 -1
- package/templates/blank/docs/errors/CAGE-APPR-007.md +2 -2
- package/templates/blank/docs/errors/CAGE-APPR-010.md +1 -1
- package/templates/blank/docs/errors/CAGE-AUDIT-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-AUTH-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-BIZ-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-BIZ-002.md +1 -1
- package/templates/blank/docs/errors/CAGE-BUDGET-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-BUDGET-002.md +1 -1
- package/templates/blank/docs/errors/CAGE-BUDGET-003.md +1 -1
- package/templates/blank/docs/errors/CAGE-CMD-002.md +1 -1
- package/templates/blank/docs/errors/CAGE-CMD-003.md +1 -1
- package/templates/blank/docs/errors/CAGE-CONN-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-CONN-002.md +1 -1
- package/templates/blank/docs/errors/CAGE-CONN-003.md +1 -1
- package/templates/blank/docs/errors/CAGE-CONN-004.md +1 -1
- package/templates/blank/docs/errors/CAGE-CONN-005.md +1 -1
- package/templates/blank/docs/errors/CAGE-CONN-006.md +1 -1
- package/templates/blank/docs/errors/CAGE-CONN-007.md +1 -1
- package/templates/blank/docs/errors/CAGE-CONN-008.md +1 -1
- package/templates/blank/docs/errors/CAGE-CONN-009.md +1 -1
- package/templates/blank/docs/errors/CAGE-CONN-010.md +1 -1
- package/templates/blank/docs/errors/CAGE-CONN-011.md +1 -1
- package/templates/blank/docs/errors/CAGE-CONN-012.md +1 -1
- package/templates/blank/docs/errors/CAGE-CONN-013.md +1 -1
- package/templates/blank/docs/errors/CAGE-CONN-014.md +1 -1
- package/templates/blank/docs/errors/CAGE-CONN-015.md +1 -1
- package/templates/blank/docs/errors/CAGE-CREATE-001.md +2 -2
- package/templates/blank/docs/errors/CAGE-DECL-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-DECL-002.md +1 -1
- package/templates/blank/docs/errors/CAGE-DECL-003.md +1 -1
- package/templates/blank/docs/errors/CAGE-DECL-004.md +1 -1
- package/templates/blank/docs/errors/CAGE-DEP-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-DEP-002.md +1 -1
- package/templates/blank/docs/errors/CAGE-DEP-003.md +1 -1
- package/templates/blank/docs/errors/CAGE-DEP-004.md +1 -1
- package/templates/blank/docs/errors/CAGE-DEP-005.md +1 -1
- package/templates/blank/docs/errors/CAGE-DIAG-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-DLQ-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-ENV-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-ENV-002.md +1 -1
- package/templates/blank/docs/errors/CAGE-ENV-003.md +1 -1
- package/templates/blank/docs/errors/CAGE-EVENT-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-EVENT-002.md +1 -1
- package/templates/blank/docs/errors/CAGE-FIELD-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-FIELD-002.md +1 -1
- package/templates/blank/docs/errors/CAGE-FIELD-003.md +1 -1
- package/templates/blank/docs/errors/CAGE-FIELD-004.md +1 -1
- package/templates/blank/docs/errors/CAGE-FILE-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-GEN-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-GEN-002.md +1 -1
- package/templates/blank/docs/errors/CAGE-GEN-003.md +1 -1
- package/templates/blank/docs/errors/CAGE-GRANT-001.md +19 -13
- package/templates/blank/docs/errors/CAGE-GRANT-002.md +3 -3
- package/templates/blank/docs/errors/CAGE-GRANT-003.md +4 -4
- package/templates/blank/docs/errors/CAGE-IMPACT-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-IMPACT-002.md +1 -1
- package/templates/blank/docs/errors/CAGE-INIT-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-INIT-002.md +1 -1
- package/templates/blank/docs/errors/CAGE-INIT-003.md +1 -1
- package/templates/blank/docs/errors/CAGE-INIT-004.md +1 -1
- package/templates/blank/docs/errors/CAGE-INIT-005.md +1 -1
- package/templates/blank/docs/errors/CAGE-JOB-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-JOB-002.md +1 -1
- package/templates/blank/docs/errors/CAGE-JOB-003.md +1 -1
- package/templates/blank/docs/errors/CAGE-LINT-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-MIG-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-MIG-002.md +1 -1
- package/templates/blank/docs/errors/CAGE-MIG-005.md +1 -1
- package/templates/blank/docs/errors/CAGE-NAME-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-NAME-002.md +1 -1
- package/templates/blank/docs/errors/CAGE-NAME-003.md +1 -1
- package/templates/blank/docs/errors/CAGE-NAME-004.md +1 -1
- package/templates/blank/docs/errors/CAGE-NAME-005.md +1 -1
- package/templates/blank/docs/errors/CAGE-NAME-006.md +1 -1
- package/templates/blank/docs/errors/CAGE-ONTOLOGY-001.md +52 -0
- package/templates/blank/docs/errors/CAGE-ORG-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-PAIR-002.md +1 -1
- package/templates/blank/docs/errors/CAGE-QUERY-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-QUERY-002.md +1 -1
- package/templates/blank/docs/errors/CAGE-QUERY-003.md +1 -1
- package/templates/blank/docs/errors/CAGE-REACT-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-REACT-002.md +1 -1
- package/templates/blank/docs/errors/CAGE-REACT-003.md +1 -1
- package/templates/blank/docs/errors/CAGE-READS-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-REG-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-REG-002.md +1 -1
- package/templates/blank/docs/errors/CAGE-REG-003.md +1 -1
- package/templates/blank/docs/errors/CAGE-REL-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-ROUTE-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-SCOPE-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-SCOPE-002.md +1 -1
- package/templates/blank/docs/errors/CAGE-SECRET-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-SECRET-002.md +1 -1
- package/templates/blank/docs/errors/CAGE-SENS-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-SQL-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-SQL-002.md +1 -1
- package/templates/blank/docs/errors/CAGE-STATE-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-STATE-002.md +1 -1
- package/templates/blank/docs/errors/CAGE-STATE-003.md +2 -2
- package/templates/blank/docs/errors/CAGE-STATE-004.md +1 -1
- package/templates/blank/docs/errors/CAGE-STATE-005.md +1 -1
- package/templates/blank/docs/errors/CAGE-STATE-010.md +1 -1
- package/templates/blank/docs/errors/CAGE-STATE-011.md +1 -1
- package/templates/blank/docs/errors/CAGE-STRUCT-001.md +4 -4
- package/templates/blank/docs/errors/CAGE-STRUCT-002.md +3 -3
- package/templates/blank/docs/errors/CAGE-SYNC-001.md +4 -4
- package/templates/blank/docs/errors/CAGE-TEST-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-TEST-002.md +1 -1
- package/templates/blank/docs/errors/CAGE-TEST-003.md +1 -1
- package/templates/blank/docs/errors/CAGE-UNSAFE-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-UPGRADE-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-WORKER-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-WORKER-002.md +1 -1
- package/templates/blank/docs/errors/CAGE-WORKER-003.md +1 -1
- package/templates/blank/docs/errors/README.md +8 -2
- package/templates/blank/docs/errors/runtime.md +2 -2
- package/templates/blank/docs/examples/purchase-admin/README.md +1 -1
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/app/styles/global.css +12 -11
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/main.tsx +18 -7
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/lib/error-message.ts +1 -1
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/approval-member-picker.tsx +1 -1
- package/templates/blank/docs/examples/purchase-admin/cage.config.json +2 -1
- package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/role/index.ts +2 -2
- package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/user/index.ts +3 -3
- package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/approval-members.ts +1 -1
- package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/approvals.ts +2 -2
- package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/intelligence.test.ts +4 -4
- package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/purchase-order.test.ts +10 -17
- package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/purchase-order.ts +4 -5
- package/templates/blank/docs/examples/purchase-admin/packages/domain/src/workflows/purchase-process.ts +1 -1
- package/templates/blank/package.json +3 -3
- package/templates/blank/packages/contracts/package.json +1 -1
- package/templates/blank/packages/contracts/src/aggregates/role/index.ts +2 -2
- package/templates/blank/packages/contracts/src/aggregates/user/index.ts +3 -3
- package/templates/blank/packages/domain/package.json +5 -5
- package/templates/app/docs/ai/README.md +0 -103
- package/templates/app/docs/ai/recipes.md +0 -89
- package/templates/blank/docs/ai/README.md +0 -103
- package/templates/blank/docs/ai/recipes.md +0 -89
package/dist/sync.js
CHANGED
|
@@ -8,130 +8,54 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
|
8
8
|
import { dirname } from 'node:path';
|
|
9
9
|
import { abs } from './config.js';
|
|
10
10
|
import { VERSION } from './version.js';
|
|
11
|
-
/**
|
|
11
|
+
/**
|
|
12
|
+
* 当前 CLI 版本的项目约束与资料入口,由 create/sync/upgrade 写入 AGENTS 托管区。
|
|
13
|
+
* 工作顺序由唯一 Skill 正文维护,这里保留必须遵守的边界和编码前的理解要求,
|
|
14
|
+
* 避免另写一套实施流程;该文本只指导 agent,不启用服务、不改变授权或数据库。
|
|
15
|
+
*/
|
|
12
16
|
export const managedBlock = `<!-- cage:begin v${VERSION} -->
|
|
13
17
|
## Cage 业务开发约定(框架托管)
|
|
14
18
|
|
|
15
|
-
###
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
-
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
| \`packages/contracts/src/aggregates/<聚合>\`、\`queries\` | 生成协议;根 index.ts 提供 @app/contracts 公共入口,只用 cage gen 更新 |
|
|
56
|
-
| \`apps/api/src\` | API/worker 薄启动入口,普通业务不手写 HTTP 路由 |
|
|
57
|
-
| \`apps/web/src/app\` | 会话、URL 路由、布局、模块组合;main.tsx 只挂载和装配 Provider |
|
|
58
|
-
| \`apps/web/src/modules/<业务>\` | 页面、表单、专用 hooks/API/样式;从模块 index.ts 暴露页面 |
|
|
59
|
-
| \`apps/web/src/shared\` | 跨模块复用且不绑定业务的 UI、hooks、纯辅助函数 |
|
|
60
|
-
| \`db/migrations\` | 审查过的结构迁移,作用于已配置的数据库 |
|
|
61
|
-
| \`cage.config.json\` | 项目路径、检查配置、graph.labels 中文图谱名称 |
|
|
62
|
-
| \`.env\` | 本机真实连接和密钥;不提交、不输出完整内容 |
|
|
63
|
-
|
|
64
|
-
新增业务不得继续平铺在 src 根目录。前端模块只依赖自己和 shared,由 app 通过公开入口组合;shared 不反向依赖业务。领域模块间确有读取依赖时走目标模块 index.ts;跨模块反应写 workflows。小模块不创建空层级,已有独立职责再拆文件。完整命名、目录树和示例见 \`docs/ai/project-structure.md\`。新模板启用 \`structure: modular\`,check/verify 检查目录和导入边界,遇到 CAGE-STRUCT 错误按职责修正。
|
|
65
|
-
|
|
66
|
-
### 实现一项需求的顺序
|
|
67
|
-
|
|
68
|
-
1. 先运行 \`pnpm exec cage context "需求关键词"\`;按需 \`graph search\` 查候选、\`graph inspect\` 查完整节点、\`graph path\` 看关系路径。确认中文匹配入口后按源码位置阅读实现;候选和子图不是全部依赖,具体条件不能凭连线推断。完整用法见 \`docs/ai/ontology-context.md\`。从用户需求确定字段、状态/动作、角色/范围、约束与后续动作;能由业务声明表达的不改框架。
|
|
69
|
-
2. 已有业务含义变化时,修改前用 \`pnpm exec cage snapshot save before-change\` 保存不可覆盖的命名基线;或使用真实 Git 提交/独立本体图文件。
|
|
70
|
-
3. 先声明 aggregate/states/command/constraints/event,再写 handler、reaction/query/approval/connector,最后接业务页面。声明使用模块顶层 \`export const\`,从 domain 入口导出,跨文件导出名保持唯一。
|
|
71
|
-
4. 运行 \`pnpm exec cage check\` 和 \`pnpm gen\`,审查 contracts 和迁移草稿。按需运行 \`pnpm exec cage impact --snapshot before-change\`,补中文图谱名。
|
|
72
|
-
5. 页面使用生成方法并处理 code/domainCode;列表、详情等多页面注册到 React Router,Link/NavLink 导航,筛选/分页进入 URL。组件状态用于弹窗和表单等临时交互。新增能力由管理员授权。数据库结构变化审查后显式 \`pnpm migrate\`,dev 不代办迁移。
|
|
73
|
-
6. 按 \`commenting.md\` 逐文件检查详细中文注释与实现一致,再按改动运行必要验证;交付时说明体验步骤、授权配置、迁移、注释覆盖,以及通过/跳过/未执行项。
|
|
74
|
-
|
|
75
|
-
### 必守边界
|
|
76
|
-
|
|
77
|
-
- 聚合定义对象字段、状态、范围字段与不变量;命令是业务写入口。handler 只计算业务变化和读取 reads 中的依赖,不直接操作数据库、网络或文件。
|
|
78
|
-
- 对象关系统一放在 fields:ref 为外键,hasMany 为只读反查,manyToMany 自动生成中间表并随所属对象命令提交。前端用生成的 related 方法分页读取;不手写纯中间表聚合,不把单页结果当完整集合替换。完整例子见 docs/ai/relations.md。
|
|
79
|
-
- command 的 input 使用 Zod;已有记录输入必须含 id。from/to 表达状态迁移;\`to: null\` 只适用于已有记录并保留状态,不能靠 handler 改 status 绕过状态机。
|
|
80
|
-
- 写入、审计、版本、幂等和事务交给内核;不要在业务项目重建 repository、连接池或权限流水线。
|
|
81
|
-
- 自定义查询声明 reads,二选一使用 sql/build,只读 \`safe.*\`;值参数化。不得拼接 SQL、查询基表绕过范围或硬编码密钥。
|
|
82
|
-
- scope 描述范围字段,角色数据决定实际范围;\`scope.none()\` 不代表所有人可访问。\`can/useCan\` 只控制按钮,后端负责授权。
|
|
83
|
-
- 前端从 \`@app/contracts\` 导入生成 API/类型,按需使用 \`@yss123/cage-client\`;不导入 domain、内核或数据库包。
|
|
84
|
-
- 多页面业务必须有独立 URL,不用 useState/tab 模拟整页导航;详情从 URL 取 ID 并独立加载。前端路由集中在 app,页面从模块公开入口接入 Outlet。登录后保留原路径/query/hash,401 回登录,403 展示权限提示;/admin/ 使用普通链接进入独立系统管理。前端路由不替代后端授权。实现、SPA 部署回退和浏览器配方见 docs/ai/routing.md。
|
|
85
|
-
- 跨聚合写入通过 reaction 调用命令。\`tx: 'same'\` 共同提交/回滚,默认 outbox 异步执行。资源 acquires/releases 是图规则标签,实际占用/释放仍由命令完成;离开持有状态要检查每条释放路径。
|
|
86
|
-
- 批量调用同一命令使用 reactionEach,声明 maxItems、唯一排序字段 orderBy、items 和 map;稳定键排序后串行执行。步骤依赖用 order,同事件同事务分组不得混用有序/无序或重复顺序。保持同事务回滚边界,见 docs/ai/primitives.md。
|
|
87
|
-
- 审批通过 approval + route 配置,结论是 process 命令;选中审批人不等于已具备能力、范围和额度。parallel(title, ...branch(...)) 声明结构化 AND:分支同时开始,内部顺序独立,全部活动分支完成后汇合;when 支持嵌套并仍按提交快照求值,声明有深度/数量边界,不支持任意跳转。currentSteps 表示当前活动节点集合,兼容字段 currentStep 只是最小活动索引,不能据此隐藏其他分支。人工节点 assignment: 'candidate' 开放候选领取/释放,approver.field 从 routable 字段选人;actions 开放转办、委派归还和前后/并行必签。任务操作与决定携带 revision,waiting 任务只能查看。approvalOperations() 为框架通用时效运行时:step.sla 配置自然分钟节点总时限,route.reminders 配置申请人催办;迁移并运行 worker 后提供持久站内提醒、已读与 Admin 通用页面,不自动批准或授予权限。政策、SDK 和边界见 docs/ai/approvals.md。第三方 IO 通过连接器,回调验签后调用 external 命令。
|
|
88
|
-
- job 的读取与调用必须列入 reads/calls。业务导入/导出放在需要的业务页面调用通用任务接口,202 只代表任务已接受;worker 必须运行。
|
|
89
|
-
- 已部署事件只做兼容扩展;新增字段设为 optional,不兼容含义用新事件。已执行/已发布迁移不能改写,结构更新新增迁移。
|
|
90
|
-
- 不手改生成物,不关闭门禁掩盖错误,不因方便自动授予生产角色新能力。unsafe 必须写明 reason/owner,不能替代普通业务声明。
|
|
91
|
-
- 按前述详细中文注释规范完成文件、API、业务声明和关键流程说明;避免无业务价值的防御分支和静默兜底。维护脚本用 TypeScript,不新增 .mjs。
|
|
92
|
-
|
|
93
|
-
### 最小命令形状
|
|
94
|
-
|
|
95
|
-
\`\`\`ts
|
|
96
|
-
// 片段:Order 为已导出的聚合,OrderSubmitted 为事件,业务校验按需求添加。
|
|
97
|
-
/**
|
|
98
|
-
* 将草稿订单提交审批:只有 draft 可进入 pending_approval。
|
|
99
|
-
* 入口使用 Order.submit 能力,真实授权、范围、状态和版本由内核检查;声明本身不自动授予权限。
|
|
100
|
-
* handler 返回草稿供后续校验和持久化,OrderSubmitted 随命令事务登记,后续由已配置消费者处理。
|
|
101
|
-
* 失败不会提交这次业务变更;事件已登记也不代表后续审批已经完成。
|
|
102
|
-
*/
|
|
103
|
-
export const submitOrder = command(Order, {
|
|
104
|
-
name: 'submit',
|
|
105
|
-
from: 'draft',
|
|
106
|
-
to: 'pending_approval',
|
|
107
|
-
emits: [OrderSubmitted],
|
|
108
|
-
handler: (draft) => draft,
|
|
109
|
-
});
|
|
110
|
-
\`\`\`
|
|
111
|
-
|
|
112
|
-
完整可添加的普通管理对象见 \`docs/ai/primitives.md\` 的 Note;采购模板的审批、资源、第三方示例在 \`packages/domain/src\`,空白模板的参考源码在 \`docs/examples/purchase-admin\`。先读本项目 AGENTS.md 中的模板说明,区分运行代码与参考资料。API 以当前包公开导出和生成契约为准,不发明不存在的配置和方法。
|
|
113
|
-
|
|
114
|
-
### 启动、验证与排错
|
|
115
|
-
|
|
116
|
-
在项目根目录执行:首次 \`pnpm install\`,复制并编辑 .env.example,仅提供已有库管理员连接后 \`pnpm exec cage init\`;再 \`pnpm build:app\`、\`pnpm gen\`,审查后 \`pnpm migrate\`;用 \`pnpm exec cage bootstrap --credentials-file .cage/admin-credentials.json\` 显式初始化组织,最后 \`pnpm dev\`。已有配置不能覆盖,凭据文件必须是新受限文件且父目录存在。
|
|
117
|
-
|
|
118
|
-
init 只准备账号/schema/授权并填写三个连接,不创建数据库;APP/READ/MIGRATE 指向同一个库。已有集群账号复用原密码,日常启动不用管理员。普通项目不新增 Docker 生命周期命令。
|
|
119
|
-
|
|
120
|
-
API 日常启动不初始化组织、不输出管理员密码;生产缺少合格 Cookie 密钥会拒绝启动。bootstrap 不自动授予业务能力。\`/healthz\` 只表示存活,\`/readyz\` 检查必要依赖。首阶段 API 与 worker 同版本部署,查看实际注册指纹和消费者心跳。
|
|
121
|
-
|
|
122
|
-
- \`pnpm exec cage graph\`:浏览器图谱,默认端口 15418,以终端为准。
|
|
123
|
-
- \`pnpm exec cage context command:对象.命令 --format json --out .cage/context.json\`:按完整 key 取精简上下文;默认 Markdown,可用 --depth/--limit 调整范围。CLI 每次重新抽取;Web“复制 AI 上下文”使用当前页面快照,改代码后先刷新图谱。
|
|
124
|
-
- \`graph inspect/path\` 有歧义时复制候选完整 key;path 默认沿箭头,--direction both 的逆向遍历不表示执行方向。报告中的测试/前端文件是候选,须核对;context 与图谱查询不覆盖当前图或命名快照。
|
|
125
|
-
- \`pnpm exec cage capabilities 关键词 --format json\`:查当前安装版本公开签名;\`cage doctor\`:区分注册、生成、构建、迁移、授权与实际进程证据,unknown 不能当作通过。\`cage timeline/explain\` 关联实际异步证据与解释授权,参数和权限见 docs/ai/diagnostics.md。
|
|
126
|
-
- 生成方法支持 signal/timeoutMs/idempotencyKey 请求选项。底层 CageResult 与 mutation 行为有区别:useCageCommand 失败抛 CageCommandError,成功才返回业务数据。订阅 client.subscribe 在退出、401、切换账号时取消查询并清除应用缓存。
|
|
127
|
-
- \`pnpm exec cage gen --check\`:生成一致性;\`pnpm exec cage sync --check\`:本托管区一致性。
|
|
128
|
-
- \`pnpm exec cage test --only project\`:业务测试;\`pnpm verify\`:类型、依赖、lint、图规则、生成、托管区、预算和测试。
|
|
129
|
-
- \`pnpm exec cage verify --skip-tests\` 表示不完整门禁;派生测试跳过不能当作通过。测试连接只用独立测试集群。
|
|
130
|
-
- 重要业务改动验证成功路径及有风险的反例;文档或可逆的小改动不反复跑全量数据库测试。
|
|
131
|
-
- 修改页面/导航后实际验收深链接、刷新、前进后退、登录回跳、无权限和 404;生产再查 SPA 回退。check/verify 不自动完成浏览器验收,未执行要明确报告。见 docs/ai/routing.md。
|
|
132
|
-
- CLI 报错先看 code/at/reason/fix,再查错误码册;HTTP 错误查 runtime.md。异步失败先看 worker、同步记录和死信,修复后重放,不能直接 SQL 改状态。
|
|
133
|
-
|
|
134
|
-
框架托管区由 cage sync 更新;项目独有的业务规则写在标记之外,避免升级覆盖。
|
|
19
|
+
### 学习与任务入口
|
|
20
|
+
|
|
21
|
+
本项目使用 \`@yss123/cage-*\`,业务写在本项目。先读项目说明指定的教材;独立项目默认入口是 \`docs/development/README.md\`。
|
|
22
|
+
|
|
23
|
+
开始 Cage 业务开发或排错时,加载 \`docs/development/skills/cage-development/SKILL.md\`,统一按“理解需求 → 澄清 → 查证能力 → 说明实现映射 → 编码 → 验收”工作。首次学习配合 \`docs/development/getting-started/first-feature.md\`;已熟悉时只读受影响专题,普通样式/文案改动无需重走业务建模。
|
|
24
|
+
|
|
25
|
+
支持 Agent Skills 的工具可发现 \`.agents/skills/cage-development\`;其他工具直接读取上述 Markdown,使用相同流程。教材随框架版本分发,均为本地文件,不需要额外服务、模型或索引。框架仓库范例使用项目说明指定的规范教材位置。
|
|
26
|
+
|
|
27
|
+
### 框架执行什么
|
|
28
|
+
|
|
29
|
+
- 业务声明从 domain 总入口导出,框架据此构建注册表、能力、HTTP 接口、本体图、契约与迁移草稿;只有文件而未导出不会生效。
|
|
30
|
+
- 命令是业务写入口;handler 描述变化与显式 reads,内核处理授权、状态、范围、版本、事务、审计及 outbox。读侧通过生成契约或 query 的安全视图,外部 IO 通过连接器。
|
|
31
|
+
- 角色、能力、数据范围、调用身份与业务约束分别建模。前端 can() 只影响显示,新增能力不自动授给生产角色;审批选人不授予能力。
|
|
32
|
+
- 页面依赖生成契约及客户端。表单、弹窗等临时状态留在前端;正式业务数据和流程结果通过服务端读写。实际记录不能用模拟仓储或固定统计替代。
|
|
33
|
+
|
|
34
|
+
### 编码前的依据
|
|
35
|
+
|
|
36
|
+
业务疑点按 \`docs/development/guides/business-collaboration.md\` 提出选项、影响和推荐,让用户选择;沿用已明确的规则与授权。API 和当前行为由 agent 查证,普通技术方案自行决定;等待业务答案时推进独立部分。
|
|
37
|
+
|
|
38
|
+
写代码前按 Skill 简述“已确认规则 → 已查证的 Cage 能力 → 修改位置 → 验收结果”,具体设计见 \`docs/development/guides/recipes.md\`。能力与签名查 \`cage capabilities\`,现有业务查 \`cage context\` 并阅读源码。未知规则和能力缺口不能靠猜测、编造 API 或复制示例填补;已明确的部分直接实施,不另设技术方案批准。
|
|
39
|
+
|
|
40
|
+
涉及领域建模先读 \`docs/development/guides/ontology-modeling.md\`:说明对象含义、关系方向/基数、状态及动作前后结果,再写真实声明。聚合/字段/命令等填写结构化描述,每个状态填写 labels;中文注释和前端文案不会自动成为本体名称。处理本次声明的 CAGE-ONTOLOGY-001,并按业务例子核对关系和触发链;名称完整不能证明业务正确。自然语言、文档、表格和原型都是输入,不能由模板或页面布局代替业务判断。
|
|
41
|
+
|
|
42
|
+
遇到原生 AI、AI 审批或随页助理,先读 \`docs/development/guides/intelligence.md\`,核对已有能力及应用启用状态。审批、文件、关系、数据传输等专题由 Skill 按需引导,不重建框架已有运行时。
|
|
43
|
+
|
|
44
|
+
### 代码与环境边界
|
|
45
|
+
|
|
46
|
+
- 所有手写代码遵守 \`docs/development/reference/commenting.md\`:文件职责与调用链、导出 API/字段、复杂分支的中文说明,写清做什么、为什么、怎样完成及实际边界;随代码更新。生成物注释从生成器维护。
|
|
47
|
+
- domain 按 modules/workflows/integrations/shared 组织,Web 按 app/modules/shared 组织。模块通过 index.ts 公开入口组合,前端不导入 domain、数据库或内核运行时;不关闭 modular 目录门禁。
|
|
48
|
+
- 领域含义修改前保留本体或真实 Git 基线;修改声明后运行 check/gen,审查契约和迁移草稿。生成物不手改,已执行迁移不可改写;具体命令见 \`docs/development/getting-started/workflow.md\`。
|
|
49
|
+
- 页面处理业务失败、版本冲突、会话与缓存;多页面使用独立 URL,筛选/分页进入查询参数,按 \`docs/development/guides/routing.md\` 实际验收。
|
|
50
|
+
- 新项目启动步骤见 \`docs/development/getting-started/workflow.md\`。使用已有 PostgreSQL 和项目 .env;init 准备账号,migrate 更新结构,bootstrap 显式初始化组织,dev 启动进程。普通业务不新增连接池或管理 Docker。
|
|
51
|
+
- 不输出或提交 .env、数据库密码、Cookie 密钥及初始化凭据。API 与 worker 使用一致的 domain,修改配置后按实际需要重启。
|
|
52
|
+
- 出错保留 code/at/reason/fix,查 \`docs/errors/README.md\` 与 \`docs/development/tools/troubleshooting.md\`;不得放宽权限、删约束或关闭门禁来掩盖问题。
|
|
53
|
+
|
|
54
|
+
### 完成依据
|
|
55
|
+
|
|
56
|
+
对照编码前的业务规则逐项验收,验证与改动匹配。check/gen/typecheck/build 证明各自检查范围;业务读写还需独立读取结果,权限需直接请求验证,审批需待办与结论,文件需实际内容,异步需任务终态,页面需浏览器操作。
|
|
57
|
+
|
|
58
|
+
\`pnpm verify\` 汇总门禁;\`verify --skip-tests\` 不代表完整通过。诊断用 \`cage doctor\`、\`timeline\`、\`explain\`,具体前提见 \`docs/development/tools/diagnostics.md\`。交付分别说明通过、跳过、未执行及剩余配置;文档和可逆小改动不反复执行全量数据库回归。
|
|
135
59
|
<!-- cage:end -->`;
|
|
136
60
|
/**
|
|
137
61
|
* 将现有文档中的唯一托管区替换为目标版本,返回完整文本而不写文件。
|
package/dist/sync.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,GAAG,EAAmB,MAAM,aAAa,CAAC;AAEnD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,GAAG,EAAmB,MAAM,aAAa,CAAC;AAEnD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,oBAAoB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA2CrC,CAAC;AAEnB;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,MAAM,GAAG,YAAY;IACrE,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAC,CAAC,CAAC;IAClE,MAAM,IAAI,GAAG,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IACrE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,KAAM,EAAE,CAAC;QAClF,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AACxG,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,IAAI,CAAC,GAAe,EAAE,KAAK,GAAG,KAAK;IACjD,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAClE,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,EAAE,CAAC;IAChC,IAAI,KAAK;QACP,OAAO;YACL;gBACE,IAAI,EAAE,eAAe;gBACrB,EAAE,EAAE,WAAW;gBACf,MAAM,EAAE,WAAW;gBACnB,GAAG,EAAE,wBAAwB;aAC9B;SACF,CAAC;IACJ,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3B,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
package/graph-ui/app.js
CHANGED
|
@@ -952,9 +952,10 @@ function renderInspector() {
|
|
|
952
952
|
? node.attrs.from.map(stateName).join('、')
|
|
953
953
|
: stateName(String(node.attrs.from)));
|
|
954
954
|
row('目标状态', node.attrs.to ? stateName(String(node.attrs.to)) : '保持当前状态');
|
|
955
|
+
// 调用身份不等于具体触发来源;只有审批绑定关系才能证明某命令承接审批结论。
|
|
955
956
|
const actors = {
|
|
956
957
|
user: '用户',
|
|
957
|
-
process: '
|
|
958
|
+
process: '内部流程',
|
|
958
959
|
external: '外部系统',
|
|
959
960
|
job: '定时任务',
|
|
960
961
|
reaction: '事件反应',
|
|
@@ -1081,7 +1082,7 @@ function detailValue(key, value) {
|
|
|
1081
1082
|
return ['kind', 'sensitive'].includes(key) ? (types[String(value)] ?? String(value)) : String(value);
|
|
1082
1083
|
}
|
|
1083
1084
|
/**
|
|
1084
|
-
*
|
|
1085
|
+
* 将约束中文解释委托共享业务规则,保证技术详情和业务地图使用同一字段口径。
|
|
1085
1086
|
*/
|
|
1086
1087
|
function constraintLabel(name, aggregateId) {
|
|
1087
1088
|
return businessConstraintLabel(name, aggregateId, snapshot.presentation.labels);
|
package/graph-ui/business.js
CHANGED
|
@@ -258,7 +258,7 @@ export function renderBusiness(host, model, snapshot, actions) {
|
|
|
258
258
|
host.append(objects, h('p', 'business-scene-description', block.description ||
|
|
259
259
|
(block.processes.length
|
|
260
260
|
? '选择完整业务流程,沿主线查看阶段、分支与关联。'
|
|
261
|
-
: '
|
|
261
|
+
: '按业务对象查看完整生命周期;允许的操作及其调用身份分别标明。')));
|
|
262
262
|
if (journeys.length) {
|
|
263
263
|
const grid = h('div', 'business-flow-grid business-journeys');
|
|
264
264
|
for (const journey of journeys) {
|
|
@@ -332,8 +332,15 @@ export function renderBusiness(host, model, snapshot, actions) {
|
|
|
332
332
|
}
|
|
333
333
|
host.append(controls, h('p', 'business-process-legend', '绿色箭头:业务走向 · 棕色箭头:展开的其他分支 · 虚线:涉及的业务对象'));
|
|
334
334
|
}
|
|
335
|
-
else if (lifecycle)
|
|
335
|
+
else if (lifecycle) {
|
|
336
336
|
host.append(h('p', 'business-process-legend', '根据真实状态迁移整理,展示允许的操作;具体执行条件请点击查看。'));
|
|
337
|
+
// 标签缺失只影响阅读,不等于状态不存在;保留原标识,并把补充文案的原因单独说明。
|
|
338
|
+
// 按真实对象归属统计,避免把其他对象的同名状态算入当前生命周期。
|
|
339
|
+
const unnamed = model.nodes.filter((node) => node.kind === 'state' && businessOwner(model, node)?.key === flow.key &&
|
|
340
|
+
!labels[node.key] && !node.attrs.title && !node.attrs.description);
|
|
341
|
+
if (unnamed.length)
|
|
342
|
+
host.append(h('p', 'source-note', `${unnamed.length} 个状态尚未配置业务名称,当前显示原始标识。`));
|
|
343
|
+
}
|
|
337
344
|
const steps = flattenBusinessSteps(root);
|
|
338
345
|
const approvals = new Map(steps.flatMap((step) => {
|
|
339
346
|
const flow = approvalFlowForStep(model, step, labels);
|
|
@@ -480,9 +487,10 @@ export function renderBusiness(host, model, snapshot, actions) {
|
|
|
480
487
|
section('什么时候执行', `${selected.label}${selected.note ? `。${selected.note}` : ''}`);
|
|
481
488
|
if (node.kind === 'command') {
|
|
482
489
|
const rules = section('执行条件');
|
|
490
|
+
// process 是调用身份,不能仅凭这个值声称操作一定由审批触发。
|
|
483
491
|
const actors = {
|
|
484
492
|
user: '用户',
|
|
485
|
-
process: '
|
|
493
|
+
process: '内部流程',
|
|
486
494
|
external: '外部系统',
|
|
487
495
|
job: '定时任务',
|
|
488
496
|
reaction: '自动处理',
|
|
@@ -155,19 +155,18 @@ export function businessBlocks(model, labels = {}, showSystem = false) {
|
|
|
155
155
|
});
|
|
156
156
|
return [...blocks.values()].sort((a, b) => Number(a.system) - Number(b.system) || b.flows.length - a.flows.length || a.id.localeCompare(b.id));
|
|
157
157
|
}
|
|
158
|
-
/** 业务页面缺少文案时明确提示补充,不用程序标识替代业务名称。完整本体仍保留标识。 */
|
|
159
158
|
/**
|
|
160
|
-
*
|
|
159
|
+
* 按显示覆盖、声明标题、描述、原始标识的顺序选择业务阅读名称。
|
|
160
|
+
* 与完整本体共用名称规则,避免缺少文案时把不同状态或操作变成同一个“待命名”节点;
|
|
161
|
+
* 不从标识或源码注释猜测业务含义,新建入口仍使用业务阅读专用文案。
|
|
161
162
|
* @param node 展示节点。
|
|
162
|
-
* @param labels
|
|
163
|
-
* @returns
|
|
163
|
+
* @param labels 声明文案与 graph.labels 合并后的显示映射。
|
|
164
|
+
* @returns 阅读标题,不修改节点、实际标识或业务规则,也不执行 IO。
|
|
164
165
|
*/
|
|
165
166
|
export function businessLabel(node, labels = {}) {
|
|
166
167
|
if (node.kind === 'entry')
|
|
167
168
|
return '新建业务';
|
|
168
|
-
|
|
169
|
-
return nodeLabel(node, labels);
|
|
170
|
-
return `待命名${{ aggregate: '业务对象', command: '操作', state: '状态', process: '流程', stage: '阶段', event: '业务结果', reaction: '自动处理', approval: '审批', inbound: '外部通知', outbound: '外部同步', query: '查询', job: '定时处理' }[node.kind] ?? '声明'}`;
|
|
169
|
+
return nodeLabel(node, labels);
|
|
171
170
|
}
|
|
172
171
|
/**
|
|
173
172
|
* 优先返回板块显式流程并保持源码顺序;没有流程规格时返回有状态迁移的对象供生命周期阅读。
|
|
@@ -252,8 +251,10 @@ export function traceBusinessLifecycle(model, object, labels) {
|
|
|
252
251
|
const repeated = seen.has(node.key);
|
|
253
252
|
const action = via[0];
|
|
254
253
|
const actor = (action?.attrs.invokedBy ?? []);
|
|
254
|
+
// invokedBy 只声明允许的调用身份,process 本身不能证明存在审批绑定。
|
|
255
|
+
// 生命周期沿状态迁移展示操作;具体审批通过/驳回语义由触发链中的 binds 关系解释。
|
|
255
256
|
const label = action
|
|
256
|
-
? `${actor.includes('user') ? '人工' : actor.includes('external') ? '外部通知' : actor.includes('process') ? '
|
|
257
|
+
? `${actor.includes('user') ? '人工' : actor.includes('external') ? '外部通知' : actor.includes('process') ? '内部流程' : '业务操作'} · ${businessLabel(action, labels)}`
|
|
257
258
|
: '生命周期起点';
|
|
258
259
|
const step = {
|
|
259
260
|
id: repeated ? `${parent}>${node.key}` : node.key,
|
|
@@ -365,21 +366,23 @@ export function flattenBusinessSteps(root) {
|
|
|
365
366
|
return [root, ...root.children.flatMap(flattenBusinessSteps)];
|
|
366
367
|
}
|
|
367
368
|
/**
|
|
368
|
-
* 把命令 from/to
|
|
369
|
+
* 把命令 from/to 转成状态迁移摘要,供操作卡片、流程节点和详情复用。
|
|
370
|
+
* 优先读取所属聚合的状态显示名,缺失时保留当前命令内可区分的状态标识;
|
|
371
|
+
* 不从状态标识推测中文含义,也不把多个无标签状态合并成同一占位词。
|
|
369
372
|
* @param node 非命令返回空字符串。
|
|
370
|
-
* @param labels
|
|
371
|
-
* @returns 允许起始状态与目标,to=null
|
|
373
|
+
* @param labels 状态声明标签与 graph.labels 合并后的显示映射。
|
|
374
|
+
* @returns 允许起始状态与目标,to=null 描述保持当前状态;不修改节点或执行命令。
|
|
372
375
|
*/
|
|
373
376
|
export function businessStateSummary(node, labels) {
|
|
374
377
|
if (node.kind !== 'command')
|
|
375
378
|
return '';
|
|
376
379
|
const owner = node.id.slice(0, node.id.lastIndexOf('.'));
|
|
377
|
-
const name = (s) => (s === 'new' ? '新建' : (labels[`state:${owner}.${s}`]
|
|
380
|
+
const name = (s) => (s === 'new' ? '新建' : (labels[`state:${owner}.${s}`] || s));
|
|
378
381
|
const from = (Array.isArray(node.attrs.from) ? node.attrs.from : [node.attrs.from]);
|
|
379
382
|
return `${from.filter(Boolean).map(name).join(' / ')} → ${node.attrs.to == null ? '保持当前状态' : name(String(node.attrs.to))}`;
|
|
380
383
|
}
|
|
381
384
|
/**
|
|
382
|
-
*
|
|
385
|
+
* 把已知约束名翻译为业务提示,并解析职责分离字段。
|
|
383
386
|
* @param name 内核约束标识。
|
|
384
387
|
* @param owner 所属聚合 ID。
|
|
385
388
|
* @param labels 字段中文标签。
|
|
@@ -387,9 +390,6 @@ export function businessStateSummary(node, labels) {
|
|
|
387
390
|
*/
|
|
388
391
|
export function businessConstraintLabel(name, owner, labels) {
|
|
389
392
|
const field = (id) => labels[`field:${owner}.${id}`] ?? id;
|
|
390
|
-
const ceiling = /^ceiling\((.+)\)$/.exec(name);
|
|
391
|
-
if (ceiling)
|
|
392
|
-
return `${field(ceiling[1])}不超过审批额度`;
|
|
393
393
|
const sod = /^sod\.notSameAs\((.+)\)$/.exec(name);
|
|
394
394
|
if (sod)
|
|
395
395
|
return `审批人与${field(sod[1])}不同`;
|
|
@@ -111,11 +111,9 @@ export function explainEdge(edge, model, labels = {}) {
|
|
|
111
111
|
return result('映射外发字段', '外部同步数据', `“${a}”的 fields 声明包含“${b}”对应的字段名;抽取器将它关联到发出事件的聚合中同名字段。`, '用于核对外发字段范围和字段变更的同步影响;具体取值及转换由事件载荷与 map 函数决定。', [`${from.id}.fields 包含 ${field}`, `同名聚合字段:${to.id}`]);
|
|
112
112
|
if (as.startsWith('约束 ')) {
|
|
113
113
|
const rule = as.slice(3);
|
|
114
|
-
const purpose = rule.startsWith('
|
|
115
|
-
?
|
|
116
|
-
:
|
|
117
|
-
? `用于校验调用人与“${b}”记录的人不同,避免同一人完成需要分离的职责。`
|
|
118
|
-
: `该约束读取“${b}”执行命令前的业务检查;字段变更时应一起复核约束。`;
|
|
114
|
+
const purpose = rule.startsWith('sod.notSameAs(')
|
|
115
|
+
? `用于校验调用人与“${b}”记录的人不同,避免同一人完成需要分离的职责。`
|
|
116
|
+
: `该约束读取“${b}”执行命令前的业务检查;字段变更时应一起复核约束。`;
|
|
119
117
|
return result('执行约束检查', '命令校验依赖', `“${a}”声明的约束 ${rule} 使用“${b}”。`, purpose, [
|
|
120
118
|
`${from.id}.constraints → ${rule}`,
|
|
121
119
|
`约束 fields 包含 ${field}`,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yss123/cage-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "cage 命令行:init、gen、check、graph、context、impact、test、verify、budget、sync、upgrade、dev、migrate",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -31,11 +31,11 @@
|
|
|
31
31
|
"typescript": "~5.9.3",
|
|
32
32
|
"vitest": "^4.1.12",
|
|
33
33
|
"zod": "^4.1.5",
|
|
34
|
-
"@yss123/cage-
|
|
35
|
-
"@yss123/cage-
|
|
36
|
-
"@yss123/cage-
|
|
37
|
-
"@yss123/cage-
|
|
38
|
-
"@yss123/cage-testkit": "0.
|
|
34
|
+
"@yss123/cage-admin": "0.4.0",
|
|
35
|
+
"@yss123/cage-kernel": "0.4.0",
|
|
36
|
+
"@yss123/cage-ontology": "0.4.0",
|
|
37
|
+
"@yss123/cage-lint": "0.4.0",
|
|
38
|
+
"@yss123/cage-testkit": "0.4.0"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
41
|
"@types/pg": "^8.15.5"
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cage-development
|
|
3
|
+
description: 使用 Cage 框架开发、修改和排查业务应用。适用于依赖 @yss123/cage-*、具有 cage.config.json 的项目,与用户澄清需求、比较方案,再完成业务建模、框架接入与验收;维护框架内部实现时先遵守框架仓库的 AGENTS.md。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<!-- 由 scripts/sync-agent-skill.ts 生成;教学正文只在 docs/development 维护。 -->
|
|
7
|
+
|
|
8
|
+
加载本技能后,先阅读[完整框架开发方法](../../../docs/development/skills/cage-development/SKILL.md),再根据其中的任务选择表读取相关专题。
|
|
9
|
+
正文规定先理解需求、提出疑问与建议、查证框架,再说明实现映射、编码和验收;不要只凭本入口的摘要开始编写业务。
|
|
10
|
+
当前项目的业务要求与 AGENTS.md 仍适用,框架维护任务遵守仓库的包边界。
|
package/templates/app/AGENTS.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
这是 create-cage-app 生成的业务项目,当前包含采购演示,可逐步替换成客户业务。业务源码在本项目,框架通过 @yss123/cage-* 依赖提供。
|
|
4
4
|
|
|
5
|
-
先读 [业务开发指南](docs/
|
|
5
|
+
先读 [业务开发指南](docs/development/README.md),按需求查 [任务配方](docs/development/guides/recipes.md)、[完整采购范例](docs/development/examples/purchase-example.md) 和 [错误码册](docs/errors/README.md)。这些资料就在项目内,无需克隆框架仓库。
|
|
6
6
|
|
|
7
7
|
## 项目自己的业务约定
|
|
8
8
|
|
|
@@ -10,127 +10,47 @@
|
|
|
10
10
|
|
|
11
11
|
本节位于托管区之外,cage sync 会保留。下面的托管区提供框架工作方法。
|
|
12
12
|
|
|
13
|
-
<!-- cage:begin v0.
|
|
13
|
+
<!-- cage:begin v0.4.0 -->
|
|
14
14
|
## Cage 业务开发约定(框架托管)
|
|
15
15
|
|
|
16
|
-
###
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
| `packages/contracts/src/aggregates/<聚合>`、`queries` | 生成协议;根 index.ts 提供 @app/contracts 公共入口,只用 cage gen 更新 |
|
|
57
|
-
| `apps/api/src` | API/worker 薄启动入口,普通业务不手写 HTTP 路由 |
|
|
58
|
-
| `apps/web/src/app` | 会话、URL 路由、布局、模块组合;main.tsx 只挂载和装配 Provider |
|
|
59
|
-
| `apps/web/src/modules/<业务>` | 页面、表单、专用 hooks/API/样式;从模块 index.ts 暴露页面 |
|
|
60
|
-
| `apps/web/src/shared` | 跨模块复用且不绑定业务的 UI、hooks、纯辅助函数 |
|
|
61
|
-
| `db/migrations` | 审查过的结构迁移,作用于已配置的数据库 |
|
|
62
|
-
| `cage.config.json` | 项目路径、检查配置、graph.labels 中文图谱名称 |
|
|
63
|
-
| `.env` | 本机真实连接和密钥;不提交、不输出完整内容 |
|
|
64
|
-
|
|
65
|
-
新增业务不得继续平铺在 src 根目录。前端模块只依赖自己和 shared,由 app 通过公开入口组合;shared 不反向依赖业务。领域模块间确有读取依赖时走目标模块 index.ts;跨模块反应写 workflows。小模块不创建空层级,已有独立职责再拆文件。完整命名、目录树和示例见 `docs/ai/project-structure.md`。新模板启用 `structure: modular`,check/verify 检查目录和导入边界,遇到 CAGE-STRUCT 错误按职责修正。
|
|
66
|
-
|
|
67
|
-
### 实现一项需求的顺序
|
|
68
|
-
|
|
69
|
-
1. 先运行 `pnpm exec cage context "需求关键词"`;按需 `graph search` 查候选、`graph inspect` 查完整节点、`graph path` 看关系路径。确认中文匹配入口后按源码位置阅读实现;候选和子图不是全部依赖,具体条件不能凭连线推断。完整用法见 `docs/ai/ontology-context.md`。从用户需求确定字段、状态/动作、角色/范围、约束与后续动作;能由业务声明表达的不改框架。
|
|
70
|
-
2. 已有业务含义变化时,修改前用 `pnpm exec cage snapshot save before-change` 保存不可覆盖的命名基线;或使用真实 Git 提交/独立本体图文件。
|
|
71
|
-
3. 先声明 aggregate/states/command/constraints/event,再写 handler、reaction/query/approval/connector,最后接业务页面。声明使用模块顶层 `export const`,从 domain 入口导出,跨文件导出名保持唯一。
|
|
72
|
-
4. 运行 `pnpm exec cage check` 和 `pnpm gen`,审查 contracts 和迁移草稿。按需运行 `pnpm exec cage impact --snapshot before-change`,补中文图谱名。
|
|
73
|
-
5. 页面使用生成方法并处理 code/domainCode;列表、详情等多页面注册到 React Router,Link/NavLink 导航,筛选/分页进入 URL。组件状态用于弹窗和表单等临时交互。新增能力由管理员授权。数据库结构变化审查后显式 `pnpm migrate`,dev 不代办迁移。
|
|
74
|
-
6. 按 `commenting.md` 逐文件检查详细中文注释与实现一致,再按改动运行必要验证;交付时说明体验步骤、授权配置、迁移、注释覆盖,以及通过/跳过/未执行项。
|
|
75
|
-
|
|
76
|
-
### 必守边界
|
|
77
|
-
|
|
78
|
-
- 聚合定义对象字段、状态、范围字段与不变量;命令是业务写入口。handler 只计算业务变化和读取 reads 中的依赖,不直接操作数据库、网络或文件。
|
|
79
|
-
- 对象关系统一放在 fields:ref 为外键,hasMany 为只读反查,manyToMany 自动生成中间表并随所属对象命令提交。前端用生成的 related 方法分页读取;不手写纯中间表聚合,不把单页结果当完整集合替换。完整例子见 docs/ai/relations.md。
|
|
80
|
-
- command 的 input 使用 Zod;已有记录输入必须含 id。from/to 表达状态迁移;`to: null` 只适用于已有记录并保留状态,不能靠 handler 改 status 绕过状态机。
|
|
81
|
-
- 写入、审计、版本、幂等和事务交给内核;不要在业务项目重建 repository、连接池或权限流水线。
|
|
82
|
-
- 自定义查询声明 reads,二选一使用 sql/build,只读 `safe.*`;值参数化。不得拼接 SQL、查询基表绕过范围或硬编码密钥。
|
|
83
|
-
- scope 描述范围字段,角色数据决定实际范围;`scope.none()` 不代表所有人可访问。`can/useCan` 只控制按钮,后端负责授权。
|
|
84
|
-
- 前端从 `@app/contracts` 导入生成 API/类型,按需使用 `@yss123/cage-client`;不导入 domain、内核或数据库包。
|
|
85
|
-
- 多页面业务必须有独立 URL,不用 useState/tab 模拟整页导航;详情从 URL 取 ID 并独立加载。前端路由集中在 app,页面从模块公开入口接入 Outlet。登录后保留原路径/query/hash,401 回登录,403 展示权限提示;/admin/ 使用普通链接进入独立系统管理。前端路由不替代后端授权。实现、SPA 部署回退和浏览器配方见 docs/ai/routing.md。
|
|
86
|
-
- 跨聚合写入通过 reaction 调用命令。`tx: 'same'` 共同提交/回滚,默认 outbox 异步执行。资源 acquires/releases 是图规则标签,实际占用/释放仍由命令完成;离开持有状态要检查每条释放路径。
|
|
87
|
-
- 批量调用同一命令使用 reactionEach,声明 maxItems、唯一排序字段 orderBy、items 和 map;稳定键排序后串行执行。步骤依赖用 order,同事件同事务分组不得混用有序/无序或重复顺序。保持同事务回滚边界,见 docs/ai/primitives.md。
|
|
88
|
-
- 审批通过 approval + route 配置,结论是 process 命令;选中审批人不等于已具备能力、范围和额度。parallel(title, ...branch(...)) 声明结构化 AND:分支同时开始,内部顺序独立,全部活动分支完成后汇合;when 支持嵌套并仍按提交快照求值,声明有深度/数量边界,不支持任意跳转。currentSteps 表示当前活动节点集合,兼容字段 currentStep 只是最小活动索引,不能据此隐藏其他分支。人工节点 assignment: 'candidate' 开放候选领取/释放,approver.field 从 routable 字段选人;actions 开放转办、委派归还和前后/并行必签。任务操作与决定携带 revision,waiting 任务只能查看。approvalOperations() 为框架通用时效运行时:step.sla 配置自然分钟节点总时限,route.reminders 配置申请人催办;迁移并运行 worker 后提供持久站内提醒、已读与 Admin 通用页面,不自动批准或授予权限。政策、SDK 和边界见 docs/ai/approvals.md。第三方 IO 通过连接器,回调验签后调用 external 命令。
|
|
89
|
-
- job 的读取与调用必须列入 reads/calls。业务导入/导出放在需要的业务页面调用通用任务接口,202 只代表任务已接受;worker 必须运行。
|
|
90
|
-
- 已部署事件只做兼容扩展;新增字段设为 optional,不兼容含义用新事件。已执行/已发布迁移不能改写,结构更新新增迁移。
|
|
91
|
-
- 不手改生成物,不关闭门禁掩盖错误,不因方便自动授予生产角色新能力。unsafe 必须写明 reason/owner,不能替代普通业务声明。
|
|
92
|
-
- 按前述详细中文注释规范完成文件、API、业务声明和关键流程说明;避免无业务价值的防御分支和静默兜底。维护脚本用 TypeScript,不新增 .mjs。
|
|
93
|
-
|
|
94
|
-
### 最小命令形状
|
|
95
|
-
|
|
96
|
-
```ts
|
|
97
|
-
// 片段:Order 为已导出的聚合,OrderSubmitted 为事件,业务校验按需求添加。
|
|
98
|
-
/**
|
|
99
|
-
* 将草稿订单提交审批:只有 draft 可进入 pending_approval。
|
|
100
|
-
* 入口使用 Order.submit 能力,真实授权、范围、状态和版本由内核检查;声明本身不自动授予权限。
|
|
101
|
-
* handler 返回草稿供后续校验和持久化,OrderSubmitted 随命令事务登记,后续由已配置消费者处理。
|
|
102
|
-
* 失败不会提交这次业务变更;事件已登记也不代表后续审批已经完成。
|
|
103
|
-
*/
|
|
104
|
-
export const submitOrder = command(Order, {
|
|
105
|
-
name: 'submit',
|
|
106
|
-
from: 'draft',
|
|
107
|
-
to: 'pending_approval',
|
|
108
|
-
emits: [OrderSubmitted],
|
|
109
|
-
handler: (draft) => draft,
|
|
110
|
-
});
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
完整可添加的普通管理对象见 `docs/ai/primitives.md` 的 Note;采购模板的审批、资源、第三方示例在 `packages/domain/src`,空白模板的参考源码在 `docs/examples/purchase-admin`。先读本项目 AGENTS.md 中的模板说明,区分运行代码与参考资料。API 以当前包公开导出和生成契约为准,不发明不存在的配置和方法。
|
|
114
|
-
|
|
115
|
-
### 启动、验证与排错
|
|
116
|
-
|
|
117
|
-
在项目根目录执行:首次 `pnpm install`,复制并编辑 .env.example,仅提供已有库管理员连接后 `pnpm exec cage init`;再 `pnpm build:app`、`pnpm gen`,审查后 `pnpm migrate`;用 `pnpm exec cage bootstrap --credentials-file .cage/admin-credentials.json` 显式初始化组织,最后 `pnpm dev`。已有配置不能覆盖,凭据文件必须是新受限文件且父目录存在。
|
|
118
|
-
|
|
119
|
-
init 只准备账号/schema/授权并填写三个连接,不创建数据库;APP/READ/MIGRATE 指向同一个库。已有集群账号复用原密码,日常启动不用管理员。普通项目不新增 Docker 生命周期命令。
|
|
120
|
-
|
|
121
|
-
API 日常启动不初始化组织、不输出管理员密码;生产缺少合格 Cookie 密钥会拒绝启动。bootstrap 不自动授予业务能力。`/healthz` 只表示存活,`/readyz` 检查必要依赖。首阶段 API 与 worker 同版本部署,查看实际注册指纹和消费者心跳。
|
|
122
|
-
|
|
123
|
-
- `pnpm exec cage graph`:浏览器图谱,默认端口 15418,以终端为准。
|
|
124
|
-
- `pnpm exec cage context command:对象.命令 --format json --out .cage/context.json`:按完整 key 取精简上下文;默认 Markdown,可用 --depth/--limit 调整范围。CLI 每次重新抽取;Web“复制 AI 上下文”使用当前页面快照,改代码后先刷新图谱。
|
|
125
|
-
- `graph inspect/path` 有歧义时复制候选完整 key;path 默认沿箭头,--direction both 的逆向遍历不表示执行方向。报告中的测试/前端文件是候选,须核对;context 与图谱查询不覆盖当前图或命名快照。
|
|
126
|
-
- `pnpm exec cage capabilities 关键词 --format json`:查当前安装版本公开签名;`cage doctor`:区分注册、生成、构建、迁移、授权与实际进程证据,unknown 不能当作通过。`cage timeline/explain` 关联实际异步证据与解释授权,参数和权限见 docs/ai/diagnostics.md。
|
|
127
|
-
- 生成方法支持 signal/timeoutMs/idempotencyKey 请求选项。底层 CageResult 与 mutation 行为有区别:useCageCommand 失败抛 CageCommandError,成功才返回业务数据。订阅 client.subscribe 在退出、401、切换账号时取消查询并清除应用缓存。
|
|
128
|
-
- `pnpm exec cage gen --check`:生成一致性;`pnpm exec cage sync --check`:本托管区一致性。
|
|
129
|
-
- `pnpm exec cage test --only project`:业务测试;`pnpm verify`:类型、依赖、lint、图规则、生成、托管区、预算和测试。
|
|
130
|
-
- `pnpm exec cage verify --skip-tests` 表示不完整门禁;派生测试跳过不能当作通过。测试连接只用独立测试集群。
|
|
131
|
-
- 重要业务改动验证成功路径及有风险的反例;文档或可逆的小改动不反复跑全量数据库测试。
|
|
132
|
-
- 修改页面/导航后实际验收深链接、刷新、前进后退、登录回跳、无权限和 404;生产再查 SPA 回退。check/verify 不自动完成浏览器验收,未执行要明确报告。见 docs/ai/routing.md。
|
|
133
|
-
- CLI 报错先看 code/at/reason/fix,再查错误码册;HTTP 错误查 runtime.md。异步失败先看 worker、同步记录和死信,修复后重放,不能直接 SQL 改状态。
|
|
134
|
-
|
|
135
|
-
框架托管区由 cage sync 更新;项目独有的业务规则写在标记之外,避免升级覆盖。
|
|
16
|
+
### 学习与任务入口
|
|
17
|
+
|
|
18
|
+
本项目使用 `@yss123/cage-*`,业务写在本项目。先读项目说明指定的教材;独立项目默认入口是 `docs/development/README.md`。
|
|
19
|
+
|
|
20
|
+
开始 Cage 业务开发或排错时,加载 `docs/development/skills/cage-development/SKILL.md`,统一按“理解需求 → 澄清 → 查证能力 → 说明实现映射 → 编码 → 验收”工作。首次学习配合 `docs/development/getting-started/first-feature.md`;已熟悉时只读受影响专题,普通样式/文案改动无需重走业务建模。
|
|
21
|
+
|
|
22
|
+
支持 Agent Skills 的工具可发现 `.agents/skills/cage-development`;其他工具直接读取上述 Markdown,使用相同流程。教材随框架版本分发,均为本地文件,不需要额外服务、模型或索引。框架仓库范例使用项目说明指定的规范教材位置。
|
|
23
|
+
|
|
24
|
+
### 框架执行什么
|
|
25
|
+
|
|
26
|
+
- 业务声明从 domain 总入口导出,框架据此构建注册表、能力、HTTP 接口、本体图、契约与迁移草稿;只有文件而未导出不会生效。
|
|
27
|
+
- 命令是业务写入口;handler 描述变化与显式 reads,内核处理授权、状态、范围、版本、事务、审计及 outbox。读侧通过生成契约或 query 的安全视图,外部 IO 通过连接器。
|
|
28
|
+
- 角色、能力、数据范围、调用身份与业务约束分别建模。前端 can() 只影响显示,新增能力不自动授给生产角色;审批选人不授予能力。
|
|
29
|
+
- 页面依赖生成契约及客户端。表单、弹窗等临时状态留在前端;正式业务数据和流程结果通过服务端读写。实际记录不能用模拟仓储或固定统计替代。
|
|
30
|
+
|
|
31
|
+
### 编码前的依据
|
|
32
|
+
|
|
33
|
+
业务疑点按 `docs/development/guides/business-collaboration.md` 提出选项、影响和推荐,让用户选择;沿用已明确的规则与授权。API 和当前行为由 agent 查证,普通技术方案自行决定;等待业务答案时推进独立部分。
|
|
34
|
+
|
|
35
|
+
写代码前按 Skill 简述“已确认规则 → 已查证的 Cage 能力 → 修改位置 → 验收结果”,具体设计见 `docs/development/guides/recipes.md`。能力与签名查 `cage capabilities`,现有业务查 `cage context` 并阅读源码。未知规则和能力缺口不能靠猜测、编造 API 或复制示例填补;已明确的部分直接实施,不另设技术方案批准。
|
|
36
|
+
|
|
37
|
+
涉及领域建模先读 `docs/development/guides/ontology-modeling.md`:说明对象含义、关系方向/基数、状态及动作前后结果,再写真实声明。聚合/字段/命令等填写结构化描述,每个状态填写 labels;中文注释和前端文案不会自动成为本体名称。处理本次声明的 CAGE-ONTOLOGY-001,并按业务例子核对关系和触发链;名称完整不能证明业务正确。自然语言、文档、表格和原型都是输入,不能由模板或页面布局代替业务判断。
|
|
38
|
+
|
|
39
|
+
遇到原生 AI、AI 审批或随页助理,先读 `docs/development/guides/intelligence.md`,核对已有能力及应用启用状态。审批、文件、关系、数据传输等专题由 Skill 按需引导,不重建框架已有运行时。
|
|
40
|
+
|
|
41
|
+
### 代码与环境边界
|
|
42
|
+
|
|
43
|
+
- 所有手写代码遵守 `docs/development/reference/commenting.md`:文件职责与调用链、导出 API/字段、复杂分支的中文说明,写清做什么、为什么、怎样完成及实际边界;随代码更新。生成物注释从生成器维护。
|
|
44
|
+
- domain 按 modules/workflows/integrations/shared 组织,Web 按 app/modules/shared 组织。模块通过 index.ts 公开入口组合,前端不导入 domain、数据库或内核运行时;不关闭 modular 目录门禁。
|
|
45
|
+
- 领域含义修改前保留本体或真实 Git 基线;修改声明后运行 check/gen,审查契约和迁移草稿。生成物不手改,已执行迁移不可改写;具体命令见 `docs/development/getting-started/workflow.md`。
|
|
46
|
+
- 页面处理业务失败、版本冲突、会话与缓存;多页面使用独立 URL,筛选/分页进入查询参数,按 `docs/development/guides/routing.md` 实际验收。
|
|
47
|
+
- 新项目启动步骤见 `docs/development/getting-started/workflow.md`。使用已有 PostgreSQL 和项目 .env;init 准备账号,migrate 更新结构,bootstrap 显式初始化组织,dev 启动进程。普通业务不新增连接池或管理 Docker。
|
|
48
|
+
- 不输出或提交 .env、数据库密码、Cookie 密钥及初始化凭据。API 与 worker 使用一致的 domain,修改配置后按实际需要重启。
|
|
49
|
+
- 出错保留 code/at/reason/fix,查 `docs/errors/README.md` 与 `docs/development/tools/troubleshooting.md`;不得放宽权限、删约束或关闭门禁来掩盖问题。
|
|
50
|
+
|
|
51
|
+
### 完成依据
|
|
52
|
+
|
|
53
|
+
对照编码前的业务规则逐项验收,验证与改动匹配。check/gen/typecheck/build 证明各自检查范围;业务读写还需独立读取结果,权限需直接请求验证,审批需待办与结论,文件需实际内容,异步需任务终态,页面需浏览器操作。
|
|
54
|
+
|
|
55
|
+
`pnpm verify` 汇总门禁;`verify --skip-tests` 不代表完整通过。诊断用 `cage doctor`、`timeline`、`explain`,具体前提见 `docs/development/tools/diagnostics.md`。交付分别说明通过、跳过、未执行及剩余配置;文档和可逆小改动不反复执行全量数据库回归。
|
|
136
56
|
<!-- cage:end -->
|