agents-inc 0.168.0 → 0.170.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 (200) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +18 -15
  3. package/dist/{chunk-JIBCVXXL.js → chunk-3G7X2WKI.js} +4 -4
  4. package/dist/{chunk-JOEA52NR.js → chunk-44TE3RKH.js} +46 -2
  5. package/dist/chunk-44TE3RKH.js.map +1 -0
  6. package/dist/{chunk-NU2K5G54.js → chunk-52HDHJ7I.js} +11 -19
  7. package/dist/chunk-52HDHJ7I.js.map +1 -0
  8. package/dist/{chunk-EH2PGPLP.js → chunk-6HNXYYVF.js} +39 -22
  9. package/dist/chunk-6HNXYYVF.js.map +1 -0
  10. package/dist/{chunk-4UKMQUAU.js → chunk-6ZRH5RHC.js} +10 -11
  11. package/dist/chunk-6ZRH5RHC.js.map +1 -0
  12. package/dist/{chunk-5JUQKGCP.js → chunk-7RDMTR64.js} +14 -34
  13. package/dist/chunk-7RDMTR64.js.map +1 -0
  14. package/dist/{chunk-3LZNY46H.js → chunk-BMRUNMPV.js} +4 -4
  15. package/dist/{chunk-VVRI35SK.js → chunk-CLPUWOSA.js} +4 -4
  16. package/dist/{chunk-VVRI35SK.js.map → chunk-CLPUWOSA.js.map} +1 -1
  17. package/dist/{chunk-TW35AEB4.js → chunk-F2BHT5C4.js} +9 -7
  18. package/dist/chunk-F2BHT5C4.js.map +1 -0
  19. package/dist/{chunk-27AVGFXH.js → chunk-F5EBEATU.js} +2 -2
  20. package/dist/{chunk-GE7NUPMI.js → chunk-HED2DAXZ.js} +3 -3
  21. package/dist/{chunk-7PYXS2QU.js → chunk-KOLDW6SF.js} +3 -3
  22. package/dist/{chunk-7PYXS2QU.js.map → chunk-KOLDW6SF.js.map} +1 -1
  23. package/dist/{chunk-C2UISKIM.js → chunk-MQ6CGZNJ.js} +109 -422
  24. package/dist/chunk-MQ6CGZNJ.js.map +1 -0
  25. package/dist/{chunk-P6I72PR3.js → chunk-NCWDK6L7.js} +115 -196
  26. package/dist/chunk-NCWDK6L7.js.map +1 -0
  27. package/dist/{chunk-VRXX4D6K.js → chunk-NEZ4OAOL.js} +1 -1
  28. package/dist/chunk-NEZ4OAOL.js.map +1 -0
  29. package/dist/chunk-NIHUOWE4.js +106 -0
  30. package/dist/chunk-NIHUOWE4.js.map +1 -0
  31. package/dist/{chunk-OI2H6M5I.js → chunk-NQW25DCF.js} +2 -2
  32. package/dist/chunk-NQW25DCF.js.map +1 -0
  33. package/dist/{chunk-ZUGH4MQG.js → chunk-OYJQUA3D.js} +3 -3
  34. package/dist/{chunk-ZUGH4MQG.js.map → chunk-OYJQUA3D.js.map} +1 -1
  35. package/dist/{chunk-AG3ZVM3B.js → chunk-PJWGTNOX.js} +186 -210
  36. package/dist/chunk-PJWGTNOX.js.map +1 -0
  37. package/dist/{chunk-HR7TK2XW.js → chunk-RIPSGNLU.js} +3 -3
  38. package/dist/chunk-RIPSGNLU.js.map +1 -0
  39. package/dist/{chunk-4DRFEYCE.js → chunk-SZYQISA2.js} +7 -7
  40. package/dist/chunk-SZYQISA2.js.map +1 -0
  41. package/dist/{chunk-W6GO2CYX.js → chunk-USVBYQSQ.js} +2 -2
  42. package/dist/{chunk-H4ZKGGTE.js → chunk-V3KTSP3Q.js} +50 -42
  43. package/dist/chunk-V3KTSP3Q.js.map +1 -0
  44. package/dist/{chunk-KTLKR4YY.js → chunk-WTWMGH2C.js} +2 -2
  45. package/dist/commands/build/marketplace.js +23 -22
  46. package/dist/commands/build/marketplace.js.map +1 -1
  47. package/dist/commands/build/plugins.js +8 -9
  48. package/dist/commands/build/plugins.js.map +1 -1
  49. package/dist/commands/compile.js +19 -20
  50. package/dist/commands/compile.js.map +1 -1
  51. package/dist/commands/doctor.js +17 -18
  52. package/dist/commands/doctor.js.map +1 -1
  53. package/dist/commands/edit.js +118 -297
  54. package/dist/commands/edit.js.map +1 -1
  55. package/dist/commands/eject.js +21 -33
  56. package/dist/commands/eject.js.map +1 -1
  57. package/dist/commands/init.js +17 -45
  58. package/dist/commands/list.js +19 -17
  59. package/dist/commands/list.js.map +1 -1
  60. package/dist/commands/new/marketplace.js +11 -11
  61. package/dist/commands/new/marketplace.js.map +1 -1
  62. package/dist/commands/search.js +12 -13
  63. package/dist/commands/search.js.map +1 -1
  64. package/dist/commands/share.js +11 -12
  65. package/dist/commands/share.js.map +1 -1
  66. package/dist/commands/uninstall.js +18 -20
  67. package/dist/commands/uninstall.js.map +1 -1
  68. package/dist/commands/update.js +8 -9
  69. package/dist/commands/update.js.map +1 -1
  70. package/dist/components/common/removal-plan-confirm.js +2 -2
  71. package/dist/components/common/scroll-affordance.js +9 -0
  72. package/dist/components/common/select-list.js +2 -3
  73. package/dist/components/common/skill-agent-summary.js +11 -0
  74. package/dist/components/common/spinner.js +1 -1
  75. package/dist/{chunk-QWFG7Y3R.js → components/common/summary-panel.js} +57 -31
  76. package/dist/components/common/summary-panel.js.map +1 -0
  77. package/dist/config-exports.js +1 -1
  78. package/dist/hooks/init.js +18 -46
  79. package/dist/hooks/init.js.map +1 -1
  80. package/dist/load-agent-defs-YMDWBFDP.js +14 -0
  81. package/dist/recompile-project-agents-SZ76WNTW.js +18 -0
  82. package/dist/{source-loader-FRJTCSDL.js → source-loader-C5SQXZXI.js} +5 -5
  83. package/dist/src/agents/meta/codex-keeper/playbook.md +2 -3
  84. package/package.json +2 -3
  85. package/src/agents/meta/codex-keeper/playbook.md +2 -3
  86. package/src/schemas/project-config.schema.json +1 -1
  87. package/assets/demo.tape +0 -266
  88. package/dist/chunk-23DNVNFP.js +0 -292
  89. package/dist/chunk-23DNVNFP.js.map +0 -1
  90. package/dist/chunk-3DIDV6H3.js +0 -268
  91. package/dist/chunk-3DIDV6H3.js.map +0 -1
  92. package/dist/chunk-4DRFEYCE.js.map +0 -1
  93. package/dist/chunk-4HWOYYY7.js +0 -92
  94. package/dist/chunk-4HWOYYY7.js.map +0 -1
  95. package/dist/chunk-4UKMQUAU.js.map +0 -1
  96. package/dist/chunk-5JUQKGCP.js.map +0 -1
  97. package/dist/chunk-6WGXTB2L.js +0 -28
  98. package/dist/chunk-6WGXTB2L.js.map +0 -1
  99. package/dist/chunk-AG3ZVM3B.js.map +0 -1
  100. package/dist/chunk-C2UISKIM.js.map +0 -1
  101. package/dist/chunk-CMJBKQUH.js +0 -23
  102. package/dist/chunk-CMJBKQUH.js.map +0 -1
  103. package/dist/chunk-DJEO3F2H.js +0 -230
  104. package/dist/chunk-DJEO3F2H.js.map +0 -1
  105. package/dist/chunk-EH2PGPLP.js.map +0 -1
  106. package/dist/chunk-GRL73YPF.js +0 -197
  107. package/dist/chunk-GRL73YPF.js.map +0 -1
  108. package/dist/chunk-H4ZKGGTE.js.map +0 -1
  109. package/dist/chunk-HI6YB7XP.js +0 -59
  110. package/dist/chunk-HI6YB7XP.js.map +0 -1
  111. package/dist/chunk-HL3GYRMR.js +0 -17
  112. package/dist/chunk-HL3GYRMR.js.map +0 -1
  113. package/dist/chunk-HR7TK2XW.js.map +0 -1
  114. package/dist/chunk-JOEA52NR.js.map +0 -1
  115. package/dist/chunk-JPMV4E4E.js +0 -118
  116. package/dist/chunk-JPMV4E4E.js.map +0 -1
  117. package/dist/chunk-JVUN6AOO.js +0 -237
  118. package/dist/chunk-JVUN6AOO.js.map +0 -1
  119. package/dist/chunk-KQ3PDARZ.js +0 -25
  120. package/dist/chunk-KQ3PDARZ.js.map +0 -1
  121. package/dist/chunk-L3W2JWBA.js +0 -168
  122. package/dist/chunk-L3W2JWBA.js.map +0 -1
  123. package/dist/chunk-LFUJCRCT.js +0 -27
  124. package/dist/chunk-LFUJCRCT.js.map +0 -1
  125. package/dist/chunk-NU2K5G54.js.map +0 -1
  126. package/dist/chunk-OI2H6M5I.js.map +0 -1
  127. package/dist/chunk-P6I72PR3.js.map +0 -1
  128. package/dist/chunk-PCFUXQJA.js +0 -317
  129. package/dist/chunk-PCFUXQJA.js.map +0 -1
  130. package/dist/chunk-PLX2FLEQ.js +0 -48
  131. package/dist/chunk-PLX2FLEQ.js.map +0 -1
  132. package/dist/chunk-QWFG7Y3R.js.map +0 -1
  133. package/dist/chunk-SLBL3WIP.js +0 -121
  134. package/dist/chunk-SLBL3WIP.js.map +0 -1
  135. package/dist/chunk-TSIU7DME.js +0 -43
  136. package/dist/chunk-TSIU7DME.js.map +0 -1
  137. package/dist/chunk-TW35AEB4.js.map +0 -1
  138. package/dist/chunk-VRXX4D6K.js.map +0 -1
  139. package/dist/chunk-W5KEYSOL.js +0 -51
  140. package/dist/chunk-W5KEYSOL.js.map +0 -1
  141. package/dist/chunk-WNLF5EDZ.js +0 -1170
  142. package/dist/chunk-WNLF5EDZ.js.map +0 -1
  143. package/dist/chunk-WTJ3AY33.js +0 -31
  144. package/dist/chunk-WTJ3AY33.js.map +0 -1
  145. package/dist/chunk-X6ZZEYO3.js +0 -53
  146. package/dist/chunk-X6ZZEYO3.js.map +0 -1
  147. package/dist/chunk-XQHZPINL.js +0 -89
  148. package/dist/chunk-XQHZPINL.js.map +0 -1
  149. package/dist/chunk-YN3SWF53.js +0 -35
  150. package/dist/chunk-YN3SWF53.js.map +0 -1
  151. package/dist/components/wizard/category-grid.js +0 -13
  152. package/dist/components/wizard/checkbox-grid.js +0 -12
  153. package/dist/components/wizard/domain-selection.js +0 -18
  154. package/dist/components/wizard/run-wizard-session.js +0 -40
  155. package/dist/components/wizard/run-wizard-session.js.map +0 -1
  156. package/dist/components/wizard/scroll-affordance.js +0 -9
  157. package/dist/components/wizard/skill-agent-summary.js +0 -13
  158. package/dist/components/wizard/source-grid.js +0 -16
  159. package/dist/components/wizard/source-grid.js.map +0 -1
  160. package/dist/components/wizard/stack-selection.js +0 -17
  161. package/dist/components/wizard/stack-selection.js.map +0 -1
  162. package/dist/components/wizard/step-agents.js +0 -18
  163. package/dist/components/wizard/step-agents.js.map +0 -1
  164. package/dist/components/wizard/step-build.js +0 -18
  165. package/dist/components/wizard/step-build.js.map +0 -1
  166. package/dist/components/wizard/step-confirm.js +0 -18
  167. package/dist/components/wizard/step-confirm.js.map +0 -1
  168. package/dist/components/wizard/step-sources.js +0 -19
  169. package/dist/components/wizard/step-sources.js.map +0 -1
  170. package/dist/components/wizard/step-stack.js +0 -18
  171. package/dist/components/wizard/step-stack.js.map +0 -1
  172. package/dist/components/wizard/summary-panel.js +0 -17
  173. package/dist/components/wizard/summary-panel.js.map +0 -1
  174. package/dist/components/wizard/toast.js +0 -9
  175. package/dist/components/wizard/toast.js.map +0 -1
  176. package/dist/components/wizard/wizard-layout.js +0 -22
  177. package/dist/components/wizard/wizard-layout.js.map +0 -1
  178. package/dist/components/wizard/wizard-tabs.js +0 -11
  179. package/dist/components/wizard/wizard-tabs.js.map +0 -1
  180. package/dist/components/wizard/wizard.js +0 -39
  181. package/dist/components/wizard/wizard.js.map +0 -1
  182. package/dist/load-agent-defs-5XMVB3MU.js +0 -14
  183. package/dist/load-agent-defs-5XMVB3MU.js.map +0 -1
  184. package/dist/recompile-project-agents-7PQWYQ6B.js +0 -18
  185. package/dist/recompile-project-agents-7PQWYQ6B.js.map +0 -1
  186. package/dist/source-loader-FRJTCSDL.js.map +0 -1
  187. package/dist/stores/wizard-store.js +0 -24
  188. package/dist/stores/wizard-store.js.map +0 -1
  189. /package/assets/{demo.gif → legacy-wizard.gif} +0 -0
  190. /package/dist/{chunk-JIBCVXXL.js.map → chunk-3G7X2WKI.js.map} +0 -0
  191. /package/dist/{chunk-3LZNY46H.js.map → chunk-BMRUNMPV.js.map} +0 -0
  192. /package/dist/{chunk-27AVGFXH.js.map → chunk-F5EBEATU.js.map} +0 -0
  193. /package/dist/{chunk-GE7NUPMI.js.map → chunk-HED2DAXZ.js.map} +0 -0
  194. /package/dist/{chunk-W6GO2CYX.js.map → chunk-USVBYQSQ.js.map} +0 -0
  195. /package/dist/{chunk-KTLKR4YY.js.map → chunk-WTWMGH2C.js.map} +0 -0
  196. /package/dist/components/{wizard → common}/scroll-affordance.js.map +0 -0
  197. /package/dist/components/{wizard → common}/skill-agent-summary.js.map +0 -0
  198. /package/dist/{components/wizard/category-grid.js.map → load-agent-defs-YMDWBFDP.js.map} +0 -0
  199. /package/dist/{components/wizard/checkbox-grid.js.map → recompile-project-agents-SZ76WNTW.js.map} +0 -0
  200. /package/dist/{components/wizard/domain-selection.js.map → source-loader-C5SQXZXI.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/commands/edit.tsx"],"sourcesContent":["import path from \"path\";\n\nimport chalk from \"chalk\";\nimport { Flags } from \"@oclif/core\";\n\nimport { difference, indexBy, partition } from \"remeda\";\n\nimport { BaseCommand } from \"../base-command.js\";\nimport { type WizardResultV2 } from \"../components/wizard/wizard.js\";\nimport { runWizardSession } from \"../components/wizard/run-wizard-session.js\";\nimport {\n CLI_INVOKE_COMMAND,\n CLI_COLORS,\n EDIT_PROJECT_SETUP_FLAG,\n EDIT_PROJECT_SETUP_MARKETPLACE_FLAG,\n EJECT_SOURCE,\n editorConfigUrl,\n formatSourceDisplayName,\n} from \"../consts.js\";\nimport {\n detectProject,\n loadSource,\n sayCapturedWarnings,\n copyLocalSkills,\n uninstallPluginSkills,\n loadAgentDefs,\n type AgentDefs,\n writeProjectConfig,\n type ConfigWriteResult,\n compileAgentsAllScopes,\n compileProjectScope,\n discoverInstalledSkills,\n removeCompiledAgents,\n type RemoveCompiledAgentsOptions,\n} from \"../lib/operations/index.js\";\nimport { awaitUnderSpinner } from \"../components/common/spinner.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport {\n type EjectCopyResult,\n type Installation,\n detectMigrations,\n ejectCopyFailureError,\n executeMigration,\n holdsItsOwnInstallation,\n isHomeDirectory,\n resolveInstallPaths,\n INSTALL_MODE_DESCRIPTIONS,\n} from \"../lib/installation/index.js\";\nimport {\n applyMigratedGlobalSources,\n movedGlobalAgentInputs,\n mutateGlobal,\n type GateReport,\n} from \"../lib/config-gate/index.js\";\nimport { matrix, getSkillById, getSkillDisplayName } from \"../lib/matrix/matrix-provider\";\nimport { type AuthoritativeScope } from \"../lib/configuration/index.js\";\nimport {\n activeAgentNames,\n activeAgentScopeMap,\n isActiveAt,\n isGlobalTombstone,\n} from \"../lib/configuration/scope-predicates.js\";\nimport type { SourceLoadResult } from \"../lib/loading/index.js\";\nimport { discoverAllPluginSkills, buildMarketplacePluginRef } from \"../lib/plugins/index.js\";\nimport {\n deleteLocalSkill,\n foldLocalSkillIntoGlobal,\n migrateLocalSkillScope,\n unresolvedSkillRemovalReasons,\n} from \"../lib/skills/index.js\";\nimport type {\n SkillId,\n SkillConfig,\n AgentName,\n AgentScopeConfig,\n MergedSkillsMatrix,\n ProjectConfig,\n SkillScope,\n} from \"../types/index.js\";\nimport {\n seedPayloadForInstallation,\n skillsAuthoredHere,\n} from \"../lib/seed/installation-payload.js\";\nimport { publishSeedConfig } from \"../lib/seed/publish-seed.js\";\nimport { fetchSeedConfig } from \"../lib/seed/fetch-seed.js\";\nimport {\n carriedSkillsThatDiffer,\n registerExternalSkills,\n writeExternalSkills,\n type ExternalSkillInstall,\n} from \"../lib/seed/external-skills.js\";\nimport { seedToWizardResult, type SeedMapping } from \"../lib/seed/seed-to-wizard.js\";\nimport {\n arrivalLines,\n arrivalsByScope,\n notInstalledGlobally,\n readInstalledGlobal,\n reconcileSharedConfig,\n restoreInstalledGlobal,\n sameAssignments,\n skillLabel,\n withUnplaceableAssignees,\n type Arrivals,\n type HeldGlobal,\n type KeptFromRoundTrip,\n type UnassignedRow,\n} from \"../lib/seed/seed-apply.js\";\nimport {\n RemovalPlanConfirm,\n type RemovalPlanSection,\n} from \"../components/common/removal-plan-confirm.js\";\nimport { promptConfirm } from \"../components/common/prompt-confirm.js\";\nimport { hostAt } from \"../lib/hosts/host-for.js\";\nimport { hostCompileNotices } from \"../lib/hosts/host-compile-notices.js\";\nimport { unofferablePlacementsFound } from \"../lib/hosts/configured-placements.js\";\nimport { providerInUse } from \"../lib/installation/install-layout.js\";\nimport {\n providerFlag,\n providerNamedBy,\n refuseAnAmbiguousInstallation,\n} from \"../lib/installation/provider-flag.js\";\nimport { openUrl } from \"../utils/open-url.js\";\nimport { plural } from \"../utils/string.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { type StartupMessage } from \"../utils/logger.js\";\nimport {\n INCOMPLETE_WORK_RECOVERY,\n ERROR_MESSAGES,\n INFO_MESSAGES,\n SHARED_CONFIG_APPLY,\n STATUS_MESSAGES,\n agentsNotCompiled,\n applySharedConfigHere,\n authoredHereKept,\n carriedSkillsWritten,\n keptAsInstalledGlobally,\n keptUnassigned,\n localSkillsCopied,\n nothingInstalledToApplyTo,\n projectCopyRemoved,\n recompileSummary,\n sharedConfigDestinations,\n sharedConfigNeedsTerminal,\n skippedUnknownAgents,\n skippedUnknownSkills,\n unplaceableKept,\n wizardNeedsTerminal,\n} from \"../utils/messages.js\";\nimport { formatScopeTag } from \"../lib/wizard/index.js\";\nimport { typedKeys } from \"../utils/typed-object.js\";\nimport type { SeedPayload } from \"@workspace/matrix/seed\";\n\ntype ScopeChange = { from: SkillScope; to: SkillScope };\n\n/** `edit` recompiles every scope it owns in one pass, so its summary has no scope word. */\nconst RECOMPILE_SUBJECT = \"agent\";\n\n/** A `[P][G]` pair's project half toggled: an arrow line would claim the global install moved. */\nfunction formatDualScopeTransition(displayName: string, to: SkillScope): string {\n const isAdd = to === \"project\";\n const prefix = isAdd ? \"+\" : \"-\";\n const color = isAdd ? CLI_COLORS.SUCCESS : CLI_COLORS.ERROR;\n return chalk.hex(color)(` ${prefix} ${displayName} [P]`);\n}\n\n/** A genuine `[G] → [P]` reads as an addition: the skill arrives in this project. */\nfunction formatSkillScopeChangeLine(\n skillId: SkillId,\n change: ScopeChange,\n dualScopeSkillTransitions: ReadonlySet<SkillId>,\n): string {\n const displayName = getSkillDisplayName(skillId);\n if (dualScopeSkillTransitions.has(skillId)) {\n return formatDualScopeTransition(displayName, change.to);\n }\n\n const isGlobalToProject = change.from === \"global\" && change.to === \"project\";\n const prefix = isGlobalToProject ? \"+\" : \"~\";\n const color = isGlobalToProject ? CLI_COLORS.SUCCESS : CLI_COLORS.WARNING;\n return (\n chalk.hex(color)(` ${prefix} ${displayName}`) +\n chalk.hex(CLI_COLORS.NEUTRAL)(scopeArrow(change))\n );\n}\n\n/** Unlike a skill, a moved agent is always a move, and only the dual-scope arm says `(agent)`. */\nfunction formatAgentScopeChangeLine(\n agentName: AgentName,\n change: ScopeChange,\n dualScopeAgentTransitions: ReadonlySet<AgentName>,\n): string {\n const agentSuffix = chalk.hex(CLI_COLORS.NEUTRAL)(\" (agent)\");\n if (dualScopeAgentTransitions.has(agentName)) {\n return formatDualScopeTransition(agentName, change.to) + agentSuffix;\n }\n\n return (\n chalk.hex(CLI_COLORS.WARNING)(` ~ ${agentName}`) +\n chalk.hex(CLI_COLORS.NEUTRAL)(scopeArrow(change))\n );\n}\n\nfunction scopeArrow(change: ScopeChange): string {\n return ` (${formatScopeTag(change.from)} \\u2192 ${formatScopeTag(change.to)})`;\n}\n\n/** Prints both values: a retune leaves nothing on disk to compare against. */\nfunction formatValueChangeLine(subject: string, change: ValueChange, kind: string): string {\n return (\n chalk.hex(CLI_COLORS.WARNING)(` ~ ${subject}`) +\n chalk.hex(CLI_COLORS.NEUTRAL)(` (${kind}: ${change.from} \\u2192 ${change.to})`)\n );\n}\n\n/** The resolved marketplace, or the source string when there is none. */\nfunction loadedSourceLabel(sourceResult: SourceLoadResult): string {\n return sourceResult.marketplace ?? sourceResult.sourceConfig.source;\n}\n\n/** @internal Re-exported for testing — the transform itself lives inside the gate. */\nexport { applyMigratedGlobalSources };\n\ntype EditContext = {\n installation: Installation;\n projectConfig: ProjectConfig | null;\n /** The detected installation's root — where this run READS its saved skills from. */\n projectDir: string;\n sourceResult: SourceLoadResult;\n startupMessages: StartupMessage[];\n currentSkillIds: SkillId[];\n /** What `init --marketplace` named for the project setup this run continues. */\n setupMarketplace?: string;\n};\n\n/** The one directory an `edit` run acts on, decided once and handed to every layer. */\ntype EditRoot = {\n /** Where this run writes, registers plugins and compiles into. */\n dir: string;\n /** {@link EditRoot.dir} IS the global installation: no project scope to offer. */\n isGlobal: boolean;\n /** Materialise {@link EditRoot.dir} as a project even with nothing to change. */\n isProjectSetup: boolean;\n};\n\n/**\n * The installation `detectProject` found is the only root with a config, so the only one this run\n * may write to. `--project-setup` (`cc init` here) declares this directory the one being set up.\n */\nfunction resolveEditRoot(\n installation: Installation,\n cwd: string,\n setupRequested: boolean,\n): EditRoot {\n const dir = setupRequested ? cwd : installation.projectDir;\n const isGlobal = isHomeDirectory(dir);\n return { dir, isGlobal, isProjectSetup: setupRequested && !isGlobal };\n}\n\n/**\n * Both producers yield one `WizardResultV2`, applied by one sequence. A shared configuration\n * destroys whatever it leaves out, so its removals are confirmed first.\n */\ntype EditSelection =\n | { producer: \"wizard\"; result: WizardResultV2 }\n | {\n producer: \"shared\";\n result: WizardResultV2;\n /** Statements naming what this run may not remove — rendered in the confirm. */\n kept: string[];\n /** Skills the configuration carries rather than names, written once it is approved. */\n carried: ExternalSkillInstall[];\n };\n\ntype SharedConfigPlan = {\n heading: string;\n sections: RemovalPlanSection[];\n statements: string[];\n};\n\n/**\n * From a project the global install is restored before the diff (`restoreInstalledGlobal`), so\n * every listed removal is the project's own; a `[P][G]` pair's id survives at global scope and is\n * not listed.\n */\nfunction sharedConfigPlan(changes: ConfigChanges, kept: string[]): SharedConfigPlan {\n const dropped = droppedProjectHalves(changes);\n const skillLines = [\n ...changes.removedSkills.map(skillLabel),\n ...dropped.skillIds.map(droppedSkillLine),\n ];\n const agentLines = [...changes.removedAgents, ...dropped.agentNames.map(projectCopyRemoved)];\n\n const sections = removalSections(skillLines, agentLines);\n return { heading: planHeading(sections), sections, statements: kept };\n}\n\nfunction droppedSkillLine(skillId: SkillId): string {\n return projectCopyRemoved(skillLabel(skillId));\n}\n\nfunction removalSections(skills: string[], agents: string[]): RemovalPlanSection[] {\n return [\n { label: SHARED_CONFIG_APPLY.SKILLS_HEADING, items: skills },\n { label: SHARED_CONFIG_APPLY.AGENTS_HEADING, items: agents },\n ].filter((section) => section.items.length > 0);\n}\n\ntype DroppedHalves = { skillIds: SkillId[]; agentNames: AgentName[] };\n\n/**\n * The diff records these as project-to-global scope changes, since the id survives at global\n * scope. A pair `s` folded is excluded: its copy moves rather than goes.\n */\nfunction droppedProjectHalves(changes: ConfigChanges): DroppedHalves {\n const droppedSkills = changes.collapsedPairs.filter((pair) => !pair.folded);\n const droppedAgents = [...changes.agentScopeChanges].filter(\n ([name, change]) => change.to === \"global\" && changes.dualScopeAgentTransitions.has(name),\n );\n\n return {\n skillIds: droppedSkills.map(({ projectHalf }) => projectHalf.id),\n agentNames: droppedAgents.map(([name]) => name),\n };\n}\n\n/** A configuration that only adds says so, and is still confirmed: it is applied whole. */\nfunction planHeading(sections: RemovalPlanSection[]): string {\n if (sections.length === 0) return SHARED_CONFIG_APPLY.NOTHING_REMOVED;\n return SHARED_CONFIG_APPLY.PREVIEW_HEADING;\n}\n\n/**\n * From a project a shared configuration holds the global install as installed, so the global pass\n * runs only when the write added something global sub-agents derive from. The wizard keeps both:\n * a mode switch it carried to global scope is recorded before this write.\n */\nfunction compilesGlobalScope(\n producer: EditSelection[\"producer\"],\n editRoot: EditRoot,\n written: GateReport,\n): boolean {\n if (editRoot.isGlobal || producer === \"wizard\") return true;\n return movedGlobalAgentInputs(written);\n}\n\n/**\n * Adds sub-agents whose skill rows change while the roster does not, which\n * {@link detectConfigChanges} cannot see.\n */\ntype PlannedChanges = ConfigChanges & { reassignedAgents: AgentName[] };\n\n/** Adds carried skills already installed here whose files the apply rewrote. */\ntype AppliedChanges = PlannedChanges & { rewrittenSkills: SkillId[] };\n\n/**\n * Only a producer that states rows has any: the wizard leaves `assignedStack` undefined. In a\n * project only the project's own sub-agents count; a global one keeps its installed rows\n * (`restoreInstalledGlobal`). A sub-agent already counted as added is not counted twice.\n */\nfunction withReassignments(\n changes: ConfigChanges,\n result: WizardResultV2,\n installedStack: ProjectConfig[\"stack\"],\n editRoot: EditRoot,\n): PlannedChanges {\n const { assignedStack } = result;\n if (assignedStack === undefined) return { ...changes, reassignedAgents: [] };\n\n const ownedHere = (agent: AgentScopeConfig): boolean =>\n editRoot.isGlobal || isActiveAt(agent, \"project\");\n const countedAsAdded = (agent: AgentScopeConfig): boolean =>\n changes.addedAgents.includes(agent.name);\n const rowsMoved = (agent: AgentScopeConfig): boolean =>\n !sameAssignments(assignedStack[agent.name], installedStack?.[agent.name]);\n\n const reassigned = result.agentConfigs.filter(\n (agent) => ownedHere(agent) && !countedAsAdded(agent) && rowsMoved(agent),\n );\n return { ...changes, reassignedAgents: reassigned.map((agent) => agent.name) };\n}\n\n/**\n * What the apply adds or changes, by landing scope. Excludes what is already installed as stated,\n * and the global copy a dropped project half leaves, which the plan lists as a removal.\n */\nfunction applyArrivals(changes: PlannedChanges, result: WizardResultV2): Arrivals {\n const changedSkills = new Set<SkillId>([\n ...changes.addedSkills,\n ...changes.sourceChanges.keys(),\n ...changes.scopeChanges.keys(),\n ]);\n const changedAgents = new Set<AgentName>([\n ...changes.addedAgents,\n ...changes.agentScopeChanges.keys(),\n ...changes.tuningChanges.keys(),\n ...changes.reassignedAgents,\n ]);\n const dropped = droppedProjectHalves(changes);\n const skillArrives = (skill: SkillConfig): boolean =>\n changedSkills.has(skill.id) && !dropped.skillIds.includes(skill.id);\n const agentArrives = (agent: AgentScopeConfig): boolean =>\n changedAgents.has(agent.name) && !dropped.agentNames.includes(agent.name);\n\n return arrivalsByScope(\n result.skills.filter(skillArrives),\n result.agentConfigs.filter(agentArrives),\n );\n}\n\n/** Disclosed rather than acted on, so nobody is left wondering why an agent kept a skill. */\nfunction keptStatements(kept: KeptFromRoundTrip): string[] {\n return [...authorshipStatement(kept), ...catalogueStatement(kept)];\n}\n\nfunction authorshipStatement(kept: KeptFromRoundTrip): string[] {\n if (kept.authoredSkillIds.length === 0) return [];\n return [authoredHereKept(kept.authoredSkillIds)];\n}\n\nfunction catalogueStatement(kept: KeptFromRoundTrip): string[] {\n if (kept.unplaceableSkillIds.length === 0) return [];\n return [unplaceableKept(kept.unplaceableSkillIds)];\n}\n\nfunction unassignedStatement(unassigned: UnassignedRow[]): string[] {\n if (unassigned.length === 0) return [];\n return [\n unassigned\n .map(({ skillId, agentName, category }) => keptUnassigned(skillId, agentName, category))\n .join(\"\\n\"),\n ];\n}\n\nfunction keptAsInstalledStatement(held: HeldGlobal, revisedCarried: SkillId[]): string[] {\n const skillIds = [...held.keptAsInstalled.skillIds, ...revisedCarried];\n const { agentNames } = held.keptAsInstalled;\n if (skillIds.length === 0 && agentNames.length === 0) return [];\n return [keptAsInstalledGlobally(skillIds, agentNames)];\n}\n\n/**\n * At the home root the run owns everything it loaded. In a project it owns only the project's\n * entries: the wizard cannot deselect a live global entry, and a shared configuration only adds to\n * the global install from a project (owner ruling 2026-10-02).\n */\nfunction applyAuthority(editRoot: EditRoot): AuthoritativeScope {\n return editRoot.isGlobal ? \"all\" : \"owned\";\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: \"Open this installation in the editor instead of the wizard\",\n command: \"<%= config.bin %> <%= command.id %> --ui\",\n },\n {\n description: \"Apply a configuration built in the editor, by its id\",\n command: \"<%= config.bin %> <%= command.id %> --from <id>\",\n },\n ];\n\n static flags = {\n ui: Flags.boolean({\n description:\n \"Open agentsinc.sh/editor instead of the wizard — the id --from names, or this installation\",\n default: false,\n }),\n from: Flags.string({\n description:\n \"Apply a configuration shared from agentsinc.sh by its id, removing whatever it leaves out — from a project, only the project's own entries\",\n helpValue: \"<id>\",\n }),\n [EDIT_PROJECT_SETUP_FLAG]: Flags.boolean({\n description: \"Internal: this run continues an `init` project setup\",\n default: false,\n hidden: true,\n }),\n [EDIT_PROJECT_SETUP_MARKETPLACE_FLAG]: Flags.string({\n description: \"Internal: the marketplace `init --marketplace` named for that project setup\",\n hidden: true,\n dependsOn: [EDIT_PROJECT_SETUP_FLAG],\n }),\n provider: providerFlag(),\n };\n\n /** The exit code is decided once, after every path through `applyEdit`. */\n async run(): Promise<void> {\n await this.applyEdit();\n this.exitIfWorkIncomplete();\n }\n\n private async applyEdit(): Promise<void> {\n const { flags } = await this.parse(Edit);\n const cwd = process.cwd();\n\n // Above every installation check: opening a shared id needs no local state (owner ruling\n // 2026-08-24, pinned by `edit-ui-from.e2e.test.ts`).\n if (flags.ui && flags.from !== undefined) return this.openSharedInEditor(flags.from, cwd);\n\n // Before the wizard copies or installs anything.\n await refuseAnAmbiguousInstallation(cwd, \"edit\", providerNamedBy(flags.provider), (message) =>\n this.error(message, { exit: EXIT_CODES.INVALID_ARGS }),\n );\n\n // Before anything renders: an unreadable config is recreated, not edited.\n await this.ensureConfigReadable(cwd);\n await this.refuseUnofferablePlacements(cwd);\n\n // Replaces the wizard, so it runs above the source load.\n if (flags.ui) return this.openInEditor(cwd);\n\n // A destructive apply nobody can confirm must never become a yes; refused before the fetch.\n const payload =\n flags.from === undefined ? null : await this.fetchSharedConfigOrFail(flags.from);\n\n const context = await this.loadContextUnderSpinner(flags[EDIT_PROJECT_SETUP_MARKETPLACE_FLAG]);\n\n const editRoot = resolveEditRoot(context.installation, cwd, flags[EDIT_PROJECT_SETUP_FLAG]);\n\n // A skill whose metadata.yaml no longer describes it would be dropped from config.ts.\n await this.ensureSavedSkillsReadable(\n context.projectConfig?.skills ?? [],\n context.sourceResult.matrix,\n context.projectDir,\n );\n\n const selection = payload\n ? await this.selectionFromSharedConfig(payload, context, editRoot)\n : await this.selectionFromWizard(context, editRoot);\n if (!selection) this.error(\"Cancelled\", { exit: EXIT_CODES.CANCELLED });\n\n const { result } = selection;\n this.reportValidationErrors(result.validation);\n\n const activeNewSkills = result.skills.filter((s) => !s.excluded);\n const activeNewAgents = result.agentConfigs.filter((a) => !a.excluded);\n const activeOldSkills = (context.projectConfig?.skills ?? []).filter((s) => !s.excluded);\n const activeOldAgents = (context.projectConfig?.agents ?? []).filter((a) => !a.excluded);\n\n const filteredResult: WizardResultV2 = {\n ...result,\n skills: activeNewSkills,\n agentConfigs: activeNewAgents,\n };\n const filteredOldConfig: ProjectConfig | null = context.projectConfig\n ? { ...context.projectConfig, skills: activeOldSkills, agents: activeOldAgents }\n : null;\n\n const planned = withReassignments(\n detectConfigChanges(filteredOldConfig, filteredResult, {\n newSkills: result.skills,\n oldSkills: context.projectConfig?.skills ?? [],\n newAgents: result.agentConfigs,\n oldAgents: context.projectConfig?.agents ?? [],\n }),\n filteredResult,\n context.projectConfig?.stack,\n editRoot,\n );\n // After the diff, above every mutation and the no-change return: carried skills may still have\n // bytes to land when the roster is unchanged.\n const rewritten =\n selection.producer === \"shared\"\n ? await this.confirmAndWriteCarried(selection, planned, filteredResult)\n : [];\n const changes: AppliedChanges = {\n ...planned,\n rewrittenSkills: difference(rewritten, planned.addedSkills),\n };\n\n // One authority for the merger's config row and the global config the gate commits.\n const authority = applyAuthority(editRoot);\n\n if (!hasAnyChanges(changes)) {\n this.log(chalk.hex(CLI_COLORS.NEUTRAL)(\"No changes made.\"));\n // `cc init` in a project materialises it (config pair written, path registered) even with no\n // change; a bare `cc edit`, or a home-root setup, stays an inspection.\n if (!editRoot.isProjectSetup) return;\n await this.writeConfigAndCompile(result, context, editRoot, authority, selection.producer);\n await this.reportWhatThisHostCannotCarry(editRoot);\n this.logCompletionSummary(changes);\n return;\n }\n\n const removalReasons = await unresolvedSkillRemovalReasons(\n result.unresolvableSkillIds,\n activeOldSkills,\n context.projectDir,\n loadedSourceLabel(context.sourceResult),\n );\n this.logChangeSummary(\n changes,\n filteredResult.skills,\n filteredOldConfig?.skills ?? [],\n removalReasons,\n );\n const migratedSkillIds = await this.applyMigrations(\n changes,\n filteredResult,\n activeOldSkills,\n context,\n editRoot,\n );\n await this.recordGlobalSourceMigrations(\n migratedSkillIds,\n filteredResult.skills,\n editRoot,\n context,\n );\n await this.applyScopeChanges(changes, filteredResult, context, editRoot);\n await this.applyCollapsedPairs(changes, filteredResult, context, editRoot);\n await this.applySourceChanges(changes, activeOldSkills, editRoot, migratedSkillIds);\n await this.applyPluginChanges(changes, filteredResult, activeOldSkills, context, editRoot);\n await this.copyNewLocalSkills(changes, filteredResult, context, editRoot);\n await this.removeDeletedLocalSkills(changes, activeOldSkills, editRoot);\n await this.writeConfigAndCompile(result, context, editRoot, authority, selection.producer);\n await this.cleanupStaleAgentFiles(changes, activeOldAgents, editRoot);\n await this.reportWhatThisHostCannotCarry(editRoot);\n this.logCompletionSummary(changes);\n }\n\n private async selectionFromWizard(\n context: EditContext,\n editRoot: EditRoot,\n ): Promise<EditSelection | null> {\n // The installation refusals above work over a pipe; the mount is the first thing needing a TTY.\n if (!process.stdin.isTTY) {\n this.error(wizardNeedsTerminal(\"edit\"), { exit: EXIT_CODES.ERROR });\n }\n\n const result = await this.runEditWizard(context, editRoot);\n if (!result) return null;\n\n return { producer: \"wizard\", result };\n }\n\n /**\n * A shared configuration applies destructively, except for a skill written here (`forkedFrom`)\n * and an id this catalogue cannot place — both disclosed in the confirm. From a project the\n * global install is only added to (owner ruling 2026-10-02): entries the configuration omits or\n * states otherwise are held as installed, and only what it lacks arrives.\n */\n private async selectionFromSharedConfig(\n payload: SeedPayload,\n context: EditContext,\n editRoot: EditRoot,\n ): Promise<EditSelection> {\n const { matrix: sourceMatrix } = context.sourceResult;\n // Before the decode: a carried skill answers to no catalogue until it is seated.\n const carried = this.registerExternalSkillsOrFail(payload, sourceMatrix, editRoot.dir);\n const { result, skippedSkillIds, skippedAgentNames } = this.decodeSeedOrFail(\n payload,\n sourceMatrix,\n );\n\n // Before any skip is narrated; `init --from` asks the same at the same point.\n this.refuseProjectScopedContentAtHome(result, editRoot.dir);\n\n // Ids the decode could not place stay, as does a sub-agent only they carried in: a catalogue\n // limit is not an instruction to delete.\n const unplaceable = new Set(skippedSkillIds);\n const reconciled = reconcileSharedConfig({\n decoded: withUnplaceableAssignees(result, context.projectConfig, payload, unplaceable),\n installed: context.projectConfig,\n authoredHere: await this.readAuthoredHere(context.projectConfig, editRoot.dir),\n unplaceable,\n });\n const held = restoreInstalledGlobal(\n reconciled.result,\n editRoot.isGlobal ? null : await readInstalledGlobal(editRoot.dir),\n );\n const arrivingCarried = notInstalledGlobally(carried, held);\n\n await this.refuseSharedConfigBeforeAsking(\n held.result,\n arrivingCarried,\n editRoot.dir,\n context.sourceResult,\n );\n\n // Held globally, so not written from a project; named in the plan instead.\n const heldGlobally = difference(carried, arrivingCarried);\n const revisedGlobally = await carriedSkillsThatDiffer(heldGlobally);\n\n // Warnings the load buffered for a wizard this run never mounts.\n sayCapturedWarnings(context.startupMessages);\n if (skippedSkillIds.length > 0) this.warn(skippedUnknownSkills(skippedSkillIds));\n if (skippedAgentNames.length > 0) this.warn(skippedUnknownAgents(skippedAgentNames));\n\n return {\n producer: \"shared\",\n result: held.result,\n kept: [\n ...keptStatements(reconciled.kept),\n ...unassignedStatement(reconciled.unassigned),\n ...keptAsInstalledStatement(held, revisedGlobally),\n ],\n carried: arrivingCarried,\n };\n }\n\n /** Best-effort: an unreadable directory protects nothing and must not fail an apply. */\n private async readAuthoredHere(\n projectConfig: ProjectConfig | null,\n editRoot: string,\n ): Promise<Set<SkillId>> {\n if (!projectConfig) return new Set();\n\n try {\n return await skillsAuthoredHere(projectConfig, editRoot);\n } catch (error) {\n this.warn(`Could not tell which skills were written here: ${getErrorMessage(error)}`);\n return new Set();\n }\n }\n\n /** Refuses an empty directory or a missing terminal before spending a round trip. */\n private async fetchSharedConfigOrFail(id: string): Promise<SeedPayload> {\n if (!(await detectProject())) {\n this.error(nothingInstalledToApplyTo(id), { exit: EXIT_CODES.ERROR });\n }\n if (!process.stdin.isTTY) {\n this.error(sharedConfigNeedsTerminal(id), { exit: EXIT_CODES.ERROR });\n }\n\n this.log(`Fetching configuration ${id}...`);\n const fetched = await fetchSeedConfig(id);\n if (!fetched.ok) {\n this.error(fetched.error, { exit: EXIT_CODES.ERROR });\n }\n\n return fetched.payload;\n }\n\n private decodeSeedOrFail(payload: SeedPayload, sourceMatrix: MergedSkillsMatrix): SeedMapping {\n try {\n return seedToWizardResult(payload, sourceMatrix);\n } catch (error) {\n this.handleError(error);\n }\n }\n\n private registerExternalSkillsOrFail(\n payload: SeedPayload,\n sourceMatrix: MergedSkillsMatrix,\n projectDir: string,\n ): ExternalSkillInstall[] {\n try {\n return registerExternalSkills(payload, sourceMatrix, projectDir);\n } catch (error) {\n this.handleError(error);\n }\n }\n\n private async confirmAndWriteCarried(\n selection: Extract<EditSelection, { producer: \"shared\" }>,\n planned: PlannedChanges,\n result: WizardResultV2,\n ): Promise<SkillId[]> {\n await this.confirmSharedConfigOrCancel(planned, selection.kept, applyArrivals(planned, result));\n return this.writeCarriedSkills(selection.carried);\n }\n\n private async writeCarriedSkills(carried: ExternalSkillInstall[]): Promise<SkillId[]> {\n if (carried.length === 0) return [];\n\n const rewritten = await writeExternalSkills(carried);\n this.log(carriedSkillsWritten(carried.map((skill) => skill.id)));\n return rewritten;\n }\n\n /**\n * The plan and the apply read the same `ConfigChanges`, so what is approved is what is removed.\n * The arrivals print above it, so the question covers the whole of what a yes does.\n */\n private async confirmSharedConfigOrCancel(\n changes: ConfigChanges,\n kept: string[],\n arrivals: Arrivals,\n ): Promise<void> {\n const plan = sharedConfigPlan(changes, kept);\n for (const line of arrivalLines(arrivals)) {\n this.log(line);\n }\n\n const outcome = await promptConfirm(({ onConfirm, onCancel }) => (\n <RemovalPlanConfirm\n heading={plan.heading}\n sections={plan.sections}\n statements={plan.statements}\n message={SHARED_CONFIG_APPLY.CONFIRM}\n onConfirm={onConfirm}\n onCancel={onCancel}\n />\n ));\n if (outcome === \"confirmed\") return;\n\n this.log(\"\\nEdit cancelled\");\n this.error(\"Cancelled\", { exit: EXIT_CODES.CANCELLED });\n }\n\n /** `edit` rewrites the file, so it must not let a user curate a roster no command acts on. */\n private async refuseUnofferablePlacements(cwd: string): Promise<void> {\n const [finding] = await unofferablePlacementsFound(cwd);\n if (finding !== undefined) this.error(finding, { exit: EXIT_CODES.ERROR });\n }\n\n /**\n * Mints through `seedPayloadForInstallation`, as `share` does, so one project has one id. Touches\n * nothing on disk.\n */\n private async openInEditor(projectDir: string): Promise<void> {\n const prepared = await seedPayloadForInstallation(projectDir);\n if (!prepared.ok) {\n this.error(prepared.error, { exit: EXIT_CODES.ERROR });\n }\n\n this.log(`Opening ${prepared.skills} skill(s) across ${prepared.agents} sub-agent(s)...`);\n\n const published = await publishSeedConfig(prepared.payload);\n if (!published.ok) {\n this.error(published.error, { exit: EXIT_CODES.ERROR });\n }\n\n await this.handToBrowser(published.id);\n }\n\n /** Opens an id rather than applying it; `--from` without `--ui` is the destructive apply. */\n private async openSharedInEditor(id: string, cwd: string): Promise<void> {\n const url = editorConfigUrl(id);\n\n this.log(`Open it at ${url}`);\n this.log(applySharedConfigHere(id, await holdsItsOwnInstallation(cwd)));\n\n if (!process.stdin.isTTY) return;\n\n const opened = await openUrl(url);\n if (!opened.ok) this.warn(opened.error);\n }\n\n /** The link prints first: it works over a pipe, in CI and with no desktop. Opening is extra. */\n private async handToBrowser(id: string): Promise<void> {\n this.logSuccess(`Shared as ${id}`);\n for (const destination of sharedConfigDestinations(id)) {\n this.log(destination);\n }\n\n if (!process.stdin.isTTY) return;\n\n const opened = await openUrl(editorConfigUrl(id));\n if (!opened.ok) this.warn(opened.error);\n }\n\n private async loadContextUnderSpinner(setupMarketplace?: string): Promise<EditContext> {\n return awaitUnderSpinner(STATUS_MESSAGES.LOADING_SKILLS, () =>\n this.loadContext(setupMarketplace),\n );\n }\n\n private async loadContext(setupMarketplace?: string): Promise<EditContext> {\n const detected = await detectProject();\n if (!detected) {\n this.error(ERROR_MESSAGES.NO_INSTALLATION, {\n exit: EXIT_CODES.ERROR,\n });\n }\n const { installation, config: projectConfig } = detected;\n\n // The installation's own root, which this run READS; writes go to `EditRoot.dir`.\n const projectDir = installation.projectDir;\n\n let sourceResult: SourceLoadResult;\n let startupMessages: StartupMessage[] = [];\n try {\n const loaded = await loadSource({\n projectDir,\n ...(setupMarketplace !== undefined && { sourceFlag: setupMarketplace }),\n captureStartupMessages: true,\n });\n sourceResult = loaded.sourceResult;\n startupMessages = loaded.startupMessages;\n\n const sourceInfo = sourceResult.isLocal ? \"local\" : sourceResult.sourceConfig.sourceOrigin;\n startupMessages.push({\n level: \"info\",\n text: `Loaded ${plural(Object.keys(matrix.skills).length, \"skill\")} (${sourceInfo})`,\n });\n } catch (error) {\n this.handleError(error);\n }\n\n let currentSkillIds: SkillId[];\n try {\n const discoveredSkills = await discoverAllPluginSkills(projectDir);\n const pluginSkillIds = typedKeys(discoveredSkills);\n\n // Config skills catch local and global-scoped plugin skills discoverAllPluginSkills misses.\n // Excluded entries stay out of the selection; installedSkillConfigs still carries them.\n const excludedConfigIds = new Set(\n projectConfig?.skills.filter((s) => s.excluded).map((s) => s.id) ?? [],\n );\n const configSkillIds =\n projectConfig?.skills.filter((s) => !s.excluded).map((s) => s.id) ?? [];\n const filteredPluginSkillIds = pluginSkillIds.filter((id) => !excludedConfigIds.has(id));\n const mergedIds = new Set<SkillId>([...filteredPluginSkillIds, ...configSkillIds]);\n currentSkillIds = [...mergedIds];\n\n startupMessages.push({\n level: \"info\",\n text: `Found ${plural(currentSkillIds.length, \"installed skill\")}`,\n });\n } catch (error) {\n this.handleError(error);\n }\n\n return {\n installation,\n projectConfig,\n projectDir,\n sourceResult,\n startupMessages,\n currentSkillIds,\n ...(setupMarketplace !== undefined &&\n sourceResult.marketplace !== undefined && { setupMarketplace: sourceResult.marketplace }),\n };\n }\n\n private async runEditWizard(\n context: EditContext,\n editRoot: EditRoot,\n ): Promise<WizardResultV2 | null> {\n const { projectConfig, currentSkillIds } = context;\n const selectedAgents = projectConfig?.agents && activeAgentNames(projectConfig.agents);\n\n return runWizardSession({\n hydrate: {\n initialStep: \"build\",\n ...(projectConfig?.selectedDomains !== undefined && {\n initialDomains: projectConfig.selectedDomains,\n }),\n ...(selectedAgents !== undefined && { initialAgents: selectedAgents }),\n installedSkillIds: currentSkillIds,\n ...(projectConfig?.skills !== undefined && { installedSkillConfigs: projectConfig.skills }),\n ...(projectConfig?.agents !== undefined && { installedAgentConfigs: projectConfig.agents }),\n isEditingFromGlobalScope: editRoot.isGlobal,\n ...(context.setupMarketplace !== undefined && {\n setupMarketplace: context.setupMarketplace,\n }),\n },\n props: {\n version: this.config.version,\n initialAgents: selectedAgents,\n installedSkillIds: currentSkillIds,\n startupMessages: context.startupMessages,\n },\n onCancel: () => this.log(\"\\nEdit cancelled\"),\n clearTerminal: () => this.clearTerminal(),\n });\n }\n\n /**\n * Records in the GLOBAL config the install-mode migrations this run already performed under\n * `$HOME`, and only their `origin`: `executeMigration` resolves paths from each skill's own\n * scope, so leaving the record alone would contradict the disk and the plugin registry. The\n * reachable case is a mode change on a `[P][G]` pair's project half, carried to global by `s`.\n * Runs before `writeConfigAndCompile`, through the gate so every other project is refreshed.\n */\n private async recordGlobalSourceMigrations(\n migratedSkillIds: Set<SkillId>,\n newSkills: SkillConfig[],\n editRoot: EditRoot,\n context: EditContext,\n ): Promise<void> {\n // The wizard write already covers the global config.\n if (editRoot.isGlobal) return;\n\n const migratedSources = new Map(\n newSkills\n .filter((s) => migratedSkillIds.has(s.id) && isActiveAt(s, \"global\"))\n .map((s) => [s.id, s.origin] as const),\n );\n if (migratedSources.size === 0) return;\n\n try {\n const report = await mutateGlobal(\n { kind: \"migrate-skill-sources\", sources: migratedSources },\n {\n // config-gate/deps.ts declares `loadMatrix` async; the matrix is already in hand.\n // eslint-disable-next-line @typescript-eslint/require-await -- deps contract\n loadMatrix: async () => context.sourceResult.matrix,\n loadAgents: async () => (await loadAgentDefs()).agents,\n },\n );\n this.reportFanOut(report);\n } catch (error) {\n // The migration happened; only its record failed, so disk and global config now disagree.\n this.reportIncompleteWork(\n `Could not record global origin change: ${getErrorMessage(error)}`,\n INCOMPLETE_WORK_RECOVERY.INSPECT_INSTALLATION,\n );\n }\n }\n\n private logChangeSummary(\n changes: AppliedChanges,\n newSkills: SkillConfig[],\n oldSkills: SkillConfig[],\n removalReasons: ReadonlyMap<SkillId, string>,\n ): void {\n const {\n addedSkills,\n removedSkills,\n addedAgents,\n removedAgents,\n sourceChanges,\n scopeChanges,\n agentScopeChanges,\n dualScopeSkillTransitions,\n dualScopeAgentTransitions,\n tuningChanges,\n reassignedAgents,\n rewrittenSkills,\n } = changes;\n\n this.log(`\\n${chalk.hex(CLI_COLORS.WHITE).bold(\"Changes:\")}`);\n for (const skillId of addedSkills) {\n const scope = newSkills.find((s) => s.id === skillId)?.scope;\n const scopeLabel = scope ? ` ${formatScopeTag(scope)}` : \"\";\n this.log(\n chalk.hex(CLI_COLORS.SUCCESS)(` + ${getSkillById(skillId).displayName}${scopeLabel}`),\n );\n }\n for (const skillId of removedSkills) {\n const scope = oldSkills.find((s) => s.id === skillId)?.scope;\n const scopeLabel = scope ? ` ${formatScopeTag(scope)}` : \"\";\n const reason = removalReasons.get(skillId);\n this.log(\n chalk.hex(CLI_COLORS.ERROR)(` - ${getSkillDisplayName(skillId)}${scopeLabel}`) +\n (reason ? chalk.hex(CLI_COLORS.NEUTRAL)(` (${reason})`) : \"\"),\n );\n }\n for (const agentName of addedAgents) {\n this.log(\n chalk.hex(CLI_COLORS.SUCCESS)(` + ${agentName}`) +\n chalk.hex(CLI_COLORS.NEUTRAL)(\" (agent)\"),\n );\n }\n for (const agentName of removedAgents) {\n this.log(\n chalk.hex(CLI_COLORS.ERROR)(` - ${agentName}`) + chalk.hex(CLI_COLORS.NEUTRAL)(\" (agent)\"),\n );\n }\n for (const [skillId, change] of sourceChanges) {\n const displayName = getSkillDisplayName(skillId);\n const fromLabel = formatSourceDisplayName(change.from);\n const toLabel = formatSourceDisplayName(change.to);\n this.log(\n chalk.hex(CLI_COLORS.WARNING)(` ~ ${displayName}`) +\n chalk.hex(CLI_COLORS.NEUTRAL)(` (${fromLabel} \\u2192 ${toLabel})`),\n );\n }\n for (const [skillId, change] of scopeChanges) {\n this.log(formatSkillScopeChangeLine(skillId, change, dualScopeSkillTransitions));\n }\n for (const [agentName, change] of agentScopeChanges) {\n this.log(formatAgentScopeChangeLine(agentName, change, dualScopeAgentTransitions));\n }\n // A retune moves no file, so it needs its own line or the run reads as a no-op.\n for (const [agentName, change] of tuningChanges) {\n this.log(formatValueChangeLine(agentName, change, \"agent\"));\n }\n // Neither does a re-assignment.\n for (const agentName of reassignedAgents) {\n this.log(\n chalk.hex(CLI_COLORS.WARNING)(` ~ ${agentName}`) +\n chalk.hex(CLI_COLORS.NEUTRAL)(\" (agent: skills reassigned)\"),\n );\n }\n for (const skillId of rewrittenSkills) {\n this.log(\n chalk.hex(CLI_COLORS.WARNING)(` ~ ${getSkillDisplayName(skillId)}`) +\n chalk.hex(CLI_COLORS.NEUTRAL)(\" (skill: files rewritten)\"),\n );\n }\n this.log(\"\");\n }\n\n private async applyMigrations(\n changes: ConfigChanges,\n filteredResult: WizardResultV2,\n activeOldSkills: SkillConfig[],\n context: EditContext,\n editRoot: EditRoot,\n ): Promise<Set<SkillId>> {\n const migrationPlan = detectMigrations(\n withMaskedGlobalsRestored(activeOldSkills, changes.collapsedPairs),\n filteredResult.skills,\n );\n const migratedSkillIds = new Set([\n ...migrationPlan.toEject.map((m) => m.id),\n ...migrationPlan.toPlugin.map((m) => m.id),\n ]);\n if (migratedSkillIds.size === 0) return migratedSkillIds;\n\n if (migrationPlan.toEject.length > 0) {\n this.logModeSwitch(migrationPlan.toEject.length, INSTALL_MODE_DESCRIPTIONS.eject);\n }\n if (migrationPlan.toPlugin.length > 0) {\n this.logModeSwitch(migrationPlan.toPlugin.length, INSTALL_MODE_DESCRIPTIONS.plugin);\n // `claude plugin install` needs the marketplace registered and current. Before\n // `executeMigration`, so an unresolvable marketplace exits with the ejected copies intact.\n await this.requireMarketplaceOrExit(\n context.sourceResult,\n \"migrate skills to plugin mode\",\n hostAt(editRoot.dir),\n );\n // `executeMigration` installs, deleting each working copy as its plugin registers, so the\n // banner is announced here.\n this.announcePluginInstall();\n }\n\n const migrationResult = await executeMigration(\n migrationPlan,\n editRoot.dir,\n context.sourceResult,\n );\n\n for (const warning of migrationResult.warnings) {\n this.warn(warning);\n }\n\n // Hard-errors before anything records `origin: \"eject\"` for a skill with no copy on disk.\n if (migrationPlan.toEject.length > 0) {\n this.reportEjectCopies(migrationResult.ejectCopies);\n }\n\n // Hard-errors before anything records a marketplace `origin` for an unregistered skill.\n if (migrationPlan.toPlugin.length > 0) {\n this.reportPluginInstalls(migrationResult.pluginInstalls);\n }\n\n return migratedSkillIds;\n }\n\n /**\n * Mirrors `BaseCommand.reportPluginInstalls` for the plugin→eject half. The count line names no\n * destination: copies split between the project and $HOME by each skill's scope.\n */\n private reportEjectCopies(result: EjectCopyResult): void {\n for (const item of result.failed) {\n this.warn(`Failed to copy ${item.id} for eject: ${item.error}`);\n }\n if (result.failed.length > 0) {\n this.error(ejectCopyFailureError(result.failed.length), { exit: EXIT_CODES.ERROR });\n }\n this.log(chalk.hex(CLI_COLORS.NEUTRAL)(localSkillsCopied(result.copied.length)));\n }\n\n private logModeSwitch(count: number, modeDescription: string): void {\n this.log(chalk.hex(CLI_COLORS.NEUTRAL)(`Switching ${count} skill(s) to ${modeDescription}`));\n }\n\n /**\n * A collapsed `[P][G]` pair is not a move: its project half is dropped or folded\n * ({@link applyCollapsedPairs}).\n */\n private async applyScopeChanges(\n changes: ConfigChanges,\n filteredResult: WizardResultV2,\n context: EditContext,\n editRoot: EditRoot,\n ): Promise<void> {\n const scopeChanges = scopeMovesOf(changes);\n\n for (const [skillId, change] of scopeChanges) {\n const skillConfig = filteredResult.skills.find((s) => s.id === skillId);\n if (skillConfig?.origin === EJECT_SOURCE) {\n await migrateLocalSkillScope(skillId, change.from, editRoot.dir);\n }\n }\n\n // Only resolve the marketplace when a plugin scope migration exists.\n const hasPluginScopeChanges = [...scopeChanges.keys()].some((skillId) => {\n const skillConfig = filteredResult.skills.find((s) => s.id === skillId);\n return skillConfig && skillConfig.origin !== EJECT_SOURCE;\n });\n if (!hasPluginScopeChanges) return;\n\n const marketplace = await this.requireMarketplaceOrExit(\n context.sourceResult,\n \"migrate plugin skill scopes\",\n hostAt(editRoot.dir),\n );\n\n const pluginScopeResult = await migratePluginSkillScopes(\n scopeChanges,\n filteredResult.skills,\n marketplace,\n editRoot.dir,\n );\n // A migration installs at the new scope, so unlike an uninstall a failure is not diagnostic:\n // the skill is registered at neither scope.\n for (const item of pluginScopeResult.failed) {\n this.reportIncompleteWork(\n `Failed to migrate plugin scope for ${item.id}: ${item.error}`,\n INCOMPLETE_WORK_RECOVERY.INSPECT_INSTALLATION,\n );\n }\n }\n\n /**\n * A Local half `s` folded into a Local global install moves there, replacing the global copy.\n * Every other half is removed at project scope only. The global install's mode is\n * {@link applyMigrations}' to change. The uninstall is diagnostic, as every one here is.\n */\n private async applyCollapsedPairs(\n changes: ConfigChanges,\n filteredResult: WizardResultV2,\n context: EditContext,\n editRoot: EditRoot,\n ): Promise<void> {\n const [foldedCopies, removedPairs] = partition(changes.collapsedPairs, (pair) =>\n foldsItsCopyIntoGlobal(pair, filteredResult.skills),\n );\n const [ejectedHalves, pluginHalves] = partition(\n removedPairs.map(({ projectHalf }) => projectHalf),\n (half) => half.origin === EJECT_SOURCE,\n );\n\n for (const { projectHalf } of foldedCopies) {\n await foldLocalSkillIntoGlobal(editRoot.dir, projectHalf.id);\n }\n for (const half of ejectedHalves) {\n await deleteLocalSkill(editRoot.dir, half.id, half.scope);\n }\n await this.uninstallProjectPluginHalves(\n pluginHalves,\n context.sourceResult.marketplace,\n editRoot,\n );\n }\n\n private async uninstallProjectPluginHalves(\n pluginHalves: SkillConfig[],\n marketplace: string | undefined,\n editRoot: EditRoot,\n ): Promise<void> {\n if (pluginHalves.length === 0) return;\n if (marketplace === undefined) {\n for (const half of pluginHalves) {\n this.warn(`Could not uninstall this project's plugin for ${half.id}: no marketplace`);\n }\n return;\n }\n\n const uninstallResult = await uninstallPluginSkills(\n pluginHalves.map((half) => half.id),\n pluginHalves,\n marketplace,\n editRoot.dir,\n );\n if (uninstallResult.uninstalled.length > 0) {\n this.log(\n chalk.hex(CLI_COLORS.NEUTRAL)(`Removed ${uninstallResult.uninstalled.length} plugin(s)`),\n );\n }\n for (const item of uninstallResult.failed) {\n this.warn(`Failed to uninstall plugin ${item.id}: ${item.error}`);\n }\n }\n\n private async applySourceChanges(\n changes: ConfigChanges,\n activeOldSkills: SkillConfig[],\n editRoot: EditRoot,\n migratedSkillIds: Set<SkillId>,\n ): Promise<void> {\n const { sourceChanges } = changes;\n\n // Non-migration source changes, e.g. marketplace A -> marketplace B.\n for (const [skillId, change] of sourceChanges) {\n if (migratedSkillIds.has(skillId)) {\n continue;\n }\n if (change.from === EJECT_SOURCE) {\n const oldSkill = activeOldSkills.find((s) => s.id === skillId);\n await deleteLocalSkill(editRoot.dir, skillId, oldSkill?.scope);\n }\n }\n }\n\n private async applyPluginChanges(\n changes: ConfigChanges,\n filteredResult: WizardResultV2,\n activeOldSkills: SkillConfig[],\n context: EditContext,\n editRoot: EditRoot,\n ): Promise<void> {\n const { addedSkills, removedSkills } = changes;\n\n const addedPluginSkills = filteredResult.skills.filter(\n (s) => addedSkills.includes(s.id) && s.origin !== EJECT_SOURCE,\n );\n const removedPluginSkills = removedSkills.filter(\n (id) => activeOldSkills.find((s) => s.id === id)?.origin !== EJECT_SOURCE,\n );\n\n if (addedPluginSkills.length === 0 && removedPluginSkills.length === 0) return;\n\n const marketplace = await this.requireMarketplaceOrExit(\n context.sourceResult,\n \"install or uninstall plugin skills\",\n hostAt(editRoot.dir),\n );\n\n if (addedPluginSkills.length > 0) {\n await this.installPluginSkillsReported(\n addedPluginSkills,\n marketplace,\n editRoot.dir,\n context.sourceResult.matrix,\n );\n }\n\n if (removedPluginSkills.length > 0) {\n const uninstallResult = await uninstallPluginSkills(\n removedPluginSkills,\n activeOldSkills,\n marketplace,\n editRoot.dir,\n );\n if (uninstallResult.uninstalled.length > 0) {\n this.log(\n chalk.hex(CLI_COLORS.NEUTRAL)(`Removed ${uninstallResult.uninstalled.length} plugin(s)`),\n );\n }\n for (const item of uninstallResult.failed) {\n this.warn(`Failed to uninstall plugin ${item.id}: ${item.error}`);\n }\n }\n }\n\n private async copyNewLocalSkills(\n changes: ConfigChanges,\n filteredResult: WizardResultV2,\n context: EditContext,\n editRoot: EditRoot,\n ): Promise<void> {\n const { addedSkills } = changes;\n\n const addedLocalSkills = filteredResult.skills.filter(\n (s) => addedSkills.includes(s.id) && s.origin === EJECT_SOURCE,\n );\n\n if (addedLocalSkills.length > 0) {\n const copyResult = await copyLocalSkills(\n addedLocalSkills,\n editRoot.dir,\n context.sourceResult,\n );\n this.log(chalk.hex(CLI_COLORS.NEUTRAL)(localSkillsCopied(copyResult.totalCopied)));\n }\n }\n\n private async removeDeletedLocalSkills(\n changes: ConfigChanges,\n activeOldSkills: SkillConfig[],\n editRoot: EditRoot,\n ): Promise<void> {\n const { removedSkills } = changes;\n\n // A deselected eject skill is uninstalled at its scope; plugin removals and eject->marketplace\n // deletions belong to applyPluginChanges and applySourceChanges.\n for (const skillId of removedSkills) {\n const oldSkill = activeOldSkills.find((s) => s.id === skillId);\n if (oldSkill?.origin !== EJECT_SOURCE) continue;\n\n await deleteLocalSkill(editRoot.dir, skillId, oldSkill.scope);\n }\n }\n\n private async writeConfigAndCompile(\n result: WizardResultV2,\n context: EditContext,\n editRoot: EditRoot,\n authority: AuthoritativeScope,\n producer: EditSelection[\"producer\"],\n ): Promise<void> {\n let agentDefsResult: AgentDefs;\n try {\n agentDefsResult = await loadAgentDefs();\n } catch (error) {\n this.handleError(error);\n }\n\n // A failed write is fatal: every mutation has landed and config.ts is their only record.\n let configResult: ConfigWriteResult;\n try {\n configResult = await writeProjectConfig({\n wizardResult: result,\n sourceResult: context.sourceResult,\n projectDir: editRoot.dir,\n agentDefs: agentDefsResult,\n authoritativeScope: authority,\n });\n } catch (error) {\n this.error(`Could not update config: ${getErrorMessage(error)}`, {\n exit: EXIT_CODES.ERROR,\n });\n }\n\n this.reportUnassignedSkills(configResult.config, result.skills);\n\n try {\n const agentScopeMap = activeAgentScopeMap(result.agentConfigs);\n const { allSkills } = await discoverInstalledSkills(editRoot.dir);\n const compile = compilesGlobalScope(producer, editRoot, configResult.propagation)\n ? compileAgentsAllScopes\n : compileProjectScope;\n const compilationResult = await compile({\n projectDir: editRoot.dir,\n sourcePath: agentDefsResult.sourcePath,\n skills: allSkills,\n agentScopeMap,\n });\n\n const { compiled, rewritten, failed, warnings } = compilationResult;\n const summary = recompileSummary(\n rewritten.length,\n compiled.length - rewritten.length,\n RECOMPILE_SUBJECT,\n );\n\n if (failed.length > 0) {\n this.log(\n chalk.hex(CLI_COLORS.NEUTRAL)(summary) +\n chalk.hex(CLI_COLORS.WARNING)(` (${failed.length} failed)`),\n );\n for (const warning of warnings) {\n this.warn(warning);\n }\n // Off `failed`: `warnings` also carries non-failures.\n this.recordIncompleteWork(agentsNotCompiled(failed), INCOMPLETE_WORK_RECOVERY.RECOMPILE);\n } else if (compiled.length > 0) {\n this.log(chalk.hex(CLI_COLORS.NEUTRAL)(summary));\n } else {\n this.log(chalk.hex(CLI_COLORS.NEUTRAL)(INFO_MESSAGES.NO_AGENTS_TO_RECOMPILE));\n }\n } catch (error) {\n // The config already landed; a failed recompile must not end in silence.\n this.reportIncompleteWork(\n `Agent recompilation failed: ${getErrorMessage(error)}`,\n INCOMPLETE_WORK_RECOVERY.RECOMPILE,\n );\n this.log(`You can manually recompile with '${CLI_INVOKE_COMMAND} compile'.`);\n }\n\n this.reportFanOut(configResult.propagation);\n }\n\n private async cleanupStaleAgentFiles(\n changes: ConfigChanges,\n oldAgents: AgentScopeConfig[],\n editRoot: EditRoot,\n ): Promise<void> {\n for (const removal of planStaleAgentRemovals(changes, oldAgents, editRoot.dir)) {\n const { failed } = await removeCompiledAgents(removal);\n\n // A compiled sub-agent left behind is still loaded by Claude Code.\n for (const { name, error } of failed) {\n const agentPath = path.join(removal.agentsDir, `${name}.md`);\n this.reportIncompleteWork(\n `Could not remove agent file ${agentPath}: ${error}`,\n INCOMPLETE_WORK_RECOVERY.DELETE_AGENT_FILE,\n );\n }\n }\n }\n\n /**\n * The host notices `init` and `compile` print ({@link hostCompileNotices}), after\n * {@link cleanupStaleAgentFiles} so a deleted file is not counted. Skipped on a run that owes\n * work, whose tree may not be readable.\n */\n private async reportWhatThisHostCannotCarry(editRoot: EditRoot): Promise<void> {\n if (this.hasIncompleteWork) return;\n\n for (const notice of await hostCompileNotices(providerInUse(editRoot.dir), editRoot.dir)) {\n this.log(notice);\n }\n }\n\n private logCompletionSummary(_changes: ConfigChanges): void {\n if (this.hasIncompleteWork) return;\n\n this.log(`\\n${chalk.hex(CLI_COLORS.SUCCESS)(\"\\u2713 Done\")}\\n`);\n }\n}\n\n/** @internal Exported for testing */\nexport type ConfigChanges = {\n addedSkills: SkillId[];\n removedSkills: SkillId[];\n addedAgents: AgentName[];\n removedAgents: AgentName[];\n sourceChanges: Map<SkillId, { from: string; to: string }>;\n scopeChanges: Map<SkillId, ScopeChange>;\n agentScopeChanges: Map<AgentName, ScopeChange>;\n /** Dual-scope add/removes in `scopeChanges`, which the summary must not report as migrations. */\n dualScopeSkillTransitions: Set<SkillId>;\n /**\n * The `[P][G]` pairs this edit collapsed, as they stood before it. SPACE drops the project's own\n * install; `s` folds it into the global install. The config cannot tell them apart, so\n * `sourceChanges` and the mode migrations measure a collapsed skill against `maskedGlobal`.\n */\n collapsedPairs: CollapsedPair[];\n /** Agent equivalent of `dualScopeSkillTransitions`. */\n dualScopeAgentTransitions: Set<AgentName>;\n /** Retuned sub-agents (model, effort) with an unchanged roster: nothing moves, yet it changed. */\n tuningChanges: Map<AgentName, ValueChange>;\n};\n\ntype ValueChange = { from: string; to: string };\n\n/** A collapsed `[P][G]` pair, as the config held it before the edit. */\ntype CollapsedPair = {\n /** The project's own install: the half the collapse drops or folds. */\n projectHalf: SkillConfig;\n /** The global install the project half masked, as its tombstone recorded it. */\n maskedGlobal: SkillConfig;\n /** Whether `s` folded the half into the global install, rather than SPACE dropping it. */\n folded: boolean;\n};\n\n/** Full (tombstone-inclusive) entry lists used to classify dual-scope transitions. */\ntype FullScopeEntries = {\n newSkills: SkillConfig[];\n oldSkills: SkillConfig[];\n newAgents: AgentScopeConfig[];\n oldAgents: AgentScopeConfig[];\n};\n\n/**\n * @internal Exported for testing\n *\n * `fullEntries` carries the tombstone-inclusive lists, used only to tell a scope migration from a\n * dual-scope add/remove; without it every scope change is a migration.\n */\nexport function detectConfigChanges(\n oldConfig: ProjectConfig | null,\n wizardResult: WizardResultV2,\n fullEntries?: FullScopeEntries,\n): ConfigChanges {\n const oldSkillIds = oldConfig?.skills.map((s) => s.id) ?? [];\n const newSkillIds = wizardResult.skills.map((s) => s.id);\n const oldAgentNames = oldConfig?.agents.map((a) => a.name) ?? [];\n const newAgentNames = wizardResult.agentConfigs.map((a) => a.name);\n\n const oldSkillsById = indexBy(oldConfig?.skills ?? [], (s) => s.id);\n const oldAgentsByName = indexBy(oldConfig?.agents ?? [], (a) => a.name);\n\n const scopeChanges = detectPropertyChanges(\n wizardResult.skills,\n oldSkillsById,\n (s) => s.id,\n (s) => s.scope,\n );\n const agentScopeChanges = detectPropertyChanges(\n wizardResult.agentConfigs,\n oldAgentsByName,\n (a) => a.name,\n (a) => a.scope,\n );\n const dualScopeSkillTransitions = detectDualScopeTransitions(\n scopeChanges,\n fullEntries?.newSkills ?? [],\n fullEntries?.oldSkills ?? [],\n (s) => s.id,\n );\n const collapsedPairs = collapsedPairsOf(\n scopeChanges,\n dualScopeSkillTransitions,\n fullEntries?.oldSkills ?? [],\n wizardResult.foldedSkillIds ?? [],\n );\n\n return {\n addedSkills: difference(newSkillIds, oldSkillIds),\n removedSkills: difference(oldSkillIds, newSkillIds),\n addedAgents: difference(newAgentNames, oldAgentNames),\n removedAgents: difference(oldAgentNames, newAgentNames),\n sourceChanges: detectPropertyChanges(\n wizardResult.skills,\n indexBy(withMaskedGlobalsRestored(oldConfig?.skills ?? [], collapsedPairs), (s) => s.id),\n (s) => s.id,\n (s) => s.origin,\n ),\n scopeChanges,\n agentScopeChanges,\n dualScopeSkillTransitions,\n collapsedPairs,\n dualScopeAgentTransitions: detectDualScopeTransitions(\n agentScopeChanges,\n fullEntries?.newAgents ?? [],\n fullEntries?.oldAgents ?? [],\n (a) => a.name,\n ),\n tuningChanges: detectPropertyChanges(\n wizardResult.agentConfigs,\n oldAgentsByName,\n (a) => a.name,\n describeTuning,\n ),\n };\n}\n\nconst RESTING_TUNING = \"defaults\";\n\n/** Compared as a sentence, so the diff sees no change the summary has no words for. */\nfunction describeTuning(agent: AgentScopeConfig): string {\n const settings = [\n agent.model === undefined ? undefined : `model ${agent.model}`,\n agent.codexModel === undefined ? undefined : `codex model ${agent.codexModel}`,\n agent.effort === undefined ? undefined : `effort ${agent.effort}`,\n ].filter((setting) => setting !== undefined);\n\n return settings.length === 0 ? RESTING_TUNING : settings.join(\", \");\n}\n\nfunction detectPropertyChanges<T, K extends string, V>(\n newItems: T[],\n oldByKey: Record<string, T>,\n getKey: (item: T) => K,\n getValue: (item: T) => V,\n): Map<K, { from: V; to: V }> {\n const changes = new Map<K, { from: V; to: V }>();\n for (const item of newItems) {\n const key = getKey(item);\n const old = oldByKey[key];\n if (old && getValue(old) !== getValue(item)) {\n changes.set(key, { from: getValue(old), to: getValue(item) });\n }\n }\n return changes;\n}\n\n/**\n * A dual-scope transition, not a migration, when a global tombstone sits beside the change: G→P\n * keeps one in the new state, P→G had one in the old.\n */\nfunction detectDualScopeTransitions<\n K extends string,\n T extends { scope: SkillScope; excluded?: boolean },\n>(scopeChanges: Map<K, ScopeChange>, fullNew: T[], fullOld: T[], getKey: (item: T) => K): Set<K> {\n const hasGlobalTombstone = (items: T[], key: K): boolean =>\n items.some((item) => getKey(item) === key && item.scope === \"global\" && item.excluded === true);\n\n const result = new Set<K>();\n for (const [key, change] of scopeChanges) {\n if (change.from === \"global\" && change.to === \"project\" && hasGlobalTombstone(fullNew, key)) {\n result.add(key);\n } else if (\n change.from === \"project\" &&\n change.to === \"global\" &&\n hasGlobalTombstone(fullOld, key)\n ) {\n result.add(key);\n }\n }\n return result;\n}\n\n/** P→G dual-scope transitions as the pairs they collapsed, read from the old state. */\nfunction collapsedPairsOf(\n scopeChanges: Map<SkillId, ScopeChange>,\n dualScopeSkillTransitions: ReadonlySet<SkillId>,\n fullOldSkills: SkillConfig[],\n foldedSkillIds: readonly SkillId[],\n): CollapsedPair[] {\n return [...scopeChanges]\n .filter(([id, change]) => change.to === \"global\" && dualScopeSkillTransitions.has(id))\n .map(([id]) => ({\n projectHalf: oldHalfOf(fullOldSkills, id, (skill) => isActiveAt(skill, \"project\")),\n maskedGlobal: oldHalfOf(fullOldSkills, id, isGlobalTombstone),\n folded: foldedSkillIds.includes(id),\n }));\n}\n\n/** `s` folded a Local half into a Local global entry; a fold into a plugin installs it instead. */\nfunction foldsItsCopyIntoGlobal(pair: CollapsedPair, newSkills: SkillConfig[]): boolean {\n const { projectHalf, folded } = pair;\n const globalEntry = newSkills.find(\n (skill) => skill.id === projectHalf.id && isActiveAt(skill, \"global\"),\n );\n return folded && projectHalf.origin === EJECT_SOURCE && globalEntry?.origin === EJECT_SOURCE;\n}\n\n/** Present by construction, so a miss is a defect. */\nfunction oldHalfOf(\n fullOldSkills: SkillConfig[],\n id: SkillId,\n isHalf: (skill: SkillConfig) => boolean,\n): SkillConfig {\n const half = fullOldSkills.find((skill) => skill.id === id && isHalf(skill));\n if (half === undefined) {\n throw new Error(`The config before this edit holds no such half of the pair for '${id}'`);\n }\n return half;\n}\n\n/**\n * The pre-edit roster with each collapsed pair's project half replaced by the global install it\n * masked: the only install whose mode a collapse can change.\n */\nfunction withMaskedGlobalsRestored(\n oldSkills: SkillConfig[],\n collapsedPairs: CollapsedPair[],\n): SkillConfig[] {\n const maskedById = indexBy(\n collapsedPairs.map(({ maskedGlobal }) => maskedGlobal),\n (skill) => skill.id,\n );\n return oldSkills.map((skill) => {\n const masked = maskedById[skill.id];\n if (masked === undefined || skill.scope !== \"project\") return skill;\n return installRecordedBy(masked);\n });\n}\n\nfunction installRecordedBy(tombstone: SkillConfig): SkillConfig {\n const { excluded: _masked, ...install } = tombstone;\n return install;\n}\n\n/** Excludes collapsed pairs, whose global install stays where it is. */\nfunction scopeMovesOf(changes: ConfigChanges): Map<SkillId, ScopeChange> {\n const collapsed = new Set(changes.collapsedPairs.map(({ projectHalf }) => projectHalf.id));\n return new Map([...changes.scopeChanges].filter(([id]) => !collapsed.has(id)));\n}\n\ntype StaleAgent = { name: AgentName; scope: SkillScope };\n\nconst STALE_AGENT_SCOPES = [\"project\", \"global\"] as const satisfies readonly SkillScope[];\n\n/** For a deselected agent absent from the old roster. */\nconst UNRECORDED_AGENT_SCOPE: SkillScope = \"project\";\n\nfunction installedScope(name: AgentName, oldAgents: AgentScopeConfig[]): SkillScope {\n return oldAgents.find((agent) => agent.name === name)?.scope ?? UNRECORDED_AGENT_SCOPE;\n}\n\n/**\n * The project copy a P→G move superseded, plus every deselected agent at its installed scope. G→P\n * is an override, so the global install stays. Only scopes this edit removed from are tidied.\n */\nfunction planStaleAgentRemovals(\n changes: ConfigChanges,\n oldAgents: AgentScopeConfig[],\n editRoot: string,\n): RemoveCompiledAgentsOptions[] {\n const supersededByGlobal = [...changes.agentScopeChanges]\n .filter(([, change]) => change.from !== \"global\")\n .map(([name]): StaleAgent => ({ name, scope: \"project\" }));\n\n const deselected = changes.removedAgents.map((name): StaleAgent => ({\n name,\n scope: installedScope(name, oldAgents),\n }));\n\n const stale = [...supersededByGlobal, ...deselected];\n const removalAtScope = (scope: SkillScope): RemoveCompiledAgentsOptions => ({\n agentsDir: resolveInstallPaths(editRoot, scope).agentsDir,\n agents: stale.filter((agent) => agent.scope === scope).map((agent) => agent.name),\n });\n\n return STALE_AGENT_SCOPES.map(removalAtScope).filter((removal) => removal.agents.length > 0);\n}\n\nfunction hasAnyChanges(changes: AppliedChanges): boolean {\n return (\n changes.reassignedAgents.length > 0 ||\n changes.rewrittenSkills.length > 0 ||\n changes.addedSkills.length > 0 ||\n changes.removedSkills.length > 0 ||\n changes.addedAgents.length > 0 ||\n changes.removedAgents.length > 0 ||\n changes.sourceChanges.size > 0 ||\n changes.scopeChanges.size > 0 ||\n changes.agentScopeChanges.size > 0 ||\n changes.tuningChanges.size > 0\n );\n}\n\n/** @internal Exported for testing */\nexport type PluginScopeMigrationResult = {\n migrated: SkillId[];\n failed: Array<{ id: SkillId; error: string }>;\n};\n\n/** @internal Exported for testing */\nexport async function migratePluginSkillScopes(\n scopeChanges: Map<SkillId, ScopeChange>,\n skills: Pick<SkillConfig, \"id\" | \"origin\">[],\n marketplace: string,\n projectDir: string,\n): Promise<PluginScopeMigrationResult> {\n const host = hostAt(projectDir);\n const migrated: SkillId[] = [];\n const failed: PluginScopeMigrationResult[\"failed\"] = [];\n\n for (const [skillId, change] of scopeChanges) {\n const skillConfig = skills.find((s) => s.id === skillId);\n if (!skillConfig || skillConfig.origin === EJECT_SOURCE) {\n continue;\n }\n\n const pluginRef = buildMarketplacePluginRef(skillId, marketplace);\n\n try {\n // global→project: keep the global registration, just add project scope.\n // The global plugin must remain for other projects.\n // project→global: uninstall the project-scope registration, install global.\n if (change.from === \"project\") {\n await host.uninstallPlugin(pluginRef, \"project\", projectDir);\n }\n await host.installPlugin(pluginRef, change.to, projectDir);\n migrated.push(skillId);\n } catch (error) {\n failed.push({ id: skillId, error: getErrorMessage(error) });\n }\n }\n\n return { migrated, failed };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/cli/commands/edit.tsx"],"sourcesContent":["import path from \"path\";\n\nimport chalk from \"chalk\";\nimport { Flags } from \"@oclif/core\";\n\nimport { difference, indexBy, partition } from \"remeda\";\n\nimport { BaseCommand } from \"../base-command.js\";\nimport type { InstallSelection } from \"@workspace/compile/seed-to-config\";\nimport {\n CLI_INVOKE_COMMAND,\n CLI_COLORS,\n EJECT_SOURCE,\n editorConfigUrl,\n formatSourceDisplayName,\n} from \"../consts.js\";\nimport {\n detectProject,\n loadSource,\n sayCapturedWarnings,\n copyLocalSkills,\n uninstallPluginSkills,\n loadAgentDefs,\n type AgentDefs,\n writeProjectConfig,\n type ConfigWriteResult,\n compileAgentsAllScopes,\n compileProjectScope,\n discoverInstalledSkills,\n removeCompiledAgents,\n type RemoveCompiledAgentsOptions,\n} from \"../lib/operations/index.js\";\nimport { awaitUnderSpinner } from \"../components/common/spinner.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport {\n type EjectCopyResult,\n type Installation,\n detectMigrations,\n ejectCopyFailureError,\n executeMigration,\n holdsItsOwnInstallation,\n isHomeDirectory,\n resolveInstallPaths,\n INSTALL_MODE_DESCRIPTIONS,\n} from \"../lib/installation/index.js\";\nimport { movedGlobalAgentInputs, type GateReport } from \"../lib/config-gate/index.js\";\nimport { getSkillById, getSkillDisplayName } from \"../lib/matrix/matrix-provider\";\nimport { type AuthoritativeScope, loadProjectConfig } from \"../lib/configuration/index.js\";\nimport {\n activeAgentScopeMap,\n isActiveAt,\n isGlobalTombstone,\n} from \"../lib/configuration/scope-predicates.js\";\nimport type { SourceLoadResult } from \"../lib/loading/index.js\";\nimport { buildMarketplacePluginRef } from \"../lib/plugins/index.js\";\nimport { deleteLocalSkill, migrateLocalSkillScope } from \"../lib/skills/index.js\";\nimport type {\n SkillId,\n SkillConfig,\n AgentName,\n AgentScopeConfig,\n MergedSkillsMatrix,\n ProjectConfig,\n SkillScope,\n} from \"../types/index.js\";\nimport {\n seedPayloadForInstallation,\n skillsAuthoredHere,\n} from \"../lib/seed/installation-payload.js\";\nimport { publishSeedConfig } from \"../lib/seed/publish-seed.js\";\nimport { fetchSeedConfig } from \"../lib/seed/fetch-seed.js\";\nimport {\n carriedSkillsThatDiffer,\n registerExternalSkills,\n writeExternalSkills,\n type ExternalSkillInstall,\n} from \"../lib/seed/external-skills.js\";\nimport { seedToInstallSelection, type SeedMapping } from \"../lib/seed/seed-to-selection.js\";\nimport {\n arrivalLines,\n arrivalsByScope,\n joinedStatement,\n notInstalledGlobally,\n readInstalledGlobal,\n reconcileSharedConfig,\n restoreInstalledGlobal,\n sameAssignments,\n skillLabel,\n withUnplaceableAssignees,\n type Arrivals,\n type HeldGlobal,\n type KeptFromRoundTrip,\n type UnassignedRow,\n} from \"../lib/seed/seed-apply.js\";\nimport {\n RemovalPlanConfirm,\n type RemovalPlanSection,\n} from \"../components/common/removal-plan-confirm.js\";\nimport { promptConfirm } from \"../components/common/prompt-confirm.js\";\nimport { hostAt } from \"../lib/hosts/host-for.js\";\nimport { hostCompileNotices } from \"../lib/hosts/host-compile-notices.js\";\nimport { unofferablePlacementsFound } from \"../lib/hosts/configured-placements.js\";\nimport { providerInUse } from \"../lib/installation/install-layout.js\";\nimport {\n providerFlag,\n providerNamedBy,\n refuseAnAmbiguousInstallation,\n} from \"../lib/installation/provider-flag.js\";\nimport { openUrl } from \"../utils/open-url.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { type StartupMessage } from \"../utils/logger.js\";\nimport {\n INCOMPLETE_WORK_RECOVERY,\n ERROR_MESSAGES,\n INFO_MESSAGES,\n SHARED_CONFIG_APPLY,\n STATUS_MESSAGES,\n agentsNotCompiled,\n applySharedConfigHere,\n authoredHereKept,\n carriedSkillsWritten,\n editorSkillMetadataUnusableError,\n keptAsInstalledGlobally,\n keptUnassigned,\n localSkillsCopied,\n nothingInstalledToApplyTo,\n projectCopyRemoved,\n recompileSummary,\n sharedConfigDestinations,\n sharedConfigNeedsTerminal,\n skippedUnknownAgents,\n skippedUnknownSkills,\n unplaceableKept,\n} from \"../utils/messages.js\";\nimport { formatScopeTag } from \"../lib/configuration/scope-diff.js\";\nimport type { SeedPayload } from \"@workspace/matrix/seed\";\n\ntype ScopeChange = { from: SkillScope; to: SkillScope };\n\n/** `edit` recompiles every scope it owns in one pass, so its summary has no scope word. */\nconst RECOMPILE_SUBJECT = \"agent\";\n\n/** A `[P][G]` pair's project half toggled: an arrow line would claim the global install moved. */\nfunction formatDualScopeTransition(displayName: string, to: SkillScope): string {\n const isAdd = to === \"project\";\n const prefix = isAdd ? \"+\" : \"-\";\n const color = isAdd ? CLI_COLORS.SUCCESS : CLI_COLORS.ERROR;\n return chalk.hex(color)(` ${prefix} ${displayName} [P]`);\n}\n\n/** A genuine `[G] → [P]` reads as an addition: the skill arrives in this project. */\nfunction formatSkillScopeChangeLine(\n skillId: SkillId,\n change: ScopeChange,\n dualScopeSkillTransitions: ReadonlySet<SkillId>,\n): string {\n const displayName = getSkillDisplayName(skillId);\n if (dualScopeSkillTransitions.has(skillId)) {\n return formatDualScopeTransition(displayName, change.to);\n }\n\n const isGlobalToProject = change.from === \"global\" && change.to === \"project\";\n const prefix = isGlobalToProject ? \"+\" : \"~\";\n const color = isGlobalToProject ? CLI_COLORS.SUCCESS : CLI_COLORS.WARNING;\n return (\n chalk.hex(color)(` ${prefix} ${displayName}`) +\n chalk.hex(CLI_COLORS.NEUTRAL)(scopeArrow(change))\n );\n}\n\n/** Unlike a skill, a moved agent is always a move, and only the dual-scope arm says `(agent)`. */\nfunction formatAgentScopeChangeLine(\n agentName: AgentName,\n change: ScopeChange,\n dualScopeAgentTransitions: ReadonlySet<AgentName>,\n): string {\n const agentSuffix = chalk.hex(CLI_COLORS.NEUTRAL)(\" (agent)\");\n if (dualScopeAgentTransitions.has(agentName)) {\n return formatDualScopeTransition(agentName, change.to) + agentSuffix;\n }\n\n return (\n chalk.hex(CLI_COLORS.WARNING)(` ~ ${agentName}`) +\n chalk.hex(CLI_COLORS.NEUTRAL)(scopeArrow(change))\n );\n}\n\nfunction scopeArrow(change: ScopeChange): string {\n return ` (${formatScopeTag(change.from)} \\u2192 ${formatScopeTag(change.to)})`;\n}\n\n/** Prints both values: a retune leaves nothing on disk to compare against. */\nfunction formatValueChangeLine(subject: string, change: ValueChange, kind: string): string {\n return (\n chalk.hex(CLI_COLORS.WARNING)(` ~ ${subject}`) +\n chalk.hex(CLI_COLORS.NEUTRAL)(` (${kind}: ${change.from} \\u2192 ${change.to})`)\n );\n}\n\ntype EditContext = {\n installation: Installation;\n projectConfig: ProjectConfig | null;\n sourceResult: SourceLoadResult;\n startupMessages: StartupMessage[];\n};\n\n/** The one directory an `edit` run acts on, decided once and handed to every layer. */\ntype EditRoot = {\n /** Where this run reads its saved skills from, writes, registers plugins and compiles into. */\n dir: string;\n /** {@link EditRoot.dir} IS the global installation. */\n isGlobal: boolean;\n};\n\n/**\n * The installation `detectProject` found is the only root with a config, so the only one this run\n * may write to.\n */\nfunction resolveEditRoot(installation: Installation): EditRoot {\n const dir = installation.projectDir;\n return { dir, isGlobal: isHomeDirectory(dir) };\n}\n\n/**\n * A shared configuration, as one sequence applies it. It destroys whatever it leaves out, so its\n * removals are confirmed first.\n */\ntype EditSelection = {\n result: InstallSelection;\n /**\n * Statements naming what this run may not remove, and the held global sub-agents it adds to —\n * rendered in the confirm.\n */\n kept: string[];\n /** Skills the configuration carries rather than names, written once it is approved. */\n carried: ExternalSkillInstall[];\n /** From a project, the held global sub-agents an arriving skill's row joins. */\n joinedGlobalAgents: AgentName[];\n};\n\ntype SharedConfigPlan = {\n heading: string;\n sections: RemovalPlanSection[];\n statements: string[];\n};\n\n/**\n * From a project the global install is restored before the diff (`restoreInstalledGlobal`), so\n * every listed removal is the project's own; a `[P][G]` pair's id survives at global scope and is\n * not listed.\n */\nfunction sharedConfigPlan(changes: ConfigChanges, kept: string[]): SharedConfigPlan {\n const dropped = droppedProjectHalves(changes);\n const skillLines = [\n ...changes.removedSkills.map(skillLabel),\n ...dropped.skillIds.map(droppedSkillLine),\n ];\n const agentLines = [...changes.removedAgents, ...dropped.agentNames.map(projectCopyRemoved)];\n\n const sections = removalSections(skillLines, agentLines);\n return { heading: planHeading(sections), sections, statements: kept };\n}\n\nfunction droppedSkillLine(skillId: SkillId): string {\n return projectCopyRemoved(skillLabel(skillId));\n}\n\nfunction removalSections(skills: string[], agents: string[]): RemovalPlanSection[] {\n return [\n { label: SHARED_CONFIG_APPLY.SKILLS_HEADING, items: skills },\n { label: SHARED_CONFIG_APPLY.AGENTS_HEADING, items: agents },\n ].filter((section) => section.items.length > 0);\n}\n\ntype DroppedHalves = { skillIds: SkillId[]; agentNames: AgentName[] };\n\n/**\n * The diff records these as project-to-global scope changes, since the id survives at global\n * scope.\n */\nfunction droppedProjectHalves(changes: ConfigChanges): DroppedHalves {\n const droppedAgents = [...changes.agentScopeChanges].filter(\n ([name, change]) => change.to === \"global\" && changes.dualScopeAgentTransitions.has(name),\n );\n\n return {\n skillIds: changes.collapsedPairs.map(({ projectHalf }) => projectHalf.id),\n agentNames: droppedAgents.map(([name]) => name),\n };\n}\n\n/** A configuration that only adds says so, and is still confirmed: it is applied whole. */\nfunction planHeading(sections: RemovalPlanSection[]): string {\n if (sections.length === 0) return SHARED_CONFIG_APPLY.NOTHING_REMOVED;\n return SHARED_CONFIG_APPLY.PREVIEW_HEADING;\n}\n\n/**\n * From a project a shared configuration holds the global install as installed, so the global pass\n * runs only when the write added something global sub-agents derive from.\n */\nfunction compilesGlobalScope(editRoot: EditRoot, written: GateReport): boolean {\n return editRoot.isGlobal || movedGlobalAgentInputs(written);\n}\n\n/**\n * Adds sub-agents whose skill rows change while the roster does not, which\n * {@link detectConfigChanges} cannot see.\n */\ntype ReassignedChanges = ConfigChanges & { reassignedAgents: AgentName[] };\n\n/** Adds the held global sub-agents a project run adds rows to (`HeldGlobal.joined`). */\ntype PlannedChanges = ReassignedChanges & { joinedGlobalAgents: AgentName[] };\n\n/** Adds carried skills already installed here whose files the apply rewrote. */\ntype AppliedChanges = PlannedChanges & { rewrittenSkills: SkillId[] };\n\n/**\n * In a project only the project's own sub-agents count; a global one keeps its installed rows and\n * gains only an arriving skill's (`restoreInstalledGlobal`), which `HeldGlobal.joined` names. A\n * sub-agent already counted as added is not counted twice.\n */\nfunction withReassignments(\n changes: ConfigChanges,\n result: InstallSelection,\n installedStack: ProjectConfig[\"stack\"],\n editRoot: EditRoot,\n): ReassignedChanges {\n const { assignedStack } = result;\n\n const ownedHere = (agent: AgentScopeConfig): boolean =>\n editRoot.isGlobal || isActiveAt(agent, \"project\");\n const countedAsAdded = (agent: AgentScopeConfig): boolean =>\n changes.addedAgents.includes(agent.name);\n const rowsMoved = (agent: AgentScopeConfig): boolean =>\n !sameAssignments(assignedStack[agent.name], installedStack?.[agent.name]);\n\n const reassigned = result.agentConfigs.filter(\n (agent) => ownedHere(agent) && !countedAsAdded(agent) && rowsMoved(agent),\n );\n return { ...changes, reassignedAgents: reassigned.map((agent) => agent.name) };\n}\n\n/**\n * What the apply adds or changes, by landing scope. Excludes what is already installed as stated,\n * the global copy a dropped project half leaves, which the plan lists as a removal, and the held\n * global sub-agents a row joins, which {@link joinedStatement} names.\n */\nfunction applyArrivals(changes: PlannedChanges, result: InstallSelection): Arrivals {\n const changedSkills = new Set<SkillId>([\n ...changes.addedSkills,\n ...changes.sourceChanges.keys(),\n ...changes.scopeChanges.keys(),\n ]);\n const changedAgents = new Set<AgentName>([\n ...changes.addedAgents,\n ...changes.agentScopeChanges.keys(),\n ...changes.tuningChanges.keys(),\n ...changes.reassignedAgents,\n ]);\n const dropped = droppedProjectHalves(changes);\n const skillArrives = (skill: SkillConfig): boolean =>\n changedSkills.has(skill.id) && !dropped.skillIds.includes(skill.id);\n const agentArrives = (agent: AgentScopeConfig): boolean =>\n changedAgents.has(agent.name) && !dropped.agentNames.includes(agent.name);\n\n return arrivalsByScope(\n result.skills.filter(skillArrives),\n result.agentConfigs.filter(agentArrives),\n );\n}\n\n/** Disclosed rather than acted on, so nobody is left wondering why an agent kept a skill. */\nfunction keptStatements(kept: KeptFromRoundTrip): string[] {\n return [...authorshipStatement(kept), ...catalogueStatement(kept)];\n}\n\nfunction authorshipStatement(kept: KeptFromRoundTrip): string[] {\n if (kept.authoredSkillIds.length === 0) return [];\n return [authoredHereKept(kept.authoredSkillIds)];\n}\n\nfunction catalogueStatement(kept: KeptFromRoundTrip): string[] {\n if (kept.unplaceableSkillIds.length === 0) return [];\n return [unplaceableKept(kept.unplaceableSkillIds)];\n}\n\nfunction unassignedStatement(unassigned: UnassignedRow[]): string[] {\n if (unassigned.length === 0) return [];\n return [\n unassigned\n .map(({ skillId, agentName, category }) => keptUnassigned(skillId, agentName, category))\n .join(\"\\n\"),\n ];\n}\n\nfunction keptAsInstalledStatement(held: HeldGlobal, revisedCarried: SkillId[]): string[] {\n const skillIds = [...held.keptAsInstalled.skillIds, ...revisedCarried];\n const { agentNames } = held.keptAsInstalled;\n if (skillIds.length === 0 && agentNames.length === 0) return [];\n return [keptAsInstalledGlobally(skillIds, agentNames)];\n}\n\n/**\n * At the home root the run owns everything it loaded. In a project it owns only the project's\n * entries: a shared configuration only adds to the global install from a project (owner ruling\n * 2026-10-02).\n */\nfunction applyAuthority(editRoot: EditRoot): AuthoritativeScope {\n return editRoot.isGlobal ? \"all\" : \"owned\";\n}\n\nexport default class Edit extends BaseCommand {\n static summary = \"Open this installation in the editor, or apply a configuration with --from\";\n static description =\n \"Open this installation in agentsinc.sh/editor, or apply a configuration built there with --from\";\n\n static examples = [\n {\n description: \"Open this installation in the editor\",\n command: \"<%= config.bin %> <%= command.id %>\",\n },\n {\n description: \"Apply a configuration built in the editor, by its id\",\n command: \"<%= config.bin %> <%= command.id %> --from <id>\",\n },\n {\n description: \"Look at a shared configuration without applying it\",\n command: \"<%= config.bin %> <%= command.id %> --ui --from <id>\",\n },\n ];\n\n static flags = {\n ui: Flags.boolean({\n description:\n \"Open agentsinc.sh/editor on this installation, or on the id --from names without applying it — what a bare edit does\",\n default: false,\n }),\n from: Flags.string({\n description:\n \"Apply a configuration shared from agentsinc.sh by its id, removing whatever it leaves out — from a project, only the project's own entries\",\n helpValue: \"<id>\",\n }),\n provider: providerFlag(),\n };\n\n /** The exit code is decided once, after every path through `applyEdit`. */\n async run(): Promise<void> {\n await this.applyEdit();\n this.exitIfWorkIncomplete();\n }\n\n private async applyEdit(): Promise<void> {\n const { flags } = await this.parse(Edit);\n const cwd = process.cwd();\n\n // Above every installation check: opening a shared id needs no local state (owner ruling\n // 2026-08-24, pinned by `edit-ui-from.e2e.test.ts`).\n if (flags.ui && flags.from !== undefined) return this.openSharedInEditor(flags.from, cwd);\n\n // Before anything is copied or installed.\n await refuseAnAmbiguousInstallation(cwd, \"edit\", providerNamedBy(flags.provider), (message) =>\n this.error(message, { exit: EXIT_CODES.INVALID_ARGS }),\n );\n\n // Before anything renders: an unreadable config is recreated, not edited.\n await this.ensureConfigReadable(cwd);\n await this.refuseUnofferablePlacements(cwd);\n\n // A bare `edit` is `edit --ui`, and needs no source load.\n if (flags.from === undefined) return this.openInEditor(cwd);\n\n // A destructive apply nobody can confirm must never become a yes; refused before the fetch.\n const payload = await this.fetchSharedConfigOrFail(flags.from);\n\n const context = await this.loadContextUnderSpinner();\n\n const editRoot = resolveEditRoot(context.installation);\n\n // A skill whose metadata.yaml no longer describes it would be dropped from config.ts.\n await this.ensureSavedSkillsReadable(\n context.projectConfig?.skills ?? [],\n context.sourceResult.matrix,\n editRoot.dir,\n );\n\n const selection = await this.selectionFromSharedConfig(payload, context, editRoot);\n\n const { result } = selection;\n this.reportValidationErrors(result.validation);\n\n const activeNewSkills = result.skills.filter((s) => !s.excluded);\n const activeNewAgents = result.agentConfigs.filter((a) => !a.excluded);\n const activeOldSkills = (context.projectConfig?.skills ?? []).filter((s) => !s.excluded);\n const activeOldAgents = (context.projectConfig?.agents ?? []).filter((a) => !a.excluded);\n\n const filteredResult: InstallSelection = {\n ...result,\n skills: activeNewSkills,\n agentConfigs: activeNewAgents,\n };\n const filteredOldConfig: ProjectConfig | null = context.projectConfig\n ? { ...context.projectConfig, skills: activeOldSkills, agents: activeOldAgents }\n : null;\n\n const planned: PlannedChanges = {\n ...withReassignments(\n detectConfigChanges(filteredOldConfig, filteredResult, {\n newSkills: result.skills,\n oldSkills: context.projectConfig?.skills ?? [],\n newAgents: result.agentConfigs,\n oldAgents: context.projectConfig?.agents ?? [],\n }),\n filteredResult,\n context.projectConfig?.stack,\n editRoot,\n ),\n joinedGlobalAgents: selection.joinedGlobalAgents,\n };\n // After the diff, above every mutation and the no-change return: carried skills may still have\n // bytes to land when the roster is unchanged.\n const rewritten = await this.confirmAndWriteCarried(selection, planned, filteredResult);\n const changes: AppliedChanges = {\n ...planned,\n rewrittenSkills: difference(rewritten, planned.addedSkills),\n };\n\n // One authority for the merger's config row and the global config the gate commits.\n const authority = applyAuthority(editRoot);\n\n if (!hasAnyChanges(changes)) {\n this.log(chalk.hex(CLI_COLORS.NEUTRAL)(\"No changes made.\"));\n return;\n }\n\n this.logChangeSummary(changes, filteredResult.skills, filteredOldConfig?.skills ?? []);\n const migratedSkillIds = await this.applyMigrations(\n changes,\n filteredResult,\n activeOldSkills,\n context,\n editRoot,\n );\n await this.applyScopeChanges(changes, filteredResult, context, editRoot);\n await this.applyCollapsedPairs(changes, context, editRoot);\n await this.applySourceChanges(changes, activeOldSkills, editRoot, migratedSkillIds);\n await this.applyPluginChanges(changes, filteredResult, activeOldSkills, context, editRoot);\n await this.copyNewLocalSkills(changes, filteredResult, context, editRoot);\n await this.removeDeletedLocalSkills(changes, activeOldSkills, editRoot);\n await this.writeConfigAndCompile(result, context, editRoot, authority);\n await this.cleanupStaleAgentFiles(changes, activeOldAgents, editRoot);\n await this.reportWhatThisHostCannotCarry(editRoot);\n this.logCompletionSummary(changes);\n }\n\n /**\n * A shared configuration applies destructively, except for a skill written here (`forkedFrom`)\n * and an id this catalogue cannot place — both disclosed in the confirm. From a project the\n * global install is only added to (owner ruling 2026-10-02): entries the configuration omits or\n * states otherwise are held as installed, and only what it lacks arrives.\n */\n private async selectionFromSharedConfig(\n payload: SeedPayload,\n context: EditContext,\n editRoot: EditRoot,\n ): Promise<EditSelection> {\n const { matrix: sourceMatrix } = context.sourceResult;\n // Before the decode: a carried skill answers to no catalogue until it is seated.\n const carried = this.registerExternalSkillsOrFail(payload, sourceMatrix, editRoot.dir);\n const { result, skippedSkillIds, skippedAgentNames } = this.decodeSeedOrFail(\n payload,\n sourceMatrix,\n );\n\n // Before any skip is narrated; `init --from` asks the same at the same point.\n this.refuseProjectScopedContentAtHome(result, editRoot.dir);\n\n // Ids the decode could not place stay, as does a sub-agent only they carried in: a catalogue\n // limit is not an instruction to delete.\n const unplaceable = new Set(skippedSkillIds);\n const reconciled = reconcileSharedConfig({\n decoded: withUnplaceableAssignees(result, context.projectConfig, payload, unplaceable),\n installed: context.projectConfig,\n authoredHere: await this.readAuthoredHere(context.projectConfig, editRoot.dir),\n unplaceable,\n });\n const held = restoreInstalledGlobal(\n reconciled.result,\n editRoot.isGlobal ? null : await readInstalledGlobal(editRoot.dir),\n );\n const arrivingCarried = notInstalledGlobally(carried, held);\n\n await this.refuseSharedConfigBeforeAsking(\n held.result,\n arrivingCarried,\n editRoot.dir,\n context.sourceResult,\n );\n\n // Held globally, so not written from a project; named in the plan instead.\n const heldGlobally = difference(carried, arrivingCarried);\n const revisedGlobally = await carriedSkillsThatDiffer(heldGlobally);\n\n // Warnings the load buffered.\n sayCapturedWarnings(context.startupMessages);\n if (skippedSkillIds.length > 0) this.warn(skippedUnknownSkills(skippedSkillIds));\n if (skippedAgentNames.length > 0) this.warn(skippedUnknownAgents(skippedAgentNames));\n\n return {\n result: held.result,\n kept: [\n ...keptStatements(reconciled.kept),\n ...unassignedStatement(reconciled.unassigned),\n ...joinedStatement(held),\n ...keptAsInstalledStatement(held, revisedGlobally),\n ],\n carried: arrivingCarried,\n joinedGlobalAgents: held.joined.map(({ agentName }) => agentName),\n };\n }\n\n /** Best-effort: an unreadable directory protects nothing and must not fail an apply. */\n private async readAuthoredHere(\n projectConfig: ProjectConfig | null,\n editRoot: string,\n ): Promise<Set<SkillId>> {\n if (!projectConfig) return new Set();\n\n try {\n return await skillsAuthoredHere(projectConfig, editRoot);\n } catch (error) {\n this.warn(`Could not tell which skills were written here: ${getErrorMessage(error)}`);\n return new Set();\n }\n }\n\n /** Refuses an empty directory or a missing terminal before spending a round trip. */\n private async fetchSharedConfigOrFail(id: string): Promise<SeedPayload> {\n if (!(await detectProject())) {\n this.error(nothingInstalledToApplyTo(id), { exit: EXIT_CODES.ERROR });\n }\n if (!process.stdin.isTTY) {\n this.error(sharedConfigNeedsTerminal(id), { exit: EXIT_CODES.ERROR });\n }\n\n this.log(`Fetching configuration ${id}...`);\n const fetched = await fetchSeedConfig(id);\n if (!fetched.ok) {\n this.error(fetched.error, { exit: EXIT_CODES.ERROR });\n }\n\n return fetched.payload;\n }\n\n private decodeSeedOrFail(payload: SeedPayload, sourceMatrix: MergedSkillsMatrix): SeedMapping {\n try {\n return seedToInstallSelection(payload, sourceMatrix);\n } catch (error) {\n this.handleError(error);\n }\n }\n\n private registerExternalSkillsOrFail(\n payload: SeedPayload,\n sourceMatrix: MergedSkillsMatrix,\n projectDir: string,\n ): ExternalSkillInstall[] {\n try {\n return registerExternalSkills(payload, sourceMatrix, projectDir);\n } catch (error) {\n this.handleError(error);\n }\n }\n\n private async confirmAndWriteCarried(\n selection: EditSelection,\n planned: PlannedChanges,\n result: InstallSelection,\n ): Promise<SkillId[]> {\n await this.confirmSharedConfigOrCancel(planned, selection.kept, applyArrivals(planned, result));\n return this.writeCarriedSkills(selection.carried);\n }\n\n private async writeCarriedSkills(carried: ExternalSkillInstall[]): Promise<SkillId[]> {\n if (carried.length === 0) return [];\n\n const rewritten = await writeExternalSkills(carried);\n this.log(carriedSkillsWritten(carried.map((skill) => skill.id)));\n return rewritten;\n }\n\n /**\n * The plan and the apply read the same `ConfigChanges`, so what is approved is what is removed.\n * The arrivals print above it, so the question covers the whole of what a yes does.\n */\n private async confirmSharedConfigOrCancel(\n changes: ConfigChanges,\n kept: string[],\n arrivals: Arrivals,\n ): Promise<void> {\n const plan = sharedConfigPlan(changes, kept);\n for (const line of arrivalLines(arrivals)) {\n this.log(line);\n }\n\n const outcome = await promptConfirm(({ onConfirm, onCancel }) => (\n <RemovalPlanConfirm\n heading={plan.heading}\n sections={plan.sections}\n statements={plan.statements}\n message={SHARED_CONFIG_APPLY.CONFIRM}\n onConfirm={onConfirm}\n onCancel={onCancel}\n />\n ));\n if (outcome === \"confirmed\") return;\n\n this.log(\"\\nEdit cancelled\");\n this.error(\"Cancelled\", { exit: EXIT_CODES.CANCELLED });\n }\n\n /** `edit` rewrites the file, so it must not let a user curate a roster no command acts on. */\n private async refuseUnofferablePlacements(cwd: string): Promise<void> {\n const [finding] = await unofferablePlacementsFound(cwd);\n if (finding !== undefined) this.error(finding, { exit: EXIT_CODES.ERROR });\n }\n\n /**\n * Mints through `seedPayloadForInstallation`, as `share` does, so one project has one id. Touches\n * nothing on disk.\n */\n private async openInEditor(projectDir: string): Promise<void> {\n await this.ensureInstalledSkillsReadable(projectDir);\n\n const prepared = await seedPayloadForInstallation(projectDir);\n if (!prepared.ok) {\n this.error(prepared.error, { exit: EXIT_CODES.ERROR });\n }\n\n this.log(`Opening ${prepared.skills} skill(s) across ${prepared.agents} sub-agent(s)...`);\n\n const published = await publishSeedConfig(prepared.payload);\n if (!published.ok) {\n this.error(published.error, { exit: EXIT_CODES.ERROR });\n }\n\n await this.handToBrowser(published.id);\n }\n\n /**\n * The payload reads every ejected skill's metadata.yaml for its provenance, and no catalogue is\n * loaded here to resolve a skill around it, so every installed entry is asked about — not only\n * those a catalogue lacks, as `edit --from` asks. The config read is the one the payload reads.\n */\n private async ensureInstalledSkillsReadable(projectDir: string): Promise<void> {\n const loaded = await loadProjectConfig(projectDir);\n // Nothing installed is `seedPayloadForInstallation`'s to report.\n if (!loaded) return;\n\n await this.refuseUnusableSavedSkillMetadata(\n loaded.config.skills,\n projectDir,\n editorSkillMetadataUnusableError,\n );\n }\n\n /** Opens an id rather than applying it; `--from` without `--ui` is the destructive apply. */\n private async openSharedInEditor(id: string, cwd: string): Promise<void> {\n const url = editorConfigUrl(id);\n\n this.log(`Open it at ${url}`);\n this.log(applySharedConfigHere(id, await holdsItsOwnInstallation(cwd)));\n\n if (!process.stdin.isTTY) return;\n\n const opened = await openUrl(url);\n if (!opened.ok) this.warn(opened.error);\n }\n\n /** The link prints first: it works over a pipe, in CI and with no desktop. Opening is extra. */\n private async handToBrowser(id: string): Promise<void> {\n this.logSuccess(`Shared as ${id}`);\n for (const destination of sharedConfigDestinations(id)) {\n this.log(destination);\n }\n\n if (!process.stdin.isTTY) return;\n\n const opened = await openUrl(editorConfigUrl(id));\n if (!opened.ok) this.warn(opened.error);\n }\n\n private async loadContextUnderSpinner(): Promise<EditContext> {\n return awaitUnderSpinner(STATUS_MESSAGES.LOADING_SKILLS, () => this.loadContext());\n }\n\n private async loadContext(): Promise<EditContext> {\n const detected = await detectProject();\n if (!detected) {\n this.error(ERROR_MESSAGES.NO_INSTALLATION, {\n exit: EXIT_CODES.ERROR,\n });\n }\n const { installation, config: projectConfig } = detected;\n\n try {\n const { sourceResult, startupMessages } = await loadSource({\n projectDir: installation.projectDir,\n captureStartupMessages: true,\n });\n return { installation, projectConfig, sourceResult, startupMessages };\n } catch (error) {\n this.handleError(error);\n }\n }\n\n private logChangeSummary(\n changes: AppliedChanges,\n newSkills: SkillConfig[],\n oldSkills: SkillConfig[],\n ): void {\n const {\n addedSkills,\n removedSkills,\n addedAgents,\n removedAgents,\n sourceChanges,\n scopeChanges,\n agentScopeChanges,\n dualScopeSkillTransitions,\n dualScopeAgentTransitions,\n tuningChanges,\n reassignedAgents,\n joinedGlobalAgents,\n rewrittenSkills,\n } = changes;\n\n this.log(`\\n${chalk.hex(CLI_COLORS.WHITE).bold(\"Changes:\")}`);\n for (const skillId of addedSkills) {\n const scope = newSkills.find((s) => s.id === skillId)?.scope;\n const scopeLabel = scope ? ` ${formatScopeTag(scope)}` : \"\";\n this.log(\n chalk.hex(CLI_COLORS.SUCCESS)(` + ${getSkillById(skillId).displayName}${scopeLabel}`),\n );\n }\n for (const skillId of removedSkills) {\n const scope = oldSkills.find((s) => s.id === skillId)?.scope;\n const scopeLabel = scope ? ` ${formatScopeTag(scope)}` : \"\";\n this.log(chalk.hex(CLI_COLORS.ERROR)(` - ${getSkillDisplayName(skillId)}${scopeLabel}`));\n }\n for (const agentName of addedAgents) {\n this.log(\n chalk.hex(CLI_COLORS.SUCCESS)(` + ${agentName}`) +\n chalk.hex(CLI_COLORS.NEUTRAL)(\" (agent)\"),\n );\n }\n for (const agentName of removedAgents) {\n this.log(\n chalk.hex(CLI_COLORS.ERROR)(` - ${agentName}`) + chalk.hex(CLI_COLORS.NEUTRAL)(\" (agent)\"),\n );\n }\n for (const [skillId, change] of sourceChanges) {\n const displayName = getSkillDisplayName(skillId);\n const fromLabel = formatSourceDisplayName(change.from);\n const toLabel = formatSourceDisplayName(change.to);\n this.log(\n chalk.hex(CLI_COLORS.WARNING)(` ~ ${displayName}`) +\n chalk.hex(CLI_COLORS.NEUTRAL)(` (${fromLabel} \\u2192 ${toLabel})`),\n );\n }\n for (const [skillId, change] of scopeChanges) {\n this.log(formatSkillScopeChangeLine(skillId, change, dualScopeSkillTransitions));\n }\n for (const [agentName, change] of agentScopeChanges) {\n this.log(formatAgentScopeChangeLine(agentName, change, dualScopeAgentTransitions));\n }\n // A retune moves no file, so it needs its own line or the run reads as a no-op.\n for (const [agentName, change] of tuningChanges) {\n this.log(formatValueChangeLine(agentName, change, \"agent\"));\n }\n // Neither does a re-assignment.\n for (const agentName of reassignedAgents) {\n this.log(\n chalk.hex(CLI_COLORS.WARNING)(` ~ ${agentName}`) +\n chalk.hex(CLI_COLORS.NEUTRAL)(\" (agent: skills reassigned)\"),\n );\n }\n // Nor rows joining a held global sub-agent, which keeps everything else.\n for (const agentName of joinedGlobalAgents) {\n this.log(\n chalk.hex(CLI_COLORS.WARNING)(` ~ ${agentName}`) +\n chalk.hex(CLI_COLORS.NEUTRAL)(` ${formatScopeTag(\"global\")} (agent: skills added)`),\n );\n }\n for (const skillId of rewrittenSkills) {\n this.log(\n chalk.hex(CLI_COLORS.WARNING)(` ~ ${getSkillDisplayName(skillId)}`) +\n chalk.hex(CLI_COLORS.NEUTRAL)(\" (skill: files rewritten)\"),\n );\n }\n this.log(\"\");\n }\n\n private async applyMigrations(\n changes: ConfigChanges,\n filteredResult: InstallSelection,\n activeOldSkills: SkillConfig[],\n context: EditContext,\n editRoot: EditRoot,\n ): Promise<Set<SkillId>> {\n const migrationPlan = detectMigrations(\n withMaskedGlobalsRestored(activeOldSkills, changes.collapsedPairs),\n filteredResult.skills,\n );\n const migratedSkillIds = new Set([\n ...migrationPlan.toEject.map((m) => m.id),\n ...migrationPlan.toPlugin.map((m) => m.id),\n ]);\n if (migratedSkillIds.size === 0) return migratedSkillIds;\n\n if (migrationPlan.toEject.length > 0) {\n this.logModeSwitch(migrationPlan.toEject.length, INSTALL_MODE_DESCRIPTIONS.eject);\n }\n if (migrationPlan.toPlugin.length > 0) {\n this.logModeSwitch(migrationPlan.toPlugin.length, INSTALL_MODE_DESCRIPTIONS.plugin);\n // `claude plugin install` needs the marketplace registered and current. Before\n // `executeMigration`, so an unresolvable marketplace exits with the ejected copies intact.\n await this.requireMarketplaceOrExit(\n context.sourceResult,\n \"migrate skills to plugin mode\",\n hostAt(editRoot.dir),\n );\n // `executeMigration` installs, deleting each working copy as its plugin registers, so the\n // banner is announced here.\n this.announcePluginInstall();\n }\n\n const migrationResult = await executeMigration(\n migrationPlan,\n editRoot.dir,\n context.sourceResult,\n );\n\n for (const warning of migrationResult.warnings) {\n this.warn(warning);\n }\n\n // Hard-errors before anything records `origin: \"eject\"` for a skill with no copy on disk.\n if (migrationPlan.toEject.length > 0) {\n this.reportEjectCopies(migrationResult.ejectCopies);\n }\n\n // Hard-errors before anything records a marketplace `origin` for an unregistered skill.\n if (migrationPlan.toPlugin.length > 0) {\n this.reportPluginInstalls(migrationResult.pluginInstalls);\n }\n\n return migratedSkillIds;\n }\n\n /**\n * Mirrors `BaseCommand.reportPluginInstalls` for the plugin→eject half. The count line names no\n * destination: copies split between the project and $HOME by each skill's scope.\n */\n private reportEjectCopies(result: EjectCopyResult): void {\n for (const item of result.failed) {\n this.warn(`Failed to copy ${item.id} for eject: ${item.error}`);\n }\n if (result.failed.length > 0) {\n this.error(ejectCopyFailureError(result.failed.length), { exit: EXIT_CODES.ERROR });\n }\n this.log(chalk.hex(CLI_COLORS.NEUTRAL)(localSkillsCopied(result.copied.length)));\n }\n\n private logModeSwitch(count: number, modeDescription: string): void {\n this.log(chalk.hex(CLI_COLORS.NEUTRAL)(`Switching ${count} skill(s) to ${modeDescription}`));\n }\n\n /**\n * A collapsed `[P][G]` pair is not a move: its project half is dropped\n * ({@link applyCollapsedPairs}).\n */\n private async applyScopeChanges(\n changes: ConfigChanges,\n filteredResult: InstallSelection,\n context: EditContext,\n editRoot: EditRoot,\n ): Promise<void> {\n const scopeChanges = scopeMovesOf(changes);\n\n for (const [skillId, change] of scopeChanges) {\n const skillConfig = filteredResult.skills.find((s) => s.id === skillId);\n if (skillConfig?.origin === EJECT_SOURCE) {\n await migrateLocalSkillScope(skillId, change.from, editRoot.dir);\n }\n }\n\n // Only resolve the marketplace when a plugin scope migration exists.\n const hasPluginScopeChanges = [...scopeChanges.keys()].some((skillId) => {\n const skillConfig = filteredResult.skills.find((s) => s.id === skillId);\n return skillConfig && skillConfig.origin !== EJECT_SOURCE;\n });\n if (!hasPluginScopeChanges) return;\n\n const marketplace = await this.requireMarketplaceOrExit(\n context.sourceResult,\n \"migrate plugin skill scopes\",\n hostAt(editRoot.dir),\n );\n\n const pluginScopeResult = await migratePluginSkillScopes(\n scopeChanges,\n filteredResult.skills,\n marketplace,\n editRoot.dir,\n );\n // A migration installs at the new scope, so unlike an uninstall a failure is not diagnostic:\n // the skill is registered at neither scope.\n for (const item of pluginScopeResult.failed) {\n this.reportIncompleteWork(\n `Failed to migrate plugin scope for ${item.id}: ${item.error}`,\n INCOMPLETE_WORK_RECOVERY.INSPECT_INSTALLATION,\n );\n }\n }\n\n /**\n * Each project half is removed at project scope only. The global install's mode is\n * {@link applyMigrations}' to change. The uninstall is diagnostic, as every one here is.\n */\n private async applyCollapsedPairs(\n changes: ConfigChanges,\n context: EditContext,\n editRoot: EditRoot,\n ): Promise<void> {\n const [ejectedHalves, pluginHalves] = partition(\n changes.collapsedPairs.map(({ projectHalf }) => projectHalf),\n (half) => half.origin === EJECT_SOURCE,\n );\n\n for (const half of ejectedHalves) {\n await deleteLocalSkill(editRoot.dir, half.id, half.scope);\n }\n await this.uninstallProjectPluginHalves(\n pluginHalves,\n context.sourceResult.marketplace,\n editRoot,\n );\n }\n\n private async uninstallProjectPluginHalves(\n pluginHalves: SkillConfig[],\n marketplace: string | undefined,\n editRoot: EditRoot,\n ): Promise<void> {\n if (pluginHalves.length === 0) return;\n if (marketplace === undefined) {\n for (const half of pluginHalves) {\n this.warn(`Could not uninstall this project's plugin for ${half.id}: no marketplace`);\n }\n return;\n }\n\n const uninstallResult = await uninstallPluginSkills(\n pluginHalves.map((half) => half.id),\n pluginHalves,\n marketplace,\n editRoot.dir,\n );\n if (uninstallResult.uninstalled.length > 0) {\n this.log(\n chalk.hex(CLI_COLORS.NEUTRAL)(`Removed ${uninstallResult.uninstalled.length} plugin(s)`),\n );\n }\n for (const item of uninstallResult.failed) {\n this.warn(`Failed to uninstall plugin ${item.id}: ${item.error}`);\n }\n }\n\n private async applySourceChanges(\n changes: ConfigChanges,\n activeOldSkills: SkillConfig[],\n editRoot: EditRoot,\n migratedSkillIds: Set<SkillId>,\n ): Promise<void> {\n const { sourceChanges } = changes;\n\n // Non-migration source changes, e.g. marketplace A -> marketplace B.\n for (const [skillId, change] of sourceChanges) {\n if (migratedSkillIds.has(skillId)) {\n continue;\n }\n if (change.from === EJECT_SOURCE) {\n const oldSkill = activeOldSkills.find((s) => s.id === skillId);\n await deleteLocalSkill(editRoot.dir, skillId, oldSkill?.scope);\n }\n }\n }\n\n private async applyPluginChanges(\n changes: ConfigChanges,\n filteredResult: InstallSelection,\n activeOldSkills: SkillConfig[],\n context: EditContext,\n editRoot: EditRoot,\n ): Promise<void> {\n const { addedSkills, removedSkills } = changes;\n\n const addedPluginSkills = filteredResult.skills.filter(\n (s) => addedSkills.includes(s.id) && s.origin !== EJECT_SOURCE,\n );\n const removedPluginSkills = removedSkills.filter(\n (id) => activeOldSkills.find((s) => s.id === id)?.origin !== EJECT_SOURCE,\n );\n\n if (addedPluginSkills.length === 0 && removedPluginSkills.length === 0) return;\n\n const marketplace = await this.requireMarketplaceOrExit(\n context.sourceResult,\n \"install or uninstall plugin skills\",\n hostAt(editRoot.dir),\n );\n\n if (addedPluginSkills.length > 0) {\n await this.installPluginSkillsReported(\n addedPluginSkills,\n marketplace,\n editRoot.dir,\n context.sourceResult.matrix,\n );\n }\n\n if (removedPluginSkills.length > 0) {\n const uninstallResult = await uninstallPluginSkills(\n removedPluginSkills,\n activeOldSkills,\n marketplace,\n editRoot.dir,\n );\n if (uninstallResult.uninstalled.length > 0) {\n this.log(\n chalk.hex(CLI_COLORS.NEUTRAL)(`Removed ${uninstallResult.uninstalled.length} plugin(s)`),\n );\n }\n for (const item of uninstallResult.failed) {\n this.warn(`Failed to uninstall plugin ${item.id}: ${item.error}`);\n }\n }\n }\n\n private async copyNewLocalSkills(\n changes: ConfigChanges,\n filteredResult: InstallSelection,\n context: EditContext,\n editRoot: EditRoot,\n ): Promise<void> {\n const { addedSkills } = changes;\n\n const addedLocalSkills = filteredResult.skills.filter(\n (s) => addedSkills.includes(s.id) && s.origin === EJECT_SOURCE,\n );\n\n if (addedLocalSkills.length > 0) {\n const copyResult = await copyLocalSkills(\n addedLocalSkills,\n editRoot.dir,\n context.sourceResult,\n );\n this.log(chalk.hex(CLI_COLORS.NEUTRAL)(localSkillsCopied(copyResult.totalCopied)));\n }\n }\n\n private async removeDeletedLocalSkills(\n changes: ConfigChanges,\n activeOldSkills: SkillConfig[],\n editRoot: EditRoot,\n ): Promise<void> {\n const { removedSkills } = changes;\n\n // A deselected eject skill is uninstalled at its scope; plugin removals and eject->marketplace\n // deletions belong to applyPluginChanges and applySourceChanges.\n for (const skillId of removedSkills) {\n const oldSkill = activeOldSkills.find((s) => s.id === skillId);\n if (oldSkill?.origin !== EJECT_SOURCE) continue;\n\n await deleteLocalSkill(editRoot.dir, skillId, oldSkill.scope);\n }\n }\n\n private async writeConfigAndCompile(\n result: InstallSelection,\n context: EditContext,\n editRoot: EditRoot,\n authority: AuthoritativeScope,\n ): Promise<void> {\n let agentDefsResult: AgentDefs;\n try {\n agentDefsResult = await loadAgentDefs();\n } catch (error) {\n this.handleError(error);\n }\n\n // A failed write is fatal: every mutation has landed and config.ts is their only record.\n let configResult: ConfigWriteResult;\n try {\n configResult = await writeProjectConfig({\n selection: result,\n sourceResult: context.sourceResult,\n projectDir: editRoot.dir,\n agentDefs: agentDefsResult,\n authoritativeScope: authority,\n });\n } catch (error) {\n this.error(`Could not update config: ${getErrorMessage(error)}`, {\n exit: EXIT_CODES.ERROR,\n });\n }\n\n this.reportUnassignedSkills(configResult.config, result.skills);\n\n try {\n const agentScopeMap = activeAgentScopeMap(result.agentConfigs);\n const { allSkills } = await discoverInstalledSkills(editRoot.dir);\n const compile = compilesGlobalScope(editRoot, configResult.propagation)\n ? compileAgentsAllScopes\n : compileProjectScope;\n const compilationResult = await compile({\n projectDir: editRoot.dir,\n sourcePath: agentDefsResult.sourcePath,\n skills: allSkills,\n agentScopeMap,\n });\n\n const { compiled, rewritten, failed, warnings } = compilationResult;\n const summary = recompileSummary(\n rewritten.length,\n compiled.length - rewritten.length,\n RECOMPILE_SUBJECT,\n );\n\n if (failed.length > 0) {\n this.log(\n chalk.hex(CLI_COLORS.NEUTRAL)(summary) +\n chalk.hex(CLI_COLORS.WARNING)(` (${failed.length} failed)`),\n );\n for (const warning of warnings) {\n this.warn(warning);\n }\n // Off `failed`: `warnings` also carries non-failures.\n this.recordIncompleteWork(agentsNotCompiled(failed), INCOMPLETE_WORK_RECOVERY.RECOMPILE);\n } else if (compiled.length > 0) {\n this.log(chalk.hex(CLI_COLORS.NEUTRAL)(summary));\n } else {\n this.log(chalk.hex(CLI_COLORS.NEUTRAL)(INFO_MESSAGES.NO_AGENTS_TO_RECOMPILE));\n }\n } catch (error) {\n // The config already landed; a failed recompile must not end in silence.\n this.reportIncompleteWork(\n `Agent recompilation failed: ${getErrorMessage(error)}`,\n INCOMPLETE_WORK_RECOVERY.RECOMPILE,\n );\n this.log(`You can manually recompile with '${CLI_INVOKE_COMMAND} compile'.`);\n }\n\n this.reportFanOut(configResult.propagation);\n }\n\n private async cleanupStaleAgentFiles(\n changes: ConfigChanges,\n oldAgents: AgentScopeConfig[],\n editRoot: EditRoot,\n ): Promise<void> {\n for (const removal of planStaleAgentRemovals(changes, oldAgents, editRoot.dir)) {\n const { failed } = await removeCompiledAgents(removal);\n\n // A compiled sub-agent left behind is still loaded by Claude Code.\n for (const { name, error } of failed) {\n const agentPath = path.join(removal.agentsDir, `${name}.md`);\n this.reportIncompleteWork(\n `Could not remove agent file ${agentPath}: ${error}`,\n INCOMPLETE_WORK_RECOVERY.DELETE_AGENT_FILE,\n );\n }\n }\n }\n\n /**\n * The host notices `init` and `compile` print ({@link hostCompileNotices}), after\n * {@link cleanupStaleAgentFiles} so a deleted file is not counted. Skipped on a run that owes\n * work, whose tree may not be readable.\n */\n private async reportWhatThisHostCannotCarry(editRoot: EditRoot): Promise<void> {\n if (this.hasIncompleteWork) return;\n\n for (const notice of await hostCompileNotices(providerInUse(editRoot.dir), editRoot.dir)) {\n this.log(notice);\n }\n }\n\n private logCompletionSummary(_changes: ConfigChanges): void {\n if (this.hasIncompleteWork) return;\n\n this.log(`\\n${chalk.hex(CLI_COLORS.SUCCESS)(\"\\u2713 Done\")}\\n`);\n }\n}\n\n/** @internal Exported for testing */\nexport type ConfigChanges = {\n addedSkills: SkillId[];\n removedSkills: SkillId[];\n addedAgents: AgentName[];\n removedAgents: AgentName[];\n sourceChanges: Map<SkillId, { from: string; to: string }>;\n scopeChanges: Map<SkillId, ScopeChange>;\n agentScopeChanges: Map<AgentName, ScopeChange>;\n /** Dual-scope add/removes in `scopeChanges`, which the summary must not report as migrations. */\n dualScopeSkillTransitions: Set<SkillId>;\n /**\n * The `[P][G]` pairs this edit collapsed, as they stood before it. The project's own install is\n * dropped, so `sourceChanges` and the mode migrations measure a collapsed skill against\n * `maskedGlobal`.\n */\n collapsedPairs: CollapsedPair[];\n /** Agent equivalent of `dualScopeSkillTransitions`. */\n dualScopeAgentTransitions: Set<AgentName>;\n /** Retuned sub-agents (model, effort) with an unchanged roster: nothing moves, yet it changed. */\n tuningChanges: Map<AgentName, ValueChange>;\n};\n\ntype ValueChange = { from: string; to: string };\n\n/** A collapsed `[P][G]` pair, as the config held it before the edit. */\ntype CollapsedPair = {\n /** The project's own install: the half the collapse drops. */\n projectHalf: SkillConfig;\n /** The global install the project half masked, as its tombstone recorded it. */\n maskedGlobal: SkillConfig;\n};\n\n/** Full (tombstone-inclusive) entry lists used to classify dual-scope transitions. */\ntype FullScopeEntries = {\n newSkills: SkillConfig[];\n oldSkills: SkillConfig[];\n newAgents: AgentScopeConfig[];\n oldAgents: AgentScopeConfig[];\n};\n\n/**\n * @internal Exported for testing\n *\n * `fullEntries` carries the tombstone-inclusive lists, used only to tell a scope migration from a\n * dual-scope add/remove; without it every scope change is a migration.\n */\nexport function detectConfigChanges(\n oldConfig: ProjectConfig | null,\n selection: InstallSelection,\n fullEntries?: FullScopeEntries,\n): ConfigChanges {\n const oldSkillIds = oldConfig?.skills.map((s) => s.id) ?? [];\n const newSkillIds = selection.skills.map((s) => s.id);\n const oldAgentNames = oldConfig?.agents.map((a) => a.name) ?? [];\n const newAgentNames = selection.agentConfigs.map((a) => a.name);\n\n const oldSkillsById = indexBy(oldConfig?.skills ?? [], (s) => s.id);\n const oldAgentsByName = indexBy(oldConfig?.agents ?? [], (a) => a.name);\n\n const scopeChanges = detectPropertyChanges(\n selection.skills,\n oldSkillsById,\n (s) => s.id,\n (s) => s.scope,\n );\n const agentScopeChanges = detectPropertyChanges(\n selection.agentConfigs,\n oldAgentsByName,\n (a) => a.name,\n (a) => a.scope,\n );\n const dualScopeSkillTransitions = detectDualScopeTransitions(\n scopeChanges,\n fullEntries?.newSkills ?? [],\n fullEntries?.oldSkills ?? [],\n (s) => s.id,\n );\n const collapsedPairs = collapsedPairsOf(\n scopeChanges,\n dualScopeSkillTransitions,\n fullEntries?.oldSkills ?? [],\n );\n\n return {\n addedSkills: difference(newSkillIds, oldSkillIds),\n removedSkills: difference(oldSkillIds, newSkillIds),\n addedAgents: difference(newAgentNames, oldAgentNames),\n removedAgents: difference(oldAgentNames, newAgentNames),\n sourceChanges: detectPropertyChanges(\n selection.skills,\n indexBy(withMaskedGlobalsRestored(oldConfig?.skills ?? [], collapsedPairs), (s) => s.id),\n (s) => s.id,\n (s) => s.origin,\n ),\n scopeChanges,\n agentScopeChanges,\n dualScopeSkillTransitions,\n collapsedPairs,\n dualScopeAgentTransitions: detectDualScopeTransitions(\n agentScopeChanges,\n fullEntries?.newAgents ?? [],\n fullEntries?.oldAgents ?? [],\n (a) => a.name,\n ),\n tuningChanges: detectPropertyChanges(\n selection.agentConfigs,\n oldAgentsByName,\n (a) => a.name,\n describeTuning,\n ),\n };\n}\n\nconst RESTING_TUNING = \"defaults\";\n\n/** Compared as a sentence, so the diff sees no change the summary has no words for. */\nfunction describeTuning(agent: AgentScopeConfig): string {\n const settings = [\n agent.model === undefined ? undefined : `model ${agent.model}`,\n agent.codexModel === undefined ? undefined : `codex model ${agent.codexModel}`,\n agent.effort === undefined ? undefined : `effort ${agent.effort}`,\n ].filter((setting) => setting !== undefined);\n\n return settings.length === 0 ? RESTING_TUNING : settings.join(\", \");\n}\n\nfunction detectPropertyChanges<T, K extends string, V>(\n newItems: T[],\n oldByKey: Record<string, T>,\n getKey: (item: T) => K,\n getValue: (item: T) => V,\n): Map<K, { from: V; to: V }> {\n const changes = new Map<K, { from: V; to: V }>();\n for (const item of newItems) {\n const key = getKey(item);\n const old = oldByKey[key];\n if (old && getValue(old) !== getValue(item)) {\n changes.set(key, { from: getValue(old), to: getValue(item) });\n }\n }\n return changes;\n}\n\n/**\n * A dual-scope transition, not a migration, when a global tombstone sits beside the change: G→P\n * keeps one in the new state, P→G had one in the old.\n */\nfunction detectDualScopeTransitions<\n K extends string,\n T extends { scope: SkillScope; excluded?: boolean },\n>(scopeChanges: Map<K, ScopeChange>, fullNew: T[], fullOld: T[], getKey: (item: T) => K): Set<K> {\n const hasGlobalTombstone = (items: T[], key: K): boolean =>\n items.some((item) => getKey(item) === key && item.scope === \"global\" && item.excluded === true);\n\n const result = new Set<K>();\n for (const [key, change] of scopeChanges) {\n if (change.from === \"global\" && change.to === \"project\" && hasGlobalTombstone(fullNew, key)) {\n result.add(key);\n } else if (\n change.from === \"project\" &&\n change.to === \"global\" &&\n hasGlobalTombstone(fullOld, key)\n ) {\n result.add(key);\n }\n }\n return result;\n}\n\n/** P→G dual-scope transitions as the pairs they collapsed, read from the old state. */\nfunction collapsedPairsOf(\n scopeChanges: Map<SkillId, ScopeChange>,\n dualScopeSkillTransitions: ReadonlySet<SkillId>,\n fullOldSkills: SkillConfig[],\n): CollapsedPair[] {\n return [...scopeChanges]\n .filter(([id, change]) => change.to === \"global\" && dualScopeSkillTransitions.has(id))\n .map(([id]) => ({\n projectHalf: oldHalfOf(fullOldSkills, id, (skill) => isActiveAt(skill, \"project\")),\n maskedGlobal: oldHalfOf(fullOldSkills, id, isGlobalTombstone),\n }));\n}\n\n/** Present by construction, so a miss is a defect. */\nfunction oldHalfOf(\n fullOldSkills: SkillConfig[],\n id: SkillId,\n isHalf: (skill: SkillConfig) => boolean,\n): SkillConfig {\n const half = fullOldSkills.find((skill) => skill.id === id && isHalf(skill));\n if (half === undefined) {\n throw new Error(`The config before this edit holds no such half of the pair for '${id}'`);\n }\n return half;\n}\n\n/**\n * The pre-edit roster with each collapsed pair's project half replaced by the global install it\n * masked: the only install whose mode a collapse can change.\n */\nfunction withMaskedGlobalsRestored(\n oldSkills: SkillConfig[],\n collapsedPairs: CollapsedPair[],\n): SkillConfig[] {\n const maskedById = indexBy(\n collapsedPairs.map(({ maskedGlobal }) => maskedGlobal),\n (skill) => skill.id,\n );\n return oldSkills.map((skill) => {\n const masked = maskedById[skill.id];\n if (masked === undefined || skill.scope !== \"project\") return skill;\n return installRecordedBy(masked);\n });\n}\n\nfunction installRecordedBy(tombstone: SkillConfig): SkillConfig {\n const { excluded: _masked, ...install } = tombstone;\n return install;\n}\n\n/** Excludes collapsed pairs, whose global install stays where it is. */\nfunction scopeMovesOf(changes: ConfigChanges): Map<SkillId, ScopeChange> {\n const collapsed = new Set(changes.collapsedPairs.map(({ projectHalf }) => projectHalf.id));\n return new Map([...changes.scopeChanges].filter(([id]) => !collapsed.has(id)));\n}\n\ntype StaleAgent = { name: AgentName; scope: SkillScope };\n\nconst STALE_AGENT_SCOPES = [\"project\", \"global\"] as const satisfies readonly SkillScope[];\n\n/** For a deselected agent absent from the old roster. */\nconst UNRECORDED_AGENT_SCOPE: SkillScope = \"project\";\n\nfunction installedScope(name: AgentName, oldAgents: AgentScopeConfig[]): SkillScope {\n return oldAgents.find((agent) => agent.name === name)?.scope ?? UNRECORDED_AGENT_SCOPE;\n}\n\n/**\n * The project copy a P→G move superseded, plus every deselected agent at its installed scope. G→P\n * is an override, so the global install stays. Only scopes this edit removed from are tidied.\n */\nfunction planStaleAgentRemovals(\n changes: ConfigChanges,\n oldAgents: AgentScopeConfig[],\n editRoot: string,\n): RemoveCompiledAgentsOptions[] {\n const supersededByGlobal = [...changes.agentScopeChanges]\n .filter(([, change]) => change.from !== \"global\")\n .map(([name]): StaleAgent => ({ name, scope: \"project\" }));\n\n const deselected = changes.removedAgents.map((name): StaleAgent => ({\n name,\n scope: installedScope(name, oldAgents),\n }));\n\n const stale = [...supersededByGlobal, ...deselected];\n const removalAtScope = (scope: SkillScope): RemoveCompiledAgentsOptions => ({\n agentsDir: resolveInstallPaths(editRoot, scope).agentsDir,\n agents: stale.filter((agent) => agent.scope === scope).map((agent) => agent.name),\n });\n\n return STALE_AGENT_SCOPES.map(removalAtScope).filter((removal) => removal.agents.length > 0);\n}\n\nfunction hasAnyChanges(changes: AppliedChanges): boolean {\n return (\n changes.reassignedAgents.length > 0 ||\n changes.joinedGlobalAgents.length > 0 ||\n changes.rewrittenSkills.length > 0 ||\n changes.addedSkills.length > 0 ||\n changes.removedSkills.length > 0 ||\n changes.addedAgents.length > 0 ||\n changes.removedAgents.length > 0 ||\n changes.sourceChanges.size > 0 ||\n changes.scopeChanges.size > 0 ||\n changes.agentScopeChanges.size > 0 ||\n changes.tuningChanges.size > 0\n );\n}\n\n/** @internal Exported for testing */\nexport type PluginScopeMigrationResult = {\n migrated: SkillId[];\n failed: Array<{ id: SkillId; error: string }>;\n};\n\n/** @internal Exported for testing */\nexport async function migratePluginSkillScopes(\n scopeChanges: Map<SkillId, ScopeChange>,\n skills: Pick<SkillConfig, \"id\" | \"origin\">[],\n marketplace: string,\n projectDir: string,\n): Promise<PluginScopeMigrationResult> {\n const host = hostAt(projectDir);\n const migrated: SkillId[] = [];\n const failed: PluginScopeMigrationResult[\"failed\"] = [];\n\n for (const [skillId, change] of scopeChanges) {\n const skillConfig = skills.find((s) => s.id === skillId);\n if (!skillConfig || skillConfig.origin === EJECT_SOURCE) {\n continue;\n }\n\n const pluginRef = buildMarketplacePluginRef(skillId, marketplace);\n\n try {\n // global→project: keep the global registration, just add project scope.\n // The global plugin must remain for other projects.\n // project→global: uninstall the project-scope registration, install global.\n if (change.from === \"project\") {\n await host.uninstallPlugin(pluginRef, \"project\", projectDir);\n }\n await host.installPlugin(pluginRef, change.to, projectDir);\n migrated.push(skillId);\n } catch (error) {\n failed.push({ id: skillId, error: getErrorMessage(error) });\n }\n }\n\n return { migrated, failed };\n}\n"],"mappings":"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","names":[]}
@@ -5,22 +5,21 @@ import {
5
5
  loadSource,
6
6
  mutateGlobal,
7
7
  writeProjectPartial
8
- } from "../chunk-5JUQKGCP.js";
9
- import "../chunk-TW35AEB4.js";
10
- import "../chunk-GE7NUPMI.js";
11
- import "../chunk-JIBCVXXL.js";
12
- import "../chunk-3LZNY46H.js";
8
+ } from "../chunk-7RDMTR64.js";
9
+ import "../chunk-F2BHT5C4.js";
10
+ import "../chunk-HED2DAXZ.js";
11
+ import "../chunk-3G7X2WKI.js";
12
+ import "../chunk-BMRUNMPV.js";
13
13
  import {
14
14
  providerFlag,
15
15
  providerNamedBy,
16
16
  refuseAnAmbiguousInstallation
17
- } from "../chunk-HR7TK2XW.js";
17
+ } from "../chunk-RIPSGNLU.js";
18
18
  import {
19
19
  BaseCommand,
20
20
  EXIT_CODES
21
- } from "../chunk-H4ZKGGTE.js";
22
- import "../chunk-VVRI35SK.js";
23
- import "../chunk-CMJBKQUH.js";
21
+ } from "../chunk-V3KTSP3Q.js";
22
+ import "../chunk-CLPUWOSA.js";
24
23
  import {
25
24
  INCOMPLETE_WORK_RECOVERY,
26
25
  INFO_MESSAGES,
@@ -37,18 +36,18 @@ import {
37
36
  plural,
38
37
  providerInUse,
39
38
  relativeConfigPath,
39
+ resolveInstallPaths,
40
40
  resolveSource,
41
41
  sourceFolderInUse
42
- } from "../chunk-C2UISKIM.js";
42
+ } from "../chunk-MQ6CGZNJ.js";
43
43
  import {
44
44
  matrix
45
- } from "../chunk-NU2K5G54.js";
45
+ } from "../chunk-52HDHJ7I.js";
46
46
  import {
47
47
  DIRS,
48
- LOCAL_SKILLS_PATH,
49
48
  PROJECT_ROOT
50
- } from "../chunk-AG3ZVM3B.js";
51
- import "../chunk-OI2H6M5I.js";
49
+ } from "../chunk-PJWGTNOX.js";
50
+ import "../chunk-NQW25DCF.js";
52
51
 
53
52
  // src/cli/commands/eject.ts
54
53
  import { Args, Flags } from "@oclif/core";
@@ -264,20 +263,14 @@ var Eject = class _Eject extends BaseCommand {
264
263
  );
265
264
  }
266
265
  async handleSkills(projectDir, force, sourceResult, directOutput, outputBase) {
267
- const result = await ejectSkills({
268
- projectDir,
269
- force,
270
- sourceResult,
271
- matrix,
272
- directOutput,
273
- ...directOutput && { customOutputBase: outputBase }
274
- });
266
+ const destDir = directOutput ? outputBase : installedSkillsDir(projectDir);
267
+ const result = await ejectSkills({ destDir, force, sourceResult, matrix });
275
268
  if (result.skipped) {
276
269
  this.warn(result.skipReason);
277
270
  return;
278
271
  }
279
272
  this.logSuccess(
280
- `${plural(result.copiedSkills.length, "skill")} ejected to ${result.destDir} from ${result.sourceLabel}`
273
+ `${plural(result.copiedSkills.length, "skill")} ejected to ${destDir} from ${result.sourceLabel}`
281
274
  );
282
275
  this.log("You can now customize skill content locally.");
283
276
  }
@@ -334,15 +327,7 @@ async function ejectAgentPartials(options) {
334
327
  };
335
328
  }
336
329
  async function ejectSkills(options) {
337
- const {
338
- projectDir,
339
- force,
340
- sourceResult,
341
- matrix: matrix2,
342
- directOutput = false,
343
- customOutputBase
344
- } = options;
345
- const destDir = directOutput && customOutputBase ? customOutputBase : path.join(projectDir, LOCAL_SKILLS_PATH);
330
+ const { destDir, force, sourceResult, matrix: matrix2 } = options;
346
331
  if (await directoryExists(destDir) && !force) {
347
332
  return {
348
333
  skipped: true,
@@ -366,10 +351,13 @@ async function ejectSkills(options) {
366
351
  return {
367
352
  skipped: false,
368
353
  copiedSkills,
369
- destDir,
370
354
  sourceLabel
371
355
  };
372
356
  }
357
+ function installedSkillsDir(projectDir) {
358
+ const scope = isHomeDirectory(projectDir) ? "global" : "project";
359
+ return resolveInstallPaths(projectDir, scope).skillsDir;
360
+ }
373
361
  async function ensureMinimalConfig(options) {
374
362
  const { projectDir, sourceResult } = options;
375
363
  const provider = providerInUse(projectDir);