@quickchatai/quickreview 1.2.0 → 1.3.2

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 (350) hide show
  1. package/README.md +116 -53
  2. package/bin/qcr.js +1 -1
  3. package/config.example.toml +25 -7
  4. package/deploy/ansible/README.md +20 -12
  5. package/deploy/ansible/inventory.example.ini +1 -1
  6. package/deploy/collect-secrets.sh +1 -1
  7. package/deploy/qcr-update.sh +1 -1
  8. package/dist/extensions/cli/home.js +14 -0
  9. package/dist/extensions/cli/home.js.map +1 -0
  10. package/dist/extensions/cli/selfimprove.js +18 -0
  11. package/dist/extensions/cli/selfimprove.js.map +1 -0
  12. package/dist/extensions/home.js +350 -0
  13. package/dist/extensions/home.js.map +1 -0
  14. package/dist/extensions/login-route.js +1 -1
  15. package/dist/extensions/login-route.js.map +1 -1
  16. package/dist/extensions/onboarding.js +8 -7
  17. package/dist/extensions/onboarding.js.map +1 -1
  18. package/dist/extensions/selfimprove.js +49 -0
  19. package/dist/extensions/selfimprove.js.map +1 -0
  20. package/dist/extensions/setup-scan.js +23 -592
  21. package/dist/extensions/setup-scan.js.map +1 -1
  22. package/dist/extensions/setup.js +2 -47
  23. package/dist/extensions/setup.js.map +1 -1
  24. package/dist/extensions/vendor/openviking-pi/index.js +4 -0
  25. package/dist/extensions/vendor/openviking-pi/index.js.map +1 -1
  26. package/dist/extensions/vendor/openviking-pi/qcr-hooks.js +3 -1
  27. package/dist/extensions/vendor/openviking-pi/qcr-hooks.js.map +1 -1
  28. package/dist/extensions/vendor/openviking-pi/sync.js +81 -0
  29. package/dist/extensions/vendor/openviking-pi/sync.js.map +1 -1
  30. package/dist/src/archive/restore.js +18 -15
  31. package/dist/src/archive/restore.js.map +1 -1
  32. package/dist/src/botworker.js +13 -2
  33. package/dist/src/botworker.js.map +1 -1
  34. package/dist/src/channelfs.js +3 -26
  35. package/dist/src/channelfs.js.map +1 -1
  36. package/dist/src/cli.js +14 -50
  37. package/dist/src/cli.js.map +1 -1
  38. package/dist/src/config.js +16 -0
  39. package/dist/src/config.js.map +1 -1
  40. package/dist/src/daemon.js +33 -4
  41. package/dist/src/daemon.js.map +1 -1
  42. package/dist/src/debuground.js +1 -0
  43. package/dist/src/debuground.js.map +1 -1
  44. package/dist/src/debugroundpi.js +1 -0
  45. package/dist/src/debugroundpi.js.map +1 -1
  46. package/dist/src/engine/caserunner-sdk.js +15 -251
  47. package/dist/src/engine/caserunner-sdk.js.map +1 -1
  48. package/dist/src/home/adapters.js +349 -0
  49. package/dist/src/home/adapters.js.map +1 -0
  50. package/dist/src/home/advanced.js +318 -0
  51. package/dist/src/home/advanced.js.map +1 -0
  52. package/dist/src/home/advancedtools.js +57 -0
  53. package/dist/src/home/advancedtools.js.map +1 -0
  54. package/dist/src/home/autoreview.js +325 -0
  55. package/dist/src/home/autoreview.js.map +1 -0
  56. package/dist/src/home/daemonstatus.js +32 -0
  57. package/dist/src/home/daemonstatus.js.map +1 -0
  58. package/dist/src/home/devicelogin.js +61 -0
  59. package/dist/src/home/devicelogin.js.map +1 -0
  60. package/dist/src/home/launch.js +202 -0
  61. package/dist/src/home/launch.js.map +1 -0
  62. package/dist/src/home/loginowner.js +205 -0
  63. package/dist/src/home/loginowner.js.map +1 -0
  64. package/dist/src/home/memory.js +122 -0
  65. package/dist/src/home/memory.js.map +1 -0
  66. package/dist/src/home/model.js +811 -0
  67. package/dist/src/home/model.js.map +1 -0
  68. package/dist/src/home/panel.js +520 -0
  69. package/dist/src/home/panel.js.map +1 -0
  70. package/dist/src/home/ports.js +19 -0
  71. package/dist/src/home/ports.js.map +1 -0
  72. package/dist/src/home/review.js +163 -0
  73. package/dist/src/home/review.js.map +1 -0
  74. package/dist/src/home/reviews.js +478 -0
  75. package/dist/src/home/reviews.js.map +1 -0
  76. package/dist/src/home/setup.js +507 -0
  77. package/dist/src/home/setup.js.map +1 -0
  78. package/dist/src/home/setupadapters.js +214 -0
  79. package/dist/src/home/setupadapters.js.map +1 -0
  80. package/dist/src/home/setupcard.js +199 -0
  81. package/dist/src/home/setupcard.js.map +1 -0
  82. package/dist/src/home/setuptools.js +45 -0
  83. package/dist/src/home/setuptools.js.map +1 -0
  84. package/dist/src/home/spend.js +160 -0
  85. package/dist/src/home/spend.js.map +1 -0
  86. package/dist/src/home/switches.js +209 -0
  87. package/dist/src/home/switches.js.map +1 -0
  88. package/dist/src/home/switchon.js +439 -0
  89. package/dist/src/home/switchon.js.map +1 -0
  90. package/dist/src/home/toolnames.js +41 -0
  91. package/dist/src/home/toolnames.js.map +1 -0
  92. package/dist/src/home/tune.js +341 -0
  93. package/dist/src/home/tune.js.map +1 -0
  94. package/dist/src/home/words.js +7 -0
  95. package/dist/src/home/words.js.map +1 -0
  96. package/dist/src/homes.js +14 -0
  97. package/dist/src/homes.js.map +1 -1
  98. package/dist/src/install.js +1 -1
  99. package/dist/src/install.js.map +1 -1
  100. package/dist/src/ipc/workerspec.js +8 -0
  101. package/dist/src/ipc/workerspec.js.map +1 -1
  102. package/dist/src/ledgercheck.js +39 -10
  103. package/dist/src/ledgercheck.js.map +1 -1
  104. package/dist/src/live/publish.js +1 -1
  105. package/dist/src/live/publish.js.map +1 -1
  106. package/dist/src/livecli.js +1 -1
  107. package/dist/src/livecli.js.map +1 -1
  108. package/dist/src/loginrefresh/handover.js +121 -0
  109. package/dist/src/loginrefresh/handover.js.map +1 -0
  110. package/dist/src/loginrefresh/lock.js +54 -3
  111. package/dist/src/loginrefresh/lock.js.map +1 -1
  112. package/dist/src/loginrefresh/refresher.js +33 -5
  113. package/dist/src/loginrefresh/refresher.js.map +1 -1
  114. package/dist/src/loginrefresh/supervisor.js +18 -1
  115. package/dist/src/loginrefresh/supervisor.js.map +1 -1
  116. package/dist/src/npmverbs.js +42 -12
  117. package/dist/src/npmverbs.js.map +1 -1
  118. package/dist/src/onboard/choices.js +6 -3
  119. package/dist/src/onboard/choices.js.map +1 -1
  120. package/dist/src/onboard/engine.js +33 -292
  121. package/dist/src/onboard/engine.js.map +1 -1
  122. package/dist/src/onboard/steps/bringup.js +3 -2
  123. package/dist/src/onboard/steps/bringup.js.map +1 -1
  124. package/dist/src/onboard/steps/configfill.js +18 -7
  125. package/dist/src/onboard/steps/configfill.js.map +1 -1
  126. package/dist/src/onboard/steps/loginshare.js +213 -0
  127. package/dist/src/onboard/steps/loginshare.js.map +1 -0
  128. package/dist/src/onboard/steps/memory.js +14 -2
  129. package/dist/src/onboard/steps/memory.js.map +1 -1
  130. package/dist/src/onboard/steps/repoconfig.js +72 -0
  131. package/dist/src/onboard/steps/repoconfig.js.map +1 -0
  132. package/dist/src/onboard/toolnames.js +2 -2
  133. package/dist/src/onboard/toolnames.js.map +1 -1
  134. package/dist/src/piagentdir.js +13 -0
  135. package/dist/src/piagentdir.js.map +1 -0
  136. package/dist/src/pilogin.js +31 -16
  137. package/dist/src/pilogin.js.map +1 -1
  138. package/dist/src/qcrbin.js +16 -11
  139. package/dist/src/qcrbin.js.map +1 -1
  140. package/dist/src/reviewargs.js +122 -0
  141. package/dist/src/reviewargs.js.map +1 -0
  142. package/dist/src/reviewcli.js +7 -161
  143. package/dist/src/reviewcli.js.map +1 -1
  144. package/dist/src/reviewdetach.js +76 -11
  145. package/dist/src/reviewdetach.js.map +1 -1
  146. package/dist/src/scancli.js +39 -691
  147. package/dist/src/scancli.js.map +1 -1
  148. package/dist/src/selfimprove.js +66 -0
  149. package/dist/src/selfimprove.js.map +1 -0
  150. package/dist/src/session-command-supervisor.js +38 -9
  151. package/dist/src/session-command-supervisor.js.map +1 -1
  152. package/dist/src/setup/adapters.js +5 -223
  153. package/dist/src/setup/adapters.js.map +1 -1
  154. package/dist/src/setup/caserunner.js +15 -249
  155. package/dist/src/setup/caserunner.js.map +1 -1
  156. package/dist/src/setup/engine.js +32 -341
  157. package/dist/src/setup/engine.js.map +1 -1
  158. package/dist/src/setup/facts.js +3 -592
  159. package/dist/src/setup/facts.js.map +1 -1
  160. package/dist/src/setup/findings.js +3 -947
  161. package/dist/src/setup/findings.js.map +1 -1
  162. package/dist/src/setup/presentation.js +3 -8
  163. package/dist/src/setup/presentation.js.map +1 -1
  164. package/dist/src/setup/scan.js +3 -724
  165. package/dist/src/setup/scan.js.map +1 -1
  166. package/dist/src/setup/scanbuild.js +9 -92
  167. package/dist/src/setup/scanbuild.js.map +1 -1
  168. package/dist/src/setup/scanlease.js +3 -250
  169. package/dist/src/setup/scanlease.js.map +1 -1
  170. package/dist/src/setup/scanreport.js +3 -288
  171. package/dist/src/setup/scanreport.js.map +1 -1
  172. package/dist/src/setup/scanrun.js +3 -1732
  173. package/dist/src/setup/scanrun.js.map +1 -1
  174. package/dist/src/setup/scantree.js +3 -256
  175. package/dist/src/setup/scantree.js.map +1 -1
  176. package/dist/src/setup/stage2request.js +3 -258
  177. package/dist/src/setup/stage2request.js.map +1 -1
  178. package/dist/src/setup/unitcut.js +3 -436
  179. package/dist/src/setup/unitcut.js.map +1 -1
  180. package/dist/src/state.js +75 -9
  181. package/dist/src/state.js.map +1 -1
  182. package/dist/src/takeover.js +1 -0
  183. package/dist/src/takeover.js.map +1 -1
  184. package/dist/src/takeoverpi.js +2 -1
  185. package/dist/src/takeoverpi.js.map +1 -1
  186. package/dist/src/tui/alerts.js +4 -1
  187. package/dist/src/tui/alerts.js.map +1 -1
  188. package/dist/src/tui/board.js +2 -2
  189. package/dist/src/tui/board.js.map +1 -1
  190. package/dist/src/tui/companion.js +2 -1
  191. package/dist/src/tui/companion.js.map +1 -1
  192. package/dist/src/tui/deploytab.js +2 -2
  193. package/dist/src/tui/deploytab.js.map +1 -1
  194. package/dist/src/tui/index.js +9 -6
  195. package/dist/src/tui/index.js.map +1 -1
  196. package/dist/src/tui/memory.js +3 -16
  197. package/dist/src/tui/memory.js.map +1 -1
  198. package/dist/src/tui/memoryurl.js +22 -0
  199. package/dist/src/tui/memoryurl.js.map +1 -0
  200. package/dist/src/tui/remote.js +1 -1
  201. package/dist/src/tui/remote.js.map +1 -1
  202. package/dist/src/tui/route.js +2 -2
  203. package/dist/src/tui/route.js.map +1 -1
  204. package/dist/src/tui/setupstate.js +8 -5
  205. package/dist/src/tui/setupstate.js.map +1 -1
  206. package/dist/src/tui/sshtriage.js +1 -1
  207. package/dist/src/tui/sshtriage.js.map +1 -1
  208. package/dist/src/verdicts.js +12 -0
  209. package/dist/src/verdicts.js.map +1 -1
  210. package/dist/src/wire.js +9 -4
  211. package/dist/src/wire.js.map +1 -1
  212. package/dist/src/workerbreaker.js +32 -5
  213. package/dist/src/workerbreaker.js.map +1 -1
  214. package/dist/src/workerworld.js +4 -0
  215. package/dist/src/workerworld.js.map +1 -1
  216. package/docker/README.md +1 -1
  217. package/docker/entrypoint.sh +40 -6
  218. package/docker-compose.yml +16 -1
  219. package/extensions/cli/home.ts +14 -0
  220. package/extensions/cli/selfimprove.ts +18 -0
  221. package/extensions/home.ts +484 -0
  222. package/extensions/login-route.ts +1 -1
  223. package/extensions/onboarding.ts +8 -7
  224. package/extensions/selfimprove.ts +65 -0
  225. package/extensions/setup-scan.ts +79 -766
  226. package/extensions/setup.ts +14 -70
  227. package/extensions/vendor/openviking-pi/NOTICE +5 -0
  228. package/extensions/vendor/openviking-pi/README.md +39 -5
  229. package/extensions/vendor/openviking-pi/index.ts +4 -0
  230. package/extensions/vendor/openviking-pi/patches/0014-one-turn-sync-in-flight.patch +239 -0
  231. package/extensions/vendor/openviking-pi/qcr-hooks.ts +3 -1
  232. package/extensions/vendor/openviking-pi/sync.ts +80 -0
  233. package/extensions/vendor/openviking-pi/upstream.json +2 -1
  234. package/package.json +6 -4
  235. package/prompts/onboarding.md +8 -7
  236. package/schemas/review-result.v1.json +60 -0
  237. package/scripts/deploy.sh +8 -6
  238. package/scripts/qcr-host.sh +28 -5
  239. package/scripts/vm-ghcr-login.sh +7 -4
  240. package/src/archive/restore.ts +18 -21
  241. package/src/botworker.ts +13 -2
  242. package/src/channelfs.ts +3 -26
  243. package/src/cli.ts +13 -54
  244. package/src/config.ts +38 -0
  245. package/src/daemon.ts +34 -4
  246. package/src/debuground.ts +3 -0
  247. package/src/debugroundpi.ts +1 -0
  248. package/src/engine/caserunner-sdk.ts +29 -314
  249. package/src/home/adapters.ts +418 -0
  250. package/src/home/advanced.ts +421 -0
  251. package/src/home/advancedtools.ts +96 -0
  252. package/src/home/autoreview.ts +385 -0
  253. package/src/home/daemonstatus.ts +55 -0
  254. package/src/home/devicelogin.ts +107 -0
  255. package/src/home/launch.ts +257 -0
  256. package/src/home/loginowner.ts +248 -0
  257. package/src/home/memory.ts +176 -0
  258. package/src/home/model.ts +965 -0
  259. package/src/home/panel.ts +666 -0
  260. package/src/home/ports.ts +338 -0
  261. package/src/home/review.ts +206 -0
  262. package/src/home/reviews.ts +565 -0
  263. package/src/home/setup.ts +689 -0
  264. package/src/home/setupadapters.ts +217 -0
  265. package/src/home/setupcard.ts +288 -0
  266. package/src/home/setuptools.ts +57 -0
  267. package/src/home/spend.ts +194 -0
  268. package/src/home/switches.ts +293 -0
  269. package/src/home/switchon.ts +554 -0
  270. package/src/home/toolnames.ts +46 -0
  271. package/src/home/tune.ts +405 -0
  272. package/src/home/words.ts +8 -0
  273. package/src/homes.ts +17 -0
  274. package/src/install.ts +1 -1
  275. package/src/ipc/workerspec.ts +15 -0
  276. package/src/ledgercheck.ts +45 -9
  277. package/src/live/publish.ts +4 -1
  278. package/src/livecli.ts +6 -1
  279. package/src/loginrefresh/handover.ts +138 -0
  280. package/src/loginrefresh/lock.ts +72 -3
  281. package/src/loginrefresh/refresher.ts +34 -5
  282. package/src/loginrefresh/supervisor.ts +25 -2
  283. package/src/npmverbs.ts +51 -11
  284. package/src/onboard/choices.ts +6 -3
  285. package/src/onboard/engine.ts +64 -434
  286. package/src/onboard/steps/bringup.ts +3 -2
  287. package/src/onboard/steps/configfill.ts +23 -7
  288. package/src/onboard/steps/loginshare.ts +258 -0
  289. package/src/onboard/steps/memory.ts +18 -2
  290. package/src/onboard/steps/repoconfig.ts +85 -0
  291. package/src/onboard/toolnames.ts +2 -2
  292. package/src/piagentdir.ts +12 -0
  293. package/src/pilogin.ts +32 -16
  294. package/src/qcrbin.ts +16 -11
  295. package/src/reviewargs.ts +119 -0
  296. package/src/reviewcli.ts +6 -167
  297. package/src/reviewdetach.ts +107 -13
  298. package/src/scancli.ts +75 -826
  299. package/src/selfimprove.ts +90 -0
  300. package/src/session-command-supervisor.ts +41 -8
  301. package/src/setup/adapters.ts +13 -221
  302. package/src/setup/caserunner.ts +34 -273
  303. package/src/setup/engine.ts +62 -496
  304. package/src/setup/facts.ts +3 -627
  305. package/src/setup/findings.ts +3 -1264
  306. package/src/setup/presentation.ts +3 -18
  307. package/src/setup/scan.ts +3 -1033
  308. package/src/setup/scanbuild.ts +20 -114
  309. package/src/setup/scanlease.ts +3 -297
  310. package/src/setup/scanreport.ts +3 -373
  311. package/src/setup/scanrun.ts +3 -2268
  312. package/src/setup/scantree.ts +3 -259
  313. package/src/setup/stage2request.ts +3 -347
  314. package/src/setup/unitcut.ts +3 -523
  315. package/src/state.ts +126 -11
  316. package/src/takeover.ts +5 -0
  317. package/src/takeoverpi.ts +3 -2
  318. package/src/tui/alerts.ts +9 -2
  319. package/src/tui/board.ts +2 -2
  320. package/src/tui/companion.ts +2 -1
  321. package/src/tui/deploytab.ts +2 -2
  322. package/src/tui/index.ts +9 -6
  323. package/src/tui/memory.ts +3 -15
  324. package/src/tui/memoryurl.ts +22 -0
  325. package/src/tui/remote.ts +1 -1
  326. package/src/tui/route.ts +2 -2
  327. package/src/tui/setupstate.ts +20 -16
  328. package/src/tui/sshtriage.ts +1 -1
  329. package/src/verdicts.ts +13 -0
  330. package/src/wire.ts +9 -4
  331. package/src/workerbreaker.ts +41 -5
  332. package/src/workerworld.ts +9 -1
  333. package/dist/src/live/projection.js +0 -450
  334. package/dist/src/live/projection.js.map +0 -1
  335. package/dist/src/live/read.js +0 -60
  336. package/dist/src/live/read.js.map +0 -1
  337. package/dist/src/onboard/launch.js +0 -75
  338. package/dist/src/onboard/launch.js.map +0 -1
  339. package/dist/src/setup/ledger.js +0 -207
  340. package/dist/src/setup/ledger.js.map +0 -1
  341. package/dist/src/setup/stage2.js +0 -617
  342. package/dist/src/setup/stage2.js.map +0 -1
  343. package/dist/src/setup/textsniff.js +0 -89
  344. package/dist/src/setup/textsniff.js.map +0 -1
  345. package/src/live/projection.ts +0 -491
  346. package/src/live/read.ts +0 -86
  347. package/src/onboard/launch.ts +0 -103
  348. package/src/setup/ledger.ts +0 -324
  349. package/src/setup/stage2.ts +0 -926
  350. package/src/setup/textsniff.ts +0 -95
package/README.md CHANGED
@@ -18,17 +18,25 @@ for one kind of problem and never see each other's output. It merges their
18
18
  findings so one root cause gets one comment, and an **adversarial validator
19
19
  re-derives every candidate from the code** before one review is posted.
20
20
 
21
+ <picture>
22
+ <source media="(prefers-color-scheme: dark)" srcset="docs/media/bench-hero-dark.png">
23
+ <img src="docs/media/bench-hero.png" alt="AACR-Bench, 185 real PRs, 520 verified defects, QuickReview on GPT-6.1 Sol against six other reviewers, share found at each severity. High (90 defects): QuickReview 97%, next best Codex CLI 90%. Medium (145): QuickReview 93%, next best pi-review panel 82%. Low (285): QuickReview 84%, next best pi-review panel 52%.">
24
+ </picture>
25
+
26
+ On 185 real PRs with 520 defects each verified in the code, QuickReview on
27
+ GPT-6.1 Sol finds **97% of the high-severity defects, 93% of the medium and
28
+ 84% of the low**; at each severity the best of the six other reviewers we ran
29
+ finds 90%, 82% and 52%. On the same model it also finds more than the model
30
+ maker's own reviewer at every severity: against Claude Code's `/code-review`
31
+ on Claude Opus 5.5 and against Codex CLI on GPT-6.1 Sol. That recall costs
32
+ more: about $2 and 17.5 minutes per PR, where the other tools take $0.07–0.53
33
+ and 0.7–2.3 minutes ([Benchmarks](#benchmarks)).
34
+
21
35
  <p align="center">
22
36
  <img src="docs/media/lenses.gif" width="800"
23
37
  alt="Animation: nine lens passes sweep the same diff in parallel, each marking the lines where it finds a problem; findings that share a root cause merge, eight candidates into six causes; the validator re-derives each from the code, keeps four and strikes two with a reason (below the bar; refuted); the four survivors become one posted review, three blockers and one question, marked REQUEST_CHANGES.">
24
38
  </p>
25
39
 
26
- On 185 real PRs with 520 defects each verified in the code, it finds
27
- **97% of the high-severity defects and 89% of all of them**; the strongest
28
- third-party configuration we measured finds 67%. That recall costs more:
29
- about $2 and 17 minutes per PR, where the other tools take $0.07–0.53 and
30
- 0.7–2.3 minutes ([Benchmarks](#benchmarks)).
31
-
32
40
  Around the review sits a small, deterministic TypeScript daemon with no LLM
33
41
  in its decision path. It takes GitHub App webhooks, runs an authoritative
34
42
  reconcile poll, keeps one sticky [pi](https://github.com/earendil-works/pi)
@@ -70,22 +78,36 @@ The lens catalogue, with each lens's trigger and severity cap, is §3.3 of the
70
78
 
71
79
  Recall is the headline: a review that misses the defect has failed, whatever
72
80
  else it does. Precision, cost and time are shown beside it, because that is
73
- where QuickReview pays. Its results are the frozen build of 2026-10-04 on
74
- `gpt-6.1-sol`, shipped defaults, one review per PR. The third-party tools we
75
- ran used the best configuration we found for each, the OpenAI-based ones on
76
- the same model, under the same judge on the same PRs.
81
+ where QuickReview pays. Unless a chart or table names another build or model,
82
+ its results are the frozen build of 2026-10-04 on `gpt-6.1-sol`, shipped
83
+ defaults, one review per PR. The third-party tools we ran used the best
84
+ configuration we found for each (except Claude Code, which ran `/code-review`
85
+ at its default effort and was not varied), the OpenAI-based ones on the same
86
+ model, under the same judge on the same PRs.
87
+
88
+ **AACR-Bench, verified defects.** AACR-Bench's own reference comments are
89
+ mostly not real problems, so we built a key of 520 defects, each verified in
90
+ the code and graded by its consequence: **high** would block a merge (a
91
+ user-visible bug on a normal path, a crash, data loss, a security hole, a
92
+ broken build), **medium** should be fixed before merge, **low** is real but
93
+ fine as a follow-up. The chart at the top is this key. QuickReview misses 2.5
94
+ of the 90 high-severity defects, 10.5 of the 145 medium and 46 of the 285 low
95
+ (a partly found defect counts as half); the best other reviewer at each
96
+ severity misses 9, 26 and 136.5. Over the panel and Codex CLI the
97
+ high-severity lead holds under a paired bootstrap (+8.3 points [+1.9, +14.6]
98
+ over the panel). The price: 6.9 comments per PR, 42% of them true but minor.
77
99
 
78
100
  <picture>
79
- <source media="(prefers-color-scheme: dark)" srcset="docs/media/bench-aacr-dark.png">
80
- <img src="docs/media/bench-aacr.png" alt="AACR-Bench, 185 PRs, 520 verified defects. Share of high-severity defects found: QuickReview 97%, Codex CLI 90%, pi-review panel 89%, OpenCode 84%, Claude Code 81%, open-code-review 71%, PR-Agent 62%. Share of all defects found: QuickReview 89%, pi-review panel 67%, Claude Code 62%, open-code-review 57%, Codex CLI 55%, OpenCode 51%, PR-Agent 37%.">
101
+ <source media="(prefers-color-scheme: dark)" srcset="docs/media/bench-same-model-dark.png">
102
+ <img src="docs/media/bench-same-model.png" alt="AACR-Bench, the same base model in two reviewers, one judge, share found at high, medium and low severity. Claude Opus 5.5, 40 PRs: QuickReview 94%, 98%, 93%; Claude Code /code-review 75%, 71%, 45%. GPT-6.1 Sol, 185 PRs: QuickReview 97%, 93%, 84%; Codex CLI at high 90%, 70%, 37%. GPT-6 Sol, 185 PRs: QuickReview 96%, 86%, 80%; Codex CLI as shipped 78%, 61%, 31%.">
81
103
  </picture>
82
104
 
83
- **AACR-Bench, verified defects.** AACR-Bench's own reference comments are
84
- mostly not real problems, so we built a key of 520 defects, each verified in
85
- the code, and a judge for it. Over the panel and Codex CLI the lead holds
86
- under a paired bootstrap on high and on high + medium defects (+8.3 points
87
- [+1.9, +14.6] on high over the panel). The price: 6.9 comments per PR, 42%
88
- of them true but minor.
105
+ **Same model, two reviewers.** With the model held fixed, QuickReview still
106
+ finds more than the model maker's own reviewer on each of the three models
107
+ where we ran both, at 11 to 20 times the cost ($3.24 against $0.16 per PR on
108
+ Opus). This contrasts two tools, not a measured design effect: they also
109
+ differ in budget and inputs, Claude Code ran `/code-review` at its default
110
+ effort, and the Opus and GPT-6 Sol rows are September builds of QuickReview.
89
111
 
90
112
  <picture>
91
113
  <source media="(prefers-color-scheme: dark)" srcset="docs/media/bench-martian-dark.png">
@@ -97,7 +119,7 @@ per PR and counts every other comment as a false positive. It extracts about
97
119
  12.8 issues per PR from QuickReview's reviews, so QuickReview has the highest
98
120
  recall and the lowest precision. We
99
121
  audited the goldens: of the 86 that describe a real defect the PR
100
- introduces, it finds 75 (87%), the most of any tool.
122
+ introduces, it finds 75 (87%), the most of the seven reviewers judged alike.
101
123
 
102
124
  <picture>
103
125
  <source media="(prefers-color-scheme: dark)" srcset="docs/media/bench-qodo-dark.png">
@@ -109,20 +131,57 @@ and 271 violations of rules written in the repo. QuickReview finds the most
109
131
  functional bugs of the thirteen tools (52.1%) and the second-most issues
110
132
  overall, at the lowest precision; it is fourth on F1.
111
133
 
134
+ <picture>
135
+ <source media="(prefers-color-scheme: dark)" srcset="docs/media/bench-elo-dark.png">
136
+ <img src="docs/media/bench-elo.png" alt="Pairwise Elo on the 20 Martian PRs where QuickReview on GPT-6.1 Sol or DeepSeek did worst, two judges pooled, with 95% intervals. Claude Code max, Opus 5.5 directing Sonnet 5.5 agents, 1666, QuickReview on Opus 5.5 1628, QuickReview on GPT-6.1 Sol 1566, Claude Code high on Opus 5.5 1518, QuickReview on Sonnet 5.5 1489, QuickReview on DeepSeek V4.1 Flash 1406, Claude Code high on Sonnet 5.5 1398, QuickReview on GLM-5.3 Flash 1329.">
137
+ </picture>
138
+
139
+ **Judged side by side.** A pairwise judge reads two reviews of the same PR
140
+ blind and picks the better one. GPT-6.1 Sol and Claude Opus 5.5 both judged,
141
+ and a Bradley-Terry fit over their 596 verdicts gives Elo; alone, the two
142
+ judges pick the same winner only 56% of the time, which is why they are
143
+ pooled. On the 20 Martian PRs where QuickReview on GPT-6.1 Sol or DeepSeek did
144
+ worst, QuickReview on Opus 5.5 (six of its lenses on GPT-6 Luna) beat Claude
145
+ Code's `/code-review` at high effort on Opus 5.5 in 29 of 40 verdicts, at more
146
+ than ten times its cost (about $4 per PR). Only Claude Code's max mode (Opus
147
+ 5.5 directing Sonnet 5.5 agents, about $20 per PR) ranks higher, by a margin
148
+ inside the intervals.
149
+
150
+ **Other models.** QuickReview's models are configurable. On AACR-Bench
151
+ it holds most of its recall on cheap open models, and it falls apart on a
152
+ weak one:
153
+
154
+ | QuickReview on | PRs | High (90) | Medium (145) | Low (285) | All (520) | $/PR | Judge |
155
+ |---|---|---|---|---|---|---|---|
156
+ | GPT-6.1 Sol (frozen build) | 185 | 87.5 (97%) | 134.5 (93%) | 239 (84%) | 461 (89%) | 2.06 | gpt-6-sol |
157
+ | DeepSeek V4.1 Flash (mostly low effort) | 185 | 83 (92%) | 131 (90%) | 237.5 (83%) | 451.5 (87%) | 0.74 | gpt-6.1-sol |
158
+ | GLM-5.3 Flash | 185 | 83 (92%) | 120.5 (83%) | 231.5 (81%) | 435 (84%) | 0.52 | gpt-6.1-sol |
159
+ | GPT-6 Luna | 185 | 39 (43%) | 44 (30%) | 64 (22%) | 147 (28%) | 0.04 | gpt-6-sol |
160
+ | Claude Opus 5.5 | 40 | 32/34 (94%) | 30.5/31 (98%) | 57/61 (93%) | 119.5/126 (95%) | 3.24 | gpt-6-sol |
161
+
162
+ The best third-party reviewer at each severity finds 81 of 90 high (Codex
163
+ CLI), 119 of 145 medium and 148.5 of 285 low (both the pi-review panel). The
164
+ open-model rows ran a later build (mid-October, with cost changes made after
165
+ the freeze) and a later judge; DeepSeek ran at low reasoning effort on 143 of
166
+ its PRs, and GLM's review was missing a lens pass on 7. The GPT-6 Luna and
167
+ Opus rows ran a September build; on the same 40 PRs as Opus, the frozen
168
+ GPT-6.1 Sol build finds 33 of 34 high, 28 of 31 medium and 44 of 61 low. Read
169
+ the table as directional.
170
+
112
171
  <details>
113
172
  <summary>The full tables</summary>
114
173
 
115
174
  **AACR-Bench** (185 PRs, 10 languages, 520 verified defects; a partly found defect counts ½)
116
175
 
117
- | Reviewer | High (90) | High + medium (235) | All (520) | Comments correct | $/PR | Median min/PR |
118
- |---|---|---|---|---|---|---|
119
- | **QuickReview** | **87.5 (97%)** | **222 (94.5%)** | **461 (89%)** | 92% | 2.06 | 17.5 |
120
- | pi-review panel (high) | 80 (89%) | 199 (85%) | 347.5 (67%) | 89% | 0.27 | 1.8 |
121
- | Claude Code (Opus 5.5) | 72.5 (81%) | 177.5 (76%) | 324.5 (62%) | 81% | 0.20 | 0.7 |
122
- | open-code-review (high) | 63.5 (71%) | 165.5 (70%) | 298.5 (57%) | 86% | 0.53 | 1.8 |
123
- | Codex CLI (high) | 81 (90%) | 182.5 (78%) | 287 (55%) | 93% | 0.14 | 2.1 |
124
- | OpenCode (+ PR text) | 76 (84%) | 175 (74%) | 263.5 (51%) | 93% | 0.17 | 2.3 |
125
- | PR-Agent | 55.5 (62%) | 125.5 (53%) | 194 (37%) | 76% | 0.07 | 1.9 |
176
+ | Reviewer | High (90) | Medium (145) | Low (285) | All (520) | Comments correct | $/PR | Median min/PR |
177
+ |---|---|---|---|---|---|---|---|
178
+ | **QuickReview** | **87.5 (97%)** | **134.5 (93%)** | **239 (84%)** | **461 (89%)** | 92% | 2.06 | 17.5 |
179
+ | pi-review panel (high) | 80 (89%) | 119 (82%) | 148.5 (52%) | 347.5 (67%) | 89% | 0.27 | 1.8 |
180
+ | Claude Code (Opus 5.5) | 72.5 (81%) | 105 (72%) | 147 (52%) | 324.5 (62%) | 81% | 0.20 | 0.7 |
181
+ | open-code-review (high) | 63.5 (71%) | 102 (70%) | 133 (47%) | 298.5 (57%) | 86% | 0.53 | 1.8 |
182
+ | Codex CLI (high) | 81 (90%) | 101.5 (70%) | 104.5 (37%) | 287 (55%) | 93% | 0.14 | 2.1 |
183
+ | OpenCode (+ PR text) | 76 (84%) | 99 (68%) | 88.5 (31%) | 263.5 (51%) | 93% | 0.17 | 2.3 |
184
+ | PR-Agent | 55.5 (62%) | 70 (48%) | 68.5 (24%) | 194 (37%) | 76% | 0.07 | 1.9 |
126
185
 
127
186
  **Martian** (50 PRs, Core; one `gpt-6.1-sol` judge for every row, the vendor rows re-judged from their published comments)
128
187
 
@@ -151,11 +210,13 @@ overall, at the lowest precision; it is fourth on F1.
151
210
 
152
211
  </details>
153
212
 
154
- **Held-out PRs.** The last tuning round was mined from misses on part of
155
- each benchmark. On the PRs kept out of it, the frozen build finds 83% of
156
- AACR-Bench's defects (20 PRs), ties qodo-extended-v2 on Martian's real
157
- goldens (43 of 52, 30 PRs), and reaches 60.3% recall and F1 53.0 on Qodo
158
- (31 PRs), against 51.3 for qodo-exhaustive.
213
+ **Tuning and held-out PRs.** The last tuning round was mined from misses on
214
+ part of each benchmark, including 145 of the 185 AACR-Bench PRs. The 40 PRs
215
+ in the Opus comparison were used to tune its September build. On the PRs
216
+ kept out of the last tuning round, the frozen build finds 83% of AACR-Bench's
217
+ defects (20 PRs), against the next best 72%, ties qodo-extended-v2 on Martian's
218
+ real goldens (43 of 52, 30 PRs), and on Qodo (31 PRs) reaches 60.3% recall and
219
+ F1 53.0, level with qodo-exhaustive's 51.3.
159
220
 
160
221
  **Read more.** Two papers carry the method, every table and the threats to
161
222
  validity: [*Measuring whether a code review finds the real
@@ -243,22 +304,22 @@ no personal access token is used.
243
304
  docker run --rm --user "$(id -u):$(id -g)" -v ~/.local/bin:/out \
244
305
  ghcr.io/quickchatai/quickreview:<version> install
245
306
 
246
- qcr onboard # the whole setup, guided
307
+ qcr # the home: sign in, connect GitHub, choose a repository
247
308
  ```
248
309
 
249
- `qcr onboard` is a pi agent that walks you through setup using named,
250
- deterministic tools whose results you see. pi's `/login` opens by itself the
251
- first time; any OpenAI login works ([docs/llm-setup.md](docs/llm-setup.md)).
252
- It checks the machine, takes your own GitHub account where `gh` is signed in
253
- (or **creates your GitHub App in one click** from a pinned manifest, if you
254
- want a bot identity or webhooks), asks for one repository, defaults to polling,
255
- mints the memory keys and brings the stack up. Setup ends there, and the TUI
256
- opens on the board: it lists every open pull request of the repository, and
257
- **`R` on the one you select reviews it now**, with no label to add, its
258
- progress on the board and, in dry-run, the review recorded instead of posted.
259
- Re-run `qcr onboard` to go live once you have read a review. It is resumable,
260
- and re-running it on a working install is a diagnostic. Every step:
261
- [docs/onboarding.md](docs/onboarding.md).
310
+ A bare `qcr` opens the **home**: QuickReview's own pi, with the plugin loaded
311
+ and a panel of your repository's open pull requests. On a first run the panel
312
+ is a short setup checklist, and anything already set up is found and skipped:
313
+ sign in to OpenAI with pi's device code (device-code login must be on in
314
+ ChatGPT → Settings → Security), check that `gh` is signed in, and choose a
315
+ repository from your recently pushed ones or paste any `owner/name` or URL.
316
+ `alt+n` runs the next step. The home then lists the pull requests, "To review"
317
+ and "Reviewed". `qcr tui` opens the admin TUI, and only it starts the
318
+ companion. Through the Docker wrapper the home runs in a container of its own:
319
+ its login is kept in the `qcr-login` volume, its config and sessions in the
320
+ `qcr-state` volume, and its `gh` uses the token the wrapper finds on this
321
+ machine (`GITHUB_TOKEN`, `GH_TOKEN` or `gh auth token`). The always-on daemon, a GitHub App, webhooks and a server over ssh
322
+ are the setup wizard's steps: [docs/onboarding.md](docs/onboarding.md).
262
323
 
263
324
  ### Where the reviewer lives
264
325
 
@@ -295,9 +356,10 @@ npm i -g @quickchatai/quickreview
295
356
  qcr login # pi's own /login, for the review's models
296
357
  qcr review # review this branch against its base, with no daemon
297
358
  qcr review 123 # review a pull request (or pass its URL)
298
- qcr pi # pi with the QuickReview plugin: /review /scan /selfimprove /qcr-setup
359
+ qcr pi # pi with the plugin (/qcr-review /qcr-scan /qcr-setup) and /selfimprove
299
360
  qcr update # update qcr with the package manager that installed it
300
- qcr # the admin TUI
361
+ qcr # the home: pi on your own login, with your repo's pull requests
362
+ qcr tui # the admin TUI
301
363
  ```
302
364
 
303
365
  `qcr review` asks where the result goes (shown, saved as markdown and JSON,
@@ -353,8 +415,9 @@ never the same system ([MANIFESTO.md](MANIFESTO.md)).
353
415
 
354
416
  ## Appendix — setting up by hand
355
417
 
356
- `qcr onboard` composes these tools rather than replacing them; re-running it
357
- afterwards re-checks every step without rewriting what already holds.
418
+ The setup wizard's steps ([docs/onboarding.md](docs/onboarding.md)) compose
419
+ these tools rather than replacing them; re-running one afterwards re-checks it
420
+ without rewriting what already holds.
358
421
 
359
422
  ```sh
360
423
  IMG=ghcr.io/quickchatai/quickreview:<version>
@@ -371,8 +434,8 @@ curl -s http://127.0.0.1:8787/health
371
434
 
372
435
  Then point your HTTPS ingress at the webhook port, install the App, create
373
436
  the trigger label and label a PR: `state/dryrun/` fills up. The memory keys
374
- are minted by the running server, so run `qcr onboard` for that step even if
375
- you did the rest by hand; declining memory is supported.
437
+ are minted by the running server (the wizard's memory-keys steps, 60 and 72,
438
+ in [docs/onboarding.md](docs/onboarding.md)); declining memory is supported.
376
439
 
377
440
  ## Star history
378
441
 
package/bin/qcr.js CHANGED
@@ -3,7 +3,7 @@
3
3
  // name `qcr`, so the CLI module cannot recognise itself by its file name: this
4
4
  // file imports the bin's front door and calls it explicitly. The front door
5
5
  // (src/qcrbin.ts) runs the verbs an npm install needs without the state
6
- // database's native driver, opens the admin TUI on a bare `qcr`, and hands
6
+ // database's native driver, opens the home on a bare `qcr`, and hands
7
7
  // every other verb to the app's `main` (src/cli.ts). The image's
8
8
  // `node /opt/qcr/dist/src/cli.js` is the app's entry, run directly.
9
9
  import { runBin } from "../dist/src/qcrbin.js";
@@ -6,10 +6,11 @@
6
6
  # supply are marked "← FILL (n)" — grep for FILL. Flip dry_run to false only
7
7
  # as a deliberate cutover act, never as part of setup.
8
8
  #
9
- # YOU DO NOT HAVE TO FILL THIS BY HAND: `scripts/qcr onboard` interviews you
10
- # for the few values only you can answer, derives the rest, and patches this
11
- # file in place — every comment survives, and a re-run edits only what changed.
12
- # It never writes dry_run in either direction; going live is its own explicit
9
+ # YOU DO NOT HAVE TO FILL THIS BY HAND: a bare `qcr` (the home) writes the
10
+ # repository you choose and its defaults, and the setup wizard's steps
11
+ # interview you for the rest, derive what they can, and patch this file in
12
+ # place — every comment survives, and a re-run edits only what changed.
13
+ # Neither writes dry_run in either direction; going live is its own explicit
13
14
  # step. See docs/onboarding.md.
14
15
  # ONE mutation class is exempt and executes for real even here: the App
15
16
  # re-pointing its OWN webhook URL (see [ingress] below) — it can never touch
@@ -131,7 +132,11 @@ session_command_start_lease_s = 120
131
132
  session_command_running_max_min = 45
132
133
  # Command-correlated execution milestones: no first pass, incomplete pass plan,
133
134
  # and all-passes-done/no-verdict. Absolute start-derived bounds; activity cannot
134
- # renew them.
135
+ # renew them. The first pass is any discovery lens the daemon dispatched, a
136
+ # planned one or one of the round's optional rows. A plan above 20 discovery
137
+ # rows gets a minute per row more on both the passes bound and the running cap,
138
+ # up to 20 (packages/pi-plugin/src/round-stage-deadlines.ts); it does not stack
139
+ # with the follow-up sweep's allowance.
135
140
  round_first_pass_max_min = 5
136
141
  round_passes_max_min = 35
137
142
  round_finalize_grace_min = 5
@@ -286,7 +291,7 @@ small_diff_lines = 150
286
291
  # EMPTY ssh_host), the TUI never runs `ssh ""`: on a compose project (the
287
292
  # checklist recorded the local topology, or the project .env pins
288
293
  # QCR_VERSION) it reads the local stack and says so once; otherwise every
289
- # surface says "ssh_host is empty — run qcr onboard".
294
+ # surface says "ssh_host is empty — set it to the VM's ssh alias".
290
295
  target = "ssh"
291
296
  ssh_host = "" # ← FILL (7): ssh alias of the VM running the container
292
297
  # (leave "" when target = "local" — it is unused)
@@ -367,6 +372,19 @@ session_dir = "state/pi-sessions"
367
372
  # lens_cache_stagger_ms = 2500
368
373
  # lens_pass_deadline_min = 8
369
374
 
375
+ [home]
376
+ # The home: a bare `qcr` opens the app's own pinned pi, on your own pi login
377
+ # ($PI_CODING_AGENT_DIR, default ~/.pi/agent), with a panel of the
378
+ # repository's pull requests. Every key is optional.
379
+ # model — the chat's model, "provider/id". The panel counts only this
380
+ # model's provider as signed in: a login under another provider
381
+ # cannot run the chat.
382
+ # tools — "reviewer": the model may call the plugin's tools, the home's
383
+ # own home_* tools and pi's read tools (read, grep, find, ls), and
384
+ # no MCP server starts. "full": every tool pi has.
385
+ model = "openai-codex/gpt-6.1-sol"
386
+ tools = "reviewer"
387
+
370
388
  [memory]
371
389
  # Round seeding — how much memory rides each round prompt and how
372
390
  # long the daemon waits for it. Memory NEVER blocks or delays a round: past
@@ -891,7 +909,7 @@ extra_vendored_segments = [] # extra third-party markers (case-insensitive)
891
909
  # whatever — the system BEHAVES exactly as a build without the feature.
892
910
  # (The placeholder that renders empty leaves a blank line in the prompt, like
893
911
  # the sibling notes beside it.)
894
- # `qcr onboard`'s escalation step writes this section.
912
+ # The setup wizard's escalation step writes this section.
895
913
  #
896
914
  # The configuration cannot be half-done: `enabled = true` with no `targets`,
897
915
  # or a rule pointing at a login that is not a target, or a rule that declares
@@ -12,7 +12,7 @@ once (`deploy.sh provision`, this playbook), which installs a thin updater,
12
12
  `qcr-update`, and its run spec; every deploy after that is
13
13
  `deploy.sh release <version>`, which runs `ssh vm sudo qcr-update ...`.
14
14
 
15
- > **`qcr onboard` drives this route for you.** The wizard's
15
+ > **The setup wizard's steps drive this route.** The wizard's
16
16
  > **topology** step offers it as one of two first-class answers — advertised as
17
17
  > the always-on recommendation, because a reviewer that is asleep reviews
18
18
  > nothing — then checks your ssh alias and agent *before* anything is built
@@ -40,7 +40,7 @@ having no built-in permission system.
40
40
 
41
41
  ## Prerequisites (once, manual)
42
42
 
43
- Items 2–4 are what `qcr onboard` fills in for you on this route; item 1 is
43
+ Items 2–4 are what the setup wizard fills in for you on this route; item 1 is
44
44
  yours either way — the wizard never creates a machine.
45
45
 
46
46
  1. **A VM you can reach over ssh by an alias**, with passwordless sudo for your
@@ -198,14 +198,20 @@ when one names another root. `remote_state_dir` stays the host path.
198
198
 
199
199
  ### Pulling the release
200
200
 
201
- The images are private and are pulled BY the updater, on the VM, by digest. The VM pulls them with ONE credential: your own CLASSIC
202
- personal access token, scoped `read:packages` and nothing else, stored by
203
- `docker login` in root's docker config on the VM host (never in a container,
204
- env, argv or the secrets directory: the daemon holds only the App credential). Not the token `gh auth
205
- token` prints: that one carries the full scopes of your gh login.
206
-
207
- A deploy needs this login to exist before the first `release` (the pull is the
208
- updater's first step, and a lapsed login fails there with nothing changed).
201
+ The images are public on ghcr.io and are pulled BY the updater, on the VM, by
202
+ digest. A public pull needs no login, so a VM that pulls the release images
203
+ needs no registry credential at all; `deploy.sh verify` and `release` then say
204
+ `no ghcr login recorded` and nothing more.
205
+
206
+ **A private mirror.** Images that are not public (`QC_RELEASE_IMAGE` and
207
+ `QC_RELEASE_MEMORY_IMAGE` naming another package) need the VM logged in, with
208
+ ONE credential: your own CLASSIC personal access token, scoped `read:packages`
209
+ and nothing else, stored by `docker login` in root's docker config on the VM
210
+ host (never in a container, env, argv or the secrets directory: the daemon
211
+ holds only the App credential). Not the token `gh auth token` prints: that one
212
+ carries the full scopes of your gh login. The login must exist before the
213
+ first `release` from the mirror (the pull is the updater's first step, and a
214
+ lapsed login fails there with nothing changed).
209
215
 
210
216
  Once per VM, and again when the token is renewed (it expires after one year):
211
217
 
@@ -227,7 +233,9 @@ idempotent, and the token is never an argument or an environment variable.
227
233
 
228
234
  A lapsed login fails the updater's pull before anything on the VM changes
229
235
  (`qcr-update` refuses at its `pull` step). `scripts/deploy.sh verify` and
230
- `release` warn 14 days before the recorded expiry. `ssh <vm> sudo docker logout ghcr.io` removes the login.
236
+ `release` warn 14 days before the recorded expiry. `ssh <vm> sudo docker logout ghcr.io` removes the login;
237
+ a VM back on the public images can drop it, and the recorded expiry with it
238
+ (`<state home>/ghcr-token-expiry`), so the warning stops.
231
239
 
232
240
  ### The cutover (legacy image to release image)
233
241
 
@@ -307,7 +315,7 @@ ssh <vm> docker exec quickreview-sandbox tmux ls
307
315
  ssh <vm> curl -sS http://127.0.0.1:8787/health # loopback-only by design
308
316
  ```
309
317
 
310
- That is the same layering `qcr onboard`'s verification step runs — containers,
318
+ That is the same layering the setup wizard's verification step runs — containers,
311
319
  then the health endpoint, then GitHub's own webhook delivery log — and the
312
320
  order matters: a container that is not up cannot answer a health probe, and a
313
321
  daemon that is not answering cannot accept a delivery. While the tunnel is up
@@ -1,7 +1,7 @@
1
1
  # Copy to inventory.ini and fill in — inventory.ini is gitignored:
2
2
  # it carries YOUR real hostnames and stays local to the controller machine.
3
3
  #
4
- # `scripts/qcr onboard` writes inventory.ini for you on the server route, from
4
+ # The setup wizard writes inventory.ini for you on the server route, from
5
5
  # answers you have already given (the ssh alias, the login user your ssh config
6
6
  # resolves, and whether the playbook should install cloudflared). This file
7
7
  # documents what it writes, and what to fill if you do it by hand.
@@ -7,7 +7,7 @@
7
7
  # Values are read with hidden input and NEVER printed back. Re-run any time —
8
8
  # existing files are kept unless you choose to replace them.
9
9
  #
10
- # `scripts/qcr onboard` writes app_id / app.pem / webhook_secret itself, from
10
+ # The setup wizard writes app_id / app.pem / webhook_secret itself, from
11
11
  # the GitHub App manifest exchange, and mints the OpenViking keys — so on the
12
12
  # guided path you only reach for this script for the values it points you at
13
13
  # (the OpenAI key, a tunnel token, an ngrok authtoken, the hosted-embeddings
@@ -535,7 +535,7 @@ fi
535
535
  # ---- 4. pull both images by digest, check them ----------------------------------------------------------
536
536
 
537
537
  step pull
538
- d pull "$DAEMON_REF" >/dev/null || die "could not pull $DAEMON_REF (is the VM logged in to ghcr.io? scripts/vm-ghcr-login.sh)"
538
+ d pull "$DAEMON_REF" >/dev/null || die "could not pull $DAEMON_REF (the release images are public: check the VM reaches ghcr.io and the digest is published; a private mirror needs the VM logged in, scripts/vm-ghcr-login.sh)"
539
539
  d pull "$MEMORY_REF" >/dev/null || die "could not pull $MEMORY_REF"
540
540
 
541
541
  step check-images
@@ -0,0 +1,14 @@
1
+ // The env shim for the home's extension: the one place the process's env
2
+ // becomes its options (extensions/home.ts). A bare `qcr` loads it by path
3
+ // (src/home/launch.ts), with the model and tool set it launched on in the env.
4
+ import { VERSION } from "@earendil-works/pi-coding-agent";
5
+ import { homeOptionsFromEnv } from "../../src/home/adapters.js";
6
+ import { homeSetupFromEnv } from "../../src/home/setupadapters.js";
7
+ import { createHome } from "../home.js";
8
+ export default function activate(pi) {
9
+ void createHome({
10
+ ...homeOptionsFromEnv(process.env),
11
+ setup: homeSetupFromEnv(process.env, VERSION),
12
+ })(pi);
13
+ }
14
+ //# sourceMappingURL=home.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"home.js","sourceRoot":"","sources":["../../../extensions/cli/home.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,0EAA0E;AAC1E,+EAA+E;AAC/E,OAAO,EAAE,OAAO,EAAqB,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAgB;IAC/C,KAAK,UAAU,CAAC;QACd,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC;QAClC,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC;KAC9C,CAAC,CAAC,EAAE,CAAC,CAAC;AACT,CAAC"}
@@ -0,0 +1,18 @@
1
+ // The env shim for the app's /selfimprove (extensions/selfimprove.ts): the
2
+ // one place the process's env, home and standard output become its config.
3
+ // `qcr pi` loads this file beside the plugin.
4
+ import { homedir } from "node:os";
5
+ import { VERSION } from "@earendil-works/pi-coding-agent";
6
+ import { nodeRunner } from "@quickchatai/pi-quickreview/src/plugin/runner.js";
7
+ import { createSelfImprove } from "../selfimprove.js";
8
+ export default function activate(pi) {
9
+ const env = process.env;
10
+ createSelfImprove({
11
+ env,
12
+ home: (env["HOME"] ?? "").trim() || homedir(),
13
+ runner: nodeRunner(env),
14
+ print: (text) => void process.stdout.write(text.endsWith("\n") ? text : `${text}\n`),
15
+ piVersion: VERSION,
16
+ })(pi);
17
+ }
18
+ //# sourceMappingURL=selfimprove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selfimprove.js","sourceRoot":"","sources":["../../../extensions/cli/selfimprove.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,2EAA2E;AAC3E,8CAA8C;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAqB,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,kDAAkD,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAgB;IAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACxB,iBAAiB,CAAC;QAChB,GAAG;QACH,IAAI,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,OAAO,EAAE;QAC7C,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC;QACvB,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC;QACpF,SAAS,EAAE,OAAO;KACnB,CAAC,CAAC,EAAE,CAAC,CAAC;AACT,CAAC"}