@givolt/i3-composer-agent 2.2.3 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/plugins/marketplace.json +1 -1
- package/.claude/commands/i3-prototype.md +23 -0
- package/.claude/commands/i3-review.md +1 -1
- package/.claude/commands/i3-ship.md +1 -1
- 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-prototype.toml +23 -0
- package/.gemini/commands/i3-review.toml +1 -1
- package/.gemini/commands/i3-ship.toml +1 -1
- package/README.md +15 -5
- package/agents/code-reviewer.md +1 -1
- package/agents/test-engineer.md +1 -1
- package/bin/native-layout.cjs +2 -0
- package/commands/i3-prototype.toml +23 -0
- package/commands/i3-review.toml +1 -1
- package/commands/i3-ship.toml +1 -1
- package/docs/agents.md +2 -2
- package/docs/codebuddy-setup.md +2 -2
- package/docs/codex-setup.md +1 -1
- package/docs/copilot-setup.md +4 -0
- package/docs/cursor-setup.md +3 -0
- package/docs/other-hosts.md +44 -9
- package/docs/workbuddy-setup.md +2 -2
- package/evals/README.md +2 -0
- package/evals/cases/i3-documentation-and-adrs.json +18 -0
- package/evals/cases/i3-test-driven-development.json +8 -0
- package/evals/cases/i3-ui-prototype.json +49 -0
- package/evals/fixtures/i3-documentation-and-adrs/prose-review/README.md +19 -0
- package/evals/fixtures/i3-documentation-and-adrs/prose-review/queue.js +32 -0
- package/evals/fixtures/i3-ui-prototype/business-brief.md +7 -0
- package/evals/plugin/tdd-fires-on-pasted-bug/graders/failing-test-first.md +7 -0
- package/evals/plugin/tdd-fires-on-pasted-bug/graders/skill-fired.md +5 -0
- package/evals/plugin/tdd-fires-on-pasted-bug/prompt.md +15 -0
- package/evals/plugin/tdd-stays-quiet-on-debug/graders/not-fired.md +8 -0
- package/evals/plugin/tdd-stays-quiet-on-debug/prompt.md +25 -0
- package/evals/zh-CN/cases/i3-documentation-and-adrs.json +19 -0
- package/evals/zh-CN/cases/i3-test-driven-development.json +4 -0
- package/evals/zh-CN/cases/i3-ui-prototype.json +50 -0
- package/hooks/SIMPLIFY-IGNORE.md +3 -2
- package/hooks/simplify-ignore-test.sh +93 -1
- package/hooks/simplify-ignore.sh +94 -11
- package/package.json +27 -1
- package/plugin.json +1 -1
- package/references/performance-checklist.md +4 -2
- package/scripts/enterprise-template-test.js +139 -0
- package/scripts/lib/skill-lint-test.js +113 -1
- package/scripts/lib/skill-lint.js +62 -8
- package/scripts/run-evals-test.js +207 -0
- package/scripts/run-evals.js +47 -9
- package/scripts/template-adapter-test.js +155 -0
- package/scripts/ui-prototype-test.js +114 -0
- package/scripts/validate-commands-test.js +30 -0
- package/scripts/validate-commands.js +6 -16
- package/scripts/validate-reference-links-test.js +18 -0
- package/scripts/validate-reference-links.js +4 -2
- package/scripts/validate-skills.js +26 -3
- package/skills/i3-documentation-and-adrs/SKILL.md +9 -0
- package/skills/i3-frontend-ui-engineering/SKILL.md +5 -1
- package/skills/i3-idea-refine/SKILL.md +20 -5
- package/skills/i3-incremental-implementation/SKILL.md +4 -0
- package/skills/i3-performance-optimization/SKILL.md +10 -10
- package/skills/i3-security-and-hardening/references/hardening-patterns.md +1 -1
- package/skills/i3-shipping-and-launch/SKILL.md +6 -0
- package/skills/i3-test-driven-development/SKILL.md +3 -3
- package/skills/i3-ui-prototype/SKILL.md +119 -0
- package/skills/i3-ui-prototype/assets/templates/catalog.json +147 -0
- package/skills/i3-ui-prototype/assets/templates/classic-admin/manifest.json +9 -0
- package/skills/i3-ui-prototype/assets/templates/classic-admin/preset.json +6 -0
- package/skills/i3-ui-prototype/assets/templates/common/app/app.mjs +89 -0
- package/skills/i3-ui-prototype/assets/templates/common/app/config.json +1 -0
- package/skills/i3-ui-prototype/assets/templates/common/app/domain.mjs +20 -0
- package/skills/i3-ui-prototype/assets/templates/common/app/index.html +17 -0
- package/skills/i3-ui-prototype/assets/templates/common/app/serve.cjs +16 -0
- package/skills/i3-ui-prototype/assets/templates/common/app/styles.css +670 -0
- package/skills/i3-ui-prototype/assets/templates/common/app/tokens.css +19 -0
- package/skills/i3-ui-prototype/assets/templates/common/design-system/master.md +20 -0
- package/skills/i3-ui-prototype/assets/templates/common/gallery.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/common/mocks/applications.json +5 -0
- package/skills/i3-ui-prototype/assets/templates/common/requirements-map.json +8 -0
- package/skills/i3-ui-prototype/assets/templates/common/serve-gallery.cjs +16 -0
- package/skills/i3-ui-prototype/assets/templates/credits.md +17 -0
- package/skills/i3-ui-prototype/assets/templates/data-operations/manifest.json +9 -0
- package/skills/i3-ui-prototype/assets/templates/data-operations/preset.json +6 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/design-system.md +32 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/index.html +29 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/manifest.json +9 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/origin.json +344 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/preset.json +928 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/app.js +22 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/empty.svg +1 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/reference-styles.json +1 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/result-403.svg +1 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/result-404.svg +1 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets-manifest.json +334 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/baseline.json +173 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/conversion.md +30 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/credits.md +17 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/design-tokens.json +881 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/index.html +28 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/licenses/@qin-ui-antdv-next-pro.txt +9 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/licenses/ant-design-icons.txt +22 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/licenses/antdv-next.txt +21 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/package.json +12 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/browser-routes.json +298 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/coverage.json +180 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/integrity.json +13 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/keyboard.json +11 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/responsive.json +125 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/review.md +51 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/rules.log +150 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/flow-editor-html.png +0 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/flow-editor-original.png +0 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/intent-create-html.png +0 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/intent-create-original.png +0 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/models-html.png +0 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/models-original.png +0 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/workbench-html.png +0 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/workbench-original.png +0 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/selection.json +9 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/visual-comparison.json +342 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/readme.md +73 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/reference.md +59 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/routes.json +178 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/controls.js +99 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/dialogs.js +54 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/dom.js +264 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/forms.js +47 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/icons.js +41 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/layout.js +47 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/router.js +63 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/state.js +90 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/table.js +41 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/widgets.js +8 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentDetail.html +3 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentDetail.js +36 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentEditor.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentEditor.js +51 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentsPage.html +3 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentsPage.js +48 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/CheckResults.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/CheckResults.js +6 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/ResourcePicker.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/ResourcePicker.js +13 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/data.js +24 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/domain.js +32 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/registry.js +25 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/store.js +85 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentClose.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentClose.js +17 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentCreate.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentCreate.js +66 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDecisions.html +3 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDecisions.js +38 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDetail.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDetail.js +66 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDocument.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDocument.js +5 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHeader.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHeader.js +12 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHistory.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHistory.js +11 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentList.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentList.js +116 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentReplan.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentReplan.js +32 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentRevision.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentRevision.js +49 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentSummary.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentSummary.js +10 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentWorkspace.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentWorkspace.js +77 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/data.js +60 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/domain.js +105 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/store.js +212 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/AuditPanel.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/AuditPanel.js +18 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelDetail.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelDetail.js +23 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelEditor.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelEditor.js +78 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelGrant.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelGrant.js +55 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelReferences.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelReferences.js +26 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelRelease.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelRelease.js +38 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelStatus.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelStatus.js +7 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTable.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTable.js +72 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTester.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTester.js +46 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelsPage.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelsPage.js +52 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/RowActions.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/RowActions.js +19 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/UsagePanel.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/UsagePanel.js +30 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/data.js +48 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/domain.js +39 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/store.js +129 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IncidentDetail.html +4 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IncidentDetail.js +21 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IntentSource.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IntentSource.js +8 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationActionDialog.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationActionDialog.js +37 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationEntry.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationEntry.js +10 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationsPage.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationsPage.js +37 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RepairTrack.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RepairTrack.js +49 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RunDetail.html +4 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RunDetail.js +22 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/SourceSummary.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/SourceSummary.js +9 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/commands.js +82 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/examples.js +47 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/model.js +61 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/repair.js +68 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/store.js +55 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/types.js +1 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/workbench.js +18 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ManagementTable.html +3 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ManagementTable.js +28 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcCreateEntry.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcCreateEntry.js +18 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcDetail.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcDetail.js +31 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcEditor.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcEditor.js +27 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcLifecycle.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcLifecycle.js +16 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPage.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPage.js +43 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPicker.html +4 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPicker.js +34 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcProgress.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcProgress.js +30 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWizard.html +3 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWizard.js +67 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWorkspace.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWorkspace.js +41 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcsPage.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcsPage.js +31 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceEditor.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceEditor.js +26 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceList.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceList.js +70 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/data.js +8 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/domain.js +62 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/management.js +36 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/managementStore.js +49 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/store.js +132 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/AdminList.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/AdminList.js +38 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/EffectiveGrants.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/EffectiveGrants.js +11 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/GrantEditor.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/GrantEditor.js +45 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MemberEditor.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MemberEditor.js +54 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MembersPage.html +3 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MembersPage.js +27 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RecordsPage.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RecordsPage.js +12 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RoleEditor.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RoleEditor.js +45 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RolesPage.html +3 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RolesPage.js +38 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/domain.js +61 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/state.js +51 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/store.js +116 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseActionDialog.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseActionDialog.js +45 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseDetail.html +4 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseDetail.js +30 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseEditor.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseEditor.js +67 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseExecution.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseExecution.js +5 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleasesPage.html +4 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleasesPage.js +60 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/commands.js +157 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/model.js +136 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/store.js +76 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewDetail.html +3 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewDetail.js +26 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewEvidence.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewEvidence.js +14 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewProcess.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewProcess.js +113 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewsPage.html +3 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewsPage.js +62 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/commands.js +97 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/model.js +147 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/store.js +13 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ColumnSettings.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ColumnSettings.js +9 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListBatchBar.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListBatchBar.js +8 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListDeleteDialog.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListDeleteDialog.js +37 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListMore.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListMore.js +8 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/RecordMetadata.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/RecordMetadata.js +17 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/columns.js +32 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/deliveryGuide.js +49 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/deliveryView.js +12 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/listBatch.js +15 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/listSelection.js +37 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/policy.js +68 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/session.js +44 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConfirmationDialog.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConfirmationDialog.js +25 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConsoleShell.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConsoleShell.js +53 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/PrototypeGuide.html +10 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/PrototypeGuide.js +30 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ScopePage.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ScopePage.js +10 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/SessionDialog.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/SessionDialog.js +9 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/confirmation.js +3 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/navigation.js +19 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecDocument.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecDocument.js +8 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecEdit.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecEdit.js +32 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHeader.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHeader.js +15 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHistory.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHistory.js +11 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecReview.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecReview.js +57 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecWorkspace.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecWorkspace.js +37 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/data.js +20 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/domain.js +55 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/store.js +151 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/ArtifactDetail.html +3 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/ArtifactDetail.js +18 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskCreate.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskCreate.js +40 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskDetail.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskDetail.js +51 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskLaunch.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskLaunch.js +9 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TasksPage.html +5 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TasksPage.js +48 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/domain.js +204 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/exampleSource.js +22 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/registry.js +135 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/store.js +137 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/WorkbenchPage.html +3 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/WorkbenchPage.js +36 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/model.js +56 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/store.js +15 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowCanvas.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowCanvas.js +27 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowDetail.html +4 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowDetail.js +31 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowEditor.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowEditor.js +68 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/WorkflowsPage.html +5 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/WorkflowsPage.js +55 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/data.js +16 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/domain.js +83 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/registry.js +18 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/store.js +61 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/admin.css +60 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/agents.css +46 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/antdv.css +295 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/app.css +102 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/delivery.css +4 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/intents.css +37 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/native.css +22 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/operations.css +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/pbc.css +3 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/permissions.css +22 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/pro.css +1 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/releases.css +4 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/reset.css +246 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/reviews.css +8 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/tasks.css +6 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/tokens.css +15 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/workbench.css +61 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/workflows.css +1 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/admin-rules.test.js +96 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/agents.test.js +14 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/intent-state.test.js +37 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/list-batch.test.js +44 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/operation-fixtures.js +19 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/operation-repair.test.js +14 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/operations.test.js +25 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/pbc-management.test.js +17 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/pbc-state.test.js +24 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/permission-config.test.js +23 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/permissions.test.js +24 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/releases.test.js +50 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/reviews.test.js +36 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/runtime-forms-router.test.js +28 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/runtime-state.test.js +42 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/runtime-stores.test.js +16 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/spec-state.test.js +11 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/tasks.test.js +27 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/workbench.test.js +34 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/workflows.test.js +16 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/convert.mjs +168 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/serve.mjs +7 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/styles.mjs +11 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/verify.mjs +24 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/serve.cjs +16 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/usability.css +44 -0
- package/skills/i3-ui-prototype/assets/templates/gallery/index.html +40 -0
- package/skills/i3-ui-prototype/assets/templates/modern-workspace/manifest.json +9 -0
- package/skills/i3-ui-prototype/assets/templates/modern-workspace/preset.json +6 -0
- package/skills/i3-ui-prototype/assets/templates/serve-gallery.cjs +16 -0
- package/skills/i3-ui-prototype/references/artifact-contract.md +41 -0
- package/skills/i3-ui-prototype/references/enterprise-admin.md +38 -0
- package/skills/i3-ui-prototype/references/expert-adapter.md +42 -0
- package/skills/i3-ui-prototype/references/template-adapters.md +57 -0
- package/skills/i3-ui-prototype/references/workflow-contract.md +19 -0
- package/skills/i3-ui-prototype/scripts/adapters/easel-html.cjs +30 -0
- package/skills/i3-ui-prototype/scripts/adapters/legacy-html.cjs +28 -0
- package/skills/i3-ui-prototype/scripts/check-design-provider.cjs +9 -0
- package/skills/i3-ui-prototype/scripts/check-prototype.cjs +14 -0
- package/skills/i3-ui-prototype/scripts/enterprise-template.cjs +88 -0
- package/skills/i3-ui-prototype/scripts/init-prototype.cjs +8 -0
- package/skills/i3-ui-prototype/scripts/manage-baseline.cjs +11 -0
- package/skills/i3-ui-prototype/scripts/prototype-lib.cjs +255 -0
- package/skills/i3-ui-prototype/scripts/template-adapters.cjs +89 -0
- package/skills/i3-using-agent-skills/SKILL.md +5 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { computed, onMounted, onUpdated, ref, watch } from '../../runtime/state.js';
|
|
2
|
+
import { defineComponent, h } from '../../runtime/dom.js';
|
|
3
|
+
// The installed Checkbox puts aria attributes on its wrapper; label the native input.
|
|
4
|
+
const SelectionLabel = defineComponent({
|
|
5
|
+
props: { node: { type: Object, required: true }, label: { type: String, required: true } },
|
|
6
|
+
setup(props) {
|
|
7
|
+
const element = ref();
|
|
8
|
+
const labelInput = () => element.value?.querySelector('input[type="checkbox"],input[type="radio"]')?.setAttribute('aria-label', props.label);
|
|
9
|
+
onMounted(labelInput);
|
|
10
|
+
onUpdated(labelInput);
|
|
11
|
+
return () => h('span', { ref: element }, [props.node]);
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
export const labeledSelection = (node, label) => h(SelectionLabel, { node: node, label });
|
|
15
|
+
export function useListSelection(rows, scope, allowed, name) {
|
|
16
|
+
const keys = ref([]);
|
|
17
|
+
const checkboxLabel = (node, label) => h(SelectionLabel, { node: node, label });
|
|
18
|
+
const clear = () => { keys.value = []; };
|
|
19
|
+
watch(scope, clear, { flush: 'sync' });
|
|
20
|
+
watch(allowed, clear, { flush: 'sync' });
|
|
21
|
+
watch(() => rows.value.map(r => r.id).join('|'), clear, { flush: 'sync' });
|
|
22
|
+
const selected = computed(() => rows.value.filter(r => keys.value.includes(r.id)));
|
|
23
|
+
const rowSelection = computed(() => ({
|
|
24
|
+
selectedRowKeys: keys.value, columnWidth: 48,
|
|
25
|
+
columnTitle: (node) => checkboxLabel(node, '全选当前页'),
|
|
26
|
+
renderCell: (_checked, record, _index, node) => {
|
|
27
|
+
const row = rows.value.find(r => r.id === record.id);
|
|
28
|
+
return checkboxLabel(node, '选择' + (row ? name(row) : '记录'));
|
|
29
|
+
},
|
|
30
|
+
onChange: (values) => { keys.value = allowed.value ? values.map(String).filter(id => rows.value.some(r => r.id === id)) : []; },
|
|
31
|
+
getCheckboxProps: (record) => {
|
|
32
|
+
const row = rows.value.find(r => r.id === record.id);
|
|
33
|
+
return { disabled: !allowed.value || !row };
|
|
34
|
+
},
|
|
35
|
+
}));
|
|
36
|
+
return { keys, selected, rowSelection, clear };
|
|
37
|
+
}
|
package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/policy.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
const actorSeeds = [
|
|
2
|
+
{ id: 'chen', name: '陈敏', role: 'platform', tenantId: 'platform', department: '平台技术部', label: '平台管理员' },
|
|
3
|
+
{ id: 'wang', name: '王睿', role: 'reviewer', tenantId: 'platform', department: '平台技术部', label: '配置审核员' },
|
|
4
|
+
{ id: 'lin', name: '林晓', role: 'pm', tenantId: 'heating', department: '供热产品部', label: '产品负责人' },
|
|
5
|
+
{ id: 'zhou', name: '周晨', role: 'engineer', tenantId: 'heating', department: '供热研发部', label: 'AI 工程师' },
|
|
6
|
+
{ id: 'liu', name: '刘宁', role: 'viewer', tenantId: 'heating', department: '供热运营部', label: '只读成员' },
|
|
7
|
+
{ id: 'zhao', name: '赵云', role: 'other', tenantId: 'north', department: '能源产品部', label: '北方能源 · 产品负责人' },
|
|
8
|
+
{ id: 'guest', name: '访客', role: 'none', tenantId: 'heating', department: '访客', label: '无业务权限成员' },
|
|
9
|
+
];
|
|
10
|
+
const templates = {
|
|
11
|
+
platform: ['model:view', 'model:edit', 'model:test', 'model:grant', 'model:status', 'model:delete', 'model:audit', 'intent:view', 'intent:edit', 'intent:delete'],
|
|
12
|
+
reviewer: ['model:view', 'model:publish', 'model:audit', 'intent:view'],
|
|
13
|
+
pm: ['model:view', 'intent:view', 'intent:edit', 'intent:confirm', 'intent:close', 'intent:delete'],
|
|
14
|
+
engineer: ['model:view', 'intent:view', 'intent:edit'], viewer: ['model:view', 'intent:view'],
|
|
15
|
+
other: ['model:view', 'intent:view', 'intent:edit', 'intent:confirm', 'intent:close', 'intent:delete'], none: [],
|
|
16
|
+
};
|
|
17
|
+
export const actionGroups = [
|
|
18
|
+
{ name: '意图', items: [{ value: 'intent:view', label: '查看意图' }, { value: 'intent:edit', label: '创建/修改意图' }, { value: 'intent:confirm', label: '确认意图' }, { value: 'intent:close', label: '关闭意图' }, { value: 'intent:delete', label: '删除意图' }] },
|
|
19
|
+
{ name: '规格', items: [{ value: 'spec:view', label: '查看规格' }, { value: 'spec:generate', label: '生成规格' }, { value: 'spec:edit', label: '修改/重新规划' }, { value: 'spec:confirm', label: '确认规格' }] },
|
|
20
|
+
{ name: 'PBC', items: [{ value: 'pbc:view', label: '查看 PBC' }, { value: 'pbc:link', label: '关联已有 PBC' }, { value: 'pbc:create', label: '创建 PBC' }] },
|
|
21
|
+
{ name: '模型', items: [{ value: 'model:view', label: '查看模型' }, { value: 'model:edit', label: '接入/编辑模型' }, { value: 'model:test', label: '测试模型' }, { value: 'model:grant', label: '模型使用授权' }, { value: 'model:publish', label: '发布模型配置' }, { value: 'model:status', label: '启停模型' }, { value: 'model:delete', label: '删除模型' }, { value: 'model:audit', label: '模型审计' }] },
|
|
22
|
+
];
|
|
23
|
+
actionGroups.push({ name: '权限管理', items: [{ value: 'permission:view', label: '查看角色与成员' }, { value: 'permission:roles', label: '维护角色' }, { value: 'permission:grant', label: '配置角色权限' }, { value: 'permission:members', label: '维护成员授权' }, { value: 'permission:delete', label: '删除角色与成员关联' }, { value: 'permission:audit', label: '查看授权记录' }, { value: 'permission:delegate', label: '转授权限管理能力' }] });
|
|
24
|
+
actionGroups.push({ name: 'Agent 注册表', items: [{ value: 'agent:view', label: '查看 Agent' }, { value: 'agent:edit', label: '创建/编辑 Agent' }, { value: 'agent:check', label: '检查 Agent 配置' }, { value: 'agent:status', label: '启停 Agent' }, { value: 'agent:delete', label: '删除 Agent' }, { value: 'agent:audit', label: '查看 Agent 记录' }] });
|
|
25
|
+
templates.platform.push(...actionGroups.at(-1).items.map(i => i.value), 'pbc:view');
|
|
26
|
+
templates.engineer.push('agent:view', 'agent:edit', 'agent:check', 'pbc:view');
|
|
27
|
+
templates.viewer.push('agent:view', 'pbc:view');
|
|
28
|
+
templates.other.push('agent:view', 'pbc:view');
|
|
29
|
+
actionGroups.push({ name: '流程模板', items: [{ value: 'workflow:view', label: '查看流程模板' }, { value: 'workflow:edit', label: '创建/编辑模板' }, { value: 'workflow:use', label: '选择交付模板' }, { value: 'workflow:publish', label: '审核发布模板' }, { value: 'workflow:status', label: '启停模板' }, { value: 'workflow:delete', label: '删除模板' }, { value: 'workflow:audit', label: '查看流程记录' }, { value: 'workflow:approve', label: '交付人工确认' }] });
|
|
30
|
+
templates.platform.push('workflow:view', 'workflow:edit', 'workflow:use', 'workflow:status', 'workflow:delete', 'workflow:audit', 'workflow:approve');
|
|
31
|
+
templates.reviewer.push('workflow:view', 'workflow:publish', 'workflow:audit', 'agent:view', 'pbc:view');
|
|
32
|
+
templates.engineer.push('workflow:view', 'workflow:edit', 'workflow:use');
|
|
33
|
+
templates.viewer.push('workflow:view');
|
|
34
|
+
templates.other.push('workflow:view');
|
|
35
|
+
actionGroups.push({ name: '交付任务与产物', items: [{ value: 'task:view', label: '查看交付任务' }, { value: 'task:create', label: '创建交付任务' }, { value: 'task:edit', label: '修改交付草稿' }, { value: 'task:operate', label: '启动/暂停/恢复/处理任务' }, { value: 'task:takeover', label: '人工接管任务' }, { value: 'task:delete', label: '删除交付草稿' }, { value: 'task:audit', label: '查看交付记录' }, { value: 'artifact:view', label: '查看交付产物' }] });
|
|
36
|
+
templates.platform.push(...actionGroups.at(-1).items.map(i => i.value), 'spec:view');
|
|
37
|
+
templates.engineer.push('task:view', 'task:create', 'task:edit', 'task:operate', 'task:takeover', 'task:delete', 'task:audit', 'artifact:view', 'spec:view');
|
|
38
|
+
templates.reviewer.push('task:view', 'task:audit', 'artifact:view', 'spec:view');
|
|
39
|
+
templates.viewer.push('task:view', 'artifact:view');
|
|
40
|
+
templates.other.push('task:view', 'artifact:view');
|
|
41
|
+
actionGroups.find(g => g.name === 'PBC').items.push({ value: 'pbc:edit', label: '修改 PBC 资料' }, { value: 'pbc:archive', label: '归档/恢复 PBC' }, { value: 'pbc:delete', label: '删除 PBC' }, { value: 'pbc:audit', label: '查看 PBC 记录' }, { value: 'pbc:service', label: '维护服务方案' });
|
|
42
|
+
templates.platform.push('pbc:create', 'pbc:link', 'pbc:edit', 'pbc:archive', 'pbc:delete', 'pbc:audit', 'pbc:service');
|
|
43
|
+
templates.engineer.push('pbc:audit');
|
|
44
|
+
actionGroups.push({ name: '质量与人工确认', items: [{ value: 'review:edit', label: '修改评审设计' }, { value: 'review:replan', label: '重新规划交付' }] });
|
|
45
|
+
templates.platform.push('review:edit', 'review:replan');
|
|
46
|
+
templates.engineer.push('review:edit', 'review:replan');
|
|
47
|
+
actionGroups.push({ name: '发布准备与人工放行', items: [{ value: 'release:edit', label: '创建/编辑/检查发布单' }, { value: 'release:delete', label: '删除发布草稿' }, { value: 'release:submit', label: '提交发布审核' }, { value: 'release:approve', label: '人工授权/退回发布' }, { value: 'release:execute', label: '执行/恢复/重试发布' }, { value: 'release:pause', label: '暂停发布' }, { value: 'release:rollback', label: '回滚/停止并撤流' }] });
|
|
48
|
+
templates.platform.push(...actionGroups.at(-1).items.map(i => i.value));
|
|
49
|
+
templates.engineer.push('release:edit', 'release:delete', 'release:submit', 'release:execute', 'release:pause', 'release:rollback');
|
|
50
|
+
actionGroups.push({ name: '运行验收与异常反馈', items: [{ value: 'operation:view', label: '查看运行与异常' }, { value: 'operation:observe', label: '获取观测/诊断证据' }, { value: 'operation:accept', label: '记录运行验收' }, { value: 'operation:triage', label: '异常分诊' }, { value: 'operation:link', label: '关联/创建修复需求' }, { value: 'operation:close', label: '关闭已复核异常' }] });
|
|
51
|
+
templates.platform.push(...actionGroups.at(-1).items.map(i => i.value));
|
|
52
|
+
templates.engineer.push('operation:view', 'operation:observe', 'operation:triage', 'operation:link');
|
|
53
|
+
templates.viewer.push('operation:view');
|
|
54
|
+
export const allActions = actionGroups.flatMap(g => g.items.map(i => i.value));
|
|
55
|
+
export const actors = actorSeeds.map(a => ({ ...a, grants: [{ id: a.id + '-base', name: a.label, actions: [...(templates[a.role] || [])], tenantIds: a.tenantId === 'platform' ? ['*'] : [a.tenantId] }] }));
|
|
56
|
+
actors.push({ id: 'complete', name: '林晓', role: 'delivery', label: '完整授权演示', tenantId: 'heating', department: '供热产品部', grants: [
|
|
57
|
+
{ id: 'delivery', name: '需求与交付', actions: allActions.filter(a => !a.startsWith('model:') && !a.startsWith('permission:')), tenantIds: ['heating'] },
|
|
58
|
+
{ id: 'models', name: '平台模型管理', actions: allActions.filter(a => a.startsWith('model:')), tenantIds: ['platform'] },
|
|
59
|
+
] });
|
|
60
|
+
const matchesScope = (grant, tenantId) => grant.tenantIds.includes('*') || grant.tenantIds.includes(tenantId);
|
|
61
|
+
export const can = (actor, action, tenantId, pbcId, environmentId) => actor.grants.some(g => g.actions.includes(action) && (tenantId === undefined || matchesScope(g, tenantId)) && (!pbcId || !g.pbcIds || g.pbcIds.includes('*') || g.pbcIds.includes(pbcId)) && (!environmentId || !g.environmentIds || g.environmentIds.includes('*') || g.environmentIds.includes(environmentId)));
|
|
62
|
+
export const inScope = (actor, tenantId, action) => actor.grants.some(g => matchesScope(g, tenantId) && (!action || g.actions.includes(action)));
|
|
63
|
+
export const tenants = [{ value: 'heating', label: '供热事业部' }, { value: 'north', label: '北方能源' }];
|
|
64
|
+
export const tenantLabel = (id) => id === 'platform' ? '平台统一管理' : tenants.find(t => t.value === id)?.label || id;
|
|
65
|
+
export function metadata(actor, at, tenantId = actor.tenantId) {
|
|
66
|
+
return { createdById: actor.id, createdBy: actor.name, createdAt: at, createdDept: actor.department, updatedBy: actor.name, updatedAt: at, tenantId, recordVersion: 1, isDeleted: false };
|
|
67
|
+
}
|
|
68
|
+
export const formatDate = (at) => at ? new Date(at).toLocaleString('zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', hour12: false }) : '—';
|
package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/session.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { computed, ref, watch } from '../../runtime/state.js';
|
|
2
|
+
import { defineStore } from "../../runtime/state.js";
|
|
3
|
+
import { authority } from "../permissions/state.js";
|
|
4
|
+
import { resolveActor } from "../permissions/domain.js";
|
|
5
|
+
import { actors, can as check } from "./policy.js";
|
|
6
|
+
// This is a scenario switcher for the isolated prototype, never an auth provider.
|
|
7
|
+
export const useSession = defineStore('session', () => {
|
|
8
|
+
const actorId = ref('chen'), state = ref('active');
|
|
9
|
+
const overrides = ref({}), policyVersion = ref(0);
|
|
10
|
+
try {
|
|
11
|
+
const raw = localStorage.getItem('i3-prototype-antdv-v010-demo-session');
|
|
12
|
+
if (raw) {
|
|
13
|
+
const saved = JSON.parse(raw);
|
|
14
|
+
if (actors.some(a => a.id === saved.actorId))
|
|
15
|
+
actorId.value = saved.actorId;
|
|
16
|
+
if (saved.overrides && typeof saved.overrides === 'object')
|
|
17
|
+
overrides.value = saved.overrides;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
catch { /* Demo settings may be reset safely. */ }
|
|
21
|
+
const nextWrite = ref('success');
|
|
22
|
+
const publishResult = ref('success'), confirmResult = ref('success');
|
|
23
|
+
const actor = computed(() => { const base = actors.find(a => a.id === actorId.value) || actors.at(-1); return resolveActor(base, authority); });
|
|
24
|
+
watch(() => JSON.stringify(actor.value.grants), () => policyVersion.value++, { flush: 'sync' });
|
|
25
|
+
const key = computed(() => actor.value.id + ':' + actor.value.tenantId + ':' + policyVersion.value);
|
|
26
|
+
const can = (action, tenantId, pbcId, environmentId) => state.value === 'active' && check(actor.value, action, tenantId, pbcId, environmentId);
|
|
27
|
+
const readable = (action, tenantId, pbcId, environmentId) => check(actor.value, action, tenantId, pbcId, environmentId);
|
|
28
|
+
function require(action, tenantId, pbcId, environmentId) { if (!can(action, tenantId, pbcId, environmentId))
|
|
29
|
+
throw new Error(state.value === 'active' ? '当前身份没有此操作权限,或资源不在授权范围。' : '登录状态已失效,请重新通过 MaxKey 登录。'); }
|
|
30
|
+
watch([actorId, overrides], () => { try {
|
|
31
|
+
localStorage.setItem('i3-prototype-antdv-v010-demo-session', JSON.stringify({ actorId: actorId.value, overrides: overrides.value }));
|
|
32
|
+
}
|
|
33
|
+
catch { /* This is a local scenario selector, not an authorization service. */ } }, { deep: true });
|
|
34
|
+
function writeCheck() {
|
|
35
|
+
const result = nextWrite.value;
|
|
36
|
+
nextWrite.value = 'success';
|
|
37
|
+
if (result === 'failure')
|
|
38
|
+
throw new Error('保存失败(模拟服务不可用),输入已保留,请重试。');
|
|
39
|
+
if (result === 'conflict')
|
|
40
|
+
throw new Error('记录已被其他人更新(模拟版本冲突),请关闭后重新打开,核对最新内容再提交。');
|
|
41
|
+
}
|
|
42
|
+
function reset() { actorId.value = 'chen'; overrides.value = {}; policyVersion.value++; state.value = 'active'; nextWrite.value = 'success'; publishResult.value = 'success'; confirmResult.value = 'success'; }
|
|
43
|
+
return { actorId, actor, state, key, nextWrite, publishResult, confirmResult, can, readable, require, writeCheck, reset };
|
|
44
|
+
});
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
<!-- 来源:src/shell/ConfirmationDialog.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
|
|
2
|
+
<template data-component="Modal" data-bind-open="(!!confirmation)" data-bind-title="(confirmation?.title)" data-bind-width="(480)" data-bind-mask="({ closable: false })" data-bind-closable="(false)" data-on-cancel="(cancel)"><p>{{ (confirmation?.content) }}</p><template data-slot="footer"><template data-component="Space"><template data-component="Button" data-bind-disabled="(busy)" data-on-click="(cancel)">{{ (confirmation?.cancelText) }}</template><template data-component="Button" type="primary" data-bind-danger="(confirmation?.okButtonProps?.danger)" data-bind-loading="(busy)" data-on-click="(accept)">{{ (confirmation?.okText) }}</template></template></template></template>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { ref } from '../../runtime/state.js';
|
|
2
|
+
import { Modal, Button, Space } from "../../runtime/widgets.js";
|
|
3
|
+
import { confirmation } from "./confirmation.js";
|
|
4
|
+
import { createComponent } from '../../runtime/dom.js';
|
|
5
|
+
export default createComponent({ name: 'ConfirmationDialog', propKeys: [], template: new URL('./ConfirmationDialog.html', import.meta.url).href, setup(__props, __emit) {
|
|
6
|
+
const busy = ref(false);
|
|
7
|
+
function cancel() { if (busy.value)
|
|
8
|
+
return; const current = confirmation.value; confirmation.value = undefined; current?.onCancel?.(); }
|
|
9
|
+
async function accept() {
|
|
10
|
+
const current = confirmation.value;
|
|
11
|
+
if (!current || busy.value)
|
|
12
|
+
return;
|
|
13
|
+
busy.value = true;
|
|
14
|
+
try {
|
|
15
|
+
await current.onOk?.();
|
|
16
|
+
if (confirmation.value === current)
|
|
17
|
+
confirmation.value = undefined;
|
|
18
|
+
}
|
|
19
|
+
catch { /* A rejected action leaves the dialog open; its caller shows the error. */ }
|
|
20
|
+
finally {
|
|
21
|
+
busy.value = false;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return { ref, Modal, Button, Space, confirmation, busy, cancel, accept };
|
|
25
|
+
} });
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
<!-- 来源:src/shell/ConsoleShell.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
|
|
2
|
+
<div class="console-shell" data-bind-class="({ collapsed, 'mobile-open': mobileOpen })" data-on-keydown.esc="(closeNav)"><a class="skip-link" href="#main-content" data-on-click.prevent="(focusMain)">跳到页面内容</a><button data-if="(mobileOpen)" class="nav-scrim" aria-label="关闭导航" data-on-click="(mobileOpen = false)"></button><aside class="sidebar" aria-label="平台导航" data-bind-inert="(navHidden)" data-bind-aria-hidden="(navHidden)"><template data-component="RouterLink" to="/workbench" class="brand" data-on-click="(mobileOpen = false)"><strong>EASEL</strong><span>企业级 AI 软件工程平台</span></template><nav class="navigation"><template data-each="item in (visibleNavigation)" data-bind-key="(item.id)"><button data-if="(item.children)" class="nav-row" data-bind-class="({ 'nav-parent-active': item.children.some(c => c.id === current) })" data-bind-aria-expanded="(expanded[item.id])" data-on-click="(expanded[item.id] = !expanded[item.id])"><template data-component="$dynamic" data-bind-is="(item.icon)"></template><span>{{ (item.label) }}</span><template data-component="UpOutlined" data-if="(expanded[item.id])" class="nav-arrow"></template><template data-component="DownOutlined" data-else="" class="nav-arrow"></template></button><template data-component="RouterLink" data-else="" data-bind-to="(item.id === 'workbench' ? '/workbench' : item.id === 'projects' ? '/pbcs' : item.id === 'tasks' ? '/tasks' : item.id === 'operations' ? '/operations' : item.id === 'release' ? '/releases' : item.id === 'quality' ? '/reviews' : item.id === 'requirements' ? '/intents' : `/module/${item.id}`)" class="nav-row" data-bind-class="({ selected: current === item.id })" data-bind-aria-current="(current === item.id ? 'page' : undefined)" data-on-click="(mobileOpen = false)"><template data-component="$dynamic" data-bind-is="(item.icon)"></template><span>{{ (item.label) }}</span><template data-component="RightOutlined" data-if="(item.id !== 'workbench')" class="nav-arrow"></template></template><template data-if="(item.children && expanded[item.id])"><template data-component="RouterLink" data-each="child in (item.children)" data-bind-key="(child.id)" data-bind-to="(child.id.startsWith('permission-') ? '/permissions/' + child.id.replace('permission-', '') : child.id === 'workflows' ? '/workflows' : child.id === 'agents' ? '/agents' : child.id === 'models' ? '/models' : `/module/${child.id}`)" class="nav-row nav-child" data-bind-class="({ selected: current === child.id })" data-bind-aria-current="(current === child.id ? 'page' : undefined)" data-on-click="(mobileOpen = false)">{{ (child.label) }}</template></template></template></nav><div class="sidebar-footer"><button class="text-button guide-button" data-on-click="(guide = true)"><template data-component="InfoCircleOutlined"></template> 原型说明</button><span>v0.14</span></div></aside><div class="workspace" data-bind-inert="(narrow && mobileOpen)"><header class="topbar"><template data-component="Button" type="text" data-nav-toggle="" data-bind-aria-label="(navHidden ? '展开导航' : '收起导航')" data-bind-aria-expanded="(!navHidden)" data-on-click="(toggleMenu)"><template data-component="MenuUnfoldOutlined" data-if="(collapsed)"></template><template data-component="MenuFoldOutlined" data-else=""></template></template><div class="breadcrumb"><span data-if="(isAi)">AI 编排 <span class="crumb-slash">/</span></span><span>{{ (label) }}</span><span data-if="(subLabel)"><span class="crumb-slash">/</span>{{ (subLabel) }}</span></div><div class="topbar-right"><template data-component="Button" type="text" class="demo-settings-button" data-on-click="(guide = true)">演示设置</template><span class="demo-label">{{ (tenantLabel(session.actor.tenantId)) }} · 演示</span><template data-component="Dropdown" data-bind-menu="(roleMenu)" data-bind-trigger="(['click'])"><button class="profile-button" aria-label="切换演示身份"><template data-component="Avatar" data-bind-size="(30)">{{ (session.actor.name.slice(0, 1)) }}</template><span>{{ (session.actor.name) }} · {{ (session.actor.label) }}</span><template data-component="DownOutlined"></template></button></template></div></header><main id="main-content" tabindex="-1"><div data-show="(canView)" data-bind-inert="(!canView)" data-bind-key="(session.key)"><slot></slot></div><template data-component="Result" data-if="(!canView && session.state === 'active')" status="403" title="没有业务访问权限" sub-title="已登录不代表拥有业务权限。请联系业务管理员分配相应权限;账号和登录设置由 MaxKey 管理。"><template data-slot="extra"><template data-component="Button" data-on-click="(guide = true)">查看权限演示</template></template></template></main><footer class="page-footer"><template data-component="InfoCircleOutlined"></template> 当前为演示环境,配置与测试仅用于交互评审。<button class="text-button" data-on-click="(guide = true)">评审指南</button></footer></div><template data-component="PrototypeGuide" data-bind-open="(guide)" data-on-close="(guide = false)"></template><template data-component="ConfirmationDialog"></template><template data-component="SessionDialog"></template></div>
|
package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConsoleShell.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { computed, ref, onMounted, onBeforeUnmount, nextTick } from '../../runtime/state.js';
|
|
2
|
+
import { useRoute } from "../../runtime/router.js";
|
|
3
|
+
import { Button, Avatar, Dropdown, Result } from "../../runtime/widgets.js";
|
|
4
|
+
import { MenuFoldOutlined, MenuUnfoldOutlined, DownOutlined, UpOutlined, RightOutlined, InfoCircleOutlined } from "../../runtime/icons.js";
|
|
5
|
+
import { navigation, moduleLabel } from "./navigation.js";
|
|
6
|
+
import PrototypeGuide from "./PrototypeGuide.js";
|
|
7
|
+
import ConfirmationDialog from "./ConfirmationDialog.js";
|
|
8
|
+
import { useSession } from "../shared/session.js";
|
|
9
|
+
import { actors, tenantLabel } from "../shared/policy.js";
|
|
10
|
+
import SessionDialog from "./SessionDialog.js";
|
|
11
|
+
import { createComponent } from '../../runtime/dom.js';
|
|
12
|
+
export default createComponent({ name: 'ConsoleShell', propKeys: [], template: new URL('./ConsoleShell.html', import.meta.url).href, setup(__props, __emit) {
|
|
13
|
+
const route = useRoute();
|
|
14
|
+
const session = useSession();
|
|
15
|
+
const visibleNavigation = computed(() => navigation.filter(n => (n.id !== 'operations' || session.can('operation:view')) && (!['quality', 'release'].includes(n.id) || (session.can('task:view') && session.can('artifact:view'))) && (n.id !== 'projects' || session.can('pbc:view')) && (n.id !== 'tasks' || session.can('task:view')) && (n.id !== 'requirements' || session.can('intent:view')) && (n.id !== 'permissions' || session.can('permission:view') || session.can('permission:audit'))).map(n => n.children ? ({ ...n, children: n.children.filter(c => (c.id !== 'models' || session.can('model:view')) && (c.id !== 'agents' || session.can('agent:view')) && (c.id !== 'workflows' || session.can('workflow:view')) && (c.id !== 'permission-records' || session.can('permission:audit')) && (!['permission-roles', 'permission-members'].includes(c.id) || session.can('permission:view'))) }) : n));
|
|
16
|
+
const canView = computed(() => route.path === '/workbench' ? session.state === 'active' : (route.path.startsWith('/reviews') || route.path.startsWith('/releases')) ? (session.can('task:view') && session.can('artifact:view')) : session.can(route.path.startsWith('/operations') ? 'operation:view' : route.path.startsWith('/pbcs') ? 'pbc:view' : route.path.startsWith('/tasks') ? 'task:view' : route.path.startsWith('/workflows') ? 'workflow:view' : route.path.startsWith('/agents') ? 'agent:view' : route.path.startsWith('/permissions') ? (route.path.endsWith('/records') ? 'permission:audit' : 'permission:view') : route.path.startsWith('/models') ? 'model:view' : route.path.endsWith('/pbc') ? 'pbc:view' : route.path.includes('/spec') ? 'spec:view' : 'intent:view'));
|
|
17
|
+
const expanded = ref({ ai: true, permissions: true });
|
|
18
|
+
const collapsed = ref(false), mobileOpen = ref(false), guide = ref(false);
|
|
19
|
+
const narrow = ref(window.innerWidth < 900);
|
|
20
|
+
const navHidden = computed(() => narrow.value ? !mobileOpen.value : collapsed.value);
|
|
21
|
+
function onResize() { narrow.value = window.innerWidth < 900; if (!narrow.value)
|
|
22
|
+
mobileOpen.value = false; }
|
|
23
|
+
function onKeydown(event) { if (event.key === 'Escape')
|
|
24
|
+
closeNav(); }
|
|
25
|
+
onMounted(() => { window.addEventListener('resize', onResize); window.addEventListener('keydown', onKeydown); });
|
|
26
|
+
onBeforeUnmount(() => { window.removeEventListener('resize', onResize); window.removeEventListener('keydown', onKeydown); });
|
|
27
|
+
function focusMain() { document.getElementById('main-content')?.focus(); }
|
|
28
|
+
function closeNav() { if (mobileOpen.value) {
|
|
29
|
+
mobileOpen.value = false;
|
|
30
|
+
nextTick(() => document.querySelector('[data-nav-toggle]')?.focus());
|
|
31
|
+
} }
|
|
32
|
+
const isIntent = computed(() => route.path.startsWith('/intents'));
|
|
33
|
+
const current = computed(() => route.path === '/workbench' ? 'workbench' : route.path.startsWith('/operations') ? 'operations' : route.path.startsWith('/releases') ? 'release' : route.path.startsWith('/reviews') ? 'quality' : route.path.startsWith('/pbcs') ? 'projects' : route.path.startsWith('/tasks') ? 'tasks' : route.path.startsWith('/workflows') ? 'workflows' : route.path.startsWith('/agents') ? 'agents' : route.path.startsWith('/permissions/') ? 'permission-' + route.path.split('/').at(-1) : isIntent.value ? 'requirements' : route.path === '/models' ? 'models' : String(route.params.id));
|
|
34
|
+
const isAi = computed(() => navigation.find(n => n.id === 'ai').children.some(n => n.id === current.value));
|
|
35
|
+
const label = computed(() => moduleLabel(current.value));
|
|
36
|
+
const subLabel = computed(() => route.path.endsWith('/pbc') ? 'PBC 归属' : route.path.includes('/spec') ? '需求规格' : route.path === '/intents/new' ? '发起需求' : route.path.endsWith('/workspace') ? (route.path.startsWith('/pbcs/') ? '交付工作区' : '澄清工作区') : isIntent.value && route.params.id ? '意图详情' : '');
|
|
37
|
+
function toggleMenu() {
|
|
38
|
+
if (!narrow.value) {
|
|
39
|
+
collapsed.value = !collapsed.value;
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (mobileOpen.value)
|
|
43
|
+
closeNav();
|
|
44
|
+
else {
|
|
45
|
+
mobileOpen.value = true;
|
|
46
|
+
nextTick(() => document.querySelector('.sidebar [aria-current="page"]')?.focus());
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const roleMenu = computed(() => ({ items: [
|
|
50
|
+
...actors.map(a => ({ key: a.id, label: a.name + ' · ' + a.label })),
|
|
51
|
+
], onClick: ({ key }) => { session.actorId = key; } }));
|
|
52
|
+
return { computed, ref, onMounted, onBeforeUnmount, nextTick, useRoute, Button, Avatar, Dropdown, Result, MenuFoldOutlined, MenuUnfoldOutlined, DownOutlined, UpOutlined, RightOutlined, InfoCircleOutlined, navigation, moduleLabel, PrototypeGuide, ConfirmationDialog, useSession, actors, tenantLabel, SessionDialog, route, session, visibleNavigation, canView, expanded, collapsed, mobileOpen, guide, narrow, navHidden, onResize, onKeydown, focusMain, closeNav, isIntent, current, isAi, label, subLabel, toggleMenu, roleMenu };
|
|
53
|
+
} });
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<!-- 来源:src/shell/PrototypeGuide.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
|
|
2
|
+
<template data-component="Drawer" data-bind-open="(open)" title="原型说明与评审指南" data-bind-size="(640)" data-on-close="(emit('close'))"><template data-component="Alert" type="info" show-icon="" title="v0.14 · 运行验收与异常反馈" description="运行验收、异常调查分诊与修复跟踪已接回发布、工作台、任务和 PBC。身份、授权、观测与工程交付均为本地模拟,真实服务尚未接入。"></template><section class="drawer-section"><h2>运行验收与异常反馈 · v0.14</h2><p>运行记录 → 业务证据与人工验收 → 异常调查/分诊 → 关联或创建修复需求 → 新发布版本的回归与验收 → 关闭原异常。</p><p>在运行管理页底部载入独立模拟样例;新功能权限通过权限管理配置。旧版数据和端口保留,新版4187的数据按浏览器独立保存。</p><template data-component="Button" data-on-click="router.push('/operations');
|
|
3
|
+
emit('close');">打开运行管理</template></section><section class="drawer-section"><h2>发布准备与人工放行</h2><p>创建发布草稿 → 核对固定版本证据 → 人工授权 → 部署 → 首次灰度 → 观测与全量;失败时有限重试、暂停或恢复。所有执行与材料均为模拟。</p><p>历史任务保留材料缺失;独立样例提供完整模拟证据。既有用户新增发布权限需在权限管理配置,可限定目标环境。</p><template data-component="Button" data-on-click="router.push('/releases');
|
|
4
|
+
emit('close');">打开门禁与发布</template><h3>发布列表状态</h3><template data-component="RadioGroup" data-model-value="(releases.scene)" data-bind-options="(listOutcomes)"></template><h3>下一次发布提交结果</h3><template data-component="RadioGroup" data-model-value="(releases.response)" data-bind-options="(outcomes)"></template></section><section class="drawer-section"><h2>质量与人工确认走读</h2><ol><li>打开评审列表,按PBC和状态筛选;查看更多、显示字段与审批记录删除说明。</li><li>进入有问题的质量评审,查看固定版本,再修改设计或填写重新规划意见。</li><li>提交后进入新设计评审,接收模拟复核结果并确认;回到任务重新实现、检查、独立验证。</li><li>回到工作台查看同一任务待办更新;打开历史评审核对旧报告与处理人。</li></ol><p>既有用户的授权保持。新增“修改评审设计”和“重新规划交付”由权限管理员在独立权限菜单配置;新动作未授权时仍可查看原因。</p><template data-component="Button" type="primary" data-on-click="router.push('/reviews');
|
|
5
|
+
emit('close');">打开质量与评审</template><h3>评审列表状态</h3><template data-component="RadioGroup" data-model-value="(reviews.scene)" data-bind-options="(listOutcomes)"></template><h3>下一次评审提交结果</h3><template data-component="RadioGroup" data-model-value="(session.confirmResult)" data-bind-options="(outcomes)"></template></section><section class="drawer-section"><h2>工作台首版走读</h2><ol><li>切换“与我相关”和“全部授权范围”,核对待办、PBC及交付数量。</li><li>从待办进入规格或任务处理,返回首页查看状态变化。</li><li>新建PBC可查看所有可见需求的前置原因;已归属记录进入原结果。</li><li>查看只读公告与规范提醒;质量评审已接入,发布待办已接入,运行验收与异常待办已接入。</li></ol><p>个人关系按创建人、负责人和可见关联记录识别;演示林晓的两种授权配置属于同一人员,权限仍单独计算。本版使用 4187 独立预览,其他端口保留各自版本与数据。</p><h2>PBC 与项目走读</h2><ol class="review-steps"><li>从 PBC 列表编辑资料,查看基础字段、更多与批量删除预检。</li><li>进入服务管理,新增并修改服务方案,核对已建工程的保护。</li><li>打开交付工作区,从需求规格进入任务与版本产物。</li><li>新建 PBC 选择已确认规格,沿用三步创建向导及失败续接。</li></ol><p class="muted">本版以 PBC 聚合交付工作区;独立项目实体尚待确认。更名保留历史和原型兼容的资源授权引用;正式接口按稳定ID治理。</p><template data-component="Button" type="primary" data-on-click="router.push('/pbcs');
|
|
6
|
+
emit('close');">打开 PBC 管理</template></section><section class="drawer-section"><h2>交付任务走读</h2><ol class="review-steps"><li>发起交付,核对已确认规格、PBC、流程与资源版本。</li><li>打开任务,用阶段详情中的演示控件推进;确认原型后查看产物。</li><li>模拟失败,尝试返工、暂停与人工接管,再刷新查看保留的状态。</li></ol><p class="muted">预置确认与产物均为样例;可继续查看发布、运行验收和修复反馈。</p><template data-component="Button" data-on-click="router.push('/tasks');
|
|
7
|
+
emit('close');">打开交付任务</template><h3>任务列表状态</h3><template data-component="RadioGroup" data-model-value="(tasks.scene)" data-bind-options="(listOutcomes)"></template></section><section class="drawer-section"><h2>研发交付流程走读</h2><ol class="review-steps"><li>查看标准交付模板,选择节点核对 Agent 和产物。</li><li>编辑草稿并修改节点,检查流程后提交审核。</li><li>切换到有发布权限的王睿,审核配置;再核对版本差异与固定版本选择。</li></ol><p class="muted">本地原型不运行 CI、Agent 或 Dapr。预置质量评审 Agent 在本版示例中已启用并取得模型授权。独立审核为待评审交互提案。</p><template data-component="Button" type="primary" data-bind-disabled="(!session.can('workflow:view'))" data-on-click="router.push('/workflows');
|
|
8
|
+
emit('close');">打开流程模板</template><h3>流程列表状态</h3><template data-component="RadioGroup" data-model-value="(workflows.scene)" data-bind-options="(listOutcomes)"></template></section><section class="drawer-section"><h2>Agent 原型走读</h2><ol class="review-steps"><li>在 Agent 注册表查看四要素配置、所属项目与基础字段。</li><li>注册一个 Agent 并保存草稿,检查引用与模型使用授权;通过模型管理补齐授权后启用。</li><li>停用后编辑,再核对批量删除、引用保护及操作记录。</li></ol><template data-component="Button" type="primary" data-bind-disabled="(!session.can('agent:view'))" data-on-click="router.push('/agents');
|
|
9
|
+
emit('close');">打开 Agent 注册表</template><p class="muted">提示词、技能、工具与模板为示例资源,本包没有连接真实 Agent 运行时。</p><h3>Agent 列表状态</h3><template data-component="RadioGroup" data-model-value="(agents.scene)" data-bind-options="(listOutcomes)"></template></section><section class="drawer-section"><h2>权限管理走读</h2><ol class="review-steps"><li>使用陈敏进入独立的「权限管理」,新增角色并配置功能和资源范围。</li><li>在成员授权中,将角色关联给周晨;查看成员的有效权限与来源。</li><li>切换到周晨,进入原有意图/规格页面核对权限;切回陈敏撤权并查看授权记录。</li></ol><template data-component="Button" type="primary" data-bind-disabled="(!session.can('permission:view'))" data-on-click="router.push('/permissions/roles');
|
|
10
|
+
emit('close');">打开权限管理</template><p class="muted">以下身份切换和故障选项仅供原型评审,正式产品不包含这些控件。</p></section><section class="drawer-section"><h2>身份与权限</h2><template data-component="Select" data-model-value="(session.actorId)" aria-label="评审身份" class="full-width" data-bind-options="(actors.map(a => ({ label: a.name + ' · ' + a.label, value: a.id })))"></template><p class="muted">预置角色只是演示配置;动作与范围决定功能,角色名称不参与授权判断。</p><template data-component="Space" wrap=""><template data-component="Button" data-on-click="(session.state = 'expired')">模拟登录失效</template><template data-component="Button" data-on-click="(session.state = 'anonymous')">模拟未登录</template></template></section><section class="drawer-section"><h2>规格生成与资源</h2><template data-component="RadioGroup" data-model-value="(specs.generation)" data-bind-options="(outcomes.slice(0, 2))"></template><p><template data-component="Switch" data-model-checked="(specs.resource)" aria-label="规格生成资源可用"></template> 规格生成资源可用(模拟)</p><h3>规格确认结果</h3><template data-component="RadioGroup" data-model-value="(specs.confirmation)" data-bind-options="(outcomes)"></template></section><section class="drawer-section"><h2>下一次 PBC 关联 / 创建</h2><template data-component="RadioGroup" data-model-value="(pbcs.mode)" data-bind-options="(outcomes)"></template><p class="muted">创建失败发生在第 3 步;未知结果发生在第 1 步。核实 / 续接沿用原操作编号,已完成步骤保留。</p><h3>PBC 目录</h3><template data-component="RadioGroup" data-model-value="(pbcs.scene)" data-bind-options="(listOutcomes)"></template></section><section class="drawer-section"><h2>权限管理列表</h2><template data-component="RadioGroup" data-model-value="(authority.scene)" data-bind-options="(listOutcomes)"></template></section><section class="drawer-section"><h2>下一次保存 / 提交</h2><template data-component="RadioGroup" data-model-value="(session.nextWrite)" data-bind-options="([{ label: '成功', value: 'success' }, { label: '服务失败', value: 'failure' }, { label: '版本冲突', value: 'conflict' }])"></template><p class="muted">失败或冲突仅作用一次,便于继续重试。</p></section><section class="drawer-section"><h2>原有模型 / 意图列表状态</h2><template data-component="RadioGroup" data-model-value="(scene)" data-bind-options="(listOutcomes)"></template><h3>模型发布结果</h3><template data-component="RadioGroup" data-model-value="(session.publishResult)" data-bind-options="(outcomes.slice(0, 2))"></template><h3>意图确认结果</h3><template data-component="RadioGroup" data-model-value="(session.confirmResult)" data-bind-options="(outcomes)"></template><h3>意图整理结果</h3><template data-component="RadioGroup" data-model-value="(intents.resultMode)" data-bind-options="(outcomes.slice(0, 2))"></template></section><template data-slot="footer"><template data-component="Space"><template data-component="Button" danger="" data-on-click="(reset)">重置演示数据</template><template data-component="Button" type="primary" data-on-click="(emit('close'))">开始体验</template></template></template></template>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { confirmAction } from "./confirmation.js";
|
|
2
|
+
import { computed, ref } from '../../runtime/state.js';
|
|
3
|
+
import { useRoute, useRouter } from "../../runtime/router.js";
|
|
4
|
+
import { Alert, Button, Drawer, RadioGroup, Space, Select, Switch } from "../../runtime/widgets.js";
|
|
5
|
+
import { useModels } from "../models/store.js";
|
|
6
|
+
import { useIntents } from "../intents/store.js";
|
|
7
|
+
import { useSpecs } from "../specs/store.js";
|
|
8
|
+
import { usePbcs } from "../pbc/store.js";
|
|
9
|
+
import { useSession } from "../shared/session.js";
|
|
10
|
+
import { actors } from "../shared/policy.js";
|
|
11
|
+
import { useAuthority } from "../permissions/store.js";
|
|
12
|
+
import { useReleases } from "../releases/store.js";
|
|
13
|
+
import { useReviews } from "../reviews/store.js";
|
|
14
|
+
import { useTasks } from "../tasks/store.js";
|
|
15
|
+
import { useWorkflows } from "../workflows/store.js";
|
|
16
|
+
import { useAgents } from "../agents/store.js";
|
|
17
|
+
import { createComponent } from '../../runtime/dom.js';
|
|
18
|
+
export default createComponent({ name: 'PrototypeGuide', propKeys: ["open"], template: new URL('./PrototypeGuide.html', import.meta.url).href, setup(__props, __emit) {
|
|
19
|
+
__props;
|
|
20
|
+
const emit = __emit, route = useRoute(), router = useRouter(), models = useModels(), intents = useIntents(), specs = useSpecs(), pbcs = usePbcs(), session = useSession(), authority = useAuthority(), agents = useAgents(), workflows = useWorkflows(), tasks = useTasks(), reviews = useReviews(), releases = useReleases();
|
|
21
|
+
const isIntent = computed(() => route.path.startsWith('/intents'));
|
|
22
|
+
const scene = computed({ get: () => isIntent.value ? intents.scene : models.scene, set: value => { if (isIntent.value)
|
|
23
|
+
intents.scene = value;
|
|
24
|
+
else
|
|
25
|
+
models.scene = value; } });
|
|
26
|
+
const outcomes = [{ label: '成功', value: 'success' }, { label: '失败', value: 'failure' }, { label: '结果待核实', value: 'unknown' }];
|
|
27
|
+
const listOutcomes = [{ label: '正常', value: 'normal' }, { label: '空列表', value: 'empty' }, { label: '加载失败', value: 'error' }];
|
|
28
|
+
function reset() { confirmAction({ title: '重置 v0.14 演示数据?', content: '恢复当前 HTML 原型地址的模型、意图、规格、PBC、权限、Agent、流程、任务、发布与运行演示记录。请先保留需要的内容;其他端口的历史版本数据不受影响。', okText: '确认重置', cancelText: '取消', onOk: () => { authority.reset(); session.reset(); models.reset(); intents.reset(); specs.reset(); pbcs.reset(); agents.reset(); workflows.reset(); tasks.reset(); emit('close'); router.push('/workbench'); } }); }
|
|
29
|
+
return { confirmAction, computed, ref, useRoute, useRouter, Alert, Button, Drawer, RadioGroup, Space, Select, Switch, useModels, useIntents, useSpecs, usePbcs, useSession, actors, useAuthority, useReleases, useReviews, useTasks, useWorkflows, useAgents, emit, route, router, models, intents, specs, pbcs, session, authority, agents, workflows, tasks, reviews, releases, isIntent, scene, outcomes, listOutcomes, reset };
|
|
30
|
+
} });
|
package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ScopePage.html
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
<!-- 来源:src/shell/ScopePage.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
|
|
2
|
+
<div class="page-heading"><div><h1>{{ (label) }}</h1><p>Console 导航结构预览</p></div></div><section class="panel scope-panel"><template data-component="Empty" data-bind-description="(`${label}将在后续逐功能设计中展开`)"><p class="muted">当前可体验意图发起与澄清,以及模型管理。</p><template data-component="Button" type="primary" data-on-click="(router.push('/intents'))">进入意图池</template></template></section>
|
package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ScopePage.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { computed } from '../../runtime/state.js';
|
|
2
|
+
import { useRoute, useRouter } from "../../runtime/router.js";
|
|
3
|
+
import { Empty, Button } from "../../runtime/widgets.js";
|
|
4
|
+
import { moduleLabel } from "./navigation.js";
|
|
5
|
+
import { createComponent } from '../../runtime/dom.js';
|
|
6
|
+
export default createComponent({ name: 'ScopePage', propKeys: [], template: new URL('./ScopePage.html', import.meta.url).href, setup(__props, __emit) {
|
|
7
|
+
const route = useRoute(), router = useRouter();
|
|
8
|
+
const label = computed(() => moduleLabel(String(route.params.id)));
|
|
9
|
+
return { computed, useRoute, useRouter, Empty, Button, moduleLabel, route, router, label };
|
|
10
|
+
} });
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
<!-- 来源:src/shell/SessionDialog.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
|
|
2
|
+
<template data-component="Modal" data-bind-open="(session.state !== 'active')" data-bind-z-index="(4000)" data-bind-title="(redirected ? 'MaxKey 统一认证 · 演示' : session.state === 'expired' ? '登录状态已失效' : '请先登录')" data-bind-closable="(false)" data-bind-keyboard="(false)" data-bind-mask="({ closable: false })"><p>{{ (redirected ? '实际应用会跳转 MaxKey 完成认证。这里仅模拟登录结果,不收集密码或生成令牌。' : '继续操作前需要通过统一认证。当前页面的未提交输入暂时保留,重新登录后可核对并继续。') }}</p><template data-component="Alert" data-if="(redirected)" type="info" data-bind-title="('模拟以 ' + session.actor.name + ' 登录')"></template><template data-slot="footer"><template data-component="Button" data-if="(!redirected)" type="primary" data-on-click="(redirected = true)">前往 MaxKey 登录</template><template data-component="Button" data-else="" type="primary" data-on-click="(session.state = 'active')">模拟登录成功并返回</template></template></template>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ref, watch } from '../../runtime/state.js';
|
|
2
|
+
import { Modal, Button, Alert } from "../../runtime/widgets.js";
|
|
3
|
+
import { useSession } from "../shared/session.js";
|
|
4
|
+
import { createComponent } from '../../runtime/dom.js';
|
|
5
|
+
export default createComponent({ name: 'SessionDialog', propKeys: [], template: new URL('./SessionDialog.html', import.meta.url).href, setup(__props, __emit) {
|
|
6
|
+
const session = useSession(), redirected = ref(false);
|
|
7
|
+
watch(() => session.state, () => { redirected.value = false; });
|
|
8
|
+
return { ref, watch, Modal, Button, Alert, useSession, session, redirected };
|
|
9
|
+
} });
|
package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/navigation.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { HomeOutlined, ProjectOutlined, CommentOutlined, AppstoreOutlined, SafetyCertificateOutlined, RocketOutlined, FundProjectionScreenOutlined, AuditOutlined, TeamOutlined, SettingOutlined } from "../../runtime/icons.js";
|
|
2
|
+
export const navigation = [
|
|
3
|
+
{ id: 'workbench', label: '工作台', icon: HomeOutlined },
|
|
4
|
+
{ id: 'projects', label: 'PBC 与项目', icon: ProjectOutlined },
|
|
5
|
+
{ id: 'requirements', label: '意图与需求', icon: CommentOutlined },
|
|
6
|
+
{ id: 'ai', label: 'AI 编排', icon: AppstoreOutlined, children: [
|
|
7
|
+
{ id: 'models', label: '模型管理' }, { id: 'agents', label: 'Agent 注册表' },
|
|
8
|
+
{ id: 'workflows', label: '研发交付流程' }, { id: 'tools', label: '工具与 MCP' }, { id: 'knowledge', label: '知识库' },
|
|
9
|
+
] },
|
|
10
|
+
{ id: 'tasks', label: '交付任务', icon: ProjectOutlined },
|
|
11
|
+
{ id: 'quality', label: '质量与评审', icon: SafetyCertificateOutlined },
|
|
12
|
+
{ id: 'release', label: '门禁与发布', icon: RocketOutlined },
|
|
13
|
+
{ id: 'operations', label: '运行管理', icon: FundProjectionScreenOutlined },
|
|
14
|
+
{ id: 'standards', label: '规范与治理', icon: AuditOutlined },
|
|
15
|
+
{ id: 'permissions', label: '权限管理', icon: SafetyCertificateOutlined, children: [{ id: 'permission-roles', label: '角色管理' }, { id: 'permission-members', label: '成员授权' }, { id: 'permission-records', label: '授权记录' }] },
|
|
16
|
+
{ id: 'organization', label: '组织与审计', icon: TeamOutlined },
|
|
17
|
+
{ id: 'settings', label: '系统设置', icon: SettingOutlined },
|
|
18
|
+
];
|
|
19
|
+
export const moduleLabel = (id) => navigation.flatMap(n => [n, ...(n.children || [])]).find(n => n.id === id)?.label || '模型管理';
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
<!-- 来源:src/specs/SpecDocument.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
|
|
2
|
+
<article class="spec-document" aria-label="需求规格正文"><section data-each="section in (sections)" data-bind-id="('spec-' + section.key)" data-bind-key="(section.key)"><h2>{{ (section.label) }}</h2><p>{{ (version.content[section.key]) }}</p></section><section><h2>决策登记</h2><div data-each="d in (version.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 && d.reason ? 'green' : 'orange')">{{ (d.answer && d.reason ? '已明确' : '待处理') }}</template></div><p>结论:{{ (d.answer || '尚未明确') }}<br>理由:{{ (d.reason || '待补充') }}</p><small class="muted">责任方:{{ (d.owner) }}<template data-if="(d.resolvedAt)"> · {{ (d.resolvedBy) }} · {{ (formatDate(d.resolvedAt)) }}</template></small></div></section></article>
|
package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecDocument.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Tag } from "../../runtime/widgets.js";
|
|
2
|
+
import { sections } from "./domain.js";
|
|
3
|
+
import { formatDate } from "../shared/policy.js";
|
|
4
|
+
import { createComponent } from '../../runtime/dom.js';
|
|
5
|
+
export default createComponent({ name: 'SpecDocument', propKeys: ["version"], template: new URL('./SpecDocument.html', import.meta.url).href, setup(__props, __emit) {
|
|
6
|
+
__props;
|
|
7
|
+
return { Tag, sections, formatDate };
|
|
8
|
+
} });
|
package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecEdit.html
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
<!-- 来源:src/specs/SpecEdit.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
|
|
2
|
+
<template data-component="Drawer" data-bind-open="(true)" data-bind-title="(mode === 'content' ? '修改需求规格' : '处理未决事项')" data-bind-size="(860)" data-bind-mask="({ closable: false })" data-on-close="(close)"><template data-component="Alert" type="info" show-icon="" data-bind-title="('保存为规格 v' + (version.number + 1) + ',需重新确认')" description="原版本及其签署记录继续保留。请分别填写每项决策理由,以及表单底部必填的“本次修改原因”;前者解释决策,后者记录本次版本变化。" class="page-alert"></template><template data-component="Alert" data-if="(error)" type="error" show-icon="" data-bind-title="(error)" class="page-alert"></template><template data-if="(mode === 'decisions')"><fieldset data-each="(d,index) in (decisions)" data-bind-key="(d.id)" class="spec-decision-form" data-bind-disabled="(!editable)"><legend>{{ (index + 1) }}. {{ (d.question) }}</legend><p class="muted">责任方:{{ (d.owner) }}</p><template data-component="RadioGroup" data-model-value="(d.answer)" data-bind-aria-label="(d.question)" class="vertical-options" data-bind-options="(d.options.map(value => ({ label: value, value })))"></template><label data-bind-for="('reason-' + d.id)">决策理由</label><template data-component="Input.TextArea" data-bind-id="('reason-' + d.id)" data-model-value="(d.reason)" data-bind-rows="(2)" data-bind-maxlength="(1500)" placeholder="说明依据、影响与后续处理。"></template></fieldset></template><template data-component="ProForm" data-bind-form="(form)" name="spec-revision" layout="vertical" data-bind-disabled="(!editable)"></template><template data-slot="footer"><template data-component="Alert" data-if="(error)" type="error" show-icon="" data-bind-title="(error)" class="page-alert" role="alert"><template data-slot="action"><template data-component="Button" data-if="(error.startsWith('尚未保存'))" data-on-click="(locateInvalid)">定位缺项</template></template></template><div class="drawer-footer"><span class="muted">保存后保留版本与操作人</span><template data-component="Space"><template data-component="Button" data-on-click="(close)">取消</template><template data-component="Button" type="primary" data-bind-disabled="(!editable)" data-on-click="(save)">保存新版本</template></template></div></template></template>
|
package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecEdit.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { computed, ref, nextTick } from '../../runtime/state.js';
|
|
2
|
+
import { Alert, Button, Drawer, Input, RadioGroup, Space } from "../../runtime/widgets.js";
|
|
3
|
+
import { ProForm, useForm } from "../../runtime/widgets.js";
|
|
4
|
+
import { clone, currentVersion, sections, specBusy } from "./domain.js";
|
|
5
|
+
import { useSpecs } from "./store.js";
|
|
6
|
+
import { useSession } from "../shared/session.js";
|
|
7
|
+
import { confirmAction } from "../shell/confirmation.js";
|
|
8
|
+
import { createComponent } from '../../runtime/dom.js';
|
|
9
|
+
export default createComponent({ name: 'SpecEdit', propKeys: ["spec", "mode"], template: new URL('./SpecEdit.html', import.meta.url).href, setup(__props, __emit) {
|
|
10
|
+
const props = __props, emit = __emit, store = useSpecs(), session = useSession();
|
|
11
|
+
const version = currentVersion(props.spec), expected = props.spec.recordVersion, error = ref(''), decisions = ref(clone(version.decisions));
|
|
12
|
+
const form = useForm({ ...clone(version.content), reason: '' });
|
|
13
|
+
form.fields.value = [...(props.mode === 'content' ? sections.map(s => ({ path: s.key, label: s.label, component: 'textarea', span: 24, autoSize: { minRows: 3, maxRows: 10 }, rules: [{ required: true, whitespace: true, message: '请填写' + s.label }] })) : []), { path: 'reason', label: '本次修改原因', component: 'textarea', span: 24, rows: 2, placeholder: '概括这次修改,例如:补充人工复核方案及验收资源,关闭未决事项。', rules: [{ required: true, whitespace: true, message: '请填写修改原因' }] }];
|
|
14
|
+
const editable = computed(() => session.can('spec:edit', props.spec.tenantId) && !specBusy(props.spec));
|
|
15
|
+
function close() { confirmAction({ title: '放弃本次未保存修改?', content: '已保存的规格与确认记录保留。', okText: '放弃修改', cancelText: '继续编辑', onOk: () => emit('close') }); }
|
|
16
|
+
async function locateInvalid() { await nextTick(); const el = document.querySelector('#spec-revision .ant-form-item-has-error textarea, #spec-revision .ant-form-item-has-error input') || document.getElementById('spec-revision_reason'); el?.scrollIntoView({ block: 'center', behavior: 'smooth' }); el?.focus({ preventScroll: true }); }
|
|
17
|
+
async function save() { error.value = ''; try {
|
|
18
|
+
await form.formRef.value?.validate();
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
error.value = '尚未保存:请补齐标红字段。每项决策理由之外,还需填写“本次修改原因”。输入已保留。';
|
|
22
|
+
await locateInvalid();
|
|
23
|
+
return;
|
|
24
|
+
} try {
|
|
25
|
+
store.revise(props.spec.intentId, form.formData, decisions.value, form.formData.reason, expected);
|
|
26
|
+
emit('close');
|
|
27
|
+
}
|
|
28
|
+
catch (e) {
|
|
29
|
+
error.value = e.message;
|
|
30
|
+
} }
|
|
31
|
+
return { computed, ref, nextTick, Alert, Button, Drawer, Input, RadioGroup, Space, ProForm, useForm, clone, currentVersion, sections, specBusy, useSpecs, useSession, confirmAction, props, emit, store, session, version, expected, error, decisions, form, editable, close, locateInvalid, save };
|
|
32
|
+
} });
|
package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHeader.html
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
<!-- 来源:src/specs/SpecHeader.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
|
|
2
|
+
<template data-component="Button" type="link" class="intent-back" data-on-click="(router.push('/intents/' + intent.id))">← 返回来源意图</template><div class="page-heading intent-heading"><div><h1>{{ (['需求规格工作区', '规格版本评审', 'PBC 归属'][step]) }}</h1><p class="muted">{{ (intent.title) }}</p><template data-component="Space" wrap=""><template data-component="Tag">{{ (intent.code) }}</template><template data-component="Tag" data-if="(version)" data-bind-color="(version.confirmedAt ? 'green' : 'blue')">规格 v{{ (version.number) }} · {{ (version.confirmedAt ? '已确认' : '待确认') }}</template><span class="muted">来源意图 v{{ (version?.source.version || intent.versions.at(-1)?.number) }}</span></template></div><template data-component="Space" wrap=""><slot></slot></template></div><template data-component="Steps" class="delivery-steps" data-bind-current="(step)" size="small" data-on-change="(navigate)" data-bind-items="([{ title: '生成与完善规格' }, { title: '核对版本并确认', disabled: !version }, { title: '关联或创建 PBC', disabled: !version?.confirmedAt || !session.can('pbc:view', intent.tenantId) }])"></template>
|
package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHeader.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Button, Space, Steps, Tag } from "../../runtime/widgets.js";
|
|
2
|
+
import { useSession } from "../shared/session.js";
|
|
3
|
+
import { useRouter } from "../../runtime/router.js";
|
|
4
|
+
import { createComponent } from '../../runtime/dom.js';
|
|
5
|
+
export default createComponent({ name: 'SpecHeader', propKeys: ["intent", "version", "step"], template: new URL('./SpecHeader.html', import.meta.url).href, setup(__props, __emit) {
|
|
6
|
+
const props = __props;
|
|
7
|
+
const router = useRouter(), session = useSession();
|
|
8
|
+
function navigate(step) { const root = '/intents/' + props.intent.id; if (step === 0)
|
|
9
|
+
router.push(root + '/spec');
|
|
10
|
+
else if (step === 1 && props.version)
|
|
11
|
+
router.push(root + '/spec/review');
|
|
12
|
+
else if (step === 2 && props.version?.confirmedAt && session.can('pbc:view', props.intent.tenantId))
|
|
13
|
+
router.push(root + '/pbc'); }
|
|
14
|
+
return { Button, Space, Steps, Tag, useSession, useRouter, props, router, session, navigate };
|
|
15
|
+
} });
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
<!-- 来源:src/specs/SpecHistory.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
|
|
2
|
+
<template data-component="Drawer" data-bind-open="(true)" title="规格版本与操作记录" data-bind-size="(860)" data-on-close="(emit('close'))"><template data-component="Alert" type="info" show-icon="" title="版本与签署记录只读保存,不适用删除或批量删除。"></template><template data-component="Tabs" data-model-active-key="(tab)" data-bind-items="([{ key: 'versions', label: '历史版本' }, { key: 'events', label: '操作记录' }])"></template><template data-if="(tab === 'versions')"><template data-component="Select" data-model-value="(selected)" aria-label="历史规格版本" class="full-width" data-bind-options="(spec.versions.map(v => ({ label: '规格 v' + v.number + ' · ' + (v.confirmedAt ? '已确认' : '未确认'), value: v.number })))"></template><template data-if="(version)"><p>{{ (version.reason) }} · {{ (version.createdBy) }} · {{ (formatDate(version.createdAt)) }}</p><p data-if="(version.confirmedAt)" class="version-confirmed">{{ (version.confirmedBy) }} · {{ (formatDate(version.confirmedAt)) }} 确认此版本</p><p data-if="(version.resource)" class="muted">生成来源:{{ (version.resource.agent) }} v{{ (version.resource.agentVersion) }} · {{ (version.resource.name) }} v{{ (version.resource.version) }}</p><template data-component="SpecDocument" data-bind-version="(version)"></template></template></template><ol data-else="" class="intent-events"><li data-each="event in ([...spec.events].reverse())" data-bind-key="(event.id)"><strong>{{ (event.action) }} · v{{ (event.version) }}</strong><p>{{ (event.result) }}</p><small>{{ (event.actor) }} · {{ (formatDate(event.at)) }}</small></li></ol></template>
|
package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHistory.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { computed, ref } from '../../runtime/state.js';
|
|
2
|
+
import { Alert, Drawer, Select, Tabs } from "../../runtime/widgets.js";
|
|
3
|
+
import { currentVersion } from "./domain.js";
|
|
4
|
+
import { formatDate } from "../shared/policy.js";
|
|
5
|
+
import SpecDocument from "./SpecDocument.js";
|
|
6
|
+
import { createComponent } from '../../runtime/dom.js';
|
|
7
|
+
export default createComponent({ name: 'SpecHistory', propKeys: ["spec"], template: new URL('./SpecHistory.html', import.meta.url).href, setup(__props, __emit) {
|
|
8
|
+
const props = __props, emit = __emit, tab = ref('versions'), selected = ref(currentVersion(props.spec)?.number);
|
|
9
|
+
const version = computed(() => props.spec.versions.find(v => v.number === selected.value));
|
|
10
|
+
return { computed, ref, Alert, Drawer, Select, Tabs, currentVersion, formatDate, SpecDocument, props, emit, tab, selected, version };
|
|
11
|
+
} });
|
package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecReview.html
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
<!-- 来源:src/specs/SpecReview.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
|
|
2
|
+
<template data-component="Result" data-if="(!intent || !spec || !version || !viewed)" title="尚无可评审的规格或无权访问"><template data-slot="extra"><template data-component="Button" data-on-click="(router.push('/intents/' + id + '/spec'))">返回规格工作区</template></template></template><template data-else=""><template data-component="SpecHeader" data-bind-intent="(intent)" data-bind-version="(version)" data-bind-step="(1)"><template data-component="Button" data-on-click="(history = true)">版本与记录</template><template data-component="Button" data-on-click="(router.push('/intents/' + id + '/spec'))">返回工作区</template></template><template data-component="Alert" data-if="(error || spec.error || sourceError)" type="error" show-icon="" data-bind-title="(error || spec.error || sourceError)" class="page-alert"></template><template data-component="Alert" data-if="(spec.confirmation === 'pending')" type="info" show-icon="" title="正在提交确认,请稍候…" class="page-alert"></template><template data-component="Alert" data-if="(spec.confirmation === 'unknown')" type="warning" show-icon="" title="确认响应未收到,请核实原请求结果" data-bind-description="('请求 ' + spec.pending?.id + ';规格 v' + spec.pending?.version)" class="page-alert"><template data-slot="action"><template data-component="Button" data-on-click="(reconcile)">核实确认结果</template></template></template><template data-component="Alert" data-if="(version.confirmedAt)" type="success" show-icon="" data-bind-title="('规格 v' + version.number + ' 已确认')" data-bind-description="(version.confirmedBy + ' · ' + formatDate(version.confirmedAt) + ';确认基线只读保留,修改会形成新版本。')" class="page-alert"></template><template data-component="Alert" data-else-if="(pendingDecisions(version).length)" type="warning" show-icon="" data-bind-title="('还有 ' + pendingDecisions(version).length + ' 项决策需要结论和理由,暂不能确认。')" class="page-alert"><template data-slot="action"><template data-component="Button" data-on-click="(router.push('/intents/' + id + '/spec'))">返回处理</template></template></template><section class="panel delivery-main"><div class="review-toolbar"><div class="version-toolbar"><label for="review-after">查看版本</label><template data-component="Select" id="review-after" data-model-value="(after)" data-bind-options="(spec.versions.map(v => ({ label: '规格 v' + v.number, value: v.number })))"></template><template data-component="Button" data-bind-disabled="(spec.versions.length < 2)" data-on-click="(compare = !compare)">{{ (compare ? '阅读完整规格' : '对比版本变化') }}</template><template data-if="(compare)"><label for="review-before">对比来源</label><template data-component="Select" id="review-before" data-model-value="(before)" data-bind-options="(spec.versions.filter(v => v.number !== after).map(v => ({ label: '规格 v' + v.number, value: v.number })))"></template></template></div><template data-component="Tag" data-if="(after !== version.number)">历史版本 · 只读</template></div><p class="muted">{{ (viewed.reason) }} · {{ (viewed.createdBy) }} · {{ (formatDate(viewed.createdAt)) }} · 来源意图 v{{ (viewed.source.version) }}</p><template data-if="(compare)"><div data-each="d in (diff)" data-bind-key="(d.key)" class="spec-diff"><div class="section-heading"><h2>{{ (d.label) }}</h2><template data-component="Tag" data-bind-color="(d.changed ? 'blue' : 'default')">{{ (d.changed ? '有变化' : '内容相同') }}</template></div><div class="diff-columns"><section><h3>原内容 · v{{ (before) }}</h3><p>{{ (d.before || '无内容') }}</p></section><section data-bind-class="({ 'diff-changed': d.changed })"><h3>当前查看 · v{{ (after) }}</h3><p>{{ (d.after) }}</p></section></div></div><section class="decision-row"><h2>决策变化</h2><div data-each="d in (viewed.decisions)" data-bind-key="(d.id)"><strong>{{ (d.question) }}</strong><p>原结论:{{ (previous?.decisions.find(x => x.id === d.id)?.answer || '未明确') }} → 新结论:{{ (d.answer || '未明确') }}</p><p>新理由:{{ (d.reason || '待补充') }}</p></div></section></template><template data-component="SpecDocument" data-else="" data-bind-version="(viewed)"></template></section><template data-component="Alert" data-if="(!version.confirmedAt && blockReason)" type="info" show-icon="" data-bind-title="(blockReason)" class="page-alert"></template><template data-component="Alert" data-if="(version.confirmedAt && !session.can('pbc:view', spec.tenantId))" type="info" show-icon="" title="规格已确认;继续归属需要当前租户的 PBC 查看及相应创建/关联权限。" class="page-alert"></template><section class="panel review-actions" aria-label="规格评审操作"><span class="muted">当前操作:规格 v{{ (version.number) }} · {{ (session.actor.name) }}</span><template data-component="Space" wrap=""><template data-component="Button" data-bind-disabled="(busy || !!sourceError || !session.can('spec:edit', spec.tenantId))" data-on-click="(edit = true)">修改规格</template><template data-component="Button" data-bind-disabled="(busy || !!sourceError || !session.can('spec:generate', spec.tenantId) || !session.can('spec:edit', spec.tenantId))" data-on-click="(replan = true)">重新规划</template><template data-component="Button" data-if="(!version.confirmedAt)" type="primary" data-bind-disabled="(blocked)" data-bind-loading="(spec.confirmation === 'pending')" data-on-click="(confirm)">确认规格 v{{ (version.number) }}</template><template data-component="Button" data-else="" type="primary" data-bind-disabled="(!!sourceError || !session.can('pbc:view', spec.tenantId))" data-on-click="(router.push('/intents/' + id + '/pbc'))">确定 PBC 归属</template></template></section><template data-component="SpecEdit" data-if="(edit)" data-bind-spec="(spec)" mode="content" data-on-close="(edit = false)"></template><template data-component="SpecHistory" data-if="(history)" data-bind-spec="(spec)" data-on-close="(history = false)"></template><template data-component="Modal" data-model-open="(replan)" title="重新规划规格" ok-text="生成新版本" cancel-text="取消" data-bind-confirm-loading="(spec.generating)" data-on-ok="(regenerate)"><p>重新读取已确认意图,保留旧版本与签署记录。</p><label for="spec-replan-reason">重新规划原因</label><template data-component="Input.TextArea" id="spec-replan-reason" data-model-value="(reason)" data-bind-rows="(4)"></template><template data-component="Alert" data-if="(error)" type="error" data-bind-title="(error)"></template></template></template>
|