@cmodjs/core 0.1.14 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/commands.md +31 -19
- package/docs/index.md +12 -4
- package/docs/install-steps.md +30 -4
- package/docs/jobs.md +25 -9
- package/docs/mod.md +103 -37
- package/docs/options.md +93 -0
- package/docs/permissions.md +88 -0
- package/docs/state.md +4 -31
- package/docs/testing.md +13 -2
- package/installer.d.ts +10 -0
- package/installer.d.ts.map +1 -0
- package/installer.js +8 -0
- package/jobs/context.d.ts +2 -2
- package/jobs/context.d.ts.map +1 -1
- package/jobs/context.js +5 -3
- package/jobs/permissions.js +1 -1
- package/jobs/program.d.ts.map +1 -1
- package/jobs/program.js +5 -1
- package/jobs/prompt.js +5 -5
- package/jobs/schedule.d.ts.map +1 -1
- package/jobs/schedule.js +2 -1
- package/jobs/slash-command.d.ts.map +1 -1
- package/jobs/slash-command.js +3 -2
- package/jobs/status-line.d.ts.map +1 -1
- package/jobs/status-line.js +3 -2
- package/jobs/tool.d.ts.map +1 -1
- package/jobs/tool.js +3 -2
- package/mod.d.ts +48 -10
- package/mod.d.ts.map +1 -1
- package/mod.js +3 -0
- package/options.d.ts +58 -0
- package/options.d.ts.map +1 -0
- package/options.js +66 -0
- package/package.json +1 -1
- package/records.d.ts +14 -1
- package/records.d.ts.map +1 -1
- package/records.js +106 -7
- package/register.d.ts +4 -2
- package/register.d.ts.map +1 -1
- package/register.js +8 -2
- package/runtime/claude.d.ts +5 -1
- package/runtime/claude.d.ts.map +1 -1
- package/runtime/grants.d.ts +28 -0
- package/runtime/grants.d.ts.map +1 -0
- package/runtime/grants.js +286 -0
- package/runtime/installer.d.ts +23 -0
- package/runtime/installer.d.ts.map +1 -0
- package/runtime/installer.js +113 -0
- package/runtime/lifecycle.d.ts +6 -3
- package/runtime/lifecycle.d.ts.map +1 -1
- package/runtime/lifecycle.js +220 -36
- package/runtime/metadata.d.ts +20 -0
- package/runtime/metadata.d.ts.map +1 -0
- package/runtime/metadata.js +143 -0
- package/runtime/options.d.ts +21 -0
- package/runtime/options.d.ts.map +1 -0
- package/runtime/options.js +100 -0
- package/runtime/state.d.ts +1 -0
- package/runtime/state.d.ts.map +1 -1
- package/runtime/state.js +5 -75
- package/src/installer.ts +17 -0
- package/src/jobs/context.ts +5 -3
- package/src/jobs/permissions.ts +1 -1
- package/src/jobs/program.ts +4 -1
- package/src/jobs/prompt.ts +5 -5
- package/src/jobs/schedule.ts +2 -1
- package/src/jobs/slash-command.ts +3 -2
- package/src/jobs/status-line.ts +3 -2
- package/src/jobs/tool.ts +3 -2
- package/src/mod.ts +46 -11
- package/src/options.ts +91 -0
- package/src/records.ts +117 -8
- package/src/register.ts +12 -3
- package/src/runtime/claude.ts +2 -0
- package/src/runtime/grants.ts +306 -0
- package/src/runtime/installer.ts +163 -0
- package/src/runtime/lifecycle.ts +220 -45
- package/src/runtime/metadata.ts +153 -0
- package/src/runtime/options.ts +102 -0
- package/src/runtime/state.ts +7 -70
- package/src/testing/fake-claude.ts +6 -1
- package/src/testing/fake-files.ts +9 -3
- package/src/testing.ts +40 -15
- package/src/utils/metadata.ts +242 -0
- package/testing/fake-claude.d.ts +4 -0
- package/testing/fake-claude.d.ts.map +1 -1
- package/testing/fake-claude.js +5 -1
- package/testing/fake-files.d.ts.map +1 -1
- package/testing/fake-files.js +9 -3
- package/testing.d.ts +6 -2
- package/testing.d.ts.map +1 -1
- package/testing.js +29 -13
- package/utils/metadata.d.ts +21 -0
- package/utils/metadata.d.ts.map +1 -0
- package/utils/metadata.js +250 -0
package/mod.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import type { AgentSpawnArgs, AgentSpawnResult, AskOptions, ClassicHookInputs, CmodDependencies, FsEntry, FsStat, FsStatOptions, HookStream, HttpInit, HttpResponse, ModelCompleteOptions, ModelCompleteRequest, ModelCompleteResult, PaneOpenArgs, PermissionRequestDecision, ProcessRunInit, ProcessRunResult, ProcessSpawnChunk, ProcessSpawnRequest, ProcessSpawnResult, RenderElement,
|
|
1
|
+
import type { AgentSpawnArgs, AgentSpawnResult, AskOptions, ClassicHookInputs, CmodDependencies, FsEntry, FsStat, FsStatOptions, HookStream, HttpInit, HttpResponse, ModelCompleteOptions, ModelCompleteRequest, ModelCompleteResult, PaneOpenArgs, PermissionRequestDecision, ProcessRunInit, ProcessRunResult, ProcessSpawnChunk, ProcessSpawnRequest, ProcessSpawnResult, RenderElement, SessionMessage, Timer, ToastOptions, UiScrollArgs, UiScrollResult } from 'claude-code';
|
|
2
|
+
import type { Step } from './installer.js';
|
|
3
|
+
import { type Option, type Options, type OptionValues } from './options.js';
|
|
4
|
+
import type { FlagPermission, ListPermission } from './records.js';
|
|
2
5
|
import type { Claude } from './runtime/claude.js';
|
|
3
6
|
import type { RoutedEvent } from './runtime/hooks.js';
|
|
4
7
|
import type { RoutedHook } from './runtime/router.js';
|
|
@@ -74,9 +77,33 @@ export type ModHook<E extends ModEvent> = (input: HookInput<E>) => HookAnswer |
|
|
|
74
77
|
export type HookOptions = {
|
|
75
78
|
readonly timeoutMs?: number;
|
|
76
79
|
};
|
|
77
|
-
export type
|
|
80
|
+
export type ScrollArgs = Omit<UiScrollArgs, 'to'> & {
|
|
81
|
+
readonly to: Exclude<UiScrollArgs['to'], {
|
|
82
|
+
requestId: string;
|
|
83
|
+
}>;
|
|
84
|
+
};
|
|
85
|
+
export type ModClaude = Claude & {
|
|
86
|
+
on<N extends RoutedEvent>(event: N, hook: RoutedHook<N>): void;
|
|
87
|
+
};
|
|
88
|
+
export type Metadata = Readonly<Record<string, string>>;
|
|
89
|
+
export type FileMatch = {
|
|
90
|
+
readonly path: string;
|
|
91
|
+
readonly name?: string;
|
|
92
|
+
readonly metadata: Metadata;
|
|
93
|
+
readonly error?: string;
|
|
94
|
+
};
|
|
95
|
+
type SessionMessages = {
|
|
96
|
+
(): Promise<SessionMessage[]>;
|
|
97
|
+
(args: {
|
|
98
|
+
readonly agentId: string;
|
|
99
|
+
}): Promise<SessionMessage[] | {
|
|
100
|
+
readonly deny: string;
|
|
101
|
+
}>;
|
|
102
|
+
};
|
|
103
|
+
export type Mod<State extends object = Record<never, never>, Declared extends Options = Options> = {
|
|
78
104
|
readonly name: string;
|
|
79
105
|
readonly state: Readonly<State>;
|
|
106
|
+
readonly options: OptionValues<Declared>;
|
|
80
107
|
readonly dataFolder: string;
|
|
81
108
|
on<E extends ModEvent>(event: E, hook: ModHook<E>, options?: HookOptions): void;
|
|
82
109
|
use<Handle>(job: Job<Handle, State>): Handle;
|
|
@@ -87,7 +114,7 @@ export type Mod<State extends object = Record<never, never>> = {
|
|
|
87
114
|
toast(text: string, options?: ToastOptions): void;
|
|
88
115
|
progress<T>(title: string, task: (report: (step: ProgressStep) => void) => Promise<T>): Promise<T>;
|
|
89
116
|
ask(question: string, options?: readonly string[] | AskOptions): Promise<string>;
|
|
90
|
-
scroll(args:
|
|
117
|
+
scroll(args: ScrollArgs): Promise<UiScrollResult>;
|
|
91
118
|
};
|
|
92
119
|
readonly process: {
|
|
93
120
|
run(argv: readonly string[], init?: ProcessRunInit): Promise<ProcessRunResult>;
|
|
@@ -99,15 +126,21 @@ export type Mod<State extends object = Record<never, never>> = {
|
|
|
99
126
|
list(path?: string): Promise<FsEntry[]>;
|
|
100
127
|
exists(path: string): Promise<boolean>;
|
|
101
128
|
stat(path: string, options?: FsStatOptions): Promise<FsStat>;
|
|
129
|
+
find(glob: string | readonly string[]): Promise<readonly FileMatch[]>;
|
|
130
|
+
};
|
|
131
|
+
readonly metadata: {
|
|
132
|
+
read(path: string): Promise<Metadata>;
|
|
133
|
+
update(path: string, change: (metadata: Record<string, string>) => void): Promise<void>;
|
|
102
134
|
};
|
|
103
135
|
readonly http: {
|
|
104
136
|
fetch(url: string, init?: HttpInit): Promise<HttpResponse>;
|
|
105
137
|
};
|
|
106
138
|
readonly settings: {
|
|
107
|
-
|
|
139
|
+
page(page: Pane<State>): void;
|
|
140
|
+
open(pageId?: string): Promise<void>;
|
|
108
141
|
};
|
|
109
142
|
readonly session: {
|
|
110
|
-
messages:
|
|
143
|
+
messages: SessionMessages;
|
|
111
144
|
append(text: string): Promise<void>;
|
|
112
145
|
submit(text: string): Promise<void>;
|
|
113
146
|
};
|
|
@@ -117,9 +150,14 @@ export type Mod<State extends object = Record<never, never>> = {
|
|
|
117
150
|
readonly model: {
|
|
118
151
|
complete(request: ModelCompleteRequest, options?: ModelCompleteOptions): Promise<ModelCompleteResult>;
|
|
119
152
|
};
|
|
153
|
+
readonly permissions: {
|
|
154
|
+
has(name: ListPermission, value: string): boolean;
|
|
155
|
+
has(name: FlagPermission): boolean;
|
|
156
|
+
};
|
|
120
157
|
readonly projectRoot: string;
|
|
121
158
|
readonly cwd: string;
|
|
122
159
|
readonly dependencies: CmodDependencies;
|
|
160
|
+
readonly claude: ModClaude;
|
|
123
161
|
};
|
|
124
162
|
type StateGroups = {
|
|
125
163
|
readonly memory?: object;
|
|
@@ -130,22 +168,22 @@ type StateGroups = {
|
|
|
130
168
|
type Api<Contract, State extends object> = {
|
|
131
169
|
readonly [Method in keyof Contract]: Contract[Method] extends (input: infer Input) => infer Result ? (input: Input, mod: Mod<State>) => Result | Awaited<Result> : never;
|
|
132
170
|
};
|
|
133
|
-
export type ModDefinition<State extends StateGroups = Record<never, never>, Name extends string = string
|
|
171
|
+
export type ModDefinition<State extends StateGroups = Record<never, never>, Name extends string = string, Declared extends Options = Record<never, Option>> = {
|
|
134
172
|
readonly name: Name;
|
|
135
173
|
readonly state?: State;
|
|
174
|
+
readonly options?: Declared;
|
|
136
175
|
readonly api?: Name extends keyof CmodDependencies ? Api<CmodDependencies[Name], State> : {
|
|
137
176
|
readonly [method: string]: (input: never, mod: Mod<State>) => unknown;
|
|
138
177
|
};
|
|
139
|
-
|
|
178
|
+
readonly installer?: readonly Step<State>[];
|
|
179
|
+
setup(mod: Mod<State, Declared>): void | Promise<void>;
|
|
140
180
|
};
|
|
141
181
|
export type JobContext<State extends object = Record<never, never>> = {
|
|
142
182
|
readonly mod: Mod<State>;
|
|
143
|
-
readonly claude: Claude;
|
|
144
|
-
on<N extends RoutedEvent>(event: N, hook: RoutedHook<N>): void;
|
|
145
183
|
announce(feature: string): void;
|
|
146
184
|
reserveName(kind: string, name: string, taken: string): void;
|
|
147
185
|
readonly toolCalls: ToolCalls;
|
|
148
186
|
};
|
|
149
187
|
export type Job<Handle, State extends object = Record<never, never>> = (context: JobContext<State>) => Handle;
|
|
150
|
-
export declare function defineMod<State extends StateGroups = Record<never, never>, Name extends string = string
|
|
188
|
+
export declare function defineMod<State extends StateGroups = Record<never, never>, Name extends string = string, const Declared extends Options = Record<never, Option>>(definition: ModDefinition<State, Name, Declared>): ModDefinition<State, Name, Declared>;
|
|
151
189
|
//# sourceMappingURL=mod.d.ts.map
|
package/mod.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["src/mod.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,OAAO,EACP,MAAM,EACN,aAAa,EACb,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,YAAY,EACZ,yBAAyB,EACzB,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,EACb,
|
|
1
|
+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["src/mod.ts"],"names":[],"mappings":"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"}
|
package/mod.js
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
import { checkOptions } from './options.js';
|
|
1
2
|
export { longestMs } from './runtime/deadline.js';
|
|
2
3
|
export { notInstalled } from './runtime/dependencies.js';
|
|
3
4
|
export { messageOf } from './utils/text.js';
|
|
4
5
|
export function defineMod(definition) {
|
|
5
6
|
if (definition.name.trim() === '')
|
|
6
7
|
throw new Error('defineMod: the mod needs a name, such as the name in .claude-plugin/plugin.json.');
|
|
8
|
+
if (definition.options !== undefined)
|
|
9
|
+
checkOptions(definition.name, definition.options);
|
|
7
10
|
return definition;
|
|
8
11
|
}
|
package/options.d.ts
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export type OptionKind = 'text' | 'secret' | 'number' | 'toggle' | 'choice' | 'folder' | 'file' | 'list';
|
|
2
|
+
export type OptionValue = string | number | boolean | readonly string[];
|
|
3
|
+
type Described = {
|
|
4
|
+
readonly title: string;
|
|
5
|
+
readonly description: string;
|
|
6
|
+
};
|
|
7
|
+
export type Option<Value extends OptionValue = OptionValue> = Described & {
|
|
8
|
+
readonly kind: OptionKind;
|
|
9
|
+
readonly default?: Value;
|
|
10
|
+
readonly min?: number;
|
|
11
|
+
readonly max?: number;
|
|
12
|
+
readonly choices?: readonly string[];
|
|
13
|
+
};
|
|
14
|
+
export type Options = Readonly<Record<string, Option>>;
|
|
15
|
+
export type OptionValues<Declared extends Options> = {
|
|
16
|
+
readonly [Key in keyof Declared]: Declared[Key] extends Option<infer Value> ? Value : never;
|
|
17
|
+
};
|
|
18
|
+
export type UserConfigField = Described & {
|
|
19
|
+
readonly type: 'string' | 'number' | 'boolean' | 'directory' | 'file';
|
|
20
|
+
readonly sensitive?: true;
|
|
21
|
+
readonly multiple?: true;
|
|
22
|
+
readonly default?: OptionValue;
|
|
23
|
+
readonly min?: number;
|
|
24
|
+
readonly max?: number;
|
|
25
|
+
readonly options?: readonly string[];
|
|
26
|
+
};
|
|
27
|
+
export declare const option: {
|
|
28
|
+
text: (field: Described & {
|
|
29
|
+
readonly default?: string;
|
|
30
|
+
}) => Option<string>;
|
|
31
|
+
secret: (field: Described) => Option<string>;
|
|
32
|
+
number: (field: Described & {
|
|
33
|
+
readonly default?: number;
|
|
34
|
+
readonly min?: number;
|
|
35
|
+
readonly max?: number;
|
|
36
|
+
}) => Option<number>;
|
|
37
|
+
toggle: (field: Described & {
|
|
38
|
+
readonly default?: boolean;
|
|
39
|
+
}) => Option<boolean>;
|
|
40
|
+
choice: <const Choice extends string>(choices: readonly Choice[], field: Described & {
|
|
41
|
+
readonly default?: Choice;
|
|
42
|
+
}) => Option<Choice>;
|
|
43
|
+
folder: (field: Described & {
|
|
44
|
+
readonly default?: string;
|
|
45
|
+
}) => Option<string>;
|
|
46
|
+
file: (field: Described & {
|
|
47
|
+
readonly default?: string;
|
|
48
|
+
}) => Option<string>;
|
|
49
|
+
list: (field: Described & {
|
|
50
|
+
readonly default?: readonly string[];
|
|
51
|
+
}) => Option<readonly string[]>;
|
|
52
|
+
};
|
|
53
|
+
export declare function checkOptions(name: string, options: Options): Options;
|
|
54
|
+
export declare function userConfigOf(options: Options): Record<string, UserConfigField>;
|
|
55
|
+
export declare function isUnset(value: unknown): boolean;
|
|
56
|
+
export declare function fitsOption(declared: Option, value: unknown): string | undefined;
|
|
57
|
+
export {};
|
|
58
|
+
//# sourceMappingURL=options.d.ts.map
|
package/options.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["src/options.ts"],"names":[],"mappings":"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"}
|
package/options.js
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
export const option = {
|
|
2
|
+
text: (field) => ({ ...field, kind: 'text' }),
|
|
3
|
+
secret: (field) => ({ ...field, kind: 'secret' }),
|
|
4
|
+
number: (field) => ({ ...field, kind: 'number' }),
|
|
5
|
+
toggle: (field) => ({ ...field, kind: 'toggle', default: field.default ?? false }),
|
|
6
|
+
choice: (choices, field) => ({ ...field, kind: 'choice', choices }),
|
|
7
|
+
folder: (field) => ({ ...field, kind: 'folder' }),
|
|
8
|
+
file: (field) => ({ ...field, kind: 'file' }),
|
|
9
|
+
list: (field) => ({ ...field, kind: 'list' }),
|
|
10
|
+
};
|
|
11
|
+
const types = { text: 'string', secret: 'string', number: 'number', toggle: 'boolean', choice: 'string', folder: 'directory', file: 'file', list: 'string' };
|
|
12
|
+
const optionKey = /^[A-Za-z_]\w*$/;
|
|
13
|
+
export function checkOptions(name, options) {
|
|
14
|
+
for (const [key, declared] of Object.entries(options)) {
|
|
15
|
+
const at = `${name}: options.${key}`;
|
|
16
|
+
if (!optionKey.test(key))
|
|
17
|
+
throw new Error(`${at} is not an option name. Use letters, digits, and _, starting with a letter, as Claude Code passes each option on as CLAUDE_PLUGIN_OPTION_${key.toUpperCase()}.`);
|
|
18
|
+
if (declared.title.trim() === '')
|
|
19
|
+
throw new Error(`${at} needs a title, the label /config shows.`);
|
|
20
|
+
if (declared.kind === 'choice' && (declared.choices ?? []).length === 0)
|
|
21
|
+
throw new Error(`${at} is a choice with no choices. Give option.choice(['a', 'b'], { ... }).`);
|
|
22
|
+
if (declared.kind === 'choice' && declared.default !== undefined && !(declared.choices ?? []).includes(declared.default))
|
|
23
|
+
throw new Error(`${at} defaults to ${String(declared.default)}, which is not one of its choices: ${(declared.choices ?? []).join(', ')}.`);
|
|
24
|
+
}
|
|
25
|
+
return options;
|
|
26
|
+
}
|
|
27
|
+
export function userConfigOf(options) {
|
|
28
|
+
return Object.fromEntries(Object.entries(options).map(([key, declared]) => [
|
|
29
|
+
key,
|
|
30
|
+
{
|
|
31
|
+
type: types[declared.kind],
|
|
32
|
+
title: declared.title,
|
|
33
|
+
description: declared.description,
|
|
34
|
+
...(declared.kind === 'secret' ? { sensitive: true } : {}),
|
|
35
|
+
...(declared.kind === 'list' ? { multiple: true } : {}),
|
|
36
|
+
...(declared.kind === 'choice' ? { options: declared.choices } : {}),
|
|
37
|
+
...(declared.default === undefined ? {} : { default: declared.default }),
|
|
38
|
+
...(declared.min === undefined ? {} : { min: declared.min }),
|
|
39
|
+
...(declared.max === undefined ? {} : { max: declared.max }),
|
|
40
|
+
},
|
|
41
|
+
]));
|
|
42
|
+
}
|
|
43
|
+
export function isUnset(value) {
|
|
44
|
+
return value === undefined || value === '' || (Array.isArray(value) && value.length === 0);
|
|
45
|
+
}
|
|
46
|
+
export function fitsOption(declared, value) {
|
|
47
|
+
const kind = declared.kind;
|
|
48
|
+
if (kind === 'toggle')
|
|
49
|
+
return typeof value === 'boolean' ? undefined : 'takes true or false';
|
|
50
|
+
if (kind === 'number') {
|
|
51
|
+
if (typeof value !== 'number' || !Number.isFinite(value))
|
|
52
|
+
return 'takes a number';
|
|
53
|
+
if (declared.min !== undefined && value < declared.min)
|
|
54
|
+
return `takes ${declared.min} or more`;
|
|
55
|
+
if (declared.max !== undefined && value > declared.max)
|
|
56
|
+
return `takes ${declared.max} or less`;
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
if (kind === 'list')
|
|
60
|
+
return Array.isArray(value) && value.every((item) => typeof item === 'string') ? undefined : 'takes a list of text';
|
|
61
|
+
if (typeof value !== 'string')
|
|
62
|
+
return 'takes text';
|
|
63
|
+
if (kind === 'choice' && !(declared.choices ?? []).includes(value))
|
|
64
|
+
return `takes one of: ${(declared.choices ?? []).join(', ')}`;
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
package/package.json
CHANGED
package/records.d.ts
CHANGED
|
@@ -13,7 +13,12 @@ export type Steps = {
|
|
|
13
13
|
uninstall?: string;
|
|
14
14
|
program?: string;
|
|
15
15
|
keys?: Readonly<Record<string, string>>;
|
|
16
|
+
permissions?: readonly string[];
|
|
16
17
|
};
|
|
18
|
+
export declare const listPermissions: readonly ['network', 'run', 'files'];
|
|
19
|
+
export declare const flagPermissions: readonly ['conversation', 'prompt', 'model', 'agents', 'tools', 'config', 'approve'];
|
|
20
|
+
export type ListPermission = (typeof listPermissions)[number];
|
|
21
|
+
export type FlagPermission = (typeof flagPermissions)[number];
|
|
17
22
|
export type ReadFile = (path: string) => Promise<string | undefined>;
|
|
18
23
|
export type RunnerEvent = {
|
|
19
24
|
kind: 'progress';
|
|
@@ -29,6 +34,7 @@ export type RunnerEvent = {
|
|
|
29
34
|
install: string;
|
|
30
35
|
uninstall: string;
|
|
31
36
|
keys: string;
|
|
37
|
+
permissions: readonly string[];
|
|
32
38
|
} | {
|
|
33
39
|
kind: 'done';
|
|
34
40
|
name: string;
|
|
@@ -53,7 +59,14 @@ export declare function configFolders(env: Record<string, string | undefined>, n
|
|
|
53
59
|
export declare function readRecord(read: ReadFile, store: string, name: string): Promise<InstallRecord | undefined>;
|
|
54
60
|
export declare function writeRecord(write: (path: string, text: string) => Promise<void>, store: string, record: InstallRecord): Promise<void>;
|
|
55
61
|
export declare function readSteps(pkg: unknown): Steps | undefined;
|
|
56
|
-
export declare function
|
|
62
|
+
export declare function permissionWords(item: string): string;
|
|
63
|
+
export declare const settingsPagesMethod = "cmod:settingsPages";
|
|
64
|
+
export declare const openPageMethod = "cmod:openPage";
|
|
65
|
+
export declare const pendingStepsMethod = "cmod:pendingSteps";
|
|
66
|
+
export declare const finishStepsMethod = "cmod:finishSteps";
|
|
67
|
+
export declare function consentPath(store: string): string;
|
|
68
|
+
export declare function parseConsent(value: unknown, path: string): Record<string, string[]>;
|
|
69
|
+
export declare function oldestCmodFor(steps: Steps): string;
|
|
57
70
|
export declare function keyWords(keys: Readonly<Record<string, string>> | undefined): string;
|
|
58
71
|
export declare function scriptPaths(command: string): string[];
|
|
59
72
|
export declare function scriptsSha256(steps: Steps, files: {
|
package/records.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"records.d.ts","sourceRoot":"","sources":["src/records.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CACvC,CAAA;AAED,MAAM,MAAM,KAAK,GAAG;
|
|
1
|
+
{"version":3,"file":"records.d.ts","sourceRoot":"","sources":["src/records.ts"],"names":[],"mappings":"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"}
|
package/records.js
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import { listed, messageOf } from './utils/text.js';
|
|
2
|
+
export const listPermissions = ['network', 'run', 'files'];
|
|
3
|
+
export const flagPermissions = ['conversation', 'prompt', 'model', 'agents', 'tools', 'config', 'approve'];
|
|
4
|
+
const permissionNames = [...listPermissions, ...flagPermissions];
|
|
5
|
+
const hostName = /^[A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])?)*$/;
|
|
6
|
+
const programName = /^[A-Za-z0-9][A-Za-z0-9._+-]*$/;
|
|
2
7
|
export const pluginName = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
|
|
3
8
|
export function storeFolder(env) {
|
|
4
9
|
const dataHome = env['XDG_DATA_HOME'];
|
|
@@ -94,7 +99,91 @@ export function readSteps(pkg) {
|
|
|
94
99
|
const program = steps['program'];
|
|
95
100
|
if (program !== undefined && (typeof program !== 'string' || !pluginName.test(program)))
|
|
96
101
|
throw new Error('package.json "cmod.program" must be the program\'s command, such as "hello".');
|
|
97
|
-
|
|
102
|
+
const permissions = readPermissions(steps);
|
|
103
|
+
return {
|
|
104
|
+
...readCommand(steps, 'install'),
|
|
105
|
+
...readCommand(steps, 'uninstall'),
|
|
106
|
+
...(program === undefined ? {} : { program }),
|
|
107
|
+
...readKeys(steps['keys']),
|
|
108
|
+
...(permissions.length === 0 ? {} : { permissions }),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
function readPermissions(steps) {
|
|
112
|
+
const declared = steps['permissions'];
|
|
113
|
+
if (declared === undefined)
|
|
114
|
+
return [];
|
|
115
|
+
const at = 'package.json "cmod.permissions"';
|
|
116
|
+
if (!isObject(declared))
|
|
117
|
+
throw new Error(`${at} must be an object, such as { "network": ["api.github.com"], "prompt": true }.`);
|
|
118
|
+
const items = [];
|
|
119
|
+
for (const [name, value] of Object.entries(declared)) {
|
|
120
|
+
if (!permissionNames.includes(name))
|
|
121
|
+
throw new Error(`${at} names "${name}", which is not a permission. Use ${listed(permissionNames.map((each) => `"${each}"`))}.`);
|
|
122
|
+
if (flagPermissions.includes(name)) {
|
|
123
|
+
if (value !== true)
|
|
124
|
+
throw new Error(`${at} sets "${name}" to ${JSON.stringify(value)}. Write "${name}": true, or leave it out.`);
|
|
125
|
+
items.push(name);
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (name === 'run' && value === '*') {
|
|
129
|
+
items.push('run:*');
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
const example = name === 'network' ? '["api.github.com"]' : name === 'run' ? '["gh"], or "*" for any program' : '["~/.zshrc"]';
|
|
133
|
+
if (!Array.isArray(value) || value.length === 0 || !value.every((each) => typeof each === 'string'))
|
|
134
|
+
throw new Error(`${at} sets "${name}" to ${JSON.stringify(value)}. Write a list, such as "${name}": ${example}.`);
|
|
135
|
+
for (const each of value) {
|
|
136
|
+
const isPath = /^(~\/|\/)/.test(each) && !each.split('/').includes('..');
|
|
137
|
+
const isValid = name === 'network' ? hostName.test(each) || isPath : name === 'run' ? programName.test(each) : isPath;
|
|
138
|
+
if (!isValid)
|
|
139
|
+
throw new Error(`${at} lists "${each}" under "${name}". Write ${name === 'network' ? 'a host alone, such as "api.github.com", or a socket path, such as "/var/run/docker.sock"' : name === 'run' ? 'a program\'s command, such as "gh"' : 'a path that starts with ~/ or /, such as "~/.zshrc"'}.`);
|
|
140
|
+
items.push(`${name}:${each}`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return items;
|
|
144
|
+
}
|
|
145
|
+
export function permissionWords(item) {
|
|
146
|
+
const split = item.indexOf(':');
|
|
147
|
+
const target = item.slice(split + 1);
|
|
148
|
+
switch (split === -1 ? item : item.slice(0, split)) {
|
|
149
|
+
case 'network':
|
|
150
|
+
return `Connect to ${target}`;
|
|
151
|
+
case 'run':
|
|
152
|
+
return target === '*' ? 'Run any program on your computer' : `Run ${target} on your computer`;
|
|
153
|
+
case 'files':
|
|
154
|
+
return `Change ${target}`;
|
|
155
|
+
case 'conversation':
|
|
156
|
+
return 'Read this conversation';
|
|
157
|
+
case 'prompt':
|
|
158
|
+
return 'Add text Claude reads and start turns';
|
|
159
|
+
case 'model':
|
|
160
|
+
return 'Ask a model, which uses your plan';
|
|
161
|
+
case 'agents':
|
|
162
|
+
return 'Start agents';
|
|
163
|
+
case 'tools':
|
|
164
|
+
return "Use and change Claude's tool calls";
|
|
165
|
+
case 'config':
|
|
166
|
+
return 'Change your Claude Code settings';
|
|
167
|
+
case 'approve':
|
|
168
|
+
return "Approve Claude's tool calls for you";
|
|
169
|
+
default:
|
|
170
|
+
return item;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
export const settingsPagesMethod = 'cmod:settingsPages';
|
|
174
|
+
export const openPageMethod = 'cmod:openPage';
|
|
175
|
+
export const pendingStepsMethod = 'cmod:pendingSteps';
|
|
176
|
+
export const finishStepsMethod = 'cmod:finishSteps';
|
|
177
|
+
export function consentPath(store) {
|
|
178
|
+
return `${store}/consent.json`;
|
|
179
|
+
}
|
|
180
|
+
export function parseConsent(value, path) {
|
|
181
|
+
if (value === undefined)
|
|
182
|
+
return Object.create(null);
|
|
183
|
+
if (!isObject(value) || Object.values(value).some((items) => !Array.isArray(items) || items.some((item) => typeof item !== 'string'))) {
|
|
184
|
+
throw new Error(`${path} is not a map of plugin names to what each was approved for. Delete it, and cmod asks again.`);
|
|
185
|
+
}
|
|
186
|
+
return Object.assign(Object.create(null), value);
|
|
98
187
|
}
|
|
99
188
|
function readKeys(keys) {
|
|
100
189
|
if (keys === undefined)
|
|
@@ -110,8 +199,10 @@ function readKeys(keys) {
|
|
|
110
199
|
}
|
|
111
200
|
return { keys: commands };
|
|
112
201
|
}
|
|
113
|
-
export function oldestCmodFor(
|
|
114
|
-
|
|
202
|
+
export function oldestCmodFor(steps) {
|
|
203
|
+
if (steps.permissions !== undefined)
|
|
204
|
+
return '0.2.0';
|
|
205
|
+
return Object.keys(steps.keys ?? {}).length > 0 ? '0.1.12' : '0.0.0';
|
|
115
206
|
}
|
|
116
207
|
export function keyWords(keys) {
|
|
117
208
|
return listed(Object.entries(keys ?? {}).map(([key, command]) => `${key} to /${command}`));
|
|
@@ -155,7 +246,13 @@ export async function scriptsSha256(steps, files) {
|
|
|
155
246
|
for (const folder of scriptFolders)
|
|
156
247
|
folders.add(folder);
|
|
157
248
|
}
|
|
158
|
-
let text = [
|
|
249
|
+
let text = [
|
|
250
|
+
steps.install ?? '',
|
|
251
|
+
steps.uninstall ?? '',
|
|
252
|
+
steps.program ?? '',
|
|
253
|
+
...(steps.keys === undefined ? [] : [JSON.stringify(Object.entries(steps.keys).sort())]),
|
|
254
|
+
...(steps.permissions === undefined ? [] : [JSON.stringify([...steps.permissions].sort())]),
|
|
255
|
+
].join('\0');
|
|
159
256
|
for (const folder of [...folders].sort()) {
|
|
160
257
|
for (const name of (await files.list(folder)).sort()) {
|
|
161
258
|
const path = `${folder}/${name}`;
|
|
@@ -175,7 +272,7 @@ export function formatEvent(event) {
|
|
|
175
272
|
case 'log':
|
|
176
273
|
return `log ${event.text}`;
|
|
177
274
|
case 'needs-consent':
|
|
178
|
-
return `needs-consent ${event.sha256
|
|
275
|
+
return `needs-consent ${[event.sha256, event.install, event.uninstall, event.keys, ...event.permissions].join('\t')}`;
|
|
179
276
|
case 'done':
|
|
180
277
|
return event.version === undefined ? `done ${event.name}` : `done ${event.name} ${event.version}`;
|
|
181
278
|
case 'missing':
|
|
@@ -189,8 +286,10 @@ export function parseEvent(line) {
|
|
|
189
286
|
if (progress !== null)
|
|
190
287
|
return { kind: 'progress', done: Number(progress[1]), total: Number(progress[2]), label: progress[3] ?? '' };
|
|
191
288
|
const consent = /^needs-consent (\S+)\t([^\t]*)\t([^\t]*)(?:\t(.*))?$/.exec(line);
|
|
192
|
-
if (consent !== null)
|
|
193
|
-
|
|
289
|
+
if (consent !== null) {
|
|
290
|
+
const [keys = '', ...permissions] = (consent[4] ?? '').split('\t');
|
|
291
|
+
return { kind: 'needs-consent', sha256: consent[1], install: consent[2], uninstall: consent[3], keys, permissions: permissions.filter((item) => item !== '') };
|
|
292
|
+
}
|
|
194
293
|
const done = /^done (\S+)(?: (\S+))?$/.exec(line);
|
|
195
294
|
if (done !== null)
|
|
196
295
|
return { kind: 'done', name: done[1], ...(done[2] === undefined ? {} : { version: done[2] }) };
|
package/register.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import type { On } from 'claude-code';
|
|
1
|
+
import type { On, PluginOptions } from 'claude-code';
|
|
2
2
|
import type { ModDefinition } from './mod.js';
|
|
3
|
-
|
|
3
|
+
import type { Options } from './options.js';
|
|
4
|
+
export declare function registeredMod(): ModDefinition<object> | undefined;
|
|
5
|
+
export declare function registerMod<State extends object, Declared extends Options>(addHook: On, definition: ModDefinition<State, string, Declared>, options: PluginOptions): void;
|
|
4
6
|
export declare function registerPermissionCheck(addHook: On): void;
|
|
5
7
|
//# sourceMappingURL=register.d.ts.map
|
package/register.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["src/register.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoD,EAAE,EAAgB,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["src/register.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoD,EAAE,EAAE,aAAa,EAAgB,MAAM,aAAa,CAAA;AACpH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAC7C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAW3C,wBAAgB,aAAa,IAAI,aAAa,CAAC,MAAM,CAAC,GAAG,SAAS,CAEjE;AA4ED,wBAAgB,WAAW,CAAC,KAAK,SAAS,MAAM,EAAE,QAAQ,SAAS,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CA+BzK;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI,CAIzD"}
|
package/register.js
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { createLifecycle, readPlugin } from './runtime/lifecycle.js';
|
|
2
2
|
let lifecycle;
|
|
3
3
|
let checksPermissions = false;
|
|
4
|
+
let registered;
|
|
5
|
+
export function registeredMod() {
|
|
6
|
+
return registered;
|
|
7
|
+
}
|
|
4
8
|
async function startMod($, eventInput, passOn) {
|
|
5
9
|
const claude = {
|
|
6
10
|
plugin: { name: $.plugin.name, root: $.plugin.root },
|
|
@@ -30,6 +34,7 @@ async function startMod($, eventInput, passOn) {
|
|
|
30
34
|
},
|
|
31
35
|
http: { fetch: (url, init) => $.http.fetch(url, init) },
|
|
32
36
|
settings: { read: (args) => $.settings.read(args) },
|
|
37
|
+
config: { list: () => $.config.list(), set: (args) => $.config.set(args) },
|
|
33
38
|
store: {
|
|
34
39
|
get: (key) => $.store.get(key),
|
|
35
40
|
set: (key, value) => $.store.set(key, value),
|
|
@@ -72,9 +77,10 @@ async function startMod($, eventInput, passOn) {
|
|
|
72
77
|
function routeToMod(_$, eventInput, passOn) {
|
|
73
78
|
return lifecycle.route(passOn.event, eventInput, (passed) => passOn(passed));
|
|
74
79
|
}
|
|
75
|
-
export function registerMod(addHook, definition) {
|
|
80
|
+
export function registerMod(addHook, definition, options) {
|
|
76
81
|
checksPermissions = false;
|
|
77
|
-
|
|
82
|
+
registered = definition;
|
|
83
|
+
lifecycle = createLifecycle(definition, () => checksPermissions, options);
|
|
78
84
|
addHook('session.start', startMod);
|
|
79
85
|
addHook('classic.SessionStart', routeToMod);
|
|
80
86
|
addHook('classic.SessionEnd', routeToMod);
|
package/runtime/claude.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AgentInfo, AgentSpawnArgs, AgentSpawnResult, Args, EngineInterface, AskOptions, CommandSpec, ElementTable, FsEntry, FsStat, FsStatOptions, HookStream, HttpInit, HttpResponse, InvalidatableEventName, PaneCloseArgs, PaneOpenArgs, ProcessRunInit, ProcessRunResult, ProcessSpawnChunk, ProcessSpawnRequest, ProcessSpawnResult, RenderSurface, ResolveInput, SessionUsage, Settings, SettingsReadArgs, Timer, ToastOptions, ToolSpec, UiLogOptions, UiOpenResult, UiPane, UiScrollArgs, UiScrollResult } from 'claude-code';
|
|
1
|
+
import type { AgentInfo, AgentSpawnArgs, AgentSpawnResult, Args, EngineInterface, AskOptions, CommandSpec, ConfigRow, ElementTable, FsEntry, FsStat, FsStatOptions, HookStream, HttpInit, HttpResponse, InvalidatableEventName, PaneCloseArgs, PaneOpenArgs, ProcessRunInit, ProcessRunResult, ProcessSpawnChunk, ProcessSpawnRequest, ProcessSpawnResult, RenderSurface, ResolveInput, SessionUsage, Settings, SettingsReadArgs, Timer, ToastOptions, ToolSpec, UiLogOptions, UiOpenResult, UiPane, UiScrollArgs, UiScrollResult } from 'claude-code';
|
|
2
2
|
export type Claude = {
|
|
3
3
|
readonly plugin: {
|
|
4
4
|
readonly name: string;
|
|
@@ -34,6 +34,10 @@ export type Claude = {
|
|
|
34
34
|
readonly settings: {
|
|
35
35
|
read(args?: SettingsReadArgs): Promise<Settings>;
|
|
36
36
|
};
|
|
37
|
+
readonly config: {
|
|
38
|
+
list(): Promise<ConfigRow[]>;
|
|
39
|
+
set: EngineInterface['config']['set'];
|
|
40
|
+
};
|
|
37
41
|
readonly store: {
|
|
38
42
|
get(key: string): Promise<unknown>;
|
|
39
43
|
set(key: string, value: unknown): Promise<void>;
|
package/runtime/claude.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../src/runtime/claude.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../src/runtime/claude.ts"],"names":[],"mappings":"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"}
|