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.
Files changed (50) hide show
  1. package/README.md +3 -1
  2. package/dist/builtins/index.d.ts.map +1 -1
  3. package/dist/builtins/index.js +26 -13
  4. package/dist/builtins/index.js.map +1 -1
  5. package/dist/builtins/tools/cursor.js +2 -2
  6. package/dist/builtins/tools/cursor.js.map +1 -1
  7. package/dist/builtins/tools/opencode.d.ts.map +1 -1
  8. package/dist/builtins/tools/opencode.js +8 -2
  9. package/dist/builtins/tools/opencode.js.map +1 -1
  10. package/dist/cli/commands/check.d.ts.map +1 -1
  11. package/dist/cli/commands/check.js +17 -1
  12. package/dist/cli/commands/check.js.map +1 -1
  13. package/dist/cli/commands/doctor.d.ts.map +1 -1
  14. package/dist/cli/commands/doctor.js +484 -50
  15. package/dist/cli/commands/doctor.js.map +1 -1
  16. package/dist/cli/commands/init.d.ts.map +1 -1
  17. package/dist/cli/commands/init.js +6 -1
  18. package/dist/cli/commands/init.js.map +1 -1
  19. package/dist/cli/commands/install.d.ts +6 -3
  20. package/dist/cli/commands/install.d.ts.map +1 -1
  21. package/dist/cli/commands/install.js +225 -87
  22. package/dist/cli/commands/install.js.map +1 -1
  23. package/dist/cli/commands/rule.js +11 -7
  24. package/dist/cli/commands/rule.js.map +1 -1
  25. package/dist/cli/commands/sanitize.d.ts +3 -2
  26. package/dist/cli/commands/sanitize.d.ts.map +1 -1
  27. package/dist/cli/commands/sanitize.js +27 -13
  28. package/dist/cli/commands/sanitize.js.map +1 -1
  29. package/dist/cli/commands/skill.d.ts.map +1 -1
  30. package/dist/cli/commands/skill.js +23 -14
  31. package/dist/cli/commands/skill.js.map +1 -1
  32. package/dist/cli/commands/status.d.ts.map +1 -1
  33. package/dist/cli/commands/status.js +15 -10
  34. package/dist/cli/commands/status.js.map +1 -1
  35. package/dist/core/config.d.ts +73 -13
  36. package/dist/core/config.d.ts.map +1 -1
  37. package/dist/core/config.js +224 -34
  38. package/dist/core/config.js.map +1 -1
  39. package/dist/core/import-discovery.d.ts +9 -4
  40. package/dist/core/import-discovery.d.ts.map +1 -1
  41. package/dist/core/import-discovery.js +414 -141
  42. package/dist/core/import-discovery.js.map +1 -1
  43. package/dist/core/schema.d.ts +91 -11
  44. package/dist/core/schema.d.ts.map +1 -1
  45. package/dist/core/schema.js +28 -0
  46. package/dist/core/schema.js.map +1 -1
  47. package/docs/commands.md +4 -2
  48. package/docs/index.md +1 -0
  49. package/docs/quickstart.md +4 -1
  50. 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
- interface InstallOptions {
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(projectRoot: string, loadoutPath: string, options: InstallOptions): Promise<InstallResult>;
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;AAqCpC,UAAU,cAAc;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,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;AA8XD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,UAAU,CAC9B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CAkOxB;AAMD,eAAO,MAAM,cAAc,SAmFvB,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
- // Instructions
45
- if (grouped.instruction.length > 0) {
46
- console.log(chalk.bold(" INSTRUCTIONS") + chalk.dim(` (${grouped.instruction.length})`));
47
- for (const artifact of grouped.instruction) {
48
- const conflict = result.conflicts.has(`instruction:${artifact.name}`);
49
- const suffix = conflict ? chalk.yellow(" ⚠ conflict") : "";
50
- console.log(chalk.dim(" ○ ") + artifact.displayPath + suffix);
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.name + "/" + toolHint + suffix);
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.name}`;
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
- if (c.kind === "rule") {
166
- renamed.destPath = `rules/${c.name}${toolSuffix}.md`;
167
- }
168
- else if (c.kind === "skill") {
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 (artifact.kind === "skill") {
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
- // Sanitize rules for cross-tool compatibility
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 (artifact.kind === "skill") {
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(projectRoot, loadoutPath, options) {
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.push("rule");
412
+ selected.add("rule");
328
413
  if (options.skills)
329
- selected.push("skill");
414
+ selected.add("skill");
330
415
  if (options.instructions)
331
- selected.push("instruction");
332
- return selected.length > 0 ? selected : undefined;
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(projectRoot, {
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("No existing configurations found to import.");
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.name}`;
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(projectRoot, loadoutPath, { ...options, interactive: true });
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.name}`;
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, options.keep ?? false);
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, "project");
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("--from <tools>", "Only from specific tools (comma-separated: cursor,claude-code,opencode,codex,pi)")
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
- // Find .loadouts/ directory, preferring project-level
526
- const loadoutRoot = await findNearestLoadoutRoot(cwd);
527
- // Check if we have a project-level loadout or only global
528
- const hasProjectLoadout = loadoutRoot && loadoutRoot.level === "project";
529
- let projectRoot;
530
- let loadoutPath;
531
- if (!hasProjectLoadout) {
532
- // No project-level .loadouts/ — offer to initialize
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
- // Auto-init with --yes, otherwise prompt
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 (options.dryRun) {
669
+ if (installOptions.dryRun) {
558
670
  log.info("Would initialize .loadouts/ (dry-run)");
559
- // For dry-run, we still need to scan from the project root
560
- // but we don't create the loadout directory
561
- projectRoot = cwd;
562
- loadoutPath = path.join(cwd, ".loadouts");
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
- loadoutPath = await initProjectLoadout(cwd);
566
- projectRoot = cwd;
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
- else {
570
- loadoutPath = loadoutRoot.path;
571
- projectRoot = path.dirname(loadoutRoot.path);
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
- catch (err) {
582
- if (err instanceof Error && err.message.includes("cancelled")) {
583
- process.exit(0);
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
- log.error(err instanceof Error ? err.message : String(err));
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
  });