@claude-collective/cli 0.2.0 → 0.6.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 (166) hide show
  1. package/CHANGELOG.md +113 -0
  2. package/README.md +1 -1
  3. package/dist/chunk-367K3JB3.js +84 -0
  4. package/dist/chunk-367K3JB3.js.map +1 -0
  5. package/dist/chunk-6ESUJMM7.js +54 -0
  6. package/dist/chunk-6ESUJMM7.js.map +1 -0
  7. package/dist/chunk-6OY6ZYQF.js +93 -0
  8. package/dist/chunk-6OY6ZYQF.js.map +1 -0
  9. package/dist/chunk-6WEQADPL.js +307 -0
  10. package/dist/chunk-6WEQADPL.js.map +1 -0
  11. package/dist/chunk-AU7XVCLO.js +91 -0
  12. package/dist/chunk-AU7XVCLO.js.map +1 -0
  13. package/dist/chunk-AZP2AA5M.js +425 -0
  14. package/dist/chunk-AZP2AA5M.js.map +1 -0
  15. package/dist/chunk-D4IQAT27.js +114 -0
  16. package/dist/chunk-D4IQAT27.js.map +1 -0
  17. package/dist/chunk-DHET7RCE.js +50 -0
  18. package/dist/chunk-DHET7RCE.js.map +1 -0
  19. package/dist/chunk-DHFFRMF6.js +31 -0
  20. package/dist/chunk-DHFFRMF6.js.map +1 -0
  21. package/dist/chunk-FKU7VSUD.js +453 -0
  22. package/dist/chunk-FKU7VSUD.js.map +1 -0
  23. package/dist/chunk-J2Y4A3LP.js +478 -0
  24. package/dist/chunk-J2Y4A3LP.js.map +1 -0
  25. package/dist/chunk-JMQGWQZU.js +607 -0
  26. package/dist/chunk-JMQGWQZU.js.map +1 -0
  27. package/dist/chunk-JY4RO76L.js +73 -0
  28. package/dist/chunk-JY4RO76L.js.map +1 -0
  29. package/dist/chunk-M7YCPFIX.js +108 -0
  30. package/dist/chunk-M7YCPFIX.js.map +1 -0
  31. package/dist/chunk-MJSFR562.js +57 -0
  32. package/dist/chunk-MJSFR562.js.map +1 -0
  33. package/dist/chunk-MMDXNZPF.js +69 -0
  34. package/dist/chunk-MMDXNZPF.js.map +1 -0
  35. package/dist/chunk-MYAVQ23U.js +356 -0
  36. package/dist/chunk-MYAVQ23U.js.map +1 -0
  37. package/dist/chunk-OSQDDJXX.js +146 -0
  38. package/dist/chunk-OSQDDJXX.js.map +1 -0
  39. package/dist/chunk-QESUUPOE.js +241 -0
  40. package/dist/chunk-QESUUPOE.js.map +1 -0
  41. package/dist/chunk-SJYG4EJZ.js +57 -0
  42. package/dist/chunk-SJYG4EJZ.js.map +1 -0
  43. package/dist/chunk-SYQ7R2JO.js +95 -0
  44. package/dist/chunk-SYQ7R2JO.js.map +1 -0
  45. package/dist/chunk-TD643KB3.js +245 -0
  46. package/dist/chunk-TD643KB3.js.map +1 -0
  47. package/dist/chunk-TFV6Z7F7.js +129 -0
  48. package/dist/chunk-TFV6Z7F7.js.map +1 -0
  49. package/dist/chunk-TGOHJCQ4.js +83 -0
  50. package/dist/chunk-TGOHJCQ4.js.map +1 -0
  51. package/dist/chunk-TOPAIL5W.js +22 -0
  52. package/dist/chunk-TOPAIL5W.js.map +1 -0
  53. package/dist/chunk-U4VYHKPM.js +110 -0
  54. package/dist/chunk-U4VYHKPM.js.map +1 -0
  55. package/dist/chunk-UFWNMW3G.js +392 -0
  56. package/dist/chunk-UFWNMW3G.js.map +1 -0
  57. package/dist/chunk-UNHCZRO4.js +64 -0
  58. package/dist/chunk-UNHCZRO4.js.map +1 -0
  59. package/dist/chunk-URDV4OCP.js +308 -0
  60. package/dist/chunk-URDV4OCP.js.map +1 -0
  61. package/dist/chunk-YI6JVSFO.js +43 -0
  62. package/dist/chunk-YI6JVSFO.js.map +1 -0
  63. package/dist/chunk-YNSNRR5D.js +184 -0
  64. package/dist/chunk-YNSNRR5D.js.map +1 -0
  65. package/dist/chunk-Z6DLWTBY.js +46 -0
  66. package/dist/chunk-Z6DLWTBY.js.map +1 -0
  67. package/dist/chunk-ZDQIUHAM.js +89 -0
  68. package/dist/chunk-ZDQIUHAM.js.map +1 -0
  69. package/dist/chunk-ZSKHDU5P.js +124 -0
  70. package/dist/chunk-ZSKHDU5P.js.map +1 -0
  71. package/dist/cli-v2/defaults/agent-mappings.yaml +185 -0
  72. package/dist/commands/build/marketplace.js +295 -0
  73. package/dist/commands/build/marketplace.js.map +1 -0
  74. package/dist/commands/build/plugins.js +362 -0
  75. package/dist/commands/build/plugins.js.map +1 -0
  76. package/dist/commands/build/stack.js +169 -0
  77. package/dist/commands/build/stack.js.map +1 -0
  78. package/dist/commands/compile.js +461 -0
  79. package/dist/commands/compile.js.map +1 -0
  80. package/dist/commands/config/get.js +60 -0
  81. package/dist/commands/config/get.js.map +1 -0
  82. package/dist/commands/config/index.js +22 -0
  83. package/dist/commands/config/index.js.map +1 -0
  84. package/dist/commands/config/path.js +35 -0
  85. package/dist/commands/config/path.js.map +1 -0
  86. package/dist/commands/config/set-project.js +61 -0
  87. package/dist/commands/config/set-project.js.map +1 -0
  88. package/dist/commands/config/set.js +60 -0
  89. package/dist/commands/config/set.js.map +1 -0
  90. package/dist/commands/config/show.js +13 -0
  91. package/dist/commands/config/show.js.map +1 -0
  92. package/dist/commands/config/unset-project.js +57 -0
  93. package/dist/commands/config/unset-project.js.map +1 -0
  94. package/dist/commands/config/unset.js +56 -0
  95. package/dist/commands/config/unset.js.map +1 -0
  96. package/dist/commands/diff.js +755 -0
  97. package/dist/commands/diff.js.map +1 -0
  98. package/dist/commands/doctor.js +413 -0
  99. package/dist/commands/doctor.js.map +1 -0
  100. package/dist/commands/edit.js +253 -0
  101. package/dist/commands/edit.js.map +1 -0
  102. package/dist/commands/eject.js +208 -0
  103. package/dist/commands/eject.js.map +1 -0
  104. package/dist/commands/info.js +205 -0
  105. package/dist/commands/info.js.map +1 -0
  106. package/dist/commands/init.js +914 -0
  107. package/dist/commands/init.js.map +1 -0
  108. package/dist/commands/list.js +44 -0
  109. package/dist/commands/list.js.map +1 -0
  110. package/dist/commands/new/agent.js +230 -0
  111. package/dist/commands/new/agent.js.map +1 -0
  112. package/dist/commands/new/skill.js +204 -0
  113. package/dist/commands/new/skill.js.map +1 -0
  114. package/dist/commands/outdated.js +242 -0
  115. package/dist/commands/outdated.js.map +1 -0
  116. package/dist/commands/search.js +115 -0
  117. package/dist/commands/search.js.map +1 -0
  118. package/dist/commands/test-imports.js +92 -0
  119. package/dist/commands/test-imports.js.map +1 -0
  120. package/dist/commands/uninstall.js +302 -0
  121. package/dist/commands/uninstall.js.map +1 -0
  122. package/dist/commands/update.js +428 -0
  123. package/dist/commands/update.js.map +1 -0
  124. package/dist/commands/validate.js +375 -0
  125. package/dist/commands/validate.js.map +1 -0
  126. package/dist/commands/version/bump.js +95 -0
  127. package/dist/commands/version/bump.js.map +1 -0
  128. package/dist/commands/version/index.js +70 -0
  129. package/dist/commands/version/index.js.map +1 -0
  130. package/dist/commands/version/set.js +101 -0
  131. package/dist/commands/version/set.js.map +1 -0
  132. package/dist/commands/version/show.js +70 -0
  133. package/dist/commands/version/show.js.map +1 -0
  134. package/dist/components/common/confirm.js +9 -0
  135. package/dist/components/common/confirm.js.map +1 -0
  136. package/dist/components/common/message.js +24 -0
  137. package/dist/components/common/message.js.map +1 -0
  138. package/dist/components/common/spinner.js +14 -0
  139. package/dist/components/common/spinner.js.map +1 -0
  140. package/dist/components/wizard/selection-header.js +11 -0
  141. package/dist/components/wizard/selection-header.js.map +1 -0
  142. package/dist/components/wizard/step-approach.js +11 -0
  143. package/dist/components/wizard/step-approach.js.map +1 -0
  144. package/dist/components/wizard/step-category.js +12 -0
  145. package/dist/components/wizard/step-category.js.map +1 -0
  146. package/dist/components/wizard/step-confirm.js +12 -0
  147. package/dist/components/wizard/step-confirm.js.map +1 -0
  148. package/dist/components/wizard/step-stack.js +11 -0
  149. package/dist/components/wizard/step-stack.js.map +1 -0
  150. package/dist/components/wizard/step-subcategory.js +13 -0
  151. package/dist/components/wizard/step-subcategory.js.map +1 -0
  152. package/dist/components/wizard/wizard.js +19 -0
  153. package/dist/components/wizard/wizard.js.map +1 -0
  154. package/dist/hooks/init.js +41 -0
  155. package/dist/hooks/init.js.map +1 -0
  156. package/dist/index.js +10 -0
  157. package/dist/index.js.map +1 -0
  158. package/dist/magic-string.es-RGXYGAW3.js +1316 -0
  159. package/dist/magic-string.es-RGXYGAW3.js.map +1 -0
  160. package/dist/stores/wizard-store.js +10 -0
  161. package/dist/stores/wizard-store.js.map +1 -0
  162. package/dist/stores/wizard-store.test.js +15991 -0
  163. package/dist/stores/wizard-store.test.js.map +1 -0
  164. package/package.json +44 -25
  165. package/dist/cli/index.js +0 -6314
  166. package/dist/cli/index.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -5,6 +5,119 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.6.0] - 2026-02-01
9
+
10
+ ### Breaking Changes
11
+
12
+ - **Skills now defined in stacks, not agents** - Previously, each agent YAML contained a `skills` field. Now, stacks define technology selections per agent in `config/stacks.yaml`. Skills are resolved via `skill_aliases` in the skills matrix. This fixes the bug where stacks got wrong skills (e.g., angular-stack getting React skills).
13
+ - **stacks.yaml schema changed** - Agents are now objects with subcategory→technology mappings (e.g., `web-developer: { framework: react, styling: scss-modules }`) instead of simple string lists.
14
+ - **Removed `skills` field from agent schema** - Agent YAMLs no longer contain skill definitions.
15
+
16
+ ### Added
17
+
18
+ - **`stack` property in consumer config.yaml** - When a stack is selected, the resolved agent→skill mappings are stored in the project config for reproducibility.
19
+ - **`resolveAgentSkillsFromStack()`** - New function in resolver.ts to extract skills from stack configurations.
20
+ - **`resolveStackSkillsFromAliases()`** - New function in stacks-loader.ts to resolve technology selections to skill IDs via the matrix.
21
+ - **Phase 7 UX specification** - Comprehensive documentation for upcoming wizard UX redesign with domain-based navigation and grid-based skill selection.
22
+
23
+ ### Changed
24
+
25
+ - `loadStackById()` now reads technology selections per agent from the new stacks.yaml format
26
+ - `getAgentSkills()` now accepts optional `stack` and `skillAliases` parameters for Phase 7 skill resolution
27
+ - `stackToResolvedStack()` extracts skills from stack configurations instead of agent YAMLs
28
+ - Stack plugin compiler now extracts skills via matrix aliases
29
+
30
+ ### Removed
31
+
32
+ - `skills` field from all 18 agent YAMLs - skills now come from stacks
33
+ - `skills` property from agent.schema.json
34
+
35
+ [0.6.0]: https://github.com/claude-collective/cli/releases/tag/v0.6.0
36
+
37
+ ## [0.5.1] - 2026-02-01
38
+
39
+ ### Added
40
+
41
+ - **Auto-detection of installation mode** - CLI now automatically detects whether you have a local (`.claude/`) or plugin (`.claude/plugins/claude-collective/`) installation. No more `--output` flag needed for local mode.
42
+ - **`installMode` property in config.yaml** - new installations now store `installMode: local | plugin` explicitly in config
43
+ - **`detectInstallation()` utility** - shared function for consistent installation detection across commands
44
+ - **Local template support** - `compile` now uses templates from `.claude/templates/` if present (after running `eject templates`)
45
+
46
+ ### Changed
47
+
48
+ - `cc compile` - auto-detects local mode and outputs to `.claude/agents` without needing `--output` flag
49
+ - `cc list` - now works for both local and plugin mode installations, shows mode in output
50
+ - `cc edit` - now works with local mode installations
51
+ - `nextjs-fullstack` stack - now includes all 18 agents (added `cli-tester` and `cli-migrator`)
52
+
53
+ ### Fixed
54
+
55
+ - Local templates not being used after `eject templates` - compile now correctly checks for `.claude/templates/` before falling back to CLI bundled templates
56
+
57
+ [0.5.1]: https://github.com/claude-collective/cli/releases/tag/v0.5.1
58
+
59
+ ## [0.5.0] - 2026-02-01
60
+
61
+ ### Breaking Changes
62
+
63
+ - **Agent-centric configuration** - skills are now defined in agent YAMLs instead of stack config files. Stacks are now simple agent groupings in `config/stacks.yaml`. This is a significant architectural change that simplifies configuration but requires migration for custom stacks.
64
+
65
+ ### Added
66
+
67
+ - **Skills in agent YAMLs** - each agent now defines its own skills with a `preloaded` flag to control what's included in the agent prompt
68
+ - **Centralized stacks.yaml** - all 7 stacks (nextjs-fullstack, angular, nuxt, remix, vue, solidjs, react-native) are now defined in `config/stacks.yaml` with agent lists and philosophy
69
+ - **stacks-loader** - new module to load stacks from config/stacks.yaml
70
+ - **resolveAgentSkills()** - function to extract skills from agent definitions
71
+
72
+ ### Changed
73
+
74
+ - `loadStackById()` now loads from `config/stacks.yaml` (new format) instead of `src/stacks/*/config.yaml`
75
+ - `getAgentSkills()` priority order: compile config > agent skills > stack-based (legacy)
76
+ - `stackToResolvedStack()` now extracts skill IDs from agent definitions
77
+ - `build:stack` command deprecated (shows warning and exits)
78
+
79
+ ### Removed
80
+
81
+ - Stack config files (`src/stacks/*/config.yaml`) - skills now come from agent YAMLs
82
+ - `suggested_stacks` section from `skills-matrix.yaml` - moved to `stacks.yaml`
83
+
84
+ ### Internal
85
+
86
+ - Updated all 17 agent YAMLs with skills fields
87
+ - Deprecated `skill-agent-mappings.ts` (kept for wizard fallback)
88
+ - Updated tests to work with new stack format (passing Stack objects instead of writing config files)
89
+
90
+ [0.5.0]: https://github.com/claude-collective/cli/releases/tag/v0.5.0
91
+
92
+ ## [0.4.0] - 2026-01-31
93
+
94
+ ### Added
95
+
96
+ - **Methodology skills preselected** - foundational skills (anti-over-engineering, context-management, investigation-requirements, success-criteria, write-verification, improvement-protocol) are now selected by default in the wizard
97
+ - **CLI skills in nextjs-fullstack** - stack now includes cli-commander, cli-reviewing, and setup skills for posthog, email, and observability
98
+ - **Test isolation support** - `CC_CONFIG_HOME` environment variable allows overriding the global config directory
99
+ - **Comprehensive test suite** - 1000+ tests covering commands, components, and user journeys
100
+
101
+ ### Internal
102
+
103
+ - Added cli-migrator and cli-tester agents for CLI development workflows
104
+ - Added research documentation for CLI testing strategies and stack simplification
105
+
106
+ [0.4.0]: https://github.com/claude-collective/cli/releases/tag/v0.4.0
107
+
108
+ ## [0.3.0] - 2026-01-31
109
+
110
+ ### Changed
111
+
112
+ - **CLI Framework Migration** - migrated from Commander.js + @clack/prompts to oclif + Ink for improved maintainability and extensibility
113
+ - All commands now use oclif's class-based command structure
114
+ - Interactive components now use Ink (React-based terminal UI)
115
+ - Wizard state management now uses Zustand
116
+ - Removed dependencies: commander, @clack/prompts, @clack/core, picocolors
117
+ - Added dependencies: @oclif/core, @oclif/plugin-\*, ink, react, @inkjs/ui, zustand
118
+
119
+ [0.3.0]: https://github.com/claude-collective/cli/releases/tag/v0.3.0
120
+
8
121
  ## [0.2.0] - 2026-01-30
9
122
 
10
123
  ### Added
package/README.md CHANGED
@@ -51,7 +51,7 @@ skills live in the [claude-collective/skills](https://github.com/claude-collecti
51
51
  | web | react 19, next.js, remix, vue, angular, solidjs, scss-modules, zustand, react-query |
52
52
  | api | hono, drizzle, better-auth, posthog, resend, axiom+pino+sentry |
53
53
  | mobile | react-native, expo |
54
- | cli | commander.js, clack prompts |
54
+ | cli | oclif, ink |
55
55
  | infra | turborepo, github-actions, env config |
56
56
  | security | auth patterns, xss prevention, secrets |
57
57
  | meta | code reviewing, research methodology |
@@ -0,0 +1,84 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ fetchFromSource
4
+ } from "./chunk-ZSKHDU5P.js";
5
+ import {
6
+ CLAUDE_DIR,
7
+ DIRS,
8
+ PROJECT_ROOT
9
+ } from "./chunk-SJYG4EJZ.js";
10
+ import {
11
+ verbose
12
+ } from "./chunk-TOPAIL5W.js";
13
+ import {
14
+ directoryExists
15
+ } from "./chunk-MMDXNZPF.js";
16
+ import {
17
+ init_esm_shims
18
+ } from "./chunk-DHET7RCE.js";
19
+
20
+ // src/cli-v2/lib/agent-fetcher.ts
21
+ init_esm_shims();
22
+ import path from "path";
23
+ async function getAgentDefinitions(remoteSource, options = {}) {
24
+ if (remoteSource) {
25
+ return fetchAgentDefinitionsFromRemote(remoteSource, options);
26
+ }
27
+ return getLocalAgentDefinitions(options);
28
+ }
29
+ async function getLocalAgentDefinitions(options = {}) {
30
+ const agentsDir = path.join(PROJECT_ROOT, DIRS.agents);
31
+ let templatesDir = path.join(PROJECT_ROOT, DIRS.templates);
32
+ if (!await directoryExists(agentsDir)) {
33
+ throw new Error(
34
+ `Agent partials not found at: ${agentsDir}. Ensure the CLI is properly installed.`
35
+ );
36
+ }
37
+ if (options.projectDir) {
38
+ const localTemplatesDir = path.join(
39
+ options.projectDir,
40
+ CLAUDE_DIR,
41
+ "templates"
42
+ );
43
+ if (await directoryExists(localTemplatesDir)) {
44
+ verbose(`Using local templates from: ${localTemplatesDir}`);
45
+ templatesDir = localTemplatesDir;
46
+ }
47
+ }
48
+ if (!await directoryExists(templatesDir)) {
49
+ verbose(`Templates directory not found: ${templatesDir}`);
50
+ }
51
+ verbose(`Agent partials loaded from CLI: ${agentsDir}`);
52
+ verbose(`Templates directory: ${templatesDir}`);
53
+ return {
54
+ agentsDir,
55
+ templatesDir,
56
+ sourcePath: PROJECT_ROOT
57
+ };
58
+ }
59
+ async function fetchAgentDefinitionsFromRemote(source, options = {}) {
60
+ verbose(`Fetching agent partials from remote: ${source}`);
61
+ const result = await fetchFromSource(source, {
62
+ forceRefresh: options.forceRefresh,
63
+ subdir: ""
64
+ });
65
+ const agentsDir = path.join(result.path, "src", "agents");
66
+ const templatesDir = path.join(agentsDir, "_templates");
67
+ if (!await directoryExists(agentsDir)) {
68
+ throw new Error(`Agent partials not found at: ${agentsDir}`);
69
+ }
70
+ if (!await directoryExists(templatesDir)) {
71
+ verbose(`Templates directory not found: ${templatesDir}`);
72
+ }
73
+ verbose(`Agent partials fetched from: ${result.path}`);
74
+ return {
75
+ agentsDir,
76
+ templatesDir,
77
+ sourcePath: result.path
78
+ };
79
+ }
80
+
81
+ export {
82
+ getAgentDefinitions
83
+ };
84
+ //# sourceMappingURL=chunk-367K3JB3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli-v2/lib/agent-fetcher.ts"],"sourcesContent":["import path from \"path\";\nimport { directoryExists } from \"../utils/fs\";\nimport { verbose } from \"../utils/logger\";\nimport { PROJECT_ROOT, DIRS, CLAUDE_DIR } from \"../consts\";\nimport { fetchFromSource, type FetchOptions } from \"./source-fetcher\";\nimport type { AgentSourcePaths } from \"../../types\";\n\nexport interface AgentDefinitionOptions extends FetchOptions {\n /** Project directory to check for local templates */\n projectDir?: string;\n}\n\nexport async function getAgentDefinitions(\n remoteSource?: string,\n options: AgentDefinitionOptions = {},\n): Promise<AgentSourcePaths> {\n if (remoteSource) {\n return fetchAgentDefinitionsFromRemote(remoteSource, options);\n }\n return getLocalAgentDefinitions(options);\n}\n\nexport async function getLocalAgentDefinitions(\n options: AgentDefinitionOptions = {},\n): Promise<AgentSourcePaths> {\n const agentsDir = path.join(PROJECT_ROOT, DIRS.agents);\n let templatesDir = path.join(PROJECT_ROOT, DIRS.templates);\n\n if (!(await directoryExists(agentsDir))) {\n throw new Error(\n `Agent partials not found at: ${agentsDir}. ` +\n `Ensure the CLI is properly installed.`,\n );\n }\n\n // Check for local templates first (from eject templates)\n if (options.projectDir) {\n const localTemplatesDir = path.join(\n options.projectDir,\n CLAUDE_DIR,\n \"templates\",\n );\n if (await directoryExists(localTemplatesDir)) {\n verbose(`Using local templates from: ${localTemplatesDir}`);\n templatesDir = localTemplatesDir;\n }\n }\n\n if (!(await directoryExists(templatesDir))) {\n verbose(`Templates directory not found: ${templatesDir}`);\n }\n\n verbose(`Agent partials loaded from CLI: ${agentsDir}`);\n verbose(`Templates directory: ${templatesDir}`);\n\n return {\n agentsDir,\n templatesDir,\n sourcePath: PROJECT_ROOT,\n };\n}\n\nexport async function fetchAgentDefinitionsFromRemote(\n source: string,\n options: FetchOptions = {},\n): Promise<AgentSourcePaths> {\n verbose(`Fetching agent partials from remote: ${source}`);\n\n const result = await fetchFromSource(source, {\n forceRefresh: options.forceRefresh,\n subdir: \"\",\n });\n\n const agentsDir = path.join(result.path, \"src\", \"agents\");\n const templatesDir = path.join(agentsDir, \"_templates\");\n\n if (!(await directoryExists(agentsDir))) {\n throw new Error(`Agent partials not found at: ${agentsDir}`);\n }\n\n if (!(await directoryExists(templatesDir))) {\n verbose(`Templates directory not found: ${templatesDir}`);\n }\n\n verbose(`Agent partials fetched from: ${result.path}`);\n\n return {\n agentsDir,\n templatesDir,\n sourcePath: result.path,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA,OAAO,UAAU;AAYjB,eAAsB,oBACpB,cACA,UAAkC,CAAC,GACR;AAC3B,MAAI,cAAc;AAChB,WAAO,gCAAgC,cAAc,OAAO;AAAA,EAC9D;AACA,SAAO,yBAAyB,OAAO;AACzC;AAEA,eAAsB,yBACpB,UAAkC,CAAC,GACR;AAC3B,QAAM,YAAY,KAAK,KAAK,cAAc,KAAK,MAAM;AACrD,MAAI,eAAe,KAAK,KAAK,cAAc,KAAK,SAAS;AAEzD,MAAI,CAAE,MAAM,gBAAgB,SAAS,GAAI;AACvC,UAAM,IAAI;AAAA,MACR,gCAAgC,SAAS;AAAA,IAE3C;AAAA,EACF;AAGA,MAAI,QAAQ,YAAY;AACtB,UAAM,oBAAoB,KAAK;AAAA,MAC7B,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,IACF;AACA,QAAI,MAAM,gBAAgB,iBAAiB,GAAG;AAC5C,cAAQ,+BAA+B,iBAAiB,EAAE;AAC1D,qBAAe;AAAA,IACjB;AAAA,EACF;AAEA,MAAI,CAAE,MAAM,gBAAgB,YAAY,GAAI;AAC1C,YAAQ,kCAAkC,YAAY,EAAE;AAAA,EAC1D;AAEA,UAAQ,mCAAmC,SAAS,EAAE;AACtD,UAAQ,wBAAwB,YAAY,EAAE;AAE9C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,YAAY;AAAA,EACd;AACF;AAEA,eAAsB,gCACpB,QACA,UAAwB,CAAC,GACE;AAC3B,UAAQ,wCAAwC,MAAM,EAAE;AAExD,QAAM,SAAS,MAAM,gBAAgB,QAAQ;AAAA,IAC3C,cAAc,QAAQ;AAAA,IACtB,QAAQ;AAAA,EACV,CAAC;AAED,QAAM,YAAY,KAAK,KAAK,OAAO,MAAM,OAAO,QAAQ;AACxD,QAAM,eAAe,KAAK,KAAK,WAAW,YAAY;AAEtD,MAAI,CAAE,MAAM,gBAAgB,SAAS,GAAI;AACvC,UAAM,IAAI,MAAM,gCAAgC,SAAS,EAAE;AAAA,EAC7D;AAEA,MAAI,CAAE,MAAM,gBAAgB,YAAY,GAAI;AAC1C,YAAQ,kCAAkC,YAAY,EAAE;AAAA,EAC1D;AAEA,UAAQ,gCAAgC,OAAO,IAAI,EAAE;AAErD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,YAAY,OAAO;AAAA,EACrB;AACF;","names":[]}
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ loadProjectConfig
4
+ } from "./chunk-MYAVQ23U.js";
5
+ import {
6
+ getCollectivePluginDir
7
+ } from "./chunk-D4IQAT27.js";
8
+ import {
9
+ CLAUDE_DIR
10
+ } from "./chunk-SJYG4EJZ.js";
11
+ import {
12
+ directoryExists,
13
+ fileExists
14
+ } from "./chunk-MMDXNZPF.js";
15
+ import {
16
+ init_esm_shims
17
+ } from "./chunk-DHET7RCE.js";
18
+
19
+ // src/cli-v2/lib/installation.ts
20
+ init_esm_shims();
21
+ import path from "path";
22
+ async function detectInstallation(projectDir = process.cwd()) {
23
+ const localConfigPath = path.join(projectDir, CLAUDE_DIR, "config.yaml");
24
+ if (await fileExists(localConfigPath)) {
25
+ const loaded = await loadProjectConfig(projectDir);
26
+ const mode = loaded?.config?.installMode ?? "local";
27
+ if (mode === "local") {
28
+ return {
29
+ mode: "local",
30
+ configPath: localConfigPath,
31
+ agentsDir: path.join(projectDir, CLAUDE_DIR, "agents"),
32
+ skillsDir: path.join(projectDir, CLAUDE_DIR, "skills"),
33
+ projectDir
34
+ };
35
+ }
36
+ }
37
+ const pluginDir = getCollectivePluginDir(projectDir);
38
+ const pluginConfigPath = path.join(pluginDir, "config.yaml");
39
+ if (await directoryExists(pluginDir)) {
40
+ return {
41
+ mode: "plugin",
42
+ configPath: pluginConfigPath,
43
+ agentsDir: path.join(pluginDir, "agents"),
44
+ skillsDir: path.join(pluginDir, "skills"),
45
+ projectDir
46
+ };
47
+ }
48
+ return null;
49
+ }
50
+
51
+ export {
52
+ detectInstallation
53
+ };
54
+ //# sourceMappingURL=chunk-6ESUJMM7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli-v2/lib/installation.ts"],"sourcesContent":["/**\n * Installation detection utilities for Claude Collective.\n *\n * Detects whether a project uses local mode (.claude/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 } 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/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 const localConfigPath = path.join(projectDir, CLAUDE_DIR, \"config.yaml\");\n\n if (await fileExists(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;AAE9B,QAAM,kBAAkB,KAAK,KAAK,YAAY,YAAY,aAAa;AAEvE,MAAI,MAAM,WAAW,eAAe,GAAG;AACrC,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":[]}
@@ -0,0 +1,93 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ DEFAULT_PRESELECTED_SKILLS
4
+ } from "./chunk-SJYG4EJZ.js";
5
+ import {
6
+ init_esm_shims
7
+ } from "./chunk-DHET7RCE.js";
8
+
9
+ // src/cli-v2/stores/wizard-store.ts
10
+ init_esm_shims();
11
+ import { create } from "zustand";
12
+ var createInitialState = (options) => {
13
+ const hasInitialSkills = options?.initialSkills && options.initialSkills.length > 0;
14
+ const baseSkills = [...DEFAULT_PRESELECTED_SKILLS];
15
+ const initialSkills = options?.initialSkills ?? [];
16
+ const combinedSkills = [.../* @__PURE__ */ new Set([...baseSkills, ...initialSkills])];
17
+ return {
18
+ step: hasInitialSkills ? "category" : "approach",
19
+ selectedSkills: combinedSkills,
20
+ selectedStack: null,
21
+ expertMode: options?.hasLocalSkills ?? false,
22
+ installMode: "local",
23
+ history: [],
24
+ currentTopCategory: null,
25
+ currentSubcategory: null,
26
+ visitedCategories: /* @__PURE__ */ new Set(),
27
+ lastSelectedCategory: null,
28
+ lastSelectedSubcategory: null,
29
+ lastSelectedSkill: null,
30
+ lastSelectedApproach: null
31
+ };
32
+ };
33
+ var useWizardStore = create((set, get) => ({
34
+ ...createInitialState(),
35
+ setStep: (step) => set((state) => ({
36
+ step,
37
+ history: [...state.history, state.step]
38
+ })),
39
+ toggleSkill: (skillId) => set((state) => {
40
+ const isSelected = state.selectedSkills.includes(skillId);
41
+ return {
42
+ selectedSkills: isSelected ? state.selectedSkills.filter((id) => id !== skillId) : [...state.selectedSkills, skillId]
43
+ };
44
+ }),
45
+ selectStack: (stack) => set({
46
+ selectedStack: stack,
47
+ // Include preselected skills (methodology) plus stack skills
48
+ selectedSkills: stack ? [.../* @__PURE__ */ new Set([...DEFAULT_PRESELECTED_SKILLS, ...stack.allSkillIds])] : [...DEFAULT_PRESELECTED_SKILLS]
49
+ }),
50
+ toggleExpertMode: () => set((state) => ({
51
+ expertMode: !state.expertMode
52
+ })),
53
+ toggleInstallMode: () => set((state) => ({
54
+ installMode: state.installMode === "plugin" ? "local" : "plugin"
55
+ })),
56
+ setCategory: (category) => set({
57
+ currentTopCategory: category
58
+ }),
59
+ setSubcategory: (subcategory) => set({
60
+ currentSubcategory: subcategory
61
+ }),
62
+ setLastSelectedCategory: (category) => set({
63
+ lastSelectedCategory: category
64
+ }),
65
+ setLastSelectedSubcategory: (subcategory) => set({
66
+ lastSelectedSubcategory: subcategory
67
+ }),
68
+ setLastSelectedSkill: (skillId) => set({
69
+ lastSelectedSkill: skillId
70
+ }),
71
+ setLastSelectedApproach: (approach) => set({
72
+ lastSelectedApproach: approach
73
+ }),
74
+ markCategoryVisited: (category) => set((state) => {
75
+ const visited = new Set(state.visitedCategories);
76
+ visited.add(category);
77
+ return { visitedCategories: visited };
78
+ }),
79
+ goBack: () => set((state) => {
80
+ const history = [...state.history];
81
+ const previousStep = history.pop();
82
+ return {
83
+ step: previousStep || "approach",
84
+ history
85
+ };
86
+ }),
87
+ reset: (options) => set(createInitialState(options))
88
+ }));
89
+
90
+ export {
91
+ useWizardStore
92
+ };
93
+ //# sourceMappingURL=chunk-6OY6ZYQF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli-v2/stores/wizard-store.ts"],"sourcesContent":["import { create } from \"zustand\";\n// Note: ResolvedStack is from skills-matrix.yaml's suggested_stacks (for wizard skill selection)\n// This is different from Stack in types-stacks.ts (for agent groupings in config/stacks.yaml)\nimport type { ResolvedStack } from \"../types-matrix\";\nimport { DEFAULT_PRESELECTED_SKILLS } from \"../consts\";\n\nexport type WizardStep =\n | \"approach\"\n | \"stack\"\n | \"category\"\n | \"subcategory\"\n | \"confirm\";\n\nexport interface WizardState {\n // Current step\n step: WizardStep;\n\n // Selections\n selectedSkills: string[];\n selectedStack: ResolvedStack | null;\n\n // Modes\n expertMode: boolean;\n installMode: \"plugin\" | \"local\";\n\n // Navigation\n history: WizardStep[];\n currentTopCategory: string | null;\n currentSubcategory: string | null;\n visitedCategories: Set<string>;\n\n // Last selected values (for initialValue in prompts)\n lastSelectedCategory: string | null;\n lastSelectedSubcategory: string | null;\n lastSelectedSkill: string | null;\n lastSelectedApproach: string | null;\n\n // Actions\n setStep: (step: WizardStep) => void;\n toggleSkill: (skillId: string) => void;\n selectStack: (stack: ResolvedStack | null) => void;\n toggleExpertMode: () => void;\n toggleInstallMode: () => void;\n setCategory: (category: string | null) => void;\n setSubcategory: (subcategory: string | null) => void;\n setLastSelectedCategory: (category: string | null) => void;\n setLastSelectedSubcategory: (subcategory: string | null) => void;\n setLastSelectedSkill: (skillId: string | null) => void;\n setLastSelectedApproach: (approach: string | null) => void;\n markCategoryVisited: (category: string) => void;\n goBack: () => void;\n reset: (options?: {\n initialSkills?: string[];\n hasLocalSkills?: boolean;\n }) => void;\n}\n\nconst createInitialState = (options?: {\n initialSkills?: string[];\n hasLocalSkills?: boolean;\n}) => {\n const hasInitialSkills =\n options?.initialSkills && options.initialSkills.length > 0;\n\n // Start with default preselected skills (methodology), then add any initial skills\n const baseSkills = [...DEFAULT_PRESELECTED_SKILLS];\n const initialSkills = options?.initialSkills ?? [];\n const combinedSkills = [...new Set([...baseSkills, ...initialSkills])];\n\n return {\n step: (hasInitialSkills ? \"category\" : \"approach\") as WizardStep,\n selectedSkills: combinedSkills,\n selectedStack: null,\n expertMode: options?.hasLocalSkills ?? false,\n installMode: \"local\" as \"plugin\" | \"local\",\n history: [] as WizardStep[],\n currentTopCategory: null,\n currentSubcategory: null,\n visitedCategories: new Set<string>(),\n lastSelectedCategory: null,\n lastSelectedSubcategory: null,\n lastSelectedSkill: null,\n lastSelectedApproach: null,\n };\n};\n\nexport const useWizardStore = create<WizardState>((set, get) => ({\n ...createInitialState(),\n\n setStep: (step) =>\n set((state) => ({\n step,\n history: [...state.history, state.step],\n })),\n\n toggleSkill: (skillId) =>\n set((state) => {\n const isSelected = state.selectedSkills.includes(skillId);\n return {\n selectedSkills: isSelected\n ? state.selectedSkills.filter((id) => id !== skillId)\n : [...state.selectedSkills, skillId],\n };\n }),\n\n selectStack: (stack) =>\n set({\n selectedStack: stack,\n // Include preselected skills (methodology) plus stack skills\n selectedSkills: stack\n ? [...new Set([...DEFAULT_PRESELECTED_SKILLS, ...stack.allSkillIds])]\n : [...DEFAULT_PRESELECTED_SKILLS],\n }),\n\n toggleExpertMode: () =>\n set((state) => ({\n expertMode: !state.expertMode,\n })),\n\n toggleInstallMode: () =>\n set((state) => ({\n installMode: state.installMode === \"plugin\" ? \"local\" : \"plugin\",\n })),\n\n setCategory: (category) =>\n set({\n currentTopCategory: category,\n }),\n\n setSubcategory: (subcategory) =>\n set({\n currentSubcategory: subcategory,\n }),\n\n setLastSelectedCategory: (category) =>\n set({\n lastSelectedCategory: category,\n }),\n\n setLastSelectedSubcategory: (subcategory) =>\n set({\n lastSelectedSubcategory: subcategory,\n }),\n\n setLastSelectedSkill: (skillId) =>\n set({\n lastSelectedSkill: skillId,\n }),\n\n setLastSelectedApproach: (approach) =>\n set({\n lastSelectedApproach: approach,\n }),\n\n markCategoryVisited: (category) =>\n set((state) => {\n const visited = new Set(state.visitedCategories);\n visited.add(category);\n return { visitedCategories: visited };\n }),\n\n goBack: () =>\n set((state) => {\n const history = [...state.history];\n const previousStep = history.pop();\n return {\n step: previousStep || \"approach\",\n history,\n };\n }),\n\n reset: (options) => set(createInitialState(options)),\n}));\n"],"mappings":"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","names":[]}