@aligndottech/cli 0.57.1 → 0.59.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 (114) hide show
  1. package/README.md +31 -18
  2. package/dist/bin.js +3 -0
  3. package/dist/bin.js.map +1 -1
  4. package/dist/commands/doctor.d.ts.map +1 -1
  5. package/dist/commands/doctor.js +22 -0
  6. package/dist/commands/doctor.js.map +1 -1
  7. package/dist/commands/import/git.d.ts.map +1 -1
  8. package/dist/commands/import/git.js +8 -4
  9. package/dist/commands/import/git.js.map +1 -1
  10. package/dist/commands/mcp.d.ts.map +1 -1
  11. package/dist/commands/mcp.js +5 -4
  12. package/dist/commands/mcp.js.map +1 -1
  13. package/dist/commands/setup.d.ts.map +1 -1
  14. package/dist/commands/setup.js +26 -12
  15. package/dist/commands/setup.js.map +1 -1
  16. package/dist/commands/use.d.ts +2 -0
  17. package/dist/commands/use.d.ts.map +1 -1
  18. package/dist/commands/use.js +19 -1
  19. package/dist/commands/use.js.map +1 -1
  20. package/dist/commands/why.d.ts.map +1 -1
  21. package/dist/commands/why.js +111 -55
  22. package/dist/commands/why.js.map +1 -1
  23. package/dist/lib/agent-rules.d.ts +11 -4
  24. package/dist/lib/agent-rules.d.ts.map +1 -1
  25. package/dist/lib/agent-rules.js +163 -190
  26. package/dist/lib/agent-rules.js.map +1 -1
  27. package/dist/lib/ask-listing.d.ts +30 -0
  28. package/dist/lib/ask-listing.d.ts.map +1 -0
  29. package/dist/lib/ask-listing.js +60 -0
  30. package/dist/lib/ask-listing.js.map +1 -0
  31. package/dist/lib/capture-report.d.ts.map +1 -1
  32. package/dist/lib/capture-report.js +11 -3
  33. package/dist/lib/capture-report.js.map +1 -1
  34. package/dist/lib/claude-presence.d.ts +12 -0
  35. package/dist/lib/claude-presence.d.ts.map +1 -0
  36. package/dist/lib/claude-presence.js +19 -0
  37. package/dist/lib/claude-presence.js.map +1 -0
  38. package/dist/lib/doctor.d.ts +9 -1
  39. package/dist/lib/doctor.d.ts.map +1 -1
  40. package/dist/lib/doctor.js +19 -1
  41. package/dist/lib/doctor.js.map +1 -1
  42. package/dist/lib/embedding-assets.d.ts +40 -0
  43. package/dist/lib/embedding-assets.d.ts.map +1 -0
  44. package/dist/lib/embedding-assets.js +74 -0
  45. package/dist/lib/embedding-assets.js.map +1 -0
  46. package/dist/lib/embedding-runtime.d.ts +41 -0
  47. package/dist/lib/embedding-runtime.d.ts.map +1 -0
  48. package/dist/lib/embedding-runtime.js +224 -0
  49. package/dist/lib/embedding-runtime.js.map +1 -0
  50. package/dist/lib/fetchers/git.d.ts +3 -0
  51. package/dist/lib/fetchers/git.d.ts.map +1 -1
  52. package/dist/lib/fetchers/git.js +9 -5
  53. package/dist/lib/fetchers/git.js.map +1 -1
  54. package/dist/lib/git.d.ts +7 -0
  55. package/dist/lib/git.d.ts.map +1 -1
  56. package/dist/lib/git.js +7 -2
  57. package/dist/lib/git.js.map +1 -1
  58. package/dist/lib/import-defaults.d.ts +11 -4
  59. package/dist/lib/import-defaults.d.ts.map +1 -1
  60. package/dist/lib/import-defaults.js +11 -4
  61. package/dist/lib/import-defaults.js.map +1 -1
  62. package/dist/lib/launch/mcp-child-env.d.ts.map +1 -1
  63. package/dist/lib/launch/mcp-child-env.js +6 -4
  64. package/dist/lib/launch/mcp-child-env.js.map +1 -1
  65. package/dist/lib/local-db.d.ts +13 -0
  66. package/dist/lib/local-db.d.ts.map +1 -1
  67. package/dist/lib/local-db.js +23 -0
  68. package/dist/lib/local-db.js.map +1 -1
  69. package/dist/lib/local-embeddings-native.d.ts +17 -0
  70. package/dist/lib/local-embeddings-native.d.ts.map +1 -0
  71. package/dist/lib/local-embeddings-native.js +78 -0
  72. package/dist/lib/local-embeddings-native.js.map +1 -0
  73. package/dist/lib/local-embeddings.d.ts.map +1 -1
  74. package/dist/lib/local-embeddings.js +46 -47
  75. package/dist/lib/local-embeddings.js.map +1 -1
  76. package/dist/lib/local-gateway-client.d.ts.map +1 -1
  77. package/dist/lib/local-gateway-client.js +32 -26
  78. package/dist/lib/local-gateway-client.js.map +1 -1
  79. package/dist/lib/model-cache.d.ts +13 -0
  80. package/dist/lib/model-cache.d.ts.map +1 -1
  81. package/dist/lib/model-cache.js +26 -0
  82. package/dist/lib/model-cache.js.map +1 -1
  83. package/dist/lib/next-step.d.ts +2 -0
  84. package/dist/lib/next-step.d.ts.map +1 -1
  85. package/dist/lib/next-step.js +37 -16
  86. package/dist/lib/next-step.js.map +1 -1
  87. package/dist/lib/reason-extract.d.ts +35 -0
  88. package/dist/lib/reason-extract.d.ts.map +1 -0
  89. package/dist/lib/reason-extract.js +278 -0
  90. package/dist/lib/reason-extract.js.map +1 -0
  91. package/dist/lib/safe-config-write.d.ts +24 -1
  92. package/dist/lib/safe-config-write.d.ts.map +1 -1
  93. package/dist/lib/safe-config-write.js +113 -26
  94. package/dist/lib/safe-config-write.js.map +1 -1
  95. package/dist/lib/suppress-sqlite-warning.d.ts +13 -0
  96. package/dist/lib/suppress-sqlite-warning.d.ts.map +1 -0
  97. package/dist/lib/suppress-sqlite-warning.js +21 -0
  98. package/dist/lib/suppress-sqlite-warning.js.map +1 -0
  99. package/dist/lib/sync/spawn-background.d.ts +1 -1
  100. package/dist/lib/sync/spawn-background.d.ts.map +1 -1
  101. package/dist/lib/sync/spawn-background.js +1 -1
  102. package/dist/lib/sync/spawn-background.js.map +1 -1
  103. package/dist/lib/tar-lite.d.ts +18 -0
  104. package/dist/lib/tar-lite.d.ts.map +1 -0
  105. package/dist/lib/tar-lite.js +120 -0
  106. package/dist/lib/tar-lite.js.map +1 -0
  107. package/dist/lib/user-hooks.d.ts.map +1 -1
  108. package/dist/lib/user-hooks.js +13 -3
  109. package/dist/lib/user-hooks.js.map +1 -1
  110. package/dist/lib/verified-download.d.ts +19 -0
  111. package/dist/lib/verified-download.d.ts.map +1 -0
  112. package/dist/lib/verified-download.js +105 -0
  113. package/dist/lib/verified-download.js.map +1 -0
  114. package/package.json +5 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tar-lite.d.ts","sourceRoot":"","sources":["../../src/lib/tar-lite.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;IACjB,mFAAmF;IACnF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAMD;uFACuF;AACvF,wBAAgB,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,CAqCpD;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB;AAOD;yDACyD;AACzD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,QAAQ,EAAE,CAiCvE;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,MAAM,EAAE,CASxF"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * A deliberately tiny ustar reader and writer, for the one archive shape we publish: plain
3
+ * regular files, sorted, no links, no devices, no extended headers.
4
+ *
5
+ * Why not a library: the install-weight work exists to REMOVE dependencies, and extracting an
6
+ * archive we built ourselves needs about sixty lines. Why so strict on read: the archive comes
7
+ * off the network. It is hash-checked first (verified-download.ts), but a reader that would
8
+ * follow a `../` or a symlink if the hash check were ever bypassed is one defect from writing
9
+ * outside the cache, so anything beyond a regular file with a clean relative name throws.
10
+ */
11
+ import { mkdirSync, writeFileSync } from 'node:fs';
12
+ import { dirname, join, posix } from 'node:path';
13
+ const BLOCK = 512;
14
+ function octal(value, width) {
15
+ return `${value.toString(8).padStart(width - 1, '0')}\0`;
16
+ }
17
+ /** Byte-identical output for identical input: sorted, mtime 0, owner 0. That is what lets a
18
+ * digest pinned in source be re-derived by anyone, from the same upstream package. */
19
+ export function writeTar(entries) {
20
+ const parts = [];
21
+ const sorted = [...entries].sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0));
22
+ for (const e of sorted) {
23
+ const header = Buffer.alloc(BLOCK);
24
+ let name = e.path;
25
+ let prefix = '';
26
+ if (Buffer.byteLength(name) > 100) {
27
+ // split at a '/' so that name <= 100 and prefix <= 155
28
+ let at = -1;
29
+ for (let i = 0; i < name.length; i++) {
30
+ if (name[i] === '/' && Buffer.byteLength(name.slice(i + 1)) <= 100 && Buffer.byteLength(name.slice(0, i)) <= 155) {
31
+ at = i;
32
+ break;
33
+ }
34
+ }
35
+ if (at < 0)
36
+ throw new Error(`tar path too long: ${e.path}`);
37
+ prefix = name.slice(0, at);
38
+ name = name.slice(at + 1);
39
+ }
40
+ header.write(name, 0, 100, 'utf8');
41
+ header.write(octal(e.mode ?? 0o644, 8), 100, 8, 'ascii');
42
+ header.write(octal(0, 8), 108, 8, 'ascii');
43
+ header.write(octal(0, 8), 116, 8, 'ascii');
44
+ header.write(octal(e.data.length, 12), 124, 12, 'ascii');
45
+ header.write(octal(0, 12), 136, 12, 'ascii');
46
+ header.write(' ', 148, 8, 'ascii'); // checksum placeholder: eight spaces
47
+ header.write('0', 156, 1, 'ascii');
48
+ header.write('ustar\0', 257, 6, 'ascii');
49
+ header.write('00', 263, 2, 'ascii');
50
+ header.write(prefix, 345, 155, 'utf8');
51
+ let sum = 0;
52
+ for (const b of header)
53
+ sum += b;
54
+ header.write(`${sum.toString(8).padStart(6, '0')}\0 `, 148, 8, 'ascii');
55
+ parts.push(header, Buffer.from(e.data));
56
+ const pad = (BLOCK - (e.data.length % BLOCK)) % BLOCK;
57
+ if (pad)
58
+ parts.push(Buffer.alloc(pad));
59
+ }
60
+ parts.push(Buffer.alloc(BLOCK * 2));
61
+ return Buffer.concat(parts);
62
+ }
63
+ function cString(buf, start, len) {
64
+ const end = buf.indexOf(0, start);
65
+ return buf.toString('utf8', start, end >= 0 && end < start + len ? end : start + len);
66
+ }
67
+ /** Parse every entry, validating all of them, BEFORE any file is written: a bad entry late in
68
+ * the archive must not leave the first half on disk. */
69
+ export function parseTar(buf, limits) {
70
+ const out = [];
71
+ let total = 0;
72
+ let off = 0;
73
+ while (off + BLOCK <= buf.length) {
74
+ const header = buf.subarray(off, off + BLOCK);
75
+ if (header.every((b) => b === 0))
76
+ return out;
77
+ const stored = parseInt(cString(buf, off + 148, 8).trim() || '-1', 8);
78
+ let sum = 0;
79
+ for (let i = 0; i < BLOCK; i++)
80
+ sum += i >= 148 && i < 156 ? 32 : header[i];
81
+ if (stored !== sum)
82
+ throw new Error('corrupt tar header (checksum mismatch)');
83
+ const type = String.fromCharCode(header[156] ?? 0);
84
+ if (type !== '0' && type !== '\0')
85
+ throw new Error(`unsupported tar entry type ${JSON.stringify(type)}; only regular files are allowed`);
86
+ const name = cString(buf, off, 100);
87
+ const prefix = cString(buf, off + 345, 155);
88
+ const path = prefix ? `${prefix}/${name}` : name;
89
+ const size = parseInt(cString(buf, off + 124, 12).trim() || '0', 8);
90
+ const mode = parseInt(cString(buf, off + 100, 8).trim() || '0', 8);
91
+ if (!Number.isFinite(size) || size < 0)
92
+ throw new Error(`bad size for ${path}`);
93
+ // Archive names are always '/'-separated, so judge them with POSIX rules on every OS (the host's
94
+ // normalize() would rewrite '/' to '\\' on Windows and reject every nested path).
95
+ const norm = posix.normalize(path);
96
+ if (!path || posix.isAbsolute(path) || path.includes('\\') || path.includes('\0') || path.includes(':') || norm.split('/').includes('..') || norm !== path) {
97
+ throw new Error(`unsafe path in archive: ${JSON.stringify(path)}`);
98
+ }
99
+ total += size;
100
+ if (out.length + 1 > limits.maxEntries || total > limits.maxTotalBytes)
101
+ throw new Error('archive exceeds the allowed size or entry count');
102
+ const start = off + BLOCK;
103
+ if (start + size > buf.length)
104
+ throw new Error(`truncated archive at ${path}`);
105
+ out.push({ path, data: buf.subarray(start, start + size), mode });
106
+ off = start + Math.ceil(size / BLOCK) * BLOCK;
107
+ }
108
+ throw new Error('archive has no end marker (truncated)');
109
+ }
110
+ export function extractTar(buf, destDir, limits) {
111
+ const entries = parseTar(buf, limits);
112
+ for (const e of entries) {
113
+ const target = join(destDir, e.path);
114
+ mkdirSync(dirname(target), { recursive: true, mode: 0o700 });
115
+ // 0o755 only when the archive says executable; the owner alone may write either way.
116
+ writeFileSync(target, e.data, { mode: (e.mode ?? 0) & 0o111 ? 0o755 : 0o644 });
117
+ }
118
+ return entries.map((e) => e.path);
119
+ }
120
+ //# sourceMappingURL=tar-lite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tar-lite.js","sourceRoot":"","sources":["../../src/lib/tar-lite.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAEjD,MAAM,KAAK,GAAG,GAAG,CAAC;AASlB,SAAS,KAAK,CAAC,KAAa,EAAE,KAAa;IACzC,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAG,IAAI,CAAC;AAC7D,CAAC;AAED;uFACuF;AACvF,MAAM,UAAU,QAAQ,CAAC,OAAmB;IAC1C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7F,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QAClB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;YAClC,uDAAuD;YACvD,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;YACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;oBAAC,EAAE,GAAG,CAAC,CAAC;oBAAC,MAAM;gBAAC,CAAC;YACtI,CAAC;YACD,IAAI,EAAE,GAAG,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC5D,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3B,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC5B,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QACzD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;QACzD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,qCAAqC;QAChF,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACvC,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,KAAK,MAAM,CAAC,IAAI,MAAM;YAAE,GAAG,IAAI,CAAC,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAG,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QAC1E,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC;QACtD,IAAI,GAAG;YAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IACpC,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC;AAOD,SAAS,OAAO,CAAC,GAAW,EAAE,KAAa,EAAE,GAAW;IACtD,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAClC,OAAO,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC;AACxF,CAAC;AAED;yDACyD;AACzD,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,MAAqB;IACzD,MAAM,GAAG,GAAe,EAAE,CAAC;IAC3B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,OAAO,GAAG,GAAG,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,KAAK,CAAC,CAAC;QAC9C,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;YAAE,OAAO,GAAG,CAAC;QAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;QACtE,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE;YAAE,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC;QAC7E,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC9E,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QACnD,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QACzI,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACjD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;QACpE,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;QACnE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;QAChF,iGAAiG;QACjG,kFAAkF;QAClF,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAC3J,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,KAAK,IAAI,IAAI,CAAC;QACd,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,UAAU,IAAI,KAAK,GAAG,MAAM,CAAC,aAAa;YAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QAC3I,MAAM,KAAK,GAAG,GAAG,GAAG,KAAK,CAAC;QAC1B,IAAI,KAAK,GAAG,IAAI,GAAG,GAAG,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC;QAC/E,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,GAAG,GAAG,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC;IAChD,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,OAAe,EAAE,MAAqB;IAC5E,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACtC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACrC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7D,qFAAqF;QACrF,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"user-hooks.d.ts","sourceRoot":"","sources":["../../src/lib/user-hooks.ts"],"names":[],"mappings":"AAGA,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAiBnE,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEtD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,CAAC;IACf,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;CACd;AAMD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAIxE;AA+GD,wBAAgB,cAAc,CAC5B,MAAM,EAAE,cAAc,EACtB,GAAG,CAAC,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,SAAS;AACrB,4FAA4F;AAC5F,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAChC,OAAO,CAqDT;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAwB/D;AAED,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD"}
1
+ {"version":3,"file":"user-hooks.d.ts","sourceRoot":"","sources":["../../src/lib/user-hooks.ts"],"names":[],"mappings":"AAGA,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAiBnE,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEtD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,CAAC;IACf,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;CACd;AAOD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAUxE;AAkHD,wBAAgB,cAAc,CAC5B,MAAM,EAAE,cAAc,EACtB,GAAG,CAAC,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,SAAS;AACrB,4FAA4F;AAC5F,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAChC,OAAO,CAqDT;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAwB/D;AAED,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD"}
@@ -6,10 +6,17 @@ import { safeWriteJson } from './safe-config-write.js';
6
6
  // The hook budget on every host is <=10s (check.ts); the same number Claude Code's hook uses.
7
7
  const HOOK_TIMEOUT_SECONDS = 10;
8
8
  const OURS = 'align check --advisory';
9
+ const COPILOT_ABSENT_GUARD = 'command -v align >/dev/null 2>&1 || exit 0; ';
9
10
  export function advisoryHookCommand(host, env) {
10
11
  // prod is the default env, so leave it off - the same rule agent-rules.ts follows.
11
12
  const envArg = env && env !== 'prod' ? ` --env ${env}` : '';
12
- return `${OURS} --format ${host}${envArg}`;
13
+ const command = `${OURS} --format ${host}${envArg}`;
14
+ // Copilot CLI denies a tool call when a preToolUse hook exits non-zero, and this file is the
15
+ // user's, so it fires in every project. A missing align (uninstalled, or not on the hook
16
+ // shell's PATH) is exit 127 and would block every edit. Guard the absent case only: a present
17
+ // align keeps its own exit status and output. The entry only has a `bash` field, so this guard covers hosts that run it; Windows is unchanged.
18
+ // The other hosts treat a non-zero exit as a non-blocking error, so they keep the bare form.
19
+ return host === 'copilot' ? `${COPILOT_ABSENT_GUARD}${command}` : command;
13
20
  }
14
21
  // Every field name here comes from the host's published hook schema:
15
22
  // Codex ~/.codex/hooks.json {hooks:{PreToolUse:[{matcher, hooks:[{type,command,timeout}]}]}}
@@ -63,8 +70,11 @@ function isOurs(spec, entry) {
63
70
  function isPristine(host, spec, entry) {
64
71
  const command = spec.commandsOf(entry).find((c) => c.includes(OURS));
65
72
  // The command itself must be one align writes: an appended flag or a wrapper is an edit too.
66
- return command !== undefined
67
- && new RegExp(`^${OURS} --format ${host}( --env \\S+)?$`).test(command)
73
+ // Copilot's command carries the absent-align guard (ALI-1749); the bare form older versions
74
+ // wrote is pristine too, which is what lets a re-run migrate it.
75
+ const bare = host === 'copilot' && command?.startsWith(COPILOT_ABSENT_GUARD) ? command.slice(COPILOT_ABSENT_GUARD.length) : command;
76
+ return command !== undefined && bare !== undefined
77
+ && new RegExp(`^${OURS} --format ${host}( --env \\S+)?$`).test(bare)
68
78
  && isDeepStrictEqual(entry, spec.entry(command));
69
79
  }
70
80
  // Throws on a file we cannot parse rather than rewriting it - the same rule every JSON
@@ -1 +1 @@
1
- {"version":3,"file":"user-hooks.js","sourceRoot":"","sources":["../../src/lib/user-hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAkB,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAwBvD,8FAA8F;AAC9F,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAChC,MAAM,IAAI,GAAG,wBAAwB,CAAC;AAEtC,MAAM,UAAU,mBAAmB,CAAC,IAAc,EAAE,GAAY;IAC9D,mFAAmF;IACnF,MAAM,MAAM,GAAG,GAAG,IAAI,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,OAAO,GAAG,IAAI,aAAa,IAAI,GAAG,MAAM,EAAE,CAAC;AAC7C,CAAC;AAaD,qEAAqE;AACrE,oGAAoG;AACpG,yFAAyF;AACzF,yFAAyF;AACzF,uFAAuF;AACvF,+FAA+F;AAC/F,uFAAuF;AACvF,uFAAuF;AACvF,oDAAoD;AACpD,sGAAsG;AACtG,4FAA4F;AAC5F,wFAAwF;AACxF,8FAA8F;AAC9F,MAAM,KAAK,GAA+B;IACxC,KAAK,EAAE;QACL,MAAM,EAAE,CAAC,YAAY,CAAC;QACtB,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACnB,OAAO,EAAE,wBAAwB;YACjC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC;SACrE,CAAC;QACF,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE;YACpB,MAAM,KAAK,GAAI,KAAyD,EAAE,KAAK,CAAC;YAChF,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,CAAC;KACF;IACD,MAAM,EAAE;QACN,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,CAAC,YAAY,EAAE,aAAa,CAAC;QACrC,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC;QAClF,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,CAAE,KAAsC,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;KACxF;IACD,OAAO,EAAE;QACP,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,CAAC,YAAY,EAAE,aAAa,CAAC;QACrC,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACnB,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,4CAA4C;YACrD,IAAI,EAAE,OAAO;YACb,UAAU,EAAE,oBAAoB;SACjC,CAAC;QACF,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,CAAE,KAAmC,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;KAClF;CACF,CAAC;AAEF,SAAS,MAAM,CAAC,IAAc,EAAE,KAAc;IAC5C,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,6FAA6F;AAC7F,+FAA+F;AAC/F,wEAAwE;AACxE,SAAS,UAAU,CAAC,IAAc,EAAE,IAAc,EAAE,KAAc;IAChE,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACrE,6FAA6F;IAC7F,OAAO,OAAO,KAAK,SAAS;WACvB,IAAI,MAAM,CAAC,IAAI,IAAI,aAAa,IAAI,iBAAiB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;WACpE,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,uFAAuF;AACvF,4FAA4F;AAC5F,gCAAgC;AAChC,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAAyB,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC9D,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC;IAC7B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,2EAA2E,CAAC,CAAC;IACtG,CAAC;AACH,CAAC;AAED,0FAA0F;AAC1F,2FAA2F;AAC3F,4FAA4F;AAC5F,uFAAuF;AACvF,SAAS,OAAO,CAAC,MAA+B,EAAE,IAAY;IAC5D,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9B,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACnC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,+EAA+E,CAAC,CAAC;IAC1G,CAAC;IACD,OAAO,KAAgC,CAAC;AAC1C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,GAA0B,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AAEvE,MAAM,UAAU,cAAc,CAC5B,MAAsB,EACtB,GAAY,EACZ,SAAqB;AACrB,4FAA4F;AAC5F,QAAiC;IAEjC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACtD,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,wEAAwE;IACxE,MAAM,KAAK,GAAG,CAAC,MAA+B,EAAuC,EAAE;QACrF,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3C,yEAAyE;QACzE,IAAI,SAAS,IAAI,GAAG,KAAK,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAC7D,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAE,KAAK,CAAC,KAAK,CAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACxI,OAAO,GAAG,IAAI,CAAC;YACf,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,oGAAoG;QACpG,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAc,CAAC;QACpG,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACpH,MAAM,GAAG,IAAI,CAAC;YACd,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;YAClC,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3D,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YACpC,KAAK,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;QAC3B,CAAC;QACD,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;QACxB,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,SAAS;YAAE,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;QACpG,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IAEF,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,iBAAiB,EAAE,mCAAmC,EAAE,CAAC,CAAC;QACpI,IAAI,OAAO,EAAE,CAAC;YACZ,SAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,MAAM;YAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACpC,OAAO,MAAM,KAAK,SAAS,CAAC;IAC9B,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAChD,KAAK,CAAC,MAAM,CAAC,CAAC;IACd,IAAI,OAAO,EAAE,CAAC;QACZ,SAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,MAAM;QAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3E,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,MAAsB;IACpD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAE1B,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAc,CAAC;QAChF,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3D,IAAI,SAAS,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;YAAE,OAAO,GAAG,IAAI,CAAC;QACzD,IAAI,SAAS,CAAC,MAAM;YAAE,KAAK,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;;YAC1C,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IACD,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAE3B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC;IACtF,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9D,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;IACxB,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3E,OAAO,IAAI,CAAC;AACd,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,wCAAwC,IAAI,oHAAoH,CAAC;AAC1K,CAAC"}
1
+ {"version":3,"file":"user-hooks.js","sourceRoot":"","sources":["../../src/lib/user-hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export type DownloadFailure = 'network' | 'http' | 'size' | 'checksum';
2
+ export declare class DownloadError extends Error {
3
+ readonly kind: DownloadFailure;
4
+ constructor(kind: DownloadFailure, message: string);
5
+ }
6
+ export interface FetchVerifiedOptions {
7
+ /** Lower-case hex SHA-256 of the bytes this call returns (after gunzip, when `gunzip`). */
8
+ sha256: string;
9
+ /** Hard cap on the returned (decompressed) size. Also bounds what a gzip bomb can expand to. */
10
+ maxBytes: number;
11
+ /** Treat the body as gzip and verify the DECOMPRESSED content. Digest of content, not of the
12
+ * compressor's output: zlib versions differ, so a digest of the .gz would not reproduce. */
13
+ gunzip?: boolean;
14
+ timeoutMs?: number;
15
+ fetchImpl?: typeof fetch;
16
+ }
17
+ export declare const DEFAULT_TIMEOUT_MS = 120000;
18
+ export declare function fetchVerified(url: string, opts: FetchVerifiedOptions): Promise<Buffer>;
19
+ //# sourceMappingURL=verified-download.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verified-download.d.ts","sourceRoot":"","sources":["../../src/lib/verified-download.ts"],"names":[],"mappings":"AAkBA,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;AAEvE,qBAAa,aAAc,SAAQ,KAAK;IAC1B,QAAQ,CAAC,IAAI,EAAE,eAAe;gBAArB,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM;CAI5D;AAED,MAAM,WAAW,oBAAoB;IACnC,2FAA2F;IAC3F,MAAM,EAAE,MAAM,CAAC;IACf,gGAAgG;IAChG,QAAQ,EAAE,MAAM,CAAC;IACjB;iGAC6F;IAC7F,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAED,eAAO,MAAM,kBAAkB,SAAU,CAAC;AAwD1C,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAe5F"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Download a file and refuse it unless its SHA-256 matches a digest pinned in OUR source.
3
+ *
4
+ * Everything the on-device embedding path fetches goes through here (the native runtime
5
+ * bundle, the model weights, the tokenizer). The digest, not the host, is the trust anchor:
6
+ * GitHub, huggingface.co and any mirror a user points us at are all equally untrusted until
7
+ * the bytes hash to the value that shipped inside this package.
8
+ *
9
+ * Fails closed and loud. A mismatch, a short read, an over-size body, an HTTP error and a
10
+ * network failure each throw a `DownloadError` and return nothing, so a caller can never end
11
+ * up holding unverified bytes. Nothing here writes to disk: persisting is the caller's job and
12
+ * only ever happens after this returned.
13
+ */
14
+ import { createHash } from 'node:crypto';
15
+ import { readFileSync, statSync } from 'node:fs';
16
+ import { fileURLToPath } from 'node:url';
17
+ import { gunzipSync } from 'node:zlib';
18
+ export class DownloadError extends Error {
19
+ kind;
20
+ constructor(kind, message) {
21
+ super(message);
22
+ this.kind = kind;
23
+ this.name = 'DownloadError';
24
+ }
25
+ }
26
+ export const DEFAULT_TIMEOUT_MS = 120_000;
27
+ function sha256Hex(data) {
28
+ return createHash('sha256').update(data).digest('hex');
29
+ }
30
+ async function readBody(url, maxBytes, timeoutMs, fetchImpl) {
31
+ if (url.startsWith('file:')) {
32
+ // Used by CI and mirrors that pre-stage the files. Same digest check applies afterwards.
33
+ const path = fileURLToPath(url);
34
+ // Regular file, size checked BEFORE reading: file:///dev/zero or a multi-GB file must not be slurped.
35
+ const st = statSync(path);
36
+ if (!st.isFile())
37
+ throw new DownloadError('network', `${url} is not a regular file`);
38
+ if (st.size > maxBytes)
39
+ throw new DownloadError('size', `${url} is ${st.size} bytes, over the ${maxBytes} byte limit`);
40
+ return readFileSync(path);
41
+ }
42
+ // An IDLE timeout, re-armed on every chunk: a slow link may take as long as it needs as long as
43
+ // bytes keep arriving, while a stalled or silent server is cut after `timeoutMs`.
44
+ const ctl = new AbortController();
45
+ let timer = setTimeout(() => ctl.abort(), timeoutMs);
46
+ const rearm = () => { clearTimeout(timer); timer = setTimeout(() => ctl.abort(), timeoutMs); };
47
+ try {
48
+ return await readHttp(url, maxBytes, fetchImpl, ctl.signal, rearm);
49
+ }
50
+ finally {
51
+ clearTimeout(timer);
52
+ }
53
+ }
54
+ async function readHttp(url, maxBytes, fetchImpl, signal, rearm) {
55
+ let res;
56
+ try {
57
+ res = await fetchImpl(url, { signal, redirect: 'follow' });
58
+ }
59
+ catch (err) {
60
+ throw new DownloadError('network', `could not reach ${new URL(url).host}: ${err.message}`);
61
+ }
62
+ rearm();
63
+ if (!res.ok)
64
+ throw new DownloadError('http', `${new URL(url).host} answered HTTP ${res.status} for ${url}`);
65
+ const declared = Number(res.headers.get('content-length') ?? '0');
66
+ if (declared > maxBytes)
67
+ throw new DownloadError('size', `${url} declares ${declared} bytes, over the ${maxBytes} byte limit`);
68
+ const chunks = [];
69
+ let total = 0;
70
+ try {
71
+ if (!res.body)
72
+ throw new Error('empty response body');
73
+ for await (const chunk of res.body) {
74
+ rearm();
75
+ total += chunk.length;
76
+ if (total > maxBytes)
77
+ throw new DownloadError('size', `${url} sent more than the ${maxBytes} byte limit`);
78
+ chunks.push(Buffer.from(chunk));
79
+ }
80
+ }
81
+ catch (err) {
82
+ if (err instanceof DownloadError)
83
+ throw err;
84
+ throw new DownloadError('network', `connection to ${new URL(url).host} broke mid-download: ${err.message}`);
85
+ }
86
+ return Buffer.concat(chunks);
87
+ }
88
+ export async function fetchVerified(url, opts) {
89
+ const raw = await readBody(url, opts.maxBytes, opts.timeoutMs ?? DEFAULT_TIMEOUT_MS, opts.fetchImpl ?? fetch);
90
+ let content = raw;
91
+ if (opts.gunzip) {
92
+ try {
93
+ content = gunzipSync(raw, { maxOutputLength: opts.maxBytes });
94
+ }
95
+ catch (err) {
96
+ throw new DownloadError('size', `${url} is not a valid gzip file or expands past ${opts.maxBytes} bytes: ${err.message}`);
97
+ }
98
+ }
99
+ const actual = sha256Hex(content);
100
+ if (actual !== opts.sha256.toLowerCase()) {
101
+ throw new DownloadError('checksum', `${url} hashed to ${actual}, expected ${opts.sha256}. Refusing to use it.`);
102
+ }
103
+ return content;
104
+ }
105
+ //# sourceMappingURL=verified-download.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verified-download.js","sourceRoot":"","sources":["../../src/lib/verified-download.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aligndottech/cli",
3
- "version": "0.57.1",
3
+ "version": "0.59.0",
4
4
  "mcpName": "io.github.aligndottech/cli",
5
5
  "type": "module",
6
6
  "description": "Align CLI - capture decisions, check alignment, and manage connectors",
@@ -37,6 +37,7 @@
37
37
  "dependencies": {
38
38
  "@aligndottech/connector-core": "^0.10.1",
39
39
  "@clack/prompts": "^1.7.0",
40
+ "@huggingface/tokenizers": "0.2.0",
40
41
  "@modelcontextprotocol/sdk": "^1.29.0",
41
42
  "chalk": "^5.3.0",
42
43
  "ci-info": "^4.4.0",
@@ -53,6 +54,7 @@
53
54
  },
54
55
  "devDependencies": {
55
56
  "@eslint/js": "^9.0.0",
57
+ "@huggingface/transformers": "^4.2.0",
56
58
  "@types/eventsource": "^1.1.15",
57
59
  "@types/js-yaml": "^4.0.9",
58
60
  "@types/node": "^22.0.0",
@@ -67,9 +69,6 @@
67
69
  "typescript": "^5.6.0",
68
70
  "vitest": "^3.2.4"
69
71
  },
70
- "optionalDependencies": {
71
- "@huggingface/transformers": "^4.2.0"
72
- },
73
72
  "overrides": {
74
73
  "hono": "4.13.7",
75
74
  "@hono/node-server": "1.19.17",
@@ -77,7 +76,8 @@
77
76
  "fast-uri": "3.1.7",
78
77
  "ip-address": "10.7.0",
79
78
  "qs": "6.16.0",
80
- "body-parser": "2.3.0"
79
+ "body-parser": "2.3.0",
80
+ "onnxruntime-node": "1.30.0"
81
81
  },
82
82
  "engines": {
83
83
  "node": ">=22.16"