@keelcodes/cli 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.
@@ -0,0 +1,360 @@
1
+ import { ERC7710_SUITE, ERC7715_SUITE, ERC7579_SUITE, ERC8004_SUITE, createViemAgentRegistryReader, createViemDelegationReader, createViemReader, formatReport, runSuite, } from '@keelcodes/conformance';
2
+ import { createModuleRegistry, routeSession } from '@keelcodes/migrate';
3
+ import { evaluateCall, normalizePolicy, policyCommitment, toCall, } from '@keelcodes/policy';
4
+ import { createPublicClient, http } from 'viem';
5
+ import { UsageError } from './errors.js';
6
+ import { readInput } from './io.js';
7
+ import { cliPackage } from './version.js';
8
+ // ============================================================================
9
+ // Commands.
10
+ //
11
+ // Each command writes its own output and returns a process exit code: 0 for
12
+ // success, 1 for a subject-level failure (a denied call, a failing suite), and
13
+ // 2 for a usage error — which `runCli` raises as a `UsageError` instead.
14
+ // ============================================================================
15
+ /** `keel version` — print the CLI's own name and version. */
16
+ export function versionCommand(args, io) {
17
+ const pkg = cliPackage();
18
+ if (args.bool('json'))
19
+ io.out(JSON.stringify(pkg, null, 2));
20
+ else
21
+ io.out(`${pkg.name} ${pkg.version}`);
22
+ return 0;
23
+ }
24
+ /**
25
+ * `keel policy check` — normalise a policy and print its commitment. When a
26
+ * target is given, also dry-run a call against it. Exit code 1 when the call is
27
+ * denied, so it composes with `&&` in a script.
28
+ */
29
+ export async function policyCheck(args, io) {
30
+ const policy = normalizePolicy(parsePolicyInput(await readJson(io, args.require('policy'))));
31
+ const commitment = policyCommitment(policy);
32
+ const target = args.get('target');
33
+ if (target === undefined) {
34
+ if (args.bool('json')) {
35
+ io.out(JSON.stringify({ commitment, policy: policyJson(policy) }, null, 2));
36
+ }
37
+ else {
38
+ io.out(`policy ${commitment}`);
39
+ for (const [index, rule] of policy.rules.entries()) {
40
+ io.out(` rule ${index}: target=${rule.target} selectors=${rule.selectors.length === 0 ? 'any' : rule.selectors.join(',')} maxPerTx=${rule.maxPerTx} maxDaily=${rule.maxDaily} maxCalls=${rule.maxCalls} tokens=${rule.tokenLimits.length}`);
41
+ }
42
+ }
43
+ return 0;
44
+ }
45
+ const valueArg = args.get('value');
46
+ const dataArg = args.get('data');
47
+ const call = toCall({
48
+ target: target,
49
+ ...(valueArg !== undefined ? { value: parseWei(valueArg, '--value') } : {}),
50
+ ...(dataArg !== undefined ? { data: dataArg } : {}),
51
+ });
52
+ const now = args.int('at') ?? BigInt(Math.floor(Date.now() / 1000));
53
+ const decision = evaluateCall(policy, { now, usage: [] }, call);
54
+ if (args.bool('json')) {
55
+ io.out(JSON.stringify({ commitment, call: callJson(call), decision }, null, 2));
56
+ }
57
+ else {
58
+ io.out(`commitment ${commitment}`);
59
+ io.out(`call target=${call.target} value=${call.value} selector=${call.selector}`);
60
+ if (decision.allowed) {
61
+ io.out(`allow rule=${decision.ruleIndex}`);
62
+ }
63
+ else {
64
+ const rule = decision.ruleIndex === undefined ? '' : ` rule=${decision.ruleIndex}`;
65
+ io.out(`deny reason=${decision.reason}${rule}`);
66
+ }
67
+ }
68
+ return decision.allowed ? 0 : 1;
69
+ }
70
+ /**
71
+ * `keel migrate route` — route a session record to its module generation using a
72
+ * registry read from a JSON file.
73
+ */
74
+ export async function migrateRoute(args, io) {
75
+ const raw = await readJson(io, args.require('registry'));
76
+ const { modules, defaultVersion } = readRegistry(raw);
77
+ const registry = createModuleRegistry(modules, defaultVersion === undefined ? {} : { defaultVersion });
78
+ const id = args.require('id');
79
+ const moduleVersion = args.get('module-version');
80
+ const routed = routeSession(registry, {
81
+ id,
82
+ ...(moduleVersion === undefined ? {} : { moduleVersion }),
83
+ });
84
+ if (args.bool('json')) {
85
+ io.out(JSON.stringify({ session: { id, ...(moduleVersion === undefined ? {} : { moduleVersion }) }, module: routed }, null, 2));
86
+ }
87
+ else {
88
+ const version = moduleVersion === undefined ? 'no moduleVersion' : `moduleVersion ${moduleVersion}`;
89
+ io.out(`session ${id} (${version})`);
90
+ const address = routed.address === undefined ? '' : ` address=${routed.address}`;
91
+ io.out(` → ${routed.version} encoding=${routed.encoding} multiSession=${routed.multiSession} enforcedLimits=${routed.enforcedLimits}${address}`);
92
+ }
93
+ return 0;
94
+ }
95
+ /** `keel conformance list` — print the available suites and their check counts. */
96
+ export function conformanceList(args, io) {
97
+ if (args.bool('json')) {
98
+ io.out(JSON.stringify(SUITES.map((suite) => ({ name: suite.name, spec: suite.spec, checks: suite.checks.length })), null, 2));
99
+ return 0;
100
+ }
101
+ for (const suite of SUITES) {
102
+ io.out(`${suite.name} · ${suite.spec} · ${suite.checks.length} checks`);
103
+ }
104
+ return 0;
105
+ }
106
+ /**
107
+ * `keel conformance run` — run one suite against a live chain. Exit code 1 when
108
+ * the suite fails (any check, or a critical one).
109
+ */
110
+ export async function conformanceRun(args, io) {
111
+ const suite = suiteFromKey(args.get('suite') ?? 'erc7579');
112
+ const rpc = args.get('rpc') ?? io.env.KEEL_RPC_URL;
113
+ if (rpc === undefined) {
114
+ throw new UsageError('missing required option --rpc (or the KEEL_RPC_URL environment variable)');
115
+ }
116
+ const client = createPublicClient({ transport: http(rpc) });
117
+ const report = await runSuite(conformanceTarget(suite, args, client), suite);
118
+ if (args.bool('json'))
119
+ io.out(JSON.stringify(report, null, 2));
120
+ else
121
+ io.out(formatReport(report));
122
+ return report.summary.ok ? 0 : 1;
123
+ }
124
+ // ============================================================================
125
+ // Suite selection.
126
+ // ============================================================================
127
+ const SUITES = [ERC7579_SUITE, ERC7710_SUITE, ERC7715_SUITE, ERC8004_SUITE];
128
+ const SUITE_BY_KEY = {
129
+ erc7579: ERC7579_SUITE,
130
+ '7579': ERC7579_SUITE,
131
+ erc7710: ERC7710_SUITE,
132
+ '7710': ERC7710_SUITE,
133
+ erc7715: ERC7715_SUITE,
134
+ '7715': ERC7715_SUITE,
135
+ erc8004: ERC8004_SUITE,
136
+ '8004': ERC8004_SUITE,
137
+ };
138
+ function suiteFromKey(key) {
139
+ const suite = SUITE_BY_KEY[key.toLowerCase()];
140
+ if (suite === undefined) {
141
+ throw new UsageError(`unknown suite "${key}"; known suites: ${SUITES.map((entry) => entry.name).join(', ')}`);
142
+ }
143
+ return suite;
144
+ }
145
+ /**
146
+ * Binds a suite to its target from flags. ERC-7579, 7710 and 8004 read from the
147
+ * chain, so the CLI can wire them from an RPC URL; ERC-7715 needs a wallet
148
+ * (EIP-1193) provider, which the CLI cannot construct.
149
+ */
150
+ function conformanceTarget(suite, args, client) {
151
+ switch (suite.name) {
152
+ case 'ERC-7579':
153
+ return {
154
+ reader: createViemReader(client),
155
+ account: args.require('account'),
156
+ module: args.require('module'),
157
+ moduleTypeId: args.int('type') ?? 1n,
158
+ };
159
+ case 'ERC-7710':
160
+ return { delegation: createViemDelegationReader(client, args.require('manager')) };
161
+ case 'ERC-8004': {
162
+ const agentId = args.int('agent-id');
163
+ if (agentId === undefined)
164
+ throw new UsageError('missing required option --agent-id for the ERC-8004 suite');
165
+ const reputationRegistry = args.get('reputation-registry');
166
+ return {
167
+ agentRegistry: createViemAgentRegistryReader(client, {
168
+ identityRegistry: args.require('identity-registry'),
169
+ agentId,
170
+ ...(reputationRegistry === undefined ? {} : { reputationRegistry: reputationRegistry }),
171
+ }),
172
+ };
173
+ }
174
+ default:
175
+ throw new UsageError(`the ${suite.name} suite needs a wallet provider, which the CLI cannot construct; run it via the SDK`);
176
+ }
177
+ }
178
+ // ============================================================================
179
+ // Input parsing.
180
+ // ============================================================================
181
+ function messageOf(error) {
182
+ return error instanceof Error ? error.message : String(error);
183
+ }
184
+ async function readJson(io, path) {
185
+ const text = await readInput(io, path);
186
+ try {
187
+ return JSON.parse(text);
188
+ }
189
+ catch (error) {
190
+ throw new Error(`${path}: not valid JSON: ${messageOf(error)}`);
191
+ }
192
+ }
193
+ function asRecord(value, at) {
194
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
195
+ throw new Error(`${at}: expected an object`);
196
+ }
197
+ return value;
198
+ }
199
+ function asString(value, at) {
200
+ if (typeof value !== 'string' || value.length === 0)
201
+ throw new Error(`${at}: expected a non-empty string`);
202
+ return value;
203
+ }
204
+ function optionalBigint(record, key, at) {
205
+ const value = record[key];
206
+ if (value === undefined || value === null)
207
+ return undefined;
208
+ if (typeof value === 'bigint')
209
+ return value;
210
+ if (typeof value === 'number') {
211
+ if (!Number.isInteger(value))
212
+ throw new Error(`${at}.${key}: expected an integer`);
213
+ return BigInt(value);
214
+ }
215
+ if (typeof value === 'string') {
216
+ try {
217
+ return BigInt(value);
218
+ }
219
+ catch {
220
+ throw new Error(`${at}.${key}: expected a decimal integer string, got "${value}"`);
221
+ }
222
+ }
223
+ throw new Error(`${at}.${key}: expected a decimal integer string`);
224
+ }
225
+ function optionalNumber(record, key, at) {
226
+ const value = record[key];
227
+ if (value === undefined || value === null)
228
+ return undefined;
229
+ const parsed = typeof value === 'number' ? value : typeof value === 'string' ? Number(value) : Number.NaN;
230
+ if (!Number.isInteger(parsed))
231
+ throw new Error(`${at}.${key}: expected an integer`);
232
+ return parsed;
233
+ }
234
+ /**
235
+ * Parses a policy as authored: the {@link PolicyInput} shape, with wei amounts
236
+ * written as decimal strings because JSON has no bigint. Throws a plain `Error`
237
+ * on a malformed shape — `normalizePolicy` then validates the meaning.
238
+ */
239
+ export function parsePolicyInput(value) {
240
+ const record = asRecord(value, 'policy');
241
+ const rules = record.rules;
242
+ if (!Array.isArray(rules))
243
+ throw new Error('policy.rules: expected an array');
244
+ const validAfter = optionalBigint(record, 'validAfter', 'policy');
245
+ const validUntil = optionalBigint(record, 'validUntil', 'policy');
246
+ return {
247
+ rules: rules.map((rule, index) => parseRule(rule, `policy.rules[${index}]`)),
248
+ ...(validAfter === undefined ? {} : { validAfter }),
249
+ ...(validUntil === undefined ? {} : { validUntil }),
250
+ };
251
+ }
252
+ function parseRule(value, at) {
253
+ const record = asRecord(value, at);
254
+ const target = asString(record.target, `${at}.target`);
255
+ const selectorsRaw = record.selectors;
256
+ const selectors = selectorsRaw === undefined || selectorsRaw === null
257
+ ? undefined
258
+ : parseArray(selectorsRaw, `${at}.selectors`).map((selector, index) => asString(selector, `${at}.selectors[${index}]`));
259
+ const tokenLimitsRaw = record.tokenLimits;
260
+ const tokenLimits = tokenLimitsRaw === undefined || tokenLimitsRaw === null
261
+ ? undefined
262
+ : parseArray(tokenLimitsRaw, `${at}.tokenLimits`).map((limit, index) => parseTokenLimit(limit, `${at}.tokenLimits[${index}]`));
263
+ const maxPerTx = optionalBigint(record, 'maxPerTx', at);
264
+ const maxDaily = optionalBigint(record, 'maxDaily', at);
265
+ const maxCalls = optionalNumber(record, 'maxCalls', at);
266
+ return {
267
+ target,
268
+ ...(selectors === undefined ? {} : { selectors }),
269
+ ...(maxPerTx === undefined ? {} : { maxPerTx }),
270
+ ...(maxDaily === undefined ? {} : { maxDaily }),
271
+ ...(maxCalls === undefined ? {} : { maxCalls }),
272
+ ...(tokenLimits === undefined ? {} : { tokenLimits }),
273
+ };
274
+ }
275
+ function parseTokenLimit(value, at) {
276
+ const record = asRecord(value, at);
277
+ const token = asString(record.token, `${at}.token`);
278
+ const maxPerTx = optionalBigint(record, 'maxPerTx', at);
279
+ const maxDaily = optionalBigint(record, 'maxDaily', at);
280
+ return {
281
+ token,
282
+ ...(maxPerTx === undefined ? {} : { maxPerTx }),
283
+ ...(maxDaily === undefined ? {} : { maxDaily }),
284
+ };
285
+ }
286
+ function parseArray(value, at) {
287
+ if (!Array.isArray(value))
288
+ throw new Error(`${at}: expected an array`);
289
+ return value;
290
+ }
291
+ function readRegistry(raw) {
292
+ if (Array.isArray(raw)) {
293
+ return { modules: raw.map((module, index) => parseModuleDescriptor(module, `modules[${index}]`)) };
294
+ }
295
+ const record = asRecord(raw, 'registry');
296
+ if (!Array.isArray(record.modules))
297
+ throw new Error('registry.modules: expected an array');
298
+ const modules = record.modules.map((module, index) => parseModuleDescriptor(module, `modules[${index}]`));
299
+ if (record.defaultVersion === undefined || record.defaultVersion === null)
300
+ return { modules };
301
+ return { modules, defaultVersion: asString(record.defaultVersion, 'registry.defaultVersion') };
302
+ }
303
+ function parseModuleDescriptor(value, at) {
304
+ const record = asRecord(value, at);
305
+ const encoding = asString(record.encoding, `${at}.encoding`);
306
+ if (encoding !== 'onchain' && encoding !== 'payload') {
307
+ throw new Error(`${at}.encoding: expected "onchain" or "payload", got "${encoding}"`);
308
+ }
309
+ if (typeof record.multiSession !== 'boolean')
310
+ throw new Error(`${at}.multiSession: expected a boolean`);
311
+ if (typeof record.enforcedLimits !== 'boolean')
312
+ throw new Error(`${at}.enforcedLimits: expected a boolean`);
313
+ const address = record.address;
314
+ if (address !== undefined && address !== null && typeof address !== 'string') {
315
+ throw new Error(`${at}.address: expected a string`);
316
+ }
317
+ return {
318
+ version: asString(record.version, `${at}.version`),
319
+ encoding,
320
+ multiSession: record.multiSession,
321
+ enforcedLimits: record.enforcedLimits,
322
+ ...(typeof address === 'string' ? { address } : {}),
323
+ };
324
+ }
325
+ // ============================================================================
326
+ // Output rendering.
327
+ // ============================================================================
328
+ function parseWei(value, at) {
329
+ try {
330
+ return BigInt(value);
331
+ }
332
+ catch {
333
+ throw new UsageError(`${at} must be a decimal integer of wei, got "${value}"`);
334
+ }
335
+ }
336
+ /** A JSON-safe rendering of a normalised policy (bigints become decimal strings). */
337
+ function policyJson(policy) {
338
+ return {
339
+ version: policy.version,
340
+ validAfter: policy.validAfter.toString(),
341
+ validUntil: policy.validUntil.toString(),
342
+ rules: policy.rules.map((rule) => ({
343
+ target: rule.target,
344
+ selectors: [...rule.selectors],
345
+ maxPerTx: rule.maxPerTx.toString(),
346
+ maxDaily: rule.maxDaily.toString(),
347
+ maxCalls: rule.maxCalls,
348
+ tokenLimits: rule.tokenLimits.map((limit) => ({
349
+ token: limit.token,
350
+ maxPerTx: limit.maxPerTx.toString(),
351
+ maxDaily: limit.maxDaily.toString(),
352
+ })),
353
+ })),
354
+ };
355
+ }
356
+ /** A JSON-safe rendering of a call. */
357
+ function callJson(call) {
358
+ return { target: call.target, value: call.value.toString(), data: call.data, selector: call.selector };
359
+ }
360
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * The caller invoked the CLI incorrectly — a missing or malformed option, or an
3
+ * unknown command. Maps to exit code 2, which keeps "you used it wrong" distinct
4
+ * from "the thing you asked about failed" (exit 1).
5
+ */
6
+ export declare class UsageError extends Error {
7
+ /** The process exit code this error maps to. */
8
+ readonly exitCode = 2;
9
+ constructor(message: string);
10
+ }
11
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,UAAW,SAAQ,KAAK;IACnC,gDAAgD;IAChD,QAAQ,CAAC,QAAQ,KAAK;gBAEV,OAAO,EAAE,MAAM;CAI5B"}
package/dist/errors.js ADDED
@@ -0,0 +1,14 @@
1
+ /**
2
+ * The caller invoked the CLI incorrectly — a missing or malformed option, or an
3
+ * unknown command. Maps to exit code 2, which keeps "you used it wrong" distinct
4
+ * from "the thing you asked about failed" (exit 1).
5
+ */
6
+ export class UsageError extends Error {
7
+ /** The process exit code this error maps to. */
8
+ exitCode = 2;
9
+ constructor(message) {
10
+ super(message);
11
+ this.name = 'UsageError';
12
+ }
13
+ }
14
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnC,gDAAgD;IACvC,QAAQ,GAAG,CAAC,CAAC;IAEtB,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @keelcodes/cli
3
+ *
4
+ * The `keel` command line: the three checks an operator runs by hand, made
5
+ * scriptable.
6
+ *
7
+ * - `keel policy check` — normalise an authored policy, print its commitment and
8
+ * dry-run a call against it, so a mis-scoped policy is caught before it is
9
+ * signed rather than after.
10
+ * - `keel migrate route` — route a session record to its module generation using
11
+ * a registry descriptor, the same routing the relay uses.
12
+ * - `keel conformance run` — run an ERC-7579 / 7710 / 8004 conformance suite
13
+ * against a live chain and report per-assertion pass/fail.
14
+ *
15
+ * Commands are written against the {@link CliIo} port, so they run identically
16
+ * under `bin.ts` and under a test.
17
+ *
18
+ * @packageDocumentation
19
+ */
20
+ export { parseArgs } from './args.js';
21
+ export type { ParsedArgs } from './args.js';
22
+ export { parsePolicyInput } from './commands.js';
23
+ export { UsageError } from './errors.js';
24
+ export { createNodeIo, readInput } from './io.js';
25
+ export type { CliIo } from './io.js';
26
+ export { runCli, usage } from './run.js';
27
+ export { cliPackage } from './version.js';
28
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,YAAY,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAClD,YAAY,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,26 @@
1
+ /**
2
+ * @keelcodes/cli
3
+ *
4
+ * The `keel` command line: the three checks an operator runs by hand, made
5
+ * scriptable.
6
+ *
7
+ * - `keel policy check` — normalise an authored policy, print its commitment and
8
+ * dry-run a call against it, so a mis-scoped policy is caught before it is
9
+ * signed rather than after.
10
+ * - `keel migrate route` — route a session record to its module generation using
11
+ * a registry descriptor, the same routing the relay uses.
12
+ * - `keel conformance run` — run an ERC-7579 / 7710 / 8004 conformance suite
13
+ * against a live chain and report per-assertion pass/fail.
14
+ *
15
+ * Commands are written against the {@link CliIo} port, so they run identically
16
+ * under `bin.ts` and under a test.
17
+ *
18
+ * @packageDocumentation
19
+ */
20
+ export { parseArgs } from './args.js';
21
+ export { parsePolicyInput } from './commands.js';
22
+ export { UsageError } from './errors.js';
23
+ export { createNodeIo, readInput } from './io.js';
24
+ export { runCli, usage } from './run.js';
25
+ export { cliPackage } from './version.js';
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAElD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
package/dist/io.d.ts ADDED
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Everything a command needs from the outside world. Commands depend on this
3
+ * port rather than on `process` and `fs` directly, so tests can run a command
4
+ * end to end with in-memory input and captured output.
5
+ */
6
+ export interface CliIo {
7
+ /** Writes one line to standard output. */
8
+ out(line: string): void;
9
+ /** Writes one line to standard error. */
10
+ err(line: string): void;
11
+ /** Reads a text file. */
12
+ readText(path: string): Promise<string>;
13
+ /** Reads standard input to end. */
14
+ readStdin(): Promise<string>;
15
+ /** Environment variables, e.g. `KEEL_RPC_URL`. */
16
+ env: Readonly<Record<string, string | undefined>>;
17
+ }
18
+ /** The real process: stdout, stderr, the filesystem and the environment. */
19
+ export declare function createNodeIo(): CliIo;
20
+ /** Reads `path`, or standard input when `path` is `-`. */
21
+ export declare function readInput(io: CliIo, path: string): Promise<string>;
22
+ //# sourceMappingURL=io.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"io.d.ts","sourceRoot":"","sources":["../src/io.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,MAAM,WAAW,KAAK;IACpB,0CAA0C;IAC1C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,yCAAyC;IACzC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,yBAAyB;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACxC,mCAAmC;IACnC,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B,kDAAkD;IAClD,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;CACnD;AAED,4EAA4E;AAC5E,wBAAgB,YAAY,IAAI,KAAK,CAgBpC;AAED,0DAA0D;AAC1D,wBAAsB,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAExE"}
package/dist/io.js ADDED
@@ -0,0 +1,26 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import process from 'node:process';
3
+ /** The real process: stdout, stderr, the filesystem and the environment. */
4
+ export function createNodeIo() {
5
+ return {
6
+ out: (line) => {
7
+ process.stdout.write(`${line}\n`);
8
+ },
9
+ err: (line) => {
10
+ process.stderr.write(`${line}\n`);
11
+ },
12
+ readText: (path) => readFile(path, 'utf8'),
13
+ readStdin: async () => {
14
+ const chunks = [];
15
+ for await (const chunk of process.stdin)
16
+ chunks.push(Buffer.from(chunk));
17
+ return Buffer.concat(chunks).toString('utf8');
18
+ },
19
+ env: process.env,
20
+ };
21
+ }
22
+ /** Reads `path`, or standard input when `path` is `-`. */
23
+ export async function readInput(io, path) {
24
+ return path === '-' ? io.readStdin() : io.readText(path);
25
+ }
26
+ //# sourceMappingURL=io.js.map
package/dist/io.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"io.js","sourceRoot":"","sources":["../src/io.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,OAAO,MAAM,cAAc,CAAC;AAoBnC,4EAA4E;AAC5E,MAAM,UAAU,YAAY;IAC1B,OAAO;QACL,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;YACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;QACpC,CAAC;QACD,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;YACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;QACpC,CAAC;QACD,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAC1C,SAAS,EAAE,KAAK,IAAI,EAAE;YACpB,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK;gBAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAmB,CAAC,CAAC,CAAC;YACvF,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChD,CAAC;QACD,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC;AACJ,CAAC;AAED,0DAA0D;AAC1D,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,EAAS,EAAE,IAAY;IACrD,OAAO,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC3D,CAAC"}
package/dist/run.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ import type { CliIo } from './io.js';
2
+ /** The CLI's help text. */
3
+ export declare function usage(): string;
4
+ /**
5
+ * Runs the CLI and returns its exit code: 0 on success, 1 when the subject
6
+ * itself failed (a denied call, a failing suite), 2 on a usage error.
7
+ *
8
+ * Never throws — mapping errors to a printed message and a code keeps `bin.ts`
9
+ * a two-line wrapper and makes the whole surface testable without a process.
10
+ */
11
+ export declare function runCli(argv: readonly string[], io: CliIo): Promise<number>;
12
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AA2BrC,2BAA2B;AAC3B,wBAAgB,KAAK,IAAI,MAAM,CAE9B;AAID;;;;;;GAMG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAmChF"}
package/dist/run.js ADDED
@@ -0,0 +1,79 @@
1
+ import { parseArgs } from './args.js';
2
+ import { conformanceList, conformanceRun, migrateRoute, policyCheck, versionCommand, } from './commands.js';
3
+ import { UsageError } from './errors.js';
4
+ const USAGE = [
5
+ 'keel <command> [options]',
6
+ '',
7
+ 'Commands:',
8
+ ' version',
9
+ ' Print the CLI version.',
10
+ '',
11
+ ' policy check --policy <file|-> [--target <addr>] [--value <wei>] [--data <hex>] [--at <unix>] [--json]',
12
+ ' Normalise a policy and print its commitment; with --target, dry-run a call.',
13
+ '',
14
+ ' migrate route --registry <file|-> --id <id> [--module-version <v>] [--json]',
15
+ ' Route a session to its module generation.',
16
+ '',
17
+ ' conformance list [--json]',
18
+ ' List the conformance suites.',
19
+ '',
20
+ ' conformance run --rpc <url> [--suite <name>] [--json] [suite options]',
21
+ ' Run a suite against a live chain. --suite defaults to erc7579.',
22
+ ' erc7579: --account <addr> --module <addr> [--type <uint>]',
23
+ ' erc7710: --manager <addr>',
24
+ ' erc8004: --identity-registry <addr> --agent-id <uint> [--reputation-registry <addr>]',
25
+ '',
26
+ 'Options may be written --name value, --name=value or -n value. `-` reads stdin.',
27
+ ].join('\n');
28
+ /** The CLI's help text. */
29
+ export function usage() {
30
+ return USAGE;
31
+ }
32
+ const BOOLEAN_FLAGS = ['json', 'help'];
33
+ /**
34
+ * Runs the CLI and returns its exit code: 0 on success, 1 when the subject
35
+ * itself failed (a denied call, a failing suite), 2 on a usage error.
36
+ *
37
+ * Never throws — mapping errors to a printed message and a code keeps `bin.ts`
38
+ * a two-line wrapper and makes the whole surface testable without a process.
39
+ */
40
+ export async function runCli(argv, io) {
41
+ try {
42
+ const args = parseArgs(argv, BOOLEAN_FLAGS);
43
+ const [command, subcommand] = args.positionals;
44
+ if (args.bool('help') || command === undefined || command === 'help') {
45
+ io.out(USAGE);
46
+ return 0;
47
+ }
48
+ switch (command) {
49
+ case 'version':
50
+ return versionCommand(args, io);
51
+ case 'policy':
52
+ if (subcommand === 'check')
53
+ return await policyCheck(args, io);
54
+ throw new UsageError(`unknown policy subcommand "${subcommand ?? ''}"; expected "check"`);
55
+ case 'migrate':
56
+ if (subcommand === 'route')
57
+ return await migrateRoute(args, io);
58
+ throw new UsageError(`unknown migrate subcommand "${subcommand ?? ''}"; expected "route"`);
59
+ case 'conformance':
60
+ if (subcommand === 'list')
61
+ return conformanceList(args, io);
62
+ if (subcommand === 'run')
63
+ return await conformanceRun(args, io);
64
+ throw new UsageError(`unknown conformance subcommand "${subcommand ?? ''}"; expected "run" or "list"`);
65
+ default:
66
+ throw new UsageError(`unknown command "${command}"; run "keel help"`);
67
+ }
68
+ }
69
+ catch (error) {
70
+ if (error instanceof UsageError) {
71
+ io.err(`error: ${error.message}`);
72
+ io.err(USAGE);
73
+ return error.exitCode;
74
+ }
75
+ io.err(`error: ${error instanceof Error ? error.message : String(error)}`);
76
+ return 1;
77
+ }
78
+ }
79
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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"}