@skillit/cli 0.4.0 → 0.6.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/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/npx-mode.d.ts +19 -0
- package/dist/npx-mode.d.ts.map +1 -0
- package/dist/npx-mode.js +37 -0
- package/dist/npx-mode.js.map +1 -0
- package/dist/program-loader.d.ts.map +1 -1
- package/dist/program-loader.js +17 -3
- package/dist/program-loader.js.map +1 -1
- package/dist/refine-source.d.ts +32 -5
- package/dist/refine-source.d.ts.map +1 -1
- package/dist/refine-source.js +85 -22
- package/dist/refine-source.js.map +1 -1
- package/package.json +3 -3
- package/skills/skillit-cli-docs/SKILL.md +22 -0
package/dist/index.d.ts
CHANGED
|
@@ -28,4 +28,6 @@ export type { LoadProgramOptions } from './program-loader.js';
|
|
|
28
28
|
export { readOptionsTags } from './options-jsdoc.js';
|
|
29
29
|
export { CliRefineSource } from './refine-source.js';
|
|
30
30
|
export type { CliRefineSourceOptions } from './refine-source.js';
|
|
31
|
+
export { applyNpxMode, resolveInvocationMode } from './npx-mode.js';
|
|
32
|
+
export type { CliInvocationMode } from './npx-mode.js';
|
|
31
33
|
//# 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;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC9D,YAAY,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC1E,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,YAAY,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,YAAY,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC9D,YAAY,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC1E,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,YAAY,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,YAAY,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACpE,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -24,4 +24,5 @@ export { extractCliSkill, writeCliSkill } from './extract.js';
|
|
|
24
24
|
export { loadProgram } from './program-loader.js';
|
|
25
25
|
export { readOptionsTags } from './options-jsdoc.js';
|
|
26
26
|
export { CliRefineSource } from './refine-source.js';
|
|
27
|
+
export { applyNpxMode, resolveInvocationMode } from './npx-mode.js';
|
|
27
28
|
//# 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;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG9D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG9D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ExtractedSkill, PackageMetadata } from '@skillit/core';
|
|
2
|
+
export type CliInvocationMode = 'npx' | 'global';
|
|
3
|
+
/**
|
|
4
|
+
* Determine the invocation mode for a CLI skill.
|
|
5
|
+
*
|
|
6
|
+
* Defaults to `npx` for public packages that advertise a `bin` entry;
|
|
7
|
+
* `global` otherwise. An explicit `override` always wins.
|
|
8
|
+
*/
|
|
9
|
+
export declare function resolveInvocationMode(meta: PackageMetadata, override?: CliInvocationMode): CliInvocationMode;
|
|
10
|
+
/**
|
|
11
|
+
* Populate `skill.cliInvocationPrefix`, `skill.readmeFeatures`,
|
|
12
|
+
* `skill.readmeTroubleshooting`, and `skill.examples` from package metadata.
|
|
13
|
+
*
|
|
14
|
+
* For public packages with a `bin` field, README content has the bare binary
|
|
15
|
+
* name substituted with `npx <fullPackageName>` so the skill works without
|
|
16
|
+
* a global install.
|
|
17
|
+
*/
|
|
18
|
+
export declare function applyNpxMode(skill: ExtractedSkill, meta: PackageMetadata, invocationMode?: CliInvocationMode): void;
|
|
19
|
+
//# sourceMappingURL=npx-mode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npx-mode.d.ts","sourceRoot":"","sources":["../src/npx-mode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErE,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,QAAQ,CAAC;AAEjD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,eAAe,EACrB,QAAQ,CAAC,EAAE,iBAAiB,GAC3B,iBAAiB,CAInB;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE,eAAe,EACrB,cAAc,CAAC,EAAE,iBAAiB,GACjC,IAAI,CAaN"}
|
package/dist/npx-mode.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Determine the invocation mode for a CLI skill.
|
|
3
|
+
*
|
|
4
|
+
* Defaults to `npx` for public packages that advertise a `bin` entry;
|
|
5
|
+
* `global` otherwise. An explicit `override` always wins.
|
|
6
|
+
*/
|
|
7
|
+
export function resolveInvocationMode(meta, override) {
|
|
8
|
+
if (override)
|
|
9
|
+
return override;
|
|
10
|
+
if (meta.bin && Object.keys(meta.bin).length > 0 && !meta.isPrivate)
|
|
11
|
+
return 'npx';
|
|
12
|
+
return 'global';
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Populate `skill.cliInvocationPrefix`, `skill.readmeFeatures`,
|
|
16
|
+
* `skill.readmeTroubleshooting`, and `skill.examples` from package metadata.
|
|
17
|
+
*
|
|
18
|
+
* For public packages with a `bin` field, README content has the bare binary
|
|
19
|
+
* name substituted with `npx <fullPackageName>` so the skill works without
|
|
20
|
+
* a global install.
|
|
21
|
+
*/
|
|
22
|
+
export function applyNpxMode(skill, meta, invocationMode) {
|
|
23
|
+
const mode = resolveInvocationMode(meta, invocationMode);
|
|
24
|
+
const binName = meta.bin ? Object.keys(meta.bin)[0] : undefined;
|
|
25
|
+
const pkgName = meta.fullPackageName;
|
|
26
|
+
const prefix = mode === 'npx' && pkgName ? `npx ${pkgName}` : undefined;
|
|
27
|
+
if (prefix)
|
|
28
|
+
skill.cliInvocationPrefix = prefix;
|
|
29
|
+
const sub = (s) => (prefix && binName ? s.replaceAll(binName, prefix) : s);
|
|
30
|
+
if (meta.readme?.features)
|
|
31
|
+
skill.readmeFeatures = sub(meta.readme.features);
|
|
32
|
+
if (meta.readme?.troubleshooting)
|
|
33
|
+
skill.readmeTroubleshooting = sub(meta.readme.troubleshooting);
|
|
34
|
+
if (meta.readme?.quickStart)
|
|
35
|
+
skill.examples = [sub(meta.readme.quickStart), ...skill.examples];
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=npx-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npx-mode.js","sourceRoot":"","sources":["../src/npx-mode.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAAqB,EACrB,QAA4B;IAE5B,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,IAAI,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAClF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAC1B,KAAqB,EACrB,IAAqB,EACrB,cAAkC;IAElC,MAAM,IAAI,GAAG,qBAAqB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC;IAErC,MAAM,MAAM,GAAG,IAAI,KAAK,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACxE,IAAI,MAAM;QAAE,KAAK,CAAC,mBAAmB,GAAG,MAAM,CAAC;IAE/C,MAAM,GAAG,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3F,IAAI,IAAI,CAAC,MAAM,EAAE,QAAQ;QAAE,KAAK,CAAC,cAAc,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5E,IAAI,IAAI,CAAC,MAAM,EAAE,eAAe;QAAE,KAAK,CAAC,qBAAqB,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IACjG,IAAI,IAAI,CAAC,MAAM,EAAE,UAAU;QAAE,KAAK,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;AACjG,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"program-loader.d.ts","sourceRoot":"","sources":["../src/program-loader.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,WAAW,kBAAkB;IACjC,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,GAAG,EAAE,MAAM,CAAC;CACb;
|
|
1
|
+
{"version":3,"file":"program-loader.d.ts","sourceRoot":"","sources":["../src/program-loader.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,WAAW,kBAAkB;IACjC,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,GAAG,EAAE,MAAM,CAAC;CACb;AAmDD;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,CAuD5E"}
|
package/dist/program-loader.js
CHANGED
|
@@ -1,11 +1,25 @@
|
|
|
1
1
|
import { readFileSync } from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { pathToFileURL } from 'node:url';
|
|
4
|
-
import { Command } from 'commander';
|
|
5
4
|
const LOAD_ERROR = 'Could not load a commander program; pass --program <file#export>';
|
|
6
5
|
function messageOf(error) {
|
|
7
6
|
return error instanceof Error ? error.message : String(error);
|
|
8
7
|
}
|
|
8
|
+
/**
|
|
9
|
+
* Duck-type check for a Commander {@link Command}.
|
|
10
|
+
*
|
|
11
|
+
* `instanceof Command` fails when the consumer's `commander` package is a
|
|
12
|
+
* different module instance than the one loaded here (e.g. separate monorepos
|
|
13
|
+
* with separate `node_modules`). Structural checks are cross-realm safe.
|
|
14
|
+
*/
|
|
15
|
+
function isCommanderCommand(value) {
|
|
16
|
+
if (typeof value !== 'object' || value === null)
|
|
17
|
+
return false;
|
|
18
|
+
const v = value;
|
|
19
|
+
return (typeof v['name'] === 'function' &&
|
|
20
|
+
Array.isArray(v['commands']) &&
|
|
21
|
+
typeof v['parseAsync'] === 'function');
|
|
22
|
+
}
|
|
9
23
|
/**
|
|
10
24
|
* Resolves a candidate export into a commander {@link Command}.
|
|
11
25
|
*
|
|
@@ -13,13 +27,13 @@ function messageOf(error) {
|
|
|
13
27
|
* function that returns one. Returns `undefined` for anything else.
|
|
14
28
|
*/
|
|
15
29
|
async function resolveCommand(candidate) {
|
|
16
|
-
if (candidate
|
|
30
|
+
if (isCommanderCommand(candidate)) {
|
|
17
31
|
return candidate;
|
|
18
32
|
}
|
|
19
33
|
if (typeof candidate === 'function' &&
|
|
20
34
|
candidate.length === 0) {
|
|
21
35
|
const result = await candidate();
|
|
22
|
-
if (result
|
|
36
|
+
if (isCommanderCommand(result)) {
|
|
23
37
|
return result;
|
|
24
38
|
}
|
|
25
39
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"program-loader.js","sourceRoot":"","sources":["../src/program-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"program-loader.js","sourceRoot":"","sources":["../src/program-loader.ts"],"names":[],"mappings":"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"}
|
package/dist/refine-source.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type DraftedFix, type ExtractedSkill, type RefineSource, type TargetLocation } from '@skillit/core';
|
|
2
2
|
import { Command } from 'commander';
|
|
3
|
+
import { type CliInvocationMode } from './npx-mode.js';
|
|
3
4
|
export interface CliRefineSourceOptions {
|
|
4
5
|
/** Commander program to introspect. */
|
|
5
6
|
program: Command;
|
|
@@ -7,6 +8,11 @@ export interface CliRefineSourceOptions {
|
|
|
7
8
|
sourceGlob: string;
|
|
8
9
|
/** Working directory (reserved for future relative-path resolution). */
|
|
9
10
|
cwd: string;
|
|
11
|
+
/**
|
|
12
|
+
* Override the invocation mode used in generated command examples.
|
|
13
|
+
* Defaults to `npx` for public packages with a `bin` field, `global` otherwise.
|
|
14
|
+
*/
|
|
15
|
+
invocationMode?: CliInvocationMode;
|
|
10
16
|
}
|
|
11
17
|
/**
|
|
12
18
|
* {@link RefineSource} for `@skillit/cli` consumers.
|
|
@@ -17,14 +23,35 @@ export interface CliRefineSourceOptions {
|
|
|
17
23
|
*/
|
|
18
24
|
export declare class CliRefineSource implements RefineSource {
|
|
19
25
|
private readonly opts;
|
|
26
|
+
/** Cached metadata loaded during {@link extract} (always called first in the audit/refine loop). */
|
|
27
|
+
private cachedMetadata;
|
|
20
28
|
constructor(opts: CliRefineSourceOptions);
|
|
21
|
-
/**
|
|
22
|
-
|
|
29
|
+
/**
|
|
30
|
+
* Candidate option-interface names for a command, in priority order.
|
|
31
|
+
*
|
|
32
|
+
* The documented convention is `<Command>Options` (e.g. `add-remote` →
|
|
33
|
+
* `AddRemoteOptions`, `db:migrate` → `DbMigrateOptions`), but real consumers —
|
|
34
|
+
* including skillit's own CLI — commonly name these `<Command>Opts` or
|
|
35
|
+
* `<Command>CommandOpts` (e.g. `init` → `InitOpts`, `refine` →
|
|
36
|
+
* `RefineCommandOpts`). We probe all three and use the first that a source
|
|
37
|
+
* file actually declares, so a non-conventional consumer still gets matched
|
|
38
|
+
* instead of silently skipped (or colliding with an unrelated `XOptions`).
|
|
39
|
+
*/
|
|
40
|
+
private interfaceNameCandidates;
|
|
23
41
|
extract(): Promise<ExtractedSkill>;
|
|
24
42
|
guidance(): string;
|
|
25
|
-
|
|
43
|
+
resolveTargetLocation(target: {
|
|
44
|
+
name: string;
|
|
45
|
+
kind: string;
|
|
46
|
+
file?: string;
|
|
47
|
+
}): Promise<TargetLocation | undefined>;
|
|
26
48
|
applyFixes(fixes: readonly DraftedFix[]): Promise<void>;
|
|
27
|
-
/**
|
|
49
|
+
/**
|
|
50
|
+
* Reads tags for the first candidate interface that a globbed source file
|
|
51
|
+
* declares with at least one tag. Candidates are tried in priority order so
|
|
52
|
+
* the documented `<Command>Options` name wins over the `Opts`/`CommandOpts`
|
|
53
|
+
* fallbacks when more than one is present.
|
|
54
|
+
*/
|
|
28
55
|
private readTagsAcross;
|
|
29
56
|
private readSources;
|
|
30
57
|
private findInterfaceFile;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refine-source.d.ts","sourceRoot":"","sources":["../src/refine-source.ts"],"names":[],"mappings":"AAGA,OAAO,
|
|
1
|
+
{"version":3,"file":"refine-source.d.ts","sourceRoot":"","sources":["../src/refine-source.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,KAAK,UAAU,EAEf,KAAK,cAAc,EAEnB,KAAK,YAAY,EAEjB,KAAK,cAAc,EACpB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EAAgB,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAKrE,MAAM,WAAW,sBAAsB;IACrC,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,oEAAoE;IACpE,UAAU,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,GAAG,EAAE,MAAM,CAAC;IACZ;;;OAGG;IACH,cAAc,CAAC,EAAE,iBAAiB,CAAC;CACpC;AAED;;;;;;GAMG;AACH,qBAAa,eAAgB,YAAW,YAAY;IAItC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,oGAAoG;IACpG,OAAO,CAAC,cAAc,CAAuB;IAE7C,YAA6B,IAAI,EAAE,sBAAsB,EAAI;IAE7D;;;;;;;;;;OAUG;IACH,OAAO,CAAC,uBAAuB;IASzB,OAAO,IAAI,OAAO,CAAC,cAAc,CAAC,CA0EvC;IAED,QAAQ,IAAI,MAAM,CAKjB;IAEK,qBAAqB,CAAC,MAAM,EAAE;QAClC,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAQtC;IAEK,UAAU,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8B5D;IAED;;;;;OAKG;IACH,OAAO,CAAC,cAAc;YAmBR,WAAW;IAUzB,OAAO,CAAC,iBAAiB;CAQ1B"}
|
package/dist/refine-source.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { readFileSync } from 'node:fs';
|
|
2
2
|
import { glob, readFile, writeFile } from 'node:fs/promises';
|
|
3
3
|
import { fileURLToPath } from 'node:url';
|
|
4
|
-
import { upsertJsDocTag } from '@skillit/core';
|
|
4
|
+
import { findNearestPackageDir, readPackageMetadata, upsertJsDocTag } from '@skillit/core';
|
|
5
5
|
import { extractCliSkill } from './extract.js';
|
|
6
6
|
import { introspectCommander } from './introspect-commander.js';
|
|
7
|
+
import { applyNpxMode } from './npx-mode.js';
|
|
7
8
|
import { readOptionsTags } from './options-jsdoc.js';
|
|
8
9
|
const EXCLUDED_DIRS = new Set(['node_modules', 'dist', 'build', '.git', 'coverage', '.cache']);
|
|
9
10
|
/**
|
|
@@ -15,25 +16,41 @@ const EXCLUDED_DIRS = new Set(['node_modules', 'dist', 'build', '.git', 'coverag
|
|
|
15
16
|
*/
|
|
16
17
|
export class CliRefineSource {
|
|
17
18
|
opts;
|
|
19
|
+
/** Cached metadata loaded during {@link extract} (always called first in the audit/refine loop). */
|
|
20
|
+
cachedMetadata = {};
|
|
18
21
|
constructor(opts) {
|
|
19
22
|
this.opts = opts;
|
|
20
23
|
}
|
|
21
|
-
/**
|
|
22
|
-
|
|
24
|
+
/**
|
|
25
|
+
* Candidate option-interface names for a command, in priority order.
|
|
26
|
+
*
|
|
27
|
+
* The documented convention is `<Command>Options` (e.g. `add-remote` →
|
|
28
|
+
* `AddRemoteOptions`, `db:migrate` → `DbMigrateOptions`), but real consumers —
|
|
29
|
+
* including skillit's own CLI — commonly name these `<Command>Opts` or
|
|
30
|
+
* `<Command>CommandOpts` (e.g. `init` → `InitOpts`, `refine` →
|
|
31
|
+
* `RefineCommandOpts`). We probe all three and use the first that a source
|
|
32
|
+
* file actually declares, so a non-conventional consumer still gets matched
|
|
33
|
+
* instead of silently skipped (or colliding with an unrelated `XOptions`).
|
|
34
|
+
*/
|
|
35
|
+
interfaceNameCandidates(command) {
|
|
23
36
|
const pascal = command
|
|
24
37
|
.split(/[-_:.\s]+/)
|
|
25
38
|
.filter((part) => part.length > 0)
|
|
26
39
|
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
|
27
40
|
.join('');
|
|
28
|
-
return `${pascal}Options
|
|
41
|
+
return [`${pascal}Options`, `${pascal}Opts`, `${pascal}CommandOpts`];
|
|
29
42
|
}
|
|
30
43
|
async extract() {
|
|
31
44
|
const surfaces = introspectCommander(this.opts.program);
|
|
32
45
|
const sources = await this.readSources();
|
|
46
|
+
// Load package metadata (package.json + README) from cwd; its fields are
|
|
47
|
+
// written onto the IR below so the audit reads them directly from the skill.
|
|
48
|
+
const pkgDir = await findNearestPackageDir(this.opts.cwd);
|
|
49
|
+
this.cachedMetadata = pkgDir ? await readPackageMetadata(pkgDir) : {};
|
|
33
50
|
const configSurfaces = [];
|
|
34
51
|
for (const surface of surfaces) {
|
|
35
|
-
const
|
|
36
|
-
const tags = this.readTagsAcross(
|
|
52
|
+
const candidates = this.interfaceNameCandidates(surface.name);
|
|
53
|
+
const tags = this.readTagsAcross(candidates, sources);
|
|
37
54
|
// Key the correlation-input surface by the COMMAND name (not the
|
|
38
55
|
// interface name) so `extractCliSkill`'s `<command>`/`<command>options`
|
|
39
56
|
// lookup matches colon-namespaced commands (e.g. `db:migrate`). Mark it
|
|
@@ -72,22 +89,61 @@ export class CliRefineSource {
|
|
|
72
89
|
configSurfaces.push(configSurface);
|
|
73
90
|
}
|
|
74
91
|
}
|
|
75
|
-
|
|
92
|
+
const meta = this.cachedMetadata;
|
|
93
|
+
const skill = await extractCliSkill({
|
|
94
|
+
program: this.opts.program,
|
|
95
|
+
configSurfaces,
|
|
96
|
+
metadata: {
|
|
97
|
+
...(meta.packageName !== undefined ? { name: meta.packageName } : {}),
|
|
98
|
+
...(meta.packageDescription !== undefined ? { description: meta.packageDescription } : {}),
|
|
99
|
+
...(meta.keywords !== undefined ? { keywords: meta.keywords } : {}),
|
|
100
|
+
...(meta.repository !== undefined ? { repository: meta.repository } : {})
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
// Write the audit-read project metadata onto the IR (the audit reads it
|
|
104
|
+
// directly from the skill — no separate context channel). extractCliSkill
|
|
105
|
+
// maps `description` onto the skill body but not these audit fields.
|
|
106
|
+
if (meta.packageDescription !== undefined)
|
|
107
|
+
skill.packageDescription = meta.packageDescription;
|
|
108
|
+
if (meta.keywords !== undefined)
|
|
109
|
+
skill.keywords = meta.keywords;
|
|
110
|
+
if (meta.repository !== undefined)
|
|
111
|
+
skill.repository = meta.repository;
|
|
112
|
+
if (meta.readme !== undefined)
|
|
113
|
+
skill.readme = meta.readme;
|
|
114
|
+
applyNpxMode(skill, meta, this.opts.invocationMode);
|
|
115
|
+
return skill;
|
|
76
116
|
}
|
|
77
117
|
guidance() {
|
|
78
118
|
const skillPath = fileURLToPath(new URL('../skills/skillit-cli-docs/SKILL.md', import.meta.url));
|
|
79
119
|
return readFileSync(skillPath, 'utf8');
|
|
80
120
|
}
|
|
81
|
-
|
|
82
|
-
|
|
121
|
+
async resolveTargetLocation(target) {
|
|
122
|
+
const sources = await this.readSources();
|
|
123
|
+
const candidates = this.interfaceNameCandidates(target.name);
|
|
124
|
+
for (const iface of candidates) {
|
|
125
|
+
const file = this.findInterfaceFile(iface, sources);
|
|
126
|
+
if (file)
|
|
127
|
+
return { file, declName: iface };
|
|
128
|
+
}
|
|
129
|
+
return undefined;
|
|
83
130
|
}
|
|
84
131
|
async applyFixes(fixes) {
|
|
85
132
|
const sources = await this.readSources();
|
|
86
133
|
for (const fix of fixes) {
|
|
87
|
-
const
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
134
|
+
const candidates = this.interfaceNameCandidates(fix.toolName);
|
|
135
|
+
let iface;
|
|
136
|
+
let file;
|
|
137
|
+
for (const candidate of candidates) {
|
|
138
|
+
const found = this.findInterfaceFile(candidate, sources);
|
|
139
|
+
if (found) {
|
|
140
|
+
iface = candidate;
|
|
141
|
+
file = found;
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (file === undefined || iface === undefined) {
|
|
146
|
+
process.stderr.write(`[skillit] no options interface (${candidates.join(', ')}) for command '${fix.toolName}'; skipped ${fix.tag}\n`);
|
|
91
147
|
continue;
|
|
92
148
|
}
|
|
93
149
|
const src = sources.get(file);
|
|
@@ -100,15 +156,22 @@ export class CliRefineSource {
|
|
|
100
156
|
}
|
|
101
157
|
}
|
|
102
158
|
}
|
|
103
|
-
/**
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
159
|
+
/**
|
|
160
|
+
* Reads tags for the first candidate interface that a globbed source file
|
|
161
|
+
* declares with at least one tag. Candidates are tried in priority order so
|
|
162
|
+
* the documented `<Command>Options` name wins over the `Opts`/`CommandOpts`
|
|
163
|
+
* fallbacks when more than one is present.
|
|
164
|
+
*/
|
|
165
|
+
readTagsAcross(candidates, sources) {
|
|
166
|
+
for (const iface of candidates) {
|
|
167
|
+
for (const src of sources.values()) {
|
|
168
|
+
if (!fileDeclaresInterface(src, iface)) {
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
const tags = readOptionsTags(iface, src);
|
|
172
|
+
if (Object.keys(tags).length > 0) {
|
|
173
|
+
return tags;
|
|
174
|
+
}
|
|
112
175
|
}
|
|
113
176
|
}
|
|
114
177
|
return {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refine-source.js","sourceRoot":"","sources":["../src/refine-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EACL,cAAc,
|
|
1
|
+
{"version":3,"file":"refine-source.js","sourceRoot":"","sources":["../src/refine-source.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@skillit/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Extract CLI command structure from commander/yargs for AI agent skill generation",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agent-skills",
|
|
@@ -41,10 +41,10 @@
|
|
|
41
41
|
}
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@skillit/core": "1.
|
|
44
|
+
"@skillit/core": "2.1.0"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
|
-
"commander": "^
|
|
47
|
+
"commander": "^15.0.0"
|
|
48
48
|
},
|
|
49
49
|
"peerDependencies": {
|
|
50
50
|
"commander": ">=12.0.0"
|
|
@@ -18,6 +18,28 @@ Use this skill when documenting command-line programs for `@skillit/cli`.
|
|
|
18
18
|
- `.usage()` strings and example help text
|
|
19
19
|
- Environment-variable documentation and config-surface JSDoc correlation
|
|
20
20
|
|
|
21
|
+
## Routing Tags via Option Interfaces
|
|
22
|
+
|
|
23
|
+
For routing tags (`@useWhen`, `@avoidWhen`, `@pitfalls`), add them as JSDoc on
|
|
24
|
+
a `<PascalCommandName>Options` interface in a TypeScript source file.
|
|
25
|
+
The interface needs no properties — only the JSDoc block matters:
|
|
26
|
+
|
|
27
|
+
```typescript
|
|
28
|
+
/**
|
|
29
|
+
* @useWhen - Server advertises callHierarchyProvider capability
|
|
30
|
+
* @avoidWhen - Server doesn't support call hierarchy; lsproxy will error
|
|
31
|
+
* @never - NEVER invoke without verifying server supports this capability. Fix: check --help output or use `lsproxy call` to probe the server first
|
|
32
|
+
*/
|
|
33
|
+
interface CallHierarchyOptions {}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
`CliRefineSource` discovers these interfaces via the source glob (`**/*.ts`) and
|
|
37
|
+
correlates their tags onto the corresponding command in the generated skill.
|
|
38
|
+
Create one per command that needs routing guidance; the filename is arbitrary
|
|
39
|
+
(e.g. `src/command-options.ts`). After adding the interface, re-run `skillit gen`
|
|
40
|
+
to regenerate — `resolveTargetLocation` will now resolve and `skillit refine`
|
|
41
|
+
can write tags into the interface directly.
|
|
42
|
+
|
|
21
43
|
## Fix Patterns
|
|
22
44
|
|
|
23
45
|
- Describe command intent in one sentence, not just the verb
|