@yss123/cage-cli 0.2.0 → 0.3.1
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 +47 -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 +18 -2
- package/dist/analyze.js.map +1 -1
- package/dist/approval-tree.d.ts +88 -0
- package/dist/approval-tree.js +18 -0
- package/dist/approval-tree.js.map +1 -0
- 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 +148 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/config.d.ts +31 -2
- package/dist/config.js +22 -0
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +14 -0
- package/dist/context.js +35 -2
- package/dist/context.js.map +1 -1
- package/dist/create-prompt.d.ts +7 -0
- package/dist/create-prompt.js +12 -0
- package/dist/create-prompt.js.map +1 -1
- package/dist/create.d.ts +21 -1
- package/dist/create.js +23 -1
- 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 +11 -0
- 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 +52 -12
- package/dist/gen/contracts.js.map +1 -1
- package/dist/gen/index.d.ts +26 -0
- package/dist/gen/index.js +69 -1
- package/dist/gen/index.js.map +1 -1
- package/dist/gen/zod-code.d.ts +42 -0
- package/dist/gen/zod-code.js +178 -16
- package/dist/gen/zod-code.js.map +1 -1
- package/dist/graph-approvals.d.ts +70 -0
- package/dist/graph-approvals.js +93 -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 +17 -0
- package/dist/graph-command.js +21 -0
- package/dist/graph-command.js.map +1 -1
- package/dist/graph-model.d.ts +44 -0
- package/dist/graph-model.js +36 -3
- package/dist/graph-model.js.map +1 -1
- package/dist/graph-presentation.d.ts +16 -0
- package/dist/graph-presentation.js +10 -1
- package/dist/graph-presentation.js.map +1 -1
- package/dist/graph-query.d.ts +95 -0
- package/dist/graph-query.js +62 -0
- package/dist/graph-query.js.map +1 -1
- package/dist/graph-relations.d.ts +20 -0
- package/dist/graph-relations.js +42 -10
- package/dist/graph-relations.js.map +1 -1
- package/dist/graph-search.d.ts +35 -0
- package/dist/graph-search.js +36 -0
- package/dist/graph-search.js.map +1 -1
- package/dist/graph-snapshot.d.ts +26 -0
- package/dist/graph-snapshot.js +30 -1
- package/dist/graph-snapshot.js.map +1 -1
- package/dist/graph.d.ts +13 -2
- package/dist/graph.js +61 -4
- package/dist/graph.js.map +1 -1
- package/dist/impact.d.ts +50 -0
- package/dist/impact.js +62 -2
- package/dist/impact.js.map +1 -1
- package/dist/index.d.ts +10 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +12 -0
- package/dist/init.js +15 -0
- package/dist/init.js.map +1 -1
- 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 +93 -5
- package/dist/main.js.map +1 -1
- package/dist/migrate.d.ts +12 -0
- package/dist/migrate.js +17 -0
- package/dist/migrate.js.map +1 -1
- package/dist/ontology.d.ts +67 -2
- package/dist/ontology.js +94 -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 +5 -0
- package/dist/project-structure.js +10 -0
- package/dist/project-structure.js.map +1 -1
- 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 +37 -1
- package/dist/static-check.js.map +1 -1
- package/dist/sync.d.ts +11 -0
- package/dist/sync.js +66 -9
- 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 +321 -27
- package/graph-ui/approval-flow.js +185 -0
- package/graph-ui/approval-parallel.js +110 -0
- package/graph-ui/approval-tree.js +17 -0
- package/graph-ui/business.css +1011 -0
- package/graph-ui/business.js +566 -0
- package/graph-ui/flowchart-interaction.js +177 -0
- package/graph-ui/flowchart.js +1059 -0
- package/graph-ui/graph-approvals.js +92 -0
- package/graph-ui/graph-business.js +403 -0
- package/graph-ui/graph-model.js +36 -3
- package/graph-ui/graph-relations.js +42 -10
- package/graph-ui/graph-search.js +36 -0
- package/graph-ui/index.html +26 -12
- package/graph-ui/model.js +28 -0
- package/graph-ui/relations.js +4 -0
- package/graph-ui/structure.js +44 -0
- package/graph-ui/style.css +12 -0
- package/package.json +6 -4
- package/templates/app/.dockerignore +2 -0
- package/templates/app/.env.example +10 -0
- package/templates/app/AGENTS.md +50 -10
- package/templates/app/README.md +9 -5
- package/templates/app/_gitignore +1 -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 +122 -12
- package/templates/app/apps/web/src/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 +58 -19
- package/templates/app/apps/web/src/main.tsx +5 -0
- package/templates/app/apps/web/src/modules/approval/components/task-operation-dialog.tsx +61 -0
- package/templates/app/apps/web/src/modules/approval/hooks/use-approval-tasks.ts +13 -5
- package/templates/app/apps/web/src/modules/approval/index.ts +4 -0
- package/templates/app/apps/web/src/modules/approval/pages/approval-tasks-page.tsx +89 -38
- package/templates/app/apps/web/src/modules/approval/pages/approval-tasks.css +18 -0
- package/templates/app/apps/web/src/modules/auth/index.ts +4 -0
- package/templates/app/apps/web/src/modules/auth/pages/login-page.tsx +12 -0
- package/templates/app/apps/web/src/modules/inventory/index.ts +4 -0
- package/templates/app/apps/web/src/modules/inventory/pages/inventory-page.tsx +29 -1
- package/templates/app/apps/web/src/modules/purchase/components/approval-history.tsx +67 -0
- package/templates/app/apps/web/src/modules/purchase/components/order-attachments.tsx +29 -0
- package/templates/app/apps/web/src/modules/purchase/components/order-reviewers.tsx +38 -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 +32 -3
- package/templates/app/apps/web/src/modules/purchase/index.ts +5 -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 +17 -0
- package/templates/app/apps/web/src/modules/purchase/pages/purchase-order-detail-page.tsx +156 -0
- package/templates/app/apps/web/src/modules/purchase/pages/purchase-orders-page.tsx +54 -22
- 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 +13 -0
- package/templates/app/apps/web/src/shared/lib/error-message.ts +15 -1
- package/templates/app/apps/web/src/shared/lib/navigation.ts +21 -0
- package/templates/app/apps/web/src/shared/ui/approval-member-picker.css +10 -0
- package/templates/app/apps/web/src/shared/ui/approval-member-picker.tsx +51 -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 +7 -0
- package/templates/app/apps/web/src/shared/ui/page-heading.tsx +7 -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 +5 -0
- package/templates/app/cage.config.json +23 -0
- package/templates/app/db/migrations/0002_draft.sql +12 -0
- package/templates/app/db/migrations/0003_draft.sql +8 -0
- package/templates/app/db/migrations/0004_draft.sql +27 -0
- package/templates/app/deploy/nginx.conf +52 -0
- package/templates/app/docs/ai/README.md +28 -2
- package/templates/app/docs/ai/approvals.md +260 -0
- package/templates/app/docs/ai/architecture.md +26 -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 +59 -4
- package/templates/app/docs/ai/primitives.md +34 -1
- package/templates/app/docs/ai/project-structure.md +8 -3
- package/templates/app/docs/ai/purchase-example.md +35 -7
- package/templates/app/docs/ai/recipes.md +10 -2
- package/templates/app/docs/ai/routing.md +86 -0
- package/templates/app/docs/ai/troubleshooting.md +5 -0
- package/templates/app/docs/ai/workflow.md +24 -11
- package/templates/app/docs/errors/CAGE-AI-001.md +61 -0
- package/templates/app/docs/errors/CAGE-APPR-001.md +13 -9
- package/templates/app/docs/errors/CAGE-APPR-002.md +2 -2
- package/templates/app/docs/errors/CAGE-APPR-003.md +1 -1
- package/templates/app/docs/errors/CAGE-APPR-004.md +4 -4
- package/templates/app/docs/errors/CAGE-APPR-005.md +4 -4
- package/templates/app/docs/errors/CAGE-APPR-006.md +29 -8
- package/templates/app/docs/errors/CAGE-APPR-007.md +9 -7
- package/templates/app/docs/errors/CAGE-APPR-010.md +5 -5
- package/templates/app/docs/errors/CAGE-AUDIT-001.md +53 -0
- package/templates/app/docs/errors/CAGE-AUTH-001.md +1 -1
- 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 +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 +3 -3
- 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 +6 -6
- package/templates/app/docs/errors/CAGE-CONN-008.md +5 -5
- package/templates/app/docs/errors/CAGE-CONN-009.md +6 -6
- package/templates/app/docs/errors/CAGE-CONN-010.md +6 -6
- 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 +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 +10 -9
- package/templates/app/docs/errors/CAGE-DECL-001.md +2 -2
- package/templates/app/docs/errors/CAGE-DECL-002.md +7 -6
- 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 +2 -2
- package/templates/app/docs/errors/CAGE-DEP-002.md +1 -1
- package/templates/app/docs/errors/CAGE-DEP-003.md +2 -2
- 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 +53 -0
- package/templates/app/docs/errors/CAGE-DLQ-001.md +2 -2
- package/templates/app/docs/errors/CAGE-ENV-001.md +4 -4
- 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 +1 -1
- package/templates/app/docs/errors/CAGE-EVENT-002.md +7 -7
- package/templates/app/docs/errors/CAGE-FIELD-001.md +2 -2
- 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 +56 -0
- package/templates/app/docs/errors/CAGE-GEN-001.md +2 -2
- package/templates/app/docs/errors/CAGE-GEN-002.md +1 -1
- package/templates/app/docs/errors/CAGE-GEN-003.md +53 -0
- package/templates/app/docs/errors/CAGE-GRANT-001.md +3 -3
- package/templates/app/docs/errors/CAGE-GRANT-002.md +2 -2
- package/templates/app/docs/errors/CAGE-GRANT-003.md +7 -6
- package/templates/app/docs/errors/CAGE-IMPACT-001.md +2 -2
- package/templates/app/docs/errors/CAGE-IMPACT-002.md +52 -0
- 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 +2 -2
- package/templates/app/docs/errors/CAGE-INIT-004.md +1 -1
- package/templates/app/docs/errors/CAGE-INIT-005.md +52 -0
- 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 +3 -3
- 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-ORG-001.md +7 -6
- package/templates/app/docs/errors/CAGE-PAIR-002.md +6 -5
- package/templates/app/docs/errors/CAGE-QUERY-001.md +1 -1
- package/templates/app/docs/errors/CAGE-QUERY-002.md +2 -2
- package/templates/app/docs/errors/CAGE-QUERY-003.md +7 -6
- package/templates/app/docs/errors/CAGE-REACT-001.md +3 -3
- package/templates/app/docs/errors/CAGE-REACT-002.md +1 -1
- package/templates/app/docs/errors/CAGE-REACT-003.md +50 -0
- package/templates/app/docs/errors/CAGE-READS-001.md +9 -6
- package/templates/app/docs/errors/CAGE-REG-001.md +13 -12
- package/templates/app/docs/errors/CAGE-REG-002.md +2 -1
- package/templates/app/docs/errors/CAGE-REG-003.md +1 -1
- package/templates/app/docs/errors/CAGE-REL-001.md +14 -14
- package/templates/app/docs/errors/CAGE-ROUTE-001.md +7 -6
- package/templates/app/docs/errors/CAGE-SCOPE-001.md +1 -1
- package/templates/app/docs/errors/CAGE-SCOPE-002.md +2 -2
- package/templates/app/docs/errors/CAGE-SECRET-001.md +2 -2
- package/templates/app/docs/errors/CAGE-SECRET-002.md +1 -1
- package/templates/app/docs/errors/CAGE-SENS-001.md +5 -5
- 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 +3 -3
- package/templates/app/docs/errors/CAGE-STATE-002.md +1 -1
- package/templates/app/docs/errors/CAGE-STATE-003.md +1 -1
- package/templates/app/docs/errors/CAGE-STATE-004.md +1 -1
- package/templates/app/docs/errors/CAGE-STATE-005.md +3 -2
- package/templates/app/docs/errors/CAGE-STATE-010.md +5 -5
- package/templates/app/docs/errors/CAGE-STATE-011.md +5 -5
- package/templates/app/docs/errors/CAGE-STRUCT-001.md +1 -1
- package/templates/app/docs/errors/CAGE-STRUCT-002.md +1 -1
- package/templates/app/docs/errors/CAGE-SYNC-001.md +3 -2
- package/templates/app/docs/errors/CAGE-TEST-001.md +1 -1
- 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 +3 -2
- package/templates/app/docs/errors/CAGE-UPGRADE-001.md +2 -2
- 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 +52 -2
- package/templates/app/package.json +3 -3
- package/templates/app/packages/contracts/package.json +1 -1
- package/templates/app/packages/contracts/src/aggregates/approval-member/index.ts +70 -0
- package/templates/app/packages/contracts/src/aggregates/dept/index.ts +10 -10
- package/templates/app/packages/contracts/src/aggregates/inventory/index.ts +5 -5
- package/templates/app/packages/contracts/src/aggregates/inventory-lock/index.ts +4 -4
- package/templates/app/packages/contracts/src/aggregates/purchase-order/index.ts +34 -12
- package/templates/app/packages/contracts/src/aggregates/role/index.ts +15 -15
- package/templates/app/packages/contracts/src/aggregates/user/index.ts +16 -16
- package/templates/app/packages/contracts/src/index.ts +16 -1
- package/templates/app/packages/contracts/src/queries/index.ts +2 -2
- package/templates/app/packages/domain/package.json +5 -4
- package/templates/app/packages/domain/src/index.ts +4 -0
- package/templates/app/packages/domain/src/integrations/erp.ts +15 -0
- package/templates/app/packages/domain/src/integrations/intelligence.ts +20 -0
- package/templates/app/packages/domain/src/modules/inventory/index.ts +1 -0
- package/templates/app/packages/domain/src/modules/inventory/inventory.ts +12 -0
- package/templates/app/packages/domain/src/modules/purchase/approval-members.ts +54 -0
- package/templates/app/packages/domain/src/modules/purchase/approvals.ts +38 -6
- package/templates/app/packages/domain/src/modules/purchase/index.ts +2 -0
- package/templates/app/packages/domain/src/modules/purchase/intelligence.test.ts +224 -0
- package/templates/app/packages/domain/src/modules/purchase/jobs.ts +5 -0
- package/templates/app/packages/domain/src/modules/purchase/purchase-order.test.ts +9 -0
- package/templates/app/packages/domain/src/modules/purchase/purchase-order.ts +125 -4
- package/templates/app/packages/domain/src/modules/purchase/queries.ts +5 -0
- package/templates/app/packages/domain/src/workflows/purchase-inventory.ts +6 -0
- package/templates/app/packages/domain/src/workflows/purchase-process.ts +42 -0
- package/templates/blank/.dockerignore +2 -0
- package/templates/blank/.env.example +10 -0
- package/templates/blank/AGENTS.md +50 -10
- package/templates/blank/README.md +4 -1
- package/templates/blank/_gitignore +1 -0
- package/templates/blank/apps/api/package.json +1 -1
- package/templates/blank/apps/api/src/main.ts +4 -1
- package/templates/blank/apps/api/src/worker.ts +2 -0
- package/templates/blank/apps/web/index.html +1 -0
- package/templates/blank/apps/web/package.json +7 -3
- package/templates/blank/apps/web/src/app/app.tsx +80 -18
- package/templates/blank/apps/web/src/app/styles/global.css +90 -0
- package/templates/blank/apps/web/src/app/use-session.ts +43 -0
- package/templates/blank/apps/web/src/app/workspace-layout.tsx +30 -5
- package/templates/blank/apps/web/src/main.tsx +5 -0
- package/templates/blank/apps/web/src/modules/auth/index.ts +4 -0
- package/templates/blank/apps/web/src/modules/auth/pages/login-page.tsx +18 -1
- 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 +4 -0
- package/templates/blank/apps/web/src/modules/workspace/pages/home-page.tsx +17 -0
- package/templates/blank/apps/web/src/shared/lib/error-message.ts +11 -0
- package/templates/blank/apps/web/src/shared/lib/navigation.ts +21 -0
- package/templates/blank/apps/web/src/shared/ui/brand.tsx +10 -2
- 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/vite.config.ts +5 -0
- package/templates/blank/deploy/nginx.conf +52 -0
- package/templates/blank/docs/ai/README.md +28 -2
- package/templates/blank/docs/ai/approvals.md +260 -0
- package/templates/blank/docs/ai/architecture.md +26 -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 +59 -4
- package/templates/blank/docs/ai/primitives.md +34 -1
- package/templates/blank/docs/ai/project-structure.md +8 -3
- package/templates/blank/docs/ai/purchase-example.md +35 -7
- package/templates/blank/docs/ai/recipes.md +10 -2
- package/templates/blank/docs/ai/routing.md +86 -0
- package/templates/blank/docs/ai/troubleshooting.md +5 -0
- package/templates/blank/docs/ai/workflow.md +24 -11
- package/templates/blank/docs/errors/CAGE-AI-001.md +61 -0
- package/templates/blank/docs/errors/CAGE-APPR-001.md +13 -9
- package/templates/blank/docs/errors/CAGE-APPR-002.md +2 -2
- package/templates/blank/docs/errors/CAGE-APPR-003.md +1 -1
- package/templates/blank/docs/errors/CAGE-APPR-004.md +4 -4
- package/templates/blank/docs/errors/CAGE-APPR-005.md +4 -4
- package/templates/blank/docs/errors/CAGE-APPR-006.md +29 -8
- package/templates/blank/docs/errors/CAGE-APPR-007.md +9 -7
- package/templates/blank/docs/errors/CAGE-APPR-010.md +5 -5
- package/templates/blank/docs/errors/CAGE-AUDIT-001.md +53 -0
- package/templates/blank/docs/errors/CAGE-AUTH-001.md +1 -1
- 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 +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 +3 -3
- 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 +6 -6
- package/templates/blank/docs/errors/CAGE-CONN-008.md +5 -5
- package/templates/blank/docs/errors/CAGE-CONN-009.md +6 -6
- package/templates/blank/docs/errors/CAGE-CONN-010.md +6 -6
- 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 +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 +10 -9
- package/templates/blank/docs/errors/CAGE-DECL-001.md +2 -2
- package/templates/blank/docs/errors/CAGE-DECL-002.md +7 -6
- 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 +2 -2
- package/templates/blank/docs/errors/CAGE-DEP-002.md +1 -1
- package/templates/blank/docs/errors/CAGE-DEP-003.md +2 -2
- 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 +53 -0
- package/templates/blank/docs/errors/CAGE-DLQ-001.md +2 -2
- package/templates/blank/docs/errors/CAGE-ENV-001.md +4 -4
- 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 +1 -1
- package/templates/blank/docs/errors/CAGE-EVENT-002.md +7 -7
- package/templates/blank/docs/errors/CAGE-FIELD-001.md +2 -2
- 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 +56 -0
- package/templates/blank/docs/errors/CAGE-GEN-001.md +2 -2
- package/templates/blank/docs/errors/CAGE-GEN-002.md +1 -1
- package/templates/blank/docs/errors/CAGE-GEN-003.md +53 -0
- package/templates/blank/docs/errors/CAGE-GRANT-001.md +3 -3
- package/templates/blank/docs/errors/CAGE-GRANT-002.md +2 -2
- package/templates/blank/docs/errors/CAGE-GRANT-003.md +7 -6
- package/templates/blank/docs/errors/CAGE-IMPACT-001.md +2 -2
- package/templates/blank/docs/errors/CAGE-IMPACT-002.md +52 -0
- 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 +2 -2
- package/templates/blank/docs/errors/CAGE-INIT-004.md +1 -1
- package/templates/blank/docs/errors/CAGE-INIT-005.md +52 -0
- 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 +3 -3
- 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-ORG-001.md +7 -6
- package/templates/blank/docs/errors/CAGE-PAIR-002.md +6 -5
- package/templates/blank/docs/errors/CAGE-QUERY-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-QUERY-002.md +2 -2
- package/templates/blank/docs/errors/CAGE-QUERY-003.md +7 -6
- package/templates/blank/docs/errors/CAGE-REACT-001.md +3 -3
- package/templates/blank/docs/errors/CAGE-REACT-002.md +1 -1
- package/templates/blank/docs/errors/CAGE-REACT-003.md +50 -0
- package/templates/blank/docs/errors/CAGE-READS-001.md +9 -6
- package/templates/blank/docs/errors/CAGE-REG-001.md +13 -12
- package/templates/blank/docs/errors/CAGE-REG-002.md +2 -1
- package/templates/blank/docs/errors/CAGE-REG-003.md +1 -1
- package/templates/blank/docs/errors/CAGE-REL-001.md +14 -14
- package/templates/blank/docs/errors/CAGE-ROUTE-001.md +7 -6
- package/templates/blank/docs/errors/CAGE-SCOPE-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-SCOPE-002.md +2 -2
- package/templates/blank/docs/errors/CAGE-SECRET-001.md +2 -2
- package/templates/blank/docs/errors/CAGE-SECRET-002.md +1 -1
- package/templates/blank/docs/errors/CAGE-SENS-001.md +5 -5
- 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 +3 -3
- package/templates/blank/docs/errors/CAGE-STATE-002.md +1 -1
- package/templates/blank/docs/errors/CAGE-STATE-003.md +1 -1
- package/templates/blank/docs/errors/CAGE-STATE-004.md +1 -1
- package/templates/blank/docs/errors/CAGE-STATE-005.md +3 -2
- package/templates/blank/docs/errors/CAGE-STATE-010.md +5 -5
- package/templates/blank/docs/errors/CAGE-STATE-011.md +5 -5
- package/templates/blank/docs/errors/CAGE-STRUCT-001.md +1 -1
- package/templates/blank/docs/errors/CAGE-STRUCT-002.md +1 -1
- package/templates/blank/docs/errors/CAGE-SYNC-001.md +3 -2
- package/templates/blank/docs/errors/CAGE-TEST-001.md +1 -1
- 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 +3 -2
- package/templates/blank/docs/errors/CAGE-UPGRADE-001.md +2 -2
- 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 +52 -2
- package/templates/blank/docs/examples/purchase-admin/apps/api/src/main.ts +5 -1
- package/templates/blank/docs/examples/purchase-admin/apps/api/src/worker.ts +3 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/app/app.tsx +122 -12
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/app/styles/global.css +88 -8
- 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 +58 -19
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/main.tsx +5 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/approval/components/task-operation-dialog.tsx +61 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/approval/hooks/use-approval-tasks.ts +13 -5
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/approval/index.ts +4 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/approval/pages/approval-tasks-page.tsx +89 -38
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/approval/pages/approval-tasks.css +18 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/auth/index.ts +4 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/auth/pages/login-page.tsx +12 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/inventory/index.ts +4 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/inventory/pages/inventory-page.tsx +29 -1
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/components/approval-history.tsx +67 -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/order-reviewers.tsx +38 -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 +32 -3
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/index.ts +5 -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 +17 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/pages/purchase-order-detail-page.tsx +156 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/pages/purchase-orders-page.tsx +54 -22
- 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 +13 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/lib/error-message.ts +15 -1
- 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/approval-member-picker.css +10 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/approval-member-picker.tsx +51 -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 +7 -0
- package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/page-heading.tsx +7 -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 +23 -0
- package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/approval-member/index.ts +70 -0
- package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/dept/index.ts +10 -10
- package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/inventory/index.ts +5 -5
- package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/inventory-lock/index.ts +4 -4
- package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/purchase-order/index.ts +34 -12
- package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/role/index.ts +15 -15
- package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/user/index.ts +16 -16
- package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/index.ts +16 -1
- package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/queries/index.ts +2 -2
- package/templates/blank/docs/examples/purchase-admin/packages/domain/src/index.ts +4 -0
- package/templates/blank/docs/examples/purchase-admin/packages/domain/src/integrations/erp.ts +15 -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 +1 -0
- package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/inventory/inventory.ts +12 -0
- package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/approval-members.ts +54 -0
- package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/approvals.ts +38 -6
- package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/index.ts +2 -0
- package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/intelligence.test.ts +224 -0
- package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/jobs.ts +5 -0
- package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/purchase-order.test.ts +9 -0
- package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/purchase-order.ts +125 -4
- package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/queries.ts +5 -0
- package/templates/blank/docs/examples/purchase-admin/packages/domain/src/workflows/purchase-inventory.ts +6 -0
- package/templates/blank/docs/examples/purchase-admin/packages/domain/src/workflows/purchase-process.ts +42 -0
- package/templates/blank/package.json +3 -3
- package/templates/blank/packages/contracts/package.json +1 -1
- package/templates/blank/packages/contracts/src/aggregates/dept/index.ts +10 -10
- package/templates/blank/packages/contracts/src/aggregates/role/index.ts +15 -15
- package/templates/blank/packages/contracts/src/aggregates/user/index.ts +16 -16
- package/templates/blank/packages/contracts/src/index.ts +1 -1
- package/templates/blank/packages/contracts/src/queries/index.ts +1 -1
- package/templates/blank/packages/domain/package.json +5 -4
- package/templates/blank/packages/domain/src/index.ts +2 -1
|
@@ -1,4 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 将每种本体连线翻译为中文原因、用途、方向与证据,供 CLI 和浏览器详情复用。
|
|
3
|
+
* 解释基于投影端点及已抽取属性,分别标注显式声明、规则推导与文本匹配。
|
|
4
|
+
* 不求值 handler、映射或审批条件;存在连线只代表对应声明关系,不证明某次操作已发生。
|
|
5
|
+
*/
|
|
1
6
|
import { kindLabels, nodeLabel } from './graph-model.js';
|
|
7
|
+
import { approvalRouteNodes, approvalRouteSteps } from './approval-tree.js';
|
|
8
|
+
/**
|
|
9
|
+
* 按真实关系种类解释连线,补充声明来源和证据强度。
|
|
10
|
+
* @param edge 已投影且两端有效的边。
|
|
11
|
+
* @param model 展示图,提供端点和辅助声明。
|
|
12
|
+
* @param labels 中文名称覆盖。
|
|
13
|
+
* @returns 中文解释;只读元数据,不执行审批、映射、查询或业务命令。
|
|
14
|
+
*/
|
|
2
15
|
export function explainEdge(edge, model, labels = {}) {
|
|
3
16
|
const from = model.nodes.find((n) => n.key === edge.from);
|
|
4
17
|
const to = model.nodes.find((n) => n.key === edge.to);
|
|
@@ -20,6 +33,16 @@ export function explainEdge(edge, model, labels = {}) {
|
|
|
20
33
|
direction: `“${a}” → “${b}”:${label}。`,
|
|
21
34
|
});
|
|
22
35
|
switch (edge.kind) {
|
|
36
|
+
case 'contains':
|
|
37
|
+
return result('包含业务阶段', '业务流程', `“${a}”声明了“${b}”阶段。`, '组织完整业务过程;阶段本身不执行命令。', [`${from.id}.stages → ${to.id}`]);
|
|
38
|
+
case 'implements':
|
|
39
|
+
return result('阶段实现', '实现依据', `“${a}”引用“${b}”作为实现。`, '从业务阶段追到实际声明;引用顺序不表示执行顺序。', [`${from.id}.action / details → ${to.id}`]);
|
|
40
|
+
case 'follows': {
|
|
41
|
+
const mode = { manual: '人工下一步', automatic: '自动触发', wait: '等待后继续' }[edge.mode ?? 'manual'];
|
|
42
|
+
return result(edge.label ?? mode, mode, `“${a}” → “${b}”:${edge.label}(${mode})。`, edge.mode === 'automatic' ? '检查实际触发链是否存在;映射条件、事务和权限仍以引用的实现为准。' : '这是业务规格中的后续步骤,不会自动调度目标操作。', [`${from.attrs.process}.transitions`, `mode: ${edge.mode}`]);
|
|
43
|
+
}
|
|
44
|
+
case 'relates':
|
|
45
|
+
return result(edge.label ?? '关联业务对象', '业务关联', `“${a}”关联“${b}”:${edge.label}。`, '展示这个环节涉及的业务对象;数据引用、读取和写入由对应实现决定。', [edge.via ?? `${from.id}.subject`]);
|
|
23
46
|
case 'field':
|
|
24
47
|
return result(to.attrs.virtual ? '声明关联字段' : '包含字段', '数据结构', `“${a}”的字段声明中包含“${b}”。`, to.attrs.virtual
|
|
25
48
|
? '这是 fields 中的集合关系,不占主表列;点击它指向目标的连线,查看关系基数、存储和读写方式。'
|
|
@@ -54,13 +77,14 @@ export function explainEdge(edge, model, labels = {}) {
|
|
|
54
77
|
const as = edge.as ?? '';
|
|
55
78
|
if (as === '可路由字段')
|
|
56
79
|
return result('允许审批读取', '审批可用字段', `“${a}”把“${b}”列入 routable,允许该字段作为审批流程变量。`, '明确审批可以拿到哪些业务数据。这里只表示允许使用;是否真的参与分支或审批选人,要查看审批路由的字段关系。', [`${from.id}.routable 包含 ${field}`]);
|
|
80
|
+
if (as === '催办申请人')
|
|
81
|
+
return result('确定催办申请人', '流程运营依赖', `“${a}”以提交时“${b}”的用户标识确定可催办申请人。`, '字段必须进入 routable;催办仍校验当前对象可见性、运行节点、业务版本及冷却,不赋予审批权限。字段也可能被选人或条件使用,完整用途见路由声明。', [`route.reminders.requesterField = ${JSON.stringify(field)}`]);
|
|
57
82
|
if (as === '路由条件') {
|
|
58
|
-
// fieldsUsed 同时包含 when
|
|
83
|
+
// fieldsUsed 同时包含 when 条件、部门负责人和单据人员字段,必须区分实际选人方式。
|
|
59
84
|
const nodes = from.attrs.nodes;
|
|
60
|
-
const conditions = nodes.filter((n) => n.kind === 'when' && n.cond.field === field);
|
|
61
|
-
const steps = nodes
|
|
62
|
-
.
|
|
63
|
-
.filter((s) => s.approver.kind === 'deptLeader' && s.approver.field === field);
|
|
85
|
+
const conditions = approvalRouteNodes(nodes).filter((n) => n.kind === 'when' && n.cond.field === field);
|
|
86
|
+
const steps = approvalRouteSteps(nodes).map(step => ({ ...step, selector: step.kind === 'ai' ? step.handoff : step.approver }))
|
|
87
|
+
.filter(step => (step.selector.kind === 'deptLeader' || step.selector.kind === 'field') && step.selector.field === field);
|
|
64
88
|
const operators = {
|
|
65
89
|
gt: '大于',
|
|
66
90
|
gte: '大于等于',
|
|
@@ -71,11 +95,11 @@ export function explainEdge(edge, model, labels = {}) {
|
|
|
71
95
|
in: '属于',
|
|
72
96
|
};
|
|
73
97
|
const reasons = [
|
|
74
|
-
...steps.map((s) => `“${s.title}”步骤根据“${b}”找到对应部门的负责人`),
|
|
75
|
-
...conditions.map((n) => `当“${b}”${operators[n.cond.op]} ${JSON.stringify(n.cond.value)} 时,加入${n.steps.map((s) => `“${s.title}”`).join('、')}
|
|
98
|
+
...steps.map((s) => s.selector.kind === 'field' ? `“${s.title}”步骤读取“${b}”保存的审批人员` : `“${s.title}”步骤根据“${b}”找到对应部门的负责人`),
|
|
99
|
+
...conditions.map((n) => `当“${b}”${operators[n.cond.op]} ${JSON.stringify(n.cond.value)} 时,加入${approvalRouteSteps(n.steps).map((s) => `“${s.title}”`).join('、')}步骤(内部顺序或并行关系见路由)`),
|
|
76
100
|
];
|
|
77
101
|
return result(steps.length && conditions.length ? '选人和分支依据' : steps.length ? '确定审批人' : '判断审批分支', '审批路由依赖', `${reasons.join(';')}。`, '字段值会影响审批人或需要经过的审批步骤;修改字段含义时,应一起检查这些路由配置。', [
|
|
78
|
-
...steps.map((s) => `${s.title}: approver.
|
|
102
|
+
...steps.map((s) => `${s.title}: approver.${s.selector.kind}(${JSON.stringify(field)})`),
|
|
79
103
|
...conditions.map((n) => `when(${n.cond.op}(${JSON.stringify(field)}, ${JSON.stringify(n.cond.value)}))`),
|
|
80
104
|
]);
|
|
81
105
|
}
|
|
@@ -122,17 +146,25 @@ export function explainEdge(edge, model, labels = {}) {
|
|
|
122
146
|
edge.acquires ? `获取“${resource(edge.acquires)}”` : '',
|
|
123
147
|
edge.releases ? `释放“${resource(edge.releases)}”` : '',
|
|
124
148
|
].filter(Boolean);
|
|
125
|
-
|
|
149
|
+
const collection = from.attrs.collection;
|
|
150
|
+
const execution = [
|
|
151
|
+
from.attrs.tx === 'same' ? '同一事务,任意一项失败共同回滚' : '异步投递',
|
|
152
|
+
from.attrs.order !== null && from.attrs.order !== undefined ? `步骤顺序 ${from.attrs.order}` : '',
|
|
153
|
+
collection ? `最多 ${collection.maxItems} 项,按 ${collection.orderBy} 排序,串行调用` : '',
|
|
154
|
+
].filter(Boolean);
|
|
155
|
+
return result('调用业务命令', '反应调用', `“${a}”把事件映射后交给“${b}”处理。`, `将后续业务操作交给受约束的命令执行。${execution.join(';')}。${resources.length ? `此声明还标记${resources.join('、')},用于检查资源获取与释放是否成对。` : ''}`, [`${from.id}.command → ${to.id}`, ...execution, ...resources]);
|
|
126
156
|
}
|
|
127
157
|
case 'binds': {
|
|
128
158
|
if (from.kind === 'route')
|
|
129
159
|
return result('定义审批步骤', '流程配置', `“${a}”与“${b}”使用同一流程标识 ${from.attrs.process}。`, '这份路由定义流程里的审批步骤、选人方式和条件分支,供代码内审批引擎使用。', [`process: ${from.attrs.process}`]);
|
|
130
160
|
const approved = from.attrs.onApproved === to.id;
|
|
131
161
|
const rejected = from.attrs.onRejected === to.id;
|
|
132
|
-
const
|
|
162
|
+
const returned = from.attrs.onReturned === to.id;
|
|
163
|
+
const outcome = approved && rejected ? '结束' : approved ? '通过' : returned ? '退回修改' : '驳回';
|
|
133
164
|
return result(`${outcome}后执行`, '审批结论回写', `“${a}”${outcome}时绑定执行“${b}”。`, '将审批结论交给业务命令推进单据状态,并统一执行权限和业务约束。', [
|
|
134
165
|
approved ? `${from.id}.onApproved → ${to.id}` : '',
|
|
135
166
|
rejected ? `${from.id}.onRejected → ${to.id}` : '',
|
|
167
|
+
returned ? `${from.id}.onReturned → ${to.id}` : '',
|
|
136
168
|
].filter(Boolean));
|
|
137
169
|
}
|
|
138
170
|
case 'calls':
|
package/graph-ui/graph-search.js
CHANGED
|
@@ -1,7 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 不依赖模型的本体名称检索,供 CLI、agent 上下文和浏览器筛选共用。
|
|
3
|
+
* 归一化标识与文案,按完整命中或英文词、相邻中文片段计算权重,并返回命中字段。
|
|
4
|
+
* 结果是稳定排序的候选;不进行语义推理,无法保证理解否定、业务同义词或任意自然语言要求。
|
|
5
|
+
*/
|
|
1
6
|
// 轻量、可解释的名称检索;不调用模型,不把关键词匹配描述成“理解任意需求”。
|
|
2
7
|
// 中文用相邻双字作为线索,让“采购单取消”能匹配“取消采购单”,同时返回命中依据。
|
|
3
8
|
import { kindLabels, nodeLabel } from './graph-model.js';
|
|
9
|
+
/**
|
|
10
|
+
* 统一全半角、大小写与首尾空白后进行词法比较,不改变输出中的原始标识。
|
|
11
|
+
*/
|
|
4
12
|
const normalize = (value) => value.normalize('NFKC').toLowerCase().trim();
|
|
13
|
+
/**
|
|
14
|
+
* 拆出英文标识词及连续中文的相邻双字片段,并稳定去重。
|
|
15
|
+
* @param query 已归一化查询。
|
|
16
|
+
* @returns 匹配词列表;单汉字单独保留,不执行分词模型。
|
|
17
|
+
*/
|
|
5
18
|
function searchTerms(query) {
|
|
6
19
|
const terms = query.match(/[a-z0-9_$.:/-]+/g) ?? [];
|
|
7
20
|
for (const segment of query.match(/[\p{Script=Han}]+/gu) ?? []) {
|
|
@@ -14,6 +27,14 @@ function searchTerms(query) {
|
|
|
14
27
|
}
|
|
15
28
|
return [...new Set(terms)];
|
|
16
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* 对 key、ID、中文文案、原描述及所属对象分别评分,取最高单字段得分。
|
|
32
|
+
* @param node 待匹配节点。
|
|
33
|
+
* @param query 用户输入。
|
|
34
|
+
* @param labels 显示覆盖。
|
|
35
|
+
* @param descriptions 声明原始描述。
|
|
36
|
+
* @returns 有依据的候选或 undefined;所有命中字段仍保留,不把分数当业务证明。
|
|
37
|
+
*/
|
|
17
38
|
function matchNode(node, query, labels, descriptions) {
|
|
18
39
|
const normalized = normalize(query);
|
|
19
40
|
if (!normalized)
|
|
@@ -49,6 +70,14 @@ function matchNode(node, query, labels, descriptions) {
|
|
|
49
70
|
return { key: node.key, id: node.id, kind: node.kind, label: nodeLabel(node, labels), score, matches };
|
|
50
71
|
}
|
|
51
72
|
/** 排序稳定,结果携带命中字段;多个候选不静默合成一个“正确需求”。 */
|
|
73
|
+
/**
|
|
74
|
+
* 按可选类型筛选并稳定排序名称候选。
|
|
75
|
+
* @param model 展示图。
|
|
76
|
+
* @param query 关键词。
|
|
77
|
+
* @param labels 中文覆盖。
|
|
78
|
+
* @param options 类型范围及原始描述。
|
|
79
|
+
* @returns 完整候选数组,调用方负责 limit 和截断提示。
|
|
80
|
+
*/
|
|
52
81
|
export function searchGraphNodes(model, query, labels = {}, options = {}) {
|
|
53
82
|
return model.nodes
|
|
54
83
|
.filter((node) => !options.kind || node.kind === options.kind)
|
|
@@ -57,6 +86,13 @@ export function searchGraphNodes(model, query, labels = {}, options = {}) {
|
|
|
57
86
|
.sort((a, b) => b.score - a.score || a.key.localeCompare(b.key));
|
|
58
87
|
}
|
|
59
88
|
/** 画布的筛选与搜索下拉共用同一匹配规则,保留按节点类型查找的用法。 */
|
|
89
|
+
/**
|
|
90
|
+
* 供画布筛选复用名称匹配,并额外允许按中文类型名称筛选。
|
|
91
|
+
* @param node 展示节点。
|
|
92
|
+
* @param query 筛选文字。
|
|
93
|
+
* @param labels 中文映射。
|
|
94
|
+
* @returns 是否命中;空查询可匹配类型名称,不修改图。
|
|
95
|
+
*/
|
|
60
96
|
export function matchesNode(node, query, labels) {
|
|
61
97
|
return !!matchNode(node, query, labels, {}) || normalize(kindLabels[node.kind]).includes(normalize(query));
|
|
62
98
|
}
|
package/graph-ui/index.html
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
<!doctype html>
|
|
2
|
+
<!-- 本地本体探索器的静态骨架,由 graph 服务提供并由 app.js 填充。
|
|
3
|
+
ID 是脚本绑定契约;本页不嵌入领域执行代码,业务地图与完整本体共用导航和检查结果。 -->
|
|
2
4
|
<html lang="zh-CN">
|
|
3
5
|
<head>
|
|
4
6
|
<meta charset="UTF-8" />
|
|
@@ -10,6 +12,7 @@
|
|
|
10
12
|
href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 40 40'%3E%3Crect width='40' height='40' rx='10' fill='%232d665a'/%3E%3Cpath d='M11 12h18v16H11zm0 8h18m-9-8v16' stroke='%23fff' fill='none' stroke-width='2'/%3E%3C/svg%3E"
|
|
11
13
|
/>
|
|
12
14
|
<link rel="stylesheet" href="/style.css" />
|
|
15
|
+
<link rel="stylesheet" href="/business.css" />
|
|
13
16
|
</head>
|
|
14
17
|
<body>
|
|
15
18
|
<div class="app-shell">
|
|
@@ -19,7 +22,7 @@
|
|
|
19
22
|
><strong>CAGE<span>ATLAS</span></strong></a
|
|
20
23
|
>
|
|
21
24
|
<div class="breadcrumb">
|
|
22
|
-
<span
|
|
25
|
+
<span>业务探索工作台</span><b>/</b><span id="project-name">正在读取项目</span>
|
|
23
26
|
</div>
|
|
24
27
|
<span class="local-badge"><i></i>本地声明</span>
|
|
25
28
|
<button
|
|
@@ -32,10 +35,13 @@
|
|
|
32
35
|
</button>
|
|
33
36
|
</header>
|
|
34
37
|
|
|
38
|
+
<!-- 对象/板块导航与类型筛选由当前视图重建,移动端展开状态由按钮的 aria-expanded 同步。 -->
|
|
35
39
|
<aside class="sidebar" id="sidebar">
|
|
36
40
|
<div class="section-label">项目工作区 <span>01</span></div>
|
|
37
41
|
<div class="nav-active"><span class="nav-symbol">◇</span> 本体图谱 <span class="nav-dot"></span></div>
|
|
38
|
-
<div class="sidebar-heading"
|
|
42
|
+
<div class="sidebar-heading">
|
|
43
|
+
<span id="objects-heading-label">业务板块</span><span id="aggregate-total"></span>
|
|
44
|
+
</div>
|
|
39
45
|
<div id="aggregate-list" class="aggregate-list"></div>
|
|
40
46
|
<div class="sidebar-heading" id="types-heading">
|
|
41
47
|
节点类型 <button id="reset-types" class="text-button">重置</button>
|
|
@@ -61,12 +67,12 @@
|
|
|
61
67
|
>
|
|
62
68
|
</aside>
|
|
63
69
|
|
|
64
|
-
<main class="main">
|
|
70
|
+
<main class="main business-page" id="main">
|
|
65
71
|
<section class="page-heading">
|
|
66
72
|
<div>
|
|
67
73
|
<div class="eyebrow">业务关系探索</div>
|
|
68
|
-
<h1
|
|
69
|
-
<p
|
|
74
|
+
<h1 id="page-title">业务地图</h1>
|
|
75
|
+
<p id="page-description">先理解业务,再沿流程找到实现。</p>
|
|
70
76
|
</div>
|
|
71
77
|
<div class="heading-actions">
|
|
72
78
|
<button id="download" class="button secondary"><span>↓</span> 导出 JSON</button
|
|
@@ -77,15 +83,17 @@
|
|
|
77
83
|
<section class="overview" aria-label="图谱统计">
|
|
78
84
|
<div class="overview-item">
|
|
79
85
|
<span class="metric-icon aggregate-icon">◇</span>
|
|
80
|
-
<div
|
|
86
|
+
<div>
|
|
87
|
+
<small id="metric-first-label">业务板块</small><strong id="metric-aggregates">—</strong>
|
|
88
|
+
</div>
|
|
81
89
|
</div>
|
|
82
90
|
<div class="overview-item">
|
|
83
91
|
<span class="metric-icon node-icon">⠿</span>
|
|
84
|
-
<div><small
|
|
92
|
+
<div><small id="metric-second-label">流程入口</small><strong id="metric-nodes">—</strong></div>
|
|
85
93
|
</div>
|
|
86
94
|
<div class="overview-item">
|
|
87
95
|
<span class="metric-icon edge-icon">↗</span>
|
|
88
|
-
<div><small
|
|
96
|
+
<div><small id="metric-third-label">业务对象</small><strong id="metric-edges">—</strong></div>
|
|
89
97
|
</div>
|
|
90
98
|
<div class="overview-health">
|
|
91
99
|
<span id="health-dot" class="health-dot"></span>
|
|
@@ -94,12 +102,13 @@
|
|
|
94
102
|
</div>
|
|
95
103
|
</section>
|
|
96
104
|
|
|
97
|
-
|
|
105
|
+
<!-- 三个视图共享工具条;business-view 承载流程,canvas 承载完整图和对象字段图。 -->
|
|
106
|
+
<section class="explorer business-mode" id="explorer" aria-label="交互式业务地图与本体图谱">
|
|
98
107
|
<div class="graph-panel">
|
|
99
108
|
<div class="graph-toolbar">
|
|
100
109
|
<div class="tabs" role="group" aria-label="图谱视图">
|
|
101
|
-
<button data-mode="
|
|
102
|
-
><button data-mode="
|
|
110
|
+
<button data-mode="business" class="active" aria-pressed="true">业务地图</button
|
|
111
|
+
><button data-mode="structure" aria-pressed="false">对象与字段</button
|
|
103
112
|
><button data-mode="all" aria-pressed="false">完整本体</button>
|
|
104
113
|
</div>
|
|
105
114
|
<div class="search-wrap">
|
|
@@ -107,13 +116,14 @@
|
|
|
107
116
|
><input
|
|
108
117
|
id="search"
|
|
109
118
|
type="search"
|
|
110
|
-
placeholder="
|
|
119
|
+
placeholder="搜索业务、流程或代码标识"
|
|
111
120
|
aria-label="搜索节点"
|
|
112
121
|
autocomplete="off"
|
|
113
122
|
/><kbd>/</kbd>
|
|
114
123
|
<div id="search-results" class="search-results" hidden></div>
|
|
115
124
|
</div>
|
|
116
125
|
</div>
|
|
126
|
+
<div id="business-view" class="business-view" aria-label="业务板块与流程"></div>
|
|
117
127
|
<div class="graph-subbar">
|
|
118
128
|
<span
|
|
119
129
|
><i class="tiny-dot"></i><strong id="view-title">全部业务</strong
|
|
@@ -150,6 +160,7 @@
|
|
|
150
160
|
<path d="M0 0L10 5L0 10z" fill="#357c6c" />
|
|
151
161
|
</marker>
|
|
152
162
|
</defs>
|
|
163
|
+
<!-- 脚本只变换 viewport 来实现平移和缩放,边先于节点绘制以保留节点命中面。 -->
|
|
153
164
|
<g id="viewport">
|
|
154
165
|
<g id="edges"></g>
|
|
155
166
|
<g id="nodes"></g>
|
|
@@ -180,11 +191,13 @@
|
|
|
180
191
|
</div>
|
|
181
192
|
<aside id="inspector" class="inspector" aria-label="节点与关系详情" aria-live="polite"></aside>
|
|
182
193
|
</section>
|
|
194
|
+
<div id="business-health" class="business-health" aria-live="polite"></div>
|
|
183
195
|
<footer class="page-footer">
|
|
184
196
|
<span id="domain-path">packages/domain/src/index.ts</span><span>只读探索 · 不连接业务数据库</span>
|
|
185
197
|
</footer>
|
|
186
198
|
</main>
|
|
187
199
|
</div>
|
|
200
|
+
<!-- 规则发现保留在独立对话框,不因主画布能显示就隐藏声明错误。 -->
|
|
188
201
|
<dialog id="findings-dialog">
|
|
189
202
|
<div class="dialog-heading">
|
|
190
203
|
<h2>声明检查</h2>
|
|
@@ -192,6 +205,7 @@
|
|
|
192
205
|
</div>
|
|
193
206
|
<div id="findings-list"></div>
|
|
194
207
|
</dialog>
|
|
208
|
+
<!-- 模块入口在 DOM 骨架之后加载,固定资源由 CLI 构建脚本输出到 graph-ui。 -->
|
|
195
209
|
<script type="module" src="/app.js"></script>
|
|
196
210
|
</body>
|
|
197
211
|
</html>
|
package/graph-ui/model.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { kindLabels } from './graph-model.js';
|
|
2
2
|
export { nodeLabel, projectGraph, neighborhood, edgeLabels } from './graph-model.js';
|
|
3
3
|
export { matchesNode } from './graph-search.js';
|
|
4
|
+
/**
|
|
5
|
+
* 节点类型对应的中文标签、颜色、短字和布局列优先级;只影响图谱呈现。
|
|
6
|
+
*/
|
|
4
7
|
export const kinds = {
|
|
5
8
|
aggregate: { label: kindLabels.aggregate, color: '#197c72', short: '表', column: 0 },
|
|
6
9
|
command: { label: kindLabels.command, color: '#547db2', short: '令', column: 1 },
|
|
@@ -17,12 +20,30 @@ export const kinds = {
|
|
|
17
20
|
state: { label: kindLabels.state, color: '#898b69', short: '态', column: 2 },
|
|
18
21
|
capability: { label: kindLabels.capability, color: '#81949f', short: '权', column: 1 },
|
|
19
22
|
entry: { label: kindLabels.entry, color: '#89938e', short: '+', column: 0 },
|
|
23
|
+
process: { label: kindLabels.process, color: '#397a56', short: '流', column: 0 },
|
|
24
|
+
stage: { label: kindLabels.stage, color: '#648c5b', short: '段', column: 1 },
|
|
20
25
|
};
|
|
26
|
+
/**
|
|
27
|
+
* 按组织聚合前缀识别默认隐藏对象,不是能力或租户授权判断。
|
|
28
|
+
*/
|
|
21
29
|
export const isSystem = (node) => /^(User|Role|Dept)(\.|$)/.test(node.id);
|
|
30
|
+
/**
|
|
31
|
+
* 完整本体普通节点的固定宽度,单位为画布单位,与 edgePath 端点计算保持一致。
|
|
32
|
+
*/
|
|
22
33
|
export const NODE_WIDTH = 190;
|
|
34
|
+
/**
|
|
35
|
+
* 完整本体普通节点高度,单位为画布单位;对象字段卡片使用独立动态高度。
|
|
36
|
+
*/
|
|
23
37
|
export const NODE_HEIGHT = 56;
|
|
24
38
|
/** 按类型分组的平衡列 + 邻接排序。相同声明每次打开位置相同,没有持续运动的力导向
|
|
25
39
|
* 动画;读长名称、比较刷新前后的关系时不会被随机布局打断。 */
|
|
40
|
+
/**
|
|
41
|
+
* 按语义列与邻接平均纵坐标计算确定性位置,避免随机布局干扰阅读。
|
|
42
|
+
* @param nodes 可见节点,不修改原数组。
|
|
43
|
+
* @param edges 可见关系。
|
|
44
|
+
* @param focusKey 小于等于 12 节点时以该节点作为中间列。
|
|
45
|
+
* @returns 节点 key 到坐标映射;没有持续动画或 DOM 副作用。
|
|
46
|
+
*/
|
|
26
47
|
export function layoutGraph(nodes, edges, focusKey) {
|
|
27
48
|
const positions = new Map();
|
|
28
49
|
// 小范围聚焦按关系方向排布:依赖方在左、当前节点居中、目标在右。
|
|
@@ -65,6 +86,13 @@ export function layoutGraph(nodes, edges, focusKey) {
|
|
|
65
86
|
}
|
|
66
87
|
return positions;
|
|
67
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* 根据两个普通节点位置绘制曲线,同列及自环从侧面绕行。
|
|
91
|
+
* @param from 起点左上角。
|
|
92
|
+
* @param to 终点左上角。
|
|
93
|
+
* @param self 是否自环。
|
|
94
|
+
* @returns SVG d 属性,不绘制或修改节点。
|
|
95
|
+
*/
|
|
68
96
|
export function edgePath(from, to, self) {
|
|
69
97
|
if (self)
|
|
70
98
|
return `M${from.x + NODE_WIDTH - 25},${from.y} C${from.x + NODE_WIDTH + 50},${from.y - 65} ${from.x + NODE_WIDTH + 50},${from.y + 100} ${from.x + NODE_WIDTH - 25},${from.y + NODE_HEIGHT}`;
|
package/graph-ui/relations.js
CHANGED
package/graph-ui/structure.js
CHANGED
|
@@ -1,11 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 字段卡片固定宽度,单位为画布单位;布局与引用线共享该值。
|
|
3
|
+
*/
|
|
1
4
|
export const TABLE_WIDTH = 336;
|
|
5
|
+
/**
|
|
6
|
+
* 字段卡片标题区高度,引用目标连接到其中心。
|
|
7
|
+
*/
|
|
2
8
|
export const TABLE_HEADER = 58;
|
|
9
|
+
/**
|
|
10
|
+
* 单字段行高度,字段引用起点用此值定位行中心。
|
|
11
|
+
*/
|
|
3
12
|
export const TABLE_ROW = 38;
|
|
13
|
+
/**
|
|
14
|
+
* 字段卡片尾部留白高度,与动态字段数一起确定总高。
|
|
15
|
+
*/
|
|
4
16
|
export const TABLE_FOOTER = 34;
|
|
5
17
|
/** 对象卡片展示声明字段,而不是猜测完整数据库结构。系统自动添加的列不在
|
|
6
18
|
* 抽取结果中,因此这里不补造 id 或主键。集合关系也留在 fields 中展示,
|
|
7
19
|
* 用类型和虚拟关系标记区分物理列,基数来自抽取器明确记录的声明。
|
|
8
20
|
* 字段仍保留原节点身份,搜索、点击和关系解释都能回到同一份声明。 */
|
|
21
|
+
/**
|
|
22
|
+
* 沿 field 边收集聚合声明字段并计算卡片高度,不补造系统列。
|
|
23
|
+
* @param model 展示图。
|
|
24
|
+
* @returns 所有聚合卡片,虚拟关系仍作为声明字段展示。
|
|
25
|
+
*/
|
|
9
26
|
export function tableCards(model) {
|
|
10
27
|
return model.nodes
|
|
11
28
|
.filter((n) => n.kind === 'aggregate')
|
|
@@ -16,11 +33,24 @@ export function tableCards(model) {
|
|
|
16
33
|
});
|
|
17
34
|
}
|
|
18
35
|
/** 用真实字段归属解析端点;不能把两个同名字段合并,也不能把命令算成列。 */
|
|
36
|
+
/**
|
|
37
|
+
* 通过完整 key 找到聚合或字段所属卡片。
|
|
38
|
+
* @param cards 卡片列表。
|
|
39
|
+
* @param key 聚合或字段身份。
|
|
40
|
+
* @returns 匹配卡片或 undefined,命令不会被当字段。
|
|
41
|
+
*/
|
|
19
42
|
export function tableOwner(cards, key) {
|
|
20
43
|
return cards.find((card) => card.node.key === key || card.fields.some((field) => field.key === key));
|
|
21
44
|
}
|
|
22
45
|
/** 关联较多的对象优先放置,再按实际卡片高度分配到最短列。
|
|
23
46
|
* 两列上限保持字段字可读;卡片高度由字段数决定,避免固定网格裁掉长表。 */
|
|
47
|
+
/**
|
|
48
|
+
* 优先放置关系多且较高的卡片,再将每张卡放入当前最短列。
|
|
49
|
+
* @param cards 卡片数组,不修改。
|
|
50
|
+
* @param edges 引用关系,用于连接度排序。
|
|
51
|
+
* @param columns 调用方按可用宽度给出的列数。
|
|
52
|
+
* @returns 卡片坐标映射,未连接数据库或保存布局。
|
|
53
|
+
*/
|
|
24
54
|
export function layoutTables(cards, edges, columns) {
|
|
25
55
|
const positions = new Map();
|
|
26
56
|
const heights = Array.from({ length: Math.min(columns, cards.length) }, () => 0);
|
|
@@ -35,6 +65,13 @@ export function layoutTables(cards, edges, columns) {
|
|
|
35
65
|
}
|
|
36
66
|
/** 引用线从具体字段行连接到目标对象表头。端点随卡片拖动一起计算,
|
|
37
67
|
* 不把整张卡片的中心当成字段位置;同列时从侧边绕开表体。 */
|
|
68
|
+
/**
|
|
69
|
+
* 从具体字段行中心连接到目标卡片表头,随拖动位置实时计算。
|
|
70
|
+
* @param edge 已确认有效的字段引用边。
|
|
71
|
+
* @param cards 可见卡片。
|
|
72
|
+
* @param positions 卡片坐标。
|
|
73
|
+
* @returns SVG 曲线路径,同列侧绕避免穿过表体。
|
|
74
|
+
*/
|
|
38
75
|
export function tableEdgePath(edge, cards, positions) {
|
|
39
76
|
const source = tableOwner(cards, edge.from);
|
|
40
77
|
const target = tableOwner(cards, edge.to);
|
|
@@ -54,6 +91,11 @@ export function tableEdgePath(edge, cards, positions) {
|
|
|
54
91
|
const bend = Math.max(65, Math.abs(x2 - x1) / 2) * (forward ? 1 : -1);
|
|
55
92
|
return `M${x1},${y1} C${x1 + bend},${y1} ${x2 - bend},${y2} ${x2},${y2}`;
|
|
56
93
|
}
|
|
94
|
+
/**
|
|
95
|
+
* 将已抽取字段 kind 显示为中文类型。
|
|
96
|
+
* @param field 字段节点。
|
|
97
|
+
* @returns 已知中文类型或原 kind,不推断数据库实际类型。
|
|
98
|
+
*/
|
|
57
99
|
export function fieldType(field) {
|
|
58
100
|
const types = {
|
|
59
101
|
text: '文本',
|
|
@@ -67,6 +109,8 @@ export function fieldType(field) {
|
|
|
67
109
|
ref: '引用',
|
|
68
110
|
hasMany: '一对多',
|
|
69
111
|
manyToMany: '多对多',
|
|
112
|
+
file: '文件',
|
|
113
|
+
files: '多文件',
|
|
70
114
|
list: '列表',
|
|
71
115
|
json: 'JSON',
|
|
72
116
|
date: '日期',
|
package/graph-ui/style.css
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
/* 图谱工作台使用低饱和的纸面色与矿物绿。节点颜色承担类型区分,装饰保持克制,
|
|
2
2
|
让长名称、连线和选中状态始终是画面的第一层信息。 */
|
|
3
|
+
/* 本体工作台的基础外观与完整图/对象字段视图样式,由 index.html 先加载。
|
|
4
|
+
* 主题变量、布局和 SVG 状态与 app.ts/model.ts/structure.ts 约定配合;业务流程专属覆盖放在后续 business.css。 */
|
|
3
5
|
:root {
|
|
4
6
|
font-family: 'Bahnschrift', 'Microsoft YaHei UI', 'PingFang SC', sans-serif;
|
|
5
7
|
color: #283d37;
|
|
@@ -56,6 +58,7 @@ a {
|
|
|
56
58
|
[hidden] {
|
|
57
59
|
display: none !important;
|
|
58
60
|
}
|
|
61
|
+
/* 顶部、侧栏与主体的共享页面骨架;侧栏宽度由断点覆盖,主体必须允许内部画布收缩。 */
|
|
59
62
|
.app-shell {
|
|
60
63
|
min-height: 100vh;
|
|
61
64
|
display: grid;
|
|
@@ -209,6 +212,7 @@ a {
|
|
|
209
212
|
color: #225d49;
|
|
210
213
|
text-decoration: underline;
|
|
211
214
|
}
|
|
215
|
+
/* 业务对象导航与类型筛选使用同一选择状态;active 表示当前筛选,不代表服务端授权。 */
|
|
212
216
|
.aggregate-list {
|
|
213
217
|
display: grid;
|
|
214
218
|
gap: 3px;
|
|
@@ -490,6 +494,7 @@ h1 {
|
|
|
490
494
|
font-size: 12px;
|
|
491
495
|
white-space: pre-wrap;
|
|
492
496
|
}
|
|
497
|
+
/* 完整图的画布和解释栏并排组成探索区;窄屏断点将解释栏移到画布下方。 */
|
|
493
498
|
.explorer {
|
|
494
499
|
display: grid;
|
|
495
500
|
grid-template-columns: minmax(0, 1fr) 267px;
|
|
@@ -569,6 +574,7 @@ h1 {
|
|
|
569
574
|
padding: 1px 4px;
|
|
570
575
|
color: #a6afa0;
|
|
571
576
|
}
|
|
577
|
+
/* 检索结果浮在工具条下方,不参与画布几何;长名称截断仅影响显示,节点身份由数据保持。 */
|
|
572
578
|
.search-results {
|
|
573
579
|
position: absolute;
|
|
574
580
|
z-index: 10;
|
|
@@ -643,6 +649,7 @@ h1 {
|
|
|
643
649
|
color: #a8b19f;
|
|
644
650
|
white-space: nowrap;
|
|
645
651
|
}
|
|
652
|
+
/* SVG 画布自身裁剪平移内容;缩放、拖动和节点位置由脚本更新 transform,本层只提供容器与光标。 */
|
|
646
653
|
.canvas {
|
|
647
654
|
flex: 1;
|
|
648
655
|
min-height: 0;
|
|
@@ -738,6 +745,7 @@ h1 {
|
|
|
738
745
|
border-top-style: dashed;
|
|
739
746
|
margin-left: 7px;
|
|
740
747
|
}
|
|
748
|
+
/* 边与节点的可读状态:派生关系、邻域高亮、选中和淡出分开表达,颜色不改变关系语义。 */
|
|
741
749
|
.edge {
|
|
742
750
|
fill: none;
|
|
743
751
|
stroke: #aebdb0;
|
|
@@ -847,6 +855,7 @@ h1 {
|
|
|
847
855
|
transform: rotate(360deg);
|
|
848
856
|
}
|
|
849
857
|
}
|
|
858
|
+
/* 解释栏承载节点、关系和证据,长内容独立滚动;来源位置与原始 JSON 不参与图谱布局。 */
|
|
850
859
|
.inspector {
|
|
851
860
|
border-left: 1px solid #e5eadd;
|
|
852
861
|
background: #fff;
|
|
@@ -1072,6 +1081,7 @@ dialog::backdrop {
|
|
|
1072
1081
|
background: #263c2d44;
|
|
1073
1082
|
backdrop-filter: blur(3px);
|
|
1074
1083
|
}
|
|
1084
|
+
/* 检查结果使用原生 dialog 的内容布局,打开关闭和 findings 列表由 app.ts 管理。 */
|
|
1075
1085
|
.dialog-heading {
|
|
1076
1086
|
display: flex;
|
|
1077
1087
|
align-items: center;
|
|
@@ -1121,6 +1131,7 @@ dialog::backdrop {
|
|
|
1121
1131
|
margin-bottom: 29px;
|
|
1122
1132
|
}
|
|
1123
1133
|
}
|
|
1134
|
+
/* 中等宽度逐步压缩边距和工具条,保留交互控件;更窄断点再切换单列布局。 */
|
|
1124
1135
|
@media (max-width: 1200px) {
|
|
1125
1136
|
:root {
|
|
1126
1137
|
--sidebar: 186px;
|
|
@@ -1578,6 +1589,7 @@ dialog::backdrop {
|
|
|
1578
1589
|
.table-card.selected .table-shadow {
|
|
1579
1590
|
opacity: 1;
|
|
1580
1591
|
}
|
|
1592
|
+
/* 对象字段视图的 SVG 卡片。表头拖动整卡,字段行提供独立命中与选择,字体大小与 structure.ts 测量约定配合。 */
|
|
1581
1593
|
.table-body {
|
|
1582
1594
|
fill: #fafcf6;
|
|
1583
1595
|
stroke: #d7e2cc;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yss123/cage-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
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,9 +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-
|
|
34
|
+
"@yss123/cage-ontology": "0.3.1",
|
|
35
|
+
"@yss123/cage-admin": "0.3.1",
|
|
36
|
+
"@yss123/cage-lint": "0.3.1",
|
|
37
|
+
"@yss123/cage-kernel": "0.3.1",
|
|
38
|
+
"@yss123/cage-testkit": "0.3.1"
|
|
37
39
|
},
|
|
38
40
|
"devDependencies": {
|
|
39
41
|
"@types/pg": "^8.15.5"
|
|
@@ -38,6 +38,12 @@ CAGE_ADMIN_DATABASE_URL=postgresql://postgres:REPLACE_WITH_ADMIN_PASSWORD@127.0.
|
|
|
38
38
|
# 自动生成 32 字节随机值;已有值保留。同一应用的多个实例使用同一值。
|
|
39
39
|
# CAGE_COOKIE_SECRET=
|
|
40
40
|
|
|
41
|
+
# 生产 NODE_ENV=production 时必须提供合格随机密钥;固定开发值会被拒绝。
|
|
42
|
+
# 组织在审查执行 migrate 后,显式 cage bootstrap --credentials-file <新的受限文件>。
|
|
43
|
+
# API 日常启动不会初始化组织或向日志输出管理员密码。
|
|
44
|
+
# 可信代理在 apps/api/src/main.ts 显式配置地址/网段;默认 trustProxy: false。
|
|
45
|
+
# /healthz 表示存活,/readyz 检查数据库和授权监听;API 与 worker 使用同版本部署。
|
|
46
|
+
|
|
41
47
|
# [可选,开发默认 fake] 第三方连接器阶段:fake 使用模拟实现;test / prod 使用真实适配器。
|
|
42
48
|
# 本项只影响第三方外部服务,fake 阶段仍连接真实 PostgreSQL。
|
|
43
49
|
# test / prod 需另行配置业务连接器要求的地址与密钥,不是修改此值就完成对接。
|
|
@@ -50,6 +56,10 @@ CAGE_WEB_PORT=15173
|
|
|
50
56
|
# [可选,默认 3000] API 服务端口;本地 Web 代理自动转发到这个端口。
|
|
51
57
|
PORT=3000
|
|
52
58
|
|
|
59
|
+
# 私有上传目录,不能通过 Nginx/静态服务公开;生产挂载持久卷并与数据库配套备份。
|
|
60
|
+
# 默认是项目根目录 .cage-files;改变目录前必须迁移已有文件。
|
|
61
|
+
CAGE_FILES_DIR=.cage-files
|
|
62
|
+
|
|
53
63
|
# [可选,范例默认 0.0.0.0] API 监听地址;这里使用 127.0.0.1,仅允许本机访问。
|
|
54
64
|
# 需要容器内或局域网访问时改为 0.0.0.0,并按部署环境配置网络访问权限。
|
|
55
65
|
HOST=127.0.0.1
|