@sanity-labs/oclif-plugin-skills-flag 0.1.2 → 0.2.0
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 +59 -4
- package/dist/hooks/init.d.ts +2 -0
- package/dist/hooks/init.d.ts.map +1 -1
- package/dist/hooks/init.js +34 -6
- package/dist/hooks/init.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/skills.d.ts +30 -4
- package/dist/skills.d.ts.map +1 -1
- package/dist/skills.js +84 -9
- package/dist/skills.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -40,11 +40,37 @@ my-cli functions test --skill
|
|
|
40
40
|
The second command uses `skills/functions-test.md`. A single-command CLI uses `skills/index.md`.
|
|
41
41
|
Include `skills` in the CLI's npm `files` list if it has one.
|
|
42
42
|
|
|
43
|
+
## Configuration
|
|
44
|
+
|
|
45
|
+
Add `oclif-plugin-skills-flag` at the top level of the CLI's `package.json` to change the runtime
|
|
46
|
+
flag names or skills directory:
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"oclif-plugin-skills-flag": {
|
|
51
|
+
"flag": "agents",
|
|
52
|
+
"aliases": ["agent-help"],
|
|
53
|
+
"directory": "docs/agents"
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
| Option | Type | Default | Description |
|
|
59
|
+
| --- | --- | --- | --- |
|
|
60
|
+
| `flag` | string | `"llms"` | Main flag name, without leading dashes |
|
|
61
|
+
| `aliases` | string[] | `["skill"]` | Additional names; one-character aliases use a single dash |
|
|
62
|
+
| `directory` | string | `"skills"` | Skills directory relative to the CLI package root |
|
|
63
|
+
|
|
64
|
+
Configuration belongs to the CLI package that owns the command. If one oclif CLI is installed as a
|
|
65
|
+
plugin in another, each CLI can use different flag names and directories for its own commands.
|
|
66
|
+
Include the configured directory in the CLI's npm `files` list if it has one.
|
|
67
|
+
|
|
43
68
|
## Show the flag in help
|
|
44
69
|
|
|
45
70
|
An oclif plugin cannot add flags to the host commands' generated help. The hook still recognizes
|
|
46
|
-
|
|
47
|
-
CLI's existing base
|
|
71
|
+
the configured names before oclif parses the command, but they do not appear in help automatically.
|
|
72
|
+
To advertise the default `--llms` flag, add the exported definition to the CLI's existing base
|
|
73
|
+
command and set `hidden` to `false`:
|
|
48
74
|
|
|
49
75
|
```ts
|
|
50
76
|
import {Command, Flags} from '@oclif/core'
|
|
@@ -53,17 +79,46 @@ import {llmsFlagConfig} from '@sanity-labs/oclif-plugin-skills-flag'
|
|
|
53
79
|
export abstract class BaseCommand extends Command {
|
|
54
80
|
static baseFlags = {
|
|
55
81
|
...super.baseFlags,
|
|
56
|
-
llms: Flags.boolean(llmsFlagConfig),
|
|
82
|
+
llms: Flags.boolean({...llmsFlagConfig, hidden: false}),
|
|
57
83
|
}
|
|
58
84
|
}
|
|
59
85
|
```
|
|
60
86
|
|
|
61
87
|
The plugin handles the flag, so command implementations do not need to read `flags.llms`.
|
|
62
88
|
|
|
89
|
+
For custom names, create a matching definition:
|
|
90
|
+
|
|
91
|
+
```ts
|
|
92
|
+
import {Command, Flags} from '@oclif/core'
|
|
93
|
+
import {createSkillsFlagDefinition} from '@sanity-labs/oclif-plugin-skills-flag'
|
|
94
|
+
|
|
95
|
+
const skillsFlag = createSkillsFlagDefinition(
|
|
96
|
+
{
|
|
97
|
+
flag: 'agents',
|
|
98
|
+
aliases: ['agent-help'],
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
description: 'Show instructions for coding agents',
|
|
102
|
+
hidden: false,
|
|
103
|
+
},
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
export abstract class BaseCommand extends Command {
|
|
107
|
+
static baseFlags = {
|
|
108
|
+
...super.baseFlags,
|
|
109
|
+
[skillsFlag.name]: Flags.boolean(skillsFlag.definition),
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
The names passed to `createSkillsFlagDefinition` must match the package configuration. `hidden` and
|
|
115
|
+
`description` affect only the flag definition owned by the host CLI; they do not change runtime
|
|
116
|
+
plugin behavior.
|
|
117
|
+
|
|
63
118
|
## Limitations
|
|
64
119
|
|
|
65
120
|
- The plugin targets oclif v4.
|
|
66
|
-
-
|
|
121
|
+
- Configured flag names take precedence over same-named host flags.
|
|
67
122
|
- The init hook writes the skill and exits immediately. Later oclif lifecycle hooks do not run.
|
|
68
123
|
|
|
69
124
|
## Development
|
package/dist/hooks/init.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Hook } from "@oclif/core";
|
|
2
|
+
import { type SkillsFlagConfig } from "../skills.ts";
|
|
2
3
|
export interface SkillsFlagRuntime {
|
|
3
4
|
exit(code: number): never;
|
|
4
5
|
write(output: string): void;
|
|
@@ -8,6 +9,7 @@ export interface SkillsFlagOptions {
|
|
|
8
9
|
bin: string;
|
|
9
10
|
commandExists(commandId: string): boolean;
|
|
10
11
|
commandId: string | undefined;
|
|
12
|
+
config: SkillsFlagConfig;
|
|
11
13
|
error(message: string): void;
|
|
12
14
|
isSingleCommandCLI: boolean;
|
|
13
15
|
root: string;
|
package/dist/hooks/init.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/hooks/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/hooks/init.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAML,KAAK,gBAAgB,EAEtB,MAAM,cAAc,CAAA;AAIrB,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAA;IACzB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAA;IACzC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,MAAM,EAAE,gBAAgB,CAAA;IACxB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,kBAAkB,EAAE,OAAO,CAAA;IAC3B,IAAI,EAAE,MAAM,CAAA;CACb;AAWD,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,iBAAiB,EAC1B,OAAO,GAAE,iBAAkC,GAC1C,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,IA6ChB,CAAA;eAEc,IAAI"}
|
package/dist/hooks/init.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { writeFileSync } from "node:fs";
|
|
2
|
-
import {
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { commandSkillFilename, ensureFinalNewline, hasSkillsFlag, readCommandSkill, resolveSkillsFlagConfig, skillsFlagConfigKey, } from "../skills.js";
|
|
4
|
+
const SKILLS_FLAG_PLUGIN_NAME = "@sanity-labs/oclif-plugin-skills-flag";
|
|
3
5
|
const processRuntime = {
|
|
4
6
|
exit(code) {
|
|
5
7
|
process.exit(code);
|
|
@@ -9,30 +11,56 @@ const processRuntime = {
|
|
|
9
11
|
},
|
|
10
12
|
};
|
|
11
13
|
export async function handleSkillsFlag(options, runtime = processRuntime) {
|
|
12
|
-
if (!hasSkillsFlag(options.argv))
|
|
14
|
+
if (!hasSkillsFlag(options.argv, options.config))
|
|
13
15
|
return;
|
|
14
16
|
if (!options.commandId || !options.commandExists(options.commandId))
|
|
15
17
|
return;
|
|
16
18
|
const skillCommandId = options.isSingleCommandCLI ? "" : options.commandId;
|
|
17
19
|
const filename = commandSkillFilename(skillCommandId);
|
|
18
|
-
const skill = await readCommandSkill(skillCommandId, options.root);
|
|
20
|
+
const skill = await readCommandSkill(skillCommandId, options.root, options.config.directory);
|
|
19
21
|
if (skill === undefined) {
|
|
20
22
|
const commandName = skillCommandId.replaceAll(":", " ") || options.bin;
|
|
21
|
-
options.error(`No agent guidance is available for \`${commandName}\`.\nAdd it at
|
|
23
|
+
options.error(`No agent guidance is available for \`${commandName}\`.\nAdd it at ${join(options.config.directory, filename)}.`);
|
|
22
24
|
return;
|
|
23
25
|
}
|
|
24
26
|
runtime.write(ensureFinalNewline(skill));
|
|
25
27
|
runtime.exit(0);
|
|
26
28
|
}
|
|
27
29
|
const hook = async ({ argv, config, context, id }) => {
|
|
30
|
+
if (!id)
|
|
31
|
+
return;
|
|
32
|
+
// oclif runs transitive init hooks across the assembled CLI, so find the command's actual owner.
|
|
33
|
+
const command = config.findCommand(id);
|
|
34
|
+
const commandPlugin = command?.pluginName
|
|
35
|
+
? config.plugins.get(command.pluginName)
|
|
36
|
+
: undefined;
|
|
37
|
+
// A child CLI's dependency on this plugin must not opt the parent CLI's commands in.
|
|
38
|
+
if (!commandPlugin?.pjson.oclif.plugins?.includes(SKILLS_FLAG_PLUGIN_NAME)) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
// Command shape and skill files belong to the owner, not necessarily the outer host CLI.
|
|
42
|
+
const commandDiscovery = commandPlugin.pjson.oclif.commands;
|
|
43
|
+
const isSingleCommandCLI = typeof commandDiscovery !== "string" &&
|
|
44
|
+
commandDiscovery?.strategy === "single" &&
|
|
45
|
+
Boolean(commandDiscovery.target);
|
|
46
|
+
let skillsFlagConfig;
|
|
47
|
+
try {
|
|
48
|
+
skillsFlagConfig = resolveSkillsFlagConfig(commandPlugin.pjson[skillsFlagConfigKey]);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
52
|
+
context.error(`Invalid skills flag configuration in ${commandPlugin.name}: ${message}`, { code: "E_SKILLS_FLAG_CONFIG" });
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
28
55
|
await handleSkillsFlag({
|
|
29
56
|
argv,
|
|
30
57
|
bin: config.bin,
|
|
31
58
|
commandExists: (commandId) => config.findCommand(commandId) !== undefined,
|
|
32
59
|
commandId: id,
|
|
60
|
+
config: skillsFlagConfig,
|
|
33
61
|
error: (message) => context.error(message, { code: "E_SKILL_NOT_FOUND" }),
|
|
34
|
-
isSingleCommandCLI
|
|
35
|
-
root:
|
|
62
|
+
isSingleCommandCLI,
|
|
63
|
+
root: commandPlugin.root,
|
|
36
64
|
});
|
|
37
65
|
};
|
|
38
66
|
export default hook;
|
package/dist/hooks/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/hooks/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/hooks/init.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { commandSkillFilename, ensureFinalNewline, hasSkillsFlag, llmsFlagConfig, readCommandSkill, } from "./skills.ts";
|
|
1
|
+
export { commandSkillFilename, createSkillsFlagDefinition, ensureFinalNewline, hasSkillsFlag, llmsFlagConfig, readCommandSkill, resolveSkillsFlagConfig, type SkillsFlagConfig, type SkillsFlagConfigInput, type SkillsFlagDefinition, type SkillsFlagDefinitionOptions, skillsFlagConfigKey, } from "./skills.ts";
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,gBAAgB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,uBAAuB,EACvB,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,2BAA2B,EAChC,mBAAmB,GACpB,MAAM,aAAa,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { commandSkillFilename, ensureFinalNewline, hasSkillsFlag, llmsFlagConfig, readCommandSkill, } from "./skills.js";
|
|
1
|
+
export { commandSkillFilename, createSkillsFlagDefinition, ensureFinalNewline, hasSkillsFlag, llmsFlagConfig, readCommandSkill, resolveSkillsFlagConfig, skillsFlagConfigKey, } from "./skills.js";
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,gBAAgB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,uBAAuB,EAKvB,mBAAmB,GACpB,MAAM,aAAa,CAAA"}
|
package/dist/skills.d.ts
CHANGED
|
@@ -1,9 +1,35 @@
|
|
|
1
|
+
export declare const skillsFlagConfigKey = "oclif-plugin-skills-flag";
|
|
2
|
+
export interface SkillsFlagConfig {
|
|
3
|
+
aliases: string[];
|
|
4
|
+
directory: string;
|
|
5
|
+
flag: string;
|
|
6
|
+
}
|
|
7
|
+
export interface SkillsFlagConfigInput {
|
|
8
|
+
aliases?: readonly string[];
|
|
9
|
+
directory?: string;
|
|
10
|
+
flag?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface SkillsFlagDefinition {
|
|
13
|
+
definition: {
|
|
14
|
+
aliases: string[];
|
|
15
|
+
description: string;
|
|
16
|
+
hidden: boolean;
|
|
17
|
+
};
|
|
18
|
+
name: string;
|
|
19
|
+
}
|
|
20
|
+
export interface SkillsFlagDefinitionOptions {
|
|
21
|
+
description?: string;
|
|
22
|
+
hidden?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export declare function resolveSkillsFlagConfig(input?: unknown): SkillsFlagConfig;
|
|
25
|
+
export declare function createSkillsFlagDefinition(config?: SkillsFlagConfigInput, options?: SkillsFlagDefinitionOptions): SkillsFlagDefinition;
|
|
1
26
|
export declare const llmsFlagConfig: {
|
|
2
|
-
|
|
3
|
-
|
|
27
|
+
aliases: string[];
|
|
28
|
+
description: string;
|
|
29
|
+
hidden: boolean;
|
|
4
30
|
};
|
|
5
31
|
export declare function commandSkillFilename(commandId: string): string;
|
|
6
32
|
export declare function ensureFinalNewline(input: string): string;
|
|
7
|
-
export declare function hasSkillsFlag(argv: string[]): boolean;
|
|
8
|
-
export declare function readCommandSkill(commandId: string, root: string): Promise<string | undefined>;
|
|
33
|
+
export declare function hasSkillsFlag(argv: string[], config?: Pick<SkillsFlagConfig, "aliases" | "flag">): boolean;
|
|
34
|
+
export declare function readCommandSkill(commandId: string, root: string, directory?: string): Promise<string | undefined>;
|
|
9
35
|
//# sourceMappingURL=skills.d.ts.map
|
package/dist/skills.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,mBAAmB,6BAA6B,CAAA;AAE7D,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE;QACV,OAAO,EAAE,MAAM,EAAE,CAAA;QACjB,WAAW,EAAE,MAAM,CAAA;QACnB,MAAM,EAAE,OAAO,CAAA;KAChB,CAAA;IACD,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,2BAA2B;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAkCD,wBAAgB,uBAAuB,CACrC,KAAK,GAAE,OAAmB,GACzB,gBAAgB,CAuClB;AAED,wBAAgB,0BAA0B,CACxC,MAAM,GAAE,qBAA0B,EAClC,OAAO,GAAE,2BAAgC,GACxC,oBAAoB,CAoBtB;AAED,eAAO,MAAM,cAAc;aAhHd,MAAM,EAAE;iBACJ,MAAM;YACX,OAAO;CA8GkD,CAAA;AAErE,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAc9D;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,GAAE,IAAI,CACV,gBAAgB,EAChB,SAAS,GAAG,MAAM,CACU,GAC7B,OAAO,CAcT;AAED,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,SAAS,SAAuC,GAC/C,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAa7B"}
|
package/dist/skills.js
CHANGED
|
@@ -1,11 +1,82 @@
|
|
|
1
1
|
import { readFile } from "node:fs/promises";
|
|
2
|
-
import { join } from "node:path";
|
|
3
|
-
const
|
|
4
|
-
const
|
|
5
|
-
export const llmsFlagConfig = {
|
|
2
|
+
import { join, posix, win32 } from "node:path";
|
|
3
|
+
const DEFAULT_DESCRIPTION = "Show agent-oriented guidance for this command";
|
|
4
|
+
const DEFAULT_SKILLS_FLAG_CONFIG = {
|
|
6
5
|
aliases: ["skill"],
|
|
7
|
-
|
|
6
|
+
directory: "skills",
|
|
7
|
+
flag: "llms",
|
|
8
8
|
};
|
|
9
|
+
const SKILLS_FLAG_CONFIG_OPTIONS = new Set(["aliases", "directory", "flag"]);
|
|
10
|
+
export const skillsFlagConfigKey = "oclif-plugin-skills-flag";
|
|
11
|
+
function validateFlagName(value, kind) {
|
|
12
|
+
if (typeof value !== "string" ||
|
|
13
|
+
value.length === 0 ||
|
|
14
|
+
value.startsWith("-") ||
|
|
15
|
+
/[\s=\0]/u.test(value)) {
|
|
16
|
+
throw new TypeError(`Invalid flag ${kind}: expected a name without leading dashes, whitespace, or "="`);
|
|
17
|
+
}
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
function validateSkillsDirectory(value) {
|
|
21
|
+
if (typeof value !== "string" ||
|
|
22
|
+
value.length === 0 ||
|
|
23
|
+
value.includes("\0") ||
|
|
24
|
+
posix.isAbsolute(value) ||
|
|
25
|
+
win32.isAbsolute(value) ||
|
|
26
|
+
value.split(/[\\/]/u).includes("..")) {
|
|
27
|
+
throw new TypeError("Invalid skills directory: expected a relative path without parent traversal");
|
|
28
|
+
}
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
export function resolveSkillsFlagConfig(input = undefined) {
|
|
32
|
+
if (input !== undefined &&
|
|
33
|
+
(typeof input !== "object" || input === null || Array.isArray(input))) {
|
|
34
|
+
throw new TypeError("Skills flag configuration must be an object");
|
|
35
|
+
}
|
|
36
|
+
const options = (input ?? {});
|
|
37
|
+
for (const option of Object.keys(options)) {
|
|
38
|
+
if (!SKILLS_FLAG_CONFIG_OPTIONS.has(option)) {
|
|
39
|
+
throw new TypeError(`Unknown configuration option: ${option}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const flag = validateFlagName(options.flag ?? DEFAULT_SKILLS_FLAG_CONFIG.flag, "name");
|
|
43
|
+
const aliasesInput = options.aliases ?? [
|
|
44
|
+
...DEFAULT_SKILLS_FLAG_CONFIG.aliases,
|
|
45
|
+
];
|
|
46
|
+
if (!Array.isArray(aliasesInput)) {
|
|
47
|
+
throw new TypeError("Skills flag aliases must be an array");
|
|
48
|
+
}
|
|
49
|
+
const aliases = aliasesInput.map((alias) => validateFlagName(alias, "alias"));
|
|
50
|
+
const names = [flag, ...aliases];
|
|
51
|
+
if (new Set(names).size !== names.length) {
|
|
52
|
+
throw new TypeError("Duplicate flag name in flag or aliases");
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
aliases,
|
|
56
|
+
directory: validateSkillsDirectory(options.directory ?? DEFAULT_SKILLS_FLAG_CONFIG.directory),
|
|
57
|
+
flag,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
export function createSkillsFlagDefinition(config = {}, options = {}) {
|
|
61
|
+
const resolved = resolveSkillsFlagConfig(config);
|
|
62
|
+
const description = options.description ?? DEFAULT_DESCRIPTION;
|
|
63
|
+
const hidden = options.hidden ?? true;
|
|
64
|
+
if (typeof description !== "string") {
|
|
65
|
+
throw new TypeError("Flag description must be a string");
|
|
66
|
+
}
|
|
67
|
+
if (typeof hidden !== "boolean") {
|
|
68
|
+
throw new TypeError("Flag visibility must be a boolean");
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
definition: {
|
|
72
|
+
aliases: resolved.aliases,
|
|
73
|
+
description,
|
|
74
|
+
hidden,
|
|
75
|
+
},
|
|
76
|
+
name: resolved.flag,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
export const llmsFlagConfig = createSkillsFlagDefinition().definition;
|
|
9
80
|
export function commandSkillFilename(commandId) {
|
|
10
81
|
const filename = commandId.replaceAll(":", "-") || "index";
|
|
11
82
|
if (filename === "." ||
|
|
@@ -20,17 +91,21 @@ export function commandSkillFilename(commandId) {
|
|
|
20
91
|
export function ensureFinalNewline(input) {
|
|
21
92
|
return input.endsWith("\n") ? input : `${input}\n`;
|
|
22
93
|
}
|
|
23
|
-
export function hasSkillsFlag(argv) {
|
|
94
|
+
export function hasSkillsFlag(argv, config = DEFAULT_SKILLS_FLAG_CONFIG) {
|
|
95
|
+
const flags = new Set([
|
|
96
|
+
`--${config.flag}`,
|
|
97
|
+
...config.aliases.map((alias) => alias.length === 1 ? `-${alias}` : `--${alias}`),
|
|
98
|
+
]);
|
|
24
99
|
for (const argument of argv) {
|
|
25
100
|
if (argument === "--")
|
|
26
101
|
return false;
|
|
27
|
-
if (
|
|
102
|
+
if (flags.has(argument))
|
|
28
103
|
return true;
|
|
29
104
|
}
|
|
30
105
|
return false;
|
|
31
106
|
}
|
|
32
|
-
export async function readCommandSkill(commandId, root) {
|
|
33
|
-
const path = join(root,
|
|
107
|
+
export async function readCommandSkill(commandId, root, directory = DEFAULT_SKILLS_FLAG_CONFIG.directory) {
|
|
108
|
+
const path = join(root, validateSkillsDirectory(directory), commandSkillFilename(commandId));
|
|
34
109
|
try {
|
|
35
110
|
return await readFile(path, "utf8");
|
|
36
111
|
}
|
package/dist/skills.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AAE9C,MAAM,mBAAmB,GAAG,+CAA+C,CAAA;AAC3E,MAAM,0BAA0B,GAAqB;IACnD,OAAO,EAAE,CAAC,OAAO,CAAC;IAClB,SAAS,EAAE,QAAQ;IACnB,IAAI,EAAE,MAAM;CACb,CAAA;AACD,MAAM,0BAA0B,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAA;AAE5E,MAAM,CAAC,MAAM,mBAAmB,GAAG,0BAA0B,CAAA;AA4B7D,SAAS,gBAAgB,CAAC,KAAc,EAAE,IAAsB;IAC9D,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,CAAC,MAAM,KAAK,CAAC;QAClB,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;QACrB,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EACtB,CAAC;QACD,MAAM,IAAI,SAAS,CACjB,gBAAgB,IAAI,8DAA8D,CACnF,CAAA;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAc;IAC7C,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,CAAC,MAAM,KAAK,CAAC;QAClB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QACpB,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC;QACvB,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC;QACvB,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EACpC,CAAC;QACD,MAAM,IAAI,SAAS,CACjB,6EAA6E,CAC9E,CAAA;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,KAAK,GAAY,SAAS;IAE1B,IACE,KAAK,KAAK,SAAS;QACnB,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EACrE,CAAC;QACD,MAAM,IAAI,SAAS,CAAC,6CAA6C,CAAC,CAAA;IACpE,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,KAAK,IAAI,EAAE,CAA4B,CAAA;IACxD,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,SAAS,CAAC,iCAAiC,MAAM,EAAE,CAAC,CAAA;QAChE,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,gBAAgB,CAC3B,OAAO,CAAC,IAAI,IAAI,0BAA0B,CAAC,IAAI,EAC/C,MAAM,CACP,CAAA;IACD,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,IAAI;QACtC,GAAG,0BAA0B,CAAC,OAAO;KACtC,CAAA;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAA;IAC7D,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAA;IAC7E,MAAM,KAAK,GAAG,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,CAAA;IAChC,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;QACzC,MAAM,IAAI,SAAS,CAAC,wCAAwC,CAAC,CAAA;IAC/D,CAAC;IAED,OAAO;QACL,OAAO;QACP,SAAS,EAAE,uBAAuB,CAChC,OAAO,CAAC,SAAS,IAAI,0BAA0B,CAAC,SAAS,CAC1D;QACD,IAAI;KACL,CAAA;AACH,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,MAAM,GAA0B,EAAE,EAClC,OAAO,GAAgC,EAAE;IAEzC,MAAM,QAAQ,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAA;IAChD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,mBAAmB,CAAA;IAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAA;IAErC,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;QACpC,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAA;IAC1D,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAA;IAC1D,CAAC;IAED,OAAO;QACL,UAAU,EAAE;YACV,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,WAAW;YACX,MAAM;SACP;QACD,IAAI,EAAE,QAAQ,CAAC,IAAI;KACpB,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,0BAA0B,EAAE,CAAC,UAAU,CAAA;AAErE,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,OAAO,CAAA;IAE1D,IACE,QAAQ,KAAK,GAAG;QAChB,QAAQ,KAAK,IAAI;QACjB,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;QACtB,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;QACvB,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EACvB,CAAC;QACD,MAAM,IAAI,SAAS,CAAC,6BAA6B,SAAS,EAAE,CAAC,CAAA;IAC/D,CAAC;IAED,OAAO,GAAG,QAAQ,KAAK,CAAA;AACzB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAA;AACpD,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,IAAc,EACd,MAAM,GAGF,0BAA0B;IAE9B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC;QACpB,KAAK,MAAM,CAAC,IAAI,EAAE;QAClB,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAC9B,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAChD;KACF,CAAC,CAAA;IAEF,KAAK,MAAM,QAAQ,IAAI,IAAI,EAAE,CAAC;QAC5B,IAAI,QAAQ,KAAK,IAAI;YAAE,OAAO,KAAK,CAAA;QACnC,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAA;IACtC,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,SAAiB,EACjB,IAAY,EACZ,SAAS,GAAG,0BAA0B,CAAC,SAAS;IAEhD,MAAM,IAAI,GAAG,IAAI,CACf,IAAI,EACJ,uBAAuB,CAAC,SAAS,CAAC,EAClC,oBAAoB,CAAC,SAAS,CAAC,CAChC,CAAA;IAED,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IACrC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAM;QAC9D,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC"}
|