@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.
- package/README.md +116 -53
- package/bin/qcr.js +1 -1
- package/config.example.toml +25 -7
- package/deploy/ansible/README.md +20 -12
- package/deploy/ansible/inventory.example.ini +1 -1
- package/deploy/collect-secrets.sh +1 -1
- package/deploy/qcr-update.sh +1 -1
- package/dist/extensions/cli/home.js +14 -0
- package/dist/extensions/cli/home.js.map +1 -0
- package/dist/extensions/cli/selfimprove.js +18 -0
- package/dist/extensions/cli/selfimprove.js.map +1 -0
- package/dist/extensions/home.js +350 -0
- package/dist/extensions/home.js.map +1 -0
- package/dist/extensions/login-route.js +1 -1
- package/dist/extensions/login-route.js.map +1 -1
- package/dist/extensions/onboarding.js +8 -7
- package/dist/extensions/onboarding.js.map +1 -1
- package/dist/extensions/selfimprove.js +49 -0
- package/dist/extensions/selfimprove.js.map +1 -0
- package/dist/extensions/setup-scan.js +23 -592
- package/dist/extensions/setup-scan.js.map +1 -1
- package/dist/extensions/setup.js +2 -47
- package/dist/extensions/setup.js.map +1 -1
- package/dist/extensions/vendor/openviking-pi/index.js +4 -0
- package/dist/extensions/vendor/openviking-pi/index.js.map +1 -1
- package/dist/extensions/vendor/openviking-pi/qcr-hooks.js +3 -1
- package/dist/extensions/vendor/openviking-pi/qcr-hooks.js.map +1 -1
- package/dist/extensions/vendor/openviking-pi/sync.js +81 -0
- package/dist/extensions/vendor/openviking-pi/sync.js.map +1 -1
- package/dist/src/archive/restore.js +18 -15
- package/dist/src/archive/restore.js.map +1 -1
- package/dist/src/botworker.js +13 -2
- package/dist/src/botworker.js.map +1 -1
- package/dist/src/channelfs.js +3 -26
- package/dist/src/channelfs.js.map +1 -1
- package/dist/src/cli.js +14 -50
- package/dist/src/cli.js.map +1 -1
- package/dist/src/config.js +16 -0
- package/dist/src/config.js.map +1 -1
- package/dist/src/daemon.js +33 -4
- package/dist/src/daemon.js.map +1 -1
- package/dist/src/debuground.js +1 -0
- package/dist/src/debuground.js.map +1 -1
- package/dist/src/debugroundpi.js +1 -0
- package/dist/src/debugroundpi.js.map +1 -1
- package/dist/src/engine/caserunner-sdk.js +15 -251
- package/dist/src/engine/caserunner-sdk.js.map +1 -1
- package/dist/src/home/adapters.js +349 -0
- package/dist/src/home/adapters.js.map +1 -0
- package/dist/src/home/advanced.js +318 -0
- package/dist/src/home/advanced.js.map +1 -0
- package/dist/src/home/advancedtools.js +57 -0
- package/dist/src/home/advancedtools.js.map +1 -0
- package/dist/src/home/autoreview.js +325 -0
- package/dist/src/home/autoreview.js.map +1 -0
- package/dist/src/home/daemonstatus.js +32 -0
- package/dist/src/home/daemonstatus.js.map +1 -0
- package/dist/src/home/devicelogin.js +61 -0
- package/dist/src/home/devicelogin.js.map +1 -0
- package/dist/src/home/launch.js +202 -0
- package/dist/src/home/launch.js.map +1 -0
- package/dist/src/home/loginowner.js +205 -0
- package/dist/src/home/loginowner.js.map +1 -0
- package/dist/src/home/memory.js +122 -0
- package/dist/src/home/memory.js.map +1 -0
- package/dist/src/home/model.js +811 -0
- package/dist/src/home/model.js.map +1 -0
- package/dist/src/home/panel.js +520 -0
- package/dist/src/home/panel.js.map +1 -0
- package/dist/src/home/ports.js +19 -0
- package/dist/src/home/ports.js.map +1 -0
- package/dist/src/home/review.js +163 -0
- package/dist/src/home/review.js.map +1 -0
- package/dist/src/home/reviews.js +478 -0
- package/dist/src/home/reviews.js.map +1 -0
- package/dist/src/home/setup.js +507 -0
- package/dist/src/home/setup.js.map +1 -0
- package/dist/src/home/setupadapters.js +214 -0
- package/dist/src/home/setupadapters.js.map +1 -0
- package/dist/src/home/setupcard.js +199 -0
- package/dist/src/home/setupcard.js.map +1 -0
- package/dist/src/home/setuptools.js +45 -0
- package/dist/src/home/setuptools.js.map +1 -0
- package/dist/src/home/spend.js +160 -0
- package/dist/src/home/spend.js.map +1 -0
- package/dist/src/home/switches.js +209 -0
- package/dist/src/home/switches.js.map +1 -0
- package/dist/src/home/switchon.js +439 -0
- package/dist/src/home/switchon.js.map +1 -0
- package/dist/src/home/toolnames.js +41 -0
- package/dist/src/home/toolnames.js.map +1 -0
- package/dist/src/home/tune.js +341 -0
- package/dist/src/home/tune.js.map +1 -0
- package/dist/src/home/words.js +7 -0
- package/dist/src/home/words.js.map +1 -0
- package/dist/src/homes.js +14 -0
- package/dist/src/homes.js.map +1 -1
- package/dist/src/install.js +1 -1
- package/dist/src/install.js.map +1 -1
- package/dist/src/ipc/workerspec.js +8 -0
- package/dist/src/ipc/workerspec.js.map +1 -1
- package/dist/src/ledgercheck.js +39 -10
- package/dist/src/ledgercheck.js.map +1 -1
- package/dist/src/live/publish.js +1 -1
- package/dist/src/live/publish.js.map +1 -1
- package/dist/src/livecli.js +1 -1
- package/dist/src/livecli.js.map +1 -1
- package/dist/src/loginrefresh/handover.js +121 -0
- package/dist/src/loginrefresh/handover.js.map +1 -0
- package/dist/src/loginrefresh/lock.js +54 -3
- package/dist/src/loginrefresh/lock.js.map +1 -1
- package/dist/src/loginrefresh/refresher.js +33 -5
- package/dist/src/loginrefresh/refresher.js.map +1 -1
- package/dist/src/loginrefresh/supervisor.js +18 -1
- package/dist/src/loginrefresh/supervisor.js.map +1 -1
- package/dist/src/npmverbs.js +42 -12
- package/dist/src/npmverbs.js.map +1 -1
- package/dist/src/onboard/choices.js +6 -3
- package/dist/src/onboard/choices.js.map +1 -1
- package/dist/src/onboard/engine.js +33 -292
- package/dist/src/onboard/engine.js.map +1 -1
- package/dist/src/onboard/steps/bringup.js +3 -2
- package/dist/src/onboard/steps/bringup.js.map +1 -1
- package/dist/src/onboard/steps/configfill.js +18 -7
- package/dist/src/onboard/steps/configfill.js.map +1 -1
- package/dist/src/onboard/steps/loginshare.js +213 -0
- package/dist/src/onboard/steps/loginshare.js.map +1 -0
- package/dist/src/onboard/steps/memory.js +14 -2
- package/dist/src/onboard/steps/memory.js.map +1 -1
- package/dist/src/onboard/steps/repoconfig.js +72 -0
- package/dist/src/onboard/steps/repoconfig.js.map +1 -0
- package/dist/src/onboard/toolnames.js +2 -2
- package/dist/src/onboard/toolnames.js.map +1 -1
- package/dist/src/piagentdir.js +13 -0
- package/dist/src/piagentdir.js.map +1 -0
- package/dist/src/pilogin.js +31 -16
- package/dist/src/pilogin.js.map +1 -1
- package/dist/src/qcrbin.js +16 -11
- package/dist/src/qcrbin.js.map +1 -1
- package/dist/src/reviewargs.js +122 -0
- package/dist/src/reviewargs.js.map +1 -0
- package/dist/src/reviewcli.js +7 -161
- package/dist/src/reviewcli.js.map +1 -1
- package/dist/src/reviewdetach.js +76 -11
- package/dist/src/reviewdetach.js.map +1 -1
- package/dist/src/scancli.js +39 -691
- package/dist/src/scancli.js.map +1 -1
- package/dist/src/selfimprove.js +66 -0
- package/dist/src/selfimprove.js.map +1 -0
- package/dist/src/session-command-supervisor.js +38 -9
- package/dist/src/session-command-supervisor.js.map +1 -1
- package/dist/src/setup/adapters.js +5 -223
- package/dist/src/setup/adapters.js.map +1 -1
- package/dist/src/setup/caserunner.js +15 -249
- package/dist/src/setup/caserunner.js.map +1 -1
- package/dist/src/setup/engine.js +32 -341
- package/dist/src/setup/engine.js.map +1 -1
- package/dist/src/setup/facts.js +3 -592
- package/dist/src/setup/facts.js.map +1 -1
- package/dist/src/setup/findings.js +3 -947
- package/dist/src/setup/findings.js.map +1 -1
- package/dist/src/setup/presentation.js +3 -8
- package/dist/src/setup/presentation.js.map +1 -1
- package/dist/src/setup/scan.js +3 -724
- package/dist/src/setup/scan.js.map +1 -1
- package/dist/src/setup/scanbuild.js +9 -92
- package/dist/src/setup/scanbuild.js.map +1 -1
- package/dist/src/setup/scanlease.js +3 -250
- package/dist/src/setup/scanlease.js.map +1 -1
- package/dist/src/setup/scanreport.js +3 -288
- package/dist/src/setup/scanreport.js.map +1 -1
- package/dist/src/setup/scanrun.js +3 -1732
- package/dist/src/setup/scanrun.js.map +1 -1
- package/dist/src/setup/scantree.js +3 -256
- package/dist/src/setup/scantree.js.map +1 -1
- package/dist/src/setup/stage2request.js +3 -258
- package/dist/src/setup/stage2request.js.map +1 -1
- package/dist/src/setup/unitcut.js +3 -436
- package/dist/src/setup/unitcut.js.map +1 -1
- package/dist/src/state.js +75 -9
- package/dist/src/state.js.map +1 -1
- package/dist/src/takeover.js +1 -0
- package/dist/src/takeover.js.map +1 -1
- package/dist/src/takeoverpi.js +2 -1
- package/dist/src/takeoverpi.js.map +1 -1
- package/dist/src/tui/alerts.js +4 -1
- package/dist/src/tui/alerts.js.map +1 -1
- package/dist/src/tui/board.js +2 -2
- package/dist/src/tui/board.js.map +1 -1
- package/dist/src/tui/companion.js +2 -1
- package/dist/src/tui/companion.js.map +1 -1
- package/dist/src/tui/deploytab.js +2 -2
- package/dist/src/tui/deploytab.js.map +1 -1
- package/dist/src/tui/index.js +9 -6
- package/dist/src/tui/index.js.map +1 -1
- package/dist/src/tui/memory.js +3 -16
- package/dist/src/tui/memory.js.map +1 -1
- package/dist/src/tui/memoryurl.js +22 -0
- package/dist/src/tui/memoryurl.js.map +1 -0
- package/dist/src/tui/remote.js +1 -1
- package/dist/src/tui/remote.js.map +1 -1
- package/dist/src/tui/route.js +2 -2
- package/dist/src/tui/route.js.map +1 -1
- package/dist/src/tui/setupstate.js +8 -5
- package/dist/src/tui/setupstate.js.map +1 -1
- package/dist/src/tui/sshtriage.js +1 -1
- package/dist/src/tui/sshtriage.js.map +1 -1
- package/dist/src/verdicts.js +12 -0
- package/dist/src/verdicts.js.map +1 -1
- package/dist/src/wire.js +9 -4
- package/dist/src/wire.js.map +1 -1
- package/dist/src/workerbreaker.js +32 -5
- package/dist/src/workerbreaker.js.map +1 -1
- package/dist/src/workerworld.js +4 -0
- package/dist/src/workerworld.js.map +1 -1
- package/docker/README.md +1 -1
- package/docker/entrypoint.sh +40 -6
- package/docker-compose.yml +16 -1
- package/extensions/cli/home.ts +14 -0
- package/extensions/cli/selfimprove.ts +18 -0
- package/extensions/home.ts +484 -0
- package/extensions/login-route.ts +1 -1
- package/extensions/onboarding.ts +8 -7
- package/extensions/selfimprove.ts +65 -0
- package/extensions/setup-scan.ts +79 -766
- package/extensions/setup.ts +14 -70
- package/extensions/vendor/openviking-pi/NOTICE +5 -0
- package/extensions/vendor/openviking-pi/README.md +39 -5
- package/extensions/vendor/openviking-pi/index.ts +4 -0
- package/extensions/vendor/openviking-pi/patches/0014-one-turn-sync-in-flight.patch +239 -0
- package/extensions/vendor/openviking-pi/qcr-hooks.ts +3 -1
- package/extensions/vendor/openviking-pi/sync.ts +80 -0
- package/extensions/vendor/openviking-pi/upstream.json +2 -1
- package/package.json +6 -4
- package/prompts/onboarding.md +8 -7
- package/schemas/review-result.v1.json +60 -0
- package/scripts/deploy.sh +8 -6
- package/scripts/qcr-host.sh +28 -5
- package/scripts/vm-ghcr-login.sh +7 -4
- package/src/archive/restore.ts +18 -21
- package/src/botworker.ts +13 -2
- package/src/channelfs.ts +3 -26
- package/src/cli.ts +13 -54
- package/src/config.ts +38 -0
- package/src/daemon.ts +34 -4
- package/src/debuground.ts +3 -0
- package/src/debugroundpi.ts +1 -0
- package/src/engine/caserunner-sdk.ts +29 -314
- package/src/home/adapters.ts +418 -0
- package/src/home/advanced.ts +421 -0
- package/src/home/advancedtools.ts +96 -0
- package/src/home/autoreview.ts +385 -0
- package/src/home/daemonstatus.ts +55 -0
- package/src/home/devicelogin.ts +107 -0
- package/src/home/launch.ts +257 -0
- package/src/home/loginowner.ts +248 -0
- package/src/home/memory.ts +176 -0
- package/src/home/model.ts +965 -0
- package/src/home/panel.ts +666 -0
- package/src/home/ports.ts +338 -0
- package/src/home/review.ts +206 -0
- package/src/home/reviews.ts +565 -0
- package/src/home/setup.ts +689 -0
- package/src/home/setupadapters.ts +217 -0
- package/src/home/setupcard.ts +288 -0
- package/src/home/setuptools.ts +57 -0
- package/src/home/spend.ts +194 -0
- package/src/home/switches.ts +293 -0
- package/src/home/switchon.ts +554 -0
- package/src/home/toolnames.ts +46 -0
- package/src/home/tune.ts +405 -0
- package/src/home/words.ts +8 -0
- package/src/homes.ts +17 -0
- package/src/install.ts +1 -1
- package/src/ipc/workerspec.ts +15 -0
- package/src/ledgercheck.ts +45 -9
- package/src/live/publish.ts +4 -1
- package/src/livecli.ts +6 -1
- package/src/loginrefresh/handover.ts +138 -0
- package/src/loginrefresh/lock.ts +72 -3
- package/src/loginrefresh/refresher.ts +34 -5
- package/src/loginrefresh/supervisor.ts +25 -2
- package/src/npmverbs.ts +51 -11
- package/src/onboard/choices.ts +6 -3
- package/src/onboard/engine.ts +64 -434
- package/src/onboard/steps/bringup.ts +3 -2
- package/src/onboard/steps/configfill.ts +23 -7
- package/src/onboard/steps/loginshare.ts +258 -0
- package/src/onboard/steps/memory.ts +18 -2
- package/src/onboard/steps/repoconfig.ts +85 -0
- package/src/onboard/toolnames.ts +2 -2
- package/src/piagentdir.ts +12 -0
- package/src/pilogin.ts +32 -16
- package/src/qcrbin.ts +16 -11
- package/src/reviewargs.ts +119 -0
- package/src/reviewcli.ts +6 -167
- package/src/reviewdetach.ts +107 -13
- package/src/scancli.ts +75 -826
- package/src/selfimprove.ts +90 -0
- package/src/session-command-supervisor.ts +41 -8
- package/src/setup/adapters.ts +13 -221
- package/src/setup/caserunner.ts +34 -273
- package/src/setup/engine.ts +62 -496
- package/src/setup/facts.ts +3 -627
- package/src/setup/findings.ts +3 -1264
- package/src/setup/presentation.ts +3 -18
- package/src/setup/scan.ts +3 -1033
- package/src/setup/scanbuild.ts +20 -114
- package/src/setup/scanlease.ts +3 -297
- package/src/setup/scanreport.ts +3 -373
- package/src/setup/scanrun.ts +3 -2268
- package/src/setup/scantree.ts +3 -259
- package/src/setup/stage2request.ts +3 -347
- package/src/setup/unitcut.ts +3 -523
- package/src/state.ts +126 -11
- package/src/takeover.ts +5 -0
- package/src/takeoverpi.ts +3 -2
- package/src/tui/alerts.ts +9 -2
- package/src/tui/board.ts +2 -2
- package/src/tui/companion.ts +2 -1
- package/src/tui/deploytab.ts +2 -2
- package/src/tui/index.ts +9 -6
- package/src/tui/memory.ts +3 -15
- package/src/tui/memoryurl.ts +22 -0
- package/src/tui/remote.ts +1 -1
- package/src/tui/route.ts +2 -2
- package/src/tui/setupstate.ts +20 -16
- package/src/tui/sshtriage.ts +1 -1
- package/src/verdicts.ts +13 -0
- package/src/wire.ts +9 -4
- package/src/workerbreaker.ts +41 -5
- package/src/workerworld.ts +9 -1
- package/dist/src/live/projection.js +0 -450
- package/dist/src/live/projection.js.map +0 -1
- package/dist/src/live/read.js +0 -60
- package/dist/src/live/read.js.map +0 -1
- package/dist/src/onboard/launch.js +0 -75
- package/dist/src/onboard/launch.js.map +0 -1
- package/dist/src/setup/ledger.js +0 -207
- package/dist/src/setup/ledger.js.map +0 -1
- package/dist/src/setup/stage2.js +0 -617
- package/dist/src/setup/stage2.js.map +0 -1
- package/dist/src/setup/textsniff.js +0 -89
- package/dist/src/setup/textsniff.js.map +0 -1
- package/src/live/projection.ts +0 -491
- package/src/live/read.ts +0 -86
- package/src/onboard/launch.ts +0 -103
- package/src/setup/ledger.ts +0 -324
- package/src/setup/stage2.ts +0 -926
- 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.
|
|
74
|
-
`gpt-6.1-sol`, shipped
|
|
75
|
-
|
|
76
|
-
|
|
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-
|
|
80
|
-
<img src="docs/media/bench-
|
|
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
|
-
**
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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
|
|
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) |
|
|
118
|
-
|
|
119
|
-
| **QuickReview** | **87.5 (97%)** | **
|
|
120
|
-
| pi-review panel (high) | 80 (89%) |
|
|
121
|
-
| Claude Code (Opus 5.5) | 72.5 (81%) |
|
|
122
|
-
| open-code-review (high) | 63.5 (71%) |
|
|
123
|
-
| Codex CLI (high) | 81 (90%) |
|
|
124
|
-
| OpenCode (+ PR text) | 76 (84%) |
|
|
125
|
-
| PR-Agent | 55.5 (62%) |
|
|
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
|
-
**
|
|
155
|
-
each benchmark
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
(
|
|
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
|
|
307
|
+
qcr # the home: sign in, connect GitHub, choose a repository
|
|
247
308
|
```
|
|
248
309
|
|
|
249
|
-
`qcr
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
357
|
-
|
|
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
|
|
375
|
-
|
|
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
|
|
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";
|
package/config.example.toml
CHANGED
|
@@ -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: `
|
|
10
|
-
#
|
|
11
|
-
#
|
|
12
|
-
#
|
|
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 —
|
|
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
|
-
#
|
|
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
|
package/deploy/ansible/README.md
CHANGED
|
@@ -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
|
-
>
|
|
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
|
|
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
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
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
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
package/deploy/qcr-update.sh
CHANGED
|
@@ -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
|
|
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"}
|