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,454 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* loadout status — Show drift status for active loadouts.
|
|
3
|
+
*
|
|
4
|
+
* Displays a unified table of all active loadouts with drift status.
|
|
5
|
+
* Uses the same visual language as `info` and `list`:
|
|
6
|
+
* • (dim) — global scope
|
|
7
|
+
* ◦ (cyan) — local/project scope
|
|
8
|
+
* →name (yellow) — external source
|
|
9
|
+
*
|
|
10
|
+
* Detects two types of drift:
|
|
11
|
+
* 1. Config drift: loadout definition changed (items added/removed)
|
|
12
|
+
* 2. Output drift: managed files changed on disk (modified/missing/unlinked)
|
|
13
|
+
*
|
|
14
|
+
* Scope flags:
|
|
15
|
+
* -l / --local → project scope only
|
|
16
|
+
* -g / --global → global scope only
|
|
17
|
+
* -a / --all → show both scopes (default)
|
|
18
|
+
*/
|
|
19
|
+
import * as path from "node:path";
|
|
20
|
+
import { Command } from "commander";
|
|
21
|
+
import chalk from "chalk";
|
|
22
|
+
import { loadState, detectDrift } from "../../core/manifest.js";
|
|
23
|
+
import { loadResolvedLoadout } from "../../core/resolve.js";
|
|
24
|
+
import { planRender } from "../../core/render.js";
|
|
25
|
+
import { findUnsanitizedRules } from "../../core/config.js";
|
|
26
|
+
import { resolveContexts, SCOPE_FLAGS } from "../../core/scope.js";
|
|
27
|
+
import { log, heading } from "../../lib/output.js";
|
|
28
|
+
import { getArtifactName, truncatePath, getToolColumns, calculateColumnWidths, KIND_SORT_ORDER, } from "../../lib/artifact-table.js";
|
|
29
|
+
import { extractRelativePath } from "../../lib/artifact-paths.js";
|
|
30
|
+
import { getScopeFromRoots, renderScopeLegend, } from "../../lib/scope-indicators.js";
|
|
31
|
+
import { calculateLoadoutColumnWidths, renderLoadoutHeader, renderLoadoutSeparator, renderLoadoutCell, } from "../../lib/loadout-column.js";
|
|
32
|
+
// Status priority for determining "worst" status (higher = worse)
|
|
33
|
+
const STATUS_PRIORITY = {
|
|
34
|
+
ok: 0,
|
|
35
|
+
modified: 1,
|
|
36
|
+
unlinked: 2,
|
|
37
|
+
misdirected: 3,
|
|
38
|
+
missing: 4,
|
|
39
|
+
broken: 5,
|
|
40
|
+
};
|
|
41
|
+
// Status display symbols and colors
|
|
42
|
+
const STATUS_DISPLAY = {
|
|
43
|
+
ok: { symbol: "✓", color: chalk.green },
|
|
44
|
+
modified: { symbol: "~", color: chalk.yellow },
|
|
45
|
+
unlinked: { symbol: "⚡", color: chalk.yellow },
|
|
46
|
+
misdirected: { symbol: "→", color: chalk.red },
|
|
47
|
+
missing: { symbol: "!", color: chalk.red },
|
|
48
|
+
broken: { symbol: "💀", color: chalk.red },
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Detect config drift by comparing current loadout definition against applied state.
|
|
52
|
+
*/
|
|
53
|
+
function detectConfigDrift(plan, state) {
|
|
54
|
+
const stateTargets = new Set(state.entries.map((e) => e.targetPath));
|
|
55
|
+
const planTargets = new Set(plan.outputs.map((o) => o.spec.targetPath));
|
|
56
|
+
const added = plan.outputs
|
|
57
|
+
.filter((o) => !stateTargets.has(o.spec.targetPath))
|
|
58
|
+
.map((o) => o.spec.targetPath);
|
|
59
|
+
const removed = state.entries
|
|
60
|
+
.filter((e) => !planTargets.has(e.targetPath))
|
|
61
|
+
.map((e) => e.targetPath);
|
|
62
|
+
return { added, removed };
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Convert sourcePath to a display-friendly relative path.
|
|
66
|
+
*/
|
|
67
|
+
function getRelativePath(sourcePath, configPath, projectRoot) {
|
|
68
|
+
// Try the consolidated helper first (handles bundled, .loadout, etc.)
|
|
69
|
+
const extracted = extractRelativePath(sourcePath);
|
|
70
|
+
// If it extracted something meaningful (not just parent/basename fallback)
|
|
71
|
+
if (!extracted.includes(path.sep) || extracted.startsWith("skills/") ||
|
|
72
|
+
extracted.startsWith("rules/") || extracted.startsWith("instructions/") ||
|
|
73
|
+
extracted.startsWith("extensions/")) {
|
|
74
|
+
return extracted;
|
|
75
|
+
}
|
|
76
|
+
// Fallback to relative path calculation
|
|
77
|
+
const relConfig = path.relative(configPath, sourcePath);
|
|
78
|
+
if (!relConfig.startsWith(".."))
|
|
79
|
+
return relConfig;
|
|
80
|
+
const relProject = path.relative(projectRoot, sourcePath);
|
|
81
|
+
if (!relProject.startsWith(".."))
|
|
82
|
+
return relProject;
|
|
83
|
+
return extracted;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Group drift results by artifact (sourcePath) and compute per-tool status.
|
|
87
|
+
*/
|
|
88
|
+
function groupByArtifact(driftResults, configPath, projectRoot) {
|
|
89
|
+
const toolSet = new Set();
|
|
90
|
+
for (const result of driftResults) {
|
|
91
|
+
for (const tool of result.entry.tools) {
|
|
92
|
+
toolSet.add(tool);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const tools = Array.from(toolSet).sort();
|
|
96
|
+
const bySource = new Map();
|
|
97
|
+
for (const result of driftResults) {
|
|
98
|
+
const key = result.entry.sourcePath;
|
|
99
|
+
if (!bySource.has(key))
|
|
100
|
+
bySource.set(key, []);
|
|
101
|
+
bySource.get(key).push(result);
|
|
102
|
+
}
|
|
103
|
+
const artifacts = [];
|
|
104
|
+
for (const [sourcePath, results] of bySource) {
|
|
105
|
+
const toolStatus = new Map();
|
|
106
|
+
let worstPriority = 0;
|
|
107
|
+
let overallStatus = "ok";
|
|
108
|
+
for (const result of results) {
|
|
109
|
+
for (const tool of result.entry.tools) {
|
|
110
|
+
toolStatus.set(tool, result.status);
|
|
111
|
+
}
|
|
112
|
+
const priority = STATUS_PRIORITY[result.status];
|
|
113
|
+
if (priority > worstPriority) {
|
|
114
|
+
worstPriority = priority;
|
|
115
|
+
overallStatus = result.status;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
const relativePath = getRelativePath(sourcePath, configPath, projectRoot);
|
|
119
|
+
const kind = results[0].entry.kind;
|
|
120
|
+
artifacts.push({
|
|
121
|
+
name: getArtifactName(relativePath, kind),
|
|
122
|
+
relativePath,
|
|
123
|
+
kind,
|
|
124
|
+
toolStatus,
|
|
125
|
+
overallStatus,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
return { artifacts, tools };
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Sort artifacts: worst status first, then by kind priority, then by name.
|
|
132
|
+
*/
|
|
133
|
+
function sortByStatusThenKind(artifacts) {
|
|
134
|
+
return [...artifacts].sort((a, b) => {
|
|
135
|
+
const pa = STATUS_PRIORITY[a.overallStatus];
|
|
136
|
+
const pb = STATUS_PRIORITY[b.overallStatus];
|
|
137
|
+
if (pa !== pb)
|
|
138
|
+
return pb - pa;
|
|
139
|
+
const orderA = KIND_SORT_ORDER[a.kind] ?? 100;
|
|
140
|
+
const orderB = KIND_SORT_ORDER[b.kind] ?? 100;
|
|
141
|
+
if (orderA !== orderB)
|
|
142
|
+
return orderA - orderB;
|
|
143
|
+
return a.name.localeCompare(b.name);
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Collapse skill reference files into their parent skill.
|
|
148
|
+
*/
|
|
149
|
+
function collapseSkillReferences(artifacts) {
|
|
150
|
+
const skillGroups = new Map();
|
|
151
|
+
const nonSkills = [];
|
|
152
|
+
for (const artifact of artifacts) {
|
|
153
|
+
if (artifact.kind !== "skill") {
|
|
154
|
+
nonSkills.push(artifact);
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
const match = artifact.relativePath.match(/^skills\/([^/]+)/);
|
|
158
|
+
if (!match) {
|
|
159
|
+
nonSkills.push(artifact);
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
const skillName = match[1];
|
|
163
|
+
if (!skillGroups.has(skillName))
|
|
164
|
+
skillGroups.set(skillName, []);
|
|
165
|
+
skillGroups.get(skillName).push(artifact);
|
|
166
|
+
}
|
|
167
|
+
const collapsedSkills = [];
|
|
168
|
+
for (const [skillName, files] of skillGroups) {
|
|
169
|
+
const mergedToolStatus = new Map();
|
|
170
|
+
let worstPriority = 0;
|
|
171
|
+
let overallStatus = "ok";
|
|
172
|
+
for (const file of files) {
|
|
173
|
+
for (const [tool, status] of file.toolStatus) {
|
|
174
|
+
const existing = mergedToolStatus.get(tool);
|
|
175
|
+
if (!existing || STATUS_PRIORITY[status] > STATUS_PRIORITY[existing]) {
|
|
176
|
+
mergedToolStatus.set(tool, status);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
const priority = STATUS_PRIORITY[file.overallStatus];
|
|
180
|
+
if (priority > worstPriority) {
|
|
181
|
+
worstPriority = priority;
|
|
182
|
+
overallStatus = file.overallStatus;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
collapsedSkills.push({
|
|
186
|
+
name: skillName,
|
|
187
|
+
relativePath: `skills/${skillName}`,
|
|
188
|
+
kind: "skill",
|
|
189
|
+
toolStatus: mergedToolStatus,
|
|
190
|
+
overallStatus,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
return [...nonSkills, ...collapsedSkills];
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Load status group for a single loadout within a context.
|
|
197
|
+
*/
|
|
198
|
+
async function loadStatusGroupForLoadout(ctx, loadoutName, state, showReferences) {
|
|
199
|
+
// Resolve the loadout to get its items
|
|
200
|
+
let loadout;
|
|
201
|
+
let roots = [];
|
|
202
|
+
let scope = ctx.scope === "global" ? { type: "global" } : { type: "local" };
|
|
203
|
+
try {
|
|
204
|
+
const result = await loadResolvedLoadout(ctx, loadoutName);
|
|
205
|
+
loadout = result.loadout;
|
|
206
|
+
roots = result.roots;
|
|
207
|
+
scope = getScopeFromRoots(loadout.rootPath, roots, ctx.scope);
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
// Loadout can't be resolved (deleted, broken, etc.) - skip
|
|
211
|
+
return null;
|
|
212
|
+
}
|
|
213
|
+
// Plan what this loadout would render
|
|
214
|
+
const plan = await planRender(loadout, ctx.projectRoot, ctx.scope, ctx.configPath);
|
|
215
|
+
// Build a set of source paths this loadout owns
|
|
216
|
+
const loadoutSourcePaths = new Set();
|
|
217
|
+
for (const output of plan.outputs) {
|
|
218
|
+
loadoutSourcePaths.add(output.spec.sourcePath);
|
|
219
|
+
}
|
|
220
|
+
// Filter drift results to only include entries from this loadout
|
|
221
|
+
const allDriftResults = detectDrift(state, ctx.projectRoot);
|
|
222
|
+
const loadoutDriftResults = allDriftResults.filter((r) => loadoutSourcePaths.has(r.entry.sourcePath));
|
|
223
|
+
const { artifacts, tools } = groupByArtifact(loadoutDriftResults, ctx.configPath, ctx.projectRoot);
|
|
224
|
+
// Process artifacts
|
|
225
|
+
let displayArtifacts;
|
|
226
|
+
if (showReferences) {
|
|
227
|
+
displayArtifacts = artifacts.map((a) => ({ ...a, name: a.relativePath }));
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
displayArtifacts = collapseSkillReferences(artifacts);
|
|
231
|
+
}
|
|
232
|
+
// Detect config drift for this loadout
|
|
233
|
+
// Compare plan outputs to manifest entries with matching source paths
|
|
234
|
+
const manifestTargetsForLoadout = new Set(state.entries
|
|
235
|
+
.filter((e) => loadoutSourcePaths.has(e.sourcePath))
|
|
236
|
+
.map((e) => e.targetPath));
|
|
237
|
+
const planTargets = new Set(plan.outputs.map((o) => o.spec.targetPath));
|
|
238
|
+
const added = plan.outputs
|
|
239
|
+
.filter((o) => !manifestTargetsForLoadout.has(o.spec.targetPath))
|
|
240
|
+
.map((o) => o.spec.targetPath);
|
|
241
|
+
const removed = state.entries
|
|
242
|
+
.filter((e) => loadoutSourcePaths.has(e.sourcePath) && !planTargets.has(e.targetPath))
|
|
243
|
+
.map((e) => e.targetPath);
|
|
244
|
+
const config = { added, removed };
|
|
245
|
+
// Process shadowed files for this loadout
|
|
246
|
+
const loadoutShadowed = plan.shadowed.map((s) => ({
|
|
247
|
+
targetPath: s.targetPath,
|
|
248
|
+
tools: [s.tool],
|
|
249
|
+
}));
|
|
250
|
+
// Check sync status
|
|
251
|
+
const configInSync = config.added.length === 0 && config.removed.length === 0;
|
|
252
|
+
const outputInSync = displayArtifacts.every((a) => a.overallStatus === "ok");
|
|
253
|
+
const inSync = configInSync && outputInSync;
|
|
254
|
+
return {
|
|
255
|
+
loadoutName,
|
|
256
|
+
scope,
|
|
257
|
+
isActive: true,
|
|
258
|
+
appliedAt: state.appliedAt,
|
|
259
|
+
mode: state.mode,
|
|
260
|
+
artifacts: displayArtifacts,
|
|
261
|
+
tools,
|
|
262
|
+
config,
|
|
263
|
+
shadowed: loadoutShadowed,
|
|
264
|
+
inSync,
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Load all status groups for a context (one per active loadout).
|
|
269
|
+
*/
|
|
270
|
+
async function loadStatusGroupsForContext(ctx, showReferences) {
|
|
271
|
+
const state = loadState(ctx.configPath);
|
|
272
|
+
if (!state || state.active.length === 0)
|
|
273
|
+
return [];
|
|
274
|
+
const groups = [];
|
|
275
|
+
for (const loadoutName of state.active) {
|
|
276
|
+
const group = await loadStatusGroupForLoadout(ctx, loadoutName, state, showReferences);
|
|
277
|
+
if (group && group.artifacts.length > 0) {
|
|
278
|
+
groups.push(group);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return groups;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Render the unified status table.
|
|
285
|
+
*/
|
|
286
|
+
function renderUnifiedStatusTable(groups) {
|
|
287
|
+
if (groups.length === 0) {
|
|
288
|
+
log.dim(" No artifacts.");
|
|
289
|
+
console.log();
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
// Flatten all artifacts for column width calculation
|
|
293
|
+
const allArtifacts = [];
|
|
294
|
+
for (const group of groups) {
|
|
295
|
+
for (const artifact of group.artifacts) {
|
|
296
|
+
allArtifacts.push({ ...artifact, loadoutName: group.loadoutName });
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
if (allArtifacts.length === 0) {
|
|
300
|
+
log.dim(" No artifacts.");
|
|
301
|
+
console.log();
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
// Collect all tools across all groups
|
|
305
|
+
const allToolsSet = new Set();
|
|
306
|
+
for (const group of groups) {
|
|
307
|
+
for (const tool of group.tools) {
|
|
308
|
+
allToolsSet.add(tool);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
const allTools = Array.from(allToolsSet).sort();
|
|
312
|
+
// Calculate column widths
|
|
313
|
+
const { nameWidth: loadoutNameWidth, scopeWidth, totalWidth: loadoutColWidth } = calculateLoadoutColumnWidths(groups);
|
|
314
|
+
const { kindWidth, nameWidth } = calculateColumnWidths(allArtifacts);
|
|
315
|
+
const toolCols = getToolColumns(allTools);
|
|
316
|
+
const STATUS_W = 8;
|
|
317
|
+
// ── Header ───────────────────────────────────────────────────────────────
|
|
318
|
+
const loadoutH = renderLoadoutHeader(loadoutColWidth);
|
|
319
|
+
const kindH = chalk.dim("kind".padEnd(kindWidth));
|
|
320
|
+
const nameH = chalk.dim("artifact".padEnd(nameWidth));
|
|
321
|
+
const toolH = toolCols.map((c) => chalk.dim(c.tool)).join(" ");
|
|
322
|
+
const statusH = chalk.dim("status");
|
|
323
|
+
console.log(` ${loadoutH} ${kindH} ${nameH} ${toolH} ${statusH}`);
|
|
324
|
+
// ── Separator ─────────────────────────────────────────────────────────────
|
|
325
|
+
const sepParts = [
|
|
326
|
+
renderLoadoutSeparator(loadoutColWidth),
|
|
327
|
+
"─".repeat(kindWidth),
|
|
328
|
+
"─".repeat(nameWidth),
|
|
329
|
+
toolCols.map((c) => "─".repeat(c.width)).join(" "),
|
|
330
|
+
"─".repeat(STATUS_W),
|
|
331
|
+
];
|
|
332
|
+
console.log(chalk.dim(` ${sepParts.join(" ")}`));
|
|
333
|
+
// ── Rows (grouped by loadout) ─────────────────────────────────────────────
|
|
334
|
+
for (const group of groups) {
|
|
335
|
+
const sortedArtifacts = sortByStatusThenKind(group.artifacts);
|
|
336
|
+
for (let i = 0; i < sortedArtifacts.length; i++) {
|
|
337
|
+
const artifact = sortedArtifacts[i];
|
|
338
|
+
const isFirstInGroup = i === 0;
|
|
339
|
+
// Loadout cell (only show on first row of group)
|
|
340
|
+
const loadoutCell = renderLoadoutCell(isFirstInGroup ? group : null, loadoutNameWidth, scopeWidth, loadoutColWidth);
|
|
341
|
+
const kindCell = chalk.dim(artifact.kind.padEnd(kindWidth));
|
|
342
|
+
const nameCell = truncatePath(artifact.name, nameWidth).padEnd(nameWidth);
|
|
343
|
+
// Tool status cells
|
|
344
|
+
// Tool cells - right-justified within each column
|
|
345
|
+
const toolCells = toolCols
|
|
346
|
+
.map((c) => {
|
|
347
|
+
const status = artifact.toolStatus.get(c.tool);
|
|
348
|
+
if (!status)
|
|
349
|
+
return " ".repeat(c.width);
|
|
350
|
+
const { symbol, color } = STATUS_DISPLAY[status];
|
|
351
|
+
const symbolWidth = symbol === "💀" ? 2 : 1;
|
|
352
|
+
return " ".repeat(c.width - symbolWidth) + color(symbol);
|
|
353
|
+
})
|
|
354
|
+
.join(" ");
|
|
355
|
+
// Overall status
|
|
356
|
+
const { color: overallColor } = STATUS_DISPLAY[artifact.overallStatus];
|
|
357
|
+
const statusCell = overallColor(artifact.overallStatus);
|
|
358
|
+
console.log(` ${loadoutCell} ${kindCell} ${nameCell} ${toolCells} ${statusCell}`);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
console.log();
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Render config drift summary.
|
|
365
|
+
*/
|
|
366
|
+
function renderConfigDriftSummary(groups) {
|
|
367
|
+
const totalAdded = groups.reduce((sum, g) => sum + g.config.added.length, 0);
|
|
368
|
+
const totalRemoved = groups.reduce((sum, g) => sum + g.config.removed.length, 0);
|
|
369
|
+
if (totalAdded > 0) {
|
|
370
|
+
log.info(`${totalAdded} to add`);
|
|
371
|
+
}
|
|
372
|
+
if (totalRemoved > 0) {
|
|
373
|
+
log.warn(`${totalRemoved} to remove`);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Render shadowed files summary.
|
|
378
|
+
*/
|
|
379
|
+
function renderShadowedSummary(groups) {
|
|
380
|
+
const allShadowed = groups.flatMap((g) => g.shadowed);
|
|
381
|
+
if (allShadowed.length === 0)
|
|
382
|
+
return;
|
|
383
|
+
log.dim(`${allShadowed.length} shadowed (unmanaged files blocking outputs):`);
|
|
384
|
+
for (const { targetPath, tools } of allShadowed.slice(0, 5)) {
|
|
385
|
+
log.dim(` ? ${targetPath} ${chalk.dim(`(${tools.join(", ")})`)}`);
|
|
386
|
+
}
|
|
387
|
+
if (allShadowed.length > 5) {
|
|
388
|
+
log.dim(` ... and ${allShadowed.length - 5} more`);
|
|
389
|
+
}
|
|
390
|
+
console.log();
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Check for unsanitized rules and warn.
|
|
394
|
+
*/
|
|
395
|
+
function checkUnsanitizedRules(ctx) {
|
|
396
|
+
const unsanitized = findUnsanitizedRules(ctx.configPath);
|
|
397
|
+
if (unsanitized.length === 0)
|
|
398
|
+
return;
|
|
399
|
+
log.warn(`${unsanitized.length} rule(s) need sanitization for cross-tool compatibility:`);
|
|
400
|
+
for (const name of unsanitized) {
|
|
401
|
+
log.dim(` ${name}`);
|
|
402
|
+
}
|
|
403
|
+
log.dim("Run 'loadouts sanitize' to fix.");
|
|
404
|
+
console.log();
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Execute status command - unified view of all active loadouts.
|
|
408
|
+
*/
|
|
409
|
+
export async function executeStatus(contexts, showReferences) {
|
|
410
|
+
const groups = [];
|
|
411
|
+
for (const ctx of contexts) {
|
|
412
|
+
// Check for unsanitized rules first
|
|
413
|
+
checkUnsanitizedRules(ctx);
|
|
414
|
+
const contextGroups = await loadStatusGroupsForContext(ctx, showReferences);
|
|
415
|
+
groups.push(...contextGroups);
|
|
416
|
+
}
|
|
417
|
+
if (groups.length === 0) {
|
|
418
|
+
return false;
|
|
419
|
+
}
|
|
420
|
+
heading("Loadout status");
|
|
421
|
+
// Config drift summary (only if there's drift)
|
|
422
|
+
renderConfigDriftSummary(groups);
|
|
423
|
+
// Unified table
|
|
424
|
+
renderUnifiedStatusTable(groups);
|
|
425
|
+
// Shadowed files
|
|
426
|
+
renderShadowedSummary(groups);
|
|
427
|
+
// Scope legend
|
|
428
|
+
renderScopeLegend(groups);
|
|
429
|
+
// Overall sync status
|
|
430
|
+
const allInSync = groups.every((g) => g.inSync);
|
|
431
|
+
console.log();
|
|
432
|
+
if (allInSync) {
|
|
433
|
+
log.success("All in sync");
|
|
434
|
+
}
|
|
435
|
+
else {
|
|
436
|
+
log.dim("Run 'loadouts sync' to reconcile.");
|
|
437
|
+
}
|
|
438
|
+
return true;
|
|
439
|
+
}
|
|
440
|
+
export const statusCommand = new Command("status")
|
|
441
|
+
.description("Show loadout status and drift")
|
|
442
|
+
.option(...SCOPE_FLAGS.local)
|
|
443
|
+
.option(...SCOPE_FLAGS.global)
|
|
444
|
+
.option(...SCOPE_FLAGS.all)
|
|
445
|
+
.option("-r, --references", "Show individual skill reference files")
|
|
446
|
+
.action(async (options) => {
|
|
447
|
+
const { contexts } = await resolveContexts(options);
|
|
448
|
+
const hasAny = await executeStatus(contexts, options.references ?? false);
|
|
449
|
+
if (!hasAny) {
|
|
450
|
+
log.warn("No loadout applied.");
|
|
451
|
+
log.dim("Run 'loadouts activate <name>' to apply a loadout.");
|
|
452
|
+
}
|
|
453
|
+
});
|
|
454
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* loadout sync — Re-render current active loadouts from latest definitions.
|
|
3
|
+
*
|
|
4
|
+
* Scope flags:
|
|
5
|
+
* -l / --local → project scope only
|
|
6
|
+
* -g / --global → global scope only
|
|
7
|
+
* -a / --all → sync both scopes (default)
|
|
8
|
+
* (none) → all available scopes
|
|
9
|
+
*
|
|
10
|
+
* On fresh clone (no state), automatically applies the default loadout.
|
|
11
|
+
*/
|
|
12
|
+
import { Command } from "commander";
|
|
13
|
+
export declare const syncCommand: Command;
|
|
14
|
+
//# sourceMappingURL=sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,eAAO,MAAM,WAAW,SAwCpB,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* loadout sync — Re-render current active loadouts from latest definitions.
|
|
3
|
+
*
|
|
4
|
+
* Scope flags:
|
|
5
|
+
* -l / --local → project scope only
|
|
6
|
+
* -g / --global → global scope only
|
|
7
|
+
* -a / --all → sync both scopes (default)
|
|
8
|
+
* (none) → all available scopes
|
|
9
|
+
*
|
|
10
|
+
* On fresh clone (no state), automatically applies the default loadout.
|
|
11
|
+
*/
|
|
12
|
+
import { Command } from "commander";
|
|
13
|
+
import { loadState } from "../../core/manifest.js";
|
|
14
|
+
import { parseRootConfig } from "../../core/config.js";
|
|
15
|
+
import { resolveContexts, SCOPE_FLAGS } from "../../core/scope.js";
|
|
16
|
+
import { computeSyncSet } from "./policy.js";
|
|
17
|
+
import { applyTargetSet } from "./render-engine.js";
|
|
18
|
+
import { log } from "../../lib/output.js";
|
|
19
|
+
export const syncCommand = new Command("sync")
|
|
20
|
+
.description("Re-render current active loadouts from latest definitions")
|
|
21
|
+
.option(...SCOPE_FLAGS.local)
|
|
22
|
+
.option(...SCOPE_FLAGS.global)
|
|
23
|
+
.option(...SCOPE_FLAGS.all)
|
|
24
|
+
.option("--dry-run", "Preview changes without applying")
|
|
25
|
+
.action(async (options) => {
|
|
26
|
+
const { contexts } = await resolveContexts(options);
|
|
27
|
+
let synced = false;
|
|
28
|
+
for (const ctx of contexts) {
|
|
29
|
+
const state = loadState(ctx.configPath);
|
|
30
|
+
let current = state?.active ?? [];
|
|
31
|
+
// Fresh clone: no state exists, apply default loadout
|
|
32
|
+
if (!state) {
|
|
33
|
+
const rootConfig = parseRootConfig(ctx.configPath);
|
|
34
|
+
const defaultLoadout = rootConfig.default ?? "base";
|
|
35
|
+
log.info(`[${ctx.scope}] No state found, applying default loadout '${defaultLoadout}'...`);
|
|
36
|
+
current = [defaultLoadout];
|
|
37
|
+
}
|
|
38
|
+
const { targets, earlyExit } = computeSyncSet(current);
|
|
39
|
+
if (earlyExit) {
|
|
40
|
+
log.dim(`[${ctx.scope}] ${earlyExit}`);
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
await applyTargetSet(ctx, targets, {
|
|
44
|
+
dryRun: options.dryRun,
|
|
45
|
+
verb: state ? "Synced" : "Applied",
|
|
46
|
+
});
|
|
47
|
+
synced = true;
|
|
48
|
+
}
|
|
49
|
+
if (!synced) {
|
|
50
|
+
log.warn("No active loadouts to sync.");
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/cli/commands/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,WAAW,EAAmB,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAM1C,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,2DAA2D,CAAC;KACxE,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC;KAC5B,MAAM,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC;KAC7B,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC;KAC1B,MAAM,CAAC,WAAW,EAAE,kCAAkC,CAAC;KACvD,MAAM,CAAC,KAAK,EAAE,OAAoB,EAAE,EAAE;IACrC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;IAEpD,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACxC,IAAI,OAAO,GAAG,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC;QAElC,sDAAsD;QACtD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACnD,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,IAAI,MAAM,CAAC;YACpD,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,+CAA+C,cAAc,MAAM,CAAC,CAAC;YAC3F,OAAO,GAAG,CAAC,cAAc,CAAC,CAAC;QAC7B,CAAC;QAED,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QAEvD,IAAI,SAAS,EAAE,CAAC;YACd,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC,CAAC;YACvC,SAAS;QACX,CAAC;QAED,MAAM,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE;YACjC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;SACnC,CAAC,CAAC;QACH,MAAM,GAAG,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,GAAG,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,aAAa,SA4CtB,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { createRequire } from "module";
|
|
3
|
+
import { execSync } from "child_process";
|
|
4
|
+
import { heading, log } from "../../lib/output.js";
|
|
5
|
+
const require = createRequire(import.meta.url);
|
|
6
|
+
const pkg = require("../../../package.json");
|
|
7
|
+
export const updateCommand = new Command("update")
|
|
8
|
+
.description("Update loadout to the latest version")
|
|
9
|
+
.option("--check", "Check for updates without installing")
|
|
10
|
+
.action(async (opts) => {
|
|
11
|
+
heading("Update");
|
|
12
|
+
const currentVersion = pkg.version;
|
|
13
|
+
log.info(`Current version: ${currentVersion}`);
|
|
14
|
+
// Fetch latest version from npm
|
|
15
|
+
let latestVersion;
|
|
16
|
+
try {
|
|
17
|
+
latestVersion = execSync(`npm view ${pkg.name} version`, {
|
|
18
|
+
encoding: "utf-8",
|
|
19
|
+
}).trim();
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
log.error("Failed to check for updates. Are you online?");
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
if (currentVersion === latestVersion) {
|
|
26
|
+
log.success(`Already on latest version (${currentVersion})`);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
log.info(`Latest version: ${latestVersion}`);
|
|
30
|
+
if (opts.check) {
|
|
31
|
+
log.plain(`\nRun 'loadout update' to install the update.`);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
// Perform the update
|
|
35
|
+
log.info(`\nUpdating ${currentVersion} → ${latestVersion}...`);
|
|
36
|
+
try {
|
|
37
|
+
execSync(`npm install -g ${pkg.name}@latest`, {
|
|
38
|
+
stdio: "inherit",
|
|
39
|
+
});
|
|
40
|
+
log.success(`Updated to ${latestVersion}`);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
log.error("Update failed. Try running manually:");
|
|
44
|
+
log.plain(` npm install -g ${pkg.name}@latest`);
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;AAE7C,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,sCAAsC,CAAC;KACnD,MAAM,CAAC,SAAS,EAAE,sCAAsC,CAAC;KACzD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,OAAO,CAAC,QAAQ,CAAC,CAAC;IAElB,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC;IACnC,GAAG,CAAC,IAAI,CAAC,oBAAoB,cAAc,EAAE,CAAC,CAAC;IAE/C,gCAAgC;IAChC,IAAI,aAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,aAAa,GAAG,QAAQ,CAAC,YAAY,GAAG,CAAC,IAAI,UAAU,EAAE;YACvD,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,cAAc,KAAK,aAAa,EAAE,CAAC;QACrC,GAAG,CAAC,OAAO,CAAC,8BAA8B,cAAc,GAAG,CAAC,CAAC;QAC7D,OAAO;IACT,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,oBAAoB,aAAa,EAAE,CAAC,CAAC;IAE9C,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;QAC3D,OAAO;IACT,CAAC;IAED,qBAAqB;IACrB,GAAG,CAAC,IAAI,CAAC,cAAc,cAAc,MAAM,aAAa,KAAK,CAAC,CAAC;IAC/D,IAAI,CAAC;QACH,QAAQ,CAAC,kBAAkB,GAAG,CAAC,IAAI,SAAS,EAAE;YAC5C,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QACH,GAAG,CAAC,OAAO,CAAC,cAAc,aAAa,EAAE,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAClD,GAAG,CAAC,KAAK,CAAC,oBAAoB,GAAG,CAAC,IAAI,SAAS,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI setup with Commander
|
|
3
|
+
*
|
|
4
|
+
* All commands support scope flags:
|
|
5
|
+
* -l / --local → project scope
|
|
6
|
+
* -g / --global → global scope
|
|
7
|
+
* -a / --all → both scopes (default for status/list/sync/clear)
|
|
8
|
+
*/
|
|
9
|
+
import { Command } from "commander";
|
|
10
|
+
export declare const cli: Command;
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAQ,MAAM,WAAW,CAAC;AA4E1C,eAAO,MAAM,GAAG,SAGO,CAAC"}
|