@agents-inc/cli 0.34.1 → 0.38.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 (196) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/config/skills-matrix.yaml +26 -26
  3. package/config/stacks.yaml +8 -8
  4. package/dist/{chunk-HTTPKSL6.js → chunk-2XX4TMCI.js} +2 -2
  5. package/dist/{chunk-CEWNZQMH.js → chunk-3E2V5YL3.js} +8 -2
  6. package/dist/chunk-3E2V5YL3.js.map +1 -0
  7. package/dist/{chunk-QC37C32G.js → chunk-3NQJOJZL.js} +3 -3
  8. package/dist/chunk-54ZZCWN4.js +51 -0
  9. package/dist/chunk-54ZZCWN4.js.map +1 -0
  10. package/dist/{chunk-VEZ2GZEK.js → chunk-ATLRUR3B.js} +2 -2
  11. package/dist/{chunk-ZI5EBHCC.js → chunk-CYFU3ARY.js} +38 -17
  12. package/dist/chunk-CYFU3ARY.js.map +1 -0
  13. package/dist/{chunk-X7SPCWY6.js → chunk-DUQFF45G.js} +14 -9
  14. package/dist/chunk-DUQFF45G.js.map +1 -0
  15. package/dist/{chunk-CB7GYRUP.js → chunk-EISBUEBL.js} +101 -52
  16. package/dist/chunk-EISBUEBL.js.map +1 -0
  17. package/dist/chunk-EXFVAEPY.js +80 -0
  18. package/dist/chunk-EXFVAEPY.js.map +1 -0
  19. package/dist/{chunk-ANGAZ444.js → chunk-FWQK3HWB.js} +4 -4
  20. package/dist/chunk-FWQK3HWB.js.map +1 -0
  21. package/dist/{chunk-DC5AK3LW.js → chunk-GG4BSB6S.js} +5 -11
  22. package/dist/chunk-GG4BSB6S.js.map +1 -0
  23. package/dist/{chunk-GGHH3KR2.js → chunk-HKDE4LJW.js} +2 -2
  24. package/dist/{chunk-R3AD6XBJ.js → chunk-HRMQ2RGY.js} +81 -26
  25. package/dist/chunk-HRMQ2RGY.js.map +1 -0
  26. package/dist/{chunk-YPJKOM42.js → chunk-HRW7BIDE.js} +2 -2
  27. package/dist/{chunk-LFHZBF6N.js → chunk-IVIK776Y.js} +4 -3
  28. package/dist/chunk-IVIK776Y.js.map +1 -0
  29. package/dist/{chunk-ALS7SH7X.js → chunk-IWNPFIGY.js} +38 -48
  30. package/dist/chunk-IWNPFIGY.js.map +1 -0
  31. package/dist/{chunk-GIFEDW27.js → chunk-IZRVFC2Z.js} +7 -7
  32. package/dist/chunk-IZRVFC2Z.js.map +1 -0
  33. package/dist/chunk-K77I4XGL.js +47 -0
  34. package/dist/chunk-K77I4XGL.js.map +1 -0
  35. package/dist/{chunk-JMVWYAHT.js → chunk-KUV24B5M.js} +4 -4
  36. package/dist/chunk-KUV24B5M.js.map +1 -0
  37. package/dist/{chunk-KENWMEKN.js → chunk-M6PGIZNS.js} +6 -6
  38. package/dist/{chunk-B47QYIUL.js → chunk-NFV4SKH5.js} +4 -4
  39. package/dist/chunk-NI2RSNWB.js +156 -0
  40. package/dist/chunk-NI2RSNWB.js.map +1 -0
  41. package/dist/{chunk-ZP4BI6J2.js → chunk-OEX5JDQD.js} +7 -7
  42. package/dist/chunk-OEX5JDQD.js.map +1 -0
  43. package/dist/{chunk-OKILA27U.js → chunk-TA6IIQI4.js} +86 -99
  44. package/dist/chunk-TA6IIQI4.js.map +1 -0
  45. package/dist/{chunk-JZOLJVWA.js → chunk-TBDIR6LY.js} +12 -11
  46. package/dist/chunk-TBDIR6LY.js.map +1 -0
  47. package/dist/{chunk-XYCN2GCV.js → chunk-TNFACSWF.js} +3 -3
  48. package/dist/{chunk-ZE355C6C.js → chunk-TY5GELDB.js} +9 -4
  49. package/dist/chunk-TY5GELDB.js.map +1 -0
  50. package/dist/{chunk-TM4I4EHK.js → chunk-U5OB5ADP.js} +2829 -2793
  51. package/dist/chunk-U5OB5ADP.js.map +1 -0
  52. package/dist/{chunk-JXMRTHDT.js → chunk-UOMMQ5M6.js} +2 -2
  53. package/dist/{chunk-A5CYQQVG.js → chunk-UV6JUGIY.js} +2 -2
  54. package/dist/{chunk-5YNZJ5TP.js → chunk-VAHVSQIG.js} +2 -2
  55. package/dist/{chunk-TKB4O2RY.js → chunk-VAK5PX72.js} +5 -5
  56. package/dist/chunk-WSGGJKD5.js +113 -0
  57. package/dist/chunk-WSGGJKD5.js.map +1 -0
  58. package/dist/{chunk-GVMA2EKC.js → chunk-YHQNTBBN.js} +2 -2
  59. package/dist/{chunk-NLR6Z37M.js → chunk-YJIJTBSX.js} +81 -97
  60. package/dist/chunk-YJIJTBSX.js.map +1 -0
  61. package/dist/{chunk-YCS7GF6Y.js → chunk-ZBJQXDQN.js} +3 -1
  62. package/dist/{chunk-YCS7GF6Y.js.map → chunk-ZBJQXDQN.js.map} +1 -1
  63. package/dist/cli/defaults/agent-mappings.yaml +4 -4
  64. package/dist/commands/build/marketplace.js +3 -3
  65. package/dist/commands/build/plugins.js +5 -5
  66. package/dist/commands/build/stack.js +5 -5
  67. package/dist/commands/compile.js +25 -19
  68. package/dist/commands/compile.js.map +1 -1
  69. package/dist/commands/config/get.js +8 -8
  70. package/dist/commands/config/get.js.map +1 -1
  71. package/dist/commands/config/index.js +5 -5
  72. package/dist/commands/config/path.js +4 -4
  73. package/dist/commands/config/set-project.js +7 -7
  74. package/dist/commands/config/set-project.js.map +1 -1
  75. package/dist/commands/config/show.js +5 -5
  76. package/dist/commands/config/unset-project.js +5 -5
  77. package/dist/commands/config/unset-project.js.map +1 -1
  78. package/dist/commands/diff.js +8 -8
  79. package/dist/commands/diff.js.map +1 -1
  80. package/dist/commands/doctor.js +4 -4
  81. package/dist/commands/edit.js +37 -28
  82. package/dist/commands/edit.js.map +1 -1
  83. package/dist/commands/eject.js +6 -6
  84. package/dist/commands/eject.js.map +1 -1
  85. package/dist/commands/import/skill.js +16 -16
  86. package/dist/commands/import/skill.js.map +1 -1
  87. package/dist/commands/info.js +5 -5
  88. package/dist/commands/init.js +31 -26
  89. package/dist/commands/init.js.map +1 -1
  90. package/dist/commands/list.js +4 -4
  91. package/dist/commands/new/agent.js +5 -5
  92. package/dist/commands/new/skill.js +8 -8
  93. package/dist/commands/new/skill.js.map +1 -1
  94. package/dist/commands/outdated.js +4 -4
  95. package/dist/commands/search.js +7 -7
  96. package/dist/commands/uninstall.js +181 -97
  97. package/dist/commands/uninstall.js.map +1 -1
  98. package/dist/commands/update.js +6 -6
  99. package/dist/commands/validate.js +5 -5
  100. package/dist/commands/version/bump.js +4 -4
  101. package/dist/commands/version/index.js +4 -4
  102. package/dist/commands/version/set.js +4 -4
  103. package/dist/commands/version/show.js +4 -4
  104. package/dist/components/skill-search/skill-search.js +3 -3
  105. package/dist/components/wizard/category-grid.js +3 -3
  106. package/dist/components/wizard/category-grid.test.js +42 -21
  107. package/dist/components/wizard/category-grid.test.js.map +1 -1
  108. package/dist/components/wizard/checkbox-grid.js +10 -0
  109. package/dist/components/wizard/checkbox-grid.test.js +260 -0
  110. package/dist/components/wizard/checkbox-grid.test.js.map +1 -0
  111. package/dist/components/wizard/domain-selection.js +7 -5
  112. package/dist/components/wizard/help-modal.js +2 -2
  113. package/dist/components/wizard/menu-item.js +2 -2
  114. package/dist/components/wizard/search-modal.js +3 -3
  115. package/dist/components/wizard/search-modal.test.js +3 -3
  116. package/dist/components/wizard/section-progress.js +2 -2
  117. package/dist/components/wizard/section-progress.test.js +2 -2
  118. package/dist/components/wizard/source-grid.js +5 -5
  119. package/dist/components/wizard/source-grid.test.js +5 -5
  120. package/dist/components/wizard/stack-selection.js +8 -7
  121. package/dist/components/wizard/step-agents.js +16 -0
  122. package/dist/components/wizard/step-agents.js.map +1 -0
  123. package/dist/components/wizard/step-agents.test.js +185 -0
  124. package/dist/components/wizard/step-agents.test.js.map +1 -0
  125. package/dist/components/wizard/step-build.js +9 -7
  126. package/dist/components/wizard/step-build.test.js +25 -22
  127. package/dist/components/wizard/step-build.test.js.map +1 -1
  128. package/dist/components/wizard/step-confirm.js +2 -2
  129. package/dist/components/wizard/step-confirm.test.js +6 -5
  130. package/dist/components/wizard/step-confirm.test.js.map +1 -1
  131. package/dist/components/wizard/step-refine.js +2 -2
  132. package/dist/components/wizard/step-refine.test.js +2 -2
  133. package/dist/components/wizard/step-settings.js +6 -6
  134. package/dist/components/wizard/step-settings.test.js +9 -9
  135. package/dist/components/wizard/step-sources.js +12 -10
  136. package/dist/components/wizard/step-sources.test.js +14 -12
  137. package/dist/components/wizard/step-sources.test.js.map +1 -1
  138. package/dist/components/wizard/step-stack.js +11 -9
  139. package/dist/components/wizard/step-stack.test.js +12 -10
  140. package/dist/components/wizard/step-stack.test.js.map +1 -1
  141. package/dist/components/wizard/view-title.js +2 -2
  142. package/dist/components/wizard/wizard-layout.js +8 -7
  143. package/dist/components/wizard/wizard-tabs.js +2 -2
  144. package/dist/components/wizard/wizard-tabs.test.js +6 -4
  145. package/dist/components/wizard/wizard-tabs.test.js.map +1 -1
  146. package/dist/components/wizard/wizard.js +27 -23
  147. package/dist/config/skills-matrix.yaml +26 -26
  148. package/dist/config/stacks.yaml +8 -8
  149. package/dist/hooks/init.js +5 -3
  150. package/dist/hooks/init.js.map +1 -1
  151. package/dist/{source-manager-WJYANKDI.js → source-manager-FEGVYDFZ.js} +4 -4
  152. package/dist/source-manager-FEGVYDFZ.js.map +1 -0
  153. package/dist/stores/wizard-store.js +5 -4
  154. package/dist/stores/wizard-store.test.js +287 -15
  155. package/dist/stores/wizard-store.test.js.map +1 -1
  156. package/package.json +1 -1
  157. package/src/schemas/agent.schema.json +3 -3
  158. package/src/schemas/metadata.schema.json +14 -14
  159. package/src/schemas/project-config.schema.json +46 -2
  160. package/src/schemas/project-source-config.schema.json +17 -5
  161. package/src/schemas/skills-matrix.schema.json +4 -4
  162. package/src/schemas/stack.schema.json +1 -1
  163. package/src/schemas/stacks.schema.json +42 -1
  164. package/dist/chunk-2LUXM5FB.js +0 -277
  165. package/dist/chunk-2LUXM5FB.js.map +0 -1
  166. package/dist/chunk-ALS7SH7X.js.map +0 -1
  167. package/dist/chunk-ANGAZ444.js.map +0 -1
  168. package/dist/chunk-CB7GYRUP.js.map +0 -1
  169. package/dist/chunk-CEWNZQMH.js.map +0 -1
  170. package/dist/chunk-DC5AK3LW.js.map +0 -1
  171. package/dist/chunk-GIFEDW27.js.map +0 -1
  172. package/dist/chunk-JMVWYAHT.js.map +0 -1
  173. package/dist/chunk-JZOLJVWA.js.map +0 -1
  174. package/dist/chunk-LFHZBF6N.js.map +0 -1
  175. package/dist/chunk-NLR6Z37M.js.map +0 -1
  176. package/dist/chunk-OKILA27U.js.map +0 -1
  177. package/dist/chunk-R3AD6XBJ.js.map +0 -1
  178. package/dist/chunk-TM4I4EHK.js.map +0 -1
  179. package/dist/chunk-X7SPCWY6.js.map +0 -1
  180. package/dist/chunk-ZE355C6C.js.map +0 -1
  181. package/dist/chunk-ZI5EBHCC.js.map +0 -1
  182. package/dist/chunk-ZP4BI6J2.js.map +0 -1
  183. /package/dist/{chunk-HTTPKSL6.js.map → chunk-2XX4TMCI.js.map} +0 -0
  184. /package/dist/{chunk-QC37C32G.js.map → chunk-3NQJOJZL.js.map} +0 -0
  185. /package/dist/{chunk-VEZ2GZEK.js.map → chunk-ATLRUR3B.js.map} +0 -0
  186. /package/dist/{chunk-GGHH3KR2.js.map → chunk-HKDE4LJW.js.map} +0 -0
  187. /package/dist/{chunk-YPJKOM42.js.map → chunk-HRW7BIDE.js.map} +0 -0
  188. /package/dist/{chunk-KENWMEKN.js.map → chunk-M6PGIZNS.js.map} +0 -0
  189. /package/dist/{chunk-B47QYIUL.js.map → chunk-NFV4SKH5.js.map} +0 -0
  190. /package/dist/{chunk-XYCN2GCV.js.map → chunk-TNFACSWF.js.map} +0 -0
  191. /package/dist/{chunk-JXMRTHDT.js.map → chunk-UOMMQ5M6.js.map} +0 -0
  192. /package/dist/{chunk-A5CYQQVG.js.map → chunk-UV6JUGIY.js.map} +0 -0
  193. /package/dist/{chunk-5YNZJ5TP.js.map → chunk-VAHVSQIG.js.map} +0 -0
  194. /package/dist/{chunk-TKB4O2RY.js.map → chunk-VAK5PX72.js.map} +0 -0
  195. /package/dist/{chunk-GVMA2EKC.js.map → chunk-YHQNTBBN.js.map} +0 -0
  196. /package/dist/{source-manager-WJYANKDI.js.map → components/wizard/checkbox-grid.js.map} +0 -0
@@ -1,35 +1,35 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SkillSearch
4
- } from "../chunk-XYCN2GCV.js";
5
- import "../chunk-5YNZJ5TP.js";
4
+ } from "../chunk-TNFACSWF.js";
5
+ import "../chunk-VAHVSQIG.js";
6
6
  import "../chunk-U3IGFMCY.js";
7
7
  import {
8
8
  INFO_MESSAGES,
9
9
  STATUS_MESSAGES,
10
10
  SUCCESS_MESSAGES
11
- } from "../chunk-GGHH3KR2.js";
11
+ } from "../chunk-HKDE4LJW.js";
12
12
  import {
13
13
  BaseCommand,
14
14
  EXIT_CODES
15
- } from "../chunk-GVMA2EKC.js";
15
+ } from "../chunk-YHQNTBBN.js";
16
16
  import {
17
17
  fetchFromSource,
18
18
  loadSkillsMatrixFromSource,
19
19
  resolveAllSources
20
- } from "../chunk-TM4I4EHK.js";
20
+ } from "../chunk-U5OB5ADP.js";
21
21
  import "../chunk-T4EXUIBY.js";
22
22
  import {
23
23
  copy,
24
24
  ensureDir,
25
25
  fileExists,
26
26
  listDirectories
27
- } from "../chunk-NLR6Z37M.js";
27
+ } from "../chunk-YJIJTBSX.js";
28
28
  import {
29
29
  DEFAULT_SKILLS_SUBDIR,
30
30
  LOCAL_SKILLS_PATH,
31
31
  STANDARD_FILES
32
- } from "../chunk-YCS7GF6Y.js";
32
+ } from "../chunk-ZBJQXDQN.js";
33
33
  import {
34
34
  init_esm_shims
35
35
  } from "../chunk-DHET7RCE.js";
@@ -5,34 +5,35 @@ import {
5
5
  import {
6
6
  claudePluginUninstall,
7
7
  isClaudeCLIAvailable
8
- } from "../chunk-A5CYQQVG.js";
8
+ } from "../chunk-UV6JUGIY.js";
9
9
  import {
10
10
  DRY_RUN_MESSAGES,
11
- ERROR_MESSAGES,
12
11
  INFO_MESSAGES,
13
12
  SUCCESS_MESSAGES
14
- } from "../chunk-GGHH3KR2.js";
13
+ } from "../chunk-HKDE4LJW.js";
15
14
  import {
16
15
  BaseCommand,
17
16
  EXIT_CODES
18
- } from "../chunk-GVMA2EKC.js";
17
+ } from "../chunk-YHQNTBBN.js";
19
18
  import {
20
19
  getProjectPluginsDir,
21
- listPluginNames
22
- } from "../chunk-TM4I4EHK.js";
20
+ listPluginNames,
21
+ loadProjectSourceConfig,
22
+ readForkedFromMetadata
23
+ } from "../chunk-U5OB5ADP.js";
23
24
  import "../chunk-T4EXUIBY.js";
24
25
  import {
25
26
  directoryExists,
26
- fileExists,
27
+ getErrorMessage,
28
+ listDirectories,
27
29
  remove
28
- } from "../chunk-NLR6Z37M.js";
30
+ } from "../chunk-YJIJTBSX.js";
29
31
  import {
30
32
  CLAUDE_DIR,
31
33
  CLAUDE_SRC_DIR,
32
34
  CLI_COLORS,
33
- DEFAULT_BRANDING,
34
- STANDARD_FILES
35
- } from "../chunk-YCS7GF6Y.js";
35
+ DEFAULT_BRANDING
36
+ } from "../chunk-ZBJQXDQN.js";
36
37
  import {
37
38
  init_esm_shims
38
39
  } from "../chunk-DHET7RCE.js";
@@ -43,69 +44,89 @@ import { Flags } from "@oclif/core";
43
44
  import { render, Box, Text, useApp } from "ink";
44
45
  import path from "path";
45
46
  import { jsx, jsxs } from "react/jsx-runtime";
47
+ function collectConfiguredSources(config) {
48
+ if (!config) return [];
49
+ const sources = [];
50
+ if (config.source) {
51
+ sources.push(config.source);
52
+ }
53
+ if (config.sources) {
54
+ for (const entry of config.sources) {
55
+ sources.push(entry.url);
56
+ }
57
+ }
58
+ return sources;
59
+ }
46
60
  async function detectUninstallTarget(projectDir) {
47
61
  const pluginsDir = getProjectPluginsDir(projectDir);
48
62
  const skillsDir = path.join(projectDir, CLAUDE_DIR, "skills");
49
63
  const agentsDir = path.join(projectDir, CLAUDE_DIR, "agents");
50
- const configPath = path.join(projectDir, CLAUDE_DIR, STANDARD_FILES.CONFIG_YAML);
51
64
  const claudeDir = path.join(projectDir, CLAUDE_DIR);
52
65
  const claudeSrcDir = path.join(projectDir, CLAUDE_SRC_DIR);
53
- const [hasLocalSkills, hasLocalAgents, hasLocalConfig, hasClaudeDir, hasClaudeSrcDir] = await Promise.all([
54
- directoryExists(skillsDir),
55
- directoryExists(agentsDir),
56
- fileExists(configPath),
57
- directoryExists(claudeDir),
58
- directoryExists(claudeSrcDir)
59
- ]);
66
+ const [hasLocalSkills, hasLocalAgents, hasClaudeDir, hasClaudeSrcDir, config] = await Promise.all(
67
+ [
68
+ directoryExists(skillsDir),
69
+ directoryExists(agentsDir),
70
+ directoryExists(claudeDir),
71
+ directoryExists(claudeSrcDir),
72
+ loadProjectSourceConfig(projectDir)
73
+ ]
74
+ );
60
75
  let pluginNames = [];
61
76
  try {
62
77
  pluginNames = await listPluginNames(projectDir);
63
78
  } catch {
64
79
  }
80
+ const configuredSources = collectConfiguredSources(config);
65
81
  return {
66
82
  hasPlugins: pluginNames.length > 0,
67
83
  pluginNames,
68
84
  hasLocalSkills,
69
85
  hasLocalAgents,
70
- hasLocalConfig,
71
86
  hasClaudeDir,
72
87
  hasClaudeSrcDir,
73
88
  pluginsDir,
74
89
  skillsDir,
75
90
  agentsDir,
76
- configPath,
77
91
  claudeDir,
78
- claudeSrcDir
92
+ claudeSrcDir,
93
+ config,
94
+ configuredSources
79
95
  };
80
96
  }
81
97
  var UninstallConfirm = ({
82
98
  target,
83
- uninstallPlugin,
84
- uninstallLocal,
99
+ removeAll,
85
100
  onConfirm,
86
101
  onCancel
87
102
  }) => {
88
103
  const { exit } = useApp();
89
- const hasPluginToRemove = uninstallPlugin && target.hasPlugins;
90
- const hasLocalToRemove = uninstallLocal && (target.hasClaudeDir || target.hasClaudeSrcDir);
91
104
  return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
92
105
  /* @__PURE__ */ jsx(Text, { bold: true, children: "The following will be removed:" }),
93
106
  /* @__PURE__ */ jsx(Text, { children: " " }),
94
- hasPluginToRemove && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
107
+ target.hasPlugins && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
95
108
  /* @__PURE__ */ jsx(Text, { color: CLI_COLORS.ERROR, children: " Plugins:" }),
96
109
  /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
97
110
  " ",
98
111
  target.pluginsDir
99
112
  ] })
100
113
  ] }),
101
- hasLocalToRemove && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
102
- /* @__PURE__ */ jsx(Text, { color: CLI_COLORS.ERROR, children: " Local directories:" }),
103
- target.hasClaudeDir && /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
114
+ (target.hasLocalSkills || target.hasLocalAgents) && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
115
+ /* @__PURE__ */ jsx(Text, { color: CLI_COLORS.ERROR, children: " CLI-managed files:" }),
116
+ target.hasLocalSkills && /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
104
117
  " ",
105
- target.claudeDir,
106
- "/"
118
+ target.skillsDir,
119
+ "/ (matching sources)"
107
120
  ] }),
108
- target.hasClaudeSrcDir && /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
121
+ target.hasLocalAgents && /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
122
+ " ",
123
+ target.agentsDir,
124
+ "/ (CLI-compiled)"
125
+ ] })
126
+ ] }),
127
+ removeAll && target.hasClaudeSrcDir && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
128
+ /* @__PURE__ */ jsx(Text, { color: CLI_COLORS.ERROR, children: " Config:" }),
129
+ /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
109
130
  " ",
110
131
  target.claudeSrcDir,
111
132
  "/"
@@ -129,14 +150,26 @@ var UninstallConfirm = ({
129
150
  )
130
151
  ] });
131
152
  };
153
+ async function isDirectoryEmpty(dirPath) {
154
+ const { readdir } = await import("fs/promises");
155
+ try {
156
+ const allEntries = await readdir(dirPath);
157
+ return allEntries.length === 0;
158
+ } catch {
159
+ return true;
160
+ }
161
+ }
162
+ function skillMatchesConfiguredSource(forkedFromSource, configuredSources) {
163
+ if (!forkedFromSource || configuredSources.length === 0) return false;
164
+ return configuredSources.includes(forkedFromSource);
165
+ }
132
166
  var Uninstall = class _Uninstall extends BaseCommand {
133
167
  static summary = `Remove ${DEFAULT_BRANDING.NAME} from this project`;
134
- static description = `Uninstall the ${DEFAULT_BRANDING.NAME} plugin and/or local directories (.claude/ and .claude-src/). By default, removes everything.`;
168
+ static description = `Uninstall ${DEFAULT_BRANDING.NAME} from this project. Removes CLI-managed skills (matched by source), compiled agents, and plugins. User-created content is preserved.`;
135
169
  static examples = [
136
170
  "<%= config.bin %> <%= command.id %>",
137
171
  "<%= config.bin %> <%= command.id %> --yes",
138
- "<%= config.bin %> <%= command.id %> --plugin",
139
- "<%= config.bin %> <%= command.id %> --local",
172
+ "<%= config.bin %> <%= command.id %> --all",
140
173
  "<%= config.bin %> <%= command.id %> --dry-run"
141
174
  ];
142
175
  static flags = {
@@ -146,12 +179,8 @@ var Uninstall = class _Uninstall extends BaseCommand {
146
179
  description: "Skip confirmation prompt",
147
180
  default: false
148
181
  }),
149
- plugin: Flags.boolean({
150
- description: "Only uninstall the plugin (not local files)",
151
- default: false
152
- }),
153
- local: Flags.boolean({
154
- description: "Only remove local files (not the plugin)",
182
+ all: Flags.boolean({
183
+ description: "Also remove .claude-src/ config directory",
155
184
  default: false
156
185
  })
157
186
  };
@@ -166,22 +195,11 @@ var Uninstall = class _Uninstall extends BaseCommand {
166
195
  this.log("");
167
196
  }
168
197
  const target = await detectUninstallTarget(projectDir);
169
- const uninstallPlugin = !flags.local;
170
- const uninstallLocal = !flags.plugin;
171
- const hasPluginToRemove = uninstallPlugin && target.hasPlugins;
172
- const hasLocalToRemove = uninstallLocal && (target.hasClaudeDir || target.hasClaudeSrcDir);
173
- if (!hasPluginToRemove && !hasLocalToRemove) {
198
+ const hasAnythingToRemove = target.hasPlugins || target.hasLocalSkills || target.hasLocalAgents || flags.all && target.hasClaudeSrcDir;
199
+ if (!hasAnythingToRemove) {
174
200
  this.warn("Nothing to uninstall.");
175
201
  this.log("");
176
- if (flags.plugin && !target.hasPlugins) {
177
- this.log(INFO_MESSAGES.NO_PLUGIN_INSTALLATION);
178
- }
179
- if (flags.local && !target.hasClaudeDir && !target.hasClaudeSrcDir) {
180
- this.log(INFO_MESSAGES.NO_LOCAL_INSTALLATION);
181
- }
182
- if (!flags.plugin && !flags.local) {
183
- this.log(INFO_MESSAGES.NOT_INSTALLED);
184
- }
202
+ this.log(INFO_MESSAGES.NOT_INSTALLED);
185
203
  this.log("");
186
204
  this.log(INFO_MESSAGES.NO_CHANGES_MADE);
187
205
  return;
@@ -193,8 +211,7 @@ var Uninstall = class _Uninstall extends BaseCommand {
193
211
  UninstallConfirm,
194
212
  {
195
213
  target,
196
- uninstallPlugin,
197
- uninstallLocal,
214
+ removeAll: flags.all,
198
215
  onConfirm: () => resolve(true),
199
216
  onCancel: () => resolve(false)
200
217
  }
@@ -210,42 +227,39 @@ var Uninstall = class _Uninstall extends BaseCommand {
210
227
  } else {
211
228
  this.log("The following will be removed:");
212
229
  this.log("");
213
- if (hasPluginToRemove) {
230
+ if (target.hasPlugins) {
214
231
  this.log(" Plugins:");
215
232
  this.log(` ${target.pluginsDir}`);
216
233
  }
217
- if (hasLocalToRemove) {
218
- this.log(" Local directories:");
219
- if (target.hasClaudeDir) {
220
- this.log(` ${target.claudeDir}/`);
234
+ if (target.hasLocalSkills || target.hasLocalAgents) {
235
+ this.log(" CLI-managed files:");
236
+ if (target.hasLocalSkills) {
237
+ this.log(` ${target.skillsDir}/ (matching sources)`);
221
238
  }
222
- if (target.hasClaudeSrcDir) {
223
- this.log(` ${target.claudeSrcDir}/`);
239
+ if (target.hasLocalAgents) {
240
+ this.log(` ${target.agentsDir}/ (CLI-compiled)`);
224
241
  }
225
242
  }
243
+ if (flags.all && target.hasClaudeSrcDir) {
244
+ this.log(" Config:");
245
+ this.log(` ${target.claudeSrcDir}/`);
246
+ }
226
247
  this.log("");
227
248
  }
228
249
  if (flags["dry-run"]) {
229
- if (hasPluginToRemove) {
250
+ if (target.hasPlugins) {
230
251
  this.log(`[dry-run] Would uninstall ${target.pluginNames.length} plugins:`);
231
252
  for (const pluginName of target.pluginNames) {
232
253
  this.log(`[dry-run] ${pluginName}`);
233
254
  }
234
255
  }
235
- if (hasLocalToRemove) {
236
- if (target.hasClaudeDir) {
237
- this.log(`[dry-run] Would remove ${target.claudeDir}/`);
238
- }
239
- if (target.hasClaudeSrcDir) {
240
- this.log(`[dry-run] Would remove ${target.claudeSrcDir}/`);
241
- }
242
- }
256
+ await this.dryRunLocalRemoval(target, flags.all);
243
257
  this.log("");
244
258
  this.log(DRY_RUN_MESSAGES.COMPLETE_NO_FILES_REMOVED);
245
259
  this.log("");
246
260
  return;
247
261
  }
248
- if (hasPluginToRemove) {
262
+ if (target.hasPlugins) {
249
263
  this.log("Uninstalling plugins...");
250
264
  try {
251
265
  const cliAvailable = await isClaudeCLIAvailable();
@@ -262,32 +276,18 @@ var Uninstall = class _Uninstall extends BaseCommand {
262
276
  this.logSuccess("Plugins uninstalled");
263
277
  } catch (error) {
264
278
  this.log("Plugin uninstall failed");
265
- this.error(error instanceof Error ? error.message : ERROR_MESSAGES.UNKNOWN_ERROR, {
279
+ this.error(getErrorMessage(error), {
266
280
  exit: EXIT_CODES.ERROR
267
281
  });
268
282
  }
269
283
  }
270
- if (hasLocalToRemove) {
271
- this.log("Removing local directories...");
272
- try {
273
- const removed = [];
274
- if (target.hasClaudeDir) {
275
- await remove(target.claudeDir);
276
- removed.push(CLAUDE_DIR);
277
- }
278
- if (target.hasClaudeSrcDir) {
279
- await remove(target.claudeSrcDir);
280
- removed.push(CLAUDE_SRC_DIR);
281
- }
282
- this.logSuccess(
283
- `Removed ${removed.length} ${removed.length === 1 ? "directory" : "directories"}: ${removed.join(", ")}`
284
- );
285
- } catch (error) {
286
- this.log("Failed to remove local directories");
287
- this.error(error instanceof Error ? error.message : ERROR_MESSAGES.UNKNOWN_ERROR, {
288
- exit: EXIT_CODES.ERROR
289
- });
290
- }
284
+ try {
285
+ await this.removeLocalFiles(target, flags.all);
286
+ } catch (error) {
287
+ this.log("Failed to remove local files");
288
+ this.error(getErrorMessage(error), {
289
+ exit: EXIT_CODES.ERROR
290
+ });
291
291
  }
292
292
  this.log("");
293
293
  this.log(`${DEFAULT_BRANDING.NAME} has been uninstalled.`);
@@ -295,6 +295,90 @@ var Uninstall = class _Uninstall extends BaseCommand {
295
295
  this.logSuccess(SUCCESS_MESSAGES.UNINSTALL_COMPLETE);
296
296
  this.log("");
297
297
  }
298
+ /**
299
+ * Selectively removes local files installed by the CLI using config-based matching.
300
+ *
301
+ * - Skills: removes skill dirs whose forked_from.source matches a configured source
302
+ * - Agents: removes agents whose frontmatter name matches a configured agent, or
303
+ * all agents if config.yaml exists (CLI was used to compile them)
304
+ * - Plugins: removed separately (always)
305
+ * - .claude-src/: only removed with --all flag
306
+ * - .claude/: only removed if empty after selective cleanup
307
+ */
308
+ async removeLocalFiles(target, removeAll) {
309
+ let removedSkillCount = 0;
310
+ let skippedSkillCount = 0;
311
+ if (target.hasLocalSkills) {
312
+ const skillDirNames = await listDirectories(target.skillsDir);
313
+ for (const skillDirName of skillDirNames) {
314
+ const skillDir = path.join(target.skillsDir, skillDirName);
315
+ const forkedFrom = await readForkedFromMetadata(skillDir);
316
+ const shouldRemove = forkedFrom !== null && (skillMatchesConfiguredSource(forkedFrom.source, target.configuredSources) || // Legacy skills without source field are treated as CLI-managed when config exists
317
+ !forkedFrom.source && target.config !== null);
318
+ if (shouldRemove) {
319
+ await remove(skillDir);
320
+ removedSkillCount++;
321
+ } else {
322
+ this.warn(`Skipping '${skillDirName}': not created by ${DEFAULT_BRANDING.NAME} CLI`);
323
+ skippedSkillCount++;
324
+ }
325
+ }
326
+ if (removedSkillCount > 0) {
327
+ this.logSuccess(
328
+ `Removed ${removedSkillCount} CLI-installed ${removedSkillCount === 1 ? "skill" : "skills"}`
329
+ );
330
+ }
331
+ if (skippedSkillCount === 0 && await directoryExists(target.skillsDir)) {
332
+ if (await isDirectoryEmpty(target.skillsDir)) {
333
+ await remove(target.skillsDir);
334
+ }
335
+ }
336
+ }
337
+ if (target.hasLocalAgents) {
338
+ if (target.config !== null) {
339
+ await remove(target.agentsDir);
340
+ this.logSuccess("Removed compiled agents");
341
+ }
342
+ }
343
+ if (removeAll && target.hasClaudeSrcDir) {
344
+ await remove(target.claudeSrcDir);
345
+ this.logSuccess(`Removed ${CLAUDE_SRC_DIR}/`);
346
+ }
347
+ if (target.hasClaudeDir && await directoryExists(target.claudeDir)) {
348
+ if (await isDirectoryEmpty(target.claudeDir)) {
349
+ await remove(target.claudeDir);
350
+ this.logSuccess(`Removed ${CLAUDE_DIR}/`);
351
+ } else {
352
+ this.log(`Kept ${CLAUDE_DIR}/ (contains user content)`);
353
+ }
354
+ }
355
+ }
356
+ async dryRunLocalRemoval(target, removeAll) {
357
+ if (target.hasLocalSkills) {
358
+ const skillDirNames = await listDirectories(target.skillsDir);
359
+ for (const skillDirName of skillDirNames) {
360
+ const skillDir = path.join(target.skillsDir, skillDirName);
361
+ const forkedFrom = await readForkedFromMetadata(skillDir);
362
+ const shouldRemove = forkedFrom !== null && (skillMatchesConfiguredSource(forkedFrom.source, target.configuredSources) || !forkedFrom.source && target.config !== null);
363
+ if (shouldRemove) {
364
+ this.log(`[dry-run] Would remove skill '${skillDirName}'`);
365
+ } else {
366
+ this.log(
367
+ `[dry-run] Would skip '${skillDirName}': not created by ${DEFAULT_BRANDING.NAME} CLI`
368
+ );
369
+ }
370
+ }
371
+ }
372
+ if (target.hasLocalAgents && target.config !== null) {
373
+ this.log(`[dry-run] Would remove ${target.agentsDir}/`);
374
+ }
375
+ if (removeAll && target.hasClaudeSrcDir) {
376
+ this.log(`[dry-run] Would remove ${target.claudeSrcDir}/`);
377
+ }
378
+ if (target.hasClaudeDir) {
379
+ this.log(`[dry-run] Would remove ${target.claudeDir}/ only if empty after cleanup`);
380
+ }
381
+ }
298
382
  };
299
383
  export {
300
384
  Uninstall as default
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/commands/uninstall.tsx"],"sourcesContent":["import React from \"react\";\n\nimport { Flags } from \"@oclif/core\";\nimport { render, Box, Text, useApp } from \"ink\";\nimport path from \"path\";\n\nimport { BaseCommand } from \"../base-command\";\nimport { Confirm } from \"../components/common/confirm\";\nimport { directoryExists, fileExists, remove } from \"../utils/fs\";\nimport { claudePluginUninstall, isClaudeCLIAvailable } from \"../utils/exec\";\nimport { listPluginNames, getProjectPluginsDir } from \"../lib/plugins\";\nimport {\n CLAUDE_DIR,\n CLAUDE_SRC_DIR,\n CLI_COLORS,\n DEFAULT_BRANDING,\n STANDARD_FILES,\n} from \"../consts\";\nimport { EXIT_CODES } from \"../lib/exit-codes\";\nimport {\n ERROR_MESSAGES,\n SUCCESS_MESSAGES,\n INFO_MESSAGES,\n DRY_RUN_MESSAGES,\n} from \"../utils/messages\";\n\ntype UninstallTarget = {\n hasPlugins: boolean;\n pluginNames: string[];\n hasLocalSkills: boolean;\n hasLocalAgents: boolean;\n hasLocalConfig: boolean;\n hasClaudeDir: boolean;\n hasClaudeSrcDir: boolean;\n pluginsDir: string;\n skillsDir: string;\n agentsDir: string;\n configPath: string;\n claudeDir: string;\n claudeSrcDir: string;\n};\n\nasync function detectUninstallTarget(projectDir: string): Promise<UninstallTarget> {\n const pluginsDir = getProjectPluginsDir(projectDir);\n const skillsDir = path.join(projectDir, CLAUDE_DIR, \"skills\");\n const agentsDir = path.join(projectDir, CLAUDE_DIR, \"agents\");\n const configPath = path.join(projectDir, CLAUDE_DIR, STANDARD_FILES.CONFIG_YAML);\n const claudeDir = path.join(projectDir, CLAUDE_DIR);\n const claudeSrcDir = path.join(projectDir, CLAUDE_SRC_DIR);\n\n const [hasLocalSkills, hasLocalAgents, hasLocalConfig, hasClaudeDir, hasClaudeSrcDir] =\n await Promise.all([\n directoryExists(skillsDir),\n directoryExists(agentsDir),\n fileExists(configPath),\n directoryExists(claudeDir),\n directoryExists(claudeSrcDir),\n ]);\n\n let pluginNames: string[] = [];\n try {\n pluginNames = await listPluginNames(projectDir);\n } catch {\n // Best-effort: plugin detection may fail\n }\n\n return {\n hasPlugins: pluginNames.length > 0,\n pluginNames,\n hasLocalSkills,\n hasLocalAgents,\n hasLocalConfig,\n hasClaudeDir,\n hasClaudeSrcDir,\n pluginsDir,\n skillsDir,\n agentsDir,\n configPath,\n claudeDir,\n claudeSrcDir,\n };\n}\n\ntype UninstallConfirmProps = {\n target: UninstallTarget;\n uninstallPlugin: boolean;\n uninstallLocal: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n};\n\nconst UninstallConfirm: React.FC<UninstallConfirmProps> = ({\n target,\n uninstallPlugin,\n uninstallLocal,\n onConfirm,\n onCancel,\n}) => {\n const { exit } = useApp();\n const hasPluginToRemove = uninstallPlugin && target.hasPlugins;\n const hasLocalToRemove = uninstallLocal && (target.hasClaudeDir || target.hasClaudeSrcDir);\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>The following will be removed:</Text>\n <Text> </Text>\n\n {hasPluginToRemove && (\n <Box flexDirection=\"column\">\n <Text color={CLI_COLORS.ERROR}> Plugins:</Text>\n <Text dimColor> {target.pluginsDir}</Text>\n </Box>\n )}\n\n {hasLocalToRemove && (\n <Box flexDirection=\"column\">\n <Text color={CLI_COLORS.ERROR}> Local directories:</Text>\n {target.hasClaudeDir && <Text dimColor> {target.claudeDir}/</Text>}\n {target.hasClaudeSrcDir && <Text dimColor> {target.claudeSrcDir}/</Text>}\n </Box>\n )}\n\n <Text> </Text>\n <Confirm\n message=\"Are you sure you want to uninstall?\"\n onConfirm={() => {\n onConfirm();\n exit();\n }}\n onCancel={() => {\n onCancel();\n exit();\n }}\n defaultValue={false}\n />\n </Box>\n );\n};\n\nexport default class Uninstall extends BaseCommand {\n static summary = `Remove ${DEFAULT_BRANDING.NAME} from this project`;\n\n static description = `Uninstall the ${DEFAULT_BRANDING.NAME} plugin and/or local directories (.claude/ and .claude-src/). By default, removes everything.`;\n\n static examples = [\n \"<%= config.bin %> <%= command.id %>\",\n \"<%= config.bin %> <%= command.id %> --yes\",\n \"<%= config.bin %> <%= command.id %> --plugin\",\n \"<%= config.bin %> <%= command.id %> --local\",\n \"<%= config.bin %> <%= command.id %> --dry-run\",\n ];\n\n static flags = {\n ...BaseCommand.baseFlags,\n yes: Flags.boolean({\n char: \"y\",\n description: \"Skip confirmation prompt\",\n default: false,\n }),\n plugin: Flags.boolean({\n description: \"Only uninstall the plugin (not local files)\",\n default: false,\n }),\n local: Flags.boolean({\n description: \"Only remove local files (not the plugin)\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Uninstall);\n const projectDir = process.cwd();\n\n this.log(\"\");\n this.log(`${DEFAULT_BRANDING.NAME} Uninstall`);\n this.log(\"\");\n\n if (flags[\"dry-run\"]) {\n this.log(DRY_RUN_MESSAGES.PREVIEW_NO_FILES_REMOVED);\n this.log(\"\");\n }\n\n const target = await detectUninstallTarget(projectDir);\n\n const uninstallPlugin = !flags.local;\n const uninstallLocal = !flags.plugin;\n\n const hasPluginToRemove = uninstallPlugin && target.hasPlugins;\n const hasLocalToRemove = uninstallLocal && (target.hasClaudeDir || target.hasClaudeSrcDir);\n\n if (!hasPluginToRemove && !hasLocalToRemove) {\n this.warn(\"Nothing to uninstall.\");\n this.log(\"\");\n\n if (flags.plugin && !target.hasPlugins) {\n this.log(INFO_MESSAGES.NO_PLUGIN_INSTALLATION);\n }\n if (flags.local && !target.hasClaudeDir && !target.hasClaudeSrcDir) {\n this.log(INFO_MESSAGES.NO_LOCAL_INSTALLATION);\n }\n if (!flags.plugin && !flags.local) {\n this.log(INFO_MESSAGES.NOT_INSTALLED);\n }\n\n this.log(\"\");\n this.log(INFO_MESSAGES.NO_CHANGES_MADE);\n return;\n }\n\n if (!flags.yes && !flags[\"dry-run\"]) {\n const confirmed = await new Promise<boolean>((resolve) => {\n const { waitUntilExit } = render(\n <UninstallConfirm\n target={target}\n uninstallPlugin={uninstallPlugin}\n uninstallLocal={uninstallLocal}\n onConfirm={() => resolve(true)}\n onCancel={() => resolve(false)}\n />,\n );\n\n waitUntilExit().catch(() => resolve(false));\n });\n\n if (!confirmed) {\n this.log(\"\");\n this.log(\"Uninstall cancelled\");\n this.exit(EXIT_CODES.CANCELLED);\n }\n } else {\n this.log(\"The following will be removed:\");\n this.log(\"\");\n\n if (hasPluginToRemove) {\n this.log(\" Plugins:\");\n this.log(` ${target.pluginsDir}`);\n }\n\n if (hasLocalToRemove) {\n this.log(\" Local directories:\");\n if (target.hasClaudeDir) {\n this.log(` ${target.claudeDir}/`);\n }\n if (target.hasClaudeSrcDir) {\n this.log(` ${target.claudeSrcDir}/`);\n }\n }\n\n this.log(\"\");\n }\n\n if (flags[\"dry-run\"]) {\n if (hasPluginToRemove) {\n this.log(`[dry-run] Would uninstall ${target.pluginNames.length} plugins:`);\n for (const pluginName of target.pluginNames) {\n this.log(`[dry-run] ${pluginName}`);\n }\n }\n if (hasLocalToRemove) {\n if (target.hasClaudeDir) {\n this.log(`[dry-run] Would remove ${target.claudeDir}/`);\n }\n if (target.hasClaudeSrcDir) {\n this.log(`[dry-run] Would remove ${target.claudeSrcDir}/`);\n }\n }\n this.log(\"\");\n this.log(DRY_RUN_MESSAGES.COMPLETE_NO_FILES_REMOVED);\n this.log(\"\");\n return;\n }\n\n if (hasPluginToRemove) {\n this.log(\"Uninstalling plugins...\");\n\n try {\n const cliAvailable = await isClaudeCLIAvailable();\n\n for (const pluginName of target.pluginNames) {\n if (cliAvailable) {\n try {\n await claudePluginUninstall(pluginName, \"project\", projectDir);\n } catch {\n // Best-effort: plugin may not be registered with Claude CLI\n }\n }\n\n const pluginPath = path.join(target.pluginsDir, pluginName);\n await remove(pluginPath);\n }\n\n this.logSuccess(\"Plugins uninstalled\");\n } catch (error) {\n this.log(\"Plugin uninstall failed\");\n this.error(error instanceof Error ? error.message : ERROR_MESSAGES.UNKNOWN_ERROR, {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n\n if (hasLocalToRemove) {\n this.log(\"Removing local directories...\");\n\n try {\n const removed: string[] = [];\n\n if (target.hasClaudeDir) {\n await remove(target.claudeDir);\n removed.push(CLAUDE_DIR);\n }\n\n if (target.hasClaudeSrcDir) {\n await remove(target.claudeSrcDir);\n removed.push(CLAUDE_SRC_DIR);\n }\n\n this.logSuccess(\n `Removed ${removed.length} ${removed.length === 1 ? \"directory\" : \"directories\"}: ${removed.join(\", \")}`,\n );\n } catch (error) {\n this.log(\"Failed to remove local directories\");\n this.error(error instanceof Error ? error.message : ERROR_MESSAGES.UNKNOWN_ERROR, {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n\n this.log(\"\");\n this.log(`${DEFAULT_BRANDING.NAME} has been uninstalled.`);\n\n this.log(\"\");\n this.logSuccess(SUCCESS_MESSAGES.UNINSTALL_COMPLETE);\n this.log(\"\");\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/cli/commands/uninstall.tsx"],"sourcesContent":["import React from \"react\";\n\nimport { Flags } from \"@oclif/core\";\nimport { render, Box, Text, useApp } from \"ink\";\nimport path from \"path\";\n\nimport { BaseCommand } from \"../base-command\";\nimport { Confirm } from \"../components/common/confirm\";\nimport { getErrorMessage } from \"../utils/errors\";\nimport { directoryExists, listDirectories, remove } from \"../utils/fs\";\nimport { claudePluginUninstall, isClaudeCLIAvailable } from \"../utils/exec\";\nimport { listPluginNames, getProjectPluginsDir } from \"../lib/plugins\";\nimport { readForkedFromMetadata } from \"../lib/skills\";\nimport { loadProjectSourceConfig } from \"../lib/configuration/config\";\nimport type { ProjectSourceConfig } from \"../lib/configuration/config\";\nimport { CLAUDE_DIR, CLAUDE_SRC_DIR, CLI_COLORS, DEFAULT_BRANDING } from \"../consts\";\nimport { EXIT_CODES } from \"../lib/exit-codes\";\nimport { SUCCESS_MESSAGES, INFO_MESSAGES, DRY_RUN_MESSAGES } from \"../utils/messages\";\n\ntype UninstallTarget = {\n hasPlugins: boolean;\n pluginNames: string[];\n hasLocalSkills: boolean;\n hasLocalAgents: boolean;\n hasClaudeDir: boolean;\n hasClaudeSrcDir: boolean;\n pluginsDir: string;\n skillsDir: string;\n agentsDir: string;\n claudeDir: string;\n claudeSrcDir: string;\n /** Resolved project source config from .claude-src/config.yaml */\n config: ProjectSourceConfig | null;\n /** All configured source URLs (primary + extras) */\n configuredSources: string[];\n};\n\nfunction collectConfiguredSources(config: ProjectSourceConfig | null): string[] {\n if (!config) return [];\n\n const sources: string[] = [];\n\n if (config.source) {\n sources.push(config.source);\n }\n\n if (config.sources) {\n for (const entry of config.sources) {\n sources.push(entry.url);\n }\n }\n\n return sources;\n}\n\nasync function detectUninstallTarget(projectDir: string): Promise<UninstallTarget> {\n const pluginsDir = getProjectPluginsDir(projectDir);\n const skillsDir = path.join(projectDir, CLAUDE_DIR, \"skills\");\n const agentsDir = path.join(projectDir, CLAUDE_DIR, \"agents\");\n const claudeDir = path.join(projectDir, CLAUDE_DIR);\n const claudeSrcDir = path.join(projectDir, CLAUDE_SRC_DIR);\n\n const [hasLocalSkills, hasLocalAgents, hasClaudeDir, hasClaudeSrcDir, config] = await Promise.all(\n [\n directoryExists(skillsDir),\n directoryExists(agentsDir),\n directoryExists(claudeDir),\n directoryExists(claudeSrcDir),\n loadProjectSourceConfig(projectDir),\n ],\n );\n\n let pluginNames: string[] = [];\n try {\n pluginNames = await listPluginNames(projectDir);\n } catch {\n // Best-effort: plugin detection may fail\n }\n\n const configuredSources = collectConfiguredSources(config);\n\n return {\n hasPlugins: pluginNames.length > 0,\n pluginNames,\n hasLocalSkills,\n hasLocalAgents,\n hasClaudeDir,\n hasClaudeSrcDir,\n pluginsDir,\n skillsDir,\n agentsDir,\n claudeDir,\n claudeSrcDir,\n config,\n configuredSources,\n };\n}\n\ntype UninstallConfirmProps = {\n target: UninstallTarget;\n removeAll: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n};\n\nconst UninstallConfirm: React.FC<UninstallConfirmProps> = ({\n target,\n removeAll,\n onConfirm,\n onCancel,\n}) => {\n const { exit } = useApp();\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>The following will be removed:</Text>\n <Text> </Text>\n\n {target.hasPlugins && (\n <Box flexDirection=\"column\">\n <Text color={CLI_COLORS.ERROR}> Plugins:</Text>\n <Text dimColor> {target.pluginsDir}</Text>\n </Box>\n )}\n\n {(target.hasLocalSkills || target.hasLocalAgents) && (\n <Box flexDirection=\"column\">\n <Text color={CLI_COLORS.ERROR}> CLI-managed files:</Text>\n {target.hasLocalSkills && <Text dimColor> {target.skillsDir}/ (matching sources)</Text>}\n {target.hasLocalAgents && <Text dimColor> {target.agentsDir}/ (CLI-compiled)</Text>}\n </Box>\n )}\n\n {removeAll && target.hasClaudeSrcDir && (\n <Box flexDirection=\"column\">\n <Text color={CLI_COLORS.ERROR}> Config:</Text>\n <Text dimColor> {target.claudeSrcDir}/</Text>\n </Box>\n )}\n\n <Text> </Text>\n <Confirm\n message=\"Are you sure you want to uninstall?\"\n onConfirm={() => {\n onConfirm();\n exit();\n }}\n onCancel={() => {\n onCancel();\n exit();\n }}\n defaultValue={false}\n />\n </Box>\n );\n};\n\nasync function isDirectoryEmpty(dirPath: string): Promise<boolean> {\n const { readdir } = await import(\"fs/promises\");\n try {\n const allEntries = await readdir(dirPath);\n return allEntries.length === 0;\n } catch {\n return true;\n }\n}\n\nfunction skillMatchesConfiguredSource(\n forkedFromSource: string | undefined,\n configuredSources: string[],\n): boolean {\n if (!forkedFromSource || configuredSources.length === 0) return false;\n return configuredSources.includes(forkedFromSource);\n}\n\nexport default class Uninstall extends BaseCommand {\n static summary = `Remove ${DEFAULT_BRANDING.NAME} from this project`;\n\n static description = `Uninstall ${DEFAULT_BRANDING.NAME} from this project. Removes CLI-managed skills (matched by source), compiled agents, and plugins. User-created content is preserved.`;\n\n static examples = [\n \"<%= config.bin %> <%= command.id %>\",\n \"<%= config.bin %> <%= command.id %> --yes\",\n \"<%= config.bin %> <%= command.id %> --all\",\n \"<%= config.bin %> <%= command.id %> --dry-run\",\n ];\n\n static flags = {\n ...BaseCommand.baseFlags,\n yes: Flags.boolean({\n char: \"y\",\n description: \"Skip confirmation prompt\",\n default: false,\n }),\n all: Flags.boolean({\n description: \"Also remove .claude-src/ config directory\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Uninstall);\n const projectDir = process.cwd();\n\n this.log(\"\");\n this.log(`${DEFAULT_BRANDING.NAME} Uninstall`);\n this.log(\"\");\n\n if (flags[\"dry-run\"]) {\n this.log(DRY_RUN_MESSAGES.PREVIEW_NO_FILES_REMOVED);\n this.log(\"\");\n }\n\n const target = await detectUninstallTarget(projectDir);\n\n const hasAnythingToRemove =\n target.hasPlugins ||\n target.hasLocalSkills ||\n target.hasLocalAgents ||\n (flags.all && target.hasClaudeSrcDir);\n\n if (!hasAnythingToRemove) {\n this.warn(\"Nothing to uninstall.\");\n this.log(\"\");\n this.log(INFO_MESSAGES.NOT_INSTALLED);\n this.log(\"\");\n this.log(INFO_MESSAGES.NO_CHANGES_MADE);\n return;\n }\n\n if (!flags.yes && !flags[\"dry-run\"]) {\n const confirmed = await new Promise<boolean>((resolve) => {\n const { waitUntilExit } = render(\n <UninstallConfirm\n target={target}\n removeAll={flags.all}\n onConfirm={() => resolve(true)}\n onCancel={() => resolve(false)}\n />,\n );\n\n waitUntilExit().catch(() => resolve(false));\n });\n\n if (!confirmed) {\n this.log(\"\");\n this.log(\"Uninstall cancelled\");\n this.exit(EXIT_CODES.CANCELLED);\n }\n } else {\n this.log(\"The following will be removed:\");\n this.log(\"\");\n\n if (target.hasPlugins) {\n this.log(\" Plugins:\");\n this.log(` ${target.pluginsDir}`);\n }\n\n if (target.hasLocalSkills || target.hasLocalAgents) {\n this.log(\" CLI-managed files:\");\n if (target.hasLocalSkills) {\n this.log(` ${target.skillsDir}/ (matching sources)`);\n }\n if (target.hasLocalAgents) {\n this.log(` ${target.agentsDir}/ (CLI-compiled)`);\n }\n }\n\n if (flags.all && target.hasClaudeSrcDir) {\n this.log(\" Config:\");\n this.log(` ${target.claudeSrcDir}/`);\n }\n\n this.log(\"\");\n }\n\n if (flags[\"dry-run\"]) {\n if (target.hasPlugins) {\n this.log(`[dry-run] Would uninstall ${target.pluginNames.length} plugins:`);\n for (const pluginName of target.pluginNames) {\n this.log(`[dry-run] ${pluginName}`);\n }\n }\n\n await this.dryRunLocalRemoval(target, flags.all);\n\n this.log(\"\");\n this.log(DRY_RUN_MESSAGES.COMPLETE_NO_FILES_REMOVED);\n this.log(\"\");\n return;\n }\n\n if (target.hasPlugins) {\n this.log(\"Uninstalling plugins...\");\n\n try {\n const cliAvailable = await isClaudeCLIAvailable();\n\n for (const pluginName of target.pluginNames) {\n if (cliAvailable) {\n try {\n await claudePluginUninstall(pluginName, \"project\", projectDir);\n } catch {\n // Best-effort: plugin may not be registered with Claude CLI\n }\n }\n\n const pluginPath = path.join(target.pluginsDir, pluginName);\n await remove(pluginPath);\n }\n\n this.logSuccess(\"Plugins uninstalled\");\n } catch (error) {\n this.log(\"Plugin uninstall failed\");\n this.error(getErrorMessage(error), {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n\n try {\n await this.removeLocalFiles(target, flags.all);\n } catch (error) {\n this.log(\"Failed to remove local files\");\n this.error(getErrorMessage(error), {\n exit: EXIT_CODES.ERROR,\n });\n }\n\n this.log(\"\");\n this.log(`${DEFAULT_BRANDING.NAME} has been uninstalled.`);\n this.log(\"\");\n this.logSuccess(SUCCESS_MESSAGES.UNINSTALL_COMPLETE);\n this.log(\"\");\n }\n\n /**\n * Selectively removes local files installed by the CLI using config-based matching.\n *\n * - Skills: removes skill dirs whose forked_from.source matches a configured source\n * - Agents: removes agents whose frontmatter name matches a configured agent, or\n * all agents if config.yaml exists (CLI was used to compile them)\n * - Plugins: removed separately (always)\n * - .claude-src/: only removed with --all flag\n * - .claude/: only removed if empty after selective cleanup\n */\n private async removeLocalFiles(target: UninstallTarget, removeAll: boolean): Promise<void> {\n let removedSkillCount = 0;\n let skippedSkillCount = 0;\n\n if (target.hasLocalSkills) {\n const skillDirNames = await listDirectories(target.skillsDir);\n\n for (const skillDirName of skillDirNames) {\n const skillDir = path.join(target.skillsDir, skillDirName);\n const forkedFrom = await readForkedFromMetadata(skillDir);\n\n const shouldRemove =\n forkedFrom !== null &&\n (skillMatchesConfiguredSource(forkedFrom.source, target.configuredSources) ||\n // Legacy skills without source field are treated as CLI-managed when config exists\n (!forkedFrom.source && target.config !== null));\n\n if (shouldRemove) {\n await remove(skillDir);\n removedSkillCount++;\n } else {\n this.warn(`Skipping '${skillDirName}': not created by ${DEFAULT_BRANDING.NAME} CLI`);\n skippedSkillCount++;\n }\n }\n\n if (removedSkillCount > 0) {\n this.logSuccess(\n `Removed ${removedSkillCount} CLI-installed ${removedSkillCount === 1 ? \"skill\" : \"skills\"}`,\n );\n }\n\n if (skippedSkillCount === 0 && (await directoryExists(target.skillsDir))) {\n if (await isDirectoryEmpty(target.skillsDir)) {\n await remove(target.skillsDir);\n }\n }\n }\n\n if (target.hasLocalAgents) {\n // config.yaml presence indicates the CLI compiled these agents\n if (target.config !== null) {\n await remove(target.agentsDir);\n this.logSuccess(\"Removed compiled agents\");\n }\n }\n\n if (removeAll && target.hasClaudeSrcDir) {\n await remove(target.claudeSrcDir);\n this.logSuccess(`Removed ${CLAUDE_SRC_DIR}/`);\n }\n\n if (target.hasClaudeDir && (await directoryExists(target.claudeDir))) {\n if (await isDirectoryEmpty(target.claudeDir)) {\n await remove(target.claudeDir);\n this.logSuccess(`Removed ${CLAUDE_DIR}/`);\n } else {\n this.log(`Kept ${CLAUDE_DIR}/ (contains user content)`);\n }\n }\n }\n\n private async dryRunLocalRemoval(target: UninstallTarget, removeAll: boolean): Promise<void> {\n if (target.hasLocalSkills) {\n const skillDirNames = await listDirectories(target.skillsDir);\n\n for (const skillDirName of skillDirNames) {\n const skillDir = path.join(target.skillsDir, skillDirName);\n const forkedFrom = await readForkedFromMetadata(skillDir);\n\n const shouldRemove =\n forkedFrom !== null &&\n (skillMatchesConfiguredSource(forkedFrom.source, target.configuredSources) ||\n (!forkedFrom.source && target.config !== null));\n\n if (shouldRemove) {\n this.log(`[dry-run] Would remove skill '${skillDirName}'`);\n } else {\n this.log(\n `[dry-run] Would skip '${skillDirName}': not created by ${DEFAULT_BRANDING.NAME} CLI`,\n );\n }\n }\n }\n\n if (target.hasLocalAgents && target.config !== null) {\n this.log(`[dry-run] Would remove ${target.agentsDir}/`);\n }\n\n if (removeAll && target.hasClaudeSrcDir) {\n this.log(`[dry-run] Would remove ${target.claudeSrcDir}/`);\n }\n\n if (target.hasClaudeDir) {\n this.log(`[dry-run] Would remove ${target.claudeDir}/ only if empty after cleanup`);\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -4,31 +4,31 @@ import {
4
4
  } from "../chunk-N6S7ZRIL.js";
5
5
  import {
6
6
  recompileAgents
7
- } from "../chunk-GIFEDW27.js";
7
+ } from "../chunk-IZRVFC2Z.js";
8
8
  import {
9
9
  ERROR_MESSAGES,
10
10
  INFO_MESSAGES,
11
11
  STATUS_MESSAGES,
12
12
  SUCCESS_MESSAGES
13
- } from "../chunk-GGHH3KR2.js";
13
+ } from "../chunk-HKDE4LJW.js";
14
14
  import {
15
15
  BaseCommand,
16
16
  EXIT_CODES
17
- } from "../chunk-GVMA2EKC.js";
17
+ } from "../chunk-YHQNTBBN.js";
18
18
  import {
19
19
  compareLocalSkillsWithSource,
20
20
  injectForkedFromMetadata,
21
21
  loadSkillsMatrixFromSource
22
- } from "../chunk-TM4I4EHK.js";
22
+ } from "../chunk-U5OB5ADP.js";
23
23
  import "../chunk-T4EXUIBY.js";
24
24
  import {
25
25
  copy,
26
26
  fileExists,
27
27
  getErrorMessage
28
- } from "../chunk-NLR6Z37M.js";
28
+ } from "../chunk-YJIJTBSX.js";
29
29
  import {
30
30
  LOCAL_SKILLS_PATH
31
- } from "../chunk-YCS7GF6Y.js";
31
+ } from "../chunk-ZBJQXDQN.js";
32
32
  import {
33
33
  init_esm_shims
34
34
  } from "../chunk-DHET7RCE.js";
@@ -1,17 +1,17 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  ERROR_MESSAGES
4
- } from "../chunk-GGHH3KR2.js";
4
+ } from "../chunk-HKDE4LJW.js";
5
5
  import {
6
6
  BaseCommand,
7
7
  EXIT_CODES
8
- } from "../chunk-GVMA2EKC.js";
8
+ } from "../chunk-YHQNTBBN.js";
9
9
  import {
10
10
  extractFrontmatter,
11
11
  printPluginValidationResult,
12
12
  validateAllPlugins,
13
13
  validatePlugin
14
- } from "../chunk-TM4I4EHK.js";
14
+ } from "../chunk-U5OB5ADP.js";
15
15
  import "../chunk-T4EXUIBY.js";
16
16
  import {
17
17
  agentFrontmatterValidationSchema,
@@ -27,12 +27,12 @@ import {
27
27
  skillsMatrixConfigSchema,
28
28
  stackConfigValidationSchema,
29
29
  stacksConfigSchema
30
- } from "../chunk-NLR6Z37M.js";
30
+ } from "../chunk-YJIJTBSX.js";
31
31
  import {
32
32
  CLAUDE_DIR,
33
33
  CLAUDE_SRC_DIR,
34
34
  STANDARD_FILES
35
- } from "../chunk-YCS7GF6Y.js";
35
+ } from "../chunk-ZBJQXDQN.js";
36
36
  import {
37
37
  init_esm_shims
38
38
  } from "../chunk-DHET7RCE.js";
@@ -2,20 +2,20 @@
2
2
  import {
3
3
  BaseCommand,
4
4
  EXIT_CODES
5
- } from "../../chunk-GVMA2EKC.js";
5
+ } from "../../chunk-YHQNTBBN.js";
6
6
  import {
7
7
  bumpPluginVersion,
8
8
  findPluginManifest
9
- } from "../../chunk-TM4I4EHK.js";
9
+ } from "../../chunk-U5OB5ADP.js";
10
10
  import "../../chunk-T4EXUIBY.js";
11
11
  import {
12
12
  pluginManifestSchema,
13
13
  readFile
14
- } from "../../chunk-NLR6Z37M.js";
14
+ } from "../../chunk-YJIJTBSX.js";
15
15
  import {
16
16
  PLUGIN_MANIFEST_DIR,
17
17
  PLUGIN_MANIFEST_FILE
18
- } from "../../chunk-YCS7GF6Y.js";
18
+ } from "../../chunk-ZBJQXDQN.js";
19
19
  import {
20
20
  init_esm_shims
21
21
  } from "../../chunk-DHET7RCE.js";