@claude-collective/cli 0.13.4 → 0.21.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 (228) hide show
  1. package/CHANGELOG.md +183 -0
  2. package/config/skills-matrix.yaml +180 -113
  3. package/config/stacks.yaml +6 -6
  4. package/dist/{chunk-K3NB6DSG.js → chunk-2LSGX6R4.js} +54 -114
  5. package/dist/chunk-2LSGX6R4.js.map +1 -0
  6. package/dist/chunk-2OKUEELH.js +32 -0
  7. package/dist/chunk-2OKUEELH.js.map +1 -0
  8. package/dist/{chunk-V46GGCCI.js → chunk-374JNMR6.js} +14 -96
  9. package/dist/chunk-374JNMR6.js.map +1 -0
  10. package/dist/chunk-3EHUF54X.js +133 -0
  11. package/dist/chunk-3EHUF54X.js.map +1 -0
  12. package/dist/{chunk-7Q44DMSP.js → chunk-3XR4PALU.js} +92 -145
  13. package/dist/chunk-3XR4PALU.js.map +1 -0
  14. package/dist/{chunk-IAUAQJQ2.js → chunk-5K2ZLUO5.js} +5 -5
  15. package/dist/{chunk-IAUAQJQ2.js.map → chunk-5K2ZLUO5.js.map} +1 -1
  16. package/dist/{chunk-ACNBKXXJ.js → chunk-5KXUDHAB.js} +8 -36
  17. package/dist/chunk-5KXUDHAB.js.map +1 -0
  18. package/dist/chunk-7SLV7CMF.js +615 -0
  19. package/dist/chunk-7SLV7CMF.js.map +1 -0
  20. package/dist/{chunk-CDX4W4DM.js → chunk-A46TPNBJ.js} +61 -32
  21. package/dist/chunk-A46TPNBJ.js.map +1 -0
  22. package/dist/{chunk-TKFPKEV3.js → chunk-AL74GBW4.js} +1 -1
  23. package/dist/chunk-AL74GBW4.js.map +1 -0
  24. package/dist/chunk-BQX23RBV.js +191 -0
  25. package/dist/chunk-BQX23RBV.js.map +1 -0
  26. package/dist/{chunk-IMDW5ZUP.js → chunk-CA4LH4LI.js} +5 -5
  27. package/dist/chunk-CA4LH4LI.js.map +1 -0
  28. package/dist/{chunk-D237EVNB.js → chunk-CBLPAMZO.js} +5 -8
  29. package/dist/chunk-CBLPAMZO.js.map +1 -0
  30. package/dist/{chunk-B7CCVP6Q.js → chunk-CKPQHGXR.js} +52 -274
  31. package/dist/chunk-CKPQHGXR.js.map +1 -0
  32. package/dist/{chunk-SVYPSDWY.js → chunk-CXOFOJCN.js} +6 -10
  33. package/dist/chunk-CXOFOJCN.js.map +1 -0
  34. package/dist/{chunk-UQTEPWU7.js → chunk-EHGD7HIE.js} +2 -6
  35. package/dist/chunk-EHGD7HIE.js.map +1 -0
  36. package/dist/{chunk-76DWXGQE.js → chunk-FJFEKPXF.js} +1 -1
  37. package/dist/chunk-FJFEKPXF.js.map +1 -0
  38. package/dist/{chunk-E3FJH4TF.js → chunk-HEOHU5EZ.js} +2 -13
  39. package/dist/chunk-HEOHU5EZ.js.map +1 -0
  40. package/dist/{chunk-JIPWV2FX.js → chunk-HGCBZUH5.js} +6 -27
  41. package/dist/chunk-HGCBZUH5.js.map +1 -0
  42. package/dist/{chunk-ED4E6Q2T.js → chunk-HPGFY5ZN.js} +4 -4
  43. package/dist/chunk-HPGFY5ZN.js.map +1 -0
  44. package/dist/chunk-INJ2EFRW.js +127 -0
  45. package/dist/chunk-INJ2EFRW.js.map +1 -0
  46. package/dist/{chunk-KAAEN2PO.js → chunk-IOBFMF6X.js} +6 -2
  47. package/dist/{chunk-KAAEN2PO.js.map → chunk-IOBFMF6X.js.map} +1 -1
  48. package/dist/{chunk-K7EVM5LY.js → chunk-KH3HA7J7.js} +8 -33
  49. package/dist/chunk-KH3HA7J7.js.map +1 -0
  50. package/dist/{chunk-4K4ZXQRM.js → chunk-N6JNE326.js} +38 -94
  51. package/dist/chunk-N6JNE326.js.map +1 -0
  52. package/dist/chunk-NAGU7TVZ.js +36 -0
  53. package/dist/chunk-NAGU7TVZ.js.map +1 -0
  54. package/dist/{chunk-Z7G4B5HJ.js → chunk-OQYYMQJR.js} +68 -142
  55. package/dist/chunk-OQYYMQJR.js.map +1 -0
  56. package/dist/{chunk-RFTSZDHV.js → chunk-PLZOUVDD.js} +159 -53
  57. package/dist/chunk-PLZOUVDD.js.map +1 -0
  58. package/dist/chunk-Q3J43SF3.js +21 -0
  59. package/dist/chunk-Q3J43SF3.js.map +1 -0
  60. package/dist/{chunk-3U3R4NCG.js → chunk-T25OEQFI.js} +6 -2
  61. package/dist/chunk-T25OEQFI.js.map +1 -0
  62. package/dist/chunk-UMORK7OK.js +29 -0
  63. package/dist/chunk-UMORK7OK.js.map +1 -0
  64. package/dist/{chunk-ZFPSUQOU.js → chunk-VFHWU7JU.js} +12 -121
  65. package/dist/chunk-VFHWU7JU.js.map +1 -0
  66. package/dist/{chunk-GDH553MV.js → chunk-VS4GVTZE.js} +3 -3
  67. package/dist/chunk-VS4GVTZE.js.map +1 -0
  68. package/dist/chunk-WFEFICFM.js +67 -0
  69. package/dist/chunk-WFEFICFM.js.map +1 -0
  70. package/dist/{chunk-P26A2K5N.js → chunk-WG6KIAPK.js} +6 -16
  71. package/dist/chunk-WG6KIAPK.js.map +1 -0
  72. package/dist/{chunk-X6QONICW.js → chunk-ZEI3ZUDU.js} +3 -7
  73. package/dist/chunk-ZEI3ZUDU.js.map +1 -0
  74. package/dist/chunk-ZNIDWLL5.js +68 -0
  75. package/dist/chunk-ZNIDWLL5.js.map +1 -0
  76. package/dist/chunk-ZSVMS677.js +45 -0
  77. package/dist/chunk-ZSVMS677.js.map +1 -0
  78. package/dist/cli/defaults/agent-mappings.yaml +13 -13
  79. package/dist/commands/build/marketplace.js +8 -14
  80. package/dist/commands/build/marketplace.js.map +1 -1
  81. package/dist/commands/build/plugins.js +10 -21
  82. package/dist/commands/build/plugins.js.map +1 -1
  83. package/dist/commands/build/stack.js +13 -18
  84. package/dist/commands/build/stack.js.map +1 -1
  85. package/dist/commands/compile.js +25 -40
  86. package/dist/commands/compile.js.map +1 -1
  87. package/dist/commands/config/get.js +7 -7
  88. package/dist/commands/config/get.js.map +1 -1
  89. package/dist/commands/config/index.js +6 -6
  90. package/dist/commands/config/index.js.map +1 -1
  91. package/dist/commands/config/path.js +5 -7
  92. package/dist/commands/config/path.js.map +1 -1
  93. package/dist/commands/config/set-project.js +8 -9
  94. package/dist/commands/config/set-project.js.map +1 -1
  95. package/dist/commands/config/show.js +5 -5
  96. package/dist/commands/config/unset-project.js +8 -9
  97. package/dist/commands/config/unset-project.js.map +1 -1
  98. package/dist/commands/diff.js +17 -40
  99. package/dist/commands/diff.js.map +1 -1
  100. package/dist/commands/doctor.js +14 -25
  101. package/dist/commands/doctor.js.map +1 -1
  102. package/dist/commands/edit.js +41 -54
  103. package/dist/commands/edit.js.map +1 -1
  104. package/dist/commands/eject.js +24 -44
  105. package/dist/commands/eject.js.map +1 -1
  106. package/dist/commands/import/skill.js +19 -39
  107. package/dist/commands/import/skill.js.map +1 -1
  108. package/dist/commands/info.js +10 -15
  109. package/dist/commands/info.js.map +1 -1
  110. package/dist/commands/init.js +452 -451
  111. package/dist/commands/init.js.map +1 -1
  112. package/dist/commands/list.js +85 -9
  113. package/dist/commands/list.js.map +1 -1
  114. package/dist/commands/new/agent.js +9 -10
  115. package/dist/commands/new/agent.js.map +1 -1
  116. package/dist/commands/new/skill.js +12 -16
  117. package/dist/commands/new/skill.js.map +1 -1
  118. package/dist/commands/outdated.js +12 -89
  119. package/dist/commands/outdated.js.map +1 -1
  120. package/dist/commands/search.js +12 -18
  121. package/dist/commands/search.js.map +1 -1
  122. package/dist/commands/uninstall.js +12 -21
  123. package/dist/commands/uninstall.js.map +1 -1
  124. package/dist/commands/update.js +26 -146
  125. package/dist/commands/update.js.map +1 -1
  126. package/dist/commands/validate.js +407 -15
  127. package/dist/commands/validate.js.map +1 -1
  128. package/dist/commands/version/bump.js +7 -23
  129. package/dist/commands/version/bump.js.map +1 -1
  130. package/dist/commands/version/index.js +6 -21
  131. package/dist/commands/version/index.js.map +1 -1
  132. package/dist/commands/version/set.js +6 -23
  133. package/dist/commands/version/set.js.map +1 -1
  134. package/dist/commands/version/show.js +6 -21
  135. package/dist/commands/version/show.js.map +1 -1
  136. package/dist/components/common/message.js +2 -6
  137. package/dist/components/common/message.js.map +1 -1
  138. package/dist/components/common/spinner.js.map +1 -1
  139. package/dist/components/skill-search/skill-search.js +1 -1
  140. package/dist/components/wizard/category-grid.js +1 -1
  141. package/dist/components/wizard/category-grid.test.js +20 -92
  142. package/dist/components/wizard/category-grid.test.js.map +1 -1
  143. package/dist/components/wizard/menu-item.js +9 -0
  144. package/dist/components/wizard/section-progress.js +1 -1
  145. package/dist/components/wizard/section-progress.test.js +13 -103
  146. package/dist/components/wizard/section-progress.test.js.map +1 -1
  147. package/dist/components/wizard/step-approach.js +5 -4
  148. package/dist/components/wizard/step-build.js +3 -4
  149. package/dist/components/wizard/step-build.test.js +81 -186
  150. package/dist/components/wizard/step-build.test.js.map +1 -1
  151. package/dist/components/wizard/step-confirm.js +1 -2
  152. package/dist/components/wizard/step-refine.js +1 -2
  153. package/dist/components/wizard/step-refine.test.js +6 -14
  154. package/dist/components/wizard/step-refine.test.js.map +1 -1
  155. package/dist/components/wizard/step-stack.js +5 -3
  156. package/dist/components/wizard/view-title.js +9 -0
  157. package/dist/components/wizard/wizard-layout.js +16 -0
  158. package/dist/components/wizard/wizard-layout.js.map +1 -0
  159. package/dist/components/wizard/wizard-tabs.js +1 -1
  160. package/dist/components/wizard/wizard.js +12 -13
  161. package/dist/config/skills-matrix.yaml +180 -113
  162. package/dist/config/stacks.yaml +6 -6
  163. package/dist/hooks/init.js +5 -7
  164. package/dist/hooks/init.js.map +1 -1
  165. package/dist/src/agents/developer/web-developer/examples.md +1 -6
  166. package/dist/src/agents/meta/documentor/workflow.md +1 -5
  167. package/dist/src/agents/migration/cli-migrator/anti-patterns.md +1 -3
  168. package/dist/src/agents/tester/web-tester/output-format.md +1 -3
  169. package/dist/stores/wizard-store.js +2 -2
  170. package/dist/stores/wizard-store.test.js +60 -23
  171. package/dist/stores/wizard-store.test.js.map +1 -1
  172. package/package.json +1 -1
  173. package/src/agents/developer/web-developer/examples.md +1 -6
  174. package/src/agents/meta/documentor/workflow.md +1 -5
  175. package/src/agents/migration/cli-migrator/anti-patterns.md +1 -3
  176. package/src/agents/tester/web-tester/output-format.md +1 -3
  177. package/dist/chunk-3U3R4NCG.js.map +0 -1
  178. package/dist/chunk-4K4ZXQRM.js.map +0 -1
  179. package/dist/chunk-76DWXGQE.js.map +0 -1
  180. package/dist/chunk-7Q44DMSP.js.map +0 -1
  181. package/dist/chunk-ACNBKXXJ.js.map +0 -1
  182. package/dist/chunk-B7CCVP6Q.js.map +0 -1
  183. package/dist/chunk-BDLUZVKU.js +0 -54
  184. package/dist/chunk-BDLUZVKU.js.map +0 -1
  185. package/dist/chunk-CDX4W4DM.js.map +0 -1
  186. package/dist/chunk-D237EVNB.js.map +0 -1
  187. package/dist/chunk-DRXPNNPB.js +0 -393
  188. package/dist/chunk-DRXPNNPB.js.map +0 -1
  189. package/dist/chunk-E3FJH4TF.js.map +0 -1
  190. package/dist/chunk-ED4E6Q2T.js.map +0 -1
  191. package/dist/chunk-GDH553MV.js.map +0 -1
  192. package/dist/chunk-HLJX2FTL.js +0 -95
  193. package/dist/chunk-HLJX2FTL.js.map +0 -1
  194. package/dist/chunk-I2DSLOXZ.js +0 -75
  195. package/dist/chunk-I2DSLOXZ.js.map +0 -1
  196. package/dist/chunk-I4TPKIYX.js +0 -493
  197. package/dist/chunk-I4TPKIYX.js.map +0 -1
  198. package/dist/chunk-IBE7JIAG.js +0 -129
  199. package/dist/chunk-IBE7JIAG.js.map +0 -1
  200. package/dist/chunk-IMDW5ZUP.js.map +0 -1
  201. package/dist/chunk-JIPWV2FX.js.map +0 -1
  202. package/dist/chunk-K3NB6DSG.js.map +0 -1
  203. package/dist/chunk-K7EVM5LY.js.map +0 -1
  204. package/dist/chunk-NDY25DTL.js +0 -453
  205. package/dist/chunk-NDY25DTL.js.map +0 -1
  206. package/dist/chunk-P26A2K5N.js.map +0 -1
  207. package/dist/chunk-RFTSZDHV.js.map +0 -1
  208. package/dist/chunk-SVYPSDWY.js.map +0 -1
  209. package/dist/chunk-TKFPKEV3.js.map +0 -1
  210. package/dist/chunk-UQTEPWU7.js.map +0 -1
  211. package/dist/chunk-V46GGCCI.js.map +0 -1
  212. package/dist/chunk-X6QONICW.js.map +0 -1
  213. package/dist/chunk-Y2LW7R3Y.js +0 -23
  214. package/dist/chunk-Y2LW7R3Y.js.map +0 -1
  215. package/dist/chunk-Z7G4B5HJ.js.map +0 -1
  216. package/dist/chunk-ZENYS6KW.js +0 -90
  217. package/dist/chunk-ZENYS6KW.js.map +0 -1
  218. package/dist/chunk-ZFPSUQOU.js.map +0 -1
  219. package/dist/commands/config/set.js +0 -61
  220. package/dist/commands/config/set.js.map +0 -1
  221. package/dist/commands/config/unset.js +0 -57
  222. package/dist/commands/config/unset.js.map +0 -1
  223. package/dist/commands/test-imports.js +0 -92
  224. package/dist/commands/test-imports.js.map +0 -1
  225. package/dist/components/wizard/step-stack-options.js +0 -11
  226. package/dist/components/wizard/wizard-footer.js +0 -9
  227. /package/dist/components/wizard/{step-stack-options.js.map → menu-item.js.map} +0 -0
  228. /package/dist/components/wizard/{wizard-footer.js.map → view-title.js.map} +0 -0
@@ -1,18 +1,18 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  getCollectivePluginDir
4
- } from "./chunk-ED4E6Q2T.js";
4
+ } from "./chunk-HPGFY5ZN.js";
5
5
  import {
6
6
  loadProjectConfig
7
- } from "./chunk-ZFPSUQOU.js";
7
+ } from "./chunk-VFHWU7JU.js";
8
8
  import {
9
9
  directoryExists,
10
10
  fileExists
11
- } from "./chunk-TKFPKEV3.js";
11
+ } from "./chunk-AL74GBW4.js";
12
12
  import {
13
13
  CLAUDE_DIR,
14
14
  CLAUDE_SRC_DIR
15
- } from "./chunk-76DWXGQE.js";
15
+ } from "./chunk-FJFEKPXF.js";
16
16
  import {
17
17
  init_esm_shims
18
18
  } from "./chunk-DHET7RCE.js";
@@ -54,4 +54,4 @@ async function detectInstallation(projectDir = process.cwd()) {
54
54
  export {
55
55
  detectInstallation
56
56
  };
57
- //# sourceMappingURL=chunk-IAUAQJQ2.js.map
57
+ //# sourceMappingURL=chunk-5K2ZLUO5.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/lib/installation.ts"],"sourcesContent":["/**\n * Installation detection utilities for Claude Collective.\n *\n * Detects whether a project uses local mode (.claude-src/config.yaml) or\n * plugin mode (.claude/plugins/claude-collective/).\n */\nimport path from \"path\";\nimport { directoryExists, fileExists } from \"../utils/fs\";\nimport { loadProjectConfig } from \"./project-config\";\nimport { getCollectivePluginDir } from \"./plugin-finder\";\nimport { CLAUDE_DIR, CLAUDE_SRC_DIR } from \"../consts\";\n\nexport type InstallMode = \"local\" | \"plugin\";\n\nexport interface Installation {\n mode: InstallMode;\n configPath: string;\n agentsDir: string;\n skillsDir: string;\n projectDir: string;\n}\n\n/**\n * Detect the current installation mode by checking for local config first.\n * Priority: Local (.claude-src/config.yaml with installMode: local) > Plugin\n */\nexport async function detectInstallation(\n projectDir: string = process.cwd(),\n): Promise<Installation | null> {\n // 1. Check for local installation first\n // Check .claude-src/config.yaml first (new location)\n const srcConfigPath = path.join(projectDir, CLAUDE_SRC_DIR, \"config.yaml\");\n // Fall back to .claude/config.yaml (legacy location)\n const legacyConfigPath = path.join(projectDir, CLAUDE_DIR, \"config.yaml\");\n\n const localConfigPath = (await fileExists(srcConfigPath))\n ? srcConfigPath\n : (await fileExists(legacyConfigPath))\n ? legacyConfigPath\n : null;\n\n if (localConfigPath) {\n const loaded = await loadProjectConfig(projectDir);\n\n // If config exists and has installMode: local (or no installMode, defaults to local)\n // treat it as local mode\n const mode: InstallMode = loaded?.config?.installMode ?? \"local\";\n\n if (mode === \"local\") {\n return {\n mode: \"local\",\n configPath: localConfigPath,\n agentsDir: path.join(projectDir, CLAUDE_DIR, \"agents\"),\n skillsDir: path.join(projectDir, CLAUDE_DIR, \"skills\"),\n projectDir,\n };\n }\n }\n\n // 2. Check for plugin installation\n const pluginDir = getCollectivePluginDir(projectDir);\n const pluginConfigPath = path.join(pluginDir, \"config.yaml\");\n\n if (await directoryExists(pluginDir)) {\n return {\n mode: \"plugin\",\n configPath: pluginConfigPath,\n agentsDir: path.join(pluginDir, \"agents\"),\n skillsDir: path.join(pluginDir, \"skills\"),\n projectDir,\n };\n }\n\n // No installation found\n return null;\n}\n\n/**\n * Get installation or throw with helpful error message\n */\nexport async function getInstallationOrThrow(\n projectDir: string = process.cwd(),\n): Promise<Installation> {\n const installation = await detectInstallation(projectDir);\n\n if (!installation) {\n throw new Error(\n \"No Claude Collective installation found.\\n\" +\n \"Run 'cc init' to create one.\",\n );\n }\n\n return installation;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAMA,OAAO,UAAU;AAoBjB,eAAsB,mBACpB,aAAqB,QAAQ,IAAI,GACH;AAG9B,QAAM,gBAAgB,KAAK,KAAK,YAAY,gBAAgB,aAAa;AAEzE,QAAM,mBAAmB,KAAK,KAAK,YAAY,YAAY,aAAa;AAExE,QAAM,kBAAmB,MAAM,WAAW,aAAa,IACnD,gBACC,MAAM,WAAW,gBAAgB,IAChC,mBACA;AAEN,MAAI,iBAAiB;AACnB,UAAM,SAAS,MAAM,kBAAkB,UAAU;AAIjD,UAAM,OAAoB,QAAQ,QAAQ,eAAe;AAEzD,QAAI,SAAS,SAAS;AACpB,aAAO;AAAA,QACL,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,WAAW,KAAK,KAAK,YAAY,YAAY,QAAQ;AAAA,QACrD,WAAW,KAAK,KAAK,YAAY,YAAY,QAAQ;AAAA,QACrD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,YAAY,uBAAuB,UAAU;AACnD,QAAM,mBAAmB,KAAK,KAAK,WAAW,aAAa;AAE3D,MAAI,MAAM,gBAAgB,SAAS,GAAG;AACpC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,WAAW,KAAK,KAAK,WAAW,QAAQ;AAAA,MACxC,WAAW,KAAK,KAAK,WAAW,QAAQ;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../src/cli/lib/installation.ts"],"sourcesContent":["/**\n * Installation detection utilities for Claude Collective.\n *\n * Detects whether a project uses local mode (.claude-src/config.yaml) or\n * plugin mode (.claude/plugins/claude-collective/).\n */\nimport path from \"path\";\nimport { directoryExists, fileExists } from \"../utils/fs\";\nimport { loadProjectConfig } from \"./project-config\";\nimport { getCollectivePluginDir } from \"./plugin-finder\";\nimport { CLAUDE_DIR, CLAUDE_SRC_DIR } from \"../consts\";\n\nexport type InstallMode = \"local\" | \"plugin\";\n\nexport interface Installation {\n mode: InstallMode;\n configPath: string;\n agentsDir: string;\n skillsDir: string;\n projectDir: string;\n}\n\n/**\n * Detect the current installation mode by checking for local config first.\n * Priority: Local (.claude-src/config.yaml with installMode: local) > Plugin\n */\nexport async function detectInstallation(\n projectDir: string = process.cwd(),\n): Promise<Installation | null> {\n // 1. Check for local installation first\n // Check .claude-src/config.yaml first (new location)\n const srcConfigPath = path.join(projectDir, CLAUDE_SRC_DIR, \"config.yaml\");\n // Fall back to .claude/config.yaml (legacy location)\n const legacyConfigPath = path.join(projectDir, CLAUDE_DIR, \"config.yaml\");\n\n const localConfigPath = (await fileExists(srcConfigPath))\n ? srcConfigPath\n : (await fileExists(legacyConfigPath))\n ? legacyConfigPath\n : null;\n\n if (localConfigPath) {\n const loaded = await loadProjectConfig(projectDir);\n\n // If config exists and has installMode: local (or no installMode, defaults to local)\n // treat it as local mode\n const mode: InstallMode = loaded?.config?.installMode ?? \"local\";\n\n if (mode === \"local\") {\n return {\n mode: \"local\",\n configPath: localConfigPath,\n agentsDir: path.join(projectDir, CLAUDE_DIR, \"agents\"),\n skillsDir: path.join(projectDir, CLAUDE_DIR, \"skills\"),\n projectDir,\n };\n }\n }\n\n // 2. Check for plugin installation\n const pluginDir = getCollectivePluginDir(projectDir);\n const pluginConfigPath = path.join(pluginDir, \"config.yaml\");\n\n if (await directoryExists(pluginDir)) {\n return {\n mode: \"plugin\",\n configPath: pluginConfigPath,\n agentsDir: path.join(pluginDir, \"agents\"),\n skillsDir: path.join(pluginDir, \"skills\"),\n projectDir,\n };\n }\n\n // No installation found\n return null;\n}\n\n/**\n * Get installation or throw with helpful error message\n */\nexport async function getInstallationOrThrow(\n projectDir: string = process.cwd(),\n): Promise<Installation> {\n const installation = await detectInstallation(projectDir);\n\n if (!installation) {\n throw new Error(\"No Claude Collective installation found.\\n\" + \"Run 'cc init' to create one.\");\n }\n\n return installation;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAMA,OAAO,UAAU;AAoBjB,eAAsB,mBACpB,aAAqB,QAAQ,IAAI,GACH;AAG9B,QAAM,gBAAgB,KAAK,KAAK,YAAY,gBAAgB,aAAa;AAEzE,QAAM,mBAAmB,KAAK,KAAK,YAAY,YAAY,aAAa;AAExE,QAAM,kBAAmB,MAAM,WAAW,aAAa,IACnD,gBACC,MAAM,WAAW,gBAAgB,IAChC,mBACA;AAEN,MAAI,iBAAiB;AACnB,UAAM,SAAS,MAAM,kBAAkB,UAAU;AAIjD,UAAM,OAAoB,QAAQ,QAAQ,eAAe;AAEzD,QAAI,SAAS,SAAS;AACpB,aAAO;AAAA,QACL,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,WAAW,KAAK,KAAK,YAAY,YAAY,QAAQ;AAAA,QACrD,WAAW,KAAK,KAAK,YAAY,YAAY,QAAQ;AAAA,QACrD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,YAAY,uBAAuB,UAAU;AACnD,QAAM,mBAAmB,KAAK,KAAK,WAAW,aAAa;AAE3D,MAAI,MAAM,gBAAgB,SAAS,GAAG;AACpC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,WAAW,KAAK,KAAK,WAAW,QAAQ;AAAA,MACxC,WAAW,KAAK,KAAK,WAAW,QAAQ;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AACT;","names":[]}
@@ -75,11 +75,7 @@ var SearchInput = ({ value, onChange }) => {
75
75
  /* @__PURE__ */ jsx(Text, { color: "cyan", children: "_" })
76
76
  ] });
77
77
  };
78
- var ResultItem = ({
79
- skill,
80
- isSelected,
81
- isFocused
82
- }) => {
78
+ var ResultItem = ({ skill, isSelected, isFocused }) => {
83
79
  const checkbox = isSelected ? CHECKBOX_CHECKED : CHECKBOX_UNCHECKED;
84
80
  const displayName = skill.alias || skill.id;
85
81
  const descriptionWidth = 30;
@@ -98,14 +94,7 @@ var ResultItem = ({
98
94
  }
99
95
  ),
100
96
  /* @__PURE__ */ jsx(Box, { width: 14, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: truncate(skill.sourceName, 12) }) }),
101
- /* @__PURE__ */ jsx(Box, { width: 24, children: /* @__PURE__ */ jsx(
102
- Text,
103
- {
104
- color: isFocused ? "cyan" : void 0,
105
- bold: isFocused || isSelected,
106
- children: truncate(displayName, 22)
107
- }
108
- ) }),
97
+ /* @__PURE__ */ jsx(Box, { width: 24, children: /* @__PURE__ */ jsx(Text, { color: isFocused ? "cyan" : void 0, bold: isFocused || isSelected, children: truncate(displayName, 22) }) }),
109
98
  /* @__PURE__ */ jsx(Text, { dimColor: true, children: truncate(skill.description, descriptionWidth) })
110
99
  ] });
111
100
  };
@@ -115,10 +104,7 @@ var ResultsList = ({
115
104
  focusedIndex,
116
105
  scrollOffset
117
106
  }) => {
118
- const visibleResults = results.slice(
119
- scrollOffset,
120
- scrollOffset + MAX_VISIBLE_RESULTS
121
- );
107
+ const visibleResults = results.slice(scrollOffset, scrollOffset + MAX_VISIBLE_RESULTS);
122
108
  if (results.length === 0) {
123
109
  return /* @__PURE__ */ jsx(Box, { paddingX: 1, paddingY: 1, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "No skills found matching your search." }) });
124
110
  }
@@ -145,10 +131,7 @@ var ResultsList = ({
145
131
  }
146
132
  );
147
133
  };
148
- var StatusBar = ({
149
- resultCount,
150
- selectedCount
151
- }) => {
134
+ var StatusBar = ({ resultCount, selectedCount }) => {
152
135
  return /* @__PURE__ */ jsx(Box, { paddingX: 1, children: /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
153
136
  resultCount,
154
137
  " result",
@@ -214,10 +197,7 @@ var SkillSearch = ({
214
197
  const filteredResults = useMemo(() => {
215
198
  return skills.filter((skill) => matchesQuery(skill, query));
216
199
  }, [skills, query]);
217
- const safeFocusedIndex = Math.min(
218
- focusedIndex,
219
- Math.max(0, filteredResults.length - 1)
220
- );
200
+ const safeFocusedIndex = Math.min(focusedIndex, Math.max(0, filteredResults.length - 1));
221
201
  const focusedSkill = filteredResults[safeFocusedIndex];
222
202
  const handleQueryChange = useCallback((newQuery) => {
223
203
  setQuery(newQuery);
@@ -255,9 +235,7 @@ var SkillSearch = ({
255
235
  }
256
236
  if (key.return) {
257
237
  if (selectedIds.size > 0) {
258
- const selectedSkills = filteredResults.filter(
259
- (s) => selectedIds.has(s.id)
260
- );
238
+ const selectedSkills = filteredResults.filter((s) => selectedIds.has(s.id));
261
239
  onComplete({
262
240
  selectedSkills,
263
241
  cancelled: false
@@ -303,13 +281,7 @@ var SkillSearch = ({
303
281
  scrollOffset
304
282
  }
305
283
  ),
306
- /* @__PURE__ */ jsx(
307
- StatusBar,
308
- {
309
- resultCount: filteredResults.length,
310
- selectedCount: selectedIds.size
311
- }
312
- ),
284
+ /* @__PURE__ */ jsx(StatusBar, { resultCount: filteredResults.length, selectedCount: selectedIds.size }),
313
285
  copiedMessage && /* @__PURE__ */ jsx(Box, { paddingX: 1, children: /* @__PURE__ */ jsx(Text, { color: "green", children: copiedMessage }) }),
314
286
  /* @__PURE__ */ jsx(Footer, { hasSelection: selectedIds.size > 0 })
315
287
  ] }) });
@@ -318,4 +290,4 @@ var SkillSearch = ({
318
290
  export {
319
291
  SkillSearch
320
292
  };
321
- //# sourceMappingURL=chunk-ACNBKXXJ.js.map
293
+ //# sourceMappingURL=chunk-5KXUDHAB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/skill-search/skill-search.tsx"],"sourcesContent":["/**\n * Interactive skill search component.\n *\n * Features:\n * - Live text filtering as you type\n * - Multi-select checkboxes\n * - Keyboard navigation (arrows, vim keys, space, enter, c, esc)\n * - Source attribution for each skill\n *\n * Keyboard controls:\n * - Up/Down/k/j: Navigate results\n * - Space: Toggle selection\n * - Enter: Import selected skills\n * - c: Copy link of focused skill\n * - Esc: Cancel/exit\n */\nimport React, { useState, useCallback, useMemo } from \"react\";\nimport { Box, Text, useApp, useInput } from \"ink\";\nimport { ThemeProvider } from \"@inkjs/ui\";\nimport { cliTheme } from \"../themes/default.js\";\nimport type { ResolvedSkill } from \"../../types-matrix.js\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface SourcedSkill extends ResolvedSkill {\n /** Source name where this skill came from */\n sourceName: string;\n /** Source URL for reference */\n sourceUrl?: string;\n}\n\nexport interface SkillSearchResult {\n /** Skills selected for import */\n selectedSkills: SourcedSkill[];\n /** Whether the user cancelled */\n cancelled: boolean;\n}\n\nexport interface SkillSearchProps {\n /** All available skills from all sources */\n skills: SourcedSkill[];\n /** Total number of sources */\n sourceCount: number;\n /** Initial search query (from command args) */\n initialQuery?: string;\n /** Called when user completes selection (Enter) */\n onComplete: (result: SkillSearchResult) => void;\n /** Called when user cancels (Esc) */\n onCancel: () => void;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\n/** Maximum results to show at once */\nconst MAX_VISIBLE_RESULTS = 10;\n\n/** Checkbox display */\nconst CHECKBOX_CHECKED = \"[x]\";\nconst CHECKBOX_UNCHECKED = \"[ ]\";\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Match skill against search query (case-insensitive substring)\n */\nfunction matchesQuery(skill: SourcedSkill, query: string): boolean {\n if (!query.trim()) return true;\n\n const lowerQuery = query.toLowerCase();\n\n // Match against name\n if (skill.name.toLowerCase().includes(lowerQuery)) return true;\n\n // Match against ID\n if (skill.id.toLowerCase().includes(lowerQuery)) return true;\n\n // Match against alias\n if (skill.alias?.toLowerCase().includes(lowerQuery)) return true;\n\n // Match against description\n if (skill.description.toLowerCase().includes(lowerQuery)) return true;\n\n // Match against category\n if (skill.category.toLowerCase().includes(lowerQuery)) return true;\n\n // Match against tags\n if (skill.tags.some((tag) => tag.toLowerCase().includes(lowerQuery))) {\n return true;\n }\n\n // Match against source name\n if (skill.sourceName.toLowerCase().includes(lowerQuery)) return true;\n\n return false;\n}\n\n/**\n * Truncate text with ellipsis\n */\nfunction truncate(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n return text.slice(0, maxLength - 3) + \"...\";\n}\n\n// =============================================================================\n// Sub-Components\n// =============================================================================\n\ninterface HeaderProps {\n sourceCount: number;\n}\n\nconst Header: React.FC<HeaderProps> = ({ sourceCount }) => {\n return (\n <Box\n flexDirection=\"row\"\n justifyContent=\"space-between\"\n borderStyle=\"single\"\n borderBottom={false}\n borderLeft={false}\n borderRight={false}\n paddingX={1}\n >\n <Text bold color=\"cyan\">\n Search Skills\n </Text>\n <Text dimColor>\n {sourceCount} source{sourceCount !== 1 ? \"s\" : \"\"}\n </Text>\n </Box>\n );\n};\n\ninterface SearchInputProps {\n value: string;\n onChange: (value: string) => void;\n}\n\nconst SearchInput: React.FC<SearchInputProps> = ({ value, onChange }) => {\n // Handle text input\n useInput((input, key) => {\n if (key.backspace || key.delete) {\n onChange(value.slice(0, -1));\n } else if (!key.ctrl && !key.meta && input && input.length === 1) {\n // Only handle printable characters\n const charCode = input.charCodeAt(0);\n if (charCode >= 32 && charCode <= 126) {\n onChange(value + input);\n }\n }\n });\n\n return (\n <Box paddingX={1} paddingY={1}>\n <Text color=\"cyan\">{\">\"} </Text>\n <Text>{value}</Text>\n <Text color=\"cyan\">_</Text>\n </Box>\n );\n};\n\ninterface ResultItemProps {\n skill: SourcedSkill;\n isSelected: boolean;\n isFocused: boolean;\n}\n\nconst ResultItem: React.FC<ResultItemProps> = ({ skill, isSelected, isFocused }) => {\n const checkbox = isSelected ? CHECKBOX_CHECKED : CHECKBOX_UNCHECKED;\n const displayName = skill.alias || skill.id;\n const descriptionWidth = 30;\n\n return (\n <Box flexDirection=\"row\" gap={1}>\n <Text\n color={isFocused ? \"cyan\" : isSelected ? \"green\" : undefined}\n bold={isFocused}\n backgroundColor={isFocused ? \"#333333\" : undefined}\n >\n {\" \"}\n {checkbox}{\" \"}\n </Text>\n <Box width={14}>\n <Text dimColor>{truncate(skill.sourceName, 12)}</Text>\n </Box>\n <Box width={24}>\n <Text color={isFocused ? \"cyan\" : undefined} bold={isFocused || isSelected}>\n {truncate(displayName, 22)}\n </Text>\n </Box>\n <Text dimColor>{truncate(skill.description, descriptionWidth)}</Text>\n </Box>\n );\n};\n\ninterface ResultsListProps {\n results: SourcedSkill[];\n selectedIds: Set<string>;\n focusedIndex: number;\n scrollOffset: number;\n}\n\nconst ResultsList: React.FC<ResultsListProps> = ({\n results,\n selectedIds,\n focusedIndex,\n scrollOffset,\n}) => {\n const visibleResults = results.slice(scrollOffset, scrollOffset + MAX_VISIBLE_RESULTS);\n\n if (results.length === 0) {\n return (\n <Box paddingX={1} paddingY={1}>\n <Text dimColor>No skills found matching your search.</Text>\n </Box>\n );\n }\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderTop={false}\n borderBottom={false}\n paddingX={1}\n >\n {visibleResults.map((skill, index) => {\n const actualIndex = scrollOffset + index;\n return (\n <ResultItem\n key={skill.id}\n skill={skill}\n isSelected={selectedIds.has(skill.id)}\n isFocused={actualIndex === focusedIndex}\n />\n );\n })}\n </Box>\n );\n};\n\ninterface StatusBarProps {\n resultCount: number;\n selectedCount: number;\n}\n\nconst StatusBar: React.FC<StatusBarProps> = ({ resultCount, selectedCount }) => {\n return (\n <Box paddingX={1}>\n <Text dimColor>\n {resultCount} result{resultCount !== 1 ? \"s\" : \"\"}\n {selectedCount > 0 && <Text color=\"green\"> | {selectedCount} selected</Text>}\n </Text>\n </Box>\n );\n};\n\ninterface FooterProps {\n hasSelection: boolean;\n}\n\nconst Footer: React.FC<FooterProps> = ({ hasSelection }) => {\n return (\n <Box\n flexDirection=\"row\"\n justifyContent=\"center\"\n gap={2}\n borderStyle=\"single\"\n borderTop={false}\n borderLeft={false}\n borderRight={false}\n paddingX={1}\n marginTop={1}\n >\n <Text dimColor>\n <Text color=\"white\">j/k</Text> navigate\n </Text>\n <Text dimColor>\n <Text color=\"white\">SPACE</Text> select\n </Text>\n {hasSelection && (\n <Text dimColor>\n <Text color=\"green\">ENTER</Text> import\n </Text>\n )}\n <Text dimColor>\n <Text color=\"white\">c</Text> copy link\n </Text>\n <Text dimColor>\n <Text color=\"yellow\">ESC</Text> cancel\n </Text>\n </Box>\n );\n};\n\n// =============================================================================\n// Main Component\n// =============================================================================\n\nexport const SkillSearch: React.FC<SkillSearchProps> = ({\n skills,\n sourceCount,\n initialQuery = \"\",\n onComplete,\n onCancel,\n}) => {\n const { exit } = useApp();\n\n // State\n const [query, setQuery] = useState(initialQuery);\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\n const [focusedIndex, setFocusedIndex] = useState(0);\n const [scrollOffset, setScrollOffset] = useState(0);\n const [copiedMessage, setCopiedMessage] = useState<string | null>(null);\n\n // Filter results based on query\n const filteredResults = useMemo(() => {\n return skills.filter((skill) => matchesQuery(skill, query));\n }, [skills, query]);\n\n // Ensure focus stays in bounds when results change\n const safeFocusedIndex = Math.min(focusedIndex, Math.max(0, filteredResults.length - 1));\n\n // Get the currently focused skill\n const focusedSkill = filteredResults[safeFocusedIndex];\n\n // Handle query change\n const handleQueryChange = useCallback((newQuery: string) => {\n setQuery(newQuery);\n setFocusedIndex(0);\n setScrollOffset(0);\n }, []);\n\n // Toggle selection\n const toggleSelection = useCallback((skillId: string) => {\n setSelectedIds((prev) => {\n const next = new Set(prev);\n if (next.has(skillId)) {\n next.delete(skillId);\n } else {\n next.add(skillId);\n }\n return next;\n });\n }, []);\n\n // Copy skill link to clipboard\n const copySkillLink = useCallback(async (skill: SourcedSkill) => {\n const link = skill.sourceUrl ? `${skill.sourceUrl}/${skill.id}` : skill.id;\n\n try {\n // Use native clipboard API via process.stdout.write with OSC 52\n // This is a cross-platform terminal clipboard method\n const encoded = Buffer.from(link).toString(\"base64\");\n process.stdout.write(`\\x1b]52;c;${encoded}\\x07`);\n setCopiedMessage(`Copied: ${link}`);\n setTimeout(() => setCopiedMessage(null), 2000);\n } catch {\n setCopiedMessage(`Link: ${link}`);\n setTimeout(() => setCopiedMessage(null), 3000);\n }\n }, []);\n\n // Handle keyboard navigation\n useInput((input, key) => {\n // Escape to cancel\n if (key.escape) {\n onCancel();\n exit();\n return;\n }\n\n // Enter to import selected\n if (key.return) {\n if (selectedIds.size > 0) {\n const selectedSkills = filteredResults.filter((s) => selectedIds.has(s.id));\n onComplete({\n selectedSkills,\n cancelled: false,\n });\n exit();\n }\n return;\n }\n\n // Space to toggle selection\n if (input === \" \" && focusedSkill) {\n toggleSelection(focusedSkill.id);\n return;\n }\n\n // c to copy link\n if ((input === \"c\" || input === \"C\") && focusedSkill) {\n void copySkillLink(focusedSkill);\n return;\n }\n\n // Navigation\n const isUp = key.upArrow || input === \"k\";\n const isDown = key.downArrow || input === \"j\";\n\n if (isUp && safeFocusedIndex > 0) {\n const newIndex = safeFocusedIndex - 1;\n setFocusedIndex(newIndex);\n // Scroll up if needed\n if (newIndex < scrollOffset) {\n setScrollOffset(newIndex);\n }\n }\n\n if (isDown && safeFocusedIndex < filteredResults.length - 1) {\n const newIndex = safeFocusedIndex + 1;\n setFocusedIndex(newIndex);\n // Scroll down if needed\n if (newIndex >= scrollOffset + MAX_VISIBLE_RESULTS) {\n setScrollOffset(newIndex - MAX_VISIBLE_RESULTS + 1);\n }\n }\n });\n\n return (\n <ThemeProvider theme={cliTheme}>\n <Box flexDirection=\"column\">\n <Header sourceCount={sourceCount} />\n <SearchInput value={query} onChange={handleQueryChange} />\n <ResultsList\n results={filteredResults}\n selectedIds={selectedIds}\n focusedIndex={safeFocusedIndex}\n scrollOffset={scrollOffset}\n />\n <StatusBar resultCount={filteredResults.length} selectedCount={selectedIds.size} />\n {copiedMessage && (\n <Box paddingX={1}>\n <Text color=\"green\">{copiedMessage}</Text>\n </Box>\n )}\n <Footer hasSelection={selectedIds.size > 0} />\n </Box>\n </ThemeProvider>\n );\n};\n"],"mappings":"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","names":[]}