@dsh-cc/plugin-loader 0.5.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/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 run verify-translation-pairing --write packages/compat/cc-plugin-loader/README.md
5
- README.md: 65fe89c9cc986bdacab63f793a6eaa10501c75be
6
- README.zh.md: e6ab1f75541a85aaa469c384a5649ed8904e228a
5
+ README.md: f44313c281546e6a4cd14ba1d0d4f3e3ab839092
6
+ README.zh.md: 6457beeefb0b40d948dee781ddbc616379ff3195
package/README.md CHANGED
@@ -8,16 +8,24 @@ This compatibility loader reads a CC plugin manifest subset, translates each com
8
8
 
9
9
  ## Discovery
10
10
 
11
- `discoverCcPluginRoots({ pluginDirs?, claudeHome?, cwd? })` is the glue's on-disk finder:
11
+ `discoverCcPluginRoots({ pluginDirs?, claudeHome?, dshHome?, cwd? })` is the glue's on-disk finder:
12
12
 
13
13
  | `pluginDirs` | Behavior |
14
14
  |---|---|
15
- | `undefined` (default) | Intersection of `enabledPlugins` (user → project → local settings cascade) and `{claudeHome}/plugins/installed_plugins.json`. Keys must be exact `name@marketplace`. `$CLAUDE_CONFIG_DIR` (else `~/.claude`) is the Claude home. |
15
+ | `undefined` (default) | Intersection of `enabledPlugins` (claude-user → dsh-user → project → local settings cascade, later files overriding per key) and the merged `installed_plugins.json` of both homes. Keys must be exact `name@marketplace`. The Claude home is `$CLAUDE_CONFIG_DIR` (else `~/.claude`); the dsh home is the explicit `dshHome` → the explicit `claudeHome` (legacy single-root) → `$DSH_HOME` (else `~/.dsh`). |
16
16
  | `[]` or `null` | Empty — discovery disabled. |
17
17
  | non-empty | Flatten those dirs: the dir itself, or one-level children, that hold `.claude-plugin/plugin.json` or top-level `plugin.json`. Marketplace-only dirs are not flatten roots. |
18
18
 
19
19
  Unreadable JSON and missing `installPath`s skip rather than throw. Project/local `enabledPlugins` are boot-cwd-biased (host-plane singleton); `/reload-plugins` re-reads the cascade.
20
20
 
21
+ ### Dual-home state (compat-read `~/.claude`, write `~/.dsh`)
22
+
23
+ Plugin state is dual-home: the Claude home (`$CLAUDE_CONFIG_DIR` / `~/.claude`) stays fully **read-visible** for Claude Code compatibility, while the dsh home (`$DSH_HOME` / `~/.dsh`) is the **write root**. When both homes carry state, the merge is per key with dsh-wins: a dsh `enabledPlugins` entry shadows the claude one (the dsh cascade layer sits between the claude-user and project layers), and a dsh `installed_plugins.json` entry list — including an empty list — shadows the claude list for that plugin id. Consequences worth knowing:
24
+
25
+ - The fork is one-way: dsh-cc sees both homes; real Claude Code sees only its own.
26
+ - **Takeover staleness:** once dsh-cc writes an id into the dsh `installed_plugins.json`, later claude-side changes to that id become invisible to dsh-cc (dsh has taken over the id).
27
+ - A caller passing **only `claudeHome`** (no `dshHome`) keeps the legacy single-root behavior: that directory is both the read and the write root.
28
+
21
29
  ## Loader
22
30
 
23
31
  `mountCcPlugin(ctx, { root, nameHint?, seams? })` resolves the manifest, validates the subset, and mounts every present component as a Cordis effect. It returns `{ report, dispose }` — `report` is the per-component outcome, and `dispose` recalls every mounted component (a context teardown calls it automatically).
@@ -42,13 +50,13 @@ Each component is peer-style: the loader probes the host seam via `ctx.get(...)`
42
50
  | Component | Source | Seam (probed) | Translation |
43
51
  |---|---|---|---|
44
52
  | `commands` | manifest inline/source, or default `commands/*.md` | `commands` | registers each slash command via `register`; the handler returns the command content |
45
- | `agents` | `agents/` dir or manifest paths | `subagents` | loads `AgentDefinition`s via `loadAgentsDir` and registers each as a named provider via `registerProvider` |
53
+ | `agents` | `agents/` dir or manifest paths | `subagents` | loads `AgentDefinition`s via `loadAgentsDir` and registers each as a named provider via `registerProvider` — namespaced under the plugin name (`namespacePrefix: manifest.name`), so `provider.name` is the scoped id `plugin:agent` while `provider.definition.agentType` stays bare; the provider also exposes its `definition` for the Task tool's live enumeration. Mounting **without** a `namespacePrefix` keeps bare names — such agents are then **undiscoverable to the Task tool** (a back-compat escape hatch, not a supported dispatch mode) |
46
54
  | `skills` | `skills/` dir or manifest paths | `skills` | discovers `SKILL.md` via `discoverCcSkills`, parses frontmatter, and registers each as a runtime skill via `register` |
47
55
  | `hooks` | `hooks/hooks.json` or inline | `hooks` (guest) | injects the per-event hook map via `mergePluginHooks` |
48
56
  | `mcpServers` | inline record or `.mcp.json` | `mcp` (guest) | registers each server via `registerServer` (tool naming is the seam's responsibility) |
49
57
  | `settings` | manifest record | `settings` (guest) | filters to the allowlist (currently `agent`) and writes via `set` |
50
58
 
51
- The `hooks` and `mcp` seams have no harness-owned service today; a deployment that wants those components provides a guest seam or they are reported skipped.
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.
52
60
 
53
61
  ## Skill semantic wiring
54
62
 
@@ -61,7 +69,7 @@ On top of the skill mount, this package is the consumer that turns `skill-claude
61
69
 
62
70
  ## Known Limitations and Deferred Work
63
71
 
64
- - **Guest seams are absent in the harness** — `hooks`, `mcp`, and `settings` report `skipped` unless a deployment supplies the guest seam. There is no harness-owned `ctx.mcp` or `ctx.hooks` service today.
72
+ - **Guest seams in the harness** — `hooks`, and `settings` report `skipped` unless a deployment supplies the guest seam; there is no harness-owned `ctx.hooks` service today. The `mcp` seam is now provided by the cc-shell glue (see above), so plugin `mcpServers` mount; the tally counts register-time loads, so config-skipped servers (e.g. unset env vars) surface only via log warnings.
65
73
  - **Agent providers forward execution** — the agents provider names its backend (default `fork`) and delegates `start`; executing a CC agent requires a `fork` backend on the subagent seam at run time.
66
74
  - **Skill activation is host-driven** — the loader registers the wiring and activation descriptors; applying them at the model-facing moment is the host's responsibility.
67
75
  - **Agents ADD the default `agents/` dir to manifest paths** — Claude Code replaces the default when `agents` is declared. Unchanged here.
package/README.zh.md CHANGED
@@ -8,16 +8,24 @@
8
8
 
9
9
  ## 发现
10
10
 
11
- `discoverCcPluginRoots({ pluginDirs?, claudeHome?, cwd? })` 是 glue 的磁盘查找器:
11
+ `discoverCcPluginRoots({ pluginDirs?, claudeHome?, dshHome?, cwd? })` 是 glue 的磁盘查找器:
12
12
 
13
13
  | `pluginDirs` | 行为 |
14
14
  |---|---|
15
- | `undefined`(默认) | `enabledPlugins`(user → project → local 级联)与 `{claudeHome}/plugins/installed_plugins.json` 的交集。key 必须是精确的 `name@marketplace`。Claude home 为 `$CLAUDE_CONFIG_DIR`(否则 `~/.claude`)。 |
15
+ | `undefined`(默认) | `enabledPlugins`(claude-user → dsh-user → project → local 级联,后者按 key 覆盖)与两个 home 合并后的 `installed_plugins.json` 的交集。key 必须是精确的 `name@marketplace`。Claude home 为 `$CLAUDE_CONFIG_DIR`(否则 `~/.claude`);dsh home 为显式 `dshHome` → 显式 `claudeHome`(旧版单根)→ `$DSH_HOME`(否则 `~/.dsh`)。 |
16
16
  | `[]` 或 `null` | 空——关闭发现。 |
17
17
  | 非空 | flatten 这些目录:目录自身或其一层子目录持有 `.claude-plugin/plugin.json` 或顶层 `plugin.json`。仅有 marketplace.json 的目录不是 flatten root。 |
18
18
 
19
19
  JSON 读失败与缺失的 `installPath` 会跳过而不是抛错。项目/local `enabledPlugins` 偏向 boot cwd(host-plane 单例);`/reload-plugins` 会重读级联。
20
20
 
21
+ ### 双 home 状态(兼容读 `~/.claude`,写入 `~/.dsh`)
22
+
23
+ 插件状态是双 home 的:Claude home(`$CLAUDE_CONFIG_DIR` / `~/.claude`)保持完全**可读**以兼容 Claude Code,而 dsh home(`$DSH_HOME` / `~/.dsh`)是**写入根**。两个 home 同时携带状态时,合并按 key 进行、dsh 优先:dsh 的 `enabledPlugins` 条目遮蔽 claude 条目(dsh 级联层位于 claude-user 与 project 层之间),dsh 的 `installed_plugins.json` 条目列表——包括空列表——遮蔽该插件 id 的 claude 列表。值得知道的后果:
24
+
25
+ - 分叉是单向的:dsh-cc 能看到两个 home,真正的 Claude Code 只看得到自己的。
26
+ - **接管陈旧性:** 一旦 dsh-cc 把某个 id 写进 dsh 的 `installed_plugins.json`,之后 claude 侧对该 id 的改动对 dsh-cc 不可见(dsh 已接管该 id)。
27
+ - 只传 **`claudeHome`**(不传 `dshHome`)的调用方保持旧版单根行为:该目录既是读根也是写根。
28
+
21
29
  ## 加载器
22
30
 
23
31
  `mountCcPlugin(ctx, { root, nameHint?, seams? })` 解析清单、校验子集,并把每个存在的组件作为 Cordis effect 挂载。它返回 `{ report, dispose }`——`report` 是每个组件的加载结果,`dispose` 回收所有已挂载组件(context 卸载时自动调用)。
@@ -42,13 +50,13 @@ JSON 读失败与缺失的 `installPath` 会跳过而不是抛错。项目/local
42
50
  | 组件 | 来源 | Seam(探测) | 翻译 |
43
51
  |---|---|---|---|
44
52
  | `commands` | 清单内联/source,或默认 `commands/*.md` | `commands` | 通过 `register` 注册每个斜杠命令;handler 返回命令内容 |
45
- | `agents` | `agents/` 目录或清单路径 | `subagents` | 通过 `loadAgentsDir` 加载 `AgentDefinition`,再通过 `registerProvider` 注册为命名 provider |
53
+ | `agents` | `agents/` 目录或清单路径 | `subagents` | 通过 `loadAgentsDir` 加载 `AgentDefinition`,再通过 `registerProvider` 注册为命名 provider——以插件名做命名空间(`namespacePrefix: manifest.name`),因此 `provider.name` 是 scoped id `plugin:agent`,而 `provider.definition.agentType` 保持裸名;provider 还会暴露其 `definition`,供 Task 工具实时枚举。**不带** `namespacePrefix` 挂载则保持裸名——这些 agent 随后**对 Task 工具不可见**(一种向后兼容的逃生舱口,不是受支持的派发模式) |
46
54
  | `skills` | `skills/` 目录或清单路径 | `skills` | 通过 `discoverCcSkills` 发现 `SKILL.md`、解析 frontmatter,再通过 `register` 注册为运行时技能 |
47
55
  | `hooks` | `hooks/hooks.json` 或内联 | `hooks`(guest)| 通过 `mergePluginHooks` 注入按事件组织的 hook 映射 |
48
56
  | `mcpServers` | 内联记录或 `.mcp.json` | `mcp`(guest)| 通过 `registerServer` 注册每个 server(工具命名是 seam 的职责)|
49
57
  | `settings` | 清单记录 | `settings`(guest)| 过滤到 allowlist(当前是 `agent`)后通过 `set` 写入 |
50
58
 
51
- `hooks` 与 `mcp` seam 目前没有 harness 自有的服务;希望挂载这些组件的部署应提供 guest seam,否则它们会被报告为 `skipped`。
59
+ `hooks` 与 `mcp` seam 在本包内没有 harness 自有的服务;希望挂载这些组件的部署应提供 guest seam,否则它们会被报告为 `skipped`。dsh 的宿主接线现已提供 `mcp` seam:cc-shell glue 内置提供 `mcp` seam(`cc-shell/src/mcpSeam.ts`,即 `cc-mcp-seam` 子插件),因此在发布的部署中插件的 `mcpServers` 会真正挂载(见 docs/plans/2026-09-07-plugin-mcp-seam.md)。`hooks` 仍依赖宿主提供。
52
60
 
53
61
  ## 技能语义接线
54
62
 
@@ -61,7 +69,7 @@ JSON 读失败与缺失的 `installPath` 会跳过而不是抛错。项目/local
61
69
 
62
70
  ## 已知限制与待办工作
63
71
 
64
- - **harness 中缺少 guest seam** —— 除非部署提供 guest seam,否则 `hooks`、`mcp`、`settings` 会报告为 `skipped`。当前没有 harness 自有的 `ctx.mcp` 或 `ctx.hooks` 服务。
72
+ - **harness 中的 guest seam** —— 除非部署提供 guest seam,否则 `hooks`、`settings` 会报告为 `skipped`;当前没有 harness 自有的 `ctx.hooks` 服务。`mcp` seam 现由 cc-shell glue 提供(见上文),插件的 `mcpServers` 可挂载;tally 统计的是注册时加载,被配置跳过的 server(如未设置的 env 变量)只会通过日志 warn 呈现。
65
73
  - **agent provider 转发执行** —— agents provider 以名字命名其后端(默认 `fork`)并委托 `start`;执行 CC agent 需要 subagent seam 在运行时存在 `fork` 后端。
66
74
  - **技能激活由宿主驱动** —— 加载器注册接线与激活描述符;在模型可见的时刻应用它们由宿主负责。
67
75
  - **Agents 把默认 `agents/` 目录加到清单路径上** —— Claude Code 在声明 `agents` 时替换默认目录。此处未改。
package/lib/agents.d.ts CHANGED
@@ -38,6 +38,14 @@ export interface SubagentsSeam {
38
38
  /** Look up a provider by name, for backend resolution at `start`. */
39
39
  getProvider(name: string): unknown | undefined;
40
40
  }
41
+ /**
42
+ * Brand key stamped on every `AgentProvider` this loader creates. The task
43
+ * package's `PluginAgentIndex` requires it (besides the structural checks)
44
+ * so a foreign provider cannot be adopted as a plugin agent.
45
+ */
46
+ export declare const PLUGIN_AGENT_PROVIDER_BRAND: unique symbol;
47
+ /** Whether a value was created by this loader as a plugin agent provider. */
48
+ export declare function isPluginAgentProvider(value: unknown): boolean;
41
49
  /** The execution backend a CC agent provider forwards to. */
42
50
  export interface SubagentBackend {
43
51
  /** Start a one-shot child run against a delegation request. */
@@ -45,13 +53,18 @@ export interface SubagentBackend {
45
53
  }
46
54
  /** A thin forwarder provider: overlays an AgentDefinition and delegates. Exported for the cc-shell bundle's base-agent glue. */
47
55
  export declare class AgentProvider implements SubagentBackend {
48
- private readonly definition;
56
+ private readonly agentDefinition;
49
57
  private readonly resolve;
50
58
  private readonly resolveModel?;
59
+ private readonly registeredName?;
60
+ /** Loader brand (see `PLUGIN_AGENT_PROVIDER_BRAND`); read via `isPluginAgentProvider`. */
61
+ readonly [PLUGIN_AGENT_PROVIDER_BRAND] = true;
51
62
  private readonly backendName;
52
- constructor(definition: AgentDefinition, resolve: (name: string) => SubagentBackend | undefined, resolveModel?: ResolveModel | undefined);
63
+ constructor(agentDefinition: AgentDefinition, resolve: (name: string) => SubagentBackend | undefined, resolveModel?: ResolveModel | undefined, registeredName?: string | undefined);
53
64
  /** Register-time provider name; `start` forwards to the backend. */
54
65
  get name(): string;
66
+ /** The agent definition this provider overlays — unchanged, bare `agentType`. */
67
+ get definition(): AgentDefinition;
55
68
  /** The start-time features this agent's definition requires. */
56
69
  get capabilities(): {
57
70
  outputSchema: boolean;
@@ -85,6 +98,19 @@ export declare class AgentProvider implements SubagentBackend {
85
98
  }
86
99
  /** Agents live under this directory in a plugin root, when present. */
87
100
  export declare const STANDARD_AGENTS_DIR = "agents";
101
+ /**
102
+ * Build a scoped seam-registration name for one agent type.
103
+ *
104
+ * The prefix is sanitized (colons and whitespace stripped so it never carries
105
+ * its own separator); the result is ALWAYS `` `${prefix}:${agentType}` `` —
106
+ * there is no verbatim rule. An `agentType` that already contains a `:` is
107
+ * rejected by `mountAgents` before this function is reached, so it can never
108
+ * escape the plugin namespace.
109
+ * @param prefix - the plugin manifest-name prefix.
110
+ * @param agentType - the bare agent type.
111
+ * @returns `` `${prefix}:${agentType}` ``.
112
+ */
113
+ export declare function scopedType(prefix: string, agentType: string): string;
88
114
  /** Options for mounting one plugin's agents. */
89
115
  export interface MountAgentsOptions {
90
116
  /** The plugin root directory; standard `agents/` resolves against it. */
@@ -1 +1 @@
1
- {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAEjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAE3C;;;;;;;GAOG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK;IACxD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACtC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACnC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC9C,GAAG,SAAS,CAAA;AAEb,4EAA4E;AAC5E,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,IAAI,CAAA;IAC/C,qEAAqE;IACrE,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAA;CAC/C;AAED,6DAA6D;AAC7D,MAAM,WAAW,eAAe;IAC9B,+DAA+D;IAC/D,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CAC1C;AAED,gIAAgI;AAChI,qBAAa,aAAc,YAAW,eAAe;IAIjD,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;IALhC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAGlB,UAAU,EAAE,eAAe,EAC3B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,eAAe,GAAG,SAAS,EACtD,YAAY,CAAC,EAAE,YAAY,YAAA;IAG9C,oEAAoE;IACpE,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,gEAAgE;IAChE,IAAI,YAAY,IAAI;QAAE,YAAY,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAOxG;IAED,iEAAiE;IACjE,IAAI,qBAAqB,IAAI,OAAO,CAEnC;IAED;;;;;;OAMG;IACG,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAiB/C;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,oBAAoB;CAS7B;AAED,uEAAuE;AACvE,eAAO,MAAM,mBAAmB,WAAW,CAAA;AAE3C,gDAAgD;AAChD,MAAM,WAAW,kBAAkB;IACjC,yEAAyE;IACzE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,uEAAuE;IACvE,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAA;IACnC,8DAA8D;IAC9D,QAAQ,CAAC,SAAS,EAAE,aAAa,GAAG,SAAS,CAAA;IAC7C,uEAAuE;IACvE,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;IACjC,uEAAuE;IACvE,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAAA;CACrC;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;IAAC,KAAK,EAAE,cAAc,CAAA;CAAE,CAAC,CAmB5H"}
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"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"}
package/lib/agents.js CHANGED
@@ -15,28 +15,47 @@ import { join, resolve } from 'node:path';
15
15
  import { loadAgentsDir } from '@dsh-cc/claude-code-agents';
16
16
  import { toAgentOptions } from '@dsh-cc/model-aliases';
17
17
  import { ComponentTally } from "./seams.js";
18
+ /**
19
+ * Brand key stamped on every `AgentProvider` this loader creates. The task
20
+ * package's `PluginAgentIndex` requires it (besides the structural checks)
21
+ * so a foreign provider cannot be adopted as a plugin agent.
22
+ */
23
+ export const PLUGIN_AGENT_PROVIDER_BRAND = Symbol.for('dsh-cc.plugin-agent-provider');
24
+ /** Whether a value was created by this loader as a plugin agent provider. */
25
+ export function isPluginAgentProvider(value) {
26
+ return typeof value === 'object' && value !== null
27
+ && value[PLUGIN_AGENT_PROVIDER_BRAND] === true;
28
+ }
18
29
  /** A thin forwarder provider: overlays an AgentDefinition and delegates. Exported for the cc-shell bundle's base-agent glue. */
19
30
  export class AgentProvider {
20
- definition;
31
+ agentDefinition;
21
32
  resolve;
22
33
  resolveModel;
34
+ registeredName;
35
+ /** Loader brand (see `PLUGIN_AGENT_PROVIDER_BRAND`); read via `isPluginAgentProvider`. */
36
+ [PLUGIN_AGENT_PROVIDER_BRAND] = true;
23
37
  backendName = 'fork';
24
- constructor(definition, resolve, resolveModel) {
25
- this.definition = definition;
38
+ constructor(agentDefinition, resolve, resolveModel, registeredName) {
39
+ this.agentDefinition = agentDefinition;
26
40
  this.resolve = resolve;
27
41
  this.resolveModel = resolveModel;
42
+ this.registeredName = registeredName;
28
43
  }
29
44
  /** Register-time provider name; `start` forwards to the backend. */
30
45
  get name() {
31
- return this.definition.agentType;
46
+ return this.registeredName ?? this.agentDefinition.agentType;
47
+ }
48
+ /** The agent definition this provider overlays — unchanged, bare `agentType`. */
49
+ get definition() {
50
+ return this.agentDefinition;
32
51
  }
33
52
  /** The start-time features this agent's definition requires. */
34
53
  get capabilities() {
35
54
  return {
36
55
  outputSchema: false,
37
56
  depthLimit: false,
38
- toolFilter: this.definition.toolRestriction !== undefined,
39
- persona: this.definition.permissionMode !== undefined || this.definition.isolation !== undefined,
57
+ toolFilter: this.agentDefinition.toolRestriction !== undefined,
58
+ persona: this.agentDefinition.permissionMode !== undefined || this.agentDefinition.isolation !== undefined,
40
59
  };
41
60
  }
42
61
  /** Whether the child sees the parent's completed-turn prefix. */
@@ -53,17 +72,17 @@ export class AgentProvider {
53
72
  async start(request) {
54
73
  const backend = this.resolve(this.backendName);
55
74
  if (backend === undefined) {
56
- throw new Error(`cc-plugin-loader: no "${this.backendName}" subagent backend is registered to run agent "${this.definition.agentType}"`);
75
+ throw new Error(`cc-plugin-loader: no "${this.backendName}" subagent backend is registered to run agent "${this.agentDefinition.agentType}"`);
57
76
  }
58
77
  const delegation = request;
59
78
  const modelOverride = this.resolveModelOverride();
60
79
  return backend.start({
61
80
  ...delegation,
62
- prompt: this.definition.systemPrompt,
81
+ prompt: this.agentDefinition.systemPrompt,
63
82
  ...modelOverride !== undefined
64
83
  ? { agentOptions: { ...delegation['agentOptions'], ...modelOverride } }
65
84
  : {},
66
- ...this.definition.toolRestriction !== undefined ? { toolFilter: this.definition.toolRestriction } : {},
85
+ ...this.agentDefinition.toolRestriction !== undefined ? { toolFilter: this.agentDefinition.toolRestriction } : {},
67
86
  });
68
87
  }
69
88
  /**
@@ -79,7 +98,7 @@ export class AgentProvider {
79
98
  * @returns the model/provider override, or `undefined` for no override.
80
99
  */
81
100
  resolveModelOverride() {
82
- const model = this.definition.model;
101
+ const model = this.agentDefinition.model;
83
102
  const resolver = this.resolveModel;
84
103
  if (resolver === undefined) {
85
104
  return model !== undefined ? { model } : undefined;
@@ -91,6 +110,22 @@ export class AgentProvider {
91
110
  }
92
111
  /** Agents live under this directory in a plugin root, when present. */
93
112
  export const STANDARD_AGENTS_DIR = 'agents';
113
+ /**
114
+ * Build a scoped seam-registration name for one agent type.
115
+ *
116
+ * The prefix is sanitized (colons and whitespace stripped so it never carries
117
+ * its own separator); the result is ALWAYS `` `${prefix}:${agentType}` `` —
118
+ * there is no verbatim rule. An `agentType` that already contains a `:` is
119
+ * rejected by `mountAgents` before this function is reached, so it can never
120
+ * escape the plugin namespace.
121
+ * @param prefix - the plugin manifest-name prefix.
122
+ * @param agentType - the bare agent type.
123
+ * @returns `` `${prefix}:${agentType}` ``.
124
+ */
125
+ export function scopedType(prefix, agentType) {
126
+ const clean = prefix.replace(/[:\s]/g, '');
127
+ return `${clean}:${agentType}`;
128
+ }
94
129
  /**
95
130
  * Load and register a plugin's sub-agent definitions.
96
131
  * @param options - plugin root, manifest, and the subagent seam.
@@ -109,10 +144,35 @@ export async function mountAgents(options) {
109
144
  return { disposers, tally };
110
145
  }
111
146
  const subagents = options.subagents;
112
- for (const definition of definitions) {
113
- const provider = new AgentProvider(definition, name => subagents.getProvider(name), options.resolveModel);
114
- disposers.push(subagents.registerProvider(provider));
115
- tally.addLoaded();
147
+ const prefix = options.namespacePrefix;
148
+ try {
149
+ for (const definition of definitions) {
150
+ // Colon guard (mirrors the file-registry guard in discovery): a colon
151
+ // agentType would escape the plugin's scoped-id namespace, so it is
152
+ // warned and skipped — never registered verbatim.
153
+ if (definition.agentType.includes(':')) {
154
+ console.warn(`cc-plugin-loader: skipping agent "${definition.agentType}" from ${options.pluginRoot}: agent file names must be bare (a colon agent type would shadow plugin scoped ids)`);
155
+ tally.addSkipped(`skipped agent "${definition.agentType}": agent type contains ":" and would escape the plugin namespace`);
156
+ continue;
157
+ }
158
+ const scopedName = prefix !== undefined ? scopedType(prefix, definition.agentType) : definition.agentType;
159
+ // Duplicate preflight: the harness seam throws on duplicate names, so
160
+ // record the collision and skip rather than leaking a partial mount.
161
+ if (subagents.getProvider(scopedName) !== undefined) {
162
+ tally.addSkipped(`skipped agent "${definition.agentType}": duplicate provider name "${scopedName}" is already registered`);
163
+ continue;
164
+ }
165
+ const provider = new AgentProvider(definition, name => subagents.getProvider(name), options.resolveModel, ...prefix !== undefined ? [scopedName] : []);
166
+ disposers.push(subagents.registerProvider(provider));
167
+ tally.addLoaded();
168
+ }
169
+ }
170
+ catch (error) {
171
+ // Transactional: dispose every provider THIS call already registered
172
+ // before propagating, so a mid-mount throw leaks no partial mount.
173
+ for (const dispose of disposers)
174
+ dispose();
175
+ throw error;
116
176
  }
117
177
  return { disposers, tally };
118
178
  }
package/lib/agents.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"agents.js","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"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"}
@@ -24,8 +24,14 @@ export interface DiscoverCcPluginRootsOptions {
24
24
  * `[]` or `null` disables discovery; a non-empty list flattens those dirs.
25
25
  */
26
26
  readonly pluginDirs?: readonly string[] | null;
27
- /** Claude config home; defaults to `$CLAUDE_CONFIG_DIR` or `~/.claude`. */
27
+ /** Claude config home; defaults to `$CLAUDE_CONFIG_DIR` or `~/.claude`. Passing only this keeps legacy single-root behavior. */
28
28
  readonly claudeHome?: string;
29
+ /**
30
+ * dsh write home (plan §3.1). Resolution chain: explicit `dshHome` →
31
+ * explicit `claudeHome` (legacy single-root) → `resolveDshHome()`
32
+ * (`$DSH_HOME` → `~/.dsh`). State merges per key with dsh winning.
33
+ */
34
+ readonly dshHome?: string;
29
35
  /** Workspace used for project/local `enabledPlugins`; defaults to `process.cwd()`. */
30
36
  readonly cwd?: string;
31
37
  /** Optional logger for project-scope cwd and skipped bare enablement keys. */
@@ -44,6 +50,8 @@ export declare const TOP_LEVEL_MANIFEST = "plugin.json";
44
50
  * @returns unique `{ root, nameHint }` entries, in discovery order.
45
51
  */
46
52
  export declare function discoverCcPluginRoots(options?: DiscoverCcPluginRootsOptions): DiscoveredCcPlugin[];
53
+ /** True when both homes point at the same directory: realpath when both exist, resolve-only fallback (§3.1). */
54
+ export declare function sameHome(a: string, b: string): boolean;
47
55
  /** `$CLAUDE_CONFIG_DIR` if set, otherwise `~/.claude`. */
48
56
  export declare function resolveClaudeHome(explicit?: string): string;
49
57
  //# sourceMappingURL=discovery.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,mFAAmF;AACnF,MAAM,WAAW,kBAAkB;IACjC,iFAAiF;IACjF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAC1B;AAED,sCAAsC;AACtC,MAAM,WAAW,4BAA4B;IAC3C;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;IAC9C,2EAA2E;IAC3E,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,sFAAsF;IACtF,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,8EAA8E;IAC9E,QAAQ,CAAC,GAAG,CAAC,EAAE;QAAE,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;CAC5E;AAED,kFAAkF;AAClF,eAAO,MAAM,eAAe,QAAwC,CAAA;AAEpE,yDAAyD;AACzD,eAAO,MAAM,kBAAkB,gBAAgB,CAAA;AAE/C;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,4BAAiC,GAAG,kBAAkB,EAAE,CAQtG;AAOD,0DAA0D;AAC1D,wBAAgB,iBAAiB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAK3D"}
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAQH,mFAAmF;AACnF,MAAM,WAAW,kBAAkB;IACjC,iFAAiF;IACjF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAC1B;AAED,sCAAsC;AACtC,MAAM,WAAW,4BAA4B;IAC3C;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;IAC9C,gIAAgI;IAChI,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,sFAAsF;IACtF,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,8EAA8E;IAC9E,QAAQ,CAAC,GAAG,CAAC,EAAE;QAAE,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;CAC5E;AAED,kFAAkF;AAClF,eAAO,MAAM,eAAe,QAAwC,CAAA;AAEpE,yDAAyD;AACzD,eAAO,MAAM,kBAAkB,gBAAgB,CAAA;AAE/C;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,4BAAiC,GAAG,kBAAkB,EAAE,CAQtG;AAED,gHAAgH;AAChH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAOtD;AAOD,0DAA0D;AAC1D,wBAAgB,iBAAiB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAK3D"}
package/lib/discovery.js CHANGED
@@ -10,9 +10,10 @@
10
10
  *
11
11
  * @module
12
12
  */
13
- import { readdirSync, readFileSync, statSync } from 'node:fs';
13
+ import { existsSync, readdirSync, readFileSync, realpathSync, statSync } from 'node:fs';
14
14
  import { homedir } from 'node:os';
15
15
  import { basename, join, resolve } from 'node:path';
16
+ import { resolveDshHome } from '@deepseek-ai/dsh-home-paths';
16
17
  import { resolveLocalSettingsDir } from '@dsh-cc/settings-cascade/local-root';
17
18
  /** Nested Claude Code manifest path, preferred over a top-level `plugin.json`. */
18
19
  export const NESTED_MANIFEST = join('.claude-plugin', 'plugin.json');
@@ -28,7 +29,22 @@ export function discoverCcPluginRoots(options = {}) {
28
29
  return [];
29
30
  if (options.pluginDirs !== undefined)
30
31
  return flattenPluginDirs(options.pluginDirs);
31
- return discoverInstalledEnabled(resolveClaudeHome(options.claudeHome), options.cwd ?? process.cwd(), options.log);
32
+ const claudeHome = resolveClaudeHome(options.claudeHome);
33
+ // Option-level resolution (plan §3.1): explicit dsh → explicit claude
34
+ // (legacy single-root) → resolveDshHome() ($DSH_HOME → ~/.dsh).
35
+ const dshHome = options.dshHome ?? options.claudeHome ?? resolveDshHome();
36
+ return discoverInstalledEnabled(claudeHome, dshHome, options.cwd ?? process.cwd(), options.log);
37
+ }
38
+ /** True when both homes point at the same directory: realpath when both exist, resolve-only fallback (§3.1). */
39
+ export function sameHome(a, b) {
40
+ if (resolve(a) === resolve(b))
41
+ return true;
42
+ try {
43
+ return existsSync(a) && existsSync(b) && realpathSync.native(a) === realpathSync.native(b);
44
+ }
45
+ catch {
46
+ return false;
47
+ }
32
48
  }
33
49
  /** True when an explicit `pluginDirs` list is present and empty. */
34
50
  function isEmptyList(value) {
@@ -85,10 +101,15 @@ function nameHintFromRoot(dir) {
85
101
  }
86
102
  return undefined;
87
103
  }
88
- /** Default path: enabledPlugins cascade ∩ installed_plugins.json. */
89
- function discoverInstalledEnabled(claudeHome, cwd, log) {
90
- const enabled = enabledKeys(claudeHome, cwd, log);
91
- const installed = readInstalled(join(claudeHome, 'plugins', 'installed_plugins.json'));
104
+ /**
105
+ * Default path: enabledPlugins cascade ∩ merged installed_plugins.json
106
+ * (plan §3.3/§3.4). Single-root (homes canonicalize equal) reads each file
107
+ * exactly once — byte-identical to the historical behavior.
108
+ */
109
+ function discoverInstalledEnabled(claudeHome, dshHome, cwd, log) {
110
+ const singleRoot = sameHome(claudeHome, dshHome);
111
+ const enabled = enabledKeys(claudeHome, dshHome, cwd, log);
112
+ const installed = readMergedInstalled(claudeHome, dshHome, singleRoot);
92
113
  const found = [];
93
114
  const seen = new Set();
94
115
  for (const key of enabled) {
@@ -99,10 +120,37 @@ function discoverInstalledEnabled(claudeHome, cwd, log) {
99
120
  }
100
121
  return found;
101
122
  }
123
+ /**
124
+ * Merged installed paths (§3.4): per id, a dsh entry list — including an
125
+ * empty one — shadows the claude list; ids only in claude pass through.
126
+ */
127
+ function readMergedInstalled(claudeHome, dshHome, singleRoot) {
128
+ const dsh = readInstalledPaths(join(dshHome, 'plugins', 'installed_plugins.json'));
129
+ if (singleRoot)
130
+ return compact(dsh);
131
+ const merged = {
132
+ ...readInstalledPaths(join(claudeHome, 'plugins', 'installed_plugins.json')),
133
+ ...dsh,
134
+ };
135
+ return compact(merged);
136
+ }
137
+ /** Drop keys whose picked installPath is undefined (empty/shadowed entry lists). */
138
+ function compact(map) {
139
+ const out = {};
140
+ for (const [key, path] of Object.entries(map)) {
141
+ if (path !== undefined)
142
+ out[key] = path;
143
+ }
144
+ return out;
145
+ }
102
146
  /** Keys whose cascaded `enabledPlugins` value is JSON `true`, in first-seen order. */
103
- function enabledKeys(claudeHome, cwd, log) {
147
+ function enabledKeys(claudeHome, dshHome, cwd, log) {
148
+ // Cascade (plan §3.3): [claude-user, dsh-user, project, local] with later
149
+ // files overriding per key — equivalent to the doc's
150
+ // local → project → dsh-user → claude-user first-defined-wins order.
104
151
  const cascade = [
105
152
  { path: join(claudeHome, 'settings.json'), scope: 'user' },
153
+ ...(sameHome(claudeHome, dshHome) ? [] : [{ path: join(dshHome, 'settings.json'), scope: 'user' }]),
106
154
  { path: join(cwd, '.claude', 'settings.json'), scope: 'project' },
107
155
  {
108
156
  // Claude Code-parity: the *local* settings file is read from the git
@@ -146,8 +194,12 @@ function enabledKeys(claudeHome, cwd, log) {
146
194
  }
147
195
  return enabled;
148
196
  }
149
- /** Winning `installPath` per `name@marketplace` (latest lastUpdated, then later array element). */
150
- function readInstalled(path) {
197
+ /**
198
+ * Winning `installPath` per `name@marketplace` (latest lastUpdated, then later
199
+ * array element). An id with an empty/invalid entry list maps to `undefined`
200
+ * so the dsh layer can shadow it (§3.4); callers compact the merged map.
201
+ */
202
+ function readInstalledPaths(path) {
151
203
  const parsed = readJson(path);
152
204
  if (!isRecord(parsed))
153
205
  return {};
@@ -158,9 +210,7 @@ function readInstalled(path) {
158
210
  for (const [key, raw] of Object.entries(plugins)) {
159
211
  if (!Array.isArray(raw))
160
212
  continue;
161
- const picked = pickInstallPath(raw);
162
- if (picked !== undefined)
163
- out[key] = picked;
213
+ out[key] = pickInstallPath(raw);
164
214
  }
165
215
  return out;
166
216
  }
@@ -1 +1 @@
1
- {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
package/lib/hooks.d.ts CHANGED
@@ -17,9 +17,11 @@ export interface HooksSeam {
17
17
  * Merge a plugin's hooks into the bridge.
18
18
  * @param pluginName - the plugin that owns the hooks.
19
19
  * @param config - the per-event hook map (`ClaudeCodeHookConfig` shape).
20
+ * @param pluginRoot - the plugin's root dir, used to substitute
21
+ * `${CLAUDE_PLUGIN_ROOT}` in command strings.
20
22
  * @returns the exact disposer that removes the injected hooks.
21
23
  */
22
- mergePluginHooks(pluginName: string, config: unknown): () => void;
24
+ mergePluginHooks(pluginName: string, config: unknown, pluginRoot?: string): () => void;
23
25
  }
24
26
  /** Hooks live under this file in a plugin root, when present. */
25
27
  export declare const STANDARD_HOOKS_FILE = "hooks/hooks.json";
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAE3C,qEAAqE;AACrE,MAAM,WAAW,SAAS;IACxB;;;;;OAKG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,CAAA;CAClE;AAED,iEAAiE;AACjE,eAAO,MAAM,mBAAmB,qBAAqB,CAAA;AAErD,+CAA+C;AAC/C,MAAM,WAAW,iBAAiB;IAChC,8EAA8E;IAC9E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,yEAAyE;IACzE,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAA;IACnC,0DAA0D;IAC1D,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,CAAA;CACtC;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG;IAAE,SAAS,EAAE,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;IAAC,KAAK,EAAE,cAAc,CAAA;CAAE,CAmB3G"}
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAE3C,qEAAqE;AACrE,MAAM,WAAW,SAAS;IACxB;;;;;;;OAOG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,IAAI,CAAA;CACvF;AAED,iEAAiE;AACjE,eAAO,MAAM,mBAAmB,qBAAqB,CAAA;AAErD,+CAA+C;AAC/C,MAAM,WAAW,iBAAiB;IAChC,8EAA8E;IAC9E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,yEAAyE;IACzE,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAA;IACnC,0DAA0D;IAC1D,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,CAAA;CACtC;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG;IAAE,SAAS,EAAE,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;IAAC,KAAK,EAAE,cAAc,CAAA;CAAE,CAmB3G"}
package/lib/hooks.js CHANGED
@@ -35,7 +35,7 @@ export function mountHooks(options) {
35
35
  tally.addSkipped('plugin declares no hooks');
36
36
  return { disposers, tally };
37
37
  }
38
- disposers.push(options.hooks.mergePluginHooks(options.manifest.name, hooks.value));
38
+ disposers.push(options.hooks.mergePluginHooks(options.manifest.name, hooks.value, options.pluginRoot));
39
39
  tally.addLoaded();
40
40
  return { disposers, tally };
41
41
  }
package/lib/hooks.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts CHANGED
@@ -26,7 +26,7 @@ export type { CcPluginCommandInfo, MountedPluginCommand } from './commands.ts';
26
26
  export { parsePluginManifest } from './manifest.ts';
27
27
  export { discoverCcPluginRoots, resolveClaudeHome, NESTED_MANIFEST, TOP_LEVEL_MANIFEST } from './discovery.ts';
28
28
  export type { DiscoveredCcPlugin, DiscoverCcPluginRootsOptions } from './discovery.ts';
29
- export { AgentProvider, STANDARD_AGENTS_DIR } from './agents.ts';
29
+ export { AgentProvider, STANDARD_AGENTS_DIR, PLUGIN_AGENT_PROVIDER_BRAND, isPluginAgentProvider } from './agents.ts';
30
30
  export type { ResolveModel } from './agents.ts';
31
31
  export type { McpSeam, HooksSeam } from './seams.ts';
32
32
  export { skillToolRestriction, resolveSkillExecution, forbidsInlineShell, activationFor, registerSkillPathActivator, applySkillRestriction, PROVIDER, type AgentScope, type SkillExecution, type SkillActivation, } from './skill-semantics.ts';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAGlD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,KAAK,EAAmB,gBAAgB,EAAE,MAAM,YAAY,CAAA;AACnE,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,aAAa,CAAA;AAC1D,OAAO,EAAe,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;AAChF,OAAO,EAAiB,KAAK,oBAAoB,EAAE,MAAM,eAAe,CAAA;AAMxE,YAAY,EAAE,gBAAgB,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AACpJ,YAAY,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AAC9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAC9G,YAAY,EAAE,kBAAkB,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAA;AACtF,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAChE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACpD,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,aAAa,EACb,0BAA0B,EAC1B,qBAAqB,EACrB,QAAQ,EACR,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,eAAe,GACrB,MAAM,sBAAsB,CAAA;AAE7B,0EAA0E;AAC1E,eAAO,MAAM,aAAa,gBAAgB,CAAA;AAE1C,kDAAkD;AAClD,MAAM,WAAW,YAAY;IAC3B,2BAA2B;IAC3B,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,CAAA;IAC/B,8BAA8B;IAC9B,SAAS,CAAC,EAAE,aAAa,GAAG,SAAS,CAAA;IACrC,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,YAAY,GAAG,SAAS,CAAA;IACnC,qBAAqB;IACrB,QAAQ,CAAC,EAAE,YAAY,GAAG,SAAS,CAAA;IACnC,8DAA8D;IAC9D,KAAK,CAAC,EAAE,SAAS,GAAG,SAAS,CAAA;IAC7B,4DAA4D;IAC5D,GAAG,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CAC1B;AAED,mDAAmD;AACnD,MAAM,WAAW,oBAAoB;IACnC,0EAA0E;IAC1E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,gFAAgF;IAChF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,8EAA8E;IAC9E,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY,CAAA;IAC7B,4EAA4E;IAC5E,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAAA;CACrC;AAED,kFAAkF;AAClF,MAAM,WAAW,aAAa;IAC5B,kCAAkC;IAClC,MAAM,EAAE,gBAAgB,CAAA;IACxB,8EAA8E;IAC9E,QAAQ,EAAE,oBAAoB,EAAE,CAAA;IAChC;;;OAGG;IACH,OAAO,IAAI,IAAI,CAAA;CAChB;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,aAAa,CAAC,CAwCvG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/lib/index.js CHANGED
@@ -23,7 +23,7 @@ import { mountSettings } from "./settings.js";
23
23
  import { resolvePluginManifest } from "./resolve-manifest.js";
24
24
  export { parsePluginManifest } from "./manifest.js";
25
25
  export { discoverCcPluginRoots, resolveClaudeHome, NESTED_MANIFEST, TOP_LEVEL_MANIFEST } from "./discovery.js";
26
- export { AgentProvider, STANDARD_AGENTS_DIR } from "./agents.js";
26
+ export { AgentProvider, STANDARD_AGENTS_DIR, PLUGIN_AGENT_PROVIDER_BRAND, isPluginAgentProvider } from "./agents.js";
27
27
  export { skillToolRestriction, resolveSkillExecution, forbidsInlineShell, activationFor, registerSkillPathActivator, applySkillRestriction, PROVIDER, } from "./skill-semantics.js";
28
28
  /** The plugin.json file name at a plugin root (legacy / fixture path). */
29
29
  export const MANIFEST_FILE = 'plugin.json';
@@ -43,25 +43,40 @@ export async function mountCcPlugin(ctx, options) {
43
43
  const probed = await probeSeams(ctx, options.seams);
44
44
  const disposers = [];
45
45
  const components = [];
46
- fold(components, disposers, await mountSkills({
47
- ctx,
48
- pluginRoot: root,
49
- manifest,
50
- skills: probed.skills,
51
- subagentsPresent: probed.subagents !== undefined,
52
- }));
53
- fold(components, disposers, await mountAgents({
54
- pluginRoot: root,
55
- manifest,
56
- subagents: probed.subagents,
57
- ...options.resolveModel !== undefined ? { resolveModel: options.resolveModel } : {},
58
- }));
59
- const commandMount = mountCommands({ pluginRoot: root, manifest, commands: probed.commands });
60
- components.push(commandMount.tally.result());
61
- disposers.push(...commandMount.disposers);
62
- fold(components, disposers, mountHooks({ pluginRoot: root, manifest, hooks: probed.hooks }));
63
- fold(components, disposers, mountMcpServers({ pluginRoot: root, manifest, mcp: probed.mcp }));
64
- fold(components, disposers, mountSettings({ manifest, settings: probed.settings }));
46
+ let commandMount;
47
+ try {
48
+ fold(components, disposers, await mountSkills({
49
+ ctx,
50
+ pluginRoot: root,
51
+ manifest,
52
+ skills: probed.skills,
53
+ subagentsPresent: probed.subagents !== undefined,
54
+ }));
55
+ fold(components, disposers, await mountAgents({
56
+ pluginRoot: root,
57
+ manifest,
58
+ subagents: probed.subagents,
59
+ ...options.resolveModel !== undefined ? { resolveModel: options.resolveModel } : {},
60
+ // Same name-resolution chain as the manifest itself: manifest name (the
61
+ // parse/synthesis in resolve-manifest already falls back to nameHint,
62
+ // then the root basename), used to namespace agent provider names.
63
+ namespacePrefix: manifest.name,
64
+ }));
65
+ commandMount = mountCommands({ pluginRoot: root, manifest, commands: probed.commands });
66
+ components.push(commandMount.tally.result());
67
+ disposers.push(...commandMount.disposers);
68
+ fold(components, disposers, mountHooks({ pluginRoot: root, manifest, hooks: probed.hooks }));
69
+ fold(components, disposers, mountMcpServers({ pluginRoot: root, manifest, mcp: probed.mcp }));
70
+ fold(components, disposers, mountSettings({ manifest, settings: probed.settings }));
71
+ }
72
+ catch (error) {
73
+ // Component-level rollback: a component mount that throws after earlier
74
+ // components succeeded recalls everything mounted so far, so a failed
75
+ // plugin load leaves nothing mounted.
76
+ for (const dispose of disposers)
77
+ dispose();
78
+ throw error;
79
+ }
65
80
  const tearDown = () => {
66
81
  for (const dispose of disposers)
67
82
  dispose();
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/lib/seams.d.ts CHANGED
@@ -29,9 +29,11 @@ export interface HooksSeam {
29
29
  * canonical `ClaudeCodeHookConfig` shape the bridge consumes.
30
30
  * @param pluginName - the plugin owning the hooks, for namespacing.
31
31
  * @param config - the parsed per-event `MatcherGroup[]` map.
32
+ * @param pluginRoot - the plugin's root dir, used to substitute
33
+ * `${CLAUDE_PLUGIN_ROOT}` in command strings.
32
34
  * @returns the exact disposer that removes the injected hooks.
33
35
  */
34
- mergePluginHooks(pluginName: string, config: unknown): () => void;
36
+ mergePluginHooks(pluginName: string, config: unknown, pluginRoot?: string): () => void;
35
37
  }
36
38
  /** Probe a guest seam by key, returning `undefined` when the host lacks it. */
37
39
  export declare function probe<X>(value: X | undefined): X | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"seams.d.ts","sourceRoot":"","sources":["../src/seams.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEhE,uEAAuE;AACvE,MAAM,WAAW,OAAO;IACtB;;;;;;OAMG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,CAAA;CAC1E;AAED,gEAAgE;AAChE,MAAM,WAAW,SAAS;IACxB;;;;;;OAMG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,CAAA;CAClE;AAED,+EAA+E;AAC/E,wBAAgB,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,SAAS,GAAG,CAAC,GAAG,SAAS,CAE5D;AAED,8EAA8E;AAC9E,qBAAa,cAAc;IAUb,OAAO,CAAC,QAAQ,CAAC,IAAI;IATjC,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,OAAO,CAAI;IACnB,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IAEvC;;;OAGG;gBAC0B,IAAI,EAAE,aAAa;IAEhD,uCAAuC;IACvC,SAAS,IAAI,IAAI;IAIjB,wDAAwD;IACxD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAKhC,uDAAuD;IACvD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK/B,4CAA4C;IAC5C,MAAM,IAAI,eAAe;CAS1B"}
1
+ {"version":3,"file":"seams.d.ts","sourceRoot":"","sources":["../src/seams.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEhE,uEAAuE;AACvE,MAAM,WAAW,OAAO;IACtB;;;;;;OAMG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,CAAA;CAC1E;AAED,gEAAgE;AAChE,MAAM,WAAW,SAAS;IACxB;;;;;;;;OAQG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,IAAI,CAAA;CACvF;AAED,+EAA+E;AAC/E,wBAAgB,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,SAAS,GAAG,CAAC,GAAG,SAAS,CAE5D;AAED,8EAA8E;AAC9E,qBAAa,cAAc;IAUb,OAAO,CAAC,QAAQ,CAAC,IAAI;IATjC,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,OAAO,CAAI;IACnB,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IAEvC;;;OAGG;gBAC0B,IAAI,EAAE,aAAa;IAEhD,uCAAuC;IACvC,SAAS,IAAI,IAAI;IAIjB,wDAAwD;IACxD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAKhC,uDAAuD;IACvD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK/B,4CAA4C;IAC5C,MAAM,IAAI,eAAe;CAS1B"}
package/lib/seams.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"seams.js","sourceRoot":"","sources":["../src/seams.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA4BH,+EAA+E;AAC/E,MAAM,UAAU,KAAK,CAAI,KAAoB;IAC3C,OAAO,KAAK,CAAA;AACd,CAAC;AAED,8EAA8E;AAC9E,MAAM,OAAO,cAAc;IAUI;IATrB,MAAM,GAAG,CAAC,CAAA;IACV,OAAO,GAAG,CAAC,CAAA;IACX,MAAM,GAAG,CAAC,CAAA;IACD,OAAO,GAAa,EAAE,CAAA;IAEvC;;;OAGG;IACH,YAA6B,IAAmB;QAAnB,SAAI,GAAJ,IAAI,CAAe;IAAG,CAAC;IAEpD,uCAAuC;IACvC,SAAS;QACP,IAAI,CAAC,MAAM,IAAI,CAAC,CAAA;IAClB,CAAC;IAED,wDAAwD;IACxD,UAAU,CAAC,MAAc;QACvB,IAAI,CAAC,OAAO,IAAI,CAAC,CAAA;QACjB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC3B,CAAC;IAED,uDAAuD;IACvD,SAAS,CAAC,MAAc;QACtB,IAAI,CAAC,MAAM,IAAI,CAAC,CAAA;QAChB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC3B,CAAC;IAED,4CAA4C;IAC5C,MAAM;QACJ,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAA;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"seams.js","sourceRoot":"","sources":["../src/seams.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA8BH,+EAA+E;AAC/E,MAAM,UAAU,KAAK,CAAI,KAAoB;IAC3C,OAAO,KAAK,CAAA;AACd,CAAC;AAED,8EAA8E;AAC9E,MAAM,OAAO,cAAc;IAUI;IATrB,MAAM,GAAG,CAAC,CAAA;IACV,OAAO,GAAG,CAAC,CAAA;IACX,MAAM,GAAG,CAAC,CAAA;IACD,OAAO,GAAa,EAAE,CAAA;IAEvC;;;OAGG;IACH,YAA6B,IAAmB;QAAnB,SAAI,GAAJ,IAAI,CAAe;IAAG,CAAC;IAEpD,uCAAuC;IACvC,SAAS;QACP,IAAI,CAAC,MAAM,IAAI,CAAC,CAAA;IAClB,CAAC;IAED,wDAAwD;IACxD,UAAU,CAAC,MAAc;QACvB,IAAI,CAAC,OAAO,IAAI,CAAC,CAAA;QACjB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC3B,CAAC;IAED,uDAAuD;IACvD,SAAS,CAAC,MAAc;QACtB,IAAI,CAAC,MAAM,IAAI,CAAC,CAAA;QAChB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC3B,CAAC;IAED,4CAA4C;IAC5C,MAAM;QACJ,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAA;IACH,CAAC;CACF"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@dsh-cc/plugin-loader",
3
3
  "description": "Load Claude Code plugin.json manifests as in-memory dsh plugin mounts",
4
- "version": "0.5.0",
4
+ "version": "0.6.0",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/dsh-cc/dsh-cc.git",
@@ -23,26 +23,9 @@
23
23
  },
24
24
  "./package.json": "./package.json"
25
25
  },
26
- "files": [
27
- "lib"
28
- ],
29
- "license": "Apache-2.0",
30
26
  "dependencies": {
31
- "@dsh-cc/model-aliases": "^0.5.0",
32
- "@dsh-cc/settings-cascade": "^0.5.0"
33
- },
34
- "peerDependencies": {
35
- "@deepseek-ai/dsh-commands": ">=0.1.1-rc.2",
36
- "@deepseek-ai/dsh-llm": ">=0.1.1-rc.2",
37
- "@deepseek-ai/dsh-settings": ">=0.1.1-rc.2",
38
- "@deepseek-ai/dsh-skill": ">=0.1.1-rc.2",
39
- "@deepseek-ai/dsh-subagent": ">=0.1.1-rc.2",
40
- "@deepseek-ai/cordis": ">=0.1.1-rc.2",
41
- "@dsh-cc/claude-code-agents": "^0.5.0",
42
- "@dsh-cc/hook-protocol": "^0.5.0",
43
- "@dsh-cc/mcp-client": "^0.5.0",
44
- "@dsh-cc/skill-loader": "^0.5.0",
45
- "@dsh-cc/tools": "^0.5.0"
27
+ "@dsh-cc/model-aliases": "^0.6.0",
28
+ "@dsh-cc/settings-cascade": "^0.6.0"
46
29
  },
47
30
  "devDependencies": {
48
31
  "@deepseek-ai/dsh-commands": "link:../../../../deepseek-harness/packages/interaction/commands",
@@ -51,13 +34,32 @@
51
34
  "@deepseek-ai/dsh-skill": "link:../../../../deepseek-harness/packages/skill/skill",
52
35
  "@deepseek-ai/dsh-subagent": "link:../../../../deepseek-harness/packages/subagent/subagent",
53
36
  "@deepseek-ai/cordis": "link:../../../../deepseek-harness/vendor/cordis",
54
- "@dsh-cc/mcp-client": "^0.5.0",
55
- "@dsh-cc/hook-protocol": "^0.5.0",
56
- "@dsh-cc/claude-code-agents": "^0.5.0",
57
- "@dsh-cc/skill-loader": "^0.5.0",
58
- "@dsh-cc/model-aliases": "^0.5.0",
59
- "@dsh-cc/tools": "^0.5.0"
37
+ "@deepseek-ai/dsh-home-paths": "link:../../../../deepseek-harness/packages/util/home-paths",
38
+ "@dsh-cc/model-aliases": "^0.6.0",
39
+ "@dsh-cc/claude-code-agents": "^0.6.0",
40
+ "@dsh-cc/mcp-client": "^0.6.0",
41
+ "@dsh-cc/hook-protocol": "^0.6.0",
42
+ "@dsh-cc/tools": "^0.6.0",
43
+ "@dsh-cc/skill-loader": "^0.6.0"
60
44
  },
45
+ "peerDependencies": {
46
+ "@deepseek-ai/dsh-commands": ">=0.1.2-rc.1",
47
+ "@deepseek-ai/dsh-llm": ">=0.1.2-rc.1",
48
+ "@deepseek-ai/dsh-settings": ">=0.1.2-rc.1",
49
+ "@deepseek-ai/dsh-skill": ">=0.1.2-rc.1",
50
+ "@deepseek-ai/dsh-subagent": ">=0.1.2-rc.1",
51
+ "@deepseek-ai/cordis": ">=0.1.2-rc.1",
52
+ "@deepseek-ai/dsh-home-paths": ">=0.1.2-rc.1",
53
+ "@dsh-cc/claude-code-agents": "^0.6.0",
54
+ "@dsh-cc/hook-protocol": "^0.6.0",
55
+ "@dsh-cc/mcp-client": "^0.6.0",
56
+ "@dsh-cc/skill-loader": "^0.6.0",
57
+ "@dsh-cc/tools": "^0.6.0"
58
+ },
59
+ "files": [
60
+ "lib"
61
+ ],
62
+ "license": "Apache-2.0",
61
63
  "publishConfig": {
62
64
  "access": "public"
63
65
  }