@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 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
- both flags before oclif parses the command. To advertise `--llms`, add the exported config to the
47
- CLI's existing base command:
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
- - `--llms` and `--skill` take precedence over same-named host flags.
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
@@ -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;
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/hooks/init.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAQvC,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,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,CAkBf;AAED,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,IAUhB,CAAA;eAEc,IAAI"}
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"}
@@ -1,5 +1,7 @@
1
1
  import { writeFileSync } from "node:fs";
2
- import { commandSkillFilename, ensureFinalNewline, hasSkillsFlag, readCommandSkill, } from "../skills.js";
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 skills/${filename}.`);
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: config.isSingleCommandCLI,
35
- root: config.root,
62
+ isSingleCommandCLI,
63
+ root: commandPlugin.root,
36
64
  });
37
65
  };
38
66
  export default hook;
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/hooks/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAEvC,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,EACb,gBAAgB,GACjB,MAAM,cAAc,CAAA;AAiBrB,MAAM,cAAc,GAAsB;IACxC,IAAI,CAAC,IAAI;QACP,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACpB,CAAC;IACD,KAAK,CAAC,MAAM;QACV,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IAC1C,CAAC;CACF,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAA0B,EAC1B,OAAO,GAAsB,cAAc;IAE3C,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAM;IACxC,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC;QAAE,OAAM;IAE3E,MAAM,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAA;IAC1E,MAAM,QAAQ,GAAG,oBAAoB,CAAC,cAAc,CAAC,CAAA;IACrD,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;IAElE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,WAAW,GAAG,cAAc,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,CAAA;QACtE,OAAO,CAAC,KAAK,CACX,wCAAwC,WAAW,yBAAyB,QAAQ,GAAG,CACxF,CAAA;QACD,OAAM;IACR,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAA;IACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC;AAED,MAAM,IAAI,GAAc,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE;IAC9D,MAAM,gBAAgB,CAAC;QACrB,IAAI;QACJ,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,aAAa,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,SAAS;QACzE,SAAS,EAAE,EAAE;QACb,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;QACzE,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;QAC7C,IAAI,EAAE,MAAM,CAAC,IAAI;KAClB,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,eAAe,IAAI,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
@@ -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,GACjB,MAAM,aAAa,CAAA"}
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,GACjB,MAAM,aAAa,CAAA"}
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
- readonly aliases: readonly ["skill"];
3
- readonly description: "Show agent-oriented guidance for this command";
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
@@ -1 +1 @@
1
- {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,cAAc;aACzB,OAAO,YAAG,OAAO;aACjB,WAAW,EAAE,+CAA+C;CACpD,CAAA;AAEV,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAc9D;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAOrD;AAED,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAS7B"}
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 SKILLS_DIRECTORY = "skills";
4
- const SKILLS_FLAGS = new Set(["--llms", "--skill"]);
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
- description: "Show agent-oriented guidance for this command",
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 (SKILLS_FLAGS.has(argument))
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, SKILLS_DIRECTORY, commandSkillFilename(commandId));
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
  }
@@ -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;AAEhC,MAAM,gBAAgB,GAAG,QAAQ,CAAA;AACjC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAA;AAEnD,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,OAAO,EAAE,CAAC,OAAO,CAAC;IAClB,WAAW,EAAE,+CAA+C;CACpD,CAAA;AAEV,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,CAAC,IAAc;IAC1C,KAAK,MAAM,QAAQ,IAAI,IAAI,EAAE,CAAC;QAC5B,IAAI,QAAQ,KAAK,IAAI;YAAE,OAAO,KAAK,CAAA;QACnC,IAAI,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAA;IAC7C,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,SAAiB,EACjB,IAAY;IAEZ,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,gBAAgB,EAAE,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAA;IAE1E,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"}
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sanity-labs/oclif-plugin-skills-flag",
3
- "version": "0.1.2",
3
+ "version": "0.2.0",
4
4
  "description": "Expose per-command Markdown to coding agents through an oclif flag",
5
5
  "author": "Sanity",
6
6
  "license": "MIT",