@axtary/cli 0.0.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +140 -6
- package/dist/bin.js +10 -0
- package/dist/bin.js.map +1 -1
- package/dist/claude-code-hook.d.ts +65 -0
- package/dist/claude-code-hook.d.ts.map +1 -0
- package/dist/claude-code-hook.js +326 -0
- package/dist/claude-code-hook.js.map +1 -0
- package/dist/codex-hook.d.ts +48 -0
- package/dist/codex-hook.d.ts.map +1 -0
- package/dist/codex-hook.js +259 -0
- package/dist/codex-hook.js.map +1 -0
- package/dist/credentials.d.ts +101 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +277 -0
- package/dist/credentials.js.map +1 -0
- package/dist/cursor-hook.d.ts +51 -0
- package/dist/cursor-hook.d.ts.map +1 -0
- package/dist/cursor-hook.js +214 -0
- package/dist/cursor-hook.js.map +1 -0
- package/dist/hook-install.d.ts +21 -0
- package/dist/hook-install.d.ts.map +1 -0
- package/dist/hook-install.js +179 -0
- package/dist/hook-install.js.map +1 -0
- package/dist/index.d.ts +897 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6750 -513
- package/dist/index.js.map +1 -1
- package/dist/mcp-fs-normalize.d.ts +18 -0
- package/dist/mcp-fs-normalize.d.ts.map +1 -0
- package/dist/mcp-fs-normalize.js +39 -0
- package/dist/mcp-fs-normalize.js.map +1 -0
- package/dist/mcp-oauth.d.ts +67 -0
- package/dist/mcp-oauth.d.ts.map +1 -0
- package/dist/mcp-oauth.js +242 -0
- package/dist/mcp-oauth.js.map +1 -0
- package/dist/oauth.d.ts +90 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +339 -0
- package/dist/oauth.js.map +1 -0
- package/dist/render.d.ts +103 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +172 -0
- package/dist/render.js.map +1 -0
- package/dist/shell-file-normalize.d.ts +21 -0
- package/dist/shell-file-normalize.d.ts.map +1 -0
- package/dist/shell-file-normalize.js +269 -0
- package/dist/shell-file-normalize.js.map +1 -0
- package/package.json +17 -13
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type ShellFileOp = {
|
|
2
|
+
kind: "read" | "write";
|
|
3
|
+
path: string;
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* Deep classifier: every file read/write a shell command performs, so the
|
|
7
|
+
* content policy applies to each. Governs the SOURCE read of copy/move/`dd`/
|
|
8
|
+
* `tar`/redirection commands (not only the destination write), which closes the
|
|
9
|
+
* `cp secret dest` / `cat secret > public` exfiltration gap. Still conservative:
|
|
10
|
+
* unrecognized commands and piped readers contribute nothing (no false-positive
|
|
11
|
+
* file ops), and exotic invocations stay a documented best-effort limit.
|
|
12
|
+
*/
|
|
13
|
+
export declare function classifyShellFileOps(command: string): ShellFileOp[];
|
|
14
|
+
/**
|
|
15
|
+
* Back-compat single-op view: the primary file op of a command — the
|
|
16
|
+
* destination write for a mover/redirection, otherwise the first read. Callers
|
|
17
|
+
* that must evaluate every op (the runtime hooks, fail-closed) should use
|
|
18
|
+
* {@link classifyShellFileOps} instead.
|
|
19
|
+
*/
|
|
20
|
+
export declare function classifyShellCommand(command: string): ShellFileOp | null;
|
|
21
|
+
//# sourceMappingURL=shell-file-normalize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell-file-normalize.d.ts","sourceRoot":"","sources":["../src/shell-file-normalize.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAgPnE;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,CAYnE;AAcD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAKxE"}
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
// Shell programs that read a file's contents (the file is the last operand).
|
|
2
|
+
// These read their operand in ANY pipeline position (`… | cat secret` still
|
|
3
|
+
// reads the file), so they are not gated by stage.
|
|
4
|
+
const READ_CMDS = new Set([
|
|
5
|
+
"cat",
|
|
6
|
+
"head",
|
|
7
|
+
"tail",
|
|
8
|
+
"less",
|
|
9
|
+
"more",
|
|
10
|
+
"bat",
|
|
11
|
+
"nl",
|
|
12
|
+
"od",
|
|
13
|
+
"xxd",
|
|
14
|
+
"strings",
|
|
15
|
+
"hexdump",
|
|
16
|
+
"tac",
|
|
17
|
+
"view",
|
|
18
|
+
]);
|
|
19
|
+
// Readers whose FIRST operand is a pattern/script, not a file; the file reads
|
|
20
|
+
// are the operands AFTER it. This is what lets `… | grep PATTERN` (reads stdin,
|
|
21
|
+
// PATTERN is not a file) stay a no-op while `grep PATTERN file` / `sed -n 1p f`
|
|
22
|
+
// correctly read `file` in any pipeline position.
|
|
23
|
+
const PATTERN_FIRST_READ_CMDS = new Set([
|
|
24
|
+
"grep",
|
|
25
|
+
"egrep",
|
|
26
|
+
"fgrep",
|
|
27
|
+
"sed",
|
|
28
|
+
"awk",
|
|
29
|
+
]);
|
|
30
|
+
// Single-operand writers: the path operand is created/modified/removed.
|
|
31
|
+
const WRITE_CMDS = new Set([
|
|
32
|
+
"rm",
|
|
33
|
+
"touch",
|
|
34
|
+
"truncate",
|
|
35
|
+
"tee",
|
|
36
|
+
"unlink",
|
|
37
|
+
"shred",
|
|
38
|
+
"ln",
|
|
39
|
+
]);
|
|
40
|
+
// Two-operand movers: every operand except the last is a SOURCE read, the last
|
|
41
|
+
// is the DESTINATION write. This is what closes the `cp secret dest` exfil gap —
|
|
42
|
+
// the source read is governed, not just the destination write.
|
|
43
|
+
const COPY_CMDS = new Set(["cp", "mv", "install", "rsync"]);
|
|
44
|
+
// Wrappers to skip so we classify the real command after them.
|
|
45
|
+
const PREFIX_CMDS = new Set(["sudo", "env", "command", "nohup", "time", "exec"]);
|
|
46
|
+
// tar single-letter flags (used to tell a bare `czf` cluster from a path operand).
|
|
47
|
+
const TAR_FLAG_RE = /^[cxtrujzvfCJkpPOWK]+$/;
|
|
48
|
+
// Statement separators (`;`, newlines, `&&`, `||`) — NOT a single `|`, which is
|
|
49
|
+
// a pipeline and is handled stage-by-stage so a piped reader (`… | grep KEY`)
|
|
50
|
+
// does not mistake its pattern argument for a file.
|
|
51
|
+
function splitStatements(command) {
|
|
52
|
+
return command.split(/&&|\|\||[;\n]/g);
|
|
53
|
+
}
|
|
54
|
+
function tokenizeSegment(segment) {
|
|
55
|
+
const tokens = [];
|
|
56
|
+
const re = /'[^']*'|"[^"]*"|>>|>|\||[^\s>|]+/g;
|
|
57
|
+
let match;
|
|
58
|
+
while ((match = re.exec(segment))) {
|
|
59
|
+
let token = match[0];
|
|
60
|
+
if ((token.startsWith("'") && token.endsWith("'")) ||
|
|
61
|
+
(token.startsWith('"') && token.endsWith('"'))) {
|
|
62
|
+
token = token.slice(1, -1);
|
|
63
|
+
}
|
|
64
|
+
tokens.push(token);
|
|
65
|
+
}
|
|
66
|
+
return tokens;
|
|
67
|
+
}
|
|
68
|
+
function basename(program) {
|
|
69
|
+
const parts = program.split("/");
|
|
70
|
+
return parts[parts.length - 1] ?? program;
|
|
71
|
+
}
|
|
72
|
+
function isPathLike(token) {
|
|
73
|
+
return token.length > 0 && !token.startsWith("-") && !token.startsWith("&");
|
|
74
|
+
}
|
|
75
|
+
// `dd if=SRC of=DEST` — key=value operands, not positional.
|
|
76
|
+
function classifyDd(args) {
|
|
77
|
+
const ops = [];
|
|
78
|
+
for (const arg of args) {
|
|
79
|
+
if (arg.startsWith("if=")) {
|
|
80
|
+
const path = arg.slice(3);
|
|
81
|
+
if (path)
|
|
82
|
+
ops.push({ kind: "read", path });
|
|
83
|
+
}
|
|
84
|
+
else if (arg.startsWith("of=")) {
|
|
85
|
+
const path = arg.slice(3);
|
|
86
|
+
if (path)
|
|
87
|
+
ops.push({ kind: "write", path });
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return ops;
|
|
91
|
+
}
|
|
92
|
+
// `tar` (conservative). Create (`c`) reads the named inputs and writes the
|
|
93
|
+
// archive from `-f`; extract (`x`) reads the archive. Exotic invocations
|
|
94
|
+
// (stdin/stdout archives, `--options`) stay best-effort and are a documented
|
|
95
|
+
// limit — the classifier never guesses a write it cannot see.
|
|
96
|
+
function classifyTar(args) {
|
|
97
|
+
let create = false;
|
|
98
|
+
let extract = false;
|
|
99
|
+
let archive = null;
|
|
100
|
+
let expectArchive = false;
|
|
101
|
+
const inputs = [];
|
|
102
|
+
args.forEach((arg, index) => {
|
|
103
|
+
const isFlag = arg.startsWith("-") || (index === 0 && TAR_FLAG_RE.test(arg));
|
|
104
|
+
if (isFlag) {
|
|
105
|
+
const flags = arg.replace(/^-+/, "");
|
|
106
|
+
if (flags.includes("c"))
|
|
107
|
+
create = true;
|
|
108
|
+
if (flags.includes("x"))
|
|
109
|
+
extract = true;
|
|
110
|
+
// A clustered `f` (e.g. `czf`) takes the next token as the archive path.
|
|
111
|
+
if (flags.endsWith("f"))
|
|
112
|
+
expectArchive = true;
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
if (expectArchive) {
|
|
116
|
+
archive = arg;
|
|
117
|
+
expectArchive = false;
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
if (isPathLike(arg))
|
|
121
|
+
inputs.push(arg);
|
|
122
|
+
});
|
|
123
|
+
const ops = [];
|
|
124
|
+
if (create) {
|
|
125
|
+
if (archive)
|
|
126
|
+
ops.push({ kind: "write", path: archive });
|
|
127
|
+
for (const path of inputs)
|
|
128
|
+
ops.push({ kind: "read", path });
|
|
129
|
+
}
|
|
130
|
+
else if (extract && archive) {
|
|
131
|
+
ops.push({ kind: "read", path: archive });
|
|
132
|
+
}
|
|
133
|
+
return ops;
|
|
134
|
+
}
|
|
135
|
+
function classifyCommand(command, args) {
|
|
136
|
+
if (command === "dd")
|
|
137
|
+
return classifyDd(args);
|
|
138
|
+
if (command === "tar")
|
|
139
|
+
return classifyTar(args);
|
|
140
|
+
const operands = args.filter(isPathLike);
|
|
141
|
+
// grep/sed/awk: the first operand is the pattern/script and any operands after
|
|
142
|
+
// it are files read in ANY pipeline position. With no trailing operand the
|
|
143
|
+
// program reads stdin, so there is no governed file — this is what keeps
|
|
144
|
+
// `… | grep PATTERN` a no-op without dropping `… | grep PATTERN secret`.
|
|
145
|
+
if (PATTERN_FIRST_READ_CMDS.has(command)) {
|
|
146
|
+
return operands.slice(1).map((path) => ({ kind: "read", path }));
|
|
147
|
+
}
|
|
148
|
+
if (operands.length === 0)
|
|
149
|
+
return [];
|
|
150
|
+
const last = operands[operands.length - 1];
|
|
151
|
+
if (COPY_CMDS.has(command)) {
|
|
152
|
+
const ops = operands
|
|
153
|
+
.slice(0, -1)
|
|
154
|
+
.map((path) => ({ kind: "read", path }));
|
|
155
|
+
ops.push({ kind: "write", path: last });
|
|
156
|
+
return ops;
|
|
157
|
+
}
|
|
158
|
+
if (WRITE_CMDS.has(command)) {
|
|
159
|
+
return [{ kind: "write", path: last }];
|
|
160
|
+
}
|
|
161
|
+
if (READ_CMDS.has(command)) {
|
|
162
|
+
// A plain reader reads its file operand wherever it sits in a pipeline
|
|
163
|
+
// (`echo x | cat secret` still reads the file); it is never stage-gated.
|
|
164
|
+
return [{ kind: "read", path: last }];
|
|
165
|
+
}
|
|
166
|
+
return [];
|
|
167
|
+
}
|
|
168
|
+
// Drop a trailing `#` comment (unquoted, at a word boundary) so it is not
|
|
169
|
+
// mistaken for a file operand — `cat .env # note` reads `.env`, not `note`.
|
|
170
|
+
function stripComment(statement) {
|
|
171
|
+
let inSingle = false;
|
|
172
|
+
let inDouble = false;
|
|
173
|
+
for (let i = 0; i < statement.length; i += 1) {
|
|
174
|
+
const char = statement[i];
|
|
175
|
+
if (char === "'" && !inDouble)
|
|
176
|
+
inSingle = !inSingle;
|
|
177
|
+
else if (char === '"' && !inSingle)
|
|
178
|
+
inDouble = !inDouble;
|
|
179
|
+
else if (char === "#" &&
|
|
180
|
+
!inSingle &&
|
|
181
|
+
!inDouble &&
|
|
182
|
+
(i === 0 || /\s/.test(statement[i - 1]))) {
|
|
183
|
+
return statement.slice(0, i);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return statement;
|
|
187
|
+
}
|
|
188
|
+
function classifyStatement(statement) {
|
|
189
|
+
const ops = [];
|
|
190
|
+
const stages = stripComment(statement).split(/\|/g);
|
|
191
|
+
for (const stage of stages) {
|
|
192
|
+
const tokens = tokenizeSegment(stage);
|
|
193
|
+
// Redirection (`> file` / `>> file`) is the clearest write signal, on any stage.
|
|
194
|
+
for (let i = 0; i < tokens.length; i += 1) {
|
|
195
|
+
if (tokens[i] === ">" || tokens[i] === ">>") {
|
|
196
|
+
const target = tokens[i + 1];
|
|
197
|
+
if (target && isPathLike(target)) {
|
|
198
|
+
ops.push({ kind: "write", path: target });
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Command words: strip redirection tokens + their targets, skip wrappers.
|
|
203
|
+
const words = [];
|
|
204
|
+
for (let i = 0; i < tokens.length; i += 1) {
|
|
205
|
+
if (tokens[i] === ">" || tokens[i] === ">>") {
|
|
206
|
+
i += 1;
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
words.push(tokens[i]);
|
|
210
|
+
}
|
|
211
|
+
let index = 0;
|
|
212
|
+
while (index < words.length && PREFIX_CMDS.has(basename(words[index]))) {
|
|
213
|
+
index += 1;
|
|
214
|
+
}
|
|
215
|
+
if (index >= words.length)
|
|
216
|
+
continue;
|
|
217
|
+
const command = basename(words[index]);
|
|
218
|
+
const args = words.slice(index + 1);
|
|
219
|
+
ops.push(...classifyCommand(command, args));
|
|
220
|
+
}
|
|
221
|
+
return ops;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Deep classifier: every file read/write a shell command performs, so the
|
|
225
|
+
* content policy applies to each. Governs the SOURCE read of copy/move/`dd`/
|
|
226
|
+
* `tar`/redirection commands (not only the destination write), which closes the
|
|
227
|
+
* `cp secret dest` / `cat secret > public` exfiltration gap. Still conservative:
|
|
228
|
+
* unrecognized commands and piped readers contribute nothing (no false-positive
|
|
229
|
+
* file ops), and exotic invocations stay a documented best-effort limit.
|
|
230
|
+
*/
|
|
231
|
+
export function classifyShellFileOps(command) {
|
|
232
|
+
const ops = [];
|
|
233
|
+
for (const statement of splitStatements(command)) {
|
|
234
|
+
ops.push(...classifyStatement(statement));
|
|
235
|
+
}
|
|
236
|
+
// Reads first (stable): a protected source read is evaluated — and can block —
|
|
237
|
+
// before a benign destination write is even authorized/ledgered.
|
|
238
|
+
const deduped = dedupeOps(ops);
|
|
239
|
+
return [
|
|
240
|
+
...deduped.filter((op) => op.kind === "read"),
|
|
241
|
+
...deduped.filter((op) => op.kind === "write"),
|
|
242
|
+
];
|
|
243
|
+
}
|
|
244
|
+
function dedupeOps(ops) {
|
|
245
|
+
const seen = new Set();
|
|
246
|
+
const result = [];
|
|
247
|
+
for (const op of ops) {
|
|
248
|
+
const key = `${op.kind}:${op.path}`;
|
|
249
|
+
if (seen.has(key))
|
|
250
|
+
continue;
|
|
251
|
+
seen.add(key);
|
|
252
|
+
result.push(op);
|
|
253
|
+
}
|
|
254
|
+
return result;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Back-compat single-op view: the primary file op of a command — the
|
|
258
|
+
* destination write for a mover/redirection, otherwise the first read. Callers
|
|
259
|
+
* that must evaluate every op (the runtime hooks, fail-closed) should use
|
|
260
|
+
* {@link classifyShellFileOps} instead.
|
|
261
|
+
*/
|
|
262
|
+
export function classifyShellCommand(command) {
|
|
263
|
+
const ops = classifyShellFileOps(command);
|
|
264
|
+
if (ops.length === 0)
|
|
265
|
+
return null;
|
|
266
|
+
const lastWrite = [...ops].reverse().find((op) => op.kind === "write");
|
|
267
|
+
return lastWrite ?? ops[0];
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=shell-file-normalize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell-file-normalize.js","sourceRoot":"","sources":["../src/shell-file-normalize.ts"],"names":[],"mappings":"AAEA,6EAA6E;AAC7E,4EAA4E;AAC5E,mDAAmD;AACnD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;IACxB,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,IAAI;IACJ,IAAI;IACJ,KAAK;IACL,SAAS;IACT,SAAS;IACT,KAAK;IACL,MAAM;CACP,CAAC,CAAC;AAEH,8EAA8E;AAC9E,gFAAgF;AAChF,gFAAgF;AAChF,kDAAkD;AAClD,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC;IACtC,MAAM;IACN,OAAO;IACP,OAAO;IACP,KAAK;IACL,KAAK;CACN,CAAC,CAAC;AAEH,wEAAwE;AACxE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;IACzB,IAAI;IACJ,OAAO;IACP,UAAU;IACV,KAAK;IACL,QAAQ;IACR,OAAO;IACP,IAAI;CACL,CAAC,CAAC;AAEH,+EAA+E;AAC/E,iFAAiF;AACjF,+DAA+D;AAC/D,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;AAE5D,+DAA+D;AAC/D,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAEjF,mFAAmF;AACnF,MAAM,WAAW,GAAG,wBAAwB,CAAC;AAE7C,gFAAgF;AAChF,8EAA8E;AAC9E,oDAAoD;AACpD,SAAS,eAAe,CAAC,OAAe;IACtC,OAAO,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,eAAe,CAAC,OAAe;IACtC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,EAAE,GAAG,mCAAmC,CAAC;IAC/C,IAAI,KAA6B,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QAClC,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,IACE,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9C,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAC9C,CAAC;YACD,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,QAAQ,CAAC,OAAe;IAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC;AAC5C,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC9E,CAAC;AAED,4DAA4D;AAC5D,SAAS,UAAU,CAAC,IAAc;IAChC,MAAM,GAAG,GAAkB,EAAE,CAAC;IAC9B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,IAAI;gBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,IAAI;gBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,2EAA2E;AAC3E,yEAAyE;AACzE,6EAA6E;AAC7E,8DAA8D;AAC9D,SAAS,WAAW,CAAC,IAAc;IACjC,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QAC1B,MAAM,MAAM,GACV,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACrC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,MAAM,GAAG,IAAI,CAAC;YACvC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,OAAO,GAAG,IAAI,CAAC;YACxC,yEAAyE;YACzE,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,aAAa,GAAG,IAAI,CAAC;YAC9C,OAAO;QACT,CAAC;QACD,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,GAAG,GAAG,CAAC;YACd,aAAa,GAAG,KAAK,CAAC;YACtB,OAAO;QACT,CAAC;QACD,IAAI,UAAU,CAAC,GAAG,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,MAAM,GAAG,GAAkB,EAAE,CAAC;IAC9B,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,OAAO;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACxD,KAAK,MAAM,IAAI,IAAI,MAAM;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,CAAC;SAAM,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;QAC9B,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,eAAe,CAAC,OAAe,EAAE,IAAc;IACtD,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;IAC9C,IAAI,OAAO,KAAK,KAAK;QAAE,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;IAEhD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAEzC,+EAA+E;IAC/E,2EAA2E;IAC3E,yEAAyE;IACzE,yEAAyE;IACzE,IAAI,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACzC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;IAE5C,IAAI,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAkB,QAAQ;aAChC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aACZ,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACpD,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,OAAO,GAAG,CAAC;IACb,CAAC;IACD,IAAI,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,uEAAuE;QACvE,yEAAyE;QACzE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,0EAA0E;AAC1E,4EAA4E;AAC5E,SAAS,YAAY,CAAC,SAAiB;IACrC,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;QAC3B,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ;YAAE,QAAQ,GAAG,CAAC,QAAQ,CAAC;aAC/C,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ;YAAE,QAAQ,GAAG,CAAC,QAAQ,CAAC;aACpD,IACH,IAAI,KAAK,GAAG;YACZ,CAAC,QAAQ;YACT,CAAC,QAAQ;YACT,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC,EACzC,CAAC;YACD,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,iBAAiB,CAAC,SAAiB;IAC1C,MAAM,GAAG,GAAkB,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEpD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QAEtC,iFAAiF;QACjF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1C,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC7B,IAAI,MAAM,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;oBACjC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC;QACH,CAAC;QAED,0EAA0E;QAC1E,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1C,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC5C,CAAC,IAAI,CAAC,CAAC;gBACP,SAAS;YACX,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC;QACzB,CAAC;QAED,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,OAAO,KAAK,GAAG,KAAK,CAAC,MAAM,IAAI,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAE,CAAC,CAAC,EAAE,CAAC;YACxE,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;QACD,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM;YAAE,SAAS;QAEpC,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAE,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACpC,GAAG,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,MAAM,GAAG,GAAkB,EAAE,CAAC;IAC9B,KAAK,MAAM,SAAS,IAAI,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5C,CAAC;IACD,+EAA+E;IAC/E,iEAAiE;IACjE,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC/B,OAAO;QACL,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,MAAM,CAAC;QAC7C,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,OAAO,CAAC;KAC/C,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,GAAkB;IACnC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,MAAM,GAAG,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,MAAM,SAAS,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IACvE,OAAO,SAAS,IAAI,GAAG,CAAC,CAAC,CAAE,CAAC;AAC9B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@axtary/cli",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Axtary local CLI for deterministic proxy demos.",
|
|
6
6
|
"type": "module",
|
|
7
|
-
"license": "
|
|
7
|
+
"license": "Apache-2.0",
|
|
8
8
|
"repository": {
|
|
9
9
|
"type": "git",
|
|
10
10
|
"url": "git+https://github.com/axtary/axtary.git",
|
|
@@ -21,35 +21,39 @@
|
|
|
21
21
|
"node": "^20.19.0 || ^22.13.0 || >=24"
|
|
22
22
|
},
|
|
23
23
|
"bin": {
|
|
24
|
-
"axtary": "
|
|
24
|
+
"axtary": "dist/bin.js"
|
|
25
25
|
},
|
|
26
26
|
"scripts": {
|
|
27
|
-
"prebuild": "npm run build -w @axtary/config && npm run build -w @axtary/adapters && npm run build -w @axtary/proxy && npm run build -w @axtary/mcp",
|
|
27
|
+
"prebuild": "npm run build -w @axtary/config && npm run build -w @axtary/adapters && npm run build -w @axtary/proxy && npm run build -w @axtary/mcp && npm run build -w @axtary/approvals",
|
|
28
28
|
"build": "npm run clean && tsc -p tsconfig.json",
|
|
29
29
|
"clean": "rm -rf dist",
|
|
30
30
|
"prepack": "npm run build"
|
|
31
31
|
},
|
|
32
32
|
"files": [
|
|
33
|
+
"LICENSE",
|
|
33
34
|
"README.md",
|
|
34
35
|
"dist"
|
|
35
36
|
],
|
|
36
|
-
"publishConfig": {
|
|
37
|
-
"access": "public"
|
|
38
|
-
},
|
|
39
37
|
"main": "./dist/index.js",
|
|
40
38
|
"exports": {
|
|
41
39
|
".": {
|
|
42
40
|
"types": "./dist/index.d.ts",
|
|
43
41
|
"import": "./dist/index.js"
|
|
42
|
+
},
|
|
43
|
+
"./claude-code-hook": {
|
|
44
|
+
"types": "./dist/claude-code-hook.d.ts",
|
|
45
|
+
"import": "./dist/claude-code-hook.js"
|
|
44
46
|
}
|
|
45
47
|
},
|
|
46
48
|
"types": "./dist/index.d.ts",
|
|
47
49
|
"dependencies": {
|
|
48
|
-
"@axtary/actionpass": "0.0
|
|
49
|
-
"@axtary/adapters": "0.0
|
|
50
|
-
"@axtary/
|
|
51
|
-
"@axtary/
|
|
52
|
-
"@axtary/
|
|
53
|
-
"@axtary/
|
|
50
|
+
"@axtary/actionpass": "^0.2.0",
|
|
51
|
+
"@axtary/adapters": "^0.2.0",
|
|
52
|
+
"@axtary/approvals": "^0.2.0",
|
|
53
|
+
"@axtary/config": "^0.2.0",
|
|
54
|
+
"@axtary/ledger": "^0.2.0",
|
|
55
|
+
"@axtary/mcp": "^0.2.0",
|
|
56
|
+
"@axtary/policy": "^0.2.0",
|
|
57
|
+
"@axtary/proxy": "^0.2.0"
|
|
54
58
|
}
|
|
55
59
|
}
|