@givolt/i3-composer-agent 3.2.1 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/plugins/marketplace.json +1 -1
- package/.claude/commands/i3-build.md +1 -0
- package/.claude/commands/i3-code-simplify.md +1 -0
- package/.claude/commands/i3-constraints.md +1 -0
- package/.claude/commands/i3-plan.md +1 -0
- package/.claude/commands/i3-review.md +1 -0
- package/.claude/commands/i3-ship.md +1 -0
- package/.claude/commands/i3-spec.md +1 -0
- package/.claude/commands/i3-test.md +1 -0
- package/.claude/commands/i3-webperf.md +1 -0
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +2 -2
- package/README.md +31 -25
- package/bin/i3-composer-agent.cjs +4 -59
- package/bin/install.cjs +6 -14
- package/bin/native-layout.cjs +11 -2
- package/bin/native-migration.cjs +68 -28
- package/bin/retired-custom-fingerprints.json +1597 -0
- package/bin/wizard.cjs +2 -13
- package/docs/antigravity-setup.md +3 -1
- package/docs/codebuddy-setup.md +19 -76
- package/docs/codex-setup.md +10 -4
- package/docs/comparison.md +1 -1
- package/docs/copilot-cli-setup.md +4 -4
- package/docs/cursor-setup.md +1 -1
- package/docs/gemini-cli-setup.md +1 -1
- package/docs/other-hosts.md +2 -2
- package/docs/windsurf-setup.md +2 -2
- package/docs/workbuddy-setup.md +9 -16
- package/evals/README.md +10 -0
- package/evals/cases/i3-code-simplification.json +8 -0
- package/evals/cases/i3-documentation-and-adrs.json +4 -0
- package/evals/cases/i3-enterprise-sop.json +1 -1
- package/evals/cases/i3-frontend-ui-engineering.json +1 -1
- package/evals/cases/i3-security-and-hardening.json +4 -0
- package/evals/cases/i3-ui-demo.json +2 -2
- package/evals/cases/i3-using-agent-skills.json +5 -5
- package/evals/plugin/simplify-fires-on-pasted-function/graders/behavior-kept-and-explained.md +7 -0
- package/evals/plugin/simplify-fires-on-pasted-function/graders/skill-fired.md +5 -0
- package/evals/plugin/simplify-fires-on-pasted-function/prompt.md +30 -0
- package/evals/plugin/simplify-stays-quiet-on-make-it-fast/graders/not-fired.md +8 -0
- package/evals/plugin/simplify-stays-quiet-on-make-it-fast/prompt.md +20 -0
- package/evals/zh-CN/cases/i3-code-simplification.json +8 -0
- package/evals/zh-CN/cases/i3-documentation-and-adrs.json +4 -0
- package/evals/zh-CN/cases/i3-enterprise-sop.json +1 -1
- package/evals/zh-CN/cases/i3-frontend-ui-engineering.json +2 -2
- package/evals/zh-CN/cases/i3-security-and-hardening.json +4 -0
- package/evals/zh-CN/cases/i3-ui-demo.json +2 -2
- package/evals/zh-CN/cases/i3-using-agent-skills.json +6 -6
- package/hooks/SDD-CACHE.md +1 -1
- package/package.json +13 -80
- package/plugin.json +15 -2
- package/references/accessibility-checklist.md +4 -4
- package/references/performance-checklist.md +5 -4
- package/references/testing-patterns.md +2 -1
- package/scripts/floor-guard-reference-test.js +32 -0
- package/scripts/lib/execution-status.js +44 -0
- package/scripts/run-evals-test.js +157 -7
- package/scripts/run-evals.js +59 -12
- package/scripts/ui-demo-test.js +2 -2
- package/scripts/validate-artifact-paths-test.js +14 -0
- package/scripts/validate-artifact-paths.js +4 -2
- package/skills/i3-api-and-interface-design/SKILL.md +3 -1
- package/skills/i3-ci-cd-and-automation/SKILL.md +7 -4
- package/skills/i3-code-simplification/SKILL.md +3 -3
- package/skills/i3-constraint-driven-development/SKILL.md +4 -4
- package/skills/i3-constraint-driven-development/references/floor-guard.md +2 -2
- package/skills/i3-context-engineering/SKILL.md +1 -1
- package/skills/i3-debugging-and-error-recovery/SKILL.md +1 -1
- package/skills/i3-deprecation-and-migration/SKILL.md +6 -1
- package/skills/i3-documentation-and-adrs/SKILL.md +3 -2
- package/skills/i3-enterprise-sop/SKILL.md +38 -71
- package/skills/i3-enterprise-sop/references/engineering-skeleton/directory-standard.md +7 -7
- package/skills/i3-enterprise-sop/references/handoff.py +149 -120
- package/skills/i3-enterprise-sop/references/technical-baseline/baselines/enterprise-application-technical-baseline-v0-0-4.md +24 -24
- package/skills/i3-enterprise-sop/references/technical-baseline/templates/technical-baseline.md +8 -8
- package/skills/i3-enterprise-sop/references/templates/ad.md +31 -31
- package/skills/i3-enterprise-sop/references/templates/brd.md +6 -6
- package/skills/i3-enterprise-sop/references/templates/prd.md +37 -37
- package/skills/i3-enterprise-sop/references/templates/testcase.md +25 -25
- package/skills/i3-frontend-ui-engineering/SKILL.md +6 -10
- package/skills/i3-idea-refine/SKILL.md +4 -2
- package/skills/i3-incremental-implementation/SKILL.md +0 -4
- package/skills/i3-performance-optimization/SKILL.md +2 -2
- package/skills/i3-security-and-hardening/references/hardening-patterns.md +5 -0
- package/skills/i3-source-driven-development/SKILL.md +3 -2
- package/skills/i3-spec-driven-development/SKILL.md +1 -1
- package/skills/i3-ui-demo/SKILL.md +3 -1
- package/skills/i3-ui-demo/references/dependencies.md +1 -1
- package/skills/i3-ui-demo/references/resources.md +1 -1
- package/skills/i3-ui-demo/scripts/dependencies.cjs +0 -3
- package/skills/i3-using-agent-skills/SKILL.md +2 -2
- package/.claude/commands/i3-prototype.md +0 -23
- package/.gemini/commands/i3-prototype.toml +0 -23
- package/commands/i3-prototype.toml +0 -23
- package/evals/cases/i3-ui-prototype.json +0 -158
- package/evals/fixtures/i3-ui-prototype/admin-list/assets/reference.css +0 -3
- package/evals/fixtures/i3-ui-prototype/admin-list/assets/reference.js +0 -8
- package/evals/fixtures/i3-ui-prototype/admin-list/capability-definition.json +0 -67
- package/evals/fixtures/i3-ui-prototype/admin-list/index.html +0 -89
- package/evals/fixtures/i3-ui-prototype/admin-list/readme.md +0 -52
- package/evals/fixtures/i3-ui-prototype/admin-list/template.json +0 -8
- package/evals/fixtures/i3-ui-prototype/business-brief.md +0 -7
- package/evals/zh-CN/cases/i3-ui-prototype.json +0 -165
- package/hooks/PROTOTYPE.md +0 -31
- package/hooks/codebuddy-upstream.cjs +0 -93
- package/hooks/i3-prototype.cjs +0 -7
- package/hooks/manage.cjs +0 -169
- package/scripts/design-provider-discovery-test.js +0 -190
- package/scripts/design-provider-test.js +0 -75
- package/scripts/enterprise-template-test.js +0 -205
- package/scripts/lib/prototype-fixture.cjs +0 -17
- package/scripts/prototype-cache-test.js +0 -55
- package/scripts/prototype-generation-entry-test.js +0 -6
- package/scripts/prototype-generation-evidence-test.js +0 -10
- package/scripts/prototype-generation-native-test.js +0 -78
- package/scripts/prototype-generation-test.js +0 -99
- package/scripts/prototype-inventory-test.js +0 -43
- package/scripts/prototype-locations-test.js +0 -79
- package/scripts/prototype-project-test.js +0 -183
- package/scripts/template-adapter-test.js +0 -155
- package/scripts/ui-prototype-binding-recovery-test.js +0 -84
- package/scripts/ui-prototype-buddy-lifecycle-test.js +0 -102
- package/scripts/ui-prototype-codebuddy-hook-test.js +0 -112
- package/scripts/ui-prototype-content-test.js +0 -123
- package/scripts/ui-prototype-dependencies-test.js +0 -226
- package/scripts/ui-prototype-devtools-test.js +0 -53
- package/scripts/ui-prototype-execution-evidence-test.js +0 -62
- package/scripts/ui-prototype-execution-gates-test.js +0 -91
- package/scripts/ui-prototype-execution-policy-test.js +0 -53
- package/scripts/ui-prototype-execution-runtime-test.js +0 -27
- package/scripts/ui-prototype-ide-source-test.js +0 -73
- package/scripts/ui-prototype-native-test.js +0 -526
- package/scripts/ui-prototype-recovery-test.js +0 -81
- package/scripts/ui-prototype-registration-test.js +0 -53
- package/scripts/ui-prototype-template-test.js +0 -261
- package/scripts/ui-prototype-test.js +0 -124
- package/scripts/ui-prototype-transcript-auto-test.js +0 -67
- package/skills/i3-ui-prototype/SKILL.md +0 -256
- package/skills/i3-ui-prototype/assets/capabilities/generation.json +0 -833
- package/skills/i3-ui-prototype/assets/capabilities/management.json +0 -294
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/acceptance.json +0 -51
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/component-map.json +0 -13
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/generation-component-map.json +0 -300
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/index.html +0 -11
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/package-lock.json +0 -2298
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/package.json +0 -22
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/public/prototype-config.json +0 -6
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/App.vue +0 -136
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/components/DeviceEditor.vue +0 -111
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/config.ts +0 -19
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/content.ts +0 -28
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/domain/devices.ts +0 -50
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/domain/theme.ts +0 -25
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/main.ts +0 -18
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/style.css +0 -50
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/useDevices.ts +0 -66
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/tests/devices.test.ts +0 -44
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/tests/theme.test.ts +0 -26
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/tsconfig.json +0 -15
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/vite.config.ts +0 -4
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/profile.json +0 -174
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/readme.md +0 -61
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/index.html +0 -11
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/package-lock.json +0 -2298
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/package.json +0 -22
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/public/prototype-config.json +0 -21
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/App.vue +0 -62
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/PrototypeShell.vue +0 -59
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/config.ts +0 -23
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/domain/presentation.ts +0 -29
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/domain/theme.ts +0 -25
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/main.ts +0 -18
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/style.css +0 -26
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/tests/presentation.test.ts +0 -23
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/tests/theme.test.ts +0 -26
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/tsconfig.json +0 -15
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/vite.config.ts +0 -4
- package/skills/i3-ui-prototype/assets/hosts/codebuddy/profile.json +0 -17
- package/skills/i3-ui-prototype/assets/optional-skills/host-targets.json +0 -739
- package/skills/i3-ui-prototype/assets/optional-skills/sources.json +0 -27
- package/skills/i3-ui-prototype/assets/templates/catalog.js +0 -149
- package/skills/i3-ui-prototype/assets/templates/catalog.json +0 -149
- package/skills/i3-ui-prototype/assets/templates/classic-admin/manifest.json +0 -9
- package/skills/i3-ui-prototype/assets/templates/classic-admin/preset.json +0 -6
- package/skills/i3-ui-prototype/assets/templates/common/app/app.mjs +0 -89
- package/skills/i3-ui-prototype/assets/templates/common/app/config.json +0 -1
- package/skills/i3-ui-prototype/assets/templates/common/app/domain.mjs +0 -20
- package/skills/i3-ui-prototype/assets/templates/common/app/index.html +0 -17
- package/skills/i3-ui-prototype/assets/templates/common/app/serve.cjs +0 -16
- package/skills/i3-ui-prototype/assets/templates/common/app/styles.css +0 -670
- package/skills/i3-ui-prototype/assets/templates/common/app/tokens.css +0 -19
- package/skills/i3-ui-prototype/assets/templates/common/design-system/master.md +0 -20
- package/skills/i3-ui-prototype/assets/templates/common/gallery.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/common/mocks/applications.json +0 -5
- package/skills/i3-ui-prototype/assets/templates/common/requirements-map.json +0 -8
- package/skills/i3-ui-prototype/assets/templates/common/serve-gallery.cjs +0 -16
- package/skills/i3-ui-prototype/assets/templates/credits.md +0 -17
- package/skills/i3-ui-prototype/assets/templates/data-operations/manifest.json +0 -9
- package/skills/i3-ui-prototype/assets/templates/data-operations/preset.json +0 -6
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/capability-definition.json +0 -294
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/component-inventory.json +0 -707
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/design-system.md +0 -32
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/generation.json +0 -49
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/index.html +0 -534
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/manifest.json +0 -9
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/offline-build.json +0 -265
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/offline.js +0 -8888
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/origin.json +0 -344
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/preset.json +0 -928
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/app.js +0 -22
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/empty.svg +0 -1
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/reference-styles.json +0 -1
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/result-403.svg +0 -1
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/result-404.svg +0 -1
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets-manifest.json +0 -334
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/baseline.json +0 -173
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/conversion.md +0 -30
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/credits.md +0 -17
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/design-tokens.json +0 -881
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/index.html +0 -28
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/licenses/@qin-ui-antdv-next-pro.txt +0 -9
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/licenses/ant-design-icons.txt +0 -22
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/licenses/antdv-next.txt +0 -21
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/package.json +0 -12
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/browser-routes.json +0 -298
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/coverage.json +0 -180
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/integrity.json +0 -13
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/keyboard.json +0 -11
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/responsive.json +0 -125
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/review.md +0 -51
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/rules.log +0 -150
- 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 +0 -9
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/visual-comparison.json +0 -342
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/readme.md +0 -73
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/reference.md +0 -59
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/routes.json +0 -178
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/controls.js +0 -99
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/dialogs.js +0 -54
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/dom.js +0 -264
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/forms.js +0 -47
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/icons.js +0 -41
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/layout.js +0 -47
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/router.js +0 -63
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/state.js +0 -90
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/table.js +0 -41
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/widgets.js +0 -8
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentDetail.html +0 -3
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentDetail.js +0 -36
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentEditor.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentEditor.js +0 -51
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentsPage.html +0 -3
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentsPage.js +0 -48
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/CheckResults.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/CheckResults.js +0 -6
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/ResourcePicker.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/ResourcePicker.js +0 -13
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/data.js +0 -24
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/domain.js +0 -32
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/registry.js +0 -25
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/store.js +0 -85
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentClose.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentClose.js +0 -17
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentCreate.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentCreate.js +0 -66
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDecisions.html +0 -3
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDecisions.js +0 -38
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDetail.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDetail.js +0 -66
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDocument.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDocument.js +0 -5
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHeader.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHeader.js +0 -12
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHistory.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHistory.js +0 -11
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentList.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentList.js +0 -116
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentReplan.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentReplan.js +0 -32
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentRevision.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentRevision.js +0 -49
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentSummary.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentSummary.js +0 -10
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentWorkspace.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentWorkspace.js +0 -77
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/data.js +0 -60
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/domain.js +0 -105
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/store.js +0 -212
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/AuditPanel.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/AuditPanel.js +0 -18
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelDetail.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelDetail.js +0 -23
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelEditor.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelEditor.js +0 -78
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelGrant.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelGrant.js +0 -55
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelReferences.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelReferences.js +0 -26
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelRelease.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelRelease.js +0 -38
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelStatus.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelStatus.js +0 -7
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTable.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTable.js +0 -72
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTester.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTester.js +0 -46
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelsPage.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelsPage.js +0 -52
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/RowActions.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/RowActions.js +0 -19
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/UsagePanel.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/UsagePanel.js +0 -30
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/data.js +0 -48
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/domain.js +0 -39
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/store.js +0 -129
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IncidentDetail.html +0 -4
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IncidentDetail.js +0 -21
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IntentSource.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IntentSource.js +0 -8
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationActionDialog.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationActionDialog.js +0 -37
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationEntry.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationEntry.js +0 -10
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationsPage.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationsPage.js +0 -37
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RepairTrack.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RepairTrack.js +0 -49
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RunDetail.html +0 -4
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RunDetail.js +0 -22
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/SourceSummary.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/SourceSummary.js +0 -9
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/commands.js +0 -82
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/examples.js +0 -47
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/model.js +0 -61
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/repair.js +0 -68
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/store.js +0 -55
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/types.js +0 -1
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/workbench.js +0 -18
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ManagementTable.html +0 -3
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ManagementTable.js +0 -28
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcCreateEntry.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcCreateEntry.js +0 -18
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcDetail.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcDetail.js +0 -31
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcEditor.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcEditor.js +0 -27
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcLifecycle.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcLifecycle.js +0 -16
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPage.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPage.js +0 -43
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPicker.html +0 -4
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPicker.js +0 -34
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcProgress.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcProgress.js +0 -30
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWizard.html +0 -3
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWizard.js +0 -67
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWorkspace.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWorkspace.js +0 -41
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcsPage.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcsPage.js +0 -31
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceEditor.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceEditor.js +0 -26
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceList.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceList.js +0 -70
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/data.js +0 -8
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/domain.js +0 -62
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/management.js +0 -36
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/managementStore.js +0 -49
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/store.js +0 -132
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/AdminList.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/AdminList.js +0 -38
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/EffectiveGrants.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/EffectiveGrants.js +0 -11
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/GrantEditor.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/GrantEditor.js +0 -45
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MemberEditor.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MemberEditor.js +0 -54
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MembersPage.html +0 -3
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MembersPage.js +0 -27
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RecordsPage.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RecordsPage.js +0 -12
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RoleEditor.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RoleEditor.js +0 -45
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RolesPage.html +0 -3
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RolesPage.js +0 -38
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/domain.js +0 -61
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/state.js +0 -51
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/store.js +0 -116
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseActionDialog.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseActionDialog.js +0 -45
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseDetail.html +0 -4
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseDetail.js +0 -30
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseEditor.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseEditor.js +0 -67
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseExecution.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseExecution.js +0 -5
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleasesPage.html +0 -4
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleasesPage.js +0 -60
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/commands.js +0 -157
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/model.js +0 -136
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/store.js +0 -76
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewDetail.html +0 -3
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewDetail.js +0 -26
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewEvidence.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewEvidence.js +0 -14
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewProcess.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewProcess.js +0 -113
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewsPage.html +0 -3
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewsPage.js +0 -62
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/commands.js +0 -97
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/model.js +0 -147
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/store.js +0 -13
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ColumnSettings.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ColumnSettings.js +0 -9
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListBatchBar.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListBatchBar.js +0 -8
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListDeleteDialog.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListDeleteDialog.js +0 -37
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListMore.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListMore.js +0 -8
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/RecordMetadata.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/RecordMetadata.js +0 -17
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/columns.js +0 -32
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/deliveryGuide.js +0 -49
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/deliveryView.js +0 -12
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/listBatch.js +0 -15
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/listSelection.js +0 -37
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/policy.js +0 -68
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/session.js +0 -44
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConfirmationDialog.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConfirmationDialog.js +0 -25
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConsoleShell.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConsoleShell.js +0 -53
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/PrototypeGuide.html +0 -10
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/PrototypeGuide.js +0 -30
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ScopePage.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ScopePage.js +0 -10
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/SessionDialog.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/SessionDialog.js +0 -9
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/confirmation.js +0 -3
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/navigation.js +0 -19
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecDocument.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecDocument.js +0 -8
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecEdit.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecEdit.js +0 -32
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHeader.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHeader.js +0 -15
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHistory.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHistory.js +0 -11
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecReview.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecReview.js +0 -57
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecWorkspace.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecWorkspace.js +0 -37
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/data.js +0 -20
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/domain.js +0 -55
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/store.js +0 -151
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/ArtifactDetail.html +0 -3
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/ArtifactDetail.js +0 -18
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskCreate.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskCreate.js +0 -40
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskDetail.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskDetail.js +0 -51
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskLaunch.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskLaunch.js +0 -9
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TasksPage.html +0 -5
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TasksPage.js +0 -48
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/domain.js +0 -204
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/exampleSource.js +0 -22
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/registry.js +0 -135
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/store.js +0 -137
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/WorkbenchPage.html +0 -3
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/WorkbenchPage.js +0 -36
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/model.js +0 -56
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/store.js +0 -15
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowCanvas.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowCanvas.js +0 -27
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowDetail.html +0 -4
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowDetail.js +0 -31
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowEditor.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowEditor.js +0 -68
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/WorkflowsPage.html +0 -5
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/WorkflowsPage.js +0 -55
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/data.js +0 -16
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/domain.js +0 -83
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/registry.js +0 -18
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/store.js +0 -61
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/admin.css +0 -60
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/agents.css +0 -46
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/antdv.css +0 -295
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/app.css +0 -102
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/delivery.css +0 -4
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/intents.css +0 -37
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/native.css +0 -22
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/operations.css +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/pbc.css +0 -3
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/permissions.css +0 -22
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/pro.css +0 -1
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/releases.css +0 -4
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/reset.css +0 -246
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/reviews.css +0 -8
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/tasks.css +0 -6
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/tokens.css +0 -15
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/workbench.css +0 -61
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/workflows.css +0 -1
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/admin-rules.test.js +0 -96
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/agents.test.js +0 -14
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/intent-state.test.js +0 -37
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/list-batch.test.js +0 -44
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/operation-fixtures.js +0 -19
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/operation-repair.test.js +0 -14
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/operations.test.js +0 -25
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/pbc-management.test.js +0 -17
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/pbc-state.test.js +0 -24
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/permission-config.test.js +0 -23
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/permissions.test.js +0 -24
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/releases.test.js +0 -50
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/reviews.test.js +0 -36
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/runtime-forms-router.test.js +0 -28
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/runtime-state.test.js +0 -42
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/runtime-stores.test.js +0 -16
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/spec-state.test.js +0 -11
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/tasks.test.js +0 -27
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/workbench.test.js +0 -34
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/workflows.test.js +0 -16
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/convert.mjs +0 -168
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/serve.mjs +0 -7
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/styles.mjs +0 -11
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/verify.mjs +0 -24
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/serve.cjs +0 -16
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/template-inventory.json +0 -28791
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/template.json +0 -9
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/usability.css +0 -44
- package/skills/i3-ui-prototype/assets/templates/gallery/index.html +0 -40
- package/skills/i3-ui-prototype/assets/templates/generation-options.js +0 -42
- package/skills/i3-ui-prototype/assets/templates/index.html +0 -3
- package/skills/i3-ui-prototype/assets/templates/modern-workspace/manifest.json +0 -9
- package/skills/i3-ui-prototype/assets/templates/modern-workspace/preset.json +0 -6
- package/skills/i3-ui-prototype/assets/templates/presentation.html +0 -17
- package/skills/i3-ui-prototype/assets/templates/serve-gallery.cjs +0 -23
- package/skills/i3-ui-prototype/references/artifact-contract.md +0 -66
- package/skills/i3-ui-prototype/references/content-template.md +0 -81
- package/skills/i3-ui-prototype/references/enterprise-admin.md +0 -44
- package/skills/i3-ui-prototype/references/entry-contract.md +0 -71
- package/skills/i3-ui-prototype/references/execution-evidence.md +0 -51
- package/skills/i3-ui-prototype/references/expert-adapter.md +0 -76
- package/skills/i3-ui-prototype/references/framework-contract.md +0 -76
- package/skills/i3-ui-prototype/references/generation-contract.md +0 -122
- package/skills/i3-ui-prototype/references/interaction-acceptance.md +0 -169
- package/skills/i3-ui-prototype/references/legacy-native.md +0 -58
- package/skills/i3-ui-prototype/references/optional-skills.md +0 -63
- package/skills/i3-ui-prototype/references/project-layout.md +0 -92
- package/skills/i3-ui-prototype/references/template-adapters.md +0 -63
- package/skills/i3-ui-prototype/references/workflow-contract.md +0 -77
- package/skills/i3-ui-prototype/scripts/adapters/easel-html.cjs +0 -30
- package/skills/i3-ui-prototype/scripts/adapters/legacy-html.cjs +0 -28
- package/skills/i3-ui-prototype/scripts/browser-workspace.cjs +0 -72
- package/skills/i3-ui-prototype/scripts/buddy-host.cjs +0 -40
- package/skills/i3-ui-prototype/scripts/check-design-provider.cjs +0 -9
- package/skills/i3-ui-prototype/scripts/check-prototype.cjs +0 -14
- package/skills/i3-ui-prototype/scripts/codebuddy-context.cjs +0 -92
- package/skills/i3-ui-prototype/scripts/codebuddy-hook.cjs +0 -298
- package/skills/i3-ui-prototype/scripts/codebuddy-ide-source.cjs +0 -69
- package/skills/i3-ui-prototype/scripts/codebuddy-registration.cjs +0 -125
- package/skills/i3-ui-prototype/scripts/content-template.cjs +0 -98
- package/skills/i3-ui-prototype/scripts/design-provider-discovery.cjs +0 -128
- package/skills/i3-ui-prototype/scripts/enterprise-template.cjs +0 -104
- package/skills/i3-ui-prototype/scripts/execution-assertions.cjs +0 -43
- package/skills/i3-ui-prototype/scripts/execution-diagnostics.cjs +0 -91
- package/skills/i3-ui-prototype/scripts/execution-evidence.cjs +0 -177
- package/skills/i3-ui-prototype/scripts/execution-gates.cjs +0 -216
- package/skills/i3-ui-prototype/scripts/execution-policy.cjs +0 -62
- package/skills/i3-ui-prototype/scripts/execution-recovery.cjs +0 -58
- package/skills/i3-ui-prototype/scripts/execution-runtime.cjs +0 -69
- package/skills/i3-ui-prototype/scripts/generation-assets.cjs +0 -18
- package/skills/i3-ui-prototype/scripts/generation-contract.cjs +0 -214
- package/skills/i3-ui-prototype/scripts/generation-evidence.cjs +0 -50
- package/skills/i3-ui-prototype/scripts/generation-replan.cjs +0 -34
- package/skills/i3-ui-prototype/scripts/hosts/codebuddy.cjs +0 -21
- package/skills/i3-ui-prototype/scripts/init-prototype.cjs +0 -8
- package/skills/i3-ui-prototype/scripts/manage-baseline.cjs +0 -11
- package/skills/i3-ui-prototype/scripts/native-browser.cjs +0 -785
- package/skills/i3-ui-prototype/scripts/native-build.cjs +0 -91
- package/skills/i3-ui-prototype/scripts/native-command.cjs +0 -35
- package/skills/i3-ui-prototype/scripts/native-delivery.cjs +0 -104
- package/skills/i3-ui-prototype/scripts/native-devtools.cjs +0 -92
- package/skills/i3-ui-prototype/scripts/native-files.cjs +0 -44
- package/skills/i3-ui-prototype/scripts/native-pilot-lib.cjs +0 -290
- package/skills/i3-ui-prototype/scripts/native-pilot.cjs +0 -59
- package/skills/i3-ui-prototype/scripts/native-tool-name.cjs +0 -5
- package/skills/i3-ui-prototype/scripts/native-tool-result.cjs +0 -14
- package/skills/i3-ui-prototype/scripts/optional-skill-install.cjs +0 -203
- package/skills/i3-ui-prototype/scripts/project-registry.cjs +0 -126
- package/skills/i3-ui-prototype/scripts/prototype-dependencies.cjs +0 -103
- package/skills/i3-ui-prototype/scripts/prototype-hooks.cjs +0 -94
- package/skills/i3-ui-prototype/scripts/prototype-lib.cjs +0 -277
- package/skills/i3-ui-prototype/scripts/prototype-locations.cjs +0 -69
- package/skills/i3-ui-prototype/scripts/ptc-callbacks.cjs +0 -131
- package/skills/i3-ui-prototype/scripts/sync-template.cjs +0 -19
- package/skills/i3-ui-prototype/scripts/template-adapters.cjs +0 -89
- package/skills/i3-ui-prototype/scripts/template-contract.cjs +0 -407
- package/skills/i3-ui-prototype/scripts/template-inventory.cjs +0 -78
- package/skills/i3-ui-prototype/scripts/validate-result.cjs +0 -117
package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/commands.js
DELETED
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
import { can } from "../shared/policy.js";
|
|
2
|
-
import { allowedReason, actionLabels, captureVersion, releaseChecks, signature, versionOf, canReadRelease, releaseRows, terminalStates } from "./model.js";
|
|
3
|
-
export const commandKey = (c) => JSON.stringify([c.action, c.note.trim(), !!c.checked, c.input || null, c.outcome || 'pass']);
|
|
4
|
-
export function applyRelease(t, id, a, c) {
|
|
5
|
-
const r = t.releases?.find(r => r.id === id);
|
|
6
|
-
if (!r || !canReadRelease(t, a))
|
|
7
|
-
throw Error('记录不存在或没有查看权限。');
|
|
8
|
-
const old = t.releases?.flatMap(x => x.receipts.map(receipt => ({ release: x, receipt }))).find(x => x.receipt.id === c.id);
|
|
9
|
-
if (old) {
|
|
10
|
-
if (old.release.id !== id || old.receipt.fingerprint !== commandKey(c))
|
|
11
|
-
throw Error('同一提交编号不能用于不同内容,请查询原结果。');
|
|
12
|
-
return r;
|
|
13
|
-
}
|
|
14
|
-
if (r.recordVersion !== c.expected)
|
|
15
|
-
throw Error('发布单版本已被更新,输入已保留;请核对当前版本再提交。');
|
|
16
|
-
const reason = allowedReason(t, r, a, c.action);
|
|
17
|
-
if (reason)
|
|
18
|
-
throw Error(reason);
|
|
19
|
-
if (['approve', 'return', 'pause', 'resume', 'retry', 'rollback', 'stop'].includes(c.action) && (!c.note.trim() || c.note.length > 2000))
|
|
20
|
-
throw Error('请填写 1–2000 字的操作说明。');
|
|
21
|
-
if (c.action === 'approve' && !c.checked)
|
|
22
|
-
throw Error('请勾选确认已核对本版证据、环境和恢复方案。');
|
|
23
|
-
const v = versionOf(r), at = new Date().toISOString(), outcome = c.outcome || 'pass';
|
|
24
|
-
let detail = c.note.trim() || actionLabels[c.action];
|
|
25
|
-
switch (c.action) {
|
|
26
|
-
case 'edit': {
|
|
27
|
-
if (!c.input)
|
|
28
|
-
throw Error('缺少修订内容。');
|
|
29
|
-
if (!can(a, 'release:edit', t.tenantId, r.pbcId, c.input.environment))
|
|
30
|
-
throw Error('没有新目标环境的编辑权限。');
|
|
31
|
-
if (releaseRows(t).some(x => x.id !== r.id && !terminalStates.includes(x.state) && versionOf(x).environment === c.input.environment))
|
|
32
|
-
throw Error('新环境已有未结束的发布单。');
|
|
33
|
-
r.versions.push(captureVersion(t, a, c.input, v.number + 1));
|
|
34
|
-
r.approval = undefined;
|
|
35
|
-
r.state = 'draft';
|
|
36
|
-
detail = '保存修订版;原检查和授权失效,历史保留。';
|
|
37
|
-
break;
|
|
38
|
-
}
|
|
39
|
-
case 'check':
|
|
40
|
-
v.preflight = { signature: signature(v), at, by: a.name, checks: releaseChecks(t, r) };
|
|
41
|
-
detail = '发布前检查:' + v.preflight.checks.filter(c => !['pass', 'na'].includes(c.status)).length + ' 项材料待补齐。';
|
|
42
|
-
break;
|
|
43
|
-
case 'submit':
|
|
44
|
-
r.state = 'pending';
|
|
45
|
-
detail = '提交本版证据,等待人工授权。';
|
|
46
|
-
break;
|
|
47
|
-
case 'approve':
|
|
48
|
-
r.approval = { actorId: a.id, actor: a.name, at, note: c.note.trim(), version: v.number, signature: signature(v) };
|
|
49
|
-
r.state = 'approved';
|
|
50
|
-
break;
|
|
51
|
-
case 'return':
|
|
52
|
-
r.state = 'returned';
|
|
53
|
-
r.approval = undefined;
|
|
54
|
-
break;
|
|
55
|
-
case 'start':
|
|
56
|
-
r.state = 'deploying';
|
|
57
|
-
r.startedAt = at;
|
|
58
|
-
r.executionEnvironment = v.environment;
|
|
59
|
-
detail = '启动模拟部署;当前新增版本流量仍为 0%。';
|
|
60
|
-
break;
|
|
61
|
-
case 'pause':
|
|
62
|
-
r.previousState = r.state;
|
|
63
|
-
r.state = 'paused';
|
|
64
|
-
break;
|
|
65
|
-
case 'resume':
|
|
66
|
-
r.state = r.previousState;
|
|
67
|
-
r.previousState = undefined;
|
|
68
|
-
break;
|
|
69
|
-
case 'retry':
|
|
70
|
-
r.retries++;
|
|
71
|
-
r.state = r.failedStage;
|
|
72
|
-
r.failedStage = undefined;
|
|
73
|
-
detail += '(第 ' + r.retries + '/2 次重试,仅重试失败步骤)';
|
|
74
|
-
break;
|
|
75
|
-
case 'rollback':
|
|
76
|
-
r.state = 'rollingBack';
|
|
77
|
-
detail += ';目标 ' + v.materials.rollback.version + ',数据库状态需单独核查。';
|
|
78
|
-
break;
|
|
79
|
-
case 'stop':
|
|
80
|
-
r.state = 'stopped';
|
|
81
|
-
r.traffic = 0;
|
|
82
|
-
r.finishedAt = at;
|
|
83
|
-
detail += ';本次版本已撤流,数据库状态未自动还原。';
|
|
84
|
-
break;
|
|
85
|
-
case 'advance': {
|
|
86
|
-
if (outcome === 'fail') {
|
|
87
|
-
r.failedStage = r.state;
|
|
88
|
-
r.state = 'failed';
|
|
89
|
-
detail = '模拟步骤失败;已完成步骤与当前流量保留,请检查后有限重试或恢复。';
|
|
90
|
-
break;
|
|
91
|
-
}
|
|
92
|
-
if (r.state === 'deploying') {
|
|
93
|
-
r.state = 'canary';
|
|
94
|
-
r.traffic = v.traffic;
|
|
95
|
-
detail = '部署成功,人工授权覆盖首次灰度;本次版本接入 ' + v.traffic + '% 流量。';
|
|
96
|
-
}
|
|
97
|
-
else if (r.state === 'canary') {
|
|
98
|
-
const errorRate = 0.2, latency = 420, pass = errorRate <= v.errorLimit && latency <= v.latencyLimit;
|
|
99
|
-
r.observation = { at, errorRate, latency, pass };
|
|
100
|
-
r.state = pass ? 'observing' : 'failed';
|
|
101
|
-
if (!pass)
|
|
102
|
-
r.failedStage = 'canary';
|
|
103
|
-
detail = '灰度观测(模拟):错误率 ' + errorRate + '%,P95 ' + latency + 'ms;' + (pass ? '满足本版阈值,可继续全量' : '不满足阈值,禁止全量') + '。';
|
|
104
|
-
}
|
|
105
|
-
else if (r.state === 'observing') {
|
|
106
|
-
if (!r.observation?.pass)
|
|
107
|
-
throw Error('尚无合格的本次灰度观测,禁止全量。');
|
|
108
|
-
r.state = 'succeeded';
|
|
109
|
-
r.traffic = 100;
|
|
110
|
-
r.finishedAt = at;
|
|
111
|
-
detail = '本次版本已全量(模拟);运行验收另行处理。';
|
|
112
|
-
}
|
|
113
|
-
else {
|
|
114
|
-
r.state = 'rolledBack';
|
|
115
|
-
r.traffic = 0;
|
|
116
|
-
r.finishedAt = at;
|
|
117
|
-
detail = '应用已回滚至 ' + v.materials.rollback.version + '(模拟),本次版本流量 0%;数据库未自动还原,需按迁移方案核查。';
|
|
118
|
-
}
|
|
119
|
-
break;
|
|
120
|
-
}
|
|
121
|
-
case 'verify':
|
|
122
|
-
detail = '已查询原请求 ' + r.unconfirmed + ';回执已落库,未重复执行。';
|
|
123
|
-
r.unconfirmed = undefined;
|
|
124
|
-
break;
|
|
125
|
-
case 'delete':
|
|
126
|
-
r.isDeleted = true;
|
|
127
|
-
detail = '逻辑删除未提交草稿。';
|
|
128
|
-
break;
|
|
129
|
-
}
|
|
130
|
-
r.reason = detail;
|
|
131
|
-
r.updatedBy = a.name;
|
|
132
|
-
r.updatedAt = at;
|
|
133
|
-
r.recordVersion++;
|
|
134
|
-
r.receipts.push({ id: c.id, action: c.action, fingerprint: commandKey(c), actorId: a.id, actor: a.name, at, note: c.note, version: versionOf(r).number, state: r.state });
|
|
135
|
-
r.events.push({ id: c.id, at, actor: a.name, action: actionLabels[c.action], detail, version: versionOf(r).number, traffic: r.traffic });
|
|
136
|
-
if (c.unknown)
|
|
137
|
-
r.unconfirmed = c.id;
|
|
138
|
-
const human = t.stages.find(s => t.binding.flow.body.nodes.find(n => n.id === s.nodeId)?.gate === 'production'), publish = t.stages.find(s => t.binding.flow.body.nodes.find(n => n.id === s.nodeId)?.kind === 'publish');
|
|
139
|
-
if (v.environment === 'production') {
|
|
140
|
-
if (human) {
|
|
141
|
-
human.state = r.approval ? 'done' : 'active';
|
|
142
|
-
human.finishedAt = r.approval?.at;
|
|
143
|
-
human.detail = r.approval ? r.approval.actor + ' 授权发布单 v' + r.approval.version : '本发布版尚待人工授权';
|
|
144
|
-
}
|
|
145
|
-
if (r.startedAt && publish) {
|
|
146
|
-
publish.state = r.state === 'succeeded' ? 'done' : ['failed', 'rolledBack', 'stopped'].includes(r.state) ? 'failed' : 'active';
|
|
147
|
-
publish.startedAt = r.startedAt;
|
|
148
|
-
publish.finishedAt = r.finishedAt;
|
|
149
|
-
publish.attempts = r.receipts.filter(x => ['start', 'retry'].includes(x.action)).length;
|
|
150
|
-
publish.detail = detail;
|
|
151
|
-
t.currentId = publish.nodeId;
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
if (r.startedAt)
|
|
155
|
-
t.reason = detail;
|
|
156
|
-
return r;
|
|
157
|
-
}
|
package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/model.js
DELETED
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
import { can, metadata } from "../shared/policy.js";
|
|
2
|
-
import { clone } from "../tasks/domain.js";
|
|
3
|
-
import { captureQuality, reviewsForTask, refsOf } from "../reviews/model.js";
|
|
4
|
-
export const environments = [{ value: 'staging', label: '预发布环境' }, { value: 'production', label: '生产环境' }];
|
|
5
|
-
export const releaseLabels = { draft: '发布草稿', pending: '待人工授权', returned: '已退回', approved: '已授权 · 待执行', deploying: '部署中', canary: '灰度中', observing: '待全量', succeeded: '发布成功', failed: '发布失败', paused: '已暂停', rollingBack: '回滚中', rolledBack: '已回滚', stopped: '已停止' };
|
|
6
|
-
export const releaseColors = { draft: 'default', pending: 'orange', returned: 'orange', approved: 'cyan', deploying: 'blue', canary: 'blue', observing: 'cyan', succeeded: 'green', failed: 'red', paused: 'default', rollingBack: 'orange', rolledBack: 'default', stopped: 'default' };
|
|
7
|
-
export const versionOf = (r) => r.versions.at(-1);
|
|
8
|
-
export const releaseRows = (t) => t.releases?.filter(r => !r.isDeleted) || [];
|
|
9
|
-
export const releaseNeedsAction = (r) => !!r.unconfirmed || !terminalStates.includes(r.state);
|
|
10
|
-
export const activeRelease = (t) => releaseRows(t).filter(releaseNeedsAction).sort((a, b) => Number(!!b.unconfirmed) - Number(!!a.unconfirmed) || b.updatedAt.localeCompare(a.updatedAt))[0];
|
|
11
|
-
export const currentRelease = (t) => activeRelease(t) || releaseRows(t).at(-1);
|
|
12
|
-
export const hasPendingRelease = (t) => !!activeRelease(t) || !releaseRows(t).some(r => versionOf(r).environment === 'production' && terminalStates.includes(r.state));
|
|
13
|
-
export const environmentLabel = (id) => environments.find(e => e.value === id)?.label || id;
|
|
14
|
-
export const signature = (v) => JSON.stringify([v.number, v.sourceKey, v.version, v.environment, v.materials?.digest, v.config, v.description, v.traffic, v.errorLimit, v.latencyLimit, v.rollbackPlan, v.materials?.rollback]);
|
|
15
|
-
export const sourceKey = (t) => JSON.stringify([t.id, t.binding.spec.number, t.binding.spec.source.version, t.binding.flowId, t.binding.flow.number, t.reworks, t.artifacts.filter(a => a.kind !== 'review').map(a => [a.id, a.versions.at(-1)?.number]), reviewsForTask(t).find(r => r.id === captureQuality(t)?.id)?.decision?.requestId || 'machine']);
|
|
16
|
-
export function qualityReason(t) {
|
|
17
|
-
if (t.isDeleted)
|
|
18
|
-
return '来源任务已删除。';
|
|
19
|
-
if (t.status !== 'ready' || t.pendingDesignReview)
|
|
20
|
-
return '来源尚未完成交付质量检查,请先处理任务。';
|
|
21
|
-
const current = captureQuality(t);
|
|
22
|
-
if (!current || current.checks.some(c => c.required && c.status !== 'pass'))
|
|
23
|
-
return '本轮质量检查或独立验证尚未通过。';
|
|
24
|
-
const review = reviewsForTask(t).find(r => r.id === current.id);
|
|
25
|
-
if (current.humanRequired && review?.decision?.action !== 'confirm')
|
|
26
|
-
return '本轮质量尚待人工确认。';
|
|
27
|
-
return '';
|
|
28
|
-
}
|
|
29
|
-
export function validateInput(input) {
|
|
30
|
-
if (!input.name.trim() || input.name.length > 80)
|
|
31
|
-
throw Error('请填写 1–80 字的发布名称。');
|
|
32
|
-
if (!/^[0-9]+\.[0-9]+\.[0-9]+(?:-[a-zA-Z0-9.]+)?$/.test(input.version))
|
|
33
|
-
throw Error('版本号请使用 1.0.0 或 1.0.0-rc.1 格式。');
|
|
34
|
-
if (!environments.some(e => e.value === input.environment))
|
|
35
|
-
throw Error('请选择有效目标环境。');
|
|
36
|
-
if (!input.config.trim() || input.config.length > 100)
|
|
37
|
-
throw Error('请填写 1–100 字的配置快照标识。');
|
|
38
|
-
if (!Number.isFinite(input.traffic) || input.traffic < 1 || input.traffic > 50)
|
|
39
|
-
throw Error('首次灰度比例为 1–50%。');
|
|
40
|
-
if (!Number.isFinite(input.errorLimit) || input.errorLimit <= 0 || input.errorLimit > 100 || !Number.isFinite(input.latencyLimit) || input.latencyLimit <= 0)
|
|
41
|
-
throw Error('请填写有效的错误率和延迟阈值。');
|
|
42
|
-
if (input.description.length > 2000 || input.rollbackPlan.length > 2000)
|
|
43
|
-
throw Error('发布说明与回退方案分别最多 2000 字。');
|
|
44
|
-
}
|
|
45
|
-
export const canReadRelease = (t, a) => !t.isDeleted && can(a, 'task:view', t.tenantId, t.binding.pbcId) && can(a, 'artifact:view', t.tenantId, t.binding.pbcId);
|
|
46
|
-
export function captureVersion(t, actor, input, number) {
|
|
47
|
-
validateInput(input);
|
|
48
|
-
return { ...clone(input), name: input.name.trim(), number, at: new Date().toISOString(), by: actor.name, sourceKey: sourceKey(t), sourceCode: t.code, specVersion: t.binding.spec.number, flowName: t.binding.flow.body.name, flowVersion: t.binding.flow.number, refs: refsOf(t), materials: t.releaseMaterials?.sourceKey === sourceKey(t) ? clone(t.releaseMaterials) : undefined };
|
|
49
|
-
}
|
|
50
|
-
export const terminalStates = ['succeeded', 'rolledBack', 'stopped'];
|
|
51
|
-
export function createRelease(t, actor, input, id) {
|
|
52
|
-
if (!canReadRelease(t, actor) || !can(actor, 'release:edit', t.tenantId, t.binding.pbcId, input.environment))
|
|
53
|
-
throw Error('没有此任务或目标环境的发布创建权限。');
|
|
54
|
-
const fingerprint = JSON.stringify(input), old = t.releases?.find(r => r.id === id);
|
|
55
|
-
if (old) {
|
|
56
|
-
if (old.receipts[0]?.fingerprint !== fingerprint || old.isDeleted)
|
|
57
|
-
throw Error('同一创建编号不能用于不同内容。');
|
|
58
|
-
return old;
|
|
59
|
-
}
|
|
60
|
-
const reason = qualityReason(t);
|
|
61
|
-
if (reason)
|
|
62
|
-
throw Error(reason);
|
|
63
|
-
if (releaseRows(t).some(r => versionOf(r).environment === input.environment && releaseNeedsAction(r)))
|
|
64
|
-
throw Error('此任务在目标环境已有未结束的发布单,请继续原发布单。');
|
|
65
|
-
const v = captureVersion(t, actor, input, 1), at = v.at;
|
|
66
|
-
const r = { ...metadata(actor, at, t.tenantId), id, code: 'REL-' + id.slice(0, 8).toUpperCase(), taskId: t.id, pbcId: t.binding.pbcId, state: 'draft', versions: [v], traffic: 0, retries: 0, reason: '准备发布材料,尚未提交人工授权。', receipts: [{ id, action: 'create', fingerprint, actorId: actor.id, actor: actor.name, at, note: '创建草稿', version: 1, state: 'draft' }], events: [{ id, at, actor: actor.name, action: '创建草稿', detail: '固定来源版本;尚未执行发布。', version: 1, traffic: 0 }] };
|
|
67
|
-
(t.releases ||= []).push(r);
|
|
68
|
-
return r;
|
|
69
|
-
}
|
|
70
|
-
export const permissionFor = { edit: 'release:edit', check: 'release:edit', submit: 'release:submit', approve: 'release:approve', return: 'release:approve', start: 'release:execute', advance: 'release:execute', pause: 'release:pause', resume: 'release:execute', retry: 'release:execute', rollback: 'release:rollback', stop: 'release:rollback', verify: 'task:view', delete: 'release:delete' };
|
|
71
|
-
export const actionLabels = { edit: '修改发布单', check: '检查发布材料', submit: '提交审核', approve: '授权本次发布', return: '退回修改', start: '开始部署', advance: '推进模拟事件', pause: '暂停发布', resume: '恢复发布', retry: '重试失败步骤', rollback: '回滚至稳定版本', stop: '停止并撤流', verify: '查询原请求回执', delete: '删除草稿' };
|
|
72
|
-
export const releaseUrl = (r, execution = false) => '/releases/' + r.taskId + '/' + r.id + (execution ? '/execution' : '');
|
|
73
|
-
export function releaseChecks(t, r) {
|
|
74
|
-
const v = versionOf(r), m = v.materials;
|
|
75
|
-
const check = (id, name, ok, detail) => ({ id, name, status: ok ? 'pass' : 'missing', detail });
|
|
76
|
-
return [check('source', '来源版本', v.sourceKey === sourceKey(t) && !qualityReason(t), v.sourceKey === sourceKey(t) ? qualityReason(t) || '当前来源与绑定版本一致' : '来源版本已变化,请修订发布单并重新检查。'),
|
|
77
|
-
check('artifact', '提交与制品', !!m?.commit && !!m?.digest, m ? m.commit + ' / ' + m.digest : '缺少独立发布材料;历史质量汇总不代表已构建制品。'),
|
|
78
|
-
...['merge', 'build', 'functional', 'contract', 'eval', 'security', 'migration'].map((id, i) => { const c = m?.checks.find(c => c.id === id); return c ? clone(c) : { id, name: ['合并记录', '构建', '功能测试', '接口契约', 'AI 评估', '安全检查', '迁移兼容性'][i], status: 'missing', detail: '尚无此分项证据。' }; }),
|
|
79
|
-
check('config', '配置快照', !!m && m.config === v.config, m?.config === v.config ? '配置已绑定本次材料' : '材料配置与发布配置不一致,须补齐新配置的检查证据。'),
|
|
80
|
-
check('plan', '发布与回退方案', !!v.description.trim() && !!v.rollbackPlan.trim(), v.description.trim() && v.rollbackPlan.trim() ? '发布说明与回退方案已填写' : '请填写发布说明与回退方案。'),
|
|
81
|
-
check('rollback-target', '恢复路径', !m?.rollback || m.rollback.environment === v.environment, m?.rollback ? '可回滚 ' + m.rollback.version + '(' + environmentLabel(m.rollback.environment) + ');不承诺数据库自动还原。' : '首次发布无稳定版本;失败时停止并撤流,数据另行恢复。')];
|
|
82
|
-
}
|
|
83
|
-
export function allowedReason(t, r, a, action) {
|
|
84
|
-
if (!canReadRelease(t, a) || r.isDeleted)
|
|
85
|
-
return '没有任务与产物查看权限,或记录已删除。';
|
|
86
|
-
const v = versionOf(r), permission = (['advance', 'resume', 'retry'].includes(action) && (r.state === 'rollingBack' || r.previousState === 'rollingBack' || r.failedStage === 'rollingBack')) ? 'release:rollback' : permissionFor[action];
|
|
87
|
-
if (!can(a, permission, t.tenantId, r.pbcId, v.environment))
|
|
88
|
-
return '没有此 PBC / 目标环境的操作权限,请在权限管理配置。';
|
|
89
|
-
if (action === 'verify')
|
|
90
|
-
return r.unconfirmed ? '' : '当前没有待查询的回执。';
|
|
91
|
-
if (r.unconfirmed)
|
|
92
|
-
return '上次提交响应不明,请先查询原请求回执。';
|
|
93
|
-
if (action === 'delete')
|
|
94
|
-
return r.state === 'draft' && r.receipts.every(x => ['create', 'edit', 'check'].includes(x.action)) && !r.startedAt ? '' : '只可删除未提交、无授权或执行历史的发布草稿。';
|
|
95
|
-
if (action === 'edit')
|
|
96
|
-
return !r.startedAt && ['draft', 'returned', 'pending', 'approved'].includes(r.state) ? '' : '执行开始后版本不能修改,请创建后续发布单。';
|
|
97
|
-
if (action === 'check')
|
|
98
|
-
return ['draft', 'returned'].includes(r.state) ? '' : '请先修订为草稿,再重新检查。';
|
|
99
|
-
if (action === 'return')
|
|
100
|
-
return r.state === 'pending' ? '' : '当前发布单不在待审核状态。';
|
|
101
|
-
if (action === 'pause')
|
|
102
|
-
return ['deploying', 'canary', 'observing', 'rollingBack'].includes(r.state) ? '' : '当前没有可暂停的执行步骤。';
|
|
103
|
-
if (action === 'rollback')
|
|
104
|
-
return r.traffic > 0 && ['canary', 'observing', 'succeeded', 'failed', 'paused'].includes(r.state) && v.materials?.rollback?.environment === v.environment ? '' : '尚无可用的稳定版本回滚目标;首发请停止并撤流。';
|
|
105
|
-
if (action === 'stop')
|
|
106
|
-
return r.startedAt && !['rolledBack', 'stopped'].includes(r.state) ? '' : '当前没有可停止的发布。';
|
|
107
|
-
if (action === 'resume' && r.state !== 'paused')
|
|
108
|
-
return '当前发布未暂停。';
|
|
109
|
-
if (action === 'retry' && (r.state !== 'failed' || !r.failedStage))
|
|
110
|
-
return '当前没有失败步骤。';
|
|
111
|
-
if (action === 'retry' && r.retries >= 2)
|
|
112
|
-
return '已达到本发布单的 2 次重试次数,请停止或人工恢复。';
|
|
113
|
-
if (action === 'advance' && !['deploying', 'canary', 'observing', 'rollingBack'].includes(r.state))
|
|
114
|
-
return '当前没有可推进的步骤。';
|
|
115
|
-
const recovery = r.state === 'rollingBack' || (['retry', 'resume'].includes(action) && (r.failedStage === 'rollingBack' || r.previousState === 'rollingBack'));
|
|
116
|
-
if (recovery)
|
|
117
|
-
return '';
|
|
118
|
-
if (action === 'start' && r.state !== 'approved')
|
|
119
|
-
return '本版本尚未获得人工授权,不能执行发布。';
|
|
120
|
-
if (action === 'submit' && !['draft', 'returned'].includes(r.state))
|
|
121
|
-
return '当前状态不能提交审核。';
|
|
122
|
-
if (action === 'approve' && r.state !== 'pending')
|
|
123
|
-
return '本版本不在待人工授权状态。';
|
|
124
|
-
if (v.sourceKey !== sourceKey(t) || qualityReason(t))
|
|
125
|
-
return '来源或质量版本已经变化,请重新检查并提交发布。';
|
|
126
|
-
const failures = releaseChecks(t, r).filter(c => !['pass', 'na'].includes(c.status));
|
|
127
|
-
if (failures.length)
|
|
128
|
-
return '发布材料或证据尚未齐备:' + failures.map(c => c.name).join('、');
|
|
129
|
-
if (!v.preflight || v.preflight.signature !== signature(v))
|
|
130
|
-
return '请先完成本版本的发布前检查。';
|
|
131
|
-
if (['start', 'advance', 'resume', 'retry'].includes(action) && (!r.approval || r.approval.signature !== signature(v)))
|
|
132
|
-
return '人工授权已失效,请重新核对并授权本版本。';
|
|
133
|
-
return '';
|
|
134
|
-
}
|
|
135
|
-
export function taskReleaseLabel(t, a) { const r = currentRelease(t); return canReadRelease(t, a) && r ? (versionOf(r).environment === 'production' ? '' : environmentLabel(versionOf(r).environment) + ' · ') + (r.unconfirmed ? '结果待核实' : releaseLabels[r.state]) : ''; }
|
|
136
|
-
export function releaseSummary(r) { return r.unconfirmed ? '本次提交结果尚未核实,请查询原请求回执;核实前保留待办,不重复执行。' : environmentLabel(versionOf(r).environment) + ' · ' + r.reason; }
|
package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/store.js
DELETED
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import { computed, ref } from '../../runtime/state.js';
|
|
2
|
-
import { defineStore } from "../../runtime/state.js";
|
|
3
|
-
import { useSession } from "../shared/session.js";
|
|
4
|
-
import { usePbcs } from "../pbc/store.js";
|
|
5
|
-
import { metadata } from "../shared/policy.js";
|
|
6
|
-
import { taskRecords, taskReadError, commitTaskChanges, seedTasks } from "../tasks/registry.js";
|
|
7
|
-
import { clone, taskEvent } from "../tasks/domain.js";
|
|
8
|
-
import { applyRelease } from "./commands.js";
|
|
9
|
-
import { allowedReason, canReadRelease, createRelease, sourceKey, qualityReason, releaseRows } from "./model.js";
|
|
10
|
-
export const useReleases = defineStore('releases', () => {
|
|
11
|
-
const session = useSession(), pbcs = usePbcs(), scene = ref('normal'), response = ref('success');
|
|
12
|
-
const tasks = computed(() => taskRecords.value.filter(t => canReadRelease(t, session.actor)));
|
|
13
|
-
const rows = computed(() => tasks.value.flatMap(task => releaseRows(task).map(release => ({ id: release.id, task, release, project: task.binding.project, recordVersion: release.recordVersion }))).sort((a, b) => b.release.updatedAt.localeCompare(a.release.updatedAt)));
|
|
14
|
-
const find = (id) => rows.value.find(r => r.id === id);
|
|
15
|
-
const pbcReason = (t) => { const p = pbcs.catalog.find(p => p.id === t.binding.pbcId); return !p || p.isDeleted || p.state !== 'active' ? 'PBC 不存在或已归档,请先处理 PBC 状态。' : ''; };
|
|
16
|
-
const sourceReason = (t) => pbcReason(t) || qualityReason(t);
|
|
17
|
-
function reason(row, action) { return session.state !== 'active' ? '登录状态已失效,请重新登录。' : (!['rollback', 'stop', 'pause', 'verify', 'delete'].includes(action) ? pbcReason(row.task) : '') || allowedReason(row.task, row.release, session.actor, action); }
|
|
18
|
-
function current(id) { const t = tasks.value.find(t => t.id === id); if (!t)
|
|
19
|
-
throw Error('任务不存在或无权访问。'); return clone(t); }
|
|
20
|
-
function persist(t, expected, action) { t.recordVersion++; t.updatedBy = session.actor.name; t.updatedAt = new Date().toISOString(); taskEvent(t, session.actor.name, action, '发布单、版本证据及操作回执已同步(模拟)。'); commitTaskChanges([t], [{ id: t.id, version: expected }]); }
|
|
21
|
-
function create(taskId, input, id, expected) { session.require('release:edit', undefined, undefined, input.environment); const t = current(taskId); if (t.recordVersion !== expected && !t.releases?.some(r => r.id === id))
|
|
22
|
-
throw Error('来源任务已更新,输入保留,请核对当前版本。'); const reason = sourceReason(t); if (reason)
|
|
23
|
-
throw Error(reason); session.writeCheck(); const prior = t.releases?.find(r => r.id === id), mode = response.value; response.value = 'success'; if (mode === 'failure' && !prior)
|
|
24
|
-
throw Error('创建提交失败,尚未保存;输入已保留。'); const r = createRelease(t, session.actor, input, id); if (!prior) {
|
|
25
|
-
if (mode === 'unknown')
|
|
26
|
-
r.unconfirmed = id;
|
|
27
|
-
persist(t, t.recordVersion, '创建发布草稿');
|
|
28
|
-
} return r; }
|
|
29
|
-
function apply(taskId, id, command) { session.require('task:view'); const t = current(taskId), r = t.releases?.find(r => r.id === id); if (!r)
|
|
30
|
-
throw Error('发布单不存在。'); const replay = r.receipts.some(x => x.id === command.id); if (!replay) {
|
|
31
|
-
const row = find(id);
|
|
32
|
-
const why = reason(row, command.action);
|
|
33
|
-
if (why)
|
|
34
|
-
throw Error(why);
|
|
35
|
-
} session.writeCheck(); const mode = response.value; response.value = 'success'; if (mode === 'failure' && !replay)
|
|
36
|
-
throw Error('提交失败(模拟服务不可用),未执行本次操作;输入保留。'); const result = applyRelease(t, id, session.actor, { ...command, unknown: mode === 'unknown' && command.action !== 'verify' }); if (!replay)
|
|
37
|
-
persist(t, t.recordVersion, '发布:' + command.action); return result; }
|
|
38
|
-
function checkDelete(target) { const row = find(target.id); if (!row)
|
|
39
|
-
throw Error('记录不存在或无权访问。'); if (row.recordVersion !== target.recordVersion)
|
|
40
|
-
throw Error('记录已更新,请重新选择。'); const why = reason(row, 'delete'); if (why)
|
|
41
|
-
throw Error(why); }
|
|
42
|
-
function removeMany(targets) { targets.forEach(checkDelete); session.writeCheck(); const changed = new Map(), expected = []; for (const target of targets) {
|
|
43
|
-
const row = find(target.id);
|
|
44
|
-
let t = changed.get(row.task.id);
|
|
45
|
-
if (!t) {
|
|
46
|
-
t = clone(row.task);
|
|
47
|
-
changed.set(t.id, t);
|
|
48
|
-
expected.push({ id: t.id, version: t.recordVersion });
|
|
49
|
-
}
|
|
50
|
-
applyRelease(t, target.id, session.actor, { id: crypto.randomUUID(), action: 'delete', expected: target.recordVersion, note: '删除未提交草稿' });
|
|
51
|
-
} for (const t of changed.values()) {
|
|
52
|
-
t.recordVersion++;
|
|
53
|
-
t.updatedBy = session.actor.name;
|
|
54
|
-
t.updatedAt = new Date().toISOString();
|
|
55
|
-
taskEvent(t, session.actor.name, '批量删除发布草稿', '仅删除本次选择的未提交草稿;历史记录保留。');
|
|
56
|
-
} commitTaskChanges([...changed.values()], expected); }
|
|
57
|
-
function addExamples() { session.require('task:create', 'heating', 'pbc-0'); session.require('task:operate', 'heating', 'pbc-0'); session.writeCheck(); const changes = []; for (let i = 0; i < 2; i++) {
|
|
58
|
-
const id = 'release-example-' + i;
|
|
59
|
-
if (taskRecords.value.some(t => t.id === id))
|
|
60
|
-
continue;
|
|
61
|
-
const t = clone(seedTasks()[6]);
|
|
62
|
-
t.id = id;
|
|
63
|
-
t.code = 'DEL-RELEASE-00' + (i + 1);
|
|
64
|
-
t.name = i ? '智能分诊 · 稳定版本升级样例' : '智能分诊 · 首次发布样例';
|
|
65
|
-
Object.assign(t, metadata(session.actor, new Date().toISOString(), 'heating'));
|
|
66
|
-
t.owner = session.actor.name;
|
|
67
|
-
t.note = 'PT-06a 独立模拟样例;材料与观测均为预置,不代表真实 CI 或发布。';
|
|
68
|
-
for (const a of t.artifacts)
|
|
69
|
-
for (const v of a.versions)
|
|
70
|
-
v.taskId = id;
|
|
71
|
-
t.releaseMaterials = { sourceKey: sourceKey(t), commit: 'demo-commit-' + i, digest: 'sha256:demo-artifact-' + i, config: 'config-v1', by: '发布材料演示器', at: new Date().toISOString(), migration: i ? 'expand-contract' : 'none', checks: ['merge', 'build', 'functional', 'contract', 'eval', 'security', 'migration'].map((id, j) => ({ id, name: ['合并记录', '构建', '功能测试', '接口契约', 'AI 评估', '安全检查', '迁移兼容性'][j], status: 'pass', detail: '预置模拟证据:' + (id === 'migration' ? (i ? '采用兼容扩展迁移;应用回滚后数据库仍需核查。' : '本次无数据库变更。') : '本版检查通过(未连接真实 CI)。') })), rollback: i ? { version: '0.9.0', digest: 'sha256:demo-stable', config: 'config-stable', environment: 'production' } : undefined };
|
|
72
|
-
changes.push(t);
|
|
73
|
-
} if (changes.length)
|
|
74
|
-
commitTaskChanges(changes, changes.map(t => ({ id: t.id }))); return changes.length; }
|
|
75
|
-
return { session, tasks, rows, find, reason, sourceReason, create, apply, removeMany, checkDelete, addExamples, scene, response, notice: taskReadError };
|
|
76
|
-
});
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
<!-- 来源:src/reviews/ReviewDetail.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
|
|
2
|
-
<template data-component="Result" data-if="(!row)" status="403" title="评审记录不存在或无权访问"><template data-slot="extra"><template data-component="Button" data-on-click="(router.push('/reviews'))">返回评审列表</template></template></template><template data-else=""><div class="page-heading"><div><template data-component="Button" type="link" class="agent-back" data-on-click="(router.push('/reviews'))">← 返回评审列表</template><div class="agent-title"><h1>{{ (row.review.title) }}</h1><template data-component="Tag" data-bind-color="(stateColors[row.status])">{{ (stateLabels[row.status]) }}</template></div><p>{{ (row.task.name) }} · {{ (row.review.code) }}</p></div><template data-component="Space" wrap=""><template data-component="Button" data-on-click="(router.push('/tasks/' + row.task.id))">交付任务</template><template data-component="Button" data-bind-disabled="(!store.session.can('pbc:view', row.task.tenantId, row.task.binding.pbcId))" data-on-click="(router.push('/pbcs/' + row.task.binding.pbcId + '/workspace'))">PBC 工作区</template></template></div><template data-component="Alert" data-if="(error)" type="error" show-icon="" data-bind-title="(error)" class="page-alert"></template><template data-component="Alert" data-if="(row.status === 'superseded')" type="warning" show-icon="" title="此记录依据的版本已经更新" description="历史证据保留,继续处理请进入当前评审。" class="page-alert"><template data-slot="action"><template data-component="Button" data-if="(current)" data-on-click="(router.push(reviewUrl(row.task.id, current.id)))">打开当前评审</template></template></template><template data-component="Alert" data-if="(row.status === 'automatic')" type="success" show-icon="" title="当前质量点按已登记策略由机器检查通过" description="没有增加额外人工批准。生产发布仍需人工授权,当前尚未发布。" class="page-alert"></template><div class="review-detail-grid"><section class="agent-panel"><template data-component="Tabs" data-model-active-key="(tab)" data-bind-items="([{ key: 'evidence', label: '检查与版本证据' }, { key: 'history', label: '处理记录' }, { key: 'metadata', label: '基础信息' }])"></template><template data-component="ReviewEvidence" data-if="(tab === 'evidence')" data-bind-row="(row)"></template><template data-else-if="(tab === 'history')"><h2>本次处理结果</h2><template data-if="(row.review.decision)"><template data-component="Tag" data-bind-color="(stateColors[row.status])">{{ (stateLabels[row.status]) }}</template><p>{{ (row.review.decision.actor) }} · {{ (formatDate(row.review.decision.at)) }}</p><p class="review-text">{{ (row.review.decision.note) }}</p><p data-if="(row.review.decision.impact)" class="review-text">影响说明:{{ (row.review.decision.impact) }}</p><template data-component="Button" data-if="(row.review.decision.nextReviewId)" type="primary" data-on-click="(router.push(reviewUrl(row.task.id, row.review.decision.nextReviewId)))">查看新设计 v{{ (row.review.decision.newVersion) }}</template></template><p data-else="" class="muted">本记录尚无人工作出处理;不会用 Agent 的文字代替人工批准。</p><h3>同一任务的评审历史</h3><ol class="review-history"><li data-each="r in (store.rows.filter(r => r.task.id === row.task.id))" data-bind-key="(r.id)"><template data-component="Button" type="link" data-on-click="router.push(reviewUrl(r.task.id, r.review.id));
|
|
3
|
-
tab = 'history';">{{ (r.review.code) }} · {{ (r.review.title) }}</template><template data-component="Tag" data-bind-color="(stateColors[r.status])">{{ (stateLabels[r.status]) }}</template><small>{{ (formatDate(r.review.updatedAt)) }} · {{ (r.review.decision?.actor || r.review.verifier) }}</small></li></ol><p class="muted">审批和验证历史只读保留,不适用删除。</p></template><template data-else=""><template data-component="RecordMetadata" data-bind-record="(row.review)"></template><p>所属 PBC:{{ (row.project) }} · {{ (tenantLabel(row.task.tenantId)) }}</p><p>实际处理人:{{ (row.review.decision?.actor || '尚未处理') }} · {{ (formatDate(row.review.decision?.at || '')) }}</p></template></section><aside class="review-aside"><section data-if="(!closed)" class="agent-panel quality-review-actions"><h2>处理当前评审</h2><div data-each="a in ['confirm', 'edit', 'replan']" data-bind-key="(a)"><template data-component="Tooltip" data-bind-title="(store.reason(row, a))"><span><template data-component="Button" block="" data-bind-type="(a === 'confirm' ? 'primary' : 'default')" data-bind-disabled="(!!store.reason(row, a))" data-on-click="(process(a))">{{ (names[a]) }}</template></span></template><small data-if="(store.reason(row, a))" class="muted">{{ (store.reason(row, a)) }}</small></div><p class="review-footnote">处理只作用于本记录的版本。质量确认完成后,仍须进入后续发布授权。</p></section><section class="agent-panel"><h2>本次评审依据</h2><dl class="task-trace"><dt>PBC</dt><dd>{{ (row.project) }}</dd><dt>交付任务</dt><dd>{{ (row.task.code) }}</dd><dt>来源规格</dt><dd>{{ (row.task.binding.spec.source.code) }} · 规格 v{{ (row.task.binding.spec.number) }}<br>{{ (row.task.binding.spec.confirmedBy) }} · {{ (formatDate(row.task.binding.spec.confirmedAt || '')) }}</dd><dt>流程版本</dt><dd>{{ (row.task.binding.flow.body.name) }} · v{{ (row.task.binding.flow.number) }}</dd><dt>独立验证者</dt><dd>{{ (row.review.verifier) }}</dd><dt>验证时间</dt><dd>{{ (formatDate(row.review.verificationAt || '')) }}</dd><dt>分级与适用确认点</dt><dd><template data-component="Tag">{{ (row.review.grade ? row.review.grade + ' 档(已登记样例)' : '任务未登记分级') }}</template><p>{{ (row.review.policyReason) }}</p></dd><dt>处理轮次</dt><dd>第 {{ (row.review.iteration + 1) }} 轮 · 当前已处理 {{ (row.task.reworks) }} / {{ (reviewBudget(row.task)) }} 次(原型上限)</dd></dl><template data-component="Button" data-bind-disabled="(!store.session.can('spec:view', row.task.tenantId))" data-on-click="(router.push('/intents/' + row.task.binding.intentId + '/spec'))">查看当前需求规格</template><p class="muted">当前规格可能有新版本;本记录始终引用上述绑定版本。</p></section><section data-if="(row.review.kind === 'design' && ['checking', 'blocked'].includes(row.status))" class="agent-panel review-demo"><h2>模拟设计复核</h2><p>仅用于演示针对新设计版本的检查响应。</p><template data-component="Select" data-model-value="(outcome)" aria-label="设计复核演示结果" data-bind-options="([{ value: 'pass', label: '本次复核通过' }, { value: 'fail', label: '本次复核未通过' }])"></template><template data-component="Button" data-bind-disabled="(!store.session.can('task:operate', row.task.tenantId, row.task.binding.pbcId))" data-on-click="(validate)">接收一次模拟复核结果</template></section></aside></div></template>
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { computed, ref, watch } from '../../runtime/state.js';
|
|
2
|
-
import { useRoute, useRouter } from "../../runtime/router.js";
|
|
3
|
-
import { Alert, Button, Result, Space, Tabs, Tag, Select, Tooltip } from "../../runtime/widgets.js";
|
|
4
|
-
import { useReviews } from "./store.js";
|
|
5
|
-
import { stateLabels, stateColors, reviewUrl, actionableReview, reviewBudget } from "./model.js";
|
|
6
|
-
import { formatDate, tenantLabel } from "../shared/policy.js";
|
|
7
|
-
import RecordMetadata from "../shared/RecordMetadata.js";
|
|
8
|
-
import ReviewEvidence from "./ReviewEvidence.js";
|
|
9
|
-
import { createComponent } from '../../runtime/dom.js';
|
|
10
|
-
export default createComponent({ name: 'ReviewDetail', propKeys: [], template: new URL('./ReviewDetail.html', import.meta.url).href, setup(__props, __emit) {
|
|
11
|
-
const store = useReviews(), route = useRoute(), router = useRouter(), tab = ref(String(route.query.tab || 'evidence')), error = ref(''), outcome = ref('pass');
|
|
12
|
-
const row = computed(() => store.find(String(route.params.taskId), String(route.params.reviewId))), current = computed(() => row.value && actionableReview(row.value.task));
|
|
13
|
-
watch(() => route.query.tab, value => tab.value = String(value || 'evidence'));
|
|
14
|
-
const closed = computed(() => row.value && ['approved', 'edited', 'replanned', 'automatic', 'superseded'].includes(row.value.status));
|
|
15
|
-
function process(action) { if (row.value)
|
|
16
|
-
router.push(reviewUrl(row.value.task.id, row.value.review.id) + '/process?action=' + action); }
|
|
17
|
-
function validate() { if (!row.value)
|
|
18
|
-
return; error.value = ''; try {
|
|
19
|
-
store.tasks.reviewValidation(row.value.task.id, row.value.task.recordVersion, row.value.review.id, outcome.value);
|
|
20
|
-
}
|
|
21
|
-
catch (e) {
|
|
22
|
-
error.value = e.message;
|
|
23
|
-
} }
|
|
24
|
-
const names = { confirm: '确认', edit: '修改', replan: '重新规划' };
|
|
25
|
-
return { computed, ref, watch, useRoute, useRouter, Alert, Button, Result, Space, Tabs, Tag, Select, Tooltip, useReviews, stateLabels, stateColors, reviewUrl, actionableReview, reviewBudget, formatDate, tenantLabel, RecordMetadata, ReviewEvidence, store, route, router, tab, error, outcome, row, current, closed, process, validate, names };
|
|
26
|
-
} });
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
<!-- 来源:src/reviews/ReviewEvidence.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
|
|
2
|
-
<section class="review-section"><div class="section-heading"><div><h2>检查结果</h2><p>查看汇总与独立验证;未提供的分项证据明确列出。</p></div><template data-component="Tag">绑定当前评审版本</template></div><div class="review-checks"><details data-each="c in (row.review.checks)" data-bind-key="(c.id)" data-bind-open="(c.status === 'fail')"><summary><template data-component="Tag" data-bind-color="(c.status === 'pass' ? 'green' : c.status === 'fail' ? 'red' : c.status === 'pending' ? 'blue' : 'default')">{{ ({ pass: '通过(模拟)', fail: '未通过', pending: '待验证', unavailable: '未提供' }[c.status]) }}</template><strong>{{ (c.name) }}</strong><span data-if="(c.required)" class="muted">本次必需</span></summary><pre>{{ (c.detail) }}</pre></details></div></section><section class="review-section"><div class="section-heading"><div><h2>评审发现</h2><p>每项问题保留检查项编号、严重度、位置和依据。</p></div><template data-component="Select" data-model-value="(dimension)" aria-label="评审发现维度" data-bind-options="([{ value: 'all', label: '全部维度' }, ...dimensions.map(d => ({ value: d.id, label: d.id + ' · ' + d.label }))])"></template></div><div class="review-dimensions"><button data-each="d in (dimensions)" data-bind-key="(d.id)" data-bind-aria-pressed="(dimension === d.id)" data-on-click="(dimension = dimension === d.id ? 'all' : d.id)"><strong>{{ (d.id) }} <span>{{ (d.label) }}</span></strong><small>{{ (row.review.findings.filter(f => f.dimension === d.id).length) }} 项登记发现</small></button></div><template data-component="Alert" class="page-alert" type="info" show-icon="" title="维度计数仅表示报告中登记的问题" description="未登记问题不等于该维度已经完成检查。ARC 包含数据结构、迁移安全、租户与审计字段及索引;本地样例没有真实数据库验证。"></template><article data-each="f in (findings)" data-bind-key="(f.id)" class="review-finding"><div><template data-component="Tag" color="red">{{ (f.severity === 'high' ? '严重' : f.severity === 'medium' ? '重要' : '建议') }}</template><span class="mono">{{ (f.id) }}</span><h3>{{ (f.title) }}</h3></div><pre>{{ (f.detail) }}</pre><template data-component="Button" type="link" data-on-click="(router.push('/tasks/' + row.task.id + '/artifacts/' + f.artifactId + '?version=' + f.version))">查看依据:{{ (row.task.artifacts.find(a => a.id === f.artifactId)?.name) }} v{{ (f.version) }}</template></article><p data-if="(!findings.length)" class="muted">{{ (dimension === 'all' ? '本报告没有登记具体发现,请同时核对上方必需检查。' : '该维度没有登记发现。') }}</p></section><section class="review-section"><div class="section-heading"><div><h2>依据产物与版本差异</h2><p>所有引用指向本次评审的固定版本。</p></div><template data-component="Select" data-model-value="(selected)" aria-label="选择评审依据产物" data-bind-options="(row.review.refs.map(r => ({ value: r.id, label: r.name + ' · v' + r.version })))" data-bind-placeholder="(refItem?.name)"></template></div><template data-component="Space" wrap="" class="review-ref-links"><template data-component="Button" data-each="r in (row.review.refs)" data-bind-key="(r.id)" size="small" data-on-click="(router.push(artifactUrl(r)))">{{ (r.name) }} v{{ (r.version) }}</template></template><template data-if="(version)"><h3>{{ (refItem?.name) }} · v{{ (version.number) }}</h3><pre class="review-document">{{ (version.content) }}</pre><details data-if="(previous)" class="review-diff"><summary>与 v{{ (previous.number) }} 对比 · 新增/移除内容</summary><pre data-each="(line,i) in (diff)" data-bind-key="(i)" class="task-diff-line" data-bind-class="(line.kind)">{{ (line.kind === 'added' ? '+ ' : '− ') }}{{ (line.text) }}</pre><p data-if="(!diff.length)">正文相同,版本与执行记录仍分别保留。</p></details></template><template data-component="Alert" data-else="" type="warning" show-icon="" title="该版本内容已不可访问,请核对来源,不可据此确认。"></template></section>
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { computed, ref } from '../../runtime/state.js';
|
|
2
|
-
import { Button, Select, Space, Tag, Alert } from "../../runtime/widgets.js";
|
|
3
|
-
import { useRouter } from "../../runtime/router.js";
|
|
4
|
-
import { dimensions, evidenceVersion } from "./model.js";
|
|
5
|
-
import { createComponent } from '../../runtime/dom.js';
|
|
6
|
-
export default createComponent({ name: 'ReviewEvidence', propKeys: ["row"], template: new URL('./ReviewEvidence.html', import.meta.url).href, setup(__props, __emit) {
|
|
7
|
-
const props = __props, router = useRouter(), dimension = ref('all'), selected = ref('');
|
|
8
|
-
const findings = computed(() => props.row.review.findings.filter(f => dimension.value === 'all' || f.dimension === dimension.value));
|
|
9
|
-
const refItem = computed(() => props.row.review.refs.find(r => r.id === selected.value) || props.row.review.refs.find(r => r.kind === 'design') || props.row.review.refs[0]);
|
|
10
|
-
const version = computed(() => refItem.value && evidenceVersion(props.row.task, refItem.value)), previous = computed(() => props.row.task.artifacts.find(a => a.id === refItem.value?.id)?.versions.find(v => v.number === (version.value?.number || 1) - 1));
|
|
11
|
-
const diff = computed(() => { const old = previous.value?.content.split('\n') || [], current = version.value?.content.split('\n') || []; return [...old.filter(t => !current.includes(t)).map(text => ({ kind: 'removed', text })), ...current.filter(t => !old.includes(t)).map(text => ({ kind: 'added', text }))]; });
|
|
12
|
-
const artifactUrl = (r) => '/tasks/' + props.row.task.id + '/artifacts/' + r.id + '?version=' + r.version;
|
|
13
|
-
return { computed, ref, Button, Select, Space, Tag, Alert, useRouter, dimensions, evidenceVersion, props, router, dimension, selected, findings, refItem, version, previous, diff, artifactUrl };
|
|
14
|
-
} });
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
<!-- 来源:src/reviews/ReviewProcess.vue;HTML / 原生 DOM 绑定,不含 Vue 运行时。 -->
|
|
2
|
-
<template data-component="Result" data-if="(!row)" status="403" title="评审记录不存在或无权访问"><template data-slot="extra"><template data-component="Button" data-on-click="(router.push('/reviews'))">返回评审列表</template></template></template><template data-else=""><div class="page-heading"><div><template data-component="Button" type="link" class="agent-back" data-on-click="(router.push(reviewUrl(row.task.id, row.review.id)))">← 返回评审证据</template><h1>{{ (result ? '处理结果' : names[action]) }}</h1><p>{{ (row.task.name) }} · {{ (row.review.code) }}</p></div><template data-component="Tag">本地交互原型</template></div><section data-if="(result)" class="agent-panel review-result"><template data-component="Result" status="success" data-bind-title="({ confirm: '本版本评审已确认', edit: '修改已保存,等待重新验证', replan: '规划意见已保存,等待重新验证' }[result.action])" data-bind-sub-title="(result.action === 'confirm' ? (row.review.kind === 'quality' ? '质量确认已记录。生产发布尚未授权,也尚未执行。' : '确认已写入原任务,可以继续后续实现与检查。') : '新设计尚未获得批准。复核与人工确认后,才继续生成代码和新的测试、验证证据。')"></template><dl class="task-trace"><dt>处理人 / 时间</dt><dd>{{ (result.actor) }} · {{ (formatDate(result.at)) }}</dd><dt>本次说明</dt><dd class="review-text">{{ (result.note) }}</dd><template data-if="(result.impact)"><dt>影响说明</dt><dd class="review-text">{{ (result.impact) }}</dd></template><dt>提交编号</dt><dd class="mono">{{ (result.requestId) }}</dd><dt>版本依据</dt><dd>{{ (row.review.refs.map(r => r.name + ' v' + r.version).join(' · ')) }}</dd></dl><template data-component="Space" wrap=""><template data-component="Button" data-if="(result.nextReviewId)" type="primary" data-on-click="(router.push(reviewUrl(row.task.id, result.nextReviewId)))">查看新设计 v{{ (result.newVersion) }} 的评审</template><template data-component="Button" data-bind-type="(result.nextReviewId ? 'default' : 'primary')" data-on-click="(router.push('/tasks/' + row.task.id))">返回交付任务</template><template data-component="Button" data-on-click="(router.push('/workbench'))">回到工作台</template><template data-component="Button" data-on-click="(router.push(reviewUrl(row.task.id, row.review.id) + '?tab=history'))">查看处理记录</template></template></section><div data-else="" class="review-process-grid"><section class="agent-panel"><template data-component="Alert" data-if="(unknown)" class="page-alert" type="warning" show-icon="" title="提交结果待核实" description="提交响应未能确认。请先查询同一提交编号的结果,避免重复处理。输入和编号已保留。"><template data-slot="action"><template data-component="Button" data-on-click="(verify)">核实本次提交</template></template></template><template data-component="Alert" data-if="(draftNotice)" class="page-alert" type="info" show-icon="" data-bind-title="(draftNotice)"></template><div data-if="(error)" id="review-errors" role="alert" tabindex="-1" class="review-error"><strong>未完成提交</strong><p>{{ (error) }}</p></div><template data-component="Alert" data-if="(reason && !unknown)" type="warning" show-icon="" data-bind-title="(reason)" class="page-alert"></template><template data-component="Alert" data-if="(row.task.recordVersion !== expected && !unknown)" type="warning" show-icon="" title="任务记录已有更新" description="已保留输入;请先核对最新证据,旧记录版本不能直接提交。" class="page-alert"><template data-slot="action"><template data-component="Button" data-bind-disabled="(!!reason)" data-on-click="(recheck)">载入当前记录并重新核对</template></template></template><form data-on-submit.prevent="(submit)"><div data-if="(action === 'edit')" class="review-field"><label for="review-content">修改后的设计内容 <span>*</span></label><p id="review-content-help" class="muted">只生成新的设计版本;原设计、代码、报告与验证证据均保留。</p><template data-component="Input.TextArea" id="review-content" data-model-value="(content)" aria-describedby="review-content-help" data-bind-rows="(14)" data-bind-maxlength="(20000)" show-count="" data-bind-disabled="(unknown)"></template></div><div data-if="(action === 'replan')" class="review-field"><label for="review-impact">调整范围与影响 <span>*</span></label><p class="muted">说明要调整的步骤、影响的产物和需要再次验证的内容。原任务绑定的需求规格与流程版本保持可追溯。</p><template data-component="Input.TextArea" id="review-impact" data-model-value="(impact)" data-bind-rows="(5)" data-bind-maxlength="(2000)" show-count="" data-bind-disabled="(unknown)" placeholder="例如:补充重复确认的幂等设计,重新实现派单逻辑并覆盖并发重试测试。"></template></div><div class="review-field"><label for="review-note">{{ (action === 'confirm' ? '确认说明' : action === 'edit' ? '本次修改原因' : '重新规划意见') }} <span>*</span></label><template data-component="Input.TextArea" id="review-note" data-model-value="(note)" data-bind-rows="(4)" data-bind-maxlength="(1000)" show-count="" data-bind-disabled="(unknown)" placeholder="请说明判断依据、处理原因或仍需关注的事项。"></template></div><div data-if="(action === 'confirm')" class="review-field"><template data-component="Checkbox" id="review-checked" data-model-checked="(checked)" data-bind-disabled="(unknown)">我已核对本记录引用的版本、检查结论及适用确认点。</template></div><p class="review-footnote">{{ (action === 'confirm' ? '确认只对本次引用的版本有效;不代替后续生产发布授权。' : '提交后形成新的设计与评审记录,重新验证及确认后才继续实现。') }} 输入暂存在此身份使用的本浏览器。</p><div class="review-submit"><template data-component="Button" data-on-click="(router.push(reviewUrl(row.task.id, row.review.id)))">返回并保留输入</template><template data-component="Button" type="primary" html-type="submit" data-bind-loading="(busy)" data-bind-disabled="(!!reason || unknown || row.task.recordVersion !== expected)">{{ (action === 'confirm' ? '提交确认' : action === 'edit' ? '保存为新设计版本' : '提交规划意见并生成设计建议') }}</template></div></form></section><aside class="agent-panel review-aside"><h2>本次处理对象</h2><p>{{ (row.review.title) }}</p><p>{{ (row.project) }}</p><dl class="task-trace"><dt>绑定需求与流程</dt><dd>{{ (row.task.binding.spec.source.code) }} · 规格 v{{ (row.task.binding.spec.number) }}<br>{{ (row.task.binding.flow.body.name) }} · v{{ (row.task.binding.flow.number) }}</dd><dt>引用产物</dt><dd><p data-each="r in (row.review.refs)" data-bind-key="(r.id)">{{ (r.name) }} · v{{ (r.version) }}</p></dd><dt>处理对象的记录版本</dt><dd>v{{ (expected) }}</dd><dt>提交编号</dt><dd class="mono">{{ (requestId) }}</dd></dl><template data-component="Button" data-on-click="(router.push(reviewUrl(row.task.id, row.review.id)))">重新阅读版本证据</template><p class="muted">返回证据再进入此页,输入会保留。</p></aside></div></template>
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
import { computed, ref, watch, nextTick } from '../../runtime/state.js';
|
|
2
|
-
import { useRoute, useRouter } from "../../runtime/router.js";
|
|
3
|
-
import { Alert, Button, Checkbox, Input, Result, Space, Tag } from "../../runtime/widgets.js";
|
|
4
|
-
import { useReviews } from "./store.js";
|
|
5
|
-
import { reviewUrl } from "./model.js";
|
|
6
|
-
import { latestArtifact } from "../tasks/domain.js";
|
|
7
|
-
import { formatDate } from "../shared/policy.js";
|
|
8
|
-
import { createComponent } from '../../runtime/dom.js';
|
|
9
|
-
export default createComponent({ name: 'ReviewProcess', propKeys: [], template: new URL('./ReviewProcess.html', import.meta.url).href, setup(__props, __emit) {
|
|
10
|
-
const store = useReviews(), route = useRoute(), router = useRouter();
|
|
11
|
-
const row = computed(() => store.find(String(route.params.taskId), String(route.params.reviewId)));
|
|
12
|
-
const action = computed(() => ['edit', 'replan'].includes(String(route.query.action)) ? route.query.action : 'confirm');
|
|
13
|
-
const names = { confirm: '确认评审', edit: '修改设计', replan: '重新规划' };
|
|
14
|
-
const note = ref(''), content = ref(''), impact = ref(''), checked = ref(false), requestId = ref(''), expected = ref(0), error = ref(''), draftNotice = ref(''), unknown = ref(false), busy = ref(false), receipt = ref(), loaded = ref(false);
|
|
15
|
-
const draftKey = computed(() => ['i3-prototype-antdv-review-draft-v012', store.session.actor.id, route.params.taskId, route.params.reviewId, action.value].join(':'));
|
|
16
|
-
const reason = computed(() => row.value ? store.reason(row.value, action.value) : '记录不可访问。');
|
|
17
|
-
const result = computed(() => receipt.value || (!unknown.value ? row.value?.review.decision : undefined));
|
|
18
|
-
function boot() {
|
|
19
|
-
loaded.value = false;
|
|
20
|
-
error.value = '';
|
|
21
|
-
draftNotice.value = '';
|
|
22
|
-
receipt.value = undefined;
|
|
23
|
-
unknown.value = false;
|
|
24
|
-
note.value = '';
|
|
25
|
-
impact.value = '';
|
|
26
|
-
checked.value = false;
|
|
27
|
-
requestId.value = crypto.randomUUID();
|
|
28
|
-
expected.value = row.value?.task.recordVersion || 0;
|
|
29
|
-
content.value = row.value ? (latestArtifact(row.value.task, 'design')?.content || '设计建议(模拟)\n依据规格 v' + row.value.task.binding.spec.number + '\n' + row.value.task.binding.spec.content.requirements) : '';
|
|
30
|
-
try {
|
|
31
|
-
const raw = localStorage.getItem(draftKey.value);
|
|
32
|
-
if (raw) {
|
|
33
|
-
const d = JSON.parse(raw);
|
|
34
|
-
if (typeof d.note === 'string' && typeof d.requestId === 'string' && Number.isInteger(d.expected)) {
|
|
35
|
-
note.value = d.note;
|
|
36
|
-
content.value = typeof d.content === 'string' ? d.content : content.value;
|
|
37
|
-
impact.value = typeof d.impact === 'string' ? d.impact : '';
|
|
38
|
-
checked.value = !!d.checked;
|
|
39
|
-
requestId.value = d.requestId;
|
|
40
|
-
expected.value = d.expected;
|
|
41
|
-
unknown.value = !!d.unknown;
|
|
42
|
-
draftNotice.value = '已恢复此身份在本浏览器保存的输入。提交前请重新核对版本。';
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
catch {
|
|
47
|
-
draftNotice.value = '本浏览器无法读取先前输入,请重新填写。';
|
|
48
|
-
}
|
|
49
|
-
loaded.value = true;
|
|
50
|
-
}
|
|
51
|
-
watch(draftKey, boot, { immediate: true });
|
|
52
|
-
watch([note, content, impact, checked, expected, unknown], () => { if (!loaded.value || result.value)
|
|
53
|
-
return; try {
|
|
54
|
-
localStorage.setItem(draftKey.value, JSON.stringify({ note: note.value, content: content.value, impact: impact.value, checked: checked.value, requestId: requestId.value, expected: expected.value, unknown: unknown.value }));
|
|
55
|
-
}
|
|
56
|
-
catch {
|
|
57
|
-
draftNotice.value = '浏览器未能保存草稿;离开页面前请保留输入。';
|
|
58
|
-
} }, { flush: 'sync' });
|
|
59
|
-
async function fail(message, id) { error.value = message; await nextTick(); {
|
|
60
|
-
const target = document.getElementById(id || 'review-errors');
|
|
61
|
-
(target?.querySelector('input') || target)?.focus();
|
|
62
|
-
} }
|
|
63
|
-
function finish(value) { receipt.value = value; unknown.value = false; try {
|
|
64
|
-
localStorage.removeItem(draftKey.value);
|
|
65
|
-
}
|
|
66
|
-
catch { /* The receipt remains in the task record. */ } }
|
|
67
|
-
async function submit() {
|
|
68
|
-
if (!row.value || busy.value || unknown.value)
|
|
69
|
-
return;
|
|
70
|
-
if (!note.value.trim())
|
|
71
|
-
return fail('请填写处理说明。', 'review-note');
|
|
72
|
-
if (action.value === 'confirm' && !checked.value)
|
|
73
|
-
return fail('请先勾选并核对本次绑定的版本与证据。', 'review-checked');
|
|
74
|
-
if (action.value === 'edit' && !content.value.trim())
|
|
75
|
-
return fail('请填写修改后的设计内容。', 'review-content');
|
|
76
|
-
if (action.value === 'replan' && !impact.value.trim())
|
|
77
|
-
return fail('请填写重新规划的影响说明。', 'review-impact');
|
|
78
|
-
error.value = '';
|
|
79
|
-
busy.value = true;
|
|
80
|
-
try {
|
|
81
|
-
const response = store.tasks.review(row.value.task.id, expected.value, row.value.review.id, { action: action.value, note: note.value, content: action.value === 'edit' ? content.value : undefined, impact: action.value === 'replan' ? impact.value : undefined, checked: checked.value, requestId: requestId.value });
|
|
82
|
-
if (response.unknown) {
|
|
83
|
-
unknown.value = true;
|
|
84
|
-
try {
|
|
85
|
-
localStorage.setItem(draftKey.value, JSON.stringify({ note: note.value, content: content.value, impact: impact.value, checked: checked.value, requestId: requestId.value, expected: expected.value, unknown: true }));
|
|
86
|
-
}
|
|
87
|
-
catch { }
|
|
88
|
-
}
|
|
89
|
-
else
|
|
90
|
-
finish(response.receipt);
|
|
91
|
-
}
|
|
92
|
-
catch (e) {
|
|
93
|
-
await fail(e.message);
|
|
94
|
-
}
|
|
95
|
-
finally {
|
|
96
|
-
busy.value = false;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
async function verify() { if (!row.value)
|
|
100
|
-
return; try {
|
|
101
|
-
const value = store.tasks.reviewReceipt(row.value.task.id, requestId.value);
|
|
102
|
-
if (value)
|
|
103
|
-
finish(value);
|
|
104
|
-
else
|
|
105
|
-
await fail('尚未查到此提交结果,保留输入与提交编号,稍后再次核实。');
|
|
106
|
-
}
|
|
107
|
-
catch (e) {
|
|
108
|
-
await fail(e.message);
|
|
109
|
-
} }
|
|
110
|
-
function recheck() { if (!row.value)
|
|
111
|
-
return; expected.value = row.value.task.recordVersion; checked.value = false; error.value = ''; draftNotice.value = '已载入当前记录版本,输入保留。请再次阅读证据后提交。'; }
|
|
112
|
-
return { computed, ref, watch, nextTick, useRoute, useRouter, Alert, Button, Checkbox, Input, Result, Space, Tag, useReviews, reviewUrl, latestArtifact, formatDate, store, route, router, row, action, names, note, content, impact, checked, requestId, expected, error, draftNotice, unknown, busy, receipt, loaded, draftKey, reason, result, boot, fail, finish, submit, verify, recheck };
|
|
113
|
-
} });
|