@aura-protocol/cli 0.1.3 → 0.3.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 (110) hide show
  1. package/README.md +84 -53
  2. package/bin/aura.js +0 -0
  3. package/dist/commands/confidential.d.ts +1 -1
  4. package/dist/commands/confidential.js +280 -325
  5. package/dist/commands/confidential.js.map +1 -1
  6. package/dist/commands/config.d.ts +1 -1
  7. package/dist/commands/config.js +26 -8
  8. package/dist/commands/config.js.map +1 -1
  9. package/dist/commands/dashboard.d.ts +1 -1
  10. package/dist/commands/dashboard.js +6 -7
  11. package/dist/commands/dashboard.js.map +1 -1
  12. package/dist/commands/dwallet.d.ts +1 -1
  13. package/dist/commands/dwallet.js +52 -41
  14. package/dist/commands/dwallet.js.map +1 -1
  15. package/dist/commands/execution.d.ts +1 -1
  16. package/dist/commands/execution.js +111 -175
  17. package/dist/commands/execution.js.map +1 -1
  18. package/dist/commands/features.d.ts +1 -1
  19. package/dist/commands/features.js +15 -10
  20. package/dist/commands/features.js.map +1 -1
  21. package/dist/commands/generated.d.ts +20 -0
  22. package/dist/commands/generated.js +61 -0
  23. package/dist/commands/generated.js.map +1 -0
  24. package/dist/commands/governance.d.ts +1 -1
  25. package/dist/commands/governance.js +113 -99
  26. package/dist/commands/governance.js.map +1 -1
  27. package/dist/commands/helpers.d.ts +5 -2
  28. package/dist/commands/helpers.js +79 -16
  29. package/dist/commands/helpers.js.map +1 -1
  30. package/dist/commands/instruction-exec.d.ts +27 -0
  31. package/dist/commands/instruction-exec.js +171 -0
  32. package/dist/commands/instruction-exec.js.map +1 -0
  33. package/dist/commands/instruction.d.ts +9 -0
  34. package/dist/commands/instruction.js +81 -0
  35. package/dist/commands/instruction.js.map +1 -0
  36. package/dist/commands/pda.d.ts +1 -1
  37. package/dist/commands/pda.js +15 -7
  38. package/dist/commands/pda.js.map +1 -1
  39. package/dist/commands/treasury.d.ts +1 -1
  40. package/dist/commands/treasury.js +201 -186
  41. package/dist/commands/treasury.js.map +1 -1
  42. package/dist/core/config.d.ts +35 -0
  43. package/dist/core/config.js +97 -0
  44. package/dist/core/config.js.map +1 -0
  45. package/dist/core/context.d.ts +51 -0
  46. package/dist/core/context.js +60 -0
  47. package/dist/core/context.js.map +1 -0
  48. package/dist/core/errors.d.ts +38 -0
  49. package/dist/core/errors.js +138 -0
  50. package/dist/core/errors.js.map +1 -0
  51. package/dist/core/network.d.ts +18 -0
  52. package/dist/core/network.js +38 -0
  53. package/dist/core/network.js.map +1 -0
  54. package/dist/core/runner.d.ts +45 -0
  55. package/dist/core/runner.js +219 -0
  56. package/dist/core/runner.js.map +1 -0
  57. package/dist/core/security.d.ts +28 -0
  58. package/dist/core/security.js +83 -0
  59. package/dist/core/security.js.map +1 -0
  60. package/dist/core/wallet.d.ts +2 -0
  61. package/dist/core/wallet.js +21 -0
  62. package/dist/core/wallet.js.map +1 -0
  63. package/dist/index.js +56 -13
  64. package/dist/index.js.map +1 -1
  65. package/dist/lib/domain.d.ts +16 -0
  66. package/dist/lib/domain.js +88 -0
  67. package/dist/lib/domain.js.map +1 -0
  68. package/dist/lib/ika.d.ts +81 -0
  69. package/dist/lib/ika.js +192 -0
  70. package/dist/lib/ika.js.map +1 -0
  71. package/dist/lib/instructions.d.ts +79 -0
  72. package/dist/lib/instructions.js +421 -0
  73. package/dist/lib/instructions.js.map +1 -0
  74. package/dist/lib/protocol.d.ts +99 -0
  75. package/dist/lib/protocol.js +327 -0
  76. package/dist/lib/protocol.js.map +1 -0
  77. package/dist/lib/treasury-view.d.ts +11 -0
  78. package/dist/lib/treasury-view.js +126 -0
  79. package/dist/lib/treasury-view.js.map +1 -0
  80. package/dist/program-instructions.d.ts +1 -1
  81. package/dist/ui/dashboard.d.ts +7 -0
  82. package/dist/ui/dashboard.js +99 -0
  83. package/dist/ui/dashboard.js.map +1 -0
  84. package/dist/ui/format.d.ts +9 -0
  85. package/dist/ui/format.js +92 -0
  86. package/dist/ui/format.js.map +1 -0
  87. package/dist/ui/output.d.ts +58 -0
  88. package/dist/ui/output.js +208 -0
  89. package/dist/ui/output.js.map +1 -0
  90. package/dist/ui/theme.d.ts +52 -0
  91. package/dist/ui/theme.js +110 -0
  92. package/dist/ui/theme.js.map +1 -0
  93. package/dist/vendor/encrypt/generated/grpc/encrypt_service.d.ts +1 -1
  94. package/dist/vendor/encrypt/generated/grpc/encrypt_service.js +36 -13
  95. package/dist/vendor/encrypt/generated/grpc/encrypt_service.js.map +1 -1
  96. package/dist/vendor/encrypt/grpc.d.ts +2 -2
  97. package/dist/vendor/encrypt/grpc.js +1 -3
  98. package/dist/vendor/encrypt/grpc.js.map +1 -1
  99. package/dist/vendor/ika/bcs-types.js +107 -50
  100. package/dist/vendor/ika/bcs-types.js.map +1 -1
  101. package/dist/vendor/ika/generated/grpc/ika_dwallet.d.ts +1 -1
  102. package/dist/vendor/ika/generated/grpc/ika_dwallet.js +14 -4
  103. package/dist/vendor/ika/generated/grpc/ika_dwallet.js.map +1 -1
  104. package/dist/vendor/ika/grpc.d.ts +1 -1
  105. package/dist/vendor/ika/grpc.js +49 -24
  106. package/dist/vendor/ika/grpc.js.map +1 -1
  107. package/package.json +15 -12
  108. package/dist/ascii.d.ts +0 -1
  109. package/dist/ascii.js +0 -2
  110. package/dist/ascii.js.map +0 -1
@@ -0,0 +1,219 @@
1
+ /**
2
+ * The secure transaction pipeline shared by every command that writes
3
+ * on-chain. Given built instructions and some metadata it will, in order:
4
+ *
5
+ * 1. assemble the transaction (compute-budget + optional heap frame),
6
+ * 2. render a human preview of exactly what will be signed,
7
+ * 3. guard production (mainnet) writes behind an explicit confirmation,
8
+ * 4. confirm sensitive instructions (authority/governance/closures),
9
+ * 5. preflight-simulate and surface compute units + program logs,
10
+ * 6. sign, send, and confirm, printing the signature + explorer link.
11
+ *
12
+ * `--dry-run` stops after the preview and emits the serialized instructions.
13
+ * `--json` suppresses decorative output and returns structured data.
14
+ * `--yes` skips confirmations (for CI). `--no-simulate` skips preflight.
15
+ */
16
+ import { confirm } from "@inquirer/prompts";
17
+ import { ComputeBudgetProgram, Transaction, } from "@solana/web3.js";
18
+ import { emitJson, printNote, printPanel, printSuccess, serializeInstruction, startSpinner, } from "../ui/output.js";
19
+ import { block, style, symbol } from "../ui/theme.js";
20
+ import { CliError } from "./errors.js";
21
+ import { classifyInstructionRisk } from "./security.js";
22
+ const DEFAULT_COMPUTE_UNIT_LIMIT = 600_000;
23
+ function networkBadge(ctx) {
24
+ const { kind, label } = ctx.network;
25
+ if (kind === "mainnet")
26
+ return block(label.toUpperCase(), "danger");
27
+ if (kind === "devnet")
28
+ return block(label, "success");
29
+ if (kind === "localnet")
30
+ return block(label, "muted");
31
+ return block(label, "warn");
32
+ }
33
+ function explorerUrl(ctx, signature) {
34
+ const base = `https://explorer.solana.com/tx/${signature}`;
35
+ switch (ctx.network.kind) {
36
+ case "mainnet":
37
+ return base;
38
+ case "devnet":
39
+ return `${base}?cluster=devnet`;
40
+ case "testnet":
41
+ return `${base}?cluster=testnet`;
42
+ default:
43
+ return `${base}?cluster=custom&customUrl=${encodeURIComponent(ctx.network.rpcUrl)}`;
44
+ }
45
+ }
46
+ function renderPreview(ctx, instructions, meta) {
47
+ const lines = [];
48
+ lines.push(`${style.muted("network")} ${networkBadge(ctx)} ${style.dim(ctx.network.rpcUrl)}`);
49
+ lines.push(`${style.muted("program")} ${style.dim(ctx.programId.toBase58())}`);
50
+ if (ctx.wallet) {
51
+ lines.push(`${style.muted("payer")} ${ctx.wallet.publicKey.toBase58()}`);
52
+ }
53
+ for (const [label, value] of meta.summary ?? []) {
54
+ lines.push(`${style.muted(label.padEnd(9))} ${value}`);
55
+ }
56
+ lines.push(style.muted("─".repeat(40)));
57
+ instructions.forEach((ix, index) => {
58
+ const signers = ix.keys.filter((k) => k.isSigner).length;
59
+ const writable = ix.keys.filter((k) => k.isWritable).length;
60
+ lines.push(`${style.bold(`#${index + 1}`)} ${style.dim(ix.programId.toBase58())} ` +
61
+ style.muted(`(${ix.keys.length} accts · ${signers} signer · ${writable} writable)`));
62
+ });
63
+ printPanel(ctx.output, `${meta.action}`, lines, ctx.network.isProduction ? "danger" : "primary");
64
+ }
65
+ async function confirmOrThrow(ctx, message) {
66
+ if (ctx.flags.yes) {
67
+ return true;
68
+ }
69
+ if (!process.stdout.isTTY) {
70
+ throw new CliError(`Confirmation required: ${message}`, {
71
+ code: "CONFIRMATION_REQUIRED",
72
+ tip: "Re-run with --yes to proceed non-interactively.",
73
+ });
74
+ }
75
+ return await confirm({ message, default: false });
76
+ }
77
+ async function preflightSimulate(ctx, tx) {
78
+ const spinner = startSpinner(ctx.output, "Simulating transaction...");
79
+ try {
80
+ const result = await ctx.connection.simulateTransaction(tx);
81
+ const units = result.value.unitsConsumed;
82
+ if (result.value.err) {
83
+ const logs = (result.value.logs ?? []).join("\n");
84
+ spinner.fail("Simulation failed");
85
+ throw new CliError(`Preflight simulation failed: ${JSON.stringify(result.value.err)}`, {
86
+ code: "SIMULATION_FAILED",
87
+ tip: "Inspect the program logs above. Use --no-simulate to skip this check, or --dry-run to inspect the instruction.",
88
+ details: logs || undefined,
89
+ });
90
+ }
91
+ spinner.succeed(units !== null && units !== undefined
92
+ ? `Simulation ok (${units.toLocaleString()} compute units)`
93
+ : "Simulation ok");
94
+ }
95
+ catch (error) {
96
+ if (error instanceof CliError) {
97
+ throw error;
98
+ }
99
+ spinner.fail("Simulation error");
100
+ throw new CliError(`Could not simulate transaction: ${error instanceof Error ? error.message : String(error)}`, {
101
+ code: "SIMULATION_ERROR",
102
+ tip: "Pass --no-simulate to skip the preflight check.",
103
+ cause: error,
104
+ });
105
+ }
106
+ }
107
+ /**
108
+ * Builds, previews, guards, simulates, signs, and sends `instructions`.
109
+ * Honors `--dry-run`, `--json`, `--yes`, `--no-simulate`, and `--compute-units`.
110
+ */
111
+ export async function runInstructions(ctx, instructions, meta) {
112
+ if (!ctx.wallet) {
113
+ throw new CliError(`A wallet is required to ${meta.action.toLowerCase()}.`, {
114
+ code: "WALLET_REQUIRED",
115
+ tip: "Configure a wallet with `aura config init` or pass --wallet <path>.",
116
+ });
117
+ }
118
+ const computeUnits = ctx.flags.computeUnits ?? meta.computeUnits ?? DEFAULT_COMPUTE_UNIT_LIMIT;
119
+ const budgetIxns = [
120
+ ComputeBudgetProgram.setComputeUnitLimit({ units: computeUnits }),
121
+ ];
122
+ if (meta.heapFrameBytes) {
123
+ budgetIxns.unshift(ComputeBudgetProgram.requestHeapFrame({ bytes: meta.heapFrameBytes }));
124
+ }
125
+ renderPreview(ctx, instructions, meta);
126
+ // --- Dry run: stop before sending. ------------------------------------
127
+ if (ctx.dryRun) {
128
+ if (ctx.output.json) {
129
+ emitJson(ctx.output, {
130
+ action: meta.action,
131
+ dryRun: true,
132
+ network: ctx.network.label,
133
+ instructions: instructions.map(serializeInstruction),
134
+ ...meta.result,
135
+ });
136
+ }
137
+ else {
138
+ printNote(ctx.output, "Dry run — transaction was not sent.");
139
+ }
140
+ return { dryRun: true, aborted: false };
141
+ }
142
+ // --- Guard rails: confirmations. --------------------------------------
143
+ const risk = meta.instructionName
144
+ ? classifyInstructionRisk(meta.instructionName)
145
+ : { level: "normal" };
146
+ if (ctx.network.isProduction) {
147
+ printPanel(ctx.output, "Production network", [
148
+ style.danger(`${symbol.warn} You are about to send a transaction on MAINNET.`),
149
+ style.muted("This spends real funds and cannot be undone."),
150
+ ], "danger");
151
+ const ok = await confirmOrThrow(ctx, "Proceed on mainnet-beta?");
152
+ if (!ok) {
153
+ printNote(ctx.output, "Aborted.");
154
+ return { dryRun: false, aborted: true };
155
+ }
156
+ }
157
+ if (meta.confirm || risk.level !== "normal") {
158
+ const reason = risk.reason ? ` (${risk.reason})` : "";
159
+ const ok = await confirmOrThrow(ctx, `Confirm "${meta.action}"${reason}?`);
160
+ if (!ok) {
161
+ printNote(ctx.output, "Aborted.");
162
+ return { dryRun: false, aborted: true };
163
+ }
164
+ }
165
+ // --- Assemble + sign. -------------------------------------------------
166
+ const extraSigners = meta.extraSigners ?? [];
167
+ const tx = new Transaction().add(...budgetIxns, ...instructions);
168
+ tx.feePayer = ctx.wallet.publicKey;
169
+ const latest = await ctx.connection.getLatestBlockhash("confirmed");
170
+ tx.recentBlockhash = latest.blockhash;
171
+ tx.sign(ctx.wallet, ...extraSigners);
172
+ // --- Preflight simulation. --------------------------------------------
173
+ if (ctx.flags.simulate) {
174
+ await preflightSimulate(ctx, tx);
175
+ }
176
+ // --- Send + confirm. --------------------------------------------------
177
+ const spinner = startSpinner(ctx.output, `Sending: ${meta.action}...`);
178
+ let signature;
179
+ try {
180
+ signature = await ctx.connection.sendRawTransaction(tx.serialize(), {
181
+ preflightCommitment: "confirmed",
182
+ });
183
+ const confirmation = await ctx.connection.confirmTransaction({
184
+ signature,
185
+ blockhash: latest.blockhash,
186
+ lastValidBlockHeight: latest.lastValidBlockHeight,
187
+ }, "confirmed");
188
+ if (confirmation.value.err) {
189
+ spinner.fail("Transaction failed");
190
+ throw new CliError(`Transaction ${signature} failed on-chain.`, {
191
+ code: "TX_FAILED",
192
+ tip: "Re-run with --dry-run to inspect the instruction, or check the explorer link.",
193
+ details: explorerUrl(ctx, signature),
194
+ });
195
+ }
196
+ spinner.succeed(`${meta.action} confirmed`);
197
+ }
198
+ catch (error) {
199
+ if (error instanceof CliError)
200
+ throw error;
201
+ spinner.fail("Send failed");
202
+ throw new CliError(`Failed to send transaction: ${error instanceof Error ? error.message : String(error)}`, { code: "SEND_FAILED", cause: error });
203
+ }
204
+ if (ctx.output.json) {
205
+ emitJson(ctx.output, {
206
+ action: meta.action,
207
+ signature,
208
+ network: ctx.network.label,
209
+ explorer: explorerUrl(ctx, signature),
210
+ ...meta.result,
211
+ });
212
+ }
213
+ else {
214
+ printSuccess(ctx.output, `${meta.action} — ${signature}`);
215
+ printNote(ctx.output, explorerUrl(ctx, signature));
216
+ }
217
+ return { dryRun: false, aborted: false, signature };
218
+ }
219
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/core/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Security helpers: keypair file hygiene and instruction risk classification.
3
+ *
4
+ * These feed the runner's guard rails. None of them block legitimate use; they
5
+ * surface warnings and decide when an explicit confirmation is warranted.
6
+ */
7
+ export type RiskLevel = "normal" | "caution" | "danger";
8
+ export interface InstructionRisk {
9
+ level: RiskLevel;
10
+ /** Why the instruction is sensitive — shown in the confirmation prompt. */
11
+ reason?: string;
12
+ }
13
+ /**
14
+ * Classifies a (snake_case) instruction name by blast radius so the runner can
15
+ * decide whether to require confirmation. This is intentionally conservative:
16
+ * authority changes, recovery, shutdowns, and account closures all prompt.
17
+ */
18
+ export declare function classifyInstructionRisk(name: string): InstructionRisk;
19
+ export interface WalletHygiene {
20
+ /** A warning to surface, or null when the file looks fine / unchecked. */
21
+ warning: string | null;
22
+ }
23
+ /**
24
+ * Checks keypair file permissions on POSIX systems. A keypair readable by group
25
+ * or others is a credential-leak risk. No-ops on Windows, where POSIX mode bits
26
+ * do not apply.
27
+ */
28
+ export declare function checkWalletFileHygiene(walletPath: string): WalletHygiene;
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Security helpers: keypair file hygiene and instruction risk classification.
3
+ *
4
+ * These feed the runner's guard rails. None of them block legitimate use; they
5
+ * surface warnings and decide when an explicit confirmation is warranted.
6
+ */
7
+ import { statSync } from "node:fs";
8
+ import { expandHome } from "./config.js";
9
+ /**
10
+ * Classifies a (snake_case) instruction name by blast radius so the runner can
11
+ * decide whether to require confirmation. This is intentionally conservative:
12
+ * authority changes, recovery, shutdowns, and account closures all prompt.
13
+ */
14
+ export function classifyInstructionRisk(name) {
15
+ const n = name.toLowerCase();
16
+ // Highest blast radius: emergency, ownership, recovery, kill-switches.
17
+ if (n.includes("emergency") || n.includes("shutdown")) {
18
+ return {
19
+ level: "danger",
20
+ reason: "emergency action affecting treasury availability",
21
+ };
22
+ }
23
+ if (n.startsWith("break_glass")) {
24
+ return { level: "danger", reason: "break-glass recovery override" };
25
+ }
26
+ if (n.includes("transfer_authority") ||
27
+ n.includes("ownership_handover") ||
28
+ n.startsWith("nominate_successor")) {
29
+ return { level: "danger", reason: "changes treasury ownership/authority" };
30
+ }
31
+ if (n.includes("dead_mans_switch")) {
32
+ return { level: "danger", reason: "triggers the dead-man's switch" };
33
+ }
34
+ if (n.includes("revoke") || n.includes("rotate")) {
35
+ return {
36
+ level: "danger",
37
+ reason: "revokes or rotates an authority/credential",
38
+ };
39
+ }
40
+ // Governance and recovery configuration: sensitive but routine.
41
+ if (n.includes("multisig") ||
42
+ n.includes("override") ||
43
+ n.includes("recovery_destination") ||
44
+ n.includes("guardian") ||
45
+ n.startsWith("configure_trust") ||
46
+ n.includes("operator_role")) {
47
+ return { level: "caution", reason: "modifies governance / access control" };
48
+ }
49
+ // Account closures (reclaim rent, drop state) and migrations.
50
+ if (n.startsWith("close_") ||
51
+ n.startsWith("remove_") ||
52
+ n.startsWith("migrate_") ||
53
+ n === "disable_confidential_guardrails") {
54
+ return { level: "caution", reason: "closes or removes on-chain state" };
55
+ }
56
+ return { level: "normal" };
57
+ }
58
+ /**
59
+ * Checks keypair file permissions on POSIX systems. A keypair readable by group
60
+ * or others is a credential-leak risk. No-ops on Windows, where POSIX mode bits
61
+ * do not apply.
62
+ */
63
+ export function checkWalletFileHygiene(walletPath) {
64
+ if (process.platform === "win32") {
65
+ return { warning: null };
66
+ }
67
+ try {
68
+ const resolved = expandHome(walletPath);
69
+ const mode = statSync(resolved).mode & 0o777;
70
+ if ((mode & 0o077) !== 0) {
71
+ const octal = mode.toString(8).padStart(3, "0");
72
+ return {
73
+ warning: `Keypair ${resolved} is readable by group/others (mode ${octal}). Run: chmod 600 ${resolved}`,
74
+ };
75
+ }
76
+ }
77
+ catch {
78
+ // File missing or unreadable — surfaced elsewhere when actually loaded.
79
+ return { warning: null };
80
+ }
81
+ return { warning: null };
82
+ }
83
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/core/security.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Keypair } from "@solana/web3.js";
2
+ export declare function loadKeypair(walletPath: string): Keypair;
@@ -0,0 +1,21 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { Keypair } from "@solana/web3.js";
3
+ import { expandHome } from "./config.js";
4
+ export function loadKeypair(walletPath) {
5
+ const resolvedPath = expandHome(walletPath);
6
+ let secret;
7
+ try {
8
+ secret = new Uint8Array(JSON.parse(readFileSync(resolvedPath, "utf8")));
9
+ }
10
+ catch {
11
+ throw new Error(`Could not load wallet keypair from ${resolvedPath}. ` +
12
+ `Run 'aura config init' or pass --wallet /path/to/id.json.`);
13
+ }
14
+ try {
15
+ return Keypair.fromSecretKey(secret);
16
+ }
17
+ catch {
18
+ throw new Error(`Wallet file at ${resolvedPath} is not a valid Solana keypair JSON array.`);
19
+ }
20
+ }
21
+ //# sourceMappingURL=wallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/core/wallet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,WAAW,CAAC,UAAkB;IAC5C,MAAM,YAAY,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAE5C,IAAI,MAAkB,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,UAAU,CACrB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAa,CAC3D,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,sCAAsC,YAAY,IAAI;YACpD,2DAA2D,CAC9D,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,kBAAkB,YAAY,4CAA4C,CAC3E,CAAC;IACJ,CAAC;AACH,CAAC"}
package/dist/index.js CHANGED
@@ -1,50 +1,93 @@
1
+ import { createRequire } from "node:module";
1
2
  import { Command } from "commander";
2
- import chalk from "chalk";
3
3
  import { registerConfidentialCommands } from "./commands/confidential.js";
4
4
  import { registerConfigCommands } from "./commands/config.js";
5
5
  import { registerDashboardCommand } from "./commands/dashboard.js";
6
6
  import { registerDwalletCommands } from "./commands/dwallet.js";
7
7
  import { registerExecutionCommands } from "./commands/execution.js";
8
8
  import { registerFeatureCommands } from "./commands/features.js";
9
+ import { registerGeneratedCommands } from "./commands/generated.js";
9
10
  import { registerGovernanceCommands } from "./commands/governance.js";
10
- import { registerInstructionCommands } from "./commands/instructions.js";
11
+ import { registerInstructionCommands } from "./commands/instruction.js";
11
12
  import { registerPdaCommands } from "./commands/pda.js";
12
13
  import { registerTreasuryCommands } from "./commands/treasury.js";
13
- import { ACTIVE_DEVELOPMENT_WARNING, printError } from "./output.js";
14
+ import { resolveGlobalConfig } from "./core/context.js";
15
+ import { renderError } from "./core/errors.js";
16
+ import { checkWalletFileHygiene } from "./core/security.js";
17
+ import { ACTIVE_DEVELOPMENT_WARNING, printWarn } from "./ui/output.js";
18
+ import { block, setColorEnabled } from "./ui/theme.js";
19
+ // Read the version from package.json at runtime so it can never drift from the
20
+ // published package. Resolves to the package root from both dist/ and src/.
21
+ const require = createRequire(import.meta.url);
22
+ const VERSION = require("../package.json").version;
14
23
  export function createProgram() {
15
24
  const program = new Command();
16
25
  program
17
26
  .name("aura")
18
- .description("Production-grade CLI for the AURA autonomous treasury program")
19
- .version("0.1.0")
27
+ .description("Production-grade CLI for the AURA autonomous treasury program on Solana")
28
+ .version(VERSION, "-v, --version", "print the CLI version")
20
29
  .showHelpAfterError()
21
30
  .showSuggestionAfterError()
22
- .option("--rpc-url <url>", "override RPC endpoint")
23
- .option("--wallet <path>", "override keypair file path")
24
- .option("--program-id <id>", "override AURA program ID")
31
+ .option("--rpc-url <url>", "override the RPC endpoint")
32
+ .option("--wallet <path>", "override the keypair file path")
33
+ .option("--program-id <id>", "override the AURA program ID")
25
34
  .option("--cluster <name>", "cluster label for display")
26
35
  .option("--json", "output machine-readable JSON")
27
36
  .option("--quiet", "suppress non-error terminal output")
28
- .option("--dry-run", "build and display the instruction without sending")
29
- .addHelpText("afterAll", `\n${chalk.yellow.bold("warning")}: ${ACTIVE_DEVELOPMENT_WARNING}`);
37
+ .option("--dry-run", "build and preview the transaction without sending")
38
+ .option("-y, --yes", "skip confirmation prompts (non-interactive)")
39
+ .option("--no-simulate", "skip the preflight simulation before sending")
40
+ .option("--no-color", "disable colored output")
41
+ .option("--compute-units <n>", "override the compute-unit limit", (value) => Number(value))
42
+ .addHelpText("afterAll", () => `\n${block("WARNING", "warn")} ${ACTIVE_DEVELOPMENT_WARNING}`);
43
+ // Best-effort keypair hygiene warning before any command runs.
44
+ program.hook("preAction", (thisCommand) => {
45
+ const opts = thisCommand.opts();
46
+ if (opts.json === true || opts.quiet === true) {
47
+ return;
48
+ }
49
+ try {
50
+ const { config } = resolveGlobalConfig(thisCommand);
51
+ const hygiene = checkWalletFileHygiene(config.walletPath);
52
+ if (hygiene.warning) {
53
+ printWarn({ json: false, quiet: false }, hygiene.warning);
54
+ }
55
+ }
56
+ catch {
57
+ // Never let a preflight warning block a command.
58
+ }
59
+ });
30
60
  registerConfigCommands(program);
31
61
  registerTreasuryCommands(program);
32
62
  registerDwalletCommands(program);
33
63
  registerConfidentialCommands(program);
34
64
  registerExecutionCommands(program);
35
- registerFeatureCommands(program);
36
- registerInstructionCommands(program);
37
65
  registerGovernanceCommands(program);
66
+ registerFeatureCommands(program);
38
67
  registerPdaCommands(program);
39
68
  registerDashboardCommand(program);
69
+ registerInstructionCommands(program);
70
+ // Generated per-domain instruction commands provide complete coverage of
71
+ // every program instruction. Registered last so they merge into the
72
+ // ergonomic command groups above without clobbering their friendly verbs.
73
+ registerGeneratedCommands(program);
40
74
  return program;
41
75
  }
76
+ /** Disables color early (before help/preview render) for --no-color / --json / NO_COLOR. */
77
+ function configureColor(argv) {
78
+ if (argv.includes("--no-color") ||
79
+ argv.includes("--json") ||
80
+ process.env.NO_COLOR !== undefined) {
81
+ setColorEnabled(false);
82
+ }
83
+ }
42
84
  export async function main(argv = process.argv) {
85
+ configureColor(argv);
43
86
  try {
44
87
  await createProgram().parseAsync(argv);
45
88
  }
46
89
  catch (error) {
47
- printError(error);
90
+ renderError(error);
48
91
  process.exitCode = 1;
49
92
  }
50
93
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAErE,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,MAAM,CAAC;SACZ,WAAW,CAAC,+DAA+D,CAAC;SAC5E,OAAO,CAAC,OAAO,CAAC;SAChB,kBAAkB,EAAE;SACpB,wBAAwB,EAAE;SAC1B,MAAM,CAAC,iBAAiB,EAAE,uBAAuB,CAAC;SAClD,MAAM,CAAC,iBAAiB,EAAE,4BAA4B,CAAC;SACvD,MAAM,CAAC,mBAAmB,EAAE,0BAA0B,CAAC;SACvD,MAAM,CAAC,kBAAkB,EAAE,2BAA2B,CAAC;SACvD,MAAM,CAAC,QAAQ,EAAE,8BAA8B,CAAC;SAChD,MAAM,CAAC,SAAS,EAAE,oCAAoC,CAAC;SACvD,MAAM,CAAC,WAAW,EAAE,mDAAmD,CAAC;SACxE,WAAW,CACV,UAAU,EACV,KAAK,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,0BAA0B,EAAE,CACnE,CAAC;IAEJ,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAChC,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAClC,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACjC,4BAA4B,CAAC,OAAO,CAAC,CAAC;IACtC,yBAAyB,CAAC,OAAO,CAAC,CAAC;IACnC,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACjC,2BAA2B,CAAC,OAAO,CAAC,CAAC;IACrC,0BAA0B,CAAC,OAAO,CAAC,CAAC;IACpC,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7B,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAElC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI;IAC5C,IAAI,CAAC;QACH,MAAM,aAAa,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,CAAC,KAAK,CAAC,CAAC;QAClB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export declare function parseChain(input: string | number): number;
2
+ export declare function formatChain(code: number): string;
3
+ export declare function parseTransactionType(input: string | number): number;
4
+ export declare function formatTransactionType(code: number): string;
5
+ export declare function formatProposalStatus(code: number): string;
6
+ export declare function formatViolation(code: number): string;
7
+ export declare function chainNameForDigest(code: number): string;
8
+ export declare function transactionTypeNameForDigest(code: number): string;
9
+ export declare function listChainChoices(): {
10
+ name: string;
11
+ value: number;
12
+ }[];
13
+ export declare function listTransactionTypeChoices(): {
14
+ name: string;
15
+ value: number;
16
+ }[];
@@ -0,0 +1,88 @@
1
+ const CHAINS = [
2
+ { code: 0, name: "bitcoin", label: "Bitcoin" },
3
+ { code: 1, name: "ethereum", label: "Ethereum" },
4
+ { code: 2, name: "solana", label: "Solana" },
5
+ { code: 3, name: "polygon", label: "Polygon" },
6
+ { code: 4, name: "arbitrum", label: "Arbitrum" },
7
+ { code: 5, name: "optimism", label: "Optimism" },
8
+ ];
9
+ const TX_TYPES = [
10
+ { code: 0, name: "transfer", label: "Transfer" },
11
+ { code: 1, name: "defi_swap", label: "DeFi Swap" },
12
+ { code: 2, name: "lending_deposit", label: "Lending Deposit" },
13
+ { code: 3, name: "nft_purchase", label: "NFT Purchase" },
14
+ { code: 4, name: "contract_interaction", label: "Contract Interaction" },
15
+ ];
16
+ const PROPOSAL_STATUSES = [
17
+ { code: 0, label: "Proposed" },
18
+ { code: 1, label: "Decryption Requested" },
19
+ { code: 2, label: "Awaiting Signature" },
20
+ { code: 3, label: "Executed" },
21
+ { code: 4, label: "Denied" },
22
+ { code: 5, label: "Cancelled" },
23
+ { code: 6, label: "Expired" },
24
+ { code: 7, label: "Policy Computed" },
25
+ ];
26
+ const VIOLATIONS = [
27
+ { code: 0, label: "none" },
28
+ { code: 1, label: "per-tx limit" },
29
+ { code: 2, label: "daily limit" },
30
+ { code: 3, label: "bitcoin manual review" },
31
+ { code: 4, label: "time window" },
32
+ { code: 5, label: "velocity limit" },
33
+ { code: 6, label: "protocol not allowed" },
34
+ { code: 7, label: "slippage exceeded" },
35
+ { code: 8, label: "quote stale" },
36
+ { code: 9, label: "counterparty risk" },
37
+ { code: 10, label: "shared pool limit" },
38
+ ];
39
+ function entryFor(code, entries) {
40
+ return entries.find((entry) => entry.code === code);
41
+ }
42
+ function parseCode(input, entries, kind) {
43
+ const normalized = typeof input === "number" ? String(input) : input.trim().toLowerCase();
44
+ const direct = Number(normalized);
45
+ if (Number.isInteger(direct) &&
46
+ entries.some((entry) => entry.code === direct)) {
47
+ return direct;
48
+ }
49
+ const match = entries.find((entry) => entry.name === normalized || entry.label.toLowerCase() === normalized);
50
+ if (match) {
51
+ return match.code;
52
+ }
53
+ throw new Error(`Unknown ${kind}: ${input}`);
54
+ }
55
+ function labelFor(code, entries, fallback) {
56
+ return entries.find((entry) => entry.code === code)?.label ?? fallback;
57
+ }
58
+ export function parseChain(input) {
59
+ return parseCode(input, CHAINS, "chain");
60
+ }
61
+ export function formatChain(code) {
62
+ return labelFor(code, CHAINS, `Unknown (${code})`);
63
+ }
64
+ export function parseTransactionType(input) {
65
+ return parseCode(input, TX_TYPES, "transaction type");
66
+ }
67
+ export function formatTransactionType(code) {
68
+ return labelFor(code, TX_TYPES, `Unknown (${code})`);
69
+ }
70
+ export function formatProposalStatus(code) {
71
+ return labelFor(code, PROPOSAL_STATUSES, `Unknown (${code})`);
72
+ }
73
+ export function formatViolation(code) {
74
+ return labelFor(code, VIOLATIONS, `unknown (${code})`);
75
+ }
76
+ export function chainNameForDigest(code) {
77
+ return entryFor(code, CHAINS)?.name ?? `unknown_${code}`;
78
+ }
79
+ export function transactionTypeNameForDigest(code) {
80
+ return entryFor(code, TX_TYPES)?.name ?? `unknown_${code}`;
81
+ }
82
+ export function listChainChoices() {
83
+ return CHAINS.map((entry) => ({ name: entry.label, value: entry.code }));
84
+ }
85
+ export function listTransactionTypeChoices() {
86
+ return TX_TYPES.map((entry) => ({ name: entry.label, value: entry.code }));
87
+ }
88
+ //# sourceMappingURL=domain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain.js","sourceRoot":"","sources":["../../src/lib/domain.ts"],"names":[],"mappings":"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"}