@givolt/i3-composer-agent 2.2.3 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/plugins/marketplace.json +1 -1
- package/.claude/commands/i3-prototype.md +23 -0
- package/.claude/commands/i3-review.md +1 -1
- package/.claude/commands/i3-ship.md +1 -1
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +2 -2
- package/.gemini/commands/i3-prototype.toml +23 -0
- package/.gemini/commands/i3-review.toml +1 -1
- package/.gemini/commands/i3-ship.toml +1 -1
- package/README.md +15 -5
- package/agents/code-reviewer.md +1 -1
- package/agents/test-engineer.md +1 -1
- package/bin/native-layout.cjs +2 -0
- package/commands/i3-prototype.toml +23 -0
- package/commands/i3-review.toml +1 -1
- package/commands/i3-ship.toml +1 -1
- package/docs/agents.md +2 -2
- package/docs/codebuddy-setup.md +2 -2
- package/docs/codex-setup.md +1 -1
- package/docs/copilot-setup.md +4 -0
- package/docs/cursor-setup.md +3 -0
- package/docs/other-hosts.md +44 -9
- package/docs/workbuddy-setup.md +2 -2
- package/evals/README.md +2 -0
- package/evals/cases/i3-documentation-and-adrs.json +18 -0
- package/evals/cases/i3-test-driven-development.json +8 -0
- package/evals/cases/i3-ui-prototype.json +49 -0
- package/evals/fixtures/i3-documentation-and-adrs/prose-review/README.md +19 -0
- package/evals/fixtures/i3-documentation-and-adrs/prose-review/queue.js +32 -0
- package/evals/fixtures/i3-ui-prototype/business-brief.md +7 -0
- package/evals/plugin/tdd-fires-on-pasted-bug/graders/failing-test-first.md +7 -0
- package/evals/plugin/tdd-fires-on-pasted-bug/graders/skill-fired.md +5 -0
- package/evals/plugin/tdd-fires-on-pasted-bug/prompt.md +15 -0
- package/evals/plugin/tdd-stays-quiet-on-debug/graders/not-fired.md +8 -0
- package/evals/plugin/tdd-stays-quiet-on-debug/prompt.md +25 -0
- package/evals/zh-CN/cases/i3-documentation-and-adrs.json +19 -0
- package/evals/zh-CN/cases/i3-test-driven-development.json +4 -0
- package/evals/zh-CN/cases/i3-ui-prototype.json +50 -0
- package/hooks/SIMPLIFY-IGNORE.md +3 -2
- package/hooks/simplify-ignore-test.sh +93 -1
- package/hooks/simplify-ignore.sh +94 -11
- package/package.json +27 -1
- package/plugin.json +1 -1
- package/references/performance-checklist.md +4 -2
- package/scripts/enterprise-template-test.js +139 -0
- package/scripts/lib/skill-lint-test.js +113 -1
- package/scripts/lib/skill-lint.js +62 -8
- package/scripts/run-evals-test.js +207 -0
- package/scripts/run-evals.js +47 -9
- package/scripts/template-adapter-test.js +155 -0
- package/scripts/ui-prototype-test.js +114 -0
- package/scripts/validate-commands-test.js +30 -0
- package/scripts/validate-commands.js +6 -16
- package/scripts/validate-reference-links-test.js +18 -0
- package/scripts/validate-reference-links.js +4 -2
- package/scripts/validate-skills.js +26 -3
- package/skills/i3-documentation-and-adrs/SKILL.md +9 -0
- package/skills/i3-frontend-ui-engineering/SKILL.md +5 -1
- package/skills/i3-idea-refine/SKILL.md +20 -5
- package/skills/i3-incremental-implementation/SKILL.md +4 -0
- package/skills/i3-performance-optimization/SKILL.md +10 -10
- package/skills/i3-security-and-hardening/references/hardening-patterns.md +1 -1
- package/skills/i3-shipping-and-launch/SKILL.md +6 -0
- package/skills/i3-test-driven-development/SKILL.md +3 -3
- package/skills/i3-ui-prototype/SKILL.md +119 -0
- package/skills/i3-ui-prototype/assets/templates/catalog.json +147 -0
- package/skills/i3-ui-prototype/assets/templates/classic-admin/manifest.json +9 -0
- package/skills/i3-ui-prototype/assets/templates/classic-admin/preset.json +6 -0
- package/skills/i3-ui-prototype/assets/templates/common/app/app.mjs +89 -0
- package/skills/i3-ui-prototype/assets/templates/common/app/config.json +1 -0
- package/skills/i3-ui-prototype/assets/templates/common/app/domain.mjs +20 -0
- package/skills/i3-ui-prototype/assets/templates/common/app/index.html +17 -0
- package/skills/i3-ui-prototype/assets/templates/common/app/serve.cjs +16 -0
- package/skills/i3-ui-prototype/assets/templates/common/app/styles.css +670 -0
- package/skills/i3-ui-prototype/assets/templates/common/app/tokens.css +19 -0
- package/skills/i3-ui-prototype/assets/templates/common/design-system/master.md +20 -0
- package/skills/i3-ui-prototype/assets/templates/common/gallery.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/common/mocks/applications.json +5 -0
- package/skills/i3-ui-prototype/assets/templates/common/requirements-map.json +8 -0
- package/skills/i3-ui-prototype/assets/templates/common/serve-gallery.cjs +16 -0
- package/skills/i3-ui-prototype/assets/templates/credits.md +17 -0
- package/skills/i3-ui-prototype/assets/templates/data-operations/manifest.json +9 -0
- package/skills/i3-ui-prototype/assets/templates/data-operations/preset.json +6 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/design-system.md +32 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/index.html +29 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/manifest.json +9 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/origin.json +344 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/preset.json +928 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/app.js +22 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/empty.svg +1 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/reference-styles.json +1 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/result-403.svg +1 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets/result-404.svg +1 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/assets-manifest.json +334 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/baseline.json +173 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/conversion.md +30 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/credits.md +17 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/design-tokens.json +881 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/index.html +28 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/licenses/@qin-ui-antdv-next-pro.txt +9 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/licenses/ant-design-icons.txt +22 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/licenses/antdv-next.txt +21 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/package.json +12 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/browser-routes.json +298 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/coverage.json +180 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/integrity.json +13 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/keyboard.json +11 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/responsive.json +125 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/review.md +51 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/rules.log +150 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/flow-editor-html.png +0 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/flow-editor-original.png +0 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/intent-create-html.png +0 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/intent-create-original.png +0 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/models-html.png +0 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/models-original.png +0 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/workbench-html.png +0 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/screenshots/workbench-original.png +0 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/selection.json +9 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/qa/visual-comparison.json +342 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/readme.md +73 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/reference.md +59 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/routes.json +178 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/controls.js +99 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/dialogs.js +54 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/dom.js +264 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/forms.js +47 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/icons.js +41 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/layout.js +47 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/router.js +63 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/state.js +90 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/table.js +41 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/runtime/widgets.js +8 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentDetail.html +3 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentDetail.js +36 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentEditor.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentEditor.js +51 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentsPage.html +3 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/AgentsPage.js +48 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/CheckResults.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/CheckResults.js +6 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/ResourcePicker.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/ResourcePicker.js +13 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/data.js +24 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/domain.js +32 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/registry.js +25 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/agents/store.js +85 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentClose.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentClose.js +17 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentCreate.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentCreate.js +66 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDecisions.html +3 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDecisions.js +38 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDetail.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDetail.js +66 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDocument.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentDocument.js +5 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHeader.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHeader.js +12 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHistory.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentHistory.js +11 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentList.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentList.js +116 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentReplan.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentReplan.js +32 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentRevision.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentRevision.js +49 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentSummary.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentSummary.js +10 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentWorkspace.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/IntentWorkspace.js +77 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/data.js +60 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/domain.js +105 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/intents/store.js +212 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/AuditPanel.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/AuditPanel.js +18 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelDetail.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelDetail.js +23 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelEditor.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelEditor.js +78 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelGrant.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelGrant.js +55 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelReferences.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelReferences.js +26 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelRelease.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelRelease.js +38 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelStatus.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelStatus.js +7 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTable.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTable.js +72 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTester.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelTester.js +46 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelsPage.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/ModelsPage.js +52 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/RowActions.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/RowActions.js +19 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/UsagePanel.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/UsagePanel.js +30 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/data.js +48 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/domain.js +39 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/models/store.js +129 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IncidentDetail.html +4 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IncidentDetail.js +21 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IntentSource.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/IntentSource.js +8 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationActionDialog.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationActionDialog.js +37 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationEntry.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationEntry.js +10 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationsPage.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/OperationsPage.js +37 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RepairTrack.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RepairTrack.js +49 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RunDetail.html +4 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/RunDetail.js +22 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/SourceSummary.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/SourceSummary.js +9 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/commands.js +82 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/examples.js +47 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/model.js +61 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/repair.js +68 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/store.js +55 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/types.js +1 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/operations/workbench.js +18 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ManagementTable.html +3 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ManagementTable.js +28 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcCreateEntry.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcCreateEntry.js +18 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcDetail.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcDetail.js +31 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcEditor.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcEditor.js +27 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcLifecycle.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcLifecycle.js +16 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPage.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPage.js +43 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPicker.html +4 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcPicker.js +34 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcProgress.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcProgress.js +30 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWizard.html +3 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWizard.js +67 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWorkspace.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcWorkspace.js +41 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcsPage.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/PbcsPage.js +31 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceEditor.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceEditor.js +26 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceList.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/ServiceList.js +70 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/data.js +8 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/domain.js +62 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/management.js +36 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/managementStore.js +49 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/pbc/store.js +132 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/AdminList.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/AdminList.js +38 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/EffectiveGrants.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/EffectiveGrants.js +11 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/GrantEditor.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/GrantEditor.js +45 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MemberEditor.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MemberEditor.js +54 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MembersPage.html +3 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/MembersPage.js +27 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RecordsPage.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RecordsPage.js +12 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RoleEditor.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RoleEditor.js +45 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RolesPage.html +3 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/RolesPage.js +38 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/domain.js +61 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/state.js +51 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/permissions/store.js +116 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseActionDialog.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseActionDialog.js +45 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseDetail.html +4 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseDetail.js +30 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseEditor.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseEditor.js +67 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseExecution.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleaseExecution.js +5 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleasesPage.html +4 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/ReleasesPage.js +60 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/commands.js +157 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/model.js +136 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/releases/store.js +76 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewDetail.html +3 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewDetail.js +26 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewEvidence.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewEvidence.js +14 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewProcess.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewProcess.js +113 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewsPage.html +3 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/ReviewsPage.js +62 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/commands.js +97 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/model.js +147 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/reviews/store.js +13 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ColumnSettings.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ColumnSettings.js +9 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListBatchBar.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListBatchBar.js +8 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListDeleteDialog.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListDeleteDialog.js +37 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListMore.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/ListMore.js +8 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/RecordMetadata.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/RecordMetadata.js +17 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/columns.js +32 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/deliveryGuide.js +49 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/deliveryView.js +12 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/listBatch.js +15 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/listSelection.js +37 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/policy.js +68 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shared/session.js +44 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConfirmationDialog.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConfirmationDialog.js +25 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConsoleShell.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ConsoleShell.js +53 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/PrototypeGuide.html +10 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/PrototypeGuide.js +30 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ScopePage.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/ScopePage.js +10 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/SessionDialog.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/SessionDialog.js +9 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/confirmation.js +3 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/shell/navigation.js +19 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecDocument.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecDocument.js +8 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecEdit.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecEdit.js +32 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHeader.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHeader.js +15 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHistory.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecHistory.js +11 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecReview.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecReview.js +57 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecWorkspace.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/SpecWorkspace.js +37 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/data.js +20 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/domain.js +55 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/specs/store.js +151 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/ArtifactDetail.html +3 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/ArtifactDetail.js +18 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskCreate.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskCreate.js +40 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskDetail.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskDetail.js +51 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskLaunch.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TaskLaunch.js +9 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TasksPage.html +5 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/TasksPage.js +48 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/domain.js +204 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/exampleSource.js +22 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/registry.js +135 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/tasks/store.js +137 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/WorkbenchPage.html +3 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/WorkbenchPage.js +36 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/model.js +56 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workbench/store.js +15 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowCanvas.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowCanvas.js +27 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowDetail.html +4 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowDetail.js +31 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowEditor.html +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/FlowEditor.js +68 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/WorkflowsPage.html +5 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/WorkflowsPage.js +55 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/data.js +16 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/domain.js +83 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/registry.js +18 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/src/workflows/store.js +61 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/admin.css +60 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/agents.css +46 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/antdv.css +295 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/app.css +102 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/delivery.css +4 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/intents.css +37 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/native.css +22 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/operations.css +2 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/pbc.css +3 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/permissions.css +22 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/pro.css +1 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/releases.css +4 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/reset.css +246 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/reviews.css +8 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/tasks.css +6 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/tokens.css +15 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/workbench.css +61 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/styles/workflows.css +1 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/admin-rules.test.js +96 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/agents.test.js +14 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/intent-state.test.js +37 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/list-batch.test.js +44 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/operation-fixtures.js +19 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/operation-repair.test.js +14 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/operations.test.js +25 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/pbc-management.test.js +17 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/pbc-state.test.js +24 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/permission-config.test.js +23 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/permissions.test.js +24 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/releases.test.js +50 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/reviews.test.js +36 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/runtime-forms-router.test.js +28 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/runtime-state.test.js +42 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/runtime-stores.test.js +16 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/spec-state.test.js +11 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/tasks.test.js +27 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/workbench.test.js +34 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tests/workflows.test.js +16 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/convert.mjs +168 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/serve.mjs +7 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/styles.mjs +11 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/reference/tools/verify.mjs +24 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/serve.cjs +16 -0
- package/skills/i3-ui-prototype/assets/templates/enterprise-admin/usability.css +44 -0
- package/skills/i3-ui-prototype/assets/templates/gallery/index.html +40 -0
- package/skills/i3-ui-prototype/assets/templates/modern-workspace/manifest.json +9 -0
- package/skills/i3-ui-prototype/assets/templates/modern-workspace/preset.json +6 -0
- package/skills/i3-ui-prototype/assets/templates/serve-gallery.cjs +16 -0
- package/skills/i3-ui-prototype/references/artifact-contract.md +41 -0
- package/skills/i3-ui-prototype/references/enterprise-admin.md +38 -0
- package/skills/i3-ui-prototype/references/expert-adapter.md +42 -0
- package/skills/i3-ui-prototype/references/template-adapters.md +57 -0
- package/skills/i3-ui-prototype/references/workflow-contract.md +19 -0
- package/skills/i3-ui-prototype/scripts/adapters/easel-html.cjs +30 -0
- package/skills/i3-ui-prototype/scripts/adapters/legacy-html.cjs +28 -0
- package/skills/i3-ui-prototype/scripts/check-design-provider.cjs +9 -0
- package/skills/i3-ui-prototype/scripts/check-prototype.cjs +14 -0
- package/skills/i3-ui-prototype/scripts/enterprise-template.cjs +88 -0
- package/skills/i3-ui-prototype/scripts/init-prototype.cjs +8 -0
- package/skills/i3-ui-prototype/scripts/manage-baseline.cjs +11 -0
- package/skills/i3-ui-prototype/scripts/prototype-lib.cjs +255 -0
- package/skills/i3-ui-prototype/scripts/template-adapters.cjs +89 -0
- package/skills/i3-using-agent-skills/SKILL.md +5 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const test = require('node:test');
|
|
3
|
+
const assert = require('node:assert/strict');
|
|
4
|
+
const fs = require('node:fs');
|
|
5
|
+
const path = require('node:path');
|
|
6
|
+
const os = require('node:os');
|
|
7
|
+
const crypto = require('node:crypto');
|
|
8
|
+
const { spawn, spawnSync } = require('node:child_process');
|
|
9
|
+
const install = path.join(__dirname, 'lib/installation.js');
|
|
10
|
+
const skills = fs.existsSync(install) ? require(install).loadInstallation().skillsDirectory : path.resolve(__dirname, '../skills');
|
|
11
|
+
const skill = path.join(skills, 'i3-ui-prototype');
|
|
12
|
+
const lib = require(path.join(skill, 'scripts/prototype-lib.cjs'));
|
|
13
|
+
const read = (root, file) => JSON.parse(fs.readFileSync(path.join(root, file), 'utf8'));
|
|
14
|
+
function project(t) {
|
|
15
|
+
const root = fs.mkdtempSync(path.join(os.tmpdir(), 'enterprise-template-'));
|
|
16
|
+
t.after(() => fs.rmSync(root, { recursive: true, force: true }));
|
|
17
|
+
return root;
|
|
18
|
+
}
|
|
19
|
+
function initialize(t, options = {}) {
|
|
20
|
+
return lib.initPrototype({ project: project(t), id: 'enterprise-demo', expertMode: 'template', purpose: 'template-review', ...options }).directory;
|
|
21
|
+
}
|
|
22
|
+
test('four prototype families expose the EASEL enterprise template and explicitly defer the other three', () => {
|
|
23
|
+
const entries = lib.listTemplates();
|
|
24
|
+
assert.deepEqual(entries.map(x => x.id), ['enterprise-admin', 'ai-workbench', 'digital-twin', 'mobile-app']);
|
|
25
|
+
assert.deepEqual(entries.filter(x => x.availability === 'available').map(x => x.id), ['enterprise-admin']);
|
|
26
|
+
for (const entry of entries.slice(1)) assert.equal(entry.availability, 'planned');
|
|
27
|
+
});
|
|
28
|
+
test('default enterprise initializer preserves the complete EASEL runtime and its review scope', t => {
|
|
29
|
+
const dir = initialize(t), metadata = read(dir, 'prototype.json');
|
|
30
|
+
assert.equal(metadata.template.id, 'enterprise-admin');
|
|
31
|
+
assert.equal(metadata.purpose, 'template-review');
|
|
32
|
+
assert.equal(metadata.review.status, 'pending-review');
|
|
33
|
+
const inspection = lib.checkPrototype(dir);
|
|
34
|
+
assert.equal(inspection.status, 'passed', JSON.stringify(inspection));
|
|
35
|
+
const routes = read(dir, 'app/routes.json').filter(x => x.component && !x.path.startsWith('/module/'));
|
|
36
|
+
assert.equal(routes.length, 37);
|
|
37
|
+
assert.equal(new Set(routes.map(x => x.component)).size, 34);
|
|
38
|
+
for (const file of ['app/runtime/dom.js', 'app/styles/antdv.css', 'app/src/shell/ConsoleShell.html', 'app/licenses/antdv-next.txt', 'design-system/source.json']) {
|
|
39
|
+
assert.ok(fs.existsSync(path.join(dir, file)), file);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
test('planned template families refuse initialization without silently generating a desktop demo', t => {
|
|
43
|
+
const root = project(t);
|
|
44
|
+
for (const template of ['ai-workbench', 'digital-twin', 'mobile-app']) {
|
|
45
|
+
assert.throws(() => lib.initPrototype({ project: root, id: template, template, expertMode: 'template' }), /planned|尚未|待建设/);
|
|
46
|
+
}
|
|
47
|
+
assert.equal(fs.existsSync(path.join(root, 'prototypes')), false);
|
|
48
|
+
});
|
|
49
|
+
test('all imported reference files retain their declared source hashes', () => {
|
|
50
|
+
const origin = read(skill, 'assets/templates/enterprise-admin/origin.json');
|
|
51
|
+
assert.equal(Object.keys(origin.files).length, 326);
|
|
52
|
+
for (const [file, expected] of Object.entries(origin.files)) {
|
|
53
|
+
const contents = fs.readFileSync(path.join(skill, 'assets/templates/enterprise-admin/reference', origin.storagePaths?.[file] || file));
|
|
54
|
+
assert.equal(crypto.createHash('sha256').update(contents).digest('hex'), expected, file);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
test('an unadapted EASEL example cannot pass new-business acceptance', t => {
|
|
58
|
+
const dir = initialize(t, { purpose: 'business-prototype' });
|
|
59
|
+
assert.equal(read(dir, 'prototype.json').business.status, 'needs-adaptation');
|
|
60
|
+
assert.match(lib.checkPrototype(dir, { acceptance: true }).errors.join(' '), /业务|adapt/);
|
|
61
|
+
});
|
|
62
|
+
test('generated enterprise instances isolate their local demo storage and retain the original route behavior', t => {
|
|
63
|
+
const dir = initialize(t);
|
|
64
|
+
const source = fs.readFileSync(path.join(dir, 'app/src/shared/session.js'), 'utf8');
|
|
65
|
+
assert.match(source, /i3-enterprise-enterprise-demo-/);
|
|
66
|
+
assert.doesNotMatch(source, /i3-prototype-antdv-/);
|
|
67
|
+
assert.match(fs.readFileSync(path.join(dir, 'app/index.html'), 'utf8'), /enterprise-bootstrap\.mjs/);
|
|
68
|
+
assert.match(fs.readFileSync(path.join(dir, 'app/index.html'), 'utf8'), /tokens\.css/);
|
|
69
|
+
const other = initialize(t);
|
|
70
|
+
assert.notEqual(read(dir, 'prototype.json').runtime.storagePrefix, read(other, 'prototype.json').runtime.storagePrefix);
|
|
71
|
+
});
|
|
72
|
+
test('missing enterprise runtime imports are rejected while declarative data-bind attributes remain valid', t => {
|
|
73
|
+
const dir = initialize(t);
|
|
74
|
+
assert.equal(lib.checkPrototype(dir).status, 'passed');
|
|
75
|
+
fs.unlinkSync(path.join(dir, 'app/runtime/controls.js'));
|
|
76
|
+
const result = lib.checkPrototype(dir);
|
|
77
|
+
assert.equal(result.status, 'failed');
|
|
78
|
+
assert.match(result.errors.join(' '), /controls\.js/);
|
|
79
|
+
});
|
|
80
|
+
test('tampered template source assets are rejected before a new instance can be trusted', t => {
|
|
81
|
+
const temp = project(t);
|
|
82
|
+
const copy = path.join(temp, 'enterprise-admin');
|
|
83
|
+
fs.cpSync(path.join(skill, 'assets/templates/enterprise-admin'), copy, { recursive: true });
|
|
84
|
+
fs.appendFileSync(path.join(copy, 'reference/styles/app.css'), '\n/* unexpected source edit */');
|
|
85
|
+
const { verifyReference } = require(path.join(skill, 'scripts/enterprise-template.cjs'));
|
|
86
|
+
assert.throws(() => verifyReference(copy), /integrity|来源完整性/);
|
|
87
|
+
});
|
|
88
|
+
test('enterprise preview serves JavaScript modules and SVG assets with browser-compatible MIME types', async t => {
|
|
89
|
+
const dir = initialize(t);
|
|
90
|
+
const child = spawn(process.execPath, ['app/serve.cjs'], { cwd: dir, stdio: ['ignore', 'pipe', 'pipe'] });
|
|
91
|
+
t.after(() => child.kill());
|
|
92
|
+
const url = await new Promise((resolve, reject) => {
|
|
93
|
+
const timer = setTimeout(() => reject(new Error('Preview start timed out')), 5000);
|
|
94
|
+
child.stdout.on('data', data => { const match = data.toString().match(/http:\/\/127\.0\.0\.1:\d+\//); if (match) { clearTimeout(timer); resolve(match[0]); } });
|
|
95
|
+
child.once('error', reject);
|
|
96
|
+
});
|
|
97
|
+
const js = await fetch(url + 'app/app.js');
|
|
98
|
+
assert.equal(js.status, 200);
|
|
99
|
+
assert.match(js.headers.get('content-type'), /javascript/);
|
|
100
|
+
const svg = await fetch(url + 'app/assets/empty.svg');
|
|
101
|
+
assert.equal(svg.status, 200);
|
|
102
|
+
assert.match(svg.headers.get('content-type'), /image\/svg\+xml/);
|
|
103
|
+
});
|
|
104
|
+
test('gallery and generated enterprise instances deliver the same scrolling adapter while retaining the complete reference', t => {
|
|
105
|
+
const dir = initialize(t);
|
|
106
|
+
const css = fs.readFileSync(path.join(dir, 'app/usability.css'));
|
|
107
|
+
assert.equal(css.compare(fs.readFileSync(path.join(skill, 'assets/templates/enterprise-admin/usability.css'))), 0);
|
|
108
|
+
assert.match(fs.readFileSync(path.join(dir, 'app/index.html'), 'utf8'), /href="usability\.css"/);
|
|
109
|
+
const preview = lib.listTemplates()[0].preview.split('#')[0];
|
|
110
|
+
const entry = path.join(skill, 'assets/templates', preview);
|
|
111
|
+
assert.notEqual(preview, 'enterprise-admin/reference/index.html');
|
|
112
|
+
const html = fs.readFileSync(entry, 'utf8');
|
|
113
|
+
assert.match(html, /href="usability\.css"/);
|
|
114
|
+
for (const match of html.matchAll(/(?:src|href)="([^"#]+)"/g)) {
|
|
115
|
+
if (match[1].startsWith('data:')) continue;
|
|
116
|
+
assert.ok(fs.existsSync(path.resolve(path.dirname(entry), match[1])), match[1]);
|
|
117
|
+
}
|
|
118
|
+
const { verifyReference } = require(path.join(skill, 'scripts/enterprise-template.cjs'));
|
|
119
|
+
assert.equal(verifyReference().fileCount, 326);
|
|
120
|
+
});
|
|
121
|
+
test('scrolling behavior remains protected after an enterprise baseline is confirmed', t => {
|
|
122
|
+
const dir = initialize(t);
|
|
123
|
+
// Unit fixture only: these records exercise the baseline guard and do not
|
|
124
|
+
// claim real browser execution or human acceptance of a delivered prototype.
|
|
125
|
+
fs.writeFileSync(path.join(dir, 'qa/unit-fixture.txt'), 'UNIT FIXTURE ONLY');
|
|
126
|
+
const manifest = lib.contentManifest(dir);
|
|
127
|
+
const scenarios = new Set(read(dir, 'requirements-map.json').requirements.flatMap(x => x.scenarios));
|
|
128
|
+
fs.writeFileSync(path.join(dir, 'qa/browser.json'), JSON.stringify({
|
|
129
|
+
...manifest, status: 'passed', source: 'UNIT FIXTURE ONLY', consoleErrors: [],
|
|
130
|
+
screenshots: ['qa/unit-fixture.txt'], viewports: [390, 1440],
|
|
131
|
+
journeys: [...scenarios].map(id => ({ id, status: 'passed' })),
|
|
132
|
+
}));
|
|
133
|
+
lib.freezeBaseline(dir, { revision: manifest.revision, digest: manifest.digest, reviewer: 'unit fixture', statement: 'UNIT FIXTURE ONLY', source: 'test fixture' });
|
|
134
|
+
fs.appendFileSync(path.join(dir, 'app/usability.css'), '\n/* changed scrolling behavior */\n');
|
|
135
|
+
assert.ok(lib.compareBaseline(dir).protectedChanges.includes('app/usability.css'));
|
|
136
|
+
const guard = spawnSync(process.execPath, [path.join(skill, 'scripts/check-prototype.cjs'), dir, '--enforce-baseline'], { encoding: 'utf8' });
|
|
137
|
+
assert.equal(guard.status, 1);
|
|
138
|
+
assert.match(guard.stdout, /Design constraints changed/);
|
|
139
|
+
});
|
|
@@ -9,7 +9,7 @@ const fs = require('node:fs');
|
|
|
9
9
|
const os = require('node:os');
|
|
10
10
|
const path = require('node:path');
|
|
11
11
|
|
|
12
|
-
const { lintSkillContent, lintSkillLayout, topLevelFrontmatterKeys } = require('./skill-lint.js');
|
|
12
|
+
const { lintSkillContent, lintSkillLayout, topLevelFrontmatterKeys, parseFrontmatter, frontmatterYamlErrors, lintPersonaContent } = require('./skill-lint.js');
|
|
13
13
|
|
|
14
14
|
const KNOWN = new Set(['alpha', 'beta']);
|
|
15
15
|
|
|
@@ -648,3 +648,115 @@ test('the spec-key check tolerates CRLF frontmatter', () => {
|
|
|
648
648
|
const { errors } = lintSkillContent('alpha', content, KNOWN);
|
|
649
649
|
assert.equal(errors.filter(e => /key 'temperature'/.test(e)).length, 1);
|
|
650
650
|
});
|
|
651
|
+
|
|
652
|
+
test('parseFrontmatter ignores comments and nested metadata keys', () => {
|
|
653
|
+
const content = [
|
|
654
|
+
'---',
|
|
655
|
+
'name: alpha',
|
|
656
|
+
'# note: this is a comment',
|
|
657
|
+
'description: Designs alphas. Use when building one.',
|
|
658
|
+
'metadata:',
|
|
659
|
+
' name: beta',
|
|
660
|
+
' description: Nested details without trigger',
|
|
661
|
+
'---',
|
|
662
|
+
'',
|
|
663
|
+
].join('\n');
|
|
664
|
+
assert.deepEqual(parseFrontmatter(content), {
|
|
665
|
+
name: 'alpha',
|
|
666
|
+
description: 'Designs alphas. Use when building one.',
|
|
667
|
+
metadata: '',
|
|
668
|
+
});
|
|
669
|
+
});
|
|
670
|
+
|
|
671
|
+
test('frontmatterYamlErrors ignores comment lines containing colons or quotes', () => {
|
|
672
|
+
const content = [
|
|
673
|
+
'---',
|
|
674
|
+
'name: alpha',
|
|
675
|
+
'# note: a comment: with a colon and "unclosed quote',
|
|
676
|
+
'description: "Designs alphas. Use when building one."',
|
|
677
|
+
'---',
|
|
678
|
+
'',
|
|
679
|
+
].join('\n');
|
|
680
|
+
assert.deepEqual(frontmatterYamlErrors(content), []);
|
|
681
|
+
});
|
|
682
|
+
|
|
683
|
+
test('a skill with frontmatter comments and nested metadata passes validation', () => {
|
|
684
|
+
const content = withAllSections([
|
|
685
|
+
'---',
|
|
686
|
+
'name: alpha',
|
|
687
|
+
'# Note: keep description up to date: check docs',
|
|
688
|
+
'description: Designs alphas. Use when building one.',
|
|
689
|
+
'metadata:',
|
|
690
|
+
' name: beta',
|
|
691
|
+
' description: Internal notes',
|
|
692
|
+
'---',
|
|
693
|
+
].join('\n'));
|
|
694
|
+
const { errors } = lintSkillContent('alpha', content, KNOWN);
|
|
695
|
+
assert.deepEqual(errors, []);
|
|
696
|
+
});
|
|
697
|
+
|
|
698
|
+
// ─── Personas (agents/<name>.md) ─────────────────────────────────────────────
|
|
699
|
+
//
|
|
700
|
+
// docs/agents.md: same frontmatter format as a skill, name equal to the file
|
|
701
|
+
// stem, and the file ends with a Composition block. Nothing more is checked.
|
|
702
|
+
|
|
703
|
+
function personaFile({ name = 'code-reviewer', description = 'Reviews changes. Use before merging.', body } = {}) {
|
|
704
|
+
const fm = ['---', name === null ? null : `name: ${name}`, description === null ? null : `description: ${description}`, '---']
|
|
705
|
+
.filter(l => l !== null).join('\n');
|
|
706
|
+
return `${fm}\n\n${body ?? '# Persona\n\n## Rules\n\nBe precise.\n\n## Composition\n\n- **Invoke via:** `/ship`.\n'}`;
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
test('a conforming persona produces no errors', () => {
|
|
710
|
+
assert.deepEqual(lintPersonaContent('code-reviewer', personaFile()).errors, []);
|
|
711
|
+
});
|
|
712
|
+
|
|
713
|
+
test('persona: frontmatter name must match the file stem', () => {
|
|
714
|
+
const { errors } = lintPersonaContent('code-reviewer', personaFile({ name: 'reviewer' }));
|
|
715
|
+
assert.equal(errors.length, 1);
|
|
716
|
+
assert.match(errors[0], /name 'reviewer' does not match file name 'code-reviewer'/);
|
|
717
|
+
});
|
|
718
|
+
|
|
719
|
+
test('persona: description is required', () => {
|
|
720
|
+
const { errors } = lintPersonaContent('code-reviewer', personaFile({ description: null }));
|
|
721
|
+
assert.equal(errors.length, 1);
|
|
722
|
+
assert.match(errors[0], /missing required field: 'description'/);
|
|
723
|
+
});
|
|
724
|
+
|
|
725
|
+
test('persona: a missing frontmatter block is reported and nothing else is attempted', () => {
|
|
726
|
+
const { errors } = lintPersonaContent('code-reviewer', '# Persona\n\n## Composition\n');
|
|
727
|
+
assert.equal(errors.length, 1);
|
|
728
|
+
assert.match(errors[0], /Missing or malformed YAML frontmatter/);
|
|
729
|
+
});
|
|
730
|
+
|
|
731
|
+
test('persona: frontmatter a host would reject as YAML is reported', () => {
|
|
732
|
+
const { errors } = lintPersonaContent('code-reviewer', personaFile({ description: 'Reviews: everything. Use before merging.' }));
|
|
733
|
+
assert.equal(errors.length, 1);
|
|
734
|
+
assert.match(errors[0], /Frontmatter line/);
|
|
735
|
+
});
|
|
736
|
+
|
|
737
|
+
test('persona: the Composition section is required', () => {
|
|
738
|
+
const { errors } = lintPersonaContent('code-reviewer', personaFile({ body: '# Persona\n\n## Rules\n\nBe precise.\n' }));
|
|
739
|
+
assert.equal(errors.length, 1);
|
|
740
|
+
assert.match(errors[0], /Missing "## Composition" section/);
|
|
741
|
+
});
|
|
742
|
+
|
|
743
|
+
test('persona: Composition must be the last section', () => {
|
|
744
|
+
const { errors } = lintPersonaContent('code-reviewer', personaFile({
|
|
745
|
+
body: '# Persona\n\n## Composition\n\n- **Invoke via:** `/ship`.\n\n## Output Format\n\nA report.\n',
|
|
746
|
+
}));
|
|
747
|
+
assert.equal(errors.length, 1);
|
|
748
|
+
assert.match(errors[0], /must be the last section, but "## Output Format" follows it/);
|
|
749
|
+
});
|
|
750
|
+
|
|
751
|
+
test('persona: a heading inside a fenced example after Composition is not a later section', () => {
|
|
752
|
+
const body = [
|
|
753
|
+
'# Persona', '', '## Composition', '', '- **Invoke via:** `/ship`. Report in this shape:', '',
|
|
754
|
+
'```markdown', '## Review: [title]', 'Findings…', '```', '',
|
|
755
|
+
].join('\n');
|
|
756
|
+
assert.deepEqual(lintPersonaContent('code-reviewer', personaFile({ body })).errors, []);
|
|
757
|
+
});
|
|
758
|
+
|
|
759
|
+
test('persona: the Composition heading match is case-insensitive and tolerates trailing spaces', () => {
|
|
760
|
+
const body = '# Persona\n\n## composition \n\n- **Invoke via:** `/ship`.\n';
|
|
761
|
+
assert.deepEqual(lintPersonaContent('code-reviewer', personaFile({ body })).errors, []);
|
|
762
|
+
});
|
|
@@ -86,9 +86,7 @@ const REQUIRED_SECTIONS = [
|
|
|
86
86
|
// Every entry must have a documented reason.
|
|
87
87
|
const SECTION_EXEMPT_SKILLS = {
|
|
88
88
|
'i3-using-agent-skills': 'Branded alias of the reviewed upstream meta-skill.',
|
|
89
|
-
'i3-idea-refine': 'Branded alias of the reviewed upstream legacy structure.',
|
|
90
89
|
'using-agent-skills': 'Meta-skill — orchestrates other skills; When-to-Use and Verification are not applicable to a routing document.',
|
|
91
|
-
'idea-refine': 'Legacy structure predating skill-anatomy.md — uses How-It-Works/Usage/Anti-patterns instead of standard headings.',
|
|
92
90
|
};
|
|
93
91
|
|
|
94
92
|
// Regex patterns that indicate an explicit cross-skill reference.
|
|
@@ -186,11 +184,12 @@ function parseFrontmatter(content) {
|
|
|
186
184
|
|
|
187
185
|
const result = {};
|
|
188
186
|
for (const line of match[1].split(/\r?\n/)) {
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
const
|
|
193
|
-
|
|
187
|
+
if (/^\s*#/.test(line)) continue;
|
|
188
|
+
const m = line.match(/^([A-Za-z0-9_-]+)\s*:\s*(.*)$/);
|
|
189
|
+
if (!m) continue;
|
|
190
|
+
const key = m[1];
|
|
191
|
+
const value = m[2].trim().replace(/^['"]|['"]$/g, '');
|
|
192
|
+
result[key] = value;
|
|
194
193
|
}
|
|
195
194
|
return result;
|
|
196
195
|
}
|
|
@@ -236,7 +235,7 @@ function frontmatterYamlErrors(content) {
|
|
|
236
235
|
const lines = match[1].split(/\r?\n/);
|
|
237
236
|
lines.forEach((line, i) => {
|
|
238
237
|
const lineNo = i + 2; // the opening `---` is line 1
|
|
239
|
-
if (!line.trim()) return;
|
|
238
|
+
if (!line.trim() || /^\s*#/.test(line)) return;
|
|
240
239
|
|
|
241
240
|
if (/^[ ]*\t/.test(line)) {
|
|
242
241
|
errors.push(
|
|
@@ -545,6 +544,59 @@ function lintSkillLayout(skillDir) {
|
|
|
545
544
|
return errors;
|
|
546
545
|
}
|
|
547
546
|
|
|
547
|
+
/**
|
|
548
|
+
* Lint a persona file (agents/<name>.md) against the three rules docs/agents.md
|
|
549
|
+
* states for them: frontmatter in the same format as a skill, with `name`
|
|
550
|
+
* equal to the file stem (the name is the `subagent_type` commands spawn) and
|
|
551
|
+
* a `description`; and a closing `## Composition` section. Headings inside
|
|
552
|
+
* fenced blocks are ignored, so an example after Composition does not count as
|
|
553
|
+
* a later section. Pure: no filesystem access. Returns { errors }.
|
|
554
|
+
*/
|
|
555
|
+
function lintPersonaContent(stem, content) {
|
|
556
|
+
const errors = [];
|
|
557
|
+
|
|
558
|
+
const fm = parseFrontmatter(content);
|
|
559
|
+
if (!fm) {
|
|
560
|
+
errors.push('Missing or malformed YAML frontmatter (expected --- block at top of file)');
|
|
561
|
+
return { errors };
|
|
562
|
+
}
|
|
563
|
+
errors.push(...frontmatterYamlErrors(content));
|
|
564
|
+
|
|
565
|
+
if (!fm.name) {
|
|
566
|
+
errors.push("Frontmatter missing required field: 'name'");
|
|
567
|
+
} else if (fm.name !== stem) {
|
|
568
|
+
errors.push(`Frontmatter name '${fm.name}' does not match file name '${stem}' (the name is the subagent_type commands spawn)`);
|
|
569
|
+
}
|
|
570
|
+
if (!fm.description) {
|
|
571
|
+
errors.push("Frontmatter missing required field: 'description'");
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
const headings = [...stripFencedCodeBlocks(content).matchAll(/^## +(.+?)\s*$/gm)].map(m => m[1]);
|
|
575
|
+
const compositionAt = headings.findIndex(h => /^Composition$/i.test(h));
|
|
576
|
+
if (compositionAt === -1) {
|
|
577
|
+
errors.push('Missing "## Composition" section (docs/agents.md: every persona file ends with a Composition block)');
|
|
578
|
+
} else if (compositionAt !== headings.length - 1) {
|
|
579
|
+
errors.push(`"## Composition" must be the last section, but "## ${headings[headings.length - 1]}" follows it`);
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
return { errors };
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
/**
|
|
586
|
+
* Lint a persona by file name: reads agents/<file>, then delegates to
|
|
587
|
+
* lintPersonaContent. Returns { errors }.
|
|
588
|
+
*/
|
|
589
|
+
function lintPersona(fileName, agentsDir) {
|
|
590
|
+
const stem = fileName.replace(/\.md$/, '');
|
|
591
|
+
let content;
|
|
592
|
+
try {
|
|
593
|
+
content = fs.readFileSync(path.join(agentsDir, fileName), 'utf8');
|
|
594
|
+
} catch (err) {
|
|
595
|
+
return { errors: [`Unreadable persona file: ${err.message}`] };
|
|
596
|
+
}
|
|
597
|
+
return lintPersonaContent(stem, content);
|
|
598
|
+
}
|
|
599
|
+
|
|
548
600
|
/**
|
|
549
601
|
* Lint a skill by directory name: reads its SKILL.md, then delegates to
|
|
550
602
|
* lintSkillContent. This is the thin filesystem wrapper the CLI uses.
|
|
@@ -583,4 +635,6 @@ module.exports = {
|
|
|
583
635
|
lintSkillContent,
|
|
584
636
|
lintSkillLayout,
|
|
585
637
|
lintSkill,
|
|
638
|
+
lintPersonaContent,
|
|
639
|
+
lintPersona,
|
|
586
640
|
};
|
|
@@ -56,6 +56,8 @@ function makeSandbox() {
|
|
|
56
56
|
fs.mkdirSync(path.join(root, 'evals', 'cases'), { recursive: true });
|
|
57
57
|
fs.mkdirSync(path.join(root, 'evals', 'fixtures', 'project'), { recursive: true });
|
|
58
58
|
fs.copyFileSync(RUNNER, path.join(root, 'scripts', 'run-evals.js'));
|
|
59
|
+
fs.mkdirSync(path.join(root, 'scripts', 'lib'), { recursive: true });
|
|
60
|
+
fs.copyFileSync(path.join(__dirname, 'lib', 'skill-lint.js'), path.join(root, 'scripts', 'lib', 'skill-lint.js'));
|
|
59
61
|
fs.writeFileSync(path.join(root, 'evals', 'fixtures', 'project', 'context.txt'), 'fixture\n');
|
|
60
62
|
return root;
|
|
61
63
|
}
|
|
@@ -67,6 +69,91 @@ function run(root, args = []) {
|
|
|
67
69
|
});
|
|
68
70
|
}
|
|
69
71
|
|
|
72
|
+
function runBehavioralWithGrading(root, raw) {
|
|
73
|
+
writeSkill(root, 'alpha-skill', 'Handles alpha widgets.');
|
|
74
|
+
const evalCase = completeCase('alpha-skill', 'change alpha widget');
|
|
75
|
+
evalCase.evals = [{ ...behavioralEval([]), kind: 'dialogue' }];
|
|
76
|
+
writeJson(path.join(root, 'evals', 'cases', 'alpha-skill.json'), evalCase);
|
|
77
|
+
const stub = path.join(root, 'stub-claude.cjs');
|
|
78
|
+
fs.writeFileSync(stub, `
|
|
79
|
+
const assert = require('node:assert/strict');
|
|
80
|
+
require('child_process').execFileSync = (command, args) => {
|
|
81
|
+
assert.equal(command, 'claude');
|
|
82
|
+
return args.includes('--output-format')
|
|
83
|
+
? '{"type":"result","result":"done"}\\n'
|
|
84
|
+
: ${JSON.stringify(raw)};
|
|
85
|
+
};
|
|
86
|
+
`);
|
|
87
|
+
return spawnSync(process.execPath, [
|
|
88
|
+
'--require', stub, path.join(root, 'scripts', 'run-evals.js'),
|
|
89
|
+
'--behavioral', 'alpha-skill',
|
|
90
|
+
], { cwd: root, encoding: 'utf8' });
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
for (const passed of [true, false]) {
|
|
94
|
+
for (const evidence of ['', ' \t\r\n', '\u00a0\u2003']) {
|
|
95
|
+
test(`behavioral CLI diagnoses blank evidence for ${passed ? 'passing' : 'failing'} verdict ${JSON.stringify(evidence)}`, () => {
|
|
96
|
+
const root = makeSandbox();
|
|
97
|
+
try {
|
|
98
|
+
const raw = JSON.stringify({
|
|
99
|
+
expectations: [{ id: 1, text: 'check the result', passed, evidence }],
|
|
100
|
+
summary: { passed: Number(passed), failed: Number(!passed), total: 1, pass_rate: Number(passed) },
|
|
101
|
+
});
|
|
102
|
+
const base = path.join(root, 'evals', 'results', 'alpha-skill.eval-1');
|
|
103
|
+
writeJson(`${base}.grading.json`, { stale: true });
|
|
104
|
+
|
|
105
|
+
const result = runBehavioralWithGrading(root, raw);
|
|
106
|
+
|
|
107
|
+
assert.equal(result.status, 1, result.stdout + result.stderr);
|
|
108
|
+
assert.match(result.stdout, /grader returned blank evidence/);
|
|
109
|
+
assert.doesNotMatch(result.stdout, /invalid JSON/);
|
|
110
|
+
assert.match(result.stdout, /raw saved to .*alpha-skill\.eval-1\.grading\.raw\.txt/);
|
|
111
|
+
assert.equal(fs.readFileSync(`${base}.grading.raw.txt`, 'utf8'), raw);
|
|
112
|
+
assert.equal(fs.existsSync(`${base}.grading.json`), false);
|
|
113
|
+
} finally {
|
|
114
|
+
fs.rmSync(root, { recursive: true, force: true });
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
for (const raw of ['not JSON', '{"expectations":', '{"expectations":[]}']) {
|
|
121
|
+
test(`behavioral CLI retains the generic diagnostic for invalid grading ${raw}`, () => {
|
|
122
|
+
const root = makeSandbox();
|
|
123
|
+
try {
|
|
124
|
+
const result = runBehavioralWithGrading(root, raw);
|
|
125
|
+
assert.equal(result.status, 1, result.stdout + result.stderr);
|
|
126
|
+
assert.match(result.stdout, /grader returned invalid JSON/);
|
|
127
|
+
assert.doesNotMatch(result.stdout, /blank evidence/);
|
|
128
|
+
const base = path.join(root, 'evals', 'results', 'alpha-skill.eval-1');
|
|
129
|
+
assert.equal(fs.readFileSync(`${base}.grading.raw.txt`, 'utf8'), raw);
|
|
130
|
+
assert.equal(fs.existsSync(`${base}.grading.json`), false);
|
|
131
|
+
} finally {
|
|
132
|
+
fs.rmSync(root, { recursive: true, force: true });
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
test('behavioral CLI still publishes valid grading without a rejection diagnostic', () => {
|
|
138
|
+
const root = makeSandbox();
|
|
139
|
+
try {
|
|
140
|
+
const evidence = ' observed in the trace ';
|
|
141
|
+
const raw = JSON.stringify({
|
|
142
|
+
expectations: [{ id: 1, text: 'check the result', passed: true, evidence }],
|
|
143
|
+
summary: { passed: 1, failed: 0, total: 1, pass_rate: 1 },
|
|
144
|
+
});
|
|
145
|
+
const result = runBehavioralWithGrading(root, raw);
|
|
146
|
+
assert.equal(result.status, 0, result.stdout + result.stderr);
|
|
147
|
+
assert.doesNotMatch(result.stdout, /grader returned/);
|
|
148
|
+
const base = path.join(root, 'evals', 'results', 'alpha-skill.eval-1');
|
|
149
|
+
const grading = JSON.parse(fs.readFileSync(`${base}.grading.json`, 'utf8'));
|
|
150
|
+
assert.equal(grading.expectations[0].evidence, evidence);
|
|
151
|
+
assert.equal(fs.existsSync(`${base}.grading.raw.txt`), false);
|
|
152
|
+
} finally {
|
|
153
|
+
fs.rmSync(root, { recursive: true, force: true });
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
|
|
70
157
|
test('accepts a complete and consistent grader result', () => {
|
|
71
158
|
const raw = JSON.stringify({
|
|
72
159
|
expectations: [
|
|
@@ -79,6 +166,44 @@ test('accepts a complete and consistent grader result', () => {
|
|
|
79
166
|
assert.deepEqual(parseGrading(raw, ['first expectation', 'second expectation']), JSON.parse(raw));
|
|
80
167
|
});
|
|
81
168
|
|
|
169
|
+
for (const passed of [true, false]) {
|
|
170
|
+
for (const evidence of ['', ' \t\r\n', '\u00a0\u2003']) {
|
|
171
|
+
test(`rejects ${passed ? 'passing' : 'failing'} grading with blank evidence ${JSON.stringify(evidence)}`, () => {
|
|
172
|
+
const raw = JSON.stringify({
|
|
173
|
+
expectations: [{ id: 1, text: 'check the result', passed, evidence }],
|
|
174
|
+
summary: { passed: Number(passed), failed: Number(!passed), total: 1, pass_rate: Number(passed) },
|
|
175
|
+
});
|
|
176
|
+
assert.equal(parseGrading(raw, ['check the result']), null);
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
test('preserves nonblank evidence including surrounding whitespace', () => {
|
|
182
|
+
const evidence = ' No matching tool call was found.\n';
|
|
183
|
+
const raw = JSON.stringify({
|
|
184
|
+
expectations: [{ id: 1, text: 'check the result', passed: false, evidence }],
|
|
185
|
+
summary: { passed: 0, failed: 1, total: 1, pass_rate: 0 },
|
|
186
|
+
});
|
|
187
|
+
assert.equal(parseGrading(raw, ['check the result']).expectations[0].evidence, evidence);
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
test('blank evidence retains raw grading without publishing a scored artifact', () => {
|
|
191
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'grading-blank-evidence-'));
|
|
192
|
+
try {
|
|
193
|
+
const base = path.join(dir, 'my-skill.eval-1');
|
|
194
|
+
const raw = JSON.stringify({
|
|
195
|
+
expectations: [{ id: 1, text: 'check the result', passed: true, evidence: '' }],
|
|
196
|
+
summary: { passed: 1, failed: 0, total: 1, pass_rate: 1 },
|
|
197
|
+
});
|
|
198
|
+
clearGradingSlot(base);
|
|
199
|
+
assert.equal(persistGradingOutcome(base, parseGrading(raw, ['check the result']), raw), false);
|
|
200
|
+
assert.equal(fs.existsSync(`${base}.grading.json`), false);
|
|
201
|
+
assert.equal(fs.readFileSync(`${base}.grading.raw.txt`, 'utf8'), raw);
|
|
202
|
+
} finally {
|
|
203
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
|
|
82
207
|
test('rejects grader results that omit expectations', () => {
|
|
83
208
|
const raw = JSON.stringify({
|
|
84
209
|
expectations: [
|
|
@@ -621,3 +746,85 @@ test('materializes a git baseline and applies a working-tree patch', () => {
|
|
|
621
746
|
fs.rmSync(workspace, { recursive: true, force: true });
|
|
622
747
|
}
|
|
623
748
|
});
|
|
749
|
+
|
|
750
|
+
|
|
751
|
+
test('fixture baseline commits ignore inherited user signing requirements', () => {
|
|
752
|
+
const root = makeSandbox();
|
|
753
|
+
const config = path.join(root, 'global.gitconfig');
|
|
754
|
+
const temp = fs.mkdtempSync(path.join(os.tmpdir(), 'fixture-signing-test-'));
|
|
755
|
+
try {
|
|
756
|
+
fs.writeFileSync(config, '[commit]\n\tgpgsign = true\n[gpg]\n\tprogram = definitely-missing-eval-signer\n');
|
|
757
|
+
const result = spawnSync(process.execPath, ['-e', `
|
|
758
|
+
const fs = require('node:fs');
|
|
759
|
+
const { materializeWorkspace } = require(${JSON.stringify(path.join(root, 'scripts', 'run-evals.js'))});
|
|
760
|
+
let workspace;
|
|
761
|
+
try { workspace = materializeWorkspace({ files: ['project/context.txt'] }); }
|
|
762
|
+
finally { if (workspace) fs.rmSync(workspace, { recursive: true, force: true }); }
|
|
763
|
+
`], { cwd: root, encoding: 'utf8', env: { ...process.env, GIT_CONFIG_GLOBAL: config, TMPDIR: temp, TMP: temp, TEMP: temp } });
|
|
764
|
+
assert.equal(result.status, 0, result.stdout + result.stderr);
|
|
765
|
+
} finally {
|
|
766
|
+
fs.rmSync(root, { recursive: true, force: true });
|
|
767
|
+
fs.rmSync(temp, { recursive: true, force: true });
|
|
768
|
+
}
|
|
769
|
+
});
|
|
770
|
+
|
|
771
|
+
test('rejects duplicate behavioral IDs before they can overwrite a grading slot', () => {
|
|
772
|
+
const root = makeSandbox();
|
|
773
|
+
try {
|
|
774
|
+
writeSkill(root, 'alpha-skill', 'Handles alpha widgets. Use when changing alpha widgets.');
|
|
775
|
+
const evalCase = completeCase('alpha-skill', 'change alpha widget');
|
|
776
|
+
evalCase.evals.push({ ...behavioralEval(), prompt: 'A different evaluation' });
|
|
777
|
+
writeJson(path.join(root, 'evals', 'cases', 'alpha-skill.json'), evalCase);
|
|
778
|
+
const result = run(root);
|
|
779
|
+
assert.equal(result.status, 1, result.stdout + result.stderr);
|
|
780
|
+
assert.match(result.stdout, /duplicate behavioral eval id=1/);
|
|
781
|
+
const dryRun = run(root, ['--behavioral', 'alpha-skill', '--dry-run']);
|
|
782
|
+
assert.equal(dryRun.status, 1, dryRun.stdout + dryRun.stderr);
|
|
783
|
+
assert.match(dryRun.stderr, /duplicate behavioral eval id=1/);
|
|
784
|
+
} finally { fs.rmSync(root, { recursive: true, force: true }); }
|
|
785
|
+
});
|
|
786
|
+
|
|
787
|
+
test('accepts distinct behavioral IDs including zero', () => {
|
|
788
|
+
const root = makeSandbox();
|
|
789
|
+
try {
|
|
790
|
+
writeSkill(root, 'alpha-skill', 'Handles alpha widgets. Use when changing alpha widgets.');
|
|
791
|
+
const evalCase = completeCase('alpha-skill', 'change alpha widget');
|
|
792
|
+
evalCase.evals.push({ ...behavioralEval(), id: 0 });
|
|
793
|
+
writeJson(path.join(root, 'evals', 'cases', 'alpha-skill.json'), evalCase);
|
|
794
|
+
const result = run(root);
|
|
795
|
+
assert.equal(result.status, 0, result.stdout + result.stderr);
|
|
796
|
+
} finally { fs.rmSync(root, { recursive: true, force: true }); }
|
|
797
|
+
});
|
|
798
|
+
|
|
799
|
+
test('removes the throwaway workspace when fixture setup fails', () => {
|
|
800
|
+
const root = makeSandbox();
|
|
801
|
+
const temp = fs.mkdtempSync(path.join(os.tmpdir(), 'workspace-cleanup-test-'));
|
|
802
|
+
try {
|
|
803
|
+
const result = spawnSync(process.execPath, ['-e', `
|
|
804
|
+
const { materializeWorkspace } = require(${JSON.stringify(path.join(root, 'scripts', 'run-evals.js'))});
|
|
805
|
+
try { materializeWorkspace({ files: ['project/context.txt', 'missing.txt'] }); }
|
|
806
|
+
catch (error) { console.error(error.message); }
|
|
807
|
+
`], { cwd: root, encoding: 'utf8', env: { ...process.env, TMPDIR: temp, TMP: temp, TEMP: temp } });
|
|
808
|
+
assert.equal(result.status, 0, result.stdout + result.stderr);
|
|
809
|
+
assert.match(result.stderr, /fixture listed in files\[\] not found/);
|
|
810
|
+
assert.deepEqual(fs.readdirSync(temp), [], 'partially copied fixture data must be removed');
|
|
811
|
+
} finally {
|
|
812
|
+
fs.rmSync(root, { recursive: true, force: true });
|
|
813
|
+
fs.rmSync(temp, { recursive: true, force: true });
|
|
814
|
+
}
|
|
815
|
+
});
|
|
816
|
+
|
|
817
|
+
|
|
818
|
+
test('loads quoted YAML skill identities using their decoded values', () => {
|
|
819
|
+
const root = makeSandbox();
|
|
820
|
+
try {
|
|
821
|
+
writeSkill(root, 'alpha', 'code unit tests');
|
|
822
|
+
const skill = path.join(root, 'skills', 'alpha', 'SKILL.md');
|
|
823
|
+
fs.writeFileSync(skill, fs.readFileSync(skill, 'utf8').replace('name: alpha', "name: 'alpha'")
|
|
824
|
+
.replace('description: code unit tests', 'description: "code unit tests"'));
|
|
825
|
+
writeJson(path.join(root, 'evals', 'cases', 'alpha.json'), completeCase('alpha', 'code unit tests'));
|
|
826
|
+
const result = run(root);
|
|
827
|
+
assert.equal(result.status, 0, result.stdout + result.stderr);
|
|
828
|
+
assert.match(result.stdout, /PASSED/);
|
|
829
|
+
} finally { fs.rmSync(root, { recursive: true, force: true }); }
|
|
830
|
+
});
|