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,218 @@
1
+ /**
2
+ * loadouts instructions - Manage per-loadout instruction files
3
+ *
4
+ * Instructions are stored as instructions/<loadout>.md and rendered to AGENTS.md
5
+ */
6
+ import { Command } from "commander";
7
+ import * as path from "node:path";
8
+ import { findNearestLoadoutRoot, getProjectRoot } from "../../core/discovery.js";
9
+ import { loadState } from "../../core/manifest.js";
10
+ import { writeFile, fileExists, removeFile, copyFile, ensureDir } from "../../lib/fs.js";
11
+ import { log } from "../../lib/output.js";
12
+ import { spawn } from "node:child_process";
13
+ const INSTRUCTIONS_DIR = "instructions";
14
+ /**
15
+ * Get the instruction file path for a loadout.
16
+ */
17
+ function getInstructionPath(loadoutPath, loadoutName) {
18
+ return path.join(loadoutPath, INSTRUCTIONS_DIR, `AGENTS.${loadoutName}.md`);
19
+ }
20
+ /**
21
+ * Get the active loadout name, or default to "base".
22
+ */
23
+ function getActiveLoadout(loadoutPath) {
24
+ const state = loadState(loadoutPath);
25
+ const active = state?.active ?? [];
26
+ return active.length > 0 ? active[0] : "base";
27
+ }
28
+ export const instructionsCommand = new Command("instructions").description("Manage per-loadout instruction files");
29
+ // loadouts instructions init [loadout]
30
+ instructionsCommand
31
+ .command("init")
32
+ .description("Create an instruction file for a loadout")
33
+ .argument("[loadout]", "Loadout name (default: active loadout or 'base')")
34
+ .option("-f, --force", "Overwrite existing file")
35
+ .action(async (loadoutName, options) => {
36
+ const nearestRoot = await findNearestLoadoutRoot(process.cwd());
37
+ if (!nearestRoot) {
38
+ log.error("No .loadouts/ directory found. Run 'loadouts init' first.");
39
+ process.exit(1);
40
+ }
41
+ const targetLoadout = loadoutName || getActiveLoadout(nearestRoot.path);
42
+ const filePath = getInstructionPath(nearestRoot.path, targetLoadout);
43
+ if (fileExists(filePath) && !options.force) {
44
+ log.warn(`Instruction file already exists: ${filePath}`);
45
+ log.dim(`Edit it with: loadouts instructions edit ${targetLoadout}`);
46
+ log.dim("Or overwrite with: loadouts instructions init --force");
47
+ process.exit(1);
48
+ }
49
+ const content = `# Project Instructions
50
+
51
+ > These instructions are always included for AI coding agents when the **${targetLoadout}** loadout is active.
52
+
53
+ ## Quick Reference
54
+
55
+ - Build: \`npm run build\`
56
+ - Test: \`npm test\`
57
+ - Lint: \`npm run lint\`
58
+
59
+ ## Project Overview
60
+
61
+ Describe your project here.
62
+
63
+ ## Guidelines
64
+
65
+ ### Code Style
66
+
67
+ - Prefer descriptive names over comments
68
+ - Keep functions small and focused
69
+ - Write tests for new functionality
70
+
71
+ ### Architecture
72
+
73
+ Describe key architectural decisions.
74
+
75
+ ## Done Means
76
+
77
+ When completing a task:
78
+
79
+ - [ ] Code compiles without errors
80
+ - [ ] Tests pass
81
+ - [ ] No lint warnings
82
+ - [ ] Changes are documented if needed
83
+ `;
84
+ ensureDir(path.dirname(filePath));
85
+ writeFile(filePath, content);
86
+ log.success(`Created: instructions/AGENTS.${targetLoadout}.md`);
87
+ console.log();
88
+ console.log(` File: ${filePath}`);
89
+ console.log();
90
+ log.dim(" Replace the template content with your instructions, then run 'loadouts sync'");
91
+ log.dim(` Don't forget to add 'instructions/AGENTS.${targetLoadout}.md' to your loadout's include list.`);
92
+ });
93
+ // loadouts instructions edit [loadout]
94
+ instructionsCommand
95
+ .command("edit")
96
+ .description("Edit an instruction file in $EDITOR")
97
+ .argument("[loadout]", "Loadout name (default: active loadout or 'base')")
98
+ .action(async (loadoutName) => {
99
+ const nearestRoot = await findNearestLoadoutRoot(process.cwd());
100
+ if (!nearestRoot) {
101
+ log.error("No .loadouts/ directory found.");
102
+ process.exit(1);
103
+ }
104
+ const targetLoadout = loadoutName || getActiveLoadout(nearestRoot.path);
105
+ const filePath = getInstructionPath(nearestRoot.path, targetLoadout);
106
+ if (!fileExists(filePath)) {
107
+ log.error(`Instruction file not found: instructions/AGENTS.${targetLoadout}.md`);
108
+ log.dim(`Create it with: loadouts instructions init ${targetLoadout}`);
109
+ process.exit(1);
110
+ }
111
+ const editor = process.env.EDITOR || process.env.VISUAL || "vim";
112
+ const child = spawn(editor, [filePath], {
113
+ stdio: "inherit",
114
+ });
115
+ child.on("exit", (code) => {
116
+ if (code === 0) {
117
+ log.success(`Edited instructions/AGENTS.${targetLoadout}.md`);
118
+ }
119
+ });
120
+ });
121
+ // loadouts instructions import [path]
122
+ instructionsCommand
123
+ .command("import")
124
+ .description("Import an existing instruction file into loadout")
125
+ .argument("[path]", "Path to existing file (defaults to ./AGENTS.md or ./CLAUDE.md)")
126
+ .option("--loadout <name>", "Target loadout (default: active loadout or 'base')")
127
+ .option("--keep", "Keep original file (don't delete after import)")
128
+ .option("-f, --force", "Overwrite existing instruction file")
129
+ .action(async (filePath, options) => {
130
+ const cwd = process.cwd();
131
+ const projectRoot = await getProjectRoot(cwd);
132
+ const nearestRoot = await findNearestLoadoutRoot(cwd);
133
+ if (!nearestRoot) {
134
+ log.error("No .loadouts/ directory found. Run 'loadouts init' first.");
135
+ process.exit(1);
136
+ }
137
+ const targetLoadout = options.loadout || getActiveLoadout(nearestRoot.path);
138
+ // Auto-detect source if not provided
139
+ let sourcePath;
140
+ if (filePath) {
141
+ sourcePath = path.isAbsolute(filePath)
142
+ ? filePath
143
+ : path.resolve(cwd, filePath);
144
+ }
145
+ else {
146
+ // Try AGENTS.md first, then CLAUDE.md
147
+ const agentsPath = path.join(projectRoot, "AGENTS.md");
148
+ const claudePath = path.join(projectRoot, "CLAUDE.md");
149
+ if (fileExists(agentsPath)) {
150
+ sourcePath = agentsPath;
151
+ }
152
+ else if (fileExists(claudePath)) {
153
+ sourcePath = claudePath;
154
+ }
155
+ else {
156
+ log.error("No AGENTS.md or CLAUDE.md found in project root.");
157
+ log.dim("Specify a path: loadouts instructions import <path>");
158
+ process.exit(1);
159
+ }
160
+ }
161
+ if (!fileExists(sourcePath)) {
162
+ log.error(`File not found: ${sourcePath}`);
163
+ process.exit(1);
164
+ }
165
+ const destPath = getInstructionPath(nearestRoot.path, targetLoadout);
166
+ if (fileExists(destPath) && !options.force) {
167
+ log.error(`instructions/AGENTS.${targetLoadout}.md already exists`);
168
+ log.dim("Use --force to overwrite it with the imported file.");
169
+ process.exit(1);
170
+ }
171
+ // Copy the file
172
+ ensureDir(path.dirname(destPath));
173
+ copyFile(sourcePath, destPath);
174
+ // Remove original if not --keep
175
+ if (!options.keep) {
176
+ removeFile(sourcePath);
177
+ log.dim(`Removed original: ${sourcePath}`);
178
+ }
179
+ log.success(`Imported to instructions/AGENTS.${targetLoadout}.md`);
180
+ log.dim(`Don't forget to add 'instructions/AGENTS.${targetLoadout}.md' to your loadout's include list.`);
181
+ log.info("Run 'loadouts sync' to apply changes.");
182
+ });
183
+ // loadouts instructions list
184
+ instructionsCommand
185
+ .command("list")
186
+ .description("List instruction files")
187
+ .action(async () => {
188
+ const nearestRoot = await findNearestLoadoutRoot(process.cwd());
189
+ if (!nearestRoot) {
190
+ log.error("No .loadouts/ directory found.");
191
+ process.exit(1);
192
+ }
193
+ const instructionsDir = path.join(nearestRoot.path, INSTRUCTIONS_DIR);
194
+ if (!fileExists(instructionsDir)) {
195
+ log.dim("No instruction files found.");
196
+ log.dim("Create one with: loadouts instructions init <loadout>");
197
+ return;
198
+ }
199
+ const fs = await import("node:fs");
200
+ const files = fs.readdirSync(instructionsDir)
201
+ .filter(f => f.startsWith("AGENTS.") && f.endsWith(".md"))
202
+ .map(f => f.replace(/^AGENTS\./, "").replace(/\.md$/, ""));
203
+ if (files.length === 0) {
204
+ log.dim("No instruction files found.");
205
+ log.dim("Create one with: loadouts instructions init <loadout>");
206
+ return;
207
+ }
208
+ const activeLoadout = getActiveLoadout(nearestRoot.path);
209
+ console.log();
210
+ log.info("Instruction files:");
211
+ for (const file of files) {
212
+ const isActive = file === activeLoadout;
213
+ const marker = isActive ? " (active)" : "";
214
+ console.log(` AGENTS.${file}.md${marker}`);
215
+ }
216
+ console.log();
217
+ });
218
+ //# sourceMappingURL=instructions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instructions.js","sourceRoot":"","sources":["../../../src/cli/commands/instructions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * loadout kinds - List registered artifact kinds
3
+ */
4
+ import { Command } from "commander";
5
+ export declare const kindsCommand: Command;
6
+ //# sourceMappingURL=kinds.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kinds.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/kinds.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,YAAY,SAwDrB,CAAC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * loadout kinds - List registered artifact kinds
3
+ */
4
+ import { Command } from "commander";
5
+ import { registry } from "../../core/registry.js";
6
+ import { discoverLoadoutRoots } from "../../core/discovery.js";
7
+ import { loadYamlKindsFromRoots } from "../../core/kindLoader.js";
8
+ import { log, heading } from "../../lib/output.js";
9
+ export const kindsCommand = new Command("kinds")
10
+ .description("List registered artifact kinds")
11
+ .option("-v, --verbose", "Show detection rules and per-tool targets")
12
+ .action(async (options) => {
13
+ // Load project-local YAML kinds so the list reflects what's actually available.
14
+ try {
15
+ const roots = await discoverLoadoutRoots(process.cwd());
16
+ loadYamlKindsFromRoots(roots);
17
+ }
18
+ catch {
19
+ // Not inside a loadout project — built-ins only, that's fine.
20
+ }
21
+ const kinds = registry.allKinds();
22
+ heading("Registered artifact kinds");
23
+ console.log();
24
+ for (const kind of kinds) {
25
+ const isBuiltin = ["rule", "skill", "instruction"].includes(kind.id);
26
+ const tag = isBuiltin ? "" : " (custom)";
27
+ console.log(` ${kind.id}${tag}`);
28
+ if (kind.description)
29
+ log.dim(` ${kind.description}`);
30
+ log.dim(` layout: ${kind.layout}`);
31
+ if (options.verbose) {
32
+ // Show which tools have a mapping for this kind (either via tool.targets or kind.defaultTargets)
33
+ const supportedTools = registry
34
+ .allTools()
35
+ .filter((t) => registry.resolveMapping(t.name, kind.id))
36
+ .map((t) => t.name);
37
+ if (supportedTools.length > 0) {
38
+ log.dim(` tools: ${supportedTools.join(", ")}`);
39
+ }
40
+ else {
41
+ log.dim(` tools: (none registered)`);
42
+ }
43
+ if (kind.defaultTargets && Object.keys(kind.defaultTargets).length > 0) {
44
+ log.dim(` defaultTargets:`);
45
+ for (const [toolName, mapping] of Object.entries(kind.defaultTargets)) {
46
+ const pathStr = typeof mapping.path === "string"
47
+ ? mapping.path
48
+ : `project: ${mapping.path.project}, global: ${mapping.path.global}`;
49
+ log.dim(` ${toolName}: ${pathStr}`);
50
+ }
51
+ }
52
+ }
53
+ console.log();
54
+ }
55
+ if (kinds.length === 0) {
56
+ log.warn("No kinds registered. This shouldn't happen — check bootstrap.");
57
+ }
58
+ });
59
+ //# sourceMappingURL=kinds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kinds.js","sourceRoot":"","sources":["../../../src/cli/commands/kinds.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * loadout list — List available loadouts.
3
+ *
4
+ * Scope flags:
5
+ * -l / --local → project scope only
6
+ * -g / --global → global scope only
7
+ * -a / --all → show both scopes (default)
8
+ * (none) → all available scopes
9
+ */
10
+ import { Command } from "commander";
11
+ export declare const listCommand: Command;
12
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/list.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6KpC,eAAO,MAAM,WAAW,SA6EpB,CAAC"}
@@ -0,0 +1,182 @@
1
+ /**
2
+ * loadout list — List available loadouts.
3
+ *
4
+ * Scope flags:
5
+ * -l / --local → project scope only
6
+ * -g / --global → global scope only
7
+ * -a / --all → show both scopes (default)
8
+ * (none) → all available scopes
9
+ */
10
+ import { Command } from "commander";
11
+ import * as path from "node:path";
12
+ import { getGlobalRoot, findNearestLoadoutRoot, collectRootsWithSources, } from "../../core/discovery.js";
13
+ import { listLoadouts, parseLoadoutDefinition, parseRootConfig, } from "../../core/config.js";
14
+ import { loadState } from "../../core/manifest.js";
15
+ import { resolveScopes, SCOPE_FLAGS } from "../../core/scope.js";
16
+ import { fileExists } from "../../lib/fs.js";
17
+ import { log, heading } from "../../lib/output.js";
18
+ import { rootToScope, renderScopeLegend, } from "../../lib/scope-indicators.js";
19
+ import { calculateLoadoutColumnWidths, renderLoadoutHeader, renderLoadoutSeparator, renderLoadoutCellWithDefault, } from "../../lib/loadout-column.js";
20
+ import chalk from "chalk";
21
+ /**
22
+ * Collect loadouts from a root and its sources.
23
+ */
24
+ function collectLoadoutsFromRoot(primaryRoot, activeNames, seenNames, sourceChain, includeBundled = false) {
25
+ const { roots, warnings } = collectRootsWithSources(primaryRoot, false, includeBundled);
26
+ const infos = [];
27
+ // Collect source references for footer
28
+ for (const root of roots) {
29
+ if (root.level === "source" && root.sourceRef) {
30
+ if (!sourceChain.includes(root.sourceRef)) {
31
+ sourceChain.push(root.sourceRef);
32
+ }
33
+ }
34
+ }
35
+ const rootConfig = parseRootConfig(primaryRoot.path);
36
+ for (const root of roots) {
37
+ const loadoutNames = listLoadouts(root.path);
38
+ const scope = rootToScope(root);
39
+ for (const name of loadoutNames) {
40
+ // Skip if we've already seen this name (nearest wins)
41
+ if (seenNames.has(name))
42
+ continue;
43
+ seenNames.add(name);
44
+ const isDefault = root.level === "project" && rootConfig.default === name;
45
+ const isActive = activeNames.has(name);
46
+ const defPath = path.join(root.path, "loadouts", `${name}.yaml`);
47
+ const ymlPath = path.join(root.path, "loadouts", `${name}.yml`);
48
+ const filePath = fileExists(defPath) ? defPath : ymlPath;
49
+ try {
50
+ const def = parseLoadoutDefinition(filePath);
51
+ infos.push({
52
+ name,
53
+ isDefault,
54
+ isActive,
55
+ count: def.include.length,
56
+ description: def.description,
57
+ scope,
58
+ });
59
+ }
60
+ catch {
61
+ infos.push({ name, isDefault, isActive, count: 0, scope, error: true });
62
+ }
63
+ }
64
+ }
65
+ return { infos, warnings };
66
+ }
67
+ /**
68
+ * Render the loadouts as a columnar table.
69
+ */
70
+ function renderTable(infos, sourceChain) {
71
+ if (infos.length === 0) {
72
+ log.dim(" No loadouts defined");
73
+ return;
74
+ }
75
+ // Check if any loadout has a description
76
+ const hasDescriptions = infos.some(i => i.description);
77
+ // Calculate column widths - list has a default marker column
78
+ const listItems = infos.map(i => ({ loadoutName: i.name, scope: i.scope, isDefault: i.isDefault }));
79
+ const { nameWidth, scopeWidth, totalWidth: loadoutColWidth } = calculateLoadoutColumnWidths(listItems, { hasDefaultMarker: true });
80
+ const itemsWidth = 5; // "items" header
81
+ // ── Header ───────────────────────────────────────────────────────────────
82
+ const loadoutH = renderLoadoutHeader(loadoutColWidth);
83
+ const itemsH = chalk.dim("items".padStart(itemsWidth));
84
+ const descH = hasDescriptions ? " " + chalk.dim("description") : "";
85
+ console.log(` ${loadoutH} ${itemsH}${descH}`);
86
+ // ── Separator ─────────────────────────────────────────────────────────────
87
+ const sep = [
88
+ renderLoadoutSeparator(loadoutColWidth),
89
+ "─".repeat(itemsWidth),
90
+ ...(hasDescriptions ? ["─".repeat(30)] : []),
91
+ ].join(" ");
92
+ console.log(chalk.dim(` ${sep}`));
93
+ // ── Rows ──────────────────────────────────────────────────────────────────
94
+ for (const info of infos) {
95
+ const item = { loadoutName: info.name, scope: info.scope, isDefault: info.isDefault };
96
+ const loadoutCell = renderLoadoutCellWithDefault(item, info.isActive, nameWidth, scopeWidth, loadoutColWidth);
97
+ if (info.error) {
98
+ console.log(` ${loadoutCell} ${chalk.red("error")}`);
99
+ continue;
100
+ }
101
+ const itemsCol = chalk.cyan(String(info.count).padStart(itemsWidth));
102
+ const descCol = hasDescriptions && info.description
103
+ ? " " + chalk.dim(info.description)
104
+ : "";
105
+ console.log(` ${loadoutCell} ${itemsCol}${descCol}`);
106
+ }
107
+ // ── Footer ────────────────────────────────────────────────────────────────
108
+ console.log();
109
+ // Legend for markers
110
+ const activeLegend = `${chalk.green("▸")} active`;
111
+ const defaultLegend = `${chalk.cyan("*")} default`;
112
+ console.log(` ${activeLegend} ${defaultLegend}`);
113
+ // Scope legend
114
+ renderScopeLegend(infos);
115
+ // Source chain (if any external sources)
116
+ if (sourceChain.length > 0) {
117
+ console.log(chalk.dim(` sources: ${sourceChain.join(" → ")}`));
118
+ }
119
+ }
120
+ export const listCommand = new Command("list")
121
+ .description("List available loadouts")
122
+ .option(...SCOPE_FLAGS.local)
123
+ .option(...SCOPE_FLAGS.global)
124
+ .option(...SCOPE_FLAGS.all)
125
+ .action(async (options) => {
126
+ const cwd = process.cwd();
127
+ const scopes = await resolveScopes(options, cwd);
128
+ const allInfos = [];
129
+ const allWarnings = [];
130
+ const sourceChain = [];
131
+ // Collect from project scope
132
+ if (scopes.includes("project")) {
133
+ const projectRoot = await findNearestLoadoutRoot(cwd);
134
+ if (projectRoot) {
135
+ const state = loadState(projectRoot.path);
136
+ const activeNames = new Set(state?.active || []);
137
+ // Each scope gets its own seenNames - no cross-scope deduplication
138
+ const seenNames = new Set();
139
+ const { infos, warnings } = collectLoadoutsFromRoot(projectRoot, activeNames, seenNames, sourceChain, false // Don't include bundled for project scope
140
+ );
141
+ allInfos.push(...infos);
142
+ allWarnings.push(...warnings);
143
+ }
144
+ }
145
+ // Collect from global scope (independent from project)
146
+ if (scopes.includes("global")) {
147
+ const globalRoot = getGlobalRoot();
148
+ if (globalRoot) {
149
+ const state = loadState(globalRoot.path);
150
+ const activeNames = new Set(state?.active || []);
151
+ // Each scope gets its own seenNames - no cross-scope deduplication
152
+ const seenNames = new Set();
153
+ const { infos, warnings } = collectLoadoutsFromRoot(globalRoot, activeNames, seenNames, sourceChain, true // Include bundled for global scope
154
+ );
155
+ allInfos.push(...infos);
156
+ allWarnings.push(...warnings);
157
+ }
158
+ }
159
+ if (allInfos.length === 0 && allWarnings.length === 0) {
160
+ log.error("No loadout directories found.");
161
+ log.dim("Run 'loadout init' or 'loadout init --global' to get started.");
162
+ return;
163
+ }
164
+ // Build title based on scopes
165
+ let title;
166
+ if (scopes.length === 1) {
167
+ title = scopes[0] === "project" ? "Project loadouts" : "Global loadouts";
168
+ }
169
+ else {
170
+ title = "Available loadouts";
171
+ }
172
+ heading(title);
173
+ renderTable(allInfos, sourceChain);
174
+ // Show warnings
175
+ if (allWarnings.length > 0) {
176
+ console.log();
177
+ for (const w of allWarnings) {
178
+ log.warn(w);
179
+ }
180
+ }
181
+ });
182
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/cli/commands/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Policy functions for computing target active sets.
3
+ *
4
+ * Pure functions that determine what the active loadout set should become.
5
+ * Separated from mechanism (apply-core.ts) for testability and clarity.
6
+ */
7
+ export interface PolicyResult {
8
+ targets: string[];
9
+ /** If set, the command should exit early with this warning. */
10
+ earlyExit?: string;
11
+ }
12
+ /**
13
+ * Compute target set for activation: add names to current set, deduping.
14
+ */
15
+ export declare function computeActivateSet(current: string[], toAdd: string[]): PolicyResult;
16
+ /**
17
+ * Compute target set for deactivation: remove names from current set.
18
+ */
19
+ export declare function computeDeactivateSet(current: string[], toRemove: string[]): PolicyResult;
20
+ /**
21
+ * Compute target set for sync: re-render current active set.
22
+ */
23
+ export declare function computeSyncSet(current: string[]): PolicyResult;
24
+ /**
25
+ * Compute target set for clear: empty set (remove all).
26
+ */
27
+ export declare function computeClearSet(): PolicyResult;
28
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/policy.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EAAE,EACjB,KAAK,EAAE,MAAM,EAAE,GACd,YAAY,CAYd;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EAAE,EACjB,QAAQ,EAAE,MAAM,EAAE,GACjB,YAAY,CAYd;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,YAAY,CAK9D;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAE9C"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Policy functions for computing target active sets.
3
+ *
4
+ * Pure functions that determine what the active loadout set should become.
5
+ * Separated from mechanism (apply-core.ts) for testability and clarity.
6
+ */
7
+ /**
8
+ * Compute target set for activation: add names to current set, deduping.
9
+ */
10
+ export function computeActivateSet(current, toAdd) {
11
+ if (toAdd.length === 0) {
12
+ return { targets: [], earlyExit: "Activate requires at least one loadout name" };
13
+ }
14
+ const targets = [...current];
15
+ for (const name of toAdd) {
16
+ if (!targets.includes(name)) {
17
+ targets.push(name);
18
+ }
19
+ }
20
+ return { targets };
21
+ }
22
+ /**
23
+ * Compute target set for deactivation: remove names from current set.
24
+ */
25
+ export function computeDeactivateSet(current, toRemove) {
26
+ if (toRemove.length === 0) {
27
+ return { targets: [], earlyExit: "Deactivate requires at least one loadout name" };
28
+ }
29
+ const targets = current.filter((n) => !toRemove.includes(n));
30
+ if (targets.length === current.length) {
31
+ return { targets: [], earlyExit: `None of [${toRemove.join(", ")}] were active` };
32
+ }
33
+ return { targets };
34
+ }
35
+ /**
36
+ * Compute target set for sync: re-render current active set.
37
+ */
38
+ export function computeSyncSet(current) {
39
+ if (current.length === 0) {
40
+ return { targets: [], earlyExit: "No active loadouts to sync" };
41
+ }
42
+ return { targets: current };
43
+ }
44
+ /**
45
+ * Compute target set for clear: empty set (remove all).
46
+ */
47
+ export function computeClearSet() {
48
+ return { targets: [] };
49
+ }
50
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/cli/commands/policy.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAiB,EACjB,KAAe;IAEf,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,6CAA6C,EAAE,CAAC;IACnF,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAiB,EACjB,QAAkB;IAElB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,+CAA+C,EAAE,CAAC;IACrF,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7D,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;QACtC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,YAAY,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;IACpF,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAiB;IAC9C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,4BAA4B,EAAE,CAAC;IAClE,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;AACzB,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * loadout remove — Remove applied loadout outputs.
3
+ *
4
+ * Scope flags:
5
+ * -l / --local → project scope only
6
+ * -g / --global → global scope only
7
+ * -a / --all → remove from both scopes (default)
8
+ * (none) → all available scopes
9
+ */
10
+ import { Command } from "commander";
11
+ import { type ScopeFlags } from "../../core/scope.js";
12
+ import type { CommandContext } from "../../core/types.js";
13
+ export interface RemoveOptions extends ScopeFlags {
14
+ dryRun?: boolean;
15
+ }
16
+ /**
17
+ * Remove all managed outputs for a context and clear its state.
18
+ *
19
+ * If `name` is given and doesn't match the applied loadout, this is a no-op
20
+ * with a warning (so users don't accidentally clean the wrong loadout).
21
+ */
22
+ export declare function executeRemove(ctx: CommandContext, name?: string, options?: RemoveOptions): Promise<void>;
23
+ export declare const removeCommand: Command;
24
+ //# sourceMappingURL=remove.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/remove.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EAAgC,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEpF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,MAAM,WAAW,aAAc,SAAQ,UAAU;IAC/C,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,cAAc,EACnB,IAAI,CAAC,EAAE,MAAM,EACb,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAuCf;AAED,eAAO,MAAM,aAAa,SAatB,CAAC"}