@givolt/i3-composer-agent 3.0.0 → 3.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/plugins/marketplace.json +1 -1
- package/.claude/commands/i3-sop.md +3 -3
- package/.claude/commands/i3-ui-demo.md +21 -0
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +2 -2
- package/.gemini/commands/i3-sop.toml +3 -3
- package/.gemini/commands/i3-ui-demo.toml +21 -0
- package/README.md +29 -32
- package/bin/i3-composer-agent.cjs +38 -44
- package/bin/install.cjs +15 -3
- package/bin/native-layout.cjs +2 -1
- package/bin/native-migration.cjs +19 -2
- package/bin/retired-sop-fingerprints.json +213 -0
- package/bin/wizard.cjs +7 -18
- package/commands/i3-sop.toml +3 -3
- package/commands/i3-ui-demo.toml +21 -0
- package/docs/codebuddy-setup.md +20 -23
- package/docs/codex-setup.md +2 -2
- package/docs/comparison.md +131 -0
- package/docs/developer-onboarding.md +143 -0
- package/docs/opencode-setup.md +1 -1
- package/docs/other-hosts.md +2 -2
- package/docs/skill-anatomy.md +211 -0
- package/docs/workbuddy-setup.md +7 -10
- package/evals/cases/i3-enterprise-sop.json +70 -32
- package/evals/cases/i3-ui-demo.json +98 -0
- package/evals/fixtures/i3-ui-demo/asset-management.md +25 -0
- package/evals/zh-CN/cases/i3-enterprise-sop.json +77 -31
- package/evals/zh-CN/cases/i3-ui-demo.json +103 -0
- package/hooks/PROTOTYPE.md +16 -8
- package/hooks/i3-prototype.cjs +4 -10
- package/hooks/manage.cjs +30 -31
- package/package.json +20 -5
- package/plugin.json +1 -1
- package/scripts/ui-demo-dependencies-test.js +228 -0
- package/scripts/ui-demo-mcp-test.js +95 -0
- package/scripts/ui-demo-test.js +170 -0
- package/scripts/ui-prototype-execution-runtime-test.js +1 -1
- package/scripts/ui-prototype-native-test.js +25 -3
- package/skills/i3-enterprise-sop/SKILL.md +151 -91
- package/{references/engineering-skeleton-resources → skills/i3-enterprise-sop/references/engineering-skeleton}/directory-standard.md +29 -15
- package/skills/i3-enterprise-sop/references/handoff.py +348 -0
- package/skills/i3-enterprise-sop/references/read_text.py +60 -0
- package/{references/enterprise-sop-resources/technical-baseline/baselines//344/274/201/344/270/232/345/272/224/347/224/250-/346/212/200/346/234/257/350/247/204/347/272/246_v0.0.2.md → skills/i3-enterprise-sop/references/technical-baseline/baselines/enterprise-application-technical-baseline-v0-0-4.md} +136 -51
- package/skills/i3-enterprise-sop/references/technical-baseline/readme.md +23 -0
- package/{references/enterprise-sop-resources/technical-baseline/templates/TECHNICAL-BASELINE.md → skills/i3-enterprise-sop/references/technical-baseline/templates/technical-baseline.md} +1 -1
- package/{references/enterprise-sop-resources/ad/templates/AD.md → skills/i3-enterprise-sop/references/templates/ad.md} +34 -27
- package/{references/enterprise-sop-resources/brd/templates/BRD.md → skills/i3-enterprise-sop/references/templates/brd.md} +21 -10
- package/{references/enterprise-sop-resources/prd/templates/PRD.md → skills/i3-enterprise-sop/references/templates/prd.md} +57 -24
- package/{references/enterprise-sop-resources/testcase/templates/TestCase.md → skills/i3-enterprise-sop/references/templates/testcase.md} +32 -22
- package/skills/i3-ui-demo/SKILL.md +234 -0
- package/skills/i3-ui-demo/assets/antdv-build/package-lock.json +3363 -0
- package/skills/i3-ui-demo/assets/antdv-build/package.json +28 -0
- package/skills/i3-ui-demo/assets/design-source.json +11 -0
- package/skills/i3-ui-demo/assets/host-targets.json +739 -0
- package/skills/i3-ui-demo/assets/official-files.json +76 -0
- package/skills/i3-ui-demo/assets/starter/index.html +11 -0
- package/skills/i3-ui-demo/assets/starter/package-lock.json +2299 -0
- package/skills/i3-ui-demo/assets/starter/package.json +28 -0
- package/skills/i3-ui-demo/assets/starter/provenance.json +14 -0
- package/skills/i3-ui-demo/assets/starter/public/prototype-config.json +22 -0
- package/skills/i3-ui-demo/assets/starter/src/App.vue +64 -0
- package/skills/i3-ui-demo/assets/starter/src/PrototypeShell.vue +59 -0
- package/skills/i3-ui-demo/assets/starter/src/config.ts +23 -0
- package/skills/i3-ui-demo/assets/starter/src/domain/presentation.ts +30 -0
- package/skills/i3-ui-demo/assets/starter/src/domain/theme.ts +25 -0
- package/skills/i3-ui-demo/assets/starter/src/main.ts +18 -0
- package/skills/i3-ui-demo/assets/starter/src/style.css +26 -0
- package/skills/i3-ui-demo/assets/starter/tests/presentation.test.ts +23 -0
- package/skills/i3-ui-demo/assets/starter/tests/theme.test.ts +26 -0
- package/skills/i3-ui-demo/assets/starter/tsconfig.json +15 -0
- package/skills/i3-ui-demo/assets/starter/vite.config.ts +4 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/capability-definition.json +1395 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/component-inventory.json +707 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/design-system.md +26 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/generation.json +49 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/index.html +534 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/manifest.json +9 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/offline-build.json +265 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/offline.js +8888 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/origin.json +344 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/preset.json +928 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/app.js +22 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/assets/empty.svg +1 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/assets/reference-styles.json +1 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/assets/result-403.svg +1 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/assets/result-404.svg +1 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/assets-manifest.json +334 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/baseline.json +173 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/conversion.md +30 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/credits.md +17 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/design-tokens.json +881 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/index.html +28 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/licenses/@qin-ui-antdv-next-pro.txt +9 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/licenses/ant-design-icons.txt +22 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/licenses/antdv-next.txt +21 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/package.json +12 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/browser-routes.json +298 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/coverage.json +180 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/integrity.json +13 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/keyboard.json +11 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/responsive.json +125 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/review.md +51 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/rules.log +150 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/flow-editor-html.png +0 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/flow-editor-original.png +0 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/intent-create-html.png +0 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/intent-create-original.png +0 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/models-html.png +0 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/models-original.png +0 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/workbench-html.png +0 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/screenshots/workbench-original.png +0 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/selection.json +9 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/qa/visual-comparison.json +342 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/readme.md +73 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/reference.md +59 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/routes.json +178 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/controls.js +99 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/dialogs.js +54 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/dom.js +264 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/forms.js +47 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/icons.js +41 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/layout.js +47 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/router.js +63 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/state.js +90 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/table.js +41 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/runtime/widgets.js +8 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentDetail.html +3 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentDetail.js +36 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentEditor.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentEditor.js +51 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentsPage.html +3 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/AgentsPage.js +48 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/CheckResults.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/CheckResults.js +6 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/ResourcePicker.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/ResourcePicker.js +13 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/data.js +24 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/domain.js +32 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/registry.js +25 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/agents/store.js +85 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentClose.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentClose.js +17 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentCreate.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentCreate.js +66 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDecisions.html +3 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDecisions.js +38 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDetail.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDetail.js +66 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDocument.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentDocument.js +5 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentHeader.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentHeader.js +12 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentHistory.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentHistory.js +11 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentList.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentList.js +116 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentReplan.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentReplan.js +32 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentRevision.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentRevision.js +49 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentSummary.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentSummary.js +10 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentWorkspace.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/IntentWorkspace.js +77 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/data.js +60 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/domain.js +105 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/intents/store.js +212 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/AuditPanel.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/AuditPanel.js +18 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelDetail.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelDetail.js +23 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelEditor.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelEditor.js +78 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelGrant.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelGrant.js +55 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelReferences.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelReferences.js +26 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelRelease.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelRelease.js +38 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelStatus.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelStatus.js +7 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelTable.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelTable.js +72 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelTester.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelTester.js +46 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelsPage.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/ModelsPage.js +52 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/RowActions.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/RowActions.js +19 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/UsagePanel.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/UsagePanel.js +30 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/data.js +48 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/domain.js +39 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/models/store.js +129 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/IncidentDetail.html +4 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/IncidentDetail.js +21 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/IntentSource.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/IntentSource.js +8 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationActionDialog.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationActionDialog.js +37 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationEntry.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationEntry.js +10 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationsPage.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/OperationsPage.js +37 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/RepairTrack.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/RepairTrack.js +49 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/RunDetail.html +4 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/RunDetail.js +22 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/SourceSummary.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/SourceSummary.js +9 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/commands.js +82 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/examples.js +47 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/model.js +61 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/repair.js +68 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/store.js +55 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/types.js +1 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/operations/workbench.js +18 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ManagementTable.html +3 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ManagementTable.js +28 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcCreateEntry.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcCreateEntry.js +18 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcDetail.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcDetail.js +31 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcEditor.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcEditor.js +27 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcLifecycle.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcLifecycle.js +16 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcPage.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcPage.js +43 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcPicker.html +4 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcPicker.js +34 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcProgress.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcProgress.js +30 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcWizard.html +3 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcWizard.js +67 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcWorkspace.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcWorkspace.js +41 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcsPage.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/PbcsPage.js +31 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ServiceEditor.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ServiceEditor.js +26 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ServiceList.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/ServiceList.js +70 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/data.js +8 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/domain.js +62 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/management.js +36 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/managementStore.js +49 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/pbc/store.js +132 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/AdminList.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/AdminList.js +38 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/EffectiveGrants.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/EffectiveGrants.js +11 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/GrantEditor.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/GrantEditor.js +45 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/MemberEditor.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/MemberEditor.js +54 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/MembersPage.html +3 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/MembersPage.js +27 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RecordsPage.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RecordsPage.js +12 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RoleEditor.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RoleEditor.js +45 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RolesPage.html +3 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/RolesPage.js +38 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/domain.js +61 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/state.js +51 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/permissions/store.js +116 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseActionDialog.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseActionDialog.js +45 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseDetail.html +4 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseDetail.js +30 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseEditor.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseEditor.js +67 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseExecution.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleaseExecution.js +5 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleasesPage.html +4 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/ReleasesPage.js +60 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/commands.js +157 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/model.js +136 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/releases/store.js +76 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewDetail.html +3 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewDetail.js +26 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewEvidence.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewEvidence.js +14 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewProcess.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewProcess.js +113 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewsPage.html +3 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/ReviewsPage.js +62 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/commands.js +97 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/model.js +147 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/reviews/store.js +13 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ColumnSettings.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ColumnSettings.js +9 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListBatchBar.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListBatchBar.js +8 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListDeleteDialog.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListDeleteDialog.js +37 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListMore.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/ListMore.js +8 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/RecordMetadata.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/RecordMetadata.js +17 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/columns.js +32 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/deliveryGuide.js +49 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/deliveryView.js +12 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/listBatch.js +15 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/listSelection.js +37 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/policy.js +68 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shared/session.js +44 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ConfirmationDialog.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ConfirmationDialog.js +25 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ConsoleShell.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ConsoleShell.js +53 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/PrototypeGuide.html +10 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/PrototypeGuide.js +30 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ScopePage.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/ScopePage.js +10 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/SessionDialog.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/SessionDialog.js +9 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/confirmation.js +3 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/shell/navigation.js +19 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecDocument.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecDocument.js +8 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecEdit.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecEdit.js +32 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecHeader.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecHeader.js +15 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecHistory.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecHistory.js +11 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecReview.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecReview.js +57 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecWorkspace.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/SpecWorkspace.js +37 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/data.js +20 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/domain.js +55 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/specs/store.js +151 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/ArtifactDetail.html +3 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/ArtifactDetail.js +18 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskCreate.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskCreate.js +40 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskDetail.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskDetail.js +51 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskLaunch.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TaskLaunch.js +9 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TasksPage.html +5 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/TasksPage.js +48 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/domain.js +204 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/exampleSource.js +22 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/registry.js +135 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/tasks/store.js +137 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workbench/WorkbenchPage.html +3 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workbench/WorkbenchPage.js +36 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workbench/model.js +56 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workbench/store.js +15 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowCanvas.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowCanvas.js +27 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowDetail.html +4 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowDetail.js +31 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowEditor.html +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/FlowEditor.js +68 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/WorkflowsPage.html +5 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/WorkflowsPage.js +55 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/data.js +16 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/domain.js +83 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/registry.js +18 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/src/workflows/store.js +61 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/admin.css +60 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/agents.css +46 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/antdv.css +295 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/app.css +102 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/delivery.css +4 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/intents.css +37 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/native.css +22 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/operations.css +2 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/pbc.css +3 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/permissions.css +22 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/pro.css +1 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/releases.css +4 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/reset.css +246 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/reviews.css +8 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/tasks.css +6 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/tokens.css +15 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/workbench.css +61 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/styles/workflows.css +1 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/admin-rules.test.js +96 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/agents.test.js +14 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/intent-state.test.js +37 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/list-batch.test.js +44 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/operation-fixtures.js +19 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/operation-repair.test.js +14 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/operations.test.js +25 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/pbc-management.test.js +17 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/pbc-state.test.js +24 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/permission-config.test.js +23 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/permissions.test.js +24 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/releases.test.js +50 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/reviews.test.js +36 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/runtime-forms-router.test.js +28 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/runtime-state.test.js +42 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/runtime-stores.test.js +16 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/spec-state.test.js +11 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/tasks.test.js +27 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/workbench.test.js +34 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tests/workflows.test.js +16 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tools/convert.mjs +168 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tools/serve.mjs +7 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tools/styles.mjs +11 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/reference/tools/verify.mjs +24 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/serve.cjs +16 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/template-inventory.json +28791 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/template.json +9 -0
- package/skills/i3-ui-demo/assets/templates/enterprise-admin/usability.css +44 -0
- package/skills/i3-ui-demo/assets/templates.json +10 -0
- package/skills/i3-ui-demo/assets/versions.json +20 -0
- package/skills/i3-ui-demo/readme.md +350 -0
- package/skills/i3-ui-demo/references/browser.md +71 -0
- package/skills/i3-ui-demo/references/dependencies.md +67 -0
- package/skills/i3-ui-demo/references/resources.md +142 -0
- package/skills/i3-ui-demo/scripts/dependencies.cjs +364 -0
- package/skills/i3-ui-demo/scripts/design-install.cjs +105 -0
- package/skills/i3-ui-demo/scripts/design-provider.cjs +57 -0
- package/skills/i3-ui-demo/scripts/locations.cjs +52 -0
- package/skills/i3-ui-demo/scripts/mcp.cjs +112 -0
- package/skills/i3-ui-demo/scripts/provider-discovery.cjs +131 -0
- package/skills/i3-ui-demo/scripts/resources.cjs +283 -0
- package/skills/i3-ui-prototype/SKILL.md +1 -1
- package/skills/i3-ui-prototype/references/execution-evidence.md +12 -56
- package/skills/i3-ui-prototype/scripts/codebuddy-registration.cjs +1 -1
- package/skills/i3-ui-prototype/scripts/execution-runtime.cjs +5 -2
- package/skills/i3-ui-prototype/scripts/hosts/codebuddy.cjs +3 -2
- package/skills/i3-ui-prototype/scripts/native-delivery.cjs +2 -2
- package/skills/i3-ui-prototype/scripts/prototype-hooks.cjs +23 -20
- package/docs/ui-prototype-native/MAIN-SESSION-REPORT.md +0 -66
- package/docs/ui-prototype-native/USAGE.md +0 -93
- package/references/engineering-skeleton-resources/README.md +0 -52
- package/references/engineering-skeleton-resources/adoption.md +0 -200
- package/references/engineering-skeleton-resources/catalog.json +0 -17
- package/references/enterprise-sop-resources/README.md +0 -165
- package/references/enterprise-sop-resources/ad/README.md +0 -70
- package/references/enterprise-sop-resources/ad/assets-manifest.json +0 -106
- package/references/enterprise-sop-resources/ad/prompts/01-generate.md +0 -58
- package/references/enterprise-sop-resources/ad/prompts/02-review.md +0 -54
- package/references/enterprise-sop-resources/ad/prompts/03-revise.md +0 -54
- package/references/enterprise-sop-resources/ad/prompts/04-recheck.md +0 -54
- package/references/enterprise-sop-resources/assets-manifest.json +0 -199
- package/references/enterprise-sop-resources/brd/README.md +0 -50
- package/references/enterprise-sop-resources/brd/assets-manifest.json +0 -94
- package/references/enterprise-sop-resources/brd/prompts/01-generate.md +0 -51
- package/references/enterprise-sop-resources/brd/prompts/02-review.md +0 -47
- package/references/enterprise-sop-resources/brd/prompts/03-revise.md +0 -47
- package/references/enterprise-sop-resources/brd/prompts/04-recheck.md +0 -47
- package/references/enterprise-sop-resources/codebuddy-project-guide.md +0 -34
- package/references/enterprise-sop-resources/controlled-handoff.md +0 -41
- package/references/enterprise-sop-resources/controlled_handoff.py +0 -334
- package/references/enterprise-sop-resources/handoff-contract.md +0 -196
- package/references/enterprise-sop-resources/handoff.py +0 -277
- package/references/enterprise-sop-resources/lifecycle-contract.md +0 -91
- package/references/enterprise-sop-resources/plan-handoff.md +0 -73
- package/references/enterprise-sop-resources/prd/README.md +0 -137
- package/references/enterprise-sop-resources/prd/assets-manifest.json +0 -115
- package/references/enterprise-sop-resources/prd/prompts/01-generate.md +0 -64
- package/references/enterprise-sop-resources/prd/prompts/02-review.md +0 -49
- package/references/enterprise-sop-resources/prd/prompts/03-revise.md +0 -48
- package/references/enterprise-sop-resources/prd/prompts/04-recheck.md +0 -47
- package/references/enterprise-sop-resources/prd/template-contracts.md +0 -39
- package/references/enterprise-sop-resources/prd/templates/AD.md +0 -17
- package/references/enterprise-sop-resources/recovery-contract.md +0 -65
- package/references/enterprise-sop-resources/review-handoff.md +0 -105
- package/references/enterprise-sop-resources/selection-handoff.md +0 -55
- package/references/enterprise-sop-resources/selection_handoff.py +0 -225
- package/references/enterprise-sop-resources/stages.json +0 -262
- package/references/enterprise-sop-resources/technical-baseline/README.md +0 -132
- package/references/enterprise-sop-resources/technical-baseline/assets-manifest.json +0 -101
- package/references/enterprise-sop-resources/technical-baseline/baselines/PROVENANCE.md +0 -40
- package/references/enterprise-sop-resources/technical-baseline/references/engineering-directory-v0.2.0/adoption.md +0 -112
- package/references/enterprise-sop-resources/technical-baseline/references/engineering-directory-v0.2.0/directory-standard.md +0 -119
- package/references/enterprise-sop-resources/template-contracts.md +0 -142
- package/references/enterprise-sop-resources/testcase/README.md +0 -61
- package/references/enterprise-sop-resources/testcase/assets-manifest.json +0 -111
- package/references/enterprise-sop-resources/testcase/prompts/01-generate.md +0 -53
- package/references/enterprise-sop-resources/testcase/prompts/02-review.md +0 -51
- package/references/enterprise-sop-resources/testcase/prompts/03-revise.md +0 -49
- package/references/enterprise-sop-resources/testcase/prompts/04-recheck.md +0 -51
- package/references/enterprise-sop-resources/verification/README.md +0 -149
- package/references/enterprise-sop-resources/verification/check_execution.py +0 -185
- package/references/enterprise-sop-resources/verification/check_native_execution.py +0 -282
- package/references/enterprise-sop-resources/verification/check_reads.py +0 -348
- package/references/enterprise-sop-resources/verification/review-output.schema.json +0 -155
- package/references/enterprise-sop-resources/verification/review_handoff.py +0 -329
package/package.json
CHANGED
|
@@ -56,6 +56,7 @@
|
|
|
56
56
|
"evals/cases/i3-source-driven-development.json",
|
|
57
57
|
"evals/cases/i3-spec-driven-development.json",
|
|
58
58
|
"evals/cases/i3-test-driven-development.json",
|
|
59
|
+
"evals/cases/i3-ui-demo.json",
|
|
59
60
|
"evals/cases/i3-ui-prototype.json",
|
|
60
61
|
"evals/cases/i3-using-agent-skills.json",
|
|
61
62
|
"evals/fixtures/i3-api-and-interface-design/service-brief.md",
|
|
@@ -102,6 +103,7 @@
|
|
|
102
103
|
"evals/fixtures/i3-test-driven-development/package.json",
|
|
103
104
|
"evals/fixtures/i3-test-driven-development/src/split.js",
|
|
104
105
|
"evals/fixtures/i3-test-driven-development/test/split.test.js",
|
|
106
|
+
"evals/fixtures/i3-ui-demo/asset-management.md",
|
|
105
107
|
"evals/fixtures/i3-ui-prototype/admin-list/assets/reference.css",
|
|
106
108
|
"evals/fixtures/i3-ui-prototype/admin-list/assets/reference.js",
|
|
107
109
|
"evals/fixtures/i3-ui-prototype/admin-list/capability-definition.json",
|
|
@@ -156,6 +158,7 @@
|
|
|
156
158
|
"evals/zh-CN/cases/i3-source-driven-development.json",
|
|
157
159
|
"evals/zh-CN/cases/i3-spec-driven-development.json",
|
|
158
160
|
"evals/zh-CN/cases/i3-test-driven-development.json",
|
|
161
|
+
"evals/zh-CN/cases/i3-ui-demo.json",
|
|
159
162
|
"evals/zh-CN/cases/i3-ui-prototype.json",
|
|
160
163
|
"evals/zh-CN/cases/i3-using-agent-skills.json",
|
|
161
164
|
"docs/adoption-guide.md",
|
|
@@ -165,15 +168,16 @@
|
|
|
165
168
|
"docs/codebuddy-setup.md",
|
|
166
169
|
"docs/codex-setup.md",
|
|
167
170
|
"docs/commandcode-setup.md",
|
|
171
|
+
"docs/comparison.md",
|
|
168
172
|
"docs/copilot-cli-setup.md",
|
|
169
173
|
"docs/copilot-setup.md",
|
|
170
174
|
"docs/cursor-setup.md",
|
|
175
|
+
"docs/developer-onboarding.md",
|
|
171
176
|
"docs/gemini-cli-setup.md",
|
|
172
177
|
"docs/getting-started.md",
|
|
173
178
|
"docs/opencode-setup.md",
|
|
174
179
|
"docs/other-hosts.md",
|
|
175
|
-
"docs/
|
|
176
|
-
"docs/ui-prototype-native/USAGE.md",
|
|
180
|
+
"docs/skill-anatomy.md",
|
|
177
181
|
"docs/windsurf-setup.md",
|
|
178
182
|
"docs/workbuddy-setup.md",
|
|
179
183
|
"plugin.json",
|
|
@@ -198,6 +202,9 @@
|
|
|
198
202
|
"scripts/run-evals.js",
|
|
199
203
|
"scripts/run-regressions.js",
|
|
200
204
|
"scripts/template-adapter-test.js",
|
|
205
|
+
"scripts/ui-demo-dependencies-test.js",
|
|
206
|
+
"scripts/ui-demo-mcp-test.js",
|
|
207
|
+
"scripts/ui-demo-test.js",
|
|
201
208
|
"scripts/ui-prototype-binding-recovery-test.js",
|
|
202
209
|
"scripts/ui-prototype-buddy-lifecycle-test.js",
|
|
203
210
|
"scripts/ui-prototype-codebuddy-hook-test.js",
|
|
@@ -241,6 +248,7 @@
|
|
|
241
248
|
"claude-code"
|
|
242
249
|
],
|
|
243
250
|
"i3ComposerAgent": {
|
|
251
|
+
"prototypeAuditHooks": "retired",
|
|
244
252
|
"pluginFiles": [
|
|
245
253
|
"bin",
|
|
246
254
|
"skills",
|
|
@@ -279,6 +287,7 @@
|
|
|
279
287
|
"evals/cases/i3-source-driven-development.json",
|
|
280
288
|
"evals/cases/i3-spec-driven-development.json",
|
|
281
289
|
"evals/cases/i3-test-driven-development.json",
|
|
290
|
+
"evals/cases/i3-ui-demo.json",
|
|
282
291
|
"evals/cases/i3-ui-prototype.json",
|
|
283
292
|
"evals/cases/i3-using-agent-skills.json",
|
|
284
293
|
"evals/fixtures/i3-api-and-interface-design/service-brief.md",
|
|
@@ -325,6 +334,7 @@
|
|
|
325
334
|
"evals/fixtures/i3-test-driven-development/package.json",
|
|
326
335
|
"evals/fixtures/i3-test-driven-development/src/split.js",
|
|
327
336
|
"evals/fixtures/i3-test-driven-development/test/split.test.js",
|
|
337
|
+
"evals/fixtures/i3-ui-demo/asset-management.md",
|
|
328
338
|
"evals/fixtures/i3-ui-prototype/admin-list/assets/reference.css",
|
|
329
339
|
"evals/fixtures/i3-ui-prototype/admin-list/assets/reference.js",
|
|
330
340
|
"evals/fixtures/i3-ui-prototype/admin-list/capability-definition.json",
|
|
@@ -379,6 +389,7 @@
|
|
|
379
389
|
"evals/zh-CN/cases/i3-source-driven-development.json",
|
|
380
390
|
"evals/zh-CN/cases/i3-spec-driven-development.json",
|
|
381
391
|
"evals/zh-CN/cases/i3-test-driven-development.json",
|
|
392
|
+
"evals/zh-CN/cases/i3-ui-demo.json",
|
|
382
393
|
"evals/zh-CN/cases/i3-ui-prototype.json",
|
|
383
394
|
"evals/zh-CN/cases/i3-using-agent-skills.json",
|
|
384
395
|
"docs/adoption-guide.md",
|
|
@@ -388,15 +399,16 @@
|
|
|
388
399
|
"docs/codebuddy-setup.md",
|
|
389
400
|
"docs/codex-setup.md",
|
|
390
401
|
"docs/commandcode-setup.md",
|
|
402
|
+
"docs/comparison.md",
|
|
391
403
|
"docs/copilot-cli-setup.md",
|
|
392
404
|
"docs/copilot-setup.md",
|
|
393
405
|
"docs/cursor-setup.md",
|
|
406
|
+
"docs/developer-onboarding.md",
|
|
394
407
|
"docs/gemini-cli-setup.md",
|
|
395
408
|
"docs/getting-started.md",
|
|
396
409
|
"docs/opencode-setup.md",
|
|
397
410
|
"docs/other-hosts.md",
|
|
398
|
-
"docs/
|
|
399
|
-
"docs/ui-prototype-native/USAGE.md",
|
|
411
|
+
"docs/skill-anatomy.md",
|
|
400
412
|
"docs/windsurf-setup.md",
|
|
401
413
|
"docs/workbuddy-setup.md",
|
|
402
414
|
"plugin.json",
|
|
@@ -422,6 +434,9 @@
|
|
|
422
434
|
"scripts/run-evals.js",
|
|
423
435
|
"scripts/run-regressions.js",
|
|
424
436
|
"scripts/template-adapter-test.js",
|
|
437
|
+
"scripts/ui-demo-dependencies-test.js",
|
|
438
|
+
"scripts/ui-demo-mcp-test.js",
|
|
439
|
+
"scripts/ui-demo-test.js",
|
|
425
440
|
"scripts/ui-prototype-binding-recovery-test.js",
|
|
426
441
|
"scripts/ui-prototype-buddy-lifecycle-test.js",
|
|
427
442
|
"scripts/ui-prototype-codebuddy-hook-test.js",
|
|
@@ -450,7 +465,7 @@
|
|
|
450
465
|
"scripts/validate-versions.js"
|
|
451
466
|
]
|
|
452
467
|
},
|
|
453
|
-
"version": "3.
|
|
468
|
+
"version": "3.2.1",
|
|
454
469
|
"repository": {
|
|
455
470
|
"type": "git",
|
|
456
471
|
"url": "https://github.com/49780522/i3-composer-agent.git"
|
package/plugin.json
CHANGED
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
const test = require('node:test');
|
|
2
|
+
const assert = require('node:assert/strict');
|
|
3
|
+
const fs = require('node:fs');
|
|
4
|
+
const os = require('node:os');
|
|
5
|
+
const path = require('node:path');
|
|
6
|
+
const crypto = require('node:crypto');
|
|
7
|
+
const installation = path.join(__dirname, 'lib/installation.js');
|
|
8
|
+
const skills = fs.existsSync(installation) ? require(installation).loadInstallation().skillsDirectory : path.resolve(__dirname, '../skills');
|
|
9
|
+
const deps = require(path.join(skills, 'i3-ui-demo/scripts/dependencies.cjs'));
|
|
10
|
+
const hash = data => crypto.createHash('sha256').update(data).digest('hex');
|
|
11
|
+
function official(t, wrongOutput = false) {
|
|
12
|
+
const base = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), 'ui-demo-official-'))), root = path.join(base, 'source');
|
|
13
|
+
t.after(() => fs.rmSync(base, { recursive: true, force: true }));
|
|
14
|
+
for (const folder of ['data', 'bin', 'dist']) fs.mkdirSync(path.join(root, folder), { recursive: true });
|
|
15
|
+
const component = { name: 'Table', props: { properties: [{ name: 'rowKey', type: 'string' }], events: [], slots: [], methods: [] } };
|
|
16
|
+
const data = JSON.stringify({ components: [component] }), index = JSON.stringify({ v1: { '1.6': '1.6.0' } });
|
|
17
|
+
fs.writeFileSync(path.join(root, 'data/v1.6.0.json'), data);
|
|
18
|
+
fs.writeFileSync(path.join(root, 'data/versions.json'), index);
|
|
19
|
+
fs.writeFileSync(path.join(root, 'package.json'), JSON.stringify({ name: '@antdv-next/cli', version: '0.0.0-beta.6', bin: { antdv: 'bin/antdv.js' } }));
|
|
20
|
+
const output = { name: 'Table', props: wrongOutput ? [{ name: 'oldVersionProp' }] : component.props.properties, events: [], slots: [], methods: [] };
|
|
21
|
+
const entry = 'process.stdout.write(' + JSON.stringify(JSON.stringify(output)) + ');';
|
|
22
|
+
fs.writeFileSync(path.join(root, 'bin/antdv.js'), entry);
|
|
23
|
+
fs.writeFileSync(path.join(root, 'dist/index.mjs'), '// test executable identity');
|
|
24
|
+
const expected = { package: '@antdv-next/cli', version: '0.0.0-beta.6', commit: 'fixed-test-snapshot', archiveSha256: 'fixed-test-archive', knowledgeVersion: '1.6.0', knowledgeFile: 'data/v1.6.0.json', knowledgeSha256: hash(data), versionIndexSha256: hash(index) };
|
|
25
|
+
fs.writeFileSync(path.join(base, 'UPSTREAM-ORIGIN.json'), JSON.stringify({ commit: expected.commit, archiveSha256: expected.archiveSha256, distSha256: hash(fs.readFileSync(path.join(root, 'dist/index.mjs'))) }));
|
|
26
|
+
return { root, options: { expected, sourceFiles: { 'bin/antdv.js': hash(entry) } } };
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
test('official probing proves actual fixed data and query results without writing', t => {
|
|
30
|
+
const { root, options } = official(t);
|
|
31
|
+
const before = fs.readdirSync(root, { recursive: true });
|
|
32
|
+
const result = deps.inspectOfficial(root, options);
|
|
33
|
+
assert.equal(result.availability, 'available');
|
|
34
|
+
assert.equal(result.knowledgeVersion, '1.6.0');
|
|
35
|
+
assert.equal(result.exactKnowledgeMatch, true);
|
|
36
|
+
assert.equal(result.invocationVerified, false);
|
|
37
|
+
assert.deepEqual(fs.readdirSync(root, { recursive: true }), before);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
test('version policy compares prereleases numerically and rejects unknown versions', () => {
|
|
41
|
+
assert.equal(deps.versionRelation('2.15.0', '2.15.0'), 'same');
|
|
42
|
+
assert.equal(deps.versionRelation('2.16.0', '2.15.0'), 'higher');
|
|
43
|
+
assert.equal(deps.versionRelation('2.9.0', '2.15.0'), 'lower');
|
|
44
|
+
assert.equal(deps.versionRelation('0.0.0-beta.10', '0.0.0-beta.6'), 'higher');
|
|
45
|
+
assert.equal(deps.versionRelation('0.0.0', '0.0.0-beta.6'), 'higher');
|
|
46
|
+
assert.equal(deps.versionRelation('unversioned', '2.15.0'), 'unknown');
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
test('official snapshot preparation respects the unchanged builder engine requirements', () => {
|
|
50
|
+
for (const version of ['v20.19.5', 'v22.17.1', 'v23.11.0', 'v24.10.0', 'unknown']) assert.equal(deps.supportsBuild(version), false, version);
|
|
51
|
+
for (const version of ['v22.18.0', 'v22.22.0', 'v24.11.0', 'v24.15.0', 'v26.0.0']) assert.equal(deps.supportsBuild(version), true, version);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test('a compatible higher official CLI is preserved and still queries the fixed 1.6.0 data', t => {
|
|
55
|
+
const { root, options } = official(t);
|
|
56
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(root, 'package.json')));
|
|
57
|
+
pkg.version = '0.0.0-beta.10';
|
|
58
|
+
fs.writeFileSync(path.join(root, 'package.json'), JSON.stringify(pkg));
|
|
59
|
+
const before = fs.readFileSync(path.join(root, 'package.json'));
|
|
60
|
+
const result = deps.inspectOfficial(root, options);
|
|
61
|
+
assert.equal(result.availability, 'available', result.reason);
|
|
62
|
+
assert.equal(result.versionRelation, 'higher');
|
|
63
|
+
assert.equal(result.snapshot, null, 'A retained old receipt cannot attest the source of a newer CLI');
|
|
64
|
+
assert.equal(result.knowledgeVersion, '1.6.0');
|
|
65
|
+
assert.deepEqual(fs.readFileSync(path.join(root, 'package.json')), before);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
test('a lower CLI needs upgrading even when it exits successfully', t => {
|
|
69
|
+
const { root, options } = official(t);
|
|
70
|
+
const file = path.join(root, 'package.json'), pkg = JSON.parse(fs.readFileSync(file));
|
|
71
|
+
pkg.version = '0.0.0-beta.1'; fs.writeFileSync(file, JSON.stringify(pkg));
|
|
72
|
+
const result = deps.inspectOfficial(root, options);
|
|
73
|
+
assert.equal(result.availability, 'upgrade-required');
|
|
74
|
+
assert.equal(result.versionRelation, 'lower');
|
|
75
|
+
assert.equal(result.cliVersion, pkg.version);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
test('a higher CLI cannot pass with stale query output', t => {
|
|
79
|
+
const { root, options } = official(t, true);
|
|
80
|
+
const file = path.join(root, 'package.json'), pkg = JSON.parse(fs.readFileSync(file));
|
|
81
|
+
pkg.version = '0.0.0-beta.10'; fs.writeFileSync(file, JSON.stringify(pkg));
|
|
82
|
+
assert.equal(deps.inspectOfficial(root, options).availability, 'unusable');
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
function design(t, version) {
|
|
86
|
+
const project = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), 'ui-demo-design-policy-')));
|
|
87
|
+
t.after(() => fs.rmSync(project, { recursive: true, force: true }));
|
|
88
|
+
const root = path.join(project, '.codebuddy/skills/ui-ux-pro-max');
|
|
89
|
+
fs.mkdirSync(path.join(root, 'scripts'), { recursive: true }); fs.mkdirSync(path.join(root, 'data'));
|
|
90
|
+
fs.writeFileSync(path.join(root, 'SKILL.md'), '---\nname: ui-ux-pro-max\n---\nOfficial test provider');
|
|
91
|
+
for (const file of ['core.py', 'design_system.py']) fs.writeFileSync(path.join(root, 'scripts', file), '# fixture\n');
|
|
92
|
+
fs.writeFileSync(path.join(root, 'scripts/search.py'), 'import json, sys\nvalue = {"design_system":{"style":{},"colors":{},"typography":{}}} if "--design-system" in sys.argv else {"domain":"stack","stack":"vue","results":[{"title":"ref"}]} if "--stack" in sys.argv else {"domain":"ux","results":[{"title":"validation"}]}\nprint(json.dumps(value))\n');
|
|
93
|
+
for (const name of ['ux-guidelines', 'styles', 'colors', 'typography', 'products', 'landing', 'ui-reasoning']) fs.writeFileSync(path.join(root, 'data', name + '.csv'), 'title\nvalidation\n');
|
|
94
|
+
fs.writeFileSync(path.join(root, 'UPSTREAM-ORIGIN.json'), JSON.stringify({ packageName: 'ui-ux-pro-max-cli', version }));
|
|
95
|
+
return { project, root, home: path.join(project, 'home'), host: 'codebuddy', env: {}, tool: path.join(project, 'no-cli') };
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
for (const [version, relation, availability] of [['2.15.0', 'same', 'available'], ['2.16.0', 'higher', 'available'], ['2.14.0', 'lower', 'upgrade-required'], ['unknown', 'unknown', 'unusable']]) {
|
|
99
|
+
test(`UI/UX Pro Max ${version} gets ${relation} handling without writes`, t => {
|
|
100
|
+
const options = design(t, version), before = fs.readdirSync(options.root, { recursive: true });
|
|
101
|
+
const checked = deps.check(options);
|
|
102
|
+
assert.equal(checked.design.versionRelation, relation);
|
|
103
|
+
assert.equal(checked.design.availability, availability);
|
|
104
|
+
assert.deepEqual(fs.readdirSync(options.root, { recursive: true }), before);
|
|
105
|
+
assert.equal(fs.existsSync(path.join(options.root, 'scripts/__pycache__')), false);
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
test('higher UI/UX Pro Max must support design-system and Vue queries', t => {
|
|
110
|
+
const options = design(t, '2.16.0');
|
|
111
|
+
fs.writeFileSync(path.join(options.root, 'scripts/search.py'), 'import json, sys\nif "--design-system" in sys.argv: raise SystemExit(1)\nprint(json.dumps({"domain":"ux","results":[{}]}))\n');
|
|
112
|
+
const checked = deps.check(options);
|
|
113
|
+
assert.equal(checked.design.availability, 'unusable');
|
|
114
|
+
assert.throws(() => deps.assertPreparable(checked), /ui-ux-pro-max.*检查未通过/);
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
test('higher UI/UX Pro Max returning unrelated successful JSON is incompatible', t => {
|
|
118
|
+
const options = design(t, '2.16.0');
|
|
119
|
+
fs.writeFileSync(path.join(options.root, 'scripts/search.py'), 'import json, sys\nprint(json.dumps({"status":"unsupported"} if "--design-system" in sys.argv else {"domain":"ux","results":[{}]}))\n');
|
|
120
|
+
assert.equal(deps.check(options).design.availability, 'unusable');
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
test('an unusable provider blocks preparation before any installation writes', async t => {
|
|
124
|
+
const options = design(t, 'unknown'), before = fs.readdirSync(options.project, { recursive: true });
|
|
125
|
+
await assert.rejects(deps.prepare({ ...options, accept: true }), /ui-ux-pro-max.*检查未通过/);
|
|
126
|
+
assert.deepEqual(fs.readdirSync(options.project, { recursive: true }), before);
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
test('Codex dependency inspection never creates a missing config directory', t => {
|
|
130
|
+
const options = design(t, '2.15.0');
|
|
131
|
+
const before = fs.readdirSync(options.project, { recursive: true });
|
|
132
|
+
const checked = deps.check({ ...options, host: 'codex' });
|
|
133
|
+
assert.equal(checked.design.availability, 'missing');
|
|
134
|
+
assert.deepEqual(fs.readdirSync(options.project, { recursive: true }), before);
|
|
135
|
+
assert.equal(fs.existsSync(path.join(options.home, '.codex')), false);
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
test('native provider lookup follows the selected host registry, including Cursor shared project skills', t => {
|
|
139
|
+
const options = design(t, '2.15.0'), location = deps.context({ ...options, host: 'cursor' });
|
|
140
|
+
const root = path.join(location.projectSkills, 'ui-ux-pro-max');
|
|
141
|
+
fs.mkdirSync(path.dirname(root), { recursive: true }); fs.renameSync(options.root, root);
|
|
142
|
+
const checked = deps.check({ ...options, host: 'cursor' });
|
|
143
|
+
assert.equal(checked.design.availability, 'available', checked.design.reason);
|
|
144
|
+
assert.equal(checked.design.root, root);
|
|
145
|
+
assert.equal(checked.design.source, 'project-skill');
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
test('a broken active project Skill cannot be hidden by a healthy global copy', t => {
|
|
149
|
+
const options = design(t, '2.15.0');
|
|
150
|
+
const global = path.join(options.home, '.codebuddy/skills/ui-ux-pro-max');
|
|
151
|
+
fs.mkdirSync(path.dirname(global), { recursive: true }); fs.cpSync(options.root, global, { recursive: true });
|
|
152
|
+
fs.unlinkSync(path.join(options.root, 'scripts/core.py'));
|
|
153
|
+
const checked = deps.check(options);
|
|
154
|
+
assert.equal(checked.design.availability, 'unusable');
|
|
155
|
+
assert.equal(checked.design.root, options.root);
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
test('Codex reuses one registered plugin through read-only metadata without launching its CLI', t => {
|
|
159
|
+
const options = design(t, '2.16.0'), config = path.join(options.home, '.codex');
|
|
160
|
+
const plugin = path.join(config, 'plugins/cache/ui-ux-pro-max-skill/ui-ux-pro-max/2.16.0');
|
|
161
|
+
const root = path.join(plugin, '.claude/skills/ui-ux-pro-max');
|
|
162
|
+
fs.mkdirSync(path.dirname(root), { recursive: true }); fs.renameSync(options.root, root);
|
|
163
|
+
fs.mkdirSync(path.join(plugin, '.claude-plugin'));
|
|
164
|
+
fs.writeFileSync(path.join(plugin, '.claude-plugin/plugin.json'), JSON.stringify({ name: 'ui-ux-pro-max', version: '2.16.0', skills: './.claude/skills/' }));
|
|
165
|
+
fs.writeFileSync(path.join(config, 'config.toml'), '[plugins."ui-ux-pro-max@ui-ux-pro-max-skill"]\nenabled = true\n');
|
|
166
|
+
const before = fs.readdirSync(options.home, { recursive: true });
|
|
167
|
+
const checked = deps.check({ ...options, host: 'codex' });
|
|
168
|
+
assert.equal(checked.design.availability, 'available', checked.design.reason);
|
|
169
|
+
assert.equal(checked.design.versionRelation, 'higher');
|
|
170
|
+
assert.equal(checked.design.root, root);
|
|
171
|
+
assert.deepEqual(fs.readdirSync(options.home, { recursive: true }), before);
|
|
172
|
+
fs.writeFileSync(path.join(config, 'config.toml'), '[plugins."ui-ux-pro-max@ui-ux-pro-max-skill"]\nenabled = false\n');
|
|
173
|
+
assert.equal(deps.check({ ...options, host: 'codex' }).design.availability, 'disabled');
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
test('a requested version and successful exit do not hide stale CLI output', t => {
|
|
177
|
+
const { root, options } = official(t, true);
|
|
178
|
+
const result = deps.inspectOfficial(root, options);
|
|
179
|
+
assert.equal(result.availability, 'unusable');
|
|
180
|
+
assert.match(result.reason, /data|query|match/i);
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
test('official probing rejects missing data, modified source and modified build output', t => {
|
|
184
|
+
for (const file of ['data/v1.6.0.json', 'bin/antdv.js', 'dist/index.mjs']) {
|
|
185
|
+
const { root, options } = official(t);
|
|
186
|
+
fs.writeFileSync(path.join(root, file), 'tampered');
|
|
187
|
+
assert.equal(deps.inspectOfficial(root, options).availability, 'unusable');
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
test('declining required preparation ends the flow with zero project writes', async t => {
|
|
192
|
+
const project = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), 'ui-demo-decline-')));
|
|
193
|
+
t.after(() => fs.rmSync(project, { recursive: true, force: true }));
|
|
194
|
+
const result = await deps.prepare({ project, host: 'codebuddy', decision: 'decline' });
|
|
195
|
+
assert.equal(result.status, 'declined');
|
|
196
|
+
assert.equal(result.continue, false);
|
|
197
|
+
assert.deepEqual(fs.readdirSync(project), []);
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
test('preparing a design provider preserves an existing Skill before starting installation', async t => {
|
|
201
|
+
const project = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), 'ui-demo-design-preserve-')));
|
|
202
|
+
t.after(() => fs.rmSync(project, { recursive: true, force: true }));
|
|
203
|
+
const location = deps.context({ project, home: project, host: 'codex', scope: 'project' });
|
|
204
|
+
const destination = path.join(location.skillsDirectory, 'ui-ux-pro-max');
|
|
205
|
+
fs.mkdirSync(destination, { recursive: true });
|
|
206
|
+
fs.writeFileSync(path.join(destination, 'manual.txt'), 'manual edits');
|
|
207
|
+
await assert.rejects(() => deps.prepareDesign(location), /Existing design Skill preserved/);
|
|
208
|
+
assert.equal(fs.readFileSync(path.join(destination, 'manual.txt'), 'utf8'), 'manual edits');
|
|
209
|
+
assert.equal(fs.existsSync(deps.toolDirectory(location)), false);
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
test('design commands point at the final project or global scope, including paths with spaces', t => {
|
|
213
|
+
const base = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), 'ui-demo-design-path-')));
|
|
214
|
+
t.after(() => fs.rmSync(base, { recursive: true, force: true }));
|
|
215
|
+
for (const scope of ['project', 'global']) {
|
|
216
|
+
const root = path.join(base, scope); fs.mkdirSync(root);
|
|
217
|
+
const old = '.agents/skills/ui-ux-pro-max/scripts/search.py';
|
|
218
|
+
fs.writeFileSync(path.join(root, 'SKILL.md'), `Official instructions retained\npython3 ${old} query\n`);
|
|
219
|
+
fs.writeFileSync(path.join(root, 'UPSTREAM-ORIGIN.json'), JSON.stringify({ version: '2.15.0', pathParameters: { script: old, command: old } }));
|
|
220
|
+
const project = path.join(base, 'business'), destination = path.join(scope === 'global' ? base + '/private home' : project, '.agents/skills/ui-ux-pro-max');
|
|
221
|
+
deps.parameterizeDesign(root, { scope, project }, destination);
|
|
222
|
+
const receipt = JSON.parse(fs.readFileSync(path.join(root, 'UPSTREAM-ORIGIN.json')));
|
|
223
|
+
assert.equal(receipt.pathParameters.script, (scope === 'global' ? path.join(destination, 'scripts/search.py') : old).split(path.sep).join('/'));
|
|
224
|
+
assert.ok(fs.readFileSync(path.join(root, 'SKILL.md'), 'utf8').includes('python3 ' + receipt.pathParameters.command + ' query'));
|
|
225
|
+
assert.ok(fs.readFileSync(path.join(root, 'SKILL.md'), 'utf8').startsWith('Official instructions retained\n'));
|
|
226
|
+
assert.equal(path.isAbsolute(receipt.pathParameters.script), scope === 'global');
|
|
227
|
+
}
|
|
228
|
+
});
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
const test = require('node:test');
|
|
2
|
+
const assert = require('node:assert/strict');
|
|
3
|
+
const fs = require('node:fs');
|
|
4
|
+
const os = require('node:os');
|
|
5
|
+
const path = require('node:path');
|
|
6
|
+
const installation = path.join(__dirname, 'lib/installation.js');
|
|
7
|
+
const skills = fs.existsSync(installation) ? require(installation).loadInstallation().skillsDirectory : path.resolve(__dirname, '../skills');
|
|
8
|
+
const mcp = require(path.join(skills, 'i3-ui-demo/scripts/mcp.cjs'));
|
|
9
|
+
function fixture(t) { const root = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), 'ui-demo-mcp-'))); t.after(() => fs.rmSync(root, { recursive: true, force: true })); return root; }
|
|
10
|
+
|
|
11
|
+
test('MCP planning is read-only and applying requires an explicit write flag', t => {
|
|
12
|
+
const project = fixture(t);
|
|
13
|
+
const plan = mcp.plan({ project, host: 'codebuddy', scope: 'project' });
|
|
14
|
+
assert.equal(plan.status, 'needs-configuration');
|
|
15
|
+
assert.deepEqual(fs.readdirSync(project), []);
|
|
16
|
+
assert.throws(() => mcp.apply({ project, host: 'codebuddy', scope: 'project', expected: plan.digest }), /write|authorization/);
|
|
17
|
+
assert.deepEqual(fs.readdirSync(project), []);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
test('CodeBuddy configuration preserves unrelated settings and reuses the first existing priority file', t => {
|
|
21
|
+
const project = fixture(t), file = path.join(project, 'mcp.json');
|
|
22
|
+
fs.writeFileSync(file, JSON.stringify({ mcpServers: { other: { command: 'other-server' } }, retained: { owner: 'user' } }));
|
|
23
|
+
const options = { project, host: 'codebuddy', scope: 'project' }, before = mcp.plan(options);
|
|
24
|
+
assert.equal(before.file, file);
|
|
25
|
+
const result = mcp.apply({ ...options, write: true, expected: before.digest });
|
|
26
|
+
assert.equal(result.connectionVerified, false);
|
|
27
|
+
const after = JSON.parse(fs.readFileSync(file));
|
|
28
|
+
assert.equal(after.mcpServers.other.command, 'other-server');
|
|
29
|
+
assert.deepEqual(after.retained, { owner: 'user' });
|
|
30
|
+
assert.ok(after.mcpServers['chrome-devtools'].args.includes('--isolated'));
|
|
31
|
+
assert.equal(fs.existsSync(path.join(project, '.mcp.json')), false);
|
|
32
|
+
assert.equal(mcp.plan(options).status, 'configured-unverified');
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
test('MCP configuration never overwrites a conflicting server or a concurrent edit', t => {
|
|
36
|
+
const project = fixture(t), file = path.join(project, '.mcp.json');
|
|
37
|
+
fs.writeFileSync(file, JSON.stringify({ mcpServers: { 'chrome-devtools': { command: 'custom' } } }));
|
|
38
|
+
const original = fs.readFileSync(file), options = { project, host: 'codebuddy' };
|
|
39
|
+
assert.equal(mcp.plan(options).status, 'conflict');
|
|
40
|
+
assert.throws(() => mcp.apply({ ...options, write: true, expected: mcp.plan(options).digest }), /conflict/);
|
|
41
|
+
assert.deepEqual(fs.readFileSync(file), original);
|
|
42
|
+
fs.writeFileSync(file, '{}');
|
|
43
|
+
const before = mcp.plan(options);
|
|
44
|
+
fs.writeFileSync(file, '{"later":"user edit"}');
|
|
45
|
+
assert.throws(() => mcp.apply({ ...options, write: true, expected: before.digest }), /changed/);
|
|
46
|
+
assert.equal(fs.readFileSync(file, 'utf8'), '{"later":"user edit"}');
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
test('Codex adds a TOML table while preserving all existing text and distinguishes configuration from connection', t => {
|
|
50
|
+
const project = fixture(t), directory = path.join(project, '.codex'); fs.mkdirSync(directory);
|
|
51
|
+
const file = path.join(directory, 'config.toml'), initial = '# user settings\nmodel = "existing"\n\n[mcp_servers.other]\ncommand = "other"\n';
|
|
52
|
+
fs.writeFileSync(file, initial);
|
|
53
|
+
const options = { project, host: 'codex' }, before = mcp.plan(options);
|
|
54
|
+
const after = mcp.apply({ ...options, write: true, expected: before.digest });
|
|
55
|
+
assert.ok(fs.readFileSync(file, 'utf8').startsWith(initial));
|
|
56
|
+
assert.match(fs.readFileSync(file, 'utf8'), /\[mcp_servers\.chrome-devtools\]/);
|
|
57
|
+
assert.equal(after.status, 'configured-unverified');
|
|
58
|
+
assert.equal(after.connectionVerified, false);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test('MCP preparation refuses symlinks and unsupported host guesses without writing', t => {
|
|
62
|
+
const project = fixture(t), outside = fixture(t), target = path.join(outside, 'private.json'); fs.writeFileSync(target, '{}');
|
|
63
|
+
fs.symlinkSync(target, path.join(project, '.mcp.json'));
|
|
64
|
+
assert.throws(() => mcp.plan({ project, host: 'codebuddy' }), /symlink/);
|
|
65
|
+
assert.throws(() => mcp.plan({ project, host: 'unknown-host' }), /host|config/);
|
|
66
|
+
assert.equal(fs.readFileSync(target, 'utf8'), '{}');
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
test('new MCP filesystem access is scoped to the canonical business project, including paths with spaces', t => {
|
|
70
|
+
const root = fixture(t), project = path.join(root, 'business project'); fs.mkdirSync(project);
|
|
71
|
+
for (const host of ['codebuddy', 'codex']) {
|
|
72
|
+
const options = { project, host }, before = mcp.plan(options);
|
|
73
|
+
assert.deepEqual(before.server.args.slice(-2), ['--workspace', fs.realpathSync(project)]);
|
|
74
|
+
mcp.apply({ ...options, write: true, expected: before.digest });
|
|
75
|
+
const content = fs.readFileSync(before.file, 'utf8');
|
|
76
|
+
const args = host === 'codebuddy' ? JSON.parse(content).mcpServers['chrome-devtools'].args
|
|
77
|
+
: JSON.parse(content.match(/^args = (.+)$/m)[1]);
|
|
78
|
+
assert.deepEqual(args.slice(-2), ['--workspace', fs.realpathSync(project)]);
|
|
79
|
+
assert.equal(args.includes('--allowUnrestrictedPaths'), false);
|
|
80
|
+
const original = fs.readFileSync(before.file);
|
|
81
|
+
mcp.apply({ ...options, write: true, expected: mcp.plan(options).digest });
|
|
82
|
+
assert.deepEqual(fs.readFileSync(before.file), original);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test('existing real-browser attachment flags require review and are preserved in JSON and TOML', t => {
|
|
87
|
+
for (const flag of ['--autoConnect', '--browserUrl=http://localhost:9222', '--browser-url', '--wsEndpoint', '-u', '-w', '--userDataDir']) {
|
|
88
|
+
const project = fixture(t), file = path.join(project, '.mcp.json');
|
|
89
|
+
fs.writeFileSync(file, JSON.stringify({ mcpServers: { 'chrome-devtools': { command: 'npx', args: ['chrome-devtools-mcp', flag] } } }));
|
|
90
|
+
assert.equal(mcp.plan({ project, host: 'codebuddy' }).status, 'conflict', flag);
|
|
91
|
+
const directory = path.join(project, '.codex'); fs.mkdirSync(directory);
|
|
92
|
+
fs.writeFileSync(path.join(directory, 'config.toml'), `[mcp_servers.chrome-devtools]\ncommand="npx"\nargs=["chrome-devtools-mcp",${JSON.stringify(flag)}]\n`);
|
|
93
|
+
assert.equal(mcp.plan({ project, host: 'codex' }).status, 'conflict', flag);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
const test = require('node:test');
|
|
2
|
+
const assert = require('node:assert/strict');
|
|
3
|
+
const fs = require('node:fs');
|
|
4
|
+
const path = require('node:path');
|
|
5
|
+
const os = require('node:os');
|
|
6
|
+
const { spawn } = require('node:child_process');
|
|
7
|
+
const { runInNewContext } = require('node:vm');
|
|
8
|
+
const installation = path.join(__dirname, 'lib/installation.js');
|
|
9
|
+
const skills = fs.existsSync(installation) ? require(installation).loadInstallation().skillsDirectory : path.resolve(__dirname, '../skills');
|
|
10
|
+
const resources = require(path.join(skills, 'i3-ui-demo/scripts/resources.cjs'));
|
|
11
|
+
|
|
12
|
+
test('i3-ui-demo waits for a submitted template choice and accepts submitted empty as default', () => {
|
|
13
|
+
assert.equal(resources.selectTemplates({ submitted: false }).status, 'needs-selection');
|
|
14
|
+
assert.deepEqual(resources.selectTemplates({ submitted: true, values: [] }).selected, ['enterprise-admin']);
|
|
15
|
+
assert.deepEqual(resources.selectTemplates({ submitted: true, values: ['1', 'enterprise-admin'] }).selected, ['enterprise-admin']);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
test('i3-ui-demo never substitutes unavailable templates or drops one from a multiple selection', () => {
|
|
19
|
+
for (const values of [['2'], ['3'], ['4'], ['1', '2'], ['unknown']]) {
|
|
20
|
+
assert.throws(() => resources.selectTemplates({ submitted: true, values }), /unavailable|Unknown/);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
test('i3-ui-demo resolves its own enterprise template and design rules', () => {
|
|
25
|
+
const result = resources.resolveResources();
|
|
26
|
+
assert.equal(result.skillRoot, resources.root);
|
|
27
|
+
assert.equal(result.templateRoot, path.join(resources.root, 'assets/templates/enterprise-admin'));
|
|
28
|
+
assert.equal(result.template.id, 'enterprise-admin');
|
|
29
|
+
assert.ok(fs.statSync(result.generation).isFile());
|
|
30
|
+
assert.ok(fs.statSync(result.designRules).isFile());
|
|
31
|
+
assert.ok(fs.statSync(path.join(result.templateRoot, 'reference/src/shell/ConsoleShell.html')).isFile());
|
|
32
|
+
const generation = JSON.parse(fs.readFileSync(result.generation, 'utf8'));
|
|
33
|
+
assert.ok(generation.choices.layout.sidebar);
|
|
34
|
+
assert.ok(generation.choices.style.business);
|
|
35
|
+
assert.equal(result.versions.component.version, '1.6.0');
|
|
36
|
+
assert.equal(result.versions.design.version, '2.15.0');
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test('i3-ui-demo template resolution works without another prototype skill and never falls back to its template', t => {
|
|
40
|
+
const temporary = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), 'ui-demo-owned-template-')));
|
|
41
|
+
t.after(() => fs.rmSync(temporary, { recursive: true, force: true }));
|
|
42
|
+
const own = path.join(temporary, 'skills', path.basename(resources.root));
|
|
43
|
+
fs.cpSync(resources.root, own, { recursive: true });
|
|
44
|
+
const isolated = require(path.join(own, 'scripts/resources.cjs'));
|
|
45
|
+
assert.equal(isolated.resolveResources().templateRoot, path.join(own, 'assets/templates/enterprise-admin'));
|
|
46
|
+
const dependencies = require(path.join(own, 'scripts/dependencies.cjs'));
|
|
47
|
+
const detection = dependencies.check({ project: temporary, home: path.join(temporary, 'home'), host: 'codebuddy', env: {} });
|
|
48
|
+
assert.equal(detection.ready, false);
|
|
49
|
+
assert.equal(detection.design.availability, 'missing');
|
|
50
|
+
assert.equal(detection.official.availability, 'missing');
|
|
51
|
+
const ownGeneration = path.join(own, 'assets/templates/enterprise-admin/generation.json');
|
|
52
|
+
const foreign = path.join(temporary, 'skills', path.basename(resources.root).startsWith('i3-') ? 'i3-ui-prototype' : 'i3-ui-prototype', 'assets/templates/enterprise-admin');
|
|
53
|
+
fs.cpSync(path.dirname(ownGeneration), foreign, { recursive: true });
|
|
54
|
+
fs.unlinkSync(ownGeneration);
|
|
55
|
+
assert.throws(() => isolated.resolveResources(), /missing/i);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
test('i3-ui-demo owns one complete capability contract including native mappings and lifecycle checks', () => {
|
|
59
|
+
const definition = JSON.parse(fs.readFileSync(path.join(resources.root, 'assets/templates/enterprise-admin/capability-definition.json'), 'utf8'));
|
|
60
|
+
assert.equal(definition.schemaVersion, 2);
|
|
61
|
+
assert.equal(Object.keys(definition.capabilities).length, 26);
|
|
62
|
+
assert.equal(Object.keys(definition.patterns).length, 10);
|
|
63
|
+
for (const capability of Object.values(definition.capabilities)) {
|
|
64
|
+
assert.ok(capability.implementation.components.length, capability.id);
|
|
65
|
+
assert.ok(capability.scenarios.every(scenario => scenario.expected && scenario.id), capability.id);
|
|
66
|
+
const native = capability.nativeChecks || [];
|
|
67
|
+
assert.equal(new Set(native.map(check => check.id)).size, native.length, capability.id);
|
|
68
|
+
}
|
|
69
|
+
assert.equal(definition.capabilities.pagination.defaults.mode, 'adjustable');
|
|
70
|
+
assert.ok(definition.capabilities.feedback.parameters.states.includesByMode['management-list'].includes('empty'));
|
|
71
|
+
assert.ok(definition.capabilities.dialog.nativeChecks.some(check => check.id === 'mask-blur'));
|
|
72
|
+
assert.ok(definition.capabilities.theme.scenarios.some(check => check.id === 'accessibility'));
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
test('default native presentation matches the owned template palette and dimensions', () => {
|
|
76
|
+
const source = file => fs.readFileSync(path.join(resources.root, 'assets/starter/src/domain', file), 'utf8');
|
|
77
|
+
const themes = source('theme.ts').match(/export const THEME_PRESETS = (\{[\s\S]*?\n\}) as const/);
|
|
78
|
+
const recipe = source('presentation.ts').match(/export function presentationTokens\(value: Presentation\) \{([\s\S]*?)\n\}/);
|
|
79
|
+
assert.ok(themes && recipe, 'The native theme and presentation definitions must be readable');
|
|
80
|
+
// Installer checks support Node 20; evaluate the actual JS expressions without importing TS.
|
|
81
|
+
const body = recipe[1].replace(" as 'small' | 'middle' | 'large'", '');
|
|
82
|
+
const actual = runInNewContext(`const presets = ${themes[1]}; function tokens(value) {${body}};
|
|
83
|
+
({light:presets.light,presentation:tokens({layout:'sidebar',style:'business',density:'standard'})});`, {}, { timeout: 1000 });
|
|
84
|
+
const profile = resources.resolveResources().visual;
|
|
85
|
+
assert.equal(actual.light.primary, profile.nativeTokens.colorPrimary);
|
|
86
|
+
assert.equal(actual.light.bg, profile.nativeTokens.colorBgLayout);
|
|
87
|
+
assert.equal(actual.light.text, profile.nativeTokens.colorText);
|
|
88
|
+
assert.equal(actual.light.border, profile.nativeTokens.colorBorder);
|
|
89
|
+
assert.equal(actual.light.panelBorder, profile.nativeTokens.colorBorderSecondary);
|
|
90
|
+
assert.equal(actual.presentation.borderRadius, profile.nativeTokens.borderRadius);
|
|
91
|
+
assert.equal(actual.presentation.panelRadius, profile.panelRadius);
|
|
92
|
+
assert.equal(actual.presentation.spacing, profile.spacing);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
test('reference mappings reject unrelated capabilities and create separate node scenarios', () => {
|
|
96
|
+
const scope = { pages: [{ id: 'assets', title: '资产', referencePage: 'models-page', regions: [{ id: 'list', pattern: 'management-list',
|
|
97
|
+
fields: [{ id: 'name', label: '名称', requirementId: 'R1', type: 'text' }],
|
|
98
|
+
actions: [{ id: 'query', label: '查询', requirementId: 'R1', target: 'page', outcome: '展示匹配资产' }] }] }],
|
|
99
|
+
requirements: [{ id: 'R1', text: '查询资产', pages: ['assets'], source: { type: 'user', reference: 'request', statement: '查询资产' } }] };
|
|
100
|
+
const element = resources.readPage('models-page').elements.find(item => item.component === 'ProTable');
|
|
101
|
+
const decision = { pageId: 'assets', nodeIds: [element.id], decision: 'mapped', reason: '对应资产列表', requirementId: 'R1', bindingIds: ['assets/list/collection'] };
|
|
102
|
+
const mapped = resources.plan({ ...scope, generation: { referenceDecisions: [decision] } });
|
|
103
|
+
assert.ok(mapped.scenarios.some(item => item.referenceNodeId === element.id));
|
|
104
|
+
assert.ok(!mapped.pendingReferenceElements.some(item => item.pageId === 'assets' && item.id === element.id));
|
|
105
|
+
assert.throws(() => resources.plan({ ...scope, generation: { referenceDecisions: [{ ...decision, bindingIds: ['app-shell/shell/theme'] }] } }), /capabilit|mapping/i);
|
|
106
|
+
assert.throws(() => resources.plan({ ...scope, generation: { decisions: [{ pageId: 'assets', capabilityId: 'pagination', decision: 'not-applicable', reason: '省略', requirementId: 'R1' }] } }), /Required/);
|
|
107
|
+
assert.equal(new Set(mapped.scenarios.map(item => item.id)).size, mapped.scenarios.length);
|
|
108
|
+
assert.throws(() => resources.plan({ ...scope, pages: [{ ...scope.pages[0], regions: [{ id: 'form', pattern: 'form-page', parameters: { edit: { presentation: 'drawer' } } }] }] }), /presentation/i);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
test('i3-ui-demo reads selected page structure, behavior and styles without an installed prototype skill', t => {
|
|
112
|
+
const temporary = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), 'ui-demo-page-')));
|
|
113
|
+
t.after(() => fs.rmSync(temporary, { recursive: true, force: true }));
|
|
114
|
+
const own = path.join(temporary, 'skills', path.basename(resources.root));
|
|
115
|
+
fs.cpSync(resources.root, own, { recursive: true, filter: file => path.basename(file) !== '.DS_Store' });
|
|
116
|
+
const isolated = require(path.join(own, 'scripts/resources.cjs'));
|
|
117
|
+
const page = isolated.readPage('models-page');
|
|
118
|
+
assert.ok(page.fragments.some(fragment => fragment.file.endsWith('ModelsPage.html')));
|
|
119
|
+
assert.ok(page.behaviorFiles.some(file => file.endsWith('ModelsPage.js')));
|
|
120
|
+
assert.ok(page.behaviorFiles.some(file => file.endsWith('/models/store.js')));
|
|
121
|
+
assert.ok(page.styleFiles.includes('reference/styles/tokens.css'));
|
|
122
|
+
assert.ok(page.elements.length > 0);
|
|
123
|
+
assert.ok(page.elements.some(element => element.events.length > 0));
|
|
124
|
+
assert.ok(!JSON.stringify(page).includes('i3-ui-prototype'));
|
|
125
|
+
assert.equal(isolated.readCapability('pagination').defaults.minimumTestPages, 3);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
test('i3-ui-demo maps required page capabilities and keeps reference decisions pending until accounted for', () => {
|
|
129
|
+
const scope = { title: '资产管理', pages: [{ id: 'assets', title: '资产台账', referencePage: 'models-page',
|
|
130
|
+
regions: [{ id: 'list', pattern: 'management-list' }] }],
|
|
131
|
+
requirements: [{ id: 'ASSET-01', text: '资产查询、分页和批量处理', pages: ['assets'],
|
|
132
|
+
source: { type: 'user', reference: 'request', statement: '创建资产管理列表' } }] };
|
|
133
|
+
const plan = resources.plan(scope);
|
|
134
|
+
assert.equal(plan.status, 'pending-implementation');
|
|
135
|
+
assert.ok(plan.bindings.some(binding => binding.id === 'assets/list/columns'));
|
|
136
|
+
assert.ok(plan.bindings.some(binding => binding.id === 'app-shell/shell/theme'));
|
|
137
|
+
assert.ok(plan.pendingReferenceElements.length > 0);
|
|
138
|
+
assert.ok(plan.scenarios.some(scenario => scenario.bindingId === 'assets/list/pagination'));
|
|
139
|
+
assert.throws(() => resources.plan({ ...scope, pages: [{ ...scope.pages[0], referencePage: 'missing' }] }), /reference|page/i);
|
|
140
|
+
assert.throws(() => resources.plan({ ...scope, pages: [{ ...scope.pages[0], regions: [{ id: 'list', pattern: 'management-list',
|
|
141
|
+
parameters: { pagination: { mode: 'fixed' } } }] }] }), /fixedPageSize/);
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
test('i3-ui-demo rejects changed or missing owned capability and style resources', t => {
|
|
145
|
+
const temporary = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), 'ui-demo-integrity-')));
|
|
146
|
+
t.after(() => fs.rmSync(temporary, { recursive: true, force: true }));
|
|
147
|
+
const own = path.join(temporary, 'skills', path.basename(resources.root));
|
|
148
|
+
fs.cpSync(resources.root, own, { recursive: true, filter: file => path.basename(file) !== '.DS_Store' });
|
|
149
|
+
const isolated = require(path.join(own, 'scripts/resources.cjs'));
|
|
150
|
+
const css = path.join(own, 'assets/templates/enterprise-admin/reference/styles/tokens.css');
|
|
151
|
+
fs.appendFileSync(css, '\n:root { --easel-primary: red; }\n');
|
|
152
|
+
assert.throws(() => isolated.resolveResources(), /integrity|changed|digest/i);
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
test('owned template preview serves its entry, offline runtime and styles without an instance app folder', { timeout: 10000 }, async t => {
|
|
156
|
+
const child = spawn(process.execPath, [path.join(resources.root, 'assets/templates/enterprise-admin/serve.cjs'), '0'], { stdio: ['ignore','pipe','pipe'] });
|
|
157
|
+
t.after(() => child.kill());
|
|
158
|
+
const url = await new Promise((resolve, reject) => {
|
|
159
|
+
child.on('error', reject);
|
|
160
|
+
child.on('exit', code => reject(new Error(`Preview exited: ${code}`)));
|
|
161
|
+
child.stdout.on('data', chunk => { const match = String(chunk).match(/http:\/\/127\.0\.0\.1:\d+\//); if (match) resolve(match[0]); });
|
|
162
|
+
});
|
|
163
|
+
const response = await fetch(url);
|
|
164
|
+
assert.equal(response.status, 200);
|
|
165
|
+
assert.match(await response.text(), /src="offline\.js"/);
|
|
166
|
+
for (const file of ['offline.js','reference/styles/tokens.css']) {
|
|
167
|
+
const asset = await fetch(new URL(file, url));
|
|
168
|
+
assert.equal(asset.status, 200, file);
|
|
169
|
+
}
|
|
170
|
+
});
|
|
@@ -10,7 +10,7 @@ test('new execution inputs freeze complete scenario expectations without changin
|
|
|
10
10
|
const file=path.join(options.project,'assertions.json');fs.writeFileSync(file,JSON.stringify(assertions));
|
|
11
11
|
const fresh=lib.createPrototype({...options,id:'strict',host:'codebuddy',executionPolicy:'codebuddy-ab-v1',executionAssertions:file});
|
|
12
12
|
assert.equal(X.policy(fresh.directory).id,'codebuddy-ab-v1');assert.equal(lib.inspect(fresh.directory).status,'passed');
|
|
13
|
-
assert.equal(X.check(fresh.directory,'delivery',lib).status,'failed');
|
|
13
|
+
assert.equal(X.check(fresh.directory,'delivery',lib).status,'failed');const stage=X.requireStage(fresh.directory,'implementation',lib);assert.equal(stage.status,'not-required');assert.equal(stage.auditHook,'retired');assert.equal(stage.invocationVerification,'unverified');
|
|
14
14
|
assert.deepEqual(lib.manifest(legacy.directory),before);assert.deepEqual(fs.readdirSync(options.project).sort(),['assertions.json','prototypes','scope.json']);
|
|
15
15
|
});
|
|
16
16
|
test('missing or incomplete fixed facts cannot silently create a strict artifact or affect legacy state',t=>{
|