@givolt/i3-composer-agent 2.3.7 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/plugins/marketplace.json +1 -1
- package/.claude/commands/i3-sop.md +19 -0
- 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 +19 -0
- package/.gemini/commands/i3-ui-demo.toml +21 -0
- package/README.md +42 -6
- 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 +19 -0
- 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/upstream-repository/AGENTS.md +92 -0
- package/docs/upstream-repository/CLAUDE.md +60 -0
- package/docs/upstream-repository/CONTRIBUTING.md +137 -0
- package/docs/upstream-repository/README.md +8 -0
- package/docs/upstream-repository/gitattributes.txt +1 -0
- package/docs/upstream-repository/gitignore.txt +10 -0
- package/docs/upstream-repository/manifest.json +71 -0
- package/docs/upstream-repository/opencode-skills.link +1 -0
- package/docs/upstream-repository/skill-gap.yml +80 -0
- package/docs/upstream-repository/skills-contributing.md +15 -0
- package/docs/upstream-repository/test-plugin-install.yml +167 -0
- package/docs/workbuddy-setup.md +7 -10
- package/evals/cases/i3-enterprise-sop.json +64 -0
- package/evals/cases/i3-ui-demo.json +98 -0
- package/evals/fixtures/i3-enterprise-sop/brief.md +11 -0
- package/evals/fixtures/i3-ui-demo/asset-management.md +25 -0
- package/evals/zh-CN/cases/i3-enterprise-sop.json +61 -0
- 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 +48 -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 +173 -0
- package/skills/i3-enterprise-sop/agents/openai.yaml +2 -0
- package/skills/i3-enterprise-sop/references/ad/assets-manifest.json +86 -0
- package/skills/i3-enterprise-sop/references/ad/prompts/01-generate.md +58 -0
- package/skills/i3-enterprise-sop/references/ad/prompts/02-review.md +54 -0
- package/skills/i3-enterprise-sop/references/ad/prompts/03-revise.md +54 -0
- package/skills/i3-enterprise-sop/references/ad/prompts/04-recheck.md +54 -0
- package/skills/i3-enterprise-sop/references/ad/readme.md +70 -0
- package/skills/i3-enterprise-sop/references/ad/templates/ad.md +337 -0
- package/skills/i3-enterprise-sop/references/assets-manifest.json +230 -0
- package/skills/i3-enterprise-sop/references/brd/assets-manifest.json +83 -0
- package/skills/i3-enterprise-sop/references/brd/prompts/01-generate.md +51 -0
- package/skills/i3-enterprise-sop/references/brd/prompts/02-review.md +47 -0
- package/skills/i3-enterprise-sop/references/brd/prompts/03-revise.md +47 -0
- package/skills/i3-enterprise-sop/references/brd/prompts/04-recheck.md +47 -0
- package/skills/i3-enterprise-sop/references/brd/readme.md +50 -0
- package/skills/i3-enterprise-sop/references/brd/templates/brd.md +169 -0
- package/skills/i3-enterprise-sop/references/codebuddy-project-guide.md +34 -0
- package/skills/i3-enterprise-sop/references/controlled-handoff.md +41 -0
- package/skills/i3-enterprise-sop/references/controlled_handoff.py +379 -0
- package/skills/i3-enterprise-sop/references/engineering-skeleton/adoption.md +200 -0
- package/skills/i3-enterprise-sop/references/engineering-skeleton/catalog.json +17 -0
- package/skills/i3-enterprise-sop/references/engineering-skeleton/directory-standard.md +119 -0
- package/skills/i3-enterprise-sop/references/engineering-skeleton/readme.md +52 -0
- package/skills/i3-enterprise-sop/references/handoff-contract.md +196 -0
- package/skills/i3-enterprise-sop/references/handoff.py +277 -0
- package/skills/i3-enterprise-sop/references/lifecycle-contract.md +91 -0
- package/skills/i3-enterprise-sop/references/plan-handoff.md +73 -0
- package/skills/i3-enterprise-sop/references/prd/assets-manifest.json +109 -0
- package/skills/i3-enterprise-sop/references/prd/prompts/01-generate.md +64 -0
- package/skills/i3-enterprise-sop/references/prd/prompts/02-review.md +49 -0
- package/skills/i3-enterprise-sop/references/prd/prompts/03-revise.md +48 -0
- package/skills/i3-enterprise-sop/references/prd/prompts/04-recheck.md +47 -0
- package/skills/i3-enterprise-sop/references/prd/readme.md +137 -0
- package/skills/i3-enterprise-sop/references/prd/template-contracts.md +39 -0
- package/skills/i3-enterprise-sop/references/prd/templates/ad.md +17 -0
- package/skills/i3-enterprise-sop/references/prd/templates/prd.md +257 -0
- package/skills/i3-enterprise-sop/references/readme.md +167 -0
- package/skills/i3-enterprise-sop/references/recovery-contract.md +65 -0
- package/skills/i3-enterprise-sop/references/review-handoff.md +105 -0
- package/skills/i3-enterprise-sop/references/selection-handoff.md +55 -0
- package/skills/i3-enterprise-sop/references/selection_handoff.py +225 -0
- package/skills/i3-enterprise-sop/references/stages.json +271 -0
- package/skills/i3-enterprise-sop/references/technical-baseline/assets-manifest.json +84 -0
- package/skills/i3-enterprise-sop/references/technical-baseline/baselines/enterprise-application-technical-baseline-v0-0-4.md +380 -0
- package/skills/i3-enterprise-sop/references/technical-baseline/readme.md +132 -0
- package/skills/i3-enterprise-sop/references/technical-baseline/templates/technical-baseline.md +133 -0
- package/skills/i3-enterprise-sop/references/template-contracts.md +142 -0
- package/skills/i3-enterprise-sop/references/testcase/assets-manifest.json +91 -0
- package/skills/i3-enterprise-sop/references/testcase/prompts/01-generate.md +53 -0
- package/skills/i3-enterprise-sop/references/testcase/prompts/02-review.md +51 -0
- package/skills/i3-enterprise-sop/references/testcase/prompts/03-revise.md +49 -0
- package/skills/i3-enterprise-sop/references/testcase/prompts/04-recheck.md +51 -0
- package/skills/i3-enterprise-sop/references/testcase/readme.md +61 -0
- package/skills/i3-enterprise-sop/references/testcase/templates/testcase.md +269 -0
- package/skills/i3-enterprise-sop/references/verification/check_execution.py +185 -0
- package/skills/i3-enterprise-sop/references/verification/check_native_execution.py +282 -0
- package/skills/i3-enterprise-sop/references/verification/check_reads.py +348 -0
- package/skills/i3-enterprise-sop/references/verification/readme.md +149 -0
- package/skills/i3-enterprise-sop/references/verification/review-output.schema.json +155 -0
- package/skills/i3-enterprise-sop/references/verification/review_handoff.py +329 -0
- 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
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
# 资源与实例约定
|
|
2
|
+
|
|
3
|
+
<!-- i3:zh-guide:start -->
|
|
4
|
+
## 中文使用说明
|
|
5
|
+
|
|
6
|
+
按下文完整工程步骤、检查项与验证条件执行。根据任务选择适用步骤,保留证据、风险和退出条件;正文示例中的英文标签在面向用户输出时译为中文。
|
|
7
|
+
|
|
8
|
+
默认使用简体中文解释、追问及生成报告;用户明确要求其他语言时可切换。原方法正文、引用、阈值和审批条件完整保留。代码标识、路径、命令、工具参数、JSON 键/枚举与原文引用保持原样。
|
|
9
|
+
<!-- i3:zh-guide:end -->
|
|
10
|
+
|
|
11
|
+
进入模板选择、初始化或接续实例时读取本文件。
|
|
12
|
+
|
|
13
|
+
## 定位资源
|
|
14
|
+
|
|
15
|
+
用本次实际加载的技能绝对目录执行 `scripts/resources.cjs`。它只读返回模板、生成配置、设计规则、独立 starter 与固定版本配置的位置。
|
|
16
|
+
源目录为 `skills/i3-ui-demo`,发行目录为 `skills/i3-ui-demo`;脚本按当前目录识别源或发行名称。
|
|
17
|
+
企业后台模板由本技能独立持有,保存在 `assets/templates/enterprise-admin/`,生成配置、设计规则、参考页面及其资源均从本技能目录读取。
|
|
18
|
+
不读取其他技能的模板,不使用跨技能链接或缺失时回退。缺少本技能模板时报告缺项,修复本技能资源后继续,不静默改用简易模板。
|
|
19
|
+
保留导入来源、版权和历史资料;来源记录只用于溯源,不是运行时读取路径。专业技能和固定工具仍按依赖流程准备。
|
|
20
|
+
|
|
21
|
+
## 生成与检查共用的自有资源
|
|
22
|
+
|
|
23
|
+
| 文件 | 用途 |
|
|
24
|
+
| --- | --- |
|
|
25
|
+
| `generation.json` | 布局、风格、密度候选与页面模式;当前选择先于设计查询 |
|
|
26
|
+
| `capability-definition.json` | 26 类能力、10 种页面模式、参数约束、原生组件映射、应用职责及验收场景的统一依据 |
|
|
27
|
+
| `template-inventory.json` | 页面、路由、HTML 功能节点、事件、组件来源和资源摘要 |
|
|
28
|
+
| `component-inventory.json` | 原参考组件的归类与说明,辅助理解映射 |
|
|
29
|
+
| `preset.json`、`design-system.md` | 原模板配色、字体、间距、圆角与设计规则 |
|
|
30
|
+
| `reference/` | 本技能持有的原页面 HTML、行为与状态脚本、样式、历史测试和截图;不是外部 Skill 链接 |
|
|
31
|
+
|
|
32
|
+
能力和组件映射已经整合进一个能力定义,不再加载其他技能的规则、执行器或验收文件。来源记录仅用于追溯。模板索引覆盖 35 个参考页面、44 条路由;这些数字表示参考资料范围,不代表业务页面已经实现。
|
|
33
|
+
|
|
34
|
+
将 `<skill-root>` 替换为本次实际加载的技能绝对目录:
|
|
35
|
+
|
|
36
|
+
```text
|
|
37
|
+
node <skill-root>/scripts/resources.cjs
|
|
38
|
+
node <skill-root>/scripts/resources.cjs --page models-page
|
|
39
|
+
node <skill-root>/scripts/resources.cjs --page models-page --fragment reference/src/models/ModelTable.html
|
|
40
|
+
node <skill-root>/scripts/resources.cjs --capability pagination
|
|
41
|
+
node <skill-root>/scripts/resources.cjs --plan <业务范围JSON绝对路径>
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
无参数输出包含可用 `referencePages`、资源绝对路径、视觉参数和模板摘要。`--page app-shell` 读取公共壳层;其他标识来自 `referencePages`,不猜测文件名。页面输出列出关联 HTML、行为文件及其相对导入、样式和功能节点数。`--fragment` 只接受该页实际包含的片段,返回原文和节点;随后实际读取相关行为及样式文件,不能仅凭节点数量推断功能。
|
|
45
|
+
|
|
46
|
+
`--capability` 返回所选能力的参数、场景、原生组件及应用职责,组件 API 再由 `antdv` 和固定 CLI 核对。`--plan` 读取业务范围,计算必需能力、节点映射和检查场景;全部入口只读,不安装、不生成业务代码、不启动浏览器、不填写通过状态。
|
|
47
|
+
资源缺失或摘要不一致时失败,不借用其他技能补齐。`templateDigest` 绑定本技能的模板清单、资源摘要和节点索引;它不是业务完成或浏览器执行的证明。
|
|
48
|
+
|
|
49
|
+
## 从业务范围形成模板合同
|
|
50
|
+
|
|
51
|
+
需求来源沿用现有记录;新实例可以在 `inputs/scope.json` 整理如下最小结构,不凭模板示例发明业务需求:
|
|
52
|
+
|
|
53
|
+
```json
|
|
54
|
+
{
|
|
55
|
+
"pages": [{
|
|
56
|
+
"id": "assets", "title": "资产台账", "referencePage": "models-page",
|
|
57
|
+
"regions": [{
|
|
58
|
+
"id": "list", "pattern": "management-list",
|
|
59
|
+
"fields": [{"id": "name", "label": "资产名称", "type": "text", "requirementId": "ASSET-01"}],
|
|
60
|
+
"actions": [{"id": "query", "label": "查询", "target": "page", "outcome": "显示匹配资产并回到第一页", "requirementId": "ASSET-01"}]
|
|
61
|
+
}]
|
|
62
|
+
}],
|
|
63
|
+
"requirements": [{
|
|
64
|
+
"id": "ASSET-01", "text": "按名称查询资产", "pages": ["assets"],
|
|
65
|
+
"source": {"type": "user", "reference": "用户提示词", "statement": "按名称查询资产"}
|
|
66
|
+
}]
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
这是结构示例,不是完整业务范围。实际需求包括详情、编辑或删除时,增加相应区域、字段和操作。编辑展示形式写在区域 `parameters.edit.presentation`;整页表单、向导和权限页采用 page,编辑区域采用 drawer 或 modal。分页参数等按 `--capability` 返回的规则补充。没有字段或操作的区域要填写具体 `emptyReason`;不以空数组冒充完整业务设计。
|
|
71
|
+
|
|
72
|
+
选择写在 `generation.presentation`,与已确认的 `prototype-config.json.presentation` 一致。运行 `--plan` 后将 JSON 输出保存为实例 `inputs/template-contract.json`,不再维护另一套独立能力清单:
|
|
73
|
+
|
|
74
|
+
- `bindings` 对应页面/区域的能力、业务字段和操作,`scenarios` 给出其检查预期。
|
|
75
|
+
- `referenceCoverage` 给出所选页面及壳层的实际功能节点、事件和参考文件。
|
|
76
|
+
- `pendingDecisions` 中的额外参考能力,在范围的 `generation.decisions` 按 pageId、capabilityId、requirementId、reason 记录 adopted 或 not-applicable;采用时提供 regionId 和必要 parameters。必需能力不能排除。
|
|
77
|
+
- `pendingReferenceElements` 在 `generation.referenceDecisions` 按 pageId、nodeIds、requirementId、reason 逐项映射。mapped 还需同页或公共壳层的 bindingIds,必须匹配节点能力;事件须绑定业务 action 或写明可观察的 behavior。不适用用 not-applicable 并说明业务理由,不填写实现绑定。相同处理可合并一组真实节点。
|
|
78
|
+
- `pendingBusinessDetails` 表示业务字段或操作尚缺。补充后重新计算合同,保留用户决定,不自动把未决项标为完成。
|
|
79
|
+
|
|
80
|
+
节点映射会生成独立参考检查场景,避免只检查一个通用按钮便声称整页覆盖。合同始终返回 `pending-implementation` 和 `executionVerified=false`;源码、构建、浏览器结果及用户认可分别记录。剩余缺项可以交付说明,但不能宣称完整实现或全部验收通过。
|
|
81
|
+
|
|
82
|
+
## 保留原模板效果
|
|
83
|
+
|
|
84
|
+
默认侧栏布局、商务风格、标准密度与 `preset.json` 对齐:主色 #1677ff、页面底色 #f5f5f5、白色面板、正文 14px、内容间距 24px、面板圆角 8px、控件圆角 6px、侧栏 224px、顶栏 64px。当前 starter 的默认主题与尺度遵循这些输入;其他主题和变体仍是可选项,不自动替换已确认风格。
|
|
85
|
+
|
|
86
|
+
HTML 是结构与交互参考,目标使用真实 Vue 与 antdv-next 1.6.0 组件。读取表格、筛选、列设置、批量、编辑、详情等关联片段和状态脚本,保留适用功能,再替换实际业务字段与数据。不要直接注入参考运行时、复制旧版组件 CSS,或把 EASEL 示例业务当成已确认需求。树列表、树表等声明的模式仍需实际业务实现,不是已有完整 Vue 页面。
|
|
87
|
+
|
|
88
|
+
`ui-ux-pro-max` 的查询必须带入选定模板和视觉基准;冲突建议先作取舍。检查阶段复用同一合同及本技能参考,在相同视口、主题和状态下对照页面结构、功能、颜色与尺度。历史截图保留来源用途,不作为当前构建证据。复制 starter、拥有某组件或通过构建均不能证明交付效果一致。
|
|
89
|
+
|
|
90
|
+
## 设计系统一致性
|
|
91
|
+
|
|
92
|
+
`ui-ux-pro-max` 的查询结果先作为候选。业务分类、页面模式或视觉方向不适合时,调整关键词或补充相关领域查询,保留实际返回和取舍理由;不能只在对话中否决,再将同一结果原样持久化为 Master。
|
|
93
|
+
确认后使用原生 Master 与页面覆盖结构保存设计,读回实际文件,核对分类、页面模式、配色、风格、密度和动效是否符合模板与用户选择。
|
|
94
|
+
生成内容有冲突时,先修正查询或根据确认的模板和设计决定整理有效规则,并注明哪些来自查询、模板或用户选择;原始未采用结果可以作为历史资料,不作为当前规范。
|
|
95
|
+
例如已选浅色商务后台时,Master 不能仍要求暗色玻璃风格和营销落地页结构;也不能依靠每页覆盖来掩盖全局规范错误。已有人工规则按增量约定保护,不用 `--force` 重写。
|
|
96
|
+
|
|
97
|
+
## 设计系统目录约定
|
|
98
|
+
|
|
99
|
+
`ui-ux-pro-max` 2.15.0 的 `--output-dir` 是设计系统目录的父目录。对本技能,传入本次原型根目录的绝对路径,通常为 `<业务项目>/prototypes/<id>`,不是其中的 `design-system/` 或 `app/`。用户指定其他实例位置时使用该位置。
|
|
100
|
+
脚本自行生成 `<原型根目录>/design-system/<project-slug>/`;`<project-slug>` 来自 `--project-name`,默认采用原型 ID,已有实例沿用现有标识,不随页面或会话重新命名。
|
|
101
|
+
|
|
102
|
+
在实际加载的 `ui-ux-pro-max` 技能目录定位 scripts/search.py。设计确认且原型目录已建立后,按原生入口持久化,例如:
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
python3 "<ui-ux-pro-max技能绝对目录>/scripts/search.py" "<业务与设计关键词>" \
|
|
106
|
+
--design-system --persist --project-name "project-initiation" \
|
|
107
|
+
--output-dir "<业务项目绝对路径>/prototypes/project-initiation" --json
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
此例应产生 `prototypes/project-initiation/design-system/project-initiation/MASTER.md`,以及同级 pages/ 目录。保留项目 slug 这一层;传入 `.../design-system` 会导致错误的 `design-system/design-system/...` 嵌套。
|
|
111
|
+
全局规则保存在 MASTER.md;只有实际页面需要偏离全局规则时才使用 `--page "<页面标识>"`。`--page global` 仅创建名为 global 的页面文件,没有自动应用到全部页面的含义。
|
|
112
|
+
|
|
113
|
+
读取 JSON 返回的 `persistence.status`、`design_system_dir`、`master_file` 和 `created_files`,核对路径属于本次实例,且目录结构与以上约定一致,再读回实际文件。
|
|
114
|
+
`skipped_exists` 表示已有文件受到保护,不代表本次查询已写入;先读取现有 Master 和相关页面规则。新页面覆盖仍按原生行为处理,不能据此重写 Master 或擅自加 `--force`。
|
|
115
|
+
发现重复嵌套或落在错误实例时,保留现场并修正调用参数,检查已有内容和引用后再处理;不靠生成后自动搬目录掩盖错误。
|
|
116
|
+
实例初始化前的设计查询留在准备区,不带 `--persist`,避免提前创建要求不存在的目标目录。
|
|
117
|
+
|
|
118
|
+
## 创建实例
|
|
119
|
+
|
|
120
|
+
1. 明确业务项目、原型 ID、需求来源、用户的模板和设计选择。
|
|
121
|
+
2. 实际完成固定依赖检查。初始化目标不存在时,把准备查询留在 `prototypes/.preparation/<id>/` 或已授权的独立准备区。
|
|
122
|
+
3. 核对目标目录用途;新建只复制本技能 `assets/starter/` 到实例 `app/`,不覆盖已有目录。
|
|
123
|
+
4. 根据本次需求适配 app/src,替换“业务页面待实现”的骨架,使用实际字段、状态和模拟数据。
|
|
124
|
+
将用户确认的布局、风格和密度同时写入业务范围的 generation.presentation 和 prototype-config.json 的 presentation;动效选择落实到主题或样式,并尊重系统减少动效设置。不能只改标题和 pages 就当作完成模板适配。
|
|
125
|
+
5. 在 app/ 执行其 package.json 声明的 install、typecheck、test、build 和 preview 命令。组件与锁文件固定,不能复制旧 starter 的锁文件覆盖本技能锁文件。
|
|
126
|
+
|
|
127
|
+
推荐实例资料:
|
|
128
|
+
- `inputs/`:来源文件或引用、范围与版本,以及 `template-contract.json` 中的模板能力、节点映射和场景。
|
|
129
|
+
- `requirements-map.json`:原文需求到页面、操作、状态、实施文件及验证场景的对应。
|
|
130
|
+
- `design-system/<project-slug>/MASTER.md` 与 pages/:ui-ux-pro-max 的原生设计系统与页面覆盖。
|
|
131
|
+
- `qa/`:对应当前代码和构建的真实检查结果、截图及未完成项。
|
|
132
|
+
- `HANDOFF.md`:本次完成范围、用户选择、版本、启动与预览入口、缺项和下一步。
|
|
133
|
+
|
|
134
|
+
这些名称用于新实例约定;已有原型沿用现有资料,不为了统一格式自动迁移。
|
|
135
|
+
只维护一份任务状态。需求映射保存来源和对应关系,不再创建第二份独立任务勾选清单。
|
|
136
|
+
记录当前源码与实际构建的身份或摘要,检查后修改代码时复测相关内容;不声称本技能提供不可伪造的执行证明。
|
|
137
|
+
|
|
138
|
+
## 增量接续
|
|
139
|
+
|
|
140
|
+
先读取真实代码、用户手改、全局设计和页面规则,再修改本次相关内容。
|
|
141
|
+
新增页面沿用全局规则;仅需局部设计时不重写 Master。模板、组件或整体风格变化先明确影响范围。
|
|
142
|
+
保留其他页面、模拟数据、旧证据和确认记录;旧证据作为历史保留,不自动作为当前通过状态。
|
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
const fs = require('node:fs');
|
|
4
|
+
const path = require('node:path');
|
|
5
|
+
const crypto = require('node:crypto');
|
|
6
|
+
const assert = require('node:assert/strict');
|
|
7
|
+
const { spawnSync } = require('node:child_process');
|
|
8
|
+
const resources = require('./resources.cjs');
|
|
9
|
+
const { safe } = require('./mcp.cjs');
|
|
10
|
+
const pinned = resources.versions;
|
|
11
|
+
const sourceFiles = require('../assets/official-files.json');
|
|
12
|
+
const hash = data => crypto.createHash('sha256').update(data).digest('hex');
|
|
13
|
+
const json = file => JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
14
|
+
const { resolveLocations } = require('./locations.cjs');
|
|
15
|
+
const { checkDesignProvider, queryProvider } = require('./design-provider.cjs');
|
|
16
|
+
function versionRelation(actual, required) {
|
|
17
|
+
const parse = value => typeof value === 'string' && value.match(/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z.-]+)?$/);
|
|
18
|
+
const a = parse(actual), b = parse(required);
|
|
19
|
+
if (!a || !b) return 'unknown';
|
|
20
|
+
for (let i = 1; i <= 3; i++) if (BigInt(a[i]) !== BigInt(b[i])) return BigInt(a[i]) > BigInt(b[i]) ? 'higher' : 'lower';
|
|
21
|
+
if (a[4] === b[4]) return 'same';
|
|
22
|
+
if (!a[4] || !b[4]) return !a[4] ? 'higher' : 'lower';
|
|
23
|
+
const ap = a[4].split('.'), bp = b[4].split('.');
|
|
24
|
+
for (let i = 0; i < Math.max(ap.length, bp.length); i++) {
|
|
25
|
+
if (ap[i] === bp[i]) continue;
|
|
26
|
+
if (ap[i] === undefined || bp[i] === undefined) return ap[i] === undefined ? 'lower' : 'higher';
|
|
27
|
+
const an = /^\d+$/.test(ap[i]), bn = /^\d+$/.test(bp[i]);
|
|
28
|
+
if (an !== bn) return an ? 'lower' : 'higher';
|
|
29
|
+
return (an ? BigInt(ap[i]) > BigInt(bp[i]) : ap[i] > bp[i]) ? 'higher' : 'lower';
|
|
30
|
+
}
|
|
31
|
+
return 'same';
|
|
32
|
+
}
|
|
33
|
+
function run(command, args, cwd, env = process.env, timeout = 180000) {
|
|
34
|
+
const result = spawnSync(command, args, { cwd, env: { ...env, ANTDV_NO_AUTO_REPORT: '1', npm_config_update_notifier: 'false' }, encoding: 'utf8', timeout, maxBuffer: 8 * 1024 * 1024, shell: false });
|
|
35
|
+
if (result.error || result.status !== 0) {
|
|
36
|
+
const output = (result.stderr || result.stdout || '').trim();
|
|
37
|
+
const diagnostic = output.length > 1800 ? `${output.slice(0, 900)}\n...\n${output.slice(-800)}` : output;
|
|
38
|
+
throw new Error(`${path.basename(command)} failed: ${result.error?.message || diagnostic}`);
|
|
39
|
+
}
|
|
40
|
+
return result.stdout;
|
|
41
|
+
}
|
|
42
|
+
function verifyFile(root, file, expected) {
|
|
43
|
+
const absolute = safe(path.join(root, file));
|
|
44
|
+
assert.equal(hash(fs.readFileSync(absolute)), expected, `Fixed snapshot checksum differs: ${file}`);
|
|
45
|
+
}
|
|
46
|
+
function infoMatches(result, component) {
|
|
47
|
+
assert.equal(result.name, component.name, 'CLI query returned a different component');
|
|
48
|
+
for (const [field, source] of [['props', 'properties'], ['events', 'events'], ['slots', 'slots'], ['methods', 'methods']]) {
|
|
49
|
+
assert.deepEqual(result[field], component.props[source], `CLI query does not match fixed knowledge data: ${field}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function inspectOfficial(root, options = {}) {
|
|
53
|
+
const expected = options.expected || pinned.official;
|
|
54
|
+
if (!root || !fs.existsSync(root)) return { availability: 'missing', root, invocationVerified: false };
|
|
55
|
+
let cliVersion, relation;
|
|
56
|
+
try {
|
|
57
|
+
safe(root);
|
|
58
|
+
const pkg = json(path.join(root, 'package.json'));
|
|
59
|
+
assert.equal(pkg.name, expected.package, 'Unexpected official CLI package');
|
|
60
|
+
cliVersion = pkg.version; relation = versionRelation(cliVersion, expected.version);
|
|
61
|
+
assert.notEqual(relation, 'unknown', 'Cannot determine official CLI version');
|
|
62
|
+
if (relation === 'lower') return { availability: 'upgrade-required', root, cliVersion, versionRelation: relation, requiredVersion: expected.version, invocationVerified: false };
|
|
63
|
+
const receiptFile = path.join(root, '../UPSTREAM-ORIGIN.json');
|
|
64
|
+
const receipt = fs.existsSync(receiptFile) ? json(receiptFile) : null;
|
|
65
|
+
// Managed baseline snapshots retain their exact source/build checks. A
|
|
66
|
+
// customer's newer official CLI instead proves the fixed data and API.
|
|
67
|
+
if (relation === 'same' && (receipt || options.sourceFiles)) {
|
|
68
|
+
for (const [file, digest] of Object.entries(options.sourceFiles || sourceFiles)) verifyFile(root, file, digest);
|
|
69
|
+
verifyFile(root, 'data/versions.json', expected.versionIndexSha256);
|
|
70
|
+
assert.equal(receipt?.commit, expected.commit, 'Snapshot commit differs');
|
|
71
|
+
assert.equal(receipt?.archiveSha256, expected.archiveSha256, 'Source archive differs');
|
|
72
|
+
verifyFile(root, 'dist/index.mjs', receipt.distSha256);
|
|
73
|
+
}
|
|
74
|
+
verifyFile(root, expected.knowledgeFile, expected.knowledgeSha256);
|
|
75
|
+
const index = json(path.join(root, 'data/versions.json'));
|
|
76
|
+
assert.ok(Object.values(index.v1 || {}).includes(expected.knowledgeVersion), 'Requested knowledge version missing from index');
|
|
77
|
+
assert.ok(typeof pkg.bin?.antdv === 'string', 'CLI entry missing');
|
|
78
|
+
const entry = path.resolve(root, pkg.bin.antdv);
|
|
79
|
+
assert.ok(!path.relative(root, entry).startsWith('..') && !path.isAbsolute(path.relative(root, entry)), 'CLI entry escapes snapshot');
|
|
80
|
+
const data = json(path.join(root, expected.knowledgeFile));
|
|
81
|
+
const table = data.components.find(item => item.name === 'Table');
|
|
82
|
+
assert.ok(table, 'Fixed Table knowledge missing');
|
|
83
|
+
const result = JSON.parse(run(process.execPath, [entry, 'info', 'Table', '--ver', expected.knowledgeVersion, '--format', 'json'], root, options.env, 20000));
|
|
84
|
+
infoMatches(result, table);
|
|
85
|
+
return { availability: 'available', root, entry, cliVersion, versionRelation: relation, snapshot: relation === 'same' ? receipt?.commit || null : null,
|
|
86
|
+
knowledgeVersion: expected.knowledgeVersion, knowledgeSha256: expected.knowledgeSha256, exactKnowledgeMatch: true, invocationVerified: false };
|
|
87
|
+
} catch (error) { return { availability: 'unusable', root, cliVersion, versionRelation: relation, reason: error.message, invocationVerified: false }; }
|
|
88
|
+
}
|
|
89
|
+
function context(options) {
|
|
90
|
+
assert.ok(options.host, 'Specify the actual current --host; do not guess a host');
|
|
91
|
+
return resolveLocations(options);
|
|
92
|
+
}
|
|
93
|
+
function toolDirectory(location) { return path.join(path.dirname(location.toolsDirectory), 'i3-ui-demo', `antdv-${pinned.official.commit.slice(0, 12)}`); }
|
|
94
|
+
function resolveOfficial(location, options = {}) {
|
|
95
|
+
if (options.tool) return inspectOfficial(path.resolve(options.tool), { env: options.env });
|
|
96
|
+
const bases = location.scope === 'global' ? [location.globalBase] : [location.projectToolsBase, location.globalBase];
|
|
97
|
+
const candidates = [path.join(toolDirectory(location), 'source')];
|
|
98
|
+
for (const base of bases.filter(Boolean)) {
|
|
99
|
+
const directory = path.join(base, 'tools/i3-ui-demo');
|
|
100
|
+
if (fs.existsSync(directory)) for (const name of fs.readdirSync(directory).sort()) {
|
|
101
|
+
if (name.startsWith('antdv-')) candidates.push(path.join(directory, name, 'source'));
|
|
102
|
+
}
|
|
103
|
+
// Read the old install's version; a required upgrade is prepared in the
|
|
104
|
+
// new owned directory without deleting the old tool or its user files.
|
|
105
|
+
candidates.push(path.join(base, 'tools/i3-prototype/antdv-cli/node_modules/@antdv-next/cli'));
|
|
106
|
+
}
|
|
107
|
+
candidates.push(path.join(location.project, 'node_modules/@antdv-next/cli'), path.resolve(path.dirname(process.execPath), '../lib/node_modules/@antdv-next/cli'));
|
|
108
|
+
const env = options.env || process.env;
|
|
109
|
+
for (const folder of (env.NODE_PATH || '').split(path.delimiter).filter(Boolean)) candidates.push(path.join(folder, '@antdv-next/cli'));
|
|
110
|
+
for (const folder of (env.PATH || '').split(path.delimiter).filter(Boolean)) {
|
|
111
|
+
const entry = path.join(folder, 'antdv');
|
|
112
|
+
if (!fs.existsSync(entry)) continue;
|
|
113
|
+
let directory = path.dirname(fs.realpathSync(entry));
|
|
114
|
+
for (let depth = 0; depth < 4; depth++, directory = path.dirname(directory)) {
|
|
115
|
+
const file = path.join(directory, 'package.json');
|
|
116
|
+
try { if (json(file).name === pinned.official.package) { candidates.push(directory); break; } } catch {}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
const root = [...new Set(candidates)].find(candidate => fs.existsSync(candidate));
|
|
120
|
+
return inspectOfficial(root, { env: options.env });
|
|
121
|
+
}
|
|
122
|
+
function officialSkill(location, options, tool) {
|
|
123
|
+
const roots = options.officialSkill ? [path.resolve(options.officialSkill)] : (location.scope === 'global' ? [location.globalSkills] : [location.projectSkills, location.globalSkills]).filter(Boolean).map(base => path.join(base, 'antdv'));
|
|
124
|
+
const root = roots.find(item => fs.existsSync(path.join(item, 'SKILL.md')));
|
|
125
|
+
if (!root) return { availability: 'missing', searched: roots, invocationVerified: false };
|
|
126
|
+
try {
|
|
127
|
+
const digest = hash(fs.readFileSync(path.join(root, 'SKILL.md')));
|
|
128
|
+
const exact = digest === pinned.official.skillSha256;
|
|
129
|
+
const shipped = tool.availability === 'available' && path.join(tool.root, 'skills/antdv/SKILL.md');
|
|
130
|
+
assert.ok(exact || (shipped && fs.existsSync(shipped) && digest === hash(fs.readFileSync(shipped))), 'Installed antDv Skill differs from both the fixed and selected official CLI Skill');
|
|
131
|
+
assert.match(fs.readFileSync(path.join(root, 'SKILL.md'), 'utf8'), /^name:\s*["']?antdv["']?\s*$/m, 'Official Skill identity differs');
|
|
132
|
+
return { availability: 'available', root, contentMatchesSnapshot: exact, matchesSelectedCli: !exact, invocationVerified: false };
|
|
133
|
+
}
|
|
134
|
+
catch (error) { return { availability: 'unusable', root, reason: error.message, invocationVerified: false }; }
|
|
135
|
+
}
|
|
136
|
+
function check(options = {}) {
|
|
137
|
+
const location = context(options);
|
|
138
|
+
const nativeRoots = (location.scope === 'global' ? [location.globalSkills] : [location.projectSkills, location.globalSkills]).filter(Boolean).map(base => path.join(base, pinned.design.skill));
|
|
139
|
+
const native = !options.provider && !options.providerRoots && nativeRoots.find(root => fs.existsSync(path.join(root, 'SKILL.md')));
|
|
140
|
+
const design = checkDesignProvider({ ...options, ...(native ? { provider: native } : {}), project: location.scope === 'global' ? location.home : location.project, host: location.host });
|
|
141
|
+
if (native) design.source = native === path.join(location.projectSkills, pinned.design.skill) && location.scope === 'project' ? 'project-skill' : 'global-skill';
|
|
142
|
+
if (design.availability === 'needs-context' && !options.provider && !options.providerRoots) {
|
|
143
|
+
Object.assign(design, checkDesignProvider({ ...options, providerRoots: (location.scope === 'global' ? [location.globalSkills] : [location.projectSkills, location.globalSkills]).filter(Boolean).map(base => path.join(base, pinned.design.skill)) }));
|
|
144
|
+
}
|
|
145
|
+
if (design.availability === 'available') {
|
|
146
|
+
design.versionRelation = versionRelation(design.version, pinned.design.version);
|
|
147
|
+
if (['lower', 'unknown'].includes(design.versionRelation)) Object.assign(design, { availability: design.versionRelation === 'lower' ? 'upgrade-required' : 'unusable', reason: `Required ui-ux-pro-max >= ${pinned.design.version}; found ${design.version}` });
|
|
148
|
+
else if (design.versionRelation === 'higher') {
|
|
149
|
+
try {
|
|
150
|
+
for (const mode of [{ designSystem: true }, { stack: 'vue' }]) {
|
|
151
|
+
const result = queryProvider(design.root, mode.stack ? 'ref reactive' : 'enterprise dashboard accessible forms', { ...mode, python: options.python });
|
|
152
|
+
assert.ok(result && !result.error && !result.errors, 'Higher UI/UX Pro Max version is not compatible');
|
|
153
|
+
if (mode.designSystem) assert.ok(result.design_system?.style && result.design_system.colors && result.design_system.typography, 'Higher UI/UX Pro Max design-system result is incompatible');
|
|
154
|
+
else assert.ok(result.domain === 'stack' && result.stack === 'vue' && result.results?.length, 'Higher UI/UX Pro Max Vue query has no usable results');
|
|
155
|
+
}
|
|
156
|
+
} catch (error) { Object.assign(design, { availability: 'unusable', reason: error.message }); }
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
const tool = resolveOfficial(location, options);
|
|
160
|
+
const official = officialSkill(location, options, tool);
|
|
161
|
+
const ready = [design, official, tool].every(item => item.availability === 'available');
|
|
162
|
+
const notices = [[pinned.design.skill, design, pinned.design.version, design.version], ['@antdv-next/cli', tool, pinned.official.version, tool.cliVersion]]
|
|
163
|
+
.filter(([, item]) => ['lower', 'higher'].includes(item.versionRelation)).map(([name, item, required, actual]) =>
|
|
164
|
+
`${name} ${actual} ${item.versionRelation === 'higher' ? `高于约定版本 ${required},保留现有版本${item.availability === 'available' ? ',兼容性检查通过' : ';兼容性检查未通过'}` : `低于约定版本 ${required},本次安装将升级至 ${required}`}。`);
|
|
165
|
+
return { status: ready ? 'ready' : 'needs-dependencies', ready, location, design, official, tool, notices, invocationVerified: false,
|
|
166
|
+
note: 'Dependency preparation only. Explicitly load the required Skills, implement the business scope and obtain current-browser evidence separately.' };
|
|
167
|
+
}
|
|
168
|
+
function query(options) {
|
|
169
|
+
const location = context(options), tool = resolveOfficial(location, options), root = tool.root;
|
|
170
|
+
assert.equal(tool.availability, 'available', tool.reason || 'Fixed official snapshot is not prepared');
|
|
171
|
+
assert.ok(['info', 'demo', 'doc', 'token', 'semantic', 'list', 'design.md'].includes(options.kind), 'Only read-only official queries are supported');
|
|
172
|
+
const args = [tool.entry, options.kind];
|
|
173
|
+
if (!['list', 'design.md'].includes(options.kind)) {
|
|
174
|
+
assert.match(options.component || '', /^[A-Za-z][A-Za-z0-9]*$/, 'Supply a component name');
|
|
175
|
+
args.push(options.component);
|
|
176
|
+
}
|
|
177
|
+
if (options.kind === 'demo') { assert.match(options.demo || '', /^[\w-]+$/, 'Supply a demo name'); args.push(options.demo); }
|
|
178
|
+
args.push('--ver', pinned.official.knowledgeVersion, '--format', 'json');
|
|
179
|
+
const data = JSON.parse(run(process.execPath, args, root, options.env, 20000));
|
|
180
|
+
assert.ok(data && !data.error && !data.errors, 'Official query returned an error');
|
|
181
|
+
if (options.kind === 'info') {
|
|
182
|
+
const component = json(path.join(root, pinned.official.knowledgeFile)).components.find(item => item.name === options.component);
|
|
183
|
+
assert.ok(component, 'Component missing from fixed data'); infoMatches(data, component);
|
|
184
|
+
}
|
|
185
|
+
return { status: 'queried', snapshot: tool.snapshot, cliVersion: tool.cliVersion, knowledgeVersion: pinned.official.knowledgeVersion, componentVersion: pinned.component.version, data, invocationVerified: false };
|
|
186
|
+
}
|
|
187
|
+
function npmEntry() {
|
|
188
|
+
const candidates = [process.env.npm_execpath, path.join(path.dirname(process.execPath), '../lib/node_modules/npm/bin/npm-cli.js')];
|
|
189
|
+
for (const folder of (process.env.PATH || '').split(path.delimiter)) {
|
|
190
|
+
const entry = path.join(folder, process.platform === 'win32' ? 'npm.cmd' : 'npm');
|
|
191
|
+
if (fs.existsSync(entry)) { const real = fs.realpathSync(entry); if (real.endsWith('npm-cli.js')) candidates.push(real); }
|
|
192
|
+
}
|
|
193
|
+
const result = candidates.find(file => file && file.endsWith('npm-cli.js') && fs.existsSync(file));
|
|
194
|
+
assert.ok(result, 'A standard Node.js/npm installation is required'); return result;
|
|
195
|
+
}
|
|
196
|
+
function supportsBuild(version) {
|
|
197
|
+
const parts = typeof version === 'string' && version.match(/^v?(\d+)\.(\d+)\.(\d+)$/);
|
|
198
|
+
if (!parts) return false;
|
|
199
|
+
const major = Number(parts[1]), minor = Number(parts[2]);
|
|
200
|
+
return major === 22 && minor >= 18 || major === 24 && minor >= 11 || major > 24;
|
|
201
|
+
}
|
|
202
|
+
function buildRuntime(env = process.env) {
|
|
203
|
+
if (supportsBuild(process.version)) return { entry: process.execPath, version: process.version };
|
|
204
|
+
const binary = process.platform === 'win32' ? 'node.exe' : 'node';
|
|
205
|
+
const candidates = (env.PATH || '').split(path.delimiter).filter(Boolean).map(folder => path.resolve(folder, binary));
|
|
206
|
+
for (const entry of [...new Set(candidates)]) {
|
|
207
|
+
if (entry === process.execPath || !fs.existsSync(entry)) continue;
|
|
208
|
+
const probe = spawnSync(entry, ['--version'], { encoding: 'utf8', timeout: 5000, maxBuffer: 65536, shell: false });
|
|
209
|
+
if (!probe.error && probe.status === 0 && supportsBuild(probe.stdout.trim())) return { entry, version: probe.stdout.trim() };
|
|
210
|
+
}
|
|
211
|
+
throw new Error('准备固定 antDv CLI 快照需要 Node.js 22.18.x 或 24.11+ 构建环境;请将本机兼容的 node 加入 PATH 后重试。已准备好的 CLI 可继续复用。');
|
|
212
|
+
}
|
|
213
|
+
async function prepareSnapshot(directory, options = {}) {
|
|
214
|
+
const runtime = buildRuntime(options.env || process.env);
|
|
215
|
+
const archive = options.archive ? fs.readFileSync(path.resolve(options.archive)) : Buffer.from(await (async () => {
|
|
216
|
+
const response = await fetch(pinned.official.archive, { signal: AbortSignal.timeout(60000) });
|
|
217
|
+
assert.ok(response.ok, `Official source download failed: ${response.status}`); return response.arrayBuffer();
|
|
218
|
+
})());
|
|
219
|
+
assert.equal(hash(archive), pinned.official.archiveSha256, 'Official source archive checksum differs');
|
|
220
|
+
fs.mkdirSync(directory, { recursive: false });
|
|
221
|
+
const file = path.join(directory, 'source.tgz'); fs.writeFileSync(file, archive);
|
|
222
|
+
const names = run('tar', ['-tzf', file], directory).split('\n').filter(Boolean);
|
|
223
|
+
const prefix = `cli-${pinned.official.commit}/`;
|
|
224
|
+
assert.ok(names.every(name => name === prefix.slice(0, -1) || (name.startsWith(prefix) && !name.split('/').includes('..'))), 'Official archive paths differ');
|
|
225
|
+
const unpacked = path.join(directory, 'unpacked'); fs.mkdirSync(unpacked);
|
|
226
|
+
run('tar', ['-xzf', file, '-C', unpacked], directory);
|
|
227
|
+
const root = path.join(directory, 'source'); fs.renameSync(path.join(unpacked, prefix.slice(0, -1)), root); fs.rmdirSync(unpacked);
|
|
228
|
+
for (const [relative, digest] of Object.entries(sourceFiles)) verifyFile(root, relative, digest);
|
|
229
|
+
const builder = path.join(resources.root, 'assets/antdv-build');
|
|
230
|
+
for (const name of ['package.json', 'package-lock.json']) fs.copyFileSync(path.join(builder, name), path.join(directory, name));
|
|
231
|
+
const cache = options.cache || path.join(path.dirname(directory), 'npm-cache');
|
|
232
|
+
run(runtime.entry, [npmEntry(), 'ci', '--ignore-scripts', '--no-audit', '--no-fund', '--cache', cache], directory, options.env);
|
|
233
|
+
const buildPackage = json(path.join(directory, 'node_modules/tsdown/package.json'));
|
|
234
|
+
const buildBin = typeof buildPackage.bin === 'string' ? buildPackage.bin : buildPackage.bin.tsdown;
|
|
235
|
+
run(runtime.entry, [path.join(directory, 'node_modules/tsdown', buildBin), '--config', path.join(root, 'tsdown.config.ts')], root, options.env);
|
|
236
|
+
const receipt = { commit: pinned.official.commit, archiveSha256: pinned.official.archiveSha256,
|
|
237
|
+
distSha256: hash(fs.readFileSync(path.join(root, 'dist/index.mjs'))), buildLockSha256: hash(fs.readFileSync(path.join(directory, 'package-lock.json'))),
|
|
238
|
+
source: pinned.official.archive, installer: 'i3-ui-demo fixed official snapshot preparation', buildNodeVersion: runtime.version, preparedAt: new Date().toISOString() };
|
|
239
|
+
fs.writeFileSync(path.join(directory, 'UPSTREAM-ORIGIN.json'), JSON.stringify(receipt, null, 2) + '\n');
|
|
240
|
+
const inspected = inspectOfficial(root, { env: options.env }); assert.equal(inspected.availability, 'available', inspected.reason);
|
|
241
|
+
return root;
|
|
242
|
+
}
|
|
243
|
+
function parameterizeDesign(root, location, destination) {
|
|
244
|
+
const receiptFile = path.join(root, 'UPSTREAM-ORIGIN.json'), receipt = json(receiptFile);
|
|
245
|
+
const previous = receipt.pathParameters;
|
|
246
|
+
assert.ok(previous?.command, 'Official design path parameters are missing');
|
|
247
|
+
const entry = path.join(destination, 'scripts/search.py');
|
|
248
|
+
const script = (location.scope === 'global' ? entry : path.relative(location.project, entry)).split(path.sep).join('/');
|
|
249
|
+
const command = /^[a-zA-Z0-9_./:-]+$/.test(script) ? script : process.platform === 'win32'
|
|
250
|
+
? "'" + script.replaceAll("'", "''") + "'" : "'" + script.replaceAll("'", "'\\''") + "'";
|
|
251
|
+
const file = path.join(root, 'SKILL.md'), content = fs.readFileSync(file, 'utf8');
|
|
252
|
+
assert.ok(content.includes(previous.command), 'Official design script placeholder was not found');
|
|
253
|
+
fs.writeFileSync(file, content.split(previous.command).join(command));
|
|
254
|
+
receipt.pathParameters = { ...previous, script, command };
|
|
255
|
+
fs.writeFileSync(receiptFile, JSON.stringify(receipt, null, 2) + '\n');
|
|
256
|
+
}
|
|
257
|
+
async function prepareDesign(location, options = {}) {
|
|
258
|
+
const destination = safe(path.join(location.skillsDirectory, pinned.design.skill));
|
|
259
|
+
const upgrade = options.upgrade?.availability === 'upgrade-required' && path.resolve(options.upgrade.root) === destination;
|
|
260
|
+
assert.ok(!fs.existsSync(destination) || upgrade, `Existing design Skill preserved: ${destination}`);
|
|
261
|
+
const fingerprint = root => {
|
|
262
|
+
const items = [];
|
|
263
|
+
function visit(folder) {
|
|
264
|
+
for (const entry of fs.readdirSync(folder, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {
|
|
265
|
+
const file = safe(path.join(folder, entry.name)), stat = fs.lstatSync(file);
|
|
266
|
+
assert.ok(entry.isFile() || entry.isDirectory(), 'Existing design Skill contains unsupported files; preserved');
|
|
267
|
+
items.push([path.relative(root, file), stat.mode, entry.isFile() ? hash(fs.readFileSync(file)) : 'directory']);
|
|
268
|
+
if (entry.isDirectory()) visit(file);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
visit(root); return hash(JSON.stringify(items));
|
|
272
|
+
};
|
|
273
|
+
const previous = upgrade ? fingerprint(destination) : null;
|
|
274
|
+
const base = safe(path.dirname(toolDirectory(location))); fs.mkdirSync(base, { recursive: true });
|
|
275
|
+
const stage = fs.mkdtempSync(path.join(base, '.ui-demo-design-'));
|
|
276
|
+
try {
|
|
277
|
+
const project = path.join(stage, 'project'), home = path.join(stage, 'home');
|
|
278
|
+
fs.mkdirSync(project); fs.mkdirSync(home);
|
|
279
|
+
// Prepare the fixed official CLI in an empty scope. Existing providers
|
|
280
|
+
// cannot make it skip the requested project installation.
|
|
281
|
+
const isolated = { project, home, host: location.host, scope: 'project', env: {}, skills: 'uiux' };
|
|
282
|
+
const installed = context(isolated);
|
|
283
|
+
const prepared = await require('./design-install.cjs').prepare(path.join(stage, 'official'), { ...installed, destination: path.join(installed.skillsDirectory, pinned.design.skill) });
|
|
284
|
+
const root = prepared.skill;
|
|
285
|
+
const probe = checkDesignProvider({ ...isolated, provider: root, python: options.python });
|
|
286
|
+
assert.equal(probe.availability, 'available', probe.reason);
|
|
287
|
+
assert.equal(probe.version, pinned.design.version, 'Prepared design version differs');
|
|
288
|
+
parameterizeDesign(root, location, destination);
|
|
289
|
+
safe(destination);
|
|
290
|
+
let backup;
|
|
291
|
+
if (upgrade) {
|
|
292
|
+
assert.equal(fingerprint(destination), previous, 'Design Skill changed during preparation; preserved');
|
|
293
|
+
const backups = safe(path.join(base, 'backups')); fs.mkdirSync(backups, { recursive: true });
|
|
294
|
+
backup = path.join(backups, `ui-ux-pro-max-${options.upgrade.version}-${crypto.randomBytes(8).toString('hex')}`);
|
|
295
|
+
fs.renameSync(destination, backup);
|
|
296
|
+
} else assert.ok(!fs.existsSync(destination), 'Design destination appeared during preparation; preserved');
|
|
297
|
+
try { fs.mkdirSync(path.dirname(destination), { recursive: true }); fs.renameSync(root, destination); }
|
|
298
|
+
catch (error) { if (backup && !fs.existsSync(destination)) fs.renameSync(backup, destination); throw error; }
|
|
299
|
+
return { root: destination, backup };
|
|
300
|
+
} finally { fs.rmSync(stage, { recursive: true, force: true }); }
|
|
301
|
+
}
|
|
302
|
+
async function prepare(options = {}) {
|
|
303
|
+
if (options.decision === 'decline') return { status: 'declined', continue: false, wrote: false };
|
|
304
|
+
const before = check(options);
|
|
305
|
+
if (before.ready) return { status: 'reused', continue: true, detection: before };
|
|
306
|
+
if (options.accept !== true) return { status: 'needs-confirmation', continue: false, wrote: false, detection: before };
|
|
307
|
+
assertPreparable(before, options);
|
|
308
|
+
assert.ok(!options.tool && !options.officialSkill, 'Explicit existing paths are read-only; select a clean install scope to prepare tools');
|
|
309
|
+
assert.ok(!options.provider || before.design.availability === 'available', 'Explicit design provider is unusable; correct its path or select a clean install scope without --provider');
|
|
310
|
+
const location = before.location, destination = safe(toolDirectory(location));
|
|
311
|
+
const skillDestination = safe(path.join(location.skillsDirectory, 'antdv'));
|
|
312
|
+
if (before.official.availability === 'unusable') throw new Error('Existing official Skill preserved; select a clean scope or repair it explicitly');
|
|
313
|
+
if (fs.existsSync(destination) && before.tool.availability !== 'available') throw new Error(`Existing tool preserved: ${destination}`);
|
|
314
|
+
let stage, designPreparation;
|
|
315
|
+
try {
|
|
316
|
+
if (before.tool.availability !== 'available') {
|
|
317
|
+
const base = path.dirname(destination); safe(base); fs.mkdirSync(base, { recursive: true });
|
|
318
|
+
stage = path.join(base, '.ui-demo-stage-' + crypto.randomBytes(8).toString('hex'));
|
|
319
|
+
const root = await prepareSnapshot(stage, options);
|
|
320
|
+
if (fs.existsSync(destination)) throw new Error('Tool destination appeared during preparation; preserved');
|
|
321
|
+
if (before.official.availability !== 'available' && fs.existsSync(skillDestination)) throw new Error('Skill destination appeared during preparation; preserved');
|
|
322
|
+
if (before.official.availability !== 'available') {
|
|
323
|
+
fs.mkdirSync(path.dirname(skillDestination), { recursive: true });
|
|
324
|
+
fs.cpSync(path.join(root, 'skills/antdv'), skillDestination, { recursive: true, errorOnExist: true, force: false });
|
|
325
|
+
fs.copyFileSync(path.join(root, 'LICENSE'), path.join(skillDestination, 'LICENSE'));
|
|
326
|
+
}
|
|
327
|
+
fs.renameSync(stage, destination); stage = null;
|
|
328
|
+
} else if (before.official.availability !== 'available') {
|
|
329
|
+
fs.mkdirSync(path.dirname(skillDestination), { recursive: true });
|
|
330
|
+
fs.cpSync(path.join(before.tool.root, 'skills/antdv'), skillDestination, { recursive: true, errorOnExist: true, force: false });
|
|
331
|
+
fs.copyFileSync(path.join(before.tool.root, 'LICENSE'), path.join(skillDestination, 'LICENSE'));
|
|
332
|
+
}
|
|
333
|
+
if (before.design.availability !== 'available') {
|
|
334
|
+
designPreparation = await prepareDesign(location, { ...options, upgrade: before.design });
|
|
335
|
+
}
|
|
336
|
+
const detection = check(options);
|
|
337
|
+
assert.ok(detection.ready, 'Required combination is still incomplete; preserve successful preparation and report the remaining gap');
|
|
338
|
+
return { status: 'prepared', continue: true, detection, ...(designPreparation?.backup ? { backups: [designPreparation.backup] } : {}), note: 'Reload the selected host when needed. Preparation does not prove actual Skill invocation or browser execution.' };
|
|
339
|
+
} finally { if (stage && fs.existsSync(stage)) fs.rmSync(stage, { recursive: true, force: true }); }
|
|
340
|
+
}
|
|
341
|
+
function assertPreparable(detection, options = {}) {
|
|
342
|
+
for (const [name, item] of [['ui-ux-pro-max', detection.design], ['antdv', detection.official], ['@antdv-next/cli', detection.tool]]) {
|
|
343
|
+
assert.ok(['available', 'missing', 'upgrade-required'].includes(item.availability), `${name} 检查未通过,已保留现有安装:${item.reason || item.availability}`);
|
|
344
|
+
}
|
|
345
|
+
if (['missing', 'upgrade-required'].includes(detection.tool.availability)) buildRuntime(options.env || process.env);
|
|
346
|
+
}
|
|
347
|
+
function parse(argv) {
|
|
348
|
+
const operation = argv.shift() || 'check', options = {};
|
|
349
|
+
assert.ok(['check', 'prepare', 'query'].includes(operation), 'Use check, prepare or query');
|
|
350
|
+
const flags = ['project', 'host', 'scope', 'home', 'provider', 'python', 'tool', 'official-skill', 'kind', 'component', 'demo', 'decision', 'archive', 'cache'];
|
|
351
|
+
while (argv.length) {
|
|
352
|
+
const flag = argv.shift();
|
|
353
|
+
if (flag === '--accept') { options.accept = true; continue; }
|
|
354
|
+
assert.ok(flag.startsWith('--') && flags.includes(flag.slice(2)) && argv.length, `Invalid option: ${flag}`);
|
|
355
|
+
const key = flag.slice(2).replace(/-([a-z])/g, (_, letter) => letter.toUpperCase()); options[key] = argv.shift();
|
|
356
|
+
}
|
|
357
|
+
return { operation, options };
|
|
358
|
+
}
|
|
359
|
+
module.exports = { versionRelation, inspectOfficial, resolveOfficial, assertPreparable, infoMatches, check, query, prepare, prepareDesign, parameterizeDesign, prepareSnapshot, supportsBuild, buildRuntime, context, toolDirectory };
|
|
360
|
+
if (require.main === module) {
|
|
361
|
+
Promise.resolve().then(() => { const { operation, options } = parse(process.argv.slice(2)); return operation === 'prepare' ? prepare(options) : operation === 'query' ? query(options) : check(options); })
|
|
362
|
+
.then(result => { process.stdout.write(JSON.stringify(result, null, 2) + '\n'); })
|
|
363
|
+
.catch(error => { process.stderr.write(JSON.stringify({ status: 'failed', errors: [error.message] }) + '\n'); process.exitCode = 1; });
|
|
364
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const fs = require('node:fs');
|
|
3
|
+
const path = require('node:path');
|
|
4
|
+
const crypto = require('node:crypto');
|
|
5
|
+
const { spawn } = require('node:child_process');
|
|
6
|
+
const source = require('../assets/design-source.json');
|
|
7
|
+
const required = require('../assets/versions.json').design;
|
|
8
|
+
if (source.version !== required.version || source.skillName !== required.skill) throw new Error('Fixed UI/UX Pro Max source differs from the required version');
|
|
9
|
+
|
|
10
|
+
function verify(data, expected, algorithm = 'sha256', encoding = 'hex') {
|
|
11
|
+
if (crypto.createHash(algorithm).update(data).digest(encoding) !== expected) throw new Error('Official download integrity mismatch');
|
|
12
|
+
return data;
|
|
13
|
+
}
|
|
14
|
+
async function download(url, expected, algorithm, encoding) {
|
|
15
|
+
const response = await fetch(url, { signal: AbortSignal.timeout(60000) });
|
|
16
|
+
if (!response.ok) throw new Error(`Official download failed: HTTP ${response.status}`);
|
|
17
|
+
const data = Buffer.from(await response.arrayBuffer());
|
|
18
|
+
if (data.length > 50 * 1024 * 1024) throw new Error('Official download exceeds size limit');
|
|
19
|
+
return verify(data, expected, algorithm, encoding);
|
|
20
|
+
}
|
|
21
|
+
function npmEntry() {
|
|
22
|
+
const directory = path.dirname(process.execPath);
|
|
23
|
+
const candidates = [process.env.npm_execpath, path.join(directory, '../lib/node_modules/npm/bin/npm-cli.js'), path.join(directory, 'node_modules/npm/bin/npm-cli.js')];
|
|
24
|
+
for (const folder of (process.env.PATH || '').split(path.delimiter)) {
|
|
25
|
+
const entry = path.join(folder, 'npm');
|
|
26
|
+
if (fs.existsSync(entry)) candidates.push(fs.realpathSync(entry));
|
|
27
|
+
}
|
|
28
|
+
const found = candidates.find(file => file && path.basename(file) === 'npm-cli.js' && fs.existsSync(file));
|
|
29
|
+
if (!found) throw new Error('Cannot locate npm-cli.js; use a standard Node.js/npm installation');
|
|
30
|
+
return found;
|
|
31
|
+
}
|
|
32
|
+
function run(entry, args, cwd, env) {
|
|
33
|
+
return new Promise((resolve, reject) => {
|
|
34
|
+
const child = spawn(process.execPath, [entry, ...args], { cwd, env, stdio: ['ignore', 'pipe', 'pipe'] });
|
|
35
|
+
let output = '', failed = false;
|
|
36
|
+
const timer = setTimeout(() => { failed = true; child.kill(); reject(new Error('Official installer timed out')); }, 180000);
|
|
37
|
+
for (const stream of [child.stdout, child.stderr]) stream.on('data', chunk => {
|
|
38
|
+
output += chunk;
|
|
39
|
+
if (output.length > 5 * 1024 * 1024) { failed = true; child.kill(); reject(new Error('Official installer output exceeds limit')); }
|
|
40
|
+
});
|
|
41
|
+
child.once('error', error => { clearTimeout(timer); failed = true; reject(error); });
|
|
42
|
+
child.once('close', code => { clearTimeout(timer); if (!failed) code === 0 ? resolve() : reject(new Error(`Official installer failed (${code}): ${output.slice(-1500)}`)); });
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
function validateSkill(folder, name) {
|
|
46
|
+
const entry = fs.readFileSync(path.join(folder, 'SKILL.md'), 'utf8');
|
|
47
|
+
if (!new RegExp(`^name:\\s*["']?${name}["']?\\s*$`, 'm').test(entry)) throw new Error(`Official Skill identity mismatch: ${name}`);
|
|
48
|
+
function visit(directory) {
|
|
49
|
+
for (const item of fs.readdirSync(directory, { withFileTypes: true })) {
|
|
50
|
+
if (item.isSymbolicLink()) throw new Error('Official Skill contains a symbolic link');
|
|
51
|
+
if (item.isDirectory()) visit(path.join(directory, item.name));
|
|
52
|
+
else if (!item.isFile()) throw new Error('Official Skill contains an unsupported file');
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
visit(folder);
|
|
56
|
+
if (name === 'ui-ux-pro-max') for (const file of ['scripts/search.py', 'scripts/core.py', 'scripts/design_system.py', 'data/ux-guidelines.csv']) {
|
|
57
|
+
if (!fs.existsSync(path.join(folder, file))) throw new Error(`Incomplete UIUX resources: ${file}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function uiuxPaths(packageRoot, skill, context, platform) {
|
|
61
|
+
const templates = path.join(packageRoot, 'assets/templates');
|
|
62
|
+
const config = JSON.parse(fs.readFileSync(path.join(templates, 'platforms', `${platform}.json`), 'utf8'));
|
|
63
|
+
const template = fs.readFileSync(path.join(templates, 'base/skill-content.md'), 'utf8');
|
|
64
|
+
const scriptFile = path.join(context.destination, 'scripts/search.py');
|
|
65
|
+
const script = (context.scope === 'global' ? scriptFile : path.relative(context.project, scriptFile)).split(path.sep).join('/');
|
|
66
|
+
const command = /^[a-zA-Z0-9_./:-]+$/.test(script) ? script : process.platform === 'win32' ? "'" + script.replaceAll("'", "''") + "'" : "'" + script.replaceAll("'", "'\\''") + "'";
|
|
67
|
+
const parameters = { TITLE: config.title, DESCRIPTION: config.description, SCRIPT_PATH: command, SKILL_OR_WORKFLOW: config.skillOrWorkflow,
|
|
68
|
+
QUICK_REFERENCE: config.sections.quickReference ? '\n' + fs.readFileSync(path.join(templates, 'base/quick-reference.md'), 'utf8') : '' };
|
|
69
|
+
const file = path.join(skill, 'SKILL.md'), original = fs.readFileSync(file, 'utf8');
|
|
70
|
+
const header = original.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n/)?.[0];
|
|
71
|
+
if (!header) throw new Error('Official UIUX frontmatter is missing');
|
|
72
|
+
// Only official template placeholders are parameterized. The downloaded
|
|
73
|
+
// template and CLI code remain unchanged; paths work in every supported host.
|
|
74
|
+
const body = template.replace(/\{\{([A-Z_]+)\}\}/g, (match, key) => {
|
|
75
|
+
if (!Object.hasOwn(parameters, key)) throw new Error(`Unknown official UIUX placeholder: ${key}`);
|
|
76
|
+
return parameters[key];
|
|
77
|
+
});
|
|
78
|
+
fs.writeFileSync(file, header + body);
|
|
79
|
+
return { platform, script, command, templateSha256: crypto.createHash('sha256').update(template).digest('hex') };
|
|
80
|
+
}
|
|
81
|
+
async function prepare(stage, context) {
|
|
82
|
+
const tool = path.join(stage, 'tool'), workspace = path.join(stage, 'workspace');
|
|
83
|
+
fs.mkdirSync(tool, { recursive: true }); fs.mkdirSync(workspace);
|
|
84
|
+
const archive = await download(source.tarball, source.integrity.slice(7), 'sha512', 'base64');
|
|
85
|
+
fs.writeFileSync(path.join(tool, 'source.tgz'), archive);
|
|
86
|
+
const env = { ...process.env, npm_config_cache: path.join(stage, 'npm-cache'), npm_config_offline: 'false', NPM_CONFIG_OFFLINE: 'false', npm_config_update_notifier: 'false', ANTDV_NO_AUTO_REPORT: '1' };
|
|
87
|
+
await run(npmEntry(), ['install', '--ignore-scripts', '--no-audit', '--no-fund', '--package-lock', './source.tgz'], tool, env);
|
|
88
|
+
const packageRoot = path.join(tool, 'node_modules', source.packageName), pkg = JSON.parse(fs.readFileSync(path.join(packageRoot, 'package.json'), 'utf8'));
|
|
89
|
+
if (pkg.name !== source.packageName || pkg.version !== source.version) throw new Error('Official CLI version mismatch');
|
|
90
|
+
let skill, pathParameters;
|
|
91
|
+
{
|
|
92
|
+
const platform = ['codebuddy', 'workbuddy'].includes(context.host) ? 'codebuddy' : context.host === 'codex' ? 'codex' : context.host === 'claude-code' ? 'claude' : 'universal';
|
|
93
|
+
await run(path.join(packageRoot, pkg.bin.uipro), ['init', '--ai', platform, '--offline'], workspace, env);
|
|
94
|
+
const config = JSON.parse(fs.readFileSync(path.join(packageRoot, 'assets/templates/platforms', `${platform}.json`), 'utf8'));
|
|
95
|
+
skill = path.join(workspace, config.folderStructure.root, config.folderStructure.skillPath);
|
|
96
|
+
pathParameters = uiuxPaths(packageRoot, skill, context, platform);
|
|
97
|
+
}
|
|
98
|
+
fs.writeFileSync(path.join(skill, 'LICENSE'), await download(source.licenseUrl, source.licenseSha256));
|
|
99
|
+
const receipt = JSON.stringify({ ...source, installedAt: new Date().toISOString(), installer: 'i3 required UI Demo dependency preparation; official templates retained',
|
|
100
|
+
...(pathParameters ? { pathParameters } : {}) }, null, 2) + '\n';
|
|
101
|
+
fs.writeFileSync(path.join(skill, 'UPSTREAM-ORIGIN.json'), receipt);
|
|
102
|
+
validateSkill(skill, source.skillName);
|
|
103
|
+
return { skill, tool };
|
|
104
|
+
}
|
|
105
|
+
module.exports = { prepare, validateSkill };
|