@claude-collective/cli 0.26.0 → 0.29.4

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 (233) hide show
  1. package/CHANGELOG.md +125 -0
  2. package/README.md +47 -13
  3. package/config/stacks.yaml +330 -93
  4. package/dist/chunk-56ERY7H7.js +29 -0
  5. package/dist/chunk-56ERY7H7.js.map +1 -0
  6. package/dist/{chunk-OBXAY23Y.js → chunk-5I6VY2E7.js} +5 -5
  7. package/dist/chunk-5I6VY2E7.js.map +1 -0
  8. package/dist/{chunk-ZDREFYD2.js → chunk-5WIHSJRO.js} +234 -59
  9. package/dist/chunk-5WIHSJRO.js.map +1 -0
  10. package/dist/{chunk-GGFOD5PK.js → chunk-6F3ZKDVE.js} +122 -66
  11. package/dist/chunk-6F3ZKDVE.js.map +1 -0
  12. package/dist/{chunk-DBRUQQUF.js → chunk-7GHTQSWI.js} +5 -1
  13. package/dist/{chunk-DBRUQQUF.js.map → chunk-7GHTQSWI.js.map} +1 -1
  14. package/dist/chunk-7ICBJZV2.js +63 -0
  15. package/dist/chunk-7ICBJZV2.js.map +1 -0
  16. package/dist/{chunk-3X5D7RM5.js → chunk-7UKQZSWT.js} +15 -4
  17. package/dist/chunk-7UKQZSWT.js.map +1 -0
  18. package/dist/{chunk-F4RD5FYM.js → chunk-A4T4YSV4.js} +5 -2
  19. package/dist/chunk-A4T4YSV4.js.map +1 -0
  20. package/dist/{chunk-VVYNZZUX.js → chunk-AG5YGYJT.js} +9 -5
  21. package/dist/chunk-AG5YGYJT.js.map +1 -0
  22. package/dist/chunk-AJFSCLJ7.js +81 -0
  23. package/dist/chunk-AJFSCLJ7.js.map +1 -0
  24. package/dist/{chunk-NQJ47R4N.js → chunk-CQZAKMPJ.js} +66 -14
  25. package/dist/chunk-CQZAKMPJ.js.map +1 -0
  26. package/dist/chunk-DIRH4PDF.js +24 -0
  27. package/dist/chunk-DIRH4PDF.js.map +1 -0
  28. package/dist/{chunk-R7B63JAP.js → chunk-DUIYVKFK.js} +123 -86
  29. package/dist/chunk-DUIYVKFK.js.map +1 -0
  30. package/dist/chunk-EP6J44I4.js +142 -0
  31. package/dist/chunk-EP6J44I4.js.map +1 -0
  32. package/dist/{chunk-TDZE4TDG.js → chunk-EUPMWSM3.js} +92 -29
  33. package/dist/chunk-EUPMWSM3.js.map +1 -0
  34. package/dist/chunk-FUPBGSRA.js +66 -0
  35. package/dist/chunk-FUPBGSRA.js.map +1 -0
  36. package/dist/{chunk-U7HFKR74.js → chunk-FY5D4KIC.js} +5 -2
  37. package/dist/chunk-FY5D4KIC.js.map +1 -0
  38. package/dist/chunk-G5WXKKQM.js +233 -0
  39. package/dist/chunk-G5WXKKQM.js.map +1 -0
  40. package/dist/{chunk-KWYO3M5Q.js → chunk-GVVEPVR7.js} +25 -24
  41. package/dist/chunk-GVVEPVR7.js.map +1 -0
  42. package/dist/chunk-IFODQTCX.js +162 -0
  43. package/dist/chunk-IFODQTCX.js.map +1 -0
  44. package/dist/chunk-IQUBOWWU.js +366 -0
  45. package/dist/chunk-IQUBOWWU.js.map +1 -0
  46. package/dist/{chunk-ETCVEV3S.js → chunk-IRG52AN5.js} +242 -155
  47. package/dist/chunk-IRG52AN5.js.map +1 -0
  48. package/dist/chunk-MQAYAISQ.js +88 -0
  49. package/dist/chunk-MQAYAISQ.js.map +1 -0
  50. package/dist/{chunk-4357L7VK.js → chunk-N73GQTCK.js} +37 -104
  51. package/dist/chunk-N73GQTCK.js.map +1 -0
  52. package/dist/{chunk-H7SSBSPR.js → chunk-OA5RCL2L.js} +8 -5
  53. package/dist/chunk-OA5RCL2L.js.map +1 -0
  54. package/dist/{chunk-I3YYG5IO.js → chunk-PNXFJPXF.js} +3 -3
  55. package/dist/{chunk-MCTSHLAF.js → chunk-RI5QEK5W.js} +41 -14
  56. package/dist/chunk-RI5QEK5W.js.map +1 -0
  57. package/dist/chunk-RXC7AF7N.js +31 -0
  58. package/dist/chunk-RXC7AF7N.js.map +1 -0
  59. package/dist/{chunk-ETQ3BPGU.js → chunk-SSHG7MEE.js} +1252 -728
  60. package/dist/chunk-SSHG7MEE.js.map +1 -0
  61. package/dist/{chunk-4S4FCAA2.js → chunk-VTUPUKFD.js} +26 -31
  62. package/dist/chunk-VTUPUKFD.js.map +1 -0
  63. package/dist/{chunk-XENOESJZ.js → chunk-WLQUQXWO.js} +10 -67
  64. package/dist/chunk-WLQUQXWO.js.map +1 -0
  65. package/dist/chunk-WPED6CL3.js +105 -0
  66. package/dist/chunk-WPED6CL3.js.map +1 -0
  67. package/dist/{chunk-R5KJVI54.js → chunk-XPMEGGJK.js} +97 -76
  68. package/dist/chunk-XPMEGGJK.js.map +1 -0
  69. package/dist/chunk-XZKVOPCR.js +75 -0
  70. package/dist/chunk-XZKVOPCR.js.map +1 -0
  71. package/dist/{chunk-ZW2PELOH.js → chunk-ZX5DM4D5.js} +106 -69
  72. package/dist/chunk-ZX5DM4D5.js.map +1 -0
  73. package/dist/commands/build/marketplace.js +21 -20
  74. package/dist/commands/build/marketplace.js.map +1 -1
  75. package/dist/commands/build/plugins.js +7 -11
  76. package/dist/commands/build/plugins.js.map +1 -1
  77. package/dist/commands/build/stack.js +8 -13
  78. package/dist/commands/build/stack.js.map +1 -1
  79. package/dist/commands/compile.js +109 -135
  80. package/dist/commands/compile.js.map +1 -1
  81. package/dist/commands/config/get.js +4 -5
  82. package/dist/commands/config/get.js.map +1 -1
  83. package/dist/commands/config/index.js +5 -6
  84. package/dist/commands/config/index.js.map +1 -1
  85. package/dist/commands/config/path.js +4 -5
  86. package/dist/commands/config/path.js.map +1 -1
  87. package/dist/commands/config/set-project.js +4 -5
  88. package/dist/commands/config/set-project.js.map +1 -1
  89. package/dist/commands/config/show.js +5 -6
  90. package/dist/commands/config/unset-project.js +4 -5
  91. package/dist/commands/config/unset-project.js.map +1 -1
  92. package/dist/commands/diff.js +26 -11
  93. package/dist/commands/diff.js.map +1 -1
  94. package/dist/commands/doctor.js +13 -16
  95. package/dist/commands/doctor.js.map +1 -1
  96. package/dist/commands/edit.js +71 -42
  97. package/dist/commands/edit.js.map +1 -1
  98. package/dist/commands/eject.js +34 -14
  99. package/dist/commands/eject.js.map +1 -1
  100. package/dist/commands/import/skill.js +93 -52
  101. package/dist/commands/import/skill.js.map +1 -1
  102. package/dist/commands/info.js +27 -9
  103. package/dist/commands/info.js.map +1 -1
  104. package/dist/commands/init.js +98 -48
  105. package/dist/commands/init.js.map +1 -1
  106. package/dist/commands/list.js +10 -5
  107. package/dist/commands/list.js.map +1 -1
  108. package/dist/commands/new/agent.js +8 -11
  109. package/dist/commands/new/agent.js.map +1 -1
  110. package/dist/commands/new/skill.js +17 -18
  111. package/dist/commands/new/skill.js.map +1 -1
  112. package/dist/commands/outdated.js +23 -9
  113. package/dist/commands/outdated.js.map +1 -1
  114. package/dist/commands/search.js +23 -20
  115. package/dist/commands/search.js.map +1 -1
  116. package/dist/commands/uninstall.js +28 -21
  117. package/dist/commands/uninstall.js.map +1 -1
  118. package/dist/commands/update.js +30 -22
  119. package/dist/commands/update.js.map +1 -1
  120. package/dist/commands/validate.js +103 -39
  121. package/dist/commands/validate.js.map +1 -1
  122. package/dist/commands/version/bump.js +4 -5
  123. package/dist/commands/version/bump.js.map +1 -1
  124. package/dist/commands/version/index.js +4 -5
  125. package/dist/commands/version/index.js.map +1 -1
  126. package/dist/commands/version/set.js +4 -5
  127. package/dist/commands/version/set.js.map +1 -1
  128. package/dist/commands/version/show.js +4 -5
  129. package/dist/commands/version/show.js.map +1 -1
  130. package/dist/components/common/confirm.test.js +2 -2
  131. package/dist/components/common/confirm.test.js.map +1 -1
  132. package/dist/components/skill-search/skill-search.js +4 -2
  133. package/dist/components/wizard/category-grid.js +3 -1
  134. package/dist/components/wizard/category-grid.test.js +63 -64
  135. package/dist/components/wizard/category-grid.test.js.map +1 -1
  136. package/dist/components/wizard/domain-selection.js +13 -0
  137. package/dist/components/wizard/help-modal.js +10 -0
  138. package/dist/components/wizard/help-modal.js.map +1 -0
  139. package/dist/components/wizard/menu-item.js +2 -1
  140. package/dist/components/wizard/search-modal.js +3 -1
  141. package/dist/components/wizard/search-modal.test.js +4 -2
  142. package/dist/components/wizard/search-modal.test.js.map +1 -1
  143. package/dist/components/wizard/section-progress.js +2 -1
  144. package/dist/components/wizard/section-progress.test.js +2 -1
  145. package/dist/components/wizard/section-progress.test.js.map +1 -1
  146. package/dist/components/wizard/source-grid.js +6 -2
  147. package/dist/components/wizard/source-grid.test.js +49 -45
  148. package/dist/components/wizard/source-grid.test.js.map +1 -1
  149. package/dist/components/wizard/stack-selection.js +15 -0
  150. package/dist/components/wizard/stack-selection.js.map +1 -0
  151. package/dist/components/wizard/step-approach.js +8 -6
  152. package/dist/components/wizard/step-approach.test.js +11 -9
  153. package/dist/components/wizard/step-approach.test.js.map +1 -1
  154. package/dist/components/wizard/step-build.js +9 -13
  155. package/dist/components/wizard/step-build.test.js +27 -45
  156. package/dist/components/wizard/step-build.test.js.map +1 -1
  157. package/dist/components/wizard/step-confirm.js +2 -1
  158. package/dist/components/wizard/step-confirm.test.js +6 -5
  159. package/dist/components/wizard/step-confirm.test.js.map +1 -1
  160. package/dist/components/wizard/step-refine.js +2 -1
  161. package/dist/components/wizard/step-refine.test.js +3 -2
  162. package/dist/components/wizard/step-refine.test.js.map +1 -1
  163. package/dist/components/wizard/step-settings.js +8 -6
  164. package/dist/components/wizard/step-settings.test.js +12 -10
  165. package/dist/components/wizard/step-settings.test.js.map +1 -1
  166. package/dist/components/wizard/step-sources.js +11 -9
  167. package/dist/components/wizard/step-sources.test.js +16 -15
  168. package/dist/components/wizard/step-sources.test.js.map +1 -1
  169. package/dist/components/wizard/step-stack.js +9 -6
  170. package/dist/components/wizard/step-stack.test.js +15 -12
  171. package/dist/components/wizard/step-stack.test.js.map +1 -1
  172. package/dist/components/wizard/view-title.js +2 -1
  173. package/dist/components/wizard/wizard-layout.js +7 -9
  174. package/dist/components/wizard/wizard-tabs.js +2 -1
  175. package/dist/components/wizard/wizard-tabs.test.js +2 -1
  176. package/dist/components/wizard/wizard-tabs.test.js.map +1 -1
  177. package/dist/components/wizard/wizard.js +26 -20
  178. package/dist/config/stacks.yaml +330 -93
  179. package/dist/hooks/init.js +3 -4
  180. package/dist/hooks/init.js.map +1 -1
  181. package/dist/source-manager-TV2YGPAN.js +15 -0
  182. package/dist/source-manager-TV2YGPAN.js.map +1 -0
  183. package/dist/stores/wizard-store.js +4 -3
  184. package/dist/stores/wizard-store.test.js +272 -25
  185. package/dist/stores/wizard-store.test.js.map +1 -1
  186. package/package.json +2 -1
  187. package/src/schemas/agent-frontmatter.schema.json +84 -0
  188. package/src/schemas/agent.schema.json +93 -0
  189. package/src/schemas/hooks.schema.json +47 -0
  190. package/src/schemas/marketplace.schema.json +119 -0
  191. package/src/schemas/metadata.schema.json +113 -0
  192. package/src/schemas/plugin.schema.json +130 -0
  193. package/src/schemas/project-config.schema.json +125 -0
  194. package/src/schemas/project-source-config.schema.json +81 -0
  195. package/src/schemas/skill-frontmatter.schema.json +42 -0
  196. package/src/schemas/skills-matrix.schema.json +467 -0
  197. package/src/schemas/stack.schema.json +191 -0
  198. package/src/schemas/stacks.schema.json +111 -0
  199. package/dist/chunk-3X5D7RM5.js.map +0 -1
  200. package/dist/chunk-4357L7VK.js.map +0 -1
  201. package/dist/chunk-4S4FCAA2.js.map +0 -1
  202. package/dist/chunk-7UPXT32F.js +0 -197
  203. package/dist/chunk-7UPXT32F.js.map +0 -1
  204. package/dist/chunk-ETCVEV3S.js.map +0 -1
  205. package/dist/chunk-ETQ3BPGU.js.map +0 -1
  206. package/dist/chunk-F4RD5FYM.js.map +0 -1
  207. package/dist/chunk-GGFOD5PK.js.map +0 -1
  208. package/dist/chunk-H7SSBSPR.js.map +0 -1
  209. package/dist/chunk-HWD32NP7.js +0 -19
  210. package/dist/chunk-HWD32NP7.js.map +0 -1
  211. package/dist/chunk-KWYO3M5Q.js.map +0 -1
  212. package/dist/chunk-MCTSHLAF.js.map +0 -1
  213. package/dist/chunk-NQJ47R4N.js.map +0 -1
  214. package/dist/chunk-O6ZTD7ZI.js +0 -70
  215. package/dist/chunk-O6ZTD7ZI.js.map +0 -1
  216. package/dist/chunk-OBXAY23Y.js.map +0 -1
  217. package/dist/chunk-R5KJVI54.js.map +0 -1
  218. package/dist/chunk-R7B63JAP.js.map +0 -1
  219. package/dist/chunk-TDZE4TDG.js.map +0 -1
  220. package/dist/chunk-TMED5DQ2.js +0 -210
  221. package/dist/chunk-TMED5DQ2.js.map +0 -1
  222. package/dist/chunk-U7HFKR74.js.map +0 -1
  223. package/dist/chunk-UEMRJI2K.js +0 -146
  224. package/dist/chunk-UEMRJI2K.js.map +0 -1
  225. package/dist/chunk-UNN7523L.js +0 -78
  226. package/dist/chunk-UNN7523L.js.map +0 -1
  227. package/dist/chunk-VVYNZZUX.js.map +0 -1
  228. package/dist/chunk-XENOESJZ.js.map +0 -1
  229. package/dist/chunk-ZDREFYD2.js.map +0 -1
  230. package/dist/chunk-ZW2PELOH.js.map +0 -1
  231. package/dist/source-manager-EYO3F2DV.js +0 -16
  232. /package/dist/{chunk-I3YYG5IO.js.map → chunk-PNXFJPXF.js.map} +0 -0
  233. /package/dist/{source-manager-EYO3F2DV.js.map → components/wizard/domain-selection.js.map} +0 -0
package/CHANGELOG.md CHANGED
@@ -5,6 +5,131 @@ 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.29.4] - 2026-02-15
9
+
10
+ ### Fixed
11
+
12
+ - **Strict JSON schema validation** — All 12 generated JSON schemas now enforce meaningful constraints for IDE autocomplete and validation via `yaml-language-server`. Previously, schemas like `project-config` accepted anything due to `.passthrough()` and missing `required` fields.
13
+ - Hook definitions require `hooks` array with at least 1 action
14
+ - Agent `tools` requires at least 1 entry
15
+ - Marketplace `name`/`version` reject empty strings; `plugins` requires at least 1 entry
16
+ - Stack `id`/`name` reject empty strings; `stacks` array requires at least 1 entry
17
+ - Relationship rules enforce minimum skill counts (`conflicts`/`discourages` need 2+)
18
+ - Plugin manifest uses strict validation schema (rejects unknown fields)
19
+ - Project config and source config use dedicated validation schemas with `required` fields and `additionalProperties: false`
20
+
21
+ ## [0.29.3] - 2026-02-15
22
+
23
+ ### Fixed
24
+
25
+ - **Wrong YAML schema on generated config.yaml** — `cc init` embedded a `$schema` comment pointing to `project-source-config.schema.json` (marketplace source fields) instead of `project-config.schema.json` (consumer project fields like `name`, `agents`, `stack`, `skills`). Added new `project-config.schema.json` generated from `projectConfigLoaderSchema` and fixed the reference.
26
+
27
+ ## [0.29.2] - 2026-02-15
28
+
29
+ ### Added
30
+
31
+ - **Multi-skill stack assignments in project config** — `ProjectConfig.stack` now stores `SkillAssignment[]` per subcategory (matching `stacks.yaml` format) instead of a single `SkillId`. Enables multiple skills per subcategory with `preloaded` flags preserved through the full pipeline. Config YAML accepts bare strings, objects, and arrays interchangeably.
32
+ - **Stack normalization at load time** — `loadProjectConfig` normalizes stack values to `SkillAssignment[]` using shared `normalizeStackRecord` helper (same as `loadStacks`).
33
+ - **Compact YAML serialization** — `compactStackForYaml` produces minimal output: bare strings for simple skills, objects for preloaded, arrays for multi-skill subcategories.
34
+ - **`getStackSkillIds` utility** — Extracts unique skill IDs from a stack config record using Remeda pipe. Used by `compile`, `doctor`, and `stack-plugin-compiler`.
35
+
36
+ ### Changed
37
+
38
+ - **`buildStackProperty` preserves full assignments** — No longer extracts only the first skill ID per subcategory; preserves all `SkillAssignment[]` entries with preloaded flags.
39
+ - **`buildSkillRefsFromConfig` delegates to `resolveAgentConfigToSkills`** — Removed manual iteration in favor of the existing typed helper, preserving preloaded flags from assignments.
40
+ - **Schema widened** — `projectConfigLoaderSchema.stack` accepts the same 3 YAML formats as `stackSchema`: bare string, single object with preloaded, and array of mixed elements.
41
+
42
+ ### Fixed
43
+
44
+ - **`hashStackConfig` produced objects instead of IDs** — `Object.values()` on `SkillAssignment[]` yielded assignment objects instead of skill IDs; now uses `getStackSkillIds()`.
45
+ - **YAML schema references unreachable** — `yaml-language-server` `$schema` comments pointed to `node_modules/@claude-collective/cli/...` which only worked if the CLI was installed as a dependency. Now uses `raw.githubusercontent.com` URLs that resolve for any consumer.
46
+ - **`compileStackPlugin` skill extraction** — Same `Object.values()` bug fixed with `getStackSkillIds()`.
47
+
48
+ ## [0.29.1] - 2026-02-15
49
+
50
+ ### Fixed
51
+
52
+ - **Regex unicode flags** — Added `u` flag to control character regexes in `exec.ts` and `config.ts` for proper Unicode handling.
53
+ - **Switch default cases** — Added default cases to switch statements in `config.ts`, `plugin-version.ts`, `doctor.ts`, `eject.ts`, and `compile.ts`. Uses exhaustive `never` check for version bump type.
54
+ - **Unused variables** — Removed unused imports and variables in `multi-source-loader.ts`, test helpers, and integration tests.
55
+
56
+ ### Changed
57
+
58
+ - **Template literals** — Converted string concatenation to template literals, removed useless backtick strings without interpolation, and merged adjacent string literals across 13 production files.
59
+ - **Control flow simplification** — Replaced logical AND chains with optional chaining in `matrix-resolver.ts`, removed redundant returns in wizard components, simplified boolean return patterns in `source-switcher.ts` and search components.
60
+ - **Type cleanup** — Removed unnecessary explicit type annotations, reordered default parameters after required parameters in `eject.ts`, extracted `discoverValidSkills` to module-level function in `import/skill.ts`.
61
+
62
+ ## [0.29.0] - 2026-02-15
63
+
64
+ ### Added
65
+
66
+ - **Shared utility modules** — Extracted `errors.ts`, `yaml.ts`, `messages.ts` into `src/cli/utils/` with full test coverage. Centralized metadata keys in `metadata-keys.ts`. Added `readFileSafe()` to `fs.ts` and `log()` to `logger.ts`.
67
+ - **Expanded Zod schemas** — 30+ schemas covering all JSON/YAML parsing boundaries with field-level JSDoc. New `formatZodErrors` helper for user-friendly validation messages.
68
+ - **Integration test suites** — New integration tests for import-skill, init-flow, source-switching, wizard-init-compile pipeline, and skill-resolution. Consolidated test helpers with `SKILL_FIXTURES`, `getTestSkill`, `createTestSource`. Test fixture files under `test/fixtures/`.
69
+ - **Documentation** — `type-conventions.md` (union type rules, ID formats), `clean-code-standards.md` (code quality guidelines), expanded `architecture.md` and `commands.md`.
70
+
71
+ ### Changed
72
+
73
+ - **Union types documented** — Added JSDoc field documentation to `DomainSelections`, `CategoryMap`, `CategoryDefinition`, `SubcategorySelections`, `ResolvedSubcategorySkills`, `SkillAssignment`.
74
+ - **Library decomposition** — Decomposed large functions across resolver, agent-recompiler, matrix-resolver, matrix-loader, plugin-validator, plugin-finder, compiler, and versioning modules. Added JSDoc documentation throughout.
75
+ - **Command standardization** — All CLI commands use consistent error handling via `handleError` base method, typed exit codes, and usage examples in descriptions.
76
+ - **Wizard refactoring** — Extracted 11 custom hooks, 3 subcomponents (`domain-selection`, `stack-selection`, `help-modal`), and `build-step-logic` module. Wizard store decomposed into focused action groups.
77
+ - **Barrel exports removed** — Deleted `themes/index.ts` and `common/index.ts` barrel files in favor of direct imports.
78
+ - **Consolidated constants** — `CLI_COLORS`, `STANDARD_FILES`, `STANDARD_DIRS`, `MAX_CONFIG_FILE_SIZE` centralized in `consts.ts`.
79
+
80
+ ### Fixed
81
+
82
+ - **Path traversal hardening** — `source-switcher`: `validateSkillId`, `validatePathBoundary`, TOCTOU race fix. `skill-copier`: `validateSkillPath`, `resolveSkillPath` boundary checks.
83
+ - **Input validation** — `config.ts`: `validateSourceFormat`, SSRF prevention, UNC path blocking. `exec.ts`: argument length, format, and control character validation.
84
+ - **Template injection** — Compiler Liquid template sanitization with function decomposition.
85
+ - **Source fetcher limits** — File size limits, nesting depth guards, SHA256 cache keys.
86
+
87
+ ### Removed
88
+
89
+ - **`validator.ts`** — Replaced by `schema-validator.ts` and `output-validator.ts`.
90
+
91
+ ## [0.28.0] - 2026-02-13
92
+
93
+ ### Added
94
+
95
+ - **Explicit preloaded booleans in stacks** — `StackAgentConfig` uses `SkillAssignment[]` with explicit `preloaded: true/false` on each skill instead of inferring from `KEY_SUBCATEGORIES`. Normalization at the `loadStacks()` parse boundary accepts bare strings, objects, or arrays.
96
+ - **Auto-default plugin mode** — Wizard defaults to plugin install mode when a marketplace source is detected. `initialInstallMode` prop passed from `cc init`.
97
+ - **Marketplace indicator** — Wizard header shows marketplace label (e.g., "Photoroom + 1 public") via `getMarketplaceLabel()` utility.
98
+ - **Published JSON schemas** — `src/schemas/` included in npm package. IDE-friendly `# yaml-language-server: $schema=...` comments embedded in generated config files (`.claude-src/config.yaml`, `metadata.yaml`). `SCHEMA_PATHS` constants and `yamlSchemaComment()` helper in `consts.ts`.
99
+ - **Project-source-config JSON schema** — New `project-source-config.schema.json` for `.claude-src/config.yaml` validation in editors.
100
+ - **Extended `cc validate`** — 6 new validation targets: stacks config, project source config, project skill metadata/frontmatter, project agent frontmatter, and plugin manifests. Total 7 → 13 targets. Works in both CLI repo and user projects.
101
+
102
+ ### Changed
103
+
104
+ - **`StackAgentConfig` type** — Changed from `Partial<Record<Subcategory, SkillId[]>>` to `Partial<Record<Subcategory, SkillAssignment[]>>`.
105
+ - **`KEY_SUBCATEGORIES` removed** — Replaced by explicit `preloaded` field on each skill assignment in `config/stacks.yaml`.
106
+ - **JSON schema `$id` URLs** — Changed from placeholder `claude-collective.local` domain to relative `schemas/*.schema.json` paths.
107
+ - **Stack domain filtering spec rewritten** — Unified wizard first step with stacks and scratch as peers in the same list.
108
+
109
+ ## [0.27.0] - 2026-02-13
110
+
111
+ ### Added
112
+
113
+ - **Stacks use skill IDs** — `config/stacks.yaml` agent configs now reference skills by full skill ID (e.g., `web-framework-react`) instead of display name alias (e.g., `react`). This eliminates the `displayNameToId` resolution step at every stack loading call site.
114
+ - **Config-driven source loading** — Marketplace repos can declare custom resource paths (`skills_dir`, `agents_dir`, `stacks_file`, `matrix_file`) in `.claude-src/config.yaml` instead of following the default layout conventions. Source loader reads path overrides and falls back to convention defaults.
115
+ - **Stack domain filtering spec** — `docs/stack-domain-filtering-spec.md` details the planned domain selection UX after stack choice.
116
+ - **Multi-skill categories findings** — `docs/multi-skill-categories-findings.md` documents analysis of skills that span multiple categories.
117
+
118
+ ### Changed
119
+
120
+ - **`StackAgentConfig` value type** — Changed from `SkillDisplayName` to `SkillId`, matching the stacks.yaml data migration.
121
+ - **`resolveStackSkillsFromDisplayNames` renamed** — Now `resolveStackSkills`, reflecting that no alias resolution is needed.
122
+ - **`displayNameToId` threading removed** — Removed from `resolveAgentConfigToSkills`, `buildStackProperty`, `getAgentSkills`, `resolveAgents`, `stackToResolvedStack`, and `populateFromStack`. Net ~70 lines removed.
123
+ - **Source loader DRYed** — Extracted shared `loadAndMergeFromBasePath` to eliminate duplicated local/remote loading logic.
124
+
125
+ ## [0.26.1] - 2026-02-13
126
+
127
+ ### Fixed
128
+
129
+ - **Metadata version coercion** — `cc build plugins` no longer warns on `version: 1` in metadata.yaml. Added lenient `skillMetadataLoaderSchema` that coerces YAML numeric versions to strings.
130
+ - **Stack lookup from source in plugin mode** — `compileStackPlugin` now resolves stacks from the source's `config/stacks.yaml` before falling back to the CLI's built-in stacks. Fixes "stack not found" error when running `cc init --source` with a private marketplace in plugin mode.
131
+ - **Skills matrix fallback** — Stack compiler gracefully falls back to CLI matrix when the source's `config/skills-matrix.yaml` is missing or invalid.
132
+
8
133
  ## [0.26.0] - 2026-02-13
9
134
 
10
135
  ### Added
package/README.md CHANGED
@@ -39,14 +39,14 @@ requires node 18+ and [Claude Code](https://docs.anthropic.com/en/docs/claude-co
39
39
  | `update` | update local skills from source |
40
40
  | `list` | show what's installed |
41
41
  | `doctor` | diagnose setup issues |
42
- | `search` | search for skills |
42
+ | `search` | search skills (interactive multi-source or static query) |
43
43
  | `info <skill>` | show skill details |
44
44
  | `diff` | show skill differences vs source |
45
45
  | `outdated` | check for outdated skills |
46
46
  | `validate` | check your setup is correct |
47
47
  | `new skill` | create a custom skill |
48
48
  | `new agent` | create a custom agent |
49
- | `import skill` | import a skill from a remote source |
49
+ | `import skill` | import a skill from an external GitHub repository |
50
50
  | `eject` | eject skills/agent partials for customization |
51
51
  | `uninstall` | remove Claude Collective from project |
52
52
  | `config` | manage settings (show, get, set-project, unset-project, path) |
@@ -87,32 +87,66 @@ stacks bundle skills together with pre-configured agents. instead of picking 20
87
87
 
88
88
  each stack includes agents like `web-developer`, `api-developer`, `web-reviewer`, `web-tester`, `web-researcher`, `pattern-scout`, `documentor` - roles that use the right skills for the job.
89
89
 
90
- ## installation options
90
+ ## installation modes
91
91
 
92
- **as a plugin** (recommended for personal use):
92
+ the wizard starts by asking how you want to set up:
93
+
94
+ **use a stack** (default):
93
95
 
94
96
  ```bash
95
97
  npx @claude-collective/cli init
96
- # interactive wizard lets you choose: plugin mode, local mode, or marketplace setup
97
- # plugin mode installs to ./.claude/plugins/claude-collective/
98
+ # select "Use a stack" pick a pre-built stack (e.g. nextjs-fullstack)
99
+ # installs as a native Claude Code plugin to ./.claude/plugins/claude-collective/
100
+ # you can customize skills after selecting a stack
98
101
  ```
99
102
 
100
- **locally in your project** (for team sharing):
103
+ **start from scratch** (pick individual skills):
101
104
 
102
105
  ```bash
103
106
  npx @claude-collective/cli init
104
- # select "local" mode in the wizard
105
- # installs to ./.claude/ in your repo
107
+ # select "Start from scratch" browse domains and pick skills one by one
108
+ # installs locally to ./.claude/skills/ in your repo
106
109
  ```
107
110
 
108
- **your own marketplace** (for orgs):
111
+ both modes compile agents and generate a config at `.claude-src/config.yaml`. use `cc edit` to change skills after initial setup.
112
+
113
+ ## multi-source setup
114
+
115
+ you can install skills from multiple sources. the wizard supports adding extra marketplaces alongside the default source:
116
+
117
+ - press `G` in the wizard to open source settings
118
+ - add marketplace URLs (e.g. `github:your-org/custom-marketplace`)
119
+ - skills from all sources appear in the selection grid, tagged by origin
120
+
121
+ you can also manage sources after setup with `cc edit` (same `G` hotkey).
122
+
123
+ to search across all configured sources:
109
124
 
110
125
  ```bash
111
- npx @claude-collective/cli init
112
- # select "marketplace" mode in the wizard
113
- # scaffolds a marketplace you can customize and host
126
+ # interactive search across all sources
127
+ cc search
128
+
129
+ # static search with a query
130
+ cc search react
114
131
  ```
115
132
 
133
+ ## importing third-party skills
134
+
135
+ import skills from any GitHub repository into your local setup:
136
+
137
+ ```bash
138
+ # list available skills from a repository
139
+ cc import skill github:vercel-labs/agent-skills --list
140
+
141
+ # import a specific skill
142
+ cc import skill github:vercel-labs/agent-skills --skill react-best-practices
143
+
144
+ # import all skills from a repository
145
+ cc import skill github:vercel-labs/agent-skills --all
146
+ ```
147
+
148
+ imported skills are copied to `.claude/skills/` and tracked with metadata for future updates.
149
+
116
150
  ## creating custom skills
117
151
 
118
152
  if the existing skills don't cover what you need: