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,570 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
Confirm
|
|
4
|
+
} from "../chunk-ES3NJZON.js";
|
|
5
|
+
import {
|
|
6
|
+
promptConfirm
|
|
7
|
+
} from "../chunk-C55DN7GE.js";
|
|
8
|
+
import {
|
|
9
|
+
INFO_MESSAGES,
|
|
10
|
+
SUCCESS_MESSAGES,
|
|
11
|
+
registeredProjectUpdateSkipped,
|
|
12
|
+
registeredProjectsUpdateFailed,
|
|
13
|
+
registeredProjectsUpdated
|
|
14
|
+
} from "../chunk-GYG5SE2D.js";
|
|
15
|
+
import "../chunk-DDG4F3FE.js";
|
|
16
|
+
import "../chunk-N4IZ6GBO.js";
|
|
17
|
+
import "../chunk-CDMHSHBN.js";
|
|
18
|
+
import {
|
|
19
|
+
loadAgentDefs
|
|
20
|
+
} from "../chunk-VIFZ6NFH.js";
|
|
21
|
+
import {
|
|
22
|
+
listAgentMdFiles
|
|
23
|
+
} from "../chunk-YKKIJHZB.js";
|
|
24
|
+
import {
|
|
25
|
+
BaseCommand,
|
|
26
|
+
EXIT_CODES
|
|
27
|
+
} from "../chunk-OA5SUEQD.js";
|
|
28
|
+
import "../chunk-SYUOXSPU.js";
|
|
29
|
+
import "../chunk-P3PN5SVI.js";
|
|
30
|
+
import {
|
|
31
|
+
ConfigLoadError,
|
|
32
|
+
buildMarketplacePluginRef,
|
|
33
|
+
claudePluginUninstallBestEffort,
|
|
34
|
+
getProjectPluginsDir,
|
|
35
|
+
isClaudeCLIAvailable,
|
|
36
|
+
isHomeDirectory,
|
|
37
|
+
lazyGateDeps,
|
|
38
|
+
listPluginNames,
|
|
39
|
+
loadProjectConfigFromDir,
|
|
40
|
+
loadSkillsMatrixFromSource,
|
|
41
|
+
mutateGlobal,
|
|
42
|
+
parseMarketplacePluginRef,
|
|
43
|
+
propagateGlobalRemoval,
|
|
44
|
+
readForkedFromMetadata,
|
|
45
|
+
resolveInstallPaths,
|
|
46
|
+
toClaudePluginScope
|
|
47
|
+
} from "../chunk-KH7MOIM5.js";
|
|
48
|
+
import {
|
|
49
|
+
directoryExists,
|
|
50
|
+
fileExists,
|
|
51
|
+
getErrorMessage,
|
|
52
|
+
listDirectories,
|
|
53
|
+
remove
|
|
54
|
+
} from "../chunk-3LIU2ZEF.js";
|
|
55
|
+
import "../chunk-DJAZE4PD.js";
|
|
56
|
+
import "../chunk-VEP23B5W.js";
|
|
57
|
+
import {
|
|
58
|
+
CLAUDE_DIR,
|
|
59
|
+
CLAUDE_SRC_DIR,
|
|
60
|
+
CLI_COLORS,
|
|
61
|
+
DEFAULT_BRANDING,
|
|
62
|
+
EJECT_SOURCE,
|
|
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/uninstall.tsx
|
|
71
|
+
init_esm_shims();
|
|
72
|
+
import { partition } from "remeda";
|
|
73
|
+
import path from "path";
|
|
74
|
+
import { readdir } from "fs/promises";
|
|
75
|
+
import { Flags } from "@oclif/core";
|
|
76
|
+
import { Box, Text, useApp } from "ink";
|
|
77
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
78
|
+
function buildRemovalPlan(target) {
|
|
79
|
+
const sections = [];
|
|
80
|
+
if (target.hasPlugins) {
|
|
81
|
+
sections.push({ label: "Plugins:", items: [...target.cliPluginNames] });
|
|
82
|
+
}
|
|
83
|
+
if (target.hasLocalSkills || target.hasLocalAgents) {
|
|
84
|
+
const items = [];
|
|
85
|
+
if (target.hasLocalSkills) items.push(`${target.skillsDir}/ (matching sources)`);
|
|
86
|
+
if (target.hasLocalAgents) items.push(`${target.agentsDir}/ (CLI-compiled)`);
|
|
87
|
+
sections.push({ label: "CLI-managed files:", items });
|
|
88
|
+
}
|
|
89
|
+
if (target.hasClaudeSrcConfig || target.hasClaudeSrcConfigTypes) {
|
|
90
|
+
const items = [];
|
|
91
|
+
if (target.hasClaudeSrcConfig) {
|
|
92
|
+
items.push(`${target.claudeSrcDir}/${STANDARD_FILES.CONFIG_TS}`);
|
|
93
|
+
}
|
|
94
|
+
if (target.hasClaudeSrcConfigTypes) {
|
|
95
|
+
items.push(`${target.claudeSrcDir}/${STANDARD_FILES.CONFIG_TYPES_TS}`);
|
|
96
|
+
}
|
|
97
|
+
sections.push({ label: "Config:", items });
|
|
98
|
+
}
|
|
99
|
+
return sections;
|
|
100
|
+
}
|
|
101
|
+
var UninstallConfirm = ({ target, onConfirm, onCancel }) => {
|
|
102
|
+
const { exit } = useApp();
|
|
103
|
+
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
|
|
104
|
+
/* @__PURE__ */ jsx(Text, { bold: true, children: "The following will be removed:" }),
|
|
105
|
+
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
106
|
+
buildRemovalPlan(target).map((section) => /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
|
|
107
|
+
/* @__PURE__ */ jsxs(Text, { color: CLI_COLORS.ERROR, children: [
|
|
108
|
+
" ",
|
|
109
|
+
section.label
|
|
110
|
+
] }),
|
|
111
|
+
section.items.map((item) => /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
|
|
112
|
+
" ",
|
|
113
|
+
item
|
|
114
|
+
] }, item))
|
|
115
|
+
] }, section.label)),
|
|
116
|
+
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
117
|
+
/* @__PURE__ */ jsx(
|
|
118
|
+
Confirm,
|
|
119
|
+
{
|
|
120
|
+
message: "Are you sure you want to uninstall?",
|
|
121
|
+
onConfirm: () => {
|
|
122
|
+
onConfirm();
|
|
123
|
+
exit();
|
|
124
|
+
},
|
|
125
|
+
onCancel: () => {
|
|
126
|
+
onCancel();
|
|
127
|
+
exit();
|
|
128
|
+
},
|
|
129
|
+
defaultValue: false
|
|
130
|
+
}
|
|
131
|
+
)
|
|
132
|
+
] });
|
|
133
|
+
};
|
|
134
|
+
var Uninstall = class _Uninstall extends BaseCommand {
|
|
135
|
+
static summary = `Remove ${DEFAULT_BRANDING.NAME} from this project`;
|
|
136
|
+
static description = `Uninstall ${DEFAULT_BRANDING.NAME} from this project. Removes CLI-managed skills (matched by source), compiled agents, plugins, and the .claude-src/ config manifest (config.ts + config-types.ts). User-created content is preserved.`;
|
|
137
|
+
static examples = [
|
|
138
|
+
"<%= config.bin %> <%= command.id %>",
|
|
139
|
+
"<%= config.bin %> <%= command.id %> --yes"
|
|
140
|
+
];
|
|
141
|
+
static flags = {
|
|
142
|
+
...BaseCommand.baseFlags,
|
|
143
|
+
yes: Flags.boolean({
|
|
144
|
+
char: "y",
|
|
145
|
+
description: "Skip confirmation prompt",
|
|
146
|
+
default: false
|
|
147
|
+
})
|
|
148
|
+
};
|
|
149
|
+
async run() {
|
|
150
|
+
const { flags } = await this.parse(_Uninstall);
|
|
151
|
+
const projectDir = process.cwd();
|
|
152
|
+
this.printHeader();
|
|
153
|
+
const target = await detectUninstallTarget(
|
|
154
|
+
projectDir,
|
|
155
|
+
(reason) => this.warn(
|
|
156
|
+
`Could not read the project config \u2014 plugins and compiled agents it lists may be left behind: ${reason}`
|
|
157
|
+
)
|
|
158
|
+
);
|
|
159
|
+
if (!hasAnythingToRemove(target)) {
|
|
160
|
+
this.reportNothingToUninstall();
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const confirmed = flags.yes ? this.printRemovalPlan(target) : await this.confirmRemoval(target);
|
|
164
|
+
if (!confirmed) {
|
|
165
|
+
this.log("");
|
|
166
|
+
this.log("Uninstall cancelled");
|
|
167
|
+
this.exit(EXIT_CODES.CANCELLED);
|
|
168
|
+
}
|
|
169
|
+
await this.executeUninstall(target, projectDir);
|
|
170
|
+
this.reportSuccess();
|
|
171
|
+
}
|
|
172
|
+
printHeader() {
|
|
173
|
+
this.log("");
|
|
174
|
+
this.log(`${DEFAULT_BRANDING.NAME} Uninstall`);
|
|
175
|
+
this.log("");
|
|
176
|
+
}
|
|
177
|
+
reportNothingToUninstall() {
|
|
178
|
+
this.warn("Nothing to uninstall.");
|
|
179
|
+
this.log("");
|
|
180
|
+
this.log(INFO_MESSAGES.NOT_INSTALLED);
|
|
181
|
+
this.log("");
|
|
182
|
+
this.log(INFO_MESSAGES.NO_CHANGES_MADE);
|
|
183
|
+
}
|
|
184
|
+
printRemovalPlan(target) {
|
|
185
|
+
this.log("The following will be removed:");
|
|
186
|
+
this.log("");
|
|
187
|
+
for (const section of buildRemovalPlan(target)) {
|
|
188
|
+
this.log(` ${section.label}`);
|
|
189
|
+
for (const item of section.items) {
|
|
190
|
+
this.log(` ${item}`);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
this.log("");
|
|
194
|
+
return true;
|
|
195
|
+
}
|
|
196
|
+
async confirmRemoval(target) {
|
|
197
|
+
const outcome = await promptConfirm(({ onConfirm, onCancel }) => /* @__PURE__ */ jsx(UninstallConfirm, { target, onConfirm, onCancel }));
|
|
198
|
+
return outcome === "confirmed";
|
|
199
|
+
}
|
|
200
|
+
async executeUninstall(target, projectDir) {
|
|
201
|
+
const isGlobalUninstall = isHomeDirectory(projectDir);
|
|
202
|
+
const propagation = isGlobalUninstall ? await this.prepareGlobalPropagation(target, projectDir) : null;
|
|
203
|
+
if (target.hasPlugins) {
|
|
204
|
+
this.log("Uninstalling plugins...");
|
|
205
|
+
try {
|
|
206
|
+
const pluginResult = await uninstallPlugins(
|
|
207
|
+
target,
|
|
208
|
+
projectDir,
|
|
209
|
+
(name) => this.log(` Uninstalled plugin '${name}'`)
|
|
210
|
+
);
|
|
211
|
+
this.logSuccess(
|
|
212
|
+
`Uninstalled ${pluginResult.totalUninstalled} ${pluginResult.totalUninstalled === 1 ? "plugin" : "plugins"}`
|
|
213
|
+
);
|
|
214
|
+
} catch (error) {
|
|
215
|
+
this.log("Plugin uninstall failed");
|
|
216
|
+
this.error(getErrorMessage(error), {
|
|
217
|
+
exit: EXIT_CODES.ERROR
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
try {
|
|
222
|
+
await this.removeLocalFiles(target);
|
|
223
|
+
} catch (error) {
|
|
224
|
+
this.log("Failed to remove local files");
|
|
225
|
+
this.error(getErrorMessage(error), {
|
|
226
|
+
exit: EXIT_CODES.ERROR
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
if (isGlobalUninstall) {
|
|
230
|
+
if (propagation) {
|
|
231
|
+
await this.updateRegisteredProjects(propagation);
|
|
232
|
+
}
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
try {
|
|
236
|
+
await mutateGlobal({ kind: "deregister-project", projectDir }, lazyGateDeps(projectDir));
|
|
237
|
+
} catch (error) {
|
|
238
|
+
this.warn(`Could not update the global project registry: ${getErrorMessage(error)}`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Loads what updating registered projects needs (global config with its
|
|
243
|
+
* projects[] registry, skills matrix, agent definitions) BEFORE the global
|
|
244
|
+
* .claude-src manifest is deleted — source resolution reads that config.
|
|
245
|
+
* Returns null when nothing is registered or loading fails; a load failure
|
|
246
|
+
* warns and never aborts the uninstall.
|
|
247
|
+
*
|
|
248
|
+
* `skipExtraSources: true` is NOT a divergence from the wizard's full
|
|
249
|
+
* multi-source load: extra-source loading only annotates each skill's
|
|
250
|
+
* `availableSources`/`activeSource` for wizard UI tagging — it never adds
|
|
251
|
+
* skills or categories to the matrix, and the config-types writer never reads
|
|
252
|
+
* those annotations, so the regenerated project types are byte-identical
|
|
253
|
+
* either way (pinned by the skipExtraSources parity test in
|
|
254
|
+
* local-installer.test.ts). Skipping avoids fetching every registered extra
|
|
255
|
+
* source (network on a cold cache, plus unreachable-remote warnings) during
|
|
256
|
+
* an uninstall that must never hang or noise-fail on remote state.
|
|
257
|
+
*/
|
|
258
|
+
async prepareGlobalPropagation(target, projectDir) {
|
|
259
|
+
const globalConfig = target.config;
|
|
260
|
+
if (!globalConfig?.projects?.length) return null;
|
|
261
|
+
try {
|
|
262
|
+
const [sourceResult, agentDefs] = await Promise.all([
|
|
263
|
+
loadSkillsMatrixFromSource({
|
|
264
|
+
projectDir,
|
|
265
|
+
skipExtraSources: true,
|
|
266
|
+
matrixOnly: true
|
|
267
|
+
}),
|
|
268
|
+
loadAgentDefs({ projectDir })
|
|
269
|
+
]);
|
|
270
|
+
return { globalConfig, matrix: sourceResult.matrix, agents: agentDefs.agents };
|
|
271
|
+
} catch (error) {
|
|
272
|
+
this.warn(registeredProjectsUpdateFailed(getErrorMessage(error)));
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Prunes the inlined global-scoped config entries from every registered
|
|
278
|
+
* project and regenerates its config-types.ts. Runs AFTER the global manifest
|
|
279
|
+
* removal so the regenerated project types fall back to the standalone form
|
|
280
|
+
* instead of importing from the deleted global config-types.ts. Best-effort:
|
|
281
|
+
* unreachable projects are warned and skipped, and no failure here may abort
|
|
282
|
+
* the uninstall.
|
|
283
|
+
*/
|
|
284
|
+
async updateRegisteredProjects(propagation) {
|
|
285
|
+
try {
|
|
286
|
+
const report = await propagateGlobalRemoval(propagation.globalConfig, {
|
|
287
|
+
matrix: propagation.matrix,
|
|
288
|
+
agents: propagation.agents
|
|
289
|
+
});
|
|
290
|
+
for (const skippedPath of report.propagated.skipped) {
|
|
291
|
+
this.warn(registeredProjectUpdateSkipped(skippedPath));
|
|
292
|
+
}
|
|
293
|
+
if (report.propagated.updated.length === 0) return;
|
|
294
|
+
this.logSuccess(registeredProjectsUpdated(report.propagated.updated.length));
|
|
295
|
+
const { recompiledCount, failedCount, warnings } = report.recompile;
|
|
296
|
+
for (const warning of warnings) {
|
|
297
|
+
this.warn(warning);
|
|
298
|
+
}
|
|
299
|
+
const failureSuffix = failedCount > 0 ? ` (${failedCount} failed)` : "";
|
|
300
|
+
this.log(`Recompiled agents in ${recompiledCount} registered projects${failureSuffix}`);
|
|
301
|
+
} catch (error) {
|
|
302
|
+
this.warn(registeredProjectsUpdateFailed(getErrorMessage(error)));
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
reportSuccess() {
|
|
306
|
+
this.log("");
|
|
307
|
+
this.log(`${DEFAULT_BRANDING.NAME} has been uninstalled.`);
|
|
308
|
+
this.log("");
|
|
309
|
+
this.logSuccess(SUCCESS_MESSAGES.UNINSTALL_COMPLETE);
|
|
310
|
+
this.log("");
|
|
311
|
+
}
|
|
312
|
+
async removeLocalFiles(target) {
|
|
313
|
+
const skillResult = await removeMatchingSkills(
|
|
314
|
+
target,
|
|
315
|
+
(dirName) => this.log(` Uninstalled skill '${dirName}'`),
|
|
316
|
+
(dirName) => this.warn(`Skipping '${dirName}': not created by ${DEFAULT_BRANDING.NAME} CLI`)
|
|
317
|
+
);
|
|
318
|
+
if (skillResult.removedCount > 0) {
|
|
319
|
+
this.logSuccess(
|
|
320
|
+
`Removed ${skillResult.removedCount} CLI-installed ${skillResult.removedCount === 1 ? "skill" : "skills"}`
|
|
321
|
+
);
|
|
322
|
+
}
|
|
323
|
+
const agentResult = await removeMatchingAgents(
|
|
324
|
+
target,
|
|
325
|
+
(agentName) => this.log(` Uninstalled agent '${agentName}'`)
|
|
326
|
+
);
|
|
327
|
+
if (agentResult.removedCount > 0) {
|
|
328
|
+
this.logSuccess(
|
|
329
|
+
`Removed ${agentResult.removedCount} compiled ${agentResult.removedCount === 1 ? "agent" : "agents"}`
|
|
330
|
+
);
|
|
331
|
+
}
|
|
332
|
+
const cleanup = await cleanupEmptyDirs(target);
|
|
333
|
+
if (cleanup.claudeSrcDirRemoved) {
|
|
334
|
+
this.logSuccess(`Removed ${CLAUDE_SRC_DIR}/`);
|
|
335
|
+
} else if (cleanup.claudeSrcManifestRemoved) {
|
|
336
|
+
this.logSuccess(`Removed CLI config from ${CLAUDE_SRC_DIR}/`);
|
|
337
|
+
}
|
|
338
|
+
if (cleanup.claudeDirRemoved) {
|
|
339
|
+
this.logSuccess(`Removed ${CLAUDE_DIR}/`);
|
|
340
|
+
} else if (cleanup.claudeDirKept) {
|
|
341
|
+
this.log(`Kept ${CLAUDE_DIR}/ (contains user content)`);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
};
|
|
345
|
+
function hasAnythingToRemove(target) {
|
|
346
|
+
return target.hasPlugins || target.hasLocalSkills || target.hasLocalAgents || target.hasClaudeSrcConfig || target.hasClaudeSrcConfigTypes;
|
|
347
|
+
}
|
|
348
|
+
function collectConfiguredAgents(config) {
|
|
349
|
+
if (!config?.agents) return [];
|
|
350
|
+
return config.agents.map((a) => a.name);
|
|
351
|
+
}
|
|
352
|
+
function getCliInstalledPluginKeys(config) {
|
|
353
|
+
if (!config?.skills) return /* @__PURE__ */ new Set();
|
|
354
|
+
const { marketplace } = config;
|
|
355
|
+
return new Set(
|
|
356
|
+
config.skills.flatMap((skill) => [
|
|
357
|
+
// Primary key: skill.id@skill.source
|
|
358
|
+
buildMarketplacePluginRef(skill.id, skill.source),
|
|
359
|
+
// Marketplace variant for plugins installed via marketplace where
|
|
360
|
+
// skill.source may differ (e.g., "eject" vs the marketplace name)
|
|
361
|
+
...marketplace && skill.source !== marketplace && skill.source !== EJECT_SOURCE ? [buildMarketplacePluginRef(skill.id, marketplace)] : []
|
|
362
|
+
])
|
|
363
|
+
);
|
|
364
|
+
}
|
|
365
|
+
async function loadUninstallConfig(projectDir, onLoadFailed) {
|
|
366
|
+
try {
|
|
367
|
+
const result = await loadProjectConfigFromDir(projectDir);
|
|
368
|
+
return result?.config ?? null;
|
|
369
|
+
} catch (error) {
|
|
370
|
+
if (!(error instanceof ConfigLoadError)) throw error;
|
|
371
|
+
onLoadFailed(getErrorMessage(error));
|
|
372
|
+
return null;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
async function detectUninstallTarget(projectDir, onConfigLoadFailed) {
|
|
376
|
+
const pluginsDir = getProjectPluginsDir(projectDir);
|
|
377
|
+
const { skillsDir, agentsDir } = resolveInstallPaths(projectDir);
|
|
378
|
+
const claudeDir = path.join(projectDir, CLAUDE_DIR);
|
|
379
|
+
const claudeSrcDir = path.join(projectDir, CLAUDE_SRC_DIR);
|
|
380
|
+
const claudeSrcConfigPath = path.join(claudeSrcDir, STANDARD_FILES.CONFIG_TS);
|
|
381
|
+
const claudeSrcConfigTypesPath = path.join(claudeSrcDir, STANDARD_FILES.CONFIG_TYPES_TS);
|
|
382
|
+
const [
|
|
383
|
+
hasLocalSkills,
|
|
384
|
+
hasLocalAgents,
|
|
385
|
+
hasClaudeDir,
|
|
386
|
+
hasClaudeSrcConfig,
|
|
387
|
+
hasClaudeSrcConfigTypes,
|
|
388
|
+
config
|
|
389
|
+
] = await Promise.all([
|
|
390
|
+
directoryExists(skillsDir),
|
|
391
|
+
directoryExists(agentsDir),
|
|
392
|
+
directoryExists(claudeDir),
|
|
393
|
+
fileExists(claudeSrcConfigPath),
|
|
394
|
+
fileExists(claudeSrcConfigTypesPath),
|
|
395
|
+
loadUninstallConfig(projectDir, onConfigLoadFailed)
|
|
396
|
+
]);
|
|
397
|
+
let pluginNames = [];
|
|
398
|
+
try {
|
|
399
|
+
pluginNames = await listPluginNames(projectDir);
|
|
400
|
+
} catch {
|
|
401
|
+
}
|
|
402
|
+
const activeConfig = config ? {
|
|
403
|
+
...config,
|
|
404
|
+
skills: config.skills?.filter((s) => !s.excluded),
|
|
405
|
+
agents: config.agents?.filter((a) => !a.excluded)
|
|
406
|
+
} : null;
|
|
407
|
+
const configuredAgents = collectConfiguredAgents(activeConfig);
|
|
408
|
+
const cliInstalledKeys = getCliInstalledPluginKeys(activeConfig);
|
|
409
|
+
const cliPluginNames = pluginNames.filter((name) => cliInstalledKeys.has(name));
|
|
410
|
+
return {
|
|
411
|
+
hasPlugins: cliPluginNames.length > 0,
|
|
412
|
+
pluginNames,
|
|
413
|
+
cliPluginNames,
|
|
414
|
+
hasLocalSkills,
|
|
415
|
+
hasLocalAgents,
|
|
416
|
+
hasClaudeDir,
|
|
417
|
+
hasClaudeSrcConfig,
|
|
418
|
+
hasClaudeSrcConfigTypes,
|
|
419
|
+
pluginsDir,
|
|
420
|
+
skillsDir,
|
|
421
|
+
agentsDir,
|
|
422
|
+
claudeDir,
|
|
423
|
+
claudeSrcDir,
|
|
424
|
+
config,
|
|
425
|
+
configuredAgents
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
function shouldRemoveSkill(forkedFrom) {
|
|
429
|
+
return forkedFrom !== null;
|
|
430
|
+
}
|
|
431
|
+
async function removeMatchingSkills(target, onRemoved, onSkipped) {
|
|
432
|
+
if (!target.hasLocalSkills) {
|
|
433
|
+
return {
|
|
434
|
+
removedCount: 0,
|
|
435
|
+
skippedCount: 0,
|
|
436
|
+
removedNames: [],
|
|
437
|
+
skippedNames: [],
|
|
438
|
+
dirCleaned: false
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
const classified = await classifySkillDirs(target.skillsDir);
|
|
442
|
+
const removedNames = await removeClassifiedSkills(
|
|
443
|
+
classified.toRemove,
|
|
444
|
+
target.skillsDir,
|
|
445
|
+
onRemoved
|
|
446
|
+
);
|
|
447
|
+
classified.toSkip.forEach((name) => onSkipped?.(name));
|
|
448
|
+
const dirCleaned = await cleanupSkillsDir(target.skillsDir, classified.toSkip.length === 0);
|
|
449
|
+
return {
|
|
450
|
+
removedCount: removedNames.length,
|
|
451
|
+
skippedCount: classified.toSkip.length,
|
|
452
|
+
removedNames,
|
|
453
|
+
skippedNames: classified.toSkip,
|
|
454
|
+
dirCleaned
|
|
455
|
+
};
|
|
456
|
+
}
|
|
457
|
+
async function classifySkillDirs(skillsDir) {
|
|
458
|
+
const dirNames = await listDirectories(skillsDir);
|
|
459
|
+
const entries = await Promise.all(
|
|
460
|
+
dirNames.map(async (name) => ({
|
|
461
|
+
name,
|
|
462
|
+
forkedFrom: await readForkedFromMetadata(path.join(skillsDir, name))
|
|
463
|
+
}))
|
|
464
|
+
);
|
|
465
|
+
const [removable, skippable] = partition(entries, (entry) => shouldRemoveSkill(entry.forkedFrom));
|
|
466
|
+
return { toRemove: removable.map((e) => e.name), toSkip: skippable.map((e) => e.name) };
|
|
467
|
+
}
|
|
468
|
+
async function removeClassifiedSkills(names, skillsDir, onRemoved) {
|
|
469
|
+
for (const name of names) {
|
|
470
|
+
await remove(path.join(skillsDir, name));
|
|
471
|
+
onRemoved?.(name);
|
|
472
|
+
}
|
|
473
|
+
return names;
|
|
474
|
+
}
|
|
475
|
+
async function cleanupSkillsDir(dir, allRemoved) {
|
|
476
|
+
if (!allRemoved) return false;
|
|
477
|
+
return removeDirIfEmpty(dir);
|
|
478
|
+
}
|
|
479
|
+
async function removeDirIfEmpty(dir) {
|
|
480
|
+
if (!await directoryExists(dir)) return false;
|
|
481
|
+
if (!await isDirectoryEmpty(dir)) return false;
|
|
482
|
+
await remove(dir);
|
|
483
|
+
return true;
|
|
484
|
+
}
|
|
485
|
+
async function removeMatchingAgents(target, onRemoved) {
|
|
486
|
+
if (!target.hasLocalAgents) {
|
|
487
|
+
return { removedCount: 0, removedNames: [], dirCleaned: false };
|
|
488
|
+
}
|
|
489
|
+
if (target.configuredAgents.length === 0) {
|
|
490
|
+
return { removedCount: 0, removedNames: [], dirCleaned: false };
|
|
491
|
+
}
|
|
492
|
+
const agentFiles = await listAgentFiles(target.agentsDir);
|
|
493
|
+
const removedNames = agentFiles.map((agentFile) => agentFile.replace(/\.md$/, "")).filter((agentName) => target.configuredAgents.includes(agentName));
|
|
494
|
+
for (const agentName of removedNames) {
|
|
495
|
+
await remove(path.join(target.agentsDir, `${agentName}.md`));
|
|
496
|
+
onRemoved?.(agentName);
|
|
497
|
+
}
|
|
498
|
+
const dirCleaned = await removeDirIfEmpty(target.agentsDir);
|
|
499
|
+
return {
|
|
500
|
+
removedCount: removedNames.length,
|
|
501
|
+
removedNames,
|
|
502
|
+
dirCleaned
|
|
503
|
+
};
|
|
504
|
+
}
|
|
505
|
+
async function uninstallPlugins(target, projectDir, onUninstalled) {
|
|
506
|
+
if (!target.hasPlugins) {
|
|
507
|
+
return { uninstalledNames: [], totalUninstalled: 0 };
|
|
508
|
+
}
|
|
509
|
+
const cliAvailable = await isClaudeCLIAvailable();
|
|
510
|
+
for (const pluginName of target.cliPluginNames) {
|
|
511
|
+
if (cliAvailable) {
|
|
512
|
+
const skillId = parseMarketplacePluginRef(pluginName);
|
|
513
|
+
const skillConfig = target.config?.skills?.find((s) => s.id === skillId);
|
|
514
|
+
const primaryScope = toClaudePluginScope(skillConfig?.scope);
|
|
515
|
+
await claudePluginUninstallBestEffort(pluginName, primaryScope, projectDir);
|
|
516
|
+
}
|
|
517
|
+
const pluginPath = path.join(target.pluginsDir, pluginName);
|
|
518
|
+
await remove(pluginPath);
|
|
519
|
+
onUninstalled?.(pluginName);
|
|
520
|
+
}
|
|
521
|
+
return {
|
|
522
|
+
uninstalledNames: target.cliPluginNames,
|
|
523
|
+
totalUninstalled: target.cliPluginNames.length
|
|
524
|
+
};
|
|
525
|
+
}
|
|
526
|
+
async function removeConfigManifest(target) {
|
|
527
|
+
let manifestRemoved = false;
|
|
528
|
+
if (target.hasClaudeSrcConfig) {
|
|
529
|
+
await remove(path.join(target.claudeSrcDir, STANDARD_FILES.CONFIG_TS));
|
|
530
|
+
manifestRemoved = true;
|
|
531
|
+
}
|
|
532
|
+
if (target.hasClaudeSrcConfigTypes) {
|
|
533
|
+
await remove(path.join(target.claudeSrcDir, STANDARD_FILES.CONFIG_TYPES_TS));
|
|
534
|
+
manifestRemoved = true;
|
|
535
|
+
}
|
|
536
|
+
const dirRemoved = manifestRemoved && await removeDirIfEmpty(target.claudeSrcDir);
|
|
537
|
+
return { manifestRemoved, dirRemoved };
|
|
538
|
+
}
|
|
539
|
+
async function cleanupEmptyDirs(target) {
|
|
540
|
+
const manifest = await removeConfigManifest(target);
|
|
541
|
+
const claudeDirRemoved = target.hasClaudeDir && await removeDirIfEmpty(target.claudeDir);
|
|
542
|
+
const claudeDirKept = !claudeDirRemoved && target.hasClaudeDir && await directoryExists(target.claudeDir);
|
|
543
|
+
return {
|
|
544
|
+
claudeDirRemoved,
|
|
545
|
+
claudeSrcManifestRemoved: manifest.manifestRemoved,
|
|
546
|
+
claudeSrcDirRemoved: manifest.dirRemoved,
|
|
547
|
+
claudeDirKept
|
|
548
|
+
};
|
|
549
|
+
}
|
|
550
|
+
async function isDirectoryEmpty(dirPath) {
|
|
551
|
+
try {
|
|
552
|
+
const allEntries = await readdir(dirPath);
|
|
553
|
+
return allEntries.length === 0;
|
|
554
|
+
} catch {
|
|
555
|
+
return true;
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
async function listAgentFiles(agentsDir) {
|
|
559
|
+
try {
|
|
560
|
+
return await listAgentMdFiles(agentsDir);
|
|
561
|
+
} catch {
|
|
562
|
+
return [];
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
export {
|
|
566
|
+
Uninstall as default,
|
|
567
|
+
getCliInstalledPluginKeys,
|
|
568
|
+
uninstallPlugins
|
|
569
|
+
};
|
|
570
|
+
//# sourceMappingURL=uninstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cli/commands/uninstall.tsx"],"sourcesContent":["import React from \"react\";\nimport { partition } from \"remeda\";\nimport path from \"path\";\nimport { readdir } from \"fs/promises\";\n\nimport { Flags } from \"@oclif/core\";\nimport { Box, Text, useApp } from \"ink\";\n\nimport { BaseCommand } from \"../base-command\";\nimport { Confirm } from \"../components/common/confirm\";\nimport { promptConfirm } from \"../components/common/prompt-confirm.js\";\nimport { getErrorMessage } from \"../utils/errors\";\nimport { directoryExists, fileExists, listDirectories, remove } from \"../utils/fs\";\nimport { listAgentMdFiles } from \"../lib/agents\";\nimport { claudePluginUninstallBestEffort, isClaudeCLIAvailable } from \"../utils/exec\";\nimport {\n listPluginNames,\n getProjectPluginsDir,\n buildMarketplacePluginRef,\n parseMarketplacePluginRef,\n toClaudePluginScope,\n} from \"../lib/plugins/index\";\nimport { readForkedFromMetadata } from \"../lib/skills/index\";\nimport { isHomeDirectory, resolveInstallPaths } from \"../lib/installation/index\";\nimport { lazyGateDeps, mutateGlobal, propagateGlobalRemoval } from \"../lib/config-gate/index.js\";\nimport { loadSkillsMatrixFromSource } from \"../lib/loading\";\nimport { loadAgentDefs } from \"../lib/operations\";\nimport { ConfigLoadError, loadProjectConfigFromDir } from \"../lib/configuration/project-config\";\nimport {\n CLAUDE_DIR,\n CLAUDE_SRC_DIR,\n CLI_COLORS,\n DEFAULT_BRANDING,\n EJECT_SOURCE,\n STANDARD_FILES,\n} from \"../consts\";\nimport { EXIT_CODES } from \"../lib/exit-codes\";\nimport {\n SUCCESS_MESSAGES,\n INFO_MESSAGES,\n registeredProjectsUpdated,\n registeredProjectUpdateSkipped,\n registeredProjectsUpdateFailed,\n} from \"../utils/messages\";\nimport type { AgentDefinition, AgentName, MergedSkillsMatrix, ProjectConfig } from \"../types/index\";\n\n/** A grouped section of the uninstall removal plan (header label + item lines). */\ntype RemovalPlanSection = {\n label: string;\n items: string[];\n};\n\n/**\n * Pure builder for the uninstall removal plan. The single source of the section\n * labels and item strings shared by printRemovalPlan (plain text) and the\n * UninstallConfirm Ink component — each renderer only adds its own\n * indentation/styling, so the emitted strings stay byte-identical.\n */\nfunction buildRemovalPlan(target: UninstallTarget): RemovalPlanSection[] {\n const sections: RemovalPlanSection[] = [];\n\n if (target.hasPlugins) {\n sections.push({ label: \"Plugins:\", items: [...target.cliPluginNames] });\n }\n\n if (target.hasLocalSkills || target.hasLocalAgents) {\n const items: string[] = [];\n if (target.hasLocalSkills) items.push(`${target.skillsDir}/ (matching sources)`);\n if (target.hasLocalAgents) items.push(`${target.agentsDir}/ (CLI-compiled)`);\n sections.push({ label: \"CLI-managed files:\", items });\n }\n\n // The CLI config manifest (config.ts + config-types.ts) is always removed.\n if (target.hasClaudeSrcConfig || target.hasClaudeSrcConfigTypes) {\n const items: string[] = [];\n if (target.hasClaudeSrcConfig) {\n items.push(`${target.claudeSrcDir}/${STANDARD_FILES.CONFIG_TS}`);\n }\n if (target.hasClaudeSrcConfigTypes) {\n items.push(`${target.claudeSrcDir}/${STANDARD_FILES.CONFIG_TYPES_TS}`);\n }\n sections.push({ label: \"Config:\", items });\n }\n\n return sections;\n}\n\ntype UninstallConfirmProps = {\n target: UninstallTarget;\n onConfirm: () => void;\n onCancel: () => void;\n};\n\nconst UninstallConfirm: React.FC<UninstallConfirmProps> = ({ target, onConfirm, onCancel }) => {\n const { exit } = useApp();\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>The following will be removed:</Text>\n <Text> </Text>\n\n {buildRemovalPlan(target).map((section) => (\n <Box key={section.label} flexDirection=\"column\">\n <Text color={CLI_COLORS.ERROR}> {section.label}</Text>\n {section.items.map((item) => (\n <Text key={item} dimColor>\n {\" \"}\n {item}\n </Text>\n ))}\n </Box>\n ))}\n\n <Text> </Text>\n <Confirm\n message=\"Are you sure you want to uninstall?\"\n onConfirm={() => {\n onConfirm();\n exit();\n }}\n onCancel={() => {\n onCancel();\n exit();\n }}\n defaultValue={false}\n />\n </Box>\n );\n};\n\nexport default class Uninstall extends BaseCommand {\n static summary = `Remove ${DEFAULT_BRANDING.NAME} from this project`;\n\n static description = `Uninstall ${DEFAULT_BRANDING.NAME} from this project. Removes CLI-managed skills (matched by source), compiled agents, plugins, and the .claude-src/ config manifest (config.ts + config-types.ts). User-created content is preserved.`;\n\n static examples = [\n \"<%= config.bin %> <%= command.id %>\",\n \"<%= config.bin %> <%= command.id %> --yes\",\n ];\n\n static flags = {\n ...BaseCommand.baseFlags,\n yes: Flags.boolean({\n char: \"y\",\n description: \"Skip confirmation prompt\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Uninstall);\n const projectDir = process.cwd();\n\n this.printHeader();\n\n const target = await detectUninstallTarget(projectDir, (reason) =>\n this.warn(\n `Could not read the project config — plugins and compiled agents it lists may be left behind: ${reason}`,\n ),\n );\n if (!hasAnythingToRemove(target)) {\n this.reportNothingToUninstall();\n return;\n }\n\n const confirmed = flags.yes ? this.printRemovalPlan(target) : await this.confirmRemoval(target);\n if (!confirmed) {\n this.log(\"\");\n this.log(\"Uninstall cancelled\");\n this.exit(EXIT_CODES.CANCELLED);\n }\n\n await this.executeUninstall(target, projectDir);\n this.reportSuccess();\n }\n\n private printHeader(): void {\n this.log(\"\");\n this.log(`${DEFAULT_BRANDING.NAME} Uninstall`);\n this.log(\"\");\n }\n\n private reportNothingToUninstall(): void {\n this.warn(\"Nothing to uninstall.\");\n this.log(\"\");\n this.log(INFO_MESSAGES.NOT_INSTALLED);\n this.log(\"\");\n this.log(INFO_MESSAGES.NO_CHANGES_MADE);\n }\n\n private printRemovalPlan(target: UninstallTarget): true {\n this.log(\"The following will be removed:\");\n this.log(\"\");\n\n for (const section of buildRemovalPlan(target)) {\n this.log(` ${section.label}`);\n for (const item of section.items) {\n this.log(` ${item}`);\n }\n }\n\n this.log(\"\");\n return true;\n }\n\n private async confirmRemoval(target: UninstallTarget): Promise<boolean> {\n const outcome = await promptConfirm(({ onConfirm, onCancel }) => (\n <UninstallConfirm target={target} onConfirm={onConfirm} onCancel={onCancel} />\n ));\n return outcome === \"confirmed\";\n }\n\n private async executeUninstall(target: UninstallTarget, projectDir: string): Promise<void> {\n const isGlobalUninstall = isHomeDirectory(projectDir);\n // Prepared BEFORE any removal: the projects[] registry and the source used\n // to regenerate each project's config-types.ts both live in the global\n // config this uninstall is about to delete.\n const propagation = isGlobalUninstall\n ? await this.prepareGlobalPropagation(target, projectDir)\n : null;\n\n if (target.hasPlugins) {\n this.log(\"Uninstalling plugins...\");\n\n try {\n const pluginResult = await uninstallPlugins(target, projectDir, (name) =>\n this.log(` Uninstalled plugin '${name}'`),\n );\n\n this.logSuccess(\n `Uninstalled ${pluginResult.totalUninstalled} ${pluginResult.totalUninstalled === 1 ? \"plugin\" : \"plugins\"}`,\n );\n } catch (error) {\n this.log(\"Plugin uninstall failed\");\n this.error(getErrorMessage(error), {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n\n try {\n await this.removeLocalFiles(target);\n } catch (error) {\n this.log(\"Failed to remove local files\");\n this.error(getErrorMessage(error), {\n exit: EXIT_CODES.ERROR,\n });\n }\n\n if (isGlobalUninstall) {\n // The global manifest is gone — prune the inlined global-scoped entries the\n // registered projects still carry so they stop referencing removed content.\n if (propagation) {\n await this.updateRegisteredProjects(propagation);\n }\n return;\n }\n\n // Deregister this project from the global config's tracked projects so future\n // global edits stop propagating back into it. Best-effort by nature: a missing,\n // project-less, or corrupt global config (ConfigLoadError) must never fail the\n // uninstall — warn and move on.\n try {\n // Registration bookkeeping only: nothing inlines the `projects[]` list into a\n // project config, so this loads neither the matrix nor the agent definitions\n // and the uninstall stays offline.\n await mutateGlobal({ kind: \"deregister-project\", projectDir }, lazyGateDeps(projectDir));\n } catch (error) {\n this.warn(`Could not update the global project registry: ${getErrorMessage(error)}`);\n }\n }\n\n /**\n * Loads what updating registered projects needs (global config with its\n * projects[] registry, skills matrix, agent definitions) BEFORE the global\n * .claude-src manifest is deleted — source resolution reads that config.\n * Returns null when nothing is registered or loading fails; a load failure\n * warns and never aborts the uninstall.\n *\n * `skipExtraSources: true` is NOT a divergence from the wizard's full\n * multi-source load: extra-source loading only annotates each skill's\n * `availableSources`/`activeSource` for wizard UI tagging — it never adds\n * skills or categories to the matrix, and the config-types writer never reads\n * those annotations, so the regenerated project types are byte-identical\n * either way (pinned by the skipExtraSources parity test in\n * local-installer.test.ts). Skipping avoids fetching every registered extra\n * source (network on a cold cache, plus unreachable-remote warnings) during\n * an uninstall that must never hang or noise-fail on remote state.\n */\n private async prepareGlobalPropagation(\n target: UninstallTarget,\n projectDir: string,\n ): Promise<GlobalPropagationData | null> {\n const globalConfig = target.config;\n if (!globalConfig?.projects?.length) return null;\n\n try {\n const [sourceResult, agentDefs] = await Promise.all([\n loadSkillsMatrixFromSource({\n projectDir,\n skipExtraSources: true,\n matrixOnly: true,\n }),\n loadAgentDefs({ projectDir }),\n ]);\n return { globalConfig, matrix: sourceResult.matrix, agents: agentDefs.agents };\n } catch (error) {\n this.warn(registeredProjectsUpdateFailed(getErrorMessage(error)));\n return null;\n }\n }\n\n /**\n * Prunes the inlined global-scoped config entries from every registered\n * project and regenerates its config-types.ts. Runs AFTER the global manifest\n * removal so the regenerated project types fall back to the standalone form\n * instead of importing from the deleted global config-types.ts. Best-effort:\n * unreachable projects are warned and skipped, and no failure here may abort\n * the uninstall.\n */\n private async updateRegisteredProjects(propagation: GlobalPropagationData): Promise<void> {\n try {\n const report = await propagateGlobalRemoval(propagation.globalConfig, {\n matrix: propagation.matrix,\n agents: propagation.agents,\n });\n for (const skippedPath of report.propagated.skipped) {\n this.warn(registeredProjectUpdateSkipped(skippedPath));\n }\n if (report.propagated.updated.length === 0) return;\n\n this.logSuccess(registeredProjectsUpdated(report.propagated.updated.length));\n\n // The pruned projects' compiled agents were built from the global rows this\n // uninstall just removed, so the prune owes them a recompile too.\n const { recompiledCount, failedCount, warnings } = report.recompile;\n for (const warning of warnings) {\n this.warn(warning);\n }\n const failureSuffix = failedCount > 0 ? ` (${failedCount} failed)` : \"\";\n this.log(`Recompiled agents in ${recompiledCount} registered projects${failureSuffix}`);\n } catch (error) {\n this.warn(registeredProjectsUpdateFailed(getErrorMessage(error)));\n }\n }\n\n private reportSuccess(): void {\n this.log(\"\");\n this.log(`${DEFAULT_BRANDING.NAME} has been uninstalled.`);\n this.log(\"\");\n this.logSuccess(SUCCESS_MESSAGES.UNINSTALL_COMPLETE);\n this.log(\"\");\n }\n\n private async removeLocalFiles(target: UninstallTarget): Promise<void> {\n const skillResult = await removeMatchingSkills(\n target,\n (dirName) => this.log(` Uninstalled skill '${dirName}'`),\n (dirName) => this.warn(`Skipping '${dirName}': not created by ${DEFAULT_BRANDING.NAME} CLI`),\n );\n\n if (skillResult.removedCount > 0) {\n this.logSuccess(\n `Removed ${skillResult.removedCount} CLI-installed ${skillResult.removedCount === 1 ? \"skill\" : \"skills\"}`,\n );\n }\n\n const agentResult = await removeMatchingAgents(target, (agentName) =>\n this.log(` Uninstalled agent '${agentName}'`),\n );\n\n if (agentResult.removedCount > 0) {\n this.logSuccess(\n `Removed ${agentResult.removedCount} compiled ${agentResult.removedCount === 1 ? \"agent\" : \"agents\"}`,\n );\n }\n\n const cleanup = await cleanupEmptyDirs(target);\n\n if (cleanup.claudeSrcDirRemoved) {\n this.logSuccess(`Removed ${CLAUDE_SRC_DIR}/`);\n } else if (cleanup.claudeSrcManifestRemoved) {\n this.logSuccess(`Removed CLI config from ${CLAUDE_SRC_DIR}/`);\n }\n\n if (cleanup.claudeDirRemoved) {\n this.logSuccess(`Removed ${CLAUDE_DIR}/`);\n } else if (cleanup.claudeDirKept) {\n this.log(`Kept ${CLAUDE_DIR}/ (contains user content)`);\n }\n }\n}\n\n/** @internal Exported for testing */\nexport type UninstallTarget = {\n hasPlugins: boolean;\n pluginNames: string[];\n /** Plugin names filtered to only those installed by this CLI (matched against config skills) */\n cliPluginNames: string[];\n hasLocalSkills: boolean;\n hasLocalAgents: boolean;\n hasClaudeDir: boolean;\n /** Whether .claude-src/config.ts exists (the CLI config manifest). */\n hasClaudeSrcConfig: boolean;\n /** Whether .claude-src/config-types.ts exists (companion to config.ts). */\n hasClaudeSrcConfigTypes: boolean;\n pluginsDir: string;\n skillsDir: string;\n agentsDir: string;\n claudeDir: string;\n claudeSrcDir: string;\n /** Resolved project source config from .claude-src/config.ts */\n config: ProjectConfig | null;\n /** Agent names from the generated config (e.g., [\"web-developer\"]) */\n configuredAgents: AgentName[];\n};\n\n/**\n * Everything a global uninstall needs to update the registered projects after\n * the global manifest is removed — captured before removal because it is\n * sourced from the config being deleted.\n */\ntype GlobalPropagationData = {\n globalConfig: ProjectConfig;\n matrix: MergedSkillsMatrix;\n agents: Record<AgentName, AgentDefinition>;\n};\n\ntype SkillRemovalResult = {\n removedCount: number;\n skippedCount: number;\n removedNames: string[];\n skippedNames: string[];\n /** Whether the skills directory was cleaned up (empty after removal) */\n dirCleaned: boolean;\n};\n\ntype AgentRemovalResult = {\n removedCount: number;\n removedNames: string[];\n /** Whether the agents directory was cleaned up (empty after removal) */\n dirCleaned: boolean;\n};\n\ntype UninstallPluginsResult = {\n uninstalledNames: string[];\n totalUninstalled: number;\n};\n\ntype CleanupResult = {\n claudeDirRemoved: boolean;\n /** Whether config.ts/config-types.ts were removed from .claude-src/ */\n claudeSrcManifestRemoved: boolean;\n /** Whether the emptied .claude-src/ directory itself was removed */\n claudeSrcDirRemoved: boolean;\n /** Whether .claude/ still exists with user content after cleanup */\n claudeDirKept: boolean;\n};\n\nfunction hasAnythingToRemove(target: UninstallTarget): boolean {\n return (\n target.hasPlugins ||\n target.hasLocalSkills ||\n target.hasLocalAgents ||\n target.hasClaudeSrcConfig ||\n target.hasClaudeSrcConfigTypes\n );\n}\n\nfunction collectConfiguredAgents(config: Partial<ProjectConfig> | null): AgentName[] {\n if (!config?.agents) return [];\n return config.agents.map((a) => a.name);\n}\n\n/** @internal Exported for testing */\nexport function getCliInstalledPluginKeys(config: Partial<ProjectConfig> | null): Set<string> {\n if (!config?.skills) return new Set();\n const { marketplace } = config;\n return new Set(\n config.skills.flatMap((skill) => [\n // Primary key: skill.id@skill.source\n buildMarketplacePluginRef(skill.id, skill.source),\n // Marketplace variant for plugins installed via marketplace where\n // skill.source may differ (e.g., \"eject\" vs the marketplace name)\n ...(marketplace && skill.source !== marketplace && skill.source !== EJECT_SOURCE\n ? [buildMarketplacePluginRef(skill.id, marketplace)]\n : []),\n ]),\n );\n}\n\n/**\n * Loads the config that drives the removal plan. A config file that exists but\n * cannot be parsed (`ConfigLoadError`) is reported through `onLoadFailed` and\n * then treated exactly like a missing one — an unreadable config is precisely\n * when a user needs to uninstall, so it must never fail the run. Same posture as\n * the `deregisterProjectPath` call site. Only the plan degrades: the plugins and\n * compiled agents the config named can no longer be identified, while file\n * removal proceeds. Any other failure is a real fault and still propagates.\n */\nasync function loadUninstallConfig(\n projectDir: string,\n onLoadFailed: (reason: string) => void,\n): Promise<ProjectConfig | null> {\n try {\n const result = await loadProjectConfigFromDir(projectDir);\n return result?.config ?? null;\n } catch (error) {\n if (!(error instanceof ConfigLoadError)) throw error;\n onLoadFailed(getErrorMessage(error));\n return null;\n }\n}\n\n/**\n * Detects what's installed in a project directory for uninstallation.\n *\n * Checks for plugins, local skills, agents, config directories, and\n * resolves which plugins were installed by this CLI.\n */\nasync function detectUninstallTarget(\n projectDir: string,\n onConfigLoadFailed: (reason: string) => void,\n): Promise<UninstallTarget> {\n const pluginsDir = getProjectPluginsDir(projectDir);\n const { skillsDir, agentsDir } = resolveInstallPaths(projectDir);\n const claudeDir = path.join(projectDir, CLAUDE_DIR);\n const claudeSrcDir = path.join(projectDir, CLAUDE_SRC_DIR);\n\n const claudeSrcConfigPath = path.join(claudeSrcDir, STANDARD_FILES.CONFIG_TS);\n const claudeSrcConfigTypesPath = path.join(claudeSrcDir, STANDARD_FILES.CONFIG_TYPES_TS);\n\n const [\n hasLocalSkills,\n hasLocalAgents,\n hasClaudeDir,\n hasClaudeSrcConfig,\n hasClaudeSrcConfigTypes,\n config,\n ] = await Promise.all([\n directoryExists(skillsDir),\n directoryExists(agentsDir),\n directoryExists(claudeDir),\n fileExists(claudeSrcConfigPath),\n fileExists(claudeSrcConfigTypesPath),\n loadUninstallConfig(projectDir, onConfigLoadFailed),\n ]);\n\n let pluginNames: string[] = [];\n try {\n pluginNames = await listPluginNames(projectDir);\n } catch {\n // Best-effort: plugin detection may fail\n }\n\n const activeConfig = config\n ? {\n ...config,\n skills: config.skills?.filter((s) => !s.excluded),\n agents: config.agents?.filter((a) => !a.excluded),\n }\n : null;\n const configuredAgents = collectConfiguredAgents(activeConfig);\n const cliInstalledKeys = getCliInstalledPluginKeys(activeConfig);\n const cliPluginNames = pluginNames.filter((name) => cliInstalledKeys.has(name));\n\n return {\n hasPlugins: cliPluginNames.length > 0,\n pluginNames,\n cliPluginNames,\n hasLocalSkills,\n hasLocalAgents,\n hasClaudeDir,\n hasClaudeSrcConfig,\n hasClaudeSrcConfigTypes,\n pluginsDir,\n skillsDir,\n agentsDir,\n claudeDir,\n claudeSrcDir,\n config,\n configuredAgents,\n };\n}\n\nfunction shouldRemoveSkill(forkedFrom: { source?: string } | null): boolean {\n return forkedFrom !== null;\n}\n\nasync function removeMatchingSkills(\n target: Pick<UninstallTarget, \"hasLocalSkills\" | \"skillsDir\">,\n onRemoved?: (dirName: string) => void,\n onSkipped?: (dirName: string) => void,\n): Promise<SkillRemovalResult> {\n if (!target.hasLocalSkills) {\n return {\n removedCount: 0,\n skippedCount: 0,\n removedNames: [],\n skippedNames: [],\n dirCleaned: false,\n };\n }\n\n const classified = await classifySkillDirs(target.skillsDir);\n const removedNames = await removeClassifiedSkills(\n classified.toRemove,\n target.skillsDir,\n onRemoved,\n );\n classified.toSkip.forEach((name) => onSkipped?.(name));\n const dirCleaned = await cleanupSkillsDir(target.skillsDir, classified.toSkip.length === 0);\n\n return {\n removedCount: removedNames.length,\n skippedCount: classified.toSkip.length,\n removedNames,\n skippedNames: classified.toSkip,\n dirCleaned,\n };\n}\n\nasync function classifySkillDirs(\n skillsDir: string,\n): Promise<{ toRemove: string[]; toSkip: string[] }> {\n const dirNames = await listDirectories(skillsDir);\n const entries = await Promise.all(\n dirNames.map(async (name) => ({\n name,\n forkedFrom: await readForkedFromMetadata(path.join(skillsDir, name)),\n })),\n );\n const [removable, skippable] = partition(entries, (entry) => shouldRemoveSkill(entry.forkedFrom));\n return { toRemove: removable.map((e) => e.name), toSkip: skippable.map((e) => e.name) };\n}\n\nasync function removeClassifiedSkills(\n names: string[],\n skillsDir: string,\n onRemoved?: (name: string) => void,\n): Promise<string[]> {\n for (const name of names) {\n await remove(path.join(skillsDir, name));\n onRemoved?.(name);\n }\n return names;\n}\n\nasync function cleanupSkillsDir(dir: string, allRemoved: boolean): Promise<boolean> {\n if (!allRemoved) return false;\n return removeDirIfEmpty(dir);\n}\n\n/** Removes `dir` when it exists and is empty; true when removed. */\nasync function removeDirIfEmpty(dir: string): Promise<boolean> {\n if (!(await directoryExists(dir))) return false;\n if (!(await isDirectoryEmpty(dir))) return false;\n await remove(dir);\n return true;\n}\n\n/**\n * Removes compiled agent .md files that are listed in the project config.\n *\n * A file is removed only when its basename matches a configured agent\n * (config.agents); agents absent from config are preserved. Cleans up the\n * agents directory if empty after removal.\n *\n * @param onRemoved - Called for each removed agent name (for logging)\n */\nasync function removeMatchingAgents(\n target: Pick<UninstallTarget, \"hasLocalAgents\" | \"agentsDir\" | \"configuredAgents\">,\n onRemoved?: (agentName: string) => void,\n): Promise<AgentRemovalResult> {\n if (!target.hasLocalAgents) {\n return { removedCount: 0, removedNames: [], dirCleaned: false };\n }\n\n if (target.configuredAgents.length === 0) {\n return { removedCount: 0, removedNames: [], dirCleaned: false };\n }\n\n const agentFiles = await listAgentFiles(target.agentsDir);\n const removedNames = agentFiles\n .map((agentFile) => agentFile.replace(/\\.md$/, \"\"))\n // Array<AgentName>.includes rejects a plain string; widen the configured\n // list to readonly string[] so the on-disk basename can be tested for\n // membership in config.agents.\n .filter((agentName) => (target.configuredAgents as readonly string[]).includes(agentName));\n\n for (const agentName of removedNames) {\n await remove(path.join(target.agentsDir, `${agentName}.md`));\n onRemoved?.(agentName);\n }\n\n const dirCleaned = await removeDirIfEmpty(target.agentsDir);\n\n return {\n removedCount: removedNames.length,\n removedNames,\n dirCleaned,\n };\n}\n\n/**\n * Uninstalls CLI-managed plugins by removing them from the Claude CLI\n * and deleting their local directories.\n *\n * Derives scope from per-skill config when available; falls back to project-level.\n *\n * @param onUninstalled - Called for each successfully uninstalled plugin name (for logging)\n * @internal Exported for testing\n */\nexport async function uninstallPlugins(\n target: Pick<UninstallTarget, \"hasPlugins\" | \"cliPluginNames\" | \"pluginsDir\" | \"config\">,\n projectDir: string,\n onUninstalled?: (pluginName: string) => void,\n): Promise<UninstallPluginsResult> {\n if (!target.hasPlugins) {\n return { uninstalledNames: [], totalUninstalled: 0 };\n }\n\n const cliAvailable = await isClaudeCLIAvailable();\n\n for (const pluginName of target.cliPluginNames) {\n if (cliAvailable) {\n // Derive primary scope from per-skill config; shared helper tries both scopes\n // to handle re-scoped plugins where the registry entry may be under the\n // original scope rather than the currently-configured one.\n const skillId = parseMarketplacePluginRef(pluginName);\n const skillConfig = target.config?.skills?.find((s) => s.id === skillId);\n const primaryScope = toClaudePluginScope(skillConfig?.scope);\n await claudePluginUninstallBestEffort(pluginName, primaryScope, projectDir);\n }\n\n const pluginPath = path.join(target.pluginsDir, pluginName);\n await remove(pluginPath);\n onUninstalled?.(pluginName);\n }\n\n // Every iteration either completes or throws (aborting the whole uninstall),\n // so reaching this return means every CLI-managed plugin was removed.\n return {\n uninstalledNames: target.cliPluginNames,\n totalUninstalled: target.cliPluginNames.length,\n };\n}\n\n/**\n * Removes the CLI config manifest (config.ts + config-types.ts) from .claude-src/,\n * then the .claude-src/ directory itself when it has nothing else left. User-owned\n * content in .claude-src/ (e.g. ejected templates) keeps the directory alive.\n */\nasync function removeConfigManifest(\n target: Pick<UninstallTarget, \"claudeSrcDir\" | \"hasClaudeSrcConfig\" | \"hasClaudeSrcConfigTypes\">,\n): Promise<{ manifestRemoved: boolean; dirRemoved: boolean }> {\n let manifestRemoved = false;\n\n if (target.hasClaudeSrcConfig) {\n await remove(path.join(target.claudeSrcDir, STANDARD_FILES.CONFIG_TS));\n manifestRemoved = true;\n }\n if (target.hasClaudeSrcConfigTypes) {\n await remove(path.join(target.claudeSrcDir, STANDARD_FILES.CONFIG_TYPES_TS));\n manifestRemoved = true;\n }\n\n const dirRemoved = manifestRemoved && (await removeDirIfEmpty(target.claudeSrcDir));\n return { manifestRemoved, dirRemoved };\n}\n\n/**\n * Removes the CLI config manifest and cleans up empty .claude/ and .claude-src/\n * directories after uninstall.\n *\n * The config manifest is always removed. The .claude-src/ and .claude/ directories\n * are removed only when they are empty after their CLI-managed contents are gone.\n */\nasync function cleanupEmptyDirs(\n target: Pick<\n UninstallTarget,\n \"hasClaudeDir\" | \"claudeDir\" | \"claudeSrcDir\" | \"hasClaudeSrcConfig\" | \"hasClaudeSrcConfigTypes\"\n >,\n): Promise<CleanupResult> {\n const manifest = await removeConfigManifest(target);\n\n const claudeDirRemoved = target.hasClaudeDir && (await removeDirIfEmpty(target.claudeDir));\n // Nothing else removes .claude itself, so \"kept\" is exactly \"present but not removed\".\n const claudeDirKept =\n !claudeDirRemoved && target.hasClaudeDir && (await directoryExists(target.claudeDir));\n\n return {\n claudeDirRemoved,\n claudeSrcManifestRemoved: manifest.manifestRemoved,\n claudeSrcDirRemoved: manifest.dirRemoved,\n claudeDirKept,\n };\n}\n\nasync function isDirectoryEmpty(dirPath: string): Promise<boolean> {\n try {\n const allEntries = await readdir(dirPath);\n return allEntries.length === 0;\n } catch {\n return true;\n }\n}\n\nasync function listAgentFiles(agentsDir: string): Promise<string[]> {\n try {\n return await listAgentMdFiles(agentsDir);\n } catch {\n return [];\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA,SAAS,iBAAiB;AAC1B,OAAO,UAAU;AACjB,SAAS,eAAe;AAExB,SAAS,aAAa;AACtB,SAAS,KAAK,MAAM,cAAc;AA4F5B,cAKI,YALJ;AAxCN,SAAS,iBAAiB,QAA+C;AACvE,QAAM,WAAiC,CAAC;AAExC,MAAI,OAAO,YAAY;AACrB,aAAS,KAAK,EAAE,OAAO,YAAY,OAAO,CAAC,GAAG,OAAO,cAAc,EAAE,CAAC;AAAA,EACxE;AAEA,MAAI,OAAO,kBAAkB,OAAO,gBAAgB;AAClD,UAAM,QAAkB,CAAC;AACzB,QAAI,OAAO,eAAgB,OAAM,KAAK,GAAG,OAAO,SAAS,sBAAsB;AAC/E,QAAI,OAAO,eAAgB,OAAM,KAAK,GAAG,OAAO,SAAS,kBAAkB;AAC3E,aAAS,KAAK,EAAE,OAAO,sBAAsB,MAAM,CAAC;AAAA,EACtD;AAGA,MAAI,OAAO,sBAAsB,OAAO,yBAAyB;AAC/D,UAAM,QAAkB,CAAC;AACzB,QAAI,OAAO,oBAAoB;AAC7B,YAAM,KAAK,GAAG,OAAO,YAAY,IAAI,eAAe,SAAS,EAAE;AAAA,IACjE;AACA,QAAI,OAAO,yBAAyB;AAClC,YAAM,KAAK,GAAG,OAAO,YAAY,IAAI,eAAe,eAAe,EAAE;AAAA,IACvE;AACA,aAAS,KAAK,EAAE,OAAO,WAAW,MAAM,CAAC;AAAA,EAC3C;AAEA,SAAO;AACT;AAQA,IAAM,mBAAoD,CAAC,EAAE,QAAQ,WAAW,SAAS,MAAM;AAC7F,QAAM,EAAE,KAAK,IAAI,OAAO;AAExB,SACE,qBAAC,OAAI,eAAc,UACjB;AAAA,wBAAC,QAAK,MAAI,MAAC,4CAA8B;AAAA,IACzC,oBAAC,QAAK,eAAC;AAAA,IAEN,iBAAiB,MAAM,EAAE,IAAI,CAAC,YAC7B,qBAAC,OAAwB,eAAc,UACrC;AAAA,2BAAC,QAAK,OAAO,WAAW,OAAO;AAAA;AAAA,QAAE,QAAQ;AAAA,SAAM;AAAA,MAC9C,QAAQ,MAAM,IAAI,CAAC,SAClB,qBAAC,QAAgB,UAAQ,MACtB;AAAA;AAAA,QACA;AAAA,WAFQ,IAGX,CACD;AAAA,SAPO,QAAQ,KAQlB,CACD;AAAA,IAED,oBAAC,QAAK,eAAC;AAAA,IACP;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,WAAW,MAAM;AACf,oBAAU;AACV,eAAK;AAAA,QACP;AAAA,QACA,UAAU,MAAM;AACd,mBAAS;AACT,eAAK;AAAA,QACP;AAAA,QACA,cAAc;AAAA;AAAA,IAChB;AAAA,KACF;AAEJ;AAEA,IAAqB,YAArB,MAAqB,mBAAkB,YAAY;AAAA,EACjD,OAAO,UAAU,UAAU,iBAAiB,IAAI;AAAA,EAEhD,OAAO,cAAc,aAAa,iBAAiB,IAAI;AAAA,EAEvD,OAAO,WAAW;AAAA,IAChB;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAO,QAAQ;AAAA,IACb,GAAG,YAAY;AAAA,IACf,KAAK,MAAM,QAAQ;AAAA,MACjB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,MAAM,UAAS;AAC5C,UAAM,aAAa,QAAQ,IAAI;AAE/B,SAAK,YAAY;AAEjB,UAAM,SAAS,MAAM;AAAA,MAAsB;AAAA,MAAY,CAAC,WACtD,KAAK;AAAA,QACH,qGAAgG,MAAM;AAAA,MACxG;AAAA,IACF;AACA,QAAI,CAAC,oBAAoB,MAAM,GAAG;AAChC,WAAK,yBAAyB;AAC9B;AAAA,IACF;AAEA,UAAM,YAAY,MAAM,MAAM,KAAK,iBAAiB,MAAM,IAAI,MAAM,KAAK,eAAe,MAAM;AAC9F,QAAI,CAAC,WAAW;AACd,WAAK,IAAI,EAAE;AACX,WAAK,IAAI,qBAAqB;AAC9B,WAAK,KAAK,WAAW,SAAS;AAAA,IAChC;AAEA,UAAM,KAAK,iBAAiB,QAAQ,UAAU;AAC9C,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,cAAoB;AAC1B,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,GAAG,iBAAiB,IAAI,YAAY;AAC7C,SAAK,IAAI,EAAE;AAAA,EACb;AAAA,EAEQ,2BAAiC;AACvC,SAAK,KAAK,uBAAuB;AACjC,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,cAAc,aAAa;AACpC,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,cAAc,eAAe;AAAA,EACxC;AAAA,EAEQ,iBAAiB,QAA+B;AACtD,SAAK,IAAI,gCAAgC;AACzC,SAAK,IAAI,EAAE;AAEX,eAAW,WAAW,iBAAiB,MAAM,GAAG;AAC9C,WAAK,IAAI,KAAK,QAAQ,KAAK,EAAE;AAC7B,iBAAW,QAAQ,QAAQ,OAAO;AAChC,aAAK,IAAI,OAAO,IAAI,EAAE;AAAA,MACxB;AAAA,IACF;AAEA,SAAK,IAAI,EAAE;AACX,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,eAAe,QAA2C;AACtE,UAAM,UAAU,MAAM,cAAc,CAAC,EAAE,WAAW,SAAS,MACzD,oBAAC,oBAAiB,QAAgB,WAAsB,UAAoB,CAC7E;AACD,WAAO,YAAY;AAAA,EACrB;AAAA,EAEA,MAAc,iBAAiB,QAAyB,YAAmC;AACzF,UAAM,oBAAoB,gBAAgB,UAAU;AAIpD,UAAM,cAAc,oBAChB,MAAM,KAAK,yBAAyB,QAAQ,UAAU,IACtD;AAEJ,QAAI,OAAO,YAAY;AACrB,WAAK,IAAI,yBAAyB;AAElC,UAAI;AACF,cAAM,eAAe,MAAM;AAAA,UAAiB;AAAA,UAAQ;AAAA,UAAY,CAAC,SAC/D,KAAK,IAAI,yBAAyB,IAAI,GAAG;AAAA,QAC3C;AAEA,aAAK;AAAA,UACH,eAAe,aAAa,gBAAgB,IAAI,aAAa,qBAAqB,IAAI,WAAW,SAAS;AAAA,QAC5G;AAAA,MACF,SAAS,OAAO;AACd,aAAK,IAAI,yBAAyB;AAClC,aAAK,MAAM,gBAAgB,KAAK,GAAG;AAAA,UACjC,MAAM,WAAW;AAAA,QACnB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI;AACF,YAAM,KAAK,iBAAiB,MAAM;AAAA,IACpC,SAAS,OAAO;AACd,WAAK,IAAI,8BAA8B;AACvC,WAAK,MAAM,gBAAgB,KAAK,GAAG;AAAA,QACjC,MAAM,WAAW;AAAA,MACnB,CAAC;AAAA,IACH;AAEA,QAAI,mBAAmB;AAGrB,UAAI,aAAa;AACf,cAAM,KAAK,yBAAyB,WAAW;AAAA,MACjD;AACA;AAAA,IACF;AAMA,QAAI;AAIF,YAAM,aAAa,EAAE,MAAM,sBAAsB,WAAW,GAAG,aAAa,UAAU,CAAC;AAAA,IACzF,SAAS,OAAO;AACd,WAAK,KAAK,iDAAiD,gBAAgB,KAAK,CAAC,EAAE;AAAA,IACrF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAc,yBACZ,QACA,YACuC;AACvC,UAAM,eAAe,OAAO;AAC5B,QAAI,CAAC,cAAc,UAAU,OAAQ,QAAO;AAE5C,QAAI;AACF,YAAM,CAAC,cAAc,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,QAClD,2BAA2B;AAAA,UACzB;AAAA,UACA,kBAAkB;AAAA,UAClB,YAAY;AAAA,QACd,CAAC;AAAA,QACD,cAAc,EAAE,WAAW,CAAC;AAAA,MAC9B,CAAC;AACD,aAAO,EAAE,cAAc,QAAQ,aAAa,QAAQ,QAAQ,UAAU,OAAO;AAAA,IAC/E,SAAS,OAAO;AACd,WAAK,KAAK,+BAA+B,gBAAgB,KAAK,CAAC,CAAC;AAChE,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAc,yBAAyB,aAAmD;AACxF,QAAI;AACF,YAAM,SAAS,MAAM,uBAAuB,YAAY,cAAc;AAAA,QACpE,QAAQ,YAAY;AAAA,QACpB,QAAQ,YAAY;AAAA,MACtB,CAAC;AACD,iBAAW,eAAe,OAAO,WAAW,SAAS;AACnD,aAAK,KAAK,+BAA+B,WAAW,CAAC;AAAA,MACvD;AACA,UAAI,OAAO,WAAW,QAAQ,WAAW,EAAG;AAE5C,WAAK,WAAW,0BAA0B,OAAO,WAAW,QAAQ,MAAM,CAAC;AAI3E,YAAM,EAAE,iBAAiB,aAAa,SAAS,IAAI,OAAO;AAC1D,iBAAW,WAAW,UAAU;AAC9B,aAAK,KAAK,OAAO;AAAA,MACnB;AACA,YAAM,gBAAgB,cAAc,IAAI,KAAK,WAAW,aAAa;AACrE,WAAK,IAAI,wBAAwB,eAAe,uBAAuB,aAAa,EAAE;AAAA,IACxF,SAAS,OAAO;AACd,WAAK,KAAK,+BAA+B,gBAAgB,KAAK,CAAC,CAAC;AAAA,IAClE;AAAA,EACF;AAAA,EAEQ,gBAAsB;AAC5B,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,GAAG,iBAAiB,IAAI,wBAAwB;AACzD,SAAK,IAAI,EAAE;AACX,SAAK,WAAW,iBAAiB,kBAAkB;AACnD,SAAK,IAAI,EAAE;AAAA,EACb;AAAA,EAEA,MAAc,iBAAiB,QAAwC;AACrE,UAAM,cAAc,MAAM;AAAA,MACxB;AAAA,MACA,CAAC,YAAY,KAAK,IAAI,wBAAwB,OAAO,GAAG;AAAA,MACxD,CAAC,YAAY,KAAK,KAAK,aAAa,OAAO,qBAAqB,iBAAiB,IAAI,MAAM;AAAA,IAC7F;AAEA,QAAI,YAAY,eAAe,GAAG;AAChC,WAAK;AAAA,QACH,WAAW,YAAY,YAAY,kBAAkB,YAAY,iBAAiB,IAAI,UAAU,QAAQ;AAAA,MAC1G;AAAA,IACF;AAEA,UAAM,cAAc,MAAM;AAAA,MAAqB;AAAA,MAAQ,CAAC,cACtD,KAAK,IAAI,wBAAwB,SAAS,GAAG;AAAA,IAC/C;AAEA,QAAI,YAAY,eAAe,GAAG;AAChC,WAAK;AAAA,QACH,WAAW,YAAY,YAAY,aAAa,YAAY,iBAAiB,IAAI,UAAU,QAAQ;AAAA,MACrG;AAAA,IACF;AAEA,UAAM,UAAU,MAAM,iBAAiB,MAAM;AAE7C,QAAI,QAAQ,qBAAqB;AAC/B,WAAK,WAAW,WAAW,cAAc,GAAG;AAAA,IAC9C,WAAW,QAAQ,0BAA0B;AAC3C,WAAK,WAAW,2BAA2B,cAAc,GAAG;AAAA,IAC9D;AAEA,QAAI,QAAQ,kBAAkB;AAC5B,WAAK,WAAW,WAAW,UAAU,GAAG;AAAA,IAC1C,WAAW,QAAQ,eAAe;AAChC,WAAK,IAAI,QAAQ,UAAU,2BAA2B;AAAA,IACxD;AAAA,EACF;AACF;AAoEA,SAAS,oBAAoB,QAAkC;AAC7D,SACE,OAAO,cACP,OAAO,kBACP,OAAO,kBACP,OAAO,sBACP,OAAO;AAEX;AAEA,SAAS,wBAAwB,QAAoD;AACnF,MAAI,CAAC,QAAQ,OAAQ,QAAO,CAAC;AAC7B,SAAO,OAAO,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI;AACxC;AAGO,SAAS,0BAA0B,QAAoD;AAC5F,MAAI,CAAC,QAAQ,OAAQ,QAAO,oBAAI,IAAI;AACpC,QAAM,EAAE,YAAY,IAAI;AACxB,SAAO,IAAI;AAAA,IACT,OAAO,OAAO,QAAQ,CAAC,UAAU;AAAA;AAAA,MAE/B,0BAA0B,MAAM,IAAI,MAAM,MAAM;AAAA;AAAA;AAAA,MAGhD,GAAI,eAAe,MAAM,WAAW,eAAe,MAAM,WAAW,eAChE,CAAC,0BAA0B,MAAM,IAAI,WAAW,CAAC,IACjD,CAAC;AAAA,IACP,CAAC;AAAA,EACH;AACF;AAWA,eAAe,oBACb,YACA,cAC+B;AAC/B,MAAI;AACF,UAAM,SAAS,MAAM,yBAAyB,UAAU;AACxD,WAAO,QAAQ,UAAU;AAAA,EAC3B,SAAS,OAAO;AACd,QAAI,EAAE,iBAAiB,iBAAkB,OAAM;AAC/C,iBAAa,gBAAgB,KAAK,CAAC;AACnC,WAAO;AAAA,EACT;AACF;AAQA,eAAe,sBACb,YACA,oBAC0B;AAC1B,QAAM,aAAa,qBAAqB,UAAU;AAClD,QAAM,EAAE,WAAW,UAAU,IAAI,oBAAoB,UAAU;AAC/D,QAAM,YAAY,KAAK,KAAK,YAAY,UAAU;AAClD,QAAM,eAAe,KAAK,KAAK,YAAY,cAAc;AAEzD,QAAM,sBAAsB,KAAK,KAAK,cAAc,eAAe,SAAS;AAC5E,QAAM,2BAA2B,KAAK,KAAK,cAAc,eAAe,eAAe;AAEvF,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,MAAM,QAAQ,IAAI;AAAA,IACpB,gBAAgB,SAAS;AAAA,IACzB,gBAAgB,SAAS;AAAA,IACzB,gBAAgB,SAAS;AAAA,IACzB,WAAW,mBAAmB;AAAA,IAC9B,WAAW,wBAAwB;AAAA,IACnC,oBAAoB,YAAY,kBAAkB;AAAA,EACpD,CAAC;AAED,MAAI,cAAwB,CAAC;AAC7B,MAAI;AACF,kBAAc,MAAM,gBAAgB,UAAU;AAAA,EAChD,QAAQ;AAAA,EAER;AAEA,QAAM,eAAe,SACjB;AAAA,IACE,GAAG;AAAA,IACH,QAAQ,OAAO,QAAQ,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ;AAAA,IAChD,QAAQ,OAAO,QAAQ,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ;AAAA,EAClD,IACA;AACJ,QAAM,mBAAmB,wBAAwB,YAAY;AAC7D,QAAM,mBAAmB,0BAA0B,YAAY;AAC/D,QAAM,iBAAiB,YAAY,OAAO,CAAC,SAAS,iBAAiB,IAAI,IAAI,CAAC;AAE9E,SAAO;AAAA,IACL,YAAY,eAAe,SAAS;AAAA,IACpC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,YAAiD;AAC1E,SAAO,eAAe;AACxB;AAEA,eAAe,qBACb,QACA,WACA,WAC6B;AAC7B,MAAI,CAAC,OAAO,gBAAgB;AAC1B,WAAO;AAAA,MACL,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc,CAAC;AAAA,MACf,cAAc,CAAC;AAAA,MACf,YAAY;AAAA,IACd;AAAA,EACF;AAEA,QAAM,aAAa,MAAM,kBAAkB,OAAO,SAAS;AAC3D,QAAM,eAAe,MAAM;AAAA,IACzB,WAAW;AAAA,IACX,OAAO;AAAA,IACP;AAAA,EACF;AACA,aAAW,OAAO,QAAQ,CAAC,SAAS,YAAY,IAAI,CAAC;AACrD,QAAM,aAAa,MAAM,iBAAiB,OAAO,WAAW,WAAW,OAAO,WAAW,CAAC;AAE1F,SAAO;AAAA,IACL,cAAc,aAAa;AAAA,IAC3B,cAAc,WAAW,OAAO;AAAA,IAChC;AAAA,IACA,cAAc,WAAW;AAAA,IACzB;AAAA,EACF;AACF;AAEA,eAAe,kBACb,WACmD;AACnD,QAAM,WAAW,MAAM,gBAAgB,SAAS;AAChD,QAAM,UAAU,MAAM,QAAQ;AAAA,IAC5B,SAAS,IAAI,OAAO,UAAU;AAAA,MAC5B;AAAA,MACA,YAAY,MAAM,uBAAuB,KAAK,KAAK,WAAW,IAAI,CAAC;AAAA,IACrE,EAAE;AAAA,EACJ;AACA,QAAM,CAAC,WAAW,SAAS,IAAI,UAAU,SAAS,CAAC,UAAU,kBAAkB,MAAM,UAAU,CAAC;AAChG,SAAO,EAAE,UAAU,UAAU,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,QAAQ,UAAU,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE;AACxF;AAEA,eAAe,uBACb,OACA,WACA,WACmB;AACnB,aAAW,QAAQ,OAAO;AACxB,UAAM,OAAO,KAAK,KAAK,WAAW,IAAI,CAAC;AACvC,gBAAY,IAAI;AAAA,EAClB;AACA,SAAO;AACT;AAEA,eAAe,iBAAiB,KAAa,YAAuC;AAClF,MAAI,CAAC,WAAY,QAAO;AACxB,SAAO,iBAAiB,GAAG;AAC7B;AAGA,eAAe,iBAAiB,KAA+B;AAC7D,MAAI,CAAE,MAAM,gBAAgB,GAAG,EAAI,QAAO;AAC1C,MAAI,CAAE,MAAM,iBAAiB,GAAG,EAAI,QAAO;AAC3C,QAAM,OAAO,GAAG;AAChB,SAAO;AACT;AAWA,eAAe,qBACb,QACA,WAC6B;AAC7B,MAAI,CAAC,OAAO,gBAAgB;AAC1B,WAAO,EAAE,cAAc,GAAG,cAAc,CAAC,GAAG,YAAY,MAAM;AAAA,EAChE;AAEA,MAAI,OAAO,iBAAiB,WAAW,GAAG;AACxC,WAAO,EAAE,cAAc,GAAG,cAAc,CAAC,GAAG,YAAY,MAAM;AAAA,EAChE;AAEA,QAAM,aAAa,MAAM,eAAe,OAAO,SAAS;AACxD,QAAM,eAAe,WAClB,IAAI,CAAC,cAAc,UAAU,QAAQ,SAAS,EAAE,CAAC,EAIjD,OAAO,CAAC,cAAe,OAAO,iBAAuC,SAAS,SAAS,CAAC;AAE3F,aAAW,aAAa,cAAc;AACpC,UAAM,OAAO,KAAK,KAAK,OAAO,WAAW,GAAG,SAAS,KAAK,CAAC;AAC3D,gBAAY,SAAS;AAAA,EACvB;AAEA,QAAM,aAAa,MAAM,iBAAiB,OAAO,SAAS;AAE1D,SAAO;AAAA,IACL,cAAc,aAAa;AAAA,IAC3B;AAAA,IACA;AAAA,EACF;AACF;AAWA,eAAsB,iBACpB,QACA,YACA,eACiC;AACjC,MAAI,CAAC,OAAO,YAAY;AACtB,WAAO,EAAE,kBAAkB,CAAC,GAAG,kBAAkB,EAAE;AAAA,EACrD;AAEA,QAAM,eAAe,MAAM,qBAAqB;AAEhD,aAAW,cAAc,OAAO,gBAAgB;AAC9C,QAAI,cAAc;AAIhB,YAAM,UAAU,0BAA0B,UAAU;AACpD,YAAM,cAAc,OAAO,QAAQ,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO;AACvE,YAAM,eAAe,oBAAoB,aAAa,KAAK;AAC3D,YAAM,gCAAgC,YAAY,cAAc,UAAU;AAAA,IAC5E;AAEA,UAAM,aAAa,KAAK,KAAK,OAAO,YAAY,UAAU;AAC1D,UAAM,OAAO,UAAU;AACvB,oBAAgB,UAAU;AAAA,EAC5B;AAIA,SAAO;AAAA,IACL,kBAAkB,OAAO;AAAA,IACzB,kBAAkB,OAAO,eAAe;AAAA,EAC1C;AACF;AAOA,eAAe,qBACb,QAC4D;AAC5D,MAAI,kBAAkB;AAEtB,MAAI,OAAO,oBAAoB;AAC7B,UAAM,OAAO,KAAK,KAAK,OAAO,cAAc,eAAe,SAAS,CAAC;AACrE,sBAAkB;AAAA,EACpB;AACA,MAAI,OAAO,yBAAyB;AAClC,UAAM,OAAO,KAAK,KAAK,OAAO,cAAc,eAAe,eAAe,CAAC;AAC3E,sBAAkB;AAAA,EACpB;AAEA,QAAM,aAAa,mBAAoB,MAAM,iBAAiB,OAAO,YAAY;AACjF,SAAO,EAAE,iBAAiB,WAAW;AACvC;AASA,eAAe,iBACb,QAIwB;AACxB,QAAM,WAAW,MAAM,qBAAqB,MAAM;AAElD,QAAM,mBAAmB,OAAO,gBAAiB,MAAM,iBAAiB,OAAO,SAAS;AAExF,QAAM,gBACJ,CAAC,oBAAoB,OAAO,gBAAiB,MAAM,gBAAgB,OAAO,SAAS;AAErF,SAAO;AAAA,IACL;AAAA,IACA,0BAA0B,SAAS;AAAA,IACnC,qBAAqB,SAAS;AAAA,IAC9B;AAAA,EACF;AACF;AAEA,eAAe,iBAAiB,SAAmC;AACjE,MAAI;AACF,UAAM,aAAa,MAAM,QAAQ,OAAO;AACxC,WAAO,WAAW,WAAW;AAAA,EAC/B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,eAAe,WAAsC;AAClE,MAAI;AACF,WAAO,MAAM,iBAAiB,SAAS;AAAA,EACzC,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;","names":[]}
|