@givolt/i3-composer-agent 3.2.1 → 4.0.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-build.md +1 -0
- package/.claude/commands/i3-code-simplify.md +1 -0
- package/.claude/commands/i3-constraints.md +1 -0
- package/.claude/commands/i3-plan.md +1 -0
- package/.claude/commands/i3-review.md +1 -0
- package/.claude/commands/i3-ship.md +1 -0
- package/.claude/commands/i3-spec.md +1 -0
- package/.claude/commands/i3-test.md +1 -0
- package/.claude/commands/i3-webperf.md +1 -0
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +2 -2
- package/README.md +31 -25
- package/bin/i3-composer-agent.cjs +4 -59
- package/bin/install.cjs +6 -14
- package/bin/native-layout.cjs +11 -2
- package/bin/native-migration.cjs +68 -28
- package/bin/retired-custom-fingerprints.json +1597 -0
- package/bin/wizard.cjs +2 -13
- package/docs/antigravity-setup.md +3 -1
- package/docs/codebuddy-setup.md +19 -76
- package/docs/codex-setup.md +10 -4
- package/docs/comparison.md +1 -1
- package/docs/copilot-cli-setup.md +4 -4
- package/docs/cursor-setup.md +1 -1
- package/docs/gemini-cli-setup.md +1 -1
- package/docs/other-hosts.md +2 -2
- package/docs/windsurf-setup.md +2 -2
- package/docs/workbuddy-setup.md +9 -16
- package/evals/README.md +10 -0
- package/evals/cases/i3-code-simplification.json +8 -0
- package/evals/cases/i3-documentation-and-adrs.json +4 -0
- package/evals/cases/i3-enterprise-sop.json +1 -1
- package/evals/cases/i3-frontend-ui-engineering.json +1 -1
- package/evals/cases/i3-security-and-hardening.json +4 -0
- package/evals/cases/i3-ui-demo.json +2 -2
- package/evals/cases/i3-using-agent-skills.json +5 -5
- package/evals/plugin/simplify-fires-on-pasted-function/graders/behavior-kept-and-explained.md +7 -0
- package/evals/plugin/simplify-fires-on-pasted-function/graders/skill-fired.md +5 -0
- package/evals/plugin/simplify-fires-on-pasted-function/prompt.md +30 -0
- package/evals/plugin/simplify-stays-quiet-on-make-it-fast/graders/not-fired.md +8 -0
- package/evals/plugin/simplify-stays-quiet-on-make-it-fast/prompt.md +20 -0
- package/evals/zh-CN/cases/i3-code-simplification.json +8 -0
- package/evals/zh-CN/cases/i3-documentation-and-adrs.json +4 -0
- package/evals/zh-CN/cases/i3-enterprise-sop.json +1 -1
- package/evals/zh-CN/cases/i3-frontend-ui-engineering.json +2 -2
- package/evals/zh-CN/cases/i3-security-and-hardening.json +4 -0
- package/evals/zh-CN/cases/i3-ui-demo.json +2 -2
- package/evals/zh-CN/cases/i3-using-agent-skills.json +6 -6
- package/hooks/SDD-CACHE.md +1 -1
- package/package.json +13 -80
- package/plugin.json +15 -2
- package/references/accessibility-checklist.md +4 -4
- package/references/performance-checklist.md +5 -4
- package/references/testing-patterns.md +2 -1
- package/scripts/floor-guard-reference-test.js +32 -0
- package/scripts/lib/execution-status.js +44 -0
- package/scripts/run-evals-test.js +157 -7
- package/scripts/run-evals.js +59 -12
- package/scripts/ui-demo-test.js +2 -2
- package/scripts/validate-artifact-paths-test.js +14 -0
- package/scripts/validate-artifact-paths.js +4 -2
- package/skills/i3-api-and-interface-design/SKILL.md +3 -1
- package/skills/i3-ci-cd-and-automation/SKILL.md +7 -4
- package/skills/i3-code-simplification/SKILL.md +3 -3
- package/skills/i3-constraint-driven-development/SKILL.md +4 -4
- package/skills/i3-constraint-driven-development/references/floor-guard.md +2 -2
- package/skills/i3-context-engineering/SKILL.md +1 -1
- package/skills/i3-debugging-and-error-recovery/SKILL.md +1 -1
- package/skills/i3-deprecation-and-migration/SKILL.md +6 -1
- package/skills/i3-documentation-and-adrs/SKILL.md +3 -2
- package/skills/i3-enterprise-sop/SKILL.md +37 -70
- package/skills/i3-enterprise-sop/references/engineering-skeleton/directory-standard.md +7 -7
- package/skills/i3-enterprise-sop/references/handoff.py +149 -120
- package/skills/i3-enterprise-sop/references/technical-baseline/baselines/enterprise-application-technical-baseline-v0-0-4.md +24 -24
- package/skills/i3-enterprise-sop/references/technical-baseline/templates/technical-baseline.md +8 -8
- package/skills/i3-enterprise-sop/references/templates/ad.md +31 -31
- package/skills/i3-enterprise-sop/references/templates/brd.md +6 -6
- package/skills/i3-enterprise-sop/references/templates/prd.md +37 -37
- package/skills/i3-enterprise-sop/references/templates/testcase.md +25 -25
- package/skills/i3-frontend-ui-engineering/SKILL.md +6 -10
- package/skills/i3-idea-refine/SKILL.md +4 -2
- package/skills/i3-incremental-implementation/SKILL.md +0 -4
- package/skills/i3-performance-optimization/SKILL.md +2 -2
- package/skills/i3-security-and-hardening/references/hardening-patterns.md +5 -0
- package/skills/i3-source-driven-development/SKILL.md +3 -2
- package/skills/i3-spec-driven-development/SKILL.md +1 -1
- package/skills/i3-ui-demo/SKILL.md +3 -1
- package/skills/i3-ui-demo/references/dependencies.md +1 -1
- package/skills/i3-ui-demo/references/resources.md +1 -1
- package/skills/i3-ui-demo/scripts/dependencies.cjs +0 -3
- package/skills/i3-using-agent-skills/SKILL.md +2 -2
- package/.claude/commands/i3-prototype.md +0 -23
- package/.gemini/commands/i3-prototype.toml +0 -23
- package/commands/i3-prototype.toml +0 -23
- package/evals/cases/i3-ui-prototype.json +0 -158
- package/evals/fixtures/i3-ui-prototype/admin-list/assets/reference.css +0 -3
- package/evals/fixtures/i3-ui-prototype/admin-list/assets/reference.js +0 -8
- package/evals/fixtures/i3-ui-prototype/admin-list/capability-definition.json +0 -67
- package/evals/fixtures/i3-ui-prototype/admin-list/index.html +0 -89
- package/evals/fixtures/i3-ui-prototype/admin-list/readme.md +0 -52
- package/evals/fixtures/i3-ui-prototype/admin-list/template.json +0 -8
- package/evals/fixtures/i3-ui-prototype/business-brief.md +0 -7
- package/evals/zh-CN/cases/i3-ui-prototype.json +0 -165
- package/hooks/PROTOTYPE.md +0 -31
- package/hooks/codebuddy-upstream.cjs +0 -93
- package/hooks/i3-prototype.cjs +0 -7
- package/hooks/manage.cjs +0 -169
- package/scripts/design-provider-discovery-test.js +0 -190
- package/scripts/design-provider-test.js +0 -75
- package/scripts/enterprise-template-test.js +0 -205
- package/scripts/lib/prototype-fixture.cjs +0 -17
- package/scripts/prototype-cache-test.js +0 -55
- package/scripts/prototype-generation-entry-test.js +0 -6
- package/scripts/prototype-generation-evidence-test.js +0 -10
- package/scripts/prototype-generation-native-test.js +0 -78
- package/scripts/prototype-generation-test.js +0 -99
- package/scripts/prototype-inventory-test.js +0 -43
- package/scripts/prototype-locations-test.js +0 -79
- package/scripts/prototype-project-test.js +0 -183
- package/scripts/template-adapter-test.js +0 -155
- package/scripts/ui-prototype-binding-recovery-test.js +0 -84
- package/scripts/ui-prototype-buddy-lifecycle-test.js +0 -102
- package/scripts/ui-prototype-codebuddy-hook-test.js +0 -112
- package/scripts/ui-prototype-content-test.js +0 -123
- package/scripts/ui-prototype-dependencies-test.js +0 -226
- package/scripts/ui-prototype-devtools-test.js +0 -53
- package/scripts/ui-prototype-execution-evidence-test.js +0 -62
- package/scripts/ui-prototype-execution-gates-test.js +0 -91
- package/scripts/ui-prototype-execution-policy-test.js +0 -53
- package/scripts/ui-prototype-execution-runtime-test.js +0 -27
- package/scripts/ui-prototype-ide-source-test.js +0 -73
- package/scripts/ui-prototype-native-test.js +0 -526
- package/scripts/ui-prototype-recovery-test.js +0 -81
- package/scripts/ui-prototype-registration-test.js +0 -53
- package/scripts/ui-prototype-template-test.js +0 -261
- package/scripts/ui-prototype-test.js +0 -124
- package/scripts/ui-prototype-transcript-auto-test.js +0 -67
- package/skills/i3-ui-prototype/SKILL.md +0 -256
- package/skills/i3-ui-prototype/assets/capabilities/generation.json +0 -833
- package/skills/i3-ui-prototype/assets/capabilities/management.json +0 -294
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/acceptance.json +0 -51
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/component-map.json +0 -13
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/generation-component-map.json +0 -300
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/index.html +0 -11
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/package-lock.json +0 -2298
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/package.json +0 -22
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/public/prototype-config.json +0 -6
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/App.vue +0 -136
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/components/DeviceEditor.vue +0 -111
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/config.ts +0 -19
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/content.ts +0 -28
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/domain/devices.ts +0 -50
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/domain/theme.ts +0 -25
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/main.ts +0 -18
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/style.css +0 -50
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/useDevices.ts +0 -66
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/tests/devices.test.ts +0 -44
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/tests/theme.test.ts +0 -26
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/tsconfig.json +0 -15
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/vite.config.ts +0 -4
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/profile.json +0 -174
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/readme.md +0 -61
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/index.html +0 -11
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/package-lock.json +0 -2298
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/package.json +0 -22
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/public/prototype-config.json +0 -21
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/App.vue +0 -62
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/PrototypeShell.vue +0 -59
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/config.ts +0 -23
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/domain/presentation.ts +0 -29
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/domain/theme.ts +0 -25
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/main.ts +0 -18
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/style.css +0 -26
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/tests/presentation.test.ts +0 -23
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/tests/theme.test.ts +0 -26
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/tsconfig.json +0 -15
- package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/vite.config.ts +0 -4
- package/skills/i3-ui-prototype/assets/hosts/codebuddy/profile.json +0 -17
- package/skills/i3-ui-prototype/assets/optional-skills/host-targets.json +0 -739
- package/skills/i3-ui-prototype/assets/optional-skills/sources.json +0 -27
- package/skills/i3-ui-prototype/assets/templates/catalog.js +0 -149
- package/skills/i3-ui-prototype/assets/templates/catalog.json +0 -149
- package/skills/i3-ui-prototype/assets/templates/classic-admin/manifest.json +0 -9
- package/skills/i3-ui-prototype/assets/templates/classic-admin/preset.json +0 -6
- package/skills/i3-ui-prototype/assets/templates/common/app/app.mjs +0 -89
- package/skills/i3-ui-prototype/assets/templates/common/app/config.json +0 -1
- package/skills/i3-ui-prototype/assets/templates/common/app/domain.mjs +0 -20
- package/skills/i3-ui-prototype/assets/templates/common/app/index.html +0 -17
- package/skills/i3-ui-prototype/assets/templates/common/app/serve.cjs +0 -16
- package/skills/i3-ui-prototype/assets/templates/common/app/styles.css +0 -670
- package/skills/i3-ui-prototype/assets/templates/common/app/tokens.css +0 -19
- package/skills/i3-ui-prototype/assets/templates/common/design-system/master.md +0 -20
- package/skills/i3-ui-prototype/assets/templates/common/gallery.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/common/mocks/applications.json +0 -5
- package/skills/i3-ui-prototype/assets/templates/common/requirements-map.json +0 -8
- package/skills/i3-ui-prototype/assets/templates/common/serve-gallery.cjs +0 -16
- package/skills/i3-ui-prototype/assets/templates/credits.md +0 -17
- package/skills/i3-ui-prototype/assets/templates/data-operations/manifest.json +0 -9
- package/skills/i3-ui-prototype/assets/templates/data-operations/preset.json +0 -6
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/capability-definition.json +0 -294
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/component-inventory.json +0 -707
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/design-system.md +0 -32
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/generation.json +0 -49
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/index.html +0 -534
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/manifest.json +0 -9
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/offline-build.json +0 -265
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/offline.js +0 -8888
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/origin.json +0 -344
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/preset.json +0 -928
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/app.js +0 -22
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/empty.svg +0 -1
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/reference-styles.json +0 -1
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/result-403.svg +0 -1
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/result-404.svg +0 -1
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets-manifest.json +0 -334
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/baseline.json +0 -173
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/conversion.md +0 -30
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/credits.md +0 -17
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/design-tokens.json +0 -881
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/index.html +0 -28
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/licenses/@qin-ui-antdv-next-pro.txt +0 -9
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/licenses/ant-design-icons.txt +0 -22
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/licenses/antdv-next.txt +0 -21
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/package.json +0 -12
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/browser-routes.json +0 -298
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/coverage.json +0 -180
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/integrity.json +0 -13
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/keyboard.json +0 -11
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/responsive.json +0 -125
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/review.md +0 -51
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/rules.log +0 -150
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/flow-editor-html.png +0 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/flow-editor-original.png +0 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/intent-create-html.png +0 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/intent-create-original.png +0 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/models-html.png +0 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/models-original.png +0 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/workbench-html.png +0 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/workbench-original.png +0 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/selection.json +0 -9
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/visual-comparison.json +0 -342
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/readme.md +0 -73
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/reference.md +0 -59
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/routes.json +0 -178
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/controls.js +0 -99
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/dialogs.js +0 -54
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/dom.js +0 -264
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/forms.js +0 -47
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/icons.js +0 -41
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/layout.js +0 -47
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/router.js +0 -63
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/state.js +0 -90
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/table.js +0 -41
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/widgets.js +0 -8
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentDetail.html +0 -3
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentDetail.js +0 -36
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentEditor.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentEditor.js +0 -51
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentsPage.html +0 -3
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentsPage.js +0 -48
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/CheckResults.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/CheckResults.js +0 -6
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/ResourcePicker.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/ResourcePicker.js +0 -13
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/data.js +0 -24
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/domain.js +0 -32
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/registry.js +0 -25
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/store.js +0 -85
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentClose.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentClose.js +0 -17
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentCreate.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentCreate.js +0 -66
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDecisions.html +0 -3
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDecisions.js +0 -38
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDetail.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDetail.js +0 -66
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDocument.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDocument.js +0 -5
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHeader.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHeader.js +0 -12
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHistory.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHistory.js +0 -11
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentList.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentList.js +0 -116
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentReplan.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentReplan.js +0 -32
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentRevision.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentRevision.js +0 -49
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentSummary.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentSummary.js +0 -10
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentWorkspace.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentWorkspace.js +0 -77
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/data.js +0 -60
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/domain.js +0 -105
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/store.js +0 -212
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/AuditPanel.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/AuditPanel.js +0 -18
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelDetail.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelDetail.js +0 -23
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelEditor.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelEditor.js +0 -78
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelGrant.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelGrant.js +0 -55
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelReferences.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelReferences.js +0 -26
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelRelease.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelRelease.js +0 -38
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelStatus.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelStatus.js +0 -7
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTable.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTable.js +0 -72
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTester.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTester.js +0 -46
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelsPage.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelsPage.js +0 -52
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/RowActions.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/RowActions.js +0 -19
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/UsagePanel.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/UsagePanel.js +0 -30
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/data.js +0 -48
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/domain.js +0 -39
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/store.js +0 -129
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IncidentDetail.html +0 -4
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IncidentDetail.js +0 -21
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IntentSource.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IntentSource.js +0 -8
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationActionDialog.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationActionDialog.js +0 -37
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationEntry.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationEntry.js +0 -10
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationsPage.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationsPage.js +0 -37
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RepairTrack.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RepairTrack.js +0 -49
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RunDetail.html +0 -4
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RunDetail.js +0 -22
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/SourceSummary.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/SourceSummary.js +0 -9
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/commands.js +0 -82
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/examples.js +0 -47
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/model.js +0 -61
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/repair.js +0 -68
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/store.js +0 -55
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/types.js +0 -1
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/workbench.js +0 -18
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ManagementTable.html +0 -3
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ManagementTable.js +0 -28
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcCreateEntry.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcCreateEntry.js +0 -18
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcDetail.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcDetail.js +0 -31
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcEditor.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcEditor.js +0 -27
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcLifecycle.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcLifecycle.js +0 -16
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPage.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPage.js +0 -43
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPicker.html +0 -4
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPicker.js +0 -34
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcProgress.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcProgress.js +0 -30
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWizard.html +0 -3
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWizard.js +0 -67
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWorkspace.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWorkspace.js +0 -41
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcsPage.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcsPage.js +0 -31
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceEditor.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceEditor.js +0 -26
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceList.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceList.js +0 -70
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/data.js +0 -8
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/domain.js +0 -62
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/management.js +0 -36
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/managementStore.js +0 -49
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/store.js +0 -132
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/AdminList.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/AdminList.js +0 -38
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/EffectiveGrants.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/EffectiveGrants.js +0 -11
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/GrantEditor.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/GrantEditor.js +0 -45
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MemberEditor.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MemberEditor.js +0 -54
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MembersPage.html +0 -3
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MembersPage.js +0 -27
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RecordsPage.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RecordsPage.js +0 -12
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RoleEditor.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RoleEditor.js +0 -45
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RolesPage.html +0 -3
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RolesPage.js +0 -38
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/domain.js +0 -61
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/state.js +0 -51
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/store.js +0 -116
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseActionDialog.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseActionDialog.js +0 -45
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseDetail.html +0 -4
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseDetail.js +0 -30
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseEditor.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseEditor.js +0 -67
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseExecution.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseExecution.js +0 -5
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleasesPage.html +0 -4
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleasesPage.js +0 -60
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/commands.js +0 -157
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/model.js +0 -136
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/store.js +0 -76
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewDetail.html +0 -3
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewDetail.js +0 -26
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewEvidence.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewEvidence.js +0 -14
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewProcess.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewProcess.js +0 -113
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewsPage.html +0 -3
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewsPage.js +0 -62
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/commands.js +0 -97
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/model.js +0 -147
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/store.js +0 -13
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ColumnSettings.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ColumnSettings.js +0 -9
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListBatchBar.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListBatchBar.js +0 -8
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListDeleteDialog.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListDeleteDialog.js +0 -37
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListMore.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListMore.js +0 -8
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/RecordMetadata.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/RecordMetadata.js +0 -17
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/columns.js +0 -32
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/deliveryGuide.js +0 -49
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/deliveryView.js +0 -12
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/listBatch.js +0 -15
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/listSelection.js +0 -37
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/policy.js +0 -68
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/session.js +0 -44
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConfirmationDialog.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConfirmationDialog.js +0 -25
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConsoleShell.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConsoleShell.js +0 -53
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/PrototypeGuide.html +0 -10
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/PrototypeGuide.js +0 -30
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ScopePage.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ScopePage.js +0 -10
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/SessionDialog.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/SessionDialog.js +0 -9
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/confirmation.js +0 -3
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/navigation.js +0 -19
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecDocument.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecDocument.js +0 -8
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecEdit.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecEdit.js +0 -32
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHeader.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHeader.js +0 -15
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHistory.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHistory.js +0 -11
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecReview.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecReview.js +0 -57
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecWorkspace.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecWorkspace.js +0 -37
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/data.js +0 -20
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/domain.js +0 -55
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/store.js +0 -151
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/ArtifactDetail.html +0 -3
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/ArtifactDetail.js +0 -18
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskCreate.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskCreate.js +0 -40
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskDetail.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskDetail.js +0 -51
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskLaunch.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskLaunch.js +0 -9
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TasksPage.html +0 -5
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TasksPage.js +0 -48
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/domain.js +0 -204
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/exampleSource.js +0 -22
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/registry.js +0 -135
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/store.js +0 -137
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/WorkbenchPage.html +0 -3
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/WorkbenchPage.js +0 -36
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/model.js +0 -56
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/store.js +0 -15
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowCanvas.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowCanvas.js +0 -27
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowDetail.html +0 -4
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowDetail.js +0 -31
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowEditor.html +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowEditor.js +0 -68
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/WorkflowsPage.html +0 -5
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/WorkflowsPage.js +0 -55
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/data.js +0 -16
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/domain.js +0 -83
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/registry.js +0 -18
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/store.js +0 -61
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/admin.css +0 -60
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/agents.css +0 -46
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/antdv.css +0 -295
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/app.css +0 -102
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/delivery.css +0 -4
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/intents.css +0 -37
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/native.css +0 -22
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/operations.css +0 -2
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/pbc.css +0 -3
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/permissions.css +0 -22
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/pro.css +0 -1
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/releases.css +0 -4
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/reset.css +0 -246
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/reviews.css +0 -8
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/tasks.css +0 -6
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/tokens.css +0 -15
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/workbench.css +0 -61
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/workflows.css +0 -1
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/admin-rules.test.js +0 -96
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/agents.test.js +0 -14
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/intent-state.test.js +0 -37
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/list-batch.test.js +0 -44
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/operation-fixtures.js +0 -19
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/operation-repair.test.js +0 -14
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/operations.test.js +0 -25
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/pbc-management.test.js +0 -17
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/pbc-state.test.js +0 -24
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/permission-config.test.js +0 -23
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/permissions.test.js +0 -24
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/releases.test.js +0 -50
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/reviews.test.js +0 -36
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/runtime-forms-router.test.js +0 -28
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/runtime-state.test.js +0 -42
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/runtime-stores.test.js +0 -16
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/spec-state.test.js +0 -11
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/tasks.test.js +0 -27
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/workbench.test.js +0 -34
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/workflows.test.js +0 -16
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/convert.mjs +0 -168
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/serve.mjs +0 -7
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/styles.mjs +0 -11
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/verify.mjs +0 -24
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/serve.cjs +0 -16
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/template-inventory.json +0 -28791
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/template.json +0 -9
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/usability.css +0 -44
- package/skills/i3-ui-prototype/assets/templates/gallery/index.html +0 -40
- package/skills/i3-ui-prototype/assets/templates/generation-options.js +0 -42
- package/skills/i3-ui-prototype/assets/templates/index.html +0 -3
- package/skills/i3-ui-prototype/assets/templates/modern-workspace/manifest.json +0 -9
- package/skills/i3-ui-prototype/assets/templates/modern-workspace/preset.json +0 -6
- package/skills/i3-ui-prototype/assets/templates/presentation.html +0 -17
- package/skills/i3-ui-prototype/assets/templates/serve-gallery.cjs +0 -23
- package/skills/i3-ui-prototype/references/artifact-contract.md +0 -66
- package/skills/i3-ui-prototype/references/content-template.md +0 -81
- package/skills/i3-ui-prototype/references/enterprise-admin.md +0 -44
- package/skills/i3-ui-prototype/references/entry-contract.md +0 -71
- package/skills/i3-ui-prototype/references/execution-evidence.md +0 -51
- package/skills/i3-ui-prototype/references/expert-adapter.md +0 -76
- package/skills/i3-ui-prototype/references/framework-contract.md +0 -76
- package/skills/i3-ui-prototype/references/generation-contract.md +0 -122
- package/skills/i3-ui-prototype/references/interaction-acceptance.md +0 -169
- package/skills/i3-ui-prototype/references/legacy-native.md +0 -58
- package/skills/i3-ui-prototype/references/optional-skills.md +0 -63
- package/skills/i3-ui-prototype/references/project-layout.md +0 -92
- package/skills/i3-ui-prototype/references/template-adapters.md +0 -63
- package/skills/i3-ui-prototype/references/workflow-contract.md +0 -77
- package/skills/i3-ui-prototype/scripts/adapters/easel-html.cjs +0 -30
- package/skills/i3-ui-prototype/scripts/adapters/legacy-html.cjs +0 -28
- package/skills/i3-ui-prototype/scripts/browser-workspace.cjs +0 -72
- package/skills/i3-ui-prototype/scripts/buddy-host.cjs +0 -40
- package/skills/i3-ui-prototype/scripts/check-design-provider.cjs +0 -9
- package/skills/i3-ui-prototype/scripts/check-prototype.cjs +0 -14
- package/skills/i3-ui-prototype/scripts/codebuddy-context.cjs +0 -92
- package/skills/i3-ui-prototype/scripts/codebuddy-hook.cjs +0 -298
- package/skills/i3-ui-prototype/scripts/codebuddy-ide-source.cjs +0 -69
- package/skills/i3-ui-prototype/scripts/codebuddy-registration.cjs +0 -125
- package/skills/i3-ui-prototype/scripts/content-template.cjs +0 -98
- package/skills/i3-ui-prototype/scripts/design-provider-discovery.cjs +0 -128
- package/skills/i3-ui-prototype/scripts/enterprise-template.cjs +0 -104
- package/skills/i3-ui-prototype/scripts/execution-assertions.cjs +0 -43
- package/skills/i3-ui-prototype/scripts/execution-diagnostics.cjs +0 -91
- package/skills/i3-ui-prototype/scripts/execution-evidence.cjs +0 -177
- package/skills/i3-ui-prototype/scripts/execution-gates.cjs +0 -216
- package/skills/i3-ui-prototype/scripts/execution-policy.cjs +0 -62
- package/skills/i3-ui-prototype/scripts/execution-recovery.cjs +0 -58
- package/skills/i3-ui-prototype/scripts/execution-runtime.cjs +0 -69
- package/skills/i3-ui-prototype/scripts/generation-assets.cjs +0 -18
- package/skills/i3-ui-prototype/scripts/generation-contract.cjs +0 -214
- package/skills/i3-ui-prototype/scripts/generation-evidence.cjs +0 -50
- package/skills/i3-ui-prototype/scripts/generation-replan.cjs +0 -34
- package/skills/i3-ui-prototype/scripts/hosts/codebuddy.cjs +0 -21
- package/skills/i3-ui-prototype/scripts/init-prototype.cjs +0 -8
- package/skills/i3-ui-prototype/scripts/manage-baseline.cjs +0 -11
- package/skills/i3-ui-prototype/scripts/native-browser.cjs +0 -785
- package/skills/i3-ui-prototype/scripts/native-build.cjs +0 -91
- package/skills/i3-ui-prototype/scripts/native-command.cjs +0 -35
- package/skills/i3-ui-prototype/scripts/native-delivery.cjs +0 -104
- package/skills/i3-ui-prototype/scripts/native-devtools.cjs +0 -92
- package/skills/i3-ui-prototype/scripts/native-files.cjs +0 -44
- package/skills/i3-ui-prototype/scripts/native-pilot-lib.cjs +0 -290
- package/skills/i3-ui-prototype/scripts/native-pilot.cjs +0 -59
- package/skills/i3-ui-prototype/scripts/native-tool-name.cjs +0 -5
- package/skills/i3-ui-prototype/scripts/native-tool-result.cjs +0 -14
- package/skills/i3-ui-prototype/scripts/optional-skill-install.cjs +0 -203
- package/skills/i3-ui-prototype/scripts/project-registry.cjs +0 -126
- package/skills/i3-ui-prototype/scripts/prototype-dependencies.cjs +0 -103
- package/skills/i3-ui-prototype/scripts/prototype-hooks.cjs +0 -94
- package/skills/i3-ui-prototype/scripts/prototype-lib.cjs +0 -277
- package/skills/i3-ui-prototype/scripts/prototype-locations.cjs +0 -69
- package/skills/i3-ui-prototype/scripts/ptc-callbacks.cjs +0 -131
- package/skills/i3-ui-prototype/scripts/sync-template.cjs +0 -19
- package/skills/i3-ui-prototype/scripts/template-adapters.cjs +0 -89
- package/skills/i3-ui-prototype/scripts/template-contract.cjs +0 -407
- package/skills/i3-ui-prototype/scripts/template-inventory.cjs +0 -78
- package/skills/i3-ui-prototype/scripts/validate-result.cjs +0 -117
|
@@ -1,407 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
const assert = require('node:assert/strict');
|
|
3
|
-
const fs = require('node:fs');
|
|
4
|
-
const path = require('node:path');
|
|
5
|
-
const crypto = require('node:crypto');
|
|
6
|
-
|
|
7
|
-
const ASSETS = path.resolve(__dirname, '../assets');
|
|
8
|
-
const INDEX = 'capabilities.generated.json';
|
|
9
|
-
const EXTRACTOR_VERSION = '1.1.0';
|
|
10
|
-
const ID = /^[a-z][a-z0-9-]{0,63}$/;
|
|
11
|
-
const VOID = new Set(['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', 'track', 'wbr']);
|
|
12
|
-
const sha = value => crypto.createHash('sha256').update(value).digest('hex');
|
|
13
|
-
const canonical = value => JSON.stringify(value);
|
|
14
|
-
function readJson(file) { return JSON.parse(fs.readFileSync(file, 'utf8')); }
|
|
15
|
-
function identifier(value, label) { if (!ID.test(value || '')) throw new Error(`Invalid identifier / 标识: ${label}: ${value}`); }
|
|
16
|
-
function assertNoSymlinks(file) {
|
|
17
|
-
let current = path.resolve(file);
|
|
18
|
-
while (true) {
|
|
19
|
-
// macOS exposes its system temporary directories through these fixed aliases.
|
|
20
|
-
const systemAlias = process.platform === 'darwin' && ['/var', '/tmp'].includes(current) && fs.realpathSync(current) === `/private${current}`;
|
|
21
|
-
if (fs.existsSync(current) && fs.lstatSync(current).isSymbolicLink() && !systemAlias) throw new Error(`Symlink / 符号链接 is not allowed: ${current}`);
|
|
22
|
-
const parent = path.dirname(current);
|
|
23
|
-
if (parent === current) break;
|
|
24
|
-
current = parent;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
function filesUnder(directory) {
|
|
28
|
-
const files = [];
|
|
29
|
-
function walk(current, relative = '') {
|
|
30
|
-
for (const entry of fs.readdirSync(current, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name, 'en'))) {
|
|
31
|
-
if (entry.name === INDEX || entry.name.startsWith(`.${INDEX}.`)) continue;
|
|
32
|
-
const file = path.join(current, entry.name);
|
|
33
|
-
const name = relative ? `${relative}/${entry.name}` : entry.name;
|
|
34
|
-
if (entry.isSymbolicLink()) throw new Error(`Symlink / 符号链接 is not allowed: ${name}`);
|
|
35
|
-
if (entry.isDirectory()) walk(file, name);
|
|
36
|
-
else if (entry.isFile()) files.push({ path: name, digest: sha(fs.readFileSync(file)) });
|
|
37
|
-
else throw new Error(`Unsupported template source: ${name}`);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
assertNoSymlinks(directory);
|
|
41
|
-
walk(directory);
|
|
42
|
-
return files;
|
|
43
|
-
}
|
|
44
|
-
function localFile(directory, relative) {
|
|
45
|
-
if (typeof relative !== 'string' || !relative || path.isAbsolute(relative) || relative.split(/[\\/]/).includes('..')) throw new Error(`Unsafe template file: ${relative}`);
|
|
46
|
-
const target = path.resolve(directory, relative);
|
|
47
|
-
assertNoSymlinks(target);
|
|
48
|
-
return target;
|
|
49
|
-
}
|
|
50
|
-
function attributes(tag) {
|
|
51
|
-
const values = {};
|
|
52
|
-
const expression = /([^\s=<>/]+)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s>]+)))?/g;
|
|
53
|
-
const body = tag.replace(/^<\/?[\w:-]+/, '').replace(/\/?\s*>$/, '');
|
|
54
|
-
let match;
|
|
55
|
-
while ((match = expression.exec(body))) {
|
|
56
|
-
const key = match[1].toLowerCase();
|
|
57
|
-
if (Object.hasOwn(values, key)) throw new Error(`Duplicate HTML attribute: ${key}`);
|
|
58
|
-
values[key] = (match[2] ?? match[3] ?? match[4] ?? '').replace(/"/g, '"').replace(/'|'/g, "'").replace(/&/g, '&');
|
|
59
|
-
}
|
|
60
|
-
return values;
|
|
61
|
-
}
|
|
62
|
-
function visibleText(value) {
|
|
63
|
-
return value.replace(/&#(x[0-9a-f]+|\d+);/gi, (match,code)=>{
|
|
64
|
-
const point=code[0].toLowerCase()==='x'?parseInt(code.slice(1),16):parseInt(code,10);
|
|
65
|
-
return point>0&&point<=0x10ffff?String.fromCodePoint(point):match;
|
|
66
|
-
}).replace(/&(nbsp|lt|gt|quot|apos|amp);/g,(_,entity)=>({nbsp:' ',lt:'<',gt:'>',quot:'"',apos:"'",amp:'&'})[entity]).replace(/\s+/g,' ').trim();
|
|
67
|
-
}
|
|
68
|
-
function extractHtml(html, file, result) {
|
|
69
|
-
const stack = [];
|
|
70
|
-
const labels=new Map(),fieldTargets=[];
|
|
71
|
-
function close(frame) {
|
|
72
|
-
const text=visibleText(frame.text);
|
|
73
|
-
if(frame.name==='h1'&&frame.pageEntry&&!frame.pageEntry.title)frame.pageEntry.title=text;
|
|
74
|
-
if(frame.name==='h2'&&frame.regionEntry&&!frame.regionEntry.title)frame.regionEntry.title=text;
|
|
75
|
-
if(frame.contentId==='page-description'&&frame.pageEntry)frame.pageEntry.description=text;
|
|
76
|
-
for(const item of frame.items)if(text&&!frame.explicitLabel){item.label=text;item.labelSource='text';}
|
|
77
|
-
if(frame.name==='label') {
|
|
78
|
-
const label=text.replace(/\s*\*\s*$/,'').trim();
|
|
79
|
-
if(frame.labelFor)labels.set(frame.labelFor,label);
|
|
80
|
-
for(const item of frame.labelFields)if(label&&item.labelSource!=='data-label'){item.label=label;item.labelSource='label';}
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
const cleaned = html.replace(/<(script|style)\b([^>]*)>[\s\S]*?<\/\1\s*>/gi, '<$1$2></$1>');
|
|
84
|
-
const tokens = cleaned.match(/<!--[\s\S]*?-->|<![^>]*>|<\/?(?:[^'"<>]|"[^"]*"|'[^']*')+>|[^<]+/g) || [];
|
|
85
|
-
for (const token of tokens) {
|
|
86
|
-
if (token.startsWith('<!')) continue;
|
|
87
|
-
if(!token.startsWith('<')) {
|
|
88
|
-
for(let i=0;i<stack.length;i++) {
|
|
89
|
-
if(stack[i].name==='label'&&stack.slice(i+1).some(frame=>['input','select','textarea','button'].includes(frame.name)))continue;
|
|
90
|
-
stack[i].text+=token;
|
|
91
|
-
}
|
|
92
|
-
continue;
|
|
93
|
-
}
|
|
94
|
-
const closing = /^<\//.test(token);
|
|
95
|
-
const name = /^<\/?\s*([\w:-]+)/.exec(token)?.[1]?.toLowerCase();
|
|
96
|
-
if (!name) continue;
|
|
97
|
-
if (closing) {
|
|
98
|
-
const last = stack.pop();
|
|
99
|
-
if (!last || last.name !== name) throw new Error(`Malformed HTML nesting in ${file}: ${name}`);
|
|
100
|
-
close(last);
|
|
101
|
-
continue;
|
|
102
|
-
}
|
|
103
|
-
const attr = attributes(token);
|
|
104
|
-
if (name === 'script' && attr.type === 'module') throw new Error(`Offline / 离线 template cannot use module scripts: ${file}`);
|
|
105
|
-
const resource = ['script', 'img', 'audio', 'video', 'source', 'iframe'].includes(name) ? attr.src : name === 'link' ? attr.href : undefined;
|
|
106
|
-
if (resource) {
|
|
107
|
-
if (/^(?:[a-z][a-z0-9+.-]*:|\/\/|\/)/i.test(resource)) throw new Error(`Offline / 离线 template requires local resources: ${resource}`);
|
|
108
|
-
result.resources.push({ file, path: resource.split(/[?#]/)[0] });
|
|
109
|
-
}
|
|
110
|
-
const parent = stack.at(-1) || {};
|
|
111
|
-
const context = { name, pageId: parent.pageId, regionId: parent.regionId, mode: parent.mode, capabilityId: parent.capabilityId, pageEntry:parent.pageEntry,regionEntry:parent.regionEntry,text:'',items:[],labelFields:[],labelFor:attr.for,contentId:attr['data-content-id'],explicitLabel:attr['data-label'] };
|
|
112
|
-
if (attr['data-page-id']) {
|
|
113
|
-
identifier(attr['data-page-id'], 'page');
|
|
114
|
-
context.pageId = attr['data-page-id']; context.regionId = undefined; context.capabilityId = undefined;
|
|
115
|
-
if (result.pages.some(page => page.id === context.pageId)) throw new Error(`Duplicate page identity / 身份: ${context.pageId}`);
|
|
116
|
-
context.pageEntry={id:context.pageId,file};context.regionEntry=undefined;
|
|
117
|
-
result.pages.push(context.pageEntry);
|
|
118
|
-
}
|
|
119
|
-
if (attr['data-region-id']) {
|
|
120
|
-
identifier(attr['data-region-id'], 'region');
|
|
121
|
-
if (!context.pageId) throw new Error(`Region requires page identity: ${file}`);
|
|
122
|
-
context.regionId = attr['data-region-id']; context.mode = attr['data-region-mode']; context.capabilityId = undefined;
|
|
123
|
-
if (result.regions.some(region => region.pageId === context.pageId && region.id === context.regionId)) throw new Error(`Duplicate region identity / 身份: ${context.pageId}/${context.regionId}`);
|
|
124
|
-
context.regionEntry={id:context.regionId,pageId:context.pageId,mode:context.mode,file};
|
|
125
|
-
result.regions.push(context.regionEntry);
|
|
126
|
-
}
|
|
127
|
-
if (attr['data-capability-id']) {
|
|
128
|
-
identifier(attr['data-capability-id'], 'capability');
|
|
129
|
-
if (!context.pageId || !context.regionId) throw new Error(`Capability requires page and region identity: ${file}`);
|
|
130
|
-
context.capabilityId = attr['data-capability-id'];
|
|
131
|
-
let parameters;
|
|
132
|
-
try { parameters = JSON.parse(attr['data-capability-parameters'] || '{}'); } catch { throw new Error(`Invalid capability parameters: ${context.capabilityId}`); }
|
|
133
|
-
result.bindings.push({ id: `${context.pageId}/${context.regionId}/${context.capabilityId}`, pageId: context.pageId, regionId: context.regionId, capabilityId: context.capabilityId, parameters, source: { file } });
|
|
134
|
-
}
|
|
135
|
-
for (const kind of ['field', 'action']) {
|
|
136
|
-
const value = attr[`data-${kind}-id`];
|
|
137
|
-
if (!value) continue;
|
|
138
|
-
identifier(value, kind);
|
|
139
|
-
if (!context.capabilityId) throw new Error(`Unbound ${kind} interaction / 交互: ${value}`);
|
|
140
|
-
const items = result[`${kind}s`];
|
|
141
|
-
const id = `${context.pageId}/${context.regionId}/${value}`;
|
|
142
|
-
if (items.some(item => item.id === id)) throw new Error(`Duplicate ${kind} identity / 身份: ${id}`);
|
|
143
|
-
const item={id,pageId:context.pageId,regionId:context.regionId,capabilityId:context.capabilityId,localId:value,tag:name,label:attr['data-label']||attr['aria-label']||attr.placeholder||attr.value||value,labelSource:attr['data-label']?'data-label':attr['aria-label']?'aria-label':'identifier',source:{file}};
|
|
144
|
-
if(kind==='field') {
|
|
145
|
-
if(Object.hasOwn(attr,'placeholder'))item.placeholder=attr.placeholder;
|
|
146
|
-
if(Object.hasOwn(attr,'required'))item.required=true;
|
|
147
|
-
if(attr.type)item.inputType=attr.type;
|
|
148
|
-
const label=stack.findLast(frame=>frame.name==='label');
|
|
149
|
-
if(label)label.labelFields.push(item);
|
|
150
|
-
if(attr.id)fieldTargets.push({id:attr.id,item});
|
|
151
|
-
}
|
|
152
|
-
items.push(item);context.items.push(item);
|
|
153
|
-
}
|
|
154
|
-
const interactive = ['button', 'input', 'select', 'textarea'].includes(name) || (name === 'a' && attr.href) || ['button', 'checkbox', 'switch', 'textbox'].includes(attr.role) || attr.contenteditable === 'true' || /on(click|change|input)/i.test(Object.keys(attr).join(' '));
|
|
155
|
-
if (interactive && !attr['data-field-id'] && !attr['data-action-id']) throw new Error(`Unbound interaction / 交互 in ${file}: ${name}`);
|
|
156
|
-
if (!VOID.has(name) && !/\/\s*>$/.test(token)) stack.push(context);
|
|
157
|
-
else close(context);
|
|
158
|
-
}
|
|
159
|
-
if (stack.length) throw new Error(`Unclosed HTML element in ${file}: ${stack.at(-1).name}`);
|
|
160
|
-
for(const target of fieldTargets)if(labels.has(target.id)&&target.item.labelSource!=='data-label'){target.item.label=labels.get(target.id);target.item.labelSource='label-for';}
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
function projectAdminListContent(snapshot) {
|
|
164
|
-
const index=snapshot.index;
|
|
165
|
-
if(index.pages.length!==1||index.pages[0].id!=='devices')throw new Error('Unsupported admin-list page identity; explicit framework adaptation / 适配 required');
|
|
166
|
-
const page=index.pages[0];
|
|
167
|
-
const region=id=>index.regions.find(item=>item.pageId===page.id&&item.id===id);
|
|
168
|
-
if(!region('device-list')||!region('device-editor')||index.regions.length!==2)throw new Error('Unsupported admin-list region; explicit framework adaptation / 适配 required');
|
|
169
|
-
const fieldMap={
|
|
170
|
-
'device-list/device-code':'code','device-list/device-name':'name','device-list/device-category':'category','device-list/device-status':'status',
|
|
171
|
-
'device-list/query-name':'queryName','device-list/query-status':'queryStatus',
|
|
172
|
-
'device-editor/edit-code':'editCode','device-editor/edit-name':'editName','device-editor/edit-category':'editCategory','device-editor/edit-status':'editStatus',
|
|
173
|
-
};
|
|
174
|
-
const actionMap={
|
|
175
|
-
'device-list/query':'query','device-list/reset-query':'resetQuery','device-list/bulk-disable':'bulkDisable',
|
|
176
|
-
'device-list/previous-page':'previousPage','device-list/next-page':'nextPage',
|
|
177
|
-
'device-editor/edit':'edit','device-editor/save-edit':'save','device-editor/cancel-edit':'cancel',
|
|
178
|
-
};
|
|
179
|
-
const fields={},actions={};
|
|
180
|
-
for(const item of index.fields) {
|
|
181
|
-
const key=fieldMap[`${item.regionId}/${item.localId}`];
|
|
182
|
-
if(!key) {
|
|
183
|
-
const sampleControl=item.regionId==='device-list'&&((item.capabilityId==='selection'&&item.inputType==='checkbox')||(item.capabilityId==='feedback'&&item.localId==='preview-state'));
|
|
184
|
-
if(sampleControl)continue;
|
|
185
|
-
throw new Error(`Unsupported admin-list field ${item.id}; explicit framework adaptation / 适配 required`);
|
|
186
|
-
}
|
|
187
|
-
fields[key]={label:item.label,...(item.placeholder!==undefined?{placeholder:item.placeholder}:{}),...(item.required!==undefined?{required:item.required}:{})};
|
|
188
|
-
}
|
|
189
|
-
for(const item of index.actions) {
|
|
190
|
-
const key=actionMap[`${item.regionId}/${item.localId}`];
|
|
191
|
-
if(!key)throw new Error(`Unsupported admin-list action ${item.id}; explicit framework adaptation / 适配 required`);
|
|
192
|
-
actions[key]=item.label;
|
|
193
|
-
}
|
|
194
|
-
for(const key of Object.values(fieldMap))if(!fields[key]?.label)throw new Error(`Missing admin-list content field ${key}; explicit adaptation required`);
|
|
195
|
-
for(const key of Object.values(actionMap))if(!actions[key])throw new Error(`Missing admin-list content action ${key}; explicit adaptation required`);
|
|
196
|
-
if(fields.editName.required!==true)throw new Error('Admin-list editName is required / 名称必填合同冲突; explicit adaptation required');
|
|
197
|
-
return {schemaVersion:1,templateDigest:snapshot.digest,pageTitle:page.title||snapshot.id,description:page.description||'',listTitle:region('device-list').title||'',editorTitle:region('device-editor').title||'',fields,actions};
|
|
198
|
-
}
|
|
199
|
-
function sameBinding(a, b) { return a.pageId === b.pageId && a.regionId === b.regionId && a.capabilityId === b.capabilityId; }
|
|
200
|
-
function sourceValid(requirement) {
|
|
201
|
-
const source = requirement?.source;
|
|
202
|
-
return requirement?.id && requirement?.text && ['prd', 'user', 'scope-change'].includes(source?.type) && typeof source.reference === 'string' && source.reference.trim() && typeof source.statement === 'string' && source.statement.trim();
|
|
203
|
-
}
|
|
204
|
-
function resolvePaginationParameters(parameters = {}) {
|
|
205
|
-
const mode = parameters.mode === undefined ? 'fixed' : parameters.mode;
|
|
206
|
-
const positiveInteger = value => Number.isInteger(value) && value > 0;
|
|
207
|
-
if (!['fixed', 'adjustable'].includes(mode)) throw new Error('Invalid pagination mode');
|
|
208
|
-
if (mode === 'fixed') {
|
|
209
|
-
if (!positiveInteger(parameters.fixedPageSize)) throw new Error('Fixed pagination requires a positive integer fixedPageSize');
|
|
210
|
-
if (parameters.defaultPageSize !== undefined || parameters.pageSizeOptions !== undefined) throw new Error('Fixed pagination cannot declare adjustable defaults or options');
|
|
211
|
-
return { mode, defaultPageSize: parameters.fixedPageSize, pageSizeOptions: [parameters.fixedPageSize] };
|
|
212
|
-
}
|
|
213
|
-
if (parameters.fixedPageSize !== undefined) throw new Error('Adjustable pagination cannot declare fixedPageSize');
|
|
214
|
-
if (!positiveInteger(parameters.defaultPageSize)) throw new Error('Adjustable pagination requires a positive integer defaultPageSize');
|
|
215
|
-
const options = parameters.pageSizeOptions;
|
|
216
|
-
if (!Array.isArray(options) || options.length < 2 || !options.every(positiveInteger) || new Set(options).size !== options.length) throw new Error('Adjustable pagination requires at least two unique positive integer pageSizeOptions');
|
|
217
|
-
if (!options.includes(parameters.defaultPageSize)) throw new Error('Pagination options must include defaultPageSize');
|
|
218
|
-
return { mode, defaultPageSize: parameters.defaultPageSize, pageSizeOptions: [...options] };
|
|
219
|
-
}
|
|
220
|
-
function resolveThemeParameters(parameters = {}) {
|
|
221
|
-
const ids=['light','dark','fresh','tech'];
|
|
222
|
-
if(parameters.defaultTheme!=='light'||!Array.isArray(parameters.presets)||parameters.presets.length!==4||new Set(parameters.presets).size!==4||!ids.every(id=>parameters.presets.includes(id)))throw new Error('Theme requires default light and the four named presets light/dark/fresh/tech');
|
|
223
|
-
return {defaultTheme:'light',presets:[...ids]};
|
|
224
|
-
}
|
|
225
|
-
function checkCapabilities({ definition, bindings = [], regions = [], scope = {}, decisions = [] } = {}) {
|
|
226
|
-
const errors = [], requiredBindings = [], requiredScenarios = [];
|
|
227
|
-
const definitions = new Map();
|
|
228
|
-
for (const capability of definition?.capabilities || []) {
|
|
229
|
-
if (definitions.has(capability.id) || !ID.test(capability.id || '')) errors.push(`Invalid or duplicate capability definition: ${capability.id}`);
|
|
230
|
-
definitions.set(capability.id, capability);
|
|
231
|
-
}
|
|
232
|
-
if (definition?.schemaVersion !== 1 || !definitions.size) errors.push('Missing fixed capability definition');
|
|
233
|
-
const regionKeys = new Set();
|
|
234
|
-
for (const region of regions) {
|
|
235
|
-
const key = `${region.pageId}/${region.id}`;
|
|
236
|
-
if (regionKeys.has(key)) errors.push(`Duplicate region identity: ${key}`);
|
|
237
|
-
regionKeys.add(key);
|
|
238
|
-
if (!definition?.regionModes?.includes(region.mode)) errors.push(`Unknown region mode: ${key}: ${region.mode}`);
|
|
239
|
-
}
|
|
240
|
-
const bindingMap = new Map();
|
|
241
|
-
for (const binding of bindings) {
|
|
242
|
-
const key = `${binding.pageId}/${binding.regionId}/${binding.capabilityId}`;
|
|
243
|
-
if (binding.id !== key || bindingMap.has(key)) errors.push(`Invalid or duplicate binding identity: ${key}`);
|
|
244
|
-
bindingMap.set(key, binding);
|
|
245
|
-
if (!regionKeys.has(`${binding.pageId}/${binding.regionId}`)) errors.push(`Binding has unknown region: ${key}`);
|
|
246
|
-
const capability = definitions.get(binding.capabilityId);
|
|
247
|
-
if (!capability) { errors.push(`Unknown capability / 能力: ${key}`); continue; }
|
|
248
|
-
for (const [name, rule] of Object.entries(capability.parameters || {})) {
|
|
249
|
-
const value = binding.parameters?.[name];
|
|
250
|
-
if (value === undefined && !rule.required) continue;
|
|
251
|
-
const regionMode = regions.find(region => region.pageId === binding.pageId && region.id === binding.regionId)?.mode;
|
|
252
|
-
const includes = rule.includesByMode?.[regionMode] || rule.includes;
|
|
253
|
-
const typeValid = rule.type === 'array' ? Array.isArray(value) : rule.type === 'integer' ? Number.isInteger(value) : typeof value === rule.type;
|
|
254
|
-
if (!typeValid || (rule.enum && !rule.enum.includes(value)) || (rule.minimum !== undefined && value < rule.minimum) || (includes && !includes.every(item => value?.includes?.(item)))) errors.push(`Invalid capability parameter: ${key}.${name}`);
|
|
255
|
-
}
|
|
256
|
-
if (capability.id === 'pagination') {
|
|
257
|
-
try { resolvePaginationParameters(binding.parameters); }
|
|
258
|
-
catch (error) { errors.push(`Invalid pagination parameters: ${key}: ${error.message}`); }
|
|
259
|
-
}
|
|
260
|
-
if (capability.id === 'theme') {
|
|
261
|
-
try { resolveThemeParameters(binding.parameters); }
|
|
262
|
-
catch(error) { errors.push(`Invalid theme parameters: ${key}: ${error.message}`); }
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
const decisionMap = new Map();
|
|
266
|
-
for (const decision of decisions) {
|
|
267
|
-
if (decisionMap.has(decision.bindingId)) errors.push(`Duplicate decision: ${decision.bindingId}`);
|
|
268
|
-
decisionMap.set(decision.bindingId, decision);
|
|
269
|
-
if (decision.status === 'pending') errors.push(`Pending capability: ${decision.bindingId}`);
|
|
270
|
-
else if (!['required', 'applicable', 'not-applicable'].includes(decision.status)) errors.push(`Unknown capability decision: ${decision.bindingId}`);
|
|
271
|
-
}
|
|
272
|
-
const expected = [];
|
|
273
|
-
for (const region of regions) {
|
|
274
|
-
for (const capability of definitions.values()) {
|
|
275
|
-
if (capability.requirement === 'required' && capability.appliesTo?.includes(region.mode)) expected.push({ pageId: region.pageId, regionId: region.id, capabilityId: capability.id });
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
for (const requirement of scope.requirements || []) {
|
|
279
|
-
if (!sourceValid(requirement)) errors.push(`Requirement needs explicit source: ${requirement.id || '(missing id)'}`);
|
|
280
|
-
for (const capability of requirement.capabilities || []) {
|
|
281
|
-
if (!definitions.has(capability.capabilityId) || !regionKeys.has(`${capability.pageId}/${capability.regionId}`)) errors.push(`Unknown scoped capability: ${requirement.id}`);
|
|
282
|
-
else if (!expected.some(entry => sameBinding(entry, capability))) expected.push(capability);
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
for (const entry of expected) {
|
|
286
|
-
const key = `${entry.pageId}/${entry.regionId}/${entry.capabilityId}`;
|
|
287
|
-
const decision = decisionMap.get(key);
|
|
288
|
-
if (decision?.status === 'not-applicable') {
|
|
289
|
-
const exemption = (scope.exemptions || []).find(item => sameBinding(item, entry) && item.requirementId === decision.requirementId && item.reason?.trim());
|
|
290
|
-
const requirement = (scope.requirements || []).find(item => item.id === exemption?.requirementId);
|
|
291
|
-
if (exemption && sourceValid(requirement)) continue;
|
|
292
|
-
errors.push(`Required capability needs explicit scoped exemption: ${key}`);
|
|
293
|
-
}
|
|
294
|
-
requiredBindings.push(key);
|
|
295
|
-
if (!bindingMap.has(key)) errors.push(`Missing required capability: ${key}`);
|
|
296
|
-
const capability = definitions.get(entry.capabilityId);
|
|
297
|
-
for (const scenario of capability?.scenarios || []) requiredScenarios.push({ ...scenario, id: `${key}/${scenario.id}`, scenarioId: scenario.id, bindingId: key });
|
|
298
|
-
}
|
|
299
|
-
for (const decision of decisions) if (!expected.some(entry => `${entry.pageId}/${entry.regionId}/${entry.capabilityId}` === decision.bindingId) && !bindingMap.has(decision.bindingId)) errors.push(`Decision has unknown binding: ${decision.bindingId}`);
|
|
300
|
-
return { status: errors.length ? 'failed' : 'passed', errors, requiredBindings, requiredScenarios };
|
|
301
|
-
}
|
|
302
|
-
function syncTemplate(directory, { write = true } = {}) {
|
|
303
|
-
directory = path.resolve(directory);
|
|
304
|
-
if (write && fs.existsSync(path.join(directory, 'component-inventory.json'))) fs.writeFileSync(path.join(directory, 'template-inventory.json'), JSON.stringify(require('./template-inventory.cjs').scan(directory), null, 2) + '\n');
|
|
305
|
-
const files = filesUnder(directory);
|
|
306
|
-
const manifest = readJson(localFile(directory, 'template.json'));
|
|
307
|
-
identifier(manifest.id, 'template');
|
|
308
|
-
const definitionFile = localFile(directory, manifest.definition);
|
|
309
|
-
const definition = readJson(definitionFile);
|
|
310
|
-
let result;
|
|
311
|
-
if (manifest.kind === 'content-reference') result = require('./content-template.cjs').extract(directory, manifest, files);
|
|
312
|
-
else {
|
|
313
|
-
result = { pages: [], regions: [], bindings: [], fields: [], actions: [], resources: [] };
|
|
314
|
-
for (const file of files.filter(entry => /\.html?$/i.test(entry.path))) extractHtml(fs.readFileSync(localFile(directory, file.path), 'utf8'), file.path, result);
|
|
315
|
-
for (const resource of result.resources) {
|
|
316
|
-
const relative = path.posix.normalize(path.posix.join(path.posix.dirname(resource.file), resource.path));
|
|
317
|
-
if (!files.some(file => file.path === relative)) throw new Error(`Offline / 离线 template resource missing: ${relative}`);
|
|
318
|
-
}
|
|
319
|
-
for (const file of files.filter(entry => /\.(?:html?|js|css)$/i.test(entry.path))) {
|
|
320
|
-
const text = fs.readFileSync(localFile(directory, file.path), 'utf8');
|
|
321
|
-
if (/\bfetch\s*\(|\bXMLHttpRequest\b|\bimport\s*(?:\(|["'{*])|\bfrom\s*["']|@import\b|url\s*\(\s*["']?(?:https?:|\/\/)/i.test(text)) throw new Error(`Offline / 离线 template cannot use async or remote loads: ${file.path}`);
|
|
322
|
-
}
|
|
323
|
-
if (!result.pages.length || !result.regions.length) throw new Error('Missing page or region identity / 身份');
|
|
324
|
-
if (!files.some(file => file.path === manifest.entry)) throw new Error('Template entry is missing');
|
|
325
|
-
}
|
|
326
|
-
const checked = checkCapabilities({ definition, ...result, scope: manifest.scope, decisions: manifest.decisions });
|
|
327
|
-
if (checked.status !== 'passed') throw new Error(checked.errors.join('\n'));
|
|
328
|
-
const htmlFiles = files.filter(file => /\.html?$/i.test(file.path));
|
|
329
|
-
const extractorFiles = manifest.kind==='content-reference' ? Object.fromEntries(['template-contract.cjs','content-template.cjs'].map(file=>[file,sha(fs.readFileSync(path.join(__dirname,file)))])) : null;
|
|
330
|
-
const extractor = extractorFiles ? { version:'2.0.0', files:extractorFiles, digest:sha(canonical(extractorFiles)) } : { version:EXTRACTOR_VERSION,digest:sha(fs.readFileSync(__filename)) };
|
|
331
|
-
const value = { schemaVersion: 1, templateId: manifest.id, version: manifest.version, sourceDigest: sha(canonical(files)), htmlDigest: sha(canonical(htmlFiles)), definitionDigest: sha(fs.readFileSync(definitionFile)), extractor, files, definition, ...result, requiredBindings: checked.requiredBindings, requiredScenarios: checked.requiredScenarios };
|
|
332
|
-
const index = { ...value, digest: sha(canonical(value)) };
|
|
333
|
-
if (write) {
|
|
334
|
-
const temporary = path.join(directory, `.${INDEX}.${process.pid}.tmp`);
|
|
335
|
-
try { fs.writeFileSync(temporary, `${JSON.stringify(index, null, 2)}\n`, { flag: 'wx' }); fs.renameSync(temporary, path.join(directory, INDEX)); }
|
|
336
|
-
finally { fs.rmSync(temporary, { force: true }); }
|
|
337
|
-
}
|
|
338
|
-
return index;
|
|
339
|
-
}
|
|
340
|
-
function templateSnapshot(directory, expected) {
|
|
341
|
-
return { schemaVersion: 1, ...(expected.kind ? { kind: expected.kind } : {}), id: expected.templateId, version: expected.version, digest: expected.digest, index: expected, definition: expected.definition, files: expected.files.map(file => ({ path: file.path, encoding: 'base64', content: fs.readFileSync(localFile(directory, file.path)).toString('base64') })) };
|
|
342
|
-
}
|
|
343
|
-
function loadTemplate(directory) {
|
|
344
|
-
directory = path.resolve(directory);
|
|
345
|
-
const expected = syncTemplate(directory, { write: false });
|
|
346
|
-
const stored = fs.existsSync(path.join(directory, INDEX)) ? readJson(path.join(directory, INDEX)) : null;
|
|
347
|
-
if (!stored || canonical(stored) !== canonical(expected)) throw new Error('Template index is stale / 源和索引不同步; run sync-template.cjs');
|
|
348
|
-
return templateSnapshot(directory, expected);
|
|
349
|
-
}
|
|
350
|
-
function loadBundledTemplate(templateId, { templatesRoot = path.join(ASSETS, 'templates') } = {}) {
|
|
351
|
-
const catalog = readJson(localFile(templatesRoot, 'catalog.json'));
|
|
352
|
-
templateId ||= catalog.defaultTemplate; identifier(templateId, 'template');
|
|
353
|
-
const selected = catalog.templates.find(item => item.id === templateId);
|
|
354
|
-
assert.ok(selected?.availability === 'available' && selected.contentRoot, `Unsupported or not available native template: ${templateId}`);
|
|
355
|
-
const directory = localFile(templatesRoot, selected.contentRoot);
|
|
356
|
-
const manifest = readJson(localFile(directory, 'template.json'));
|
|
357
|
-
assert.equal(manifest.kind, 'content-reference', 'Native templates require an explicit content-reference manifest');
|
|
358
|
-
assert.equal(manifest.id, templateId, 'Template catalog identity differs from its manifest');
|
|
359
|
-
return templateSnapshot(directory, syncTemplate(directory, { write: false }));
|
|
360
|
-
}
|
|
361
|
-
function prepareTemplate({ project, id = 'enterprise-admin' }) {
|
|
362
|
-
identifier(id, 'template');
|
|
363
|
-
const directory = path.resolve(project, 'ui-templates', id);
|
|
364
|
-
assertNoSymlinks(directory);
|
|
365
|
-
if (fs.existsSync(directory)) return { directory, created: false, index: loadTemplate(directory).index };
|
|
366
|
-
fs.mkdirSync(path.dirname(directory), { recursive: true });
|
|
367
|
-
const temporary = path.join(path.dirname(directory), `.${id}.${process.pid}.tmp`);
|
|
368
|
-
try {
|
|
369
|
-
fs.cpSync(path.join(ASSETS, 'templates/enterprise-admin'), temporary, { recursive: true, errorOnExist: true, force: false });
|
|
370
|
-
fs.copyFileSync(path.join(ASSETS, 'capabilities/management.json'), path.join(temporary, 'capability-definition.json'));
|
|
371
|
-
const manifest = readJson(path.join(temporary, 'template.json'));
|
|
372
|
-
manifest.id = id;
|
|
373
|
-
fs.writeFileSync(path.join(temporary, 'template.json'), `${JSON.stringify(manifest, null, 2)}\n`);
|
|
374
|
-
const index = syncTemplate(temporary);
|
|
375
|
-
if (fs.existsSync(directory)) throw new Error(`Template already exists: ${directory}`);
|
|
376
|
-
fs.renameSync(temporary, directory);
|
|
377
|
-
return { directory, created: true, index };
|
|
378
|
-
} finally { fs.rmSync(temporary, { recursive: true, force: true }); }
|
|
379
|
-
}
|
|
380
|
-
function checkInstanceCapabilities(inputsRoot) {
|
|
381
|
-
try {
|
|
382
|
-
const fixed = readJson(localFile(inputsRoot, 'capabilities.json'));
|
|
383
|
-
if (fs.existsSync(localFile(inputsRoot, 'template-snapshot.json')) && readJson(localFile(inputsRoot, 'template-snapshot.json')).kind === 'content-reference') return require('./content-template.cjs').checkInputs(inputsRoot, module.exports);
|
|
384
|
-
const scopeFile = localFile(inputsRoot, 'scope.json');
|
|
385
|
-
const snapshotFile = localFile(inputsRoot, 'template-snapshot.json');
|
|
386
|
-
if (fs.existsSync(snapshotFile)) {
|
|
387
|
-
const snapshot = readJson(snapshotFile);
|
|
388
|
-
if (canonical(fixed.definition) !== canonical(snapshot.definition)) throw new Error('Fixed capability definition differs from template snapshot');
|
|
389
|
-
for (const region of snapshot.index.regions) {
|
|
390
|
-
if (!fixed.regions.some(entry => entry.pageId === region.pageId && entry.id === region.id && entry.mode === region.mode)) throw new Error(`Fixed template region missing or mode changed: ${region.pageId}/${region.id}`);
|
|
391
|
-
}
|
|
392
|
-
for (const binding of snapshot.index.bindings) {
|
|
393
|
-
if (!fixed.bindings.some(entry => entry.id === binding.id && sameBinding(entry, binding))) throw new Error(`Fixed template binding missing: ${binding.id}`);
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
const scope=fs.existsSync(scopeFile) ? readJson(scopeFile) : fixed.scope;
|
|
397
|
-
const result=checkCapabilities({ ...fixed, scope });
|
|
398
|
-
for(const binding of fixed.bindings.filter(item=>item.capabilityId==='theme')) {
|
|
399
|
-
if(binding.id!=='devices/device-list/theme')result.errors.push(`Theme binding needs an explicit native adapter: ${binding.id}`);
|
|
400
|
-
if(!(scope?.requirements||[]).some(requirement=>sourceValid(requirement)&&(requirement.capabilities||[]).some(item=>sameBinding(item,binding))))result.errors.push(`Theme binding requires an explicit requirement source: ${binding.id}`);
|
|
401
|
-
if(!result.requiredBindings.includes(binding.id))result.errors.push(`Enabled theme must retain its acceptance; remove the explicit binding to disable it: ${binding.id}`);
|
|
402
|
-
}
|
|
403
|
-
if(result.errors.length)result.status='failed';
|
|
404
|
-
return result;
|
|
405
|
-
} catch (error) { return { status: 'failed', errors: [error.message], requiredBindings: [], requiredScenarios: [] }; }
|
|
406
|
-
}
|
|
407
|
-
module.exports = { prepareTemplate, syncTemplate, loadTemplate, loadBundledTemplate, checkCapabilities, checkInstanceCapabilities, projectAdminListContent, resolvePaginationParameters, resolveThemeParameters };
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
const fs = require('node:fs'), path = require('node:path'), crypto = require('node:crypto'), assert = require('node:assert/strict');
|
|
3
|
-
const digest = value => crypto.createHash('sha256').update(value).digest('hex');
|
|
4
|
-
const ignored = new Set(['template-inventory.json', 'capabilities.generated.json']);
|
|
5
|
-
function files(directory, prefix = '') {
|
|
6
|
-
return fs.readdirSync(path.join(directory, prefix), { withFileTypes: true }).sort((a,b) => a.name.localeCompare(b.name, 'en')).flatMap(entry => {
|
|
7
|
-
const name = prefix ? `${prefix}/${entry.name}` : entry.name;
|
|
8
|
-
assert.ok(!entry.isSymbolicLink(), `Refusing template symlink: ${name}`);
|
|
9
|
-
if (['.git', 'node_modules'].includes(entry.name) || ignored.has(name)) return [];
|
|
10
|
-
return entry.isDirectory() ? files(directory, name) : [name];
|
|
11
|
-
});
|
|
12
|
-
}
|
|
13
|
-
function attributes(text) {
|
|
14
|
-
const value = {};
|
|
15
|
-
for (const match of text.matchAll(/([^\s=<>/'"`]+)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s>]+)))?/g)) {
|
|
16
|
-
assert.ok(!Object.hasOwn(value, match[1]), `Duplicate HTML attribute: ${match[1]}`);
|
|
17
|
-
value[match[1]] = match[2] ?? match[3] ?? match[4] ?? '';
|
|
18
|
-
}
|
|
19
|
-
return value;
|
|
20
|
-
}
|
|
21
|
-
function scan(directory) {
|
|
22
|
-
directory = fs.realpathSync(directory);
|
|
23
|
-
const sourceFiles = files(directory), hashes = Object.fromEntries(sourceFiles.map(file => [file, digest(fs.readFileSync(path.join(directory, file)))]));
|
|
24
|
-
const html = fs.readFileSync(path.join(directory, 'index.html'), 'utf8');
|
|
25
|
-
const policy = JSON.parse(fs.readFileSync(path.join(directory, 'component-inventory.json'), 'utf8'));
|
|
26
|
-
return scanResources(hashes, html, policy);
|
|
27
|
-
}
|
|
28
|
-
function scanResources(hashes, html, policy) {
|
|
29
|
-
const routesMatch = html.match(/id="prototype-offline-routes">([\s\S]*?)<\/script>/);
|
|
30
|
-
assert.ok(routesMatch, 'Template inventory requires explicit offline routes');
|
|
31
|
-
const routes = JSON.parse(routesMatch[1]);
|
|
32
|
-
assert.equal(policy.schemaVersion, 1, 'Unsupported component inventory classification');
|
|
33
|
-
const fragments = [], components = {}, unknownComponents = new Set(); let eventCount = 0;
|
|
34
|
-
for (const match of html.matchAll(/^<template data-source="([^"]+)">\n([\s\S]*?)^<\/template>/gm)) {
|
|
35
|
-
const file = match[1], content = match[2], nodes = [];
|
|
36
|
-
assert.ok(!fragments.some(fragment => fragment.file === file), `Duplicate HTML fragment: ${file}`);
|
|
37
|
-
const cleaned = content.replace(/<!--[\s\S]*?-->/g, text => ' '.repeat(text.length));
|
|
38
|
-
for (const token of cleaned.matchAll(/<([a-zA-Z][\w:.-]*)(\s(?:[^"'<>]|"[^"]*"|'[^']*')*)?\s*\/?\s*>/g)) {
|
|
39
|
-
const attrs = attributes(token[2] || ''), node = { id: `${file}#${nodes.length + 1}`, tag: token[1], attributes: attrs };
|
|
40
|
-
nodes.push(node);
|
|
41
|
-
eventCount += Object.keys(attrs).filter(key => key.startsWith('data-on-')).length;
|
|
42
|
-
const component = attrs['data-component'];
|
|
43
|
-
if (!component) continue;
|
|
44
|
-
const classification = policy.components?.[component];
|
|
45
|
-
if (!classification) unknownComponents.add(component);
|
|
46
|
-
else {
|
|
47
|
-
assert.ok(['framework', 'business-reference', 'icon', 'router', 'dynamic'].includes(classification.kind), `Unknown classification: ${component}`);
|
|
48
|
-
assert.ok(Array.isArray(classification.capabilities), `Missing semantic classification: ${component}`);
|
|
49
|
-
if (classification.source) assert.ok(fragments.some(item => item.file === classification.source) || html.includes(`<template data-source="${classification.source}">`), `Missing component source: ${component}`);
|
|
50
|
-
}
|
|
51
|
-
components[component] ||= { classification: classification || null, occurrences: [] };
|
|
52
|
-
components[component].occurrences.push(node.id);
|
|
53
|
-
}
|
|
54
|
-
fragments.push({ file, digest: digest(content), nodes });
|
|
55
|
-
}
|
|
56
|
-
assert.ok(fragments.length, 'Template inventory requires editable fragments');
|
|
57
|
-
assert.equal(unknownComponents.size, 0, `Unclassified template components: ${[...unknownComponents].join(', ')}`);
|
|
58
|
-
const pages = [...new Set(routes.map(route => route.component).filter(Boolean))].map(component => {
|
|
59
|
-
const fragment = 'reference/' + component.replace(/^\.\//, '').replace(/\.js$/, '.html');
|
|
60
|
-
assert.ok(fragments.some(item => item.file === fragment), `Route has no editable HTML: ${component}`);
|
|
61
|
-
return { component, fragment, routes: routes.filter(route => route.component === component).map(route => route.path) };
|
|
62
|
-
});
|
|
63
|
-
return { schemaVersion: 1, files: hashes, routes, pages, fragments, components, eventCount, unknownComponents: [] };
|
|
64
|
-
}
|
|
65
|
-
function verify(directory, inventory) {
|
|
66
|
-
assert.deepEqual(scan(directory), inventory, 'Template inventory changed; review every source/component/interaction difference and regenerate the inventory');
|
|
67
|
-
return { status: 'passed', files: Object.keys(inventory.files).length, routes: inventory.routes.length, pages: inventory.pages.length, fragments: inventory.fragments.length, components: Object.keys(inventory.components).length, events: inventory.eventCount };
|
|
68
|
-
}
|
|
69
|
-
function verifySnapshot(snapshot) {
|
|
70
|
-
const resources = new Map(snapshot.files.map(file => [file.path, Buffer.from(file.content, 'base64')]));
|
|
71
|
-
assert.equal(resources.size, snapshot.files.length, 'Duplicate template snapshot resource');
|
|
72
|
-
const hashes = Object.fromEntries([...resources].filter(([file]) => !ignored.has(file)).map(([file, content]) => [file, digest(content)]));
|
|
73
|
-
const expected = JSON.parse(resources.get('template-inventory.json').toString('utf8'));
|
|
74
|
-
const actual = scanResources(hashes, resources.get('index.html').toString('utf8'), JSON.parse(resources.get('component-inventory.json').toString('utf8')));
|
|
75
|
-
assert.deepEqual(actual, expected, 'Template snapshot inventory differs from actual sources/components/events');
|
|
76
|
-
return actual;
|
|
77
|
-
}
|
|
78
|
-
module.exports = { scan, verify, verifySnapshot };
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const REQUIRED = ['operation', 'status', 'executionMode', 'prototypeId', 'revision',
|
|
4
|
-
'candidateDigest', 'summary', 'checks', 'delivery', 'openItems'];
|
|
5
|
-
const OPERATIONS = ['analyze', 'create', 'revise', 'inspect', 'confirm-baseline'];
|
|
6
|
-
const MODES = ['inline', 'delegated'];
|
|
7
|
-
const MARKER = 'PROTOTYPE_RESULT_V1';
|
|
8
|
-
const object = value => value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
9
|
-
const text = value => typeof value === 'string' && value.trim().length > 0;
|
|
10
|
-
|
|
11
|
-
function options(args) {
|
|
12
|
-
const result = { runtime: 'native' };
|
|
13
|
-
for (let index = 0; index < args.length; index++) {
|
|
14
|
-
const flag = args[index];
|
|
15
|
-
if (flag === '--check-return') { result.checkReturn = true; continue; }
|
|
16
|
-
if (!['--expected-operation', '--expected-mode', '--runtime'].includes(flag)) throw new Error(`Unexpected option: ${flag}`);
|
|
17
|
-
const value = args[++index];
|
|
18
|
-
if (!value || value.startsWith('--')) throw new Error(`${flag} requires a value`);
|
|
19
|
-
result[flag.slice(2)] = value;
|
|
20
|
-
}
|
|
21
|
-
if (!OPERATIONS.includes(result['expected-operation'])) throw new Error('--expected-operation must be analyze, create, revise, inspect or confirm-baseline');
|
|
22
|
-
if (!MODES.includes(result['expected-mode'])) throw new Error('--expected-mode must be inline or delegated, from the actual entry handoff');
|
|
23
|
-
if (!['native', 'legacy'].includes(result.runtime)) throw new Error('--runtime must be native or legacy, from existing artifact metadata');
|
|
24
|
-
return result;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function validate(value, expected) {
|
|
28
|
-
if (!object(value)) throw new Error('Result must be a JSON object');
|
|
29
|
-
const errors = [];
|
|
30
|
-
for (const field of REQUIRED) if (!Object.hasOwn(value, field)) errors.push(`${field}: required field is missing`);
|
|
31
|
-
if (!OPERATIONS.includes(value.operation)) errors.push('operation: unsupported operation');
|
|
32
|
-
else if (value.operation !== expected['expected-operation']) errors.push(`operation: expected ${expected['expected-operation']}, received ${value.operation}`);
|
|
33
|
-
if (!['complete', 'partial', 'blocked'].includes(value.status)) errors.push('status: expected complete, partial or blocked');
|
|
34
|
-
if (!MODES.includes(value.executionMode)) errors.push('executionMode: expected inline or delegated');
|
|
35
|
-
else if (value.executionMode !== expected['expected-mode']) errors.push(`executionMode: expected ${expected['expected-mode']}, received ${value.executionMode}`);
|
|
36
|
-
if (!text(value.summary)) errors.push('summary: a non-empty string is required');
|
|
37
|
-
if (!Array.isArray(value.openItems)) errors.push('openItems: an array is required');
|
|
38
|
-
else value.openItems.forEach((item, index) => { if (!text(item)) errors.push(`openItems[${index}]: a non-empty string is required`); });
|
|
39
|
-
|
|
40
|
-
if (!Array.isArray(value.checks) || value.checks.length === 0) errors.push('checks: a non-empty array is required');
|
|
41
|
-
else value.checks.forEach((check, index) => {
|
|
42
|
-
const at = `checks[${index}]`;
|
|
43
|
-
if (!object(check)) { errors.push(`${at}: an object is required`); return; }
|
|
44
|
-
if (!text(check.name)) errors.push(`${at}.name: a non-empty string is required`);
|
|
45
|
-
if (!['passed', 'failed', 'not-run'].includes(check.status)) errors.push(`${at}.status: expected passed, failed or not-run (result is not a status alias)`);
|
|
46
|
-
if (!text(check.evidence)) errors.push(`${at}.evidence: a non-empty evidence locator or analysis explanation is required`);
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
for (const field of ['prototypeId', 'revision', 'candidateDigest']) {
|
|
50
|
-
if (value[field] !== null && !text(value[field])) errors.push(`${field}: expected null or a non-empty string`);
|
|
51
|
-
}
|
|
52
|
-
const allPresent = ['prototypeId', 'revision', 'candidateDigest'].every(field => text(value[field]));
|
|
53
|
-
if ((value.revision === null) !== (value.candidateDigest === null)) errors.push('identity: revision and candidateDigest must be a pair, without inventing an uncreated version');
|
|
54
|
-
if ((text(value.revision) || text(value.candidateDigest)) && !text(value.prototypeId)) errors.push('identity: revision/candidateDigest require prototypeId');
|
|
55
|
-
if (text(value.candidateDigest) && !/^[a-f0-9]{64}$/.test(value.candidateDigest)) errors.push('candidateDigest: expected the existing lowercase SHA-256 content digest');
|
|
56
|
-
if (value.status === 'complete' && value.operation !== 'analyze' && !allPresent) errors.push('identity: complete create, revise, inspect or confirm-baseline requires prototypeId, revision and candidateDigest');
|
|
57
|
-
|
|
58
|
-
if (value.delivery !== null && !text(value.delivery)) errors.push('delivery: expected null or a non-empty path string');
|
|
59
|
-
if (value.operation === 'analyze' && value.delivery !== null) errors.push('delivery: analyze must use null and must not write a receipt');
|
|
60
|
-
const nativeReceipt = expected.runtime === 'native' && ['create', 'revise'].includes(value.operation);
|
|
61
|
-
if (nativeReceipt && value.status === 'complete' && !text(value.delivery)) errors.push('delivery: complete native create/revise requires the current qa/delivery.json path');
|
|
62
|
-
if (expected.runtime === 'native' && text(value.delivery)
|
|
63
|
-
&& (!/(?:^|[\\/])qa[\\/]delivery\.json$/.test(value.delivery) || /[\u0000-\u001f]/.test(value.delivery))) {
|
|
64
|
-
errors.push('delivery: native receipt path must end in qa/delivery.json');
|
|
65
|
-
}
|
|
66
|
-
if (value.status === 'complete' && ['create', 'revise', 'confirm-baseline'].includes(value.operation)
|
|
67
|
-
&& Array.isArray(value.checks) && value.checks.some(check => !object(check) || check.status !== 'passed')) {
|
|
68
|
-
errors.push('checks: complete write operations cannot contain failed or not-run checks');
|
|
69
|
-
}
|
|
70
|
-
if (errors.length) throw new Error(errors.join('\n- '));
|
|
71
|
-
// Keep the established fields in one order while retaining optional context.
|
|
72
|
-
return Object.fromEntries([...REQUIRED, ...Object.keys(value).filter(field => !REQUIRED.includes(field)).sort()]
|
|
73
|
-
.map(field => [field, value[field]]));
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
function originalResult(input) {
|
|
77
|
-
if (/<\/?(?:tool_call|arg_key|arg_value|function_calls?|invoke)(?:[:>\s])/i.test(input)) {
|
|
78
|
-
throw new Error('Original reply contains tool protocol text instead of a final result');
|
|
79
|
-
}
|
|
80
|
-
// CodeBuddy Code 2.168.2 appends this host note to Agent tool results.
|
|
81
|
-
// Accept only that terminal UUID form; other trailing content stays invalid.
|
|
82
|
-
const original = input.replace(/\r?\n\r?\n\[Agent ID: agent-[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}\][ \t\r\n]*$/, '');
|
|
83
|
-
const lines = original.split(/\r?\n/);
|
|
84
|
-
const markers = lines.map((line, index) => line === MARKER ? index : -1).filter(index => index >= 0);
|
|
85
|
-
if (markers.length !== 1) throw new Error(`Original reply requires one separate exact marker line ${MARKER}; found ${markers.length}`);
|
|
86
|
-
const at = markers[0];
|
|
87
|
-
if (!text(lines.slice(0, at).join('\n'))) throw new Error('Original reply requires a separate natural-language outcome before the marker');
|
|
88
|
-
let json = lines.slice(at + 1).join('\n').trim();
|
|
89
|
-
if (json.startsWith('```')) {
|
|
90
|
-
const fenced = json.match(/^```(?:json)?[ \t]*\n([\s\S]*?)\n```[ \t]*$/);
|
|
91
|
-
if (!fenced) throw new Error('JSON fence must contain one JSON value with no trailing content');
|
|
92
|
-
json = fenced[1];
|
|
93
|
-
}
|
|
94
|
-
return json;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
async function main() {
|
|
98
|
-
const expected = options(process.argv.slice(2));
|
|
99
|
-
let input = '';
|
|
100
|
-
process.stdin.setEncoding('utf8');
|
|
101
|
-
for await (const chunk of process.stdin) {
|
|
102
|
-
input += chunk;
|
|
103
|
-
if (Buffer.byteLength(input, 'utf8') > 1024 * 1024) throw new Error('JSON input exceeds 1 MiB');
|
|
104
|
-
}
|
|
105
|
-
let value;
|
|
106
|
-
try { value = JSON.parse(expected.checkReturn ? originalResult(input) : input); }
|
|
107
|
-
catch (error) { throw new Error(`JSON: ${error.message}`); }
|
|
108
|
-
const canonical = validate(value, expected);
|
|
109
|
-
process.stdout.write(`${MARKER}\n${JSON.stringify(canonical, null, 2)}\n`);
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
if (require.main === module) main().catch(error => {
|
|
113
|
-
process.stderr.write(`Invalid prototype result:\n- ${error.message}\n`);
|
|
114
|
-
process.exitCode = 1;
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
module.exports = { validate, options, REQUIRED, MARKER };
|