@grimoirelabs/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.
Files changed (53) hide show
  1. package/dist/commands/advisor-skill-helpers.d.ts +2 -0
  2. package/dist/commands/advisor-skill-helpers.d.ts.map +1 -0
  3. package/dist/commands/advisor-skill-helpers.js +24 -0
  4. package/dist/commands/advisor-skill-helpers.js.map +1 -0
  5. package/dist/commands/cast.d.ts +26 -0
  6. package/dist/commands/cast.d.ts.map +1 -0
  7. package/dist/commands/cast.js +334 -0
  8. package/dist/commands/cast.js.map +1 -0
  9. package/dist/commands/compile-all.d.ts +11 -0
  10. package/dist/commands/compile-all.d.ts.map +1 -0
  11. package/dist/commands/compile-all.js +84 -0
  12. package/dist/commands/compile-all.js.map +1 -0
  13. package/dist/commands/compile.d.ts +11 -0
  14. package/dist/commands/compile.d.ts.map +1 -0
  15. package/dist/commands/compile.js +63 -0
  16. package/dist/commands/compile.js.map +1 -0
  17. package/dist/commands/history.d.ts +12 -0
  18. package/dist/commands/history.d.ts.map +1 -0
  19. package/dist/commands/history.js +68 -0
  20. package/dist/commands/history.js.map +1 -0
  21. package/dist/commands/init.d.ts +10 -0
  22. package/dist/commands/init.d.ts.map +1 -0
  23. package/dist/commands/init.js +174 -0
  24. package/dist/commands/init.js.map +1 -0
  25. package/dist/commands/log.d.ts +11 -0
  26. package/dist/commands/log.d.ts.map +1 -0
  27. package/dist/commands/log.js +95 -0
  28. package/dist/commands/log.js.map +1 -0
  29. package/dist/commands/simulate.d.ts +15 -0
  30. package/dist/commands/simulate.d.ts.map +1 -0
  31. package/dist/commands/simulate.js +110 -0
  32. package/dist/commands/simulate.js.map +1 -0
  33. package/dist/commands/state-helpers.d.ts +18 -0
  34. package/dist/commands/state-helpers.d.ts.map +1 -0
  35. package/dist/commands/state-helpers.js +34 -0
  36. package/dist/commands/state-helpers.js.map +1 -0
  37. package/dist/commands/validate.d.ts +10 -0
  38. package/dist/commands/validate.d.ts.map +1 -0
  39. package/dist/commands/validate.js +67 -0
  40. package/dist/commands/validate.js.map +1 -0
  41. package/dist/commands/venues.d.ts +10 -0
  42. package/dist/commands/venues.d.ts.map +1 -0
  43. package/dist/commands/venues.js +31 -0
  44. package/dist/commands/venues.js.map +1 -0
  45. package/dist/commands/wallet.d.ts +7 -0
  46. package/dist/commands/wallet.d.ts.map +1 -0
  47. package/dist/commands/wallet.js +437 -0
  48. package/dist/commands/wallet.js.map +1 -0
  49. package/dist/index.d.ts +7 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +105 -0
  52. package/dist/index.js.map +1 -0
  53. package/package.json +27 -0
@@ -0,0 +1,68 @@
1
+ /**
2
+ * History Command
3
+ * View execution history for spells
4
+ */
5
+ import { join } from "node:path";
6
+ import { SqliteStateStore } from "@grimoirelabs/core";
7
+ import chalk from "chalk";
8
+ export async function historyCommand(spellId, options) {
9
+ const dbPath = options.stateDir ? join(options.stateDir, "grimoire.db") : undefined;
10
+ const store = new SqliteStateStore({ dbPath });
11
+ try {
12
+ if (!spellId) {
13
+ // List all spells with state
14
+ const spells = await store.listSpells();
15
+ if (spells.length === 0) {
16
+ console.log(chalk.dim("No spell state found. Run a spell first."));
17
+ return;
18
+ }
19
+ if (options.json) {
20
+ console.log(JSON.stringify(spells, null, 2));
21
+ return;
22
+ }
23
+ console.log(chalk.cyan("Spells with saved state:"));
24
+ console.log();
25
+ for (const id of spells) {
26
+ const runs = await store.getRuns(id, 1);
27
+ const lastRun = runs[0];
28
+ if (lastRun) {
29
+ const status = lastRun.success ? chalk.green("ok") : chalk.red("fail");
30
+ console.log(` ${chalk.white(id)} ${status} ${chalk.dim(lastRun.timestamp)}`);
31
+ }
32
+ else {
33
+ console.log(` ${chalk.white(id)} ${chalk.dim("(no runs)")}`);
34
+ }
35
+ }
36
+ }
37
+ else {
38
+ // Show runs for specific spell
39
+ const limit = options.limit ? Number.parseInt(options.limit, 10) : 20;
40
+ const runs = await store.getRuns(spellId, limit);
41
+ if (runs.length === 0) {
42
+ console.log(chalk.dim(`No runs found for spell "${spellId}".`));
43
+ return;
44
+ }
45
+ if (options.json) {
46
+ console.log(JSON.stringify(runs, null, 2));
47
+ return;
48
+ }
49
+ console.log(chalk.cyan(`Run history for ${chalk.white(spellId)}:`));
50
+ console.log();
51
+ for (const run of runs) {
52
+ const status = run.success ? chalk.green("ok ") : chalk.red("FAIL");
53
+ const duration = chalk.dim(`${run.duration}ms`);
54
+ const steps = chalk.dim(`${run.metrics.stepsExecuted} steps`);
55
+ const actions = chalk.dim(`${run.metrics.actionsExecuted} actions`);
56
+ const errors = run.metrics.errors > 0 ? chalk.red(` ${run.metrics.errors} errors`) : "";
57
+ console.log(` ${status} ${chalk.dim(run.runId.slice(0, 8))} ${chalk.dim(run.timestamp)} ${duration} ${steps} ${actions}${errors}`);
58
+ if (run.error) {
59
+ console.log(` ${chalk.red(run.error)}`);
60
+ }
61
+ }
62
+ }
63
+ }
64
+ finally {
65
+ store.close();
66
+ }
67
+ }
68
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/commands/history.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Init Command
3
+ * Scaffolds a new .grimoire directory
4
+ */
5
+ interface InitOptions {
6
+ force?: boolean;
7
+ }
8
+ export declare function initCommand(options: InitOptions): Promise<void>;
9
+ export {};
10
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AA0HD,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAyDrE"}
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Init Command
3
+ * Scaffolds a new .grimoire directory
4
+ */
5
+ import { access, mkdir, writeFile } from "node:fs/promises";
6
+ import { join } from "node:path";
7
+ import chalk from "chalk";
8
+ import ora from "ora";
9
+ const DEFAULT_CONFIG = `# Grimoire Configuration
10
+
11
+ # RPC endpoints
12
+ rpc:
13
+ ethereum: "https://eth.llamarpc.com"
14
+ arbitrum: "https://arb1.arbitrum.io/rpc"
15
+ base: "https://mainnet.base.org"
16
+
17
+ # Wallet configuration
18
+ wallet:
19
+ mode: approval-required # read-only | approval-required | limited
20
+ connector: mcp-wallet # mcp-wallet | walletconnect | hardware
21
+
22
+ # Default constraints
23
+ defaults:
24
+ max_slippage_bps: 50
25
+ tx_deadline_seconds: 300
26
+ simulation_required: true
27
+ `;
28
+ const DEFAULT_ALIASES = `# Default Venue Aliases
29
+
30
+ # Ethereum Mainnet (Chain ID: 1)
31
+ uniswap_v3_eth:
32
+ chain: 1
33
+ address: "0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45"
34
+ label: "Uniswap V3 Router"
35
+
36
+ aave_v3_eth:
37
+ chain: 1
38
+ address: "0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2"
39
+ label: "Aave V3 Pool"
40
+
41
+ morpho_eth:
42
+ chain: 1
43
+ address: "0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb"
44
+ label: "Morpho Blue"
45
+
46
+ # Arbitrum (Chain ID: 42161)
47
+ uniswap_v3_arb:
48
+ chain: 42161
49
+ address: "0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45"
50
+ label: "Uniswap V3 Router"
51
+
52
+ aave_v3_arb:
53
+ chain: 42161
54
+ address: "0x794a61358D6845594F94dc1DB02A252b5b4814aD"
55
+ label: "Aave V3 Pool"
56
+
57
+ # Base (Chain ID: 8453)
58
+ uniswap_v3_base:
59
+ chain: 8453
60
+ address: "0x2626664c2603336E57B271c5C0b26F421741e481"
61
+ label: "Uniswap V3 Router"
62
+
63
+ aave_v3_base:
64
+ chain: 8453
65
+ address: "0xA238Dd80C259a72e81d7e4664a9801593F98d1c5"
66
+ label: "Aave V3 Pool"
67
+
68
+ morpho_base:
69
+ chain: 8453
70
+ address: "0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb"
71
+ label: "Morpho Blue"
72
+ `;
73
+ const EXAMPLE_SPELL = `# Example: Simple USDC to ETH swap
74
+
75
+ spell: example-swap
76
+ version: "1.0.0"
77
+ description: "Swap USDC for ETH on Uniswap V3"
78
+
79
+ venues:
80
+ uniswap:
81
+ chain: 1
82
+ address: "0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45"
83
+ label: "Uniswap V3 Router"
84
+
85
+ params:
86
+ amount: 1000000000 # 1000 USDC (6 decimals)
87
+
88
+ assets:
89
+ USDC:
90
+ chain: 1
91
+ address: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"
92
+ decimals: 6
93
+ WETH:
94
+ chain: 1
95
+ address: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"
96
+ decimals: 18
97
+
98
+ trigger:
99
+ manual: true
100
+
101
+ steps:
102
+ - id: check_balance
103
+ compute:
104
+ usdc_balance: balance(USDC)
105
+ has_enough: usdc_balance >= params.amount
106
+
107
+ - id: do_swap
108
+ if: has_enough
109
+ action:
110
+ type: swap
111
+ venue: uniswap
112
+ asset_in: USDC
113
+ asset_out: WETH
114
+ amount: params.amount
115
+ mode: exact_in
116
+ constraints:
117
+ max_slippage: 50
118
+ on_failure: revert
119
+
120
+ guards:
121
+ - id: has_usdc
122
+ check: balance(USDC) >= params.amount
123
+ severity: halt
124
+ message: "Insufficient USDC balance"
125
+ `;
126
+ export async function initCommand(options) {
127
+ const spinner = ora("Initializing Grimoire...").start();
128
+ const baseDir = ".grimoire";
129
+ try {
130
+ const pathExists = async (path) => {
131
+ try {
132
+ await access(path);
133
+ return true;
134
+ }
135
+ catch {
136
+ return false;
137
+ }
138
+ };
139
+ // Check if already exists
140
+ if (await pathExists(baseDir)) {
141
+ if (!options.force) {
142
+ spinner.fail(chalk.red(`Directory ${baseDir} already exists. Use --force to overwrite.`));
143
+ process.exit(1);
144
+ }
145
+ }
146
+ // Create directory structure
147
+ await mkdir(baseDir, { recursive: true });
148
+ await mkdir(join(baseDir, "aliases"), { recursive: true });
149
+ await mkdir(join(baseDir, "spells"), { recursive: true });
150
+ // Write config file
151
+ await writeFile(join(baseDir, "config.yaml"), DEFAULT_CONFIG, "utf8");
152
+ // Write default aliases
153
+ await writeFile(join(baseDir, "aliases", "default.yaml"), DEFAULT_ALIASES, "utf8");
154
+ // Write example spell
155
+ await mkdir(join(baseDir, "spells", "example-swap"), { recursive: true });
156
+ await writeFile(join(baseDir, "spells", "example-swap", "spell.spell"), EXAMPLE_SPELL, "utf8");
157
+ spinner.succeed(chalk.green("Grimoire initialized successfully!"));
158
+ console.log();
159
+ console.log(chalk.dim("Created:"));
160
+ console.log(chalk.dim(` ${baseDir}/config.yaml`));
161
+ console.log(chalk.dim(` ${baseDir}/aliases/default.yaml`));
162
+ console.log(chalk.dim(` ${baseDir}/spells/example-swap/spell.spell`));
163
+ console.log();
164
+ console.log(chalk.cyan("Next steps:"));
165
+ console.log(chalk.white(" 1. Edit your spell in .grimoire/spells/example-swap/spell.spell"));
166
+ console.log(chalk.white(" 2. Run: grimoire validate .grimoire/spells/example-swap/spell.spell"));
167
+ console.log(chalk.white(" 3. Run: grimoire simulate .grimoire/spells/example-swap/spell.spell"));
168
+ }
169
+ catch (error) {
170
+ spinner.fail(chalk.red(`Failed to initialize: ${error.message}`));
171
+ process.exit(1);
172
+ }
173
+ }
174
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAMtB,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;CAkBtB,CAAC;AAEF,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4CvB,CAAC;AAEF,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoDrB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAoB;IACpD,MAAM,OAAO,GAAG,GAAG,CAAC,0BAA0B,CAAC,CAAC,KAAK,EAAE,CAAC;IACxD,MAAM,OAAO,GAAG,WAAW,CAAC;IAE5B,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,KAAK,EAAE,IAAY,EAAoB,EAAE;YAC1D,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;gBACnB,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC,CAAC;QAEF,0BAA0B;QAC1B,IAAI,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACnB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,OAAO,4CAA4C,CAAC,CAAC,CAAC;gBAC1F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,6BAA6B;QAC7B,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE1D,oBAAoB;QACpB,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;QAEtE,wBAAwB;QACxB,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,cAAc,CAAC,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;QAEnF,sBAAsB;QACtB,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1E,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;QAE/F,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC;QAEnE,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,cAAc,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,uBAAuB,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,kCAAkC,CAAC,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,mEAAmE,CAAC,CAAC,CAAC;QAC9F,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CAAC,uEAAuE,CAAC,CACrF,CAAC;QACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CAAC,uEAAuE,CAAC,CACrF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,yBAA0B,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Log Command
3
+ * View ledger events for a specific spell run
4
+ */
5
+ interface LogOptions {
6
+ json?: boolean;
7
+ stateDir?: string;
8
+ }
9
+ export declare function logCommand(spellId: string, runId: string, options: LogOptions): Promise<void>;
10
+ export {};
11
+ //# sourceMappingURL=log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/commands/log.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,UAAU,UAAU;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,IAAI,CAAC,CAgGf"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Log Command
3
+ * View ledger events for a specific spell run
4
+ */
5
+ import { join } from "node:path";
6
+ import { SqliteStateStore } from "@grimoirelabs/core";
7
+ import chalk from "chalk";
8
+ export async function logCommand(spellId, runId, options) {
9
+ const dbPath = options.stateDir ? join(options.stateDir, "grimoire.db") : undefined;
10
+ const store = new SqliteStateStore({ dbPath });
11
+ try {
12
+ const entries = await store.loadLedger(spellId, runId);
13
+ if (!entries) {
14
+ console.log(chalk.dim(`No ledger found for spell "${spellId}" run "${runId}".`));
15
+ // Suggest checking history
16
+ const runs = await store.getRuns(spellId, 5);
17
+ if (runs.length > 0) {
18
+ console.log();
19
+ console.log(chalk.dim("Recent runs:"));
20
+ for (const run of runs) {
21
+ console.log(chalk.dim(` ${run.runId}`));
22
+ }
23
+ }
24
+ return;
25
+ }
26
+ if (options.json) {
27
+ console.log(JSON.stringify(entries, null, 2));
28
+ return;
29
+ }
30
+ console.log(chalk.cyan(`Ledger for ${chalk.white(spellId)} run ${chalk.white(runId.slice(0, 8))}:`));
31
+ console.log();
32
+ for (const entry of entries) {
33
+ const time = new Date(entry.timestamp).toISOString().split("T")[1]?.replace("Z", "");
34
+ const eventType = chalk.blue(entry.event.type.padEnd(24));
35
+ let details = "";
36
+ switch (entry.event.type) {
37
+ case "run_started":
38
+ details = chalk.dim(`spell=${entry.event.spellId}`);
39
+ break;
40
+ case "run_completed":
41
+ details = entry.event.success ? chalk.green("success") : chalk.red("failed");
42
+ break;
43
+ case "run_failed":
44
+ details = chalk.red(entry.event.error);
45
+ break;
46
+ case "step_started":
47
+ details = chalk.dim(`step=${entry.event.stepId} kind=${entry.event.kind}`);
48
+ break;
49
+ case "step_completed":
50
+ details = chalk.dim(`step=${entry.event.stepId}`);
51
+ break;
52
+ case "step_failed":
53
+ details = chalk.red(`step=${entry.event.stepId} error=${entry.event.error}`);
54
+ break;
55
+ case "step_skipped":
56
+ details = chalk.yellow(`step=${entry.event.stepId} reason=${entry.event.reason}`);
57
+ break;
58
+ case "binding_set":
59
+ details = chalk.dim(`${entry.event.name}=${JSON.stringify(entry.event.value)}`);
60
+ break;
61
+ case "guard_passed":
62
+ details = chalk.dim(`guard=${entry.event.guardId}`);
63
+ break;
64
+ case "guard_failed":
65
+ details = chalk.yellow(`guard=${entry.event.guardId} msg=${entry.event.message}`);
66
+ break;
67
+ case "action_simulated":
68
+ details = chalk.dim(`venue=${entry.event.venue}`);
69
+ break;
70
+ case "action_submitted":
71
+ details = chalk.dim(`tx=${entry.event.txHash}`);
72
+ break;
73
+ case "action_confirmed":
74
+ details = chalk.green(`tx=${entry.event.txHash} gas=${entry.event.gasUsed}`);
75
+ break;
76
+ case "action_reverted":
77
+ details = chalk.red(`tx=${entry.event.txHash} reason=${entry.event.reason}`);
78
+ break;
79
+ case "event_emitted":
80
+ details = chalk.dim(`event=${entry.event.event}`);
81
+ break;
82
+ case "constraint_evaluated":
83
+ details = chalk.dim(`step=${entry.event.stepId}`);
84
+ break;
85
+ default:
86
+ details = chalk.dim(JSON.stringify(entry.event));
87
+ }
88
+ console.log(` ${chalk.dim(time)} ${eventType} ${details}`);
89
+ }
90
+ }
91
+ finally {
92
+ store.close();
93
+ }
94
+ }
95
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/commands/log.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Simulate Command
3
+ * Simulates spell execution (dry run)
4
+ */
5
+ interface SimulateOptions {
6
+ params?: string;
7
+ vault?: string;
8
+ chain?: string;
9
+ advisorSkillsDir?: string | string[];
10
+ stateDir?: string;
11
+ noState?: boolean;
12
+ }
13
+ export declare function simulateCommand(spellPath: string, options: SimulateOptions): Promise<void>;
14
+ export {};
15
+ //# sourceMappingURL=simulate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulate.d.ts","sourceRoot":"","sources":["../../src/commands/simulate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,UAAU,eAAe;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA4GhG"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Simulate Command
3
+ * Simulates spell execution (dry run)
4
+ */
5
+ import { compileFile, execute } from "@grimoirelabs/core";
6
+ import { adapters } from "@grimoirelabs/venues";
7
+ import chalk from "chalk";
8
+ import ora from "ora";
9
+ import { resolveAdvisorSkillsDirs } from "./advisor-skill-helpers.js";
10
+ import { withStatePersistence } from "./state-helpers.js";
11
+ export async function simulateCommand(spellPath, options) {
12
+ const spinner = ora(`Simulating ${spellPath}...`).start();
13
+ try {
14
+ // Parse params
15
+ let params = {};
16
+ if (options.params) {
17
+ try {
18
+ params = JSON.parse(options.params);
19
+ }
20
+ catch {
21
+ spinner.fail(chalk.red("Invalid params JSON"));
22
+ process.exit(1);
23
+ }
24
+ }
25
+ // Compile spell
26
+ spinner.text = "Compiling spell...";
27
+ const compileResult = await compileFile(spellPath);
28
+ if (!compileResult.success || !compileResult.ir) {
29
+ spinner.fail(chalk.red("Compilation failed"));
30
+ for (const error of compileResult.errors) {
31
+ console.log(chalk.red(` [${error.code}] ${error.message}`));
32
+ }
33
+ process.exit(1);
34
+ }
35
+ // Execute in simulation mode
36
+ spinner.text = "Executing simulation...";
37
+ const vault = (options.vault ?? "0x0000000000000000000000000000000000000000");
38
+ const chain = Number.parseInt(options.chain ?? "1", 10);
39
+ const spell = compileResult.ir;
40
+ const advisorSkillsDirs = resolveAdvisorSkillsDirs(options.advisorSkillsDir);
41
+ const result = await withStatePersistence(spell.id, { stateDir: options.stateDir, noState: options.noState }, async (persistentState) => {
42
+ return execute({
43
+ spell,
44
+ vault,
45
+ chain,
46
+ params,
47
+ persistentState,
48
+ simulate: true,
49
+ adapters,
50
+ advisorSkillsDirs,
51
+ });
52
+ });
53
+ // Report result
54
+ if (result.success) {
55
+ spinner.succeed(chalk.green("Simulation completed successfully"));
56
+ }
57
+ else {
58
+ spinner.fail(chalk.red(`Simulation failed: ${result.error}`));
59
+ }
60
+ // Show execution summary
61
+ console.log();
62
+ console.log(chalk.cyan("Execution Summary:"));
63
+ console.log(chalk.dim(` Run ID: ${result.runId}`));
64
+ console.log(chalk.dim(` Duration: ${result.duration}ms`));
65
+ console.log(chalk.dim(` Steps executed: ${result.metrics.stepsExecuted}`));
66
+ console.log(chalk.dim(` Actions executed: ${result.metrics.actionsExecuted}`));
67
+ console.log(chalk.dim(` Errors: ${result.metrics.errors}`));
68
+ // Show final state
69
+ if (Object.keys(result.finalState).length > 0) {
70
+ console.log();
71
+ console.log(chalk.cyan("Final State:"));
72
+ console.log(chalk.dim(JSON.stringify(result.finalState, null, 2)));
73
+ }
74
+ // Show events
75
+ console.log();
76
+ console.log(chalk.cyan("Event Log:"));
77
+ for (const entry of result.ledgerEvents.slice(-10)) {
78
+ const time = new Date(entry.timestamp).toISOString().split("T")[1]?.replace("Z", "");
79
+ const eventType = chalk.blue(entry.event.type.padEnd(20));
80
+ let details = "";
81
+ if (entry.event.type === "step_started") {
82
+ details = chalk.dim(`step=${entry.event.stepId}`);
83
+ }
84
+ else if (entry.event.type === "step_completed") {
85
+ details = chalk.dim(`step=${entry.event.stepId}`);
86
+ }
87
+ else if (entry.event.type === "step_failed") {
88
+ details = chalk.red(`step=${entry.event.stepId} error=${entry.event.error}`);
89
+ }
90
+ else if (entry.event.type === "binding_set") {
91
+ details = chalk.dim(`${entry.event.name}=${JSON.stringify(entry.event.value)}`);
92
+ }
93
+ else if (entry.event.type === "guard_failed") {
94
+ details = chalk.yellow(`guard=${entry.event.guardId} msg=${entry.event.message}`);
95
+ }
96
+ console.log(` ${chalk.dim(time)} ${eventType} ${details}`);
97
+ }
98
+ if (result.ledgerEvents.length > 10) {
99
+ console.log(chalk.dim(` ... and ${result.ledgerEvents.length - 10} more events`));
100
+ }
101
+ if (!result.success) {
102
+ process.exit(1);
103
+ }
104
+ }
105
+ catch (error) {
106
+ spinner.fail(chalk.red(`Simulation failed: ${error.message}`));
107
+ process.exit(1);
108
+ }
109
+ }
110
+ //# sourceMappingURL=simulate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulate.js","sourceRoot":"","sources":["../../src/commands/simulate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Shared state persistence helpers for CLI commands
3
+ */
4
+ import { type ExecutionResult } from "@grimoirelabs/core";
5
+ interface StatePersistenceOptions {
6
+ stateDir?: string;
7
+ noState?: boolean;
8
+ }
9
+ /**
10
+ * Wraps an execution function with state load/save lifecycle.
11
+ *
12
+ * 1. Load persistent state from the store
13
+ * 2. Call executeFn with the loaded state
14
+ * 3. Save updated state, run record, and ledger
15
+ */
16
+ export declare function withStatePersistence(spellId: string, options: StatePersistenceOptions, executeFn: (persistentState: Record<string, unknown>) => Promise<ExecutionResult>): Promise<ExecutionResult>;
17
+ export {};
18
+ //# sourceMappingURL=state-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-helpers.d.ts","sourceRoot":"","sources":["../../src/commands/state-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,KAAK,eAAe,EAAqC,MAAM,oBAAoB,CAAC;AAE7F,UAAU,uBAAuB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,uBAAuB,EAChC,SAAS,EAAE,CAAC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,eAAe,CAAC,GAChF,OAAO,CAAC,eAAe,CAAC,CAyB1B"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Shared state persistence helpers for CLI commands
3
+ */
4
+ import { join } from "node:path";
5
+ import { SqliteStateStore, createRunRecord } from "@grimoirelabs/core";
6
+ /**
7
+ * Wraps an execution function with state load/save lifecycle.
8
+ *
9
+ * 1. Load persistent state from the store
10
+ * 2. Call executeFn with the loaded state
11
+ * 3. Save updated state, run record, and ledger
12
+ */
13
+ export async function withStatePersistence(spellId, options, executeFn) {
14
+ if (options.noState) {
15
+ return executeFn({});
16
+ }
17
+ const dbPath = options.stateDir ? join(options.stateDir, "grimoire.db") : undefined;
18
+ const store = new SqliteStateStore({ dbPath });
19
+ try {
20
+ // Load existing state
21
+ const persistentState = (await store.load(spellId)) ?? {};
22
+ // Execute
23
+ const result = await executeFn(persistentState);
24
+ // Persist results
25
+ await store.save(spellId, result.finalState);
26
+ await store.addRun(spellId, createRunRecord(result));
27
+ await store.saveLedger(spellId, result.runId, result.ledgerEvents);
28
+ return result;
29
+ }
30
+ finally {
31
+ store.close();
32
+ }
33
+ }
34
+ //# sourceMappingURL=state-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-helpers.js","sourceRoot":"","sources":["../../src/commands/state-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAwB,gBAAgB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAO7F;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAe,EACf,OAAgC,EAChC,SAAiF;IAEjF,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,SAAS,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEpF,MAAM,KAAK,GAAG,IAAI,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAE/C,IAAI,CAAC;QACH,sBAAsB;QACtB,MAAM,eAAe,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAE1D,UAAU;QACV,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,eAAe,CAAC,CAAC;QAEhD,kBAAkB;QAClB,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QAC7C,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;QACrD,MAAM,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;QAEnE,OAAO,MAAM,CAAC;IAChB,CAAC;YAAS,CAAC;QACT,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Validate Command
3
+ * Validates a .spell file
4
+ */
5
+ interface ValidateOptions {
6
+ strict?: boolean;
7
+ }
8
+ export declare function validateCommand(spellPath: string, options: ValidateOptions): Promise<void>;
9
+ export {};
10
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,UAAU,eAAe;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAgEhG"}