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.
- package/LICENSE +201 -0
- package/README.md +108 -0
- package/bundled/loadouts/loadouts.yaml +5 -0
- package/bundled/skills/loadout-usage/SKILL.md +110 -0
- package/dist/builtins/index.d.ts +14 -0
- package/dist/builtins/index.d.ts.map +1 -0
- package/dist/builtins/index.js +58 -0
- package/dist/builtins/index.js.map +1 -0
- package/dist/builtins/kinds/extension.d.ts +3 -0
- package/dist/builtins/kinds/extension.d.ts.map +1 -0
- package/dist/builtins/kinds/extension.js +9 -0
- package/dist/builtins/kinds/extension.js.map +1 -0
- package/dist/builtins/kinds/instruction.d.ts +3 -0
- package/dist/builtins/kinds/instruction.d.ts.map +1 -0
- package/dist/builtins/kinds/instruction.js +8 -0
- package/dist/builtins/kinds/instruction.js.map +1 -0
- package/dist/builtins/kinds/prompt.d.ts +3 -0
- package/dist/builtins/kinds/prompt.d.ts.map +1 -0
- package/dist/builtins/kinds/prompt.js +8 -0
- package/dist/builtins/kinds/prompt.js.map +1 -0
- package/dist/builtins/kinds/rule.d.ts +3 -0
- package/dist/builtins/kinds/rule.d.ts.map +1 -0
- package/dist/builtins/kinds/rule.js +10 -0
- package/dist/builtins/kinds/rule.js.map +1 -0
- package/dist/builtins/kinds/skill.d.ts +3 -0
- package/dist/builtins/kinds/skill.d.ts.map +1 -0
- package/dist/builtins/kinds/skill.js +8 -0
- package/dist/builtins/kinds/skill.js.map +1 -0
- package/dist/builtins/kinds/theme.d.ts +3 -0
- package/dist/builtins/kinds/theme.d.ts.map +1 -0
- package/dist/builtins/kinds/theme.js +8 -0
- package/dist/builtins/kinds/theme.js.map +1 -0
- package/dist/builtins/tools/claude-code.d.ts +3 -0
- package/dist/builtins/tools/claude-code.d.ts.map +1 -0
- package/dist/builtins/tools/claude-code.js +30 -0
- package/dist/builtins/tools/claude-code.js.map +1 -0
- package/dist/builtins/tools/codex.d.ts +3 -0
- package/dist/builtins/tools/codex.d.ts.map +1 -0
- package/dist/builtins/tools/codex.js +17 -0
- package/dist/builtins/tools/codex.js.map +1 -0
- package/dist/builtins/tools/cursor.d.ts +3 -0
- package/dist/builtins/tools/cursor.d.ts.map +1 -0
- package/dist/builtins/tools/cursor.js +22 -0
- package/dist/builtins/tools/cursor.js.map +1 -0
- package/dist/builtins/tools/opencode.d.ts +3 -0
- package/dist/builtins/tools/opencode.d.ts.map +1 -0
- package/dist/builtins/tools/opencode.js +45 -0
- package/dist/builtins/tools/opencode.js.map +1 -0
- package/dist/builtins/tools/pi.d.ts +3 -0
- package/dist/builtins/tools/pi.d.ts.map +1 -0
- package/dist/builtins/tools/pi.js +22 -0
- package/dist/builtins/tools/pi.js.map +1 -0
- package/dist/cli/commands/activate.d.ts +12 -0
- package/dist/cli/commands/activate.d.ts.map +1 -0
- package/dist/cli/commands/activate.js +70 -0
- package/dist/cli/commands/activate.js.map +1 -0
- package/dist/cli/commands/check.d.ts +12 -0
- package/dist/cli/commands/check.d.ts.map +1 -0
- package/dist/cli/commands/check.js +152 -0
- package/dist/cli/commands/check.js.map +1 -0
- package/dist/cli/commands/clear.d.ts +12 -0
- package/dist/cli/commands/clear.d.ts.map +1 -0
- package/dist/cli/commands/clear.js +25 -0
- package/dist/cli/commands/clear.js.map +1 -0
- package/dist/cli/commands/create.d.ts +11 -0
- package/dist/cli/commands/create.d.ts.map +1 -0
- package/dist/cli/commands/create.js +113 -0
- package/dist/cli/commands/create.js.map +1 -0
- package/dist/cli/commands/deactivate.d.ts +12 -0
- package/dist/cli/commands/deactivate.d.ts.map +1 -0
- package/dist/cli/commands/deactivate.js +67 -0
- package/dist/cli/commands/deactivate.js.map +1 -0
- package/dist/cli/commands/diff.d.ts +16 -0
- package/dist/cli/commands/diff.d.ts.map +1 -0
- package/dist/cli/commands/diff.js +144 -0
- package/dist/cli/commands/diff.js.map +1 -0
- package/dist/cli/commands/docs.d.ts +12 -0
- package/dist/cli/commands/docs.d.ts.map +1 -0
- package/dist/cli/commands/docs.js +115 -0
- package/dist/cli/commands/docs.js.map +1 -0
- package/dist/cli/commands/edit.d.ts +11 -0
- package/dist/cli/commands/edit.d.ts.map +1 -0
- package/dist/cli/commands/edit.js +71 -0
- package/dist/cli/commands/edit.js.map +1 -0
- package/dist/cli/commands/fallback.d.ts +9 -0
- package/dist/cli/commands/fallback.d.ts.map +1 -0
- package/dist/cli/commands/fallback.js +35 -0
- package/dist/cli/commands/fallback.js.map +1 -0
- package/dist/cli/commands/info.d.ts +23 -0
- package/dist/cli/commands/info.d.ts.map +1 -0
- package/dist/cli/commands/info.js +314 -0
- package/dist/cli/commands/info.js.map +1 -0
- package/dist/cli/commands/init.d.ts +18 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +255 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/install.d.ts +27 -0
- package/dist/cli/commands/install.d.ts.map +1 -0
- package/dist/cli/commands/install.js +586 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/instructions.d.ts +8 -0
- package/dist/cli/commands/instructions.d.ts.map +1 -0
- package/dist/cli/commands/instructions.js +218 -0
- package/dist/cli/commands/instructions.js.map +1 -0
- package/dist/cli/commands/kinds.d.ts +6 -0
- package/dist/cli/commands/kinds.d.ts.map +1 -0
- package/dist/cli/commands/kinds.js +59 -0
- package/dist/cli/commands/kinds.js.map +1 -0
- package/dist/cli/commands/list.d.ts +12 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +182 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/policy.d.ts +28 -0
- package/dist/cli/commands/policy.d.ts.map +1 -0
- package/dist/cli/commands/policy.js +50 -0
- package/dist/cli/commands/policy.js.map +1 -0
- package/dist/cli/commands/remove.d.ts +24 -0
- package/dist/cli/commands/remove.d.ts.map +1 -0
- package/dist/cli/commands/remove.js +64 -0
- package/dist/cli/commands/remove.js.map +1 -0
- package/dist/cli/commands/render-engine.d.ts +36 -0
- package/dist/cli/commands/render-engine.d.ts.map +1 -0
- package/dist/cli/commands/render-engine.js +177 -0
- package/dist/cli/commands/render-engine.js.map +1 -0
- package/dist/cli/commands/rule.d.ts +11 -0
- package/dist/cli/commands/rule.d.ts.map +1 -0
- package/dist/cli/commands/rule.js +302 -0
- package/dist/cli/commands/rule.js.map +1 -0
- package/dist/cli/commands/sanitize.d.ts +14 -0
- package/dist/cli/commands/sanitize.d.ts.map +1 -0
- package/dist/cli/commands/sanitize.js +62 -0
- package/dist/cli/commands/sanitize.js.map +1 -0
- package/dist/cli/commands/skill.d.ts +11 -0
- package/dist/cli/commands/skill.d.ts.map +1 -0
- package/dist/cli/commands/skill.js +380 -0
- package/dist/cli/commands/skill.js.map +1 -0
- package/dist/cli/commands/status.d.ts +26 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +454 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +14 -0
- package/dist/cli/commands/sync.d.ts.map +1 -0
- package/dist/cli/commands/sync.js +53 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/commands/update.d.ts +3 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +48 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/index.d.ts +11 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +134 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/config.d.ts +64 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +166 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/discovery.d.ts +50 -0
- package/dist/core/discovery.d.ts.map +1 -0
- package/dist/core/discovery.js +249 -0
- package/dist/core/discovery.js.map +1 -0
- package/dist/core/fallback.d.ts +23 -0
- package/dist/core/fallback.d.ts.map +1 -0
- package/dist/core/fallback.js +119 -0
- package/dist/core/fallback.js.map +1 -0
- package/dist/core/import-discovery.d.ts +56 -0
- package/dist/core/import-discovery.d.ts.map +1 -0
- package/dist/core/import-discovery.js +304 -0
- package/dist/core/import-discovery.js.map +1 -0
- package/dist/core/kindLoader.d.ts +119 -0
- package/dist/core/kindLoader.d.ts.map +1 -0
- package/dist/core/kindLoader.js +141 -0
- package/dist/core/kindLoader.js.map +1 -0
- package/dist/core/manifest.d.ts +39 -0
- package/dist/core/manifest.d.ts.map +1 -0
- package/dist/core/manifest.js +167 -0
- package/dist/core/manifest.js.map +1 -0
- package/dist/core/plugin.d.ts +22 -0
- package/dist/core/plugin.d.ts.map +1 -0
- package/dist/core/plugin.js +20 -0
- package/dist/core/plugin.js.map +1 -0
- package/dist/core/registry.d.ts +115 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +105 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/render.d.ts +64 -0
- package/dist/core/render.d.ts.map +1 -0
- package/dist/core/render.js +457 -0
- package/dist/core/render.js.map +1 -0
- package/dist/core/resolve.d.ts +39 -0
- package/dist/core/resolve.d.ts.map +1 -0
- package/dist/core/resolve.js +128 -0
- package/dist/core/resolve.js.map +1 -0
- package/dist/core/schema.d.ts +308 -0
- package/dist/core/schema.d.ts.map +1 -0
- package/dist/core/schema.js +81 -0
- package/dist/core/schema.js.map +1 -0
- package/dist/core/scope.d.ts +74 -0
- package/dist/core/scope.d.ts.map +1 -0
- package/dist/core/scope.js +176 -0
- package/dist/core/scope.js.map +1 -0
- package/dist/core/template.d.ts +32 -0
- package/dist/core/template.d.ts.map +1 -0
- package/dist/core/template.js +32 -0
- package/dist/core/template.js.map +1 -0
- package/dist/core/tokens.d.ts +33 -0
- package/dist/core/tokens.d.ts.map +1 -0
- package/dist/core/tokens.js +97 -0
- package/dist/core/tokens.js.map +1 -0
- package/dist/core/types.d.ts +103 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +10 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/artifact-paths.d.ts +39 -0
- package/dist/lib/artifact-paths.d.ts.map +1 -0
- package/dist/lib/artifact-paths.js +83 -0
- package/dist/lib/artifact-paths.js.map +1 -0
- package/dist/lib/artifact-table.d.ts +126 -0
- package/dist/lib/artifact-table.d.ts.map +1 -0
- package/dist/lib/artifact-table.js +263 -0
- package/dist/lib/artifact-table.js.map +1 -0
- package/dist/lib/editor.d.ts +17 -0
- package/dist/lib/editor.d.ts.map +1 -0
- package/dist/lib/editor.js +33 -0
- package/dist/lib/editor.js.map +1 -0
- package/dist/lib/fs.d.ts +87 -0
- package/dist/lib/fs.d.ts.map +1 -0
- package/dist/lib/fs.js +229 -0
- package/dist/lib/fs.js.map +1 -0
- package/dist/lib/git.d.ts +13 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +28 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/gitignore.d.ts +26 -0
- package/dist/lib/gitignore.d.ts.map +1 -0
- package/dist/lib/gitignore.js +97 -0
- package/dist/lib/gitignore.js.map +1 -0
- package/dist/lib/loadout-column.d.ts +66 -0
- package/dist/lib/loadout-column.d.ts.map +1 -0
- package/dist/lib/loadout-column.js +66 -0
- package/dist/lib/loadout-column.js.map +1 -0
- package/dist/lib/output.d.ts +15 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +32 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/scope-indicators.d.ts +60 -0
- package/dist/lib/scope-indicators.d.ts.map +1 -0
- package/dist/lib/scope-indicators.js +110 -0
- package/dist/lib/scope-indicators.js.map +1 -0
- package/docs/authoring.md +182 -0
- package/docs/commands.md +192 -0
- package/docs/concepts.md +114 -0
- package/docs/index.md +60 -0
- package/docs/quickstart.md +100 -0
- package/docs/troubleshooting.md +147 -0
- package/docs/visual-language.md +251 -0
- package/docs/workflows.md +184 -0
- 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":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAY,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACnG,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,MAAM,gBAAgB,GAAG,cAAc,CAAC;AAExC;;GAEG;AACH,SAAS,kBAAkB,CAAC,WAAmB,EAAE,WAAmB;IAClE,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,EAAE,UAAU,WAAW,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,WAAmB;IAC3C,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC;IACnC,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC,WAAW,CACxE,sCAAsC,CACvC,CAAC;AAEF,uCAAuC;AACvC,mBAAmB;KAChB,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,0CAA0C,CAAC;KACvD,QAAQ,CAAC,WAAW,EAAE,kDAAkD,CAAC;KACzE,MAAM,CAAC,aAAa,EAAE,yBAAyB,CAAC;KAChD,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE;IACrC,MAAM,WAAW,GAAG,MAAM,sBAAsB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAEhE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,GAAG,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;QACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,aAAa,GAAG,WAAW,IAAI,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,kBAAkB,CAAC,WAAW,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAErE,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC3C,GAAG,CAAC,IAAI,CAAC,oCAAoC,QAAQ,EAAE,CAAC,CAAC;QACzD,GAAG,CAAC,GAAG,CAAC,4CAA4C,aAAa,EAAE,CAAC,CAAC;QACrE,GAAG,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG;;2EAEuD,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCvF,CAAC;IAEE,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC7B,GAAG,CAAC,OAAO,CAAC,gCAAgC,aAAa,KAAK,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,WAAW,QAAQ,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,GAAG,CAAC,GAAG,CAAC,iFAAiF,CAAC,CAAC;IAC3F,GAAG,CAAC,GAAG,CAAC,8CAA8C,aAAa,sCAAsC,CAAC,CAAC;AAC7G,CAAC,CAAC,CAAC;AAEL,uCAAuC;AACvC,mBAAmB;KAChB,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,qCAAqC,CAAC;KAClD,QAAQ,CAAC,WAAW,EAAE,kDAAkD,CAAC;KACzE,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE;IAC5B,MAAM,WAAW,GAAG,MAAM,sBAAsB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAEhE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,GAAG,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,aAAa,GAAG,WAAW,IAAI,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,kBAAkB,CAAC,WAAW,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAErE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,GAAG,CAAC,KAAK,CAAC,mDAAmD,aAAa,KAAK,CAAC,CAAC;QACjF,GAAG,CAAC,GAAG,CAAC,8CAA8C,aAAa,EAAE,CAAC,CAAC;QACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC;IAEjE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE;QACtC,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC;IAEH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACxB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACf,GAAG,CAAC,OAAO,CAAC,8BAA8B,aAAa,KAAK,CAAC,CAAC;QAChE,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,sCAAsC;AACtC,mBAAmB;KAChB,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,kDAAkD,CAAC;KAC/D,QAAQ,CAAC,QAAQ,EAAE,gEAAgE,CAAC;KACpF,MAAM,CAAC,kBAAkB,EAAE,oDAAoD,CAAC;KAChF,MAAM,CAAC,QAAQ,EAAE,gDAAgD,CAAC;KAClE,MAAM,CAAC,aAAa,EAAE,qCAAqC,CAAC;KAC5D,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;IAClC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,MAAM,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAEtD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,GAAG,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;QACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,IAAI,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAE5E,qCAAqC;IACrC,IAAI,UAAkB,CAAC;IACvB,IAAI,QAAQ,EAAE,CAAC;QACb,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YACpC,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAClC,CAAC;SAAM,CAAC;QACN,sCAAsC;QACtC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACvD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAEvD,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,UAAU,GAAG,UAAU,CAAC;QAC1B,CAAC;aAAM,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAClC,UAAU,GAAG,UAAU,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;YAC9D,GAAG,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;YAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,GAAG,CAAC,KAAK,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAG,kBAAkB,CAAC,WAAW,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAErE,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC3C,GAAG,CAAC,KAAK,CAAC,uBAAuB,aAAa,oBAAoB,CAAC,CAAC;QACpE,GAAG,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,gBAAgB;IAChB,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAE/B,gCAAgC;IAChC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,UAAU,CAAC,UAAU,CAAC,CAAC;QACvB,GAAG,CAAC,GAAG,CAAC,qBAAqB,UAAU,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,GAAG,CAAC,OAAO,CAAC,mCAAmC,aAAa,KAAK,CAAC,CAAC;IACnE,GAAG,CAAC,GAAG,CAAC,4CAA4C,aAAa,sCAAsC,CAAC,CAAC;IACzG,GAAG,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;AACpD,CAAC,CAAC,CAAC;AAEL,6BAA6B;AAC7B,mBAAmB;KAChB,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,wBAAwB,CAAC;KACrC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,WAAW,GAAG,MAAM,sBAAsB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAEhE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,GAAG,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IAEtE,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACjC,GAAG,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QACvC,GAAG,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IAED,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,eAAe,CAAC;SAC1C,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;SACzD,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAE7D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,GAAG,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QACvC,GAAG,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IAED,MAAM,aAAa,GAAG,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAEzD,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,KAAK,aAAa,CAAC;QACxC,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,MAAM,MAAM,EAAE,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC,CAAC,CAAC"}
|
|
@@ -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"}
|