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.
- 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/add-to.d.ts +13 -0
- package/dist/cli/commands/add-to.d.ts.map +1 -0
- package/dist/cli/commands/add-to.js +56 -0
- package/dist/cli/commands/add-to.js.map +1 -0
- 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/docs.d.ts.map +1 -1
- package/dist/cli/commands/docs.js +2 -1
- package/dist/cli/commands/docs.js.map +1 -1
- package/dist/cli/commands/install.d.ts +2 -2
- package/dist/cli/commands/install.d.ts.map +1 -1
- package/dist/cli/commands/install.js +130 -15
- package/dist/cli/commands/install.js.map +1 -1
- package/dist/cli/commands/loadout-include.d.ts +29 -0
- package/dist/cli/commands/loadout-include.d.ts.map +1 -0
- package/dist/cli/commands/loadout-include.js +138 -0
- package/dist/cli/commands/loadout-include.js.map +1 -0
- package/dist/cli/commands/remove-from.d.ts +9 -0
- package/dist/cli/commands/remove-from.d.ts.map +1 -0
- package/dist/cli/commands/remove-from.js +51 -0
- package/dist/cli/commands/remove-from.js.map +1 -0
- 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/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +4 -0
- package/dist/cli/index.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 +2 -0
- package/dist/core/import-discovery.d.ts.map +1 -1
- package/dist/core/import-discovery.js +129 -1
- 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/authoring.md +15 -3
- package/docs/commands.md +19 -2
- package/docs/compatibility.md +34 -0
- package/docs/index.md +2 -0
- package/docs/quickstart.md +5 -1
- 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;
|
|
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"}
|
package/dist/builtins/index.js
CHANGED
|
@@ -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 {
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
if (frontmatter.
|
|
37
|
-
frontmatter.
|
|
38
|
-
|
|
39
|
-
frontmatter.
|
|
40
|
-
|
|
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",
|
|
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;
|
|
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
|
|
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,
|
|
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,
|
|
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: {
|
|
18
|
-
|
|
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,
|
|
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;
|
|
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":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EACL,sBAAsB,EACtB,aAAa,EACb,cAAc,GACf,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,eAAe,EACf,YAAY,EACZ,sBAAsB,
|
|
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;
|
|
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;
|
|
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
|
-
//
|
|
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(
|
|
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(
|
|
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,
|
|
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,
|
|
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(
|
|
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 = !
|
|
536
|
-
!
|
|
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 (!
|
|
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 (
|
|
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
|
-
|
|
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,
|
|
710
|
+
const result = await runInstall(ctx, installOptions);
|
|
596
711
|
if (result.failed > 0) {
|
|
597
712
|
hasFailures = true;
|
|
598
713
|
}
|