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,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":"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"}
|
|
@@ -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"}
|