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,475 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
detectProject,
|
|
4
|
+
loadSource
|
|
5
|
+
} from "../chunk-DDG4F3FE.js";
|
|
6
|
+
import "../chunk-N4IZ6GBO.js";
|
|
7
|
+
import "../chunk-CDMHSHBN.js";
|
|
8
|
+
import "../chunk-VIFZ6NFH.js";
|
|
9
|
+
import {
|
|
10
|
+
filterExcludedEntries,
|
|
11
|
+
listAgentMdFiles
|
|
12
|
+
} from "../chunk-YKKIJHZB.js";
|
|
13
|
+
import {
|
|
14
|
+
BaseCommand,
|
|
15
|
+
EXIT_CODES
|
|
16
|
+
} from "../chunk-OA5SUEQD.js";
|
|
17
|
+
import "../chunk-SYUOXSPU.js";
|
|
18
|
+
import "../chunk-P3PN5SVI.js";
|
|
19
|
+
import {
|
|
20
|
+
discoverLocalSkills,
|
|
21
|
+
effectivelyExcludedSkillIds,
|
|
22
|
+
getStackSkillIds,
|
|
23
|
+
getVerifiedPluginInstallPaths,
|
|
24
|
+
installBaseDir,
|
|
25
|
+
isHomeDirectory,
|
|
26
|
+
parseMarketplacePluginRef,
|
|
27
|
+
resolveInstallPaths,
|
|
28
|
+
validateProjectConfig
|
|
29
|
+
} from "../chunk-KH7MOIM5.js";
|
|
30
|
+
import {
|
|
31
|
+
directoryExists,
|
|
32
|
+
fileExists,
|
|
33
|
+
getErrorMessage,
|
|
34
|
+
setVerbose
|
|
35
|
+
} from "../chunk-3LIU2ZEF.js";
|
|
36
|
+
import {
|
|
37
|
+
matrix
|
|
38
|
+
} from "../chunk-DJAZE4PD.js";
|
|
39
|
+
import "../chunk-VEP23B5W.js";
|
|
40
|
+
import {
|
|
41
|
+
CLAUDE_SRC_DIR,
|
|
42
|
+
CLI_INVOKE_COMMAND,
|
|
43
|
+
DEFAULT_BRANDING,
|
|
44
|
+
EJECT_SOURCE,
|
|
45
|
+
LOCAL_SKILLS_PATH,
|
|
46
|
+
STANDARD_FILES,
|
|
47
|
+
UI_SYMBOLS
|
|
48
|
+
} from "../chunk-O5ASLZ2K.js";
|
|
49
|
+
import "../chunk-YU2VGX5R.js";
|
|
50
|
+
import {
|
|
51
|
+
init_esm_shims
|
|
52
|
+
} from "../chunk-P56WJ5FA.js";
|
|
53
|
+
|
|
54
|
+
// src/cli/commands/doctor.ts
|
|
55
|
+
init_esm_shims();
|
|
56
|
+
import os from "os";
|
|
57
|
+
import path from "path";
|
|
58
|
+
import { countBy, unique } from "remeda";
|
|
59
|
+
var CONFIG_TS_REL = `${CLAUDE_SRC_DIR}/${STANDARD_FILES.CONFIG_TS}`;
|
|
60
|
+
function checkConfigValid(config) {
|
|
61
|
+
if (!config) {
|
|
62
|
+
return {
|
|
63
|
+
result: {
|
|
64
|
+
kind: "config",
|
|
65
|
+
status: "fail",
|
|
66
|
+
message: `${CONFIG_TS_REL} not found`,
|
|
67
|
+
details: [`Run '${CLI_INVOKE_COMMAND} init' to create a configuration`]
|
|
68
|
+
},
|
|
69
|
+
config: null
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
const validation = validateProjectConfig(config);
|
|
73
|
+
if (!validation.valid) {
|
|
74
|
+
return {
|
|
75
|
+
result: {
|
|
76
|
+
kind: "config",
|
|
77
|
+
status: "fail",
|
|
78
|
+
message: `${CONFIG_TS_REL} has errors`,
|
|
79
|
+
details: validation.errors
|
|
80
|
+
},
|
|
81
|
+
config: null
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
if (validation.warnings.length > 0) {
|
|
85
|
+
return {
|
|
86
|
+
result: {
|
|
87
|
+
kind: "config",
|
|
88
|
+
status: "warn",
|
|
89
|
+
message: `${CONFIG_TS_REL} has warnings`,
|
|
90
|
+
details: validation.warnings
|
|
91
|
+
},
|
|
92
|
+
config
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
result: {
|
|
97
|
+
kind: "config",
|
|
98
|
+
status: "pass",
|
|
99
|
+
message: `${CONFIG_TS_REL} is valid`
|
|
100
|
+
},
|
|
101
|
+
config
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
async function checkSkillsResolved(config, matrix2, projectDir) {
|
|
105
|
+
const excludedIds = effectivelyExcludedSkillIds(config.skills);
|
|
106
|
+
const stackIds = config.stack ? getStackSkillIds(config.stack) : [];
|
|
107
|
+
const uniqueSkills = unique([...stackIds, ...config.skills.map((s) => s.id)]).filter(
|
|
108
|
+
(id) => !excludedIds.has(id)
|
|
109
|
+
);
|
|
110
|
+
if (uniqueSkills.length === 0) {
|
|
111
|
+
return {
|
|
112
|
+
kind: "skills",
|
|
113
|
+
status: "pass",
|
|
114
|
+
message: "No skills configured"
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
const [localResult, globalResult] = await Promise.all([
|
|
118
|
+
discoverLocalSkills(projectDir),
|
|
119
|
+
!isHomeDirectory(projectDir) ? discoverLocalSkills(os.homedir()) : null
|
|
120
|
+
]);
|
|
121
|
+
const localSkillIds = /* @__PURE__ */ new Set([
|
|
122
|
+
...localResult?.skills.map((s) => s.id) ?? [],
|
|
123
|
+
...globalResult?.skills.map((s) => s.id) ?? []
|
|
124
|
+
]);
|
|
125
|
+
const missingSkills = [];
|
|
126
|
+
for (const skillId of uniqueSkills) {
|
|
127
|
+
const inMatrix = skillId in matrix2.skills;
|
|
128
|
+
const inLocal = localSkillIds.has(skillId);
|
|
129
|
+
if (!inMatrix && !inLocal) {
|
|
130
|
+
missingSkills.push(skillId);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if (missingSkills.length > 0) {
|
|
134
|
+
return {
|
|
135
|
+
kind: "skills",
|
|
136
|
+
status: "fail",
|
|
137
|
+
message: `${uniqueSkills.length - missingSkills.length}/${uniqueSkills.length} skills found`,
|
|
138
|
+
details: missingSkills.map((s) => `- ${s} (not found)`)
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
kind: "skills",
|
|
143
|
+
status: "pass",
|
|
144
|
+
message: `${uniqueSkills.length}/${uniqueSkills.length} skills found`
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
async function checkAgentsCompiled(config, projectDir) {
|
|
148
|
+
const agents = config.agents ?? [];
|
|
149
|
+
if (agents.length === 0) {
|
|
150
|
+
return {
|
|
151
|
+
kind: "agents",
|
|
152
|
+
status: "pass",
|
|
153
|
+
message: "No agents configured"
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
const projectAgentsDir = resolveInstallPaths(projectDir, "project").agentsDir;
|
|
157
|
+
const globalAgentsDir = resolveInstallPaths(projectDir, "global").agentsDir;
|
|
158
|
+
const agentChecks = await Promise.all(
|
|
159
|
+
agents.map(async (agent) => {
|
|
160
|
+
const agentsDir = agent.scope === "global" ? globalAgentsDir : projectAgentsDir;
|
|
161
|
+
const agentPath = path.join(agentsDir, `${agent.name}.md`);
|
|
162
|
+
return { name: agent.name, compiled: await fileExists(agentPath) };
|
|
163
|
+
})
|
|
164
|
+
);
|
|
165
|
+
const missingAgents = agentChecks.filter((c) => !c.compiled).map((c) => c.name);
|
|
166
|
+
if (missingAgents.length > 0) {
|
|
167
|
+
return {
|
|
168
|
+
kind: "agents",
|
|
169
|
+
status: "warn",
|
|
170
|
+
message: `${missingAgents.length} agent${missingAgents.length === 1 ? "" : "s"} need${missingAgents.length === 1 ? "s" : ""} recompilation`,
|
|
171
|
+
details: missingAgents.map((a) => `- ${a} (missing)`)
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
return {
|
|
175
|
+
kind: "agents",
|
|
176
|
+
status: "pass",
|
|
177
|
+
message: `${agents.length}/${agents.length} agents compiled`
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
async function checkNoOrphans(config, projectDir) {
|
|
181
|
+
const projectAgentsDir = resolveInstallPaths(projectDir, "project").agentsDir;
|
|
182
|
+
const globalAgentsDir = resolveInstallPaths(projectDir, "global").agentsDir;
|
|
183
|
+
const scopesShareAgentsDir = isHomeDirectory(projectDir);
|
|
184
|
+
const [projectExists, globalExists] = await Promise.all([
|
|
185
|
+
directoryExists(projectAgentsDir),
|
|
186
|
+
!scopesShareAgentsDir ? directoryExists(globalAgentsDir) : false
|
|
187
|
+
]);
|
|
188
|
+
if (!projectExists && !globalExists) {
|
|
189
|
+
return {
|
|
190
|
+
kind: "orphans",
|
|
191
|
+
status: "pass",
|
|
192
|
+
message: "No agents directory"
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
const projectMdFiles = projectExists ? await listAgentMdFiles(projectAgentsDir) : [];
|
|
196
|
+
const globalMdFiles = globalExists ? await listAgentMdFiles(globalAgentsDir) : [];
|
|
197
|
+
const activeProjectAgents = new Set(
|
|
198
|
+
(config.agents ?? []).filter((a) => a.scope === "project" && !a.excluded).map((a) => a.name)
|
|
199
|
+
);
|
|
200
|
+
const knownGlobalAgents = new Set(
|
|
201
|
+
(config.agents ?? []).filter((a) => a.scope === "global").map((a) => a.name)
|
|
202
|
+
);
|
|
203
|
+
const knownProjectDirAgents = scopesShareAgentsDir ? /* @__PURE__ */ new Set([...activeProjectAgents, ...knownGlobalAgents]) : activeProjectAgents;
|
|
204
|
+
const orphanedFiles = [];
|
|
205
|
+
for (const file of projectMdFiles) {
|
|
206
|
+
const agentName = file.replace(/\.md$/, "");
|
|
207
|
+
if (!knownProjectDirAgents.has(agentName)) {
|
|
208
|
+
orphanedFiles.push(agentName);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
for (const file of globalMdFiles) {
|
|
212
|
+
const agentName = file.replace(/\.md$/, "");
|
|
213
|
+
if (!knownGlobalAgents.has(agentName)) {
|
|
214
|
+
orphanedFiles.push(agentName);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
if (orphanedFiles.length > 0) {
|
|
218
|
+
return {
|
|
219
|
+
kind: "orphans",
|
|
220
|
+
status: "warn",
|
|
221
|
+
message: `${orphanedFiles.length} orphaned agent file${orphanedFiles.length === 1 ? "" : "s"}`,
|
|
222
|
+
details: orphanedFiles.map((f) => `- ${f}.md (not in config)`)
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
return {
|
|
226
|
+
kind: "orphans",
|
|
227
|
+
status: "pass",
|
|
228
|
+
message: "No orphaned agent files"
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
async function checkSkillsInstalled(config, projectDir) {
|
|
232
|
+
const skills = config.skills ?? [];
|
|
233
|
+
const ejectSkills = skills.filter((s) => s.source === EJECT_SOURCE);
|
|
234
|
+
if (ejectSkills.length === 0) {
|
|
235
|
+
return {
|
|
236
|
+
kind: "installed",
|
|
237
|
+
status: "pass",
|
|
238
|
+
message: "No eject-mode skills configured"
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
const skillChecks = await Promise.all(
|
|
242
|
+
ejectSkills.map(async (skill) => {
|
|
243
|
+
const baseDir = installBaseDir(projectDir, skill.scope);
|
|
244
|
+
const skillMdPath = path.join(baseDir, LOCAL_SKILLS_PATH, skill.id, STANDARD_FILES.SKILL_MD);
|
|
245
|
+
return { id: skill.id, installed: await fileExists(skillMdPath) };
|
|
246
|
+
})
|
|
247
|
+
);
|
|
248
|
+
const missingSkills = skillChecks.filter((c) => !c.installed).map((c) => c.id);
|
|
249
|
+
if (missingSkills.length > 0) {
|
|
250
|
+
return {
|
|
251
|
+
kind: "installed",
|
|
252
|
+
status: "warn",
|
|
253
|
+
message: `${missingSkills.length} skill${missingSkills.length === 1 ? "" : "s"} missing from disk`,
|
|
254
|
+
details: missingSkills.map((s) => `- ${s} (not found in ${LOCAL_SKILLS_PATH}/)`)
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
return {
|
|
258
|
+
kind: "installed",
|
|
259
|
+
status: "pass",
|
|
260
|
+
message: `${ejectSkills.length}/${ejectSkills.length} eject-mode skills installed`
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
async function checkPluginSkillsInstalled(config, projectDir) {
|
|
264
|
+
const pluginSkills = config.skills.filter((s) => s.source !== EJECT_SOURCE);
|
|
265
|
+
if (pluginSkills.length === 0) {
|
|
266
|
+
return {
|
|
267
|
+
kind: "plugins",
|
|
268
|
+
status: "pass",
|
|
269
|
+
message: "No plugin-mode skills configured"
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
const baseDirs = unique(pluginSkills.map((s) => installBaseDir(projectDir, s.scope)));
|
|
273
|
+
const missingPerBaseDir = await Promise.all(
|
|
274
|
+
baseDirs.map(async (baseDir) => {
|
|
275
|
+
const installedIds = new Set(
|
|
276
|
+
(await getVerifiedPluginInstallPaths(baseDir)).map(
|
|
277
|
+
(plugin) => parseMarketplacePluginRef(plugin.pluginKey)
|
|
278
|
+
)
|
|
279
|
+
);
|
|
280
|
+
return pluginSkills.filter((skill) => installBaseDir(projectDir, skill.scope) === baseDir).filter((skill) => !installedIds.has(skill.id)).map((skill) => skill.id);
|
|
281
|
+
})
|
|
282
|
+
);
|
|
283
|
+
const missingSkills = missingPerBaseDir.flat();
|
|
284
|
+
if (missingSkills.length > 0) {
|
|
285
|
+
return {
|
|
286
|
+
kind: "plugins",
|
|
287
|
+
status: "warn",
|
|
288
|
+
message: `${missingSkills.length} skill${missingSkills.length === 1 ? "" : "s"} not installed as plugins`,
|
|
289
|
+
details: missingSkills.map((s) => `- ${s} (no enabled plugin found)`)
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
return {
|
|
293
|
+
kind: "plugins",
|
|
294
|
+
status: "pass",
|
|
295
|
+
message: `${pluginSkills.length}/${pluginSkills.length} plugin-mode skills installed`
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
async function checkSourceReachable(projectDir) {
|
|
299
|
+
try {
|
|
300
|
+
const { sourceResult: result } = await loadSource({
|
|
301
|
+
projectDir
|
|
302
|
+
});
|
|
303
|
+
const skillCount = Object.keys(matrix.skills).length;
|
|
304
|
+
const sourceLabel = result.isLocal ? "local" : "remote";
|
|
305
|
+
return {
|
|
306
|
+
kind: "source",
|
|
307
|
+
status: "pass",
|
|
308
|
+
message: `Connected to ${sourceLabel}: ${result.sourcePath}`,
|
|
309
|
+
details: [`${skillCount} skills available`]
|
|
310
|
+
};
|
|
311
|
+
} catch (error) {
|
|
312
|
+
const message = getErrorMessage(error);
|
|
313
|
+
return {
|
|
314
|
+
kind: "source",
|
|
315
|
+
status: "fail",
|
|
316
|
+
message: "Failed to load source",
|
|
317
|
+
details: [message]
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
var CHECK_WIDTH = 20;
|
|
322
|
+
function formatCheckName(name) {
|
|
323
|
+
return name.padEnd(CHECK_WIDTH);
|
|
324
|
+
}
|
|
325
|
+
function formatStatus(status) {
|
|
326
|
+
switch (status) {
|
|
327
|
+
case "pass":
|
|
328
|
+
return UI_SYMBOLS.CHECK;
|
|
329
|
+
case "fail":
|
|
330
|
+
return UI_SYMBOLS.CROSS;
|
|
331
|
+
case "warn":
|
|
332
|
+
return "!";
|
|
333
|
+
case "skip":
|
|
334
|
+
return "-";
|
|
335
|
+
default: {
|
|
336
|
+
const _exhaustive = status;
|
|
337
|
+
return _exhaustive;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
function formatCheckLine(name, result) {
|
|
342
|
+
const headerLine = ` ${formatCheckName(name)}${formatStatus(result.status)} ${result.message}`;
|
|
343
|
+
const detailLines = (result.details ?? []).map(
|
|
344
|
+
(detail) => ` ${" ".repeat(CHECK_WIDTH)} ${detail}`
|
|
345
|
+
);
|
|
346
|
+
return [headerLine, ...detailLines];
|
|
347
|
+
}
|
|
348
|
+
function formatSummary(results) {
|
|
349
|
+
const counts = countBy(results, (r) => r.status);
|
|
350
|
+
const plural = (n, word) => `${n} ${word}${n === 1 ? "" : "s"}`;
|
|
351
|
+
const parts = [
|
|
352
|
+
`${counts.pass ?? 0} passed`,
|
|
353
|
+
plural(counts.warn ?? 0, "warning"),
|
|
354
|
+
plural(counts.fail ?? 0, "error")
|
|
355
|
+
];
|
|
356
|
+
return ` Summary: ${parts.join(", ")}`;
|
|
357
|
+
}
|
|
358
|
+
var TIPS = [
|
|
359
|
+
{
|
|
360
|
+
kind: "agents",
|
|
361
|
+
status: "warn",
|
|
362
|
+
tip: ` Tip: Run '${CLI_INVOKE_COMMAND} compile' to generate missing agent files`
|
|
363
|
+
},
|
|
364
|
+
{
|
|
365
|
+
kind: "config",
|
|
366
|
+
status: "fail",
|
|
367
|
+
tip: ` Tip: Run '${CLI_INVOKE_COMMAND} init' to create or fix configuration`
|
|
368
|
+
},
|
|
369
|
+
{
|
|
370
|
+
kind: "skills",
|
|
371
|
+
status: "fail",
|
|
372
|
+
tip: " Tip: Check skill IDs in config match available skills"
|
|
373
|
+
},
|
|
374
|
+
{
|
|
375
|
+
kind: "installed",
|
|
376
|
+
status: "warn",
|
|
377
|
+
// No command is named on purpose: 'eject skills --force' re-copies every skill in the
|
|
378
|
+
// source and always targets project scope, so it cannot repair a global-scoped skill
|
|
379
|
+
// and it litters a plugin-mode project with local skill directories.
|
|
380
|
+
tip: " Tip: Re-eject the missing skills from the source to restore their files"
|
|
381
|
+
}
|
|
382
|
+
];
|
|
383
|
+
function formatTips(results) {
|
|
384
|
+
return TIPS.filter((t) => results.some((r) => r.kind === t.kind && r.status === t.status)).map(
|
|
385
|
+
(t) => t.tip
|
|
386
|
+
);
|
|
387
|
+
}
|
|
388
|
+
function skippedResult(kind) {
|
|
389
|
+
return { kind, status: "skip", message: "Skipped (config invalid)" };
|
|
390
|
+
}
|
|
391
|
+
async function safeCheck(kind, fn) {
|
|
392
|
+
try {
|
|
393
|
+
return await fn();
|
|
394
|
+
} catch (error) {
|
|
395
|
+
return { kind, status: "fail", message: "Check threw", details: [getErrorMessage(error)] };
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
var Doctor = class _Doctor extends BaseCommand {
|
|
399
|
+
static summary = "Diagnose common configuration issues";
|
|
400
|
+
static description = `Run diagnostic checks on your ${DEFAULT_BRANDING.NAME} configuration to identify issues with config validity, skill resolution, agent compilation, and source connectivity.`;
|
|
401
|
+
static examples = ["<%= config.bin %> <%= command.id %>"];
|
|
402
|
+
// Override parent baseFlags to drop --source (not relevant for diagnostics)
|
|
403
|
+
static baseFlags = {};
|
|
404
|
+
static flags = {};
|
|
405
|
+
async run() {
|
|
406
|
+
await this.parse(_Doctor);
|
|
407
|
+
setVerbose(true);
|
|
408
|
+
const projectDir = process.cwd();
|
|
409
|
+
this.printHeader();
|
|
410
|
+
const results = await this.runAllChecks(projectDir);
|
|
411
|
+
this.printResults(results);
|
|
412
|
+
if (results.some((r) => r.status === "fail")) {
|
|
413
|
+
this.exit(EXIT_CODES.ERROR);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
printHeader() {
|
|
417
|
+
this.log("");
|
|
418
|
+
this.log(`${DEFAULT_BRANDING.NAME} Doctor`);
|
|
419
|
+
this.log("");
|
|
420
|
+
this.log(" Checking configuration health...");
|
|
421
|
+
this.log("");
|
|
422
|
+
}
|
|
423
|
+
async runAllChecks(projectDir) {
|
|
424
|
+
const detected = await detectProject(projectDir);
|
|
425
|
+
const { result: configResult, config } = checkConfigValid(detected?.config ?? null);
|
|
426
|
+
this.logCheck("Config Valid", configResult);
|
|
427
|
+
const sourceResult = await safeCheck("source", () => checkSourceReachable(projectDir));
|
|
428
|
+
const filteredConfig = config ? filterExcludedEntries(config) : null;
|
|
429
|
+
const skillsResult = !config ? skippedResult("skills") : sourceResult.status === "fail" ? {
|
|
430
|
+
kind: "skills",
|
|
431
|
+
status: "skip",
|
|
432
|
+
message: "Skipped (source unreachable)"
|
|
433
|
+
} : await safeCheck("skills", () => checkSkillsResolved(config, matrix, projectDir));
|
|
434
|
+
this.logCheck("Skills Resolved", skillsResult);
|
|
435
|
+
const agentsResult = filteredConfig ? await safeCheck("agents", () => checkAgentsCompiled(filteredConfig, projectDir)) : skippedResult("agents");
|
|
436
|
+
this.logCheck("Agents Compiled", agentsResult);
|
|
437
|
+
const orphansResult = config ? await safeCheck("orphans", () => checkNoOrphans(config, projectDir)) : skippedResult("orphans");
|
|
438
|
+
this.logCheck("No Orphans", orphansResult);
|
|
439
|
+
const installedResult = filteredConfig ? await safeCheck("installed", () => checkSkillsInstalled(filteredConfig, projectDir)) : skippedResult("installed");
|
|
440
|
+
this.logCheck("Skills Installed", installedResult);
|
|
441
|
+
const pluginsResult = filteredConfig ? await safeCheck("plugins", () => checkPluginSkillsInstalled(filteredConfig, projectDir)) : skippedResult("plugins");
|
|
442
|
+
this.logCheck("Plugins Installed", pluginsResult);
|
|
443
|
+
this.logCheck("Source Reachable", sourceResult);
|
|
444
|
+
return [
|
|
445
|
+
configResult,
|
|
446
|
+
skillsResult,
|
|
447
|
+
agentsResult,
|
|
448
|
+
orphansResult,
|
|
449
|
+
installedResult,
|
|
450
|
+
pluginsResult,
|
|
451
|
+
sourceResult
|
|
452
|
+
];
|
|
453
|
+
}
|
|
454
|
+
logCheck(name, result) {
|
|
455
|
+
for (const line of formatCheckLine(name, result)) {
|
|
456
|
+
this.log(line);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
printResults(results) {
|
|
460
|
+
this.log("");
|
|
461
|
+
this.log(formatSummary(results));
|
|
462
|
+
const tips = formatTips(results);
|
|
463
|
+
if (tips.length > 0) {
|
|
464
|
+
this.log("");
|
|
465
|
+
for (const tip of tips) {
|
|
466
|
+
this.log(tip);
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
this.log("");
|
|
470
|
+
}
|
|
471
|
+
};
|
|
472
|
+
export {
|
|
473
|
+
Doctor as default
|
|
474
|
+
};
|
|
475
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cli/commands/doctor.ts"],"sourcesContent":["import os from \"os\";\nimport path from \"path\";\nimport { BaseCommand } from \"../base-command\";\nimport { getErrorMessage } from \"../utils/errors\";\nimport { EXIT_CODES } from \"../lib/exit-codes\";\nimport { effectivelyExcludedSkillIds, validateProjectConfig } from \"../lib/configuration\";\nimport { loadSource, detectProject } from \"../lib/operations\";\nimport { matrix } from \"../lib/matrix/matrix-provider\";\nimport { discoverLocalSkills } from \"../lib/skills\";\nimport { getStackSkillIds } from \"../lib/stacks\";\nimport { filterExcludedEntries, listAgentMdFiles } from \"../lib/agents\";\nimport { getVerifiedPluginInstallPaths, parseMarketplacePluginRef } from \"../lib/plugins\";\nimport { isHomeDirectory, installBaseDir, resolveInstallPaths } from \"../lib/installation\";\nimport type { MergedSkillsMatrix, ProjectConfig, SkillConfig } from \"../types\";\nimport { fileExists, directoryExists } from \"../utils/fs\";\nimport {\n CLAUDE_SRC_DIR,\n CLI_INVOKE_COMMAND,\n DEFAULT_BRANDING,\n EJECT_SOURCE,\n LOCAL_SKILLS_PATH,\n STANDARD_FILES,\n UI_SYMBOLS,\n} from \"../consts\";\nimport { countBy, unique } from \"remeda\";\nimport { setVerbose } from \"../utils/logger\";\n\ntype CheckKind = \"config\" | \"skills\" | \"agents\" | \"orphans\" | \"installed\" | \"plugins\" | \"source\";\n\ntype CheckResult = {\n kind: CheckKind;\n status: \"pass\" | \"fail\" | \"warn\" | \"skip\";\n message: string;\n details?: string[];\n};\n\ntype ConfigCheckOutput = {\n result: CheckResult;\n config: ProjectConfig | null;\n};\n\n/** Project-relative path to the config file, shown in doctor messages. */\nconst CONFIG_TS_REL = `${CLAUDE_SRC_DIR}/${STANDARD_FILES.CONFIG_TS}`;\n\nfunction checkConfigValid(config: ProjectConfig | null): ConfigCheckOutput {\n if (!config) {\n return {\n result: {\n kind: \"config\",\n status: \"fail\",\n message: `${CONFIG_TS_REL} not found`,\n details: [`Run '${CLI_INVOKE_COMMAND} init' to create a configuration`],\n },\n config: null,\n };\n }\n\n const validation = validateProjectConfig(config);\n\n if (!validation.valid) {\n return {\n result: {\n kind: \"config\",\n status: \"fail\",\n message: `${CONFIG_TS_REL} has errors`,\n details: validation.errors,\n },\n config: null,\n };\n }\n\n if (validation.warnings.length > 0) {\n return {\n result: {\n kind: \"config\",\n status: \"warn\",\n message: `${CONFIG_TS_REL} has warnings`,\n details: validation.warnings,\n },\n config,\n };\n }\n\n return {\n result: {\n kind: \"config\",\n status: \"pass\",\n message: `${CONFIG_TS_REL} is valid`,\n },\n config,\n };\n}\n\nasync function checkSkillsResolved(\n config: ProjectConfig,\n matrix: MergedSkillsMatrix,\n projectDir: string,\n): Promise<CheckResult> {\n // config.ts declares skills both directly and through the stack. A global-only\n // install has a populated skills array and no stack at all, so keying this check\n // off the stack alone would report \"No skills configured\" for a real install.\n const excludedIds = effectivelyExcludedSkillIds(config.skills);\n const stackIds = config.stack ? getStackSkillIds(config.stack) : [];\n const uniqueSkills = unique([...stackIds, ...config.skills.map((s) => s.id)]).filter(\n (id) => !excludedIds.has(id),\n );\n\n if (uniqueSkills.length === 0) {\n return {\n kind: \"skills\",\n status: \"pass\",\n message: \"No skills configured\",\n };\n }\n\n const [localResult, globalResult] = await Promise.all([\n discoverLocalSkills(projectDir),\n !isHomeDirectory(projectDir) ? discoverLocalSkills(os.homedir()) : null,\n ]);\n const localSkillIds = new Set([\n ...(localResult?.skills.map((s) => s.id) ?? []),\n ...(globalResult?.skills.map((s) => s.id) ?? []),\n ]);\n\n const missingSkills: string[] = [];\n for (const skillId of uniqueSkills) {\n const inMatrix = skillId in matrix.skills;\n const inLocal = localSkillIds.has(skillId);\n if (!inMatrix && !inLocal) {\n missingSkills.push(skillId);\n }\n }\n\n if (missingSkills.length > 0) {\n return {\n kind: \"skills\",\n status: \"fail\",\n message: `${uniqueSkills.length - missingSkills.length}/${uniqueSkills.length} skills found`,\n details: missingSkills.map((s) => `- ${s} (not found)`),\n };\n }\n\n return {\n kind: \"skills\",\n status: \"pass\",\n message: `${uniqueSkills.length}/${uniqueSkills.length} skills found`,\n };\n}\n\nasync function checkAgentsCompiled(\n config: ProjectConfig,\n projectDir: string,\n): Promise<CheckResult> {\n const agents = config.agents ?? [];\n\n if (agents.length === 0) {\n return {\n kind: \"agents\",\n status: \"pass\",\n message: \"No agents configured\",\n };\n }\n\n const projectAgentsDir = resolveInstallPaths(projectDir, \"project\").agentsDir;\n const globalAgentsDir = resolveInstallPaths(projectDir, \"global\").agentsDir;\n const agentChecks = await Promise.all(\n agents.map(async (agent) => {\n // Check scope-appropriate directory for the agent\n const agentsDir = agent.scope === \"global\" ? globalAgentsDir : projectAgentsDir;\n const agentPath = path.join(agentsDir, `${agent.name}.md`);\n return { name: agent.name, compiled: await fileExists(agentPath) };\n }),\n );\n const missingAgents = agentChecks.filter((c) => !c.compiled).map((c) => c.name);\n\n if (missingAgents.length > 0) {\n return {\n kind: \"agents\",\n status: \"warn\",\n message: `${missingAgents.length} agent${missingAgents.length === 1 ? \"\" : \"s\"} need${missingAgents.length === 1 ? \"s\" : \"\"} recompilation`,\n details: missingAgents.map((a) => `- ${a} (missing)`),\n };\n }\n\n return {\n kind: \"agents\",\n status: \"pass\",\n message: `${agents.length}/${agents.length} agents compiled`,\n };\n}\n\nasync function checkNoOrphans(config: ProjectConfig, projectDir: string): Promise<CheckResult> {\n const projectAgentsDir = resolveInstallPaths(projectDir, \"project\").agentsDir;\n const globalAgentsDir = resolveInstallPaths(projectDir, \"global\").agentsDir;\n\n // At home scope both scopes resolve to the same agents directory, so it is\n // listed once and its files are matched against both scopes' known names.\n const scopesShareAgentsDir = isHomeDirectory(projectDir);\n\n const [projectExists, globalExists] = await Promise.all([\n directoryExists(projectAgentsDir),\n !scopesShareAgentsDir ? directoryExists(globalAgentsDir) : false,\n ]);\n\n if (!projectExists && !globalExists) {\n return {\n kind: \"orphans\",\n status: \"pass\",\n message: \"No agents directory\",\n };\n }\n\n const projectMdFiles = projectExists ? await listAgentMdFiles(projectAgentsDir) : [];\n const globalMdFiles = globalExists ? await listAgentMdFiles(globalAgentsDir) : [];\n\n // Project files: only active project-scoped agents should have .md files here\n const activeProjectAgents: Set<string> = new Set(\n (config.agents ?? []).filter((a) => a.scope === \"project\" && !a.excluded).map((a) => a.name),\n );\n // Global files: all global-scoped agents (including excluded) still serve other projects\n const knownGlobalAgents: Set<string> = new Set(\n (config.agents ?? []).filter((a) => a.scope === \"global\").map((a) => a.name),\n );\n\n const knownProjectDirAgents = scopesShareAgentsDir\n ? new Set([...activeProjectAgents, ...knownGlobalAgents])\n : activeProjectAgents;\n\n const orphanedFiles: string[] = [];\n for (const file of projectMdFiles) {\n const agentName = file.replace(/\\.md$/, \"\");\n if (!knownProjectDirAgents.has(agentName)) {\n orphanedFiles.push(agentName);\n }\n }\n for (const file of globalMdFiles) {\n const agentName = file.replace(/\\.md$/, \"\");\n if (!knownGlobalAgents.has(agentName)) {\n orphanedFiles.push(agentName);\n }\n }\n\n if (orphanedFiles.length > 0) {\n return {\n kind: \"orphans\",\n status: \"warn\",\n message: `${orphanedFiles.length} orphaned agent file${orphanedFiles.length === 1 ? \"\" : \"s\"}`,\n details: orphanedFiles.map((f) => `- ${f}.md (not in config)`),\n };\n }\n\n return {\n kind: \"orphans\",\n status: \"pass\",\n message: \"No orphaned agent files\",\n };\n}\n\nasync function checkSkillsInstalled(\n config: ProjectConfig,\n projectDir: string,\n): Promise<CheckResult> {\n const skills: SkillConfig[] = config.skills ?? [];\n const ejectSkills = skills.filter((s) => s.source === EJECT_SOURCE);\n\n if (ejectSkills.length === 0) {\n return {\n kind: \"installed\",\n status: \"pass\",\n message: \"No eject-mode skills configured\",\n };\n }\n\n const skillChecks = await Promise.all(\n ejectSkills.map(async (skill) => {\n const baseDir = installBaseDir(projectDir, skill.scope);\n const skillMdPath = path.join(baseDir, LOCAL_SKILLS_PATH, skill.id, STANDARD_FILES.SKILL_MD);\n return { id: skill.id, installed: await fileExists(skillMdPath) };\n }),\n );\n const missingSkills = skillChecks.filter((c) => !c.installed).map((c) => c.id);\n\n if (missingSkills.length > 0) {\n return {\n kind: \"installed\",\n status: \"warn\",\n message: `${missingSkills.length} skill${missingSkills.length === 1 ? \"\" : \"s\"} missing from disk`,\n details: missingSkills.map((s) => `- ${s} (not found in ${LOCAL_SKILLS_PATH}/)`),\n };\n }\n\n return {\n kind: \"installed\",\n status: \"pass\",\n message: `${ejectSkills.length}/${ejectSkills.length} eject-mode skills installed`,\n };\n}\n\n/**\n * Plugin-mode skills have no files under `.claude/skills/` — they live in the\n * Claude plugin registry. Verifying them means asking the registry for the scope\n * each skill was installed at, not looking on disk.\n */\nasync function checkPluginSkillsInstalled(\n config: ProjectConfig,\n projectDir: string,\n): Promise<CheckResult> {\n const pluginSkills: SkillConfig[] = config.skills.filter((s) => s.source !== EJECT_SOURCE);\n\n if (pluginSkills.length === 0) {\n return {\n kind: \"plugins\",\n status: \"pass\",\n message: \"No plugin-mode skills configured\",\n };\n }\n\n const baseDirs = unique(pluginSkills.map((s) => installBaseDir(projectDir, s.scope)));\n const missingPerBaseDir = await Promise.all(\n baseDirs.map(async (baseDir) => {\n const installedIds = new Set(\n (await getVerifiedPluginInstallPaths(baseDir)).map((plugin) =>\n parseMarketplacePluginRef(plugin.pluginKey),\n ),\n );\n return pluginSkills\n .filter((skill) => installBaseDir(projectDir, skill.scope) === baseDir)\n .filter((skill) => !installedIds.has(skill.id))\n .map((skill) => skill.id);\n }),\n );\n const missingSkills = missingPerBaseDir.flat();\n\n if (missingSkills.length > 0) {\n return {\n kind: \"plugins\",\n status: \"warn\",\n message: `${missingSkills.length} skill${missingSkills.length === 1 ? \"\" : \"s\"} not installed as plugins`,\n details: missingSkills.map((s) => `- ${s} (no enabled plugin found)`),\n };\n }\n\n return {\n kind: \"plugins\",\n status: \"pass\",\n message: `${pluginSkills.length}/${pluginSkills.length} plugin-mode skills installed`,\n };\n}\n\nasync function checkSourceReachable(projectDir: string): Promise<CheckResult> {\n try {\n const { sourceResult: result } = await loadSource({\n projectDir,\n });\n\n const skillCount = Object.keys(matrix.skills).length;\n const sourceLabel = result.isLocal ? \"local\" : \"remote\";\n\n return {\n kind: \"source\",\n status: \"pass\",\n message: `Connected to ${sourceLabel}: ${result.sourcePath}`,\n details: [`${skillCount} skills available`],\n };\n } catch (error) {\n const message = getErrorMessage(error);\n return {\n kind: \"source\",\n status: \"fail\",\n message: \"Failed to load source\",\n details: [message],\n };\n }\n}\n\nconst CHECK_WIDTH = 20;\n\nfunction formatCheckName(name: string): string {\n return name.padEnd(CHECK_WIDTH);\n}\n\nfunction formatStatus(status: CheckResult[\"status\"]): string {\n switch (status) {\n case \"pass\":\n return UI_SYMBOLS.CHECK;\n case \"fail\":\n return UI_SYMBOLS.CROSS;\n case \"warn\":\n return \"!\";\n case \"skip\":\n return \"-\";\n default: {\n const _exhaustive: never = status;\n return _exhaustive;\n }\n }\n}\n\nfunction formatCheckLine(name: string, result: CheckResult): string[] {\n const headerLine = ` ${formatCheckName(name)}${formatStatus(result.status)} ${result.message}`;\n const detailLines = (result.details ?? []).map(\n (detail) => ` ${\" \".repeat(CHECK_WIDTH)} ${detail}`,\n );\n return [headerLine, ...detailLines];\n}\n\nfunction formatSummary(results: CheckResult[]): string {\n const counts = countBy(results, (r) => r.status);\n const plural = (n: number, word: string) => `${n} ${word}${n === 1 ? \"\" : \"s\"}`;\n\n const parts = [\n `${counts.pass ?? 0} passed`,\n plural(counts.warn ?? 0, \"warning\"),\n plural(counts.fail ?? 0, \"error\"),\n ];\n\n return ` Summary: ${parts.join(\", \")}`;\n}\n\nconst TIPS: Array<{ kind: CheckKind; status: CheckResult[\"status\"]; tip: string }> = [\n {\n kind: \"agents\",\n status: \"warn\",\n tip: ` Tip: Run '${CLI_INVOKE_COMMAND} compile' to generate missing agent files`,\n },\n {\n kind: \"config\",\n status: \"fail\",\n tip: ` Tip: Run '${CLI_INVOKE_COMMAND} init' to create or fix configuration`,\n },\n {\n kind: \"skills\",\n status: \"fail\",\n tip: \" Tip: Check skill IDs in config match available skills\",\n },\n {\n kind: \"installed\",\n status: \"warn\",\n // No command is named on purpose: 'eject skills --force' re-copies every skill in the\n // source and always targets project scope, so it cannot repair a global-scoped skill\n // and it litters a plugin-mode project with local skill directories.\n tip: \" Tip: Re-eject the missing skills from the source to restore their files\",\n },\n];\n\nfunction formatTips(results: CheckResult[]): string[] {\n return TIPS.filter((t) => results.some((r) => r.kind === t.kind && r.status === t.status)).map(\n (t) => t.tip,\n );\n}\n\nfunction skippedResult(kind: CheckKind): CheckResult {\n return { kind, status: \"skip\", message: \"Skipped (config invalid)\" };\n}\n\n/**\n * Wrap a check so a thrown exception becomes a `fail` result instead of crashing the\n * whole doctor run. Per-check isolation ensures one broken check does not mask others.\n */\nasync function safeCheck(kind: CheckKind, fn: () => Promise<CheckResult>): Promise<CheckResult> {\n try {\n return await fn();\n } catch (error) {\n return { kind, status: \"fail\", message: \"Check threw\", details: [getErrorMessage(error)] };\n }\n}\n\nexport default class Doctor extends BaseCommand {\n static summary = \"Diagnose common configuration issues\";\n\n static description = `Run diagnostic checks on your ${DEFAULT_BRANDING.NAME} configuration to identify issues with config validity, skill resolution, agent compilation, and source connectivity.`;\n\n static examples = [\"<%= config.bin %> <%= command.id %>\"];\n\n // Override parent baseFlags to drop --source (not relevant for diagnostics)\n static baseFlags = {} as (typeof BaseCommand)[\"baseFlags\"];\n\n static flags = {};\n\n async run(): Promise<void> {\n await this.parse(Doctor);\n setVerbose(true);\n const projectDir = process.cwd();\n\n this.printHeader();\n const results = await this.runAllChecks(projectDir);\n this.printResults(results);\n\n if (results.some((r) => r.status === \"fail\")) {\n this.exit(EXIT_CODES.ERROR);\n }\n }\n\n private printHeader(): void {\n this.log(\"\");\n this.log(`${DEFAULT_BRANDING.NAME} Doctor`);\n this.log(\"\");\n this.log(\" Checking configuration health...\");\n this.log(\"\");\n }\n\n private async runAllChecks(projectDir: string): Promise<CheckResult[]> {\n const detected = await detectProject(projectDir);\n const { result: configResult, config } = checkConfigValid(detected?.config ?? null);\n this.logCheck(\"Config Valid\", configResult);\n\n // loadSource (called by checkSourceReachable) populates the matrix. Run it\n // before checkSkillsResolved so skills lookups see a populated matrix; if\n // source fails, skip skills rather than reporting false \"not found\" errors.\n const sourceResult = await safeCheck(\"source\", () => checkSourceReachable(projectDir));\n\n const filteredConfig = config ? filterExcludedEntries(config) : null;\n\n const skillsResult = !config\n ? skippedResult(\"skills\")\n : sourceResult.status === \"fail\"\n ? {\n kind: \"skills\" as const,\n status: \"skip\" as const,\n message: \"Skipped (source unreachable)\",\n }\n : await safeCheck(\"skills\", () => checkSkillsResolved(config, matrix, projectDir));\n this.logCheck(\"Skills Resolved\", skillsResult);\n\n const agentsResult = filteredConfig\n ? await safeCheck(\"agents\", () => checkAgentsCompiled(filteredConfig, projectDir))\n : skippedResult(\"agents\");\n this.logCheck(\"Agents Compiled\", agentsResult);\n\n const orphansResult = config\n ? await safeCheck(\"orphans\", () => checkNoOrphans(config, projectDir))\n : skippedResult(\"orphans\");\n this.logCheck(\"No Orphans\", orphansResult);\n\n const installedResult = filteredConfig\n ? await safeCheck(\"installed\", () => checkSkillsInstalled(filteredConfig, projectDir))\n : skippedResult(\"installed\");\n this.logCheck(\"Skills Installed\", installedResult);\n\n const pluginsResult = filteredConfig\n ? await safeCheck(\"plugins\", () => checkPluginSkillsInstalled(filteredConfig, projectDir))\n : skippedResult(\"plugins\");\n this.logCheck(\"Plugins Installed\", pluginsResult);\n\n this.logCheck(\"Source Reachable\", sourceResult);\n\n return [\n configResult,\n skillsResult,\n agentsResult,\n orphansResult,\n installedResult,\n pluginsResult,\n sourceResult,\n ];\n }\n\n private logCheck(name: string, result: CheckResult): void {\n for (const line of formatCheckLine(name, result)) {\n this.log(line);\n }\n }\n\n private printResults(results: CheckResult[]): void {\n this.log(\"\");\n this.log(formatSummary(results));\n\n const tips = formatTips(results);\n if (tips.length > 0) {\n this.log(\"\");\n for (const tip of tips) {\n this.log(tip);\n }\n }\n\n this.log(\"\");\n }\n}\n"],"mappings":"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","names":["matrix"]}
|