@dsh-cc/plugin-loader 0.7.1 → 0.8.0-rc.2
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.i18n.yaml +1 -1
- package/README.md +30 -0
- package/lib/actor-contract-gate.d.ts +66 -0
- package/lib/actor-contract-gate.d.ts.map +1 -0
- package/lib/actor-contract-gate.js +83 -0
- package/lib/actor-contract-gate.js.map +1 -0
- package/lib/agents.d.ts +5 -1
- package/lib/agents.d.ts.map +1 -1
- package/lib/agents.js +65 -21
- package/lib/agents.js.map +1 -1
- package/lib/commands.d.ts +1 -0
- package/lib/commands.d.ts.map +1 -1
- package/lib/commands.js +84 -10
- package/lib/commands.js.map +1 -1
- package/lib/discovery.d.ts +20 -0
- package/lib/discovery.d.ts.map +1 -1
- package/lib/discovery.js +37 -1
- package/lib/discovery.js.map +1 -1
- package/lib/hooks.d.ts +8 -0
- package/lib/hooks.d.ts.map +1 -1
- package/lib/hooks.js +74 -5
- package/lib/hooks.js.map +1 -1
- package/lib/index.d.ts +17 -3
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +30 -8
- package/lib/index.js.map +1 -1
- package/lib/manifest.d.ts +11 -1
- package/lib/manifest.d.ts.map +1 -1
- package/lib/manifest.js +54 -1
- package/lib/manifest.js.map +1 -1
- package/lib/mcp.d.ts +1 -0
- package/lib/mcp.d.ts.map +1 -1
- package/lib/mcp.js +81 -5
- package/lib/mcp.js.map +1 -1
- package/lib/resolve-manifest.d.ts +15 -1
- package/lib/resolve-manifest.d.ts.map +1 -1
- package/lib/resolve-manifest.js +37 -12
- package/lib/resolve-manifest.js.map +1 -1
- package/lib/rules.d.ts +37 -0
- package/lib/rules.d.ts.map +1 -0
- package/lib/rules.js +171 -0
- package/lib/rules.js.map +1 -0
- package/lib/seams.d.ts +11 -1
- package/lib/seams.d.ts.map +1 -1
- package/lib/seams.js.map +1 -1
- package/lib/skills.d.ts +1 -0
- package/lib/skills.d.ts.map +1 -1
- package/lib/skills.js +45 -8
- package/lib/skills.js.map +1 -1
- package/lib/types.d.ts +31 -1
- package/lib/types.d.ts.map +1 -1
- package/package.json +17 -14
package/README.i18n.yaml
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
# side as of the last confirmed-consistent state. Both languages carry equal authority;
|
|
3
3
|
# after editing either side, bring the other along and re-record with:
|
|
4
4
|
# pnpm check:readme --write
|
|
5
|
-
README.md:
|
|
5
|
+
README.md: 0607a9e1fa6e1f3d0420e69dc9ed1bc5ffdd23a9
|
|
6
6
|
README.zh.md: 6457beeefb0b40d948dee781ddbc616379ff3195
|
package/README.md
CHANGED
|
@@ -58,6 +58,36 @@ Each component is peer-style: the loader probes the host seam via `ctx.get(...)`
|
|
|
58
58
|
|
|
59
59
|
The `hooks` and `mcp` seams have no harness-owned service in this package itself; a deployment that wants those components provides a guest seam or they are reported skipped. The dsh host wiring now supplies the `mcp` seam: the cc-shell glue provides a built-in `mcp` seam (`cc-shell/src/mcpSeam.ts`, the `cc-mcp-seam` child plugin), so plugin `mcpServers` mount for real in shipped deployments (see docs/plans/2026-09-07-plugin-mcp-seam.md). `hooks` remains host-depended.
|
|
60
60
|
|
|
61
|
+
## Cursor dialect
|
|
62
|
+
|
|
63
|
+
Cursor plugins load through the same pipeline as CC plugins — one tolerant parser with flavor-keyed branches, not a second loader. The dialect delta is manifest candidates plus small per-component normalizations; every degraded or ignored field surfaces as a warning on the load report.
|
|
64
|
+
|
|
65
|
+
**Manifest candidates.** A plugin root is probed in order: `.claude-plugin/plugin.json` → `.cursor-plugin/plugin.json` → top-level `plugin.json`. First hit wins. When both dialect manifests exist the CC one is used and the report carries the warning `cursor manifest ignored: cc manifest takes precedence`. The flavor (`cc` or `cursor`) is recorded on the resolved manifest and on the load report.
|
|
66
|
+
|
|
67
|
+
**Cursor-only behaviors:**
|
|
68
|
+
|
|
69
|
+
- **Rules** — `rules/*.mdc` files (declared or the default `rules/` dir) are parsed and mounted via the `rules` guest seam: the cc-shell bridge renders one consolidated `cc:plugin-rules` system-prompt section per plugin (static for `alwaysApply`, conditional-instruction for glob-scoped; a 4000-character per-plugin budget with explicit truncation). Where the seam is absent they are tallied as skipped with a warning.
|
|
70
|
+
- **Hooks** — camelCase Cursor events map through the verified dialect table in `hooks.ts`; cursor wire entries (`{command, matcher?, loop_limit?}`) become CC matcher groups and `${CURSOR_PLUGIN_ROOT}` expands to the plugin root:
|
|
71
|
+
|
|
72
|
+
| Cursor event | CC event |
|
|
73
|
+
|---|---|
|
|
74
|
+
| `sessionStart` | `SessionStart` |
|
|
75
|
+
| `sessionEnd` | `SessionEnd` |
|
|
76
|
+
| `preToolUse` | `PreToolUse` |
|
|
77
|
+
| `postToolUse` | `PostToolUse` |
|
|
78
|
+
| `postToolUseFailure` | `PostToolUseFailure` |
|
|
79
|
+
| `subagentStart` | `SubagentStart` |
|
|
80
|
+
| `subagentStop` | `SubagentStop` |
|
|
81
|
+
| `beforeSubmitPrompt` | `UserPromptSubmit` |
|
|
82
|
+
| `preCompact` | `PreCompact` |
|
|
83
|
+
| `stop` | `Stop` |
|
|
84
|
+
|
|
85
|
+
Unmapped events (`beforeShellExecution`, `afterShellExecution`, `beforeMCPExecution`, `beforeReadFile`, `afterFileEdit`, `afterAgentResponse`, `afterAgentThought`, Tab and app hooks) skip with a warning; `loop_limit` warns.
|
|
86
|
+
- **Commands** — `.txt` files mount as plain text on the cursor flavor (in addition to `.md`).
|
|
87
|
+
- **MCP** — `mcp.json` in the plugin root is default discovery (no manifest declaration needed); `mcpServers` accepts the Cursor array form. An unresolved `${VAR}` in a server's env fails only that server, with a named warning.
|
|
88
|
+
- **Glob paths** — `dir/**` expands directory-recursively; any other glob form is skipped with a warning.
|
|
89
|
+
- **Warn-only fields** — `minClientVersions` (client-version gating not enforced) and `variables` (not prompted; set values via environment) surface as warnings and are otherwise ignored.
|
|
90
|
+
|
|
61
91
|
## Skill semantic wiring
|
|
62
92
|
|
|
63
93
|
On top of the skill mount, this package is the consumer that turns `skill-claude-code`'s metadata into actionable registrations:
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `actor-contract` settings gate for the plugin loader (docs/plans/
|
|
3
|
+
* 2026-09-21-subagent-actor-contract-prompts.md §3.2): the settings namespace
|
|
4
|
+
* holding the model-pattern list that decides whether a marked actor-contract
|
|
5
|
+
* block survives into a subagent persona. The section is installed at plugin
|
|
6
|
+
* mount; `AgentProvider.start` reads the patterns live at spawn time so hot
|
|
7
|
+
* reload and mid-session settings edits apply on the next spawn.
|
|
8
|
+
*
|
|
9
|
+
* This package publishes NO cordis service: the task package owns
|
|
10
|
+
* `ccActorContractGate`, and a duplicate provide would throw on co-mount.
|
|
11
|
+
* Only the settings section is installed here (installSectionSafe's
|
|
12
|
+
* multi-owner semantics mean the second mounter gets a live setSource via
|
|
13
|
+
* settings/updated; identical schema + defaults make that safe), and the
|
|
14
|
+
* returned gate instance is the package's local live reader.
|
|
15
|
+
*
|
|
16
|
+
* KEEP IN SYNC: the namespace + schema are duplicated in
|
|
17
|
+
* `packages/subagent/task/src/actor-contract-gate.ts` so either mount order
|
|
18
|
+
* wins via installSectionSafe's multi-owner semantics; the candidates rule
|
|
19
|
+
* and dispatch default are shared from `@dsh-cc/claude-code-agents`.
|
|
20
|
+
*
|
|
21
|
+
* @module @dsh-cc/plugin-loader/actor-contract-gate
|
|
22
|
+
*/
|
|
23
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
24
|
+
import type { SettingsNamespace } from '@deepseek-ai/dsh-settings';
|
|
25
|
+
import z from '@deepseek-ai/schemastery';
|
|
26
|
+
import { DEFAULT_ACTOR_CONTRACT_MODELS, gateCandidates } from '@dsh-cc/claude-code-agents';
|
|
27
|
+
export { DEFAULT_ACTOR_CONTRACT_MODELS, gateCandidates };
|
|
28
|
+
/** The settings namespace for the actor-contract gate (kebab-case discipline). */
|
|
29
|
+
export declare const ACTOR_CONTRACT_NAMESPACE: SettingsNamespace;
|
|
30
|
+
/** The resolved settings section for the namespace. */
|
|
31
|
+
export interface ActorContractSettings {
|
|
32
|
+
/** Model patterns (case-insensitive globs, `*` the only wildcard). */
|
|
33
|
+
readonly models: string[];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* The section schema. The default DOES materialize (unlike permission-rules'
|
|
37
|
+
* absence-preserving sub-objects): gate-on-by-default is the product decision,
|
|
38
|
+
* while an explicit user `[]` stays a real array and closes the gate.
|
|
39
|
+
*/
|
|
40
|
+
export declare function actorContractSettingsSchema(): z<ActorContractSettings>;
|
|
41
|
+
/**
|
|
42
|
+
* Live gate state pinned to one context: `setSource`/`onChange` follow the
|
|
43
|
+
* settings-ns hook surface (the second owner of the namespace gets a live
|
|
44
|
+
* `setSource` via `settings/updated`, so patterns stay hot). When no settings
|
|
45
|
+
* provider ever attaches, the class keeps the DISPATCH-TIME default.
|
|
46
|
+
*/
|
|
47
|
+
export declare class ActorContractGate {
|
|
48
|
+
private current;
|
|
49
|
+
private read;
|
|
50
|
+
/** The configured patterns; read at spawn time by the seam call site. */
|
|
51
|
+
patterns(): readonly string[];
|
|
52
|
+
/** Settings-ns hook: point the live read at the current section source. */
|
|
53
|
+
setSource(current: () => ActorContractSettings): void;
|
|
54
|
+
/** Settings-ns hook: re-read the section (attach or a committed change). */
|
|
55
|
+
onChange(): void;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Install the `actor-contract` settings section when a settings provider
|
|
59
|
+
* exists (absent provider → default patterns) and return the local live gate
|
|
60
|
+
* the plugin's `AgentProvider`s read at spawn time. No cordis service is
|
|
61
|
+
* provided — the task package owns `ccActorContractGate`.
|
|
62
|
+
* @param ctx - the context the loader mounts on.
|
|
63
|
+
* @returns the live gate instance.
|
|
64
|
+
*/
|
|
65
|
+
export declare function mountActorContractGate(ctx: Context): ActorContractGate;
|
|
66
|
+
//# sourceMappingURL=actor-contract-gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actor-contract-gate.d.ts","sourceRoot":"","sources":["../src/actor-contract-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAClE,OAAO,CAAC,MAAM,0BAA0B,CAAA;AAExC,OAAO,EAAE,6BAA6B,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAI1F,OAAO,EAAE,6BAA6B,EAAE,cAAc,EAAE,CAAA;AAExD,kFAAkF;AAClF,eAAO,MAAM,wBAAwB,EAAuB,iBAAiB,CAAA;AAE7E,uDAAuD;AACvD,MAAM,WAAW,qBAAqB;IACpC,sEAAsE;IACtE,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,IAAI,CAAC,CAAC,qBAAqB,CAAC,CAItE;AAED;;;;;GAKG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAmD;IAClE,OAAO,CAAC,IAAI,CAA2C;IAEvD,yEAAyE;IACzE,QAAQ,IAAI,SAAS,MAAM,EAAE;IAI7B,2EAA2E;IAC3E,SAAS,CAAC,OAAO,EAAE,MAAM,qBAAqB,GAAG,IAAI;IAIrD,4EAA4E;IAC5E,QAAQ,IAAI,IAAI;CAGjB;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,iBAAiB,CAWtE"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `actor-contract` settings gate for the plugin loader (docs/plans/
|
|
3
|
+
* 2026-09-21-subagent-actor-contract-prompts.md §3.2): the settings namespace
|
|
4
|
+
* holding the model-pattern list that decides whether a marked actor-contract
|
|
5
|
+
* block survives into a subagent persona. The section is installed at plugin
|
|
6
|
+
* mount; `AgentProvider.start` reads the patterns live at spawn time so hot
|
|
7
|
+
* reload and mid-session settings edits apply on the next spawn.
|
|
8
|
+
*
|
|
9
|
+
* This package publishes NO cordis service: the task package owns
|
|
10
|
+
* `ccActorContractGate`, and a duplicate provide would throw on co-mount.
|
|
11
|
+
* Only the settings section is installed here (installSectionSafe's
|
|
12
|
+
* multi-owner semantics mean the second mounter gets a live setSource via
|
|
13
|
+
* settings/updated; identical schema + defaults make that safe), and the
|
|
14
|
+
* returned gate instance is the package's local live reader.
|
|
15
|
+
*
|
|
16
|
+
* KEEP IN SYNC: the namespace + schema are duplicated in
|
|
17
|
+
* `packages/subagent/task/src/actor-contract-gate.ts` so either mount order
|
|
18
|
+
* wins via installSectionSafe's multi-owner semantics; the candidates rule
|
|
19
|
+
* and dispatch default are shared from `@dsh-cc/claude-code-agents`.
|
|
20
|
+
*
|
|
21
|
+
* @module @dsh-cc/plugin-loader/actor-contract-gate
|
|
22
|
+
*/
|
|
23
|
+
import z from '@deepseek-ai/schemastery';
|
|
24
|
+
import { installSectionSafe } from '@dsh-cc/settings-ns';
|
|
25
|
+
import { DEFAULT_ACTOR_CONTRACT_MODELS, gateCandidates } from '@dsh-cc/claude-code-agents';
|
|
26
|
+
// The candidates rule and dispatch default live in @dsh-cc/claude-code-agents
|
|
27
|
+
// so every seam (task, loader, resume-pins re-fingerprint) shares one source.
|
|
28
|
+
export { DEFAULT_ACTOR_CONTRACT_MODELS, gateCandidates };
|
|
29
|
+
/** The settings namespace for the actor-contract gate (kebab-case discipline). */
|
|
30
|
+
export const ACTOR_CONTRACT_NAMESPACE = 'actor-contract';
|
|
31
|
+
/**
|
|
32
|
+
* The section schema. The default DOES materialize (unlike permission-rules'
|
|
33
|
+
* absence-preserving sub-objects): gate-on-by-default is the product decision,
|
|
34
|
+
* while an explicit user `[]` stays a real array and closes the gate.
|
|
35
|
+
*/
|
|
36
|
+
export function actorContractSettingsSchema() {
|
|
37
|
+
return z.object({
|
|
38
|
+
models: z.array(z.string()).default([...DEFAULT_ACTOR_CONTRACT_MODELS]),
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Live gate state pinned to one context: `setSource`/`onChange` follow the
|
|
43
|
+
* settings-ns hook surface (the second owner of the namespace gets a live
|
|
44
|
+
* `setSource` via `settings/updated`, so patterns stay hot). When no settings
|
|
45
|
+
* provider ever attaches, the class keeps the DISPATCH-TIME default.
|
|
46
|
+
*/
|
|
47
|
+
export class ActorContractGate {
|
|
48
|
+
current = DEFAULT_ACTOR_CONTRACT_MODELS;
|
|
49
|
+
read;
|
|
50
|
+
/** The configured patterns; read at spawn time by the seam call site. */
|
|
51
|
+
patterns() {
|
|
52
|
+
return this.current;
|
|
53
|
+
}
|
|
54
|
+
/** Settings-ns hook: point the live read at the current section source. */
|
|
55
|
+
setSource(current) {
|
|
56
|
+
this.read = current;
|
|
57
|
+
}
|
|
58
|
+
/** Settings-ns hook: re-read the section (attach or a committed change). */
|
|
59
|
+
onChange() {
|
|
60
|
+
this.current = this.read?.().models ?? [...DEFAULT_ACTOR_CONTRACT_MODELS];
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Install the `actor-contract` settings section when a settings provider
|
|
65
|
+
* exists (absent provider → default patterns) and return the local live gate
|
|
66
|
+
* the plugin's `AgentProvider`s read at spawn time. No cordis service is
|
|
67
|
+
* provided — the task package owns `ccActorContractGate`.
|
|
68
|
+
* @param ctx - the context the loader mounts on.
|
|
69
|
+
* @returns the live gate instance.
|
|
70
|
+
*/
|
|
71
|
+
export function mountActorContractGate(ctx) {
|
|
72
|
+
const gate = new ActorContractGate();
|
|
73
|
+
ctx.inject(['settings'], () => {
|
|
74
|
+
installSectionSafe(ctx, ACTOR_CONTRACT_NAMESPACE, actorContractSettingsSchema(), {
|
|
75
|
+
models: [...DEFAULT_ACTOR_CONTRACT_MODELS],
|
|
76
|
+
}, {
|
|
77
|
+
setSource: (current) => { gate.setSource(current); },
|
|
78
|
+
onChange: () => gate.onChange(),
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
return gate;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=actor-contract-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actor-contract-gate.js","sourceRoot":"","sources":["../src/actor-contract-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,OAAO,CAAC,MAAM,0BAA0B,CAAA;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,EAAE,6BAA6B,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAE1F,8EAA8E;AAC9E,8EAA8E;AAC9E,OAAO,EAAE,6BAA6B,EAAE,cAAc,EAAE,CAAA;AAExD,kFAAkF;AAClF,MAAM,CAAC,MAAM,wBAAwB,GAAG,gBAAqC,CAAA;AAQ7E;;;;GAIG;AACH,MAAM,UAAU,2BAA2B;IACzC,OAAO,CAAC,CAAC,MAAM,CAAC;QACd,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,6BAA6B,CAAC,CAAC;KACxE,CAAwC,CAAA;AAC3C,CAAC;AAED;;;;;GAKG;AACH,MAAM,OAAO,iBAAiB;IACpB,OAAO,GAAsB,6BAA6B,CAAA;IAC1D,IAAI,CAA2C;IAEvD,yEAAyE;IACzE,QAAQ;QACN,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,2EAA2E;IAC3E,SAAS,CAAC,OAAoC;QAC5C,IAAI,CAAC,IAAI,GAAG,OAAO,CAAA;IACrB,CAAC;IAED,4EAA4E;IAC5E,QAAQ;QACN,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,6BAA6B,CAAC,CAAA;IAC3E,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CAAC,GAAY;IACjD,MAAM,IAAI,GAAG,IAAI,iBAAiB,EAAE,CAAA;IACpC,GAAG,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE;QAC5B,kBAAkB,CAAwB,GAAG,EAAE,wBAAwB,EAAE,2BAA2B,EAAE,EAAE;YACtG,MAAM,EAAE,CAAC,GAAG,6BAA6B,CAAC;SAC3C,EAAE;YACD,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA,CAAC,CAAC;YACnD,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE;SAChC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IACF,OAAO,IAAI,CAAA;AACb,CAAC"}
|
package/lib/agents.d.ts
CHANGED
|
@@ -57,10 +57,11 @@ export declare class AgentProvider implements SubagentBackend {
|
|
|
57
57
|
private readonly resolve;
|
|
58
58
|
private readonly resolveModel?;
|
|
59
59
|
private readonly registeredName?;
|
|
60
|
+
private readonly gatePatterns?;
|
|
60
61
|
/** Loader brand (see `PLUGIN_AGENT_PROVIDER_BRAND`); read via `isPluginAgentProvider`. */
|
|
61
62
|
readonly [PLUGIN_AGENT_PROVIDER_BRAND] = true;
|
|
62
63
|
private readonly backendName;
|
|
63
|
-
constructor(agentDefinition: AgentDefinition, resolve: (name: string) => SubagentBackend | undefined, resolveModel?: ResolveModel | undefined, registeredName?: string | undefined);
|
|
64
|
+
constructor(agentDefinition: AgentDefinition, resolve: (name: string) => SubagentBackend | undefined, resolveModel?: ResolveModel | undefined, registeredName?: string | undefined, gatePatterns?: (() => readonly string[]) | undefined);
|
|
64
65
|
/** Register-time provider name; `start` forwards to the backend. */
|
|
65
66
|
get name(): string;
|
|
66
67
|
/** The agent definition this provider overlays — unchanged, bare `agentType`. */
|
|
@@ -123,6 +124,8 @@ export interface MountAgentsOptions {
|
|
|
123
124
|
readonly namespacePrefix?: string;
|
|
124
125
|
/** Optional spawn-time model resolver threaded into every provider. */
|
|
125
126
|
readonly resolveModel?: ResolveModel;
|
|
127
|
+
/** Live gate patterns for the actor-contract block (read at spawn time). */
|
|
128
|
+
readonly gatePatterns?: () => readonly string[];
|
|
126
129
|
}
|
|
127
130
|
/**
|
|
128
131
|
* Load and register a plugin's sub-agent definitions.
|
|
@@ -132,5 +135,6 @@ export interface MountAgentsOptions {
|
|
|
132
135
|
export declare function mountAgents(options: MountAgentsOptions): Promise<{
|
|
133
136
|
disposers: (() => void)[];
|
|
134
137
|
tally: ComponentTally;
|
|
138
|
+
warnings: string[];
|
|
135
139
|
}>;
|
|
136
140
|
//# sourceMappingURL=agents.d.ts.map
|
package/lib/agents.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"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"}
|
package/lib/agents.js
CHANGED
|
@@ -11,10 +11,13 @@
|
|
|
11
11
|
*
|
|
12
12
|
* @module
|
|
13
13
|
*/
|
|
14
|
+
import { readdir } from 'node:fs/promises';
|
|
14
15
|
import { join, resolve } from 'node:path';
|
|
15
|
-
import { loadAgentsDir } from '@dsh-cc/claude-code-agents';
|
|
16
|
-
import { toAgentOptions } from '@dsh-cc/model-aliases';
|
|
16
|
+
import { loadAgentsDir, applyActorContract } from '@dsh-cc/claude-code-agents';
|
|
17
|
+
import { resolveSpawnEffort, toAgentOptions } from '@dsh-cc/model-aliases';
|
|
18
|
+
import { gateCandidates, DEFAULT_ACTOR_CONTRACT_MODELS } from "./actor-contract-gate.js";
|
|
17
19
|
import { ComponentTally } from "./seams.js";
|
|
20
|
+
import { globPathKind } from "./manifest.js";
|
|
18
21
|
/**
|
|
19
22
|
* Brand key stamped on every `AgentProvider` this loader creates. The task
|
|
20
23
|
* package's `PluginAgentIndex` requires it (besides the structural checks)
|
|
@@ -32,14 +35,16 @@ export class AgentProvider {
|
|
|
32
35
|
resolve;
|
|
33
36
|
resolveModel;
|
|
34
37
|
registeredName;
|
|
38
|
+
gatePatterns;
|
|
35
39
|
/** Loader brand (see `PLUGIN_AGENT_PROVIDER_BRAND`); read via `isPluginAgentProvider`. */
|
|
36
40
|
[PLUGIN_AGENT_PROVIDER_BRAND] = true;
|
|
37
41
|
backendName = 'fork';
|
|
38
|
-
constructor(agentDefinition, resolve, resolveModel, registeredName) {
|
|
42
|
+
constructor(agentDefinition, resolve, resolveModel, registeredName, gatePatterns) {
|
|
39
43
|
this.agentDefinition = agentDefinition;
|
|
40
44
|
this.resolve = resolve;
|
|
41
45
|
this.resolveModel = resolveModel;
|
|
42
46
|
this.registeredName = registeredName;
|
|
47
|
+
this.gatePatterns = gatePatterns;
|
|
43
48
|
}
|
|
44
49
|
/** Register-time provider name; `start` forwards to the backend. */
|
|
45
50
|
get name() {
|
|
@@ -76,9 +81,15 @@ export class AgentProvider {
|
|
|
76
81
|
}
|
|
77
82
|
const delegation = request;
|
|
78
83
|
const modelOverride = this.resolveModelOverride();
|
|
84
|
+
// Actor-contract gate (§3.1): strip/keep the marked block per the
|
|
85
|
+
// configured model patterns, read live at spawn time. Inherit model →
|
|
86
|
+
// no candidates → fail-closed strip. Candidates reuse the same model
|
|
87
|
+
// resolution the agentOptions overlay uses: resolved route id leads, the
|
|
88
|
+
// raw frontmatter token is the sole candidate when no route resolves.
|
|
89
|
+
const gatedPrompt = applyActorContract(this.agentDefinition.systemPrompt, gateCandidates(this.agentDefinition.model, modelOverride), this.gatePatterns?.() ?? DEFAULT_ACTOR_CONTRACT_MODELS);
|
|
79
90
|
return backend.start({
|
|
80
91
|
...delegation,
|
|
81
|
-
prompt:
|
|
92
|
+
prompt: gatedPrompt,
|
|
82
93
|
...modelOverride !== undefined
|
|
83
94
|
? { agentOptions: { ...delegation['agentOptions'], ...modelOverride } }
|
|
84
95
|
: {},
|
|
@@ -100,12 +111,12 @@ export class AgentProvider {
|
|
|
100
111
|
resolveModelOverride() {
|
|
101
112
|
const model = this.agentDefinition.model;
|
|
102
113
|
const resolver = this.resolveModel;
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
return
|
|
114
|
+
// Precedence: resolver-resolved effort ($level suffix / alias target) wins
|
|
115
|
+
// over frontmatter def.effort (resolveSpawnEffort, shared with task tool).
|
|
116
|
+
const route = resolver === undefined || model === undefined ? undefined : resolver(model);
|
|
117
|
+
const effort = resolveSpawnEffort(route, this.agentDefinition.effort);
|
|
118
|
+
const override = resolver === undefined ? (model !== undefined ? { model } : undefined) : toAgentOptions(route);
|
|
119
|
+
return effort === undefined ? override : { ...override, reasoningEffort: effort };
|
|
109
120
|
}
|
|
110
121
|
}
|
|
111
122
|
/** Agents live under this directory in a plugin root, when present. */
|
|
@@ -134,14 +145,15 @@ export function scopedType(prefix, agentType) {
|
|
|
134
145
|
export async function mountAgents(options) {
|
|
135
146
|
const tally = new ComponentTally('agents');
|
|
136
147
|
const disposers = [];
|
|
148
|
+
const globWarnings = [];
|
|
137
149
|
if (options.subagents === undefined) {
|
|
138
150
|
tally.addSkipped('subagent seam "subagents" is not mounted');
|
|
139
|
-
return { disposers, tally };
|
|
151
|
+
return { disposers, tally, warnings: globWarnings };
|
|
140
152
|
}
|
|
141
|
-
const definitions = await loadAgentDefinitions(options.pluginRoot, options.manifest);
|
|
153
|
+
const definitions = await loadAgentDefinitions(options.pluginRoot, options.manifest, globWarnings);
|
|
142
154
|
if (definitions.length === 0) {
|
|
143
155
|
tally.addSkipped('plugin ships no agents directory or manifest agents paths');
|
|
144
|
-
return { disposers, tally };
|
|
156
|
+
return { disposers, tally, warnings: globWarnings };
|
|
145
157
|
}
|
|
146
158
|
const subagents = options.subagents;
|
|
147
159
|
const prefix = options.namespacePrefix;
|
|
@@ -162,7 +174,7 @@ export async function mountAgents(options) {
|
|
|
162
174
|
tally.addSkipped(`skipped agent "${definition.agentType}": duplicate provider name "${scopedName}" is already registered`);
|
|
163
175
|
continue;
|
|
164
176
|
}
|
|
165
|
-
const provider = new AgentProvider(definition, name => subagents.getProvider(name), options.resolveModel, ...prefix !== undefined ? [scopedName] : []);
|
|
177
|
+
const provider = new AgentProvider(definition, name => subagents.getProvider(name), options.resolveModel, ...prefix !== undefined ? [scopedName] : [], options.gatePatterns);
|
|
166
178
|
disposers.push(subagents.registerProvider(provider));
|
|
167
179
|
tally.addLoaded();
|
|
168
180
|
}
|
|
@@ -174,17 +186,32 @@ export async function mountAgents(options) {
|
|
|
174
186
|
dispose();
|
|
175
187
|
throw error;
|
|
176
188
|
}
|
|
177
|
-
return { disposers, tally };
|
|
189
|
+
return { disposers, tally, warnings: globWarnings };
|
|
178
190
|
}
|
|
179
191
|
/** Load agent definitions from the standard `agents/` dir and manifest paths. */
|
|
180
|
-
async function loadAgentDefinitions(pluginRoot, manifest) {
|
|
192
|
+
async function loadAgentDefinitions(pluginRoot, manifest, globWarnings) {
|
|
181
193
|
const dirs = [join(pluginRoot, STANDARD_AGENTS_DIR)];
|
|
182
|
-
const
|
|
183
|
-
|
|
194
|
+
for (const path of manifest.agents) {
|
|
195
|
+
// Glob policy (plan §3.4): `agents/**` walks recursively; any other glob
|
|
196
|
+
// metacharacter is skipped with a warning, never expanded.
|
|
197
|
+
const kind = globPathKind(path);
|
|
198
|
+
if (kind === 'unsupported') {
|
|
199
|
+
const reason = `skipped agents entry "${path}": glob patterns other than a trailing "/**" are not expanded`;
|
|
200
|
+
globWarnings.push(reason);
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
const recursive = kind === 'recursive';
|
|
204
|
+
const expanded = recursive ? path.slice(0, -3) : path;
|
|
205
|
+
const resolved = resolve(pluginRoot, expanded);
|
|
184
206
|
// An inline path may name one `.md`/`.json` file; load its parent dir.
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
207
|
+
const dir = /\.(md|json)$/.test(resolved) ? dirname(resolved) : resolved;
|
|
208
|
+
if (recursive) {
|
|
209
|
+
dirs.push(...await collectAgentDirs(dir));
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
dirs.push(dir);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
188
215
|
const byName = new Map();
|
|
189
216
|
for (const dir of dirs) {
|
|
190
217
|
for (const agent of await loadAgentsDir(dir, 'project')) {
|
|
@@ -193,6 +220,23 @@ async function loadAgentDefinitions(pluginRoot, manifest) {
|
|
|
193
220
|
}
|
|
194
221
|
return Array.from(byName.values());
|
|
195
222
|
}
|
|
223
|
+
/** The dir itself plus every subdirectory, recursively (plan §3.4 cheap `/**` expansion). */
|
|
224
|
+
async function collectAgentDirs(dir) {
|
|
225
|
+
const found = [dir];
|
|
226
|
+
let entries;
|
|
227
|
+
try {
|
|
228
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
return found;
|
|
232
|
+
}
|
|
233
|
+
for (const entry of entries) {
|
|
234
|
+
if (!entry.isDirectory())
|
|
235
|
+
continue;
|
|
236
|
+
found.push(...await collectAgentDirs(join(dir, entry.name)));
|
|
237
|
+
}
|
|
238
|
+
return found;
|
|
239
|
+
}
|
|
196
240
|
function dirname(path) {
|
|
197
241
|
const index = path.lastIndexOf('/');
|
|
198
242
|
return index === -1 ? '.' : path.slice(0, index);
|
package/lib/agents.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"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"}
|
package/lib/commands.d.ts
CHANGED
|
@@ -103,6 +103,7 @@ export declare function mountCommands(options: MountCommandsOptions): {
|
|
|
103
103
|
disposers: (() => void)[];
|
|
104
104
|
mounted: MountedPluginCommand[];
|
|
105
105
|
tally: ComponentTally;
|
|
106
|
+
warnings?: string[];
|
|
106
107
|
};
|
|
107
108
|
/**
|
|
108
109
|
* Substitute `$ARGUMENTS` with the invocation's raw input and steer the
|
package/lib/commands.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,KAAK,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,KAAK,EAAE,gBAAgB,EAA2B,MAAM,YAAY,CAAA;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAG3C,mEAAmE;AACnE,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,iBAAiB,GAAG,MAAM,IAAI,CAAA;CACpD;AAED,8DAA8D;AAC9D,MAAM,WAAW,iBAAiB;IAChC,qEAAqE;IACrE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,0CAA0C;IAC1C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,uDAAuD;IACvD,QAAQ,CAAC,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IACjC,mFAAmF;IACnF,QAAQ,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE,qBAAqB,KAAK,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;CAChG;AAED,yDAAyD;AACzD;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,+EAA+E;IAC/E,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAA;KAAE,CAAA;IACvD,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAErD,kFAAkF;AAClF,MAAM,WAAW,mBAAmB;IAClC,yEAAyE;IACzE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,kCAAkC;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,0CAA0C;IAC1C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,oDAAoD;IACpD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAC/B;AAED,+EAA+E;AAC/E,MAAM,WAAW,oBAAoB;IACnC,6EAA6E;IAC7E,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAA;IAClC;;;OAGG;IACH,GAAG,CAAC,UAAU,EAAE,qBAAqB,GAAG,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;CAC/E;AAED,yEAAyE;AACzE,eAAO,MAAM,qBAAqB,aAAa,CAAA;AAE/C,kDAAkD;AAClD,MAAM,WAAW,oBAAoB;IACnC,2EAA2E;IAC3E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,uEAAuE;IACvE,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAA;IACnC,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,EAAE,YAAY,GAAG,SAAS,CAAA;CAC5C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG;IAC5D,SAAS,EAAE,CAAC,MAAM,IAAI,CAAC,EAAE,CAAA;IACzB,OAAO,EAAE,oBAAoB,EAAE,CAAA;IAC/B,KAAK,EAAE,cAAc,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB,CA8CA;AA8ID;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,qBAAqB,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAkB7H"}
|
package/lib/commands.js
CHANGED
|
@@ -11,8 +11,9 @@
|
|
|
11
11
|
import { readdirSync, readFileSync } from 'node:fs';
|
|
12
12
|
import { createUserMessage } from '@deepseek-ai/dsh-llm';
|
|
13
13
|
import { parseCcFrontmatter, parseCcFrontmatterDocument } from '@dsh-cc/skill-loader';
|
|
14
|
-
import { basename, join, resolve } from 'node:path';
|
|
14
|
+
import { basename, extname, join, resolve } from 'node:path';
|
|
15
15
|
import { ComponentTally } from "./seams.js";
|
|
16
|
+
import { globPathKind } from "./manifest.js";
|
|
16
17
|
/** Commands live under this directory in a plugin root, when present. */
|
|
17
18
|
export const STANDARD_COMMANDS_DIR = 'commands';
|
|
18
19
|
/**
|
|
@@ -34,16 +35,18 @@ export function mountCommands(options) {
|
|
|
34
35
|
const tally = new ComponentTally('commands');
|
|
35
36
|
const disposers = [];
|
|
36
37
|
const mounted = [];
|
|
38
|
+
const globWarnings = [];
|
|
37
39
|
if (options.commands === undefined) {
|
|
38
40
|
tally.addSkipped('commands seam "commands" is not mounted');
|
|
39
41
|
return { disposers, mounted, tally };
|
|
40
42
|
}
|
|
43
|
+
const flavor = options.manifest.flavor;
|
|
41
44
|
const entries = options.manifest.commandsDeclared
|
|
42
|
-
? [...options.manifest.commands]
|
|
43
|
-
: defaultCommandEntries(options.pluginRoot, tally);
|
|
45
|
+
? expandDeclaredCommandDirs(options.pluginRoot, [...options.manifest.commands], flavor, tally, globWarnings)
|
|
46
|
+
: defaultCommandEntries(options.pluginRoot, flavor, tally, globWarnings);
|
|
44
47
|
if (entries.length === 0) {
|
|
45
48
|
tally.addSkipped('plugin ships no commands');
|
|
46
|
-
return { disposers, mounted, tally };
|
|
49
|
+
return { disposers, mounted, tally, warnings: globWarnings };
|
|
47
50
|
}
|
|
48
51
|
for (const entry of entries) {
|
|
49
52
|
const rendered = renderCommand(options.pluginRoot, entry);
|
|
@@ -74,14 +77,85 @@ export function mountCommands(options) {
|
|
|
74
77
|
tally.addSkipped(`bare name "${entry.name}" not registered: ${String(error)}`);
|
|
75
78
|
}
|
|
76
79
|
}
|
|
77
|
-
return { disposers, mounted, tally };
|
|
80
|
+
return { disposers, mounted, tally, warnings: globWarnings };
|
|
78
81
|
}
|
|
79
82
|
/**
|
|
80
|
-
* Scan `commands/*.md` when the manifest omitted `commands`. Nested
|
|
83
|
+
* Scan `commands/*.{md,txt}` when the manifest omitted `commands`. Nested
|
|
81
84
|
* subdirectories are skipped with a reason (no silent drop, no colon names).
|
|
85
|
+
* `.txt` files mount only on the cursor flavor (plan §3.2) as plain text.
|
|
86
|
+
*/
|
|
87
|
+
function defaultCommandEntries(pluginRoot, flavor, tally, globWarnings) {
|
|
88
|
+
void globWarnings; // the default dir is a literal path; no glob policy applies
|
|
89
|
+
return scanCommandDir(pluginRoot, STANDARD_COMMANDS_DIR, flavor, tally);
|
|
90
|
+
}
|
|
91
|
+
/** Whether a command file name mounts for this flavor. */
|
|
92
|
+
function isCommandFile(name, flavor) {
|
|
93
|
+
return name.endsWith('.md') || (flavor === 'cursor' && name.endsWith('.txt'));
|
|
94
|
+
}
|
|
95
|
+
/** Walk one directory recursively collecting command files (plan §3.4 `/**`). */
|
|
96
|
+
function walkCommandDir(dir, flavor, found, tally) {
|
|
97
|
+
let entries;
|
|
98
|
+
try {
|
|
99
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
for (const entry of entries) {
|
|
105
|
+
const path = join(dir, entry.name);
|
|
106
|
+
if (entry.isDirectory())
|
|
107
|
+
walkCommandDir(path, flavor, found, tally);
|
|
108
|
+
else if ((entry.isFile() || entry.isSymbolicLink()) && isCommandFile(entry.name, flavor)) {
|
|
109
|
+
found.push({ name: basename(entry.name, extname(entry.name)), source: path });
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Expand manifest-declared command entries (plan §3.4): a `/**` suffix walks
|
|
115
|
+
* the base directory recursively; any other glob metacharacter skips the
|
|
116
|
+
* entry with a warning (never expanded); literals keep today's semantics.
|
|
82
117
|
*/
|
|
83
|
-
function
|
|
84
|
-
const
|
|
118
|
+
function expandDeclaredCommandDirs(pluginRoot, entries, flavor, tally, globWarnings) {
|
|
119
|
+
const expanded = [];
|
|
120
|
+
for (const entry of entries) {
|
|
121
|
+
if (entry.source === undefined) {
|
|
122
|
+
expanded.push(entry);
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
const kind = globPathKind(entry.source);
|
|
126
|
+
if (kind === 'unsupported') {
|
|
127
|
+
const reason = `skipped commands entry "${entry.source}": glob patterns other than a trailing "/**" are not expanded`;
|
|
128
|
+
tally.addSkipped(reason);
|
|
129
|
+
globWarnings.push(reason);
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
if (kind === 'recursive') {
|
|
133
|
+
walkCommandDir(resolve(pluginRoot, entry.source.slice(0, -3)), flavor, expanded, tally);
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
const path = resolve(pluginRoot, entry.source);
|
|
137
|
+
let files;
|
|
138
|
+
try {
|
|
139
|
+
files = readdirSync(path, { withFileTypes: true });
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
// Not a directory (or unreadable): keep the entry and let renderCommand fail loud.
|
|
143
|
+
expanded.push(entry);
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
for (const file of files) {
|
|
147
|
+
if (!file.isFile() && !file.isSymbolicLink())
|
|
148
|
+
continue;
|
|
149
|
+
if (!isCommandFile(file.name, flavor))
|
|
150
|
+
continue;
|
|
151
|
+
expanded.push({ ...entry, name: basename(file.name, extname(file.name)), source: join(path, file.name) });
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return expanded;
|
|
155
|
+
}
|
|
156
|
+
/** List command files under one commands directory, relative paths preserved. */
|
|
157
|
+
function scanCommandDir(pluginRoot, dirRelativeToRoot, flavor, tally) {
|
|
158
|
+
const dir = join(pluginRoot, dirRelativeToRoot);
|
|
85
159
|
let entries;
|
|
86
160
|
try {
|
|
87
161
|
entries = readdirSync(dir, { withFileTypes: true });
|
|
@@ -97,9 +171,9 @@ function defaultCommandEntries(pluginRoot, tally) {
|
|
|
97
171
|
}
|
|
98
172
|
if (!entry.isFile() && !entry.isSymbolicLink())
|
|
99
173
|
continue;
|
|
100
|
-
if (!entry.name
|
|
174
|
+
if (!isCommandFile(entry.name, flavor))
|
|
101
175
|
continue;
|
|
102
|
-
found.push({ name: basename(entry.name,
|
|
176
|
+
found.push({ name: basename(entry.name, extname(entry.name)), source: join(dirRelativeToRoot, entry.name) });
|
|
103
177
|
}
|
|
104
178
|
return found;
|
|
105
179
|
}
|
package/lib/commands.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAA;AACrF,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
|