token-goat 2.9.29 → 2.9.31

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 (197) hide show
  1. package/README.md +53 -42
  2. package/SECURITY.md +37 -11
  3. package/THIRD_PARTY_NOTICES.md +41 -4
  4. package/dist/native/linux-arm64/tg-hook +0 -0
  5. package/dist/native/linux-x64/tg-hook +0 -0
  6. package/dist/native/win32-arm64/tg-hook.exe +0 -0
  7. package/dist/native/win32-x64/tg-hook.exe +0 -0
  8. package/dist/ort-wasm-simd-threaded.mjs +59 -0
  9. package/dist/{token-goat-chunk-SE6E4BKJ.mjs → token-goat-chunk-25TRAWET.mjs} +23 -6
  10. package/dist/token-goat-chunk-2KXO6V2B.mjs +203 -0
  11. package/dist/{token-goat-chunk-UXSXQQIY.mjs → token-goat-chunk-2M7E4PF7.mjs} +43 -14
  12. package/dist/token-goat-chunk-2UPZGKKY.mjs +188 -0
  13. package/dist/token-goat-chunk-2WLPWKHV.mjs +135 -0
  14. package/dist/token-goat-chunk-2XBMMDBD.mjs +126 -0
  15. package/dist/token-goat-chunk-32ZOY4N5.mjs +23 -0
  16. package/dist/token-goat-chunk-3EZRNKTK.mjs +188 -0
  17. package/dist/token-goat-chunk-4ADZHI7J.mjs +63 -0
  18. package/dist/token-goat-chunk-4GBVPH3D.mjs +242 -0
  19. package/dist/{token-goat-chunk-2WOUYWLM.mjs → token-goat-chunk-4GILLLWY.mjs} +34 -7
  20. package/dist/token-goat-chunk-4NAPX7BA.mjs +90 -0
  21. package/dist/{token-goat-chunk-NMBWLRHW.mjs → token-goat-chunk-4SC7UJYV.mjs} +9981 -11563
  22. package/dist/token-goat-chunk-4SMRO4TO.mjs +366 -0
  23. package/dist/{token-goat-chunk-O6I2XU4P.mjs → token-goat-chunk-4ZBFWLXF.mjs} +310 -441
  24. package/dist/token-goat-chunk-57BIAXJL.mjs +286 -0
  25. package/dist/token-goat-chunk-5AC66HNP.mjs +115 -0
  26. package/dist/token-goat-chunk-5IMLKSOP.mjs +145 -0
  27. package/dist/token-goat-chunk-5RG5SBL6.mjs +221 -0
  28. package/dist/{token-goat-chunk-RRNZMM3A.mjs → token-goat-chunk-5Y6ZYL6U.mjs} +21 -2
  29. package/dist/token-goat-chunk-646E6U44.mjs +398 -0
  30. package/dist/token-goat-chunk-65N4RHP4.mjs +33 -0
  31. package/dist/{token-goat-chunk-6AK46ZT7.mjs → token-goat-chunk-6DG6HWP3.mjs} +13 -3
  32. package/dist/token-goat-chunk-6ENQSNRZ.mjs +573 -0
  33. package/dist/token-goat-chunk-6ZY4GNF2.mjs +91 -0
  34. package/dist/{token-goat-chunk-E5TK5DNO.mjs → token-goat-chunk-76FGDLRO.mjs} +574 -340
  35. package/dist/{token-goat-chunk-TGOXNAHW.mjs → token-goat-chunk-7EZTZOMC.mjs} +780 -767
  36. package/dist/token-goat-chunk-7MAOA6X4.mjs +3647 -0
  37. package/dist/token-goat-chunk-7R2ZVVAX.mjs +218 -0
  38. package/dist/{token-goat-chunk-TCQANXYC.mjs → token-goat-chunk-AM5V6GSX.mjs} +18 -2
  39. package/dist/token-goat-chunk-AUNGYYQX.mjs +184 -0
  40. package/dist/token-goat-chunk-AUQYRMMH.mjs +2985 -0
  41. package/dist/token-goat-chunk-B3PEKBYG.mjs +128 -0
  42. package/dist/{token-goat-chunk-KOPIR3KZ.mjs → token-goat-chunk-BA4HI6BW.mjs} +1910 -165
  43. package/dist/{token-goat-chunk-52NSDWYY.mjs → token-goat-chunk-BFCWY73P.mjs} +58 -20
  44. package/dist/token-goat-chunk-BPGCUMR7.mjs +30 -0
  45. package/dist/token-goat-chunk-BWGFUZZE.mjs +25 -0
  46. package/dist/token-goat-chunk-C75NA7PL.mjs +322 -0
  47. package/dist/token-goat-chunk-CBIQ7WTD.mjs +87 -0
  48. package/dist/token-goat-chunk-CETM74KC.mjs +307 -0
  49. package/dist/token-goat-chunk-CIMQ2BB3.mjs +233 -0
  50. package/dist/{token-goat-chunk-DNSPXQXQ.mjs → token-goat-chunk-CJLS3CDL.mjs} +70 -18
  51. package/dist/{token-goat-chunk-MELOKFDJ.mjs → token-goat-chunk-CO3UYX6G.mjs} +7 -1
  52. package/dist/token-goat-chunk-COPNXRJM.mjs +154 -0
  53. package/dist/token-goat-chunk-CSJ5L3NL.mjs +479 -0
  54. package/dist/token-goat-chunk-CVCEVUGK.mjs +315 -0
  55. package/dist/token-goat-chunk-CXHOFN7R.mjs +371 -0
  56. package/dist/token-goat-chunk-D735C4QM.mjs +603 -0
  57. package/dist/{token-goat-chunk-E4ZOJIZK.mjs → token-goat-chunk-DGS2LVNA.mjs} +70 -160
  58. package/dist/{token-goat-chunk-L7H3U27L.mjs → token-goat-chunk-DOWRSMWO.mjs} +1 -1
  59. package/dist/token-goat-chunk-E45INMY3.mjs +71 -0
  60. package/dist/token-goat-chunk-EC5F37F4.mjs +244 -0
  61. package/dist/{token-goat-chunk-XTQAOTSO.mjs → token-goat-chunk-EDBDRVH5.mjs} +4 -1
  62. package/dist/token-goat-chunk-EELTBKDM.mjs +613 -0
  63. package/dist/token-goat-chunk-EVMZJ27Z.mjs +147 -0
  64. package/dist/token-goat-chunk-EXKGNHEG.mjs +2096 -0
  65. package/dist/{token-goat-chunk-YOOVFPTP.mjs → token-goat-chunk-F4HYL64R.mjs} +12 -2
  66. package/dist/token-goat-chunk-F6PAUIEK.mjs +624 -0
  67. package/dist/token-goat-chunk-FDSREWLX.mjs +692 -0
  68. package/dist/{token-goat-chunk-NMTKNYGF.mjs → token-goat-chunk-FNFBKLRD.mjs} +74 -9
  69. package/dist/token-goat-chunk-G5PJ7AGM.mjs +36 -0
  70. package/dist/token-goat-chunk-GGGG7RWB.mjs +236 -0
  71. package/dist/{token-goat-chunk-TDUT2CL6.mjs → token-goat-chunk-GL3ETKSC.mjs} +276 -19
  72. package/dist/{token-goat-chunk-7CPMDFGB.mjs → token-goat-chunk-GVB2MUST.mjs} +265 -1567
  73. package/dist/token-goat-chunk-GWFLAUMQ.mjs +307 -0
  74. package/dist/token-goat-chunk-HAVAOB3S.mjs +87 -0
  75. package/dist/token-goat-chunk-HLPW63A7.mjs +48 -0
  76. package/dist/token-goat-chunk-HU4TORC5.mjs +1377 -0
  77. package/dist/token-goat-chunk-I7VKZZAW.mjs +35 -0
  78. package/dist/token-goat-chunk-IA6XSPE3.mjs +218 -0
  79. package/dist/token-goat-chunk-IAGXMHIK.mjs +863 -0
  80. package/dist/{token-goat-chunk-435UQTKD.mjs → token-goat-chunk-IK2DRMFX.mjs} +129 -74
  81. package/dist/{token-goat-chunk-ZER6EAXZ.mjs → token-goat-chunk-INNPTRUX.mjs} +2954 -2783
  82. package/dist/token-goat-chunk-JJ5BX4F4.mjs +129 -0
  83. package/dist/token-goat-chunk-JVFSHVFJ.mjs +129 -0
  84. package/dist/token-goat-chunk-KGEFFSHD.mjs +50 -0
  85. package/dist/token-goat-chunk-KKUFXAPD.mjs +25 -0
  86. package/dist/token-goat-chunk-KQBLRPBN.mjs +433 -0
  87. package/dist/token-goat-chunk-LCNQ2CNN.mjs +497 -0
  88. package/dist/token-goat-chunk-M3LFJDPU.mjs +58 -0
  89. package/dist/token-goat-chunk-M52KPT3C.mjs +87 -0
  90. package/dist/token-goat-chunk-MBEG42H7.mjs +150 -0
  91. package/dist/{token-goat-chunk-EVC4TOLE.mjs → token-goat-chunk-METECDOH.mjs} +3 -12
  92. package/dist/{token-goat-chunk-2AWQ2R5X.mjs → token-goat-chunk-MHX7XCC3.mjs} +3 -2
  93. package/dist/token-goat-chunk-MNWKPRAL.mjs +13 -0
  94. package/dist/token-goat-chunk-N5LSOVSU.mjs +137 -0
  95. package/dist/{token-goat-chunk-DPNLUJWB.mjs → token-goat-chunk-N5MMR2IW.mjs} +30 -8
  96. package/dist/token-goat-chunk-N7B3JQ2C.mjs +160 -0
  97. package/dist/{token-goat-chunk-VMFWNHGR.mjs → token-goat-chunk-NISNMD7T.mjs} +2545 -2953
  98. package/dist/token-goat-chunk-NMD42SFQ.mjs +434 -0
  99. package/dist/token-goat-chunk-NOSS5VWY.mjs +174 -0
  100. package/dist/token-goat-chunk-NSNSPPBG.mjs +69 -0
  101. package/dist/token-goat-chunk-OBOFIHKN.mjs +38 -0
  102. package/dist/token-goat-chunk-OBRFJ5O5.mjs +76 -0
  103. package/dist/token-goat-chunk-ODBT2USM.mjs +800 -0
  104. package/dist/token-goat-chunk-OS5EM5PP.mjs +107 -0
  105. package/dist/token-goat-chunk-OUKDTVNU.mjs +1178 -0
  106. package/dist/token-goat-chunk-OXFMP75N.mjs +566 -0
  107. package/dist/{token-goat-chunk-ASLWOQ3I.mjs → token-goat-chunk-OYIYKDDT.mjs} +2 -1
  108. package/dist/{token-goat-chunk-67BNIKKO.mjs → token-goat-chunk-P6HQSWQ3.mjs} +55 -47
  109. package/dist/token-goat-chunk-P6VGNTQT.mjs +71 -0
  110. package/dist/token-goat-chunk-PFWIMH2E.mjs +261 -0
  111. package/dist/token-goat-chunk-PJZXIS3G.mjs +39 -0
  112. package/dist/token-goat-chunk-PUO5INXP.mjs +606 -0
  113. package/dist/token-goat-chunk-PX5PQWTY.mjs +462 -0
  114. package/dist/token-goat-chunk-Q5QDBC6O.mjs +111 -0
  115. package/dist/token-goat-chunk-QFNQXSDT.mjs +40 -0
  116. package/dist/token-goat-chunk-QH7YVYOY.mjs +3957 -0
  117. package/dist/token-goat-chunk-QLMUHEPB.mjs +43 -0
  118. package/dist/{token-goat-chunk-PYSUADX4.mjs → token-goat-chunk-QQOJIHL3.mjs} +50 -14
  119. package/dist/token-goat-chunk-QQTWJY2O.mjs +85 -0
  120. package/dist/token-goat-chunk-QYHO5CPH.mjs +93 -0
  121. package/dist/token-goat-chunk-RELAVWAD.mjs +27 -0
  122. package/dist/token-goat-chunk-RSLPOBKQ.mjs +339 -0
  123. package/dist/token-goat-chunk-SAMFDIS2.mjs +712 -0
  124. package/dist/token-goat-chunk-SDELXLDM.mjs +48 -0
  125. package/dist/{token-goat-chunk-PGTH2U4C.mjs → token-goat-chunk-SOAFZNNZ.mjs} +164 -40
  126. package/dist/{token-goat-chunk-G23DWHV4.mjs → token-goat-chunk-SRTHT7KV.mjs} +33 -15
  127. package/dist/token-goat-chunk-T5P5ACNQ.mjs +212 -0
  128. package/dist/token-goat-chunk-T5YGG4V3.mjs +45 -0
  129. package/dist/token-goat-chunk-TAUZ4OFS.mjs +110 -0
  130. package/dist/token-goat-chunk-TM6MC754.mjs +40 -0
  131. package/dist/token-goat-chunk-TWUKBOMP.mjs +72 -0
  132. package/dist/token-goat-chunk-U2KSB4SG.mjs +56 -0
  133. package/dist/token-goat-chunk-U4WHMG6Y.mjs +898 -0
  134. package/dist/token-goat-chunk-UA5V6P3P.mjs +122 -0
  135. package/dist/token-goat-chunk-UGJHGR5A.mjs +52 -0
  136. package/dist/{token-goat-chunk-RQGGMPCR.mjs → token-goat-chunk-UOUDVA5U.mjs} +76 -16
  137. package/dist/{token-goat-chunk-HNFZZHFW.mjs → token-goat-chunk-URRJ33GR.mjs} +22 -4
  138. package/dist/token-goat-chunk-UZOROKIS.mjs +165 -0
  139. package/dist/token-goat-chunk-VIHGGGEI.mjs +4234 -0
  140. package/dist/token-goat-chunk-VTJLAA7P.mjs +21 -0
  141. package/dist/token-goat-chunk-VWDXLT4F.mjs +678 -0
  142. package/dist/token-goat-chunk-VWZA2H4P.mjs +368 -0
  143. package/dist/{token-goat-chunk-QO3LXVVR.mjs → token-goat-chunk-VXEXMJDL.mjs} +2964 -3153
  144. package/dist/token-goat-chunk-WBA5SKT4.mjs +547 -0
  145. package/dist/{token-goat-chunk-ONXH6NZ5.mjs → token-goat-chunk-WDH44VAU.mjs} +19 -22
  146. package/dist/token-goat-chunk-X2SUP3EI.mjs +107 -0
  147. package/dist/token-goat-chunk-X3BELZSJ.mjs +125 -0
  148. package/dist/{token-goat-chunk-RLP6J7WR.mjs → token-goat-chunk-XLRBNZCC.mjs} +40 -21
  149. package/dist/{token-goat-chunk-S4VSXURL.mjs → token-goat-chunk-XRKUX6CM.mjs} +4 -0
  150. package/dist/token-goat-chunk-XX6O25RN.mjs +82 -0
  151. package/dist/token-goat-chunk-XZSUHBVS.mjs +65 -0
  152. package/dist/token-goat-chunk-Y2ZTQOCL.mjs +35 -0
  153. package/dist/{token-goat-chunk-UA5BKWWQ.mjs → token-goat-chunk-YB4VMGK2.mjs} +15 -4
  154. package/dist/token-goat-chunk-YBIIY3HR.mjs +51 -0
  155. package/dist/{token-goat-chunk-PKRWMHVP.mjs → token-goat-chunk-YHVDKQBR.mjs} +389 -221
  156. package/dist/token-goat-chunk-YJB5XLWI.mjs +26 -0
  157. package/dist/{token-goat-chunk-PQ53BSCF.mjs → token-goat-chunk-YKB6AQG3.mjs} +53 -31
  158. package/dist/token-goat-chunk-YMTG2YA5.mjs +35 -0
  159. package/dist/token-goat-chunk-YPBZYQRV.mjs +40 -0
  160. package/dist/{token-goat-chunk-HUYUHODZ.mjs → token-goat-chunk-YY6AVUFL.mjs} +13246 -12247
  161. package/dist/token-goat-chunk-Z7N5OMMP.mjs +98 -0
  162. package/dist/{token-goat-chunk-BGHSSJUA.mjs → token-goat-chunk-ZFOBKUWH.mjs} +1 -1
  163. package/dist/token-goat-chunk-ZMBL6UVV.mjs +110 -0
  164. package/dist/token-goat-chunk-ZNMNUPAZ.mjs +938 -0
  165. package/dist/token-goat-hook-client.cjs +87 -23
  166. package/dist/token-goat-hook-client.mjs +3 -3
  167. package/dist/token-goat-hook.mjs +76 -31
  168. package/dist/token-goat.core.mjs +6 -6
  169. package/docs/C4_RUNTIME_ARCHITECTURE.md +2 -2
  170. package/docs/cli.md +113 -60
  171. package/docs/install.md +63 -20
  172. package/docs/security.md +10 -8
  173. package/package.json +18 -7
  174. package/scripts/verify-native-dist.mjs +386 -0
  175. package/dist/token-goat-chunk-2NNUA2LR.mjs +0 -143
  176. package/dist/token-goat-chunk-44BM7DDQ.mjs +0 -294
  177. package/dist/token-goat-chunk-BGYOZ6DO.mjs +0 -24
  178. package/dist/token-goat-chunk-C5YPNZKQ.mjs +0 -318
  179. package/dist/token-goat-chunk-CIQ2FTY3.mjs +0 -1990
  180. package/dist/token-goat-chunk-D4ETHJD6.mjs +0 -246
  181. package/dist/token-goat-chunk-DNRPXHYH.mjs +0 -1062
  182. package/dist/token-goat-chunk-EUSDXRXU.mjs +0 -1429
  183. package/dist/token-goat-chunk-FTP4U4QA.mjs +0 -64
  184. package/dist/token-goat-chunk-G7IWXCFF.mjs +0 -456
  185. package/dist/token-goat-chunk-GLXRTTLE.mjs +0 -36
  186. package/dist/token-goat-chunk-H5J3C56Q.mjs +0 -1511
  187. package/dist/token-goat-chunk-IVWI2OCK.mjs +0 -368
  188. package/dist/token-goat-chunk-JTKCQMQA.mjs +0 -418
  189. package/dist/token-goat-chunk-LZNBQTDK.mjs +0 -26
  190. package/dist/token-goat-chunk-ORNFMIER.mjs +0 -295
  191. package/dist/token-goat-chunk-RTMVLHWX.mjs +0 -7113
  192. package/dist/token-goat-chunk-VQ6F6T7X.mjs +0 -36
  193. package/dist/token-goat-chunk-VZQEWRVH.mjs +0 -312
  194. package/dist/token-goat-chunk-XYWPOSCN.mjs +0 -807
  195. package/dist/token-goat-chunk-YAGLESS3.mjs +0 -23
  196. package/dist/token-goat-chunk-YKSRAWUU.mjs +0 -33
  197. package/dist/token-goat-chunk-Z6KBMOBI.mjs +0 -53
@@ -0,0 +1,35 @@
1
+ import { createRequire as __cjsRequire } from 'node:module';
2
+ const require = __cjsRequire(import.meta.url);
3
+ import {
4
+ computeSymbolFingerprints,
5
+ symbolNamesInFile
6
+ } from "./token-goat-chunk-COPNXRJM.mjs";
7
+ import {
8
+ resolveIndexPath
9
+ } from "./token-goat-chunk-FNFBKLRD.mjs";
10
+ import {
11
+ globalDbPath
12
+ } from "./token-goat-chunk-CO3UYX6G.mjs";
13
+ import {
14
+ init_define_import_meta_env
15
+ } from "./token-goat-chunk-A37V4PBF.mjs";
16
+
17
+ // src/note_anchor.ts
18
+ init_define_import_meta_env();
19
+ import * as fs from "node:fs";
20
+ function anchorStatus(root, anchor, dbPath = globalDbPath()) {
21
+ try {
22
+ const abs = resolveIndexPath(anchor.file, root);
23
+ if (!fs.existsSync(abs)) return "gone";
24
+ const now = computeSymbolFingerprints(abs, anchor.symbol, dbPath);
25
+ if (now.length === 1) return now[0] === anchor.sha ? "current" : "changed";
26
+ if (now.length > 1) return now.includes(anchor.sha) ? "current" : "unknown";
27
+ return symbolNamesInFile(abs, dbPath).length > 0 ? "gone" : "unknown";
28
+ } catch {
29
+ return "unknown";
30
+ }
31
+ }
32
+
33
+ export {
34
+ anchorStatus
35
+ };
@@ -0,0 +1,218 @@
1
+ import { createRequire as __cjsRequire } from 'node:module';
2
+ const require = __cjsRequire(import.meta.url);
3
+ import {
4
+ buildGuidanceBlock,
5
+ claudeMdPath,
6
+ codexAgentsPath,
7
+ copilotCliInstructionsPath,
8
+ isCodexInstalled,
9
+ isCopilotCliInstalled,
10
+ isInstalled
11
+ } from "./token-goat-chunk-7MAOA6X4.mjs";
12
+ import {
13
+ loadConfig
14
+ } from "./token-goat-chunk-7EZTZOMC.mjs";
15
+ import {
16
+ recordCreatedBy,
17
+ upsertDelimitedBlock
18
+ } from "./token-goat-chunk-HU4TORC5.mjs";
19
+ import {
20
+ init_define_import_meta_env
21
+ } from "./token-goat-chunk-A37V4PBF.mjs";
22
+
23
+ // src/cli_doctor_guidance.ts
24
+ init_define_import_meta_env();
25
+ import * as fs from "node:fs";
26
+ import * as path from "node:path";
27
+ var INSTRUCTION_GATE_BEGIN = "<!-- token-goat-begin -->";
28
+ var INSTRUCTION_GATE_END = "<!-- token-goat-end -->";
29
+ var CODEX_GATE_BEGIN = "<!-- token-goat-codex-begin -->";
30
+ var CODEX_GATE_END = "<!-- token-goat-codex-end -->";
31
+ function findInstructionGateCandidates(rootDir = process.cwd()) {
32
+ const candidates = [];
33
+ const claudeMdPath2 = path.join(rootDir, "CLAUDE.md");
34
+ const claudeMdExists = fs.existsSync(claudeMdPath2);
35
+ let claudeMdHasGate = false;
36
+ if (claudeMdExists) {
37
+ try {
38
+ const content = fs.readFileSync(claudeMdPath2, "utf8");
39
+ claudeMdHasGate = content.includes(INSTRUCTION_GATE_BEGIN) && content.includes(INSTRUCTION_GATE_END);
40
+ } catch {
41
+ }
42
+ }
43
+ candidates.push({
44
+ filename: "CLAUDE.md",
45
+ relativePath: "CLAUDE.md",
46
+ fullPath: claudeMdPath2,
47
+ harnessName: "Claude Code",
48
+ exists: claudeMdExists,
49
+ hasGate: claudeMdHasGate,
50
+ beginMarker: INSTRUCTION_GATE_BEGIN,
51
+ endMarker: INSTRUCTION_GATE_END,
52
+ fallbackToolClause: "Claude Code's own Read, Grep, and Glob preference rules"
53
+ });
54
+ const agentsMdPath = path.join(rootDir, "AGENTS.md");
55
+ const agentsMdExists = fs.existsSync(agentsMdPath);
56
+ let agentsMdHasGate = false;
57
+ if (agentsMdExists) {
58
+ try {
59
+ const content = fs.readFileSync(agentsMdPath, "utf8");
60
+ agentsMdHasGate = content.includes(CODEX_GATE_BEGIN) && content.includes(CODEX_GATE_END) || content.includes(INSTRUCTION_GATE_BEGIN) && content.includes(INSTRUCTION_GATE_END);
61
+ } catch {
62
+ }
63
+ }
64
+ candidates.push({
65
+ filename: "AGENTS.md",
66
+ relativePath: "AGENTS.md",
67
+ fullPath: agentsMdPath,
68
+ harnessName: "Codex / AGENTS.md",
69
+ exists: agentsMdExists,
70
+ hasGate: agentsMdHasGate,
71
+ beginMarker: CODEX_GATE_BEGIN,
72
+ endMarker: CODEX_GATE_END,
73
+ fallbackToolClause: "Codex's native `exec`, `apply_patch`, and `view_image` tools (shell commands like `cat`/`type` run inside `exec`)"
74
+ });
75
+ const copilotInstructionsPath = path.join(rootDir, ".github", "copilot-instructions.md");
76
+ const copilotInstructionsExists = fs.existsSync(copilotInstructionsPath);
77
+ let copilotInstructionsHasGate = false;
78
+ if (copilotInstructionsExists) {
79
+ try {
80
+ const content = fs.readFileSync(copilotInstructionsPath, "utf8");
81
+ copilotInstructionsHasGate = content.includes(INSTRUCTION_GATE_BEGIN) && content.includes(INSTRUCTION_GATE_END);
82
+ } catch {
83
+ }
84
+ }
85
+ candidates.push({
86
+ filename: "copilot-instructions.md",
87
+ relativePath: path.join(".github", "copilot-instructions.md"),
88
+ fullPath: copilotInstructionsPath,
89
+ harnessName: "GitHub Copilot CLI",
90
+ exists: copilotInstructionsExists,
91
+ hasGate: copilotInstructionsHasGate,
92
+ beginMarker: INSTRUCTION_GATE_BEGIN,
93
+ endMarker: INSTRUCTION_GATE_END,
94
+ fallbackToolClause: "Copilot CLI's native `view`, `grep`, and `glob` tools (with PowerShell commands `Get-Content`/`Select-String` as search fallbacks)"
95
+ });
96
+ return candidates;
97
+ }
98
+ function fileHasGate(fullPath, markers) {
99
+ let content;
100
+ try {
101
+ content = fs.readFileSync(fullPath, "utf8");
102
+ } catch {
103
+ return false;
104
+ }
105
+ return markers.some(([begin, end]) => content.includes(begin) && content.includes(end));
106
+ }
107
+ function findActiveGlobalGates() {
108
+ const globals = [
109
+ { fullPath: claudeMdPath(), markers: [[INSTRUCTION_GATE_BEGIN, INSTRUCTION_GATE_END]] },
110
+ { fullPath: codexAgentsPath(), markers: [[CODEX_GATE_BEGIN, CODEX_GATE_END], [INSTRUCTION_GATE_BEGIN, INSTRUCTION_GATE_END]] },
111
+ { fullPath: copilotCliInstructionsPath(), markers: [[INSTRUCTION_GATE_BEGIN, INSTRUCTION_GATE_END]] }
112
+ ];
113
+ return globals.filter((g) => fileHasGate(g.fullPath, g.markers)).map((g) => g.fullPath);
114
+ }
115
+ function checkInstructionGates(rootDir = process.cwd()) {
116
+ const candidates = findInstructionGateCandidates(rootDir);
117
+ const existingFiles = candidates.filter((c) => c.exists);
118
+ const gatedFiles = existingFiles.filter((c) => c.hasGate);
119
+ const activeGlobal = findActiveGlobalGates();
120
+ if (gatedFiles.length > 0 || activeGlobal.length > 0) {
121
+ const names = [...activeGlobal, ...gatedFiles.map((c) => c.relativePath)].join(", ");
122
+ return {
123
+ name: "Instruction gate",
124
+ status: "ok",
125
+ message: `active in ${names}`
126
+ };
127
+ }
128
+ if (existingFiles.length > 0) {
129
+ const unGated = existingFiles.map((c) => c.relativePath).join(", ");
130
+ return {
131
+ name: "Instruction gate",
132
+ status: "warn",
133
+ message: `missing in ${unGated} and in the user-level instruction files \`token-goat install\` writes (agents will bypass token-goat and read whole files). Run \`token-goat doctor --fix\` to inject automatically.`
134
+ };
135
+ }
136
+ return {
137
+ name: "Instruction gate",
138
+ status: "warn",
139
+ message: "missing: no user-level instruction file carries it and no project instruction file was found (CLAUDE.md, AGENTS.md, or .github/copilot-instructions.md). Run `token-goat install`, or `token-goat doctor --fix` to create CLAUDE.md with the routing gate."
140
+ };
141
+ }
142
+ function repairInstructionGates(rootDir = process.cwd()) {
143
+ const repairs = [];
144
+ const errors = [];
145
+ const candidates = findInstructionGateCandidates(rootDir);
146
+ if (candidates.some((c) => c.hasGate) || findActiveGlobalGates().length > 0) return { repairs, errors };
147
+ const existingUngated = candidates.filter((c) => c.exists);
148
+ const fallback = candidates[0];
149
+ if (!fallback) return { repairs, errors };
150
+ const targets = existingUngated.length > 0 ? existingUngated : [fallback];
151
+ const cfg = loadConfig(rootDir);
152
+ const gdrive = cfg.gdrive?.enabled ?? true;
153
+ for (const target of targets) {
154
+ try {
155
+ const block = buildGuidanceBlock({
156
+ beginMarker: target.beginMarker,
157
+ endMarker: target.endMarker,
158
+ fallbackToolClause: target.fallbackToolClause,
159
+ gdrive
160
+ });
161
+ recordCreatedBy([target.fullPath], () => {
162
+ fs.mkdirSync(path.dirname(target.fullPath), { recursive: true });
163
+ upsertDelimitedBlock(target.fullPath, target.beginMarker, target.endMarker, block);
164
+ });
165
+ repairs.push(`Injected token-goat routing gate into ${target.relativePath}`);
166
+ } catch (e) {
167
+ errors.push(`Failed to inject routing gate into ${target.relativePath}: ${e instanceof Error ? e.message : String(e)}`);
168
+ }
169
+ }
170
+ return { repairs, errors };
171
+ }
172
+ function checkHarnessCacheEfficiency(rootDir = process.cwd()) {
173
+ const hasVscode = fs.existsSync(path.join(rootDir, ".vscode"));
174
+ const hasIdea = fs.existsSync(path.join(rootDir, ".idea"));
175
+ const hasCursor = fs.existsSync(path.join(rootDir, ".cursor")) || fs.existsSync(path.join(rootDir, ".cursorrules"));
176
+ const hasVs = fs.existsSync(path.join(rootDir, ".vs"));
177
+ const ideDetected = [
178
+ hasVscode && "VS Code",
179
+ hasIdea && "JetBrains",
180
+ hasCursor && "Cursor",
181
+ hasVs && "Visual Studio"
182
+ ].filter(Boolean);
183
+ const hasClaude = fs.existsSync(path.join(rootDir, ".claude")) || fs.existsSync(path.join(rootDir, "CLAUDE.md"));
184
+ const hasCopilot = fs.existsSync(path.join(rootDir, ".github", "hooks")) || fs.existsSync(path.join(rootDir, ".github", "copilot-instructions.md"));
185
+ const hasCodex = fs.existsSync(path.join(rootDir, ".codex")) || fs.existsSync(path.join(rootDir, "AGENTS.md"));
186
+ const cliDetected = [
187
+ (hasClaude || isInstalled("user")) && "Claude Code",
188
+ (hasCopilot || isCopilotCliInstalled()) && "Copilot CLI",
189
+ (hasCodex || isCodexInstalled()) && "Codex"
190
+ ].filter(Boolean);
191
+ if (ideDetected.length > 0 && cliDetected.length === 0) {
192
+ return {
193
+ name: "Harness efficiency",
194
+ status: "warn",
195
+ message: `${ideDetected.join(", ")} workspace detected without CLI harness config. IDE hooks cannot fold/trim built-in reads. If you also use a CLI agent, run \`token-goat install\` for Claude Code, or \`token-goat install --codex\` or '--copilot' for those.`
196
+ };
197
+ }
198
+ if (cliDetected.length > 0) {
199
+ return {
200
+ name: "Harness efficiency",
201
+ status: "ok",
202
+ message: `CLI harness configured (${cliDetected.join(", ")})`
203
+ };
204
+ }
205
+ return null;
206
+ }
207
+
208
+ export {
209
+ INSTRUCTION_GATE_BEGIN,
210
+ INSTRUCTION_GATE_END,
211
+ CODEX_GATE_BEGIN,
212
+ CODEX_GATE_END,
213
+ findInstructionGateCandidates,
214
+ findActiveGlobalGates,
215
+ checkInstructionGates,
216
+ repairInstructionGates,
217
+ checkHarnessCacheEfficiency
218
+ };