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,113 @@
1
+ /**
2
+ * loadout create — Create a new loadout definition.
3
+ *
4
+ * Scope flags:
5
+ * -l / --local → create in project .loadouts/
6
+ * -g / --global → create in ~/.config/loadouts
7
+ * (none) → project if in one, else global
8
+ */
9
+ import { Command } from "commander";
10
+ import * as path from "node:path";
11
+ import { findNearestLoadoutRoot, getGlobalConfigPath } from "../../core/discovery.js";
12
+ import { inProject, hasGlobal, SCOPE_FLAGS } from "../../core/scope.js";
13
+ import { writeFile, fileExists } from "../../lib/fs.js";
14
+ import { log, heading } from "../../lib/output.js";
15
+ import { openInEditor } from "../../lib/editor.js";
16
+ export const createCommand = new Command("create")
17
+ .description("Create a new loadout definition")
18
+ .argument("<name>", "Loadout name")
19
+ .option("-d, --description <desc>", "Loadout description")
20
+ .option("--no-edit", "Don't open in editor after creating")
21
+ .option(...SCOPE_FLAGS.local)
22
+ .option(...SCOPE_FLAGS.global)
23
+ .action(async (name, options) => {
24
+ const cwd = process.cwd();
25
+ // Resolve scope
26
+ let scope;
27
+ let rootPath;
28
+ if (options.local) {
29
+ const projectRoot = await findNearestLoadoutRoot(cwd);
30
+ if (!projectRoot) {
31
+ log.error("Not in a loadout project. Run 'loadout init' first.");
32
+ process.exit(1);
33
+ }
34
+ scope = "project";
35
+ rootPath = projectRoot.path;
36
+ }
37
+ else if (options.global) {
38
+ if (!hasGlobal()) {
39
+ log.error("No global loadout found. Run 'loadout init --global' first.");
40
+ process.exit(1);
41
+ }
42
+ scope = "global";
43
+ rootPath = getGlobalConfigPath();
44
+ }
45
+ else {
46
+ // Auto-detect: prefer project if in one
47
+ if (await inProject(cwd)) {
48
+ const projectRoot = await findNearestLoadoutRoot(cwd);
49
+ scope = "project";
50
+ rootPath = projectRoot.path;
51
+ }
52
+ else if (hasGlobal()) {
53
+ scope = "global";
54
+ rootPath = getGlobalConfigPath();
55
+ }
56
+ else {
57
+ log.error("No loadout found. Run 'loadout init' or 'loadout init --global' first.");
58
+ process.exit(1);
59
+ }
60
+ }
61
+ const loadoutPath = path.join(rootPath, "loadouts", `${name}.yaml`);
62
+ if (fileExists(loadoutPath)) {
63
+ log.error(`Loadout '${name}' already exists in ${scope} scope.`);
64
+ process.exit(1);
65
+ }
66
+ // Build a documented template for the loadout
67
+ const description = options.description || `${name} loadout`;
68
+ const template = `# yaml-language-server: $schema=loadout-schema.json
69
+ #
70
+ # Loadout: ${name}
71
+ # ${description}
72
+ #
73
+ # A loadout defines which artifacts (rules, skills, prompts, etc.) are
74
+ # activated together. Use 'include' to add artifacts from this .loadouts/
75
+ # directory.
76
+ #
77
+ # Examples:
78
+ # include:
79
+ # - rules/coding-standards.md # A single rule file
80
+ # - skills/debugging # A skill directory
81
+ # - prompts/review.md # A prompt template
82
+ #
83
+ # Per-item tool overrides:
84
+ # include:
85
+ # - path: rules/cursor-only.md
86
+ # tools: [cursor] # Only render for Cursor
87
+ #
88
+ # Tool targeting (default: all tools):
89
+ # tools: [claude-code, cursor] # Only target specific tools
90
+
91
+ name: ${name}
92
+ description: ${description}
93
+
94
+ # Add your artifacts here:
95
+ include: []
96
+ `;
97
+ writeFile(loadoutPath, template);
98
+ const scopeLabel = scope === "global" ? "global" : "project";
99
+ heading(`Created ${scopeLabel} loadout: ${name}`);
100
+ log.success(`Written to: ${loadoutPath}`);
101
+ // Open in editor unless --no-edit
102
+ if (!options.noEdit) {
103
+ await openInEditor(loadoutPath, { cwd: rootPath });
104
+ }
105
+ else {
106
+ console.log();
107
+ log.info("Next steps:");
108
+ log.dim(` 1. Edit ${loadoutPath} to add includes`);
109
+ const flag = scope === "global" ? " -g" : "";
110
+ log.dim(` 2. Activate with: loadout activate ${name}${flag}`);
111
+ }
112
+ });
113
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/cli/commands/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * loadout deactivate — Remove loadout(s) from the active set.
3
+ *
4
+ * Scope flags:
5
+ * -l / --local → project scope only
6
+ * -g / --global → global scope only
7
+ * -a / --all → deactivate in both scopes
8
+ * (none) → auto-detect; error if name exists in both
9
+ */
10
+ import { Command } from "commander";
11
+ export declare const deactivateCommand: Command;
12
+ //# sourceMappingURL=deactivate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deactivate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/deactivate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBpC,eAAO,MAAM,iBAAiB,SAuD1B,CAAC"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * loadout deactivate — Remove loadout(s) from the active set.
3
+ *
4
+ * Scope flags:
5
+ * -l / --local → project scope only
6
+ * -g / --global → global scope only
7
+ * -a / --all → deactivate in both scopes
8
+ * (none) → auto-detect; error if name exists in both
9
+ */
10
+ import { Command } from "commander";
11
+ import { getContext } from "../../core/discovery.js";
12
+ import { loadState } from "../../core/manifest.js";
13
+ import { resolveContexts, requireScopeForName, SCOPE_FLAGS, } from "../../core/scope.js";
14
+ import { computeDeactivateSet } from "./policy.js";
15
+ import { applyTargetSet } from "./render-engine.js";
16
+ import { log } from "../../lib/output.js";
17
+ export const deactivateCommand = new Command("deactivate")
18
+ .description("Deactivate loadout(s) (remove from active set)")
19
+ .argument("<names...>", "Loadout names to deactivate")
20
+ .option(...SCOPE_FLAGS.local)
21
+ .option(...SCOPE_FLAGS.global)
22
+ .option(...SCOPE_FLAGS.all)
23
+ .option("--dry-run", "Preview changes without applying")
24
+ .action(async (names, options) => {
25
+ const cwd = process.cwd();
26
+ // If --all, deactivate in both scopes
27
+ if (options.all) {
28
+ const { contexts } = await resolveContexts(options, cwd);
29
+ for (const ctx of contexts) {
30
+ const current = loadState(ctx.configPath)?.active ?? [];
31
+ const { targets, earlyExit } = computeDeactivateSet(current, names);
32
+ if (earlyExit) {
33
+ // Not an error for deactivate — just nothing to do
34
+ log.dim(`[${ctx.scope}] ${earlyExit}`);
35
+ continue;
36
+ }
37
+ await applyTargetSet(ctx, targets, {
38
+ dryRun: options.dryRun,
39
+ verb: "Deactivated",
40
+ });
41
+ }
42
+ return;
43
+ }
44
+ // Otherwise, resolve each name to its scope
45
+ let targetScope;
46
+ if (options.local) {
47
+ targetScope = "project";
48
+ }
49
+ else if (options.global) {
50
+ targetScope = "global";
51
+ }
52
+ else {
53
+ targetScope = await requireScopeForName(names[0], options, cwd);
54
+ }
55
+ const ctx = await getContext(targetScope, cwd);
56
+ const current = loadState(ctx.configPath)?.active ?? [];
57
+ const { targets, earlyExit } = computeDeactivateSet(current, names);
58
+ if (earlyExit) {
59
+ log.warn(earlyExit);
60
+ return;
61
+ }
62
+ await applyTargetSet(ctx, targets, {
63
+ dryRun: options.dryRun,
64
+ verb: "Deactivated",
65
+ });
66
+ });
67
+ //# sourceMappingURL=deactivate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deactivate.js","sourceRoot":"","sources":["../../../src/cli/commands/deactivate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * loadout diff — Show what would change if a loadout were applied.
3
+ *
4
+ * Scope flags:
5
+ * -l / --local → project scope only
6
+ * -g / --global → global scope only
7
+ * -a / --all → show diff for both scopes
8
+ * (none) → auto-detect; error if name exists in both without flag
9
+ *
10
+ * Output follows unified visual language (see docs/visual-language.md).
11
+ */
12
+ import { Command } from "commander";
13
+ import type { CommandContext } from "../../core/types.js";
14
+ export declare function executeDiff(ctx: CommandContext, name?: string): Promise<void>;
15
+ export declare const diffCommand: Command;
16
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/diff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBpC,OAAO,KAAK,EAAE,cAAc,EAAQ,MAAM,qBAAqB,CAAC;AAEhE,wBAAsB,WAAW,CAC/B,GAAG,EAAE,cAAc,EACnB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CA6Ff;AAED,eAAO,MAAM,WAAW,SA0CpB,CAAC"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * loadout diff — Show what would change if a loadout were applied.
3
+ *
4
+ * Scope flags:
5
+ * -l / --local → project scope only
6
+ * -g / --global → global scope only
7
+ * -a / --all → show diff for both scopes
8
+ * (none) → auto-detect; error if name exists in both without flag
9
+ *
10
+ * Output follows unified visual language (see docs/visual-language.md).
11
+ */
12
+ import { Command } from "commander";
13
+ import { getContext } from "../../core/discovery.js";
14
+ import { loadResolvedLoadout } from "../../core/resolve.js";
15
+ import { planRender } from "../../core/render.js";
16
+ import { loadState } from "../../core/manifest.js";
17
+ import { resolveContexts, requireScopeForName, SCOPE_FLAGS, } from "../../core/scope.js";
18
+ import { log, heading } from "../../lib/output.js";
19
+ import { groupOutputsByArtifact, renderChangeTable, } from "../../lib/artifact-table.js";
20
+ export async function executeDiff(ctx, name) {
21
+ const result = await loadResolvedLoadout(ctx, name);
22
+ const { loadout, loadoutName } = result;
23
+ const plan = await planRender(loadout, ctx.projectRoot, ctx.scope, ctx.configPath);
24
+ const state = loadState(ctx.configPath);
25
+ heading(`Diff: ${loadoutName} (${ctx.scope})`);
26
+ // Build sets for change detection
27
+ const stateTargets = new Set(state?.entries.map((e) => e.targetPath) || []);
28
+ const planTargets = new Set(plan.outputs.map((o) => o.spec.targetPath));
29
+ // Collect all tools
30
+ const toolSet = new Set();
31
+ for (const { spec } of plan.outputs) {
32
+ toolSet.add(spec.tool);
33
+ }
34
+ if (state) {
35
+ for (const entry of state.entries) {
36
+ for (const tool of entry.tools) {
37
+ toolSet.add(tool);
38
+ }
39
+ }
40
+ }
41
+ const tools = Array.from(toolSet).sort();
42
+ // Build outputs with change types
43
+ const outputs = [];
44
+ // Current plan outputs: create or update
45
+ for (const { spec } of plan.outputs) {
46
+ const change = stateTargets.has(spec.targetPath) ? "updated" : "added";
47
+ outputs.push({ spec, change });
48
+ }
49
+ // Deleted entries from state
50
+ if (state) {
51
+ for (const entry of state.entries) {
52
+ if (!planTargets.has(entry.targetPath)) {
53
+ // Use first tool for display (all tools share the same output)
54
+ outputs.push({
55
+ spec: {
56
+ tool: entry.tools[0],
57
+ kind: entry.kind,
58
+ sourcePath: entry.sourcePath,
59
+ targetPath: entry.targetPath,
60
+ mode: entry.mode,
61
+ },
62
+ change: "removed",
63
+ });
64
+ }
65
+ }
66
+ }
67
+ // Shadowed entries
68
+ for (const s of plan.shadowed) {
69
+ outputs.push({
70
+ spec: {
71
+ tool: s.tool,
72
+ kind: s.kind,
73
+ sourcePath: s.sourcePath,
74
+ targetPath: s.targetPath,
75
+ mode: "symlink", // Default, doesn't matter for display
76
+ },
77
+ change: "shadowed",
78
+ });
79
+ }
80
+ if (outputs.length === 0) {
81
+ log.success("No changes");
82
+ return;
83
+ }
84
+ const artifacts = groupOutputsByArtifact(outputs);
85
+ renderChangeTable(artifacts, tools, { showAction: true });
86
+ // Summary counts
87
+ const added = outputs.filter((o) => o.change === "added").length;
88
+ const updated = outputs.filter((o) => o.change === "updated").length;
89
+ const removed = outputs.filter((o) => o.change === "removed").length;
90
+ const shadowed = outputs.filter((o) => o.change === "shadowed").length;
91
+ console.log();
92
+ const parts = [];
93
+ if (added > 0)
94
+ parts.push(`${added} to create`);
95
+ if (updated > 0)
96
+ parts.push(`${updated} to update`);
97
+ if (removed > 0)
98
+ parts.push(`${removed} to remove`);
99
+ if (shadowed > 0)
100
+ parts.push(`${shadowed} shadowed`);
101
+ log.dim(` ${parts.join(" • ")}`);
102
+ }
103
+ export const diffCommand = new Command("diff")
104
+ .description("Show what would change if loadout were applied")
105
+ .argument("[name]", "Loadout name (uses default if not specified)")
106
+ .option(...SCOPE_FLAGS.local)
107
+ .option(...SCOPE_FLAGS.global)
108
+ .option(...SCOPE_FLAGS.all)
109
+ .action(async (name, options) => {
110
+ const cwd = process.cwd();
111
+ // If a name is given and no explicit scope, check for collisions
112
+ if (name && !options.local && !options.global && !options.all) {
113
+ try {
114
+ const scope = await requireScopeForName(name, options, cwd);
115
+ const ctx = await getContext(scope, cwd);
116
+ await executeDiff(ctx, name);
117
+ return;
118
+ }
119
+ catch (err) {
120
+ const msg = err instanceof Error ? err.message : String(err);
121
+ if (msg.includes("exists in both")) {
122
+ log.error(msg);
123
+ process.exit(1);
124
+ }
125
+ }
126
+ }
127
+ // Show diff for all resolved scopes
128
+ const { contexts } = await resolveContexts(options, cwd);
129
+ let hasAny = false;
130
+ for (const ctx of contexts) {
131
+ try {
132
+ await executeDiff(ctx, name);
133
+ hasAny = true;
134
+ }
135
+ catch {
136
+ // Scope doesn't have this loadout — skip silently
137
+ }
138
+ }
139
+ if (!hasAny) {
140
+ log.warn("No loadout found.");
141
+ log.dim("Run 'loadouts init' to set up a loadout.");
142
+ }
143
+ });
144
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../src/cli/commands/diff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,WAAW,GAEZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EACL,sBAAsB,EACtB,iBAAiB,GAElB,MAAM,6BAA6B,CAAC;AAGrC,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,GAAmB,EACnB,IAAa;IAEb,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACpD,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IAExC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;IACnF,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAExC,OAAO,CAAC,SAAS,WAAW,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;IAE/C,kCAAkC;IAClC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5E,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAExE,oBAAoB;IACpB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAQ,CAAC;IAChC,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IACD,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAEzC,kCAAkC;IAClC,MAAM,OAAO,GAGR,EAAE,CAAC;IAER,yCAAyC;IACzC,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,MAAM,GAAe,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;QACnF,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACjC,CAAC;IAED,6BAA6B;IAC7B,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;gBACvC,+DAA+D;gBAC/D,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE;wBACJ,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;wBACpB,IAAI,EAAE,KAAK,CAAC,IAAI;wBAChB,UAAU,EAAE,KAAK,CAAC,UAAU;wBAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;wBAC5B,IAAI,EAAE,KAAK,CAAC,IAAI;qBACjB;oBACD,MAAM,EAAE,SAAS;iBAClB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE;gBACJ,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,UAAU,EAAE,CAAC,CAAC,UAAU;gBACxB,UAAU,EAAE,CAAC,CAAC,UAAU;gBACxB,IAAI,EAAE,SAAS,EAAE,sCAAsC;aACxD;YACD,MAAM,EAAE,UAAU;SACnB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAClD,iBAAiB,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1D,iBAAiB;IACjB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;IACjE,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;IACrE,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;IACrE,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;IAEvE,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,KAAK,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,YAAY,CAAC,CAAC;IAChD,IAAI,OAAO,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,YAAY,CAAC,CAAC;IACpD,IAAI,OAAO,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,YAAY,CAAC,CAAC;IACpD,IAAI,QAAQ,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,WAAW,CAAC,CAAC;IACrD,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,gDAAgD,CAAC;KAC7D,QAAQ,CAAC,QAAQ,EAAE,8CAA8C,CAAC;KAClE,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,KAAK,EAAE,IAAwB,EAAE,OAAmB,EAAE,EAAE;IAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,iEAAiE;IACjE,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QAC9D,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;YAC5D,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACzC,MAAM,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC7B,OAAO;QACT,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,IAAI,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACnC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACzD,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC7B,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,kDAAkD;QACpD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC9B,GAAG,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;IACtD,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * loadout docs — Display documentation.
3
+ *
4
+ * Usage:
5
+ * loadout docs # Show index/overview
6
+ * loadout docs quickstart # Show specific topic
7
+ * loadout docs --list # List available topics
8
+ * loadout docs --raw # Print without pager
9
+ */
10
+ import { Command } from "commander";
11
+ export declare const docsCommand: Command;
12
+ //# sourceMappingURL=docs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/docs.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqFpC,eAAO,MAAM,WAAW,SAqCpB,CAAC"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * loadout docs — Display documentation.
3
+ *
4
+ * Usage:
5
+ * loadout docs # Show index/overview
6
+ * loadout docs quickstart # Show specific topic
7
+ * loadout docs --list # List available topics
8
+ * loadout docs --raw # Print without pager
9
+ */
10
+ import { Command } from "commander";
11
+ import * as path from "node:path";
12
+ import * as fs from "node:fs";
13
+ import { spawn } from "node:child_process";
14
+ import { fileURLToPath } from "node:url";
15
+ import chalk from "chalk";
16
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
17
+ /** Available documentation topics with descriptions. */
18
+ const TOPICS = {
19
+ index: "Overview and quick reference",
20
+ quickstart: "Get started in 60 seconds",
21
+ concepts: "Loadouts, artifacts, scopes, tools",
22
+ commands: "Full command reference",
23
+ authoring: "Creating rules, skills, instructions",
24
+ workflows: "Team setup, git, CI/CD",
25
+ troubleshooting: "Common issues and solutions",
26
+ };
27
+ /**
28
+ * Find a docs file by topic name. Tries multiple locations:
29
+ * 1. Relative to the CLI source (development)
30
+ * 2. Relative to the installed package (production)
31
+ */
32
+ function findDocsPath(topic) {
33
+ const filename = `${topic}.md`;
34
+ const candidates = [
35
+ // Development: relative to src/cli/commands/
36
+ path.resolve(__dirname, "../../../docs", filename),
37
+ // Production: relative to dist/cli/commands/
38
+ path.resolve(__dirname, "../../../docs", filename),
39
+ // Fallback: look in package root
40
+ path.resolve(__dirname, "../../docs", filename),
41
+ ];
42
+ for (const candidate of candidates) {
43
+ if (fs.existsSync(candidate)) {
44
+ return candidate;
45
+ }
46
+ }
47
+ return null;
48
+ }
49
+ /** List available topics with descriptions. */
50
+ function listTopics() {
51
+ console.log(chalk.bold("\nAvailable documentation topics:\n"));
52
+ const maxLen = Math.max(...Object.keys(TOPICS).map(k => k.length));
53
+ for (const [topic, description] of Object.entries(TOPICS)) {
54
+ if (topic === "index")
55
+ continue; // Skip index in listing
56
+ const padded = topic.padEnd(maxLen + 2);
57
+ console.log(` ${chalk.cyan(padded)} ${chalk.dim(description)}`);
58
+ }
59
+ console.log();
60
+ console.log(chalk.dim("Usage: loadout docs <topic>"));
61
+ console.log();
62
+ }
63
+ /** Display documentation through pager or stdout. */
64
+ function displayDocs(content, usePager) {
65
+ if (!usePager || !process.stdout.isTTY) {
66
+ console.log(content);
67
+ return;
68
+ }
69
+ const pager = process.env.PAGER || "less";
70
+ const pagerArgs = pager === "less" ? ["-R"] : [];
71
+ const child = spawn(pager, pagerArgs, {
72
+ stdio: ["pipe", "inherit", "inherit"],
73
+ });
74
+ child.stdin.write(content);
75
+ child.stdin.end();
76
+ child.on("error", () => {
77
+ // Pager not found, print directly
78
+ console.log(content);
79
+ });
80
+ }
81
+ export const docsCommand = new Command("docs")
82
+ .description("Display documentation")
83
+ .argument("[topic]", "Documentation topic (quickstart, concepts, commands, authoring, workflows, troubleshooting)")
84
+ .option("--list", "List available topics")
85
+ .option("--raw", "Print raw markdown without pager")
86
+ .action(async (topic, options) => {
87
+ if (options.list) {
88
+ listTopics();
89
+ return;
90
+ }
91
+ // Default to index if no topic specified
92
+ const targetTopic = topic || "index";
93
+ // Validate topic
94
+ if (!TOPICS[targetTopic]) {
95
+ console.error(chalk.red(`Unknown topic: ${targetTopic}`));
96
+ console.error();
97
+ console.error("Available topics:");
98
+ for (const t of Object.keys(TOPICS)) {
99
+ if (t !== "index")
100
+ console.error(` ${t}`);
101
+ }
102
+ console.error();
103
+ console.error("Use: loadout docs <topic>");
104
+ process.exit(1);
105
+ }
106
+ const docsPath = findDocsPath(targetTopic);
107
+ if (!docsPath) {
108
+ console.error(chalk.red(`Documentation file not found: ${targetTopic}.md`));
109
+ console.error("Visit: https://github.com/evatths/loadout");
110
+ process.exit(1);
111
+ }
112
+ const content = fs.readFileSync(docsPath, "utf-8");
113
+ displayDocs(content, !options.raw);
114
+ });
115
+ //# sourceMappingURL=docs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.js","sourceRoot":"","sources":["../../../src/cli/commands/docs.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE/D,wDAAwD;AACxD,MAAM,MAAM,GAA2B;IACrC,KAAK,EAAE,8BAA8B;IACrC,UAAU,EAAE,2BAA2B;IACvC,QAAQ,EAAE,oCAAoC;IAC9C,QAAQ,EAAE,wBAAwB;IAClC,SAAS,EAAE,sCAAsC;IACjD,SAAS,EAAE,wBAAwB;IACnC,eAAe,EAAE,6BAA6B;CAC/C,CAAC;AAEF;;;;GAIG;AACH,SAAS,YAAY,CAAC,KAAa;IACjC,MAAM,QAAQ,GAAG,GAAG,KAAK,KAAK,CAAC;IAC/B,MAAM,UAAU,GAAG;QACjB,6CAA6C;QAC7C,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,eAAe,EAAE,QAAQ,CAAC;QAClD,6CAA6C;QAC7C,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,eAAe,EAAE,QAAQ,CAAC;QAClD,iCAAiC;QACjC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,YAAY,EAAE,QAAQ,CAAC;KAChD,CAAC;IAEF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,+CAA+C;AAC/C,SAAS,UAAU;IACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC,CAAC;IAE/D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAEnE,KAAK,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1D,IAAI,KAAK,KAAK,OAAO;YAAE,SAAS,CAAC,wBAAwB;QACzD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,qDAAqD;AACrD,SAAS,WAAW,CAAC,OAAe,EAAE,QAAiB;IACrD,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,MAAM,CAAC;IAC1C,MAAM,SAAS,GAAG,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEjD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE;QACpC,KAAK,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC;KACtC,CAAC,CAAC;IAEH,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3B,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IAElB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACrB,kCAAkC;QAClC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,uBAAuB,CAAC;KACpC,QAAQ,CAAC,SAAS,EAAE,6FAA6F,CAAC;KAClH,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC;KACzC,MAAM,CAAC,OAAO,EAAE,kCAAkC,CAAC;KACnD,MAAM,CAAC,KAAK,EAAE,KAAyB,EAAE,OAA0C,EAAE,EAAE;IACtF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,UAAU,EAAE,CAAC;QACb,OAAO;IACT,CAAC;IAED,yCAAyC;IACzC,MAAM,WAAW,GAAG,KAAK,IAAI,OAAO,CAAC;IAErC,iBAAiB;IACjB,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,WAAW,EAAE,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACnC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,KAAK,OAAO;gBAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAE3C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAiC,WAAW,KAAK,CAAC,CAAC,CAAC;QAC5E,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnD,WAAW,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * loadout edit — Open a loadout definition in $EDITOR.
3
+ *
4
+ * Scope flags:
5
+ * -l / --local → project scope only
6
+ * -g / --global → global scope only
7
+ * (none) → auto-detect; error if name exists in both without flag
8
+ */
9
+ import { Command } from "commander";
10
+ export declare const editCommand: Command;
11
+ //# sourceMappingURL=edit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/edit.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0BpC,eAAO,MAAM,WAAW,SA2CpB,CAAC"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * loadout edit — Open a loadout definition in $EDITOR.
3
+ *
4
+ * Scope flags:
5
+ * -l / --local → project scope only
6
+ * -g / --global → global scope only
7
+ * (none) → auto-detect; error if name exists in both without flag
8
+ */
9
+ import { Command } from "commander";
10
+ import * as path from "node:path";
11
+ import { requireScopeForName, SCOPE_FLAGS, } from "../../core/scope.js";
12
+ import { findNearestLoadoutRoot, getGlobalRoot } from "../../core/discovery.js";
13
+ import { fileExists } from "../../lib/fs.js";
14
+ import { log } from "../../lib/output.js";
15
+ import { openInEditor } from "../../lib/editor.js";
16
+ const LOADOUTS_DIR = "loadouts";
17
+ /**
18
+ * Find the loadout definition file path for a given name and scope.
19
+ */
20
+ function findLoadoutPath(loadoutRoot, name) {
21
+ const yamlPath = path.join(loadoutRoot, LOADOUTS_DIR, `${name}.yaml`);
22
+ const ymlPath = path.join(loadoutRoot, LOADOUTS_DIR, `${name}.yml`);
23
+ if (fileExists(yamlPath))
24
+ return yamlPath;
25
+ if (fileExists(ymlPath))
26
+ return ymlPath;
27
+ return null;
28
+ }
29
+ export const editCommand = new Command("edit")
30
+ .description("Open a loadout definition in $EDITOR")
31
+ .argument("<name>", "Loadout name to edit")
32
+ .option(...SCOPE_FLAGS.local)
33
+ .option(...SCOPE_FLAGS.global)
34
+ .action(async (name, options) => {
35
+ const cwd = process.cwd();
36
+ try {
37
+ // Resolve scope — throws if ambiguous or not found
38
+ const scope = await requireScopeForName(name, options, cwd);
39
+ // Get the loadout root for the resolved scope
40
+ let loadoutRoot;
41
+ if (scope === "global") {
42
+ const globalRoot = getGlobalRoot();
43
+ if (!globalRoot) {
44
+ log.error("No global loadout found at ~/.config/loadouts");
45
+ process.exit(1);
46
+ }
47
+ loadoutRoot = globalRoot.path;
48
+ }
49
+ else {
50
+ const projectRoot = await findNearestLoadoutRoot(cwd);
51
+ if (!projectRoot) {
52
+ log.error("Not in a loadout project. Run 'loadouts init' first.");
53
+ process.exit(1);
54
+ }
55
+ loadoutRoot = projectRoot.path;
56
+ }
57
+ // Find the loadout definition file
58
+ const filePath = findLoadoutPath(loadoutRoot, name);
59
+ if (!filePath) {
60
+ log.error(`Loadout '${name}' not found in ${scope} scope.`);
61
+ process.exit(1);
62
+ }
63
+ // Open in editor from the loadout root directory
64
+ await openInEditor(filePath, { cwd: loadoutRoot });
65
+ }
66
+ catch (err) {
67
+ log.error(err instanceof Error ? err.message : String(err));
68
+ process.exit(1);
69
+ }
70
+ });
71
+ //# sourceMappingURL=edit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit.js","sourceRoot":"","sources":["../../../src/cli/commands/edit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
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
+ export declare const fallbackCommand: Command;
9
+ //# sourceMappingURL=fallback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fallback.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/fallback.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,eAAe,SAwBxB,CAAC"}