loadouts 0.1.11

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 (261) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +108 -0
  3. package/bundled/loadouts/loadouts.yaml +5 -0
  4. package/bundled/skills/loadout-usage/SKILL.md +110 -0
  5. package/dist/builtins/index.d.ts +14 -0
  6. package/dist/builtins/index.d.ts.map +1 -0
  7. package/dist/builtins/index.js +58 -0
  8. package/dist/builtins/index.js.map +1 -0
  9. package/dist/builtins/kinds/extension.d.ts +3 -0
  10. package/dist/builtins/kinds/extension.d.ts.map +1 -0
  11. package/dist/builtins/kinds/extension.js +9 -0
  12. package/dist/builtins/kinds/extension.js.map +1 -0
  13. package/dist/builtins/kinds/instruction.d.ts +3 -0
  14. package/dist/builtins/kinds/instruction.d.ts.map +1 -0
  15. package/dist/builtins/kinds/instruction.js +8 -0
  16. package/dist/builtins/kinds/instruction.js.map +1 -0
  17. package/dist/builtins/kinds/prompt.d.ts +3 -0
  18. package/dist/builtins/kinds/prompt.d.ts.map +1 -0
  19. package/dist/builtins/kinds/prompt.js +8 -0
  20. package/dist/builtins/kinds/prompt.js.map +1 -0
  21. package/dist/builtins/kinds/rule.d.ts +3 -0
  22. package/dist/builtins/kinds/rule.d.ts.map +1 -0
  23. package/dist/builtins/kinds/rule.js +10 -0
  24. package/dist/builtins/kinds/rule.js.map +1 -0
  25. package/dist/builtins/kinds/skill.d.ts +3 -0
  26. package/dist/builtins/kinds/skill.d.ts.map +1 -0
  27. package/dist/builtins/kinds/skill.js +8 -0
  28. package/dist/builtins/kinds/skill.js.map +1 -0
  29. package/dist/builtins/kinds/theme.d.ts +3 -0
  30. package/dist/builtins/kinds/theme.d.ts.map +1 -0
  31. package/dist/builtins/kinds/theme.js +8 -0
  32. package/dist/builtins/kinds/theme.js.map +1 -0
  33. package/dist/builtins/tools/claude-code.d.ts +3 -0
  34. package/dist/builtins/tools/claude-code.d.ts.map +1 -0
  35. package/dist/builtins/tools/claude-code.js +30 -0
  36. package/dist/builtins/tools/claude-code.js.map +1 -0
  37. package/dist/builtins/tools/codex.d.ts +3 -0
  38. package/dist/builtins/tools/codex.d.ts.map +1 -0
  39. package/dist/builtins/tools/codex.js +17 -0
  40. package/dist/builtins/tools/codex.js.map +1 -0
  41. package/dist/builtins/tools/cursor.d.ts +3 -0
  42. package/dist/builtins/tools/cursor.d.ts.map +1 -0
  43. package/dist/builtins/tools/cursor.js +22 -0
  44. package/dist/builtins/tools/cursor.js.map +1 -0
  45. package/dist/builtins/tools/opencode.d.ts +3 -0
  46. package/dist/builtins/tools/opencode.d.ts.map +1 -0
  47. package/dist/builtins/tools/opencode.js +45 -0
  48. package/dist/builtins/tools/opencode.js.map +1 -0
  49. package/dist/builtins/tools/pi.d.ts +3 -0
  50. package/dist/builtins/tools/pi.d.ts.map +1 -0
  51. package/dist/builtins/tools/pi.js +22 -0
  52. package/dist/builtins/tools/pi.js.map +1 -0
  53. package/dist/cli/commands/activate.d.ts +12 -0
  54. package/dist/cli/commands/activate.d.ts.map +1 -0
  55. package/dist/cli/commands/activate.js +70 -0
  56. package/dist/cli/commands/activate.js.map +1 -0
  57. package/dist/cli/commands/check.d.ts +12 -0
  58. package/dist/cli/commands/check.d.ts.map +1 -0
  59. package/dist/cli/commands/check.js +152 -0
  60. package/dist/cli/commands/check.js.map +1 -0
  61. package/dist/cli/commands/clear.d.ts +12 -0
  62. package/dist/cli/commands/clear.d.ts.map +1 -0
  63. package/dist/cli/commands/clear.js +25 -0
  64. package/dist/cli/commands/clear.js.map +1 -0
  65. package/dist/cli/commands/create.d.ts +11 -0
  66. package/dist/cli/commands/create.d.ts.map +1 -0
  67. package/dist/cli/commands/create.js +113 -0
  68. package/dist/cli/commands/create.js.map +1 -0
  69. package/dist/cli/commands/deactivate.d.ts +12 -0
  70. package/dist/cli/commands/deactivate.d.ts.map +1 -0
  71. package/dist/cli/commands/deactivate.js +67 -0
  72. package/dist/cli/commands/deactivate.js.map +1 -0
  73. package/dist/cli/commands/diff.d.ts +16 -0
  74. package/dist/cli/commands/diff.d.ts.map +1 -0
  75. package/dist/cli/commands/diff.js +144 -0
  76. package/dist/cli/commands/diff.js.map +1 -0
  77. package/dist/cli/commands/docs.d.ts +12 -0
  78. package/dist/cli/commands/docs.d.ts.map +1 -0
  79. package/dist/cli/commands/docs.js +115 -0
  80. package/dist/cli/commands/docs.js.map +1 -0
  81. package/dist/cli/commands/edit.d.ts +11 -0
  82. package/dist/cli/commands/edit.d.ts.map +1 -0
  83. package/dist/cli/commands/edit.js +71 -0
  84. package/dist/cli/commands/edit.js.map +1 -0
  85. package/dist/cli/commands/fallback.d.ts +9 -0
  86. package/dist/cli/commands/fallback.d.ts.map +1 -0
  87. package/dist/cli/commands/fallback.js +35 -0
  88. package/dist/cli/commands/fallback.js.map +1 -0
  89. package/dist/cli/commands/info.d.ts +23 -0
  90. package/dist/cli/commands/info.d.ts.map +1 -0
  91. package/dist/cli/commands/info.js +314 -0
  92. package/dist/cli/commands/info.js.map +1 -0
  93. package/dist/cli/commands/init.d.ts +18 -0
  94. package/dist/cli/commands/init.d.ts.map +1 -0
  95. package/dist/cli/commands/init.js +255 -0
  96. package/dist/cli/commands/init.js.map +1 -0
  97. package/dist/cli/commands/install.d.ts +27 -0
  98. package/dist/cli/commands/install.d.ts.map +1 -0
  99. package/dist/cli/commands/install.js +586 -0
  100. package/dist/cli/commands/install.js.map +1 -0
  101. package/dist/cli/commands/instructions.d.ts +8 -0
  102. package/dist/cli/commands/instructions.d.ts.map +1 -0
  103. package/dist/cli/commands/instructions.js +218 -0
  104. package/dist/cli/commands/instructions.js.map +1 -0
  105. package/dist/cli/commands/kinds.d.ts +6 -0
  106. package/dist/cli/commands/kinds.d.ts.map +1 -0
  107. package/dist/cli/commands/kinds.js +59 -0
  108. package/dist/cli/commands/kinds.js.map +1 -0
  109. package/dist/cli/commands/list.d.ts +12 -0
  110. package/dist/cli/commands/list.d.ts.map +1 -0
  111. package/dist/cli/commands/list.js +182 -0
  112. package/dist/cli/commands/list.js.map +1 -0
  113. package/dist/cli/commands/policy.d.ts +28 -0
  114. package/dist/cli/commands/policy.d.ts.map +1 -0
  115. package/dist/cli/commands/policy.js +50 -0
  116. package/dist/cli/commands/policy.js.map +1 -0
  117. package/dist/cli/commands/remove.d.ts +24 -0
  118. package/dist/cli/commands/remove.d.ts.map +1 -0
  119. package/dist/cli/commands/remove.js +64 -0
  120. package/dist/cli/commands/remove.js.map +1 -0
  121. package/dist/cli/commands/render-engine.d.ts +36 -0
  122. package/dist/cli/commands/render-engine.d.ts.map +1 -0
  123. package/dist/cli/commands/render-engine.js +177 -0
  124. package/dist/cli/commands/render-engine.js.map +1 -0
  125. package/dist/cli/commands/rule.d.ts +11 -0
  126. package/dist/cli/commands/rule.d.ts.map +1 -0
  127. package/dist/cli/commands/rule.js +302 -0
  128. package/dist/cli/commands/rule.js.map +1 -0
  129. package/dist/cli/commands/sanitize.d.ts +14 -0
  130. package/dist/cli/commands/sanitize.d.ts.map +1 -0
  131. package/dist/cli/commands/sanitize.js +62 -0
  132. package/dist/cli/commands/sanitize.js.map +1 -0
  133. package/dist/cli/commands/skill.d.ts +11 -0
  134. package/dist/cli/commands/skill.d.ts.map +1 -0
  135. package/dist/cli/commands/skill.js +380 -0
  136. package/dist/cli/commands/skill.js.map +1 -0
  137. package/dist/cli/commands/status.d.ts +26 -0
  138. package/dist/cli/commands/status.d.ts.map +1 -0
  139. package/dist/cli/commands/status.js +454 -0
  140. package/dist/cli/commands/status.js.map +1 -0
  141. package/dist/cli/commands/sync.d.ts +14 -0
  142. package/dist/cli/commands/sync.d.ts.map +1 -0
  143. package/dist/cli/commands/sync.js +53 -0
  144. package/dist/cli/commands/sync.js.map +1 -0
  145. package/dist/cli/commands/update.d.ts +3 -0
  146. package/dist/cli/commands/update.d.ts.map +1 -0
  147. package/dist/cli/commands/update.js +48 -0
  148. package/dist/cli/commands/update.js.map +1 -0
  149. package/dist/cli/index.d.ts +11 -0
  150. package/dist/cli/index.d.ts.map +1 -0
  151. package/dist/cli/index.js +134 -0
  152. package/dist/cli/index.js.map +1 -0
  153. package/dist/core/config.d.ts +64 -0
  154. package/dist/core/config.d.ts.map +1 -0
  155. package/dist/core/config.js +166 -0
  156. package/dist/core/config.js.map +1 -0
  157. package/dist/core/discovery.d.ts +50 -0
  158. package/dist/core/discovery.d.ts.map +1 -0
  159. package/dist/core/discovery.js +249 -0
  160. package/dist/core/discovery.js.map +1 -0
  161. package/dist/core/fallback.d.ts +23 -0
  162. package/dist/core/fallback.d.ts.map +1 -0
  163. package/dist/core/fallback.js +119 -0
  164. package/dist/core/fallback.js.map +1 -0
  165. package/dist/core/import-discovery.d.ts +56 -0
  166. package/dist/core/import-discovery.d.ts.map +1 -0
  167. package/dist/core/import-discovery.js +304 -0
  168. package/dist/core/import-discovery.js.map +1 -0
  169. package/dist/core/kindLoader.d.ts +119 -0
  170. package/dist/core/kindLoader.d.ts.map +1 -0
  171. package/dist/core/kindLoader.js +141 -0
  172. package/dist/core/kindLoader.js.map +1 -0
  173. package/dist/core/manifest.d.ts +39 -0
  174. package/dist/core/manifest.d.ts.map +1 -0
  175. package/dist/core/manifest.js +167 -0
  176. package/dist/core/manifest.js.map +1 -0
  177. package/dist/core/plugin.d.ts +22 -0
  178. package/dist/core/plugin.d.ts.map +1 -0
  179. package/dist/core/plugin.js +20 -0
  180. package/dist/core/plugin.js.map +1 -0
  181. package/dist/core/registry.d.ts +115 -0
  182. package/dist/core/registry.d.ts.map +1 -0
  183. package/dist/core/registry.js +105 -0
  184. package/dist/core/registry.js.map +1 -0
  185. package/dist/core/render.d.ts +64 -0
  186. package/dist/core/render.d.ts.map +1 -0
  187. package/dist/core/render.js +457 -0
  188. package/dist/core/render.js.map +1 -0
  189. package/dist/core/resolve.d.ts +39 -0
  190. package/dist/core/resolve.d.ts.map +1 -0
  191. package/dist/core/resolve.js +128 -0
  192. package/dist/core/resolve.js.map +1 -0
  193. package/dist/core/schema.d.ts +308 -0
  194. package/dist/core/schema.d.ts.map +1 -0
  195. package/dist/core/schema.js +81 -0
  196. package/dist/core/schema.js.map +1 -0
  197. package/dist/core/scope.d.ts +74 -0
  198. package/dist/core/scope.d.ts.map +1 -0
  199. package/dist/core/scope.js +176 -0
  200. package/dist/core/scope.js.map +1 -0
  201. package/dist/core/template.d.ts +32 -0
  202. package/dist/core/template.d.ts.map +1 -0
  203. package/dist/core/template.js +32 -0
  204. package/dist/core/template.js.map +1 -0
  205. package/dist/core/tokens.d.ts +33 -0
  206. package/dist/core/tokens.d.ts.map +1 -0
  207. package/dist/core/tokens.js +97 -0
  208. package/dist/core/tokens.js.map +1 -0
  209. package/dist/core/types.d.ts +103 -0
  210. package/dist/core/types.d.ts.map +1 -0
  211. package/dist/core/types.js +10 -0
  212. package/dist/core/types.js.map +1 -0
  213. package/dist/index.d.ts +12 -0
  214. package/dist/index.d.ts.map +1 -0
  215. package/dist/index.js +24 -0
  216. package/dist/index.js.map +1 -0
  217. package/dist/lib/artifact-paths.d.ts +39 -0
  218. package/dist/lib/artifact-paths.d.ts.map +1 -0
  219. package/dist/lib/artifact-paths.js +83 -0
  220. package/dist/lib/artifact-paths.js.map +1 -0
  221. package/dist/lib/artifact-table.d.ts +126 -0
  222. package/dist/lib/artifact-table.d.ts.map +1 -0
  223. package/dist/lib/artifact-table.js +263 -0
  224. package/dist/lib/artifact-table.js.map +1 -0
  225. package/dist/lib/editor.d.ts +17 -0
  226. package/dist/lib/editor.d.ts.map +1 -0
  227. package/dist/lib/editor.js +33 -0
  228. package/dist/lib/editor.js.map +1 -0
  229. package/dist/lib/fs.d.ts +87 -0
  230. package/dist/lib/fs.d.ts.map +1 -0
  231. package/dist/lib/fs.js +229 -0
  232. package/dist/lib/fs.js.map +1 -0
  233. package/dist/lib/git.d.ts +13 -0
  234. package/dist/lib/git.d.ts.map +1 -0
  235. package/dist/lib/git.js +28 -0
  236. package/dist/lib/git.js.map +1 -0
  237. package/dist/lib/gitignore.d.ts +26 -0
  238. package/dist/lib/gitignore.d.ts.map +1 -0
  239. package/dist/lib/gitignore.js +97 -0
  240. package/dist/lib/gitignore.js.map +1 -0
  241. package/dist/lib/loadout-column.d.ts +66 -0
  242. package/dist/lib/loadout-column.d.ts.map +1 -0
  243. package/dist/lib/loadout-column.js +66 -0
  244. package/dist/lib/loadout-column.js.map +1 -0
  245. package/dist/lib/output.d.ts +15 -0
  246. package/dist/lib/output.d.ts.map +1 -0
  247. package/dist/lib/output.js +32 -0
  248. package/dist/lib/output.js.map +1 -0
  249. package/dist/lib/scope-indicators.d.ts +60 -0
  250. package/dist/lib/scope-indicators.d.ts.map +1 -0
  251. package/dist/lib/scope-indicators.js +110 -0
  252. package/dist/lib/scope-indicators.js.map +1 -0
  253. package/docs/authoring.md +182 -0
  254. package/docs/commands.md +192 -0
  255. package/docs/concepts.md +114 -0
  256. package/docs/index.md +60 -0
  257. package/docs/quickstart.md +100 -0
  258. package/docs/troubleshooting.md +147 -0
  259. package/docs/visual-language.md +251 -0
  260. package/docs/workflows.md +184 -0
  261. package/package.json +54 -0
@@ -0,0 +1,62 @@
1
+ /**
2
+ * loadout sanitize — Sanitize artifacts for cross-tool compatibility.
3
+ *
4
+ * Currently sanitizes:
5
+ * - Rule frontmatter: ensures both `paths` and `globs` are present
6
+ *
7
+ * Scope flags:
8
+ * -l / --local → project scope only
9
+ * -g / --global → global scope only
10
+ * -a / --all → both scopes (default)
11
+ */
12
+ import { Command } from "commander";
13
+ import * as path from "node:path";
14
+ import { resolveContexts, SCOPE_FLAGS } from "../../core/scope.js";
15
+ import { findUnsanitizedRules, sanitizeRuleFile } from "../../core/config.js";
16
+ import { log, heading } from "../../lib/output.js";
17
+ export const sanitizeCommand = new Command("sanitize")
18
+ .description("Sanitize artifacts for cross-tool compatibility")
19
+ .option(...SCOPE_FLAGS.local)
20
+ .option(...SCOPE_FLAGS.global)
21
+ .option(...SCOPE_FLAGS.all)
22
+ .option("--dry-run", "Show what would be sanitized without modifying files")
23
+ .action(async (options) => {
24
+ const { contexts } = await resolveContexts(options);
25
+ let totalFixed = 0;
26
+ let totalSkipped = 0;
27
+ for (const ctx of contexts) {
28
+ const label = ctx.scope === "global" ? "Global" : "Project";
29
+ const unsanitized = findUnsanitizedRules(ctx.configPath);
30
+ if (unsanitized.length === 0) {
31
+ log.dim(`[${ctx.scope}] All rules are already sanitized`);
32
+ continue;
33
+ }
34
+ heading(`${label} rules needing sanitization`);
35
+ for (const name of unsanitized) {
36
+ const rulePath = path.join(ctx.configPath, "rules", `${name}.md`);
37
+ if (options.dryRun) {
38
+ log.dim(` Would sanitize: ${name}`);
39
+ totalSkipped++;
40
+ }
41
+ else {
42
+ sanitizeRuleFile(rulePath);
43
+ log.success(` Sanitized: ${name}`);
44
+ totalFixed++;
45
+ }
46
+ }
47
+ console.log();
48
+ }
49
+ if (options.dryRun) {
50
+ if (totalSkipped > 0) {
51
+ log.info(`${totalSkipped} rule(s) would be sanitized. Run without --dry-run to apply.`);
52
+ }
53
+ }
54
+ else if (totalFixed > 0) {
55
+ log.success(`Sanitized ${totalFixed} rule(s)`);
56
+ log.dim("Run 'loadouts sync' to apply changes to tool directories.");
57
+ }
58
+ else {
59
+ log.success("All artifacts are already sanitized");
60
+ }
61
+ });
62
+ //# sourceMappingURL=sanitize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../../../src/cli/commands/sanitize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,WAAW,EAAmB,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE9E,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAMnD,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;KACnD,WAAW,CAAC,iDAAiD,CAAC;KAC9D,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC;KAC5B,MAAM,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC;KAC7B,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC;KAC1B,MAAM,CAAC,WAAW,EAAE,sDAAsD,CAAC;KAC3E,MAAM,CAAC,KAAK,EAAE,OAAwB,EAAE,EAAE;IACzC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;IAEpD,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5D,MAAM,WAAW,GAAG,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAEzD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,mCAAmC,CAAC,CAAC;YAC1D,SAAS;QACX,CAAC;QAED,OAAO,CAAC,GAAG,KAAK,6BAA6B,CAAC,CAAC;QAE/C,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;YAElE,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,GAAG,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;gBACrC,YAAY,EAAE,CAAC;YACjB,CAAC;iBAAM,CAAC;gBACN,gBAAgB,CAAC,QAAQ,CAAC,CAAC;gBAC3B,GAAG,CAAC,OAAO,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;gBACpC,UAAU,EAAE,CAAC;YACf,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACrB,GAAG,CAAC,IAAI,CAAC,GAAG,YAAY,8DAA8D,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;SAAM,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QAC1B,GAAG,CAAC,OAAO,CAAC,aAAa,UAAU,UAAU,CAAC,CAAC;QAC/C,GAAG,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;IACvE,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC;IACrD,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * loadout skill — Manage skills.
3
+ *
4
+ * Scope flags:
5
+ * -l / --local → project scope
6
+ * -g / --global → global scope
7
+ * (none) → project if in one, else global
8
+ */
9
+ import { Command } from "commander";
10
+ export declare const skillCommand: Command;
11
+ //# sourceMappingURL=skill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/skill.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsEpC,eAAO,MAAM,YAAY,SAAoD,CAAC"}
@@ -0,0 +1,380 @@
1
+ /**
2
+ * loadout skill — Manage skills.
3
+ *
4
+ * Scope flags:
5
+ * -l / --local → project scope
6
+ * -g / --global → global scope
7
+ * (none) → project if in one, else global
8
+ */
9
+ import { Command } from "commander";
10
+ import * as path from "node:path";
11
+ import { fileURLToPath } from "node:url";
12
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
13
+ import * as yaml from "yaml";
14
+ import { findNearestLoadoutRoot, getGlobalConfigPath, } from "../../core/discovery.js";
15
+ import { writeFile, readFile, fileExists, isDirectory, ensureDir, removeDir, copyDir, listFiles, } from "../../lib/fs.js";
16
+ import { parseLoadoutDefinition } from "../../core/config.js";
17
+ import { inProject, hasGlobal } from "../../core/scope.js";
18
+ import { log, heading } from "../../lib/output.js";
19
+ import { openInEditor } from "../../lib/editor.js";
20
+ const SKILLS_DIR = "skills";
21
+ /**
22
+ * Resolve the loadout root path based on scope flags.
23
+ */
24
+ async function resolveRootPath(options, cwd = process.cwd()) {
25
+ if (options.local) {
26
+ const projectRoot = await findNearestLoadoutRoot(cwd);
27
+ if (!projectRoot) {
28
+ throw new Error("Not in a loadout project. Run 'loadouts init' first.");
29
+ }
30
+ return { rootPath: projectRoot.path, scope: "project" };
31
+ }
32
+ if (options.global) {
33
+ if (!hasGlobal()) {
34
+ throw new Error("No global loadout found. Run 'loadouts init --global' first.");
35
+ }
36
+ return { rootPath: getGlobalConfigPath(), scope: "global" };
37
+ }
38
+ // Auto-detect: prefer project if in one
39
+ if (await inProject(cwd)) {
40
+ const projectRoot = await findNearestLoadoutRoot(cwd);
41
+ return { rootPath: projectRoot.path, scope: "project" };
42
+ }
43
+ if (hasGlobal()) {
44
+ return { rootPath: getGlobalConfigPath(), scope: "global" };
45
+ }
46
+ throw new Error("No loadout found. Run 'loadouts init' or 'loadouts init --global' first.");
47
+ }
48
+ export const skillCommand = new Command("skill").description("Manage skills");
49
+ // loadout skill add <name>
50
+ skillCommand
51
+ .command("add")
52
+ .description("Create a new skill")
53
+ .argument("<name>", "Skill name")
54
+ .option("-l, --local", "Project scope")
55
+ .option("-g, --global", "Global scope")
56
+ .option("-d, --description <desc>", "Skill description")
57
+ .option("--no-edit", "Don't open in editor after creating")
58
+ .action(async (name, options) => {
59
+ let rootPath;
60
+ let scope;
61
+ try {
62
+ ({ rootPath, scope } = await resolveRootPath(options));
63
+ }
64
+ catch (err) {
65
+ log.error(err instanceof Error ? err.message : String(err));
66
+ process.exit(1);
67
+ }
68
+ const skillPath = path.join(rootPath, SKILLS_DIR, name);
69
+ const skillMdPath = path.join(skillPath, "SKILL.md");
70
+ if (isDirectory(skillPath)) {
71
+ log.error(`Skill '${name}' already exists in ${scope} scope.`);
72
+ process.exit(1);
73
+ }
74
+ // Create skill directory structure
75
+ ensureDir(skillPath);
76
+ ensureDir(path.join(skillPath, "references"));
77
+ const description = options.description || `${name} skill for AI coding agents`;
78
+ const content = `---
79
+ name: ${name}
80
+ description: ${description}
81
+ ---
82
+
83
+ # ${name}
84
+
85
+ ## Overview
86
+
87
+ Describe what this skill does and when to use it.
88
+
89
+ ## Instructions
90
+
91
+ Provide specific instructions for the AI agent.
92
+
93
+ ## Examples
94
+
95
+ Include examples if helpful.
96
+ `;
97
+ writeFile(skillMdPath, content);
98
+ const scopeLabel = scope === "global" ? "global" : "project";
99
+ log.success(`Created ${scopeLabel} skill: ${name}`);
100
+ // Open in editor unless --no-edit (Commander sets options.edit = false for --no-edit)
101
+ if (options.edit !== false) {
102
+ log.dim(` ${skillPath}/`);
103
+ await openInEditor(skillMdPath, { cwd: rootPath });
104
+ }
105
+ else {
106
+ // For agents/scripts: show clear path and instructions
107
+ console.log();
108
+ console.log(` File: ${skillMdPath}`);
109
+ console.log();
110
+ log.dim(" Replace the template content with your skill, then run 'loadouts sync'");
111
+ }
112
+ });
113
+ // loadout skill list
114
+ skillCommand
115
+ .command("list")
116
+ .description("List skills")
117
+ .option("-l, --local", "Project scope only")
118
+ .option("-g, --global", "Global scope only")
119
+ .option("-a, --all", "Both scopes")
120
+ .action(async (options) => {
121
+ const cwd = process.cwd();
122
+ const roots = [];
123
+ // Determine which scopes to list
124
+ if (options.all || (!options.local && !options.global)) {
125
+ // Show all available
126
+ if (await inProject(cwd)) {
127
+ const projectRoot = await findNearestLoadoutRoot(cwd);
128
+ if (projectRoot) {
129
+ roots.push({ rootPath: projectRoot.path, scope: "project" });
130
+ }
131
+ }
132
+ if (hasGlobal()) {
133
+ roots.push({ rootPath: getGlobalConfigPath(), scope: "global" });
134
+ }
135
+ }
136
+ else if (options.local) {
137
+ const projectRoot = await findNearestLoadoutRoot(cwd);
138
+ if (!projectRoot) {
139
+ log.error("Not in a loadout project.");
140
+ process.exit(1);
141
+ }
142
+ roots.push({ rootPath: projectRoot.path, scope: "project" });
143
+ }
144
+ else if (options.global) {
145
+ if (!hasGlobal()) {
146
+ log.error("No global loadout found.");
147
+ process.exit(1);
148
+ }
149
+ roots.push({ rootPath: getGlobalConfigPath(), scope: "global" });
150
+ }
151
+ if (roots.length === 0) {
152
+ log.error("No loadout found.");
153
+ process.exit(1);
154
+ }
155
+ for (const { rootPath, scope } of roots) {
156
+ const skillsDir = path.join(rootPath, SKILLS_DIR);
157
+ const skills = listFiles(skillsDir).filter((f) => isDirectory(path.join(skillsDir, f)));
158
+ const scopeLabel = scope === "global" ? "Global skills" : "Project skills";
159
+ heading(scopeLabel);
160
+ if (skills.length === 0) {
161
+ log.dim(" No skills defined.");
162
+ const flag = scope === "global" ? " -g" : "";
163
+ log.dim(` Create one with: loadout skill add <name>${flag}`);
164
+ console.log();
165
+ continue;
166
+ }
167
+ for (const name of skills) {
168
+ const skillPath = path.join(skillsDir, name);
169
+ const skillMdPath = path.join(skillPath, "SKILL.md");
170
+ try {
171
+ if (fileExists(skillMdPath)) {
172
+ const content = readFile(skillMdPath);
173
+ // Extract description from frontmatter
174
+ const match = content.match(/description:\s*(.+)/);
175
+ const desc = match ? match[1].trim() : "";
176
+ console.log(` ${name}`);
177
+ if (desc) {
178
+ log.dim(` ${desc}`);
179
+ }
180
+ }
181
+ else {
182
+ console.log(` ${name} (missing SKILL.md)`);
183
+ }
184
+ }
185
+ catch {
186
+ console.log(` ${name} (error reading)`);
187
+ }
188
+ }
189
+ console.log();
190
+ }
191
+ });
192
+ // loadout skill edit <name>
193
+ skillCommand
194
+ .command("edit")
195
+ .description("Edit a skill's SKILL.md in $EDITOR")
196
+ .argument("<name>", "Skill name")
197
+ .option("-l, --local", "Project scope")
198
+ .option("-g, --global", "Global scope")
199
+ .action(async (name, options) => {
200
+ let rootPath;
201
+ let scope;
202
+ try {
203
+ ({ rootPath, scope } = await resolveRootPath(options));
204
+ }
205
+ catch (err) {
206
+ log.error(err instanceof Error ? err.message : String(err));
207
+ process.exit(1);
208
+ }
209
+ const skillPath = path.join(rootPath, SKILLS_DIR, name);
210
+ const skillMdPath = path.join(skillPath, "SKILL.md");
211
+ if (!isDirectory(skillPath)) {
212
+ log.error(`Skill '${name}' not found in ${scope} scope.`);
213
+ process.exit(1);
214
+ }
215
+ if (!fileExists(skillMdPath)) {
216
+ log.error(`Skill '${name}' is missing SKILL.md.`);
217
+ process.exit(1);
218
+ }
219
+ await openInEditor(skillMdPath, {
220
+ cwd: rootPath,
221
+ onSuccess: () => log.success(`Edited skill: ${name}`),
222
+ });
223
+ });
224
+ // loadout skill remove <name>
225
+ skillCommand
226
+ .command("remove")
227
+ .description("Remove a skill")
228
+ .argument("<name>", "Skill name")
229
+ .option("-l, --local", "Project scope")
230
+ .option("-g, --global", "Global scope")
231
+ .option("-f, --force", "Skip confirmation")
232
+ .action(async (name, options) => {
233
+ let rootPath;
234
+ let scope;
235
+ try {
236
+ ({ rootPath, scope } = await resolveRootPath(options));
237
+ }
238
+ catch (err) {
239
+ log.error(err instanceof Error ? err.message : String(err));
240
+ process.exit(1);
241
+ }
242
+ const skillPath = path.join(rootPath, SKILLS_DIR, name);
243
+ if (!isDirectory(skillPath)) {
244
+ log.error(`Skill '${name}' not found in ${scope} scope.`);
245
+ process.exit(1);
246
+ }
247
+ if (!options.force) {
248
+ log.warn(`This will delete: ${skillPath}/`);
249
+ log.dim("Use --force to skip this warning.");
250
+ process.exit(1);
251
+ }
252
+ removeDir(skillPath);
253
+ log.success(`Removed skill: ${name} (${scope})`);
254
+ });
255
+ /** Find the bundled skills directory. */
256
+ function findBundledSkillsPath() {
257
+ const candidates = [
258
+ // Development: relative to src/cli/commands/
259
+ path.resolve(__dirname, "../../../bundled/skills"),
260
+ // Production: relative to dist/cli/commands/
261
+ path.resolve(__dirname, "../../../bundled/skills"),
262
+ ];
263
+ for (const candidate of candidates) {
264
+ if (isDirectory(candidate)) {
265
+ return candidate;
266
+ }
267
+ }
268
+ return null;
269
+ }
270
+ /** List available bundled skills. */
271
+ function listBundledSkills() {
272
+ const bundledPath = findBundledSkillsPath();
273
+ if (!bundledPath)
274
+ return [];
275
+ return listFiles(bundledPath).filter((f) => isDirectory(path.join(bundledPath, f)));
276
+ }
277
+ // loadout skill import <path>
278
+ skillCommand
279
+ .command("import")
280
+ .description("Import an existing skill directory into loadout")
281
+ .argument("[path]", "Path to existing skill directory (or use --builtin)")
282
+ .option("-l, --local", "Project scope")
283
+ .option("-g, --global", "Global scope")
284
+ .option("--builtin <name>", "Import a bundled skill (e.g., loadout-usage)")
285
+ .option("--list-builtins", "List available bundled skills")
286
+ .option("--loadout <name>", "Loadout to add skill to", "base")
287
+ .option("--keep", "Keep original directory (don't delete after import)")
288
+ .action(async (dirPath, options) => {
289
+ // Handle --list-builtins
290
+ if (options.listBuiltins) {
291
+ const skills = listBundledSkills();
292
+ if (skills.length === 0) {
293
+ log.error("No bundled skills found.");
294
+ process.exit(1);
295
+ }
296
+ heading("Bundled skills");
297
+ for (const name of skills) {
298
+ console.log(` ${name}`);
299
+ }
300
+ console.log();
301
+ log.dim("Import with: loadout skill import --builtin <name>");
302
+ return;
303
+ }
304
+ const cwd = process.cwd();
305
+ let rootPath;
306
+ let scope;
307
+ try {
308
+ ({ rootPath, scope } = await resolveRootPath(options, cwd));
309
+ }
310
+ catch (err) {
311
+ log.error(err instanceof Error ? err.message : String(err));
312
+ process.exit(1);
313
+ }
314
+ // Resolve the source path
315
+ let sourcePath;
316
+ let keepOriginal = options.keep;
317
+ if (options.builtin) {
318
+ // Import from bundled skills
319
+ const bundledPath = findBundledSkillsPath();
320
+ if (!bundledPath) {
321
+ log.error("Bundled skills directory not found.");
322
+ process.exit(1);
323
+ }
324
+ sourcePath = path.join(bundledPath, options.builtin);
325
+ keepOriginal = true; // Never delete bundled skills
326
+ }
327
+ else if (dirPath) {
328
+ sourcePath = path.isAbsolute(dirPath)
329
+ ? dirPath
330
+ : path.resolve(cwd, dirPath);
331
+ }
332
+ else {
333
+ log.error("Provide a path or use --builtin <name>");
334
+ log.dim("List bundled skills: loadout skill import --list-builtins");
335
+ process.exit(1);
336
+ }
337
+ if (!isDirectory(sourcePath)) {
338
+ log.error(`Directory not found: ${sourcePath}`);
339
+ process.exit(1);
340
+ }
341
+ // Check for SKILL.md
342
+ const skillMdPath = path.join(sourcePath, "SKILL.md");
343
+ if (!fileExists(skillMdPath)) {
344
+ log.error(`Not a valid skill directory (missing SKILL.md): ${sourcePath}`);
345
+ process.exit(1);
346
+ }
347
+ // Determine the skill name from directory name
348
+ const name = path.basename(sourcePath);
349
+ const destPath = path.join(rootPath, SKILLS_DIR, name);
350
+ if (isDirectory(destPath)) {
351
+ log.error(`Skill '${name}' already exists in ${scope} scope.`);
352
+ process.exit(1);
353
+ }
354
+ // Copy the directory
355
+ copyDir(sourcePath, destPath);
356
+ // Add to loadout definition
357
+ const loadoutPath = path.join(rootPath, "loadouts", `${options.loadout}.yaml`);
358
+ if (fileExists(loadoutPath)) {
359
+ try {
360
+ const def = parseLoadoutDefinition(loadoutPath);
361
+ const includeEntry = `skills/${name}`;
362
+ if (!def.include.some((i) => (typeof i === "string" ? i : i.path) === includeEntry)) {
363
+ def.include.push(includeEntry);
364
+ writeFile(loadoutPath, yaml.stringify(def));
365
+ log.success(`Added to ${options.loadout} loadout`);
366
+ }
367
+ }
368
+ catch (err) {
369
+ log.warn(`Could not update loadout: ${err instanceof Error ? err.message : String(err)}`);
370
+ }
371
+ }
372
+ // Remove original if not --keep (and not a builtin)
373
+ if (!keepOriginal) {
374
+ removeDir(sourcePath);
375
+ log.dim(`Removed original: ${sourcePath}`);
376
+ }
377
+ log.success(`Imported skill: ${name} (${scope})`);
378
+ log.dim(` ${destPath}/`);
379
+ });
380
+ //# sourceMappingURL=skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../../src/cli/commands/skill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * loadout status — Show drift status for active loadouts.
3
+ *
4
+ * Displays a unified table of all active loadouts with drift status.
5
+ * Uses the same visual language as `info` and `list`:
6
+ * • (dim) — global scope
7
+ * ◦ (cyan) — local/project scope
8
+ * →name (yellow) — external source
9
+ *
10
+ * Detects two types of drift:
11
+ * 1. Config drift: loadout definition changed (items added/removed)
12
+ * 2. Output drift: managed files changed on disk (modified/missing/unlinked)
13
+ *
14
+ * Scope flags:
15
+ * -l / --local → project scope only
16
+ * -g / --global → global scope only
17
+ * -a / --all → show both scopes (default)
18
+ */
19
+ import { Command } from "commander";
20
+ import type { CommandContext } from "../../core/types.js";
21
+ /**
22
+ * Execute status command - unified view of all active loadouts.
23
+ */
24
+ export declare function executeStatus(contexts: CommandContext[], showReferences: boolean): Promise<boolean>;
25
+ export declare const statusCommand: Command;
26
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2BpC,OAAO,KAAK,EAAE,cAAc,EAAoD,MAAM,qBAAqB,CAAC;AAse5G;;GAEG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,cAAc,EAAE,EAC1B,cAAc,EAAE,OAAO,GACtB,OAAO,CAAC,OAAO,CAAC,CAuClB;AAMD,eAAO,MAAM,aAAa,SActB,CAAC"}