@agents-inc/cli 0.76.0 → 0.78.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.
Files changed (182) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/{chunk-Q4PJSAMP.js → chunk-32HX6UYI.js} +2 -1
  3. package/dist/chunk-32HX6UYI.js.map +1 -0
  4. package/dist/{chunk-CKU7FJNV.js → chunk-7HGMFJ4Y.js} +3 -3
  5. package/dist/{chunk-UBNHVBSV.js → chunk-7JQIMEUX.js} +3 -3
  6. package/dist/{chunk-XYZ7B5BY.js → chunk-7LBYURQR.js} +2 -2
  7. package/dist/{chunk-NWW3OJH5.js → chunk-A5JSBU65.js} +2 -2
  8. package/dist/{chunk-ODVQXXEO.js → chunk-B4C2S5LP.js} +17 -43
  9. package/dist/{chunk-ODVQXXEO.js.map → chunk-B4C2S5LP.js.map} +1 -1
  10. package/dist/{chunk-IDN2OZJY.js → chunk-C22ACAL2.js} +2 -2
  11. package/dist/{chunk-I2SUTL7S.js → chunk-D4T3HHE7.js} +5 -5
  12. package/dist/chunk-D4T3HHE7.js.map +1 -0
  13. package/dist/{chunk-7XUKTYVD.js → chunk-EO6KJI5D.js} +1038 -270
  14. package/dist/chunk-EO6KJI5D.js.map +1 -0
  15. package/dist/{chunk-WZ5S4LGX.js → chunk-F4IZ3UAS.js} +16 -22
  16. package/dist/chunk-F4IZ3UAS.js.map +1 -0
  17. package/dist/{chunk-JWMYAJHD.js → chunk-FSK4TQX7.js} +1236 -354
  18. package/dist/chunk-FSK4TQX7.js.map +1 -0
  19. package/dist/{chunk-WMMU5FOO.js → chunk-FUWUCKES.js} +2 -2
  20. package/dist/{chunk-WMMU5FOO.js.map → chunk-FUWUCKES.js.map} +1 -1
  21. package/dist/{chunk-S6DKM6MJ.js → chunk-HANGA633.js} +4 -8
  22. package/dist/{chunk-S6DKM6MJ.js.map → chunk-HANGA633.js.map} +1 -1
  23. package/dist/{chunk-CBYRFAUN.js → chunk-HK53FRMU.js} +3 -1
  24. package/dist/chunk-HK53FRMU.js.map +1 -0
  25. package/dist/{chunk-I534EWJQ.js → chunk-IFCASC6R.js} +2 -2
  26. package/dist/{chunk-2I5SXGXR.js → chunk-KQDGLEBF.js} +80 -5
  27. package/dist/chunk-KQDGLEBF.js.map +1 -0
  28. package/dist/{chunk-AE2QHAFO.js → chunk-KVRR4PEJ.js} +81 -73
  29. package/dist/chunk-KVRR4PEJ.js.map +1 -0
  30. package/dist/{chunk-R7F5YQMI.js → chunk-LVBRC2CP.js} +2 -6
  31. package/dist/chunk-LVBRC2CP.js.map +1 -0
  32. package/dist/{chunk-CCSU4R65.js → chunk-MG55NDVG.js} +2 -2
  33. package/dist/{chunk-M4ZDKHJV.js → chunk-MUCQ27HV.js} +2 -2
  34. package/dist/chunk-N2XGUAJU.js +34 -0
  35. package/dist/{chunk-7PZFDI46.js.map → chunk-N2XGUAJU.js.map} +1 -1
  36. package/dist/{chunk-PRG7PKZM.js → chunk-N34D3ROY.js} +14 -13
  37. package/dist/chunk-N34D3ROY.js.map +1 -0
  38. package/dist/{chunk-7PMFIL5L.js → chunk-NKLNT7N7.js} +4 -21
  39. package/dist/chunk-NKLNT7N7.js.map +1 -0
  40. package/dist/{chunk-WS3TL2AO.js → chunk-OIHZ2YH3.js} +172 -102
  41. package/dist/chunk-OIHZ2YH3.js.map +1 -0
  42. package/dist/chunk-OOWNDQCG.js +192 -0
  43. package/dist/chunk-OOWNDQCG.js.map +1 -0
  44. package/dist/{chunk-EEZSCHS2.js → chunk-OTMIGYBB.js} +52 -10
  45. package/dist/chunk-OTMIGYBB.js.map +1 -0
  46. package/dist/chunk-PZERKWE2.js +114 -0
  47. package/dist/chunk-PZERKWE2.js.map +1 -0
  48. package/dist/{chunk-O5CPXIC4.js → chunk-Q755X6QF.js} +4 -4
  49. package/dist/{chunk-36YW5E7G.js → chunk-QD3GQ2CH.js} +5 -5
  50. package/dist/{chunk-ERHTXNIF.js → chunk-RU5XLS5Q.js} +1 -5
  51. package/dist/{chunk-ERHTXNIF.js.map → chunk-RU5XLS5Q.js.map} +1 -1
  52. package/dist/{chunk-VQV3DSHD.js → chunk-SJNUTUSJ.js} +5 -5
  53. package/dist/{chunk-KPRCP3MZ.js → chunk-U2KFFRRX.js} +2 -2
  54. package/dist/{chunk-CBJTSEI2.js → chunk-VDVLM3KB.js} +54 -6
  55. package/dist/chunk-VDVLM3KB.js.map +1 -0
  56. package/dist/{chunk-7NACNRFG.js → chunk-W46L2PXK.js} +32 -23
  57. package/dist/chunk-W46L2PXK.js.map +1 -0
  58. package/dist/{chunk-6F3CZLD6.js → chunk-XA7WF3BI.js} +3 -3
  59. package/dist/{chunk-WN2TUP4M.js → chunk-XYPAOBBV.js} +2 -2
  60. package/dist/{chunk-LO5QGAP2.js → chunk-YFHVP3VA.js} +5 -12
  61. package/dist/chunk-YFHVP3VA.js.map +1 -0
  62. package/dist/commands/build/marketplace.js +4 -4
  63. package/dist/commands/build/plugins.js +8 -8
  64. package/dist/commands/build/stack.js +8 -8
  65. package/dist/commands/compile.js +38 -22
  66. package/dist/commands/compile.js.map +1 -1
  67. package/dist/commands/config/index.js +8 -8
  68. package/dist/commands/config/path.js +7 -7
  69. package/dist/commands/config/show.js +8 -8
  70. package/dist/commands/diff.js +35 -15
  71. package/dist/commands/diff.js.map +1 -1
  72. package/dist/commands/doctor.js +24 -12
  73. package/dist/commands/doctor.js.map +1 -1
  74. package/dist/commands/edit.js +47 -37
  75. package/dist/commands/edit.js.map +1 -1
  76. package/dist/commands/eject.js +7 -7
  77. package/dist/commands/import/skill.js +7 -7
  78. package/dist/commands/info.js +7 -7
  79. package/dist/commands/init.js +28 -28
  80. package/dist/commands/list.js +7 -7
  81. package/dist/commands/new/agent.js +8 -8
  82. package/dist/commands/new/marketplace.js +9 -9
  83. package/dist/commands/new/skill.js +8 -8
  84. package/dist/commands/outdated.js +18 -10
  85. package/dist/commands/outdated.js.map +1 -1
  86. package/dist/commands/search.js +9 -9
  87. package/dist/commands/uninstall.js +15 -27
  88. package/dist/commands/uninstall.js.map +1 -1
  89. package/dist/commands/update.js +26 -16
  90. package/dist/commands/update.js.map +1 -1
  91. package/dist/commands/validate.js +7 -7
  92. package/dist/components/skill-search/skill-search.js +2 -2
  93. package/dist/components/wizard/category-grid.js +3 -3
  94. package/dist/components/wizard/category-grid.test.js +18 -19
  95. package/dist/components/wizard/category-grid.test.js.map +1 -1
  96. package/dist/components/wizard/checkbox-grid.js +1 -2
  97. package/dist/components/wizard/checkbox-grid.test.js +2 -4
  98. package/dist/components/wizard/checkbox-grid.test.js.map +1 -1
  99. package/dist/components/wizard/domain-selection.js +10 -11
  100. package/dist/components/wizard/help-modal.js +2 -2
  101. package/dist/components/wizard/search-modal.js +2 -2
  102. package/dist/components/wizard/search-modal.test.js +2 -2
  103. package/dist/components/wizard/source-grid.js +4 -4
  104. package/dist/components/wizard/source-grid.test.js +13 -13
  105. package/dist/components/wizard/stack-selection.js +10 -9
  106. package/dist/components/wizard/stats-panel.js +12 -0
  107. package/dist/components/wizard/step-agents.js +9 -10
  108. package/dist/components/wizard/step-agents.test.js +16 -15
  109. package/dist/components/wizard/step-agents.test.js.map +1 -1
  110. package/dist/components/wizard/step-build.js +11 -12
  111. package/dist/components/wizard/step-build.test.js +34 -32
  112. package/dist/components/wizard/step-build.test.js.map +1 -1
  113. package/dist/components/wizard/step-confirm.js +4 -6
  114. package/dist/components/wizard/step-confirm.test.js +24 -23
  115. package/dist/components/wizard/step-confirm.test.js.map +1 -1
  116. package/dist/components/wizard/step-refine.js +2 -3
  117. package/dist/components/wizard/step-refine.test.js +2 -3
  118. package/dist/components/wizard/step-refine.test.js.map +1 -1
  119. package/dist/components/wizard/step-settings.js +8 -9
  120. package/dist/components/wizard/step-settings.test.js +14 -15
  121. package/dist/components/wizard/step-settings.test.js.map +1 -1
  122. package/dist/components/wizard/step-sources.js +11 -12
  123. package/dist/components/wizard/step-sources.test.js +17 -19
  124. package/dist/components/wizard/step-sources.test.js.map +1 -1
  125. package/dist/components/wizard/step-stack.js +12 -14
  126. package/dist/components/wizard/step-stack.test.js +26 -25
  127. package/dist/components/wizard/step-stack.test.js.map +1 -1
  128. package/dist/components/wizard/view-title.js +21 -3
  129. package/dist/components/wizard/view-title.js.map +1 -1
  130. package/dist/components/wizard/wizard-layout.js +12 -11
  131. package/dist/components/wizard/wizard-tabs.js +1 -1
  132. package/dist/components/wizard/wizard-tabs.test.js +1 -1
  133. package/dist/components/wizard/wizard.js +26 -26
  134. package/dist/config-exports.js +1 -1
  135. package/dist/hooks/init.js +28 -28
  136. package/dist/{loader-7RQ4G4TH.js → loader-JMOO2A7C.js} +4 -4
  137. package/dist/{source-loader-CXCIDGWV.js → source-loader-D3VIG3GM.js} +7 -7
  138. package/dist/source-manager-FPYFJRR7.js +19 -0
  139. package/dist/source-manager-FPYFJRR7.js.map +1 -0
  140. package/dist/stores/wizard-store.js +7 -7
  141. package/dist/stores/wizard-store.test.js +12 -12
  142. package/dist/stores/wizard-store.test.js.map +1 -1
  143. package/package.json +1 -1
  144. package/dist/chunk-2I5SXGXR.js.map +0 -1
  145. package/dist/chunk-7NACNRFG.js.map +0 -1
  146. package/dist/chunk-7PMFIL5L.js.map +0 -1
  147. package/dist/chunk-7PZFDI46.js +0 -40
  148. package/dist/chunk-7XUKTYVD.js.map +0 -1
  149. package/dist/chunk-AE2QHAFO.js.map +0 -1
  150. package/dist/chunk-CBJTSEI2.js.map +0 -1
  151. package/dist/chunk-CBYRFAUN.js.map +0 -1
  152. package/dist/chunk-EEZSCHS2.js.map +0 -1
  153. package/dist/chunk-EWBNSS5Y.js +0 -113
  154. package/dist/chunk-EWBNSS5Y.js.map +0 -1
  155. package/dist/chunk-I2SUTL7S.js.map +0 -1
  156. package/dist/chunk-JNQKCZA3.js +0 -28
  157. package/dist/chunk-JNQKCZA3.js.map +0 -1
  158. package/dist/chunk-JWMYAJHD.js.map +0 -1
  159. package/dist/chunk-LO5QGAP2.js.map +0 -1
  160. package/dist/chunk-PRG7PKZM.js.map +0 -1
  161. package/dist/chunk-Q4PJSAMP.js.map +0 -1
  162. package/dist/chunk-R7F5YQMI.js.map +0 -1
  163. package/dist/chunk-WS3TL2AO.js.map +0 -1
  164. package/dist/chunk-WZ5S4LGX.js.map +0 -1
  165. package/dist/source-manager-TPLO2DVS.js +0 -19
  166. /package/dist/{chunk-CKU7FJNV.js.map → chunk-7HGMFJ4Y.js.map} +0 -0
  167. /package/dist/{chunk-UBNHVBSV.js.map → chunk-7JQIMEUX.js.map} +0 -0
  168. /package/dist/{chunk-XYZ7B5BY.js.map → chunk-7LBYURQR.js.map} +0 -0
  169. /package/dist/{chunk-NWW3OJH5.js.map → chunk-A5JSBU65.js.map} +0 -0
  170. /package/dist/{chunk-IDN2OZJY.js.map → chunk-C22ACAL2.js.map} +0 -0
  171. /package/dist/{chunk-I534EWJQ.js.map → chunk-IFCASC6R.js.map} +0 -0
  172. /package/dist/{chunk-CCSU4R65.js.map → chunk-MG55NDVG.js.map} +0 -0
  173. /package/dist/{chunk-M4ZDKHJV.js.map → chunk-MUCQ27HV.js.map} +0 -0
  174. /package/dist/{chunk-O5CPXIC4.js.map → chunk-Q755X6QF.js.map} +0 -0
  175. /package/dist/{chunk-36YW5E7G.js.map → chunk-QD3GQ2CH.js.map} +0 -0
  176. /package/dist/{chunk-VQV3DSHD.js.map → chunk-SJNUTUSJ.js.map} +0 -0
  177. /package/dist/{chunk-KPRCP3MZ.js.map → chunk-U2KFFRRX.js.map} +0 -0
  178. /package/dist/{chunk-6F3CZLD6.js.map → chunk-XA7WF3BI.js.map} +0 -0
  179. /package/dist/{chunk-WN2TUP4M.js.map → chunk-XYPAOBBV.js.map} +0 -0
  180. /package/dist/{loader-7RQ4G4TH.js.map → components/wizard/stats-panel.js.map} +0 -0
  181. /package/dist/{source-loader-CXCIDGWV.js.map → loader-JMOO2A7C.js.map} +0 -0
  182. /package/dist/{source-manager-TPLO2DVS.js.map → source-loader-D3VIG3GM.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/commands/edit.tsx"],"sourcesContent":["import os from \"os\";\nimport path from \"path\";\n\nimport { Flags } from \"@oclif/core\";\nimport { render } from \"ink\";\n\nimport { BaseCommand } from \"../base-command.js\";\nimport { Wizard, type WizardResultV2 } from \"../components/wizard/wizard.js\";\nimport {\n CLAUDE_DIR,\n CLAUDE_SRC_DIR,\n CLI_BIN_NAME,\n GLOBAL_INSTALL_ROOT,\n PROJECT_ROOT,\n SOURCE_DISPLAY_NAMES,\n STANDARD_FILES,\n} from \"../consts.js\";\nimport { getAgentDefinitions, recompileAgents } from \"../lib/agents/index.js\";\nimport { loadProjectConfig } from \"../lib/configuration/index.js\";\nimport { ensureBlankGlobalConfig } from \"../lib/configuration/config-writer.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport {\n detectInstallation,\n buildAndMergeConfig,\n writeScopedConfigs,\n detectMigrations,\n executeMigration,\n deriveInstallMode,\n} from \"../lib/installation/index.js\";\nimport { loadAllAgents, loadSkillsMatrixFromSource } from \"../lib/loading/index.js\";\nimport { matrix, getSkillById } from \"../lib/matrix/matrix-provider\";\nimport { discoverAllPluginSkills } from \"../lib/plugins/index.js\";\nimport { deleteLocalSkill, migrateLocalSkillScope } from \"../lib/skills/index.js\";\nimport type { AgentDefinition, AgentName, SkillId } from \"../types/index.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport {\n claudePluginInstall,\n claudePluginUninstall,\n claudePluginMarketplaceExists,\n claudePluginMarketplaceAdd,\n} from \"../utils/exec.js\";\nimport {\n enableBuffering,\n drainBuffer,\n disableBuffering,\n pushBufferMessage,\n type StartupMessage,\n} from \"../utils/logger.js\";\nimport { ERROR_MESSAGES, INFO_MESSAGES, STATUS_MESSAGES } from \"../utils/messages.js\";\n\nfunction formatSourceDisplayName(sourceName: string): string {\n return SOURCE_DISPLAY_NAMES[sourceName] ?? sourceName;\n}\n\nexport default class Edit extends BaseCommand {\n static summary = \"Edit skills in the plugin\";\n static description = \"Modify the currently installed skills via interactive wizard\";\n\n static examples = [\n {\n description: \"Open the edit wizard\",\n command: \"<%= config.bin %> <%= command.id %>\",\n },\n {\n description: \"Edit with a custom source\",\n command: \"<%= config.bin %> <%= command.id %> --source github:org/marketplace\",\n },\n {\n description: \"Force refresh skills from remote\",\n command: \"<%= config.bin %> <%= command.id %> --refresh\",\n },\n ];\n\n static flags = {\n ...BaseCommand.baseFlags,\n refresh: Flags.boolean({\n description: \"Force refresh from remote sources\",\n default: false,\n }),\n \"agent-source\": Flags.string({\n description: \"Remote agent partials source (default: local CLI)\",\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Edit);\n const cwd = process.cwd();\n\n const installation = await detectInstallation();\n\n if (!installation) {\n this.error(ERROR_MESSAGES.NO_INSTALLATION, {\n exit: EXIT_CODES.ERROR,\n });\n }\n\n // Use installation.projectDir for reads (loading config, discovering installed skills).\n // Use cwd for writes (config saves, plugin installs, scope migrations, recompilation output)\n // and for the locked-items check (determining whether global items are read-only).\n const projectDir = installation.projectDir;\n\n enableBuffering();\n\n let sourceResult;\n let startupMessages: StartupMessage[] = [];\n try {\n sourceResult = await loadSkillsMatrixFromSource({\n sourceFlag: flags.source,\n projectDir,\n forceRefresh: flags.refresh,\n });\n\n const sourceInfo = sourceResult.isLocal ? \"local\" : sourceResult.sourceConfig.sourceOrigin;\n pushBufferMessage(\n \"info\",\n `Loaded ${Object.keys(matrix.skills).length} skills (${sourceInfo})`,\n );\n } catch (error) {\n disableBuffering();\n this.handleError(error);\n }\n\n const projectConfig = await loadProjectConfig(projectDir);\n\n let currentSkillIds: SkillId[];\n try {\n const discoveredSkills = await discoverAllPluginSkills(projectDir);\n // Boundary cast: discoverAllPluginSkills keys are skill IDs from frontmatter\n currentSkillIds = Object.keys(discoveredSkills) as SkillId[];\n\n // In local mode, plugin discovery returns empty — fall back to project config skills\n if (currentSkillIds.length === 0 && projectConfig?.config?.skills?.length) {\n currentSkillIds = projectConfig.config.skills.map((s) => s.id);\n pushBufferMessage(\"info\", `Found ${currentSkillIds.length} skills from project config`);\n } else {\n pushBufferMessage(\"info\", `Current plugin has ${currentSkillIds.length} skills`);\n }\n } catch (error) {\n disableBuffering();\n this.handleError(error);\n }\n\n startupMessages = drainBuffer();\n disableBuffering();\n\n let wizardResult: WizardResultV2 | null = null;\n\n // D9: In project context, existing global items are read-only (locked).\n // When editing from ~/ (global context), nothing is locked.\n // Uses cwd (not projectDir) so that global items are correctly locked\n // even when detectInstallation() fell back to the global installation.\n const isGlobalDir = cwd === GLOBAL_INSTALL_ROOT;\n const lockedSkillIds = isGlobalDir\n ? undefined\n : projectConfig?.config?.skills?.filter((s) => s.scope === \"global\").map((s) => s.id);\n const lockedAgentNames = isGlobalDir\n ? undefined\n : projectConfig?.config?.agents?.filter((a) => a.scope === \"global\").map((a) => a.name);\n\n const { waitUntilExit } = render(\n <Wizard\n version={this.config.version}\n initialStep=\"build\"\n initialDomains={projectConfig?.config?.domains}\n initialAgents={projectConfig?.config?.selectedAgents}\n installedSkillIds={currentSkillIds}\n installedSkillConfigs={projectConfig?.config?.skills}\n lockedSkillIds={lockedSkillIds}\n installedAgentConfigs={projectConfig?.config?.agents}\n lockedAgentNames={lockedAgentNames}\n projectDir={projectDir}\n startupMessages={startupMessages}\n onComplete={(result) => {\n wizardResult = result;\n }}\n onCancel={() => {\n this.log(\"\\nEdit cancelled\");\n }}\n />,\n );\n\n await waitUntilExit();\n\n // TypeScript can't track that onComplete callback mutates wizardResult before waitUntilExit resolves\n const result = wizardResult as WizardResultV2 | null;\n\n if (!result || result.cancelled) {\n this.error(\"Cancelled\", { exit: EXIT_CODES.CANCELLED });\n }\n\n if (result.validation.errors.length > 0) {\n for (const err of result.validation.errors) {\n this.warn(err.message);\n }\n }\n\n const newSkillIds = result.skills.map((s) => s.id);\n const addedSkills = newSkillIds.filter((id) => !currentSkillIds.includes(id));\n const removedSkills = currentSkillIds.filter((id) => !newSkillIds.includes(id));\n\n const sourceChanges = new Map<SkillId, { from: string; to: string }>();\n const scopeChanges = new Map<\n SkillId,\n { from: \"project\" | \"global\"; to: \"project\" | \"global\" }\n >();\n if (projectConfig?.config?.skills) {\n for (const newSkill of result.skills) {\n const oldSkill = projectConfig.config.skills.find((s) => s.id === newSkill.id);\n if (oldSkill && oldSkill.source !== newSkill.source) {\n sourceChanges.set(newSkill.id, {\n from: oldSkill.source,\n to: newSkill.source,\n });\n }\n if (oldSkill && oldSkill.scope !== newSkill.scope) {\n scopeChanges.set(newSkill.id, {\n from: oldSkill.scope,\n to: newSkill.scope,\n });\n }\n }\n }\n\n const agentScopeChanges = new Map<\n AgentName,\n { from: \"project\" | \"global\"; to: \"project\" | \"global\" }\n >();\n if (projectConfig?.config?.agents) {\n for (const newAgent of result.agentConfigs) {\n const oldAgent = projectConfig.config.agents.find((a) => a.name === newAgent.name);\n if (oldAgent && oldAgent.scope !== newAgent.scope) {\n agentScopeChanges.set(newAgent.name, {\n from: oldAgent.scope,\n to: newAgent.scope,\n });\n }\n }\n }\n\n const hasSourceChanges = sourceChanges.size > 0;\n const hasScopeChanges = scopeChanges.size > 0;\n const hasAgentScopeChanges = agentScopeChanges.size > 0;\n const hasSkillChanges = addedSkills.length > 0 || removedSkills.length > 0;\n\n if (!hasSkillChanges && !hasSourceChanges && !hasScopeChanges && !hasAgentScopeChanges) {\n this.log(INFO_MESSAGES.NO_CHANGES_MADE);\n this.log(\"Plugin unchanged\\n\");\n return;\n }\n\n this.log(\"\\nChanges:\");\n for (const skillId of addedSkills) {\n this.log(` + ${getSkillById(skillId).displayName}`);\n }\n for (const skillId of removedSkills) {\n const skill = matrix.skills[skillId];\n this.log(` - ${skill?.displayName ?? skillId}`);\n }\n for (const [skillId, change] of sourceChanges) {\n const fromLabel = formatSourceDisplayName(change.from);\n const toLabel = formatSourceDisplayName(change.to);\n this.log(` ~ ${skillId} (${fromLabel} \\u2192 ${toLabel})`);\n }\n for (const [skillId, change] of scopeChanges) {\n const fromLabel = change.from === \"global\" ? \"[G]\" : \"[P]\";\n const toLabel = change.to === \"global\" ? \"[G]\" : \"[P]\";\n this.log(` ~ ${skillId} (${fromLabel} \\u2192 ${toLabel})`);\n }\n for (const [agentName, change] of agentScopeChanges) {\n const fromLabel = change.from === \"global\" ? \"[G]\" : \"[P]\";\n const toLabel = change.to === \"global\" ? \"[G]\" : \"[P]\";\n this.log(` ~ ${agentName} (${fromLabel} \\u2192 ${toLabel})`);\n }\n this.log(\"\");\n\n // Handle per-skill mode migrations (local <-> plugin)\n const oldSkills = projectConfig?.config?.skills ?? [];\n const migrationPlan = detectMigrations(oldSkills, result.skills);\n const hasMigrations = migrationPlan.toLocal.length > 0 || migrationPlan.toPlugin.length > 0;\n\n if (hasMigrations) {\n if (migrationPlan.toLocal.length > 0) {\n this.log(`Switching ${migrationPlan.toLocal.length} skill(s) to local:`);\n for (const migration of migrationPlan.toLocal) {\n this.log(` - ${migration.id}`);\n }\n }\n if (migrationPlan.toPlugin.length > 0) {\n this.log(`Switching ${migrationPlan.toPlugin.length} skill(s) to plugin:`);\n for (const migration of migrationPlan.toPlugin) {\n this.log(` - ${migration.id}`);\n }\n }\n\n const migrationResult = await executeMigration(migrationPlan, cwd, sourceResult);\n\n for (const warning of migrationResult.warnings) {\n this.warn(warning);\n }\n }\n\n const migratedSkillIds = new Set([\n ...migrationPlan.toLocal.map((m) => m.id),\n ...migrationPlan.toPlugin.map((m) => m.id),\n ]);\n\n // Handle scope migrations (P→G or G→P) for local-mode skills\n for (const [skillId, change] of scopeChanges) {\n const skillConfig = result.skills.find((s) => s.id === skillId);\n if (skillConfig?.source === \"local\") {\n await migrateLocalSkillScope(skillId, change.from, cwd);\n } else if (sourceResult.marketplace && skillConfig) {\n // Plugin-mode scope change: uninstall from old scope, install to new scope\n const oldPluginScope = change.from === \"global\" ? \"user\" : \"project\";\n const newPluginScope = change.to === \"global\" ? \"user\" : \"project\";\n try {\n await claudePluginUninstall(skillId, oldPluginScope, cwd);\n const pluginRef = `${skillId}@${sourceResult.marketplace}`;\n await claudePluginInstall(pluginRef, newPluginScope, cwd);\n } catch (error) {\n this.warn(`Failed to migrate plugin scope for ${skillId}: ${getErrorMessage(error)}`);\n }\n }\n }\n\n // Handle remaining non-migration source changes (e.g., marketplace A -> marketplace B)\n for (const [skillId, change] of sourceChanges) {\n // Skip skills already handled by mode migration\n if (migratedSkillIds.has(skillId)) {\n continue;\n }\n if (change.from === \"local\") {\n await deleteLocalSkill(cwd, skillId);\n }\n }\n\n if (sourceResult.marketplace) {\n const marketplaceExists = await claudePluginMarketplaceExists(sourceResult.marketplace);\n if (!marketplaceExists) {\n this.log(`Registering marketplace \"${sourceResult.marketplace}\"...`);\n const marketplaceSource = sourceResult.sourceConfig.source.replace(/^github:/, \"\");\n await claudePluginMarketplaceAdd(marketplaceSource);\n this.log(`Registered marketplace: ${sourceResult.marketplace}`);\n }\n\n for (const skillId of addedSkills) {\n // Find the skill config to get its scope\n const skillConfig = result.skills.find((s) => s.id === skillId);\n if (!skillConfig || skillConfig.source === \"local\") continue;\n\n const pluginRef = `${skillId}@${sourceResult.marketplace}`;\n const pluginScope = skillConfig.scope === \"global\" ? \"user\" : \"project\";\n this.log(`Installing plugin: ${pluginRef}...`);\n try {\n await claudePluginInstall(pluginRef, pluginScope, cwd);\n } catch (error) {\n this.warn(`Failed to install plugin ${pluginRef}: ${getErrorMessage(error)}`);\n }\n }\n for (const skillId of removedSkills) {\n // For removed skills, use old config to determine scope\n const oldSkill = projectConfig?.config?.skills?.find((s) => s.id === skillId);\n const pluginScope = oldSkill?.scope === \"global\" ? \"user\" : \"project\";\n this.log(`Uninstalling plugin: ${skillId}...`);\n try {\n await claudePluginUninstall(skillId, pluginScope, cwd);\n } catch (error) {\n this.warn(`Failed to uninstall plugin ${skillId}: ${getErrorMessage(error)}`);\n }\n }\n }\n\n // Load agent definitions first — needed for both config-types.ts and recompilation\n let sourcePath: string;\n this.log(\n flags[\"agent-source\"]\n ? STATUS_MESSAGES.FETCHING_AGENT_PARTIALS\n : STATUS_MESSAGES.LOADING_AGENT_PARTIALS,\n );\n try {\n const agentDefs = await getAgentDefinitions(flags[\"agent-source\"], {\n forceRefresh: flags.refresh,\n });\n sourcePath = agentDefs.sourcePath;\n this.log(flags[\"agent-source\"] ? \"✓ Agent partials fetched\\n\" : \"✓ Agent partials loaded\\n\");\n } catch (error) {\n this.handleError(error);\n }\n\n // Persist wizard result to config.ts and config-types.ts (split by scope when in project context)\n try {\n const mergeResult = await buildAndMergeConfig(result, sourceResult, cwd, flags.source);\n\n // Load full agent definitions for config-types.ts generation\n const cliAgents = await loadAllAgents(PROJECT_ROOT);\n const sourceAgents = await loadAllAgents(sourcePath);\n const agents: Record<AgentName, AgentDefinition> = { ...cliAgents, ...sourceAgents };\n\n // Ensure global config exists before writing project config (so the\n // `import globalConfig from \"~/.claude-src/config\"` doesn't throw)\n if (cwd !== os.homedir()) {\n await ensureBlankGlobalConfig();\n }\n\n // Recompute configPath from cwd — when detectInstallation() fell back to\n // global, installation.configPath points to ~/.claude-src/config.ts, but\n // writeScopedConfigs uses it as the project config path.\n const configPath = path.join(cwd, CLAUDE_SRC_DIR, STANDARD_FILES.CONFIG_TS);\n\n // Determine whether a project installation already exists:\n // If detectInstallation() found a project config, projectDir differs from homedir.\n // If it fell back to global, projectDir === homedir (no project installation).\n const projectInstallationExists =\n path.resolve(installation.projectDir) !== path.resolve(os.homedir());\n\n await writeScopedConfigs(\n mergeResult.config,\n sourceResult.matrix,\n agents,\n cwd,\n configPath,\n projectInstallationExists,\n );\n } catch (error) {\n this.warn(`Could not update config: ${getErrorMessage(error)}`);\n }\n\n this.log(STATUS_MESSAGES.RECOMPILING_AGENTS);\n try {\n const recompileSkills = await discoverAllPluginSkills(cwd);\n\n // Build scope map so recompileAgents routes agents to the correct directory:\n // global agents -> ~/.claude/agents/, project agents -> <cwd>/.claude/agents/\n const agentScopeMap = new Map(result.agentConfigs.map((a) => [a.name, a.scope] as const));\n const outputDir = path.join(cwd, CLAUDE_DIR, \"agents\");\n\n const recompileResult = await recompileAgents({\n pluginDir: cwd,\n sourcePath,\n skills: recompileSkills,\n projectDir: cwd,\n outputDir,\n installMode: deriveInstallMode(result.skills),\n agentScopeMap,\n });\n\n if (recompileResult.failed.length > 0) {\n this.log(\n `✓ Recompiled ${recompileResult.compiled.length} agents (${recompileResult.failed.length} failed)\\n`,\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} agents\\n`);\n } else {\n this.log(\"✓ No agents to recompile\\n\");\n }\n } catch (error) {\n this.warn(`Agent recompilation failed: ${getErrorMessage(error)}`);\n this.log(`You can manually recompile with '${CLI_BIN_NAME} compile'.\\n`);\n }\n\n const summaryParts = [`${addedSkills.length} added`, `${removedSkills.length} removed`];\n if (hasSourceChanges) {\n summaryParts.push(`${sourceChanges.size} source${sourceChanges.size > 1 ? \"s\" : \"\"} changed`);\n }\n if (hasScopeChanges || hasAgentScopeChanges) {\n const totalScopeChanges = scopeChanges.size + agentScopeChanges.size;\n summaryParts.push(`${totalScopeChanges} scope${totalScopeChanges > 1 ? \"s\" : \"\"} changed`);\n }\n this.log(`\\n\\u2713 Plugin updated! (${summaryParts.join(\", \")})\\n`);\n }\n}\n"],"mappings":"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","names":["result"]}
1
+ {"version":3,"sources":["../../src/cli/commands/edit.tsx"],"sourcesContent":["import os from \"os\";\nimport path from \"path\";\n\nimport { Flags } from \"@oclif/core\";\nimport { render } from \"ink\";\n\nimport { BaseCommand } from \"../base-command.js\";\nimport { Wizard, type WizardResultV2 } from \"../components/wizard/wizard.js\";\nimport {\n CLAUDE_DIR,\n CLAUDE_SRC_DIR,\n CLI_BIN_NAME,\n GLOBAL_INSTALL_ROOT,\n PROJECT_ROOT,\n SOURCE_DISPLAY_NAMES,\n STANDARD_FILES,\n} from \"../consts.js\";\nimport { getAgentDefinitions, recompileAgents } from \"../lib/agents/index.js\";\nimport { loadProjectConfig } from \"../lib/configuration/index.js\";\nimport { ensureBlankGlobalConfig } from \"../lib/configuration/config-writer.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport {\n detectInstallation,\n buildAndMergeConfig,\n writeScopedConfigs,\n detectMigrations,\n executeMigration,\n deriveInstallMode,\n} from \"../lib/installation/index.js\";\nimport { loadAllAgents, loadSkillsMatrixFromSource } from \"../lib/loading/index.js\";\nimport { matrix, getSkillById } from \"../lib/matrix/matrix-provider\";\nimport { discoverAllPluginSkills } from \"../lib/plugins/index.js\";\nimport { deleteLocalSkill, migrateLocalSkillScope } from \"../lib/skills/index.js\";\nimport type { AgentDefinition, AgentName, SkillId } from \"../types/index.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { remove } from \"../utils/fs.js\";\nimport {\n claudePluginInstall,\n claudePluginUninstall,\n claudePluginMarketplaceExists,\n claudePluginMarketplaceAdd,\n} from \"../utils/exec.js\";\nimport {\n enableBuffering,\n drainBuffer,\n disableBuffering,\n pushBufferMessage,\n type StartupMessage,\n} from \"../utils/logger.js\";\nimport { ERROR_MESSAGES, INFO_MESSAGES, STATUS_MESSAGES } from \"../utils/messages.js\";\n\nfunction formatSourceDisplayName(sourceName: string): string {\n return SOURCE_DISPLAY_NAMES[sourceName] ?? sourceName;\n}\n\nexport default class Edit extends BaseCommand {\n static summary = \"Edit skills in the plugin\";\n static description = \"Modify the currently installed skills via interactive wizard\";\n\n static examples = [\n {\n description: \"Open the edit wizard\",\n command: \"<%= config.bin %> <%= command.id %>\",\n },\n {\n description: \"Edit with a custom source\",\n command: \"<%= config.bin %> <%= command.id %> --source github:org/marketplace\",\n },\n {\n description: \"Force refresh skills from remote\",\n command: \"<%= config.bin %> <%= command.id %> --refresh\",\n },\n ];\n\n static flags = {\n ...BaseCommand.baseFlags,\n refresh: Flags.boolean({\n description: \"Force refresh from remote sources\",\n default: false,\n }),\n \"agent-source\": Flags.string({\n description: \"Remote agent partials source (default: local CLI)\",\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Edit);\n const cwd = process.cwd();\n\n const installation = await detectInstallation();\n\n if (!installation) {\n this.error(ERROR_MESSAGES.NO_INSTALLATION, {\n exit: EXIT_CODES.ERROR,\n });\n }\n\n // Use installation.projectDir for reads (loading config, discovering installed skills).\n // Use cwd for writes (config saves, plugin installs, scope migrations, recompilation output)\n // and for the locked-items check (determining whether global items are read-only).\n const projectDir = installation.projectDir;\n\n enableBuffering();\n\n let sourceResult;\n let startupMessages: StartupMessage[] = [];\n try {\n sourceResult = await loadSkillsMatrixFromSource({\n sourceFlag: flags.source,\n projectDir,\n forceRefresh: flags.refresh,\n });\n\n const sourceInfo = sourceResult.isLocal ? \"local\" : sourceResult.sourceConfig.sourceOrigin;\n pushBufferMessage(\n \"info\",\n `Loaded ${Object.keys(matrix.skills).length} skills (${sourceInfo})`,\n );\n } catch (error) {\n disableBuffering();\n this.handleError(error);\n }\n\n const projectConfig = await loadProjectConfig(projectDir);\n\n let currentSkillIds: SkillId[];\n try {\n const discoveredSkills = await discoverAllPluginSkills(projectDir);\n // Boundary cast: discoverAllPluginSkills keys are skill IDs from frontmatter\n const pluginSkillIds = Object.keys(discoveredSkills) as SkillId[];\n\n // Merge plugin-discovered skills with config skills (catches local skills and\n // global-scoped plugins that discoverAllPluginSkills doesn't find).\n const configSkillIds = projectConfig?.config?.skills?.map((s) => s.id) ?? [];\n const mergedIds = new Set<SkillId>([...pluginSkillIds, ...configSkillIds]);\n currentSkillIds = [...mergedIds];\n\n pushBufferMessage(\"info\", `Found ${currentSkillIds.length} installed skills`);\n } catch (error) {\n disableBuffering();\n this.handleError(error);\n }\n\n startupMessages = drainBuffer();\n disableBuffering();\n\n let wizardResult: WizardResultV2 | null = null;\n\n // D9: In project context, existing global items are read-only (locked).\n // When editing from ~/ (global context), nothing is locked.\n // Uses cwd (not projectDir) so that global items are correctly locked\n // even when detectInstallation() fell back to the global installation.\n const isGlobalDir = cwd === GLOBAL_INSTALL_ROOT;\n const lockedSkillIds = isGlobalDir\n ? undefined\n : projectConfig?.config?.skills?.filter((s) => s.scope === \"global\").map((s) => s.id);\n const lockedAgentNames = isGlobalDir\n ? undefined\n : projectConfig?.config?.agents?.filter((a) => a.scope === \"global\").map((a) => a.name);\n\n const { waitUntilExit } = render(\n <Wizard\n version={this.config.version}\n initialStep=\"build\"\n initialDomains={projectConfig?.config?.domains}\n initialAgents={projectConfig?.config?.selectedAgents}\n installedSkillIds={currentSkillIds}\n installedSkillConfigs={projectConfig?.config?.skills}\n lockedSkillIds={lockedSkillIds}\n installedAgentConfigs={projectConfig?.config?.agents}\n lockedAgentNames={lockedAgentNames}\n projectDir={projectDir}\n startupMessages={startupMessages}\n onComplete={(result) => {\n wizardResult = result;\n }}\n onCancel={() => {\n this.log(\"\\nEdit cancelled\");\n }}\n />,\n );\n\n await waitUntilExit();\n\n // TypeScript can't track that onComplete callback mutates wizardResult before waitUntilExit resolves\n const result = wizardResult as WizardResultV2 | null;\n\n if (!result || result.cancelled) {\n this.error(\"Cancelled\", { exit: EXIT_CODES.CANCELLED });\n }\n\n if (result.validation.errors.length > 0) {\n for (const err of result.validation.errors) {\n this.warn(err.message);\n }\n }\n\n const newSkillIds = result.skills.map((s) => s.id);\n const addedSkills = newSkillIds.filter((id) => !currentSkillIds.includes(id));\n const removedSkills = currentSkillIds.filter((id) => !newSkillIds.includes(id));\n\n const sourceChanges = new Map<SkillId, { from: string; to: string }>();\n const scopeChanges = new Map<\n SkillId,\n { from: \"project\" | \"global\"; to: \"project\" | \"global\" }\n >();\n if (projectConfig?.config?.skills) {\n for (const newSkill of result.skills) {\n const oldSkill = projectConfig.config.skills.find((s) => s.id === newSkill.id);\n if (oldSkill && oldSkill.source !== newSkill.source) {\n sourceChanges.set(newSkill.id, {\n from: oldSkill.source,\n to: newSkill.source,\n });\n }\n if (oldSkill && oldSkill.scope !== newSkill.scope) {\n scopeChanges.set(newSkill.id, {\n from: oldSkill.scope,\n to: newSkill.scope,\n });\n }\n }\n }\n\n const agentScopeChanges = new Map<\n AgentName,\n { from: \"project\" | \"global\"; to: \"project\" | \"global\" }\n >();\n if (projectConfig?.config?.agents) {\n for (const newAgent of result.agentConfigs) {\n const oldAgent = projectConfig.config.agents.find((a) => a.name === newAgent.name);\n if (oldAgent && oldAgent.scope !== newAgent.scope) {\n agentScopeChanges.set(newAgent.name, {\n from: oldAgent.scope,\n to: newAgent.scope,\n });\n }\n }\n }\n\n const hasSourceChanges = sourceChanges.size > 0;\n const hasScopeChanges = scopeChanges.size > 0;\n const hasAgentScopeChanges = agentScopeChanges.size > 0;\n const hasSkillChanges = addedSkills.length > 0 || removedSkills.length > 0;\n\n if (!hasSkillChanges && !hasSourceChanges && !hasScopeChanges && !hasAgentScopeChanges) {\n this.log(INFO_MESSAGES.NO_CHANGES_MADE);\n this.log(\"Plugin unchanged\\n\");\n return;\n }\n\n this.log(\"\\nChanges:\");\n for (const skillId of addedSkills) {\n this.log(` + ${getSkillById(skillId).displayName}`);\n }\n for (const skillId of removedSkills) {\n const skill = matrix.skills[skillId];\n this.log(` - ${skill?.displayName ?? skillId}`);\n }\n for (const [skillId, change] of sourceChanges) {\n const fromLabel = formatSourceDisplayName(change.from);\n const toLabel = formatSourceDisplayName(change.to);\n this.log(` ~ ${skillId} (${fromLabel} \\u2192 ${toLabel})`);\n }\n for (const [skillId, change] of scopeChanges) {\n const fromLabel = change.from === \"global\" ? \"[G]\" : \"[P]\";\n const toLabel = change.to === \"global\" ? \"[G]\" : \"[P]\";\n this.log(` ~ ${skillId} (${fromLabel} \\u2192 ${toLabel})`);\n }\n for (const [agentName, change] of agentScopeChanges) {\n const fromLabel = change.from === \"global\" ? \"[G]\" : \"[P]\";\n const toLabel = change.to === \"global\" ? \"[G]\" : \"[P]\";\n this.log(` ~ ${agentName} (${fromLabel} \\u2192 ${toLabel})`);\n }\n this.log(\"\");\n\n // Handle per-skill mode migrations (local <-> plugin)\n const oldSkills = projectConfig?.config?.skills ?? [];\n const migrationPlan = detectMigrations(oldSkills, result.skills);\n const hasMigrations = migrationPlan.toLocal.length > 0 || migrationPlan.toPlugin.length > 0;\n\n if (hasMigrations) {\n if (migrationPlan.toLocal.length > 0) {\n this.log(`Switching ${migrationPlan.toLocal.length} skill(s) to local:`);\n for (const migration of migrationPlan.toLocal) {\n this.log(` - ${migration.id}`);\n }\n }\n if (migrationPlan.toPlugin.length > 0) {\n this.log(`Switching ${migrationPlan.toPlugin.length} skill(s) to plugin:`);\n for (const migration of migrationPlan.toPlugin) {\n this.log(` - ${migration.id}`);\n }\n }\n\n const migrationResult = await executeMigration(migrationPlan, cwd, sourceResult);\n\n for (const warning of migrationResult.warnings) {\n this.warn(warning);\n }\n }\n\n const migratedSkillIds = new Set([\n ...migrationPlan.toLocal.map((m) => m.id),\n ...migrationPlan.toPlugin.map((m) => m.id),\n ]);\n\n // Handle scope migrations (P→G or G→P) for local-mode skills\n for (const [skillId, change] of scopeChanges) {\n const skillConfig = result.skills.find((s) => s.id === skillId);\n if (skillConfig?.source === \"local\") {\n await migrateLocalSkillScope(skillId, change.from, cwd);\n } else if (sourceResult.marketplace && skillConfig) {\n // Plugin-mode scope change: uninstall from old scope, install to new scope\n const oldPluginScope = change.from === \"global\" ? \"user\" : \"project\";\n const newPluginScope = change.to === \"global\" ? \"user\" : \"project\";\n try {\n await claudePluginUninstall(skillId, oldPluginScope, cwd);\n const pluginRef = `${skillId}@${sourceResult.marketplace}`;\n await claudePluginInstall(pluginRef, newPluginScope, cwd);\n } catch (error) {\n this.warn(`Failed to migrate plugin scope for ${skillId}: ${getErrorMessage(error)}`);\n }\n }\n }\n\n // Handle remaining non-migration source changes (e.g., marketplace A -> marketplace B)\n for (const [skillId, change] of sourceChanges) {\n // Skip skills already handled by mode migration\n if (migratedSkillIds.has(skillId)) {\n continue;\n }\n if (change.from === \"local\") {\n const oldSkill = projectConfig?.config?.skills?.find((s) => s.id === skillId);\n const deleteDir = oldSkill?.scope === \"global\" ? os.homedir() : cwd;\n await deleteLocalSkill(deleteDir, skillId);\n }\n }\n\n if (sourceResult.marketplace) {\n const marketplaceExists = await claudePluginMarketplaceExists(sourceResult.marketplace);\n if (!marketplaceExists) {\n this.log(`Registering marketplace \"${sourceResult.marketplace}\"...`);\n const marketplaceSource = sourceResult.sourceConfig.source.replace(/^github:/, \"\");\n await claudePluginMarketplaceAdd(marketplaceSource);\n this.log(`Registered marketplace: ${sourceResult.marketplace}`);\n }\n\n for (const skillId of addedSkills) {\n // Find the skill config to get its scope\n const skillConfig = result.skills.find((s) => s.id === skillId);\n if (!skillConfig || skillConfig.source === \"local\") continue;\n\n const pluginRef = `${skillId}@${sourceResult.marketplace}`;\n const pluginScope = skillConfig.scope === \"global\" ? \"user\" : \"project\";\n this.log(`Installing plugin: ${pluginRef}...`);\n try {\n await claudePluginInstall(pluginRef, pluginScope, cwd);\n } catch (error) {\n this.warn(`Failed to install plugin ${pluginRef}: ${getErrorMessage(error)}`);\n }\n }\n for (const skillId of removedSkills) {\n // For removed skills, use old config to determine scope\n const oldSkill = projectConfig?.config?.skills?.find((s) => s.id === skillId);\n const pluginScope = oldSkill?.scope === \"global\" ? \"user\" : \"project\";\n this.log(`Uninstalling plugin: ${skillId}...`);\n try {\n await claudePluginUninstall(skillId, pluginScope, cwd);\n } catch (error) {\n this.warn(`Failed to uninstall plugin ${skillId}: ${getErrorMessage(error)}`);\n }\n }\n }\n\n // Load agent definitions first — needed for both config-types.ts and recompilation\n let sourcePath: string;\n this.log(\n flags[\"agent-source\"]\n ? STATUS_MESSAGES.FETCHING_AGENT_PARTIALS\n : STATUS_MESSAGES.LOADING_AGENT_PARTIALS,\n );\n try {\n const agentDefs = await getAgentDefinitions(flags[\"agent-source\"], {\n forceRefresh: flags.refresh,\n });\n sourcePath = agentDefs.sourcePath;\n this.log(flags[\"agent-source\"] ? \"✓ Agent partials fetched\\n\" : \"✓ Agent partials loaded\\n\");\n } catch (error) {\n this.handleError(error);\n }\n\n // Persist wizard result to config.ts and config-types.ts (split by scope when in project context)\n try {\n const mergeResult = await buildAndMergeConfig(result, sourceResult, cwd, flags.source);\n\n // Load full agent definitions for config-types.ts generation\n const cliAgents = await loadAllAgents(PROJECT_ROOT);\n const sourceAgents = await loadAllAgents(sourcePath);\n const agents: Record<AgentName, AgentDefinition> = { ...cliAgents, ...sourceAgents };\n\n // Ensure global config exists before writing project config (so the\n // `import globalConfig from \"~/.claude-src/config\"` doesn't throw)\n if (cwd !== os.homedir()) {\n await ensureBlankGlobalConfig();\n }\n\n // Recompute configPath from cwd — when detectInstallation() fell back to\n // global, installation.configPath points to ~/.claude-src/config.ts, but\n // writeScopedConfigs uses it as the project config path.\n const configPath = path.join(cwd, CLAUDE_SRC_DIR, STANDARD_FILES.CONFIG_TS);\n\n // Determine whether a project installation already exists:\n // If detectInstallation() found a project config, projectDir differs from homedir.\n // If it fell back to global, projectDir === homedir (no project installation).\n const projectInstallationExists =\n path.resolve(installation.projectDir) !== path.resolve(os.homedir());\n\n await writeScopedConfigs(\n mergeResult.config,\n sourceResult.matrix,\n agents,\n cwd,\n configPath,\n projectInstallationExists,\n );\n } catch (error) {\n this.warn(`Could not update config: ${getErrorMessage(error)}`);\n }\n\n this.log(STATUS_MESSAGES.RECOMPILING_AGENTS);\n try {\n const recompileSkills = await discoverAllPluginSkills(cwd);\n\n // Build scope map so recompileAgents routes agents to the correct directory:\n // global agents -> ~/.claude/agents/, project agents -> <cwd>/.claude/agents/\n const agentScopeMap = new Map(result.agentConfigs.map((a) => [a.name, a.scope] as const));\n const outputDir = path.join(cwd, CLAUDE_DIR, \"agents\");\n\n const recompileResult = await recompileAgents({\n pluginDir: cwd,\n sourcePath,\n skills: recompileSkills,\n projectDir: cwd,\n outputDir,\n installMode: deriveInstallMode(result.skills),\n agentScopeMap,\n });\n\n if (recompileResult.failed.length > 0) {\n this.log(\n `✓ Recompiled ${recompileResult.compiled.length} agents (${recompileResult.failed.length} failed)\\n`,\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} agents\\n`);\n } else {\n this.log(\"✓ No agents to recompile\\n\");\n }\n } catch (error) {\n this.warn(`Agent recompilation failed: ${getErrorMessage(error)}`);\n this.log(`You can manually recompile with '${CLI_BIN_NAME} compile'.\\n`);\n }\n\n // Clean up old agent .md files after scope changes.\n // Recompilation wrote the new file to the correct scope directory;\n // now delete the stale copy from the old scope directory.\n for (const [agentName, change] of agentScopeChanges) {\n const oldBaseDir = change.from === \"global\" ? os.homedir() : cwd;\n const oldAgentPath = path.join(oldBaseDir, CLAUDE_DIR, \"agents\", `${agentName}.md`);\n try {\n await remove(oldAgentPath);\n } catch (error) {\n this.warn(`Could not remove old agent file ${oldAgentPath}: ${getErrorMessage(error)}`);\n }\n }\n\n const summaryParts = [`${addedSkills.length} added`, `${removedSkills.length} removed`];\n if (hasSourceChanges) {\n summaryParts.push(`${sourceChanges.size} source${sourceChanges.size > 1 ? \"s\" : \"\"} changed`);\n }\n if (hasScopeChanges || hasAgentScopeChanges) {\n const totalScopeChanges = scopeChanges.size + agentScopeChanges.size;\n summaryParts.push(`${totalScopeChanges} scope${totalScopeChanges > 1 ? \"s\" : \"\"} changed`);\n }\n this.log(`\\n\\u2713 Plugin updated! (${summaryParts.join(\", \")})\\n`);\n }\n}\n"],"mappings":"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","names":["result"]}
@@ -5,16 +5,16 @@ import {
5
5
  loadSkillsMatrixFromSource,
6
6
  resolveSource,
7
7
  saveSourceToProjectConfig
8
- } from "../chunk-WS3TL2AO.js";
9
- import "../chunk-I534EWJQ.js";
8
+ } from "../chunk-OIHZ2YH3.js";
9
+ import "../chunk-IFCASC6R.js";
10
10
  import {
11
11
  matrix,
12
12
  typedKeys
13
- } from "../chunk-JWMYAJHD.js";
13
+ } from "../chunk-FSK4TQX7.js";
14
14
  import {
15
15
  BaseCommand,
16
16
  EXIT_CODES
17
- } from "../chunk-XYZ7B5BY.js";
17
+ } from "../chunk-7LBYURQR.js";
18
18
  import {
19
19
  copy,
20
20
  directoryExists,
@@ -22,8 +22,8 @@ import {
22
22
  fileExists,
23
23
  listDirectories,
24
24
  writeFile
25
- } from "../chunk-WN2TUP4M.js";
26
- import "../chunk-Q4PJSAMP.js";
25
+ } from "../chunk-XYPAOBBV.js";
26
+ import "../chunk-32HX6UYI.js";
27
27
  import {
28
28
  CLAUDE_SRC_DIR,
29
29
  DEFAULT_BRANDING,
@@ -32,7 +32,7 @@ import {
32
32
  PROJECT_ROOT,
33
33
  STANDARD_FILES
34
34
  } from "../chunk-FMYAYX6W.js";
35
- import "../chunk-7XUKTYVD.js";
35
+ import "../chunk-EO6KJI5D.js";
36
36
  import {
37
37
  init_esm_shims
38
38
  } from "../chunk-DHET7RCE.js";
@@ -8,13 +8,13 @@ import {
8
8
  computeFileHash,
9
9
  fetchFromSource,
10
10
  getCurrentDate
11
- } from "../../chunk-WS3TL2AO.js";
12
- import "../../chunk-I534EWJQ.js";
13
- import "../../chunk-JWMYAJHD.js";
11
+ } from "../../chunk-OIHZ2YH3.js";
12
+ import "../../chunk-IFCASC6R.js";
13
+ import "../../chunk-FSK4TQX7.js";
14
14
  import {
15
15
  BaseCommand,
16
16
  EXIT_CODES
17
- } from "../../chunk-XYZ7B5BY.js";
17
+ } from "../../chunk-7LBYURQR.js";
18
18
  import {
19
19
  copy,
20
20
  directoryExists,
@@ -25,8 +25,8 @@ import {
25
25
  listDirectories,
26
26
  readFile,
27
27
  writeFile
28
- } from "../../chunk-WN2TUP4M.js";
29
- import "../../chunk-Q4PJSAMP.js";
28
+ } from "../../chunk-XYPAOBBV.js";
29
+ import "../../chunk-32HX6UYI.js";
30
30
  import {
31
31
  DEFAULT_SKILLS_SUBDIR,
32
32
  GITHUB_SOURCE,
@@ -34,7 +34,7 @@ import {
34
34
  STANDARD_FILES,
35
35
  YAML_FORMATTING
36
36
  } from "../../chunk-FMYAYX6W.js";
37
- import "../../chunk-7XUKTYVD.js";
37
+ import "../../chunk-EO6KJI5D.js";
38
38
  import {
39
39
  init_esm_shims
40
40
  } from "../../chunk-DHET7RCE.js";
@@ -5,25 +5,25 @@ import {
5
5
  import {
6
6
  discoverLocalSkills,
7
7
  loadSkillsMatrixFromSource
8
- } from "../chunk-WS3TL2AO.js";
9
- import "../chunk-I534EWJQ.js";
8
+ } from "../chunk-OIHZ2YH3.js";
9
+ import "../chunk-IFCASC6R.js";
10
10
  import {
11
11
  matrix
12
- } from "../chunk-JWMYAJHD.js";
12
+ } from "../chunk-FSK4TQX7.js";
13
13
  import {
14
14
  BaseCommand,
15
15
  EXIT_CODES
16
- } from "../chunk-XYZ7B5BY.js";
16
+ } from "../chunk-7LBYURQR.js";
17
17
  import {
18
18
  fileExists,
19
19
  readFile
20
- } from "../chunk-WN2TUP4M.js";
21
- import "../chunk-Q4PJSAMP.js";
20
+ } from "../chunk-XYPAOBBV.js";
21
+ import "../chunk-32HX6UYI.js";
22
22
  import {
23
23
  CLI_BIN_NAME,
24
24
  STANDARD_FILES
25
25
  } from "../chunk-FMYAYX6W.js";
26
- import "../chunk-7XUKTYVD.js";
26
+ import "../chunk-EO6KJI5D.js";
27
27
  import {
28
28
  init_esm_shims
29
29
  } from "../chunk-DHET7RCE.js";
@@ -4,47 +4,47 @@ import {
4
4
  formatDashboardText,
5
5
  getDashboardData,
6
6
  showDashboard
7
- } from "../chunk-EEZSCHS2.js";
8
- import "../chunk-ODVQXXEO.js";
9
- import "../chunk-CBJTSEI2.js";
10
- import "../chunk-2I5SXGXR.js";
11
- import "../chunk-LO5QGAP2.js";
12
- import "../chunk-WZ5S4LGX.js";
7
+ } from "../chunk-OTMIGYBB.js";
8
+ import "../chunk-B4C2S5LP.js";
9
+ import "../chunk-VDVLM3KB.js";
10
+ import "../chunk-KQDGLEBF.js";
11
+ import "../chunk-YFHVP3VA.js";
12
+ import "../chunk-F4IZ3UAS.js";
13
13
  import "../chunk-V36FRPAU.js";
14
- import "../chunk-7PZFDI46.js";
15
- import "../chunk-EWBNSS5Y.js";
16
- import "../chunk-S6DKM6MJ.js";
17
- import "../chunk-AE2QHAFO.js";
14
+ import "../chunk-N2XGUAJU.js";
15
+ import "../chunk-OOWNDQCG.js";
16
+ import "../chunk-HANGA633.js";
17
+ import "../chunk-KVRR4PEJ.js";
18
+ import "../chunk-PZERKWE2.js";
18
19
  import "../chunk-K77I4XGL.js";
19
- import "../chunk-7PMFIL5L.js";
20
+ import "../chunk-NKLNT7N7.js";
20
21
  import "../chunk-K63OEZW7.js";
21
- import "../chunk-I2SUTL7S.js";
22
+ import "../chunk-D4T3HHE7.js";
22
23
  import "../chunk-7SOPVGDV.js";
23
- import "../chunk-NWW3OJH5.js";
24
- import "../chunk-7NACNRFG.js";
24
+ import "../chunk-A5JSBU65.js";
25
+ import "../chunk-W46L2PXK.js";
25
26
  import "../chunk-P2FHS5IS.js";
26
- import "../chunk-36YW5E7G.js";
27
- import "../chunk-UBNHVBSV.js";
28
- import "../chunk-ERHTXNIF.js";
27
+ import "../chunk-QD3GQ2CH.js";
28
+ import "../chunk-7JQIMEUX.js";
29
+ import "../chunk-RU5XLS5Q.js";
29
30
  import "../chunk-SQ7WINEU.js";
30
- import "../chunk-JNQKCZA3.js";
31
31
  import "../chunk-FFMWFEUH.js";
32
- import "../chunk-IDN2OZJY.js";
32
+ import "../chunk-C22ACAL2.js";
33
33
  import "../chunk-MLXAZODL.js";
34
34
  import "../chunk-KUV24B5M.js";
35
- import "../chunk-PRG7PKZM.js";
35
+ import "../chunk-N34D3ROY.js";
36
36
  import "../chunk-3REKTRAN.js";
37
37
  import "../chunk-U3IGFMCY.js";
38
- import "../chunk-CBYRFAUN.js";
38
+ import "../chunk-HK53FRMU.js";
39
39
  import "../chunk-M76LNKMY.js";
40
- import "../chunk-WS3TL2AO.js";
41
- import "../chunk-I534EWJQ.js";
42
- import "../chunk-JWMYAJHD.js";
43
- import "../chunk-XYZ7B5BY.js";
44
- import "../chunk-WN2TUP4M.js";
45
- import "../chunk-Q4PJSAMP.js";
40
+ import "../chunk-OIHZ2YH3.js";
41
+ import "../chunk-IFCASC6R.js";
42
+ import "../chunk-FSK4TQX7.js";
43
+ import "../chunk-7LBYURQR.js";
44
+ import "../chunk-XYPAOBBV.js";
45
+ import "../chunk-32HX6UYI.js";
46
46
  import "../chunk-FMYAYX6W.js";
47
- import "../chunk-7XUKTYVD.js";
47
+ import "../chunk-EO6KJI5D.js";
48
48
  import "../chunk-DHET7RCE.js";
49
49
  export {
50
50
  Init as default,
@@ -2,19 +2,19 @@
2
2
  import {
3
3
  formatInstallationDisplay,
4
4
  getInstallationInfo
5
- } from "../chunk-WS3TL2AO.js";
6
- import "../chunk-I534EWJQ.js";
7
- import "../chunk-JWMYAJHD.js";
5
+ } from "../chunk-OIHZ2YH3.js";
6
+ import "../chunk-IFCASC6R.js";
7
+ import "../chunk-FSK4TQX7.js";
8
8
  import {
9
9
  BaseCommand
10
- } from "../chunk-XYZ7B5BY.js";
11
- import "../chunk-WN2TUP4M.js";
12
- import "../chunk-Q4PJSAMP.js";
10
+ } from "../chunk-7LBYURQR.js";
11
+ import "../chunk-XYPAOBBV.js";
12
+ import "../chunk-32HX6UYI.js";
13
13
  import {
14
14
  CLI_BIN_NAME,
15
15
  DEFAULT_BRANDING
16
16
  } from "../chunk-FMYAYX6W.js";
17
- import "../chunk-7XUKTYVD.js";
17
+ import "../chunk-EO6KJI5D.js";
18
18
  import {
19
19
  init_esm_shims
20
20
  } from "../chunk-DHET7RCE.js";
@@ -1,31 +1,31 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  getAgentDefinitions
4
- } from "../../chunk-VQV3DSHD.js";
4
+ } from "../../chunk-SJNUTUSJ.js";
5
5
  import {
6
6
  isClaudeCLIAvailable,
7
7
  loadConfigTypesDataInBackground,
8
8
  regenerateConfigTypes,
9
9
  resolveSource
10
- } from "../../chunk-WS3TL2AO.js";
11
- import "../../chunk-I534EWJQ.js";
12
- import "../../chunk-JWMYAJHD.js";
10
+ } from "../../chunk-OIHZ2YH3.js";
11
+ import "../../chunk-IFCASC6R.js";
12
+ import "../../chunk-FSK4TQX7.js";
13
13
  import {
14
14
  BaseCommand,
15
15
  EXIT_CODES
16
- } from "../../chunk-XYZ7B5BY.js";
16
+ } from "../../chunk-7LBYURQR.js";
17
17
  import {
18
18
  fileExists,
19
19
  getErrorMessage,
20
20
  readFile
21
- } from "../../chunk-WN2TUP4M.js";
22
- import "../../chunk-Q4PJSAMP.js";
21
+ } from "../../chunk-XYPAOBBV.js";
22
+ import "../../chunk-32HX6UYI.js";
23
23
  import {
24
24
  CLAUDE_DIR,
25
25
  CLI_COLORS,
26
26
  STANDARD_FILES
27
27
  } from "../../chunk-FMYAYX6W.js";
28
- import "../../chunk-7XUKTYVD.js";
28
+ import "../../chunk-EO6KJI5D.js";
29
29
  import {
30
30
  init_esm_shims
31
31
  } from "../../chunk-DHET7RCE.js";
@@ -2,31 +2,31 @@
2
2
  import {
3
3
  generateSkillCategoriesTs,
4
4
  generateSkillRulesTs
5
- } from "../../chunk-O5CPXIC4.js";
5
+ } from "../../chunk-Q755X6QF.js";
6
6
  import {
7
7
  generateMarketplace,
8
8
  writeMarketplace
9
- } from "../../chunk-KPRCP3MZ.js";
9
+ } from "../../chunk-U2KFFRRX.js";
10
10
  import {
11
11
  LOCAL_DEFAULTS,
12
12
  compileAllSkillPlugins,
13
13
  generateConfigSource,
14
14
  loadConfigTypesDataInBackground,
15
15
  regenerateConfigTypes
16
- } from "../../chunk-WS3TL2AO.js";
17
- import "../../chunk-I534EWJQ.js";
18
- import "../../chunk-JWMYAJHD.js";
16
+ } from "../../chunk-OIHZ2YH3.js";
17
+ import "../../chunk-IFCASC6R.js";
18
+ import "../../chunk-FSK4TQX7.js";
19
19
  import {
20
20
  BaseCommand,
21
21
  EXIT_CODES
22
- } from "../../chunk-XYZ7B5BY.js";
22
+ } from "../../chunk-7LBYURQR.js";
23
23
  import {
24
24
  directoryExists,
25
25
  ensureDir,
26
26
  getErrorMessage,
27
27
  writeFile
28
- } from "../../chunk-WN2TUP4M.js";
29
- import "../../chunk-Q4PJSAMP.js";
28
+ } from "../../chunk-XYPAOBBV.js";
29
+ import "../../chunk-32HX6UYI.js";
30
30
  import {
31
31
  CLAUDE_SRC_DIR,
32
32
  CLI_BIN_NAME,
@@ -38,7 +38,7 @@ import {
38
38
  STACKS_FILE_PATH,
39
39
  STANDARD_FILES
40
40
  } from "../../chunk-FMYAYX6W.js";
41
- import "../../chunk-7XUKTYVD.js";
41
+ import "../../chunk-EO6KJI5D.js";
42
42
  import {
43
43
  init_esm_shims
44
44
  } from "../../chunk-DHET7RCE.js";
@@ -7,15 +7,15 @@ import {
7
7
  generateSkillRulesTs,
8
8
  toTitleCase,
9
9
  validateSkillName
10
- } from "../../chunk-O5CPXIC4.js";
11
- import "../../chunk-WS3TL2AO.js";
12
- import "../../chunk-I534EWJQ.js";
13
- import "../../chunk-JWMYAJHD.js";
14
- import "../../chunk-XYZ7B5BY.js";
15
- import "../../chunk-WN2TUP4M.js";
16
- import "../../chunk-Q4PJSAMP.js";
10
+ } from "../../chunk-Q755X6QF.js";
11
+ import "../../chunk-OIHZ2YH3.js";
12
+ import "../../chunk-IFCASC6R.js";
13
+ import "../../chunk-FSK4TQX7.js";
14
+ import "../../chunk-7LBYURQR.js";
15
+ import "../../chunk-XYPAOBBV.js";
16
+ import "../../chunk-32HX6UYI.js";
17
17
  import "../../chunk-FMYAYX6W.js";
18
- import "../../chunk-7XUKTYVD.js";
18
+ import "../../chunk-EO6KJI5D.js";
19
19
  import "../../chunk-DHET7RCE.js";
20
20
  export {
21
21
  NewSkill as default,
@@ -3,25 +3,25 @@ import {
3
3
  compareLocalSkillsWithSource,
4
4
  detectInstallation,
5
5
  loadSkillsMatrixFromSource
6
- } from "../chunk-WS3TL2AO.js";
7
- import "../chunk-I534EWJQ.js";
6
+ } from "../chunk-OIHZ2YH3.js";
7
+ import "../chunk-IFCASC6R.js";
8
8
  import {
9
9
  typedEntries
10
- } from "../chunk-JWMYAJHD.js";
10
+ } from "../chunk-FSK4TQX7.js";
11
11
  import {
12
12
  BaseCommand,
13
13
  EXIT_CODES
14
- } from "../chunk-XYZ7B5BY.js";
14
+ } from "../chunk-7LBYURQR.js";
15
15
  import {
16
16
  fileExists,
17
17
  getErrorMessage
18
- } from "../chunk-WN2TUP4M.js";
19
- import "../chunk-Q4PJSAMP.js";
18
+ } from "../chunk-XYPAOBBV.js";
19
+ import "../chunk-32HX6UYI.js";
20
20
  import {
21
21
  CLI_BIN_NAME,
22
22
  LOCAL_SKILLS_PATH
23
23
  } from "../chunk-FMYAYX6W.js";
24
- import "../chunk-7XUKTYVD.js";
24
+ import "../chunk-EO6KJI5D.js";
25
25
  import {
26
26
  init_esm_shims
27
27
  } from "../chunk-DHET7RCE.js";
@@ -30,6 +30,7 @@ import {
30
30
  init_esm_shims();
31
31
  import { Flags } from "@oclif/core";
32
32
  import { printTable } from "@oclif/table";
33
+ import os from "os";
33
34
  import path from "path";
34
35
  import { countBy } from "remeda";
35
36
  function calculateSummary(results) {
@@ -75,8 +76,12 @@ var Outdated = class _Outdated extends BaseCommand {
75
76
  const installation = await detectInstallation();
76
77
  const projectDir = installation?.projectDir ?? process.cwd();
77
78
  try {
78
- const localSkillsPath = path.join(projectDir, LOCAL_SKILLS_PATH);
79
- if (!await fileExists(localSkillsPath)) {
79
+ const projectLocalPath = path.join(projectDir, LOCAL_SKILLS_PATH);
80
+ const homeDir = os.homedir();
81
+ const globalLocalPath = path.join(homeDir, LOCAL_SKILLS_PATH);
82
+ const hasProject = await fileExists(projectLocalPath);
83
+ const hasGlobal = projectDir !== homeDir && await fileExists(globalLocalPath);
84
+ if (!hasProject && !hasGlobal) {
80
85
  if (flags.json) {
81
86
  this.log(
82
87
  JSON.stringify({
@@ -108,7 +113,10 @@ var Outdated = class _Outdated extends BaseCommand {
108
113
  sourceSkills[skillId] = { path: skill.path };
109
114
  }
110
115
  }
111
- const results = await compareLocalSkillsWithSource(projectDir, sourcePath, sourceSkills);
116
+ const projectResults = hasProject ? await compareLocalSkillsWithSource(projectDir, sourcePath, sourceSkills) : [];
117
+ const globalResults = hasGlobal ? await compareLocalSkillsWithSource(homeDir, sourcePath, sourceSkills) : [];
118
+ const seenIds = new Set(projectResults.map((r) => r.id));
119
+ const results = [...projectResults, ...globalResults.filter((r) => !seenIds.has(r.id))];
112
120
  const summary = calculateSummary(results);
113
121
  if (flags.json) {
114
122
  this.log(
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/commands/outdated.ts"],"sourcesContent":["import { Flags } from \"@oclif/core\";\nimport { printTable } from \"@oclif/table\";\nimport path from \"path\";\nimport { countBy } from \"remeda\";\n\nimport { BaseCommand } from \"../base-command.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { loadSkillsMatrixFromSource } from \"../lib/loading/index.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport { detectInstallation } from \"../lib/installation/index.js\";\nimport { compareLocalSkillsWithSource, type SkillComparisonResult } from \"../lib/skills/index.js\";\nimport { fileExists } from \"../utils/fs.js\";\nimport { CLI_BIN_NAME, LOCAL_SKILLS_PATH } from \"../consts.js\";\nimport { typedEntries } from \"../utils/typed-object.js\";\n\ntype ComparisonSummary = {\n outdated: number;\n current: number;\n localOnly: number;\n};\n\nfunction calculateSummary(results: SkillComparisonResult[]): ComparisonSummary {\n const counts = countBy(results, (r) => r.status);\n return {\n outdated: counts[\"outdated\"] ?? 0,\n current: counts[\"current\"] ?? 0,\n localOnly: counts[\"local-only\"] ?? 0,\n };\n}\n\nfunction formatHash(hash: string | null, isLocal: boolean): string {\n if (hash === null) {\n return isLocal ? \"(local)\" : \"-\";\n }\n return hash;\n}\n\nexport default class Outdated extends BaseCommand {\n static summary = \"Check which local skills are out of date compared to source\";\n static description =\n \"Compare local skills against their source repository to identify outdated skills that need updating\";\n\n static examples = [\n {\n description: \"Check for outdated skills\",\n command: \"<%= config.bin %> <%= command.id %>\",\n },\n {\n description: \"Output results as JSON\",\n command: \"<%= config.bin %> <%= command.id %> --json\",\n },\n {\n description: \"Check against a custom source\",\n command: \"<%= config.bin %> <%= command.id %> --source github:org/marketplace\",\n },\n ];\n\n static flags = {\n ...BaseCommand.baseFlags,\n json: Flags.boolean({\n description: \"Output results as JSON\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Outdated);\n const installation = await detectInstallation();\n const projectDir = installation?.projectDir ?? process.cwd();\n\n try {\n const localSkillsPath = path.join(projectDir, LOCAL_SKILLS_PATH);\n if (!(await fileExists(localSkillsPath))) {\n if (flags.json) {\n this.log(\n JSON.stringify({\n skills: [],\n summary: { outdated: 0, current: 0, localOnly: 0 },\n }),\n );\n } else {\n this.warn(\n `No local skills found. Run \\`${CLI_BIN_NAME} init\\` or \\`${CLI_BIN_NAME} edit\\` first.`,\n );\n }\n return;\n }\n\n if (!flags.json) {\n this.log(\"Loading skills...\");\n }\n\n const { matrix, sourcePath, isLocal } = await loadSkillsMatrixFromSource({\n sourceFlag: flags.source,\n projectDir,\n });\n\n if (!flags.json) {\n this.log(`Loaded from ${isLocal ? \"local\" : \"remote\"}: ${sourcePath}`);\n }\n\n const sourceSkills: Record<string, { path: string }> = {};\n for (const [skillId, skill] of typedEntries(matrix.skills)) {\n if (!skill) continue;\n if (!skill.local) {\n sourceSkills[skillId] = { path: skill.path };\n }\n }\n\n const results = await compareLocalSkillsWithSource(projectDir, sourcePath, sourceSkills);\n const summary = calculateSummary(results);\n\n if (flags.json) {\n this.log(\n JSON.stringify(\n {\n skills: results.map((r) => ({\n id: r.id,\n localHash: r.localHash,\n sourceHash: r.sourceHash,\n status: r.status,\n })),\n summary: {\n outdated: summary.outdated,\n current: summary.current,\n localOnly: summary.localOnly,\n },\n },\n null,\n 2,\n ),\n );\n } else {\n this.log(\"\");\n if (results.length === 0) {\n this.logInfo(\"No local skills found to compare.\");\n } else {\n printTable({\n data: results.map((result) => ({\n skill: result.id,\n localHash: formatHash(result.localHash, true),\n sourceHash: formatHash(result.sourceHash, false),\n status: result.status,\n })),\n columns: [\n { key: \"skill\", name: \"Skill\" },\n { key: \"localHash\", name: \"Local Hash\" },\n { key: \"sourceHash\", name: \"Source Hash\" },\n { key: \"status\", name: \"Status\" },\n ],\n headerOptions: { bold: true },\n });\n\n this.log(\"\");\n\n const parts: string[] = [];\n if (summary.outdated > 0) {\n parts.push(`${summary.outdated} outdated`);\n }\n if (summary.current > 0) {\n parts.push(`${summary.current} current`);\n }\n if (summary.localOnly > 0) {\n parts.push(`${summary.localOnly} local-only`);\n }\n this.log(`Summary: ${parts.join(\", \")}`);\n }\n this.log(\"\");\n }\n\n if (summary.outdated > 0) {\n this.error(\"Some skills are outdated\", { exit: EXIT_CODES.ERROR });\n }\n } catch (error) {\n const message = getErrorMessage(error);\n\n if (flags.json) {\n this.error(JSON.stringify({ error: message }), {\n exit: EXIT_CODES.ERROR,\n });\n } else {\n this.error(`Error: ${message}`, { exit: EXIT_CODES.ERROR });\n }\n }\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/cli/commands/outdated.ts"],"sourcesContent":["import { Flags } from \"@oclif/core\";\nimport { printTable } from \"@oclif/table\";\nimport os from \"os\";\nimport path from \"path\";\nimport { countBy } from \"remeda\";\n\nimport { BaseCommand } from \"../base-command.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { loadSkillsMatrixFromSource } from \"../lib/loading/index.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport { detectInstallation } from \"../lib/installation/index.js\";\nimport { compareLocalSkillsWithSource, type SkillComparisonResult } from \"../lib/skills/index.js\";\nimport { fileExists } from \"../utils/fs.js\";\nimport { CLI_BIN_NAME, LOCAL_SKILLS_PATH } from \"../consts.js\";\nimport { typedEntries } from \"../utils/typed-object.js\";\n\ntype ComparisonSummary = {\n outdated: number;\n current: number;\n localOnly: number;\n};\n\nfunction calculateSummary(results: SkillComparisonResult[]): ComparisonSummary {\n const counts = countBy(results, (r) => r.status);\n return {\n outdated: counts[\"outdated\"] ?? 0,\n current: counts[\"current\"] ?? 0,\n localOnly: counts[\"local-only\"] ?? 0,\n };\n}\n\nfunction formatHash(hash: string | null, isLocal: boolean): string {\n if (hash === null) {\n return isLocal ? \"(local)\" : \"-\";\n }\n return hash;\n}\n\nexport default class Outdated extends BaseCommand {\n static summary = \"Check which local skills are out of date compared to source\";\n static description =\n \"Compare local skills against their source repository to identify outdated skills that need updating\";\n\n static examples = [\n {\n description: \"Check for outdated skills\",\n command: \"<%= config.bin %> <%= command.id %>\",\n },\n {\n description: \"Output results as JSON\",\n command: \"<%= config.bin %> <%= command.id %> --json\",\n },\n {\n description: \"Check against a custom source\",\n command: \"<%= config.bin %> <%= command.id %> --source github:org/marketplace\",\n },\n ];\n\n static flags = {\n ...BaseCommand.baseFlags,\n json: Flags.boolean({\n description: \"Output results as JSON\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Outdated);\n const installation = await detectInstallation();\n const projectDir = installation?.projectDir ?? process.cwd();\n\n try {\n const projectLocalPath = path.join(projectDir, LOCAL_SKILLS_PATH);\n const homeDir = os.homedir();\n const globalLocalPath = path.join(homeDir, LOCAL_SKILLS_PATH);\n const hasProject = await fileExists(projectLocalPath);\n const hasGlobal = projectDir !== homeDir && (await fileExists(globalLocalPath));\n\n if (!hasProject && !hasGlobal) {\n if (flags.json) {\n this.log(\n JSON.stringify({\n skills: [],\n summary: { outdated: 0, current: 0, localOnly: 0 },\n }),\n );\n } else {\n this.warn(\n `No local skills found. Run \\`${CLI_BIN_NAME} init\\` or \\`${CLI_BIN_NAME} edit\\` first.`,\n );\n }\n return;\n }\n\n if (!flags.json) {\n this.log(\"Loading skills...\");\n }\n\n const { matrix, sourcePath, isLocal } = await loadSkillsMatrixFromSource({\n sourceFlag: flags.source,\n projectDir,\n });\n\n if (!flags.json) {\n this.log(`Loaded from ${isLocal ? \"local\" : \"remote\"}: ${sourcePath}`);\n }\n\n const sourceSkills: Record<string, { path: string }> = {};\n for (const [skillId, skill] of typedEntries(matrix.skills)) {\n if (!skill) continue;\n if (!skill.local) {\n sourceSkills[skillId] = { path: skill.path };\n }\n }\n\n // Check both project-scoped and global-scoped local skills\n const projectResults = hasProject\n ? await compareLocalSkillsWithSource(projectDir, sourcePath, sourceSkills)\n : [];\n const globalResults = hasGlobal\n ? await compareLocalSkillsWithSource(homeDir, sourcePath, sourceSkills)\n : [];\n\n // Merge results, project-scoped takes precedence\n const seenIds = new Set(projectResults.map((r) => r.id));\n const results = [...projectResults, ...globalResults.filter((r) => !seenIds.has(r.id))];\n const summary = calculateSummary(results);\n\n if (flags.json) {\n this.log(\n JSON.stringify(\n {\n skills: results.map((r) => ({\n id: r.id,\n localHash: r.localHash,\n sourceHash: r.sourceHash,\n status: r.status,\n })),\n summary: {\n outdated: summary.outdated,\n current: summary.current,\n localOnly: summary.localOnly,\n },\n },\n null,\n 2,\n ),\n );\n } else {\n this.log(\"\");\n if (results.length === 0) {\n this.logInfo(\"No local skills found to compare.\");\n } else {\n printTable({\n data: results.map((result) => ({\n skill: result.id,\n localHash: formatHash(result.localHash, true),\n sourceHash: formatHash(result.sourceHash, false),\n status: result.status,\n })),\n columns: [\n { key: \"skill\", name: \"Skill\" },\n { key: \"localHash\", name: \"Local Hash\" },\n { key: \"sourceHash\", name: \"Source Hash\" },\n { key: \"status\", name: \"Status\" },\n ],\n headerOptions: { bold: true },\n });\n\n this.log(\"\");\n\n const parts: string[] = [];\n if (summary.outdated > 0) {\n parts.push(`${summary.outdated} outdated`);\n }\n if (summary.current > 0) {\n parts.push(`${summary.current} current`);\n }\n if (summary.localOnly > 0) {\n parts.push(`${summary.localOnly} local-only`);\n }\n this.log(`Summary: ${parts.join(\", \")}`);\n }\n this.log(\"\");\n }\n\n if (summary.outdated > 0) {\n this.error(\"Some skills are outdated\", { exit: EXIT_CODES.ERROR });\n }\n } catch (error) {\n const message = getErrorMessage(error);\n\n if (flags.json) {\n this.error(JSON.stringify({ error: message }), {\n exit: EXIT_CODES.ERROR,\n });\n } else {\n this.error(`Error: ${message}`, { exit: EXIT_CODES.ERROR });\n }\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SkillSearch
4
- } from "../chunk-CCSU4R65.js";
4
+ } from "../chunk-MG55NDVG.js";
5
5
  import "../chunk-3REKTRAN.js";
6
6
  import "../chunk-U3IGFMCY.js";
7
- import "../chunk-CBYRFAUN.js";
7
+ import "../chunk-HK53FRMU.js";
8
8
  import {
9
9
  INFO_MESSAGES,
10
10
  STATUS_MESSAGES,
@@ -14,29 +14,29 @@ import {
14
14
  fetchFromSource,
15
15
  loadSkillsMatrixFromSource,
16
16
  resolveAllSources
17
- } from "../chunk-WS3TL2AO.js";
17
+ } from "../chunk-OIHZ2YH3.js";
18
18
  import {
19
19
  parseFrontmatter
20
- } from "../chunk-I534EWJQ.js";
21
- import "../chunk-JWMYAJHD.js";
20
+ } from "../chunk-IFCASC6R.js";
21
+ import "../chunk-FSK4TQX7.js";
22
22
  import {
23
23
  BaseCommand,
24
24
  EXIT_CODES
25
- } from "../chunk-XYZ7B5BY.js";
25
+ } from "../chunk-7LBYURQR.js";
26
26
  import {
27
27
  copy,
28
28
  ensureDir,
29
29
  fileExists,
30
30
  listDirectories,
31
31
  readFile
32
- } from "../chunk-WN2TUP4M.js";
33
- import "../chunk-Q4PJSAMP.js";
32
+ } from "../chunk-XYPAOBBV.js";
33
+ import "../chunk-32HX6UYI.js";
34
34
  import {
35
35
  DEFAULT_SKILLS_SUBDIR,
36
36
  LOCAL_SKILLS_PATH,
37
37
  STANDARD_FILES
38
38
  } from "../chunk-FMYAYX6W.js";
39
- import "../chunk-7XUKTYVD.js";
39
+ import "../chunk-EO6KJI5D.js";
40
40
  import {
41
41
  init_esm_shims
42
42
  } from "../chunk-DHET7RCE.js";