loadouts 0.2.0 → 0.2.2
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/README.md +3 -1
- package/dist/builtins/index.d.ts.map +1 -1
- package/dist/builtins/index.js +26 -13
- package/dist/builtins/index.js.map +1 -1
- package/dist/builtins/tools/cursor.js +2 -2
- package/dist/builtins/tools/cursor.js.map +1 -1
- package/dist/builtins/tools/opencode.d.ts.map +1 -1
- package/dist/builtins/tools/opencode.js +8 -2
- package/dist/builtins/tools/opencode.js.map +1 -1
- package/dist/cli/commands/check.d.ts.map +1 -1
- package/dist/cli/commands/check.js +17 -1
- package/dist/cli/commands/check.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +484 -50
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +6 -1
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/install.d.ts +6 -3
- package/dist/cli/commands/install.d.ts.map +1 -1
- package/dist/cli/commands/install.js +225 -87
- package/dist/cli/commands/install.js.map +1 -1
- package/dist/cli/commands/rule.js +11 -7
- package/dist/cli/commands/rule.js.map +1 -1
- package/dist/cli/commands/sanitize.d.ts +3 -2
- package/dist/cli/commands/sanitize.d.ts.map +1 -1
- package/dist/cli/commands/sanitize.js +27 -13
- package/dist/cli/commands/sanitize.js.map +1 -1
- package/dist/cli/commands/skill.d.ts.map +1 -1
- package/dist/cli/commands/skill.js +23 -14
- package/dist/cli/commands/skill.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +15 -10
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/core/config.d.ts +73 -13
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +224 -34
- package/dist/core/config.js.map +1 -1
- package/dist/core/import-discovery.d.ts +9 -4
- package/dist/core/import-discovery.d.ts.map +1 -1
- package/dist/core/import-discovery.js +414 -141
- package/dist/core/import-discovery.js.map +1 -1
- package/dist/core/schema.d.ts +91 -11
- package/dist/core/schema.d.ts.map +1 -1
- package/dist/core/schema.js +28 -0
- package/dist/core/schema.js.map +1 -1
- package/docs/commands.md +4 -2
- package/docs/index.md +1 -0
- package/docs/quickstart.md +4 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,11 +5,15 @@
|
|
|
5
5
|
* then allows the user to import them into .loadouts/.
|
|
6
6
|
*/
|
|
7
7
|
import { Command } from "commander";
|
|
8
|
-
|
|
8
|
+
import { type ScopeFlags } from "../../core/scope.js";
|
|
9
|
+
import type { CommandContext } from "../../core/types.js";
|
|
10
|
+
export interface InstallOptions extends ScopeFlags {
|
|
9
11
|
rules?: boolean;
|
|
10
12
|
skills?: boolean;
|
|
11
13
|
instructions?: boolean;
|
|
14
|
+
kinds?: string;
|
|
12
15
|
from?: string;
|
|
16
|
+
source?: string;
|
|
13
17
|
to?: string;
|
|
14
18
|
interactive?: boolean;
|
|
15
19
|
yes?: boolean;
|
|
@@ -21,7 +25,6 @@ export interface InstallResult {
|
|
|
21
25
|
skipped: number;
|
|
22
26
|
failed: number;
|
|
23
27
|
}
|
|
24
|
-
export declare function runInstall(
|
|
28
|
+
export declare function runInstall(ctx: CommandContext, options: InstallOptions): Promise<InstallResult>;
|
|
25
29
|
export declare const installCommand: Command;
|
|
26
|
-
export {};
|
|
27
30
|
//# sourceMappingURL=install.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/install.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/install.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiCpC,OAAO,EAAgC,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAIpF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAO1D,MAAM,WAAW,cAAe,SAAQ,UAAU;IAChD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AA0dD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,UAAU,CAC9B,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CAyPxB;AAMD,eAAO,MAAM,cAAc,SAmIvB,CAAC"}
|
|
@@ -5,15 +5,17 @@
|
|
|
5
5
|
* then allows the user to import them into .loadouts/.
|
|
6
6
|
*/
|
|
7
7
|
import { Command } from "commander";
|
|
8
|
+
import * as fs from "node:fs";
|
|
8
9
|
import * as path from "node:path";
|
|
9
10
|
import * as readline from "node:readline";
|
|
10
11
|
import * as yaml from "yaml";
|
|
11
12
|
import chalk from "chalk";
|
|
12
13
|
import { discoverImportableArtifacts, groupByKind, formatSize, formatRelativeTime, } from "../../core/import-discovery.js";
|
|
13
|
-
import { findNearestLoadoutRoot } from "../../core/discovery.js";
|
|
14
14
|
import { writeFile, fileExists, copyFile, copyDir, removeFile, removeDir, isDirectory, listFiles, } from "../../lib/fs.js";
|
|
15
|
-
import { parseLoadoutDefinition, sanitizeRuleFile } from "../../core/config.js";
|
|
15
|
+
import { parseLoadoutDefinition, sanitizeRuleFile, sanitizeSkillFile, } from "../../core/config.js";
|
|
16
16
|
import { loadState } from "../../core/manifest.js";
|
|
17
|
+
import { registry } from "../../core/registry.js";
|
|
18
|
+
import { resolveContexts, SCOPE_FLAGS } from "../../core/scope.js";
|
|
17
19
|
import { log, heading } from "../../lib/output.js";
|
|
18
20
|
import { rebuildAllGitignores } from "../../lib/gitignore.js";
|
|
19
21
|
import { initProjectLoadout } from "./init.js";
|
|
@@ -26,6 +28,89 @@ function createPrompt() {
|
|
|
26
28
|
output: process.stdout,
|
|
27
29
|
});
|
|
28
30
|
}
|
|
31
|
+
function isPathWithin(parentPath, childPath) {
|
|
32
|
+
const rel = path.relative(parentPath, childPath);
|
|
33
|
+
return rel === "" || (!!rel && !rel.startsWith("..") && !path.isAbsolute(rel));
|
|
34
|
+
}
|
|
35
|
+
function resolvePhysicalPath(filePath) {
|
|
36
|
+
try {
|
|
37
|
+
return fs.realpathSync(filePath);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return path.resolve(filePath);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function resolveInstallSource(cwd, source) {
|
|
44
|
+
if (!source)
|
|
45
|
+
return undefined;
|
|
46
|
+
const sourcePath = path.isAbsolute(source) ? source : path.resolve(cwd, source);
|
|
47
|
+
if (!fileExists(sourcePath)) {
|
|
48
|
+
throw new Error(`Source path not found: ${sourcePath}`);
|
|
49
|
+
}
|
|
50
|
+
const stat = fs.statSync(sourcePath);
|
|
51
|
+
if (!stat.isFile() && !stat.isDirectory()) {
|
|
52
|
+
throw new Error(`Source path must be a file or directory: ${sourcePath}`);
|
|
53
|
+
}
|
|
54
|
+
return sourcePath;
|
|
55
|
+
}
|
|
56
|
+
function getSourceScanRoot(sourcePath) {
|
|
57
|
+
return isDirectory(sourcePath) ? sourcePath : path.dirname(sourcePath);
|
|
58
|
+
}
|
|
59
|
+
function addRelativeToolBaseRoots(sourcePath, basePath, roots) {
|
|
60
|
+
if (path.isAbsolute(basePath) || /{[^}]+}/.test(basePath))
|
|
61
|
+
return;
|
|
62
|
+
const baseParts = basePath.split(/[\\/]+/).filter(Boolean);
|
|
63
|
+
if (baseParts.length === 0)
|
|
64
|
+
return;
|
|
65
|
+
const resolvedSource = path.resolve(sourcePath);
|
|
66
|
+
const sourceParts = resolvedSource.split(path.sep);
|
|
67
|
+
for (let i = 0; i <= sourceParts.length - baseParts.length; i += 1) {
|
|
68
|
+
const matches = baseParts.every((part, offset) => sourceParts[i + offset] === part);
|
|
69
|
+
if (!matches)
|
|
70
|
+
continue;
|
|
71
|
+
const root = sourceParts.slice(0, i).join(path.sep) || path.parse(resolvedSource).root;
|
|
72
|
+
roots.add(root);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function getSourceScanRoots(sourcePath) {
|
|
76
|
+
const roots = new Set([getSourceScanRoot(sourcePath)]);
|
|
77
|
+
for (const toolName of registry.allToolNames()) {
|
|
78
|
+
const tool = registry.getTool(toolName);
|
|
79
|
+
if (!tool)
|
|
80
|
+
continue;
|
|
81
|
+
addRelativeToolBaseRoots(sourcePath, tool.basePath.project, roots);
|
|
82
|
+
addRelativeToolBaseRoots(sourcePath, tool.basePath.global, roots);
|
|
83
|
+
}
|
|
84
|
+
return [...roots];
|
|
85
|
+
}
|
|
86
|
+
function mergeDiscoveryResults(results) {
|
|
87
|
+
const artifacts = [];
|
|
88
|
+
const seen = new Set();
|
|
89
|
+
const warnings = results.flatMap((result) => result.warnings);
|
|
90
|
+
for (const result of results) {
|
|
91
|
+
for (const artifact of result.artifacts) {
|
|
92
|
+
const key = `${artifact.kind}:${artifact.sourcePath}:${artifact.destPath}`;
|
|
93
|
+
if (seen.has(key))
|
|
94
|
+
continue;
|
|
95
|
+
seen.add(key);
|
|
96
|
+
artifacts.push(artifact);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const conflicts = new Map();
|
|
100
|
+
const byDest = new Map();
|
|
101
|
+
for (const artifact of artifacts) {
|
|
102
|
+
const key = `${artifact.kind}:${artifact.destPath}`;
|
|
103
|
+
const existing = byDest.get(key) ?? [];
|
|
104
|
+
existing.push(artifact);
|
|
105
|
+
byDest.set(key, existing);
|
|
106
|
+
}
|
|
107
|
+
for (const [key, items] of byDest) {
|
|
108
|
+
if (items.length > 1) {
|
|
109
|
+
conflicts.set(key, items);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return { artifacts, conflicts, warnings };
|
|
113
|
+
}
|
|
29
114
|
async function askQuestion(rl, question) {
|
|
30
115
|
return new Promise((resolve) => {
|
|
31
116
|
rl.question(question, (answer) => {
|
|
@@ -38,38 +123,20 @@ async function askQuestion(rl, question) {
|
|
|
38
123
|
// ---------------------------------------------------------------------------
|
|
39
124
|
function displayDiscoveryResults(result) {
|
|
40
125
|
const grouped = groupByKind(result.artifacts);
|
|
126
|
+
const kinds = Object.keys(grouped).sort();
|
|
41
127
|
console.log();
|
|
42
128
|
log.info(`Found ${result.artifacts.length} artifacts to import:`);
|
|
43
129
|
console.log();
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
52
|
-
console.log();
|
|
53
|
-
}
|
|
54
|
-
// Rules
|
|
55
|
-
if (grouped.rule.length > 0) {
|
|
56
|
-
console.log(chalk.bold(" RULES") + chalk.dim(` (${grouped.rule.length})`));
|
|
57
|
-
for (const artifact of grouped.rule) {
|
|
58
|
-
const conflict = result.conflicts.has(`rule:${artifact.name}`);
|
|
59
|
-
const suffix = conflict ? chalk.yellow(" ⚠ conflict") : "";
|
|
60
|
-
const toolHint = chalk.dim(` (${artifact.tool})`);
|
|
61
|
-
console.log(chalk.dim(" ○ ") + artifact.name + toolHint + suffix);
|
|
62
|
-
}
|
|
63
|
-
console.log();
|
|
64
|
-
}
|
|
65
|
-
// Skills
|
|
66
|
-
if (grouped.skill.length > 0) {
|
|
67
|
-
console.log(chalk.bold(" SKILLS") + chalk.dim(` (${grouped.skill.length})`));
|
|
68
|
-
for (const artifact of grouped.skill) {
|
|
69
|
-
const conflict = result.conflicts.has(`skill:${artifact.name}`);
|
|
130
|
+
for (const kind of kinds) {
|
|
131
|
+
const items = grouped[kind];
|
|
132
|
+
if (!items || items.length === 0)
|
|
133
|
+
continue;
|
|
134
|
+
console.log(chalk.bold(` ${kind.toUpperCase()}`) + chalk.dim(` (${items.length})`));
|
|
135
|
+
for (const artifact of items) {
|
|
136
|
+
const conflict = result.conflicts.has(`${artifact.kind}:${artifact.destPath}`);
|
|
70
137
|
const suffix = conflict ? chalk.yellow(" ⚠ conflict") : "";
|
|
71
|
-
const toolHint = chalk.dim(` (${artifact.tool})`);
|
|
72
|
-
console.log(chalk.dim(" ○ ") + artifact.
|
|
138
|
+
const toolHint = artifact.tool === "project-root" ? "" : chalk.dim(` (${artifact.tool})`);
|
|
139
|
+
console.log(chalk.dim(" ○ ") + artifact.displayPath + toolHint + suffix);
|
|
73
140
|
}
|
|
74
141
|
console.log();
|
|
75
142
|
}
|
|
@@ -79,6 +146,16 @@ function displayDiscoveryResults(result) {
|
|
|
79
146
|
console.log(chalk.dim(" Conflicts will be resolved during import"));
|
|
80
147
|
console.log();
|
|
81
148
|
}
|
|
149
|
+
if (result.warnings.length > 0) {
|
|
150
|
+
console.log(chalk.yellow(` ⚠ ${result.warnings.length} discovery warning(s)`));
|
|
151
|
+
for (const warning of result.warnings.slice(0, 5)) {
|
|
152
|
+
console.log(chalk.dim(` - ${warning}`));
|
|
153
|
+
}
|
|
154
|
+
if (result.warnings.length > 5) {
|
|
155
|
+
console.log(chalk.dim(` - ... and ${result.warnings.length - 5} more`));
|
|
156
|
+
}
|
|
157
|
+
console.log();
|
|
158
|
+
}
|
|
82
159
|
}
|
|
83
160
|
function displayImportTable(results, targetLoadout, keep) {
|
|
84
161
|
console.log();
|
|
@@ -122,7 +199,7 @@ async function resolveConflicts(result, rl) {
|
|
|
122
199
|
const resolved = [];
|
|
123
200
|
const seen = new Set();
|
|
124
201
|
for (const artifact of result.artifacts) {
|
|
125
|
-
const key = `${artifact.kind}:${artifact.
|
|
202
|
+
const key = `${artifact.kind}:${artifact.destPath}`;
|
|
126
203
|
// Skip if we've already handled this conflict
|
|
127
204
|
if (seen.has(key))
|
|
128
205
|
continue;
|
|
@@ -162,12 +239,10 @@ async function resolveConflicts(result, rl) {
|
|
|
162
239
|
for (const c of conflicting) {
|
|
163
240
|
const renamed = { ...c };
|
|
164
241
|
const toolSuffix = c.tool === "project-root" ? "" : `-${c.tool}`;
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
renamed.destPath = `skills/${c.name}${toolSuffix}`;
|
|
170
|
-
}
|
|
242
|
+
const ext = path.extname(c.destPath);
|
|
243
|
+
renamed.destPath = ext
|
|
244
|
+
? `${c.destPath.slice(0, -ext.length)}${toolSuffix}${ext}`
|
|
245
|
+
: `${c.destPath}${toolSuffix}`;
|
|
171
246
|
resolved.push(renamed);
|
|
172
247
|
}
|
|
173
248
|
}
|
|
@@ -191,25 +266,29 @@ async function resolveConflicts(result, rl) {
|
|
|
191
266
|
// ---------------------------------------------------------------------------
|
|
192
267
|
async function importArtifact(artifact, loadoutPath, options) {
|
|
193
268
|
const destPath = path.join(loadoutPath, artifact.destPath);
|
|
269
|
+
const kind = registry.getKind(artifact.kind);
|
|
194
270
|
if (options.dryRun) {
|
|
195
271
|
return { artifact, success: true };
|
|
196
272
|
}
|
|
197
273
|
try {
|
|
198
|
-
if (
|
|
274
|
+
if (kind?.layout === "dir") {
|
|
199
275
|
// Copy directory
|
|
200
276
|
copyDir(artifact.sourcePath, destPath);
|
|
277
|
+
if (artifact.kind === "skill") {
|
|
278
|
+
sanitizeSkillFile(path.join(destPath, "SKILL.md"));
|
|
279
|
+
}
|
|
201
280
|
}
|
|
202
281
|
else {
|
|
203
282
|
// Copy file
|
|
204
283
|
copyFile(artifact.sourcePath, destPath);
|
|
205
|
-
//
|
|
284
|
+
// Canonicalize known native frontmatter aliases on import.
|
|
206
285
|
if (artifact.kind === "rule") {
|
|
207
286
|
sanitizeRuleFile(destPath);
|
|
208
287
|
}
|
|
209
288
|
}
|
|
210
289
|
// Remove original unless --keep
|
|
211
290
|
if (!options.keep) {
|
|
212
|
-
if (
|
|
291
|
+
if (kind?.layout === "dir") {
|
|
213
292
|
removeDir(artifact.sourcePath);
|
|
214
293
|
}
|
|
215
294
|
else {
|
|
@@ -319,27 +398,43 @@ async function resolveTargetLoadout(loadoutPath, options, rl) {
|
|
|
319
398
|
}
|
|
320
399
|
return { loadout: "base", confirmed: true };
|
|
321
400
|
}
|
|
322
|
-
export async function runInstall(
|
|
401
|
+
export async function runInstall(ctx, options) {
|
|
402
|
+
const projectRoot = ctx.projectRoot;
|
|
403
|
+
const loadoutPath = ctx.configPath;
|
|
404
|
+
const sourcePath = options.source ? path.resolve(options.source) : undefined;
|
|
405
|
+
if (sourcePath && isPathWithin(resolvePhysicalPath(loadoutPath), resolvePhysicalPath(sourcePath))) {
|
|
406
|
+
throw new Error("Refusing to import from the target .loadouts directory.");
|
|
407
|
+
}
|
|
323
408
|
// Build filter options
|
|
324
409
|
const kinds = (() => {
|
|
325
|
-
const selected =
|
|
410
|
+
const selected = new Set();
|
|
326
411
|
if (options.rules)
|
|
327
|
-
selected.
|
|
412
|
+
selected.add("rule");
|
|
328
413
|
if (options.skills)
|
|
329
|
-
selected.
|
|
414
|
+
selected.add("skill");
|
|
330
415
|
if (options.instructions)
|
|
331
|
-
selected.
|
|
332
|
-
|
|
416
|
+
selected.add("instruction");
|
|
417
|
+
if (options.kinds) {
|
|
418
|
+
for (const kind of options.kinds.split(",").map((k) => k.trim()).filter(Boolean)) {
|
|
419
|
+
selected.add(kind);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
return selected.size > 0 ? [...selected] : undefined;
|
|
333
423
|
})();
|
|
334
424
|
const tools = options.from?.split(",").map((t) => t.trim());
|
|
425
|
+
const scanRoots = sourcePath ? getSourceScanRoots(sourcePath) : [projectRoot];
|
|
335
426
|
// Discover artifacts
|
|
336
|
-
const result = discoverImportableArtifacts(
|
|
427
|
+
const result = mergeDiscoveryResults(scanRoots.map((scanRoot) => discoverImportableArtifacts(scanRoot, {
|
|
428
|
+
scope: ctx.scope,
|
|
337
429
|
tools,
|
|
338
430
|
kinds,
|
|
431
|
+
sourcePath,
|
|
339
432
|
loadoutPath,
|
|
340
|
-
});
|
|
433
|
+
})));
|
|
341
434
|
if (result.artifacts.length === 0) {
|
|
342
|
-
log.dim(
|
|
435
|
+
log.dim(sourcePath
|
|
436
|
+
? `No importable configurations found in ${sourcePath}.`
|
|
437
|
+
: "No existing configurations found to import.");
|
|
343
438
|
return { imported: 0, skipped: 0, failed: 0 };
|
|
344
439
|
}
|
|
345
440
|
// Display what we found
|
|
@@ -350,7 +445,7 @@ export async function runInstall(projectRoot, loadoutPath, options) {
|
|
|
350
445
|
artifactsToImport = [];
|
|
351
446
|
const seen = new Set();
|
|
352
447
|
for (const artifact of result.artifacts) {
|
|
353
|
-
const key = `${artifact.kind}:${artifact.
|
|
448
|
+
const key = `${artifact.kind}:${artifact.destPath}`;
|
|
354
449
|
if (seen.has(key))
|
|
355
450
|
continue;
|
|
356
451
|
seen.add(key);
|
|
@@ -403,13 +498,13 @@ export async function runInstall(projectRoot, loadoutPath, options) {
|
|
|
403
498
|
if (answer === "i") {
|
|
404
499
|
// Switch to interactive mode
|
|
405
500
|
rl.close();
|
|
406
|
-
return runInstall(
|
|
501
|
+
return runInstall(ctx, { ...options, interactive: true });
|
|
407
502
|
}
|
|
408
503
|
// Resolve conflicts automatically (take newest)
|
|
409
504
|
artifactsToImport = [];
|
|
410
505
|
const seen = new Set();
|
|
411
506
|
for (const artifact of result.artifacts) {
|
|
412
|
-
const key = `${artifact.kind}:${artifact.
|
|
507
|
+
const key = `${artifact.kind}:${artifact.destPath}`;
|
|
413
508
|
if (seen.has(key))
|
|
414
509
|
continue;
|
|
415
510
|
seen.add(key);
|
|
@@ -475,7 +570,7 @@ export async function runInstall(projectRoot, loadoutPath, options) {
|
|
|
475
570
|
if (options.dryRun) {
|
|
476
571
|
console.log();
|
|
477
572
|
log.info("Dry run — no changes made");
|
|
478
|
-
displayImportTable(artifactsToImport.map((a) => ({ artifact: a, success: true })), targetLoadout,
|
|
573
|
+
displayImportTable(artifactsToImport.map((a) => ({ artifact: a, success: true })), targetLoadout, true);
|
|
479
574
|
return { imported: artifactsToImport.length, skipped: 0, failed: 0 };
|
|
480
575
|
}
|
|
481
576
|
const results = [];
|
|
@@ -493,7 +588,7 @@ export async function runInstall(projectRoot, loadoutPath, options) {
|
|
|
493
588
|
if (successfulArtifacts.length > 0) {
|
|
494
589
|
await addToLoadout(successfulArtifacts, loadoutPath, targetLoadout);
|
|
495
590
|
// Rebuild per-target .gitignore files for all artifacts after import
|
|
496
|
-
rebuildAllGitignores(loadoutPath, projectRoot,
|
|
591
|
+
rebuildAllGitignores(loadoutPath, projectRoot, ctx.scope);
|
|
497
592
|
}
|
|
498
593
|
// Display results
|
|
499
594
|
displayImportTable(results, targetLoadout, options.keep ?? false);
|
|
@@ -511,29 +606,47 @@ export async function runInstall(projectRoot, loadoutPath, options) {
|
|
|
511
606
|
// ---------------------------------------------------------------------------
|
|
512
607
|
export const installCommand = new Command("install")
|
|
513
608
|
.description("Import existing tool configurations into loadout")
|
|
609
|
+
.argument("[source]", "Optional file or directory to import from")
|
|
610
|
+
.option(...SCOPE_FLAGS.local)
|
|
611
|
+
.option(...SCOPE_FLAGS.global)
|
|
612
|
+
.option(...SCOPE_FLAGS.all)
|
|
514
613
|
.option("--rules", "Only import rules")
|
|
515
614
|
.option("--skills", "Only import skills")
|
|
516
615
|
.option("--instructions", "Only import instructions")
|
|
517
|
-
.option("--
|
|
616
|
+
.option("--kinds <kinds>", "Only import specific kind IDs (comma-separated)")
|
|
617
|
+
.option("--from <tools>", "Only from specific tools (comma-separated)")
|
|
518
618
|
.option("-i, --interactive", "Interactive selection mode")
|
|
519
619
|
.option("-y, --yes", "Auto-confirm without prompting")
|
|
520
620
|
.option("--dry-run", "Preview changes without applying")
|
|
521
621
|
.option("--keep", "Keep original files after import")
|
|
522
622
|
.option("--to <loadout>", "Target loadout to add artifacts to (default: auto-detect from active)")
|
|
523
|
-
.action(async (options) => {
|
|
623
|
+
.action(async (source, options) => {
|
|
524
624
|
const cwd = process.cwd();
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
625
|
+
let resolvedSource;
|
|
626
|
+
try {
|
|
627
|
+
resolvedSource = resolveInstallSource(cwd, source);
|
|
628
|
+
}
|
|
629
|
+
catch (err) {
|
|
630
|
+
log.error(err instanceof Error ? err.message : String(err));
|
|
631
|
+
process.exit(1);
|
|
632
|
+
}
|
|
633
|
+
const installOptions = { ...options, source: resolvedSource };
|
|
634
|
+
let contexts = [];
|
|
635
|
+
try {
|
|
636
|
+
({ contexts } = await resolveContexts(installOptions, cwd));
|
|
637
|
+
}
|
|
638
|
+
catch (err) {
|
|
639
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
640
|
+
const canAutoInitProject = !installOptions.global &&
|
|
641
|
+
!installOptions.all &&
|
|
642
|
+
message.includes("No loadout found");
|
|
643
|
+
if (!canAutoInitProject) {
|
|
644
|
+
log.error(message);
|
|
645
|
+
process.exit(1);
|
|
646
|
+
}
|
|
533
647
|
console.log();
|
|
534
648
|
log.warn("No project .loadouts/ found.");
|
|
535
|
-
|
|
536
|
-
if (!options.yes) {
|
|
649
|
+
if (!installOptions.yes) {
|
|
537
650
|
const rl = readline.createInterface({
|
|
538
651
|
input: process.stdin,
|
|
539
652
|
output: process.stdout,
|
|
@@ -552,37 +665,62 @@ export const installCommand = new Command("install")
|
|
|
552
665
|
else {
|
|
553
666
|
log.info("Auto-initializing project loadout...");
|
|
554
667
|
}
|
|
555
|
-
// Initialize a minimal project loadout
|
|
556
668
|
console.log();
|
|
557
|
-
if (
|
|
669
|
+
if (installOptions.dryRun) {
|
|
558
670
|
log.info("Would initialize .loadouts/ (dry-run)");
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
671
|
+
const configPath = path.join(cwd, ".loadouts");
|
|
672
|
+
contexts = [
|
|
673
|
+
{
|
|
674
|
+
scope: "project",
|
|
675
|
+
configPath,
|
|
676
|
+
statePath: path.join(configPath, ".state.json"),
|
|
677
|
+
projectRoot: cwd,
|
|
678
|
+
},
|
|
679
|
+
];
|
|
563
680
|
}
|
|
564
681
|
else {
|
|
565
|
-
|
|
566
|
-
|
|
682
|
+
const configPath = await initProjectLoadout(cwd);
|
|
683
|
+
contexts = [
|
|
684
|
+
{
|
|
685
|
+
scope: "project",
|
|
686
|
+
configPath,
|
|
687
|
+
statePath: path.join(configPath, ".state.json"),
|
|
688
|
+
projectRoot: cwd,
|
|
689
|
+
},
|
|
690
|
+
];
|
|
567
691
|
}
|
|
568
692
|
}
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
}
|
|
573
|
-
console.log();
|
|
574
|
-
log.info("Scanning for existing configurations...");
|
|
575
|
-
try {
|
|
576
|
-
const result = await runInstall(projectRoot, loadoutPath, options);
|
|
577
|
-
if (result.failed > 0) {
|
|
693
|
+
if (resolvedSource && contexts.length > 1) {
|
|
694
|
+
if (installOptions.all) {
|
|
695
|
+
log.error("Installing from a source path targets one scope at a time. Use -l or -g.");
|
|
578
696
|
process.exit(1);
|
|
579
697
|
}
|
|
698
|
+
const projectContext = contexts.find((ctx) => ctx.scope === "project");
|
|
699
|
+
contexts = projectContext ? [projectContext] : [contexts[0]];
|
|
700
|
+
log.dim("Using project scope for source install. Use -g to target global instead.");
|
|
580
701
|
}
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
702
|
+
const multipleScopes = contexts.length > 1;
|
|
703
|
+
let hasFailures = false;
|
|
704
|
+
for (const ctx of contexts) {
|
|
705
|
+
console.log();
|
|
706
|
+
const scopeLabel = ctx.scope === "global" ? " [global]" : " [project]";
|
|
707
|
+
const sourceLabel = resolvedSource ? ` in ${resolvedSource}` : "";
|
|
708
|
+
log.info(`Scanning for existing configurations${sourceLabel}${multipleScopes ? scopeLabel : ""}...`);
|
|
709
|
+
try {
|
|
710
|
+
const result = await runInstall(ctx, installOptions);
|
|
711
|
+
if (result.failed > 0) {
|
|
712
|
+
hasFailures = true;
|
|
713
|
+
}
|
|
584
714
|
}
|
|
585
|
-
|
|
715
|
+
catch (err) {
|
|
716
|
+
if (err instanceof Error && err.message.includes("cancelled")) {
|
|
717
|
+
continue;
|
|
718
|
+
}
|
|
719
|
+
log.error(err instanceof Error ? err.message : String(err));
|
|
720
|
+
process.exit(1);
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
if (hasFailures) {
|
|
586
724
|
process.exit(1);
|
|
587
725
|
}
|
|
588
726
|
});
|