agents-inc 0.150.0 → 0.152.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 +21 -0
- package/dist/{chunk-FWT3CBLL.js → chunk-5GUOIJSG.js} +3 -7
- package/dist/{chunk-FWT3CBLL.js.map → chunk-5GUOIJSG.js.map} +1 -1
- package/dist/{chunk-MC5DUZ3V.js → chunk-5UWKOOIS.js} +6 -26
- package/dist/chunk-5UWKOOIS.js.map +1 -0
- package/dist/{chunk-O5ASLZ2K.js → chunk-76ADG7LQ.js} +1 -5
- package/dist/{chunk-O5ASLZ2K.js.map → chunk-76ADG7LQ.js.map} +1 -1
- package/dist/{chunk-7URSGJLE.js → chunk-BNSRA6HL.js} +13 -18
- package/dist/{chunk-7URSGJLE.js.map → chunk-BNSRA6HL.js.map} +1 -1
- package/dist/{chunk-FYPUUYSG.js → chunk-DTSG5XZB.js} +3 -7
- package/dist/{chunk-FYPUUYSG.js.map → chunk-DTSG5XZB.js.map} +1 -1
- package/dist/{chunk-YKKIJHZB.js → chunk-E5X6RJ4E.js} +5 -15
- package/dist/chunk-E5X6RJ4E.js.map +1 -0
- package/dist/{chunk-KH7MOIM5.js → chunk-EEPELKOM.js} +3665 -3737
- package/dist/chunk-EEPELKOM.js.map +1 -0
- package/dist/{chunk-NIKUMXE7.js → chunk-F7T5AFFN.js} +1 -5
- package/dist/{chunk-NIKUMXE7.js.map → chunk-F7T5AFFN.js.map} +1 -1
- package/dist/{chunk-4GL2F5AB.js → chunk-FVDKAVOL.js} +57 -48
- package/dist/chunk-FVDKAVOL.js.map +1 -0
- package/dist/{chunk-UZRISDBZ.js → chunk-GRVKW3CC.js} +2 -6
- package/dist/{chunk-UZRISDBZ.js.map → chunk-GRVKW3CC.js.map} +1 -1
- package/dist/{chunk-CDMHSHBN.js → chunk-IHUY4M22.js} +4 -8
- package/dist/{chunk-CDMHSHBN.js.map → chunk-IHUY4M22.js.map} +1 -1
- package/dist/{chunk-OZZGXBCN.js → chunk-IUQBOCSU.js} +1 -5
- package/dist/{chunk-OZZGXBCN.js.map → chunk-IUQBOCSU.js.map} +1 -1
- package/dist/{chunk-LYYXX2W5.js → chunk-J27W6TXS.js} +4 -6
- package/dist/{chunk-LYYXX2W5.js.map → chunk-J27W6TXS.js.map} +1 -1
- package/dist/chunk-JFLVEFFP.js +16 -0
- package/dist/chunk-JFLVEFFP.js.map +1 -0
- package/dist/{chunk-4LPJZNT7.js → chunk-KFB5CRXZ.js} +7 -12
- package/dist/{chunk-4LPJZNT7.js.map → chunk-KFB5CRXZ.js.map} +1 -1
- package/dist/{chunk-SYUOXSPU.js → chunk-KR65TPKC.js} +168 -14
- package/dist/chunk-KR65TPKC.js.map +1 -0
- package/dist/{chunk-KOPEM3Q7.js → chunk-KXYVJGJP.js} +2 -6
- package/dist/{chunk-KOPEM3Q7.js.map → chunk-KXYVJGJP.js.map} +1 -1
- package/dist/{chunk-ZHTXPFDK.js → chunk-L7SZXUBJ.js} +9 -14
- package/dist/{chunk-ZHTXPFDK.js.map → chunk-L7SZXUBJ.js.map} +1 -1
- package/dist/{chunk-LRYNF3J7.js → chunk-LASI35KT.js} +4 -9
- package/dist/{chunk-LRYNF3J7.js.map → chunk-LASI35KT.js.map} +1 -1
- package/dist/{chunk-VG2TVBFN.js → chunk-LDP5ASDM.js} +2 -6
- package/dist/{chunk-VG2TVBFN.js.map → chunk-LDP5ASDM.js.map} +1 -1
- package/dist/{chunk-GRPSDKIS.js → chunk-LZ52XEPR.js} +4 -8
- package/dist/{chunk-GRPSDKIS.js.map → chunk-LZ52XEPR.js.map} +1 -1
- package/dist/{chunk-CFQT72MJ.js → chunk-M7HO7NBK.js} +4 -8
- package/dist/{chunk-CFQT72MJ.js.map → chunk-M7HO7NBK.js.map} +1 -1
- package/dist/{chunk-XA57SX4T.js → chunk-MJ2KHG24.js} +4 -8
- package/dist/{chunk-XA57SX4T.js.map → chunk-MJ2KHG24.js.map} +1 -1
- package/dist/{chunk-DAG2ULNF.js → chunk-MM7CTTAV.js} +2 -6
- package/dist/chunk-MM7CTTAV.js.map +1 -0
- package/dist/{chunk-F3756A5B.js → chunk-MQ7FLIYS.js} +2 -6
- package/dist/{chunk-F3756A5B.js.map → chunk-MQ7FLIYS.js.map} +1 -1
- package/dist/{chunk-NUIZ6ZUO.js → chunk-MVR3SYMN.js} +6 -8
- package/dist/chunk-MVR3SYMN.js.map +1 -0
- package/dist/{chunk-ZKJAJWK6.js → chunk-MWG4VU64.js} +12 -17
- package/dist/{chunk-ZKJAJWK6.js.map → chunk-MWG4VU64.js.map} +1 -1
- package/dist/{chunk-ES3NJZON.js → chunk-NR3OZGL4.js} +1 -5
- package/dist/{chunk-ES3NJZON.js.map → chunk-NR3OZGL4.js.map} +1 -1
- package/dist/{chunk-GYG5SE2D.js → chunk-ODNDXQH2.js} +2 -6
- package/dist/{chunk-GYG5SE2D.js.map → chunk-ODNDXQH2.js.map} +1 -1
- package/dist/{chunk-2RSNKBXC.js → chunk-P44SXVH3.js} +6 -10
- package/dist/{chunk-2RSNKBXC.js.map → chunk-P44SXVH3.js.map} +1 -1
- package/dist/{chunk-3LIU2ZEF.js → chunk-PMM2MYMA.js} +3 -16
- package/dist/{chunk-3LIU2ZEF.js.map → chunk-PMM2MYMA.js.map} +1 -1
- package/dist/{chunk-6I6RZHYP.js → chunk-PZIZNMHK.js} +24 -36
- package/dist/chunk-PZIZNMHK.js.map +1 -0
- package/dist/{chunk-C55DN7GE.js → chunk-Q2KG7UV3.js} +3 -5
- package/dist/chunk-Q2KG7UV3.js.map +1 -0
- package/dist/{chunk-QQLRX4KI.js → chunk-Q45ZU6HD.js} +2 -6
- package/dist/{chunk-QQLRX4KI.js.map → chunk-Q45ZU6HD.js.map} +1 -1
- package/dist/{chunk-HIPGKIT3.js → chunk-QRDTLVXG.js} +9 -14
- package/dist/{chunk-HIPGKIT3.js.map → chunk-QRDTLVXG.js.map} +1 -1
- package/dist/{chunk-VIFZ6NFH.js → chunk-QZZJFYUQ.js} +3 -7
- package/dist/{chunk-VIFZ6NFH.js.map → chunk-QZZJFYUQ.js.map} +1 -1
- package/dist/{chunk-E4FT2KFV.js → chunk-R5NOI2LP.js} +13 -17
- package/dist/{chunk-E4FT2KFV.js.map → chunk-R5NOI2LP.js.map} +1 -1
- package/dist/{chunk-DUVWGO6E.js → chunk-RNJWAKMO.js} +3 -7
- package/dist/{chunk-DUVWGO6E.js.map → chunk-RNJWAKMO.js.map} +1 -1
- package/dist/{chunk-N4IZ6GBO.js → chunk-SBHBBZKF.js} +7 -23
- package/dist/chunk-SBHBBZKF.js.map +1 -0
- package/dist/{chunk-EN2GCPW7.js → chunk-SKQWRUPX.js} +10 -14
- package/dist/{chunk-EN2GCPW7.js.map → chunk-SKQWRUPX.js.map} +1 -1
- package/dist/{chunk-DDG4F3FE.js → chunk-STMHDOZD.js} +4 -21
- package/dist/chunk-STMHDOZD.js.map +1 -0
- package/dist/{chunk-5K5RBRTD.js → chunk-SX5H6TSC.js} +7 -11
- package/dist/chunk-SX5H6TSC.js.map +1 -0
- package/dist/{chunk-RBHYLCUB.js → chunk-TJJPWUMA.js} +2 -6
- package/dist/{chunk-RBHYLCUB.js.map → chunk-TJJPWUMA.js.map} +1 -1
- package/dist/{chunk-IOJR5TOY.js → chunk-TSIU7DME.js} +1 -5
- package/dist/{chunk-IOJR5TOY.js.map → chunk-TSIU7DME.js.map} +1 -1
- package/dist/{chunk-RP7R73JO.js → chunk-TUPYW2IQ.js} +3 -7
- package/dist/{chunk-RP7R73JO.js.map → chunk-TUPYW2IQ.js.map} +1 -1
- package/dist/{chunk-YU2VGX5R.js → chunk-UBEDZ4FD.js} +1 -8
- package/dist/{chunk-YU2VGX5R.js.map → chunk-UBEDZ4FD.js.map} +1 -1
- package/dist/{chunk-VEP23B5W.js → chunk-VASLW636.js} +1 -5
- package/dist/{chunk-VEP23B5W.js.map → chunk-VASLW636.js.map} +1 -1
- package/dist/{chunk-PG4G4IIK.js → chunk-VY6MNOXL.js} +2 -6
- package/dist/{chunk-PG4G4IIK.js.map → chunk-VY6MNOXL.js.map} +1 -1
- package/dist/{chunk-IHO75PMZ.js → chunk-WBCPLH66.js} +15 -13
- package/dist/chunk-WBCPLH66.js.map +1 -0
- package/dist/{chunk-DJAZE4PD.js → chunk-WKTHWQKM.js} +297 -302
- package/dist/chunk-WKTHWQKM.js.map +1 -0
- package/dist/{chunk-RJN7W2C7.js → chunk-XHUODHZ4.js} +19 -25
- package/dist/{chunk-RJN7W2C7.js.map → chunk-XHUODHZ4.js.map} +1 -1
- package/dist/{chunk-KIR7VYQD.js → chunk-XVAQG2CV.js} +1 -5
- package/dist/{chunk-KIR7VYQD.js.map → chunk-XVAQG2CV.js.map} +1 -1
- package/dist/{chunk-P3PN5SVI.js → chunk-ZL7PFNHN.js} +2 -6
- package/dist/{chunk-P3PN5SVI.js.map → chunk-ZL7PFNHN.js.map} +1 -1
- package/dist/{chunk-ZDLTLNU2.js → chunk-ZPPHXXAP.js} +9 -15
- package/dist/{chunk-ZDLTLNU2.js.map → chunk-ZPPHXXAP.js.map} +1 -1
- package/dist/commands/build/marketplace.js +10 -15
- package/dist/commands/build/marketplace.js.map +1 -1
- package/dist/commands/build/plugins.js +9 -14
- package/dist/commands/build/plugins.js.map +1 -1
- package/dist/commands/compile.js +14 -19
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/doctor.js +13 -18
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/edit.js +51 -55
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/eject.js +13 -18
- package/dist/commands/eject.js.map +1 -1
- package/dist/commands/import/skill.js +9 -14
- package/dist/commands/import/skill.js.map +1 -1
- package/dist/commands/init.js +50 -51
- package/dist/commands/list.js +14 -16
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/new/agent.js +12 -16
- package/dist/commands/new/agent.js.map +1 -1
- package/dist/commands/new/marketplace.js +15 -20
- package/dist/commands/new/marketplace.js.map +1 -1
- package/dist/commands/new/skill.js +11 -13
- package/dist/commands/search.js +14 -19
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/uninstall.js +17 -21
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.js +17 -21
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/validate.js +10 -16
- package/dist/commands/validate.js.map +1 -1
- package/dist/components/common/confirm.js +1 -2
- package/dist/components/common/prompt-confirm.js +2 -2
- package/dist/components/common/select-list.js +3 -4
- package/dist/components/common/spinner.js +1 -2
- package/dist/components/wizard/category-grid.js +8 -9
- package/dist/components/wizard/checkbox-grid.js +6 -7
- package/dist/components/wizard/domain-selection.js +14 -15
- package/dist/components/wizard/run-wizard-session.js +40 -40
- package/dist/components/wizard/scroll-affordance.js +2 -3
- package/dist/components/wizard/search-modal.js +6 -7
- package/dist/components/wizard/selection-card.js +2 -3
- package/dist/components/wizard/skill-agent-summary.js +8 -9
- package/dist/components/wizard/source-grid.js +13 -14
- package/dist/components/wizard/stack-selection.js +12 -13
- package/dist/components/wizard/step-agents.js +14 -15
- package/dist/components/wizard/step-build.js +14 -15
- package/dist/components/wizard/step-confirm.js +13 -14
- package/dist/components/wizard/step-settings.js +11 -12
- package/dist/components/wizard/step-sources.js +20 -21
- package/dist/components/wizard/step-stack.js +13 -14
- package/dist/components/wizard/summary-panel.js +12 -13
- package/dist/components/wizard/toast.js +2 -3
- package/dist/components/wizard/wizard-layout.js +18 -19
- package/dist/components/wizard/wizard-tabs.js +8 -9
- package/dist/components/wizard/wizard.js +38 -39
- package/dist/config-exports.js +1 -7
- package/dist/config-exports.js.map +1 -1
- package/dist/copy-local-skills-6EMVN7RB.js +14 -0
- package/dist/hooks/init.js +50 -54
- package/dist/hooks/init.js.map +1 -1
- package/dist/index.js +0 -4
- package/dist/index.js.map +1 -1
- package/dist/load-agent-defs-BWOUVEAR.js +15 -0
- package/dist/{loader-E2ERJYVA.js → loader-5JP4S7CJ.js} +4 -5
- package/dist/recompile-project-agents-6DL45TDI.js +19 -0
- package/dist/{source-loader-VVHMQEX5.js → source-loader-MZYCPL2S.js} +7 -8
- package/dist/stores/wizard-store.js +7 -8
- package/package.json +22 -21
- package/dist/chunk-4GL2F5AB.js.map +0 -1
- package/dist/chunk-5K5RBRTD.js.map +0 -1
- package/dist/chunk-6I6RZHYP.js.map +0 -1
- package/dist/chunk-C55DN7GE.js.map +0 -1
- package/dist/chunk-DAG2ULNF.js.map +0 -1
- package/dist/chunk-DDG4F3FE.js.map +0 -1
- package/dist/chunk-DIBCRIMR.js +0 -36
- package/dist/chunk-DIBCRIMR.js.map +0 -1
- package/dist/chunk-DJAZE4PD.js.map +0 -1
- package/dist/chunk-EKWAUOQB.js +0 -96
- package/dist/chunk-EKWAUOQB.js.map +0 -1
- package/dist/chunk-I3XKEGHM.js +0 -16383
- package/dist/chunk-I3XKEGHM.js.map +0 -1
- package/dist/chunk-IHO75PMZ.js.map +0 -1
- package/dist/chunk-K3OU6TGX.js +0 -77
- package/dist/chunk-K3OU6TGX.js.map +0 -1
- package/dist/chunk-KH7MOIM5.js.map +0 -1
- package/dist/chunk-KSZ6PCY4.js +0 -43
- package/dist/chunk-KSZ6PCY4.js.map +0 -1
- package/dist/chunk-MC5DUZ3V.js.map +0 -1
- package/dist/chunk-N4IZ6GBO.js.map +0 -1
- package/dist/chunk-NUIZ6ZUO.js.map +0 -1
- package/dist/chunk-OA5SUEQD.js +0 -181
- package/dist/chunk-OA5SUEQD.js.map +0 -1
- package/dist/chunk-P56WJ5FA.js +0 -50
- package/dist/chunk-P56WJ5FA.js.map +0 -1
- package/dist/chunk-SYUOXSPU.js.map +0 -1
- package/dist/chunk-THKIOI32.js +0 -939
- package/dist/chunk-THKIOI32.js.map +0 -1
- package/dist/chunk-V7QOSGQA.js +0 -298
- package/dist/chunk-V7QOSGQA.js.map +0 -1
- package/dist/chunk-YKKIJHZB.js.map +0 -1
- package/dist/components/common/confirm.test.js +0 -203
- package/dist/components/common/confirm.test.js.map +0 -1
- package/dist/components/wizard/category-grid.test.js +0 -1253
- package/dist/components/wizard/category-grid.test.js.map +0 -1
- package/dist/components/wizard/checkbox-grid.test.js +0 -264
- package/dist/components/wizard/checkbox-grid.test.js.map +0 -1
- package/dist/components/wizard/search-modal.test.js +0 -212
- package/dist/components/wizard/search-modal.test.js.map +0 -1
- package/dist/components/wizard/source-grid.test.js +0 -1094
- package/dist/components/wizard/source-grid.test.js.map +0 -1
- package/dist/components/wizard/step-agents.test.js +0 -204
- package/dist/components/wizard/step-agents.test.js.map +0 -1
- package/dist/components/wizard/step-build.test.js +0 -552
- package/dist/components/wizard/step-build.test.js.map +0 -1
- package/dist/components/wizard/step-confirm.test.js +0 -744
- package/dist/components/wizard/step-confirm.test.js.map +0 -1
- package/dist/components/wizard/step-settings.test.js +0 -244
- package/dist/components/wizard/step-settings.test.js.map +0 -1
- package/dist/components/wizard/step-sources.test.js +0 -155
- package/dist/components/wizard/step-sources.test.js.map +0 -1
- package/dist/components/wizard/step-stack.test.js +0 -262
- package/dist/components/wizard/step-stack.test.js.map +0 -1
- package/dist/components/wizard/summary-panel.test.js +0 -317
- package/dist/components/wizard/summary-panel.test.js.map +0 -1
- package/dist/components/wizard/wizard-layout.test.js +0 -200
- package/dist/components/wizard/wizard-layout.test.js.map +0 -1
- package/dist/components/wizard/wizard-tabs.test.js +0 -290
- package/dist/components/wizard/wizard-tabs.test.js.map +0 -1
- package/dist/copy-local-skills-CA7P73RZ.js +0 -15
- package/dist/dist-VNJNNJK7.js +0 -550
- package/dist/dist-VNJNNJK7.js.map +0 -1
- package/dist/load-agent-defs-6MAY5ABI.js +0 -16
- package/dist/magic-string.es-5TV73NJD.js +0 -1316
- package/dist/magic-string.es-5TV73NJD.js.map +0 -1
- package/dist/recompile-project-agents-VYQJ6UZB.js +0 -20
- package/dist/source-manager-TPDXV5FO.js +0 -18
- package/dist/source-manager-TPDXV5FO.js.map +0 -1
- package/dist/stores/d227-same-scope-tombstone-duplicate.test.js +0 -118
- package/dist/stores/d227-same-scope-tombstone-duplicate.test.js.map +0 -1
- package/dist/stores/wizard-store.test.js +0 -3053
- package/dist/stores/wizard-store.test.js.map +0 -1
- /package/dist/{copy-local-skills-CA7P73RZ.js.map → copy-local-skills-6EMVN7RB.js.map} +0 -0
- /package/dist/{load-agent-defs-6MAY5ABI.js.map → load-agent-defs-BWOUVEAR.js.map} +0 -0
- /package/dist/{loader-E2ERJYVA.js.map → loader-5JP4S7CJ.js.map} +0 -0
- /package/dist/{recompile-project-agents-VYQJ6UZB.js.map → recompile-project-agents-6DL45TDI.js.map} +0 -0
- /package/dist/{source-loader-VVHMQEX5.js.map → source-loader-MZYCPL2S.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/cli/commands/build/plugins.ts"],"sourcesContent":["import { Flags } from \"@oclif/core\";\nimport path from \"path\";\n\nimport { BaseCommand } from \"../../base-command\";\nimport { setVerbose } from \"../../utils/logger\";\nimport { listDirectories, remove } from \"../../utils/fs\";\nimport { DIRS, PLUGINS_DIST_PATH } from \"../../consts\";\nimport {\n compileAllSkillPlugins,\n compileSkillPlugin,\n printCompilationSummary,\n} from \"../../lib/skills\";\nimport { compileAllAgentPlugins, printAgentCompilationSummary } from \"../../lib/agents\";\nimport { readPluginManifest } from \"../../lib/plugins\";\n\nexport default class BuildPlugins extends BaseCommand {\n static summary = \"Build skills and agents into standalone plugins\";\n\n static description =\n \"Build skills and agents into standalone plugins. By default, compiles all skills. Use --skill to compile a specific skill only. Use --agents-dir to also compile agents.\";\n\n static examples = [\n {\n description: \"Compile every skill into plugins\",\n command: \"<%= config.bin %> <%= command.id %>\",\n },\n {\n description: \"Compile a single skill by name\",\n command: \"<%= config.bin %> <%= command.id %> --skill cli-commander\",\n },\n {\n description: \"Write plugins to a custom output directory\",\n command: \"<%= config.bin %> <%= command.id %> --output-dir ./plugins\",\n },\n {\n description: \"Also compile agents from a directory\",\n command: \"<%= config.bin %> <%= command.id %> --agents-dir ./agents\",\n },\n {\n description: \"Compile with verbose logging\",\n command: \"<%= config.bin %> <%= command.id %> --verbose\",\n },\n ];\n\n // Override parent baseFlags to drop --source (build plugins reads from local DIRS.skills, not a remote source)\n static baseFlags = {} as (typeof BaseCommand)[\"baseFlags\"];\n\n static flags = {\n \"agents-dir\": Flags.string({\n char: \"a\",\n description: \"Agents source directory (builds one plugin per agent)\",\n }),\n \"output-dir\": Flags.string({\n char: \"o\",\n description: \"Output directory\",\n default: PLUGINS_DIST_PATH,\n }),\n skill: Flags.string({\n description: \"Compile only a specific skill (path to skill directory)\",\n }),\n verbose: Flags.boolean({\n char: \"v\",\n description: \"Enable verbose logging\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(BuildPlugins);\n setVerbose(flags.verbose);\n\n const projectRoot = process.cwd();\n const skillsDir = path.resolve(projectRoot, DIRS.skills);\n const outputDir = path.resolve(projectRoot, flags[\"output-dir\"]);\n\n this.printHeader(skillsDir, outputDir);\n\n try {\n const expectedSkillPlugins = await this.compileSkills(flags.skill, skillsDir, outputDir);\n\n if (flags[\"agents-dir\"]) {\n await this.compileAgents(projectRoot, flags[\"agents-dir\"], outputDir);\n }\n\n if (expectedSkillPlugins) {\n await this.pruneStaleSkillPlugins(outputDir, expectedSkillPlugins);\n }\n\n this.log(\"\");\n this.logSuccess(\"Plugin compilation complete!\");\n } catch (error) {\n this.log(\"Compilation failed\");\n this.handleError(error);\n }\n }\n\n private printHeader(skillsDir: string, outputDir: string): void {\n this.log(\"\");\n this.log(\"Compiling skill plugins\");\n this.log(` Skills directory: ${skillsDir}`);\n this.log(` Output directory: ${outputDir}`);\n this.log(\"\");\n }\n\n /**\n * Compiles skills and returns the set of plugin directory names that should\n * exist afterward — used to prune stale plugins. Returns `null` when pruning\n * must be skipped: single-skill mode (would wipe every other plugin) or a\n * partial compile failure (a failed skill is indistinguishable from a removed\n * one, so deleting it would be a worse bug than the stale entry).\n */\n private async compileSkills(\n skillFlag: string | undefined,\n skillsDir: string,\n outputDir: string,\n ): Promise<Set<string> | null> {\n if (skillFlag) {\n const skillPath = path.resolve(skillsDir, skillFlag);\n this.log(`Compiling skill at ${skillPath}...`);\n\n const result = await compileSkillPlugin({\n skillPath,\n outputDir,\n });\n\n this.log(`Compiled ${result.skillName}`);\n this.log(` Plugin path: ${result.pluginPath}`);\n return null;\n }\n\n this.log(\"Finding and compiling all skills...\");\n\n const { compiled, failed } = await compileAllSkillPlugins(skillsDir, outputDir);\n\n this.log(`Compiled ${compiled.length} skill plugins`);\n printCompilationSummary(compiled);\n\n if (failed.length > 0) {\n this.warn(\n `Skipping stale-plugin pruning: ${failed.length} skill(s) failed to compile ` +\n `(${failed.join(\", \")}). A failed skill is indistinguishable from a removed one.`,\n );\n return null;\n }\n\n return new Set(compiled.map((result) => result.skillName));\n }\n\n private async compileAgents(\n projectRoot: string,\n agentsDir: string,\n outputDir: string,\n ): Promise<void> {\n const resolvedAgentsDir = path.resolve(projectRoot, agentsDir);\n\n this.log(\"\");\n this.log(\"Compiling agent plugins\");\n this.log(` Agents directory: ${resolvedAgentsDir}`);\n this.log(\"\");\n\n this.log(\"Finding and compiling all agents...\");\n\n const agentResults = await compileAllAgentPlugins(resolvedAgentsDir, outputDir);\n\n this.log(`Compiled ${agentResults.length} agent plugins`);\n printAgentCompilationSummary(agentResults);\n }\n\n /**\n * Removes skill-plugin directories in `outputDir` that no longer correspond to\n * a compiled skill. Only skill plugins are pruned: agent plugins are preserved\n * (this run has no authority over them) and non-plugin directories are left\n * untouched. Callers must only invoke this after a clean full-scan compile.\n */\n private async pruneStaleSkillPlugins(\n outputDir: string,\n expectedSkillPlugins: ReadonlySet<string>,\n ): Promise<void> {\n const dirNames = await listDirectories(outputDir);\n\n for (const dirName of dirNames) {\n if (expectedSkillPlugins.has(dirName)) continue;\n\n const pluginDir = path.join(outputDir, dirName);\n const manifest = await readPluginManifest(pluginDir);\n if (!manifest) continue;\n if (manifest.agents !== undefined) continue;\n\n await remove(pluginDir);\n this.log(` Pruned stale plugin: ${dirName}`);\n }\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/commands/build/plugins.ts"],"sourcesContent":["import { Flags } from \"@oclif/core\";\nimport path from \"path\";\n\nimport { BaseCommand } from \"../../base-command\";\nimport { setVerbose } from \"../../utils/logger\";\nimport { listDirectories, remove } from \"../../utils/fs\";\nimport { DIRS, PLUGINS_DIST_PATH } from \"../../consts\";\nimport {\n compileAllSkillPlugins,\n compileSkillPlugin,\n printCompilationSummary,\n} from \"../../lib/skills\";\nimport { compileAllAgentPlugins, printAgentCompilationSummary } from \"../../lib/agents\";\nimport { readPluginManifest } from \"../../lib/plugins\";\n\nexport default class BuildPlugins extends BaseCommand {\n static summary = \"Build skills and agents into standalone plugins\";\n\n static description =\n \"Build skills and agents into standalone plugins. By default, compiles all skills. Use --skill to compile a specific skill only. Use --agents-dir to also compile agents.\";\n\n static examples = [\n {\n description: \"Compile every skill into plugins\",\n command: \"<%= config.bin %> <%= command.id %>\",\n },\n {\n description: \"Compile a single skill by name\",\n command: \"<%= config.bin %> <%= command.id %> --skill cli-commander\",\n },\n {\n description: \"Write plugins to a custom output directory\",\n command: \"<%= config.bin %> <%= command.id %> --output-dir ./plugins\",\n },\n {\n description: \"Also compile agents from a directory\",\n command: \"<%= config.bin %> <%= command.id %> --agents-dir ./agents\",\n },\n {\n description: \"Compile with verbose logging\",\n command: \"<%= config.bin %> <%= command.id %> --verbose\",\n },\n ];\n\n // Override parent baseFlags to drop --source (build plugins reads from local DIRS.skills, not a remote source)\n static baseFlags = {} as (typeof BaseCommand)[\"baseFlags\"];\n\n static flags = {\n \"agents-dir\": Flags.string({\n char: \"a\",\n description: \"Agents source directory (builds one plugin per agent)\",\n }),\n \"output-dir\": Flags.string({\n char: \"o\",\n description: \"Output directory\",\n default: PLUGINS_DIST_PATH,\n }),\n skill: Flags.string({\n description: \"Compile only a specific skill (path to skill directory)\",\n }),\n verbose: Flags.boolean({\n char: \"v\",\n description: \"Enable verbose logging\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(BuildPlugins);\n setVerbose(flags.verbose);\n\n const projectRoot = process.cwd();\n const skillsDir = path.resolve(projectRoot, DIRS.skills);\n const outputDir = path.resolve(projectRoot, flags[\"output-dir\"]);\n\n this.printHeader(skillsDir, outputDir);\n\n try {\n const expectedSkillPlugins = await this.compileSkills(flags.skill, skillsDir, outputDir);\n\n if (flags[\"agents-dir\"]) {\n await this.compileAgents(projectRoot, flags[\"agents-dir\"], outputDir);\n }\n\n if (expectedSkillPlugins) {\n await this.pruneStaleSkillPlugins(outputDir, expectedSkillPlugins);\n }\n\n this.log(\"\");\n this.logSuccess(\"Plugin compilation complete!\");\n } catch (error) {\n this.log(\"Compilation failed\");\n this.handleError(error);\n }\n }\n\n private printHeader(skillsDir: string, outputDir: string): void {\n this.log(\"\");\n this.log(\"Compiling skill plugins\");\n this.log(` Skills directory: ${skillsDir}`);\n this.log(` Output directory: ${outputDir}`);\n this.log(\"\");\n }\n\n /**\n * Compiles skills and returns the set of plugin directory names that should\n * exist afterward — used to prune stale plugins. Returns `null` when pruning\n * must be skipped: single-skill mode (would wipe every other plugin) or a\n * partial compile failure (a failed skill is indistinguishable from a removed\n * one, so deleting it would be a worse bug than the stale entry).\n */\n private async compileSkills(\n skillFlag: string | undefined,\n skillsDir: string,\n outputDir: string,\n ): Promise<Set<string> | null> {\n if (skillFlag) {\n const skillPath = path.resolve(skillsDir, skillFlag);\n this.log(`Compiling skill at ${skillPath}...`);\n\n const result = await compileSkillPlugin({\n skillPath,\n outputDir,\n });\n\n this.log(`Compiled ${result.skillName}`);\n this.log(` Plugin path: ${result.pluginPath}`);\n return null;\n }\n\n this.log(\"Finding and compiling all skills...\");\n\n const { compiled, failed } = await compileAllSkillPlugins(skillsDir, outputDir);\n\n this.log(`Compiled ${compiled.length} skill plugins`);\n printCompilationSummary(compiled);\n\n if (failed.length > 0) {\n this.warn(\n `Skipping stale-plugin pruning: ${failed.length} skill(s) failed to compile ` +\n `(${failed.join(\", \")}). A failed skill is indistinguishable from a removed one.`,\n );\n return null;\n }\n\n return new Set(compiled.map((result) => result.skillName));\n }\n\n private async compileAgents(\n projectRoot: string,\n agentsDir: string,\n outputDir: string,\n ): Promise<void> {\n const resolvedAgentsDir = path.resolve(projectRoot, agentsDir);\n\n this.log(\"\");\n this.log(\"Compiling agent plugins\");\n this.log(` Agents directory: ${resolvedAgentsDir}`);\n this.log(\"\");\n\n this.log(\"Finding and compiling all agents...\");\n\n const agentResults = await compileAllAgentPlugins(resolvedAgentsDir, outputDir);\n\n this.log(`Compiled ${agentResults.length} agent plugins`);\n printAgentCompilationSummary(agentResults);\n }\n\n /**\n * Removes skill-plugin directories in `outputDir` that no longer correspond to\n * a compiled skill. Only skill plugins are pruned: agent plugins are preserved\n * (this run has no authority over them) and non-plugin directories are left\n * untouched. Callers must only invoke this after a clean full-scan compile.\n */\n private async pruneStaleSkillPlugins(\n outputDir: string,\n expectedSkillPlugins: ReadonlySet<string>,\n ): Promise<void> {\n const dirNames = await listDirectories(outputDir);\n\n for (const dirName of dirNames) {\n if (expectedSkillPlugins.has(dirName)) continue;\n\n const pluginDir = path.join(outputDir, dirName);\n const manifest = await readPluginManifest(pluginDir);\n if (!manifest) continue;\n if (manifest.agents !== undefined) continue;\n\n await remove(pluginDir);\n this.log(` Pruned stale plugin: ${dirName}`);\n }\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/commands/compile.js
CHANGED
|
@@ -6,25 +6,24 @@ import {
|
|
|
6
6
|
configTypesRefreshFailed,
|
|
7
7
|
globalScopedAgentsHint,
|
|
8
8
|
registeredProjectUpdateSkipped
|
|
9
|
-
} from "../chunk-
|
|
9
|
+
} from "../chunk-ODNDXQH2.js";
|
|
10
10
|
import {
|
|
11
11
|
detectBothInstallations
|
|
12
|
-
} from "../chunk-
|
|
12
|
+
} from "../chunk-STMHDOZD.js";
|
|
13
13
|
import {
|
|
14
14
|
compileAgents,
|
|
15
15
|
discoverInstalledSkills
|
|
16
|
-
} from "../chunk-
|
|
17
|
-
import "../chunk-
|
|
16
|
+
} from "../chunk-SBHBBZKF.js";
|
|
17
|
+
import "../chunk-IHUY4M22.js";
|
|
18
18
|
import {
|
|
19
19
|
loadAgentDefs
|
|
20
|
-
} from "../chunk-
|
|
21
|
-
import "../chunk-
|
|
20
|
+
} from "../chunk-QZZJFYUQ.js";
|
|
21
|
+
import "../chunk-E5X6RJ4E.js";
|
|
22
22
|
import {
|
|
23
23
|
BaseCommand,
|
|
24
24
|
EXIT_CODES
|
|
25
|
-
} from "../chunk-
|
|
26
|
-
import "../chunk-
|
|
27
|
-
import "../chunk-P3PN5SVI.js";
|
|
25
|
+
} from "../chunk-KR65TPKC.js";
|
|
26
|
+
import "../chunk-ZL7PFNHN.js";
|
|
28
27
|
import {
|
|
29
28
|
ConfigLoadError,
|
|
30
29
|
effectivelyExcludedSkillIds,
|
|
@@ -34,25 +33,21 @@ import {
|
|
|
34
33
|
loadSkillsMatrixFromSource,
|
|
35
34
|
reconcileTypesFromDisk,
|
|
36
35
|
resolveSource
|
|
37
|
-
} from "../chunk-
|
|
36
|
+
} from "../chunk-EEPELKOM.js";
|
|
38
37
|
import {
|
|
39
38
|
getErrorMessage,
|
|
40
39
|
setVerbose,
|
|
41
40
|
verbose
|
|
42
|
-
} from "../chunk-
|
|
43
|
-
import "../chunk-
|
|
44
|
-
import "../chunk-
|
|
41
|
+
} from "../chunk-PMM2MYMA.js";
|
|
42
|
+
import "../chunk-WKTHWQKM.js";
|
|
43
|
+
import "../chunk-VASLW636.js";
|
|
45
44
|
import {
|
|
46
45
|
CLI_INVOKE_COMMAND,
|
|
47
46
|
STANDARD_FILES
|
|
48
|
-
} from "../chunk-
|
|
49
|
-
import "../chunk-
|
|
50
|
-
import {
|
|
51
|
-
init_esm_shims
|
|
52
|
-
} from "../chunk-P56WJ5FA.js";
|
|
47
|
+
} from "../chunk-76ADG7LQ.js";
|
|
48
|
+
import "../chunk-UBEDZ4FD.js";
|
|
53
49
|
|
|
54
50
|
// src/cli/commands/compile.ts
|
|
55
|
-
init_esm_shims();
|
|
56
51
|
import { Flags } from "@oclif/core";
|
|
57
52
|
import os from "os";
|
|
58
53
|
var Compile = class _Compile extends BaseCommand {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/commands/compile.ts"],"sourcesContent":["import { Flags } from \"@oclif/core\";\nimport os from \"os\";\nimport { BaseCommand } from \"../base-command\";\nimport { setVerbose, verbose } from \"../utils/logger\";\nimport {\n detectBothInstallations,\n type BothInstallations,\n loadAgentDefs,\n type AgentDefs,\n compileAgents,\n discoverInstalledSkills,\n type DiscoveredSkills,\n} from \"../lib/operations\";\nimport {\n ConfigLoadError,\n effectivelyExcludedSkillIds,\n loadProjectConfig,\n loadProjectConfigFromDir,\n resolveSource,\n} from \"../lib/configuration\";\nimport { getStackSkillIds } from \"../lib/stacks\";\nimport { loadSkillsMatrixFromSource } from \"../lib/loading\";\nimport { CLI_INVOKE_COMMAND, STANDARD_FILES } from \"../consts\";\nimport { EXIT_CODES } from \"../lib/exit-codes\";\nimport { getErrorMessage } from \"../utils/errors\";\nimport {\n ERROR_MESSAGES,\n STATUS_MESSAGES,\n INFO_MESSAGES,\n configTypesRefreshFailed,\n globalScopedAgentsHint,\n registeredProjectUpdateSkipped,\n} from \"../utils/messages\";\nimport { reconcileTypesFromDisk, type GateReport } from \"../lib/config-gate/index.js\";\nimport type { Installation } from \"../lib/installation\";\nimport type { SkillScope } from \"../types/config\";\nimport type { AgentDefinition, AgentName, SkillDefinitionMap } from \"../types\";\n\nexport default class Compile extends BaseCommand {\n static summary = \"Compile agents using local skills and agent definitions\";\n\n static description =\n \"Compile agents with resolved skill references. Compiles to the Claude plugin directory.\";\n\n static examples = [\n \"<%= config.bin %> <%= command.id %>\",\n \"<%= config.bin %> <%= command.id %> --verbose\",\n ];\n\n static flags = {\n ...BaseCommand.baseFlags,\n verbose: Flags.boolean({\n char: \"v\",\n description: \"Enable verbose logging\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Compile);\n setVerbose(flags.verbose);\n const cwd = process.cwd();\n\n const installations = await this.detectInstallations(cwd);\n await this.resolveAndLogSource(flags.source);\n const agentDefs = await this.loadAgentDefsOrFail(cwd);\n await this.compileAllScopes(installations, agentDefs, cwd, flags.source);\n }\n\n private async detectInstallations(cwd: string): Promise<BothInstallations> {\n let installations: BothInstallations;\n try {\n installations = await detectBothInstallations(cwd);\n } catch (error) {\n // A corrupt config (file present but unparseable) must not let compile run\n // config-less — that resurrects every deselected agent. Hard-error naming\n // the offending file before any compilation happens.\n if (error instanceof ConfigLoadError) {\n this.error(error.message, { exit: EXIT_CODES.ERROR });\n }\n throw error;\n }\n\n if (!installations.global && !installations.project) {\n this.error(ERROR_MESSAGES.NO_INSTALLATION, {\n exit: EXIT_CODES.ERROR,\n });\n }\n\n return installations;\n }\n\n private async resolveAndLogSource(sourceFlag?: string): Promise<void> {\n this.log(STATUS_MESSAGES.RESOLVING_SOURCE);\n try {\n const sourceConfig = await resolveSource(sourceFlag);\n this.log(`Source: ${sourceConfig.sourceOrigin}`);\n } catch (error) {\n this.log(ERROR_MESSAGES.FAILED_RESOLVE_SOURCE);\n this.handleError(error);\n }\n }\n\n private async loadAgentDefsOrFail(cwd: string): Promise<AgentDefs> {\n this.log(STATUS_MESSAGES.LOADING_AGENT_PARTIALS);\n try {\n const defs = await loadAgentDefs({ projectDir: cwd });\n this.log(\"Agent partials loaded\");\n verbose(` Agents: ${defs.agentSourcePaths.agentsDir}`);\n verbose(` Templates: ${defs.agentSourcePaths.templatesDir}`);\n return defs;\n } catch (error) {\n this.log(ERROR_MESSAGES.FAILED_LOAD_AGENT_PARTIALS);\n this.handleError(error);\n }\n }\n\n private async compileAllScopes(\n installations: BothInstallations,\n agentDefs: AgentDefs,\n cwd: string,\n sourceFlag?: string,\n ): Promise<void> {\n // When both installations exist, filter each pass to its own scope to prevent\n // the project pass from overwriting global agents with zero-skill versions\n // (the project config's stack only has project agent entries).\n const passes = buildCompilePasses(installations, cwd, agentDefs);\n\n let totalPassesWithSkills = 0;\n for (const pass of passes) {\n const hadSkills = await this.runCompilePass(pass, cwd, sourceFlag);\n if (hadSkills) totalPassesWithSkills++;\n }\n\n if (totalPassesWithSkills === 0) {\n this.error(\n `No skills found. Add skills with '${CLI_INVOKE_COMMAND} add <skill>' or create in .claude/skills/.`,\n { exit: EXIT_CODES.ERROR },\n );\n }\n }\n\n private async discoverAllSkills(projectDir: string): Promise<DiscoveredSkills> {\n this.log(STATUS_MESSAGES.DISCOVERING_SKILLS);\n const result = await discoverInstalledSkills(projectDir);\n if (result.totalSkillCount === 0) return result;\n this.log(formatDiscoveryMessage(result));\n return result;\n }\n\n /**\n * A stack skill that is not among the discovered skills is dropped from every\n * agent that references it. The resolver only records that at verbose level, so\n * the default output would claim a successful recompile of an agent that no\n * longer matches config.ts. Name each dropped skill instead.\n */\n private async warnUnresolvedStackSkills(\n projectDir: string,\n allSkills: SkillDefinitionMap,\n ): Promise<void> {\n const loaded = await loadProjectConfig(projectDir);\n if (!loaded?.config.stack) return;\n\n const excludedIds = effectivelyExcludedSkillIds(loaded.config.skills);\n const unresolved = getStackSkillIds(loaded.config.stack).filter(\n (id) => !excludedIds.has(id) && !(id in allSkills),\n );\n\n for (const id of unresolved) {\n this.warn(\n `Skill '${id}' is configured but was not found — agents will be compiled without it.`,\n );\n }\n }\n\n /**\n * The project pass compiled no agents, but the project config may still declare\n * global-scope agents whose stack lives in the global config. Without a pointer\n * the \"No agents to recompile\" line reads as a silent no-op after a global stack\n * change, so name the global context and the count.\n */\n private async hintGlobalScopedAgents(projectDir: string): Promise<void> {\n const loaded = await loadProjectConfigFromDir(projectDir);\n if (!loaded) return;\n\n const globalAgentCount = loaded.config.agents.filter(\n (agent) => !agent.excluded && agent.scope === \"global\",\n ).length;\n if (globalAgentCount === 0) return;\n\n this.log(globalScopedAgentsHint(globalAgentCount));\n }\n\n /**\n * The documented hand-edit workflow is \"edit config.ts, then run compile\", and\n * the type unions in config-types.ts are derived from config.ts — so a compile\n * pass that leaves them untouched strands stale unions after a hand-edit.\n * Regenerates them from the scope's persisted config exactly as the wizard\n * write path would: standalone narrowed unions at global scope, import-and-\n * extend at project scope. `matrixOnly` keeps the default-source path offline.\n * A failed refresh downgrades to a warning — the compiled agents are already\n * written and remain valid; only the type unions may still be stale.\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 emitted types are byte-identical either way\n * (pinned by the skipExtraSources parity test in local-installer.test.ts).\n * Skipping avoids fetching every registered extra source (network on a cold\n * cache, plus unreachable-remote warnings) on this offline compile path.\n */\n private async refreshConfigTypes(\n pass: CompilePass,\n cwd: string,\n sourceFlag?: string,\n ): Promise<void> {\n let report: GateReport;\n try {\n const loaded = await loadProjectConfigFromDir(pass.projectDir);\n if (!loaded) {\n verbose(\n `No config found at ${pass.projectDir} — skipping ${STANDARD_FILES.CONFIG_TYPES_TS} refresh`,\n );\n return;\n }\n\n const { matrix } = await loadSkillsMatrixFromSource({\n sourceFlag,\n projectDir: pass.projectDir,\n skipExtraSources: true,\n matrixOnly: true,\n });\n // `cwd` is excluded from the fan-out: when compile runs inside a registered\n // project, the project pass compiles that project's agents itself, so\n // letting the home pass reach it would compile them twice.\n report = await reconcileTypesFromDisk(\n pass.projectDir,\n loaded.config,\n { matrix, agents: pass.agents },\n { currentProjectDir: cwd },\n );\n this.log(INFO_MESSAGES.CONFIG_TYPES_REFRESHED);\n } catch (error) {\n this.warn(configTypesRefreshFailed(getErrorMessage(error)));\n return;\n }\n\n this.reportPropagation(report);\n }\n\n /**\n * Renders the fan-out the refresh above performed. Kept out of the refresh's\n * catch on purpose: a project the fan-out could not reach is reported as that,\n * not as a failure to refresh the type unions — which did succeed.\n */\n private reportPropagation(report: GateReport): void {\n for (const skippedPath of report.propagated.skipped) {\n this.warn(registeredProjectUpdateSkipped(skippedPath));\n }\n for (const warning of report.recompile.warnings) {\n this.warn(warning);\n }\n if (report.propagated.updated.length === 0) return;\n\n const { recompiledCount, failedCount } = report.recompile;\n const failureSuffix = failedCount > 0 ? ` (${failedCount} failed)` : \"\";\n this.log(`Recompiled agents in ${recompiledCount} registered projects${failureSuffix}`);\n }\n\n private async runCompilePass(\n params: CompilePass,\n cwd: string,\n sourceFlag?: string,\n ): Promise<boolean> {\n const { label, projectDir, installation, sourcePath, scopeFilter } = params;\n\n this.log(\"\");\n this.log(`Compiling ${label.toLowerCase()} agents...`);\n this.log(\"\");\n\n verbose(` Project: ${projectDir}`);\n verbose(` Agents: ${installation.agentsDir}`);\n\n const { allSkills, totalSkillCount } = await this.discoverAllSkills(projectDir);\n\n if (totalSkillCount === 0) {\n this.log(`No skills found for ${label.toLowerCase()} pass, skipping`);\n // The config loads independently of discovered skills: a hand-edited\n // config.ts can list skills while nothing is installed for this scope,\n // and its type unions must follow the config rather than stay stale.\n await this.refreshConfigTypes(params, cwd, sourceFlag);\n return false;\n }\n\n await this.warnUnresolvedStackSkills(projectDir, allSkills);\n\n this.log(STATUS_MESSAGES.RECOMPILING_AGENTS);\n try {\n const recompileResult = await compileAgents({\n projectDir,\n sourcePath,\n skills: allSkills,\n pluginDir: projectDir,\n outputDir: installation.agentsDir,\n scopeFilter,\n });\n\n if (recompileResult.failed.length > 0) {\n this.log(\n `Recompiled ${recompileResult.compiled.length} ${label.toLowerCase()} agents (${recompileResult.failed.length} failed)`,\n );\n for (const warning of recompileResult.warnings) {\n this.warn(warning);\n }\n } else if (recompileResult.compiled.length > 0) {\n this.log(`Recompiled ${recompileResult.compiled.length} ${label.toLowerCase()} agents`);\n } else {\n this.log(INFO_MESSAGES.NO_AGENTS_TO_RECOMPILE);\n if (label === \"Project\") {\n await this.hintGlobalScopedAgents(projectDir);\n }\n }\n\n if (recompileResult.compiled.length > 0) {\n verbose(` Compiled: ${recompileResult.compiled.join(\", \")}`);\n }\n } catch (error) {\n this.log(ERROR_MESSAGES.FAILED_COMPILE_AGENTS);\n this.handleError(error);\n }\n\n await this.refreshConfigTypes(params, cwd, sourceFlag);\n\n this.log(\"\");\n this.logSuccess(`${label} compile complete!`);\n this.log(\"\");\n\n return true;\n }\n}\n\ntype CompilePass = {\n label: \"Global\" | \"Project\";\n projectDir: string;\n installation: Installation;\n sourcePath: string;\n agents: Record<AgentName, AgentDefinition>;\n scopeFilter?: SkillScope;\n};\n\nfunction buildCompilePasses(\n installations: BothInstallations,\n cwd: string,\n agentDefs: AgentDefs,\n): CompilePass[] {\n const { sourcePath, agents } = agentDefs;\n const passes: CompilePass[] = [];\n\n if (installations.global) {\n passes.push({\n label: \"Global\",\n projectDir: os.homedir(),\n installation: installations.global,\n sourcePath,\n agents,\n scopeFilter: installations.hasBoth ? \"global\" : undefined,\n });\n }\n\n if (installations.project) {\n passes.push({\n label: \"Project\",\n projectDir: cwd,\n installation: installations.project,\n sourcePath,\n agents,\n scopeFilter: installations.hasBoth ? \"project\" : undefined,\n });\n }\n\n return passes;\n}\n\nfunction formatDiscoveryMessage(result: DiscoveredSkills): string {\n const { totalSkillCount, pluginSkillCount } = result;\n const localCount = totalSkillCount - pluginSkillCount;\n\n if (pluginSkillCount > 0 && localCount > 0) {\n return `Discovered ${totalSkillCount} skills (${pluginSkillCount} from plugins, ${localCount} local)`;\n }\n\n return pluginSkillCount > 0\n ? `Discovered ${pluginSkillCount} skills from plugins`\n : `Discovered ${totalSkillCount} local skills`;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/commands/compile.ts"],"sourcesContent":["import { Flags } from \"@oclif/core\";\nimport os from \"os\";\nimport { BaseCommand } from \"../base-command\";\nimport { setVerbose, verbose } from \"../utils/logger\";\nimport {\n detectBothInstallations,\n type BothInstallations,\n loadAgentDefs,\n type AgentDefs,\n compileAgents,\n discoverInstalledSkills,\n type DiscoveredSkills,\n} from \"../lib/operations\";\nimport {\n ConfigLoadError,\n effectivelyExcludedSkillIds,\n loadProjectConfig,\n loadProjectConfigFromDir,\n resolveSource,\n} from \"../lib/configuration\";\nimport { getStackSkillIds } from \"../lib/stacks\";\nimport { loadSkillsMatrixFromSource } from \"../lib/loading\";\nimport { CLI_INVOKE_COMMAND, STANDARD_FILES } from \"../consts\";\nimport { EXIT_CODES } from \"../lib/exit-codes\";\nimport { getErrorMessage } from \"../utils/errors\";\nimport {\n ERROR_MESSAGES,\n STATUS_MESSAGES,\n INFO_MESSAGES,\n configTypesRefreshFailed,\n globalScopedAgentsHint,\n registeredProjectUpdateSkipped,\n} from \"../utils/messages\";\nimport { reconcileTypesFromDisk, type GateReport } from \"../lib/config-gate/index.js\";\nimport type { Installation } from \"../lib/installation\";\nimport type { SkillScope } from \"../types/config\";\nimport type { AgentDefinition, AgentName, SkillDefinitionMap } from \"../types\";\n\nexport default class Compile extends BaseCommand {\n static summary = \"Compile agents using local skills and agent definitions\";\n\n static description =\n \"Compile agents with resolved skill references. Compiles to the Claude plugin directory.\";\n\n static examples = [\n \"<%= config.bin %> <%= command.id %>\",\n \"<%= config.bin %> <%= command.id %> --verbose\",\n ];\n\n static flags = {\n ...BaseCommand.baseFlags,\n verbose: Flags.boolean({\n char: \"v\",\n description: \"Enable verbose logging\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Compile);\n setVerbose(flags.verbose);\n const cwd = process.cwd();\n\n const installations = await this.detectInstallations(cwd);\n await this.resolveAndLogSource(flags.source);\n const agentDefs = await this.loadAgentDefsOrFail(cwd);\n await this.compileAllScopes(installations, agentDefs, cwd, flags.source);\n }\n\n private async detectInstallations(cwd: string): Promise<BothInstallations> {\n let installations: BothInstallations;\n try {\n installations = await detectBothInstallations(cwd);\n } catch (error) {\n // A corrupt config (file present but unparseable) must not let compile run\n // config-less — that resurrects every deselected agent. Hard-error naming\n // the offending file before any compilation happens.\n if (error instanceof ConfigLoadError) {\n this.error(error.message, { exit: EXIT_CODES.ERROR });\n }\n throw error;\n }\n\n if (!installations.global && !installations.project) {\n this.error(ERROR_MESSAGES.NO_INSTALLATION, {\n exit: EXIT_CODES.ERROR,\n });\n }\n\n return installations;\n }\n\n private async resolveAndLogSource(sourceFlag?: string): Promise<void> {\n this.log(STATUS_MESSAGES.RESOLVING_SOURCE);\n try {\n const sourceConfig = await resolveSource(sourceFlag);\n this.log(`Source: ${sourceConfig.sourceOrigin}`);\n } catch (error) {\n this.log(ERROR_MESSAGES.FAILED_RESOLVE_SOURCE);\n this.handleError(error);\n }\n }\n\n private async loadAgentDefsOrFail(cwd: string): Promise<AgentDefs> {\n this.log(STATUS_MESSAGES.LOADING_AGENT_PARTIALS);\n try {\n const defs = await loadAgentDefs({ projectDir: cwd });\n this.log(\"Agent partials loaded\");\n verbose(` Agents: ${defs.agentSourcePaths.agentsDir}`);\n verbose(` Templates: ${defs.agentSourcePaths.templatesDir}`);\n return defs;\n } catch (error) {\n this.log(ERROR_MESSAGES.FAILED_LOAD_AGENT_PARTIALS);\n this.handleError(error);\n }\n }\n\n private async compileAllScopes(\n installations: BothInstallations,\n agentDefs: AgentDefs,\n cwd: string,\n sourceFlag?: string,\n ): Promise<void> {\n // When both installations exist, filter each pass to its own scope to prevent\n // the project pass from overwriting global agents with zero-skill versions\n // (the project config's stack only has project agent entries).\n const passes = buildCompilePasses(installations, cwd, agentDefs);\n\n let totalPassesWithSkills = 0;\n for (const pass of passes) {\n const hadSkills = await this.runCompilePass(pass, cwd, sourceFlag);\n if (hadSkills) totalPassesWithSkills++;\n }\n\n if (totalPassesWithSkills === 0) {\n this.error(\n `No skills found. Add skills with '${CLI_INVOKE_COMMAND} add <skill>' or create in .claude/skills/.`,\n { exit: EXIT_CODES.ERROR },\n );\n }\n }\n\n private async discoverAllSkills(projectDir: string): Promise<DiscoveredSkills> {\n this.log(STATUS_MESSAGES.DISCOVERING_SKILLS);\n const result = await discoverInstalledSkills(projectDir);\n if (result.totalSkillCount === 0) return result;\n this.log(formatDiscoveryMessage(result));\n return result;\n }\n\n /**\n * A stack skill that is not among the discovered skills is dropped from every\n * agent that references it. The resolver only records that at verbose level, so\n * the default output would claim a successful recompile of an agent that no\n * longer matches config.ts. Name each dropped skill instead.\n */\n private async warnUnresolvedStackSkills(\n projectDir: string,\n allSkills: SkillDefinitionMap,\n ): Promise<void> {\n const loaded = await loadProjectConfig(projectDir);\n if (!loaded?.config.stack) return;\n\n const excludedIds = effectivelyExcludedSkillIds(loaded.config.skills);\n const unresolved = getStackSkillIds(loaded.config.stack).filter(\n (id) => !excludedIds.has(id) && !(id in allSkills),\n );\n\n for (const id of unresolved) {\n this.warn(\n `Skill '${id}' is configured but was not found — agents will be compiled without it.`,\n );\n }\n }\n\n /**\n * The project pass compiled no agents, but the project config may still declare\n * global-scope agents whose stack lives in the global config. Without a pointer\n * the \"No agents to recompile\" line reads as a silent no-op after a global stack\n * change, so name the global context and the count.\n */\n private async hintGlobalScopedAgents(projectDir: string): Promise<void> {\n const loaded = await loadProjectConfigFromDir(projectDir);\n if (!loaded) return;\n\n const globalAgentCount = loaded.config.agents.filter(\n (agent) => !agent.excluded && agent.scope === \"global\",\n ).length;\n if (globalAgentCount === 0) return;\n\n this.log(globalScopedAgentsHint(globalAgentCount));\n }\n\n /**\n * The documented hand-edit workflow is \"edit config.ts, then run compile\", and\n * the type unions in config-types.ts are derived from config.ts — so a compile\n * pass that leaves them untouched strands stale unions after a hand-edit.\n * Regenerates them from the scope's persisted config exactly as the wizard\n * write path would: standalone narrowed unions at global scope, import-and-\n * extend at project scope. `matrixOnly` keeps the default-source path offline.\n * A failed refresh downgrades to a warning — the compiled agents are already\n * written and remain valid; only the type unions may still be stale.\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 emitted types are byte-identical either way\n * (pinned by the skipExtraSources parity test in local-installer.test.ts).\n * Skipping avoids fetching every registered extra source (network on a cold\n * cache, plus unreachable-remote warnings) on this offline compile path.\n */\n private async refreshConfigTypes(\n pass: CompilePass,\n cwd: string,\n sourceFlag?: string,\n ): Promise<void> {\n let report: GateReport;\n try {\n const loaded = await loadProjectConfigFromDir(pass.projectDir);\n if (!loaded) {\n verbose(\n `No config found at ${pass.projectDir} — skipping ${STANDARD_FILES.CONFIG_TYPES_TS} refresh`,\n );\n return;\n }\n\n const { matrix } = await loadSkillsMatrixFromSource({\n sourceFlag,\n projectDir: pass.projectDir,\n skipExtraSources: true,\n matrixOnly: true,\n });\n // `cwd` is excluded from the fan-out: when compile runs inside a registered\n // project, the project pass compiles that project's agents itself, so\n // letting the home pass reach it would compile them twice.\n report = await reconcileTypesFromDisk(\n pass.projectDir,\n loaded.config,\n { matrix, agents: pass.agents },\n { currentProjectDir: cwd },\n );\n this.log(INFO_MESSAGES.CONFIG_TYPES_REFRESHED);\n } catch (error) {\n this.warn(configTypesRefreshFailed(getErrorMessage(error)));\n return;\n }\n\n this.reportPropagation(report);\n }\n\n /**\n * Renders the fan-out the refresh above performed. Kept out of the refresh's\n * catch on purpose: a project the fan-out could not reach is reported as that,\n * not as a failure to refresh the type unions — which did succeed.\n */\n private reportPropagation(report: GateReport): void {\n for (const skippedPath of report.propagated.skipped) {\n this.warn(registeredProjectUpdateSkipped(skippedPath));\n }\n for (const warning of report.recompile.warnings) {\n this.warn(warning);\n }\n if (report.propagated.updated.length === 0) return;\n\n const { recompiledCount, failedCount } = report.recompile;\n const failureSuffix = failedCount > 0 ? ` (${failedCount} failed)` : \"\";\n this.log(`Recompiled agents in ${recompiledCount} registered projects${failureSuffix}`);\n }\n\n private async runCompilePass(\n params: CompilePass,\n cwd: string,\n sourceFlag?: string,\n ): Promise<boolean> {\n const { label, projectDir, installation, sourcePath, scopeFilter } = params;\n\n this.log(\"\");\n this.log(`Compiling ${label.toLowerCase()} agents...`);\n this.log(\"\");\n\n verbose(` Project: ${projectDir}`);\n verbose(` Agents: ${installation.agentsDir}`);\n\n const { allSkills, totalSkillCount } = await this.discoverAllSkills(projectDir);\n\n if (totalSkillCount === 0) {\n this.log(`No skills found for ${label.toLowerCase()} pass, skipping`);\n // The config loads independently of discovered skills: a hand-edited\n // config.ts can list skills while nothing is installed for this scope,\n // and its type unions must follow the config rather than stay stale.\n await this.refreshConfigTypes(params, cwd, sourceFlag);\n return false;\n }\n\n await this.warnUnresolvedStackSkills(projectDir, allSkills);\n\n this.log(STATUS_MESSAGES.RECOMPILING_AGENTS);\n try {\n const recompileResult = await compileAgents({\n projectDir,\n sourcePath,\n skills: allSkills,\n pluginDir: projectDir,\n outputDir: installation.agentsDir,\n scopeFilter,\n });\n\n if (recompileResult.failed.length > 0) {\n this.log(\n `Recompiled ${recompileResult.compiled.length} ${label.toLowerCase()} agents (${recompileResult.failed.length} failed)`,\n );\n for (const warning of recompileResult.warnings) {\n this.warn(warning);\n }\n } else if (recompileResult.compiled.length > 0) {\n this.log(`Recompiled ${recompileResult.compiled.length} ${label.toLowerCase()} agents`);\n } else {\n this.log(INFO_MESSAGES.NO_AGENTS_TO_RECOMPILE);\n if (label === \"Project\") {\n await this.hintGlobalScopedAgents(projectDir);\n }\n }\n\n if (recompileResult.compiled.length > 0) {\n verbose(` Compiled: ${recompileResult.compiled.join(\", \")}`);\n }\n } catch (error) {\n this.log(ERROR_MESSAGES.FAILED_COMPILE_AGENTS);\n this.handleError(error);\n }\n\n await this.refreshConfigTypes(params, cwd, sourceFlag);\n\n this.log(\"\");\n this.logSuccess(`${label} compile complete!`);\n this.log(\"\");\n\n return true;\n }\n}\n\ntype CompilePass = {\n label: \"Global\" | \"Project\";\n projectDir: string;\n installation: Installation;\n sourcePath: string;\n agents: Record<AgentName, AgentDefinition>;\n scopeFilter?: SkillScope;\n};\n\nfunction buildCompilePasses(\n installations: BothInstallations,\n cwd: string,\n agentDefs: AgentDefs,\n): CompilePass[] {\n const { sourcePath, agents } = agentDefs;\n const passes: CompilePass[] = [];\n\n if (installations.global) {\n passes.push({\n label: \"Global\",\n projectDir: os.homedir(),\n installation: installations.global,\n sourcePath,\n agents,\n scopeFilter: installations.hasBoth ? \"global\" : undefined,\n });\n }\n\n if (installations.project) {\n passes.push({\n label: \"Project\",\n projectDir: cwd,\n installation: installations.project,\n sourcePath,\n agents,\n scopeFilter: installations.hasBoth ? \"project\" : undefined,\n });\n }\n\n return passes;\n}\n\nfunction formatDiscoveryMessage(result: DiscoveredSkills): string {\n const { totalSkillCount, pluginSkillCount } = result;\n const localCount = totalSkillCount - pluginSkillCount;\n\n if (pluginSkillCount > 0 && localCount > 0) {\n return `Discovered ${totalSkillCount} skills (${pluginSkillCount} from plugins, ${localCount} local)`;\n }\n\n return pluginSkillCount > 0\n ? `Discovered ${pluginSkillCount} skills from plugins`\n : `Discovered ${totalSkillCount} local skills`;\n}\n"],"mappings":"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","names":[]}
|
package/dist/commands/doctor.js
CHANGED
|
@@ -2,20 +2,19 @@
|
|
|
2
2
|
import {
|
|
3
3
|
detectProject,
|
|
4
4
|
loadSource
|
|
5
|
-
} from "../chunk-
|
|
6
|
-
import "../chunk-
|
|
7
|
-
import "../chunk-
|
|
8
|
-
import "../chunk-
|
|
5
|
+
} from "../chunk-STMHDOZD.js";
|
|
6
|
+
import "../chunk-SBHBBZKF.js";
|
|
7
|
+
import "../chunk-IHUY4M22.js";
|
|
8
|
+
import "../chunk-QZZJFYUQ.js";
|
|
9
9
|
import {
|
|
10
10
|
filterExcludedEntries,
|
|
11
11
|
listAgentMdFiles
|
|
12
|
-
} from "../chunk-
|
|
12
|
+
} from "../chunk-E5X6RJ4E.js";
|
|
13
13
|
import {
|
|
14
14
|
BaseCommand,
|
|
15
15
|
EXIT_CODES
|
|
16
|
-
} from "../chunk-
|
|
17
|
-
import "../chunk-
|
|
18
|
-
import "../chunk-P3PN5SVI.js";
|
|
16
|
+
} from "../chunk-KR65TPKC.js";
|
|
17
|
+
import "../chunk-ZL7PFNHN.js";
|
|
19
18
|
import {
|
|
20
19
|
discoverLocalSkills,
|
|
21
20
|
effectivelyExcludedSkillIds,
|
|
@@ -26,17 +25,17 @@ import {
|
|
|
26
25
|
parseMarketplacePluginRef,
|
|
27
26
|
resolveInstallPaths,
|
|
28
27
|
validateProjectConfig
|
|
29
|
-
} from "../chunk-
|
|
28
|
+
} from "../chunk-EEPELKOM.js";
|
|
30
29
|
import {
|
|
31
30
|
directoryExists,
|
|
32
31
|
fileExists,
|
|
33
32
|
getErrorMessage,
|
|
34
33
|
setVerbose
|
|
35
|
-
} from "../chunk-
|
|
34
|
+
} from "../chunk-PMM2MYMA.js";
|
|
36
35
|
import {
|
|
37
36
|
matrix
|
|
38
|
-
} from "../chunk-
|
|
39
|
-
import "../chunk-
|
|
37
|
+
} from "../chunk-WKTHWQKM.js";
|
|
38
|
+
import "../chunk-VASLW636.js";
|
|
40
39
|
import {
|
|
41
40
|
CLAUDE_SRC_DIR,
|
|
42
41
|
CLI_INVOKE_COMMAND,
|
|
@@ -45,14 +44,10 @@ import {
|
|
|
45
44
|
LOCAL_SKILLS_PATH,
|
|
46
45
|
STANDARD_FILES,
|
|
47
46
|
UI_SYMBOLS
|
|
48
|
-
} from "../chunk-
|
|
49
|
-
import "../chunk-
|
|
50
|
-
import {
|
|
51
|
-
init_esm_shims
|
|
52
|
-
} from "../chunk-P56WJ5FA.js";
|
|
47
|
+
} from "../chunk-76ADG7LQ.js";
|
|
48
|
+
import "../chunk-UBEDZ4FD.js";
|
|
53
49
|
|
|
54
50
|
// src/cli/commands/doctor.ts
|
|
55
|
-
init_esm_shims();
|
|
56
51
|
import os from "os";
|
|
57
52
|
import path from "path";
|
|
58
53
|
import { countBy, unique } from "remeda";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/commands/doctor.ts"],"sourcesContent":["import os from \"os\";\nimport path from \"path\";\nimport { BaseCommand } from \"../base-command\";\nimport { getErrorMessage } from \"../utils/errors\";\nimport { EXIT_CODES } from \"../lib/exit-codes\";\nimport { effectivelyExcludedSkillIds, validateProjectConfig } from \"../lib/configuration\";\nimport { loadSource, detectProject } from \"../lib/operations\";\nimport { matrix } from \"../lib/matrix/matrix-provider\";\nimport { discoverLocalSkills } from \"../lib/skills\";\nimport { getStackSkillIds } from \"../lib/stacks\";\nimport { filterExcludedEntries, listAgentMdFiles } from \"../lib/agents\";\nimport { getVerifiedPluginInstallPaths, parseMarketplacePluginRef } from \"../lib/plugins\";\nimport { isHomeDirectory, installBaseDir, resolveInstallPaths } from \"../lib/installation\";\nimport type { MergedSkillsMatrix, ProjectConfig, SkillConfig } from \"../types\";\nimport { fileExists, directoryExists } from \"../utils/fs\";\nimport {\n CLAUDE_SRC_DIR,\n CLI_INVOKE_COMMAND,\n DEFAULT_BRANDING,\n EJECT_SOURCE,\n LOCAL_SKILLS_PATH,\n STANDARD_FILES,\n UI_SYMBOLS,\n} from \"../consts\";\nimport { countBy, unique } from \"remeda\";\nimport { setVerbose } from \"../utils/logger\";\n\ntype CheckKind = \"config\" | \"skills\" | \"agents\" | \"orphans\" | \"installed\" | \"plugins\" | \"source\";\n\ntype CheckResult = {\n kind: CheckKind;\n status: \"pass\" | \"fail\" | \"warn\" | \"skip\";\n message: string;\n details?: string[];\n};\n\ntype ConfigCheckOutput = {\n result: CheckResult;\n config: ProjectConfig | null;\n};\n\n/** Project-relative path to the config file, shown in doctor messages. */\nconst CONFIG_TS_REL = `${CLAUDE_SRC_DIR}/${STANDARD_FILES.CONFIG_TS}`;\n\nfunction checkConfigValid(config: ProjectConfig | null): ConfigCheckOutput {\n if (!config) {\n return {\n result: {\n kind: \"config\",\n status: \"fail\",\n message: `${CONFIG_TS_REL} not found`,\n details: [`Run '${CLI_INVOKE_COMMAND} init' to create a configuration`],\n },\n config: null,\n };\n }\n\n const validation = validateProjectConfig(config);\n\n if (!validation.valid) {\n return {\n result: {\n kind: \"config\",\n status: \"fail\",\n message: `${CONFIG_TS_REL} has errors`,\n details: validation.errors,\n },\n config: null,\n };\n }\n\n if (validation.warnings.length > 0) {\n return {\n result: {\n kind: \"config\",\n status: \"warn\",\n message: `${CONFIG_TS_REL} has warnings`,\n details: validation.warnings,\n },\n config,\n };\n }\n\n return {\n result: {\n kind: \"config\",\n status: \"pass\",\n message: `${CONFIG_TS_REL} is valid`,\n },\n config,\n };\n}\n\nasync function checkSkillsResolved(\n config: ProjectConfig,\n matrix: MergedSkillsMatrix,\n projectDir: string,\n): Promise<CheckResult> {\n // config.ts declares skills both directly and through the stack. A global-only\n // install has a populated skills array and no stack at all, so keying this check\n // off the stack alone would report \"No skills configured\" for a real install.\n const excludedIds = effectivelyExcludedSkillIds(config.skills);\n const stackIds = config.stack ? getStackSkillIds(config.stack) : [];\n const uniqueSkills = unique([...stackIds, ...config.skills.map((s) => s.id)]).filter(\n (id) => !excludedIds.has(id),\n );\n\n if (uniqueSkills.length === 0) {\n return {\n kind: \"skills\",\n status: \"pass\",\n message: \"No skills configured\",\n };\n }\n\n const [localResult, globalResult] = await Promise.all([\n discoverLocalSkills(projectDir),\n !isHomeDirectory(projectDir) ? discoverLocalSkills(os.homedir()) : null,\n ]);\n const localSkillIds = new Set([\n ...(localResult?.skills.map((s) => s.id) ?? []),\n ...(globalResult?.skills.map((s) => s.id) ?? []),\n ]);\n\n const missingSkills: string[] = [];\n for (const skillId of uniqueSkills) {\n const inMatrix = skillId in matrix.skills;\n const inLocal = localSkillIds.has(skillId);\n if (!inMatrix && !inLocal) {\n missingSkills.push(skillId);\n }\n }\n\n if (missingSkills.length > 0) {\n return {\n kind: \"skills\",\n status: \"fail\",\n message: `${uniqueSkills.length - missingSkills.length}/${uniqueSkills.length} skills found`,\n details: missingSkills.map((s) => `- ${s} (not found)`),\n };\n }\n\n return {\n kind: \"skills\",\n status: \"pass\",\n message: `${uniqueSkills.length}/${uniqueSkills.length} skills found`,\n };\n}\n\nasync function checkAgentsCompiled(\n config: ProjectConfig,\n projectDir: string,\n): Promise<CheckResult> {\n const agents = config.agents ?? [];\n\n if (agents.length === 0) {\n return {\n kind: \"agents\",\n status: \"pass\",\n message: \"No agents configured\",\n };\n }\n\n const projectAgentsDir = resolveInstallPaths(projectDir, \"project\").agentsDir;\n const globalAgentsDir = resolveInstallPaths(projectDir, \"global\").agentsDir;\n const agentChecks = await Promise.all(\n agents.map(async (agent) => {\n // Check scope-appropriate directory for the agent\n const agentsDir = agent.scope === \"global\" ? globalAgentsDir : projectAgentsDir;\n const agentPath = path.join(agentsDir, `${agent.name}.md`);\n return { name: agent.name, compiled: await fileExists(agentPath) };\n }),\n );\n const missingAgents = agentChecks.filter((c) => !c.compiled).map((c) => c.name);\n\n if (missingAgents.length > 0) {\n return {\n kind: \"agents\",\n status: \"warn\",\n message: `${missingAgents.length} agent${missingAgents.length === 1 ? \"\" : \"s\"} need${missingAgents.length === 1 ? \"s\" : \"\"} recompilation`,\n details: missingAgents.map((a) => `- ${a} (missing)`),\n };\n }\n\n return {\n kind: \"agents\",\n status: \"pass\",\n message: `${agents.length}/${agents.length} agents compiled`,\n };\n}\n\nasync function checkNoOrphans(config: ProjectConfig, projectDir: string): Promise<CheckResult> {\n const projectAgentsDir = resolveInstallPaths(projectDir, \"project\").agentsDir;\n const globalAgentsDir = resolveInstallPaths(projectDir, \"global\").agentsDir;\n\n // At home scope both scopes resolve to the same agents directory, so it is\n // listed once and its files are matched against both scopes' known names.\n const scopesShareAgentsDir = isHomeDirectory(projectDir);\n\n const [projectExists, globalExists] = await Promise.all([\n directoryExists(projectAgentsDir),\n !scopesShareAgentsDir ? directoryExists(globalAgentsDir) : false,\n ]);\n\n if (!projectExists && !globalExists) {\n return {\n kind: \"orphans\",\n status: \"pass\",\n message: \"No agents directory\",\n };\n }\n\n const projectMdFiles = projectExists ? await listAgentMdFiles(projectAgentsDir) : [];\n const globalMdFiles = globalExists ? await listAgentMdFiles(globalAgentsDir) : [];\n\n // Project files: only active project-scoped agents should have .md files here\n const activeProjectAgents: Set<string> = new Set(\n (config.agents ?? []).filter((a) => a.scope === \"project\" && !a.excluded).map((a) => a.name),\n );\n // Global files: all global-scoped agents (including excluded) still serve other projects\n const knownGlobalAgents: Set<string> = new Set(\n (config.agents ?? []).filter((a) => a.scope === \"global\").map((a) => a.name),\n );\n\n const knownProjectDirAgents = scopesShareAgentsDir\n ? new Set([...activeProjectAgents, ...knownGlobalAgents])\n : activeProjectAgents;\n\n const orphanedFiles: string[] = [];\n for (const file of projectMdFiles) {\n const agentName = file.replace(/\\.md$/, \"\");\n if (!knownProjectDirAgents.has(agentName)) {\n orphanedFiles.push(agentName);\n }\n }\n for (const file of globalMdFiles) {\n const agentName = file.replace(/\\.md$/, \"\");\n if (!knownGlobalAgents.has(agentName)) {\n orphanedFiles.push(agentName);\n }\n }\n\n if (orphanedFiles.length > 0) {\n return {\n kind: \"orphans\",\n status: \"warn\",\n message: `${orphanedFiles.length} orphaned agent file${orphanedFiles.length === 1 ? \"\" : \"s\"}`,\n details: orphanedFiles.map((f) => `- ${f}.md (not in config)`),\n };\n }\n\n return {\n kind: \"orphans\",\n status: \"pass\",\n message: \"No orphaned agent files\",\n };\n}\n\nasync function checkSkillsInstalled(\n config: ProjectConfig,\n projectDir: string,\n): Promise<CheckResult> {\n const skills: SkillConfig[] = config.skills ?? [];\n const ejectSkills = skills.filter((s) => s.source === EJECT_SOURCE);\n\n if (ejectSkills.length === 0) {\n return {\n kind: \"installed\",\n status: \"pass\",\n message: \"No eject-mode skills configured\",\n };\n }\n\n const skillChecks = await Promise.all(\n ejectSkills.map(async (skill) => {\n const baseDir = installBaseDir(projectDir, skill.scope);\n const skillMdPath = path.join(baseDir, LOCAL_SKILLS_PATH, skill.id, STANDARD_FILES.SKILL_MD);\n return { id: skill.id, installed: await fileExists(skillMdPath) };\n }),\n );\n const missingSkills = skillChecks.filter((c) => !c.installed).map((c) => c.id);\n\n if (missingSkills.length > 0) {\n return {\n kind: \"installed\",\n status: \"warn\",\n message: `${missingSkills.length} skill${missingSkills.length === 1 ? \"\" : \"s\"} missing from disk`,\n details: missingSkills.map((s) => `- ${s} (not found in ${LOCAL_SKILLS_PATH}/)`),\n };\n }\n\n return {\n kind: \"installed\",\n status: \"pass\",\n message: `${ejectSkills.length}/${ejectSkills.length} eject-mode skills installed`,\n };\n}\n\n/**\n * Plugin-mode skills have no files under `.claude/skills/` — they live in the\n * Claude plugin registry. Verifying them means asking the registry for the scope\n * each skill was installed at, not looking on disk.\n */\nasync function checkPluginSkillsInstalled(\n config: ProjectConfig,\n projectDir: string,\n): Promise<CheckResult> {\n const pluginSkills: SkillConfig[] = config.skills.filter((s) => s.source !== EJECT_SOURCE);\n\n if (pluginSkills.length === 0) {\n return {\n kind: \"plugins\",\n status: \"pass\",\n message: \"No plugin-mode skills configured\",\n };\n }\n\n const baseDirs = unique(pluginSkills.map((s) => installBaseDir(projectDir, s.scope)));\n const missingPerBaseDir = await Promise.all(\n baseDirs.map(async (baseDir) => {\n const installedIds = new Set(\n (await getVerifiedPluginInstallPaths(baseDir)).map((plugin) =>\n parseMarketplacePluginRef(plugin.pluginKey),\n ),\n );\n return pluginSkills\n .filter((skill) => installBaseDir(projectDir, skill.scope) === baseDir)\n .filter((skill) => !installedIds.has(skill.id))\n .map((skill) => skill.id);\n }),\n );\n const missingSkills = missingPerBaseDir.flat();\n\n if (missingSkills.length > 0) {\n return {\n kind: \"plugins\",\n status: \"warn\",\n message: `${missingSkills.length} skill${missingSkills.length === 1 ? \"\" : \"s\"} not installed as plugins`,\n details: missingSkills.map((s) => `- ${s} (no enabled plugin found)`),\n };\n }\n\n return {\n kind: \"plugins\",\n status: \"pass\",\n message: `${pluginSkills.length}/${pluginSkills.length} plugin-mode skills installed`,\n };\n}\n\nasync function checkSourceReachable(projectDir: string): Promise<CheckResult> {\n try {\n const { sourceResult: result } = await loadSource({\n projectDir,\n });\n\n const skillCount = Object.keys(matrix.skills).length;\n const sourceLabel = result.isLocal ? \"local\" : \"remote\";\n\n return {\n kind: \"source\",\n status: \"pass\",\n message: `Connected to ${sourceLabel}: ${result.sourcePath}`,\n details: [`${skillCount} skills available`],\n };\n } catch (error) {\n const message = getErrorMessage(error);\n return {\n kind: \"source\",\n status: \"fail\",\n message: \"Failed to load source\",\n details: [message],\n };\n }\n}\n\nconst CHECK_WIDTH = 20;\n\nfunction formatCheckName(name: string): string {\n return name.padEnd(CHECK_WIDTH);\n}\n\nfunction formatStatus(status: CheckResult[\"status\"]): string {\n switch (status) {\n case \"pass\":\n return UI_SYMBOLS.CHECK;\n case \"fail\":\n return UI_SYMBOLS.CROSS;\n case \"warn\":\n return \"!\";\n case \"skip\":\n return \"-\";\n default: {\n const _exhaustive: never = status;\n return _exhaustive;\n }\n }\n}\n\nfunction formatCheckLine(name: string, result: CheckResult): string[] {\n const headerLine = ` ${formatCheckName(name)}${formatStatus(result.status)} ${result.message}`;\n const detailLines = (result.details ?? []).map(\n (detail) => ` ${\" \".repeat(CHECK_WIDTH)} ${detail}`,\n );\n return [headerLine, ...detailLines];\n}\n\nfunction formatSummary(results: CheckResult[]): string {\n const counts = countBy(results, (r) => r.status);\n const plural = (n: number, word: string) => `${n} ${word}${n === 1 ? \"\" : \"s\"}`;\n\n const parts = [\n `${counts.pass ?? 0} passed`,\n plural(counts.warn ?? 0, \"warning\"),\n plural(counts.fail ?? 0, \"error\"),\n ];\n\n return ` Summary: ${parts.join(\", \")}`;\n}\n\nconst TIPS: Array<{ kind: CheckKind; status: CheckResult[\"status\"]; tip: string }> = [\n {\n kind: \"agents\",\n status: \"warn\",\n tip: ` Tip: Run '${CLI_INVOKE_COMMAND} compile' to generate missing agent files`,\n },\n {\n kind: \"config\",\n status: \"fail\",\n tip: ` Tip: Run '${CLI_INVOKE_COMMAND} init' to create or fix configuration`,\n },\n {\n kind: \"skills\",\n status: \"fail\",\n tip: \" Tip: Check skill IDs in config match available skills\",\n },\n {\n kind: \"installed\",\n status: \"warn\",\n // No command is named on purpose: 'eject skills --force' re-copies every skill in the\n // source and always targets project scope, so it cannot repair a global-scoped skill\n // and it litters a plugin-mode project with local skill directories.\n tip: \" Tip: Re-eject the missing skills from the source to restore their files\",\n },\n];\n\nfunction formatTips(results: CheckResult[]): string[] {\n return TIPS.filter((t) => results.some((r) => r.kind === t.kind && r.status === t.status)).map(\n (t) => t.tip,\n );\n}\n\nfunction skippedResult(kind: CheckKind): CheckResult {\n return { kind, status: \"skip\", message: \"Skipped (config invalid)\" };\n}\n\n/**\n * Wrap a check so a thrown exception becomes a `fail` result instead of crashing the\n * whole doctor run. Per-check isolation ensures one broken check does not mask others.\n */\nasync function safeCheck(kind: CheckKind, fn: () => Promise<CheckResult>): Promise<CheckResult> {\n try {\n return await fn();\n } catch (error) {\n return { kind, status: \"fail\", message: \"Check threw\", details: [getErrorMessage(error)] };\n }\n}\n\nexport default class Doctor extends BaseCommand {\n static summary = \"Diagnose common configuration issues\";\n\n static description = `Run diagnostic checks on your ${DEFAULT_BRANDING.NAME} configuration to identify issues with config validity, skill resolution, agent compilation, and source connectivity.`;\n\n static examples = [\"<%= config.bin %> <%= command.id %>\"];\n\n // Override parent baseFlags to drop --source (not relevant for diagnostics)\n static baseFlags = {} as (typeof BaseCommand)[\"baseFlags\"];\n\n static flags = {};\n\n async run(): Promise<void> {\n await this.parse(Doctor);\n setVerbose(true);\n const projectDir = process.cwd();\n\n this.printHeader();\n const results = await this.runAllChecks(projectDir);\n this.printResults(results);\n\n if (results.some((r) => r.status === \"fail\")) {\n this.exit(EXIT_CODES.ERROR);\n }\n }\n\n private printHeader(): void {\n this.log(\"\");\n this.log(`${DEFAULT_BRANDING.NAME} Doctor`);\n this.log(\"\");\n this.log(\" Checking configuration health...\");\n this.log(\"\");\n }\n\n private async runAllChecks(projectDir: string): Promise<CheckResult[]> {\n const detected = await detectProject(projectDir);\n const { result: configResult, config } = checkConfigValid(detected?.config ?? null);\n this.logCheck(\"Config Valid\", configResult);\n\n // loadSource (called by checkSourceReachable) populates the matrix. Run it\n // before checkSkillsResolved so skills lookups see a populated matrix; if\n // source fails, skip skills rather than reporting false \"not found\" errors.\n const sourceResult = await safeCheck(\"source\", () => checkSourceReachable(projectDir));\n\n const filteredConfig = config ? filterExcludedEntries(config) : null;\n\n const skillsResult = !config\n ? skippedResult(\"skills\")\n : sourceResult.status === \"fail\"\n ? {\n kind: \"skills\" as const,\n status: \"skip\" as const,\n message: \"Skipped (source unreachable)\",\n }\n : await safeCheck(\"skills\", () => checkSkillsResolved(config, matrix, projectDir));\n this.logCheck(\"Skills Resolved\", skillsResult);\n\n const agentsResult = filteredConfig\n ? await safeCheck(\"agents\", () => checkAgentsCompiled(filteredConfig, projectDir))\n : skippedResult(\"agents\");\n this.logCheck(\"Agents Compiled\", agentsResult);\n\n const orphansResult = config\n ? await safeCheck(\"orphans\", () => checkNoOrphans(config, projectDir))\n : skippedResult(\"orphans\");\n this.logCheck(\"No Orphans\", orphansResult);\n\n const installedResult = filteredConfig\n ? await safeCheck(\"installed\", () => checkSkillsInstalled(filteredConfig, projectDir))\n : skippedResult(\"installed\");\n this.logCheck(\"Skills Installed\", installedResult);\n\n const pluginsResult = filteredConfig\n ? await safeCheck(\"plugins\", () => checkPluginSkillsInstalled(filteredConfig, projectDir))\n : skippedResult(\"plugins\");\n this.logCheck(\"Plugins Installed\", pluginsResult);\n\n this.logCheck(\"Source Reachable\", sourceResult);\n\n return [\n configResult,\n skillsResult,\n agentsResult,\n orphansResult,\n installedResult,\n pluginsResult,\n sourceResult,\n ];\n }\n\n private logCheck(name: string, result: CheckResult): void {\n for (const line of formatCheckLine(name, result)) {\n this.log(line);\n }\n }\n\n private printResults(results: CheckResult[]): void {\n this.log(\"\");\n this.log(formatSummary(results));\n\n const tips = formatTips(results);\n if (tips.length > 0) {\n this.log(\"\");\n for (const tip of tips) {\n this.log(tip);\n }\n }\n\n this.log(\"\");\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AAuBjB,SAAS,SAAS,cAAc;AAkBhC,IAAM,gBAAgB,GAAG,cAAc,IAAI,eAAe,SAAS;AAEnE,SAAS,iBAAiB,QAAiD;AACzE,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,MACL,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,SAAS,GAAG,aAAa;AAAA,QACzB,SAAS,CAAC,QAAQ,kBAAkB,kCAAkC;AAAA,MACxE;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,aAAa,sBAAsB,MAAM;AAE/C,MAAI,CAAC,WAAW,OAAO;AACrB,WAAO;AAAA,MACL,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,SAAS,GAAG,aAAa;AAAA,QACzB,SAAS,WAAW;AAAA,MACtB;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAI,WAAW,SAAS,SAAS,GAAG;AAClC,WAAO;AAAA,MACL,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,SAAS,GAAG,aAAa;AAAA,QACzB,SAAS,WAAW;AAAA,MACtB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,GAAG,aAAa;AAAA,IAC3B;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,oBACb,QACAA,SACA,YACsB;AAItB,QAAM,cAAc,4BAA4B,OAAO,MAAM;AAC7D,QAAM,WAAW,OAAO,QAAQ,iBAAiB,OAAO,KAAK,IAAI,CAAC;AAClE,QAAM,eAAe,OAAO,CAAC,GAAG,UAAU,GAAG,OAAO,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE;AAAA,IAC5E,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE;AAAA,EAC7B;AAEA,MAAI,aAAa,WAAW,GAAG;AAC7B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,CAAC,aAAa,YAAY,IAAI,MAAM,QAAQ,IAAI;AAAA,IACpD,oBAAoB,UAAU;AAAA,IAC9B,CAAC,gBAAgB,UAAU,IAAI,oBAAoB,GAAG,QAAQ,CAAC,IAAI;AAAA,EACrE,CAAC;AACD,QAAM,gBAAgB,oBAAI,IAAI;AAAA,IAC5B,GAAI,aAAa,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC;AAAA,IAC7C,GAAI,cAAc,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC;AAAA,EAChD,CAAC;AAED,QAAM,gBAA0B,CAAC;AACjC,aAAW,WAAW,cAAc;AAClC,UAAM,WAAW,WAAWA,QAAO;AACnC,UAAM,UAAU,cAAc,IAAI,OAAO;AACzC,QAAI,CAAC,YAAY,CAAC,SAAS;AACzB,oBAAc,KAAK,OAAO;AAAA,IAC5B;AAAA,EACF;AAEA,MAAI,cAAc,SAAS,GAAG;AAC5B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,GAAG,aAAa,SAAS,cAAc,MAAM,IAAI,aAAa,MAAM;AAAA,MAC7E,SAAS,cAAc,IAAI,CAAC,MAAM,KAAK,CAAC,cAAc;AAAA,IACxD;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS,GAAG,aAAa,MAAM,IAAI,aAAa,MAAM;AAAA,EACxD;AACF;AAEA,eAAe,oBACb,QACA,YACsB;AACtB,QAAM,SAAS,OAAO,UAAU,CAAC;AAEjC,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,mBAAmB,oBAAoB,YAAY,SAAS,EAAE;AACpE,QAAM,kBAAkB,oBAAoB,YAAY,QAAQ,EAAE;AAClE,QAAM,cAAc,MAAM,QAAQ;AAAA,IAChC,OAAO,IAAI,OAAO,UAAU;AAE1B,YAAM,YAAY,MAAM,UAAU,WAAW,kBAAkB;AAC/D,YAAM,YAAY,KAAK,KAAK,WAAW,GAAG,MAAM,IAAI,KAAK;AACzD,aAAO,EAAE,MAAM,MAAM,MAAM,UAAU,MAAM,WAAW,SAAS,EAAE;AAAA,IACnE,CAAC;AAAA,EACH;AACA,QAAM,gBAAgB,YAAY,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AAE9E,MAAI,cAAc,SAAS,GAAG;AAC5B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,GAAG,cAAc,MAAM,SAAS,cAAc,WAAW,IAAI,KAAK,GAAG,QAAQ,cAAc,WAAW,IAAI,MAAM,EAAE;AAAA,MAC3H,SAAS,cAAc,IAAI,CAAC,MAAM,KAAK,CAAC,YAAY;AAAA,IACtD;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS,GAAG,OAAO,MAAM,IAAI,OAAO,MAAM;AAAA,EAC5C;AACF;AAEA,eAAe,eAAe,QAAuB,YAA0C;AAC7F,QAAM,mBAAmB,oBAAoB,YAAY,SAAS,EAAE;AACpE,QAAM,kBAAkB,oBAAoB,YAAY,QAAQ,EAAE;AAIlE,QAAM,uBAAuB,gBAAgB,UAAU;AAEvD,QAAM,CAAC,eAAe,YAAY,IAAI,MAAM,QAAQ,IAAI;AAAA,IACtD,gBAAgB,gBAAgB;AAAA,IAChC,CAAC,uBAAuB,gBAAgB,eAAe,IAAI;AAAA,EAC7D,CAAC;AAED,MAAI,CAAC,iBAAiB,CAAC,cAAc;AACnC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,iBAAiB,gBAAgB,MAAM,iBAAiB,gBAAgB,IAAI,CAAC;AACnF,QAAM,gBAAgB,eAAe,MAAM,iBAAiB,eAAe,IAAI,CAAC;AAGhF,QAAM,sBAAmC,IAAI;AAAA,KAC1C,OAAO,UAAU,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,UAAU,aAAa,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,EAC7F;AAEA,QAAM,oBAAiC,IAAI;AAAA,KACxC,OAAO,UAAU,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,UAAU,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,EAC7E;AAEA,QAAM,wBAAwB,uBAC1B,oBAAI,IAAI,CAAC,GAAG,qBAAqB,GAAG,iBAAiB,CAAC,IACtD;AAEJ,QAAM,gBAA0B,CAAC;AACjC,aAAW,QAAQ,gBAAgB;AACjC,UAAM,YAAY,KAAK,QAAQ,SAAS,EAAE;AAC1C,QAAI,CAAC,sBAAsB,IAAI,SAAS,GAAG;AACzC,oBAAc,KAAK,SAAS;AAAA,IAC9B;AAAA,EACF;AACA,aAAW,QAAQ,eAAe;AAChC,UAAM,YAAY,KAAK,QAAQ,SAAS,EAAE;AAC1C,QAAI,CAAC,kBAAkB,IAAI,SAAS,GAAG;AACrC,oBAAc,KAAK,SAAS;AAAA,IAC9B;AAAA,EACF;AAEA,MAAI,cAAc,SAAS,GAAG;AAC5B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,GAAG,cAAc,MAAM,uBAAuB,cAAc,WAAW,IAAI,KAAK,GAAG;AAAA,MAC5F,SAAS,cAAc,IAAI,CAAC,MAAM,KAAK,CAAC,qBAAqB;AAAA,IAC/D;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AACF;AAEA,eAAe,qBACb,QACA,YACsB;AACtB,QAAM,SAAwB,OAAO,UAAU,CAAC;AAChD,QAAM,cAAc,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,YAAY;AAElE,MAAI,YAAY,WAAW,GAAG;AAC5B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,cAAc,MAAM,QAAQ;AAAA,IAChC,YAAY,IAAI,OAAO,UAAU;AAC/B,YAAM,UAAU,eAAe,YAAY,MAAM,KAAK;AACtD,YAAM,cAAc,KAAK,KAAK,SAAS,mBAAmB,MAAM,IAAI,eAAe,QAAQ;AAC3F,aAAO,EAAE,IAAI,MAAM,IAAI,WAAW,MAAM,WAAW,WAAW,EAAE;AAAA,IAClE,CAAC;AAAA,EACH;AACA,QAAM,gBAAgB,YAAY,OAAO,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE;AAE7E,MAAI,cAAc,SAAS,GAAG;AAC5B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,GAAG,cAAc,MAAM,SAAS,cAAc,WAAW,IAAI,KAAK,GAAG;AAAA,MAC9E,SAAS,cAAc,IAAI,CAAC,MAAM,KAAK,CAAC,kBAAkB,iBAAiB,IAAI;AAAA,IACjF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS,GAAG,YAAY,MAAM,IAAI,YAAY,MAAM;AAAA,EACtD;AACF;AAOA,eAAe,2BACb,QACA,YACsB;AACtB,QAAM,eAA8B,OAAO,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,YAAY;AAEzF,MAAI,aAAa,WAAW,GAAG;AAC7B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,WAAW,OAAO,aAAa,IAAI,CAAC,MAAM,eAAe,YAAY,EAAE,KAAK,CAAC,CAAC;AACpF,QAAM,oBAAoB,MAAM,QAAQ;AAAA,IACtC,SAAS,IAAI,OAAO,YAAY;AAC9B,YAAM,eAAe,IAAI;AAAA,SACtB,MAAM,8BAA8B,OAAO,GAAG;AAAA,UAAI,CAAC,WAClD,0BAA0B,OAAO,SAAS;AAAA,QAC5C;AAAA,MACF;AACA,aAAO,aACJ,OAAO,CAAC,UAAU,eAAe,YAAY,MAAM,KAAK,MAAM,OAAO,EACrE,OAAO,CAAC,UAAU,CAAC,aAAa,IAAI,MAAM,EAAE,CAAC,EAC7C,IAAI,CAAC,UAAU,MAAM,EAAE;AAAA,IAC5B,CAAC;AAAA,EACH;AACA,QAAM,gBAAgB,kBAAkB,KAAK;AAE7C,MAAI,cAAc,SAAS,GAAG;AAC5B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,GAAG,cAAc,MAAM,SAAS,cAAc,WAAW,IAAI,KAAK,GAAG;AAAA,MAC9E,SAAS,cAAc,IAAI,CAAC,MAAM,KAAK,CAAC,4BAA4B;AAAA,IACtE;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS,GAAG,aAAa,MAAM,IAAI,aAAa,MAAM;AAAA,EACxD;AACF;AAEA,eAAe,qBAAqB,YAA0C;AAC5E,MAAI;AACF,UAAM,EAAE,cAAc,OAAO,IAAI,MAAM,WAAW;AAAA,MAChD;AAAA,IACF,CAAC;AAED,UAAM,aAAa,OAAO,KAAK,OAAO,MAAM,EAAE;AAC9C,UAAM,cAAc,OAAO,UAAU,UAAU;AAE/C,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,gBAAgB,WAAW,KAAK,OAAO,UAAU;AAAA,MAC1D,SAAS,CAAC,GAAG,UAAU,mBAAmB;AAAA,IAC5C;AAAA,EACF,SAAS,OAAO;AACd,UAAM,UAAU,gBAAgB,KAAK;AACrC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS,CAAC,OAAO;AAAA,IACnB;AAAA,EACF;AACF;AAEA,IAAM,cAAc;AAEpB,SAAS,gBAAgB,MAAsB;AAC7C,SAAO,KAAK,OAAO,WAAW;AAChC;AAEA,SAAS,aAAa,QAAuC;AAC3D,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,WAAW;AAAA,IACpB,KAAK;AACH,aAAO,WAAW;AAAA,IACpB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,SAAS;AACP,YAAM,cAAqB;AAC3B,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,MAAc,QAA+B;AACpE,QAAM,aAAa,KAAK,gBAAgB,IAAI,CAAC,GAAG,aAAa,OAAO,MAAM,CAAC,KAAK,OAAO,OAAO;AAC9F,QAAM,eAAe,OAAO,WAAW,CAAC,GAAG;AAAA,IACzC,CAAC,WAAW,KAAK,IAAI,OAAO,WAAW,CAAC,MAAM,MAAM;AAAA,EACtD;AACA,SAAO,CAAC,YAAY,GAAG,WAAW;AACpC;AAEA,SAAS,cAAc,SAAgC;AACrD,QAAM,SAAS,QAAQ,SAAS,CAAC,MAAM,EAAE,MAAM;AAC/C,QAAM,SAAS,CAAC,GAAW,SAAiB,GAAG,CAAC,IAAI,IAAI,GAAG,MAAM,IAAI,KAAK,GAAG;AAE7E,QAAM,QAAQ;AAAA,IACZ,GAAG,OAAO,QAAQ,CAAC;AAAA,IACnB,OAAO,OAAO,QAAQ,GAAG,SAAS;AAAA,IAClC,OAAO,OAAO,QAAQ,GAAG,OAAO;AAAA,EAClC;AAEA,SAAO,cAAc,MAAM,KAAK,IAAI,CAAC;AACvC;AAEA,IAAM,OAA+E;AAAA,EACnF;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,KAAK,eAAe,kBAAkB;AAAA,EACxC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,KAAK,eAAe,kBAAkB;AAAA,EACxC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,KAAK;AAAA,EACP;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA;AAAA;AAAA;AAAA,IAIR,KAAK;AAAA,EACP;AACF;AAEA,SAAS,WAAW,SAAkC;AACpD,SAAO,KAAK,OAAO,CAAC,MAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE;AAAA,IACzF,CAAC,MAAM,EAAE;AAAA,EACX;AACF;AAEA,SAAS,cAAc,MAA8B;AACnD,SAAO,EAAE,MAAM,QAAQ,QAAQ,SAAS,2BAA2B;AACrE;AAMA,eAAe,UAAU,MAAiB,IAAsD;AAC9F,MAAI;AACF,WAAO,MAAM,GAAG;AAAA,EAClB,SAAS,OAAO;AACd,WAAO,EAAE,MAAM,QAAQ,QAAQ,SAAS,eAAe,SAAS,CAAC,gBAAgB,KAAK,CAAC,EAAE;AAAA,EAC3F;AACF;AAEA,IAAqB,SAArB,MAAqB,gBAAe,YAAY;AAAA,EAC9C,OAAO,UAAU;AAAA,EAEjB,OAAO,cAAc,iCAAiC,iBAAiB,IAAI;AAAA,EAE3E,OAAO,WAAW,CAAC,qCAAqC;AAAA;AAAA,EAGxD,OAAO,YAAY,CAAC;AAAA,EAEpB,OAAO,QAAQ,CAAC;AAAA,EAEhB,MAAM,MAAqB;AACzB,UAAM,KAAK,MAAM,OAAM;AACvB,eAAW,IAAI;AACf,UAAM,aAAa,QAAQ,IAAI;AAE/B,SAAK,YAAY;AACjB,UAAM,UAAU,MAAM,KAAK,aAAa,UAAU;AAClD,SAAK,aAAa,OAAO;AAEzB,QAAI,QAAQ,KAAK,CAAC,MAAM,EAAE,WAAW,MAAM,GAAG;AAC5C,WAAK,KAAK,WAAW,KAAK;AAAA,IAC5B;AAAA,EACF;AAAA,EAEQ,cAAoB;AAC1B,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,GAAG,iBAAiB,IAAI,SAAS;AAC1C,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,oCAAoC;AAC7C,SAAK,IAAI,EAAE;AAAA,EACb;AAAA,EAEA,MAAc,aAAa,YAA4C;AACrE,UAAM,WAAW,MAAM,cAAc,UAAU;AAC/C,UAAM,EAAE,QAAQ,cAAc,OAAO,IAAI,iBAAiB,UAAU,UAAU,IAAI;AAClF,SAAK,SAAS,gBAAgB,YAAY;AAK1C,UAAM,eAAe,MAAM,UAAU,UAAU,MAAM,qBAAqB,UAAU,CAAC;AAErF,UAAM,iBAAiB,SAAS,sBAAsB,MAAM,IAAI;AAEhE,UAAM,eAAe,CAAC,SAClB,cAAc,QAAQ,IACtB,aAAa,WAAW,SACtB;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,IACA,MAAM,UAAU,UAAU,MAAM,oBAAoB,QAAQ,QAAQ,UAAU,CAAC;AACrF,SAAK,SAAS,mBAAmB,YAAY;AAE7C,UAAM,eAAe,iBACjB,MAAM,UAAU,UAAU,MAAM,oBAAoB,gBAAgB,UAAU,CAAC,IAC/E,cAAc,QAAQ;AAC1B,SAAK,SAAS,mBAAmB,YAAY;AAE7C,UAAM,gBAAgB,SAClB,MAAM,UAAU,WAAW,MAAM,eAAe,QAAQ,UAAU,CAAC,IACnE,cAAc,SAAS;AAC3B,SAAK,SAAS,cAAc,aAAa;AAEzC,UAAM,kBAAkB,iBACpB,MAAM,UAAU,aAAa,MAAM,qBAAqB,gBAAgB,UAAU,CAAC,IACnF,cAAc,WAAW;AAC7B,SAAK,SAAS,oBAAoB,eAAe;AAEjD,UAAM,gBAAgB,iBAClB,MAAM,UAAU,WAAW,MAAM,2BAA2B,gBAAgB,UAAU,CAAC,IACvF,cAAc,SAAS;AAC3B,SAAK,SAAS,qBAAqB,aAAa;AAEhD,SAAK,SAAS,oBAAoB,YAAY;AAE9C,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,SAAS,MAAc,QAA2B;AACxD,eAAW,QAAQ,gBAAgB,MAAM,MAAM,GAAG;AAChD,WAAK,IAAI,IAAI;AAAA,IACf;AAAA,EACF;AAAA,EAEQ,aAAa,SAA8B;AACjD,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,cAAc,OAAO,CAAC;AAE/B,UAAM,OAAO,WAAW,OAAO;AAC/B,QAAI,KAAK,SAAS,GAAG;AACnB,WAAK,IAAI,EAAE;AACX,iBAAW,OAAO,MAAM;AACtB,aAAK,IAAI,GAAG;AAAA,MACd;AAAA,IACF;AAEA,SAAK,IAAI,EAAE;AAAA,EACb;AACF;","names":["matrix"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/commands/doctor.ts"],"sourcesContent":["import os from \"os\";\nimport path from \"path\";\nimport { BaseCommand } from \"../base-command\";\nimport { getErrorMessage } from \"../utils/errors\";\nimport { EXIT_CODES } from \"../lib/exit-codes\";\nimport { effectivelyExcludedSkillIds, validateProjectConfig } from \"../lib/configuration\";\nimport { loadSource, detectProject } from \"../lib/operations\";\nimport { matrix } from \"../lib/matrix/matrix-provider\";\nimport { discoverLocalSkills } from \"../lib/skills\";\nimport { getStackSkillIds } from \"../lib/stacks\";\nimport { filterExcludedEntries, listAgentMdFiles } from \"../lib/agents\";\nimport { getVerifiedPluginInstallPaths, parseMarketplacePluginRef } from \"../lib/plugins\";\nimport { isHomeDirectory, installBaseDir, resolveInstallPaths } from \"../lib/installation\";\nimport type { MergedSkillsMatrix, ProjectConfig, SkillConfig } from \"../types\";\nimport { fileExists, directoryExists } from \"../utils/fs\";\nimport {\n CLAUDE_SRC_DIR,\n CLI_INVOKE_COMMAND,\n DEFAULT_BRANDING,\n EJECT_SOURCE,\n LOCAL_SKILLS_PATH,\n STANDARD_FILES,\n UI_SYMBOLS,\n} from \"../consts\";\nimport { countBy, unique } from \"remeda\";\nimport { setVerbose } from \"../utils/logger\";\n\ntype CheckKind = \"config\" | \"skills\" | \"agents\" | \"orphans\" | \"installed\" | \"plugins\" | \"source\";\n\ntype CheckResult = {\n kind: CheckKind;\n status: \"pass\" | \"fail\" | \"warn\" | \"skip\";\n message: string;\n details?: string[];\n};\n\ntype ConfigCheckOutput = {\n result: CheckResult;\n config: ProjectConfig | null;\n};\n\n/** Project-relative path to the config file, shown in doctor messages. */\nconst CONFIG_TS_REL = `${CLAUDE_SRC_DIR}/${STANDARD_FILES.CONFIG_TS}`;\n\nfunction checkConfigValid(config: ProjectConfig | null): ConfigCheckOutput {\n if (!config) {\n return {\n result: {\n kind: \"config\",\n status: \"fail\",\n message: `${CONFIG_TS_REL} not found`,\n details: [`Run '${CLI_INVOKE_COMMAND} init' to create a configuration`],\n },\n config: null,\n };\n }\n\n const validation = validateProjectConfig(config);\n\n if (!validation.valid) {\n return {\n result: {\n kind: \"config\",\n status: \"fail\",\n message: `${CONFIG_TS_REL} has errors`,\n details: validation.errors,\n },\n config: null,\n };\n }\n\n if (validation.warnings.length > 0) {\n return {\n result: {\n kind: \"config\",\n status: \"warn\",\n message: `${CONFIG_TS_REL} has warnings`,\n details: validation.warnings,\n },\n config,\n };\n }\n\n return {\n result: {\n kind: \"config\",\n status: \"pass\",\n message: `${CONFIG_TS_REL} is valid`,\n },\n config,\n };\n}\n\nasync function checkSkillsResolved(\n config: ProjectConfig,\n matrix: MergedSkillsMatrix,\n projectDir: string,\n): Promise<CheckResult> {\n // config.ts declares skills both directly and through the stack. A global-only\n // install has a populated skills array and no stack at all, so keying this check\n // off the stack alone would report \"No skills configured\" for a real install.\n const excludedIds = effectivelyExcludedSkillIds(config.skills);\n const stackIds = config.stack ? getStackSkillIds(config.stack) : [];\n const uniqueSkills = unique([...stackIds, ...config.skills.map((s) => s.id)]).filter(\n (id) => !excludedIds.has(id),\n );\n\n if (uniqueSkills.length === 0) {\n return {\n kind: \"skills\",\n status: \"pass\",\n message: \"No skills configured\",\n };\n }\n\n const [localResult, globalResult] = await Promise.all([\n discoverLocalSkills(projectDir),\n !isHomeDirectory(projectDir) ? discoverLocalSkills(os.homedir()) : null,\n ]);\n const localSkillIds = new Set([\n ...(localResult?.skills.map((s) => s.id) ?? []),\n ...(globalResult?.skills.map((s) => s.id) ?? []),\n ]);\n\n const missingSkills: string[] = [];\n for (const skillId of uniqueSkills) {\n const inMatrix = skillId in matrix.skills;\n const inLocal = localSkillIds.has(skillId);\n if (!inMatrix && !inLocal) {\n missingSkills.push(skillId);\n }\n }\n\n if (missingSkills.length > 0) {\n return {\n kind: \"skills\",\n status: \"fail\",\n message: `${uniqueSkills.length - missingSkills.length}/${uniqueSkills.length} skills found`,\n details: missingSkills.map((s) => `- ${s} (not found)`),\n };\n }\n\n return {\n kind: \"skills\",\n status: \"pass\",\n message: `${uniqueSkills.length}/${uniqueSkills.length} skills found`,\n };\n}\n\nasync function checkAgentsCompiled(\n config: ProjectConfig,\n projectDir: string,\n): Promise<CheckResult> {\n const agents = config.agents ?? [];\n\n if (agents.length === 0) {\n return {\n kind: \"agents\",\n status: \"pass\",\n message: \"No agents configured\",\n };\n }\n\n const projectAgentsDir = resolveInstallPaths(projectDir, \"project\").agentsDir;\n const globalAgentsDir = resolveInstallPaths(projectDir, \"global\").agentsDir;\n const agentChecks = await Promise.all(\n agents.map(async (agent) => {\n // Check scope-appropriate directory for the agent\n const agentsDir = agent.scope === \"global\" ? globalAgentsDir : projectAgentsDir;\n const agentPath = path.join(agentsDir, `${agent.name}.md`);\n return { name: agent.name, compiled: await fileExists(agentPath) };\n }),\n );\n const missingAgents = agentChecks.filter((c) => !c.compiled).map((c) => c.name);\n\n if (missingAgents.length > 0) {\n return {\n kind: \"agents\",\n status: \"warn\",\n message: `${missingAgents.length} agent${missingAgents.length === 1 ? \"\" : \"s\"} need${missingAgents.length === 1 ? \"s\" : \"\"} recompilation`,\n details: missingAgents.map((a) => `- ${a} (missing)`),\n };\n }\n\n return {\n kind: \"agents\",\n status: \"pass\",\n message: `${agents.length}/${agents.length} agents compiled`,\n };\n}\n\nasync function checkNoOrphans(config: ProjectConfig, projectDir: string): Promise<CheckResult> {\n const projectAgentsDir = resolveInstallPaths(projectDir, \"project\").agentsDir;\n const globalAgentsDir = resolveInstallPaths(projectDir, \"global\").agentsDir;\n\n // At home scope both scopes resolve to the same agents directory, so it is\n // listed once and its files are matched against both scopes' known names.\n const scopesShareAgentsDir = isHomeDirectory(projectDir);\n\n const [projectExists, globalExists] = await Promise.all([\n directoryExists(projectAgentsDir),\n !scopesShareAgentsDir ? directoryExists(globalAgentsDir) : false,\n ]);\n\n if (!projectExists && !globalExists) {\n return {\n kind: \"orphans\",\n status: \"pass\",\n message: \"No agents directory\",\n };\n }\n\n const projectMdFiles = projectExists ? await listAgentMdFiles(projectAgentsDir) : [];\n const globalMdFiles = globalExists ? await listAgentMdFiles(globalAgentsDir) : [];\n\n // Project files: only active project-scoped agents should have .md files here\n const activeProjectAgents: Set<string> = new Set(\n (config.agents ?? []).filter((a) => a.scope === \"project\" && !a.excluded).map((a) => a.name),\n );\n // Global files: all global-scoped agents (including excluded) still serve other projects\n const knownGlobalAgents: Set<string> = new Set(\n (config.agents ?? []).filter((a) => a.scope === \"global\").map((a) => a.name),\n );\n\n const knownProjectDirAgents = scopesShareAgentsDir\n ? new Set([...activeProjectAgents, ...knownGlobalAgents])\n : activeProjectAgents;\n\n const orphanedFiles: string[] = [];\n for (const file of projectMdFiles) {\n const agentName = file.replace(/\\.md$/, \"\");\n if (!knownProjectDirAgents.has(agentName)) {\n orphanedFiles.push(agentName);\n }\n }\n for (const file of globalMdFiles) {\n const agentName = file.replace(/\\.md$/, \"\");\n if (!knownGlobalAgents.has(agentName)) {\n orphanedFiles.push(agentName);\n }\n }\n\n if (orphanedFiles.length > 0) {\n return {\n kind: \"orphans\",\n status: \"warn\",\n message: `${orphanedFiles.length} orphaned agent file${orphanedFiles.length === 1 ? \"\" : \"s\"}`,\n details: orphanedFiles.map((f) => `- ${f}.md (not in config)`),\n };\n }\n\n return {\n kind: \"orphans\",\n status: \"pass\",\n message: \"No orphaned agent files\",\n };\n}\n\nasync function checkSkillsInstalled(\n config: ProjectConfig,\n projectDir: string,\n): Promise<CheckResult> {\n const skills: SkillConfig[] = config.skills ?? [];\n const ejectSkills = skills.filter((s) => s.source === EJECT_SOURCE);\n\n if (ejectSkills.length === 0) {\n return {\n kind: \"installed\",\n status: \"pass\",\n message: \"No eject-mode skills configured\",\n };\n }\n\n const skillChecks = await Promise.all(\n ejectSkills.map(async (skill) => {\n const baseDir = installBaseDir(projectDir, skill.scope);\n const skillMdPath = path.join(baseDir, LOCAL_SKILLS_PATH, skill.id, STANDARD_FILES.SKILL_MD);\n return { id: skill.id, installed: await fileExists(skillMdPath) };\n }),\n );\n const missingSkills = skillChecks.filter((c) => !c.installed).map((c) => c.id);\n\n if (missingSkills.length > 0) {\n return {\n kind: \"installed\",\n status: \"warn\",\n message: `${missingSkills.length} skill${missingSkills.length === 1 ? \"\" : \"s\"} missing from disk`,\n details: missingSkills.map((s) => `- ${s} (not found in ${LOCAL_SKILLS_PATH}/)`),\n };\n }\n\n return {\n kind: \"installed\",\n status: \"pass\",\n message: `${ejectSkills.length}/${ejectSkills.length} eject-mode skills installed`,\n };\n}\n\n/**\n * Plugin-mode skills have no files under `.claude/skills/` — they live in the\n * Claude plugin registry. Verifying them means asking the registry for the scope\n * each skill was installed at, not looking on disk.\n */\nasync function checkPluginSkillsInstalled(\n config: ProjectConfig,\n projectDir: string,\n): Promise<CheckResult> {\n const pluginSkills: SkillConfig[] = config.skills.filter((s) => s.source !== EJECT_SOURCE);\n\n if (pluginSkills.length === 0) {\n return {\n kind: \"plugins\",\n status: \"pass\",\n message: \"No plugin-mode skills configured\",\n };\n }\n\n const baseDirs = unique(pluginSkills.map((s) => installBaseDir(projectDir, s.scope)));\n const missingPerBaseDir = await Promise.all(\n baseDirs.map(async (baseDir) => {\n const installedIds = new Set(\n (await getVerifiedPluginInstallPaths(baseDir)).map((plugin) =>\n parseMarketplacePluginRef(plugin.pluginKey),\n ),\n );\n return pluginSkills\n .filter((skill) => installBaseDir(projectDir, skill.scope) === baseDir)\n .filter((skill) => !installedIds.has(skill.id))\n .map((skill) => skill.id);\n }),\n );\n const missingSkills = missingPerBaseDir.flat();\n\n if (missingSkills.length > 0) {\n return {\n kind: \"plugins\",\n status: \"warn\",\n message: `${missingSkills.length} skill${missingSkills.length === 1 ? \"\" : \"s\"} not installed as plugins`,\n details: missingSkills.map((s) => `- ${s} (no enabled plugin found)`),\n };\n }\n\n return {\n kind: \"plugins\",\n status: \"pass\",\n message: `${pluginSkills.length}/${pluginSkills.length} plugin-mode skills installed`,\n };\n}\n\nasync function checkSourceReachable(projectDir: string): Promise<CheckResult> {\n try {\n const { sourceResult: result } = await loadSource({\n projectDir,\n });\n\n const skillCount = Object.keys(matrix.skills).length;\n const sourceLabel = result.isLocal ? \"local\" : \"remote\";\n\n return {\n kind: \"source\",\n status: \"pass\",\n message: `Connected to ${sourceLabel}: ${result.sourcePath}`,\n details: [`${skillCount} skills available`],\n };\n } catch (error) {\n const message = getErrorMessage(error);\n return {\n kind: \"source\",\n status: \"fail\",\n message: \"Failed to load source\",\n details: [message],\n };\n }\n}\n\nconst CHECK_WIDTH = 20;\n\nfunction formatCheckName(name: string): string {\n return name.padEnd(CHECK_WIDTH);\n}\n\nfunction formatStatus(status: CheckResult[\"status\"]): string {\n switch (status) {\n case \"pass\":\n return UI_SYMBOLS.CHECK;\n case \"fail\":\n return UI_SYMBOLS.CROSS;\n case \"warn\":\n return \"!\";\n case \"skip\":\n return \"-\";\n default: {\n const _exhaustive: never = status;\n return _exhaustive;\n }\n }\n}\n\nfunction formatCheckLine(name: string, result: CheckResult): string[] {\n const headerLine = ` ${formatCheckName(name)}${formatStatus(result.status)} ${result.message}`;\n const detailLines = (result.details ?? []).map(\n (detail) => ` ${\" \".repeat(CHECK_WIDTH)} ${detail}`,\n );\n return [headerLine, ...detailLines];\n}\n\nfunction formatSummary(results: CheckResult[]): string {\n const counts = countBy(results, (r) => r.status);\n const plural = (n: number, word: string) => `${n} ${word}${n === 1 ? \"\" : \"s\"}`;\n\n const parts = [\n `${counts.pass ?? 0} passed`,\n plural(counts.warn ?? 0, \"warning\"),\n plural(counts.fail ?? 0, \"error\"),\n ];\n\n return ` Summary: ${parts.join(\", \")}`;\n}\n\nconst TIPS: Array<{ kind: CheckKind; status: CheckResult[\"status\"]; tip: string }> = [\n {\n kind: \"agents\",\n status: \"warn\",\n tip: ` Tip: Run '${CLI_INVOKE_COMMAND} compile' to generate missing agent files`,\n },\n {\n kind: \"config\",\n status: \"fail\",\n tip: ` Tip: Run '${CLI_INVOKE_COMMAND} init' to create or fix configuration`,\n },\n {\n kind: \"skills\",\n status: \"fail\",\n tip: \" Tip: Check skill IDs in config match available skills\",\n },\n {\n kind: \"installed\",\n status: \"warn\",\n // No command is named on purpose: 'eject skills --force' re-copies every skill in the\n // source and always targets project scope, so it cannot repair a global-scoped skill\n // and it litters a plugin-mode project with local skill directories.\n tip: \" Tip: Re-eject the missing skills from the source to restore their files\",\n },\n];\n\nfunction formatTips(results: CheckResult[]): string[] {\n return TIPS.filter((t) => results.some((r) => r.kind === t.kind && r.status === t.status)).map(\n (t) => t.tip,\n );\n}\n\nfunction skippedResult(kind: CheckKind): CheckResult {\n return { kind, status: \"skip\", message: \"Skipped (config invalid)\" };\n}\n\n/**\n * Wrap a check so a thrown exception becomes a `fail` result instead of crashing the\n * whole doctor run. Per-check isolation ensures one broken check does not mask others.\n */\nasync function safeCheck(kind: CheckKind, fn: () => Promise<CheckResult>): Promise<CheckResult> {\n try {\n return await fn();\n } catch (error) {\n return { kind, status: \"fail\", message: \"Check threw\", details: [getErrorMessage(error)] };\n }\n}\n\nexport default class Doctor extends BaseCommand {\n static summary = \"Diagnose common configuration issues\";\n\n static description = `Run diagnostic checks on your ${DEFAULT_BRANDING.NAME} configuration to identify issues with config validity, skill resolution, agent compilation, and source connectivity.`;\n\n static examples = [\"<%= config.bin %> <%= command.id %>\"];\n\n // Override parent baseFlags to drop --source (not relevant for diagnostics)\n static baseFlags = {} as (typeof BaseCommand)[\"baseFlags\"];\n\n static flags = {};\n\n async run(): Promise<void> {\n await this.parse(Doctor);\n setVerbose(true);\n const projectDir = process.cwd();\n\n this.printHeader();\n const results = await this.runAllChecks(projectDir);\n this.printResults(results);\n\n if (results.some((r) => r.status === \"fail\")) {\n this.exit(EXIT_CODES.ERROR);\n }\n }\n\n private printHeader(): void {\n this.log(\"\");\n this.log(`${DEFAULT_BRANDING.NAME} Doctor`);\n this.log(\"\");\n this.log(\" Checking configuration health...\");\n this.log(\"\");\n }\n\n private async runAllChecks(projectDir: string): Promise<CheckResult[]> {\n const detected = await detectProject(projectDir);\n const { result: configResult, config } = checkConfigValid(detected?.config ?? null);\n this.logCheck(\"Config Valid\", configResult);\n\n // loadSource (called by checkSourceReachable) populates the matrix. Run it\n // before checkSkillsResolved so skills lookups see a populated matrix; if\n // source fails, skip skills rather than reporting false \"not found\" errors.\n const sourceResult = await safeCheck(\"source\", () => checkSourceReachable(projectDir));\n\n const filteredConfig = config ? filterExcludedEntries(config) : null;\n\n const skillsResult = !config\n ? skippedResult(\"skills\")\n : sourceResult.status === \"fail\"\n ? {\n kind: \"skills\" as const,\n status: \"skip\" as const,\n message: \"Skipped (source unreachable)\",\n }\n : await safeCheck(\"skills\", () => checkSkillsResolved(config, matrix, projectDir));\n this.logCheck(\"Skills Resolved\", skillsResult);\n\n const agentsResult = filteredConfig\n ? await safeCheck(\"agents\", () => checkAgentsCompiled(filteredConfig, projectDir))\n : skippedResult(\"agents\");\n this.logCheck(\"Agents Compiled\", agentsResult);\n\n const orphansResult = config\n ? await safeCheck(\"orphans\", () => checkNoOrphans(config, projectDir))\n : skippedResult(\"orphans\");\n this.logCheck(\"No Orphans\", orphansResult);\n\n const installedResult = filteredConfig\n ? await safeCheck(\"installed\", () => checkSkillsInstalled(filteredConfig, projectDir))\n : skippedResult(\"installed\");\n this.logCheck(\"Skills Installed\", installedResult);\n\n const pluginsResult = filteredConfig\n ? await safeCheck(\"plugins\", () => checkPluginSkillsInstalled(filteredConfig, projectDir))\n : skippedResult(\"plugins\");\n this.logCheck(\"Plugins Installed\", pluginsResult);\n\n this.logCheck(\"Source Reachable\", sourceResult);\n\n return [\n configResult,\n skillsResult,\n agentsResult,\n orphansResult,\n installedResult,\n pluginsResult,\n sourceResult,\n ];\n }\n\n private logCheck(name: string, result: CheckResult): void {\n for (const line of formatCheckLine(name, result)) {\n this.log(line);\n }\n }\n\n private printResults(results: CheckResult[]): void {\n this.log(\"\");\n this.log(formatSummary(results));\n\n const tips = formatTips(results);\n if (tips.length > 0) {\n this.log(\"\");\n for (const tip of tips) {\n this.log(tip);\n }\n }\n\n this.log(\"\");\n }\n}\n"],"mappings":"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","names":["matrix"]}
|
package/dist/commands/edit.js
CHANGED
|
@@ -1,74 +1,75 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
runWizardSession
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-MVR3SYMN.js";
|
|
5
|
+
import "../chunk-XHUODHZ4.js";
|
|
6
|
+
import "../chunk-MWG4VU64.js";
|
|
7
|
+
import "../chunk-TJJPWUMA.js";
|
|
8
|
+
import "../chunk-TUPYW2IQ.js";
|
|
9
|
+
import "../chunk-SKQWRUPX.js";
|
|
10
|
+
import "../chunk-LASI35KT.js";
|
|
11
|
+
import "../chunk-GRVKW3CC.js";
|
|
12
|
+
import "../chunk-L7SZXUBJ.js";
|
|
13
|
+
import "../chunk-ZPPHXXAP.js";
|
|
14
|
+
import "../chunk-R5NOI2LP.js";
|
|
15
|
+
import "../chunk-BNSRA6HL.js";
|
|
16
|
+
import "../chunk-F7T5AFFN.js";
|
|
17
|
+
import "../chunk-MQ7FLIYS.js";
|
|
18
|
+
import "../chunk-FVDKAVOL.js";
|
|
19
|
+
import "../chunk-TSIU7DME.js";
|
|
20
|
+
import "../chunk-QRDTLVXG.js";
|
|
21
|
+
import "../chunk-J27W6TXS.js";
|
|
22
|
+
import "../chunk-SX5H6TSC.js";
|
|
23
|
+
import "../chunk-5GUOIJSG.js";
|
|
24
|
+
import "../chunk-MJ2KHG24.js";
|
|
25
|
+
import "../chunk-DTSG5XZB.js";
|
|
26
|
+
import "../chunk-MM7CTTAV.js";
|
|
27
|
+
import "../chunk-KXYVJGJP.js";
|
|
28
|
+
import "../chunk-P44SXVH3.js";
|
|
29
|
+
import "../chunk-LDP5ASDM.js";
|
|
30
|
+
import "../chunk-Q45ZU6HD.js";
|
|
31
|
+
import "../chunk-WBCPLH66.js";
|
|
32
|
+
import "../chunk-RNJWAKMO.js";
|
|
33
|
+
import "../chunk-XVAQG2CV.js";
|
|
5
34
|
import {
|
|
6
35
|
Spinner
|
|
7
|
-
} from "../chunk-
|
|
8
|
-
import "../chunk-RJN7W2C7.js";
|
|
9
|
-
import "../chunk-ZKJAJWK6.js";
|
|
10
|
-
import "../chunk-RP7R73JO.js";
|
|
11
|
-
import "../chunk-E4FT2KFV.js";
|
|
12
|
-
import "../chunk-F3756A5B.js";
|
|
13
|
-
import "../chunk-RBHYLCUB.js";
|
|
14
|
-
import "../chunk-4GL2F5AB.js";
|
|
15
|
-
import "../chunk-EN2GCPW7.js";
|
|
16
|
-
import "../chunk-LRYNF3J7.js";
|
|
17
|
-
import "../chunk-UZRISDBZ.js";
|
|
18
|
-
import "../chunk-ZHTXPFDK.js";
|
|
19
|
-
import "../chunk-IOJR5TOY.js";
|
|
20
|
-
import "../chunk-ZDLTLNU2.js";
|
|
21
|
-
import "../chunk-QQLRX4KI.js";
|
|
22
|
-
import "../chunk-7URSGJLE.js";
|
|
23
|
-
import "../chunk-NIKUMXE7.js";
|
|
24
|
-
import "../chunk-KOPEM3Q7.js";
|
|
25
|
-
import "../chunk-2RSNKBXC.js";
|
|
26
|
-
import "../chunk-DUVWGO6E.js";
|
|
27
|
-
import "../chunk-KIR7VYQD.js";
|
|
28
|
-
import "../chunk-HIPGKIT3.js";
|
|
29
|
-
import "../chunk-LYYXX2W5.js";
|
|
30
|
-
import "../chunk-5K5RBRTD.js";
|
|
31
|
-
import "../chunk-FWT3CBLL.js";
|
|
32
|
-
import "../chunk-XA57SX4T.js";
|
|
33
|
-
import "../chunk-FYPUUYSG.js";
|
|
34
|
-
import "../chunk-DAG2ULNF.js";
|
|
35
|
-
import "../chunk-VG2TVBFN.js";
|
|
36
|
-
import "../chunk-IHO75PMZ.js";
|
|
36
|
+
} from "../chunk-IUQBOCSU.js";
|
|
37
37
|
import {
|
|
38
38
|
ERROR_MESSAGES,
|
|
39
39
|
STATUS_MESSAGES
|
|
40
|
-
} from "../chunk-
|
|
40
|
+
} from "../chunk-ODNDXQH2.js";
|
|
41
41
|
import {
|
|
42
42
|
compileAgentsAllScopes,
|
|
43
43
|
detectProject,
|
|
44
44
|
loadSource,
|
|
45
45
|
writeProjectConfig
|
|
46
|
-
} from "../chunk-
|
|
46
|
+
} from "../chunk-STMHDOZD.js";
|
|
47
47
|
import {
|
|
48
48
|
discoverInstalledSkills,
|
|
49
49
|
installPluginSkills,
|
|
50
50
|
pluginInstallFailureError,
|
|
51
51
|
uninstallPluginSkills
|
|
52
|
-
} from "../chunk-
|
|
52
|
+
} from "../chunk-SBHBBZKF.js";
|
|
53
53
|
import {
|
|
54
54
|
copyLocalSkills
|
|
55
|
-
} from "../chunk-
|
|
55
|
+
} from "../chunk-IHUY4M22.js";
|
|
56
56
|
import {
|
|
57
57
|
loadAgentDefs
|
|
58
|
-
} from "../chunk-
|
|
59
|
-
import "../chunk-
|
|
60
|
-
import "../chunk-
|
|
58
|
+
} from "../chunk-QZZJFYUQ.js";
|
|
59
|
+
import "../chunk-E5X6RJ4E.js";
|
|
60
|
+
import "../chunk-LZ52XEPR.js";
|
|
61
|
+
import {
|
|
62
|
+
render
|
|
63
|
+
} from "../chunk-JFLVEFFP.js";
|
|
61
64
|
import {
|
|
62
65
|
formatScopeTag
|
|
63
|
-
} from "../chunk-
|
|
66
|
+
} from "../chunk-5UWKOOIS.js";
|
|
64
67
|
import {
|
|
65
68
|
BaseCommand,
|
|
66
|
-
EXIT_CODES
|
|
67
|
-
} from "../chunk-OA5SUEQD.js";
|
|
68
|
-
import {
|
|
69
|
+
EXIT_CODES,
|
|
69
70
|
source_default
|
|
70
|
-
} from "../chunk-
|
|
71
|
-
import "../chunk-
|
|
71
|
+
} from "../chunk-KR65TPKC.js";
|
|
72
|
+
import "../chunk-ZL7PFNHN.js";
|
|
72
73
|
import {
|
|
73
74
|
activeAgentScopeMap,
|
|
74
75
|
applyMigratedGlobalSources,
|
|
@@ -86,36 +87,31 @@ import {
|
|
|
86
87
|
mutateGlobal,
|
|
87
88
|
resolveInstallPaths,
|
|
88
89
|
toClaudePluginScope
|
|
89
|
-
} from "../chunk-
|
|
90
|
+
} from "../chunk-EEPELKOM.js";
|
|
90
91
|
import {
|
|
91
92
|
getErrorMessage,
|
|
92
93
|
remove
|
|
93
|
-
} from "../chunk-
|
|
94
|
+
} from "../chunk-PMM2MYMA.js";
|
|
94
95
|
import {
|
|
95
96
|
getSkillById,
|
|
96
97
|
getSkillDisplayName,
|
|
97
98
|
matrix
|
|
98
|
-
} from "../chunk-
|
|
99
|
+
} from "../chunk-WKTHWQKM.js";
|
|
99
100
|
import {
|
|
100
101
|
typedKeys
|
|
101
|
-
} from "../chunk-
|
|
102
|
+
} from "../chunk-VASLW636.js";
|
|
102
103
|
import {
|
|
103
104
|
CLI_COLORS,
|
|
104
105
|
CLI_INVOKE_COMMAND,
|
|
105
106
|
EDIT_PROJECT_SETUP_FLAG,
|
|
106
107
|
EJECT_SOURCE,
|
|
107
108
|
formatSourceDisplayName
|
|
108
|
-
} from "../chunk-
|
|
109
|
-
import "../chunk-
|
|
110
|
-
import {
|
|
111
|
-
init_esm_shims
|
|
112
|
-
} from "../chunk-P56WJ5FA.js";
|
|
109
|
+
} from "../chunk-76ADG7LQ.js";
|
|
110
|
+
import "../chunk-UBEDZ4FD.js";
|
|
113
111
|
|
|
114
112
|
// src/cli/commands/edit.tsx
|
|
115
|
-
init_esm_shims();
|
|
116
113
|
import path from "path";
|
|
117
114
|
import { Flags } from "@oclif/core";
|
|
118
|
-
import { render } from "ink";
|
|
119
115
|
import { difference, indexBy } from "remeda";
|
|
120
116
|
import { jsx } from "react/jsx-runtime";
|
|
121
117
|
function formatDualScopeTransition(displayName, to) {
|