@chainalert/cli 0.0.1
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/dist/alerts-STXD4TE5.js +134 -0
- package/dist/auth-6LTJFNU2.js +124 -0
- package/dist/channels-C5JZON37.js +179 -0
- package/dist/chunk-6FDEYAAT.js +27 -0
- package/dist/chunk-CE4DKHAY.js +28 -0
- package/dist/chunk-IC5RERFB.js +185 -0
- package/dist/chunk-K2BGDX7X.js +38 -0
- package/dist/chunk-WPW7UBVR.js +95 -0
- package/dist/contracts-J7JYPQXP.js +108 -0
- package/dist/detections-QSMNEXXI.js +282 -0
- package/dist/events-FM7VK5VH.js +104 -0
- package/dist/health-7R5HLRCZ.js +40 -0
- package/dist/index.js +159 -0
- package/dist/networks-CF2ARYQO.js +57 -0
- package/dist/org-contracts-DM2BTHTO.js +175 -0
- package/dist/repl-Q43IBAFT.js +1657 -0
- package/dist/rpc-configs-P2QCFCDJ.js +112 -0
- package/dist/state-changes-B6BIS4OJ.js +67 -0
- package/dist/templates-LYY2SV42.js +106 -0
- package/package.json +36 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
VERSION,
|
|
4
|
+
bold,
|
|
5
|
+
print,
|
|
6
|
+
printError
|
|
7
|
+
} from "./chunk-WPW7UBVR.js";
|
|
8
|
+
|
|
9
|
+
// src/index.ts
|
|
10
|
+
function parseArgs(argv) {
|
|
11
|
+
const command = [];
|
|
12
|
+
const flags = {};
|
|
13
|
+
for (const arg of argv) {
|
|
14
|
+
if (arg.startsWith("--")) {
|
|
15
|
+
const eq = arg.indexOf("=");
|
|
16
|
+
if (eq !== -1) {
|
|
17
|
+
flags[arg.slice(2, eq)] = arg.slice(eq + 1);
|
|
18
|
+
} else {
|
|
19
|
+
flags[arg.slice(2)] = "true";
|
|
20
|
+
}
|
|
21
|
+
} else {
|
|
22
|
+
command.push(arg);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return { command, flags };
|
|
26
|
+
}
|
|
27
|
+
function printUsage() {
|
|
28
|
+
print(bold("ChainAlert CLI") + ` v${VERSION}
|
|
29
|
+
`);
|
|
30
|
+
print("Usage: chainalert [command] [options]\n");
|
|
31
|
+
print(bold("Commands:"));
|
|
32
|
+
print(" (no command) Start interactive AI chat");
|
|
33
|
+
print(" chat Start interactive AI chat");
|
|
34
|
+
print(" login Authenticate with API key");
|
|
35
|
+
print(" logout Clear stored credentials");
|
|
36
|
+
print(" whoami Show current auth status");
|
|
37
|
+
print(" config set <k> <v> Set config value (api-url, openai-key)");
|
|
38
|
+
print(" config get <k> Get config value");
|
|
39
|
+
print(" health Check API health");
|
|
40
|
+
print("");
|
|
41
|
+
print(" networks list");
|
|
42
|
+
print(" templates list|get <slug>");
|
|
43
|
+
print(" detections list|get|create|update|delete|test");
|
|
44
|
+
print(" alerts list|get|stats");
|
|
45
|
+
print(" events list|get");
|
|
46
|
+
print(" state-changes list");
|
|
47
|
+
print(" channels list|create|test|delete");
|
|
48
|
+
print(" contracts resolve|storage-slots");
|
|
49
|
+
print(" org-contracts list|get|register|traits");
|
|
50
|
+
print(" rpc-configs list|add|test");
|
|
51
|
+
print("");
|
|
52
|
+
print("Flags: --json (raw output), --help, --version");
|
|
53
|
+
}
|
|
54
|
+
async function main() {
|
|
55
|
+
const { command, flags } = parseArgs(process.argv.slice(2));
|
|
56
|
+
if (flags.version) {
|
|
57
|
+
print(VERSION);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if (flags.help && command.length === 0) {
|
|
61
|
+
printUsage();
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const root = command[0];
|
|
65
|
+
const rest = command.slice(1);
|
|
66
|
+
try {
|
|
67
|
+
switch (root) {
|
|
68
|
+
// No command or "chat" -> interactive REPL
|
|
69
|
+
case void 0: {
|
|
70
|
+
const { startRepl } = await import("./repl-Q43IBAFT.js");
|
|
71
|
+
await startRepl();
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
case "chat": {
|
|
75
|
+
const { startRepl } = await import("./repl-Q43IBAFT.js");
|
|
76
|
+
await startRepl();
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
// Auth commands
|
|
80
|
+
case "login":
|
|
81
|
+
case "logout":
|
|
82
|
+
case "whoami": {
|
|
83
|
+
const auth = await import("./auth-6LTJFNU2.js");
|
|
84
|
+
await auth.run([root, ...rest], flags);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
case "config": {
|
|
88
|
+
const auth = await import("./auth-6LTJFNU2.js");
|
|
89
|
+
await auth.runConfig(rest, flags);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
// Resource commands
|
|
93
|
+
case "health": {
|
|
94
|
+
const mod = await import("./health-7R5HLRCZ.js");
|
|
95
|
+
await mod.run(rest, flags);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
case "networks": {
|
|
99
|
+
const mod = await import("./networks-CF2ARYQO.js");
|
|
100
|
+
await mod.run(rest, flags);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
case "templates": {
|
|
104
|
+
const mod = await import("./templates-LYY2SV42.js");
|
|
105
|
+
await mod.run(rest, flags);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
case "detections": {
|
|
109
|
+
const mod = await import("./detections-QSMNEXXI.js");
|
|
110
|
+
await mod.run(rest, flags);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
case "alerts": {
|
|
114
|
+
const mod = await import("./alerts-STXD4TE5.js");
|
|
115
|
+
await mod.run(rest, flags);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
case "events": {
|
|
119
|
+
const mod = await import("./events-FM7VK5VH.js");
|
|
120
|
+
await mod.run(rest, flags);
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
case "state-changes": {
|
|
124
|
+
const mod = await import("./state-changes-B6BIS4OJ.js");
|
|
125
|
+
await mod.run(rest, flags);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
case "channels": {
|
|
129
|
+
const mod = await import("./channels-C5JZON37.js");
|
|
130
|
+
await mod.run(rest, flags);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
case "contracts": {
|
|
134
|
+
const mod = await import("./contracts-J7JYPQXP.js");
|
|
135
|
+
await mod.run(rest, flags);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
case "org-contracts": {
|
|
139
|
+
const mod = await import("./org-contracts-DM2BTHTO.js");
|
|
140
|
+
await mod.run(rest, flags);
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
case "rpc-configs": {
|
|
144
|
+
const mod = await import("./rpc-configs-P2QCFCDJ.js");
|
|
145
|
+
await mod.run(rest, flags);
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
default:
|
|
149
|
+
printError(`Unknown command: ${root}`);
|
|
150
|
+
print("Run 'chainalert --help' for usage.");
|
|
151
|
+
process.exit(1);
|
|
152
|
+
}
|
|
153
|
+
} catch (err) {
|
|
154
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
155
|
+
printError(msg);
|
|
156
|
+
process.exit(1);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
main();
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
spinner
|
|
4
|
+
} from "./chunk-CE4DKHAY.js";
|
|
5
|
+
import {
|
|
6
|
+
listNetworks
|
|
7
|
+
} from "./chunk-IC5RERFB.js";
|
|
8
|
+
import "./chunk-K2BGDX7X.js";
|
|
9
|
+
import {
|
|
10
|
+
print,
|
|
11
|
+
printError,
|
|
12
|
+
printJson,
|
|
13
|
+
printTable
|
|
14
|
+
} from "./chunk-WPW7UBVR.js";
|
|
15
|
+
|
|
16
|
+
// src/commands/networks.ts
|
|
17
|
+
async function run(args, flags) {
|
|
18
|
+
const sub = args[0] ?? "list";
|
|
19
|
+
switch (sub) {
|
|
20
|
+
case "list": {
|
|
21
|
+
try {
|
|
22
|
+
spinner.start("Fetching networks...");
|
|
23
|
+
const result = await listNetworks();
|
|
24
|
+
spinner.stop();
|
|
25
|
+
if (flags.json) {
|
|
26
|
+
printJson(result);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (!result.data.length) {
|
|
30
|
+
print("No networks found.");
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
printTable(
|
|
34
|
+
["ID", "Name", "Slug", "Chain ID", "Active"],
|
|
35
|
+
result.data.map((n) => [
|
|
36
|
+
String(n.id),
|
|
37
|
+
n.name ?? "",
|
|
38
|
+
n.slug ?? "",
|
|
39
|
+
String(n.chainId ?? ""),
|
|
40
|
+
n.active ? "Yes" : "No"
|
|
41
|
+
])
|
|
42
|
+
);
|
|
43
|
+
} catch (err) {
|
|
44
|
+
spinner.stop();
|
|
45
|
+
printError(err.message ?? "Failed to fetch networks.");
|
|
46
|
+
process.exitCode = 1;
|
|
47
|
+
}
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
default:
|
|
51
|
+
printError(`Unknown subcommand: ${sub}. Use: list`);
|
|
52
|
+
process.exitCode = 1;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export {
|
|
56
|
+
run
|
|
57
|
+
};
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
spinner
|
|
4
|
+
} from "./chunk-CE4DKHAY.js";
|
|
5
|
+
import {
|
|
6
|
+
getOrgContract,
|
|
7
|
+
getOrgContractTraits,
|
|
8
|
+
listOrgContracts,
|
|
9
|
+
registerOrgContract
|
|
10
|
+
} from "./chunk-IC5RERFB.js";
|
|
11
|
+
import "./chunk-K2BGDX7X.js";
|
|
12
|
+
import {
|
|
13
|
+
dim,
|
|
14
|
+
print,
|
|
15
|
+
printError,
|
|
16
|
+
printJson,
|
|
17
|
+
printKV,
|
|
18
|
+
printSuccess,
|
|
19
|
+
printTable
|
|
20
|
+
} from "./chunk-WPW7UBVR.js";
|
|
21
|
+
|
|
22
|
+
// src/commands/org-contracts.ts
|
|
23
|
+
async function run(args, flags) {
|
|
24
|
+
const sub = args[0] ?? "list";
|
|
25
|
+
switch (sub) {
|
|
26
|
+
case "list": {
|
|
27
|
+
try {
|
|
28
|
+
spinner.start("Fetching org contracts...");
|
|
29
|
+
const result = await listOrgContracts({
|
|
30
|
+
page: flags.page ? Number(flags.page) : void 0,
|
|
31
|
+
limit: flags.limit ? Number(flags.limit) : void 0
|
|
32
|
+
});
|
|
33
|
+
spinner.stop();
|
|
34
|
+
if (flags.json) {
|
|
35
|
+
printJson(result);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (!result.data.length) {
|
|
39
|
+
print("No org contracts found.");
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
printTable(
|
|
43
|
+
["ID", "Address", "Network", "Label"],
|
|
44
|
+
result.data.map((c) => [
|
|
45
|
+
String(c.id),
|
|
46
|
+
c.address ?? "",
|
|
47
|
+
c.networkSlug ?? c.networkId ?? "",
|
|
48
|
+
c.label ?? ""
|
|
49
|
+
])
|
|
50
|
+
);
|
|
51
|
+
if (result.meta) {
|
|
52
|
+
print(dim(`
|
|
53
|
+
Page ${result.meta.page ?? 1} of ${result.meta.totalPages ?? "?"} (${result.meta.total ?? "?"} total)`));
|
|
54
|
+
}
|
|
55
|
+
} catch (err) {
|
|
56
|
+
spinner.stop();
|
|
57
|
+
printError(err.message ?? "Failed to fetch org contracts.");
|
|
58
|
+
process.exitCode = 1;
|
|
59
|
+
}
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
case "get": {
|
|
63
|
+
const id = args[1];
|
|
64
|
+
if (!id) {
|
|
65
|
+
printError("Usage: chainalert org-contracts get <id>");
|
|
66
|
+
process.exitCode = 1;
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
spinner.start("Fetching org contract...");
|
|
71
|
+
const result = await getOrgContract(id);
|
|
72
|
+
spinner.stop();
|
|
73
|
+
if (flags.json) {
|
|
74
|
+
printJson(result);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const c = result.data;
|
|
78
|
+
printKV([
|
|
79
|
+
["ID", String(c.id)],
|
|
80
|
+
["Address", c.address ?? ""],
|
|
81
|
+
["Network", c.networkSlug ?? c.networkId ?? ""],
|
|
82
|
+
["Label", c.label ?? dim("(none)")],
|
|
83
|
+
["Name", c.name ?? dim("(unknown)")],
|
|
84
|
+
["Created", c.createdAt ?? ""]
|
|
85
|
+
]);
|
|
86
|
+
} catch (err) {
|
|
87
|
+
spinner.stop();
|
|
88
|
+
printError(err.message ?? "Failed to fetch org contract.");
|
|
89
|
+
process.exitCode = 1;
|
|
90
|
+
}
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
case "register": {
|
|
94
|
+
if (!flags.address) {
|
|
95
|
+
printError("--address is required.");
|
|
96
|
+
process.exitCode = 1;
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
if (!flags.network) {
|
|
100
|
+
printError("--network is required.");
|
|
101
|
+
process.exitCode = 1;
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
spinner.start("Registering org contract...");
|
|
106
|
+
const result = await registerOrgContract({
|
|
107
|
+
address: flags.address,
|
|
108
|
+
networkId: flags.network,
|
|
109
|
+
label: flags.label
|
|
110
|
+
});
|
|
111
|
+
spinner.stop();
|
|
112
|
+
if (flags.json) {
|
|
113
|
+
printJson(result);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
printSuccess(`Org contract registered: ${result.data.id}`);
|
|
117
|
+
} catch (err) {
|
|
118
|
+
spinner.stop();
|
|
119
|
+
printError(err.message ?? "Failed to register org contract.");
|
|
120
|
+
process.exitCode = 1;
|
|
121
|
+
}
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
case "traits": {
|
|
125
|
+
const id = args[1];
|
|
126
|
+
if (!id) {
|
|
127
|
+
printError("Usage: chainalert org-contracts traits <id>");
|
|
128
|
+
process.exitCode = 1;
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
try {
|
|
132
|
+
spinner.start("Fetching org contract traits...");
|
|
133
|
+
const result = await getOrgContractTraits(id);
|
|
134
|
+
spinner.stop();
|
|
135
|
+
if (flags.json) {
|
|
136
|
+
printJson(result);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const traits = result.data;
|
|
140
|
+
if (Array.isArray(traits) && traits.length > 0) {
|
|
141
|
+
for (const trait of traits) {
|
|
142
|
+
printKV([
|
|
143
|
+
["Trait", trait.name ?? trait.key ?? ""],
|
|
144
|
+
["Value", trait.value !== void 0 ? String(trait.value) : dim("(none)")]
|
|
145
|
+
]);
|
|
146
|
+
print("");
|
|
147
|
+
}
|
|
148
|
+
} else if (traits && typeof traits === "object" && !Array.isArray(traits)) {
|
|
149
|
+
const pairs = [];
|
|
150
|
+
for (const [key, value] of Object.entries(traits)) {
|
|
151
|
+
pairs.push([key, String(value)]);
|
|
152
|
+
}
|
|
153
|
+
if (pairs.length > 0) {
|
|
154
|
+
printKV(pairs);
|
|
155
|
+
} else {
|
|
156
|
+
print("No traits found.");
|
|
157
|
+
}
|
|
158
|
+
} else {
|
|
159
|
+
print("No traits found.");
|
|
160
|
+
}
|
|
161
|
+
} catch (err) {
|
|
162
|
+
spinner.stop();
|
|
163
|
+
printError(err.message ?? "Failed to fetch org contract traits.");
|
|
164
|
+
process.exitCode = 1;
|
|
165
|
+
}
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
default:
|
|
169
|
+
printError(`Unknown subcommand: ${sub}. Use: list, get, register, traits`);
|
|
170
|
+
process.exitCode = 1;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
export {
|
|
174
|
+
run
|
|
175
|
+
};
|