agents-inc 0.149.1 → 0.150.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/CHANGELOG.md +2277 -0
- package/LICENSE +21 -0
- package/README.md +136 -19
- package/assets/demo.gif +0 -0
- package/assets/demo.tape +266 -0
- package/assets/logo.svg +75 -0
- package/dist/chunk-2RSNKBXC.js +84 -0
- package/dist/chunk-2RSNKBXC.js.map +1 -0
- package/dist/chunk-3LIU2ZEF.js +1355 -0
- package/dist/chunk-3LIU2ZEF.js.map +1 -0
- package/dist/chunk-4GL2F5AB.js +222 -0
- package/dist/chunk-4GL2F5AB.js.map +1 -0
- package/dist/chunk-4LPJZNT7.js +382 -0
- package/dist/chunk-4LPJZNT7.js.map +1 -0
- package/dist/chunk-5K5RBRTD.js +62 -0
- package/dist/chunk-5K5RBRTD.js.map +1 -0
- package/dist/chunk-6I6RZHYP.js +789 -0
- package/dist/chunk-6I6RZHYP.js.map +1 -0
- package/dist/chunk-7URSGJLE.js +430 -0
- package/dist/chunk-7URSGJLE.js.map +1 -0
- package/dist/chunk-C55DN7GE.js +35 -0
- package/dist/chunk-C55DN7GE.js.map +1 -0
- package/dist/chunk-CDMHSHBN.js +68 -0
- package/dist/chunk-CDMHSHBN.js.map +1 -0
- package/dist/chunk-CFQT72MJ.js +92 -0
- package/dist/chunk-CFQT72MJ.js.map +1 -0
- package/dist/chunk-DAG2ULNF.js +125 -0
- package/dist/chunk-DAG2ULNF.js.map +1 -0
- package/dist/chunk-DDG4F3FE.js +181 -0
- package/dist/chunk-DDG4F3FE.js.map +1 -0
- package/dist/chunk-DIBCRIMR.js +36 -0
- package/dist/chunk-DIBCRIMR.js.map +1 -0
- package/dist/chunk-DJAZE4PD.js +10929 -0
- package/dist/chunk-DJAZE4PD.js.map +1 -0
- package/dist/chunk-DUVWGO6E.js +54 -0
- package/dist/chunk-DUVWGO6E.js.map +1 -0
- package/dist/chunk-E4FT2KFV.js +174 -0
- package/dist/chunk-E4FT2KFV.js.map +1 -0
- package/dist/chunk-EKWAUOQB.js +96 -0
- package/dist/chunk-EKWAUOQB.js.map +1 -0
- package/dist/chunk-EN2GCPW7.js +300 -0
- package/dist/chunk-EN2GCPW7.js.map +1 -0
- package/dist/chunk-ES3NJZON.js +31 -0
- package/dist/chunk-ES3NJZON.js.map +1 -0
- package/dist/chunk-F3756A5B.js +20 -0
- package/dist/chunk-F3756A5B.js.map +1 -0
- package/dist/chunk-FWT3CBLL.js +51 -0
- package/dist/chunk-FWT3CBLL.js.map +1 -0
- package/dist/chunk-FYPUUYSG.js +31 -0
- package/dist/chunk-FYPUUYSG.js.map +1 -0
- package/dist/chunk-GRPSDKIS.js +112 -0
- package/dist/chunk-GRPSDKIS.js.map +1 -0
- package/dist/chunk-GYG5SE2D.js +81 -0
- package/dist/chunk-GYG5SE2D.js.map +1 -0
- package/dist/chunk-HIPGKIT3.js +287 -0
- package/dist/chunk-HIPGKIT3.js.map +1 -0
- package/dist/chunk-I3XKEGHM.js +16383 -0
- package/dist/chunk-I3XKEGHM.js.map +1 -0
- package/dist/chunk-IHO75PMZ.js +40 -0
- package/dist/chunk-IHO75PMZ.js.map +1 -0
- package/dist/chunk-IOJR5TOY.js +47 -0
- package/dist/chunk-IOJR5TOY.js.map +1 -0
- package/dist/chunk-K3OU6TGX.js +77 -0
- package/dist/chunk-K3OU6TGX.js.map +1 -0
- package/dist/chunk-KH7MOIM5.js +6010 -0
- package/dist/chunk-KH7MOIM5.js.map +1 -0
- package/dist/chunk-KIR7VYQD.js +63 -0
- package/dist/chunk-KIR7VYQD.js.map +1 -0
- package/dist/chunk-KOPEM3Q7.js +27 -0
- package/dist/chunk-KOPEM3Q7.js.map +1 -0
- package/dist/chunk-KSZ6PCY4.js +43 -0
- package/dist/chunk-KSZ6PCY4.js.map +1 -0
- package/dist/chunk-LRYNF3J7.js +111 -0
- package/dist/chunk-LRYNF3J7.js.map +1 -0
- package/dist/chunk-LYYXX2W5.js +87 -0
- package/dist/chunk-LYYXX2W5.js.map +1 -0
- package/dist/chunk-MC5DUZ3V.js +1135 -0
- package/dist/chunk-MC5DUZ3V.js.map +1 -0
- package/dist/chunk-N4IZ6GBO.js +300 -0
- package/dist/chunk-N4IZ6GBO.js.map +1 -0
- package/dist/chunk-NIKUMXE7.js +24 -0
- package/dist/chunk-NIKUMXE7.js.map +1 -0
- package/dist/chunk-NUIZ6ZUO.js +42 -0
- package/dist/chunk-NUIZ6ZUO.js.map +1 -0
- package/dist/chunk-O5ASLZ2K.js +270 -0
- package/dist/chunk-O5ASLZ2K.js.map +1 -0
- package/dist/chunk-OA5SUEQD.js +181 -0
- package/dist/chunk-OA5SUEQD.js.map +1 -0
- package/dist/chunk-OZZGXBCN.js +15 -0
- package/dist/chunk-OZZGXBCN.js.map +1 -0
- package/dist/chunk-P3PN5SVI.js +27 -0
- package/dist/chunk-P3PN5SVI.js.map +1 -0
- package/dist/chunk-P56WJ5FA.js +50 -0
- package/dist/chunk-P56WJ5FA.js.map +1 -0
- package/dist/chunk-PG4G4IIK.js +24 -0
- package/dist/chunk-PG4G4IIK.js.map +1 -0
- package/dist/chunk-QQLRX4KI.js +41 -0
- package/dist/chunk-QQLRX4KI.js.map +1 -0
- package/dist/chunk-RBHYLCUB.js +31 -0
- package/dist/chunk-RBHYLCUB.js.map +1 -0
- package/dist/chunk-RJN7W2C7.js +349 -0
- package/dist/chunk-RJN7W2C7.js.map +1 -0
- package/dist/chunk-RP7R73JO.js +179 -0
- package/dist/chunk-RP7R73JO.js.map +1 -0
- package/dist/chunk-SYUOXSPU.js +510 -0
- package/dist/chunk-SYUOXSPU.js.map +1 -0
- package/dist/chunk-THKIOI32.js +939 -0
- package/dist/chunk-THKIOI32.js.map +1 -0
- package/dist/chunk-UZRISDBZ.js +28 -0
- package/dist/chunk-UZRISDBZ.js.map +1 -0
- package/dist/chunk-V7QOSGQA.js +298 -0
- package/dist/chunk-V7QOSGQA.js.map +1 -0
- package/dist/chunk-VEP23B5W.js +27 -0
- package/dist/chunk-VEP23B5W.js.map +1 -0
- package/dist/chunk-VG2TVBFN.js +52 -0
- package/dist/chunk-VG2TVBFN.js.map +1 -0
- package/dist/chunk-VIFZ6NFH.js +27 -0
- package/dist/chunk-VIFZ6NFH.js.map +1 -0
- package/dist/chunk-XA57SX4T.js +115 -0
- package/dist/chunk-XA57SX4T.js.map +1 -0
- package/dist/chunk-YKKIJHZB.js +339 -0
- package/dist/chunk-YKKIJHZB.js.map +1 -0
- package/dist/chunk-YU2VGX5R.js +4205 -0
- package/dist/chunk-YU2VGX5R.js.map +1 -0
- package/dist/chunk-ZDLTLNU2.js +258 -0
- package/dist/chunk-ZDLTLNU2.js.map +1 -0
- package/dist/chunk-ZHTXPFDK.js +128 -0
- package/dist/chunk-ZHTXPFDK.js.map +1 -0
- package/dist/chunk-ZKJAJWK6.js +253 -0
- package/dist/chunk-ZKJAJWK6.js.map +1 -0
- package/dist/commands/build/marketplace.js +250 -0
- package/dist/commands/build/marketplace.js.map +1 -0
- package/dist/commands/build/plugins.js +176 -0
- package/dist/commands/build/plugins.js.map +1 -0
- package/dist/commands/compile.js +331 -0
- package/dist/commands/compile.js.map +1 -0
- package/dist/commands/doctor.js +475 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/edit.js +765 -0
- package/dist/commands/edit.js.map +1 -0
- package/dist/commands/eject.js +393 -0
- package/dist/commands/eject.js.map +1 -0
- package/dist/commands/import/skill.js +349 -0
- package/dist/commands/import/skill.js.map +1 -0
- package/dist/commands/init.js +66 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.js +115 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/new/agent.js +304 -0
- package/dist/commands/new/agent.js.map +1 -0
- package/dist/commands/new/marketplace.js +315 -0
- package/dist/commands/new/marketplace.js.map +1 -0
- package/dist/commands/new/skill.js +28 -0
- package/dist/commands/new/skill.js.map +1 -0
- package/dist/commands/search.js +176 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/uninstall.js +570 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.js +368 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/validate.js +581 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/components/common/confirm.js +9 -0
- package/dist/components/common/confirm.js.map +1 -0
- package/dist/components/common/confirm.test.js +203 -0
- package/dist/components/common/confirm.test.js.map +1 -0
- package/dist/components/common/prompt-confirm.js +11 -0
- package/dist/components/common/prompt-confirm.js.map +1 -0
- package/dist/components/common/select-list.js +11 -0
- package/dist/components/common/select-list.js.map +1 -0
- package/dist/components/common/spinner.js +9 -0
- package/dist/components/common/spinner.js.map +1 -0
- package/dist/components/wizard/category-grid.js +16 -0
- package/dist/components/wizard/category-grid.js.map +1 -0
- package/dist/components/wizard/category-grid.test.js +1253 -0
- package/dist/components/wizard/category-grid.test.js.map +1 -0
- package/dist/components/wizard/checkbox-grid.js +14 -0
- package/dist/components/wizard/checkbox-grid.js.map +1 -0
- package/dist/components/wizard/checkbox-grid.test.js +264 -0
- package/dist/components/wizard/checkbox-grid.test.js.map +1 -0
- package/dist/components/wizard/domain-selection.js +22 -0
- package/dist/components/wizard/domain-selection.js.map +1 -0
- package/dist/components/wizard/run-wizard-session.js +47 -0
- package/dist/components/wizard/run-wizard-session.js.map +1 -0
- package/dist/components/wizard/scroll-affordance.js +10 -0
- package/dist/components/wizard/scroll-affordance.js.map +1 -0
- package/dist/components/wizard/search-modal.js +14 -0
- package/dist/components/wizard/search-modal.js.map +1 -0
- package/dist/components/wizard/search-modal.test.js +212 -0
- package/dist/components/wizard/search-modal.test.js.map +1 -0
- package/dist/components/wizard/selection-card.js +10 -0
- package/dist/components/wizard/selection-card.js.map +1 -0
- package/dist/components/wizard/skill-agent-summary.js +16 -0
- package/dist/components/wizard/skill-agent-summary.js.map +1 -0
- package/dist/components/wizard/source-grid.js +23 -0
- package/dist/components/wizard/source-grid.js.map +1 -0
- package/dist/components/wizard/source-grid.test.js +1094 -0
- package/dist/components/wizard/source-grid.test.js.map +1 -0
- package/dist/components/wizard/stack-selection.js +20 -0
- package/dist/components/wizard/stack-selection.js.map +1 -0
- package/dist/components/wizard/step-agents.js +22 -0
- package/dist/components/wizard/step-agents.js.map +1 -0
- package/dist/components/wizard/step-agents.test.js +204 -0
- package/dist/components/wizard/step-agents.test.js.map +1 -0
- package/dist/components/wizard/step-build.js +22 -0
- package/dist/components/wizard/step-build.js.map +1 -0
- package/dist/components/wizard/step-build.test.js +552 -0
- package/dist/components/wizard/step-build.test.js.map +1 -0
- package/dist/components/wizard/step-confirm.js +21 -0
- package/dist/components/wizard/step-confirm.js.map +1 -0
- package/dist/components/wizard/step-confirm.test.js +744 -0
- package/dist/components/wizard/step-confirm.test.js.map +1 -0
- package/dist/components/wizard/step-settings.js +19 -0
- package/dist/components/wizard/step-settings.js.map +1 -0
- package/dist/components/wizard/step-settings.test.js +244 -0
- package/dist/components/wizard/step-settings.test.js.map +1 -0
- package/dist/components/wizard/step-sources.js +28 -0
- package/dist/components/wizard/step-sources.js.map +1 -0
- package/dist/components/wizard/step-sources.test.js +155 -0
- package/dist/components/wizard/step-sources.test.js.map +1 -0
- package/dist/components/wizard/step-stack.js +21 -0
- package/dist/components/wizard/step-stack.js.map +1 -0
- package/dist/components/wizard/step-stack.test.js +262 -0
- package/dist/components/wizard/step-stack.test.js.map +1 -0
- package/dist/components/wizard/summary-panel.js +20 -0
- package/dist/components/wizard/summary-panel.js.map +1 -0
- package/dist/components/wizard/summary-panel.test.js +317 -0
- package/dist/components/wizard/summary-panel.test.js.map +1 -0
- package/dist/components/wizard/toast.js +10 -0
- package/dist/components/wizard/toast.js.map +1 -0
- package/dist/components/wizard/wizard-layout.js +26 -0
- package/dist/components/wizard/wizard-layout.js.map +1 -0
- package/dist/components/wizard/wizard-layout.test.js +200 -0
- package/dist/components/wizard/wizard-layout.test.js.map +1 -0
- package/dist/components/wizard/wizard-tabs.js +20 -0
- package/dist/components/wizard/wizard-tabs.js.map +1 -0
- package/dist/components/wizard/wizard-tabs.test.js +290 -0
- package/dist/components/wizard/wizard-tabs.test.js.map +1 -0
- package/dist/components/wizard/wizard.js +48 -0
- package/dist/components/wizard/wizard.js.map +1 -0
- package/dist/config-exports.js +20 -0
- package/dist/config-exports.js.map +1 -0
- package/dist/copy-local-skills-CA7P73RZ.js +15 -0
- package/dist/copy-local-skills-CA7P73RZ.js.map +1 -0
- package/dist/dist-VNJNNJK7.js +550 -0
- package/dist/dist-VNJNNJK7.js.map +1 -0
- package/dist/hooks/init.js +90 -0
- package/dist/hooks/init.js.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/load-agent-defs-6MAY5ABI.js +16 -0
- package/dist/load-agent-defs-6MAY5ABI.js.map +1 -0
- package/dist/loader-E2ERJYVA.js +23 -0
- package/dist/loader-E2ERJYVA.js.map +1 -0
- package/dist/magic-string.es-5TV73NJD.js +1316 -0
- package/dist/magic-string.es-5TV73NJD.js.map +1 -0
- package/dist/recompile-project-agents-VYQJ6UZB.js +20 -0
- package/dist/recompile-project-agents-VYQJ6UZB.js.map +1 -0
- package/dist/source-loader-VVHMQEX5.js +20 -0
- package/dist/source-loader-VVHMQEX5.js.map +1 -0
- package/dist/source-manager-TPDXV5FO.js +18 -0
- package/dist/source-manager-TPDXV5FO.js.map +1 -0
- package/dist/src/agents/_templates/agent.liquid +161 -0
- package/dist/src/agents/_templates/methodologies/anti-over-engineering.liquid +121 -0
- package/dist/src/agents/_templates/methodologies/context-management.liquid +162 -0
- package/dist/src/agents/_templates/methodologies/improvement-protocol.liquid +150 -0
- package/dist/src/agents/_templates/methodologies/investigation-requirements.liquid +49 -0
- package/dist/src/agents/_templates/methodologies/success-criteria.liquid +111 -0
- package/dist/src/agents/_templates/methodologies/write-verification.liquid +43 -0
- package/dist/src/agents/developer/ai-developer/critical-reminders.md +54 -0
- package/dist/src/agents/developer/ai-developer/critical-requirements.md +59 -0
- package/dist/src/agents/developer/ai-developer/identity.md +51 -0
- package/dist/src/agents/developer/ai-developer/metadata.yaml +12 -0
- package/dist/src/agents/developer/ai-developer/output.md +366 -0
- package/dist/src/agents/developer/ai-developer/playbook.md +335 -0
- package/dist/src/agents/developer/api-developer/critical-reminders.md +46 -0
- package/dist/src/agents/developer/api-developer/critical-requirements.md +44 -0
- package/dist/src/agents/developer/api-developer/identity.md +49 -0
- package/dist/src/agents/developer/api-developer/metadata.yaml +12 -0
- package/dist/src/agents/developer/api-developer/output.md +432 -0
- package/dist/src/agents/developer/api-developer/playbook.md +352 -0
- package/dist/src/agents/developer/cli-developer/critical-reminders.md +51 -0
- package/dist/src/agents/developer/cli-developer/critical-requirements.md +51 -0
- package/dist/src/agents/developer/cli-developer/identity.md +51 -0
- package/dist/src/agents/developer/cli-developer/metadata.yaml +12 -0
- package/dist/src/agents/developer/cli-developer/output.md +285 -0
- package/dist/src/agents/developer/cli-developer/playbook.md +386 -0
- package/dist/src/agents/developer/web-architecture/critical-reminders.md +48 -0
- package/dist/src/agents/developer/web-architecture/critical-requirements.md +65 -0
- package/dist/src/agents/developer/web-architecture/identity.md +64 -0
- package/dist/src/agents/developer/web-architecture/metadata.yaml +12 -0
- package/dist/src/agents/developer/web-architecture/output.md +449 -0
- package/dist/src/agents/developer/web-architecture/playbook.md +481 -0
- package/dist/src/agents/developer/web-developer/critical-reminders.md +40 -0
- package/dist/src/agents/developer/web-developer/critical-requirements.md +39 -0
- package/dist/src/agents/developer/web-developer/identity.md +32 -0
- package/dist/src/agents/developer/web-developer/metadata.yaml +12 -0
- package/dist/src/agents/developer/web-developer/output.md +323 -0
- package/dist/src/agents/developer/web-developer/playbook.md +349 -0
- package/dist/src/agents/meta/agent-summoner/critical-reminders.md +45 -0
- package/dist/src/agents/meta/agent-summoner/critical-requirements.md +52 -0
- package/dist/src/agents/meta/agent-summoner/identity.md +34 -0
- package/dist/src/agents/meta/agent-summoner/metadata.yaml +12 -0
- package/dist/src/agents/meta/agent-summoner/output.md +296 -0
- package/dist/src/agents/meta/agent-summoner/playbook.md +1469 -0
- package/dist/src/agents/meta/codex-keeper/critical-reminders.md +39 -0
- package/dist/src/agents/meta/codex-keeper/critical-requirements.md +29 -0
- package/dist/src/agents/meta/codex-keeper/identity.md +45 -0
- package/dist/src/agents/meta/codex-keeper/metadata.yaml +12 -0
- package/dist/src/agents/meta/codex-keeper/output.md +384 -0
- package/dist/src/agents/meta/codex-keeper/playbook.md +1183 -0
- package/dist/src/agents/meta/convention-keeper/critical-reminders.md +32 -0
- package/dist/src/agents/meta/convention-keeper/critical-requirements.md +32 -0
- package/dist/src/agents/meta/convention-keeper/identity.md +33 -0
- package/dist/src/agents/meta/convention-keeper/metadata.yaml +12 -0
- package/dist/src/agents/meta/convention-keeper/output.md +206 -0
- package/dist/src/agents/meta/convention-keeper/playbook.md +180 -0
- package/dist/src/agents/meta/skill-summoner/critical-reminders.md +112 -0
- package/dist/src/agents/meta/skill-summoner/critical-requirements.md +62 -0
- package/dist/src/agents/meta/skill-summoner/identity.md +31 -0
- package/dist/src/agents/meta/skill-summoner/metadata.yaml +13 -0
- package/dist/src/agents/meta/skill-summoner/output.md +390 -0
- package/dist/src/agents/meta/skill-summoner/playbook.md +1457 -0
- package/dist/src/agents/pattern/pattern-scout/critical-reminders.md +71 -0
- package/dist/src/agents/pattern/pattern-scout/critical-requirements.md +31 -0
- package/dist/src/agents/pattern/pattern-scout/identity.md +25 -0
- package/dist/src/agents/pattern/pattern-scout/metadata.yaml +10 -0
- package/dist/src/agents/pattern/pattern-scout/output.md +290 -0
- package/dist/src/agents/pattern/pattern-scout/playbook.md +1806 -0
- package/dist/src/agents/pattern/web-pattern-critique/critical-reminders.md +30 -0
- package/dist/src/agents/pattern/web-pattern-critique/critical-requirements.md +28 -0
- package/dist/src/agents/pattern/web-pattern-critique/identity.md +41 -0
- package/dist/src/agents/pattern/web-pattern-critique/metadata.yaml +12 -0
- package/dist/src/agents/pattern/web-pattern-critique/output.md +314 -0
- package/dist/src/agents/pattern/web-pattern-critique/playbook.md +572 -0
- package/dist/src/agents/planning/api-pm/critical-reminders.md +48 -0
- package/dist/src/agents/planning/api-pm/critical-requirements.md +41 -0
- package/dist/src/agents/planning/api-pm/identity.md +39 -0
- package/dist/src/agents/planning/api-pm/metadata.yaml +12 -0
- package/dist/src/agents/planning/api-pm/output.md +475 -0
- package/dist/src/agents/planning/api-pm/playbook.md +129 -0
- package/dist/src/agents/planning/web-pm/critical-reminders.md +36 -0
- package/dist/src/agents/planning/web-pm/critical-requirements.md +32 -0
- package/dist/src/agents/planning/web-pm/identity.md +26 -0
- package/dist/src/agents/planning/web-pm/metadata.yaml +12 -0
- package/dist/src/agents/planning/web-pm/output.md +314 -0
- package/dist/src/agents/planning/web-pm/playbook.md +318 -0
- package/dist/src/agents/researcher/api-researcher/critical-reminders.md +27 -0
- package/dist/src/agents/researcher/api-researcher/critical-requirements.md +28 -0
- package/dist/src/agents/researcher/api-researcher/identity.md +71 -0
- package/dist/src/agents/researcher/api-researcher/metadata.yaml +10 -0
- package/dist/src/agents/researcher/api-researcher/output.md +254 -0
- package/dist/src/agents/researcher/api-researcher/playbook.md +201 -0
- package/dist/src/agents/researcher/web-researcher/critical-reminders.md +39 -0
- package/dist/src/agents/researcher/web-researcher/critical-requirements.md +26 -0
- package/dist/src/agents/researcher/web-researcher/identity.md +69 -0
- package/dist/src/agents/researcher/web-researcher/metadata.yaml +10 -0
- package/dist/src/agents/researcher/web-researcher/output.md +241 -0
- package/dist/src/agents/researcher/web-researcher/playbook.md +217 -0
- package/dist/src/agents/reviewer/ai-reviewer/critical-reminders.md +40 -0
- package/dist/src/agents/reviewer/ai-reviewer/critical-requirements.md +37 -0
- package/dist/src/agents/reviewer/ai-reviewer/identity.md +51 -0
- package/dist/src/agents/reviewer/ai-reviewer/metadata.yaml +10 -0
- package/dist/src/agents/reviewer/ai-reviewer/output.md +395 -0
- package/dist/src/agents/reviewer/ai-reviewer/playbook.md +90 -0
- package/dist/src/agents/reviewer/api-reviewer/critical-reminders.md +31 -0
- package/dist/src/agents/reviewer/api-reviewer/critical-requirements.md +27 -0
- package/dist/src/agents/reviewer/api-reviewer/identity.md +51 -0
- package/dist/src/agents/reviewer/api-reviewer/metadata.yaml +12 -0
- package/dist/src/agents/reviewer/api-reviewer/output.md +343 -0
- package/dist/src/agents/reviewer/api-reviewer/playbook.md +288 -0
- package/dist/src/agents/reviewer/cli-reviewer/critical-reminders.md +33 -0
- package/dist/src/agents/reviewer/cli-reviewer/critical-requirements.md +30 -0
- package/dist/src/agents/reviewer/cli-reviewer/identity.md +44 -0
- package/dist/src/agents/reviewer/cli-reviewer/metadata.yaml +12 -0
- package/dist/src/agents/reviewer/cli-reviewer/output.md +414 -0
- package/dist/src/agents/reviewer/cli-reviewer/playbook.md +218 -0
- package/dist/src/agents/reviewer/infra-reviewer/critical-reminders.md +38 -0
- package/dist/src/agents/reviewer/infra-reviewer/critical-requirements.md +38 -0
- package/dist/src/agents/reviewer/infra-reviewer/identity.md +53 -0
- package/dist/src/agents/reviewer/infra-reviewer/metadata.yaml +10 -0
- package/dist/src/agents/reviewer/infra-reviewer/output.md +364 -0
- package/dist/src/agents/reviewer/infra-reviewer/playbook.md +161 -0
- package/dist/src/agents/reviewer/web-reviewer/critical-reminders.md +31 -0
- package/dist/src/agents/reviewer/web-reviewer/critical-requirements.md +26 -0
- package/dist/src/agents/reviewer/web-reviewer/identity.md +40 -0
- package/dist/src/agents/reviewer/web-reviewer/metadata.yaml +12 -0
- package/dist/src/agents/reviewer/web-reviewer/output.md +333 -0
- package/dist/src/agents/reviewer/web-reviewer/playbook.md +156 -0
- package/dist/src/agents/tester/api-tester/critical-reminders.md +41 -0
- package/dist/src/agents/tester/api-tester/critical-requirements.md +41 -0
- package/dist/src/agents/tester/api-tester/identity.md +47 -0
- package/dist/src/agents/tester/api-tester/metadata.yaml +12 -0
- package/dist/src/agents/tester/api-tester/output.md +284 -0
- package/dist/src/agents/tester/api-tester/playbook.md +275 -0
- package/dist/src/agents/tester/cli-tester/critical-reminders.md +36 -0
- package/dist/src/agents/tester/cli-tester/critical-requirements.md +36 -0
- package/dist/src/agents/tester/cli-tester/identity.md +43 -0
- package/dist/src/agents/tester/cli-tester/metadata.yaml +12 -0
- package/dist/src/agents/tester/cli-tester/output.md +313 -0
- package/dist/src/agents/tester/cli-tester/playbook.md +221 -0
- package/dist/src/agents/tester/web-tester/critical-reminders.md +31 -0
- package/dist/src/agents/tester/web-tester/critical-requirements.md +28 -0
- package/dist/src/agents/tester/web-tester/identity.md +41 -0
- package/dist/src/agents/tester/web-tester/metadata.yaml +12 -0
- package/dist/src/agents/tester/web-tester/output.md +321 -0
- package/dist/src/agents/tester/web-tester/playbook.md +428 -0
- package/dist/stores/d227-same-scope-tombstone-duplicate.test.js +118 -0
- package/dist/stores/d227-same-scope-tombstone-duplicate.test.js.map +1 -0
- package/dist/stores/wizard-store.js +21 -0
- package/dist/stores/wizard-store.js.map +1 -0
- package/dist/stores/wizard-store.test.js +3053 -0
- package/dist/stores/wizard-store.test.js.map +1 -0
- package/package.json +131 -13
- package/src/agents/_templates/agent.liquid +161 -0
- package/src/agents/_templates/methodologies/anti-over-engineering.liquid +121 -0
- package/src/agents/_templates/methodologies/context-management.liquid +162 -0
- package/src/agents/_templates/methodologies/improvement-protocol.liquid +150 -0
- package/src/agents/_templates/methodologies/investigation-requirements.liquid +49 -0
- package/src/agents/_templates/methodologies/success-criteria.liquid +111 -0
- package/src/agents/_templates/methodologies/write-verification.liquid +43 -0
- package/src/agents/developer/ai-developer/critical-reminders.md +54 -0
- package/src/agents/developer/ai-developer/critical-requirements.md +59 -0
- package/src/agents/developer/ai-developer/identity.md +51 -0
- package/src/agents/developer/ai-developer/metadata.yaml +12 -0
- package/src/agents/developer/ai-developer/output.md +366 -0
- package/src/agents/developer/ai-developer/playbook.md +335 -0
- package/src/agents/developer/api-developer/critical-reminders.md +46 -0
- package/src/agents/developer/api-developer/critical-requirements.md +44 -0
- package/src/agents/developer/api-developer/identity.md +49 -0
- package/src/agents/developer/api-developer/metadata.yaml +12 -0
- package/src/agents/developer/api-developer/output.md +432 -0
- package/src/agents/developer/api-developer/playbook.md +352 -0
- package/src/agents/developer/cli-developer/critical-reminders.md +51 -0
- package/src/agents/developer/cli-developer/critical-requirements.md +51 -0
- package/src/agents/developer/cli-developer/identity.md +51 -0
- package/src/agents/developer/cli-developer/metadata.yaml +12 -0
- package/src/agents/developer/cli-developer/output.md +285 -0
- package/src/agents/developer/cli-developer/playbook.md +386 -0
- package/src/agents/developer/web-architecture/critical-reminders.md +48 -0
- package/src/agents/developer/web-architecture/critical-requirements.md +65 -0
- package/src/agents/developer/web-architecture/identity.md +64 -0
- package/src/agents/developer/web-architecture/metadata.yaml +12 -0
- package/src/agents/developer/web-architecture/output.md +449 -0
- package/src/agents/developer/web-architecture/playbook.md +481 -0
- package/src/agents/developer/web-developer/critical-reminders.md +40 -0
- package/src/agents/developer/web-developer/critical-requirements.md +39 -0
- package/src/agents/developer/web-developer/identity.md +32 -0
- package/src/agents/developer/web-developer/metadata.yaml +12 -0
- package/src/agents/developer/web-developer/output.md +323 -0
- package/src/agents/developer/web-developer/playbook.md +349 -0
- package/src/agents/meta/agent-summoner/critical-reminders.md +45 -0
- package/src/agents/meta/agent-summoner/critical-requirements.md +52 -0
- package/src/agents/meta/agent-summoner/identity.md +34 -0
- package/src/agents/meta/agent-summoner/metadata.yaml +12 -0
- package/src/agents/meta/agent-summoner/output.md +296 -0
- package/src/agents/meta/agent-summoner/playbook.md +1469 -0
- package/src/agents/meta/codex-keeper/critical-reminders.md +39 -0
- package/src/agents/meta/codex-keeper/critical-requirements.md +29 -0
- package/src/agents/meta/codex-keeper/identity.md +45 -0
- package/src/agents/meta/codex-keeper/metadata.yaml +12 -0
- package/src/agents/meta/codex-keeper/output.md +384 -0
- package/src/agents/meta/codex-keeper/playbook.md +1183 -0
- package/src/agents/meta/convention-keeper/critical-reminders.md +32 -0
- package/src/agents/meta/convention-keeper/critical-requirements.md +32 -0
- package/src/agents/meta/convention-keeper/identity.md +33 -0
- package/src/agents/meta/convention-keeper/metadata.yaml +12 -0
- package/src/agents/meta/convention-keeper/output.md +206 -0
- package/src/agents/meta/convention-keeper/playbook.md +180 -0
- package/src/agents/meta/skill-summoner/critical-reminders.md +112 -0
- package/src/agents/meta/skill-summoner/critical-requirements.md +62 -0
- package/src/agents/meta/skill-summoner/identity.md +31 -0
- package/src/agents/meta/skill-summoner/metadata.yaml +13 -0
- package/src/agents/meta/skill-summoner/output.md +390 -0
- package/src/agents/meta/skill-summoner/playbook.md +1457 -0
- package/src/agents/pattern/pattern-scout/critical-reminders.md +71 -0
- package/src/agents/pattern/pattern-scout/critical-requirements.md +31 -0
- package/src/agents/pattern/pattern-scout/identity.md +25 -0
- package/src/agents/pattern/pattern-scout/metadata.yaml +10 -0
- package/src/agents/pattern/pattern-scout/output.md +290 -0
- package/src/agents/pattern/pattern-scout/playbook.md +1806 -0
- package/src/agents/pattern/web-pattern-critique/critical-reminders.md +30 -0
- package/src/agents/pattern/web-pattern-critique/critical-requirements.md +28 -0
- package/src/agents/pattern/web-pattern-critique/identity.md +41 -0
- package/src/agents/pattern/web-pattern-critique/metadata.yaml +12 -0
- package/src/agents/pattern/web-pattern-critique/output.md +314 -0
- package/src/agents/pattern/web-pattern-critique/playbook.md +572 -0
- package/src/agents/planning/api-pm/critical-reminders.md +48 -0
- package/src/agents/planning/api-pm/critical-requirements.md +41 -0
- package/src/agents/planning/api-pm/identity.md +39 -0
- package/src/agents/planning/api-pm/metadata.yaml +12 -0
- package/src/agents/planning/api-pm/output.md +475 -0
- package/src/agents/planning/api-pm/playbook.md +129 -0
- package/src/agents/planning/web-pm/critical-reminders.md +36 -0
- package/src/agents/planning/web-pm/critical-requirements.md +32 -0
- package/src/agents/planning/web-pm/identity.md +26 -0
- package/src/agents/planning/web-pm/metadata.yaml +12 -0
- package/src/agents/planning/web-pm/output.md +314 -0
- package/src/agents/planning/web-pm/playbook.md +318 -0
- package/src/agents/researcher/api-researcher/critical-reminders.md +27 -0
- package/src/agents/researcher/api-researcher/critical-requirements.md +28 -0
- package/src/agents/researcher/api-researcher/identity.md +71 -0
- package/src/agents/researcher/api-researcher/metadata.yaml +10 -0
- package/src/agents/researcher/api-researcher/output.md +254 -0
- package/src/agents/researcher/api-researcher/playbook.md +201 -0
- package/src/agents/researcher/web-researcher/critical-reminders.md +39 -0
- package/src/agents/researcher/web-researcher/critical-requirements.md +26 -0
- package/src/agents/researcher/web-researcher/identity.md +69 -0
- package/src/agents/researcher/web-researcher/metadata.yaml +10 -0
- package/src/agents/researcher/web-researcher/output.md +241 -0
- package/src/agents/researcher/web-researcher/playbook.md +217 -0
- package/src/agents/reviewer/ai-reviewer/critical-reminders.md +40 -0
- package/src/agents/reviewer/ai-reviewer/critical-requirements.md +37 -0
- package/src/agents/reviewer/ai-reviewer/identity.md +51 -0
- package/src/agents/reviewer/ai-reviewer/metadata.yaml +10 -0
- package/src/agents/reviewer/ai-reviewer/output.md +395 -0
- package/src/agents/reviewer/ai-reviewer/playbook.md +90 -0
- package/src/agents/reviewer/api-reviewer/critical-reminders.md +31 -0
- package/src/agents/reviewer/api-reviewer/critical-requirements.md +27 -0
- package/src/agents/reviewer/api-reviewer/identity.md +51 -0
- package/src/agents/reviewer/api-reviewer/metadata.yaml +12 -0
- package/src/agents/reviewer/api-reviewer/output.md +343 -0
- package/src/agents/reviewer/api-reviewer/playbook.md +288 -0
- package/src/agents/reviewer/cli-reviewer/critical-reminders.md +33 -0
- package/src/agents/reviewer/cli-reviewer/critical-requirements.md +30 -0
- package/src/agents/reviewer/cli-reviewer/identity.md +44 -0
- package/src/agents/reviewer/cli-reviewer/metadata.yaml +12 -0
- package/src/agents/reviewer/cli-reviewer/output.md +414 -0
- package/src/agents/reviewer/cli-reviewer/playbook.md +218 -0
- package/src/agents/reviewer/infra-reviewer/critical-reminders.md +38 -0
- package/src/agents/reviewer/infra-reviewer/critical-requirements.md +38 -0
- package/src/agents/reviewer/infra-reviewer/identity.md +53 -0
- package/src/agents/reviewer/infra-reviewer/metadata.yaml +10 -0
- package/src/agents/reviewer/infra-reviewer/output.md +364 -0
- package/src/agents/reviewer/infra-reviewer/playbook.md +161 -0
- package/src/agents/reviewer/web-reviewer/critical-reminders.md +31 -0
- package/src/agents/reviewer/web-reviewer/critical-requirements.md +26 -0
- package/src/agents/reviewer/web-reviewer/identity.md +40 -0
- package/src/agents/reviewer/web-reviewer/metadata.yaml +12 -0
- package/src/agents/reviewer/web-reviewer/output.md +333 -0
- package/src/agents/reviewer/web-reviewer/playbook.md +156 -0
- package/src/agents/tester/api-tester/critical-reminders.md +41 -0
- package/src/agents/tester/api-tester/critical-requirements.md +41 -0
- package/src/agents/tester/api-tester/identity.md +47 -0
- package/src/agents/tester/api-tester/metadata.yaml +12 -0
- package/src/agents/tester/api-tester/output.md +284 -0
- package/src/agents/tester/api-tester/playbook.md +275 -0
- package/src/agents/tester/cli-tester/critical-reminders.md +36 -0
- package/src/agents/tester/cli-tester/critical-requirements.md +36 -0
- package/src/agents/tester/cli-tester/identity.md +43 -0
- package/src/agents/tester/cli-tester/metadata.yaml +12 -0
- package/src/agents/tester/cli-tester/output.md +313 -0
- package/src/agents/tester/cli-tester/playbook.md +221 -0
- package/src/agents/tester/web-tester/critical-reminders.md +31 -0
- package/src/agents/tester/web-tester/critical-requirements.md +28 -0
- package/src/agents/tester/web-tester/identity.md +41 -0
- package/src/agents/tester/web-tester/metadata.yaml +12 -0
- package/src/agents/tester/web-tester/output.md +321 -0
- package/src/agents/tester/web-tester/playbook.md +428 -0
- package/src/schemas/agent-frontmatter.schema.json +88 -0
- package/src/schemas/agent.schema.json +103 -0
- package/src/schemas/custom-metadata.schema.json +74 -0
- package/src/schemas/hooks.schema.json +47 -0
- package/src/schemas/marketplace.schema.json +119 -0
- package/src/schemas/metadata.schema.json +387 -0
- package/src/schemas/plugin.schema.json +127 -0
- package/src/schemas/project-config.schema.json +189 -0
- package/src/schemas/project-source-config.schema.json +96 -0
- package/src/schemas/skill-frontmatter.schema.json +42 -0
- package/src/schemas/stack.schema.json +191 -0
- package/src/schemas/stacks.schema.json +107 -0
- package/bin/run.js +0 -3
|
@@ -0,0 +1,581 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
ERROR_MESSAGES
|
|
4
|
+
} from "../chunk-GYG5SE2D.js";
|
|
5
|
+
import {
|
|
6
|
+
listAgentMdFiles
|
|
7
|
+
} from "../chunk-YKKIJHZB.js";
|
|
8
|
+
import {
|
|
9
|
+
BaseCommand,
|
|
10
|
+
EXIT_CODES
|
|
11
|
+
} from "../chunk-OA5SUEQD.js";
|
|
12
|
+
import "../chunk-SYUOXSPU.js";
|
|
13
|
+
import "../chunk-P3PN5SVI.js";
|
|
14
|
+
import {
|
|
15
|
+
checkMatrixHealth,
|
|
16
|
+
getInstalledPluginsRegistryPath,
|
|
17
|
+
getProjectPluginsDir,
|
|
18
|
+
getUserPluginsDir,
|
|
19
|
+
isHomeDirectory,
|
|
20
|
+
isLocalSource,
|
|
21
|
+
isRecord,
|
|
22
|
+
listRegisteredPluginInstalls,
|
|
23
|
+
loadConfig,
|
|
24
|
+
loadProjectSourceConfig,
|
|
25
|
+
loadSkillsMatrixFromSource,
|
|
26
|
+
printPluginValidationResult,
|
|
27
|
+
resolveAllSources,
|
|
28
|
+
resolveInstallPaths,
|
|
29
|
+
validateAgentFrontmatter,
|
|
30
|
+
validateAllPlugins,
|
|
31
|
+
validatePlugin,
|
|
32
|
+
validateSkillFrontmatter
|
|
33
|
+
} from "../chunk-KH7MOIM5.js";
|
|
34
|
+
import {
|
|
35
|
+
agentYamlGenerationSchema,
|
|
36
|
+
directoryExists,
|
|
37
|
+
fileExists,
|
|
38
|
+
formatZodErrors,
|
|
39
|
+
getErrorMessage,
|
|
40
|
+
glob,
|
|
41
|
+
listDirectories,
|
|
42
|
+
metadataValidationSchema,
|
|
43
|
+
parseFrontmatter,
|
|
44
|
+
readFile,
|
|
45
|
+
skillCategoriesFileSchema,
|
|
46
|
+
skillRulesFileSchema,
|
|
47
|
+
splitMetadataValidationIssues,
|
|
48
|
+
stackConfigValidationSchema,
|
|
49
|
+
stacksConfigSchema,
|
|
50
|
+
validateSkillMetadata
|
|
51
|
+
} from "../chunk-3LIU2ZEF.js";
|
|
52
|
+
import {
|
|
53
|
+
matrix
|
|
54
|
+
} from "../chunk-DJAZE4PD.js";
|
|
55
|
+
import "../chunk-VEP23B5W.js";
|
|
56
|
+
import {
|
|
57
|
+
DIRS,
|
|
58
|
+
PLUGIN_MANIFEST_DIR,
|
|
59
|
+
SKILLS_DIR_PATH,
|
|
60
|
+
SKILL_CATEGORIES_PATH,
|
|
61
|
+
SKILL_RULES_PATH,
|
|
62
|
+
STACKS_FILE_PATH,
|
|
63
|
+
STANDARD_FILES
|
|
64
|
+
} from "../chunk-O5ASLZ2K.js";
|
|
65
|
+
import "../chunk-YU2VGX5R.js";
|
|
66
|
+
import {
|
|
67
|
+
init_esm_shims
|
|
68
|
+
} from "../chunk-P56WJ5FA.js";
|
|
69
|
+
|
|
70
|
+
// src/cli/commands/validate.ts
|
|
71
|
+
init_esm_shims();
|
|
72
|
+
import os from "os";
|
|
73
|
+
import path2 from "path";
|
|
74
|
+
import { parse as parseYaml2 } from "yaml";
|
|
75
|
+
|
|
76
|
+
// src/cli/lib/source-validator.ts
|
|
77
|
+
init_esm_shims();
|
|
78
|
+
import path from "path";
|
|
79
|
+
import { parse as parseYaml } from "yaml";
|
|
80
|
+
function isSnakeCase(key) {
|
|
81
|
+
return /[a-z]_[a-z]/.test(key);
|
|
82
|
+
}
|
|
83
|
+
function checkSnakeCaseKeys(rawMetadata, relPath) {
|
|
84
|
+
if (!isRecord(rawMetadata)) return [];
|
|
85
|
+
return Object.keys(rawMetadata).filter(isSnakeCase).map((key) => ({
|
|
86
|
+
severity: "error",
|
|
87
|
+
file: relPath,
|
|
88
|
+
message: `Key '${key}' uses snake_case \u2014 use camelCase instead`
|
|
89
|
+
}));
|
|
90
|
+
}
|
|
91
|
+
function checkDirNameMatchesSkillId(skillId, relPath, dirName) {
|
|
92
|
+
if (skillId === dirName) return [];
|
|
93
|
+
return [
|
|
94
|
+
{
|
|
95
|
+
severity: "warning",
|
|
96
|
+
file: relPath,
|
|
97
|
+
message: `Directory name '${dirName}' does not match skill id '${skillId}'`
|
|
98
|
+
}
|
|
99
|
+
];
|
|
100
|
+
}
|
|
101
|
+
async function checkSkillDirName(skillsDir, skillsDirRelPath, skillDir) {
|
|
102
|
+
const dirName = path.basename(skillDir);
|
|
103
|
+
const skillMdRelPath = path.join(skillsDirRelPath, skillDir, STANDARD_FILES.SKILL_MD);
|
|
104
|
+
try {
|
|
105
|
+
const content = await readFile(path.join(skillsDir, skillDir, STANDARD_FILES.SKILL_MD));
|
|
106
|
+
const frontmatter = parseFrontmatter(content, skillMdRelPath);
|
|
107
|
+
if (frontmatter === null) {
|
|
108
|
+
return [
|
|
109
|
+
{
|
|
110
|
+
severity: "warning",
|
|
111
|
+
file: skillMdRelPath,
|
|
112
|
+
message: `Cannot verify directory name '${dirName}': missing or invalid ${STANDARD_FILES.SKILL_MD} frontmatter`
|
|
113
|
+
}
|
|
114
|
+
];
|
|
115
|
+
}
|
|
116
|
+
return checkDirNameMatchesSkillId(frontmatter.name, skillMdRelPath, dirName);
|
|
117
|
+
} catch (error) {
|
|
118
|
+
return [
|
|
119
|
+
{
|
|
120
|
+
severity: "warning",
|
|
121
|
+
file: skillMdRelPath,
|
|
122
|
+
message: `Cannot verify directory name '${dirName}': ${getErrorMessage(error)}`
|
|
123
|
+
}
|
|
124
|
+
];
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
function validateSkillFilePairs(skillMdDirs, metadataDirs, skillsDir) {
|
|
128
|
+
const missingMetadata = [...skillMdDirs].filter((dir) => !metadataDirs.has(dir)).map((dir) => ({
|
|
129
|
+
severity: "error",
|
|
130
|
+
file: path.join(skillsDir, dir),
|
|
131
|
+
message: `Missing ${STANDARD_FILES.METADATA_YAML} \u2014 skill directory has ${STANDARD_FILES.SKILL_MD} but no metadata`
|
|
132
|
+
}));
|
|
133
|
+
const missingSkillMd = [...metadataDirs].filter((dir) => !skillMdDirs.has(dir)).map((dir) => ({
|
|
134
|
+
severity: "error",
|
|
135
|
+
file: path.join(skillsDir, dir),
|
|
136
|
+
message: `Missing ${STANDARD_FILES.SKILL_MD} \u2014 skill directory has ${STANDARD_FILES.METADATA_YAML} but no SKILL.md`
|
|
137
|
+
}));
|
|
138
|
+
return [...missingMetadata, ...missingSkillMd];
|
|
139
|
+
}
|
|
140
|
+
async function validateSource(sourcePath) {
|
|
141
|
+
const issues = [];
|
|
142
|
+
const resolvedPath = path.isAbsolute(sourcePath) ? sourcePath : path.resolve(sourcePath);
|
|
143
|
+
if (!await directoryExists(resolvedPath)) {
|
|
144
|
+
issues.push({
|
|
145
|
+
severity: "error",
|
|
146
|
+
file: resolvedPath,
|
|
147
|
+
message: "Source directory does not exist"
|
|
148
|
+
});
|
|
149
|
+
return buildResult(issues, 0);
|
|
150
|
+
}
|
|
151
|
+
const sourceProjectConfig = await loadProjectSourceConfig(resolvedPath);
|
|
152
|
+
const skillsDirRelPath = sourceProjectConfig?.skillsDir ?? SKILLS_DIR_PATH;
|
|
153
|
+
const skillsDir = path.join(resolvedPath, skillsDirRelPath);
|
|
154
|
+
if (!await directoryExists(skillsDir)) {
|
|
155
|
+
issues.push({
|
|
156
|
+
severity: "error",
|
|
157
|
+
file: skillsDir,
|
|
158
|
+
message: "Skills directory does not exist"
|
|
159
|
+
});
|
|
160
|
+
return buildResult(issues, 0);
|
|
161
|
+
}
|
|
162
|
+
const skillMdFiles = await glob(`**/${STANDARD_FILES.SKILL_MD}`, skillsDir);
|
|
163
|
+
const metadataFiles = await glob(`**/${STANDARD_FILES.METADATA_YAML}`, skillsDir);
|
|
164
|
+
const skillMdDirs = new Set(skillMdFiles.map((f) => path.dirname(f)));
|
|
165
|
+
const metadataDirs = new Set(metadataFiles.map((f) => path.dirname(f)));
|
|
166
|
+
issues.push(...validateSkillFilePairs(skillMdDirs, metadataDirs, skillsDir));
|
|
167
|
+
const validMetadataFiles = metadataFiles.filter((f) => skillMdDirs.has(path.dirname(f)));
|
|
168
|
+
for (const metadataFile of validMetadataFiles) {
|
|
169
|
+
const metadataPath = path.join(skillsDir, metadataFile);
|
|
170
|
+
const skillDir = path.dirname(metadataFile);
|
|
171
|
+
const relPath = path.join(skillsDirRelPath, metadataFile);
|
|
172
|
+
let rawMetadata;
|
|
173
|
+
try {
|
|
174
|
+
const metadataContent = await readFile(metadataPath);
|
|
175
|
+
rawMetadata = parseYaml(metadataContent);
|
|
176
|
+
} catch (error) {
|
|
177
|
+
issues.push({
|
|
178
|
+
severity: "error",
|
|
179
|
+
file: relPath,
|
|
180
|
+
message: `Failed to parse YAML: ${getErrorMessage(error)}`
|
|
181
|
+
});
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
issues.push(...checkSnakeCaseKeys(rawMetadata, relPath));
|
|
185
|
+
const result = validateSkillMetadata(rawMetadata);
|
|
186
|
+
if (!result.success) {
|
|
187
|
+
const { errors, warnings } = splitMetadataValidationIssues(result.error, rawMetadata);
|
|
188
|
+
issues.push(
|
|
189
|
+
...errors.map((message) => ({ severity: "error", file: relPath, message })),
|
|
190
|
+
...warnings.map((message) => ({ severity: "warning", file: relPath, message }))
|
|
191
|
+
);
|
|
192
|
+
}
|
|
193
|
+
issues.push(...await checkSkillDirName(skillsDir, skillsDirRelPath, skillDir));
|
|
194
|
+
}
|
|
195
|
+
try {
|
|
196
|
+
await loadSkillsMatrixFromSource({ sourceFlag: resolvedPath, skipExtraSources: true });
|
|
197
|
+
issues.push(
|
|
198
|
+
...checkMatrixHealth(matrix).map((healthIssue) => ({
|
|
199
|
+
severity: healthIssue.severity,
|
|
200
|
+
file: SKILL_CATEGORIES_PATH,
|
|
201
|
+
message: healthIssue.details
|
|
202
|
+
}))
|
|
203
|
+
);
|
|
204
|
+
} catch (error) {
|
|
205
|
+
issues.push({
|
|
206
|
+
severity: "warning",
|
|
207
|
+
file: SKILL_CATEGORIES_PATH,
|
|
208
|
+
message: `Cross-reference validation skipped: failed to load categories/rules: ${getErrorMessage(error)}`
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
const extraIssues = await Promise.all([
|
|
212
|
+
validateStacks(resolvedPath),
|
|
213
|
+
validateAgents(resolvedPath),
|
|
214
|
+
validateConfigFiles(resolvedPath)
|
|
215
|
+
]);
|
|
216
|
+
issues.push(...extraIssues.flat());
|
|
217
|
+
return buildResult(issues, validMetadataFiles.length);
|
|
218
|
+
}
|
|
219
|
+
async function validateStacks(resolvedPath) {
|
|
220
|
+
const stacksDir = path.join(resolvedPath, DIRS.stacks);
|
|
221
|
+
if (!await directoryExists(stacksDir)) return [];
|
|
222
|
+
const [skillMetaIssues, configIssues] = await Promise.all([
|
|
223
|
+
validateYamlFiles({
|
|
224
|
+
baseDir: stacksDir,
|
|
225
|
+
relBaseDir: DIRS.stacks,
|
|
226
|
+
pattern: `**/skills/**/${STANDARD_FILES.METADATA_YAML}`,
|
|
227
|
+
schema: metadataValidationSchema
|
|
228
|
+
}),
|
|
229
|
+
validateYamlFiles({
|
|
230
|
+
baseDir: stacksDir,
|
|
231
|
+
relBaseDir: DIRS.stacks,
|
|
232
|
+
pattern: `*/${STANDARD_FILES.CONFIG_YAML}`,
|
|
233
|
+
schema: stackConfigValidationSchema
|
|
234
|
+
})
|
|
235
|
+
]);
|
|
236
|
+
return [...skillMetaIssues, ...configIssues];
|
|
237
|
+
}
|
|
238
|
+
async function validateAgents(resolvedPath) {
|
|
239
|
+
const agentsDir = path.join(resolvedPath, DIRS.agents);
|
|
240
|
+
if (!await directoryExists(agentsDir)) return [];
|
|
241
|
+
return validateYamlFiles({
|
|
242
|
+
baseDir: agentsDir,
|
|
243
|
+
relBaseDir: DIRS.agents,
|
|
244
|
+
pattern: `**/${STANDARD_FILES.AGENT_METADATA_YAML}`,
|
|
245
|
+
schema: agentYamlGenerationSchema
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
async function validateConfigFiles(resolvedPath) {
|
|
249
|
+
const results = await Promise.all([
|
|
250
|
+
validateTsConfig(resolvedPath, SKILL_CATEGORIES_PATH, skillCategoriesFileSchema),
|
|
251
|
+
validateTsConfig(resolvedPath, SKILL_RULES_PATH, skillRulesFileSchema),
|
|
252
|
+
validateTsConfig(resolvedPath, STACKS_FILE_PATH, stacksConfigSchema)
|
|
253
|
+
]);
|
|
254
|
+
return results.flat();
|
|
255
|
+
}
|
|
256
|
+
async function validateYamlFiles(opts) {
|
|
257
|
+
const issues = [];
|
|
258
|
+
const files = await glob(opts.pattern, opts.baseDir);
|
|
259
|
+
for (const relFile of files) {
|
|
260
|
+
const absPath = path.join(opts.baseDir, relFile);
|
|
261
|
+
const displayPath = path.join(opts.relBaseDir, relFile);
|
|
262
|
+
let parsed;
|
|
263
|
+
try {
|
|
264
|
+
parsed = parseYaml(await readFile(absPath));
|
|
265
|
+
} catch {
|
|
266
|
+
issues.push({ severity: "error", file: displayPath, message: "Failed to parse YAML" });
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
const result = opts.schema.safeParse(parsed);
|
|
270
|
+
if (result.success) continue;
|
|
271
|
+
issues.push(
|
|
272
|
+
...formatZodErrors(result.error).map((message) => ({
|
|
273
|
+
severity: "error",
|
|
274
|
+
file: displayPath,
|
|
275
|
+
message
|
|
276
|
+
}))
|
|
277
|
+
);
|
|
278
|
+
}
|
|
279
|
+
return issues;
|
|
280
|
+
}
|
|
281
|
+
async function validateTsConfig(resolvedPath, relConfigPath, schema) {
|
|
282
|
+
const absPath = path.join(resolvedPath, relConfigPath);
|
|
283
|
+
if (!await fileExists(absPath)) return [];
|
|
284
|
+
try {
|
|
285
|
+
const loaded = await loadConfig(absPath, schema);
|
|
286
|
+
if (loaded === null) {
|
|
287
|
+
return [{ severity: "error", file: relConfigPath, message: "Config has no default export" }];
|
|
288
|
+
}
|
|
289
|
+
return [];
|
|
290
|
+
} catch (error) {
|
|
291
|
+
return [
|
|
292
|
+
{ severity: "error", file: relConfigPath, message: formatLoadError(relConfigPath, error) }
|
|
293
|
+
];
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
function formatLoadError(relConfigPath, error) {
|
|
297
|
+
const raw = getErrorMessage(error);
|
|
298
|
+
const stripped = raw.replace(/Failed to load config from '[^']+':\s*/, "");
|
|
299
|
+
return `Failed to load ${relConfigPath}: ${stripped}`;
|
|
300
|
+
}
|
|
301
|
+
function buildResult(issues, skillCount) {
|
|
302
|
+
const errorCount = issues.filter((i) => i.severity === "error").length;
|
|
303
|
+
const warningCount = issues.filter((i) => i.severity === "warning").length;
|
|
304
|
+
return { issues, skillCount, errorCount, warningCount };
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// src/cli/commands/validate.ts
|
|
308
|
+
var COL_NAME_WIDTH = 30;
|
|
309
|
+
var COL_URL_WIDTH = 40;
|
|
310
|
+
var COL_PATH_WIDTH = 50;
|
|
311
|
+
var VALIDATE_STATUS = {
|
|
312
|
+
SKIPPED_REMOTE: "\u2014 skipped (remote source)",
|
|
313
|
+
NOT_PRESENT: "\u2014 not present",
|
|
314
|
+
EMPTY: "\u2014 none",
|
|
315
|
+
NO_PLUGINS: "\u2014 no plugins"
|
|
316
|
+
};
|
|
317
|
+
var NO_ISSUES = { errors: 0, warnings: 0 };
|
|
318
|
+
function sumCounts(counts) {
|
|
319
|
+
return counts.reduce(
|
|
320
|
+
(acc, c) => ({ errors: acc.errors + c.errors, warnings: acc.warnings + c.warnings }),
|
|
321
|
+
NO_ISSUES
|
|
322
|
+
);
|
|
323
|
+
}
|
|
324
|
+
function printAndSumResults(results) {
|
|
325
|
+
return sumCounts(
|
|
326
|
+
results.map(({ name, result }) => {
|
|
327
|
+
printPluginValidationResult(name, result);
|
|
328
|
+
return {
|
|
329
|
+
errors: result.valid ? 0 : result.errors.length,
|
|
330
|
+
warnings: result.warnings.length
|
|
331
|
+
};
|
|
332
|
+
})
|
|
333
|
+
);
|
|
334
|
+
}
|
|
335
|
+
var Validate = class _Validate extends BaseCommand {
|
|
336
|
+
static summary = "Validate every registered source, installed plugin, installed skill, and installed agent";
|
|
337
|
+
static description = "Read-only validation. Walks every registered source, every installed plugin, every installed skill, and every installed agent. Prints a summary table with per-directory counts; exits non-zero if any pass produced an error.";
|
|
338
|
+
static examples = [
|
|
339
|
+
{ description: "Validate everything", command: "<%= config.bin %> <%= command.id %>" }
|
|
340
|
+
];
|
|
341
|
+
// Override parent baseFlags to drop --source (validate is a zero-flag command)
|
|
342
|
+
static baseFlags = {};
|
|
343
|
+
static flags = {};
|
|
344
|
+
async run() {
|
|
345
|
+
await this.parse(_Validate);
|
|
346
|
+
let totals = NO_ISSUES;
|
|
347
|
+
try {
|
|
348
|
+
totals = await this.validateAllRegistered();
|
|
349
|
+
} catch (error) {
|
|
350
|
+
const message = getErrorMessage(error);
|
|
351
|
+
this.error(`${ERROR_MESSAGES.VALIDATION_FAILED}: ${message}`, { exit: EXIT_CODES.ERROR });
|
|
352
|
+
}
|
|
353
|
+
this.log("");
|
|
354
|
+
this.log(`Result: ${totals.errors} error(s), ${totals.warnings} warning(s)`);
|
|
355
|
+
this.log("");
|
|
356
|
+
if (totals.errors > 0) {
|
|
357
|
+
this.error(ERROR_MESSAGES.VALIDATION_FAILED, { exit: EXIT_CODES.ERROR });
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
async validateAllRegistered() {
|
|
361
|
+
const projectDir = process.cwd();
|
|
362
|
+
const globalPaths = resolveInstallPaths(projectDir, "global");
|
|
363
|
+
const projectPaths = resolveInstallPaths(projectDir, "project");
|
|
364
|
+
const inHome = isHomeDirectory(projectDir);
|
|
365
|
+
this.log("");
|
|
366
|
+
this.log("Validating sources");
|
|
367
|
+
const { primary, extras } = await resolveAllSources(projectDir);
|
|
368
|
+
const sources = [primary, ...extras];
|
|
369
|
+
const counts = [];
|
|
370
|
+
for (const source of sources) {
|
|
371
|
+
counts.push(await this.validateRegisteredSource(source));
|
|
372
|
+
}
|
|
373
|
+
this.log("");
|
|
374
|
+
this.log("Validating plugins");
|
|
375
|
+
counts.push(await this.validatePluginsDirectory(getUserPluginsDir()));
|
|
376
|
+
if (!inHome) {
|
|
377
|
+
counts.push(await this.validatePluginsDirectory(getProjectPluginsDir(projectDir)));
|
|
378
|
+
}
|
|
379
|
+
this.log("");
|
|
380
|
+
this.log("Validating skills");
|
|
381
|
+
counts.push(await this.validateInstalledSkillsDirectory(globalPaths.skillsDir));
|
|
382
|
+
if (!inHome) {
|
|
383
|
+
counts.push(await this.validateInstalledSkillsDirectory(projectPaths.skillsDir));
|
|
384
|
+
}
|
|
385
|
+
this.log("");
|
|
386
|
+
this.log("Validating agents");
|
|
387
|
+
counts.push(await this.validateInstalledAgentsDirectory(globalPaths.agentsDir));
|
|
388
|
+
if (!inHome) {
|
|
389
|
+
counts.push(await this.validateInstalledAgentsDirectory(projectPaths.agentsDir));
|
|
390
|
+
}
|
|
391
|
+
return sumCounts(counts);
|
|
392
|
+
}
|
|
393
|
+
async validateRegisteredSource(source) {
|
|
394
|
+
if (!isLocalSource(source.url)) {
|
|
395
|
+
this.log(
|
|
396
|
+
` ${source.name.padEnd(COL_NAME_WIDTH)} ${source.url.padEnd(COL_URL_WIDTH)} ${VALIDATE_STATUS.SKIPPED_REMOTE}`
|
|
397
|
+
);
|
|
398
|
+
return NO_ISSUES;
|
|
399
|
+
}
|
|
400
|
+
try {
|
|
401
|
+
const result = await validateSource(source.url);
|
|
402
|
+
this.log(
|
|
403
|
+
` ${source.name.padEnd(COL_NAME_WIDTH)} ${source.url.padEnd(COL_URL_WIDTH)} ${result.skillCount} skill(s), ${result.errorCount} error(s), ${result.warningCount} warning(s)`
|
|
404
|
+
);
|
|
405
|
+
for (const issue of result.issues) {
|
|
406
|
+
const prefix = issue.severity === "error" ? "ERROR" : "WARN";
|
|
407
|
+
this.log(` [${prefix}] ${issue.file}: ${issue.message}`);
|
|
408
|
+
}
|
|
409
|
+
return { errors: result.errorCount, warnings: result.warningCount };
|
|
410
|
+
} catch (error) {
|
|
411
|
+
const message = getErrorMessage(error);
|
|
412
|
+
this.log(
|
|
413
|
+
` ${source.name.padEnd(COL_NAME_WIDTH)} ${source.url.padEnd(COL_URL_WIDTH)} failed: ${message}`
|
|
414
|
+
);
|
|
415
|
+
return { errors: 1, warnings: 0 };
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
async validatePluginsDirectory(pluginsDir) {
|
|
419
|
+
const displayPath = displayDir(pluginsDir);
|
|
420
|
+
if (!await directoryExists(pluginsDir)) {
|
|
421
|
+
this.log(` ${displayPath.padEnd(COL_PATH_WIDTH)} ${VALIDATE_STATUS.NOT_PRESENT}`);
|
|
422
|
+
return NO_ISSUES;
|
|
423
|
+
}
|
|
424
|
+
if (await fileExists(getInstalledPluginsRegistryPath(pluginsDir))) {
|
|
425
|
+
const registryCounts = await this.validateRegistryPlugins(pluginsDir, displayPath);
|
|
426
|
+
if (registryCounts !== void 0) return registryCounts;
|
|
427
|
+
}
|
|
428
|
+
const pluginDirs = await findPluginDirectories(pluginsDir);
|
|
429
|
+
if (pluginDirs.length === 0) {
|
|
430
|
+
this.log(` ${displayPath.padEnd(COL_PATH_WIDTH)} ${VALIDATE_STATUS.NO_PLUGINS}`);
|
|
431
|
+
return NO_ISSUES;
|
|
432
|
+
}
|
|
433
|
+
const result = await validateAllPlugins(pluginsDir);
|
|
434
|
+
this.log(
|
|
435
|
+
` ${displayPath.padEnd(COL_PATH_WIDTH)} ${result.summary.total} plugin(s), ${result.summary.invalid} invalid, ${result.summary.withWarnings} with warnings`
|
|
436
|
+
);
|
|
437
|
+
return printAndSumResults(result.results);
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* Validates the installs recorded in the plugins directory's
|
|
441
|
+
* `installed_plugins.json` (claude CLI >=2.1.220 cache layout). Returns
|
|
442
|
+
* undefined when the registry records no installs so the caller can fall
|
|
443
|
+
* back to the direct-children scan (older/manual layouts).
|
|
444
|
+
*/
|
|
445
|
+
async validateRegistryPlugins(pluginsDir, displayPath) {
|
|
446
|
+
let installs;
|
|
447
|
+
try {
|
|
448
|
+
installs = await listRegisteredPluginInstalls(pluginsDir);
|
|
449
|
+
} catch (error) {
|
|
450
|
+
this.log(` ${displayPath.padEnd(COL_PATH_WIDTH)} failed: ${getErrorMessage(error)}`);
|
|
451
|
+
return { errors: 1, warnings: 0 };
|
|
452
|
+
}
|
|
453
|
+
if (installs.length === 0) return void 0;
|
|
454
|
+
const results = await Promise.all(
|
|
455
|
+
installs.map(async ({ pluginKey, installPath }) => ({
|
|
456
|
+
name: pluginKey,
|
|
457
|
+
result: await validatePlugin(installPath)
|
|
458
|
+
}))
|
|
459
|
+
);
|
|
460
|
+
const invalidCount = results.filter((r) => !r.result.valid).length;
|
|
461
|
+
const warnCount = results.filter((r) => r.result.warnings.length > 0).length;
|
|
462
|
+
this.log(
|
|
463
|
+
` ${displayPath.padEnd(COL_PATH_WIDTH)} ${results.length} plugin(s), ${invalidCount} invalid, ${warnCount} with warnings`
|
|
464
|
+
);
|
|
465
|
+
return printAndSumResults(results);
|
|
466
|
+
}
|
|
467
|
+
async validateInstalledSkillsDirectory(skillsDir) {
|
|
468
|
+
const displayPath = displayDir(skillsDir);
|
|
469
|
+
if (!await directoryExists(skillsDir)) {
|
|
470
|
+
this.log(` ${displayPath.padEnd(COL_PATH_WIDTH)} ${VALIDATE_STATUS.NOT_PRESENT}`);
|
|
471
|
+
return NO_ISSUES;
|
|
472
|
+
}
|
|
473
|
+
const skillDirs = await listDirectories(skillsDir);
|
|
474
|
+
if (skillDirs.length === 0) {
|
|
475
|
+
this.log(` ${displayPath.padEnd(COL_PATH_WIDTH)} ${VALIDATE_STATUS.EMPTY}`);
|
|
476
|
+
return NO_ISSUES;
|
|
477
|
+
}
|
|
478
|
+
const results = await Promise.all(
|
|
479
|
+
skillDirs.map(async (name) => ({
|
|
480
|
+
name,
|
|
481
|
+
result: await validateInstalledSkill(path2.join(skillsDir, name))
|
|
482
|
+
}))
|
|
483
|
+
);
|
|
484
|
+
const invalidCount = results.filter((r) => !r.result.valid).length;
|
|
485
|
+
const warnCount = results.filter((r) => r.result.warnings.length > 0).length;
|
|
486
|
+
this.log(
|
|
487
|
+
` ${displayPath.padEnd(COL_PATH_WIDTH)} ${skillDirs.length} skill(s), ${invalidCount} invalid, ${warnCount} with warnings`
|
|
488
|
+
);
|
|
489
|
+
return printAndSumResults(results);
|
|
490
|
+
}
|
|
491
|
+
async validateInstalledAgentsDirectory(agentsDir) {
|
|
492
|
+
const displayPath = displayDir(agentsDir);
|
|
493
|
+
if (!await directoryExists(agentsDir)) {
|
|
494
|
+
this.log(` ${displayPath.padEnd(COL_PATH_WIDTH)} ${VALIDATE_STATUS.NOT_PRESENT}`);
|
|
495
|
+
return NO_ISSUES;
|
|
496
|
+
}
|
|
497
|
+
const agentFiles = await listAgentMdFiles(agentsDir);
|
|
498
|
+
if (agentFiles.length === 0) {
|
|
499
|
+
this.log(` ${displayPath.padEnd(COL_PATH_WIDTH)} ${VALIDATE_STATUS.EMPTY}`);
|
|
500
|
+
return NO_ISSUES;
|
|
501
|
+
}
|
|
502
|
+
const results = await Promise.all(
|
|
503
|
+
agentFiles.map(async (fileName) => ({
|
|
504
|
+
name: fileName,
|
|
505
|
+
result: await validateAgentFrontmatter(path2.join(agentsDir, fileName))
|
|
506
|
+
}))
|
|
507
|
+
);
|
|
508
|
+
const invalidCount = results.filter((r) => !r.result.valid).length;
|
|
509
|
+
const warnCount = results.filter((r) => r.result.warnings.length > 0).length;
|
|
510
|
+
this.log(
|
|
511
|
+
` ${displayPath.padEnd(COL_PATH_WIDTH)} ${agentFiles.length} agent(s), ${invalidCount} invalid, ${warnCount} with warnings`
|
|
512
|
+
);
|
|
513
|
+
return printAndSumResults(results);
|
|
514
|
+
}
|
|
515
|
+
};
|
|
516
|
+
function displayDir(absolutePath) {
|
|
517
|
+
const home = os.homedir();
|
|
518
|
+
if (absolutePath === home) return "~";
|
|
519
|
+
if (absolutePath.startsWith(home + path2.sep)) {
|
|
520
|
+
return `~${path2.sep}${path2.relative(home, absolutePath)}`;
|
|
521
|
+
}
|
|
522
|
+
return absolutePath;
|
|
523
|
+
}
|
|
524
|
+
async function validateInstalledSkill(skillDir) {
|
|
525
|
+
const skillMdPath = path2.join(skillDir, STANDARD_FILES.SKILL_MD);
|
|
526
|
+
const metadataPath = path2.join(skillDir, STANDARD_FILES.METADATA_YAML);
|
|
527
|
+
const errors = [];
|
|
528
|
+
const warnings = [];
|
|
529
|
+
if (!await fileExists(skillMdPath)) {
|
|
530
|
+
errors.push(`Missing ${STANDARD_FILES.SKILL_MD}`);
|
|
531
|
+
} else {
|
|
532
|
+
const frontmatterResult = await validateSkillFrontmatter(skillMdPath);
|
|
533
|
+
errors.push(...frontmatterResult.errors);
|
|
534
|
+
warnings.push(...frontmatterResult.warnings);
|
|
535
|
+
}
|
|
536
|
+
if (!await fileExists(metadataPath)) {
|
|
537
|
+
errors.push(`Missing ${STANDARD_FILES.METADATA_YAML}`);
|
|
538
|
+
} else {
|
|
539
|
+
const metadataResult = await validateInstalledSkillMetadata(metadataPath);
|
|
540
|
+
errors.push(...metadataResult.errors);
|
|
541
|
+
warnings.push(...metadataResult.warnings);
|
|
542
|
+
}
|
|
543
|
+
return { valid: errors.length === 0, errors, warnings };
|
|
544
|
+
}
|
|
545
|
+
async function validateInstalledSkillMetadata(metadataPath) {
|
|
546
|
+
let rawMetadata;
|
|
547
|
+
try {
|
|
548
|
+
const content = await readFile(metadataPath);
|
|
549
|
+
rawMetadata = parseYaml2(content);
|
|
550
|
+
} catch (err) {
|
|
551
|
+
return {
|
|
552
|
+
valid: false,
|
|
553
|
+
errors: [`${STANDARD_FILES.METADATA_YAML}: ${getErrorMessage(err)}`],
|
|
554
|
+
warnings: []
|
|
555
|
+
};
|
|
556
|
+
}
|
|
557
|
+
const result = validateSkillMetadata(rawMetadata);
|
|
558
|
+
if (result.success) {
|
|
559
|
+
return { valid: true, errors: [], warnings: [] };
|
|
560
|
+
}
|
|
561
|
+
const { errors, warnings } = splitMetadataValidationIssues(result.error, rawMetadata);
|
|
562
|
+
return {
|
|
563
|
+
valid: errors.length === 0,
|
|
564
|
+
errors: errors.map((e) => `${STANDARD_FILES.METADATA_YAML}: ${e}`),
|
|
565
|
+
warnings: warnings.map((w) => `${STANDARD_FILES.METADATA_YAML}: ${w}`)
|
|
566
|
+
};
|
|
567
|
+
}
|
|
568
|
+
async function findPluginDirectories(pluginsDir) {
|
|
569
|
+
const entries = await listDirectories(pluginsDir);
|
|
570
|
+
const checks = await Promise.all(
|
|
571
|
+
entries.map(async (name) => ({
|
|
572
|
+
name,
|
|
573
|
+
isPlugin: await directoryExists(path2.join(pluginsDir, name, PLUGIN_MANIFEST_DIR))
|
|
574
|
+
}))
|
|
575
|
+
);
|
|
576
|
+
return checks.filter((check) => check.isPlugin).map((check) => check.name);
|
|
577
|
+
}
|
|
578
|
+
export {
|
|
579
|
+
Validate as default
|
|
580
|
+
};
|
|
581
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cli/commands/validate.ts","../../src/cli/lib/source-validator.ts"],"sourcesContent":["import os from \"os\";\nimport path from \"path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { BaseCommand } from \"../base-command.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport { ERROR_MESSAGES } from \"../utils/messages.js\";\nimport {\n validateAllPlugins,\n validatePlugin,\n printPluginValidationResult,\n validateSkillFrontmatter,\n validateAgentFrontmatter,\n getUserPluginsDir,\n getProjectPluginsDir,\n getInstalledPluginsRegistryPath,\n listRegisteredPluginInstalls,\n type ResolvedPlugin,\n} from \"../lib/plugins/index.js\";\nimport { validateSource } from \"../lib/source-validator.js\";\nimport { isLocalSource, resolveAllSources, type SourceEntry } from \"../lib/configuration/index.js\";\nimport { resolveInstallPaths, isHomeDirectory } from \"../lib/installation/index.js\";\nimport { splitMetadataValidationIssues, validateSkillMetadata } from \"../lib/schemas.js\";\nimport { PLUGIN_MANIFEST_DIR, STANDARD_FILES } from \"../consts.js\";\nimport type { ValidationResult } from \"../types/index.js\";\nimport { directoryExists, fileExists, listDirectories, readFile } from \"../utils/fs.js\";\nimport { listAgentMdFiles } from \"../lib/agents/index.js\";\n\nconst COL_NAME_WIDTH = 30;\nconst COL_URL_WIDTH = 40;\nconst COL_PATH_WIDTH = 50;\n\nconst VALIDATE_STATUS = {\n SKIPPED_REMOTE: \"— skipped (remote source)\",\n NOT_PRESENT: \"— not present\",\n EMPTY: \"— none\",\n NO_PLUGINS: \"— no plugins\",\n} as const;\n\ntype AggregateCounts = {\n errors: number;\n warnings: number;\n};\n\nconst NO_ISSUES: AggregateCounts = { errors: 0, warnings: 0 };\n\nfunction sumCounts(counts: AggregateCounts[]): AggregateCounts {\n return counts.reduce(\n (acc, c) => ({ errors: acc.errors + c.errors, warnings: acc.warnings + c.warnings }),\n NO_ISSUES,\n );\n}\n\n/** Prints each named validation result and sums its error/warning counts. */\nfunction printAndSumResults(\n results: Array<{ name: string; result: ValidationResult }>,\n): AggregateCounts {\n return sumCounts(\n results.map(({ name, result }) => {\n printPluginValidationResult(name, result);\n return {\n errors: result.valid ? 0 : result.errors.length,\n warnings: result.warnings.length,\n };\n }),\n );\n}\n\nexport default class Validate extends BaseCommand {\n static summary =\n \"Validate every registered source, installed plugin, installed skill, and installed agent\";\n static description =\n \"Read-only validation. Walks every registered source, every installed plugin, \" +\n \"every installed skill, and every installed agent. Prints a summary table with \" +\n \"per-directory counts; exits non-zero if any pass produced an error.\";\n\n static examples = [\n { description: \"Validate everything\", command: \"<%= config.bin %> <%= command.id %>\" },\n ];\n\n // Override parent baseFlags to drop --source (validate is a zero-flag command)\n static baseFlags = {} as (typeof BaseCommand)[\"baseFlags\"];\n\n static flags = {};\n\n async run(): Promise<void> {\n await this.parse(Validate);\n\n let totals: AggregateCounts = NO_ISSUES;\n\n try {\n totals = await this.validateAllRegistered();\n } catch (error) {\n const message = getErrorMessage(error);\n this.error(`${ERROR_MESSAGES.VALIDATION_FAILED}: ${message}`, { exit: EXIT_CODES.ERROR });\n }\n\n this.log(\"\");\n this.log(`Result: ${totals.errors} error(s), ${totals.warnings} warning(s)`);\n this.log(\"\");\n\n if (totals.errors > 0) {\n this.error(ERROR_MESSAGES.VALIDATION_FAILED, { exit: EXIT_CODES.ERROR });\n }\n }\n\n private async validateAllRegistered(): Promise<AggregateCounts> {\n const projectDir = process.cwd();\n const globalPaths = resolveInstallPaths(projectDir, \"global\");\n const projectPaths = resolveInstallPaths(projectDir, \"project\");\n\n const inHome = isHomeDirectory(projectDir);\n\n this.log(\"\");\n this.log(\"Validating sources\");\n\n const { primary, extras } = await resolveAllSources(projectDir);\n const sources: SourceEntry[] = [primary, ...extras];\n\n const counts: AggregateCounts[] = [];\n for (const source of sources) {\n counts.push(await this.validateRegisteredSource(source));\n }\n\n this.log(\"\");\n this.log(\"Validating plugins\");\n\n counts.push(await this.validatePluginsDirectory(getUserPluginsDir()));\n if (!inHome) {\n counts.push(await this.validatePluginsDirectory(getProjectPluginsDir(projectDir)));\n }\n\n this.log(\"\");\n this.log(\"Validating skills\");\n\n counts.push(await this.validateInstalledSkillsDirectory(globalPaths.skillsDir));\n if (!inHome) {\n counts.push(await this.validateInstalledSkillsDirectory(projectPaths.skillsDir));\n }\n\n this.log(\"\");\n this.log(\"Validating agents\");\n\n counts.push(await this.validateInstalledAgentsDirectory(globalPaths.agentsDir));\n if (!inHome) {\n counts.push(await this.validateInstalledAgentsDirectory(projectPaths.agentsDir));\n }\n\n return sumCounts(counts);\n }\n\n private async validateRegisteredSource(source: SourceEntry): Promise<AggregateCounts> {\n if (!isLocalSource(source.url)) {\n this.log(\n ` ${source.name.padEnd(COL_NAME_WIDTH)} ${source.url.padEnd(COL_URL_WIDTH)} ${VALIDATE_STATUS.SKIPPED_REMOTE}`,\n );\n return NO_ISSUES;\n }\n\n try {\n const result = await validateSource(source.url);\n this.log(\n ` ${source.name.padEnd(COL_NAME_WIDTH)} ${source.url.padEnd(COL_URL_WIDTH)} ${result.skillCount} skill(s), ${result.errorCount} error(s), ${result.warningCount} warning(s)`,\n );\n\n for (const issue of result.issues) {\n const prefix = issue.severity === \"error\" ? \"ERROR\" : \"WARN\";\n this.log(` [${prefix}] ${issue.file}: ${issue.message}`);\n }\n\n return { errors: result.errorCount, warnings: result.warningCount };\n } catch (error) {\n const message = getErrorMessage(error);\n this.log(\n ` ${source.name.padEnd(COL_NAME_WIDTH)} ${source.url.padEnd(COL_URL_WIDTH)} failed: ${message}`,\n );\n return { errors: 1, warnings: 0 };\n }\n }\n\n private async validatePluginsDirectory(pluginsDir: string): Promise<AggregateCounts> {\n const displayPath = displayDir(pluginsDir);\n\n if (!(await directoryExists(pluginsDir))) {\n this.log(` ${displayPath.padEnd(COL_PATH_WIDTH)} ${VALIDATE_STATUS.NOT_PRESENT}`);\n return NO_ISSUES;\n }\n\n if (await fileExists(getInstalledPluginsRegistryPath(pluginsDir))) {\n const registryCounts = await this.validateRegistryPlugins(pluginsDir, displayPath);\n if (registryCounts !== undefined) return registryCounts;\n }\n\n const pluginDirs = await findPluginDirectories(pluginsDir);\n if (pluginDirs.length === 0) {\n this.log(` ${displayPath.padEnd(COL_PATH_WIDTH)} ${VALIDATE_STATUS.NO_PLUGINS}`);\n return NO_ISSUES;\n }\n\n const result = await validateAllPlugins(pluginsDir);\n\n this.log(\n ` ${displayPath.padEnd(COL_PATH_WIDTH)} ${result.summary.total} plugin(s), ${result.summary.invalid} invalid, ${result.summary.withWarnings} with warnings`,\n );\n\n return printAndSumResults(result.results);\n }\n\n /**\n * Validates the installs recorded in the plugins directory's\n * `installed_plugins.json` (claude CLI >=2.1.220 cache layout). Returns\n * undefined when the registry records no installs so the caller can fall\n * back to the direct-children scan (older/manual layouts).\n */\n private async validateRegistryPlugins(\n pluginsDir: string,\n displayPath: string,\n ): Promise<AggregateCounts | undefined> {\n let installs: ResolvedPlugin[];\n try {\n installs = await listRegisteredPluginInstalls(pluginsDir);\n } catch (error) {\n this.log(` ${displayPath.padEnd(COL_PATH_WIDTH)} failed: ${getErrorMessage(error)}`);\n return { errors: 1, warnings: 0 };\n }\n\n if (installs.length === 0) return undefined;\n\n // A recorded installPath that no longer exists surfaces as an invalid\n // plugin via validatePlugin's structure check, not a crash.\n const results = await Promise.all(\n installs.map(async ({ pluginKey, installPath }) => ({\n name: pluginKey,\n result: await validatePlugin(installPath),\n })),\n );\n\n const invalidCount = results.filter((r) => !r.result.valid).length;\n const warnCount = results.filter((r) => r.result.warnings.length > 0).length;\n\n this.log(\n ` ${displayPath.padEnd(COL_PATH_WIDTH)} ${results.length} plugin(s), ${invalidCount} invalid, ${warnCount} with warnings`,\n );\n\n return printAndSumResults(results);\n }\n\n private async validateInstalledSkillsDirectory(skillsDir: string): Promise<AggregateCounts> {\n const displayPath = displayDir(skillsDir);\n\n if (!(await directoryExists(skillsDir))) {\n this.log(` ${displayPath.padEnd(COL_PATH_WIDTH)} ${VALIDATE_STATUS.NOT_PRESENT}`);\n return NO_ISSUES;\n }\n\n const skillDirs = await listDirectories(skillsDir);\n if (skillDirs.length === 0) {\n this.log(` ${displayPath.padEnd(COL_PATH_WIDTH)} ${VALIDATE_STATUS.EMPTY}`);\n return NO_ISSUES;\n }\n\n const results = await Promise.all(\n skillDirs.map(async (name) => ({\n name,\n result: await validateInstalledSkill(path.join(skillsDir, name)),\n })),\n );\n\n const invalidCount = results.filter((r) => !r.result.valid).length;\n const warnCount = results.filter((r) => r.result.warnings.length > 0).length;\n\n this.log(\n ` ${displayPath.padEnd(COL_PATH_WIDTH)} ${skillDirs.length} skill(s), ${invalidCount} invalid, ${warnCount} with warnings`,\n );\n\n return printAndSumResults(results);\n }\n\n private async validateInstalledAgentsDirectory(agentsDir: string): Promise<AggregateCounts> {\n const displayPath = displayDir(agentsDir);\n\n if (!(await directoryExists(agentsDir))) {\n this.log(` ${displayPath.padEnd(COL_PATH_WIDTH)} ${VALIDATE_STATUS.NOT_PRESENT}`);\n return NO_ISSUES;\n }\n\n const agentFiles = await listAgentMdFiles(agentsDir);\n if (agentFiles.length === 0) {\n this.log(` ${displayPath.padEnd(COL_PATH_WIDTH)} ${VALIDATE_STATUS.EMPTY}`);\n return NO_ISSUES;\n }\n\n const results = await Promise.all(\n agentFiles.map(async (fileName) => ({\n name: fileName,\n result: await validateAgentFrontmatter(path.join(agentsDir, fileName)),\n })),\n );\n\n const invalidCount = results.filter((r) => !r.result.valid).length;\n const warnCount = results.filter((r) => r.result.warnings.length > 0).length;\n\n this.log(\n ` ${displayPath.padEnd(COL_PATH_WIDTH)} ${agentFiles.length} agent(s), ${invalidCount} invalid, ${warnCount} with warnings`,\n );\n\n return printAndSumResults(results);\n }\n}\n\n/** Render an absolute path with a `~/` prefix when it's under the user's home directory. */\nfunction displayDir(absolutePath: string): string {\n const home = os.homedir();\n if (absolutePath === home) return \"~\";\n if (absolutePath.startsWith(home + path.sep)) {\n return `~${path.sep}${path.relative(home, absolutePath)}`;\n }\n return absolutePath;\n}\n\nasync function validateInstalledSkill(skillDir: string): Promise<ValidationResult> {\n const skillMdPath = path.join(skillDir, STANDARD_FILES.SKILL_MD);\n const metadataPath = path.join(skillDir, STANDARD_FILES.METADATA_YAML);\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!(await fileExists(skillMdPath))) {\n errors.push(`Missing ${STANDARD_FILES.SKILL_MD}`);\n } else {\n const frontmatterResult = await validateSkillFrontmatter(skillMdPath);\n errors.push(...frontmatterResult.errors);\n warnings.push(...frontmatterResult.warnings);\n }\n\n if (!(await fileExists(metadataPath))) {\n errors.push(`Missing ${STANDARD_FILES.METADATA_YAML}`);\n } else {\n const metadataResult = await validateInstalledSkillMetadata(metadataPath);\n errors.push(...metadataResult.errors);\n warnings.push(...metadataResult.warnings);\n }\n\n return { valid: errors.length === 0, errors, warnings };\n}\n\nasync function validateInstalledSkillMetadata(metadataPath: string): Promise<ValidationResult> {\n let rawMetadata: unknown;\n try {\n const content = await readFile(metadataPath);\n rawMetadata = parseYaml(content);\n } catch (err) {\n return {\n valid: false,\n errors: [`${STANDARD_FILES.METADATA_YAML}: ${getErrorMessage(err)}`],\n warnings: [],\n };\n }\n\n const result = validateSkillMetadata(rawMetadata);\n if (result.success) {\n return { valid: true, errors: [], warnings: [] };\n }\n\n // Over-length cliDescription is advisory — only hard schema violations invalidate the skill\n const { errors, warnings } = splitMetadataValidationIssues(result.error, rawMetadata);\n return {\n valid: errors.length === 0,\n errors: errors.map((e) => `${STANDARD_FILES.METADATA_YAML}: ${e}`),\n warnings: warnings.map((w) => `${STANDARD_FILES.METADATA_YAML}: ${w}`),\n };\n}\n\nasync function findPluginDirectories(pluginsDir: string): Promise<string[]> {\n const entries = await listDirectories(pluginsDir);\n const checks = await Promise.all(\n entries.map(async (name) => ({\n name,\n isPlugin: await directoryExists(path.join(pluginsDir, name, PLUGIN_MANIFEST_DIR)),\n })),\n );\n return checks.filter((check) => check.isPlugin).map((check) => check.name);\n}\n","import path from \"path\";\nimport { isRecord } from \"../utils/type-guards.js\";\nimport { parse as parseYaml } from \"yaml\";\nimport { z } from \"zod\";\nimport { glob, readFile, fileExists, directoryExists } from \"../utils/fs\";\nimport {\n DIRS,\n SKILL_CATEGORIES_PATH,\n SKILL_RULES_PATH,\n SKILLS_DIR_PATH,\n STACKS_FILE_PATH,\n STANDARD_FILES,\n} from \"../consts\";\nimport {\n agentYamlGenerationSchema,\n metadataValidationSchema,\n splitMetadataValidationIssues,\n validateSkillMetadata,\n skillCategoriesFileSchema,\n skillRulesFileSchema,\n stackConfigValidationSchema,\n stacksConfigSchema,\n} from \"./schemas\";\nimport { parseFrontmatter } from \"./loading/loader\";\nimport { loadConfig, loadProjectSourceConfig } from \"./configuration\";\nimport { checkMatrixHealth } from \"./matrix\";\nimport { loadSkillsMatrixFromSource } from \"./loading/source-loader\";\nimport { matrix } from \"./matrix/matrix-provider\";\nimport { getErrorMessage } from \"../utils/errors\";\nimport { formatZodErrors } from \"./schema-validator\";\n\nexport type SourceValidationIssue = {\n severity: \"error\" | \"warning\";\n file: string;\n message: string;\n};\n\nexport type SourceValidationResult = {\n issues: SourceValidationIssue[];\n skillCount: number;\n errorCount: number;\n warningCount: number;\n};\n\n/** Checks if a key uses snake_case (has underscore between lowercase letters) */\nexport function isSnakeCase(key: string): boolean {\n return /[a-z]_[a-z]/.test(key);\n}\n\n/**\n * Checks top-level keys for snake_case usage (camelCase is the convention).\n * Non-object input yields no issues.\n */\nexport function checkSnakeCaseKeys(rawMetadata: unknown, relPath: string): SourceValidationIssue[] {\n if (!isRecord(rawMetadata)) return [];\n\n return Object.keys(rawMetadata)\n .filter(isSnakeCase)\n .map((key) => ({\n severity: \"error\" as const,\n file: relPath,\n message: `Key '${key}' uses snake_case — use camelCase instead`,\n }));\n}\n\n/**\n * Warns when a skill directory's name does not equal the skill's machine id\n * (SKILL.md frontmatter `name`) — the key the loader registers the skill under.\n * Warning, not error: the loader still loads the skill by its id, but the\n * directory no longer signals which skill it contains.\n */\nexport function checkDirNameMatchesSkillId(\n skillId: string,\n relPath: string,\n dirName: string,\n): SourceValidationIssue[] {\n if (skillId === dirName) return [];\n return [\n {\n severity: \"warning\",\n file: relPath,\n message: `Directory name '${dirName}' does not match skill id '${skillId}'`,\n },\n ];\n}\n\n/**\n * Reads a skill directory's SKILL.md frontmatter and checks the directory name\n * against the skill's machine id. When the id cannot be read (unreadable file or\n * missing/invalid frontmatter), reports that the check could not run.\n */\nasync function checkSkillDirName(\n skillsDir: string,\n skillsDirRelPath: string,\n skillDir: string,\n): Promise<SourceValidationIssue[]> {\n const dirName = path.basename(skillDir);\n const skillMdRelPath = path.join(skillsDirRelPath, skillDir, STANDARD_FILES.SKILL_MD);\n\n try {\n const content = await readFile(path.join(skillsDir, skillDir, STANDARD_FILES.SKILL_MD));\n const frontmatter = parseFrontmatter(content, skillMdRelPath);\n\n if (frontmatter === null) {\n return [\n {\n severity: \"warning\",\n file: skillMdRelPath,\n message: `Cannot verify directory name '${dirName}': missing or invalid ${STANDARD_FILES.SKILL_MD} frontmatter`,\n },\n ];\n }\n\n return checkDirNameMatchesSkillId(frontmatter.name, skillMdRelPath, dirName);\n } catch (error) {\n return [\n {\n severity: \"warning\",\n file: skillMdRelPath,\n message: `Cannot verify directory name '${dirName}': ${getErrorMessage(error)}`,\n },\n ];\n }\n}\n\n/**\n * Finds missing SKILL.md / metadata.yaml pairs (pure function, no I/O).\n *\n * Returns issues for:\n * - Directories with SKILL.md but no metadata.yaml\n * - Directories with metadata.yaml but no SKILL.md\n */\nexport function validateSkillFilePairs(\n skillMdDirs: Set<string>,\n metadataDirs: Set<string>,\n skillsDir: string,\n): SourceValidationIssue[] {\n const missingMetadata = [...skillMdDirs]\n .filter((dir) => !metadataDirs.has(dir))\n .map((dir) => ({\n severity: \"error\" as const,\n file: path.join(skillsDir, dir),\n message: `Missing ${STANDARD_FILES.METADATA_YAML} — skill directory has ${STANDARD_FILES.SKILL_MD} but no metadata`,\n }));\n\n const missingSkillMd = [...metadataDirs]\n .filter((dir) => !skillMdDirs.has(dir))\n .map((dir) => ({\n severity: \"error\" as const,\n file: path.join(skillsDir, dir),\n message: `Missing ${STANDARD_FILES.SKILL_MD} — skill directory has ${STANDARD_FILES.METADATA_YAML} but no SKILL.md`,\n }));\n\n return [...missingMetadata, ...missingSkillMd];\n}\n\n/**\n * Validates a skills source repository for metadata correctness.\n *\n * Checks:\n * 1. Every metadata.yaml against the strict validation schema\n * (over-length cliDescription is downgraded to a warning)\n * 2. Directory name equals the skill's machine id (SKILL.md frontmatter name)\n * 3. Cross-references resolve to existing skill IDs (via checkMatrixHealth)\n * 4. camelCase key convention (no snake_case)\n * 5. Every skill directory has both SKILL.md and metadata.yaml\n */\nexport async function validateSource(sourcePath: string): Promise<SourceValidationResult> {\n const issues: SourceValidationIssue[] = [];\n\n const resolvedPath = path.isAbsolute(sourcePath) ? sourcePath : path.resolve(sourcePath);\n\n if (!(await directoryExists(resolvedPath))) {\n issues.push({\n severity: \"error\",\n file: resolvedPath,\n message: \"Source directory does not exist\",\n });\n return buildResult(issues, 0);\n }\n\n const sourceProjectConfig = await loadProjectSourceConfig(resolvedPath);\n const skillsDirRelPath = sourceProjectConfig?.skillsDir ?? SKILLS_DIR_PATH;\n const skillsDir = path.join(resolvedPath, skillsDirRelPath);\n\n if (!(await directoryExists(skillsDir))) {\n issues.push({\n severity: \"error\",\n file: skillsDir,\n message: \"Skills directory does not exist\",\n });\n return buildResult(issues, 0);\n }\n\n // Phase 1: Check every skill directory has both SKILL.md and metadata.yaml\n const skillMdFiles = await glob(`**/${STANDARD_FILES.SKILL_MD}`, skillsDir);\n const metadataFiles = await glob(`**/${STANDARD_FILES.METADATA_YAML}`, skillsDir);\n\n const skillMdDirs = new Set(skillMdFiles.map((f) => path.dirname(f)));\n const metadataDirs = new Set(metadataFiles.map((f) => path.dirname(f)));\n\n issues.push(...validateSkillFilePairs(skillMdDirs, metadataDirs, skillsDir));\n\n // Phase 2: Validate each metadata.yaml against strict schema and conventions.\n // Pair violations were already reported by phase 1 — validate only complete pairs.\n const validMetadataFiles = metadataFiles.filter((f) => skillMdDirs.has(path.dirname(f)));\n for (const metadataFile of validMetadataFiles) {\n const metadataPath = path.join(skillsDir, metadataFile);\n const skillDir = path.dirname(metadataFile);\n const relPath = path.join(skillsDirRelPath, metadataFile);\n\n // Read and parse metadata.yaml\n let rawMetadata: unknown;\n try {\n const metadataContent = await readFile(metadataPath);\n rawMetadata = parseYaml(metadataContent);\n } catch (error) {\n issues.push({\n severity: \"error\",\n file: relPath,\n message: `Failed to parse YAML: ${getErrorMessage(error)}`,\n });\n continue;\n }\n\n issues.push(...checkSnakeCaseKeys(rawMetadata, relPath));\n\n const result = validateSkillMetadata(rawMetadata);\n if (!result.success) {\n const { errors, warnings } = splitMetadataValidationIssues(result.error, rawMetadata);\n issues.push(\n ...errors.map((message) => ({ severity: \"error\" as const, file: relPath, message })),\n ...warnings.map((message) => ({ severity: \"warning\" as const, file: relPath, message })),\n );\n }\n\n // Independent of metadata validity — the id lives in SKILL.md frontmatter\n issues.push(...(await checkSkillDirName(skillsDir, skillsDirRelPath, skillDir)));\n }\n\n // Phase 3: Cross-reference validation via matrix health check\n try {\n await loadSkillsMatrixFromSource({ sourceFlag: resolvedPath, skipExtraSources: true });\n issues.push(\n ...checkMatrixHealth(matrix).map((healthIssue) => ({\n severity: healthIssue.severity,\n file: SKILL_CATEGORIES_PATH,\n message: healthIssue.details,\n })),\n );\n } catch (error) {\n issues.push({\n severity: \"warning\",\n file: SKILL_CATEGORIES_PATH,\n message: `Cross-reference validation skipped: failed to load categories/rules: ${getErrorMessage(error)}`,\n });\n }\n\n // Phases 4–6: optional source-repo targets — run in parallel\n // Phase 4: stack skill metadata + stack configs\n // Phase 5: agent metadata\n // Phase 6: config/*.ts runtime exports\n const extraIssues = await Promise.all([\n validateStacks(resolvedPath),\n validateAgents(resolvedPath),\n validateConfigFiles(resolvedPath),\n ]);\n issues.push(...extraIssues.flat());\n\n return buildResult(issues, validMetadataFiles.length);\n}\n\n/**\n * Validates stack-embedded skill metadata.yaml files and stack config.yaml files.\n * Skips silently when src/stacks/ does not exist.\n */\nasync function validateStacks(resolvedPath: string): Promise<SourceValidationIssue[]> {\n const stacksDir = path.join(resolvedPath, DIRS.stacks);\n if (!(await directoryExists(stacksDir))) return [];\n\n const [skillMetaIssues, configIssues] = await Promise.all([\n validateYamlFiles({\n baseDir: stacksDir,\n relBaseDir: DIRS.stacks,\n pattern: `**/skills/**/${STANDARD_FILES.METADATA_YAML}`,\n schema: metadataValidationSchema,\n }),\n validateYamlFiles({\n baseDir: stacksDir,\n relBaseDir: DIRS.stacks,\n pattern: `*/${STANDARD_FILES.CONFIG_YAML}`,\n schema: stackConfigValidationSchema,\n }),\n ]);\n return [...skillMetaIssues, ...configIssues];\n}\n\n/**\n * Validates agent metadata.yaml files against the compiled agent output schema.\n * Skips silently when src/agents/ does not exist.\n */\nasync function validateAgents(resolvedPath: string): Promise<SourceValidationIssue[]> {\n const agentsDir = path.join(resolvedPath, DIRS.agents);\n if (!(await directoryExists(agentsDir))) return [];\n\n return validateYamlFiles({\n baseDir: agentsDir,\n relBaseDir: DIRS.agents,\n pattern: `**/${STANDARD_FILES.AGENT_METADATA_YAML}`,\n schema: agentYamlGenerationSchema,\n });\n}\n\n/**\n * Validates TypeScript config files (skill-categories.ts, skill-rules.ts, stacks.ts)\n * by runtime-loading them via loadConfig and validating the default export.\n * Skips silently when a file does not exist.\n */\nasync function validateConfigFiles(resolvedPath: string): Promise<SourceValidationIssue[]> {\n const results = await Promise.all([\n validateTsConfig(resolvedPath, SKILL_CATEGORIES_PATH, skillCategoriesFileSchema),\n validateTsConfig(resolvedPath, SKILL_RULES_PATH, skillRulesFileSchema),\n validateTsConfig(resolvedPath, STACKS_FILE_PATH, stacksConfigSchema),\n ]);\n return results.flat();\n}\n\n/**\n * Globs YAML files under baseDir and validates each against the given schema.\n * Reports parse errors, schema errors (as field-path messages), and uses relBaseDir\n * for display paths so issue locations match the project-relative form used elsewhere.\n */\nasync function validateYamlFiles(opts: {\n baseDir: string;\n relBaseDir: string;\n pattern: string;\n schema: z.ZodType<unknown>;\n}): Promise<SourceValidationIssue[]> {\n const issues: SourceValidationIssue[] = [];\n const files = await glob(opts.pattern, opts.baseDir);\n\n for (const relFile of files) {\n const absPath = path.join(opts.baseDir, relFile);\n const displayPath = path.join(opts.relBaseDir, relFile);\n\n let parsed: unknown;\n try {\n parsed = parseYaml(await readFile(absPath));\n } catch {\n issues.push({ severity: \"error\", file: displayPath, message: \"Failed to parse YAML\" });\n continue;\n }\n\n const result = opts.schema.safeParse(parsed);\n if (result.success) continue;\n\n issues.push(\n ...formatZodErrors(result.error).map((message) => ({\n severity: \"error\" as const,\n file: displayPath,\n message,\n })),\n );\n }\n return issues;\n}\n\n/**\n * Runtime-loads a TypeScript config file via loadConfig and reports validation failures.\n * Absent files are not errors — only report when the file exists but fails to load or validate.\n *\n * loadConfig already unwraps the default export (via jiti's `{ default: true }` + interopDefault),\n * so a returned `null` means the module has no default export (named-only modules surface here).\n */\nasync function validateTsConfig(\n resolvedPath: string,\n relConfigPath: string,\n schema: z.ZodType<unknown>,\n): Promise<SourceValidationIssue[]> {\n const absPath = path.join(resolvedPath, relConfigPath);\n if (!(await fileExists(absPath))) return [];\n\n try {\n const loaded = await loadConfig(absPath, schema);\n if (loaded === null) {\n return [{ severity: \"error\", file: relConfigPath, message: \"Config has no default export\" }];\n }\n return [];\n } catch (error) {\n return [\n { severity: \"error\", file: relConfigPath, message: formatLoadError(relConfigPath, error) },\n ];\n }\n}\n\n/**\n * Normalizes a loadConfig error so the message references the relative config path,\n * not the absolute path embedded by loadConfig's own template string.\n */\nfunction formatLoadError(relConfigPath: string, error: unknown): string {\n const raw = getErrorMessage(error);\n const stripped = raw.replace(/Failed to load config from '[^']+':\\s*/, \"\");\n return `Failed to load ${relConfigPath}: ${stripped}`;\n}\n\nfunction buildResult(issues: SourceValidationIssue[], skillCount: number): SourceValidationResult {\n const errorCount = issues.filter((i) => i.severity === \"error\").length;\n const warningCount = issues.filter((i) => i.severity === \"warning\").length;\n return { issues, skillCount, errorCount, warningCount };\n}\n"],"mappings":"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","names":["path","parseYaml","path","parseYaml"]}
|