loadouts 0.2.1 → 0.2.3

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 (64) 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/add-to.d.ts +13 -0
  11. package/dist/cli/commands/add-to.d.ts.map +1 -0
  12. package/dist/cli/commands/add-to.js +56 -0
  13. package/dist/cli/commands/add-to.js.map +1 -0
  14. package/dist/cli/commands/check.d.ts.map +1 -1
  15. package/dist/cli/commands/check.js +17 -1
  16. package/dist/cli/commands/check.js.map +1 -1
  17. package/dist/cli/commands/docs.d.ts.map +1 -1
  18. package/dist/cli/commands/docs.js +2 -1
  19. package/dist/cli/commands/docs.js.map +1 -1
  20. package/dist/cli/commands/install.d.ts +2 -2
  21. package/dist/cli/commands/install.d.ts.map +1 -1
  22. package/dist/cli/commands/install.js +130 -15
  23. package/dist/cli/commands/install.js.map +1 -1
  24. package/dist/cli/commands/loadout-include.d.ts +29 -0
  25. package/dist/cli/commands/loadout-include.d.ts.map +1 -0
  26. package/dist/cli/commands/loadout-include.js +138 -0
  27. package/dist/cli/commands/loadout-include.js.map +1 -0
  28. package/dist/cli/commands/remove-from.d.ts +9 -0
  29. package/dist/cli/commands/remove-from.d.ts.map +1 -0
  30. package/dist/cli/commands/remove-from.js +51 -0
  31. package/dist/cli/commands/remove-from.js.map +1 -0
  32. package/dist/cli/commands/rule.js +11 -7
  33. package/dist/cli/commands/rule.js.map +1 -1
  34. package/dist/cli/commands/sanitize.d.ts +3 -2
  35. package/dist/cli/commands/sanitize.d.ts.map +1 -1
  36. package/dist/cli/commands/sanitize.js +27 -13
  37. package/dist/cli/commands/sanitize.js.map +1 -1
  38. package/dist/cli/commands/skill.d.ts.map +1 -1
  39. package/dist/cli/commands/skill.js +23 -14
  40. package/dist/cli/commands/skill.js.map +1 -1
  41. package/dist/cli/commands/status.d.ts.map +1 -1
  42. package/dist/cli/commands/status.js +15 -10
  43. package/dist/cli/commands/status.js.map +1 -1
  44. package/dist/cli/index.d.ts.map +1 -1
  45. package/dist/cli/index.js +4 -0
  46. package/dist/cli/index.js.map +1 -1
  47. package/dist/core/config.d.ts +73 -13
  48. package/dist/core/config.d.ts.map +1 -1
  49. package/dist/core/config.js +224 -34
  50. package/dist/core/config.js.map +1 -1
  51. package/dist/core/import-discovery.d.ts +2 -0
  52. package/dist/core/import-discovery.d.ts.map +1 -1
  53. package/dist/core/import-discovery.js +129 -1
  54. package/dist/core/import-discovery.js.map +1 -1
  55. package/dist/core/schema.d.ts +91 -11
  56. package/dist/core/schema.d.ts.map +1 -1
  57. package/dist/core/schema.js +28 -0
  58. package/dist/core/schema.js.map +1 -1
  59. package/docs/authoring.md +15 -3
  60. package/docs/commands.md +19 -2
  61. package/docs/compatibility.md +34 -0
  62. package/docs/index.md +2 -0
  63. package/docs/quickstart.md +5 -1
  64. package/package.json +1 -1
package/README.md CHANGED
@@ -63,10 +63,12 @@ Already have rules and skills scattered across tool directories?
63
63
  ```bash
64
64
  loadouts init # Detects existing configs automatically
65
65
  loadouts install # Or import them separately
66
+ loadouts install ./agent-pack # Import from a source directory
67
+ loadouts install ./rule.mdc # Import a single artifact
66
68
  loadouts sync
67
69
  ```
68
70
 
69
- `loadouts install` scans all tool directories (`.claude/`, `.cursor/`, `.opencode/`, etc.) and imports everything it finds. Use `--dry-run` to preview, `-i` for interactive selection.
71
+ `loadouts install` scans all tool directories (`.claude/`, `.cursor/`, `.opencode/`, etc.) and imports everything it finds. Pass a file or directory to import from a specific source. Use `--dry-run` to preview, `-i` for interactive selection, and `--keep` to leave originals in place.
70
72
 
71
73
  ## Documentation
72
74
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/builtins/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAenD,oEAAoE;AACpE,eAAO,MAAM,kBAAkB,+DAMrB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAalE,uDAAuD;AACvD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAoBrD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/builtins/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAmBnD,oEAAoE;AACpE,eAAO,MAAM,kBAAkB,+DAMrB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAgClE,uDAAuD;AACvD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAsBrD"}
@@ -5,7 +5,7 @@
5
5
  * Built-ins use the same PluginAPI as external plugins; there is no
6
6
  * privileged code path.
7
7
  */
8
- import { parseFrontmatter, serializeFrontmatter } from "../core/config.js";
8
+ import { parseMarkdownFrontmatter, serializeMarkdownFrontmatter, } from "../core/config.js";
9
9
  import { ruleKind } from "./kinds/rule.js";
10
10
  import { skillKind } from "./kinds/skill.js";
11
11
  import { instructionKind } from "./kinds/instruction.js";
@@ -27,17 +27,28 @@ export const BUILTIN_TOOL_NAMES = [
27
27
  "codex",
28
28
  "pi",
29
29
  ];
30
- /**
31
- * Mirror Cursor's `paths` ↔ `globs` frontmatter keys so authors can use
32
- * either convention. Registered as the "cursor-frontmatter" transform.
33
- */
34
- function mirrorPathsAndGlobs(raw) {
35
- const { frontmatter, body } = parseFrontmatter(raw);
36
- if (frontmatter.paths && !frontmatter.globs)
37
- frontmatter.globs = frontmatter.paths;
38
- if (frontmatter.globs && !frontmatter.paths)
39
- frontmatter.paths = frontmatter.globs;
40
- return serializeFrontmatter(frontmatter, body);
30
+ function translateRuleFrontmatter(raw) {
31
+ const { frontmatter, body } = parseMarkdownFrontmatter(raw);
32
+ const paths = Array.isArray(frontmatter.paths) ? frontmatter.paths : undefined;
33
+ if (paths && !Array.isArray(frontmatter.globs)) {
34
+ frontmatter.globs = paths;
35
+ }
36
+ if (typeof frontmatter.activation === "string" && frontmatter.alwaysApply === undefined) {
37
+ if (frontmatter.activation === "always")
38
+ frontmatter.alwaysApply = true;
39
+ if (frontmatter.activation === "scoped")
40
+ frontmatter.alwaysApply = false;
41
+ }
42
+ return serializeMarkdownFrontmatter(frontmatter, body);
43
+ }
44
+ function translateOpenCodeSkillFrontmatter(raw) {
45
+ const { frontmatter, body } = parseMarkdownFrontmatter(raw);
46
+ const modelInvocable = frontmatter["model-invocable"];
47
+ if (typeof modelInvocable === "boolean" &&
48
+ frontmatter["disable-model-invocation"] === undefined) {
49
+ frontmatter["disable-model-invocation"] = !modelInvocable;
50
+ }
51
+ return serializeMarkdownFrontmatter(frontmatter, body);
41
52
  }
42
53
  /** Register all built-ins into the given PluginAPI. */
43
54
  export function registerBuiltins(api) {
@@ -51,7 +62,9 @@ export function registerBuiltins(api) {
51
62
  api.registerKind(opencodeConfigKind);
52
63
  api.registerKind(opencodePluginKind);
53
64
  // Named transforms — referenced by name in tool target specs.
54
- api.registerTransform("cursor-frontmatter", mirrorPathsAndGlobs);
65
+ api.registerTransform("cursor-rule-frontmatter", translateRuleFrontmatter);
66
+ api.registerTransform("opencode-rule-frontmatter", translateRuleFrontmatter);
67
+ api.registerTransform("opencode-skill-frontmatter", translateOpenCodeSkillFrontmatter);
55
68
  // Tools
56
69
  api.registerTool(claudeCodeTool);
57
70
  api.registerTool(cursorTool);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/builtins/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE3E,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,oEAAoE;AACpE,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,aAAa;IACb,QAAQ;IACR,UAAU;IACV,OAAO;IACP,IAAI;CACI,CAAC;AAIX;;;GAGG;AACH,SAAS,mBAAmB,CAAC,GAAW;IACtC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACpD,IAAI,WAAW,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,KAAK;QAAE,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;IACnF,IAAI,WAAW,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,KAAK;QAAE,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;IACnF,OAAO,oBAAoB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;AACjD,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,gBAAgB,CAAC,GAAc;IAC7C,qEAAqE;IACrE,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC3B,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IAC5B,GAAG,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;IAClC,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;IAC7B,GAAG,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;IAChC,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IAC5B,GAAG,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;IACrC,GAAG,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;IAErC,8DAA8D;IAC9D,GAAG,CAAC,iBAAiB,CAAC,oBAAoB,EAAE,mBAAmB,CAAC,CAAC;IAEjE,QAAQ;IACR,GAAG,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IACjC,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;IAC7B,GAAG,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;IAC/B,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IAC5B,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;AAC3B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/builtins/index.ts"],"names":[],"mappings":"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"}
@@ -8,10 +8,10 @@ export const cursorTool = {
8
8
  },
9
9
  supports: ["rule", "skill", "instruction"],
10
10
  targets: {
11
- // Cursor requires .mdc extension and expects paths/globs mirrored.
11
+ // Cursor rules render canonical paths/activation with native aliases.
12
12
  rule: {
13
13
  path: "{base}/rules/{stem}.mdc",
14
- transform: "cursor-frontmatter",
14
+ transform: "cursor-rule-frontmatter",
15
15
  },
16
16
  skill: { path: "{base}/skills/{name}" },
17
17
  instruction: {
@@ -1 +1 @@
1
- {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../src/builtins/tools/cursor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAG9B,MAAM,CAAC,MAAM,UAAU,GAAa;IAClC,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE;QACR,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC;QAC1C,OAAO,EAAE,SAAS;KACnB;IACD,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC;IAC1C,OAAO,EAAE;QACP,mEAAmE;QACnE,IAAI,EAAE;YACJ,IAAI,EAAE,yBAAyB;YAC/B,SAAS,EAAE,oBAAoB;SAChC;QACD,KAAK,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE;QACvC,WAAW,EAAE;YACX,IAAI,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,kBAAkB,EAAE;SAC3D;KACF;CACF,CAAC"}
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../src/builtins/tools/cursor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAG9B,MAAM,CAAC,MAAM,UAAU,GAAa;IAClC,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE;QACR,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC;QAC1C,OAAO,EAAE,SAAS;KACnB;IACD,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC;IAC1C,OAAO,EAAE;QACP,sEAAsE;QACtE,IAAI,EAAE;YACJ,IAAI,EAAE,yBAAyB;YAC/B,SAAS,EAAE,yBAAyB;SACrC;QACD,KAAK,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE;QACvC,WAAW,EAAE;YACX,IAAI,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,kBAAkB,EAAE;SAC3D;KACF;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../../src/builtins/tools/opencode.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAEvD,eAAO,MAAM,YAAY,EAAE,QA2B1B,CAAC"}
1
+ {"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../../src/builtins/tools/opencode.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAEvD,eAAO,MAAM,YAAY,EAAE,QAiC1B,CAAC"}
@@ -14,8 +14,14 @@ export const opencodeTool = {
14
14
  "opencode-plugin",
15
15
  ],
16
16
  targets: {
17
- rule: { path: "{base}/rules/{stem}.md" },
18
- skill: { path: "{base}/skills/{name}" },
17
+ rule: {
18
+ path: "{base}/rules/{stem}.md",
19
+ transform: "opencode-rule-frontmatter",
20
+ },
21
+ skill: {
22
+ path: "{base}/skills/{name}",
23
+ transform: "opencode-skill-frontmatter",
24
+ },
19
25
  instruction: {
20
26
  path: { project: "AGENTS.md", global: "{home}/AGENTS.md" },
21
27
  },
@@ -1 +1 @@
1
- {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../src/builtins/tools/opencode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAG9B,MAAM,CAAC,MAAM,YAAY,GAAa;IACpC,IAAI,EAAE,UAAU;IAChB,QAAQ,EAAE;QACR,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC;QACtD,OAAO,EAAE,WAAW;KACrB;IACD,QAAQ,EAAE;QACR,MAAM;QACN,OAAO;QACP,aAAa;QACb,iBAAiB;QACjB,iBAAiB;KAClB;IACD,OAAO,EAAE;QACP,IAAI,EAAE,EAAE,IAAI,EAAE,wBAAwB,EAAE;QACxC,KAAK,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE;QACvC,WAAW,EAAE;YACX,IAAI,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,kBAAkB,EAAE;SAC3D;QACD,iBAAiB,EAAE;YACjB,IAAI,EAAE;gBACJ,OAAO,EAAE,eAAe;gBACxB,MAAM,EAAE,sBAAsB;aAC/B;SACF;QACD,iBAAiB,EAAE,EAAE,IAAI,EAAE,4BAA4B,EAAE;KAC1D;CACF,CAAC"}
1
+ {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../src/builtins/tools/opencode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAG9B,MAAM,CAAC,MAAM,YAAY,GAAa;IACpC,IAAI,EAAE,UAAU;IAChB,QAAQ,EAAE;QACR,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC;QACtD,OAAO,EAAE,WAAW;KACrB;IACD,QAAQ,EAAE;QACR,MAAM;QACN,OAAO;QACP,aAAa;QACb,iBAAiB;QACjB,iBAAiB;KAClB;IACD,OAAO,EAAE;QACP,IAAI,EAAE;YACJ,IAAI,EAAE,wBAAwB;YAC9B,SAAS,EAAE,2BAA2B;SACvC;QACD,KAAK,EAAE;YACL,IAAI,EAAE,sBAAsB;YAC5B,SAAS,EAAE,4BAA4B;SACxC;QACD,WAAW,EAAE;YACX,IAAI,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,kBAAkB,EAAE;SAC3D;QACD,iBAAiB,EAAE;YACjB,IAAI,EAAE;gBACJ,OAAO,EAAE,eAAe;gBACxB,MAAM,EAAE,sBAAsB;aAC/B;SACF;QACD,iBAAiB,EAAE,EAAE,IAAI,EAAE,4BAA4B,EAAE;KAC1D;CACF,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { Command } from "commander";
2
+ import { type ScopeFlags } from "../../core/scope.js";
3
+ import { type IncludeMutationResult } from "./loadout-include.js";
4
+ interface AddToOptions extends ScopeFlags {
5
+ tools?: string;
6
+ }
7
+ export interface AddToResult extends IncludeMutationResult {
8
+ loadout: string;
9
+ }
10
+ export declare function runAddTo(loadout: string, artifacts: string[], options: AddToOptions, cwd?: string): Promise<AddToResult>;
11
+ export declare const addToCommand: Command;
12
+ export {};
13
+ //# sourceMappingURL=add-to.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-to.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/add-to.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEnE,OAAO,EAML,KAAK,qBAAqB,EAC3B,MAAM,sBAAsB,CAAC;AAE9B,UAAU,YAAa,SAAQ,UAAU;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAY,SAAQ,qBAAqB;IACxD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EAAE,EACnB,OAAO,EAAE,YAAY,EACrB,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,WAAW,CAAC,CAkBtB;AAsBD,eAAO,MAAM,YAAY,SAcrB,CAAC"}
@@ -0,0 +1,56 @@
1
+ import { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import { SCOPE_FLAGS } from "../../core/scope.js";
4
+ import { log, heading } from "../../lib/output.js";
5
+ import { addIncludes, normalizeAndValidateArtifact, parseToolsOption, resolveLoadoutMutationTarget, writeLoadoutDefinition, } from "./loadout-include.js";
6
+ export async function runAddTo(loadout, artifacts, options, cwd = process.cwd()) {
7
+ if (artifacts.length === 0) {
8
+ throw new Error("Provide at least one artifact path.");
9
+ }
10
+ const target = await resolveLoadoutMutationTarget(loadout, options, cwd);
11
+ const tools = parseToolsOption(options.tools);
12
+ const includes = artifacts.map((artifact) => ({
13
+ ...normalizeAndValidateArtifact(artifact, target.ctx.configPath),
14
+ tools,
15
+ }));
16
+ const result = addIncludes(target.definition, includes);
17
+ if (result.changed.length > 0) {
18
+ writeLoadoutDefinition(target.loadoutPath, target.definition);
19
+ }
20
+ return { loadout, ...result };
21
+ }
22
+ function printResult(result) {
23
+ if (result.changed.length === 0) {
24
+ log.dim(`No changes to ${result.loadout}.`);
25
+ }
26
+ else {
27
+ heading(`Added to ${result.loadout}`);
28
+ for (const includePath of result.changed) {
29
+ console.log(chalk.green(`+ ${includePath}`));
30
+ }
31
+ }
32
+ for (const skipped of result.skipped) {
33
+ console.log(chalk.dim(`- ${skipped.path} ${skipped.reason}`));
34
+ }
35
+ if (result.changed.length > 0) {
36
+ console.log();
37
+ log.info(`Run ${chalk.cyan("loadouts sync")} to apply changes.`);
38
+ }
39
+ }
40
+ export const addToCommand = new Command("add-to")
41
+ .description("Add existing artifacts to a loadout")
42
+ .argument("<loadout>", "Loadout to update")
43
+ .argument("<artifacts...>", "Artifact paths relative to .loadouts/")
44
+ .option(...SCOPE_FLAGS.local)
45
+ .option(...SCOPE_FLAGS.global)
46
+ .option("--tools <tools>", "Restrict added artifacts to specific tools (comma-separated)")
47
+ .action(async (loadout, artifacts, options) => {
48
+ try {
49
+ printResult(await runAddTo(loadout, artifacts, options));
50
+ }
51
+ catch (err) {
52
+ log.error(err instanceof Error ? err.message : String(err));
53
+ process.exit(1);
54
+ }
55
+ });
56
+ //# sourceMappingURL=add-to.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-to.js","sourceRoot":"","sources":["../../../src/cli/commands/add-to.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/check.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkHpC,eAAO,MAAM,YAAY,SAoErB,CAAC"}
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/check.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqIpC,eAAO,MAAM,YAAY,SAoErB,CAAC"}
@@ -11,7 +11,7 @@ import { Command } from "commander";
11
11
  import * as os from "node:os";
12
12
  import * as path from "node:path";
13
13
  import { findNearestLoadoutRoot, getGlobalRoot, getProjectRoot, } from "../../core/discovery.js";
14
- import { parseRootConfig, listLoadouts, parseLoadoutDefinition, } from "../../core/config.js";
14
+ import { parseRootConfig, listLoadouts, parseLoadoutDefinition, findUnsanitizedRules, findUnsanitizedSkills, } from "../../core/config.js";
15
15
  import { resolveLoadout, getInstructionItem } from "../../core/resolve.js";
16
16
  import { planRender } from "../../core/render.js";
17
17
  import { registry } from "../../core/registry.js";
@@ -36,6 +36,22 @@ async function checkRoot(root, projectRoot, scope, verbose) {
36
36
  }
37
37
  // Check each loadout definition
38
38
  const loadoutNames = listLoadouts(root.path);
39
+ const unsanitizedRules = findUnsanitizedRules(root.path);
40
+ const unsanitizedSkills = findUnsanitizedSkills(root.path);
41
+ if (unsanitizedRules.length > 0 || unsanitizedSkills.length > 0) {
42
+ const total = unsanitizedRules.length + unsanitizedSkills.length;
43
+ log.warn(` ${total} artifact(s) have non-canonical frontmatter`);
44
+ if (verbose) {
45
+ for (const name of unsanitizedRules) {
46
+ log.dim(` rule: ${name}`);
47
+ }
48
+ for (const name of unsanitizedSkills) {
49
+ log.dim(` skill: ${name}`);
50
+ }
51
+ }
52
+ log.dim(" Run 'loadouts sanitize' to fix.");
53
+ hasWarnings = true;
54
+ }
39
55
  for (const name of loadoutNames) {
40
56
  const defPath = path.join(root.path, "loadouts", `${name}.yaml`);
41
57
  const ymlPath = path.join(root.path, "loadouts", `${name}.yml`);
@@ -1 +1 @@
1
- {"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/cli/commands/check.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/cli/commands/check.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/docs.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqFpC,eAAO,MAAM,WAAW,SAqCpB,CAAC"}
1
+ {"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/docs.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsFpC,eAAO,MAAM,WAAW,SAqCpB,CAAC"}
@@ -21,6 +21,7 @@ const TOPICS = {
21
21
  concepts: "Loadouts, artifacts, scopes, tools",
22
22
  commands: "Full command reference",
23
23
  authoring: "Creating rules, skills, instructions",
24
+ compatibility: "Tool paths and frontmatter compatibility",
24
25
  workflows: "Team setup, git, CI/CD",
25
26
  troubleshooting: "Common issues and solutions",
26
27
  };
@@ -80,7 +81,7 @@ function displayDocs(content, usePager) {
80
81
  }
81
82
  export const docsCommand = new Command("docs")
82
83
  .description("Display documentation")
83
- .argument("[topic]", "Documentation topic (quickstart, concepts, commands, authoring, workflows, troubleshooting)")
84
+ .argument("[topic]", "Documentation topic (quickstart, concepts, commands, authoring, compatibility, workflows, troubleshooting)")
84
85
  .option("--list", "List available topics")
85
86
  .option("--raw", "Print raw markdown without pager")
86
87
  .action(async (topic, options) => {
@@ -1 +1 @@
1
- {"version":3,"file":"docs.js","sourceRoot":"","sources":["../../../src/cli/commands/docs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"docs.js","sourceRoot":"","sources":["../../../src/cli/commands/docs.ts"],"names":[],"mappings":"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"}
@@ -7,12 +7,13 @@
7
7
  import { Command } from "commander";
8
8
  import { type ScopeFlags } from "../../core/scope.js";
9
9
  import type { CommandContext } from "../../core/types.js";
10
- interface InstallOptions extends ScopeFlags {
10
+ export interface InstallOptions extends ScopeFlags {
11
11
  rules?: boolean;
12
12
  skills?: boolean;
13
13
  instructions?: boolean;
14
14
  kinds?: string;
15
15
  from?: string;
16
+ source?: string;
16
17
  to?: string;
17
18
  interactive?: boolean;
18
19
  yes?: boolean;
@@ -26,5 +27,4 @@ export interface InstallResult {
26
27
  }
27
28
  export declare function runInstall(ctx: CommandContext, options: InstallOptions): Promise<InstallResult>;
28
29
  export declare const installCommand: Command;
29
- export {};
30
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;AA4BpC,OAAO,EAAgC,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAIpF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAO1D,UAAU,cAAe,SAAQ,UAAU;IACzC,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,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;AAqXD,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,CA6OxB;AAMD,eAAO,MAAM,cAAc,SA4GvB,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,13 +5,14 @@
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
14
  import { writeFile, fileExists, copyFile, copyDir, removeFile, removeDir, isDirectory, listFiles, } from "../../lib/fs.js";
14
- import { parseLoadoutDefinition, sanitizeRuleFile } from "../../core/config.js";
15
+ import { parseLoadoutDefinition, sanitizeRuleFile, sanitizeSkillFile, } from "../../core/config.js";
15
16
  import { loadState } from "../../core/manifest.js";
16
17
  import { registry } from "../../core/registry.js";
17
18
  import { resolveContexts, SCOPE_FLAGS } from "../../core/scope.js";
@@ -27,6 +28,89 @@ function createPrompt() {
27
28
  output: process.stdout,
28
29
  });
29
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
+ }
30
114
  async function askQuestion(rl, question) {
31
115
  return new Promise((resolve) => {
32
116
  rl.question(question, (answer) => {
@@ -190,11 +274,14 @@ async function importArtifact(artifact, loadoutPath, options) {
190
274
  if (kind?.layout === "dir") {
191
275
  // Copy directory
192
276
  copyDir(artifact.sourcePath, destPath);
277
+ if (artifact.kind === "skill") {
278
+ sanitizeSkillFile(path.join(destPath, "SKILL.md"));
279
+ }
193
280
  }
194
281
  else {
195
282
  // Copy file
196
283
  copyFile(artifact.sourcePath, destPath);
197
- // Sanitize rules for cross-tool compatibility
284
+ // Canonicalize known native frontmatter aliases on import.
198
285
  if (artifact.kind === "rule") {
199
286
  sanitizeRuleFile(destPath);
200
287
  }
@@ -314,6 +401,10 @@ async function resolveTargetLoadout(loadoutPath, options, rl) {
314
401
  export async function runInstall(ctx, options) {
315
402
  const projectRoot = ctx.projectRoot;
316
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
+ }
317
408
  // Build filter options
318
409
  const kinds = (() => {
319
410
  const selected = new Set();
@@ -331,15 +422,19 @@ export async function runInstall(ctx, options) {
331
422
  return selected.size > 0 ? [...selected] : undefined;
332
423
  })();
333
424
  const tools = options.from?.split(",").map((t) => t.trim());
425
+ const scanRoots = sourcePath ? getSourceScanRoots(sourcePath) : [projectRoot];
334
426
  // Discover artifacts
335
- const result = discoverImportableArtifacts(projectRoot, {
427
+ const result = mergeDiscoveryResults(scanRoots.map((scanRoot) => discoverImportableArtifacts(scanRoot, {
336
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
@@ -475,7 +570,7 @@ export async function runInstall(ctx, 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(ctx, 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,6 +606,7 @@ export async function runInstall(ctx, 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")
514
610
  .option(...SCOPE_FLAGS.local)
515
611
  .option(...SCOPE_FLAGS.global)
516
612
  .option(...SCOPE_FLAGS.all)
@@ -524,16 +620,25 @@ export const installCommand = new Command("install")
524
620
  .option("--dry-run", "Preview changes without applying")
525
621
  .option("--keep", "Keep original files after import")
526
622
  .option("--to <loadout>", "Target loadout to add artifacts to (default: auto-detect from active)")
527
- .action(async (options) => {
623
+ .action(async (source, options) => {
528
624
  const cwd = process.cwd();
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 };
529
634
  let contexts = [];
530
635
  try {
531
- ({ contexts } = await resolveContexts(options, cwd));
636
+ ({ contexts } = await resolveContexts(installOptions, cwd));
532
637
  }
533
638
  catch (err) {
534
639
  const message = err instanceof Error ? err.message : String(err);
535
- const canAutoInitProject = !options.global &&
536
- !options.all &&
640
+ const canAutoInitProject = !installOptions.global &&
641
+ !installOptions.all &&
537
642
  message.includes("No loadout found");
538
643
  if (!canAutoInitProject) {
539
644
  log.error(message);
@@ -541,7 +646,7 @@ export const installCommand = new Command("install")
541
646
  }
542
647
  console.log();
543
648
  log.warn("No project .loadouts/ found.");
544
- if (!options.yes) {
649
+ if (!installOptions.yes) {
545
650
  const rl = readline.createInterface({
546
651
  input: process.stdin,
547
652
  output: process.stdout,
@@ -561,7 +666,7 @@ export const installCommand = new Command("install")
561
666
  log.info("Auto-initializing project loadout...");
562
667
  }
563
668
  console.log();
564
- if (options.dryRun) {
669
+ if (installOptions.dryRun) {
565
670
  log.info("Would initialize .loadouts/ (dry-run)");
566
671
  const configPath = path.join(cwd, ".loadouts");
567
672
  contexts = [
@@ -585,14 +690,24 @@ export const installCommand = new Command("install")
585
690
  ];
586
691
  }
587
692
  }
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.");
696
+ process.exit(1);
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.");
701
+ }
588
702
  const multipleScopes = contexts.length > 1;
589
703
  let hasFailures = false;
590
704
  for (const ctx of contexts) {
591
705
  console.log();
592
706
  const scopeLabel = ctx.scope === "global" ? " [global]" : " [project]";
593
- log.info(`Scanning for existing configurations${multipleScopes ? scopeLabel : ""}...`);
707
+ const sourceLabel = resolvedSource ? ` in ${resolvedSource}` : "";
708
+ log.info(`Scanning for existing configurations${sourceLabel}${multipleScopes ? scopeLabel : ""}...`);
594
709
  try {
595
- const result = await runInstall(ctx, options);
710
+ const result = await runInstall(ctx, installOptions);
596
711
  if (result.failed > 0) {
597
712
  hasFailures = true;
598
713
  }