@agents-inc/cli 0.34.1 → 0.35.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 (115) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/config/skills-matrix.yaml +9 -9
  3. package/config/stacks.yaml +8 -8
  4. package/dist/{chunk-B47QYIUL.js → chunk-5LPPIT6H.js} +4 -4
  5. package/dist/chunk-AQQVSNUX.js +33 -0
  6. package/dist/chunk-AQQVSNUX.js.map +1 -0
  7. package/dist/{chunk-GVMA2EKC.js → chunk-BLLXNFWP.js} +2 -2
  8. package/dist/{chunk-KENWMEKN.js → chunk-BPD4VUAU.js} +4 -4
  9. package/dist/{chunk-X7SPCWY6.js → chunk-CXWPUVA7.js} +12 -7
  10. package/dist/chunk-CXWPUVA7.js.map +1 -0
  11. package/dist/{chunk-QC37C32G.js → chunk-IG7CUREJ.js} +2 -2
  12. package/dist/{chunk-JMVWYAHT.js → chunk-KUV24B5M.js} +4 -4
  13. package/dist/chunk-KUV24B5M.js.map +1 -0
  14. package/dist/{chunk-ZI5EBHCC.js → chunk-KWF6D7ZP.js} +21 -10
  15. package/dist/chunk-KWF6D7ZP.js.map +1 -0
  16. package/dist/{chunk-ZP4BI6J2.js → chunk-NJ775OJ4.js} +3 -3
  17. package/dist/{chunk-ALS7SH7X.js → chunk-NVQEHRJY.js} +2 -2
  18. package/dist/{chunk-TKB4O2RY.js → chunk-OGJ7DFCL.js} +2 -2
  19. package/dist/{chunk-R3AD6XBJ.js → chunk-OGXSTJP2.js} +3 -3
  20. package/dist/{chunk-NLR6Z37M.js → chunk-OI4WBRC7.js} +12 -3
  21. package/dist/chunk-OI4WBRC7.js.map +1 -0
  22. package/dist/{chunk-JZOLJVWA.js → chunk-PKUIO2Z7.js} +6 -5
  23. package/dist/chunk-PKUIO2Z7.js.map +1 -0
  24. package/dist/{chunk-CB7GYRUP.js → chunk-U36YCEBK.js} +76 -36
  25. package/dist/chunk-U36YCEBK.js.map +1 -0
  26. package/dist/{chunk-2LUXM5FB.js → chunk-UFUQUFV6.js} +7 -28
  27. package/dist/chunk-UFUQUFV6.js.map +1 -0
  28. package/dist/{chunk-TM4I4EHK.js → chunk-WMVGRAFB.js} +2884 -2925
  29. package/dist/chunk-WMVGRAFB.js.map +1 -0
  30. package/dist/{chunk-A5CYQQVG.js → chunk-XNQJBQ5X.js} +2 -2
  31. package/dist/{chunk-GIFEDW27.js → chunk-YIKBNGE3.js} +3 -3
  32. package/dist/{chunk-ANGAZ444.js → chunk-YN35L5NE.js} +1 -1
  33. package/dist/chunk-YN35L5NE.js.map +1 -0
  34. package/dist/commands/build/marketplace.js +2 -2
  35. package/dist/commands/build/plugins.js +4 -4
  36. package/dist/commands/build/stack.js +4 -4
  37. package/dist/commands/compile.js +17 -6
  38. package/dist/commands/compile.js.map +1 -1
  39. package/dist/commands/config/get.js +3 -3
  40. package/dist/commands/config/index.js +4 -4
  41. package/dist/commands/config/path.js +3 -3
  42. package/dist/commands/config/set-project.js +3 -3
  43. package/dist/commands/config/show.js +4 -4
  44. package/dist/commands/config/unset-project.js +3 -3
  45. package/dist/commands/diff.js +3 -3
  46. package/dist/commands/doctor.js +3 -3
  47. package/dist/commands/edit.js +24 -18
  48. package/dist/commands/edit.js.map +1 -1
  49. package/dist/commands/eject.js +3 -3
  50. package/dist/commands/import/skill.js +3 -3
  51. package/dist/commands/info.js +3 -3
  52. package/dist/commands/init.js +18 -16
  53. package/dist/commands/init.js.map +1 -1
  54. package/dist/commands/list.js +3 -3
  55. package/dist/commands/new/agent.js +4 -4
  56. package/dist/commands/new/skill.js +3 -3
  57. package/dist/commands/outdated.js +3 -3
  58. package/dist/commands/search.js +3 -3
  59. package/dist/commands/uninstall.js +103 -26
  60. package/dist/commands/uninstall.js.map +1 -1
  61. package/dist/commands/update.js +4 -4
  62. package/dist/commands/validate.js +3 -3
  63. package/dist/commands/version/bump.js +3 -3
  64. package/dist/commands/version/index.js +3 -3
  65. package/dist/commands/version/set.js +3 -3
  66. package/dist/commands/version/show.js +3 -3
  67. package/dist/components/wizard/domain-selection.js +4 -4
  68. package/dist/components/wizard/search-modal.js +2 -2
  69. package/dist/components/wizard/search-modal.test.js +2 -2
  70. package/dist/components/wizard/source-grid.js +3 -3
  71. package/dist/components/wizard/source-grid.test.js +3 -3
  72. package/dist/components/wizard/stack-selection.js +4 -4
  73. package/dist/components/wizard/step-build.js +4 -3
  74. package/dist/components/wizard/step-build.test.js +5 -4
  75. package/dist/components/wizard/step-build.test.js.map +1 -1
  76. package/dist/components/wizard/step-confirm.test.js +3 -3
  77. package/dist/components/wizard/step-settings.js +4 -4
  78. package/dist/components/wizard/step-settings.test.js +7 -7
  79. package/dist/components/wizard/step-sources.js +8 -7
  80. package/dist/components/wizard/step-sources.test.js +9 -8
  81. package/dist/components/wizard/step-sources.test.js.map +1 -1
  82. package/dist/components/wizard/step-stack.js +6 -6
  83. package/dist/components/wizard/step-stack.test.js +7 -7
  84. package/dist/components/wizard/wizard-layout.js +4 -4
  85. package/dist/components/wizard/wizard.js +15 -14
  86. package/dist/config/skills-matrix.yaml +9 -9
  87. package/dist/config/stacks.yaml +8 -8
  88. package/dist/hooks/init.js +4 -2
  89. package/dist/hooks/init.js.map +1 -1
  90. package/dist/{source-manager-WJYANKDI.js → source-manager-PTK4P6BF.js} +3 -3
  91. package/dist/stores/wizard-store.js +3 -3
  92. package/dist/stores/wizard-store.test.js +4 -4
  93. package/package.json +1 -1
  94. package/src/schemas/project-config.schema.json +3 -0
  95. package/src/schemas/project-source-config.schema.json +12 -0
  96. package/dist/chunk-2LUXM5FB.js.map +0 -1
  97. package/dist/chunk-ANGAZ444.js.map +0 -1
  98. package/dist/chunk-CB7GYRUP.js.map +0 -1
  99. package/dist/chunk-JMVWYAHT.js.map +0 -1
  100. package/dist/chunk-JZOLJVWA.js.map +0 -1
  101. package/dist/chunk-NLR6Z37M.js.map +0 -1
  102. package/dist/chunk-TM4I4EHK.js.map +0 -1
  103. package/dist/chunk-X7SPCWY6.js.map +0 -1
  104. package/dist/chunk-ZI5EBHCC.js.map +0 -1
  105. /package/dist/{chunk-B47QYIUL.js.map → chunk-5LPPIT6H.js.map} +0 -0
  106. /package/dist/{chunk-GVMA2EKC.js.map → chunk-BLLXNFWP.js.map} +0 -0
  107. /package/dist/{chunk-KENWMEKN.js.map → chunk-BPD4VUAU.js.map} +0 -0
  108. /package/dist/{chunk-QC37C32G.js.map → chunk-IG7CUREJ.js.map} +0 -0
  109. /package/dist/{chunk-ZP4BI6J2.js.map → chunk-NJ775OJ4.js.map} +0 -0
  110. /package/dist/{chunk-ALS7SH7X.js.map → chunk-NVQEHRJY.js.map} +0 -0
  111. /package/dist/{chunk-TKB4O2RY.js.map → chunk-OGJ7DFCL.js.map} +0 -0
  112. /package/dist/{chunk-R3AD6XBJ.js.map → chunk-OGXSTJP2.js.map} +0 -0
  113. /package/dist/{chunk-A5CYQQVG.js.map → chunk-XNQJBQ5X.js.map} +0 -0
  114. /package/dist/{chunk-GIFEDW27.js.map → chunk-YIKBNGE3.js.map} +0 -0
  115. /package/dist/{source-manager-WJYANKDI.js.map → source-manager-PTK4P6BF.js.map} +0 -0
@@ -5,7 +5,7 @@ import {
5
5
  import {
6
6
  claudePluginUninstall,
7
7
  isClaudeCLIAvailable
8
- } from "../chunk-A5CYQQVG.js";
8
+ } from "../chunk-XNQJBQ5X.js";
9
9
  import {
10
10
  DRY_RUN_MESSAGES,
11
11
  ERROR_MESSAGES,
@@ -15,17 +15,19 @@ import {
15
15
  import {
16
16
  BaseCommand,
17
17
  EXIT_CODES
18
- } from "../chunk-GVMA2EKC.js";
18
+ } from "../chunk-BLLXNFWP.js";
19
19
  import {
20
20
  getProjectPluginsDir,
21
- listPluginNames
22
- } from "../chunk-TM4I4EHK.js";
21
+ listPluginNames,
22
+ readLocalSkillMetadata
23
+ } from "../chunk-WMVGRAFB.js";
23
24
  import "../chunk-T4EXUIBY.js";
24
25
  import {
25
26
  directoryExists,
26
27
  fileExists,
28
+ listDirectories,
27
29
  remove
28
- } from "../chunk-NLR6Z37M.js";
30
+ } from "../chunk-OI4WBRC7.js";
29
31
  import {
30
32
  CLAUDE_DIR,
31
33
  CLAUDE_SRC_DIR,
@@ -129,9 +131,19 @@ var UninstallConfirm = ({
129
131
  )
130
132
  ] });
131
133
  };
134
+ async function isDirectoryEmpty(dirPath) {
135
+ const entries = await listDirectories(dirPath);
136
+ const { readdir } = await import("fs/promises");
137
+ try {
138
+ const allEntries = await readdir(dirPath);
139
+ return allEntries.length === 0;
140
+ } catch {
141
+ return true;
142
+ }
143
+ }
132
144
  var Uninstall = class _Uninstall extends BaseCommand {
133
145
  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.`;
146
+ static description = `Uninstall the ${DEFAULT_BRANDING.NAME} plugin and/or local directories (.claude/ and .claude-src/). By default, removes everything. Only removes skills that were installed by the CLI (marked with generatedByAgentsInc in metadata.yaml).`;
135
147
  static examples = [
136
148
  "<%= config.bin %> <%= command.id %>",
137
149
  "<%= config.bin %> <%= command.id %> --yes",
@@ -233,12 +245,7 @@ var Uninstall = class _Uninstall extends BaseCommand {
233
245
  }
234
246
  }
235
247
  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
- }
248
+ await this.dryRunLocalRemoval(target);
242
249
  }
243
250
  this.log("");
244
251
  this.log(DRY_RUN_MESSAGES.COMPLETE_NO_FILES_REMOVED);
@@ -268,22 +275,11 @@ var Uninstall = class _Uninstall extends BaseCommand {
268
275
  }
269
276
  }
270
277
  if (hasLocalToRemove) {
271
- this.log("Removing local directories...");
278
+ this.log("Removing local files...");
272
279
  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
- );
280
+ await this.removeLocalFiles(target);
285
281
  } catch (error) {
286
- this.log("Failed to remove local directories");
282
+ this.log("Failed to remove local files");
287
283
  this.error(error instanceof Error ? error.message : ERROR_MESSAGES.UNKNOWN_ERROR, {
288
284
  exit: EXIT_CODES.ERROR
289
285
  });
@@ -295,6 +291,87 @@ var Uninstall = class _Uninstall extends BaseCommand {
295
291
  this.logSuccess(SUCCESS_MESSAGES.UNINSTALL_COMPLETE);
296
292
  this.log("");
297
293
  }
294
+ /**
295
+ * Selectively removes local files installed by the CLI.
296
+ *
297
+ * - Skills: only removes skill dirs with `generatedByAgentsInc: true` in metadata.yaml
298
+ * - Agents: removes the entire `.claude/agents/` directory (compiled by CLI)
299
+ * - Config: removes `.claude-src/` entirely (CLI-owned config)
300
+ * - `.claude/`: only removed if empty after selective cleanup
301
+ */
302
+ async removeLocalFiles(target) {
303
+ let removedSkillCount = 0;
304
+ let skippedSkillCount = 0;
305
+ if (target.hasLocalSkills) {
306
+ const skillDirNames = await listDirectories(target.skillsDir);
307
+ for (const skillDirName of skillDirNames) {
308
+ const skillDir = path.join(target.skillsDir, skillDirName);
309
+ const metadata = await readLocalSkillMetadata(skillDir);
310
+ if (metadata?.generatedByAgentsInc) {
311
+ await remove(skillDir);
312
+ removedSkillCount++;
313
+ } else {
314
+ this.warn(`Skipping '${skillDirName}': not created by ${DEFAULT_BRANDING.NAME} CLI`);
315
+ skippedSkillCount++;
316
+ }
317
+ }
318
+ if (removedSkillCount > 0) {
319
+ this.logSuccess(
320
+ `Removed ${removedSkillCount} CLI-installed ${removedSkillCount === 1 ? "skill" : "skills"}`
321
+ );
322
+ }
323
+ if (skippedSkillCount === 0 && await directoryExists(target.skillsDir)) {
324
+ if (await isDirectoryEmpty(target.skillsDir)) {
325
+ await remove(target.skillsDir);
326
+ }
327
+ }
328
+ }
329
+ if (target.hasLocalAgents) {
330
+ await remove(target.agentsDir);
331
+ this.logSuccess("Removed compiled agents");
332
+ }
333
+ if (target.hasClaudeSrcDir) {
334
+ await remove(target.claudeSrcDir);
335
+ this.logSuccess(`Removed ${CLAUDE_SRC_DIR}/`);
336
+ }
337
+ if (target.hasClaudeDir && await directoryExists(target.claudeDir)) {
338
+ if (await isDirectoryEmpty(target.claudeDir)) {
339
+ await remove(target.claudeDir);
340
+ this.logSuccess(`Removed ${CLAUDE_DIR}/`);
341
+ } else {
342
+ this.log(`Kept ${CLAUDE_DIR}/ (contains user content)`);
343
+ }
344
+ }
345
+ }
346
+ /**
347
+ * Dry-run preview of local file removal.
348
+ * Shows what would be removed/skipped without making changes.
349
+ */
350
+ async dryRunLocalRemoval(target) {
351
+ if (target.hasLocalSkills) {
352
+ const skillDirNames = await listDirectories(target.skillsDir);
353
+ for (const skillDirName of skillDirNames) {
354
+ const skillDir = path.join(target.skillsDir, skillDirName);
355
+ const metadata = await readLocalSkillMetadata(skillDir);
356
+ if (metadata?.generatedByAgentsInc) {
357
+ this.log(`[dry-run] Would remove skill '${skillDirName}'`);
358
+ } else {
359
+ this.log(
360
+ `[dry-run] Would skip '${skillDirName}': not created by ${DEFAULT_BRANDING.NAME} CLI`
361
+ );
362
+ }
363
+ }
364
+ }
365
+ if (target.hasLocalAgents) {
366
+ this.log(`[dry-run] Would remove ${target.agentsDir}/`);
367
+ }
368
+ if (target.hasClaudeSrcDir) {
369
+ this.log(`[dry-run] Would remove ${target.claudeSrcDir}/`);
370
+ }
371
+ if (target.hasClaudeDir) {
372
+ this.log(`[dry-run] Would remove ${target.claudeDir}/ only if empty after cleanup`);
373
+ }
374
+ }
298
375
  };
299
376
  export {
300
377
  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 { directoryExists, fileExists, listDirectories, remove } from \"../utils/fs\";\nimport { claudePluginUninstall, isClaudeCLIAvailable } from \"../utils/exec\";\nimport { listPluginNames, getProjectPluginsDir } from \"../lib/plugins\";\nimport { readLocalSkillMetadata } from \"../lib/skills\";\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\n/**\n * Checks whether a directory is empty (contains no entries).\n * Returns true if the directory has no subdirectories or files.\n */\nasync function isDirectoryEmpty(dirPath: string): Promise<boolean> {\n const entries = await listDirectories(dirPath);\n // listDirectories only returns directories; also check for files\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\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. Only removes skills that were installed by the CLI (marked with generatedByAgentsInc in metadata.yaml).`;\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 await this.dryRunLocalRemoval(target);\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 files...\");\n\n try {\n await this.removeLocalFiles(target);\n } catch (error) {\n this.log(\"Failed to remove local files\");\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 /**\n * Selectively removes local files installed by the CLI.\n *\n * - Skills: only removes skill dirs with `generatedByAgentsInc: true` in metadata.yaml\n * - Agents: removes the entire `.claude/agents/` directory (compiled by CLI)\n * - Config: removes `.claude-src/` entirely (CLI-owned config)\n * - `.claude/`: only removed if empty after selective cleanup\n */\n private async removeLocalFiles(target: UninstallTarget): Promise<void> {\n let removedSkillCount = 0;\n let skippedSkillCount = 0;\n\n // Selectively remove skills based on generatedByAgentsInc flag\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 metadata = await readLocalSkillMetadata(skillDir);\n\n if (metadata?.generatedByAgentsInc) {\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 // Remove skills/ directory if now empty\n if (skippedSkillCount === 0 && (await directoryExists(target.skillsDir))) {\n if (await isDirectoryEmpty(target.skillsDir)) {\n await remove(target.skillsDir);\n }\n }\n }\n\n // Remove compiled agents directory entirely (generated by CLI)\n if (target.hasLocalAgents) {\n await remove(target.agentsDir);\n this.logSuccess(\"Removed compiled agents\");\n }\n\n // Remove .claude-src/ entirely (CLI-owned config)\n if (target.hasClaudeSrcDir) {\n await remove(target.claudeSrcDir);\n this.logSuccess(`Removed ${CLAUDE_SRC_DIR}/`);\n }\n\n // Only remove .claude/ itself if it is empty after cleanup\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 /**\n * Dry-run preview of local file removal.\n * Shows what would be removed/skipped without making changes.\n */\n private async dryRunLocalRemoval(target: UninstallTarget): Promise<void> {\n // Preview skill removal\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 metadata = await readLocalSkillMetadata(skillDir);\n\n if (metadata?.generatedByAgentsInc) {\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 // Preview agents removal\n if (target.hasLocalAgents) {\n this.log(`[dry-run] Would remove ${target.agentsDir}/`);\n }\n\n // Preview .claude-src/ removal\n if (target.hasClaudeSrcDir) {\n this.log(`[dry-run] Would remove ${target.claudeSrcDir}/`);\n }\n\n // Preview .claude/ removal\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,7 +4,7 @@ import {
4
4
  } from "../chunk-N6S7ZRIL.js";
5
5
  import {
6
6
  recompileAgents
7
- } from "../chunk-GIFEDW27.js";
7
+ } from "../chunk-YIKBNGE3.js";
8
8
  import {
9
9
  ERROR_MESSAGES,
10
10
  INFO_MESSAGES,
@@ -14,18 +14,18 @@ import {
14
14
  import {
15
15
  BaseCommand,
16
16
  EXIT_CODES
17
- } from "../chunk-GVMA2EKC.js";
17
+ } from "../chunk-BLLXNFWP.js";
18
18
  import {
19
19
  compareLocalSkillsWithSource,
20
20
  injectForkedFromMetadata,
21
21
  loadSkillsMatrixFromSource
22
- } from "../chunk-TM4I4EHK.js";
22
+ } from "../chunk-WMVGRAFB.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-OI4WBRC7.js";
29
29
  import {
30
30
  LOCAL_SKILLS_PATH
31
31
  } from "../chunk-YCS7GF6Y.js";
@@ -5,13 +5,13 @@ import {
5
5
  import {
6
6
  BaseCommand,
7
7
  EXIT_CODES
8
- } from "../chunk-GVMA2EKC.js";
8
+ } from "../chunk-BLLXNFWP.js";
9
9
  import {
10
10
  extractFrontmatter,
11
11
  printPluginValidationResult,
12
12
  validateAllPlugins,
13
13
  validatePlugin
14
- } from "../chunk-TM4I4EHK.js";
14
+ } from "../chunk-WMVGRAFB.js";
15
15
  import "../chunk-T4EXUIBY.js";
16
16
  import {
17
17
  agentFrontmatterValidationSchema,
@@ -27,7 +27,7 @@ import {
27
27
  skillsMatrixConfigSchema,
28
28
  stackConfigValidationSchema,
29
29
  stacksConfigSchema
30
- } from "../chunk-NLR6Z37M.js";
30
+ } from "../chunk-OI4WBRC7.js";
31
31
  import {
32
32
  CLAUDE_DIR,
33
33
  CLAUDE_SRC_DIR,
@@ -2,16 +2,16 @@
2
2
  import {
3
3
  BaseCommand,
4
4
  EXIT_CODES
5
- } from "../../chunk-GVMA2EKC.js";
5
+ } from "../../chunk-BLLXNFWP.js";
6
6
  import {
7
7
  bumpPluginVersion,
8
8
  findPluginManifest
9
- } from "../../chunk-TM4I4EHK.js";
9
+ } from "../../chunk-WMVGRAFB.js";
10
10
  import "../../chunk-T4EXUIBY.js";
11
11
  import {
12
12
  pluginManifestSchema,
13
13
  readFile
14
- } from "../../chunk-NLR6Z37M.js";
14
+ } from "../../chunk-OI4WBRC7.js";
15
15
  import {
16
16
  PLUGIN_MANIFEST_DIR,
17
17
  PLUGIN_MANIFEST_FILE
@@ -2,13 +2,13 @@
2
2
  import {
3
3
  BaseCommand,
4
4
  EXIT_CODES
5
- } from "../../chunk-GVMA2EKC.js";
5
+ } from "../../chunk-BLLXNFWP.js";
6
6
  import {
7
7
  findPluginManifest,
8
8
  getPluginVersion
9
- } from "../../chunk-TM4I4EHK.js";
9
+ } from "../../chunk-WMVGRAFB.js";
10
10
  import "../../chunk-T4EXUIBY.js";
11
- import "../../chunk-NLR6Z37M.js";
11
+ import "../../chunk-OI4WBRC7.js";
12
12
  import {
13
13
  PLUGIN_MANIFEST_DIR,
14
14
  PLUGIN_MANIFEST_FILE
@@ -2,16 +2,16 @@
2
2
  import {
3
3
  BaseCommand,
4
4
  EXIT_CODES
5
- } from "../../chunk-GVMA2EKC.js";
5
+ } from "../../chunk-BLLXNFWP.js";
6
6
  import {
7
7
  findPluginManifest
8
- } from "../../chunk-TM4I4EHK.js";
8
+ } from "../../chunk-WMVGRAFB.js";
9
9
  import "../../chunk-T4EXUIBY.js";
10
10
  import {
11
11
  pluginManifestSchema,
12
12
  readFile,
13
13
  writeFile
14
- } from "../../chunk-NLR6Z37M.js";
14
+ } from "../../chunk-OI4WBRC7.js";
15
15
  import {
16
16
  PLUGIN_MANIFEST_DIR,
17
17
  PLUGIN_MANIFEST_FILE
@@ -2,13 +2,13 @@
2
2
  import {
3
3
  BaseCommand,
4
4
  EXIT_CODES
5
- } from "../../chunk-GVMA2EKC.js";
5
+ } from "../../chunk-BLLXNFWP.js";
6
6
  import {
7
7
  findPluginManifest,
8
8
  getPluginVersion
9
- } from "../../chunk-TM4I4EHK.js";
9
+ } from "../../chunk-WMVGRAFB.js";
10
10
  import "../../chunk-T4EXUIBY.js";
11
- import "../../chunk-NLR6Z37M.js";
11
+ import "../../chunk-OI4WBRC7.js";
12
12
  import {
13
13
  PLUGIN_MANIFEST_DIR,
14
14
  PLUGIN_MANIFEST_FILE
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  DomainSelection
4
- } from "../../chunk-ALS7SH7X.js";
5
- import "../../chunk-R3AD6XBJ.js";
6
- import "../../chunk-TM4I4EHK.js";
4
+ } from "../../chunk-NVQEHRJY.js";
5
+ import "../../chunk-OGXSTJP2.js";
6
+ import "../../chunk-WMVGRAFB.js";
7
7
  import "../../chunk-T4EXUIBY.js";
8
- import "../../chunk-NLR6Z37M.js";
8
+ import "../../chunk-OI4WBRC7.js";
9
9
  import "../../chunk-YCS7GF6Y.js";
10
10
  import "../../chunk-DHET7RCE.js";
11
11
  export {
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SearchModal
4
- } from "../../chunk-QC37C32G.js";
5
- import "../../chunk-JMVWYAHT.js";
4
+ } from "../../chunk-IG7CUREJ.js";
5
+ import "../../chunk-KUV24B5M.js";
6
6
  import "../../chunk-YCS7GF6Y.js";
7
7
  import "../../chunk-DHET7RCE.js";
8
8
  export {
@@ -20,8 +20,8 @@ import {
20
20
  } from "../../chunk-XY3XDVMI.js";
21
21
  import {
22
22
  SearchModal
23
- } from "../../chunk-QC37C32G.js";
24
- import "../../chunk-JMVWYAHT.js";
23
+ } from "../../chunk-IG7CUREJ.js";
24
+ import "../../chunk-KUV24B5M.js";
25
25
  import "../../chunk-YCS7GF6Y.js";
26
26
  import {
27
27
  init_esm_shims
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SourceGrid
4
- } from "../../chunk-CB7GYRUP.js";
4
+ } from "../../chunk-U36YCEBK.js";
5
5
  import "../../chunk-7SOPVGDV.js";
6
6
  import "../../chunk-DC5AK3LW.js";
7
- import "../../chunk-QC37C32G.js";
8
- import "../../chunk-JMVWYAHT.js";
7
+ import "../../chunk-IG7CUREJ.js";
8
+ import "../../chunk-KUV24B5M.js";
9
9
  import "../../chunk-YCS7GF6Y.js";
10
10
  import "../../chunk-DHET7RCE.js";
11
11
  export {
@@ -23,11 +23,11 @@ import {
23
23
  } from "../../chunk-XY3XDVMI.js";
24
24
  import {
25
25
  SourceGrid
26
- } from "../../chunk-CB7GYRUP.js";
26
+ } from "../../chunk-U36YCEBK.js";
27
27
  import "../../chunk-7SOPVGDV.js";
28
28
  import "../../chunk-DC5AK3LW.js";
29
- import "../../chunk-QC37C32G.js";
30
- import "../../chunk-JMVWYAHT.js";
29
+ import "../../chunk-IG7CUREJ.js";
30
+ import "../../chunk-KUV24B5M.js";
31
31
  import "../../chunk-YCS7GF6Y.js";
32
32
  import {
33
33
  init_esm_shims
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StackSelection
4
- } from "../../chunk-TKB4O2RY.js";
4
+ } from "../../chunk-OGJ7DFCL.js";
5
5
  import "../../chunk-MZB3GGOH.js";
6
6
  import "../../chunk-HTTPKSL6.js";
7
7
  import "../../chunk-YPJKOM42.js";
8
- import "../../chunk-R3AD6XBJ.js";
9
- import "../../chunk-TM4I4EHK.js";
8
+ import "../../chunk-OGXSTJP2.js";
9
+ import "../../chunk-WMVGRAFB.js";
10
10
  import "../../chunk-T4EXUIBY.js";
11
- import "../../chunk-NLR6Z37M.js";
11
+ import "../../chunk-OI4WBRC7.js";
12
12
  import "../../chunk-YCS7GF6Y.js";
13
13
  import "../../chunk-DHET7RCE.js";
14
14
  export {
@@ -1,14 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StepBuild
4
- } from "../../chunk-2LUXM5FB.js";
4
+ } from "../../chunk-UFUQUFV6.js";
5
+ import "../../chunk-AQQVSNUX.js";
5
6
  import "../../chunk-MZB3GGOH.js";
6
7
  import "../../chunk-HTTPKSL6.js";
7
8
  import "../../chunk-OKILA27U.js";
8
9
  import "../../chunk-DC5AK3LW.js";
9
- import "../../chunk-TM4I4EHK.js";
10
+ import "../../chunk-WMVGRAFB.js";
10
11
  import "../../chunk-T4EXUIBY.js";
11
- import "../../chunk-NLR6Z37M.js";
12
+ import "../../chunk-OI4WBRC7.js";
12
13
  import "../../chunk-YCS7GF6Y.js";
13
14
  import "../../chunk-DHET7RCE.js";
14
15
  export {
@@ -13,7 +13,7 @@ import {
13
13
  createMockCategory,
14
14
  createMockMatrix,
15
15
  createMockSkill
16
- } from "../../chunk-ANGAZ444.js";
16
+ } from "../../chunk-YN35L5NE.js";
17
17
  import {
18
18
  afterEach,
19
19
  describe,
@@ -25,14 +25,15 @@ import {
25
25
  StepBuild,
26
26
  getSkillDisplayLabel,
27
27
  validateBuildStep
28
- } from "../../chunk-2LUXM5FB.js";
28
+ } from "../../chunk-UFUQUFV6.js";
29
+ import "../../chunk-AQQVSNUX.js";
29
30
  import "../../chunk-MZB3GGOH.js";
30
31
  import "../../chunk-HTTPKSL6.js";
31
32
  import "../../chunk-OKILA27U.js";
32
33
  import "../../chunk-DC5AK3LW.js";
33
- import "../../chunk-TM4I4EHK.js";
34
+ import "../../chunk-WMVGRAFB.js";
34
35
  import "../../chunk-T4EXUIBY.js";
35
- import "../../chunk-NLR6Z37M.js";
36
+ import "../../chunk-OI4WBRC7.js";
36
37
  import "../../chunk-YCS7GF6Y.js";
37
38
  import {
38
39
  init_esm_shims