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,35 @@
1
+ /**
2
+ * loadout fallback — Regenerate fallback sync scripts.
3
+ *
4
+ * Updates .loadouts/sync-fallback.sh and git hooks to the latest version.
5
+ * Run this after upgrading loadout to get improvements to the fallback logic.
6
+ */
7
+ import { Command } from "commander";
8
+ import * as path from "node:path";
9
+ import { fileExists } from "../../lib/fs.js";
10
+ import { writeFallbackScript, writeGitHooks } from "../../core/fallback.js";
11
+ import { findGitRoot } from "../../lib/git.js";
12
+ import { log } from "../../lib/output.js";
13
+ export const fallbackCommand = new Command("fallback")
14
+ .description("Regenerate fallback sync scripts (.loadouts/sync-fallback.sh and hooks)")
15
+ .action(async () => {
16
+ const loadoutPath = path.join(process.cwd(), ".loadouts");
17
+ if (!fileExists(loadoutPath)) {
18
+ log.error("No .loadouts/ directory found. Run 'loadouts init' first.");
19
+ process.exit(1);
20
+ }
21
+ writeFallbackScript(loadoutPath);
22
+ log.success("Updated .loadouts/sync-fallback.sh");
23
+ // Only update git hooks if at git root
24
+ const gitRoot = await findGitRoot(process.cwd());
25
+ const isAtGitRoot = gitRoot === process.cwd();
26
+ if (isAtGitRoot) {
27
+ writeGitHooks(loadoutPath);
28
+ log.success("Updated .loadouts/hooks/post-checkout");
29
+ log.success("Updated .loadouts/hooks/post-merge");
30
+ }
31
+ else {
32
+ log.dim("Skipped git hooks (subproject - use direnv instead)");
33
+ }
34
+ });
35
+ //# sourceMappingURL=fallback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fallback.js","sourceRoot":"","sources":["../../../src/cli/commands/fallback.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAE1C,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;KACnD,WAAW,CAAC,yEAAyE,CAAC;KACtF,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;IAE1D,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;QACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACjC,GAAG,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC;IAElD,uCAAuC;IACvC,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,OAAO,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC;IAE9C,IAAI,WAAW,EAAE,CAAC;QAChB,aAAa,CAAC,WAAW,CAAC,CAAC;QAC3B,GAAG,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC;QACrD,GAAG,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC;IACpD,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACjE,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * loadout info — Show detailed loadout information.
3
+ *
4
+ * Displays a unified table of all active loadouts with artifacts grouped by
5
+ * loadout name. Scope is indicated subtly with symbols:
6
+ * • global (dim)
7
+ * ◦ local (cyan)
8
+ * →name source (yellow)
9
+ *
10
+ * Scope flags:
11
+ * -l / --local → project scope only
12
+ * -g / --global → global scope only
13
+ * -a / --all → show both scopes (default)
14
+ * (none) → all available scopes; error if name exists in both without flag
15
+ */
16
+ import { Command } from "commander";
17
+ import type { CommandContext } from "../../core/types.js";
18
+ /**
19
+ * Execute info command - unified view of all active loadouts.
20
+ */
21
+ export declare function executeInfo(contexts: CommandContext[], explicitName?: string): Promise<boolean>;
22
+ export declare const infoCommand: Command;
23
+ //# sourceMappingURL=info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/info.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8BpC,OAAO,KAAK,EAAE,cAAc,EAAmC,MAAM,qBAAqB,CAAC;AAgS3F;;GAEG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,cAAc,EAAE,EAC1B,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,OAAO,CAAC,CA+BlB;AAED,eAAO,MAAM,WAAW,SA2CpB,CAAC"}
@@ -0,0 +1,314 @@
1
+ /**
2
+ * loadout info — Show detailed loadout information.
3
+ *
4
+ * Displays a unified table of all active loadouts with artifacts grouped by
5
+ * loadout name. Scope is indicated subtly with symbols:
6
+ * • global (dim)
7
+ * ◦ local (cyan)
8
+ * →name source (yellow)
9
+ *
10
+ * Scope flags:
11
+ * -l / --local → project scope only
12
+ * -g / --global → global scope only
13
+ * -a / --all → show both scopes (default)
14
+ * (none) → all available scopes; error if name exists in both without flag
15
+ */
16
+ import { Command } from "commander";
17
+ import chalk from "chalk";
18
+ import { resolveContexts, requireScopeForName, SCOPE_FLAGS, } from "../../core/scope.js";
19
+ import { getContext } from "../../core/discovery.js";
20
+ import { loadResolvedLoadout } from "../../core/resolve.js";
21
+ import { loadState } from "../../core/manifest.js";
22
+ import { log, heading } from "../../lib/output.js";
23
+ import { getArtifactName, sortArtifacts, truncatePath, getToolColumns, calculateColumnWidths, } from "../../lib/artifact-table.js";
24
+ import { getScopeFromRoots, renderScopeLegend, } from "../../lib/scope-indicators.js";
25
+ import { calculateLoadoutColumnWidths, renderLoadoutHeader, renderLoadoutSeparator, renderLoadoutCell, } from "../../lib/loadout-column.js";
26
+ import { registry } from "../../core/registry.js";
27
+ import { estimateFileTokens, estimateDirTokens, estimateSkillUpfrontTokens, formatTokens, } from "../../core/tokens.js";
28
+ // Kinds whose content goes into the agent's context window.
29
+ // Extensions (runtime code) and themes (UI config) don't count.
30
+ const CONTEXT_KINDS = new Set(["rule", "skill", "instruction", "prompt"]);
31
+ /**
32
+ * Estimate tokens for a resolved item based on its kind.
33
+ * Skills are special: only the description is upfront, full content is lazy.
34
+ */
35
+ function getItemTokens(item) {
36
+ if (!CONTEXT_KINDS.has(item.kind))
37
+ return { upfront: 0, lazy: 0 };
38
+ const kind = registry.getKind(item.kind);
39
+ if (!kind)
40
+ return { upfront: 0, lazy: 0 };
41
+ // Skills: description is upfront, full content is lazy-loaded
42
+ if (item.kind === "skill") {
43
+ const upfront = estimateSkillUpfrontTokens(item.sourcePath);
44
+ const total = estimateDirTokens(item.sourcePath);
45
+ return { upfront, lazy: Math.max(0, total - upfront) };
46
+ }
47
+ // All other context kinds: full content is upfront
48
+ const total = kind.layout === "dir"
49
+ ? estimateDirTokens(item.sourcePath)
50
+ : estimateFileTokens(item.sourcePath);
51
+ return { upfront: total, lazy: 0 };
52
+ }
53
+ /**
54
+ * Transform resolved items into artifact info for display.
55
+ */
56
+ function toArtifactInfo(items) {
57
+ return items.map((item) => ({
58
+ kind: item.kind,
59
+ name: getArtifactName(item.relativePath, item.kind),
60
+ relativePath: item.relativePath,
61
+ tools: item.tools,
62
+ tokens: getItemTokens(item),
63
+ }));
64
+ }
65
+ /**
66
+ * Render the unified artifact table with loadout grouping.
67
+ */
68
+ function renderUnifiedTable(groups) {
69
+ if (groups.length === 0) {
70
+ log.dim(" No artifacts.");
71
+ console.log();
72
+ return;
73
+ }
74
+ // Flatten all artifacts for column width calculation
75
+ const allArtifacts = [];
76
+ for (const group of groups) {
77
+ for (const artifact of group.artifacts) {
78
+ allArtifacts.push({ ...artifact, loadoutName: group.loadoutName });
79
+ }
80
+ }
81
+ if (allArtifacts.length === 0) {
82
+ log.dim(" No artifacts.");
83
+ console.log();
84
+ return;
85
+ }
86
+ // Collect all tools across all groups
87
+ const allToolsSet = new Set();
88
+ for (const group of groups) {
89
+ for (const tool of group.tools) {
90
+ allToolsSet.add(tool);
91
+ }
92
+ }
93
+ const allTools = Array.from(allToolsSet).sort();
94
+ // Pre-compute token totals
95
+ let totalUpfront = 0;
96
+ let totalLazy = 0;
97
+ for (const artifact of allArtifacts) {
98
+ totalUpfront += artifact.tokens.upfront;
99
+ totalLazy += artifact.tokens.lazy;
100
+ }
101
+ // Check if any items have tokens to show
102
+ const hasTokens = totalUpfront > 0 || totalLazy > 0;
103
+ const hasLazy = totalLazy > 0;
104
+ // Calculate column widths
105
+ const { nameWidth: loadoutNameWidth, scopeWidth, totalWidth: loadoutColWidth } = calculateLoadoutColumnWidths(groups);
106
+ const { kindWidth, nameWidth } = calculateColumnWidths(allArtifacts);
107
+ const toolCols = getToolColumns(allTools);
108
+ // Token column widths (right-aligned numbers)
109
+ const TOKEN_W = hasTokens ? 7 : 0;
110
+ const LAZY_W = hasLazy ? 7 : 0;
111
+ // ── Header ───────────────────────────────────────────────────────────────
112
+ const loadoutH = renderLoadoutHeader(loadoutColWidth);
113
+ const kindH = chalk.dim("kind".padEnd(kindWidth));
114
+ const nameH = chalk.dim("artifact".padEnd(nameWidth));
115
+ const upfrontH = hasTokens ? chalk.dim("upfront".padStart(TOKEN_W)) + " " : "";
116
+ const lazyH = hasLazy ? chalk.dim("lazy".padStart(LAZY_W)) + " " : "";
117
+ const toolH = toolCols.map((c) => chalk.dim(c.tool)).join(" ");
118
+ console.log(` ${loadoutH} ${kindH} ${nameH} ${upfrontH}${lazyH}${toolH}`);
119
+ // ── Separator ─────────────────────────────────────────────────────────────
120
+ const sepParts = [
121
+ renderLoadoutSeparator(loadoutColWidth),
122
+ "─".repeat(kindWidth),
123
+ "─".repeat(nameWidth),
124
+ ...(hasTokens ? ["─".repeat(TOKEN_W)] : []),
125
+ ...(hasLazy ? ["─".repeat(LAZY_W)] : []),
126
+ toolCols.map((c) => "─".repeat(c.width)).join(" "),
127
+ ];
128
+ console.log(chalk.dim(` ${sepParts.join(" ")}`));
129
+ // ── Rows (grouped by loadout) ─────────────────────────────────────────────
130
+ for (const group of groups) {
131
+ const sortedArtifacts = sortArtifacts(group.artifacts);
132
+ for (let i = 0; i < sortedArtifacts.length; i++) {
133
+ const artifact = sortedArtifacts[i];
134
+ const isFirstInGroup = i === 0;
135
+ // Loadout cell (only show on first row of group)
136
+ const loadoutCell = renderLoadoutCell(isFirstInGroup ? group : null, loadoutNameWidth, scopeWidth, loadoutColWidth);
137
+ const kindCell = chalk.dim(artifact.kind.padEnd(kindWidth));
138
+ const nameCell = truncatePath(artifact.name, nameWidth).padEnd(nameWidth);
139
+ // Token cells (upfront and lazy)
140
+ let upfrontCell = "";
141
+ let lazyCell = "";
142
+ if (hasTokens) {
143
+ if (artifact.tokens.upfront > 0) {
144
+ const formatted = artifact.tokens.upfront >= 1000
145
+ ? `${(artifact.tokens.upfront / 1000).toFixed(1)}k`
146
+ : String(artifact.tokens.upfront);
147
+ upfrontCell = chalk.cyan(formatted.padStart(TOKEN_W)) + " ";
148
+ }
149
+ else {
150
+ upfrontCell = chalk.dim("—".padStart(TOKEN_W)) + " ";
151
+ }
152
+ }
153
+ if (hasLazy) {
154
+ if (artifact.tokens.lazy > 0) {
155
+ const formatted = artifact.tokens.lazy >= 1000
156
+ ? `${(artifact.tokens.lazy / 1000).toFixed(1)}k`
157
+ : String(artifact.tokens.lazy);
158
+ lazyCell = chalk.yellow(formatted.padStart(LAZY_W)) + " ";
159
+ }
160
+ else {
161
+ lazyCell = chalk.dim("—".padStart(LAZY_W)) + " ";
162
+ }
163
+ }
164
+ // Tool cells
165
+ // Tool cells - right-justified within each column
166
+ const toolCells = toolCols
167
+ .map((c) => {
168
+ const hasMapping = registry.resolveMapping(c.tool, artifact.kind);
169
+ if (artifact.tools.includes(c.tool) && hasMapping) {
170
+ return " ".repeat(c.width - 1) + chalk.green("✓");
171
+ }
172
+ return " ".repeat(c.width);
173
+ })
174
+ .join(" ");
175
+ console.log(` ${loadoutCell} ${kindCell} ${nameCell} ${upfrontCell}${lazyCell}${toolCells}`);
176
+ }
177
+ }
178
+ // ── Footer ────────────────────────────────────────────────────────────────
179
+ console.log();
180
+ // Token summary
181
+ if (hasTokens) {
182
+ if (hasLazy) {
183
+ log.dim(` Upfront: ${formatTokens(totalUpfront)} • Lazy: ${formatTokens(totalLazy)} • Total: ${formatTokens(totalUpfront + totalLazy)}`);
184
+ }
185
+ else {
186
+ log.dim(` Total context: ${formatTokens(totalUpfront)}`);
187
+ }
188
+ }
189
+ // Scope legend
190
+ renderScopeLegend(groups);
191
+ console.log();
192
+ }
193
+ /**
194
+ * Load a single loadout and create a LoadoutGroup.
195
+ */
196
+ async function loadLoadoutGroup(ctx, name, isActive) {
197
+ const { loadout, roots } = await loadResolvedLoadout(ctx, name);
198
+ const scope = getScopeFromRoots(loadout.rootPath, roots, ctx.scope);
199
+ return {
200
+ loadoutName: name,
201
+ scope,
202
+ isActive,
203
+ description: loadout.description,
204
+ rootPath: loadout.rootPath,
205
+ artifacts: toArtifactInfo(loadout.items),
206
+ tools: loadout.tools,
207
+ };
208
+ }
209
+ /**
210
+ * Collect all active loadouts from a context.
211
+ * Returns empty array if no state or no active loadouts.
212
+ */
213
+ async function collectActiveGroups(ctx) {
214
+ const state = loadState(ctx.configPath);
215
+ if (!state || state.active.length === 0) {
216
+ return [];
217
+ }
218
+ const groups = [];
219
+ for (const activeName of state.active) {
220
+ try {
221
+ const group = await loadLoadoutGroup(ctx, activeName, true);
222
+ groups.push(group);
223
+ }
224
+ catch {
225
+ // Skip loadouts that can't be loaded (deleted, broken, etc.)
226
+ }
227
+ }
228
+ return groups;
229
+ }
230
+ /**
231
+ * Check if a loadout is active in a context.
232
+ */
233
+ function isLoadoutActive(ctx, name) {
234
+ const state = loadState(ctx.configPath);
235
+ return state?.active.includes(name) ?? false;
236
+ }
237
+ /**
238
+ * Execute info command - unified view of all active loadouts.
239
+ */
240
+ export async function executeInfo(contexts, explicitName) {
241
+ const groups = [];
242
+ if (explicitName) {
243
+ // Explicit name: show that loadout from whichever context has it
244
+ for (const ctx of contexts) {
245
+ try {
246
+ const isActive = isLoadoutActive(ctx, explicitName);
247
+ const group = await loadLoadoutGroup(ctx, explicitName, isActive);
248
+ groups.push(group);
249
+ }
250
+ catch {
251
+ // Loadout doesn't exist in this context, skip
252
+ }
253
+ }
254
+ }
255
+ else {
256
+ // No name: show all active loadouts from all contexts
257
+ for (const ctx of contexts) {
258
+ const contextGroups = await collectActiveGroups(ctx);
259
+ groups.push(...contextGroups);
260
+ }
261
+ }
262
+ if (groups.length === 0) {
263
+ return false;
264
+ }
265
+ // Choose heading based on whether we're showing a specific loadout or active ones
266
+ const title = explicitName ? `Loadout: ${explicitName}` : "Active loadouts";
267
+ heading(title);
268
+ renderUnifiedTable(groups);
269
+ return true;
270
+ }
271
+ export const infoCommand = new Command("info")
272
+ .description("Show loadout information")
273
+ .argument("[name]", "Loadout name (uses active loadouts if not specified)")
274
+ .option(...SCOPE_FLAGS.local)
275
+ .option(...SCOPE_FLAGS.global)
276
+ .option(...SCOPE_FLAGS.all)
277
+ .action(async (name, options) => {
278
+ const cwd = process.cwd();
279
+ // If a name is given and no explicit scope, check for collisions
280
+ if (name && !options.local && !options.global && !options.all) {
281
+ try {
282
+ const scope = await requireScopeForName(name, options, cwd);
283
+ const ctx = await getContext(scope, cwd);
284
+ const hasAny = await executeInfo([ctx], name);
285
+ if (!hasAny) {
286
+ log.error(`Loadout not found: ${name}`);
287
+ process.exit(1);
288
+ }
289
+ return;
290
+ }
291
+ catch (err) {
292
+ // If it's a collision error, rethrow
293
+ const msg = err instanceof Error ? err.message : String(err);
294
+ if (msg.includes("exists in both")) {
295
+ log.error(msg);
296
+ process.exit(1);
297
+ }
298
+ // Otherwise fall through to show all
299
+ }
300
+ }
301
+ // Show info for all resolved scopes
302
+ const { contexts } = await resolveContexts(options, cwd);
303
+ const hasAny = await executeInfo(contexts, name);
304
+ if (!hasAny) {
305
+ if (name) {
306
+ log.error(`Loadout not found: ${name}`);
307
+ }
308
+ else {
309
+ log.warn("No loadout applied.");
310
+ log.dim("Run 'loadout info <name>' to inspect a loadout without activating.");
311
+ }
312
+ }
313
+ });
314
+ //# sourceMappingURL=info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.js","sourceRoot":"","sources":["../../../src/cli/commands/info.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * loadouts init — Initialize a loadout.
3
+ *
4
+ * Scope:
5
+ * -l / --local → init in current directory (default)
6
+ * -g / --global → init at ~/.config/loadouts
7
+ *
8
+ * Unlike other commands, init defaults to local (most common use case).
9
+ */
10
+ import { Command } from "commander";
11
+ /**
12
+ * Minimal project initialization for use by install command.
13
+ * Creates the directory structure without prompts or auto-apply.
14
+ * Returns the path to the created .loadouts/ directory.
15
+ */
16
+ export declare function initProjectLoadout(projectRoot: string): Promise<string>;
17
+ export declare const initCommand: Command;
18
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkNpC;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA4D7E;AAED,eAAO,MAAM,WAAW,SASpB,CAAC"}