@givolt/i3-composer-agent 3.0.0 → 3.2.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/.agents/plugins/marketplace.json +1 -1
- package/.claude/commands/i3-sop.md +3 -3
- package/.claude/commands/i3-ui-demo.md +21 -0
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +2 -2
- package/.gemini/commands/i3-sop.toml +3 -3
- package/.gemini/commands/i3-ui-demo.toml +21 -0
- package/README.md +29 -32
- package/bin/i3-composer-agent.cjs +38 -44
- package/bin/install.cjs +15 -3
- package/bin/native-layout.cjs +2 -1
- package/bin/native-migration.cjs +19 -2
- package/bin/retired-sop-fingerprints.json +213 -0
- package/bin/wizard.cjs +7 -18
- package/commands/i3-sop.toml +3 -3
- package/commands/i3-ui-demo.toml +21 -0
- package/docs/codebuddy-setup.md +20 -23
- package/docs/codex-setup.md +2 -2
- package/docs/comparison.md +131 -0
- package/docs/developer-onboarding.md +143 -0
- package/docs/opencode-setup.md +1 -1
- package/docs/other-hosts.md +2 -2
- package/docs/skill-anatomy.md +211 -0
- package/docs/workbuddy-setup.md +7 -10
- package/evals/cases/i3-enterprise-sop.json +70 -32
- package/evals/cases/i3-ui-demo.json +98 -0
- package/evals/fixtures/i3-ui-demo/asset-management.md +25 -0
- package/evals/zh-CN/cases/i3-enterprise-sop.json +77 -31
- package/evals/zh-CN/cases/i3-ui-demo.json +103 -0
- package/hooks/PROTOTYPE.md +16 -8
- package/hooks/i3-prototype.cjs +4 -10
- package/hooks/manage.cjs +30 -31
- package/package.json +20 -5
- package/plugin.json +1 -1
- package/scripts/ui-demo-dependencies-test.js +228 -0
- package/scripts/ui-demo-mcp-test.js +95 -0
- package/scripts/ui-demo-test.js +170 -0
- package/scripts/ui-prototype-execution-runtime-test.js +1 -1
- package/scripts/ui-prototype-native-test.js +25 -3
- package/skills/i3-enterprise-sop/SKILL.md +151 -91
- package/{references/engineering-skeleton-resources → skills/i3-enterprise-sop/references/engineering-skeleton}/directory-standard.md +29 -15
- package/skills/i3-enterprise-sop/references/handoff.py +348 -0
- package/skills/i3-enterprise-sop/references/read_text.py +60 -0
- package/{references/enterprise-sop-resources/technical-baseline/baselines//344/274/201/344/270/232/345/272/224/347/224/250-/346/212/200/346/234/257/350/247/204/347/272/246_v0.0.2.md → skills/i3-enterprise-sop/references/technical-baseline/baselines/enterprise-application-technical-baseline-v0-0-4.md} +136 -51
- package/skills/i3-enterprise-sop/references/technical-baseline/readme.md +23 -0
- package/{references/enterprise-sop-resources/technical-baseline/templates/TECHNICAL-BASELINE.md → skills/i3-enterprise-sop/references/technical-baseline/templates/technical-baseline.md} +1 -1
- package/{references/enterprise-sop-resources/ad/templates/AD.md → skills/i3-enterprise-sop/references/templates/ad.md} +34 -27
- package/{references/enterprise-sop-resources/brd/templates/BRD.md → skills/i3-enterprise-sop/references/templates/brd.md} +21 -10
- package/{references/enterprise-sop-resources/prd/templates/PRD.md → skills/i3-enterprise-sop/references/templates/prd.md} +57 -24
- package/{references/enterprise-sop-resources/testcase/templates/TestCase.md → skills/i3-enterprise-sop/references/templates/testcase.md} +32 -22
- package/skills/i3-ui-demo/SKILL.md +234 -0
- package/skills/i3-ui-demo/assets/antdv-build/package-lock.json +3363 -0
- package/skills/i3-ui-demo/assets/antdv-build/package.json +28 -0
- package/skills/i3-ui-demo/assets/design-source.json +11 -0
- package/skills/i3-ui-demo/assets/host-targets.json +739 -0
- package/skills/i3-ui-demo/assets/official-files.json +76 -0
- package/skills/i3-ui-demo/assets/starter/index.html +11 -0
- package/skills/i3-ui-demo/assets/starter/package-lock.json +2299 -0
- package/skills/i3-ui-demo/assets/starter/package.json +28 -0
- package/skills/i3-ui-demo/assets/starter/provenance.json +14 -0
- package/skills/i3-ui-demo/assets/starter/public/prototype-config.json +22 -0
- package/skills/i3-ui-demo/assets/starter/src/App.vue +64 -0
- package/skills/i3-ui-demo/assets/starter/src/PrototypeShell.vue +59 -0
- package/skills/i3-ui-demo/assets/starter/src/config.ts +23 -0
- package/skills/i3-ui-demo/assets/starter/src/domain/presentation.ts +30 -0
- package/skills/i3-ui-demo/assets/starter/src/domain/theme.ts +25 -0
- package/skills/i3-ui-demo/assets/starter/src/main.ts +18 -0
- package/skills/i3-ui-demo/assets/starter/src/style.css +26 -0
- package/skills/i3-ui-demo/assets/starter/tests/presentation.test.ts +23 -0
- package/skills/i3-ui-demo/assets/starter/tests/theme.test.ts +26 -0
- package/skills/i3-ui-demo/assets/starter/tsconfig.json +15 -0
- package/skills/i3-ui-demo/assets/starter/vite.config.ts +4 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/capability-definition.json +1395 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/component-inventory.json +707 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/design-system.md +26 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/generation.json +49 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/index.html +534 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/manifest.json +9 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/offline-build.json +265 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/offline.js +8888 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/origin.json +344 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/preset.json +928 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/app.js +22 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/assets/empty.svg +1 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/assets/reference-styles.json +1 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/assets/result-403.svg +1 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/assets/result-404.svg +1 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/assets-manifest.json +334 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/baseline.json +173 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/conversion.md +30 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/credits.md +17 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/design-tokens.json +881 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/index.html +28 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/licenses/@qin-ui-antdv-next-pro.txt +9 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/licenses/ant-design-icons.txt +22 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/licenses/antdv-next.txt +21 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/package.json +12 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/browser-routes.json +298 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/coverage.json +180 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/integrity.json +13 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/keyboard.json +11 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/responsive.json +125 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/review.md +51 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/rules.log +150 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/flow-editor-html.png +0 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/flow-editor-original.png +0 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/intent-create-html.png +0 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/intent-create-original.png +0 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/models-html.png +0 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/models-original.png +0 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/workbench-html.png +0 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/workbench-original.png +0 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/selection.json +9 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/visual-comparison.json +342 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/readme.md +73 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/reference.md +59 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/routes.json +178 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/controls.js +99 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/dialogs.js +54 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/dom.js +264 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/forms.js +47 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/icons.js +41 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/layout.js +47 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/router.js +63 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/state.js +90 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/table.js +41 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/widgets.js +8 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentDetail.html +3 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentDetail.js +36 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentEditor.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentEditor.js +51 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentsPage.html +3 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentsPage.js +48 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/CheckResults.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/CheckResults.js +6 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/ResourcePicker.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/ResourcePicker.js +13 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/data.js +24 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/domain.js +32 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/registry.js +25 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/store.js +85 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentClose.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentClose.js +17 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentCreate.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentCreate.js +66 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDecisions.html +3 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDecisions.js +38 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDetail.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDetail.js +66 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDocument.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDocument.js +5 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentHeader.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentHeader.js +12 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentHistory.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentHistory.js +11 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentList.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentList.js +116 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentReplan.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentReplan.js +32 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentRevision.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentRevision.js +49 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentSummary.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentSummary.js +10 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentWorkspace.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentWorkspace.js +77 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/data.js +60 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/domain.js +105 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/store.js +212 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/AuditPanel.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/AuditPanel.js +18 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelDetail.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelDetail.js +23 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelEditor.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelEditor.js +78 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelGrant.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelGrant.js +55 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelReferences.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelReferences.js +26 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelRelease.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelRelease.js +38 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelStatus.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelStatus.js +7 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelTable.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelTable.js +72 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelTester.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelTester.js +46 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelsPage.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelsPage.js +52 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/RowActions.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/RowActions.js +19 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/UsagePanel.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/UsagePanel.js +30 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/data.js +48 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/domain.js +39 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/store.js +129 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/IncidentDetail.html +4 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/IncidentDetail.js +21 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/IntentSource.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/IntentSource.js +8 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationActionDialog.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationActionDialog.js +37 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationEntry.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationEntry.js +10 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationsPage.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationsPage.js +37 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/RepairTrack.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/RepairTrack.js +49 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/RunDetail.html +4 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/RunDetail.js +22 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/SourceSummary.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/SourceSummary.js +9 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/commands.js +82 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/examples.js +47 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/model.js +61 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/repair.js +68 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/store.js +55 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/types.js +1 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/workbench.js +18 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ManagementTable.html +3 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ManagementTable.js +28 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcCreateEntry.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcCreateEntry.js +18 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcDetail.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcDetail.js +31 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcEditor.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcEditor.js +27 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcLifecycle.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcLifecycle.js +16 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcPage.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcPage.js +43 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcPicker.html +4 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcPicker.js +34 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcProgress.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcProgress.js +30 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcWizard.html +3 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcWizard.js +67 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcWorkspace.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcWorkspace.js +41 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcsPage.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcsPage.js +31 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ServiceEditor.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ServiceEditor.js +26 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ServiceList.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ServiceList.js +70 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/data.js +8 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/domain.js +62 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/management.js +36 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/managementStore.js +49 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/store.js +132 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/AdminList.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/AdminList.js +38 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/EffectiveGrants.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/EffectiveGrants.js +11 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/GrantEditor.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/GrantEditor.js +45 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/MemberEditor.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/MemberEditor.js +54 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/MembersPage.html +3 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/MembersPage.js +27 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RecordsPage.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RecordsPage.js +12 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RoleEditor.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RoleEditor.js +45 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RolesPage.html +3 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RolesPage.js +38 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/domain.js +61 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/state.js +51 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/store.js +116 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseActionDialog.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseActionDialog.js +45 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseDetail.html +4 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseDetail.js +30 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseEditor.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseEditor.js +67 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseExecution.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseExecution.js +5 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleasesPage.html +4 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleasesPage.js +60 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/commands.js +157 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/model.js +136 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/store.js +76 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewDetail.html +3 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewDetail.js +26 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewEvidence.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewEvidence.js +14 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewProcess.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewProcess.js +113 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewsPage.html +3 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewsPage.js +62 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/commands.js +97 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/model.js +147 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/store.js +13 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ColumnSettings.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ColumnSettings.js +9 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListBatchBar.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListBatchBar.js +8 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListDeleteDialog.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListDeleteDialog.js +37 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListMore.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListMore.js +8 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/RecordMetadata.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/RecordMetadata.js +17 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/columns.js +32 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/deliveryGuide.js +49 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/deliveryView.js +12 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/listBatch.js +15 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/listSelection.js +37 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/policy.js +68 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/session.js +44 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ConfirmationDialog.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ConfirmationDialog.js +25 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ConsoleShell.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ConsoleShell.js +53 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/PrototypeGuide.html +10 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/PrototypeGuide.js +30 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ScopePage.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ScopePage.js +10 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/SessionDialog.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/SessionDialog.js +9 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/confirmation.js +3 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/navigation.js +19 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecDocument.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecDocument.js +8 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecEdit.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecEdit.js +32 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecHeader.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecHeader.js +15 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecHistory.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecHistory.js +11 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecReview.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecReview.js +57 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecWorkspace.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecWorkspace.js +37 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/data.js +20 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/domain.js +55 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/store.js +151 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/ArtifactDetail.html +3 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/ArtifactDetail.js +18 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskCreate.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskCreate.js +40 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskDetail.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskDetail.js +51 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskLaunch.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskLaunch.js +9 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TasksPage.html +5 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TasksPage.js +48 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/domain.js +204 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/exampleSource.js +22 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/registry.js +135 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/store.js +137 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workbench/WorkbenchPage.html +3 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workbench/WorkbenchPage.js +36 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workbench/model.js +56 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workbench/store.js +15 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowCanvas.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowCanvas.js +27 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowDetail.html +4 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowDetail.js +31 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowEditor.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowEditor.js +68 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/WorkflowsPage.html +5 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/WorkflowsPage.js +55 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/data.js +16 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/domain.js +83 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/registry.js +18 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/store.js +61 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/admin.css +60 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/agents.css +46 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/antdv.css +295 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/app.css +102 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/delivery.css +4 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/intents.css +37 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/native.css +22 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/operations.css +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/pbc.css +3 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/permissions.css +22 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/pro.css +1 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/releases.css +4 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/reset.css +246 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/reviews.css +8 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/tasks.css +6 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/tokens.css +15 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/workbench.css +61 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/workflows.css +1 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/admin-rules.test.js +96 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/agents.test.js +14 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/intent-state.test.js +37 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/list-batch.test.js +44 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/operation-fixtures.js +19 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/operation-repair.test.js +14 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/operations.test.js +25 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/pbc-management.test.js +17 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/pbc-state.test.js +24 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/permission-config.test.js +23 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/permissions.test.js +24 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/releases.test.js +50 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/reviews.test.js +36 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/runtime-forms-router.test.js +28 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/runtime-state.test.js +42 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/runtime-stores.test.js +16 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/spec-state.test.js +11 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/tasks.test.js +27 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/workbench.test.js +34 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/workflows.test.js +16 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tools/convert.mjs +168 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tools/serve.mjs +7 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tools/styles.mjs +11 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tools/verify.mjs +24 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/serve.cjs +16 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/template-inventory.json +28791 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/template.json +9 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/usability.css +44 -0
- package/skills/i3-ui-demo/assets/templates.json +10 -0
- package/skills/i3-ui-demo/assets/versions.json +20 -0
- package/skills/i3-ui-demo/readme.md +350 -0
- package/skills/i3-ui-demo/references/browser.md +71 -0
- package/skills/i3-ui-demo/references/dependencies.md +67 -0
- package/skills/i3-ui-demo/references/resources.md +142 -0
- package/skills/i3-ui-demo/scripts/dependencies.cjs +364 -0
- package/skills/i3-ui-demo/scripts/design-install.cjs +105 -0
- package/skills/i3-ui-demo/scripts/design-provider.cjs +57 -0
- package/skills/i3-ui-demo/scripts/locations.cjs +52 -0
- package/skills/i3-ui-demo/scripts/mcp.cjs +112 -0
- package/skills/i3-ui-demo/scripts/provider-discovery.cjs +131 -0
- package/skills/i3-ui-demo/scripts/resources.cjs +283 -0
- package/skills/i3-ui-prototype/SKILL.md +1 -1
- package/skills/i3-ui-prototype/references/execution-evidence.md +12 -56
- package/skills/i3-ui-prototype/scripts/codebuddy-registration.cjs +1 -1
- package/skills/i3-ui-prototype/scripts/execution-runtime.cjs +5 -2
- package/skills/i3-ui-prototype/scripts/hosts/codebuddy.cjs +3 -2
- package/skills/i3-ui-prototype/scripts/native-delivery.cjs +2 -2
- package/skills/i3-ui-prototype/scripts/prototype-hooks.cjs +23 -20
- package/docs/ui-prototype-native/MAIN-SESSION-REPORT.md +0 -66
- package/docs/ui-prototype-native/USAGE.md +0 -93
- package/references/engineering-skeleton-resources/README.md +0 -52
- package/references/engineering-skeleton-resources/adoption.md +0 -200
- package/references/engineering-skeleton-resources/catalog.json +0 -17
- package/references/enterprise-sop-resources/README.md +0 -165
- package/references/enterprise-sop-resources/ad/README.md +0 -70
- package/references/enterprise-sop-resources/ad/assets-manifest.json +0 -106
- package/references/enterprise-sop-resources/ad/prompts/01-generate.md +0 -58
- package/references/enterprise-sop-resources/ad/prompts/02-review.md +0 -54
- package/references/enterprise-sop-resources/ad/prompts/03-revise.md +0 -54
- package/references/enterprise-sop-resources/ad/prompts/04-recheck.md +0 -54
- package/references/enterprise-sop-resources/assets-manifest.json +0 -199
- package/references/enterprise-sop-resources/brd/README.md +0 -50
- package/references/enterprise-sop-resources/brd/assets-manifest.json +0 -94
- package/references/enterprise-sop-resources/brd/prompts/01-generate.md +0 -51
- package/references/enterprise-sop-resources/brd/prompts/02-review.md +0 -47
- package/references/enterprise-sop-resources/brd/prompts/03-revise.md +0 -47
- package/references/enterprise-sop-resources/brd/prompts/04-recheck.md +0 -47
- package/references/enterprise-sop-resources/codebuddy-project-guide.md +0 -34
- package/references/enterprise-sop-resources/controlled-handoff.md +0 -41
- package/references/enterprise-sop-resources/controlled_handoff.py +0 -334
- package/references/enterprise-sop-resources/handoff-contract.md +0 -196
- package/references/enterprise-sop-resources/handoff.py +0 -277
- package/references/enterprise-sop-resources/lifecycle-contract.md +0 -91
- package/references/enterprise-sop-resources/plan-handoff.md +0 -73
- package/references/enterprise-sop-resources/prd/README.md +0 -137
- package/references/enterprise-sop-resources/prd/assets-manifest.json +0 -115
- package/references/enterprise-sop-resources/prd/prompts/01-generate.md +0 -64
- package/references/enterprise-sop-resources/prd/prompts/02-review.md +0 -49
- package/references/enterprise-sop-resources/prd/prompts/03-revise.md +0 -48
- package/references/enterprise-sop-resources/prd/prompts/04-recheck.md +0 -47
- package/references/enterprise-sop-resources/prd/template-contracts.md +0 -39
- package/references/enterprise-sop-resources/prd/templates/AD.md +0 -17
- package/references/enterprise-sop-resources/recovery-contract.md +0 -65
- package/references/enterprise-sop-resources/review-handoff.md +0 -105
- package/references/enterprise-sop-resources/selection-handoff.md +0 -55
- package/references/enterprise-sop-resources/selection_handoff.py +0 -225
- package/references/enterprise-sop-resources/stages.json +0 -262
- package/references/enterprise-sop-resources/technical-baseline/README.md +0 -132
- package/references/enterprise-sop-resources/technical-baseline/assets-manifest.json +0 -101
- package/references/enterprise-sop-resources/technical-baseline/baselines/PROVENANCE.md +0 -40
- package/references/enterprise-sop-resources/technical-baseline/references/engineering-directory-v0.2.0/adoption.md +0 -112
- package/references/enterprise-sop-resources/technical-baseline/references/engineering-directory-v0.2.0/directory-standard.md +0 -119
- package/references/enterprise-sop-resources/template-contracts.md +0 -142
- package/references/enterprise-sop-resources/testcase/README.md +0 -61
- package/references/enterprise-sop-resources/testcase/assets-manifest.json +0 -111
- package/references/enterprise-sop-resources/testcase/prompts/01-generate.md +0 -53
- package/references/enterprise-sop-resources/testcase/prompts/02-review.md +0 -51
- package/references/enterprise-sop-resources/testcase/prompts/03-revise.md +0 -49
- package/references/enterprise-sop-resources/testcase/prompts/04-recheck.md +0 -51
- package/references/enterprise-sop-resources/verification/README.md +0 -149
- package/references/enterprise-sop-resources/verification/check_execution.py +0 -185
- package/references/enterprise-sop-resources/verification/check_native_execution.py +0 -282
- package/references/enterprise-sop-resources/verification/check_reads.py +0 -348
- package/references/enterprise-sop-resources/verification/review-output.schema.json +0 -155
- package/references/enterprise-sop-resources/verification/review_handoff.py +0 -329
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export const duties = [{ value: 'planner', label: '需求规划' }, { value: 'designer', label: '方案设计' }, { value: 'coder', label: '研发编码' }, { value: 'tester', label: '测试验证' }, { value: 'reviewer', label: '质量评审' }, { value: 'ops', label: '运行运维' }, { value: 'security', label: '安全检查' }];
|
|
2
|
+
export function validateBasics(a) {
|
|
3
|
+
if (!a.name.trim() || a.name.length > 60)
|
|
4
|
+
throw Error('请填写 1–60 字的 Agent 名称。');
|
|
5
|
+
if (!/^[a-z][a-z0-9-]{2,47}$/.test(a.code))
|
|
6
|
+
throw Error('标识须为 3–48 位小写字母、数字或短横线,并以字母开头。');
|
|
7
|
+
if (!a.pbcId || !a.project || !duties.some(d => d.value === a.duty))
|
|
8
|
+
throw Error('请选择项目和 Agent 职责。');
|
|
9
|
+
if (!Number.isInteger(a.memoryLimit) || a.memoryLimit < 1 || a.memoryLimit > 200 || !Number.isInteger(a.toolLimit) || a.toolLimit < 1 || a.toolLimit > 50)
|
|
10
|
+
throw Error('请检查记忆消息数(1–200)和工具调用上限(1–50)。');
|
|
11
|
+
}
|
|
12
|
+
export function checkConfiguration(a, models, resources) {
|
|
13
|
+
const m = models.find(m => m.id === a.modelRef), prompt = resources.find(r => r.id === a.promptRef && r.kind === 'prompt');
|
|
14
|
+
const usable = (r) => !!r && r.state === 'ready' && (r.tenantIds.includes('*') || r.tenantIds.includes(a.tenantId));
|
|
15
|
+
const skills = a.skillRefs.map(id => resources.find(r => r.id === id && r.kind === 'skill'));
|
|
16
|
+
const tools = a.tools.map(t => resources.find(r => r.id === t.ref && r.kind === 'tool' && r.type === t.type));
|
|
17
|
+
return [
|
|
18
|
+
{ key: 'model', label: '模型可用性', ok: !!m && !m.deleted && m.enabled && !!m.version && m.kind === 'chat', detail: !m ? '请选择模型' : m.deleted ? '模型已被删除' : !m.version ? '模型尚未发布' : !m.enabled ? '模型已停用' : m.kind !== 'chat' ? '向量模型不能作为 Agent 的对话模型' : '使用已发布配置 v' + m.version },
|
|
19
|
+
{ key: 'grant', label: '模型使用授权', ok: !!m?.authorized, detail: m?.authorized ? '租户、项目与 Agent 使用授权匹配' : '当前租户、项目、Agent 的模型使用授权不完整;保存后可由有权成员在模型管理中配置' },
|
|
20
|
+
{ key: 'prompt', label: '提示词预设', ok: usable(prompt), detail: usable(prompt) ? prompt.name + ' · ' + prompt.version : '请选择可用且在授权范围内的提示词预设' },
|
|
21
|
+
{ key: 'skills', label: '技能引用', ok: skills.every(usable), detail: skills.every(usable) ? skills.length + ' 项技能可用;可不绑定技能' : '存在停用、失效或超出范围的技能' },
|
|
22
|
+
{ key: 'tools', label: '工具白名单', ok: tools.every(r => usable(r) && !!r.allow?.length && !r.allow.includes('*')) && new Set(a.tools.map(t => t.type + ':' + t.ref)).size === a.tools.length, detail: tools.every(r => usable(r) && !!r.allow?.length && !r.allow.includes('*')) ? '仅允许已选工具声明的操作;未绑定工具不能调用' : '存在无效工具、类型不匹配或过宽的白名单' },
|
|
23
|
+
{ key: 'capability', label: '工具调用能力', ok: !a.tools.length || !!m?.capabilities.includes('工具调用'), detail: !a.tools.length ? '未绑定工具,无需工具调用能力' : m?.capabilities.includes('工具调用') ? '模型支持工具调用' : '所选模型不支持工具调用,请更换模型或移除工具' },
|
|
24
|
+
{ key: 'limits', label: '运行边界', ok: Number.isInteger(a.memoryLimit) && a.memoryLimit > 0 && a.memoryLimit <= 200 && Number.isInteger(a.toolLimit) && a.toolLimit > 0 && a.toolLimit <= 50, detail: '记忆窗口 ' + a.memoryLimit + ' 条;单次连续工具调用上限 ' + a.toolLimit + ' 次' },
|
|
25
|
+
];
|
|
26
|
+
}
|
|
27
|
+
export function assertRemovable(a) {
|
|
28
|
+
if (a.enabled)
|
|
29
|
+
throw Error('请先停用 Agent,再删除。');
|
|
30
|
+
if (a.references.length)
|
|
31
|
+
throw Error('仍被 ' + a.references.length + ' 个流程或任务引用,请先处理引用。');
|
|
32
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { ref } from '../../runtime/state.js';
|
|
2
|
+
import { seedAgents } from "./data.js";
|
|
3
|
+
export const registryKey = 'i3-prototype-antdv-agents-v010';
|
|
4
|
+
let initial = { schema: 1, records: seedAgents(), audit: [] };
|
|
5
|
+
try {
|
|
6
|
+
const saved = JSON.parse(localStorage.getItem(registryKey) || 'null');
|
|
7
|
+
if (saved?.schema === 1 && saved.records?.every((a) => a.id && a.recordVersion && Array.isArray(a.tools)) && Array.isArray(saved.audit))
|
|
8
|
+
initial = saved;
|
|
9
|
+
}
|
|
10
|
+
catch { /* Local prototype can be reset. */ }
|
|
11
|
+
export const agentRecords = ref(initial.records), agentAudit = ref(initial.audit);
|
|
12
|
+
export const modelAgentEntries = () => agentRecords.value.filter(a => !a.isDeleted).map(a => ({ value: a.grantKey, label: a.name, projects: [a.project] }));
|
|
13
|
+
export const modelProjectEntries = () => agentRecords.value.filter(a => !a.isDeleted).map(a => ({ value: a.project, tenantId: a.tenantId }));
|
|
14
|
+
export const modelAgentLabel = (key) => agentRecords.value.find(a => a.grantKey === key)?.name || key;
|
|
15
|
+
export const agentModelReferences = (modelId) => agentRecords.value.filter(a => !a.isDeleted && a.modelRef === modelId).map(a => ({ name: a.name, kind: 'Agent', version: '记录 v' + a.recordVersion }));
|
|
16
|
+
export function commitAgents(records, audit) {
|
|
17
|
+
try {
|
|
18
|
+
localStorage.setItem(registryKey, JSON.stringify({ schema: 1, records, audit }));
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
throw Error('浏览器无法保存 Agent,本次操作未提交,请保留输入后重试。');
|
|
22
|
+
}
|
|
23
|
+
agentRecords.value = records;
|
|
24
|
+
agentAudit.value = audit;
|
|
25
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { stateOf } from "../pbc/management.js";
|
|
2
|
+
import { taskAgentReferences } from "../tasks/registry.js";
|
|
3
|
+
import { workflowAgentReferences } from "../workflows/registry.js";
|
|
4
|
+
import { defineStore } from "../../runtime/state.js";
|
|
5
|
+
import { computed, ref } from '../../runtime/state.js';
|
|
6
|
+
import { useModels } from "../models/store.js";
|
|
7
|
+
import { usePbcs } from "../pbc/store.js";
|
|
8
|
+
import { useSession } from "../shared/session.js";
|
|
9
|
+
import { metadata } from "../shared/policy.js";
|
|
10
|
+
import { assertBatch } from "../shared/listBatch.js";
|
|
11
|
+
import { resourceCatalog, seedAgents } from "./data.js";
|
|
12
|
+
import { checkConfiguration, validateBasics, assertRemovable } from "./domain.js";
|
|
13
|
+
import { agentRecords, agentAudit, commitAgents } from "./registry.js";
|
|
14
|
+
const clone = (x) => JSON.parse(JSON.stringify(x));
|
|
15
|
+
export const useAgents = defineStore('agents', () => {
|
|
16
|
+
const session = useSession(), models = useModels(), pbcs = usePbcs(), scene = ref('normal');
|
|
17
|
+
const records = computed(() => agentRecords.value.filter(a => !a.isDeleted && session.can('agent:view', a.tenantId, a.pbcId)).map(a => ({ ...a, references: [...a.references, ...workflowAgentReferences(a.id), ...taskAgentReferences(a.id)] })));
|
|
18
|
+
const projects = computed(() => pbcs.items.filter(p => stateOf(p) === 'active' && session.can('agent:edit', p.tenantId, p.id)));
|
|
19
|
+
const resources = computed(() => resourceCatalog.filter(r => r.tenantIds.includes('*') || session.actor.grants.some(g => g.actions.includes('agent:view') && (g.tenantIds.includes('*') || r.tenantIds.some(t => g.tenantIds.includes(t))))));
|
|
20
|
+
const item = (id) => records.value.find(a => a.id === id);
|
|
21
|
+
const choices = (a) => models.agentChoices(a.tenantId, a.project, a.grantKey);
|
|
22
|
+
const checks = (a) => { const p = pbcs.items.find(p => p.id === a.pbcId && p.tenantId === a.tenantId), ok = !!p && stateOf(p) === 'active'; return [{ key: 'pbc', label: '所属 PBC 状态', ok, detail: ok ? 'PBC 可继续使用' : 'PBC 已归档或不可访问,不能启用新的配置' }, ...checkConfiguration(a, choices(a), resources.value)]; };
|
|
23
|
+
const audit = (a) => session.can('agent:audit', a.tenantId, a.pbcId) ? agentAudit.value.filter(e => e.agentId === a.id) : [];
|
|
24
|
+
function commit(next, affected, action, detail) {
|
|
25
|
+
const at = new Date().toISOString();
|
|
26
|
+
commitAgents(next, [...affected.map(a => ({ id: crypto.randomUUID(), agentId: a.id, name: a.name, actor: session.actor.name, at, action, detail, tenantId: a.tenantId, pbcId: a.pbcId })), ...agentAudit.value]);
|
|
27
|
+
}
|
|
28
|
+
function current(id, action, expected) {
|
|
29
|
+
const a = agentRecords.value.find(a => a.id === id && !a.isDeleted);
|
|
30
|
+
if (!a)
|
|
31
|
+
throw Error('Agent 不存在或无权访问。');
|
|
32
|
+
session.require(action, a.tenantId, a.pbcId);
|
|
33
|
+
session.require('agent:view', a.tenantId, a.pbcId);
|
|
34
|
+
if (a.recordVersion !== expected)
|
|
35
|
+
throw Error('记录已被更新,请重新打开并核对。');
|
|
36
|
+
return a;
|
|
37
|
+
}
|
|
38
|
+
function blank() {
|
|
39
|
+
const p = projects.value[0], id = crypto.randomUUID();
|
|
40
|
+
return { ...metadata(session.actor, new Date().toISOString(), p?.tenantId || session.actor.tenantId), id, name: '', code: '', description: '', duty: 'planner', pbcId: p?.id || '', project: p?.resourceKey || p?.name || '', grantKey: id, modelRef: '', promptRef: '', skillRefs: [], tools: [], memoryLimit: 40, toolLimit: 10, enabled: false, references: [] };
|
|
41
|
+
}
|
|
42
|
+
function save(input, isNew) {
|
|
43
|
+
session.require('agent:view', input.tenantId, input.pbcId);
|
|
44
|
+
session.require('agent:edit', input.tenantId, input.pbcId);
|
|
45
|
+
validateBasics(input);
|
|
46
|
+
const p = projects.value.find(p => p.id === input.pbcId && p.tenantId === input.tenantId);
|
|
47
|
+
if (!p || (p.resourceKey || p.name) !== input.project)
|
|
48
|
+
throw Error('项目已失效或不在可配置范围。');
|
|
49
|
+
if (agentRecords.value.some(a => !a.isDeleted && a.id !== input.id && a.tenantId === input.tenantId && a.code === input.code))
|
|
50
|
+
throw Error('该租户下的 Agent 标识已存在。');
|
|
51
|
+
const old = isNew ? undefined : current(input.id, 'agent:edit', input.recordVersion);
|
|
52
|
+
if (old?.enabled)
|
|
53
|
+
throw Error('请先停用 Agent,再编辑配置。');
|
|
54
|
+
if (old && (input.code !== old.code || input.pbcId !== old.pbcId || input.tenantId !== old.tenantId))
|
|
55
|
+
throw Error('已有 Agent 的标识和所属项目不可修改。');
|
|
56
|
+
const at = new Date().toISOString();
|
|
57
|
+
const a = { ...clone(input), ...(old ? { ...metadata(session.actor, at, old.tenantId), createdById: old.createdById, createdBy: old.createdBy, createdDept: old.createdDept, createdAt: old.createdAt, recordVersion: old.recordVersion + 1 } : metadata(session.actor, at, input.tenantId)), enabled: false, grantKey: old?.grantKey || input.id, references: old?.references || [] };
|
|
58
|
+
session.writeCheck();
|
|
59
|
+
commit(isNew ? [a, ...agentRecords.value] : agentRecords.value.map(r => r.id === a.id ? a : r), [a], isNew ? '创建 Agent' : '保存配置', '保存为停用配置;记录 v' + a.recordVersion);
|
|
60
|
+
scene.value = 'normal';
|
|
61
|
+
return a.id;
|
|
62
|
+
}
|
|
63
|
+
function toggle(id, expected) {
|
|
64
|
+
const old = current(id, 'agent:status', expected);
|
|
65
|
+
if (!old.enabled && checks(old).some(c => !c.ok))
|
|
66
|
+
throw Error('存在配置或授权问题,请处理检查结果后启用。');
|
|
67
|
+
const a = { ...old, enabled: !old.enabled, recordVersion: old.recordVersion + 1, updatedBy: session.actor.name, updatedAt: new Date().toISOString() };
|
|
68
|
+
session.writeCheck();
|
|
69
|
+
commit(agentRecords.value.map(r => r.id === id ? a : r), [a], a.enabled ? '启用 Agent' : '停用 Agent', '记录 v' + a.recordVersion + ';在途任务生效规则待正式实现');
|
|
70
|
+
}
|
|
71
|
+
function check(id, expected) {
|
|
72
|
+
const a = current(id, 'agent:check', expected), result = checks(a);
|
|
73
|
+
commit(agentRecords.value, [a], '检查配置', result.filter(c => !c.ok).length + ' 项待处理;仅本地引用与配置检查');
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
function checkRemove(target) { const a = current(target.id, 'agent:delete', target.recordVersion); assertRemovable({ ...a, references: [...a.references, ...workflowAgentReferences(a.id), ...taskAgentReferences(a.id)] }); }
|
|
77
|
+
function removeMany(targets) {
|
|
78
|
+
const selected = assertBatch(agentRecords.value, targets, a => { session.require('agent:view', a.tenantId, a.pbcId); session.require('agent:delete', a.tenantId, a.pbcId); assertRemovable({ ...a, references: [...a.references, ...workflowAgentReferences(a.id), ...taskAgentReferences(a.id)] }); });
|
|
79
|
+
const ids = new Set(selected.map(a => a.id)), at = new Date().toISOString();
|
|
80
|
+
session.writeCheck();
|
|
81
|
+
commit(agentRecords.value.map(a => ids.has(a.id) ? { ...a, isDeleted: true, updatedBy: session.actor.name, updatedAt: at, recordVersion: a.recordVersion + 1 } : a), selected, '删除 Agent', '逻辑删除;本批 ' + selected.length + ' 项');
|
|
82
|
+
}
|
|
83
|
+
function reset() { commitAgents(seedAgents(), []); scene.value = 'normal'; }
|
|
84
|
+
return { records, projects, resources, scene, item, choices, checks, audit, blank, save, toggle, check, checkRemove, removeMany, reset };
|
|
85
|
+
});
|
package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentClose.html
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
<!-- 来源:src/intents/IntentClose.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
|
|
2
|
+
<template data-component="Modal" data-bind-open="(true)" title="关闭未确认意图" ok-text="确认关闭" cancel-text="继续保留" data-bind-ok-button-props="({ danger: true, disabled: !store.canClose })" data-bind-mask="({ closable: false })" data-on-ok="(submit)" data-on-cancel="(emit('close'))"><template data-component="Alert" class="form-intro" type="warning" show-icon="" data-bind-title="(intent.title)" description="关闭后停止澄清和确认,保留原文、版本与操作记录;本轮不提供重新打开。"></template><label for="close-intent-reason">关闭原因</label><template data-component="Input.TextArea" id="close-intent-reason" data-model-value="(reason)" data-bind-rows="(4)" data-bind-maxlength="(500)" placeholder="说明为何不再继续这条意图"></template><template data-component="Alert" data-if="(error)" class="intent-error" type="error" data-bind-title="(error)" show-icon=""></template></template>
|
package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentClose.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ref } from '../../runtime/state.js';
|
|
2
|
+
import { Alert, Input, Modal, message } from "../../runtime/widgets.js";
|
|
3
|
+
import { useIntents } from "./store.js";
|
|
4
|
+
import { createComponent } from '../../runtime/dom.js';
|
|
5
|
+
export default createComponent({ name: 'IntentClose', propKeys: ["intent"], template: new URL('./IntentClose.html', import.meta.url).href, setup(__props, __emit) {
|
|
6
|
+
const props = __props, emit = __emit;
|
|
7
|
+
const store = useIntents(), reason = ref(''), error = ref(''), expected = props.intent.recordVersion;
|
|
8
|
+
function submit() { try {
|
|
9
|
+
store.close(props.intent.id, reason.value, expected);
|
|
10
|
+
message.success('意图已关闭,内容与历史保留');
|
|
11
|
+
emit('close');
|
|
12
|
+
}
|
|
13
|
+
catch (e) {
|
|
14
|
+
error.value = e.message;
|
|
15
|
+
} }
|
|
16
|
+
return { ref, Alert, Input, Modal, message, useIntents, props, emit, store, reason, error, expected, submit };
|
|
17
|
+
} });
|
package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentCreate.html
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
<!-- 来源:src/intents/IntentCreate.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
|
|
2
|
+
<template data-component="IntentHeader" data-bind-step="(0)"><template data-component="Button" data-bind-disabled="(!store.canEdit)" data-bind-loading="(saving)" data-on-click="(save(false))">保存草稿</template></template><template data-component="Alert" data-if="(!store.canEdit)" type="info" show-icon="" class="page-alert" title="当前为只读成员,不能发起意图。"></template><div class="intent-grid"><section class="panel intent-main"><div class="section-heading"><h2>描述业务目标</h2><template data-component="Button" data-bind-disabled="(!store.canEdit)" data-on-click="(example)"><template data-component="EditOutlined"></template>填入供热示例</template></div><p class="muted form-intro">先说清楚你想做什么,接下来逐项补充使用者、处理流程和验收标准。</p><template data-component="ProForm" name="intent-create" data-bind-form="(form)" layout="vertical" data-bind-disabled="(!store.canEdit || saving)" class="intent-form"></template><div class="intent-actions"><span class="muted">{{ (dirty ? '有尚未保存的输入' : '保存后可随时回来继续') }}</span><template data-component="Space"><template data-component="Button" data-bind-disabled="(!store.canEdit)" data-bind-loading="(saving)" data-on-click="(save(false))">保存草稿</template><template data-component="Button" type="primary" data-bind-disabled="(!store.canEdit)" data-bind-loading="(saving)" data-on-click="(save(true))">开始澄清</template></template></div></section><template data-component="IntentSummary"></template></div>
|
package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentCreate.js
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { confirmAction } from "../shell/confirmation.js";
|
|
2
|
+
import { computed, onBeforeUnmount, onMounted, ref } from '../../runtime/state.js';
|
|
3
|
+
import { onBeforeRouteLeave, useRouter } from "../../runtime/router.js";
|
|
4
|
+
import { Alert, Button, Space, message } from "../../runtime/widgets.js";
|
|
5
|
+
import { EditOutlined } from "../../runtime/icons.js";
|
|
6
|
+
import { ProForm, useForm } from "../../runtime/widgets.js";
|
|
7
|
+
import { contexts, heatingExample } from "./data.js";
|
|
8
|
+
import { useIntents } from "./store.js";
|
|
9
|
+
import IntentHeader from "./IntentHeader.js";
|
|
10
|
+
import IntentSummary from "./IntentSummary.js";
|
|
11
|
+
import { createComponent } from '../../runtime/dom.js';
|
|
12
|
+
export default createComponent({ name: 'IntentCreate', propKeys: [], template: new URL('./IntentCreate.html', import.meta.url).href, setup(__props, __emit) {
|
|
13
|
+
const store = useIntents(), router = useRouter(), saved = ref(false), saving = ref(false);
|
|
14
|
+
const initialReset = store.resetTick;
|
|
15
|
+
const initial = { title: '', request: '', outcome: '', context: contexts[0] };
|
|
16
|
+
const form = useForm({ ...initial }, [
|
|
17
|
+
{ path: 'title', label: '意图名称', component: 'input', placeholder: '用一句话概括要解决的问题', span: 24, maxlength: 80, showCount: true, rules: [{ required: true, whitespace: true, message: '请输入意图名称' }] },
|
|
18
|
+
{ path: 'request', label: '我的需求', component: 'textarea', placeholder: '描述业务目标、当前问题,以及你期待的结果。', span: 24, autoSize: { minRows: 6, maxRows: 10 }, maxlength: 2000, showCount: true, rules: [{ required: true, whitespace: true, message: '请描述你的需求' }] },
|
|
19
|
+
{ path: 'outcome', label: '预期结果', component: 'textarea', placeholder: '完成后,用户能得到什么可观察的结果?', span: 24, autoSize: { minRows: 3, maxRows: 6 }, maxlength: 1000, rules: [{ required: true, whitespace: true, message: '请填写预期结果' }] },
|
|
20
|
+
{ path: 'context', label: '拟归属', component: 'select', options: contexts.map(value => ({ label: value, value })), allowClear: false, span: 24, extra: '尚未确定所属 PBC 时,可先保存在意图池。拟归属不会变更当前租户。' },
|
|
21
|
+
]);
|
|
22
|
+
const dirty = computed(() => !saved.value && store.resetTick === initialReset && JSON.stringify(form.formData) !== JSON.stringify(initial));
|
|
23
|
+
function example() {
|
|
24
|
+
if (!store.canEdit)
|
|
25
|
+
return;
|
|
26
|
+
const fill = () => form.setFormData({ ...heatingExample });
|
|
27
|
+
if (dirty.value)
|
|
28
|
+
confirmAction({ title: '替换当前输入为示例?', content: '只替换本页尚未保存的内容。', okText: '填入示例', cancelText: '保留输入', onOk: fill });
|
|
29
|
+
else
|
|
30
|
+
fill();
|
|
31
|
+
}
|
|
32
|
+
async function save(start) {
|
|
33
|
+
if (!store.canEdit)
|
|
34
|
+
return;
|
|
35
|
+
try {
|
|
36
|
+
await form.formRef.value?.validate();
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
saving.value = true;
|
|
42
|
+
try {
|
|
43
|
+
const id = store.create({ ...form.formData });
|
|
44
|
+
if (start)
|
|
45
|
+
store.start(id);
|
|
46
|
+
saved.value = true;
|
|
47
|
+
store.scene = 'normal';
|
|
48
|
+
message.success(start ? '已保存,开始补充需求' : '草稿已保存');
|
|
49
|
+
await router.push(start ? '/intents/' + id + '/workspace' : '/intents');
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
message.error(e.message);
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
saving.value = false;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
onBeforeRouteLeave(() => !dirty.value || new Promise(resolve => confirmAction({ title: '离开前尚有内容未保存', content: '可继续填写并保存草稿,或放弃本次输入。', okText: '放弃并离开', cancelText: '继续填写', onOk: () => resolve(true), onCancel: () => resolve(false) })));
|
|
59
|
+
function beforeUnload(event) { if (dirty.value) {
|
|
60
|
+
event.preventDefault();
|
|
61
|
+
event.returnValue = '';
|
|
62
|
+
} }
|
|
63
|
+
onMounted(() => window.addEventListener('beforeunload', beforeUnload));
|
|
64
|
+
onBeforeUnmount(() => window.removeEventListener('beforeunload', beforeUnload));
|
|
65
|
+
return { confirmAction, computed, onBeforeUnmount, onMounted, ref, onBeforeRouteLeave, useRouter, Alert, Button, Space, message, EditOutlined, ProForm, useForm, contexts, heatingExample, useIntents, IntentHeader, IntentSummary, store, router, saved, saving, initialReset, initial, form, dirty, example, save, beforeUnload };
|
|
66
|
+
} });
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<!-- 来源:src/intents/IntentDecisions.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
|
|
2
|
+
<section class="decision-register" aria-label="决策登记"><div class="section-heading"><h2>未决问题与决策登记</h2><template data-component="Tag" data-bind-color="(decisions.some(d => !d.answer) ? 'orange' : 'green')">{{ (decisions.filter(d => !d.answer).length) }} 项待确认</template></div><p class="muted">澄清回答与未决问题分别核对。{{ (newVersion ? '保存变更会形成新的意图版本。' : '仍有未决问题时,意图不能确认。') }}</p><template data-component="Empty" data-if="(!decisions.length)" data-bind-image="(Empty.PRESENTED_IMAGE_SIMPLE)" description="暂无登记的未决问题,请确认没有遗漏。"></template><div data-each="d in (decisions)" data-bind-key="(d.id)" class="decision-row"><div class="section-heading"><strong>{{ (d.question) }}</strong><template data-component="Tag" data-bind-color="(d.answer ? 'green' : 'orange')">{{ (d.answer ? '已登记结论' : '待确认') }}</template></div><p data-if="(d.answer)">{{ (d.answer) }}</p><small data-if="(d.resolvedAt)" class="muted">{{ (d.resolvedBy) }} · {{ (formatDate(d.resolvedAt)) }}</small><template data-if="(selected === d.id)"><label data-bind-for="('conclusion-' + d.id)">决策结论</label><template data-component="Input.TextArea" data-bind-id="('conclusion-' + d.id)" data-model-value="(conclusion)" data-bind-maxlength="(1000)" data-bind-rows="(3)"></template><div class="decision-actions"><template data-component="Button" data-on-click="(selected = '')">取消</template><template data-component="Button" type="primary" data-on-click="(resolve)">保存结论</template></div></template><template data-component="Button" data-else-if="(editable)" type="link" data-on-click="selected = d.id;
|
|
3
|
+
conclusion = d.answer;">{{ (d.answer ? '修订结论' : '登记结论') }}</template></div><div data-if="(editable)" class="decision-add"><label for="new-decision">补充待确认问题</label><template data-component="Input.TextArea" id="new-decision" data-model-value="(question)" data-bind-maxlength="(500)" data-bind-rows="(2)" placeholder="例如:超时后由哪个岗位复核?"></template><template data-component="Button" data-on-click="(add)">登记问题</template></div><template data-component="Alert" data-if="(error)" type="error" data-bind-title="(error)" show-icon=""></template></section>
|
package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDecisions.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { ref } from '../../runtime/state.js';
|
|
2
|
+
import { Alert, Button, Empty, Input, Tag } from "../../runtime/widgets.js";
|
|
3
|
+
import { useSession } from "../shared/session.js";
|
|
4
|
+
import { formatDate } from "../shared/policy.js";
|
|
5
|
+
import { createComponent } from '../../runtime/dom.js';
|
|
6
|
+
export default createComponent({ name: 'IntentDecisions', propKeys: ["decisions", "editable", "newVersion", "commit"], template: new URL('./IntentDecisions.html', import.meta.url).href, setup(__props, __emit) {
|
|
7
|
+
const props = __props;
|
|
8
|
+
const emit = __emit, session = useSession();
|
|
9
|
+
const question = ref(''), selected = ref(''), conclusion = ref(''), error = ref('');
|
|
10
|
+
function dispatch(decisions) { if (props.commit)
|
|
11
|
+
return props.commit(decisions); emit('change', decisions); return true; }
|
|
12
|
+
function add() {
|
|
13
|
+
if (!props.editable)
|
|
14
|
+
return;
|
|
15
|
+
if (!question.value.trim()) {
|
|
16
|
+
error.value = '请填写需要确认的问题。';
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
if (!dispatch([...props.decisions, { id: crypto.randomUUID(), question: question.value.trim(), answer: '' }]))
|
|
20
|
+
return;
|
|
21
|
+
question.value = '';
|
|
22
|
+
error.value = '';
|
|
23
|
+
}
|
|
24
|
+
function resolve() {
|
|
25
|
+
if (!props.editable)
|
|
26
|
+
return;
|
|
27
|
+
if (!conclusion.value.trim()) {
|
|
28
|
+
error.value = '请填写明确结论。';
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (!dispatch(props.decisions.map(d => d.id === selected.value ? { ...d, answer: conclusion.value.trim(), resolvedBy: session.actor.name, resolvedAt: new Date().toISOString() } : d)))
|
|
32
|
+
return;
|
|
33
|
+
selected.value = '';
|
|
34
|
+
conclusion.value = '';
|
|
35
|
+
error.value = '';
|
|
36
|
+
}
|
|
37
|
+
return { ref, Alert, Button, Empty, Input, Tag, useSession, formatDate, props, emit, session, question, selected, conclusion, error, dispatch, add, resolve };
|
|
38
|
+
} });
|
package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDetail.html
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
<!-- 来源:src/intents/IntentDetail.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
|
|
2
|
+
<template data-component="Result" data-if="(!intent)" status="403" title="记录不存在或当前身份无权访问"><template data-slot="extra"><template data-component="Button" type="primary" data-on-click="(router.push('/intents'))">返回意图池</template></template></template><template data-else=""><template data-component="IntentSource" data-bind-intent="(intent)"></template><template data-component="IntentHeader" data-bind-intent="(intent)" data-bind-step="(intent.status === 'confirmed' ? 3 : 2)"><template data-component="Space" wrap=""><template data-component="Button" data-if="(store.canClose && !closed && intent.status !== 'confirmed')" danger="" data-bind-disabled="(busy)" data-on-click="(closing = true)">关闭意图</template><template data-component="Button" data-on-click="(history = true)"><template data-component="HistoryOutlined"></template>版本记录</template></template></template><template data-component="Alert" data-if="(store.notice || error)" class="page-alert" type="error" show-icon="" data-bind-title="(error || store.notice)"></template><template data-component="Alert" data-if="(intent.confirmation === 'pending')" class="page-alert" type="info" show-icon="" title="正在提交确认,请稍候…"></template><template data-component="Alert" data-if="(intent.confirmation === 'unknown')" class="page-alert" type="warning" show-icon="" title="确认结果待核实,请勿重复提交" description="本演示模拟确认请求已被接受、响应丢失。先核实这一次请求的结果,再决定后续操作。"><template data-slot="action"><template data-component="Button" data-bind-disabled="(!canConfirm)" data-on-click="(reconcile)">核实确认结果</template></template></template><template data-component="Alert" data-if="(intent.confirmation === 'failed')" class="page-alert" type="error" show-icon="" data-bind-title="(intent.error)"></template><template data-component="Alert" data-if="(intent.status === 'confirmed')" class="page-alert" type="success" show-icon="" data-bind-title="('意图 v' + version?.number + ' 已确认')" description="进入需求规格工作区,完善需求与验收后确认版本。"><template data-slot="action"><template data-component="Button" data-bind-disabled="(!session.can('spec:view', intent.tenantId))" data-on-click="(router.push('/intents/' + intent.id + '/spec'))">查看需求规格</template></template></template><template data-component="Alert" data-if="(closed)" class="page-alert" type="warning" show-icon="" title="意图已关闭" data-bind-description="(intent.closedBy + ' · ' + dateText(intent.closedAt) + ';原因:' + intent.closedReason)"></template><template data-component="Alert" data-if="(!canConfirm && intent.status === 'ready')" class="page-alert" type="info" show-icon="" title="当前没有意图确认权限" description="未决问题为零仍需确认权限。请在独立的权限管理中配置当前租户的“确认意图”权限,或联系业务管理员。"></template><template data-component="Alert" data-if="(intent.status === 'ready' && unresolved(intent.decisions).length)" class="page-alert" type="warning" show-icon="" data-bind-title="('还有 ' + unresolved(intent.decisions).length + ' 项决策未处理,暂不能确认意图')" description="在下方决策登记填写结论并保存为新版本,再确认。"></template><div class="intent-grid"><section class="panel intent-main"><div class="section-heading"><h2>意图内容</h2><template data-component="Tag" color="blue" data-bind-bordered="(false)">{{ (version ? 'v' + version.number : '未形成版本') }}</template></div><template data-component="IntentDocument" data-bind-value="(version || intent)"></template><template data-component="IntentDecisions" data-bind-decisions="(intent.decisions)" data-bind-editable="(store.canEdit && !closed && !busy && intent.status !== 'confirmed')" data-bind-new-version="(!!version)" data-bind-commit="(saveDecisions)"></template><div data-if="(!closed)" class="intent-actions"><span class="muted">{{ (unresolved(intent.decisions).length ? '请先处理未决问题' : '内容变更将形成新版本') }}</span><template data-component="Space" wrap=""><template data-component="Button" data-bind-disabled="(!store.canEdit || busy)" data-on-click="(replan = true)">重新规划</template><template data-component="Button" data-bind-disabled="(!store.canEdit || busy)" data-on-click="(edit = true)">修改</template><template data-component="Button" data-if="(intent.status === 'ready')" type="primary" data-bind-loading="(intent.confirmation === 'pending')" data-bind-disabled="(!canConfirm || busy || !!unresolved(intent.decisions).length)" data-on-click="(confirm)">{{ (intent.confirmation === 'failed' ? '重试确认' : '确认意图') }}</template></template></div></section><aside class="panel intent-summary" aria-label="确认信息"><h2>确认信息</h2><dl class="intent-info"><dt>当前版本</dt><dd>{{ (version ? '意图 v' + version.number : '草稿') }}</dd><dt>PBC 归属</dt><dd>{{ (affiliationOf(intent).label) }}</dd><dt>发起人</dt><dd>{{ (intent.owner) }}</dd></dl><div class="summary-context"><h3>{{ (version?.confirmedAt ? '确认记录' : '确认前请核对') }}</h3><p data-if="(version?.confirmedAt)"><template data-component="CheckCircleOutlined" class="answered"></template> {{ (version.confirmedBy) }} · {{ (dateText(version.confirmedAt)) }}</p><ul data-else="" class="confirmation-checks"><li>问题、预期结果与范围一致</li><li>未决问题已有明确结论</li><li>以有权身份确认当前版本</li></ul></div><div class="summary-context"><template data-component="RecordMetadata" data-bind-record="(intent)" compact=""></template></div></aside></div><template data-component="IntentRevision" data-if="(edit)" data-bind-intent="(intent)" data-on-close="(edit = false)"></template><template data-component="IntentReplan" data-if="(replan)" data-bind-intent="(intent)" data-on-close="(replan = false)"></template><template data-component="IntentHistory" data-if="(history)" data-bind-intent="(intent)" data-on-close="(history = false)"></template><template data-component="IntentClose" data-if="(closing)" data-bind-intent="(intent)" data-on-close="(closing = false)"></template></template>
|
package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDetail.js
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import IntentSource from "../operations/IntentSource.js";
|
|
2
|
+
import { useDeliveryView } from "../shared/deliveryView.js";
|
|
3
|
+
import { confirmAction } from "../shell/confirmation.js";
|
|
4
|
+
import { computed, ref, watch } from '../../runtime/state.js';
|
|
5
|
+
import { useRoute, useRouter } from "../../runtime/router.js";
|
|
6
|
+
import { Alert, Button, Result, Space, Tag, message } from "../../runtime/widgets.js";
|
|
7
|
+
import { HistoryOutlined, CheckCircleOutlined } from "../../runtime/icons.js";
|
|
8
|
+
import { useIntents } from "./store.js";
|
|
9
|
+
import { lastVersion, unresolved, confirmationBusy } from "./domain.js";
|
|
10
|
+
import { dateText } from "./data.js";
|
|
11
|
+
import IntentHeader from "./IntentHeader.js";
|
|
12
|
+
import IntentDocument from "./IntentDocument.js";
|
|
13
|
+
import IntentRevision from "./IntentRevision.js";
|
|
14
|
+
import IntentReplan from "./IntentReplan.js";
|
|
15
|
+
import IntentHistory from "./IntentHistory.js";
|
|
16
|
+
import IntentDecisions from "./IntentDecisions.js";
|
|
17
|
+
import IntentClose from "./IntentClose.js";
|
|
18
|
+
import RecordMetadata from "../shared/RecordMetadata.js";
|
|
19
|
+
import { useSession } from "../shared/session.js";
|
|
20
|
+
import { createComponent } from '../../runtime/dom.js';
|
|
21
|
+
export default createComponent({ name: 'IntentDetail', propKeys: [], template: new URL('./IntentDetail.html', import.meta.url).href, setup(__props, __emit) {
|
|
22
|
+
const { affiliationOf } = useDeliveryView();
|
|
23
|
+
const session = useSession();
|
|
24
|
+
const route = useRoute(), router = useRouter(), store = useIntents(), edit = ref(false), replan = ref(false), history = ref(false), closing = ref(false), error = ref('');
|
|
25
|
+
const intent = computed(() => store.get(String(route.params.id))), version = computed(() => intent.value && lastVersion(intent.value));
|
|
26
|
+
const busy = computed(() => !!intent.value && confirmationBusy(intent.value)), closed = computed(() => intent.value?.status === 'closed');
|
|
27
|
+
watch(() => intent.value?.status, status => { if (status === 'draft' || status === 'clarifying')
|
|
28
|
+
router.replace('/intents/' + intent.value.id + '/workspace'); }, { immediate: true });
|
|
29
|
+
const canConfirm = computed(() => !!intent.value && session.can('intent:confirm', intent.value.tenantId));
|
|
30
|
+
function confirm() {
|
|
31
|
+
if (!intent.value || !version.value || !canConfirm || busy.value)
|
|
32
|
+
return;
|
|
33
|
+
const id = intent.value.id, number = version.value.number, expected = intent.value.recordVersion;
|
|
34
|
+
confirmAction({ title: '确认意图 v' + number + '?', content: '确认当前展示的问题、预期结果、范围和决策结论。确认记录绑定此版本及当前身份;本轮不创建 PBC 或启动开发。', okText: '确认此版本', cancelText: '继续查看', onOk: async () => {
|
|
35
|
+
try {
|
|
36
|
+
const result = await store.confirm(id, number, expected);
|
|
37
|
+
if (result === 'confirmed')
|
|
38
|
+
message.success('意图 v' + number + ' 已确认');
|
|
39
|
+
else if (result === 'unknown')
|
|
40
|
+
message.warning('响应未收到,请先核实确认结果');
|
|
41
|
+
}
|
|
42
|
+
catch (e) {
|
|
43
|
+
error.value = e.message;
|
|
44
|
+
}
|
|
45
|
+
} });
|
|
46
|
+
}
|
|
47
|
+
function saveDecisions(decisions) { if (!intent.value)
|
|
48
|
+
return false; try {
|
|
49
|
+
store.setDecisions(intent.value.id, decisions, intent.value.recordVersion);
|
|
50
|
+
error.value = '';
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
catch (e) {
|
|
54
|
+
error.value = e.message;
|
|
55
|
+
return false;
|
|
56
|
+
} }
|
|
57
|
+
function reconcile() { try {
|
|
58
|
+
store.reconcile(intent.value.id);
|
|
59
|
+
message.success('已核实:该版本确认成功,未重复提交');
|
|
60
|
+
error.value = '';
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
error.value = e.message;
|
|
64
|
+
} }
|
|
65
|
+
return { IntentSource, useDeliveryView, affiliationOf, confirmAction, computed, ref, watch, useRoute, useRouter, Alert, Button, Result, Space, Tag, message, HistoryOutlined, CheckCircleOutlined, useIntents, lastVersion, unresolved, confirmationBusy, dateText, IntentHeader, IntentDocument, IntentRevision, IntentReplan, IntentHistory, IntentDecisions, IntentClose, RecordMetadata, useSession, session, route, router, store, edit, replan, history, closing, error, intent, version, busy, closed, canConfirm, confirm, saveDecisions, reconcile };
|
|
66
|
+
} });
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
<!-- 来源:src/intents/IntentDocument.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
|
|
2
|
+
<div class="intent-document"><section><h3>1. 要解决的问题</h3><p>{{ (value.request) }}</p></section><section><h3>2. 预期结果</h3><p>{{ (value.outcome || '待补充') }}</p><h4>验收标准</h4><p>{{ (value.answers.acceptance || '待补充') }}</p></section><section><h3>3. 影响的用户与系统</h3><p>{{ (value.answers.audience || '待补充') }}</p><h4>处理流程与系统边界</h4><p>{{ (value.answers.process || '待补充') }}</p></section><section><h3>4. 约束与限制</h3><p>{{ (value.answers.boundary || '待补充') }}</p></section><section><h3>5. 未决问题</h3><p data-if="(!value.decisions?.length)">暂无登记的未决问题。</p><div data-each="d in (value.decisions || [])" data-bind-key="(d.id)" class="document-decision"><strong>{{ (d.question) }}</strong><p>{{ (d.answer || '待确认,阻断意图确认') }}</p></div></section></div>
|
package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentHeader.html
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
<!-- 来源:src/intents/IntentHeader.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
|
|
2
|
+
<template data-component="RouterLink" to="/intents" class="text-button intent-back"><template data-component="LeftOutlined"></template>返回意图池</template><div class="page-heading intent-heading"><div><h1>{{ (intent?.title || '发起意图') }}</h1><p data-if="(intent)" class="intent-meta"><span class="mono">{{ (intent.code) }}</span><template data-component="Tag" data-bind-color="(statusMeta[intent.status].color)" data-bind-bordered="(false)">{{ (statusMeta[intent.status].label) }}</template><span>{{ (affiliationOf(intent).label) }}</span></p><p data-else="">描述你想解决的问题,先把业务目标说清楚。</p></div><div class="intent-header-actions"><slot><template data-component="Button" data-on-click="(router.push('/intents'))">返回列表</template></slot></div></div><template data-component="Steps" class="intent-steps" title-placement="vertical" data-bind-current="(step)" data-bind-items="([{ title: '发起需求' }, { title: '澄清范围' }, { title: '确认意图' }])"></template>
|
package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentHeader.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { useDeliveryView } from "../shared/deliveryView.js";
|
|
2
|
+
import { Button, Tag, Steps } from "../../runtime/widgets.js";
|
|
3
|
+
import { LeftOutlined } from "../../runtime/icons.js";
|
|
4
|
+
import { useRouter } from "../../runtime/router.js";
|
|
5
|
+
import { statusMeta } from "./data.js";
|
|
6
|
+
import { createComponent } from '../../runtime/dom.js';
|
|
7
|
+
export default createComponent({ name: 'IntentHeader', propKeys: ["intent", "step"], template: new URL('./IntentHeader.html', import.meta.url).href, setup(__props, __emit) {
|
|
8
|
+
const { affiliationOf } = useDeliveryView();
|
|
9
|
+
__props;
|
|
10
|
+
const router = useRouter();
|
|
11
|
+
return { useDeliveryView, affiliationOf, Button, Tag, Steps, LeftOutlined, useRouter, statusMeta, router };
|
|
12
|
+
} });
|
package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentHistory.html
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
<!-- 来源:src/intents/IntentHistory.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
|
|
2
|
+
<template data-component="Drawer" data-bind-open="(true)" title="版本与操作记录" data-bind-size="(720)" data-on-close="(emit('close'))"><template data-component="Tabs" data-model-active-key="(tab)" data-bind-items="([{ key: 'versions', label: '意图版本' }, { key: 'events', label: '操作记录' }])"></template><template data-if="(tab === 'versions')"><div class="version-toolbar"><label for="intent-history-version">版本</label><template data-component="Select" id="intent-history-version" data-model-value="(number)" data-bind-options="(intent.versions.map(v => ({ label: '意图 v' + v.number, value: v.number })))"></template><template data-component="Tag" data-if="(version)" data-bind-color="(version.confirmedAt ? 'green' : 'default')">{{ (version.confirmedAt ? '已确认版本' : '未确认版本') }}</template></div><template data-if="(version)"><template data-component="Alert" type="info" show-icon="" data-bind-title="(version.title)" data-bind-description="(version.reason + ' · ' + dateText(version.createdAt))"></template><p data-if="(version.confirmedAt)" class="version-confirmed">{{ (version.confirmedBy) }} · {{ (dateText(version.confirmedAt)) }} 确认</p><template data-component="IntentDocument" data-bind-value="(version)"></template></template></template><ol data-else="" class="intent-events"><li data-each="(event, index) in ([...intent.events].reverse())" data-bind-key="(index)"><p>{{ (event.label) }}</p><span class="muted">{{ (event.actor || intent.createdBy) }} · {{ (dateText(event.at)) }}</span></li></ol></template>
|
package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentHistory.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { computed, ref } from '../../runtime/state.js';
|
|
2
|
+
import { Alert, Drawer, Select, Tabs, Tag } from "../../runtime/widgets.js";
|
|
3
|
+
import { dateText } from "./data.js";
|
|
4
|
+
import IntentDocument from "./IntentDocument.js";
|
|
5
|
+
import { createComponent } from '../../runtime/dom.js';
|
|
6
|
+
export default createComponent({ name: 'IntentHistory', propKeys: ["intent"], template: new URL('./IntentHistory.html', import.meta.url).href, setup(__props, __emit) {
|
|
7
|
+
const props = __props, emit = __emit;
|
|
8
|
+
const tab = ref(props.intent.versions.length ? 'versions' : 'events'), number = ref(props.intent.versions.at(-1)?.number);
|
|
9
|
+
const version = computed(() => props.intent.versions.find(v => v.number === number.value));
|
|
10
|
+
return { computed, ref, Alert, Drawer, Select, Tabs, Tag, dateText, IntentDocument, props, emit, tab, number, version };
|
|
11
|
+
} });
|
package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentList.html
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
<!-- 来源:src/intents/IntentList.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
|
|
2
|
+
<div class="page-heading"><div><h1>意图与需求</h1><p>从业务问题开始,形成可以核对和确认的意图。</p></div><template data-component="Button" type="primary" data-bind-disabled="(!store.canEdit)" data-on-click="(router.push('/intents/new'))"><template data-component="PlusOutlined"></template>发起意图</template></div><template data-component="Alert" data-if="(store.notice)" class="page-alert" type="warning" show-icon="" data-bind-title="(store.notice)"></template><template data-component="Alert" data-if="(!store.canEdit)" class="page-alert" type="info" show-icon="" title="当前身份仅可查看意图和版本。"></template><template data-component="Tabs" data-model-active-key="(tab)" data-bind-items="(tabs)" class="model-tabs"></template><section class="filter-panel panel" aria-label="意图筛选"><template data-component="ProForm" name="intent-search" data-bind-form="(form)" class="filter-form" data-bind-grid="({ gutter: 24 })" data-on-keydown.enter.prevent="(search)"></template><div class="filter-actions"><template data-component="Button" data-on-click="(search)">查询</template><template data-component="Button" data-on-click="(reset)">重置</template></div></section><section class="panel model-table-panel" aria-label="意图池列表"><template data-component="Result" data-if="(store.scene === 'error')" status="warning" title="意图池加载失败"><template data-slot="extra"><template data-component="Button" type="primary" data-on-click="(retry)">重试</template></template></template><template data-component="ProTable" data-else="" data-bind-table="(table)" data-bind-search="(async () => { })" data-bind-control="(false)" data-bind-table-container="(false)" data-bind-loading="(loading)" data-bind-row-selection="(selection.rowSelection.value)" row-key="id" size="middle" data-bind-scroll="({ x: 'max-content' })" data-bind-pagination="({ showTotal: (n) => '共 ' + n + ' 条', showSizeChanger: true, pageSizeOptions: [10, 20, 50, 100] })" data-bind-locale="({ emptyText: h(Empty, { description: store.scene === 'empty' ? '还没有意图,从一个业务目标开始' : '没有符合条件的意图' }, { default: () => h(Button, { disabled: store.scene === 'empty' && !store.canEdit, onClick: store.scene === 'empty' ? () => router.push('/intents/new') : reset }, () => store.scene === 'empty' ? '发起第一个意图' : '清除筛选') }) })"><template data-slot="button-bar"><div class="list-heading"><h2>意图池 · {{ (visible.length) }}</h2><template data-component="ListBatchBar" data-bind-count="(selection.keys.value.length)" data-bind-allowed="(session.can('intent:delete'))" data-on-remove="(batchDelete)" data-on-clear="(selection.clear)"></template></div></template><template data-slot="toolbar"><div class="table-tools"><template data-component="Select" data-model-value="(scope)" aria-label="意图可见范围" data-bind-options="([{ label: '全部可见', value: 'visible' }, { label: '我发起的', value: 'mine' }])"></template><template data-component="Select" data-model-value="(sort)" aria-label="意图排序" data-bind-options="([{ label: '创建时间倒序', value: 'created' }, { label: '修改时间倒序', value: 'updated' }, { label: '名称排序', value: 'name' }])"></template><template data-component="ColumnSettings" data-bind-preferences="(prefs)"></template><template data-component="Button" aria-label="刷新意图池" data-bind-loading="(loading)" data-on-click="(refresh)"><template data-component="ReloadOutlined"></template></template></div> <template data-component="IntentHistory" data-if="(selected && overlay === 'history')" data-bind-intent="(selected)" data-on-close="(overlay = '')"></template><template data-component="IntentRevision" data-if="(selected && overlay === 'edit')" data-bind-intent="(selected)" data-on-close="(overlay = '')"></template><template data-component="IntentReplan" data-if="(selected && overlay === 'replan')" data-bind-intent="(selected)" data-on-close="(replanned)"></template><template data-component="ListDeleteDialog" data-if="(deleteTargets.length)" data-model-targets="(deleteTargets)" label="意图" data-bind-check="(store.checkRemove)" data-bind-submit="(store.removeMany)" data-on-close="(deleteTargets = [])" data-on-deleted="(deleted)"></template></template></template></section><p class="intent-list-note muted">“全部可见”受当前身份与租户范围限制。删除移出列表并保留操作痕迹,已确认版本受保护。</p><template data-component="IntentClose" data-if="(closing)" data-bind-intent="(closing)" data-on-close="(closingId = '')"></template>
|
package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentList.js
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { useDeliveryView } from "../shared/deliveryView.js";
|
|
2
|
+
import { computed, ref, watch, onMounted } from '../../runtime/state.js';
|
|
3
|
+
import { h } from '../../runtime/dom.js';
|
|
4
|
+
import { useRouter } from "../../runtime/router.js";
|
|
5
|
+
import { Alert, Button, Empty, Result, Tabs, Tag, Select } from "../../runtime/widgets.js";
|
|
6
|
+
import { PlusOutlined, ReloadOutlined } from "../../runtime/icons.js";
|
|
7
|
+
import { ProForm, ProTable, useForm, useTable } from "../../runtime/widgets.js";
|
|
8
|
+
import { useIntents } from "./store.js";
|
|
9
|
+
import { useSession } from "../shared/session.js";
|
|
10
|
+
import { tenantLabel } from "../shared/policy.js";
|
|
11
|
+
import { useColumns } from "../shared/columns.js";
|
|
12
|
+
import ColumnSettings from "../shared/ColumnSettings.js";
|
|
13
|
+
import { useListSelection } from "../shared/listSelection.js";
|
|
14
|
+
import ListBatchBar from "../shared/ListBatchBar.js";
|
|
15
|
+
import ListDeleteDialog from "../shared/ListDeleteDialog.js";
|
|
16
|
+
import ListMore from "../shared/ListMore.js";
|
|
17
|
+
import IntentHistory from "./IntentHistory.js";
|
|
18
|
+
import IntentRevision from "./IntentRevision.js";
|
|
19
|
+
import IntentReplan from "./IntentReplan.js";
|
|
20
|
+
import IntentClose from "./IntentClose.js";
|
|
21
|
+
import { contexts, statusMeta, dateText } from "./data.js";
|
|
22
|
+
import { lastVersion, questionKeys, confirmationBusy } from "./domain.js";
|
|
23
|
+
import { createComponent } from '../../runtime/dom.js';
|
|
24
|
+
export default createComponent({ name: 'IntentList', propKeys: [], template: new URL('./IntentList.html', import.meta.url).href, setup(__props, __emit) {
|
|
25
|
+
const { affiliationOf } = useDeliveryView();
|
|
26
|
+
const store = useIntents(), session = useSession(), router = useRouter(), tab = ref('all'), loading = ref(false), scope = ref('visible'), sort = ref('created');
|
|
27
|
+
const closingId = ref(''), closing = computed(() => store.get(closingId.value));
|
|
28
|
+
const selectedId = ref(''), overlay = ref(''), selected = computed(() => store.get(selectedId.value)), deleteTargets = ref([]);
|
|
29
|
+
function menuItems(i) {
|
|
30
|
+
return [
|
|
31
|
+
{ key: 'detail', label: '查看详情' },
|
|
32
|
+
{ key: 'edit', label: ['draft', 'clarifying'].includes(i.status) ? '编辑与澄清' : '修改意图', disabled: !session.can('intent:edit', i.tenantId) || i.status === 'closed' || confirmationBusy(i) || i.generating },
|
|
33
|
+
{ key: 'history', label: '版本与操作记录' },
|
|
34
|
+
{ key: 'spec', label: '需求规格', disabled: i.status !== 'confirmed' || !session.can('spec:view', i.tenantId) },
|
|
35
|
+
{ key: 'replan', label: '重新规划', disabled: !session.can('intent:edit', i.tenantId) || !['ready', 'confirmed'].includes(i.status) || confirmationBusy(i) || i.generating },
|
|
36
|
+
{ type: 'divider' },
|
|
37
|
+
{ key: 'close', label: '关闭意图', disabled: !session.can('intent:close', i.tenantId) || ['confirmed', 'closed'].includes(i.status) || confirmationBusy(i) || i.generating },
|
|
38
|
+
{ key: 'delete', label: '删除意图', danger: true, disabled: !session.can('intent:delete', i.tenantId) },
|
|
39
|
+
];
|
|
40
|
+
}
|
|
41
|
+
function rowAction(action, i) {
|
|
42
|
+
if (action === 'spec') {
|
|
43
|
+
router.push('/intents/' + i.id + '/spec');
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (action === 'detail' || (action === 'edit' && ['draft', 'clarifying'].includes(i.status))) {
|
|
47
|
+
open(i);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (action === 'close') {
|
|
51
|
+
closingId.value = i.id;
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (action === 'delete') {
|
|
55
|
+
deleteTargets.value = [{ id: i.id, name: i.title, recordVersion: i.recordVersion }];
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
selectedId.value = i.id;
|
|
59
|
+
overlay.value = action;
|
|
60
|
+
}
|
|
61
|
+
function replanned() { overlay.value = ''; if (selected.value?.status === 'clarifying')
|
|
62
|
+
open(selected.value); }
|
|
63
|
+
const applied = ref({ keyword: '', context: '' });
|
|
64
|
+
const form = useForm({ keyword: '', context: '' }, [
|
|
65
|
+
{ path: 'keyword', label: '意图名称', component: 'input', placeholder: '搜索名称或编号', span: 12, xs: 24, md: 12 },
|
|
66
|
+
{ path: 'context', label: 'PBC 归属', component: 'select', placeholder: '全部归属', options: contexts.map(value => ({ label: value, value })), span: 12, xs: 24, md: 12 },
|
|
67
|
+
]);
|
|
68
|
+
watch(() => store.items.map(i => affiliationOf(i)), values => { const field = form.fields.value.find(f => f.path === 'context'); if (field && field.component === 'select')
|
|
69
|
+
field.options = Array.from(new Map(values.map(v => [v.key, { label: v.label, value: v.key }])).values()); }, { immediate: true, deep: true });
|
|
70
|
+
const visible = computed(() => store.scene === 'empty' ? [] : store.items.filter(i => (scope.value !== 'mine' || i.createdById === session.actor.id) && (tab.value === 'all' || i.status === tab.value) &&
|
|
71
|
+
(!applied.value.context || affiliationOf(i).key === applied.value.context) && (!applied.value.keyword.trim() || (i.title + i.code).toLowerCase().includes(applied.value.keyword.trim().toLowerCase())))
|
|
72
|
+
.sort((a, b) => sort.value === 'name' ? a.title.localeCompare(b.title, 'zh-CN') : ((sort.value === 'created' ? b.createdAt : b.updatedAt).localeCompare(sort.value === 'created' ? a.createdAt : a.updatedAt) || a.id.localeCompare(b.id))));
|
|
73
|
+
const tabs = computed(() => [{ key: 'all', label: '全部状态' }, ...Object.entries(statusMeta).map(([key, meta]) => ({ key, label: meta.label }))]);
|
|
74
|
+
function open(i) { router.push('/intents/' + i.id + (['draft', 'clarifying'].includes(i.status) ? '/workspace' : '')); }
|
|
75
|
+
const render = (f) => (_, i) => f(i);
|
|
76
|
+
const prefs = useColumns('intents', [
|
|
77
|
+
{ key: 'title', label: '意图', locked: true }, { key: 'status', label: '状态', defaultVisible: true }, { key: 'context', label: 'PBC 归属', defaultVisible: true },
|
|
78
|
+
{ key: 'version', label: '澄清 / 版本', defaultVisible: true }, { key: 'createdBy', label: '创建人', defaultVisible: true }, { key: 'createdAt', label: '创建时间', defaultVisible: true },
|
|
79
|
+
{ key: 'createdDept', label: '创建部门' }, { key: 'tenant', label: '所属租户' }, { key: 'updatedBy', label: '修改人' }, { key: 'updatedAt', label: '修改时间' }, { key: 'actions', label: '操作', locked: true },
|
|
80
|
+
]);
|
|
81
|
+
const table = useTable({ pageParam: { current: 1, pageSize: 10, total: 0 }, columns: [
|
|
82
|
+
{ title: '意图', key: 'title', dataIndex: 'title', width: 300, render: render(i => h('div', { class: 'model-name-cell' }, [h('button', { class: 'text-button model-link', onClick: () => open(i) }, i.title), h('span', { class: 'mono muted' }, i.code)])) },
|
|
83
|
+
{ title: '状态', key: 'status', width: 120, render: render(i => h(Tag, { color: confirmationBusy(i) ? 'orange' : statusMeta[i.status].color, bordered: false }, () => confirmationBusy(i) ? '确认待核实' : statusMeta[i.status].label)) },
|
|
84
|
+
{ title: 'PBC 归属', key: 'context', width: 240, render: render(i => h('span', affiliationOf(i).label)) },
|
|
85
|
+
{ title: '澄清 / 版本', key: 'version', width: 130, render: render(i => h('span', { class: 'muted' }, i.versions.length ? '意图 v' + lastVersion(i)?.number : questionKeys.filter(q => i.answers[q].trim()).length + ' / 4 项已补充')) },
|
|
86
|
+
{ title: '创建人', key: 'createdBy', dataIndex: 'createdBy', width: 100 },
|
|
87
|
+
{ title: '创建时间', key: 'createdAt', dataIndex: 'createdAt', width: 180, render: (v) => dateText(String(v)) },
|
|
88
|
+
{ title: '创建部门', key: 'createdDept', dataIndex: 'createdDept', width: 140 },
|
|
89
|
+
{ title: '所属租户', key: 'tenant', dataIndex: 'tenantId', width: 140, render: (v) => tenantLabel(String(v)) },
|
|
90
|
+
{ title: '修改人', key: 'updatedBy', dataIndex: 'updatedBy', width: 100 },
|
|
91
|
+
{ title: '修改时间', key: 'updatedAt', dataIndex: 'updatedAt', width: 180, render: (v) => dateText(String(v)) },
|
|
92
|
+
{ title: '操作', key: 'actions', width: 190, fixed: 'right', render: render(i => h('div', { class: 'row-actions' }, [
|
|
93
|
+
h(Button, { type: 'text', class: 'link-button', onClick: () => open(i) }, () => ['draft', 'clarifying'].includes(i.status) && store.canEdit ? '继续完善' : '查看详情'),
|
|
94
|
+
h(ListMore, { name: i.title, items: menuItems(i), onAction: (action) => rowAction(action, i) }),
|
|
95
|
+
])) },
|
|
96
|
+
] });
|
|
97
|
+
const selection = useListSelection(table.dataSource, computed(() => JSON.stringify([applied.value, tab.value, scope.value, sort.value, session.key, store.scene, table.pageParam.current, table.pageParam.pageSize])), computed(() => session.can('intent:delete')), i => i.title);
|
|
98
|
+
function batchDelete() { deleteTargets.value = selection.selected.value.map(i => ({ id: i.id, name: i.title, recordVersion: i.recordVersion })); }
|
|
99
|
+
function deleted() { deleteTargets.value = []; selection.clear(); }
|
|
100
|
+
const catalog = new Map(table.columns.value.map(c => [c.key, c]));
|
|
101
|
+
watch(prefs.keys, keys => { table.columns.value = keys.map(k => catalog.get(k)).filter(Boolean); }, { immediate: true });
|
|
102
|
+
watch([visible, () => table.pageParam.current, () => table.pageParam.pageSize], () => {
|
|
103
|
+
const size = table.pageParam.pageSize || 10, max = Math.max(1, Math.ceil(visible.value.length / size));
|
|
104
|
+
if ((table.pageParam.current || 1) > max)
|
|
105
|
+
table.setPageParam({ current: max });
|
|
106
|
+
const start = ((table.pageParam.current || 1) - 1) * size;
|
|
107
|
+
table.dataSource.value = visible.value.slice(start, start + size);
|
|
108
|
+
table.setPageParam({ total: visible.value.length });
|
|
109
|
+
}, { immediate: true });
|
|
110
|
+
function search() { applied.value = { keyword: form.formData.keyword || '', context: form.formData.context || '' }; table.setPageParam({ current: 1 }); }
|
|
111
|
+
function reset() { form.setFormData({ keyword: '', context: '' }); tab.value = 'all'; scope.value = 'visible'; search(); }
|
|
112
|
+
async function refresh() { selection.clear(); loading.value = true; await new Promise(r => setTimeout(r, 300)); loading.value = false; }
|
|
113
|
+
function retry() { store.scene = 'normal'; refresh(); }
|
|
114
|
+
onMounted(refresh);
|
|
115
|
+
return { useDeliveryView, affiliationOf, computed, ref, watch, onMounted, h, useRouter, Alert, Button, Empty, Result, Tabs, Tag, Select, PlusOutlined, ReloadOutlined, ProForm, ProTable, useForm, useTable, useIntents, useSession, tenantLabel, useColumns, ColumnSettings, useListSelection, ListBatchBar, ListDeleteDialog, ListMore, IntentHistory, IntentRevision, IntentReplan, IntentClose, contexts, statusMeta, dateText, lastVersion, questionKeys, confirmationBusy, store, session, router, tab, loading, scope, sort, closingId, closing, selectedId, overlay, selected, deleteTargets, menuItems, rowAction, replanned, applied, form, visible, tabs, open, render, prefs, table, selection, batchDelete, deleted, catalog, search, reset, refresh, retry };
|
|
116
|
+
} });
|
package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentReplan.html
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
<!-- 来源:src/intents/IntentReplan.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
|
|
2
|
+
<template data-component="Modal" data-bind-open="(true)" title="重新规划" data-bind-width="(600)" ok-text="返回澄清" cancel-text="取消" data-bind-mask="({ closable: false })" data-bind-ok-button-props="({ disabled: !store.canEdit })" data-on-cancel="(emit('close'))" data-on-ok="(save)"><template data-component="Alert" class="form-intro" type="info" show-icon="" title="保留当前意图和确认记录" description="仅清空选中的澄清回答,其他内容保留。补充后再整理为新版本并确认。"></template><template data-component="ProForm" name="intent-replan" data-bind-form="(form)" layout="vertical" data-bind-disabled="(!store.canEdit)"></template></template>
|