claude-plugin-dsh 0.0.0-stage → 0.1.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.
Files changed (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +154 -2
  3. package/dist/bin/cli.d.ts +3 -0
  4. package/dist/bin/cli.d.ts.map +1 -0
  5. package/dist/bin/cli.js +80 -0
  6. package/dist/bin/cli.js.map +1 -0
  7. package/dist/bin/inspect.d.ts +2 -0
  8. package/dist/bin/inspect.d.ts.map +1 -0
  9. package/dist/bin/inspect.js +45 -0
  10. package/dist/bin/inspect.js.map +1 -0
  11. package/dist/bin/runtime.d.ts +2 -0
  12. package/dist/bin/runtime.d.ts.map +1 -0
  13. package/dist/bin/runtime.js +4 -0
  14. package/dist/bin/runtime.js.map +1 -0
  15. package/dist/bin/scaffold.d.ts +2 -0
  16. package/dist/bin/scaffold.d.ts.map +1 -0
  17. package/dist/bin/scaffold.js +44 -0
  18. package/dist/bin/scaffold.js.map +1 -0
  19. package/dist/bin/sync.d.ts +2 -0
  20. package/dist/bin/sync.d.ts.map +1 -0
  21. package/dist/bin/sync.js +24 -0
  22. package/dist/bin/sync.js.map +1 -0
  23. package/dist/claude-compat.js +825 -0
  24. package/dist/src/claude-compat.d.ts +8 -0
  25. package/dist/src/claude-compat.d.ts.map +1 -0
  26. package/dist/src/claude-compat.js +7 -0
  27. package/dist/src/claude-compat.js.map +1 -0
  28. package/dist/src/dsh-types.d.ts +252 -0
  29. package/dist/src/dsh-types.d.ts.map +1 -0
  30. package/dist/src/dsh-types.js +6 -0
  31. package/dist/src/dsh-types.js.map +1 -0
  32. package/dist/src/hooks.d.ts +38 -0
  33. package/dist/src/hooks.d.ts.map +1 -0
  34. package/dist/src/hooks.js +136 -0
  35. package/dist/src/hooks.js.map +1 -0
  36. package/dist/src/plugin-files.d.ts +92 -0
  37. package/dist/src/plugin-files.d.ts.map +1 -0
  38. package/dist/src/plugin-files.js +198 -0
  39. package/dist/src/plugin-files.js.map +1 -0
  40. package/dist/src/plugin.d.ts +35 -0
  41. package/dist/src/plugin.d.ts.map +1 -0
  42. package/dist/src/plugin.js +422 -0
  43. package/dist/src/plugin.js.map +1 -0
  44. package/dist/src/transcript.d.ts +25 -0
  45. package/dist/src/transcript.d.ts.map +1 -0
  46. package/dist/src/transcript.js +198 -0
  47. package/dist/src/transcript.js.map +1 -0
  48. package/package.json +54 -4
@@ -0,0 +1,8 @@
1
+ export { createPlugin, rootFrom, COMPAT_VERSION, SKILL_RANK } from './plugin.js';
2
+ export type { PluginSpec, RowConfig, Part, DshPlugin } from './plugin.js';
3
+ export * from './plugin-files.js';
4
+ export { runHook, interpretHookResult } from './hooks.js';
5
+ export type { HookRunResult, HookOutcome } from './hooks.js';
6
+ export { TOOL_NAME_MAP, toClaudeTranscript, toClaudeToolInput, toClaudeToolResponse, claudeToolName } from './transcript.js';
7
+ export type * from './dsh-types.js';
8
+ //# sourceMappingURL=claude-compat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-compat.d.ts","sourceRoot":"","sources":["../../src/claude-compat.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAChF,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACzE,cAAc,mBAAmB,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AACzD,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAC5H,mBAAmB,gBAAgB,CAAA"}
@@ -0,0 +1,7 @@
1
+ // Public API. The build bundles this entry into one dependency-free file
2
+ // so existing adapters can keep vendoring dsh/claude-compat.js.
3
+ export { createPlugin, rootFrom, COMPAT_VERSION, SKILL_RANK } from './plugin.js';
4
+ export * from './plugin-files.js';
5
+ export { runHook, interpretHookResult } from './hooks.js';
6
+ export { TOOL_NAME_MAP, toClaudeTranscript, toClaudeToolInput, toClaudeToolResponse, claudeToolName } from './transcript.js';
7
+ //# sourceMappingURL=claude-compat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-compat.js","sourceRoot":"","sources":["../../src/claude-compat.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,gEAAgE;AAChE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAEhF,cAAc,mBAAmB,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAEzD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA"}
@@ -0,0 +1,252 @@
1
+ export interface TextBlock {
2
+ type: 'text';
3
+ text: string;
4
+ }
5
+ export interface ToolCallBlock {
6
+ type: 'tool-call';
7
+ id: string;
8
+ name: string;
9
+ /** Raw JSON string as produced by the model. */
10
+ arguments: string;
11
+ }
12
+ export type ContentBlock = TextBlock | ToolCallBlock | {
13
+ type: string;
14
+ };
15
+ export interface MessageSource {
16
+ kind: string;
17
+ }
18
+ export interface UserMessage {
19
+ id: string;
20
+ role: 'user';
21
+ content: readonly ContentBlock[];
22
+ source: MessageSource;
23
+ }
24
+ export interface SessionHeader {
25
+ id: string;
26
+ cwd?: string;
27
+ origin?: 'subagent';
28
+ }
29
+ export type SessionEvent = {
30
+ type: 'user/message';
31
+ seq?: number;
32
+ time?: number;
33
+ data: UserMessage;
34
+ } | {
35
+ type: 'assistant/message';
36
+ seq?: number;
37
+ time?: number;
38
+ data: {
39
+ message: {
40
+ content: readonly ContentBlock[];
41
+ };
42
+ };
43
+ } | {
44
+ type: 'tool/result';
45
+ seq?: number;
46
+ time?: number;
47
+ data: {
48
+ message: {
49
+ toolCallId: string;
50
+ content: readonly ContentBlock[];
51
+ isError?: boolean;
52
+ };
53
+ };
54
+ } | {
55
+ type: string;
56
+ seq?: number;
57
+ time?: number;
58
+ data?: unknown;
59
+ };
60
+ export interface Session {
61
+ header: SessionHeader;
62
+ snapshotEvents?(): readonly SessionEvent[];
63
+ ownEvents?(): readonly SessionEvent[];
64
+ events?: readonly SessionEvent[];
65
+ }
66
+ export interface Agent {
67
+ session: Session;
68
+ /** Queue context for the next step without waking the agent. */
69
+ inject(message: UserMessage): void;
70
+ /** Steering for the nearest step; wakes an idle agent. */
71
+ steer(message: UserMessage): void;
72
+ /** A new turn whose only message is this one. */
73
+ followup(message: UserMessage): void;
74
+ }
75
+ export type PreStepDecision = {
76
+ kind: 'reject';
77
+ } | {
78
+ kind: 'enter';
79
+ messages: UserMessage[];
80
+ startsRequestSeries?: true;
81
+ };
82
+ export type PreToolDecision = {
83
+ kind: 'allow';
84
+ } | {
85
+ kind: 'deny';
86
+ reason: string;
87
+ } | {
88
+ kind: 'cancel';
89
+ } | {
90
+ kind: 'ask';
91
+ reason?: string;
92
+ displayReason?: {
93
+ en: string;
94
+ [locale: string]: string;
95
+ };
96
+ };
97
+ export interface ToolExecution {
98
+ callId: string;
99
+ name: string;
100
+ arguments: unknown;
101
+ agent?: Agent;
102
+ signal?: AbortSignal;
103
+ }
104
+ export interface ToolExecutionResult {
105
+ isError: boolean;
106
+ content?: readonly ContentBlock[];
107
+ }
108
+ export type PostToolDecision = {
109
+ kind: 'accept';
110
+ content?: ContentBlock[];
111
+ value?: never;
112
+ additionalContexts?: UserMessage[];
113
+ } | {
114
+ kind: 'accept';
115
+ value: unknown;
116
+ content?: never;
117
+ additionalContexts?: UserMessage[];
118
+ } | {
119
+ kind: 'block';
120
+ feedback: ContentBlock[];
121
+ additionalContexts?: UserMessage[];
122
+ };
123
+ export type SkillSource = 'custom' | (string & {});
124
+ export interface SkillInvocationPolicy {
125
+ modelInvocable: boolean;
126
+ userInvocable: boolean;
127
+ }
128
+ export type SkillResourceBase = {
129
+ kind: 'directory';
130
+ path: string;
131
+ } | {
132
+ kind: 'url';
133
+ url: string;
134
+ } | {
135
+ kind: 'opaque';
136
+ description: string;
137
+ };
138
+ export interface SkillCandidate {
139
+ name: string;
140
+ description: string;
141
+ whenToUse?: string;
142
+ invocation: SkillInvocationPolicy;
143
+ provider: string;
144
+ source: SkillSource;
145
+ path?: string;
146
+ resourceBase?: SkillResourceBase;
147
+ rank: number;
148
+ locator: unknown;
149
+ }
150
+ export interface SkillDefinition {
151
+ name: string;
152
+ description: string;
153
+ invocation: SkillInvocationPolicy;
154
+ provider: string;
155
+ source: SkillSource;
156
+ path?: string;
157
+ resourceBase?: SkillResourceBase;
158
+ content: string;
159
+ }
160
+ export interface SkillLookupOptions {
161
+ cwd?: string;
162
+ signal?: AbortSignal;
163
+ }
164
+ export interface SkillProvider {
165
+ name: string;
166
+ list(options: SkillLookupOptions): Promise<readonly SkillCandidate[]>;
167
+ get(candidate: SkillCandidate, options: SkillLookupOptions): Promise<SkillDefinition | undefined>;
168
+ }
169
+ export interface SkillProviderControl {
170
+ signal: AbortSignal;
171
+ invalidate(): void;
172
+ }
173
+ export interface CommandInvocation {
174
+ agent: Agent;
175
+ rawInput: string;
176
+ }
177
+ export type CommandResult = {
178
+ kind: 'success';
179
+ text?: string;
180
+ } | {
181
+ kind: 'error';
182
+ text: string;
183
+ };
184
+ export interface CommandDefinition {
185
+ name: string;
186
+ description: string;
187
+ input?: {
188
+ hint?: string;
189
+ };
190
+ handler(invocation: CommandInvocation): CommandResult | Promise<CommandResult>;
191
+ }
192
+ export interface PromptSection {
193
+ name: string;
194
+ order: number;
195
+ text: string | ((context: unknown) => string);
196
+ interpolate?: boolean;
197
+ }
198
+ export type SessionStartSource = 'startup' | 'resume' | 'clear' | 'compact';
199
+ /** Listener signatures for the events this package subscribes to. */
200
+ export interface HostEvents {
201
+ 'agent/created': (payload: {
202
+ agent: Agent;
203
+ source?: SessionStartSource;
204
+ signal?: AbortSignal;
205
+ }) => undefined | Promise<undefined>;
206
+ 'agent/pre-step': (payload: {
207
+ agent: Agent;
208
+ messages: UserMessage[];
209
+ turn?: number;
210
+ step?: number;
211
+ signal?: AbortSignal;
212
+ }, next: () => Promise<PreStepDecision>) => Promise<PreStepDecision>;
213
+ 'agent/turn-stopping': (payload: {
214
+ agent: Agent;
215
+ turn?: number;
216
+ signal?: AbortSignal;
217
+ }) => undefined | Promise<undefined>;
218
+ 'agent/disposed': (payload: {
219
+ agent: Agent;
220
+ }) => void;
221
+ 'tools/pre-execute': (exec: ToolExecution, next: () => Promise<PreToolDecision>) => Promise<PreToolDecision>;
222
+ 'tools/post-execute': (exec: ToolExecution, result: Readonly<ToolExecutionResult>, next: () => Promise<PostToolDecision>) => Promise<PostToolDecision>;
223
+ 'tools/result': (exec: ToolExecution, result: ToolExecutionResult) => void;
224
+ }
225
+ export type HostEventSubscriber = UnionToIntersection<{
226
+ [K in keyof HostEvents]: (event: K, listener: HostEvents[K]) => unknown;
227
+ }[keyof HostEvents]>;
228
+ type UnionToIntersection<T> = (T extends unknown ? (value: T) => void : never) extends (value: infer I) => void ? I : never;
229
+ export interface Logger {
230
+ warn(message: string): void;
231
+ }
232
+ /** A Cordis context, narrowed to what this package uses. Services are present only after `inject`. */
233
+ export interface HostContext {
234
+ logger?: Logger;
235
+ skills?: {
236
+ registerProvider(create: (control: SkillProviderControl) => SkillProvider): unknown;
237
+ };
238
+ commands?: {
239
+ register(definition: CommandDefinition): unknown;
240
+ };
241
+ systemPrompt?: {
242
+ section(section: PromptSection): unknown;
243
+ };
244
+ workingDirectory?: {
245
+ get(session: Session): string;
246
+ };
247
+ inject(services: string[], callback: (ctx: HostContext) => void): unknown;
248
+ effect(execute: () => () => void): unknown;
249
+ on: HostEventSubscriber;
250
+ }
251
+ export {};
252
+ //# sourceMappingURL=dsh-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsh-types.d.ts","sourceRoot":"","sources":["../../src/dsh-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ // The slice of the DeepSeek Harness (DSH) host API this package touches, declared
2
+ // structurally so the package does not pin a DSH version. Names and shapes follow the
3
+ // d.ts files shipped in @deepseek-ai/dsh-agent, dsh-tools, dsh-skill, dsh-commands,
4
+ // dsh-system-prompt, dsh-session and dsh-working-directory.
5
+ export {};
6
+ //# sourceMappingURL=dsh-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsh-types.js","sourceRoot":"","sources":["../../src/dsh-types.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,sFAAsF;AACtF,oFAAoF;AACpF,4DAA4D"}
@@ -0,0 +1,38 @@
1
+ import { type HookSpec } from './plugin-files.js';
2
+ export declare const HOOK_STDOUT_LIMIT: number;
3
+ export interface HookRunResult {
4
+ code: number | null;
5
+ stdout: string;
6
+ stderr: string;
7
+ timedOut: boolean;
8
+ truncated?: boolean;
9
+ aborted?: boolean;
10
+ }
11
+ export type HookDecision = 'allow' | 'deny' | 'ask' | 'block' | (string & {});
12
+ export interface HookOutcome {
13
+ context: string[];
14
+ decision: HookDecision | undefined;
15
+ reason: string | undefined;
16
+ /** PreToolUse rewrite requested by the hook; DSH cannot apply it, so callers must fail closed. */
17
+ updatedInput: Record<string, unknown> | undefined;
18
+ /** Text for the operator log, never for the model. */
19
+ notices: string[];
20
+ }
21
+ /**
22
+ * Run one hook command with Claude Code's hook contract: JSON on stdin, exit 2 blocks.
23
+ * The hook runs in its own process group; a timeout or abort kills the whole group, and
24
+ * the result is taken at process exit, not when every inherited stdout handle closes.
25
+ */
26
+ export declare function runHook(hook: Pick<HookSpec, 'command'> & {
27
+ args?: string[] | undefined;
28
+ timeout?: number;
29
+ }, input: {
30
+ cwd?: string;
31
+ } & Record<string, unknown>, env: Record<string, string | undefined>, signal?: AbortSignal): Promise<HookRunResult>;
32
+ /**
33
+ * Normalize a hook result to one decision shape across events.
34
+ * @param event - Claude hook event; plain stdout counts as context only for
35
+ * SessionStart and UserPromptSubmit, as in Claude Code.
36
+ */
37
+ export declare function interpretHookResult(result: HookRunResult, event?: string): HookOutcome;
38
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/hooks.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0B,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAczE,eAAO,MAAM,iBAAiB,QAAa,CAAA;AAO3C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,OAAO,CAAA;IACjB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;AAE7E,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,QAAQ,EAAE,YAAY,GAAG,SAAS,CAAA;IAClC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1B,kGAAkG;IAClG,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAA;IACjD,sDAAsD;IACtD,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,KAAK,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAuDrP;AAWD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,WAAW,CAqCtF"}
@@ -0,0 +1,136 @@
1
+ // Running Claude Code hook commands and reading their output.
2
+ import { spawn } from 'node:child_process';
3
+ import { DEFAULT_HOOK_TIMEOUT_S } from './plugin-files.js';
4
+ const PLACEHOLDERS = ['CLAUDE_PLUGIN_ROOT', 'CLAUDE_PROJECT_DIR'];
5
+ /** Exec-form substitution: each placeholder becomes its value as plain text, never shell syntax. */
6
+ function expandPlaceholders(text, env) {
7
+ let out = text;
8
+ for (const name of PLACEHOLDERS) {
9
+ const value = env[name];
10
+ if (value !== undefined)
11
+ out = out.replaceAll('${' + name + '}', value).replaceAll('$' + name, value);
12
+ }
13
+ return out;
14
+ }
15
+ export const HOOK_STDOUT_LIMIT = 256 * 1024;
16
+ // Grace period for stdout after the hook process exits, in case a backgrounded child
17
+ // keeps the pipe open (Claude Code does not wait for those either).
18
+ const HOOK_DRAIN_MS = 50;
19
+ // Plain stdout and systemMessage reach the model only for these events, as in Claude Code.
20
+ const PLAIN_CONTEXT_EVENTS = new Set(['SessionStart', 'UserPromptSubmit']);
21
+ /**
22
+ * Run one hook command with Claude Code's hook contract: JSON on stdin, exit 2 blocks.
23
+ * The hook runs in its own process group; a timeout or abort kills the whole group, and
24
+ * the result is taken at process exit, not when every inherited stdout handle closes.
25
+ */
26
+ export function runHook(hook, input, env, signal) {
27
+ return new Promise((resolvePromise) => {
28
+ let stdout = '';
29
+ let stderr = '';
30
+ let truncated = false;
31
+ let settled = false;
32
+ let drain;
33
+ const options = { cwd: input.cwd || process.cwd(), env, stdio: ['pipe', 'pipe', 'pipe'], detached: true };
34
+ const child = hook.args
35
+ ? spawn(expandPlaceholders(hook.command, env), hook.args.map((arg) => expandPlaceholders(arg, env)), options)
36
+ : spawn('/bin/sh', ['-c', hook.command], options);
37
+ const killGroup = () => {
38
+ try {
39
+ if (child.pid !== undefined)
40
+ process.kill(-child.pid, 'SIGKILL');
41
+ }
42
+ catch {
43
+ child.kill('SIGKILL');
44
+ }
45
+ };
46
+ const timer = setTimeout(() => {
47
+ killGroup();
48
+ finish({ code: null, stdout, stderr: stderr + `\nhook timed out after ${hook.timeout}s`, timedOut: true, truncated });
49
+ }, (hook.timeout || DEFAULT_HOOK_TIMEOUT_S) * 1000);
50
+ const onAbort = () => {
51
+ killGroup();
52
+ finish({ code: null, stdout: '', stderr: 'hook cancelled', timedOut: false, truncated: false, aborted: true });
53
+ };
54
+ signal?.addEventListener('abort', onAbort, { once: true });
55
+ function finish(result) {
56
+ if (settled)
57
+ return;
58
+ settled = true;
59
+ clearTimeout(timer);
60
+ clearTimeout(drain);
61
+ signal?.removeEventListener('abort', onAbort);
62
+ child.stdout.destroy();
63
+ child.stderr.destroy();
64
+ resolvePromise(result);
65
+ }
66
+ child.stdout.on('data', (chunk) => {
67
+ if (stdout.length + chunk.length > HOOK_STDOUT_LIMIT)
68
+ truncated = true;
69
+ else
70
+ stdout += chunk;
71
+ });
72
+ child.stderr.on('data', (chunk) => {
73
+ if (stderr.length < HOOK_STDOUT_LIMIT)
74
+ stderr += chunk;
75
+ });
76
+ child.on('error', (error) => finish({ code: null, stdout, stderr: String(error), timedOut: false, truncated }));
77
+ child.on('exit', (code) => {
78
+ drain = setTimeout(() => finish({ code, stdout, stderr, timedOut: false, truncated }), HOOK_DRAIN_MS);
79
+ });
80
+ child.on('close', (code) => finish({ code, stdout, stderr, timedOut: false, truncated }));
81
+ child.stdin.on('error', () => { });
82
+ child.stdin.end(JSON.stringify(input));
83
+ });
84
+ }
85
+ /**
86
+ * Normalize a hook result to one decision shape across events.
87
+ * @param event - Claude hook event; plain stdout counts as context only for
88
+ * SessionStart and UserPromptSubmit, as in Claude Code.
89
+ */
90
+ export function interpretHookResult(result, event) {
91
+ const out = { context: [], decision: undefined, reason: undefined, updatedInput: undefined, notices: [] };
92
+ if (result.code === 2) {
93
+ out.decision = 'block';
94
+ out.reason = result.stderr.trim() || 'blocked by hook';
95
+ return out;
96
+ }
97
+ if (result.code !== 0)
98
+ return out;
99
+ if (result.truncated) {
100
+ out.notices.push(`hook output over ${HOOK_STDOUT_LIMIT} bytes was dropped`);
101
+ return out;
102
+ }
103
+ const text = result.stdout.trim();
104
+ if (!text)
105
+ return out;
106
+ let json;
107
+ try {
108
+ json = JSON.parse(text);
109
+ }
110
+ catch {
111
+ if (event === undefined || PLAIN_CONTEXT_EVENTS.has(event))
112
+ out.context.push(text);
113
+ return out;
114
+ }
115
+ const specific = json.hookSpecificOutput ?? {};
116
+ if (specific.additionalContext)
117
+ out.context.push(String(specific.additionalContext));
118
+ if (specific.updatedInput && typeof specific.updatedInput === 'object' && !Array.isArray(specific.updatedInput))
119
+ out.updatedInput = specific.updatedInput;
120
+ if (json.systemMessage)
121
+ out.notices.push(String(json.systemMessage));
122
+ if (specific.permissionDecision) {
123
+ out.decision = specific.permissionDecision;
124
+ out.reason = specific.permissionDecisionReason;
125
+ }
126
+ else if (json.decision) {
127
+ out.decision = json.decision === 'approve' ? 'allow' : json.decision;
128
+ out.reason = json.reason;
129
+ }
130
+ if (json.continue === false) {
131
+ out.decision = 'block';
132
+ out.reason = json.stopReason || out.reason;
133
+ }
134
+ return out;
135
+ }
136
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ export declare const DEFAULT_HOOK_TIMEOUT_S = 60;
2
+ export type FrontMatter = Record<string, string>;
3
+ export interface PluginManifest {
4
+ name: string;
5
+ version?: string;
6
+ description?: string;
7
+ [key: string]: unknown;
8
+ }
9
+ export interface SkillFile {
10
+ name: string;
11
+ description: string;
12
+ path: string;
13
+ base: string;
14
+ meta: FrontMatter;
15
+ }
16
+ export interface CommandFile {
17
+ stem: string;
18
+ name: string;
19
+ description: string;
20
+ hint: string;
21
+ body: string;
22
+ path: string;
23
+ }
24
+ export interface AgentFile {
25
+ name: string;
26
+ description: string;
27
+ tools: string;
28
+ model: string;
29
+ body: string;
30
+ path: string;
31
+ }
32
+ export interface HookSpec {
33
+ event: string;
34
+ matcher: string;
35
+ command: string;
36
+ /** Exec form: `command` is spawned directly with these arguments, no shell. */
37
+ args?: string[];
38
+ /** `block` makes a crash, timeout or exit code other than 0 and 2 count as a block. */
39
+ onFailure?: 'block' | 'continue';
40
+ /** Seconds. */
41
+ timeout: number;
42
+ }
43
+ export interface SkillOptions {
44
+ exclude?: string[];
45
+ /** Renames `x` to `<prefix>-x`. Empty keeps bare names. */
46
+ prefix?: string;
47
+ }
48
+ export interface CommandOptions {
49
+ exclude?: string[];
50
+ /** DSH command prefix; defaults to the plugin name. Empty gives bare `/<name>`. */
51
+ prefix?: string;
52
+ }
53
+ export interface AgentOptions {
54
+ exclude?: string[];
55
+ /** Extra root-relative directories holding agent markdown files. */
56
+ extraDirs?: string[];
57
+ }
58
+ /** Split YAML-ish front matter from a markdown file. Only flat `key: value` lines are read. */
59
+ export declare function parseFrontMatter(text: string): {
60
+ meta: FrontMatter;
61
+ body: string;
62
+ };
63
+ /**
64
+ * Remove `<!--harness:claude-only--> ... <!--/harness-->` blocks.
65
+ * An opener without a closer drops the rest of the file, so Claude-only text never leaks.
66
+ */
67
+ export declare function stripClaudeOnlyBlocks(text: string): {
68
+ text: string;
69
+ unterminated: boolean;
70
+ };
71
+ export declare const stripClaudeOnly: (text: string) => string;
72
+ /** Keep hook text from closing the tag it is wrapped in. */
73
+ export declare const escapeClosingTag: (text: string, tag: string) => string;
74
+ /** Replace the Claude plugin root variables with the real plugin directory. */
75
+ export declare function expandPluginRoot(text: string, root: string): string;
76
+ export declare const kebab: (value: unknown) => string;
77
+ export declare function readText(path: string): string | undefined;
78
+ /** Read the plugin manifest; the plugin name falls back to the directory name. */
79
+ export declare function readManifest(root: string): PluginManifest;
80
+ /** Skill directories: `skills/<name>/SKILL.md`. */
81
+ export declare function discoverSkills(root: string, options?: SkillOptions): SkillFile[];
82
+ /** Command files: `commands/<name>.md`. */
83
+ export declare function discoverCommands(root: string, options?: CommandOptions): CommandFile[];
84
+ /** Agent definitions: `agents/<name>.md` plus any extra directories the bundle lists. */
85
+ export declare function discoverAgents(root: string, options?: AgentOptions): AgentFile[];
86
+ /** hooks/hooks.json command hooks, flattened. Function-hook `modules` are Claude-only and skipped. */
87
+ export declare function readHooks(root: string): HookSpec[];
88
+ /** A Claude Code matcher: empty or `*` matches all, otherwise an anchored regex (`Bash`, `Skill|Agent|Task`). */
89
+ export declare function matcherMatches(matcher: string, toolName: string): boolean;
90
+ /** Expand `$ARGUMENTS`, `$1..$9` and `${CLAUDE_PLUGIN_ROOT}` in a command body. */
91
+ export declare function renderCommand(body: string, rawInput: string, root: string): string;
92
+ //# sourceMappingURL=plugin-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-files.d.ts","sourceRoot":"","sources":["../../src/plugin-files.ts"],"names":[],"mappings":"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"}