@axtary/cli 0.1.0 → 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.
Files changed (48) hide show
  1. package/README.md +122 -12
  2. package/dist/bin.js +10 -0
  3. package/dist/bin.js.map +1 -1
  4. package/dist/claude-code-hook.d.ts +20 -0
  5. package/dist/claude-code-hook.d.ts.map +1 -1
  6. package/dist/claude-code-hook.js +114 -34
  7. package/dist/claude-code-hook.js.map +1 -1
  8. package/dist/codex-hook.d.ts +48 -0
  9. package/dist/codex-hook.d.ts.map +1 -0
  10. package/dist/codex-hook.js +259 -0
  11. package/dist/codex-hook.js.map +1 -0
  12. package/dist/credentials.d.ts +101 -0
  13. package/dist/credentials.d.ts.map +1 -0
  14. package/dist/credentials.js +277 -0
  15. package/dist/credentials.js.map +1 -0
  16. package/dist/cursor-hook.d.ts +51 -0
  17. package/dist/cursor-hook.d.ts.map +1 -0
  18. package/dist/cursor-hook.js +214 -0
  19. package/dist/cursor-hook.js.map +1 -0
  20. package/dist/hook-install.d.ts +21 -0
  21. package/dist/hook-install.d.ts.map +1 -0
  22. package/dist/hook-install.js +179 -0
  23. package/dist/hook-install.js.map +1 -0
  24. package/dist/index.d.ts +768 -7
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +6132 -1050
  27. package/dist/index.js.map +1 -1
  28. package/dist/mcp-fs-normalize.d.ts +18 -0
  29. package/dist/mcp-fs-normalize.d.ts.map +1 -0
  30. package/dist/mcp-fs-normalize.js +39 -0
  31. package/dist/mcp-fs-normalize.js.map +1 -0
  32. package/dist/mcp-oauth.d.ts +67 -0
  33. package/dist/mcp-oauth.d.ts.map +1 -0
  34. package/dist/mcp-oauth.js +242 -0
  35. package/dist/mcp-oauth.js.map +1 -0
  36. package/dist/oauth.d.ts +90 -0
  37. package/dist/oauth.d.ts.map +1 -0
  38. package/dist/oauth.js +339 -0
  39. package/dist/oauth.js.map +1 -0
  40. package/dist/render.d.ts +103 -0
  41. package/dist/render.d.ts.map +1 -0
  42. package/dist/render.js +172 -0
  43. package/dist/render.js.map +1 -0
  44. package/dist/shell-file-normalize.d.ts +21 -0
  45. package/dist/shell-file-normalize.d.ts.map +1 -0
  46. package/dist/shell-file-normalize.js +269 -0
  47. package/dist/shell-file-normalize.js.map +1 -0
  48. package/package.json +14 -9
@@ -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,6 +1,6 @@
1
1
  {
2
2
  "name": "@axtary/cli",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "private": false,
5
5
  "description": "Axtary local CLI for deterministic proxy demos.",
6
6
  "type": "module",
@@ -24,7 +24,7 @@
24
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"
@@ -39,16 +39,21 @@
39
39
  ".": {
40
40
  "types": "./dist/index.d.ts",
41
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"
42
46
  }
43
47
  },
44
48
  "types": "./dist/index.d.ts",
45
49
  "dependencies": {
46
- "@axtary/actionpass": "^0.1.0",
47
- "@axtary/adapters": "^0.1.0",
48
- "@axtary/config": "^0.1.0",
49
- "@axtary/ledger": "^0.1.0",
50
- "@axtary/mcp": "^0.1.0",
51
- "@axtary/policy": "^0.1.0",
52
- "@axtary/proxy": "^0.1.0"
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"
53
58
  }
54
59
  }