@quickchatai/pi-quickreview 0.0.0-stage → 1.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 (697) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +75 -2
  3. package/assets/agents/pass-abstraction.md +64 -0
  4. package/assets/agents/pass-ask-human.md +134 -0
  5. package/assets/agents/pass-backcompat.md +67 -0
  6. package/assets/agents/pass-baseline.md +61 -0
  7. package/assets/agents/pass-behaviour-delta.md +64 -0
  8. package/assets/agents/pass-bounds.md +36 -0
  9. package/assets/agents/pass-claims.md +31 -0
  10. package/assets/agents/pass-concurrency.md +168 -0
  11. package/assets/agents/pass-consistency.md +57 -0
  12. package/assets/agents/pass-contracts.md +30 -0
  13. package/assets/agents/pass-data-safety.md +54 -0
  14. package/assets/agents/pass-deferred.md +35 -0
  15. package/assets/agents/pass-delivery.md +37 -0
  16. package/assets/agents/pass-duplication.md +60 -0
  17. package/assets/agents/pass-intent.md +63 -0
  18. package/assets/agents/pass-lint-conformance.md +46 -0
  19. package/assets/agents/pass-maintainability.md +67 -0
  20. package/assets/agents/pass-placement.md +68 -0
  21. package/assets/agents/pass-prod-risk.md +24 -0
  22. package/assets/agents/pass-rollout.md +32 -0
  23. package/assets/agents/pass-roundtrip.md +46 -0
  24. package/assets/agents/pass-security.md +31 -0
  25. package/assets/agents/pass-simplicity.md +68 -0
  26. package/assets/agents/pass-statelessness.md +27 -0
  27. package/assets/agents/pass-style.md +37 -0
  28. package/assets/agents/pass-sweep.md +57 -0
  29. package/assets/agents/pass-tests.md +58 -0
  30. package/assets/agents/pass-ui.md +23 -0
  31. package/assets/agents/pass-validate.md +50 -0
  32. package/assets/agents/pass-widened.md +46 -0
  33. package/assets/agents/scan/pass-scan.md +86 -0
  34. package/assets/config.example.toml +1099 -0
  35. package/assets/deploy/reviewer/AGENTS.override.md +12 -0
  36. package/assets/profiles/default/README.md +21 -0
  37. package/assets/profiles/default/addenda/.gitkeep +0 -0
  38. package/assets/profiles/default/profile.toml +17 -0
  39. package/assets/profiles/example-django/README.md +21 -0
  40. package/assets/profiles/example-django/addenda/10-migration-discipline.md +13 -0
  41. package/assets/profiles/example-django/addenda/20-new-column-nullability.md +12 -0
  42. package/assets/profiles/example-django/addenda/30-test-doctrine.md +12 -0
  43. package/assets/profiles/example-django/addenda/40-orm-usage.md +19 -0
  44. package/assets/profiles/example-django/addenda/50-declared-shape.md +10 -0
  45. package/assets/profiles/example-django/addenda/60-config-placement.md +14 -0
  46. package/assets/profiles/example-django/heuristics.toml +24 -0
  47. package/assets/profiles/example-django/profile.toml +9 -0
  48. package/assets/profiles/fast/README.md +24 -0
  49. package/assets/profiles/fast/profile.toml +59 -0
  50. package/assets/profiles/minimal/README.md +17 -0
  51. package/assets/profiles/minimal/addenda/.gitkeep +0 -0
  52. package/assets/profiles/minimal/profile.toml +8 -0
  53. package/assets/profiles/snappy/README.md +24 -0
  54. package/assets/profiles/snappy/addenda/10-race-as-question.md +6 -0
  55. package/assets/profiles/snappy/profile.toml +46 -0
  56. package/assets/prompts/companion-day-open.md +46 -0
  57. package/assets/prompts/companion-first-run.md +104 -0
  58. package/assets/prompts/companion.md +821 -0
  59. package/assets/prompts/conversation-system.md +117 -0
  60. package/assets/prompts/eod-sweep.md +120 -0
  61. package/assets/prompts/onboarding.md +113 -0
  62. package/assets/prompts/pass-common.md +52 -0
  63. package/assets/prompts/pass-quality-common.md +22 -0
  64. package/assets/prompts/round-first.md +874 -0
  65. package/assets/prompts/round-follow-up.md +991 -0
  66. package/assets/prompts/round-re-review.md +889 -0
  67. package/assets/prompts/round-recheck.md +196 -0
  68. package/assets/prompts/round-staleness.md +856 -0
  69. package/assets/schemas/review-result.v1.json +391 -0
  70. package/assets/schemas/scan-result.v1.json +421 -0
  71. package/assets/schemas/version.v1.json +57 -0
  72. package/assets/seed-manifest.json +19 -0
  73. package/assets/seeds/agents/pass-baseline.md +61 -0
  74. package/assets/seeds/agents/pass-contracts.md +30 -0
  75. package/assets/seeds/agents/pass-data-safety.md +54 -0
  76. package/assets/seeds/agents/pass-delivery.md +37 -0
  77. package/assets/seeds/agents/pass-prod-risk.md +24 -0
  78. package/assets/seeds/agents/pass-security.md +31 -0
  79. package/assets/seeds/agents/pass-statelessness.md +27 -0
  80. package/assets/seeds/agents/pass-ui.md +23 -0
  81. package/assets/seeds/agents/pass-validate.md +50 -0
  82. package/assets/seeds/prompts/conversation-system.md +117 -0
  83. package/assets/seeds/prompts/eod-sweep.md +120 -0
  84. package/assets/seeds/prompts/pass-common.md +52 -0
  85. package/dist/extensions/bash-guard.d.ts +467 -0
  86. package/dist/extensions/bash-guard.d.ts.map +1 -0
  87. package/dist/extensions/bash-guard.js +3058 -0
  88. package/dist/extensions/bash-guard.js.map +1 -0
  89. package/dist/extensions/finding-clusters.d.ts +33 -0
  90. package/dist/extensions/finding-clusters.d.ts.map +1 -0
  91. package/dist/extensions/finding-clusters.js +218 -0
  92. package/dist/extensions/finding-clusters.js.map +1 -0
  93. package/dist/extensions/ledger-pin.d.ts +76 -0
  94. package/dist/extensions/ledger-pin.d.ts.map +1 -0
  95. package/dist/extensions/ledger-pin.js +331 -0
  96. package/dist/extensions/ledger-pin.js.map +1 -0
  97. package/dist/extensions/lens.d.ts +43 -0
  98. package/dist/extensions/lens.d.ts.map +1 -0
  99. package/dist/extensions/lens.js +150 -0
  100. package/dist/extensions/lens.js.map +1 -0
  101. package/dist/extensions/pi-tool.d.ts +22 -0
  102. package/dist/extensions/pi-tool.d.ts.map +1 -0
  103. package/dist/extensions/pi-tool.js +20 -0
  104. package/dist/extensions/pi-tool.js.map +1 -0
  105. package/dist/extensions/quickreview.d.ts +21 -0
  106. package/dist/extensions/quickreview.d.ts.map +1 -0
  107. package/dist/extensions/quickreview.js +132 -0
  108. package/dist/extensions/quickreview.js.map +1 -0
  109. package/dist/src/anchors.d.ts +54 -0
  110. package/dist/src/anchors.d.ts.map +1 -0
  111. package/dist/src/anchors.js +127 -0
  112. package/dist/src/anchors.js.map +1 -0
  113. package/dist/src/assetroot.d.ts +16 -0
  114. package/dist/src/assetroot.d.ts.map +1 -0
  115. package/dist/src/assetroot.js +77 -0
  116. package/dist/src/assetroot.js.map +1 -0
  117. package/dist/src/authwatch.d.ts +61 -0
  118. package/dist/src/authwatch.d.ts.map +1 -0
  119. package/dist/src/authwatch.js +210 -0
  120. package/dist/src/authwatch.js.map +1 -0
  121. package/dist/src/budget.d.ts +15 -0
  122. package/dist/src/budget.d.ts.map +1 -0
  123. package/dist/src/budget.js +32 -0
  124. package/dist/src/budget.js.map +1 -0
  125. package/dist/src/casebudget.d.ts +3 -0
  126. package/dist/src/casebudget.d.ts.map +1 -0
  127. package/dist/src/casebudget.js +3 -0
  128. package/dist/src/casebudget.js.map +1 -0
  129. package/dist/src/cigate.d.ts +116 -0
  130. package/dist/src/cigate.d.ts.map +1 -0
  131. package/dist/src/cigate.js +176 -0
  132. package/dist/src/cigate.js.map +1 -0
  133. package/dist/src/codespan.d.ts +46 -0
  134. package/dist/src/codespan.d.ts.map +1 -0
  135. package/dist/src/codespan.js +75 -0
  136. package/dist/src/codespan.js.map +1 -0
  137. package/dist/src/contextpack.d.ts +56 -0
  138. package/dist/src/contextpack.d.ts.map +1 -0
  139. package/dist/src/contextpack.js +195 -0
  140. package/dist/src/contextpack.js.map +1 -0
  141. package/dist/src/contract.d.ts +8 -0
  142. package/dist/src/contract.d.ts.map +1 -0
  143. package/dist/src/contract.js +21 -0
  144. package/dist/src/contract.js.map +1 -0
  145. package/dist/src/coverage.d.ts +32 -0
  146. package/dist/src/coverage.d.ts.map +1 -0
  147. package/dist/src/coverage.js +85 -0
  148. package/dist/src/coverage.js.map +1 -0
  149. package/dist/src/datafence.d.ts +19 -0
  150. package/dist/src/datafence.d.ts.map +1 -0
  151. package/dist/src/datafence.js +60 -0
  152. package/dist/src/datafence.js.map +1 -0
  153. package/dist/src/dedup.d.ts +65 -0
  154. package/dist/src/dedup.d.ts.map +1 -0
  155. package/dist/src/dedup.js +459 -0
  156. package/dist/src/dedup.js.map +1 -0
  157. package/dist/src/depsources.d.ts +304 -0
  158. package/dist/src/depsources.d.ts.map +1 -0
  159. package/dist/src/depsources.js +3367 -0
  160. package/dist/src/depsources.js.map +1 -0
  161. package/dist/src/diffinput.d.ts +10 -0
  162. package/dist/src/diffinput.d.ts.map +1 -0
  163. package/dist/src/diffinput.js +172 -0
  164. package/dist/src/diffinput.js.map +1 -0
  165. package/dist/src/doubtwords.d.ts +10 -0
  166. package/dist/src/doubtwords.d.ts.map +1 -0
  167. package/dist/src/doubtwords.js +13 -0
  168. package/dist/src/doubtwords.js.map +1 -0
  169. package/dist/src/ecosystem.d.ts +148 -0
  170. package/dist/src/ecosystem.d.ts.map +1 -0
  171. package/dist/src/ecosystem.js +338 -0
  172. package/dist/src/ecosystem.js.map +1 -0
  173. package/dist/src/engine/agentdir.d.ts +5 -0
  174. package/dist/src/engine/agentdir.d.ts.map +1 -0
  175. package/dist/src/engine/agentdir.js +21 -0
  176. package/dist/src/engine/agentdir.js.map +1 -0
  177. package/dist/src/engine/auth.d.ts +214 -0
  178. package/dist/src/engine/auth.d.ts.map +1 -0
  179. package/dist/src/engine/auth.js +374 -0
  180. package/dist/src/engine/auth.js.map +1 -0
  181. package/dist/src/engine/budget.d.ts +60 -0
  182. package/dist/src/engine/budget.d.ts.map +1 -0
  183. package/dist/src/engine/budget.js +113 -0
  184. package/dist/src/engine/budget.js.map +1 -0
  185. package/dist/src/engine/capfd.d.ts +6 -0
  186. package/dist/src/engine/capfd.d.ts.map +1 -0
  187. package/dist/src/engine/capfd.js +21 -0
  188. package/dist/src/engine/capfd.js.map +1 -0
  189. package/dist/src/engine/caseout.d.ts +66 -0
  190. package/dist/src/engine/caseout.d.ts.map +1 -0
  191. package/dist/src/engine/caseout.js +107 -0
  192. package/dist/src/engine/caseout.js.map +1 -0
  193. package/dist/src/engine/context.d.ts +57 -0
  194. package/dist/src/engine/context.d.ts.map +1 -0
  195. package/dist/src/engine/context.js +212 -0
  196. package/dist/src/engine/context.js.map +1 -0
  197. package/dist/src/engine/envmap.d.ts +13 -0
  198. package/dist/src/engine/envmap.d.ts.map +1 -0
  199. package/dist/src/engine/envmap.js +377 -0
  200. package/dist/src/engine/envmap.js.map +1 -0
  201. package/dist/src/engine/extfiles.d.ts +7 -0
  202. package/dist/src/engine/extfiles.d.ts.map +1 -0
  203. package/dist/src/engine/extfiles.js +23 -0
  204. package/dist/src/engine/extfiles.js.map +1 -0
  205. package/dist/src/engine/keyroute.d.ts +21 -0
  206. package/dist/src/engine/keyroute.d.ts.map +1 -0
  207. package/dist/src/engine/keyroute.js +58 -0
  208. package/dist/src/engine/keyroute.js.map +1 -0
  209. package/dist/src/engine/lens/cache-group.d.ts +20 -0
  210. package/dist/src/engine/lens/cache-group.d.ts.map +1 -0
  211. package/dist/src/engine/lens/cache-group.js +31 -0
  212. package/dist/src/engine/lens/cache-group.js.map +1 -0
  213. package/dist/src/engine/lens/cache-run.d.ts +65 -0
  214. package/dist/src/engine/lens/cache-run.d.ts.map +1 -0
  215. package/dist/src/engine/lens/cache-run.js +159 -0
  216. package/dist/src/engine/lens/cache-run.js.map +1 -0
  217. package/dist/src/engine/lens/deadline.d.ts +54 -0
  218. package/dist/src/engine/lens/deadline.d.ts.map +1 -0
  219. package/dist/src/engine/lens/deadline.js +111 -0
  220. package/dist/src/engine/lens/deadline.js.map +1 -0
  221. package/dist/src/engine/lens/engine-tools.d.ts +13 -0
  222. package/dist/src/engine/lens/engine-tools.d.ts.map +1 -0
  223. package/dist/src/engine/lens/engine-tools.js +37 -0
  224. package/dist/src/engine/lens/engine-tools.js.map +1 -0
  225. package/dist/src/engine/lens/env.d.ts +23 -0
  226. package/dist/src/engine/lens/env.d.ts.map +1 -0
  227. package/dist/src/engine/lens/env.js +42 -0
  228. package/dist/src/engine/lens/env.js.map +1 -0
  229. package/dist/src/engine/lens/launch-plan.d.ts +63 -0
  230. package/dist/src/engine/lens/launch-plan.d.ts.map +1 -0
  231. package/dist/src/engine/lens/launch-plan.js +203 -0
  232. package/dist/src/engine/lens/launch-plan.js.map +1 -0
  233. package/dist/src/engine/lens/leaf-cache.d.ts +22 -0
  234. package/dist/src/engine/lens/leaf-cache.d.ts.map +1 -0
  235. package/dist/src/engine/lens/leaf-cache.js +115 -0
  236. package/dist/src/engine/lens/leaf-cache.js.map +1 -0
  237. package/dist/src/engine/lens/permits.d.ts +14 -0
  238. package/dist/src/engine/lens/permits.d.ts.map +1 -0
  239. package/dist/src/engine/lens/permits.js +18 -0
  240. package/dist/src/engine/lens/permits.js.map +1 -0
  241. package/dist/src/engine/lens/registry.d.ts +55 -0
  242. package/dist/src/engine/lens/registry.d.ts.map +1 -0
  243. package/dist/src/engine/lens/registry.js +140 -0
  244. package/dist/src/engine/lens/registry.js.map +1 -0
  245. package/dist/src/engine/lens/round-lens.d.ts +16 -0
  246. package/dist/src/engine/lens/round-lens.d.ts.map +1 -0
  247. package/dist/src/engine/lens/round-lens.js +46 -0
  248. package/dist/src/engine/lens/round-lens.js.map +1 -0
  249. package/dist/src/engine/lens/runlens.d.ts +103 -0
  250. package/dist/src/engine/lens/runlens.d.ts.map +1 -0
  251. package/dist/src/engine/lens/runlens.js +538 -0
  252. package/dist/src/engine/lens/runlens.js.map +1 -0
  253. package/dist/src/engine/lens/section.d.ts +19 -0
  254. package/dist/src/engine/lens/section.d.ts.map +1 -0
  255. package/dist/src/engine/lens/section.js +40 -0
  256. package/dist/src/engine/lens/section.js.map +1 -0
  257. package/dist/src/engine/lens/semaphore.d.ts +13 -0
  258. package/dist/src/engine/lens/semaphore.d.ts.map +1 -0
  259. package/dist/src/engine/lens/semaphore.js +44 -0
  260. package/dist/src/engine/lens/semaphore.js.map +1 -0
  261. package/dist/src/engine/lens/tool.d.ts +34 -0
  262. package/dist/src/engine/lens/tool.d.ts.map +1 -0
  263. package/dist/src/engine/lens/tool.js +345 -0
  264. package/dist/src/engine/lens/tool.js.map +1 -0
  265. package/dist/src/engine/lens/wave.d.ts +63 -0
  266. package/dist/src/engine/lens/wave.d.ts.map +1 -0
  267. package/dist/src/engine/lens/wave.js +95 -0
  268. package/dist/src/engine/lens/wave.js.map +1 -0
  269. package/dist/src/engine/livesessions.d.ts +21 -0
  270. package/dist/src/engine/livesessions.d.ts.map +1 -0
  271. package/dist/src/engine/livesessions.js +57 -0
  272. package/dist/src/engine/livesessions.js.map +1 -0
  273. package/dist/src/engine/livewire.d.ts +18 -0
  274. package/dist/src/engine/livewire.d.ts.map +1 -0
  275. package/dist/src/engine/livewire.js +31 -0
  276. package/dist/src/engine/livewire.js.map +1 -0
  277. package/dist/src/engine/openable.d.ts +37 -0
  278. package/dist/src/engine/openable.d.ts.map +1 -0
  279. package/dist/src/engine/openable.js +120 -0
  280. package/dist/src/engine/openable.js.map +1 -0
  281. package/dist/src/engine/pisdk.d.ts +235 -0
  282. package/dist/src/engine/pisdk.d.ts.map +1 -0
  283. package/dist/src/engine/pisdk.js +577 -0
  284. package/dist/src/engine/pisdk.js.map +1 -0
  285. package/dist/src/engine/port.d.ts +144 -0
  286. package/dist/src/engine/port.d.ts.map +1 -0
  287. package/dist/src/engine/port.js +16 -0
  288. package/dist/src/engine/port.js.map +1 -0
  289. package/dist/src/engine/prompts.d.ts +159 -0
  290. package/dist/src/engine/prompts.d.ts.map +1 -0
  291. package/dist/src/engine/prompts.js +339 -0
  292. package/dist/src/engine/prompts.js.map +1 -0
  293. package/dist/src/engine/render.d.ts +10 -0
  294. package/dist/src/engine/render.d.ts.map +1 -0
  295. package/dist/src/engine/render.js +23 -0
  296. package/dist/src/engine/render.js.map +1 -0
  297. package/dist/src/engine/reviewruntime.d.ts +13 -0
  298. package/dist/src/engine/reviewruntime.d.ts.map +1 -0
  299. package/dist/src/engine/reviewruntime.js +35 -0
  300. package/dist/src/engine/reviewruntime.js.map +1 -0
  301. package/dist/src/engine/reviewsdk.d.ts +75 -0
  302. package/dist/src/engine/reviewsdk.d.ts.map +1 -0
  303. package/dist/src/engine/reviewsdk.js +180 -0
  304. package/dist/src/engine/reviewsdk.js.map +1 -0
  305. package/dist/src/engine/round.d.ts +166 -0
  306. package/dist/src/engine/round.d.ts.map +1 -0
  307. package/dist/src/engine/round.js +543 -0
  308. package/dist/src/engine/round.js.map +1 -0
  309. package/dist/src/engine/roundagents.d.ts +17 -0
  310. package/dist/src/engine/roundagents.d.ts.map +1 -0
  311. package/dist/src/engine/roundagents.js +49 -0
  312. package/dist/src/engine/roundagents.js.map +1 -0
  313. package/dist/src/engine/roundevents.d.ts +110 -0
  314. package/dist/src/engine/roundevents.d.ts.map +1 -0
  315. package/dist/src/engine/roundevents.js +276 -0
  316. package/dist/src/engine/roundevents.js.map +1 -0
  317. package/dist/src/engine/roundsdk.d.ts +33 -0
  318. package/dist/src/engine/roundsdk.d.ts.map +1 -0
  319. package/dist/src/engine/roundsdk.js +76 -0
  320. package/dist/src/engine/roundsdk.js.map +1 -0
  321. package/dist/src/engine/sdkruntime.d.ts +23 -0
  322. package/dist/src/engine/sdkruntime.d.ts.map +1 -0
  323. package/dist/src/engine/sdkruntime.js +340 -0
  324. package/dist/src/engine/sdkruntime.js.map +1 -0
  325. package/dist/src/engine/select.d.ts +16 -0
  326. package/dist/src/engine/select.d.ts.map +1 -0
  327. package/dist/src/engine/select.js +32 -0
  328. package/dist/src/engine/select.js.map +1 -0
  329. package/dist/src/engine/sessionwrap.d.ts +4 -0
  330. package/dist/src/engine/sessionwrap.d.ts.map +1 -0
  331. package/dist/src/engine/sessionwrap.js +31 -0
  332. package/dist/src/engine/sessionwrap.js.map +1 -0
  333. package/dist/src/engine/toolfence.d.ts +90 -0
  334. package/dist/src/engine/toolfence.d.ts.map +1 -0
  335. package/dist/src/engine/toolfence.js +378 -0
  336. package/dist/src/engine/toolfence.js.map +1 -0
  337. package/dist/src/engine/tooluid.d.ts +128 -0
  338. package/dist/src/engine/tooluid.d.ts.map +1 -0
  339. package/dist/src/engine/tooluid.js +401 -0
  340. package/dist/src/engine/tooluid.js.map +1 -0
  341. package/dist/src/envstrip.d.ts +10 -0
  342. package/dist/src/envstrip.d.ts.map +1 -0
  343. package/dist/src/envstrip.js +15 -0
  344. package/dist/src/envstrip.js.map +1 -0
  345. package/dist/src/escalationprompt.d.ts +22 -0
  346. package/dist/src/escalationprompt.d.ts.map +1 -0
  347. package/dist/src/escalationprompt.js +54 -0
  348. package/dist/src/escalationprompt.js.map +1 -0
  349. package/dist/src/execfn.d.ts +29 -0
  350. package/dist/src/execfn.d.ts.map +1 -0
  351. package/dist/src/execfn.js +55 -0
  352. package/dist/src/execfn.js.map +1 -0
  353. package/dist/src/finding-chain.d.ts +40 -0
  354. package/dist/src/finding-chain.d.ts.map +1 -0
  355. package/dist/src/finding-chain.js +76 -0
  356. package/dist/src/finding-chain.js.map +1 -0
  357. package/dist/src/finding-row.d.ts +24 -0
  358. package/dist/src/finding-row.d.ts.map +1 -0
  359. package/dist/src/finding-row.js +26 -0
  360. package/dist/src/finding-row.js.map +1 -0
  361. package/dist/src/findingkey.d.ts +99 -0
  362. package/dist/src/findingkey.d.ts.map +1 -0
  363. package/dist/src/findingkey.js +210 -0
  364. package/dist/src/findingkey.js.map +1 -0
  365. package/dist/src/findingsrecord.d.ts +175 -0
  366. package/dist/src/findingsrecord.d.ts.map +1 -0
  367. package/dist/src/findingsrecord.js +410 -0
  368. package/dist/src/findingsrecord.js.map +1 -0
  369. package/dist/src/followup-mode.d.ts +4 -0
  370. package/dist/src/followup-mode.d.ts.map +1 -0
  371. package/dist/src/followup-mode.js +6 -0
  372. package/dist/src/followup-mode.js.map +1 -0
  373. package/dist/src/gate.d.ts +199 -0
  374. package/dist/src/gate.d.ts.map +1 -0
  375. package/dist/src/gate.js +315 -0
  376. package/dist/src/gate.js.map +1 -0
  377. package/dist/src/ghcred.d.ts +58 -0
  378. package/dist/src/ghcred.d.ts.map +1 -0
  379. package/dist/src/ghcred.js +139 -0
  380. package/dist/src/ghcred.js.map +1 -0
  381. package/dist/src/githubAuth.d.ts +70 -0
  382. package/dist/src/githubAuth.d.ts.map +1 -0
  383. package/dist/src/githubAuth.js +183 -0
  384. package/dist/src/githubAuth.js.map +1 -0
  385. package/dist/src/githubcore.d.ts +20 -0
  386. package/dist/src/githubcore.d.ts.map +1 -0
  387. package/dist/src/githubcore.js +20 -0
  388. package/dist/src/githubcore.js.map +1 -0
  389. package/dist/src/glob.d.ts +11 -0
  390. package/dist/src/glob.d.ts.map +1 -0
  391. package/dist/src/glob.js +69 -0
  392. package/dist/src/glob.js.map +1 -0
  393. package/dist/src/guards.d.ts +106 -0
  394. package/dist/src/guards.d.ts.map +1 -0
  395. package/dist/src/guards.js +365 -0
  396. package/dist/src/guards.js.map +1 -0
  397. package/dist/src/heartbeat.d.ts +29 -0
  398. package/dist/src/heartbeat.d.ts.map +1 -0
  399. package/dist/src/heartbeat.js +87 -0
  400. package/dist/src/heartbeat.js.map +1 -0
  401. package/dist/src/heuristics.d.ts +247 -0
  402. package/dist/src/heuristics.d.ts.map +1 -0
  403. package/dist/src/heuristics.js +927 -0
  404. package/dist/src/heuristics.js.map +1 -0
  405. package/dist/src/homes.d.ts +181 -0
  406. package/dist/src/homes.d.ts.map +1 -0
  407. package/dist/src/homes.js +242 -0
  408. package/dist/src/homes.js.map +1 -0
  409. package/dist/src/hunkheader.d.ts +11 -0
  410. package/dist/src/hunkheader.d.ts.map +1 -0
  411. package/dist/src/hunkheader.js +18 -0
  412. package/dist/src/hunkheader.js.map +1 -0
  413. package/dist/src/identity.d.ts +34 -0
  414. package/dist/src/identity.d.ts.map +1 -0
  415. package/dist/src/identity.js +67 -0
  416. package/dist/src/identity.js.map +1 -0
  417. package/dist/src/include.d.ts +435 -0
  418. package/dist/src/include.d.ts.map +1 -0
  419. package/dist/src/include.js +1692 -0
  420. package/dist/src/include.js.map +1 -0
  421. package/dist/src/launchvocab.d.ts +36 -0
  422. package/dist/src/launchvocab.d.ts.map +1 -0
  423. package/dist/src/launchvocab.js +59 -0
  424. package/dist/src/launchvocab.js.map +1 -0
  425. package/dist/src/ledgercarry.d.ts +24 -0
  426. package/dist/src/ledgercarry.d.ts.map +1 -0
  427. package/dist/src/ledgercarry.js +109 -0
  428. package/dist/src/ledgercarry.js.map +1 -0
  429. package/dist/src/lensids.d.ts +7 -0
  430. package/dist/src/lensids.d.ts.map +1 -0
  431. package/dist/src/lensids.js +53 -0
  432. package/dist/src/lensids.js.map +1 -0
  433. package/dist/src/lensplanning.d.ts +8 -0
  434. package/dist/src/lensplanning.d.ts.map +1 -0
  435. package/dist/src/lensplanning.js +126 -0
  436. package/dist/src/lensplanning.js.map +1 -0
  437. package/dist/src/lensresult.d.ts +94 -0
  438. package/dist/src/lensresult.d.ts.map +1 -0
  439. package/dist/src/lensresult.js +162 -0
  440. package/dist/src/lensresult.js.map +1 -0
  441. package/dist/src/lenstuning.d.ts +97 -0
  442. package/dist/src/lenstuning.d.ts.map +1 -0
  443. package/dist/src/lenstuning.js +326 -0
  444. package/dist/src/lenstuning.js.map +1 -0
  445. package/dist/src/lintconfig.d.ts +31 -0
  446. package/dist/src/lintconfig.d.ts.map +1 -0
  447. package/dist/src/lintconfig.js +543 -0
  448. package/dist/src/lintconfig.js.map +1 -0
  449. package/dist/src/live/events.d.ts +188 -0
  450. package/dist/src/live/events.d.ts.map +1 -0
  451. package/dist/src/live/events.js +136 -0
  452. package/dist/src/live/events.js.map +1 -0
  453. package/dist/src/live/writer.d.ts +54 -0
  454. package/dist/src/live/writer.d.ts.map +1 -0
  455. package/dist/src/live/writer.js +516 -0
  456. package/dist/src/live/writer.js.map +1 -0
  457. package/dist/src/localreview.d.ts +128 -0
  458. package/dist/src/localreview.d.ts.map +1 -0
  459. package/dist/src/localreview.js +426 -0
  460. package/dist/src/localreview.js.map +1 -0
  461. package/dist/src/loosenedtests.d.ts +13 -0
  462. package/dist/src/loosenedtests.d.ts.map +1 -0
  463. package/dist/src/loosenedtests.js +188 -0
  464. package/dist/src/loosenedtests.js.map +1 -0
  465. package/dist/src/memoryport.d.ts +264 -0
  466. package/dist/src/memoryport.d.ts.map +1 -0
  467. package/dist/src/memoryport.js +445 -0
  468. package/dist/src/memoryport.js.map +1 -0
  469. package/dist/src/migrations.d.ts +106 -0
  470. package/dist/src/migrations.d.ts.map +1 -0
  471. package/dist/src/migrations.js +373 -0
  472. package/dist/src/migrations.js.map +1 -0
  473. package/dist/src/modelroute.d.ts +38 -0
  474. package/dist/src/modelroute.d.ts.map +1 -0
  475. package/dist/src/modelroute.js +105 -0
  476. package/dist/src/modelroute.js.map +1 -0
  477. package/dist/src/oneshot.d.ts +12 -0
  478. package/dist/src/oneshot.d.ts.map +1 -0
  479. package/dist/src/oneshot.js +8 -0
  480. package/dist/src/oneshot.js.map +1 -0
  481. package/dist/src/packing.d.ts +11 -0
  482. package/dist/src/packing.d.ts.map +1 -0
  483. package/dist/src/packing.js +31 -0
  484. package/dist/src/packing.js.map +1 -0
  485. package/dist/src/passes.d.ts +16 -0
  486. package/dist/src/passes.d.ts.map +1 -0
  487. package/dist/src/passes.js +104 -0
  488. package/dist/src/passes.js.map +1 -0
  489. package/dist/src/passtasks.d.ts +68 -0
  490. package/dist/src/passtasks.d.ts.map +1 -0
  491. package/dist/src/passtasks.js +360 -0
  492. package/dist/src/passtasks.js.map +1 -0
  493. package/dist/src/pathinside.d.ts +5 -0
  494. package/dist/src/pathinside.d.ts.map +1 -0
  495. package/dist/src/pathinside.js +9 -0
  496. package/dist/src/pathinside.js.map +1 -0
  497. package/dist/src/pibuiltins.d.ts +36 -0
  498. package/dist/src/pibuiltins.d.ts.map +1 -0
  499. package/dist/src/pibuiltins.js +83 -0
  500. package/dist/src/pibuiltins.js.map +1 -0
  501. package/dist/src/plankey.d.ts +4 -0
  502. package/dist/src/plankey.d.ts.map +1 -0
  503. package/dist/src/plankey.js +10 -0
  504. package/dist/src/plankey.js.map +1 -0
  505. package/dist/src/planner.d.ts +375 -0
  506. package/dist/src/planner.d.ts.map +1 -0
  507. package/dist/src/planner.js +722 -0
  508. package/dist/src/planner.js.map +1 -0
  509. package/dist/src/plugin/args.d.ts +19 -0
  510. package/dist/src/plugin/args.d.ts.map +1 -0
  511. package/dist/src/plugin/args.js +107 -0
  512. package/dist/src/plugin/args.js.map +1 -0
  513. package/dist/src/plugin/index.d.ts +3 -0
  514. package/dist/src/plugin/index.d.ts.map +1 -0
  515. package/dist/src/plugin/index.js +14 -0
  516. package/dist/src/plugin/index.js.map +1 -0
  517. package/dist/src/plugin/login.d.ts +42 -0
  518. package/dist/src/plugin/login.d.ts.map +1 -0
  519. package/dist/src/plugin/login.js +82 -0
  520. package/dist/src/plugin/login.js.map +1 -0
  521. package/dist/src/plugin/review.d.ts +27 -0
  522. package/dist/src/plugin/review.d.ts.map +1 -0
  523. package/dist/src/plugin/review.js +302 -0
  524. package/dist/src/plugin/review.js.map +1 -0
  525. package/dist/src/plugin/runner.d.ts +6 -0
  526. package/dist/src/plugin/runner.d.ts.map +1 -0
  527. package/dist/src/plugin/runner.js +65 -0
  528. package/dist/src/plugin/runner.js.map +1 -0
  529. package/dist/src/plugin/scan.d.ts +79 -0
  530. package/dist/src/plugin/scan.d.ts.map +1 -0
  531. package/dist/src/plugin/scan.js +348 -0
  532. package/dist/src/plugin/scan.js.map +1 -0
  533. package/dist/src/plugin/session.d.ts +56 -0
  534. package/dist/src/plugin/session.d.ts.map +1 -0
  535. package/dist/src/plugin/session.js +2 -0
  536. package/dist/src/plugin/session.js.map +1 -0
  537. package/dist/src/plugin/setup.d.ts +19 -0
  538. package/dist/src/plugin/setup.d.ts.map +1 -0
  539. package/dist/src/plugin/setup.js +142 -0
  540. package/dist/src/plugin/setup.js.map +1 -0
  541. package/dist/src/plugin/versiongate.d.ts +26 -0
  542. package/dist/src/plugin/versiongate.d.ts.map +1 -0
  543. package/dist/src/plugin/versiongate.js +83 -0
  544. package/dist/src/plugin/versiongate.js.map +1 -0
  545. package/dist/src/postingkey.d.ts +8 -0
  546. package/dist/src/postingkey.d.ts.map +1 -0
  547. package/dist/src/postingkey.js +25 -0
  548. package/dist/src/postingkey.js.map +1 -0
  549. package/dist/src/postingpolicy.d.ts +108 -0
  550. package/dist/src/postingpolicy.d.ts.map +1 -0
  551. package/dist/src/postingpolicy.js +341 -0
  552. package/dist/src/postingpolicy.js.map +1 -0
  553. package/dist/src/pr-identity.d.ts +3 -0
  554. package/dist/src/pr-identity.d.ts.map +1 -0
  555. package/dist/src/pr-identity.js +9 -0
  556. package/dist/src/pr-identity.js.map +1 -0
  557. package/dist/src/prdelta.d.ts +181 -0
  558. package/dist/src/prdelta.d.ts.map +1 -0
  559. package/dist/src/prdelta.js +501 -0
  560. package/dist/src/prdelta.js.map +1 -0
  561. package/dist/src/pricing.d.ts +94 -0
  562. package/dist/src/pricing.d.ts.map +1 -0
  563. package/dist/src/pricing.js +209 -0
  564. package/dist/src/pricing.js.map +1 -0
  565. package/dist/src/priorfindings.d.ts +167 -0
  566. package/dist/src/priorfindings.d.ts.map +1 -0
  567. package/dist/src/priorfindings.js +445 -0
  568. package/dist/src/priorfindings.js.map +1 -0
  569. package/dist/src/priortasks.d.ts +31 -0
  570. package/dist/src/priortasks.d.ts.map +1 -0
  571. package/dist/src/priortasks.js +119 -0
  572. package/dist/src/priortasks.js.map +1 -0
  573. package/dist/src/profilelookup.d.ts +59 -0
  574. package/dist/src/profilelookup.d.ts.map +1 -0
  575. package/dist/src/profilelookup.js +98 -0
  576. package/dist/src/profilelookup.js.map +1 -0
  577. package/dist/src/profileoverrides.d.ts +91 -0
  578. package/dist/src/profileoverrides.d.ts.map +1 -0
  579. package/dist/src/profileoverrides.js +313 -0
  580. package/dist/src/profileoverrides.js.map +1 -0
  581. package/dist/src/profiles.d.ts +144 -0
  582. package/dist/src/profiles.d.ts.map +1 -0
  583. package/dist/src/profiles.js +604 -0
  584. package/dist/src/profiles.js.map +1 -0
  585. package/dist/src/promptdoc.d.ts +3 -0
  586. package/dist/src/promptdoc.d.ts.map +1 -0
  587. package/dist/src/promptdoc.js +18 -0
  588. package/dist/src/promptdoc.js.map +1 -0
  589. package/dist/src/prtarget.d.ts +70 -0
  590. package/dist/src/prtarget.d.ts.map +1 -0
  591. package/dist/src/prtarget.js +181 -0
  592. package/dist/src/prtarget.js.map +1 -0
  593. package/dist/src/recheckorder.d.ts +32 -0
  594. package/dist/src/recheckorder.d.ts.map +1 -0
  595. package/dist/src/recheckorder.js +5 -0
  596. package/dist/src/recheckorder.js.map +1 -0
  597. package/dist/src/reviewapi.d.ts +207 -0
  598. package/dist/src/reviewapi.d.ts.map +1 -0
  599. package/dist/src/reviewapi.js +939 -0
  600. package/dist/src/reviewapi.js.map +1 -0
  601. package/dist/src/reviewbotfindings.d.ts +33 -0
  602. package/dist/src/reviewbotfindings.d.ts.map +1 -0
  603. package/dist/src/reviewbotfindings.js +80 -0
  604. package/dist/src/reviewbotfindings.js.map +1 -0
  605. package/dist/src/reviewconfig.d.ts +753 -0
  606. package/dist/src/reviewconfig.d.ts.map +1 -0
  607. package/dist/src/reviewconfig.js +805 -0
  608. package/dist/src/reviewconfig.js.map +1 -0
  609. package/dist/src/reviewdelta.d.ts +51 -0
  610. package/dist/src/reviewdelta.d.ts.map +1 -0
  611. package/dist/src/reviewdelta.js +119 -0
  612. package/dist/src/reviewdelta.js.map +1 -0
  613. package/dist/src/reviewdest.d.ts +86 -0
  614. package/dist/src/reviewdest.d.ts.map +1 -0
  615. package/dist/src/reviewdest.js +142 -0
  616. package/dist/src/reviewdest.js.map +1 -0
  617. package/dist/src/reviewerstub.d.ts +12 -0
  618. package/dist/src/reviewerstub.d.ts.map +1 -0
  619. package/dist/src/reviewerstub.js +28 -0
  620. package/dist/src/reviewerstub.js.map +1 -0
  621. package/dist/src/reviewhost.d.ts +58 -0
  622. package/dist/src/reviewhost.d.ts.map +1 -0
  623. package/dist/src/reviewhost.js +135 -0
  624. package/dist/src/reviewhost.js.map +1 -0
  625. package/dist/src/reviewpost.d.ts +79 -0
  626. package/dist/src/reviewpost.d.ts.map +1 -0
  627. package/dist/src/reviewpost.js +233 -0
  628. package/dist/src/reviewpost.js.map +1 -0
  629. package/dist/src/reviewrender.d.ts +154 -0
  630. package/dist/src/reviewrender.d.ts.map +1 -0
  631. package/dist/src/reviewrender.js +480 -0
  632. package/dist/src/reviewrender.js.map +1 -0
  633. package/dist/src/reviewstate.d.ts +62 -0
  634. package/dist/src/reviewstate.d.ts.map +1 -0
  635. package/dist/src/reviewstate.js +167 -0
  636. package/dist/src/reviewstate.js.map +1 -0
  637. package/dist/src/reviewstore.d.ts +17 -0
  638. package/dist/src/reviewstore.d.ts.map +1 -0
  639. package/dist/src/reviewstore.js +105 -0
  640. package/dist/src/reviewstore.js.map +1 -0
  641. package/dist/src/round-progress.d.ts +120 -0
  642. package/dist/src/round-progress.d.ts.map +1 -0
  643. package/dist/src/round-progress.js +172 -0
  644. package/dist/src/round-progress.js.map +1 -0
  645. package/dist/src/round-stage-deadlines.d.ts +12 -0
  646. package/dist/src/round-stage-deadlines.d.ts.map +1 -0
  647. package/dist/src/round-stage-deadlines.js +10 -0
  648. package/dist/src/round-stage-deadlines.js.map +1 -0
  649. package/dist/src/session-command.d.ts +19 -0
  650. package/dist/src/session-command.d.ts.map +1 -0
  651. package/dist/src/session-command.js +20 -0
  652. package/dist/src/session-command.js.map +1 -0
  653. package/dist/src/settledread.d.ts +61 -0
  654. package/dist/src/settledread.d.ts.map +1 -0
  655. package/dist/src/settledread.js +135 -0
  656. package/dist/src/settledread.js.map +1 -0
  657. package/dist/src/severity.d.ts +167 -0
  658. package/dist/src/severity.d.ts.map +1 -0
  659. package/dist/src/severity.js +364 -0
  660. package/dist/src/severity.js.map +1 -0
  661. package/dist/src/severityrank.d.ts +8 -0
  662. package/dist/src/severityrank.d.ts.map +1 -0
  663. package/dist/src/severityrank.js +16 -0
  664. package/dist/src/severityrank.js.map +1 -0
  665. package/dist/src/standing-review.d.ts +45 -0
  666. package/dist/src/standing-review.d.ts.map +1 -0
  667. package/dist/src/standing-review.js +43 -0
  668. package/dist/src/standing-review.js.map +1 -0
  669. package/dist/src/storerows.d.ts +225 -0
  670. package/dist/src/storerows.d.ts.map +1 -0
  671. package/dist/src/storerows.js +7 -0
  672. package/dist/src/storerows.js.map +1 -0
  673. package/dist/src/styleguide.d.ts +25 -0
  674. package/dist/src/styleguide.d.ts.map +1 -0
  675. package/dist/src/styleguide.js +272 -0
  676. package/dist/src/styleguide.js.map +1 -0
  677. package/dist/src/sweepstatus.d.ts +42 -0
  678. package/dist/src/sweepstatus.d.ts.map +1 -0
  679. package/dist/src/sweepstatus.js +97 -0
  680. package/dist/src/sweepstatus.js.map +1 -0
  681. package/dist/src/templates.d.ts +243 -0
  682. package/dist/src/templates.d.ts.map +1 -0
  683. package/dist/src/templates.js +847 -0
  684. package/dist/src/templates.js.map +1 -0
  685. package/dist/src/types.d.ts +639 -0
  686. package/dist/src/types.d.ts.map +1 -0
  687. package/dist/src/types.js +90 -0
  688. package/dist/src/types.js.map +1 -0
  689. package/dist/src/unifieddiff.d.ts +22 -0
  690. package/dist/src/unifieddiff.d.ts.map +1 -0
  691. package/dist/src/unifieddiff.js +176 -0
  692. package/dist/src/unifieddiff.js.map +1 -0
  693. package/dist/src/yieldloop.d.ts +2 -0
  694. package/dist/src/yieldloop.d.ts.map +1 -0
  695. package/dist/src/yieldloop.js +14 -0
  696. package/dist/src/yieldloop.js.map +1 -0
  697. package/package.json +60 -4
@@ -0,0 +1,139 @@
1
+ // The GitHub credential chain of the LOCAL review route (`qcr review`).
2
+ //
3
+ // The App-only credential rule, and its carve-out: the daemon holds only the
4
+ // App credential. The local and Action review routes run as the person at their
5
+ // own terminal, so they may also use the credentials that person already has.
6
+ // This module is that route's alone: the daemon's code never imports it
7
+ // (tests/review-pr-target.test.ts fences who may).
8
+ //
9
+ // Order: the App if configured, then the token handed to a container as a
10
+ // file (below), then GITHUB_TOKEN / GH_TOKEN, then `gh auth token`.
11
+ //
12
+ // The handoff: a token a container runs with is never env
13
+ // and never argv. The caller (the host wrapper, or the Action) writes it to a
14
+ // 0600 file in a fresh 0700 dir, bind-mounted at /run/qcr-in, and names the
15
+ // file in QCR_GH_TOKEN_FILE. `takeHandoffToken` reads it ONCE at startup,
16
+ // unlinks it, deletes the variable and keeps the token in this module's
17
+ // memory only, all before any pi or bash child exists.
18
+ import { execFileSync } from "node:child_process";
19
+ import { closeSync, existsSync, mkdirSync, mkdtempSync, openSync, readFileSync, rmSync, unlinkSync, writeFileSync, } from "node:fs";
20
+ import { tmpdir } from "node:os";
21
+ import { join } from "node:path";
22
+ export const CREDENTIAL_SOURCES = [
23
+ "app",
24
+ "handoff",
25
+ "gh",
26
+ "env:GITHUB_TOKEN",
27
+ "env:GH_TOKEN",
28
+ ];
29
+ /** The variable that names the handed-over token file. */
30
+ export const HANDOFF_FILE_ENV = "QCR_GH_TOKEN_FILE";
31
+ /** Where the container sees the handoff dir. */
32
+ export const HANDOFF_MOUNT = "/run/qcr-in";
33
+ let handed = null;
34
+ /**
35
+ * Read the handed-over token file once and unlink it. Returns the token (also
36
+ * kept for `handedToken()`), or null when no file was named. Throws, leaving
37
+ * nothing in memory, when the file is named but unreadable, empty, or cannot
38
+ * be removed: a token that stays on disk beside a model's tools is refused,
39
+ * never used. The variable is deleted from `env` either way, so no child
40
+ * inherits the path.
41
+ */
42
+ export function takeHandoffToken(env = process.env) {
43
+ const file = env[HANDOFF_FILE_ENV];
44
+ delete env[HANDOFF_FILE_ENV];
45
+ if (file === undefined || file === "")
46
+ return handed;
47
+ const fd = openSync(file, "r");
48
+ try {
49
+ // Unlink first, read from the open descriptor: the file is gone before
50
+ // its content is in memory, and a failed unlink reads nothing.
51
+ unlinkSync(file);
52
+ const token = readFileSync(fd, "utf8").trim();
53
+ if (!token)
54
+ throw new Error("the GitHub token file is empty");
55
+ handed = token;
56
+ }
57
+ finally {
58
+ closeSync(fd);
59
+ }
60
+ return handed;
61
+ }
62
+ /** The token `takeHandoffToken` read, or null. */
63
+ export const handedToken = () => handed;
64
+ /** Forget the handed-over token (tests; a long-lived host after its last use). */
65
+ export function dropHandedToken() {
66
+ handed = null;
67
+ }
68
+ /**
69
+ * The caller's half: write `token` to a 0600 file in a fresh 0700 dir. On
70
+ * Linux the dir is under an absolute $XDG_RUNTIME_DIR (normally a tmpfs);
71
+ * without one, and elsewhere (macOS), it comes from mkdtemp under the OS
72
+ * temp dir ($TMPDIR), which may be disk-backed. The token is never put in env or argv.
73
+ */
74
+ export function stageHandoffToken(token, env = process.env, platform = process.platform) {
75
+ const runtime = env["XDG_RUNTIME_DIR"];
76
+ const base = platform === "linux" && runtime && runtime.startsWith("/") ? runtime : tmpdir();
77
+ mkdirSync(base, { recursive: true });
78
+ const dir = mkdtempSync(join(base, "qcr-in-")); // 0700
79
+ try {
80
+ writeFileSync(join(dir, "gh-token"), token, { mode: 0o600, flag: "wx" });
81
+ }
82
+ catch (err) {
83
+ rmSync(dir, { recursive: true, force: true });
84
+ throw err;
85
+ }
86
+ return {
87
+ dir,
88
+ containerFile: `${HANDOFF_MOUNT}/gh-token`,
89
+ remove: () => rmSync(dir, { recursive: true, force: true }),
90
+ };
91
+ }
92
+ export const MISSING_CREDENTIAL_HELP = "no GitHub credential found. Run `gh auth login`, or set GITHUB_TOKEN (or GH_TOKEN) " +
93
+ "to a token that can read the repository, or configure the GitHub App.";
94
+ /** The real `gh auth token`. */
95
+ export function ghAuthTokenFromCli() {
96
+ try {
97
+ const out = execFileSync("gh", ["auth", "token"], {
98
+ encoding: "utf8",
99
+ stdio: ["ignore", "pipe", "ignore"],
100
+ timeout: 10_000,
101
+ }).trim();
102
+ return out || null;
103
+ }
104
+ catch {
105
+ return null;
106
+ }
107
+ }
108
+ export async function resolveGithubCredential(d) {
109
+ let appNote = "";
110
+ const appConfigured = d.secretsDir !== "" &&
111
+ existsSync(join(d.secretsDir, "app_id")) &&
112
+ existsSync(join(d.secretsDir, "app.pem"));
113
+ if (appConfigured) {
114
+ try {
115
+ const token = (await d.mintApp(d.secretsDir)).trim();
116
+ if (token)
117
+ return { ok: true, source: "app", token };
118
+ }
119
+ catch (err) {
120
+ appNote = `the configured GitHub App could not mint a token (${String(err instanceof Error ? err.message : err).slice(0, 200)}). `;
121
+ }
122
+ }
123
+ const given = d.handoff?.trim();
124
+ if (given)
125
+ return { ok: true, source: "handoff", token: given };
126
+ for (const name of ["GITHUB_TOKEN", "GH_TOKEN"]) {
127
+ const v = d.env[name]?.trim();
128
+ if (v)
129
+ return { ok: true, source: `env:${name}`, token: v };
130
+ }
131
+ const gh = d.ghAuthToken();
132
+ if (gh)
133
+ return { ok: true, source: "gh", token: gh };
134
+ return {
135
+ ok: false,
136
+ error: appNote ? appNote + MISSING_CREDENTIAL_HELP : MISSING_CREDENTIAL_HELP,
137
+ };
138
+ }
139
+ //# sourceMappingURL=ghcred.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ghcred.js","sourceRoot":"","sources":["../../src/ghcred.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ export type FetchFn = typeof fetch;
2
+ /** GraphQL's bare App actor, only for a matching configured bot login. */
3
+ export declare function appActorAlias(botLogin: string, appSlug: string): string | undefined;
4
+ /**
5
+ * What the GitHub adapter authenticates with. `installationToken` is the
6
+ * bearer for every repo read and gated write (the App's installation token,
7
+ * or the person's own token); `invalidate` drops it after a 401 so the next
8
+ * call fetches a fresh one. `appJwt` exists only on the App credential: a
9
+ * route that needs it (the App's own hook configuration and deliveries) is
10
+ * refused where it is absent.
11
+ */
12
+ export interface GitHubCredential {
13
+ installationToken(): Promise<string>;
14
+ invalidate(): void;
15
+ appJwt?(): string | Promise<string>;
16
+ }
17
+ /** The person's token file under the secrets dir (`auth = "user"`). */
18
+ export declare const USER_TOKEN_FILE = "github_token";
19
+ /** How long a read of the token file is trusted before it is read again. */
20
+ export declare const USER_TOKEN_REREAD_MS: number;
21
+ /** The person's own GitHub token, as the host-side refresher last wrote it. */
22
+ export declare class UserTokenSource implements GitHubCredential {
23
+ private readonly secretsDir;
24
+ private readonly now;
25
+ private token;
26
+ private readAt;
27
+ constructor(secretsDir: string, now?: () => number);
28
+ /** The token file's path — named in every error, never its contents. */
29
+ get path(): string;
30
+ installationToken(): Promise<string>;
31
+ /** After a 401: the next call reads the file again (the refresher may have
32
+ * written a new token since). */
33
+ invalidate(): void;
34
+ private reload;
35
+ }
36
+ /** The credential `[github] auth` names: the App minter by default, the
37
+ * person's token file under "user". */
38
+ export declare function githubCredential(g: {
39
+ auth?: "app" | "user";
40
+ secrets_dir: string;
41
+ }, fetchFn?: FetchFn): GitHubCredential;
42
+ export declare function mintAppJwt(appId: string, privateKeyPem: string, now?: () => number): string;
43
+ export interface InstallationToken {
44
+ token: string;
45
+ expires_at: string;
46
+ }
47
+ /** The deadline on each request — the same as the adapter's REST calls, so a
48
+ * stalled mint cannot hold every caller waiting on its shared promise. */
49
+ export declare const GITHUB_REQUEST_TIMEOUT_MS = 60000;
50
+ export declare class TokenMinter implements GitHubCredential {
51
+ private readonly secretsDir;
52
+ private readonly fetchFn;
53
+ private readonly apiBase;
54
+ private readonly now;
55
+ private cache;
56
+ private inflight;
57
+ private installationId;
58
+ constructor(secretsDir: string, fetchFn?: FetchFn, apiBase?: string, now?: () => number);
59
+ private readSecret;
60
+ appJwt(): string;
61
+ /** Resolve (and cache) the single installation this app serves. */
62
+ resolveInstallationId(): Promise<number>;
63
+ private fresh;
64
+ /** Installation token, minting/refreshing as needed (single-flight). */
65
+ installationToken(installationId?: number): Promise<string>;
66
+ private mint;
67
+ /** Drop the cache after a 401 so the next call re-mints. */
68
+ invalidate(installationId?: number): void;
69
+ }
70
+ //# sourceMappingURL=githubAuth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"githubAuth.d.ts","sourceRoot":"","sources":["../../src/githubAuth.ts"],"names":[],"mappings":"AAuBA,MAAM,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC;AAEnC,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGnF;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,UAAU,IAAI,IAAI,CAAC;IACnB,MAAM,CAAC,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACrC;AAED,uEAAuE;AACvE,eAAO,MAAM,eAAe,iBAAiB,CAAC;AAC9C,4EAA4E;AAC5E,eAAO,MAAM,oBAAoB,QAAgB,CAAC;AAElD,+EAA+E;AAC/E,qBAAa,eAAgB,YAAW,gBAAgB;IAKpD,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,GAAG;IALtB,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,MAAM,CAAK;gBAGA,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,MAAM,MAAiB;IAG/C,wEAAwE;IACxE,IAAI,IAAI,IAAI,MAAM,CAEjB;IAEK,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC;IAK1C;qCACiC;IACjC,UAAU,IAAI,IAAI;IAIlB,OAAO,CAAC,MAAM;CAwBf;AAED;uCACuC;AACvC,wBAAgB,gBAAgB,CAC9B,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,EACjD,OAAO,GAAE,OAAe,GACvB,gBAAgB,CAIlB;AAMD,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,GAAG,GAAE,MAAM,MAAiB,GAC3B,MAAM,CAOR;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAID;0EAC0E;AAC1E,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAchD,qBAAa,WAAY,YAAW,gBAAgB;IAMhD,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,GAAG;IARtB,OAAO,CAAC,KAAK,CAAwC;IACrD,OAAO,CAAC,QAAQ,CAAsC;IACtD,OAAO,CAAC,cAAc,CAAuB;gBAG1B,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,OAAe,EACxB,OAAO,SAA2B,EAClC,GAAG,GAAE,MAAM,MAAiB;IAG/C,OAAO,CAAC,UAAU;IAIlB,MAAM,IAAI,MAAM;IAQhB,mEAAmE;IAC7D,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC;IAe9C,OAAO,CAAC,KAAK;IAIb,wEAAwE;IAClE,iBAAiB,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAWnD,IAAI;IAelB,4DAA4D;IAC5D,UAAU,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI;CAI1C"}
@@ -0,0 +1,183 @@
1
+ // The daemon's GitHub credential, behind one seam (`GitHubCredential`), in
2
+ // one of two shapes chosen by `[github] auth`:
3
+ //
4
+ // * "app" (the default) — `TokenMinter`: RS256 app JWTs and cached
5
+ // installation tokens. The JWT is backdated 60 s against clock skew and
6
+ // lives 600 s from that iat (9 min from now); scripts/mint-token.sh signs
7
+ // its own with a 540 s life (8 min from now). Both stay under GitHub's
8
+ // 10-minute ceiling. Tokens are cached per installation off `expires_at`
9
+ // with a ~5 min proactive refresh window, refreshed single-flight,
10
+ // re-minted once on a 401 (by the caller's `invalidate`). Every request
11
+ // carries the adapter's 60 s deadline.
12
+ // * "user" — `UserTokenSource`: the person's own token, read from the ONE
13
+ // file `<secrets dir>/github_token` (0600, the token alone) that the
14
+ // host-side refresher keeps fresh. It is re-read on first use, every five
15
+ // minutes, and after a 401. This mode is polling-only, it has no App JWT
16
+ // (so every JWT-authed App route is refused), every mutation still goes
17
+ // through the one gate, and the token reaches the daemon as that file,
18
+ // never through the environment or a command line (SECURITY.md, hard
19
+ // rule 3 as amended). Nothing here reads the environment.
20
+ import { createSign } from "node:crypto";
21
+ import { readFileSync } from "node:fs";
22
+ import { join } from "node:path";
23
+ /** GraphQL's bare App actor, only for a matching configured bot login. */
24
+ export function appActorAlias(botLogin, appSlug) {
25
+ if (!appSlug)
26
+ return undefined;
27
+ return botLogin === `${appSlug}[bot]` ? appSlug : undefined;
28
+ }
29
+ /** The person's token file under the secrets dir (`auth = "user"`). */
30
+ export const USER_TOKEN_FILE = "github_token";
31
+ /** How long a read of the token file is trusted before it is read again. */
32
+ export const USER_TOKEN_REREAD_MS = 5 * 60 * 1000;
33
+ /** The person's own GitHub token, as the host-side refresher last wrote it. */
34
+ export class UserTokenSource {
35
+ secretsDir;
36
+ now;
37
+ token = null;
38
+ readAt = 0;
39
+ constructor(secretsDir, now = Date.now) {
40
+ this.secretsDir = secretsDir;
41
+ this.now = now;
42
+ }
43
+ /** The token file's path — named in every error, never its contents. */
44
+ get path() {
45
+ return join(this.secretsDir, USER_TOKEN_FILE);
46
+ }
47
+ async installationToken() {
48
+ if (this.token === null || this.now() - this.readAt >= USER_TOKEN_REREAD_MS)
49
+ this.reload();
50
+ return this.token;
51
+ }
52
+ /** After a 401: the next call reads the file again (the refresher may have
53
+ * written a new token since). */
54
+ invalidate() {
55
+ this.token = null;
56
+ }
57
+ reload() {
58
+ let text;
59
+ try {
60
+ text = readFileSync(this.path, "utf8");
61
+ }
62
+ catch (err) {
63
+ const code = err.code ?? "unreadable";
64
+ throw new Error(`no GitHub user token at ${this.path} (${code}) — [github] auth = "user" reads the person's ` +
65
+ "token from this file; run `qcr github-token sync` on the host to write it", { cause: err });
66
+ }
67
+ const token = text.trim();
68
+ if (token === "")
69
+ throw new Error(`the GitHub user token file ${this.path} is empty — run \`qcr github-token sync\``);
70
+ if (/\s/.test(token))
71
+ throw new Error(`the GitHub user token file ${this.path} holds more than one token-shaped word`);
72
+ this.token = token;
73
+ this.readAt = this.now();
74
+ }
75
+ }
76
+ /** The credential `[github] auth` names: the App minter by default, the
77
+ * person's token file under "user". */
78
+ export function githubCredential(g, fetchFn = fetch) {
79
+ return g.auth === "user"
80
+ ? new UserTokenSource(g.secrets_dir)
81
+ : new TokenMinter(g.secrets_dir, fetchFn);
82
+ }
83
+ function b64url(input) {
84
+ return Buffer.from(input).toString("base64url");
85
+ }
86
+ export function mintAppJwt(appId, privateKeyPem, now = Date.now) {
87
+ const iat = Math.floor(now() / 1000) - 60;
88
+ const header = b64url(JSON.stringify({ alg: "RS256", typ: "JWT" }));
89
+ const payload = b64url(JSON.stringify({ iat, exp: iat + 600, iss: appId }));
90
+ const signer = createSign("RSA-SHA256");
91
+ signer.update(`${header}.${payload}`);
92
+ return `${header}.${payload}.${signer.sign(privateKeyPem, "base64url")}`;
93
+ }
94
+ const REFRESH_MARGIN_MS = 5 * 60 * 1000;
95
+ /** The deadline on each request — the same as the adapter's REST calls, so a
96
+ * stalled mint cannot hold every caller waiting on its shared promise. */
97
+ export const GITHUB_REQUEST_TIMEOUT_MS = 60_000;
98
+ /** GitHub's own words for a failed call (its `message`), capped, as ": <text>";
99
+ * empty when the body cannot be read. A 403's permission or rate-limit
100
+ * explanation is what tells operators two failures of one status apart. */
101
+ async function explanation(res) {
102
+ try {
103
+ const text = (await res.text()).replace(/\s+/g, " ").trim().slice(0, 300);
104
+ return text ? `: ${text}` : "";
105
+ }
106
+ catch {
107
+ return "";
108
+ }
109
+ }
110
+ export class TokenMinter {
111
+ secretsDir;
112
+ fetchFn;
113
+ apiBase;
114
+ now;
115
+ cache = new Map();
116
+ inflight = new Map();
117
+ installationId = null;
118
+ constructor(secretsDir, fetchFn = fetch, apiBase = "https://api.github.com", now = Date.now) {
119
+ this.secretsDir = secretsDir;
120
+ this.fetchFn = fetchFn;
121
+ this.apiBase = apiBase;
122
+ this.now = now;
123
+ }
124
+ readSecret(name) {
125
+ return readFileSync(join(this.secretsDir, name), "utf8").trim();
126
+ }
127
+ appJwt() {
128
+ return mintAppJwt(this.readSecret("app_id"), readFileSync(join(this.secretsDir, "app.pem"), "utf8"), this.now);
129
+ }
130
+ /** Resolve (and cache) the single installation this app serves. */
131
+ async resolveInstallationId() {
132
+ if (this.installationId !== null)
133
+ return this.installationId;
134
+ const res = await this.fetchFn(`${this.apiBase}/app/installations`, {
135
+ signal: AbortSignal.timeout(GITHUB_REQUEST_TIMEOUT_MS),
136
+ headers: { authorization: `Bearer ${this.appJwt()}`, accept: "application/vnd.github+json" },
137
+ });
138
+ if (!res.ok)
139
+ throw new Error(`GET /app/installations failed: ${res.status}${await explanation(res)}`);
140
+ const installs = (await res.json());
141
+ const first = installs[0];
142
+ if (!first)
143
+ throw new Error("app has no installations");
144
+ this.installationId = first.id;
145
+ return first.id;
146
+ }
147
+ fresh(tok) {
148
+ return !!tok && Date.parse(tok.expires_at) - this.now() > REFRESH_MARGIN_MS;
149
+ }
150
+ /** Installation token, minting/refreshing as needed (single-flight). */
151
+ async installationToken(installationId) {
152
+ const id = installationId ?? (await this.resolveInstallationId());
153
+ const cached = this.cache.get(id);
154
+ if (this.fresh(cached))
155
+ return cached.token;
156
+ const inflight = this.inflight.get(id);
157
+ if (inflight)
158
+ return inflight;
159
+ const p = this.mint(id).finally(() => this.inflight.delete(id));
160
+ this.inflight.set(id, p);
161
+ return p;
162
+ }
163
+ async mint(id) {
164
+ const res = await this.fetchFn(`${this.apiBase}/app/installations/${id}/access_tokens`, {
165
+ method: "POST",
166
+ signal: AbortSignal.timeout(GITHUB_REQUEST_TIMEOUT_MS),
167
+ headers: { authorization: `Bearer ${this.appJwt()}`, accept: "application/vnd.github+json" },
168
+ });
169
+ if (!res.ok)
170
+ throw new Error(`token mint failed for installation ${id}: ${res.status}${await explanation(res)}`);
171
+ const tok = (await res.json());
172
+ this.cache.set(id, tok);
173
+ return tok.token;
174
+ }
175
+ /** Drop the cache after a 401 so the next call re-mints. */
176
+ invalidate(installationId) {
177
+ if (installationId === undefined)
178
+ this.cache.clear();
179
+ else
180
+ this.cache.delete(installationId);
181
+ }
182
+ }
183
+ //# sourceMappingURL=githubAuth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"githubAuth.js","sourceRoot":"","sources":["../../src/githubAuth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /** A GitHub request that came back refused: the method, path and status, and
2
+ * how long GitHub asked us to wait, when it said. */
3
+ export declare class GitHubRequestError extends Error {
4
+ readonly method: string;
5
+ readonly path: string;
6
+ readonly status: number;
7
+ readonly retryAfterMs?: number | undefined;
8
+ constructor(method: string, path: string, status: number, detail: string, retryAfterMs?: number | undefined);
9
+ }
10
+ export interface PrFileEntry {
11
+ filename: string;
12
+ additions: number;
13
+ deletions: number;
14
+ status: string;
15
+ /** Unified diff for the file when GitHub returns one (absent for binaries). */
16
+ patch?: string;
17
+ /** The path before a rename, when GitHub detected one (renumber detection). */
18
+ previous_filename?: string;
19
+ }
20
+ //# sourceMappingURL=githubcore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"githubcore.d.ts","sourceRoot":"","sources":["../../src/githubcore.ts"],"names":[],"mappings":"AAIA;qDACqD;AACrD,qBAAa,kBAAmB,SAAQ,KAAK;IAEzC,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM;IAEvB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM;gBAJrB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACvB,MAAM,EAAE,MAAM,EACL,YAAY,CAAC,EAAE,MAAM,YAAA;CAKjC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B"}
@@ -0,0 +1,20 @@
1
+ // The core's half of the GitHub client: what a review route needs to read a
2
+ // PR and post through the one gate without the daemon's adapter
3
+ // (src/github.ts, which re-exports these).
4
+ /** A GitHub request that came back refused: the method, path and status, and
5
+ * how long GitHub asked us to wait, when it said. */
6
+ export class GitHubRequestError extends Error {
7
+ method;
8
+ path;
9
+ status;
10
+ retryAfterMs;
11
+ constructor(method, path, status, detail, retryAfterMs) {
12
+ super(`${method} ${path} → ${status}: ${detail}`);
13
+ this.method = method;
14
+ this.path = path;
15
+ this.status = status;
16
+ this.retryAfterMs = retryAfterMs;
17
+ this.name = "GitHubRequestError";
18
+ }
19
+ }
20
+ //# sourceMappingURL=githubcore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"githubcore.js","sourceRoot":"","sources":["../../src/githubcore.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,gEAAgE;AAChE,2CAA2C;AAE3C;qDACqD;AACrD,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAEhC;IACA;IACA;IAEA;IALX,YACW,MAAc,EACd,IAAY,EACZ,MAAc,EACvB,MAAc,EACL,YAAqB;QAE9B,KAAK,CAAC,GAAG,MAAM,IAAI,IAAI,MAAM,MAAM,KAAK,MAAM,EAAE,CAAC,CAAC;QANzC,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAQ;QACZ,WAAM,GAAN,MAAM,CAAQ;QAEd,iBAAY,GAAZ,YAAY,CAAS;QAG9B,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ /** Why `glob` is not a usable pattern, or null when it is. */
2
+ export declare function globProblem(glob: unknown): string | null;
3
+ export declare function globBody(pattern: string): string;
4
+ /** The RegExp a glob compiles to (see the header). */
5
+ export declare function globToRegExp(glob: string): RegExp;
6
+ /** A predicate over repo-relative paths: true when any glob matches. */
7
+ export declare function globMatcher(globs: readonly string[]): (path: string) => boolean;
8
+ /** `globMatcher`, failing CLOSED: a list the compiler refuses matches
9
+ * nothing (never everything). */
10
+ export declare function globMatcherOrNothing(globs: readonly string[]): (path: string) => boolean;
11
+ //# sourceMappingURL=glob.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../src/glob.ts"],"names":[],"mappings":"AAeA,8DAA8D;AAC9D,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAMxD;AAMD,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAWhD;AAED,sDAAsD;AACtD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKjD;AAED,wEAAwE;AACxE,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAG/E;AAED;iCACiC;AACjC,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAMxF"}
@@ -0,0 +1,69 @@
1
+ // Path globs for exclusion lists (`[scan] exclude`). Deliberately
2
+ // small and gitignore-shaped, so an operator's pattern means what it looks
3
+ // like:
4
+ //
5
+ // * any run of characters inside one path segment
6
+ // ** any run of characters, `/` included (`a/**/b`, `**/x.py`)
7
+ // ? one character inside a segment
8
+ // name a pattern with no `/` (a trailing one aside) matches that name
9
+ // at ANY depth (`*.pb.go`, `generated/`); one with an inner `/`
10
+ // is anchored at the repo root (`src/legacy/**`, `docs/api`)
11
+ //
12
+ // A pattern also matches everything under a directory it matches, so
13
+ // `generated` excludes `a/generated/x.py`. Nothing else is special: every
14
+ // other character is literal.
15
+ /** Why `glob` is not a usable pattern, or null when it is. */
16
+ export function globProblem(glob) {
17
+ if (typeof glob !== "string" || glob.trim() === "")
18
+ return "must be a non-empty string";
19
+ if (glob.startsWith("/"))
20
+ return "must be repo-relative (no leading /)";
21
+ if (glob.split("/").includes(".."))
22
+ return "must not contain `..`";
23
+ if (glob.includes("\0"))
24
+ return "must not contain NUL";
25
+ return null;
26
+ }
27
+ // A pattern's wildcards as an unanchored RegExp source: `**/` any run of
28
+ // whole leading segments, `**` any run, `*` a run inside one segment, `?` one
29
+ // character inside one; everything else literal. The ONE wildcard grammar —
30
+ // each caller adds its own anchoring around it.
31
+ export function globBody(pattern) {
32
+ return pattern
33
+ .split(/(\*\*\/|\*\*|\*|\?)/)
34
+ .map((part) => {
35
+ if (part === "**/")
36
+ return "(?:[\\s\\S]*/)?";
37
+ if (part === "**")
38
+ return "[\\s\\S]*";
39
+ if (part === "*")
40
+ return "[^/]*";
41
+ if (part === "?")
42
+ return "[^/]";
43
+ return part.replace(/[.+^${}()|[\]\\]/g, "\\$&");
44
+ })
45
+ .join("");
46
+ }
47
+ /** The RegExp a glob compiles to (see the header). */
48
+ export function globToRegExp(glob) {
49
+ // A trailing slash adds nothing the `(?:/.*)?` tail does not already say.
50
+ const g = glob.trim().replace(/\/+$/, "");
51
+ const lead = g.includes("/") ? "^" : "(?:^|/)";
52
+ return new RegExp(`${lead}${globBody(g)}(?:/[\\s\\S]*)?$`);
53
+ }
54
+ /** A predicate over repo-relative paths: true when any glob matches. */
55
+ export function globMatcher(globs) {
56
+ const res = globs.map(globToRegExp);
57
+ return (path) => res.some((re) => re.test(path));
58
+ }
59
+ /** `globMatcher`, failing CLOSED: a list the compiler refuses matches
60
+ * nothing (never everything). */
61
+ export function globMatcherOrNothing(globs) {
62
+ try {
63
+ return globMatcher(globs);
64
+ }
65
+ catch {
66
+ return () => false;
67
+ }
68
+ }
69
+ //# sourceMappingURL=glob.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob.js","sourceRoot":"","sources":["../../src/glob.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,2EAA2E;AAC3E,QAAQ;AACR,EAAE;AACF,2DAA2D;AAC3D,uEAAuE;AACvE,4CAA4C;AAC5C,4EAA4E;AAC5E,2EAA2E;AAC3E,wEAAwE;AACxE,EAAE;AACF,qEAAqE;AACrE,0EAA0E;AAC1E,8BAA8B;AAE9B,8DAA8D;AAC9D,MAAM,UAAU,WAAW,CAAC,IAAa;IACvC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,4BAA4B,CAAC;IACxF,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,sCAAsC,CAAC;IACxE,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,uBAAuB,CAAC;IACnE,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,sBAAsB,CAAC;IACvD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,yEAAyE;AACzE,8EAA8E;AAC9E,4EAA4E;AAC5E,gDAAgD;AAChD,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,OAAO,OAAO;SACX,KAAK,CAAC,qBAAqB,CAAC;SAC5B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,IAAI,IAAI,KAAK,KAAK;YAAE,OAAO,iBAAiB,CAAC;QAC7C,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,WAAW,CAAC;QACtC,IAAI,IAAI,KAAK,GAAG;YAAE,OAAO,OAAO,CAAC;QACjC,IAAI,IAAI,KAAK,GAAG;YAAE,OAAO,MAAM,CAAC;QAChC,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,0EAA0E;IAC1E,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/C,OAAO,IAAI,MAAM,CAAC,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;AAC7D,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,WAAW,CAAC,KAAwB;IAClD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACpC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACnD,CAAC;AAED;iCACiC;AACjC,MAAM,UAAU,oBAAoB,CAAC,KAAwB;IAC3D,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC;IACrB,CAAC;AACH,CAAC"}