@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,59 @@
1
+ /** Whether `name` is a plain path segment — the one admission rule behind
2
+ * `assertPathSegment` and every listing that skips what it would refuse. */
3
+ export declare function isPathSegment(name: string): boolean;
4
+ /** Refuse a name that could escape its parent directory. `kind` names what the
5
+ * segment is for, so the error says which knob is wrong. */
6
+ export declare function assertPathSegment(kind: string, name: string): string;
7
+ /** The directory, in every home, that holds one subdirectory per profile. */
8
+ export declare const PROFILES_DIR = "profiles";
9
+ /**
10
+ * The checkout's generic profiles — the ones that belong to the app, not to
11
+ * any install: the examples, and `default`, the shipped behaviour every
12
+ * generated profile extends. They are the only profiles the lookup reads
13
+ * from the checkout. Any other directory under the checkout's `profiles/` is
14
+ * an install's own profile stranded in its old place: never read, and
15
+ * `qcr install migrate` moves it into the config home. A new example is
16
+ * registered here (a test holds the checkout to it, and the shell mirror's
17
+ * `QCR_EXAMPLE_PROFILES` to this list).
18
+ */
19
+ export declare const EXAMPLE_PROFILES: readonly string[];
20
+ /** Which search place a profile was found in. */
21
+ export type ProfileSource = "home" | "override" | "checkout";
22
+ /** One place profiles are looked up in. */
23
+ export interface ProfilePlace {
24
+ dir: string;
25
+ source: ProfileSource;
26
+ }
27
+ /** Every search place, in order, deduplicated (the first place a directory
28
+ * is reached by names its source): the `homes`, then the checkout's. */
29
+ export declare function profileSearchPlaces(root: string, homes: readonly ProfilePlace[]): ProfilePlace[];
30
+ export interface LocatedProfile {
31
+ name: string;
32
+ dir: string;
33
+ source: ProfileSource;
34
+ }
35
+ export declare function isDirectory(path: string): boolean;
36
+ /**
37
+ * Find the named profile: the first search place that holds it as a
38
+ * directory — the checkout only for a generic example — or `null` when none
39
+ * does (each loader words its own not-found). The name is a plain path
40
+ * segment or a throw — `../x`, `a/b` and kin never reach a join.
41
+ */
42
+ export declare function findProfile(opts: {
43
+ root: string;
44
+ profile: string;
45
+ homes: readonly ProfilePlace[];
46
+ isDir?: (path: string) => boolean;
47
+ }): LocatedProfile | null;
48
+ /**
49
+ * The checkout's `profiles/<name>` when it is an install's own profile left
50
+ * there (not a generic example) — stranded, never read. Only for a
51
+ * not-found to name `qcr install migrate`; null when there is none, or when
52
+ * one of the `homes` is the checkout's `profiles/` (then it was read).
53
+ */
54
+ export declare function strandedProfile(opts: {
55
+ root: string;
56
+ profile: string;
57
+ homes: readonly ProfilePlace[];
58
+ }): string | null;
59
+ //# sourceMappingURL=profilelookup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profilelookup.d.ts","sourceRoot":"","sources":["../../src/profilelookup.ts"],"names":[],"mappings":"AAmBA;4EAC4E;AAC5E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;4DAC4D;AAC5D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAOpE;AAED,6EAA6E;AAC7E,eAAO,MAAM,YAAY,aAAa,CAAC;AAEvC;;;;;;;;;GASG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,EAM7C,CAAC;AAEF,iDAAiD;AACjD,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;AAE7D,2CAA2C;AAC3C,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,aAAa,CAAC;CACvB;AAED;wEACwE;AACxE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,YAAY,EAAE,GAAG,YAAY,EAAE,CAGhG;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,aAAa,CAAC;CACvB;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMjD;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;IAC/B,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CACnC,GAAG,cAAc,GAAG,IAAI,CASxB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;CAChC,GAAG,MAAM,GAAG,IAAI,CAYhB"}
@@ -0,0 +1,98 @@
1
+ // Where a repo profile is found, given the places to look. Pure over its
2
+ // inputs: the profile directories outside the checkout (the install's homes)
3
+ // are an explicit argument, resolved by the caller (src/homes.ts
4
+ // `homeProfilePlaces` from the environment), so the review core never reads
5
+ // the environment or a home itself.
6
+ //
7
+ // The search order (the first place that holds the profile wins):
8
+ // 1. the install's config home — `<home>/profiles/`
9
+ // 2. `profiles/` beside `$QCR_CONFIG`, when it is set (the compose route's
10
+ // mounted config home; the VM's shipped one; the bench image's)
11
+ // 3. the checkout's `profiles/` — the generic examples only
12
+ // Places 1 and 2 are the caller's `homes`; place 3 is `<root>/profiles`.
13
+ import { statSync } from "node:fs";
14
+ import { join } from "node:path";
15
+ /** A single path segment an install or a profile may be named by.
16
+ * No separators, no leading dot, so `..` and `a/../../b` are unspellable. */
17
+ const SEGMENT_RE = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;
18
+ /** Whether `name` is a plain path segment — the one admission rule behind
19
+ * `assertPathSegment` and every listing that skips what it would refuse. */
20
+ export function isPathSegment(name) {
21
+ return SEGMENT_RE.test(name) && !name.includes("..");
22
+ }
23
+ /** Refuse a name that could escape its parent directory. `kind` names what the
24
+ * segment is for, so the error says which knob is wrong. */
25
+ export function assertPathSegment(kind, name) {
26
+ if (!isPathSegment(name)) {
27
+ throw new Error(`${kind} ${JSON.stringify(name)} is not a plain name — letters, digits, '.', '_' and '-' only, no path separators or '..'`);
28
+ }
29
+ return name;
30
+ }
31
+ /** The directory, in every home, that holds one subdirectory per profile. */
32
+ export const PROFILES_DIR = "profiles";
33
+ /**
34
+ * The checkout's generic profiles — the ones that belong to the app, not to
35
+ * any install: the examples, and `default`, the shipped behaviour every
36
+ * generated profile extends. They are the only profiles the lookup reads
37
+ * from the checkout. Any other directory under the checkout's `profiles/` is
38
+ * an install's own profile stranded in its old place: never read, and
39
+ * `qcr install migrate` moves it into the config home. A new example is
40
+ * registered here (a test holds the checkout to it, and the shell mirror's
41
+ * `QCR_EXAMPLE_PROFILES` to this list).
42
+ */
43
+ export const EXAMPLE_PROFILES = [
44
+ "default",
45
+ "example-django",
46
+ "minimal",
47
+ "snappy",
48
+ "fast",
49
+ ];
50
+ /** Every search place, in order, deduplicated (the first place a directory
51
+ * is reached by names its source): the `homes`, then the checkout's. */
52
+ export function profileSearchPlaces(root, homes) {
53
+ const places = [...homes, { dir: join(root, PROFILES_DIR), source: "checkout" }];
54
+ return places.filter((p, i) => places.findIndex((q) => q.dir === p.dir) === i);
55
+ }
56
+ export function isDirectory(path) {
57
+ try {
58
+ return statSync(path).isDirectory();
59
+ }
60
+ catch {
61
+ return false;
62
+ }
63
+ }
64
+ /**
65
+ * Find the named profile: the first search place that holds it as a
66
+ * directory — the checkout only for a generic example — or `null` when none
67
+ * does (each loader words its own not-found). The name is a plain path
68
+ * segment or a throw — `../x`, `a/b` and kin never reach a join.
69
+ */
70
+ export function findProfile(opts) {
71
+ const name = assertPathSegment("profile", opts.profile);
72
+ const isDir = opts.isDir ?? isDirectory;
73
+ for (const place of profileSearchPlaces(opts.root, opts.homes)) {
74
+ if (place.source === "checkout" && !EXAMPLE_PROFILES.includes(name))
75
+ continue;
76
+ const dir = join(place.dir, name);
77
+ if (isDir(dir))
78
+ return { name, dir, source: place.source };
79
+ }
80
+ return null;
81
+ }
82
+ /**
83
+ * The checkout's `profiles/<name>` when it is an install's own profile left
84
+ * there (not a generic example) — stranded, never read. Only for a
85
+ * not-found to name `qcr install migrate`; null when there is none, or when
86
+ * one of the `homes` is the checkout's `profiles/` (then it was read).
87
+ */
88
+ export function strandedProfile(opts) {
89
+ const name = assertPathSegment("profile", opts.profile);
90
+ if (EXAMPLE_PROFILES.includes(name))
91
+ return null;
92
+ const checkout = join(opts.root, PROFILES_DIR);
93
+ if (!profileSearchPlaces(opts.root, opts.homes).some((p) => p.dir === checkout && p.source === "checkout"))
94
+ return null;
95
+ const dir = join(checkout, name);
96
+ return isDirectory(dir) ? dir : null;
97
+ }
98
+ //# sourceMappingURL=profilelookup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profilelookup.js","sourceRoot":"","sources":["../../src/profilelookup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ import { type ProfileLookup } from "./profiles.js";
2
+ /** The directory in the repo that holds the repo profile. */
3
+ export declare const REPO_PROFILE_DIR = ".qcr";
4
+ /** Where a replacement came from. */
5
+ export type OverrideOrigin = "user" | "repo";
6
+ /** One directory of override files, `agents/` and `prompts/` under it. */
7
+ export interface OverrideLayer {
8
+ origin: OverrideOrigin;
9
+ /** The profile's name (`.qcr` for the repo profile). */
10
+ name: string;
11
+ dir: string;
12
+ }
13
+ /** One shipped file a layer replaced with different bytes. */
14
+ export interface OverrideRecord {
15
+ /** The shipped file, relative to the app root: `agents/pass-security.md`. */
16
+ path: string;
17
+ origin: OverrideOrigin;
18
+ /** The profile whose file won. */
19
+ layer: string;
20
+ /** sha256 of the replacement. */
21
+ sha256: string;
22
+ /** sha256 of the shipped file. */
23
+ shipped_sha256: string;
24
+ /** Whether the shipped file is one of the frozen seeds (AGENTS.md invariant 3). */
25
+ seed: boolean;
26
+ }
27
+ export interface Customisation {
28
+ customised: boolean;
29
+ overrides: OverrideRecord[];
30
+ }
31
+ export interface OverrideSet {
32
+ /** Lowest precedence first: the repo profile, then the user's chain. */
33
+ layers: OverrideLayer[];
34
+ /** What a layer carried that was not applied, one line each. */
35
+ ignored: string[];
36
+ /** The loaders' view of the same layers (packages/pi-plugin/src/profiles.ts). */
37
+ lookup: ProfileLookup;
38
+ }
39
+ /** The seed manifest's `path → sha256`, or null when the install ships none
40
+ * (then a shipped file is compared by its own hash). Never throws. */
41
+ export declare function loadSeedManifest(root: string): Record<string, string> | null;
42
+ /**
43
+ * Extract the repo profile from `ref` (a commit, the review's BASE) into
44
+ * `destDir`, reading git objects only: the working tree and the PR head are
45
+ * never consulted. Only the files in `REPO_FILE_RE` come out, as regular
46
+ * blobs under the size caps; a symlink, a submodule, an oversized file and
47
+ * anything outside the list is dropped and named in `ignored`. `dir` is null
48
+ * when the base has no `.qcr/` (or nothing in it a repo may carry).
49
+ */
50
+ export declare function extractRepoProfile(o: {
51
+ gitDir: string;
52
+ ref: string;
53
+ destDir: string;
54
+ }): {
55
+ dir: string | null;
56
+ ignored: string[];
57
+ };
58
+ /**
59
+ * The override layers of one run: the repo profile (when `repo` names a git
60
+ * dir and a base commit) under the user's named profile and everything it
61
+ * extends. Files with no shipped namesake apply to nothing and are reported.
62
+ */
63
+ export declare function resolveOverrides(o: {
64
+ root: string;
65
+ /** `[review] profile`; "" is no named profile. */
66
+ profile: string;
67
+ lookup?: ProfileLookup;
68
+ repo?: {
69
+ gitDir: string;
70
+ baseRef: string;
71
+ destDir: string;
72
+ };
73
+ }): OverrideSet;
74
+ /** Whether any layer carries a file that replaces a shipped one. */
75
+ export declare function hasOverrideFiles(root: string, set: OverrideSet): boolean;
76
+ /**
77
+ * The `readFile` for `buildAgents` and the prompt renderers: a shipped
78
+ * `agents/` or `prompts/` file under `root` reads from the winning layer when
79
+ * one carries it, and everything else reads as usual. Undefined when no layer
80
+ * replaces anything, so callers that pass it through change nothing.
81
+ */
82
+ export declare function overrideReader(root: string, set: OverrideSet): ((p: string) => string) | undefined;
83
+ /**
84
+ * Which shipped files this run's layers replaced with different bytes. The
85
+ * shipped hash is the seed manifest's for a seed, else the file's own. A
86
+ * run with no replacement returns at once, without reading the manifest.
87
+ */
88
+ export declare function assessOverrides(root: string, set: OverrideSet): Customisation;
89
+ /** The line a report footer and the terminal carry for a customised run. */
90
+ export declare function customisedNote(c: Customisation): string;
91
+ //# sourceMappingURL=profileoverrides.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profileoverrides.d.ts","sourceRoot":"","sources":["../../src/profileoverrides.ts"],"names":[],"mappings":"AA+CA,OAAO,EAAwC,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAEzF,6DAA6D;AAC7D,eAAO,MAAM,gBAAgB,SAAkB,CAAC;AAEhD,qCAAqC;AACrC,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,CAAC;AAE7C,0EAA0E;AAC1E,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,cAAc,CAAC;IACvB,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,8DAA8D;AAC9D,MAAM,WAAW,cAAc;IAC7B,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,CAAC;IACvB,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,mFAAmF;IACnF,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,cAAc,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,wEAAwE;IACxE,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,gEAAgE;IAChE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,iFAAiF;IACjF,MAAM,EAAE,aAAa,CAAC;CACvB;AAiBD;sEACsE;AACtE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAa5E;AA2FD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IACvF,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CA6CA;AAUD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,IAAI,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7D,GAAG,WAAW,CAmCd;AAED,oEAAoE;AACpE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAGxE;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,WAAW,GACf,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAUrC;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,aAAa,CAoB7E;AAED,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAGvD"}
@@ -0,0 +1,313 @@
1
+ // Profile overrides of the shipped agents and prompts, and the "customised"
2
+ // mark they put on a review.
3
+ //
4
+ // Two profiles may replace a shipped file, and one set of rules says which:
5
+ //
6
+ // * the USER profile — the named profile (`[review] profile`) and the
7
+ // profiles it extends, found in the install's config home. On the user's
8
+ // own install it is the final word: it wins over the repo profile.
9
+ // * the REPO profile — `.qcr/` in the reviewed repo, read from the BASE
10
+ // commit with git, never from the checkout or the PR head: a PR cannot
11
+ // change the profile that reviews it. It is the lowest layer, and it can
12
+ // say less: only the files and keys listed below. Everything else in
13
+ // `.qcr/` is dropped and reported, never applied.
14
+ //
15
+ // What a layer may carry: `agents/<name>.md` and `prompts/<name>.md`, each
16
+ // replacing the shipped file of that name (a file with no shipped namesake
17
+ // replaces nothing and is reported); and the profile's own settings,
18
+ // `profile.toml`, `heuristics.toml` and `addenda/*.md`, which the profile
19
+ // loaders read (packages/pi-plugin/src/profiles.ts). A repo's `profile.toml` is cut down to
20
+ // `ecosystem`, `[lenses]`, `[scan]`, `[posting]` and `[addenda]`.
21
+ //
22
+ // What no layer can reach: the bash-guard policy (extensions/), the secret
23
+ // dirs, and the posting gate (`dry_run`, the MutationGate). None of them is a
24
+ // file this module reads or a key a profile loader knows, so a profile has no
25
+ // way to name them; the repo profile's extraction also refuses the keys that
26
+ // look like them, so the refusal is visible rather than a silent no-op.
27
+ //
28
+ // The mark: each replacement is hashed against the shipped file (the seed
29
+ // manifest's hash for a seed, the file's own hash otherwise). A replacement
30
+ // whose hash differs puts the run in `customised` and lists the file in
31
+ // `overrides[]`; a byte-identical copy changes nothing and marks nothing. With
32
+ // no replacement at all, nothing here runs a model, reads the manifest or
33
+ // hands a callback to anyone, so an uncustomised run is the run it always was.
34
+ // Seeds themselves are never written: layers are read-only inputs.
35
+ import { createHash } from "node:crypto";
36
+ import { execFileSync } from "node:child_process";
37
+ import { existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, writeFileSync, } from "node:fs";
38
+ import { join, relative, resolve, sep } from "node:path";
39
+ import { parse as parseToml, stringify as stringifyToml } from "smol-toml";
40
+ import { findProfile } from "./profilelookup.js";
41
+ import { REPO_LAYER_NAME, resolveProfileChain } from "./profiles.js";
42
+ /** The directory in the repo that holds the repo profile. */
43
+ export const REPO_PROFILE_DIR = REPO_LAYER_NAME;
44
+ const SHIPPED_DIRS = ["agents", "prompts"];
45
+ const NAME_RE = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
46
+ /** Per-file and total caps on what is pulled out of a repo's `.qcr/`. */
47
+ const MAX_FILE_BYTES = 256 * 1024;
48
+ const MAX_TOTAL_BYTES = 2 * 1024 * 1024;
49
+ const MAX_IGNORED_LINES = 20;
50
+ const sha256 = (data) => createHash("sha256").update(data).digest("hex");
51
+ // ---- the seed manifest ---------------------------------------------------------
52
+ /** Where the runtime reads the seed manifest: baked beside the code in the
53
+ * image (`<root>/seed-manifest.json`), else the checkout's pinned copy. */
54
+ const MANIFEST_PLACES = ["seed-manifest.json", join("tests", "fixtures", "seed-manifest.json")];
55
+ /** The seed manifest's `path → sha256`, or null when the install ships none
56
+ * (then a shipped file is compared by its own hash). Never throws. */
57
+ export function loadSeedManifest(root) {
58
+ for (const place of MANIFEST_PLACES) {
59
+ try {
60
+ const doc = JSON.parse(readFileSync(join(root, place), "utf8"));
61
+ if (typeof doc.files !== "object" || doc.files === null)
62
+ continue;
63
+ const files = {};
64
+ for (const [k, v] of Object.entries(doc.files))
65
+ if (typeof v === "string")
66
+ files[k] = v;
67
+ return files;
68
+ }
69
+ catch {
70
+ // absent or unreadable: try the next place
71
+ }
72
+ }
73
+ return null;
74
+ }
75
+ // ---- reading a layer -------------------------------------------------------------
76
+ /** The override files a layer carries: `<dir>/agents/*.md` and
77
+ * `<dir>/prompts/*.md`, regular files only, keyed by shipped path. */
78
+ function layerFiles(layer, oversized) {
79
+ const out = new Map();
80
+ for (const sub of SHIPPED_DIRS) {
81
+ let names;
82
+ try {
83
+ names = readdirSync(join(layer.dir, sub))
84
+ .filter((f) => f.endsWith(".md") && NAME_RE.test(f))
85
+ .sort();
86
+ }
87
+ catch {
88
+ continue;
89
+ }
90
+ for (const f of names) {
91
+ const file = join(layer.dir, sub, f);
92
+ try {
93
+ const st = lstatSync(file);
94
+ if (st.isFile() && st.size <= MAX_FILE_BYTES)
95
+ out.set(`${sub}/${f}`, file);
96
+ else if (st.isFile())
97
+ oversized?.push(`${sub}/${f}`);
98
+ }
99
+ catch {
100
+ // gone between the listing and the stat
101
+ }
102
+ }
103
+ }
104
+ return out;
105
+ }
106
+ /** Each shipped path's winning file, over the layers (later wins). */
107
+ function winners(set) {
108
+ const out = new Map();
109
+ for (const layer of set.layers)
110
+ for (const [path, file] of layerFiles(layer))
111
+ out.set(path, { layer, file });
112
+ return out;
113
+ }
114
+ /** Whether a shipped file of that path exists to be replaced. */
115
+ const shipped = (root, path) => existsSync(join(root, path));
116
+ // ---- the repo profile --------------------------------------------------------------
117
+ /** Top-level `profile.toml` keys a repo profile may set. */
118
+ const REPO_TOML_KEYS = new Set(["ecosystem", "lenses", "scan", "posting", "addenda"]);
119
+ /** Keys named for what they would reach, so the refusal says why. */
120
+ const GUARDED_KEY = /^(dry_run|github|secrets?(_dir)?|guard|bash_guard|gate|posting_gate)$/i;
121
+ const REPO_FILE_RE = /^(?:profile\.toml|heuristics\.toml|(?:addenda|agents|prompts)\/[A-Za-z0-9][A-Za-z0-9._-]*\.md)$/;
122
+ const GIT_ENV = {
123
+ ...process.env,
124
+ GIT_CONFIG_NOSYSTEM: "1",
125
+ GIT_CONFIG_GLOBAL: "/dev/null",
126
+ GIT_TERMINAL_PROMPT: "0",
127
+ };
128
+ function gitOut(gitDir, args, maxBuffer = MAX_FILE_BYTES * 2) {
129
+ return execFileSync("git", ["-C", gitDir, ...args], {
130
+ env: GIT_ENV,
131
+ maxBuffer,
132
+ stdio: ["ignore", "pipe", "pipe"],
133
+ });
134
+ }
135
+ /** `profile.toml` cut down to what a repo may say; the rest named in `ignored`. */
136
+ function sanitizeRepoToml(raw, ignored) {
137
+ let doc;
138
+ try {
139
+ doc = parseToml(raw);
140
+ }
141
+ catch (err) {
142
+ throw new Error(`the repo profile ${REPO_PROFILE_DIR}/profile.toml is not valid TOML: ${String(err instanceof Error ? err.message : err)}`, { cause: err });
143
+ }
144
+ const kept = {};
145
+ for (const [key, value] of Object.entries(doc)) {
146
+ if (REPO_TOML_KEYS.has(key))
147
+ kept[key] = value;
148
+ else
149
+ ignored.push(GUARDED_KEY.test(key)
150
+ ? `${REPO_PROFILE_DIR}/profile.toml: "${key}" is guarded; a repo profile cannot set it`
151
+ : `${REPO_PROFILE_DIR}/profile.toml: "${key}" is not a key a repo profile may set`);
152
+ }
153
+ return stringifyToml(kept);
154
+ }
155
+ /**
156
+ * Extract the repo profile from `ref` (a commit, the review's BASE) into
157
+ * `destDir`, reading git objects only: the working tree and the PR head are
158
+ * never consulted. Only the files in `REPO_FILE_RE` come out, as regular
159
+ * blobs under the size caps; a symlink, a submodule, an oversized file and
160
+ * anything outside the list is dropped and named in `ignored`. `dir` is null
161
+ * when the base has no `.qcr/` (or nothing in it a repo may carry).
162
+ */
163
+ export function extractRepoProfile(o) {
164
+ if (!/^[0-9a-f]{7,64}$/i.test(o.ref))
165
+ throw new Error(`the repo profile is read from a commit, not ${JSON.stringify(o.ref)}`);
166
+ const ignored = [];
167
+ let listing;
168
+ try {
169
+ listing = gitOut(o.gitDir, ["ls-tree", "-r", "-z", "--long", o.ref, "--", REPO_PROFILE_DIR], 8 * 1024 * 1024).toString("utf8");
170
+ }
171
+ catch {
172
+ // an unreadable base is no repo profile; the review's own git use reports it
173
+ return { dir: null, ignored };
174
+ }
175
+ let total = 0;
176
+ let wrote = false;
177
+ for (const entry of listing.split("\0").filter(Boolean)) {
178
+ const tab = entry.indexOf("\t");
179
+ const [mode, type, sha, size] = entry.slice(0, tab).split(/\s+/);
180
+ const path = entry.slice(tab + 1);
181
+ const rel = path.slice(REPO_PROFILE_DIR.length + 1);
182
+ const label = `${REPO_PROFILE_DIR}/${rel}`;
183
+ if (type !== "blob" || (mode !== "100644" && mode !== "100755")) {
184
+ ignored.push(`${label}: not a regular file (mode ${mode})`);
185
+ continue;
186
+ }
187
+ if (!REPO_FILE_RE.test(rel)) {
188
+ ignored.push(`${label}: not a file a repo profile may carry`);
189
+ continue;
190
+ }
191
+ const bytes = Number(size);
192
+ if (!Number.isFinite(bytes) || bytes > MAX_FILE_BYTES || total + bytes > MAX_TOTAL_BYTES) {
193
+ ignored.push(`${label}: over the size cap`);
194
+ continue;
195
+ }
196
+ total += bytes;
197
+ let text = gitOut(o.gitDir, ["cat-file", "blob", sha]).toString("utf8");
198
+ if (rel === "profile.toml")
199
+ text = sanitizeRepoToml(text, ignored);
200
+ const dest = join(o.destDir, rel);
201
+ mkdirSync(join(dest, ".."), { recursive: true, mode: 0o700 });
202
+ writeFileSync(dest, text, { mode: 0o600 });
203
+ wrote = true;
204
+ }
205
+ return { dir: wrote ? o.destDir : null, ignored: capIgnored(ignored) };
206
+ }
207
+ function capIgnored(lines) {
208
+ return lines.length <= MAX_IGNORED_LINES
209
+ ? lines
210
+ : [...lines.slice(0, MAX_IGNORED_LINES), `…and ${lines.length - MAX_IGNORED_LINES} more`];
211
+ }
212
+ // ---- the layers of one run -----------------------------------------------------------
213
+ /**
214
+ * The override layers of one run: the repo profile (when `repo` names a git
215
+ * dir and a base commit) under the user's named profile and everything it
216
+ * extends. Files with no shipped namesake apply to nothing and are reported.
217
+ */
218
+ export function resolveOverrides(o) {
219
+ const layers = [];
220
+ const ignored = [];
221
+ const lookup = { ...(o.lookup ?? {}) };
222
+ if (o.repo) {
223
+ const r = extractRepoProfile({
224
+ gitDir: o.repo.gitDir,
225
+ ref: o.repo.baseRef,
226
+ destDir: o.repo.destDir,
227
+ });
228
+ ignored.push(...r.ignored);
229
+ if (r.dir !== null) {
230
+ layers.push({ origin: "repo", name: REPO_PROFILE_DIR, dir: r.dir });
231
+ lookup.repoProfile = { dir: r.dir };
232
+ }
233
+ }
234
+ // A profile found nowhere is no named chain, as for the tuning loaders.
235
+ const named = o.profile === "" ||
236
+ !findProfile({ root: o.root, profile: o.profile, homes: o.lookup?.homes ?? [] })
237
+ ? []
238
+ : resolveProfileChain(o.root, o.profile, o.lookup ?? {});
239
+ for (const l of named)
240
+ layers.push({ origin: "user", name: l.name, dir: l.dir });
241
+ const set = { layers, ignored, lookup };
242
+ for (const layer of layers) {
243
+ const over = [];
244
+ for (const path of layerFiles(layer, over).keys())
245
+ if (!shipped(o.root, path))
246
+ ignored.push(`${layer.name}/${path}: no shipped file of that name to replace, so it applies to nothing`);
247
+ for (const path of over)
248
+ ignored.push(`${layer.name}/${path}: over the size cap`);
249
+ }
250
+ set.ignored = capIgnored(ignored);
251
+ return set;
252
+ }
253
+ /** Whether any layer carries a file that replaces a shipped one. */
254
+ export function hasOverrideFiles(root, set) {
255
+ for (const path of winners(set).keys())
256
+ if (shipped(root, path))
257
+ return true;
258
+ return false;
259
+ }
260
+ /**
261
+ * The `readFile` for `buildAgents` and the prompt renderers: a shipped
262
+ * `agents/` or `prompts/` file under `root` reads from the winning layer when
263
+ * one carries it, and everything else reads as usual. Undefined when no layer
264
+ * replaces anything, so callers that pass it through change nothing.
265
+ */
266
+ export function overrideReader(root, set) {
267
+ const won = new Map();
268
+ for (const [path, w] of winners(set))
269
+ if (shipped(root, path))
270
+ won.set(path, w.file);
271
+ if (won.size === 0)
272
+ return undefined;
273
+ const base = resolve(root);
274
+ return (p) => {
275
+ const rel = relative(base, resolve(p)).split(sep).join("/");
276
+ const file = won.get(rel);
277
+ return readFileSync(file ?? p, "utf8");
278
+ };
279
+ }
280
+ /**
281
+ * Which shipped files this run's layers replaced with different bytes. The
282
+ * shipped hash is the seed manifest's for a seed, else the file's own. A
283
+ * run with no replacement returns at once, without reading the manifest.
284
+ */
285
+ export function assessOverrides(root, set) {
286
+ const manifest = loadSeedManifest(root);
287
+ const overrides = [];
288
+ for (const [path, w] of winners(set)) {
289
+ if (!shipped(root, path))
290
+ continue;
291
+ const mine = sha256(readFileSync(w.file));
292
+ const seeded = manifest?.[path];
293
+ const theirs = seeded ?? sha256(readFileSync(join(root, path)));
294
+ if (mine === theirs)
295
+ continue;
296
+ overrides.push({
297
+ path,
298
+ origin: w.layer.origin,
299
+ layer: w.layer.name,
300
+ sha256: mine,
301
+ shipped_sha256: theirs,
302
+ seed: seeded !== undefined,
303
+ });
304
+ }
305
+ overrides.sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0));
306
+ return { customised: overrides.length > 0, overrides };
307
+ }
308
+ /** The line a report footer and the terminal carry for a customised run. */
309
+ export function customisedNote(c) {
310
+ const files = c.overrides.map((o) => `${o.path} (${o.origin} profile)`).join(", ");
311
+ return `Customised: this review ran with ${c.overrides.length} shipped file${c.overrides.length === 1 ? "" : "s"} replaced by a profile: ${files}.`;
312
+ }
313
+ //# sourceMappingURL=profileoverrides.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profileoverrides.js","sourceRoot":"","sources":["../../src/profileoverrides.ts"],"names":[],"mappings":"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"}