What the agent does
The agent checks out the pull request and reads how this Vue app actually tests before it runs the command in the request. In an app shaped like realworld-apps/vue-realworld-example-app, package.json is named realworld-vue and has no packageManager field. The lockfile present is bun.lock. Scripts include serve as vite, lint as eslint src, and test as playwright test. test:e2e runs playwright with --grep-invert @security, and test:e2e:security runs the security grep. Dependencies are vue ^3.5.0, vue-router ^5.1.0, pinia ^3.0.0, vite ^8.0.16 and @vitejs/plugin-vue ^6.0.7. There is no Vitest dependency and no vitest config. playwright.config.ts sets testDir to ./realworld/specs/e2e, baseURL to http://localhost:8080, and a webServer command of bun run serve against 127.0.0.1:8080.
npx vitest run is what the request asks for, so the agent runs it and records the result. On this tree Vitest is not installed, and the review says so. It does not add a vitest.config.ts, and it does not start the Playwright web server unless you change the input. Starting Playwright would boot Vite on port 8080 and run the specs under realworld/specs/e2e, which is a different command from the one named. The review names package.json's test script so an author is not told the project has no tests at all. The agent does not push a lockfile change. bun.lock is the lockfile it should install from if it installs, and the review notes that npm was not the lockfile's tool.
The article store and the article view are the code it reads with the diff. src/store/article.js defines useArticleStore with defineStore. state holds an article with an empty author and tagList, and a comments array. fetchArticle and fetchComments write the API payload into state. destroyComment filters comments by id after a 2xx, and the comment above that line says it does not refetch. addFavorite and removeFavorite copy the article into the store and call useHomeStore().updateArticleInList. publishArticle posts this.article. src/views/Article.vue keeps beforeRouteEnter in an options block because it runs before setup, and that hook calls fetchArticle and fetchComments with the slug, catching errors to null. The setup block sanitizes marked.parse(content) with DOMPurify. The template renders the body with v-html on that sanitized string, and it keys comments by index.
One GitHub review cites file and line. Blocking is a store change that drops the home-list update, a destroyComment that refetches and races, or a view change that assigns the markdown to v-html without DOMPurify. A suggestion is the index key on comments, or the gap between the requested Vitest command and the Playwright script. The review includes the vitest output verbatim in the test section. No commits are pushed onto the pull request.
Start it with one API call
POST https://api.prix.dev/o/{org}/sessions with this body:
{
"agent": "claude",
"input": "Review this pull request on the Vue RealWorld app. Check it out. The lockfile is bun.lock and there is no packageManager field. Run npx vitest run. If Vitest is not installed, quote that and do not add it. The project's test script is playwright test, with testDir realworld/specs/e2e and a web server on port 8080. Do not start Playwright unless the input is changed. Read the diff with src/store/article.js and src/views/Article.vue. Post one GitHub review that cites file and line for every finding, separates blocking issues from suggestions, and includes the vitest result. Do not push commits.",
"resources": [
{
"url": "https://github.com/your-org/your-app/pull/1"
}
]
}- Get an API key. In the console, open Settings, then API keys, and create a key for your org. Send it in the Authorization header as a Bearer token.
- Send the request. POST the body in request.json to https://api.prix.dev/o/{org}/sessions, with your repository as the resources URL. The run starts in its own cloud sandbox.
- Read what came back. Follow the run on its live stream or wait for the run.completed webhook, then read the result and its trajectory.
What comes back
What comes back is a review on the pull request the resources URL checked out. The session read names the repository and the pull request. The test section is the npx vitest run output, and a following sentence names the Playwright script the repository does have, without claiming those specs ran. Findings cite lines in useArticleStore or in Article.vue, including beforeRouteEnter and the DOMPurify call, when the diff touches them. The author's commits remain the branch.
A reviewer checks that a red vitest line is not treated as a failed Playwright spec, and that v-html is still fed from the sanitized function. The transcript stores the command and its output as tool_use and tool_result. Watch the turn on GET /o/{org}/sessions/{id}/events. The finished answer is the session result. If you want the Playwright suite quoted, send a follow-up after status leaves running, and expect that follow-up to boot bun run serve on port 8080 inside the sandbox.
Run it on every pull request opened
GitHub's pull_request.opened event is your cue to POST this session. resources is the pull request URL, one repository per run, cloned through the Rush GitHub App. Idempotency-Key should be the delivery id so a retry does not launch a second checkout. A body that differs under the same key is 409 IDEMPOTENCY_CONFLICT.
When the turn finishes, the key's webhook receives run.completed or run.failed within about 30 seconds. Verify it with the whsec_ secret. The review text may be longer than the 16 KiB result field, in which case read session_url with the key. Stay within max_concurrent, default 4, or the next Vue pull request answers 429.
The use case this job follows, with its automation and trigger: Review every pull request.
Why run it on Rush?
The mismatch is the reason to run this off a laptop. The request says Vitest, the repository says Playwright and bun.lock, and a local npm install would not be the install the lockfile describes. The sandbox runs the command you named, records that Vitest is absent, and reads the store anyway. Your working tree stays on your branch. The sandbox parks afterward, so a follow-up that switches the command to the Playwright script reuses the checkout.
The review is about the article store's writes to the home list and the view's sanitize step, cited by line, with the command output beside them. A diff comment cannot show that the test script never invoked Pinia. Several pull requests can be reviewed at once, each in its own sandbox, and a person still posts their own judgment on top of the GitHub review.
Frequently asked questions
Why not run playwright test, since that is the test script?
Because this request says npx vitest run, and substituting a different runner would hide the mismatch. The review names playwright test, the testDir, and port 8080 so you can see what CI would run. Change the input to the Playwright script when that is the log you want quoted.
Will it install with bun or npm?
bun.lock is the only lockfile, and playwright.config.ts starts the app with bun run serve. There is no packageManager field and no package-lock.json. If the agent installs, the review says it used bun. It does not add a package-lock.json to make npm install reproducible.
Does the review change how comments are deleted?
It does not push. destroyComment removes the comment from state after a successful delete and does not refetch. A diff that changes that filter is cited at the line in src/store/article.js. The view's v-for key is the index, which the review can flag as a suggestion when the diff touches the comment list.
beforeRouteEnter is an options API block in a script-setup file. Is that a finding?
Only if the diff breaks it. The file keeps that hook because it runs before the instance exists, and the setup block holds the template state. The review describes that split when the diff edits the fetch. It is not, by itself, a blocking issue.
Can I have it review the profile store in the same session?
Add src/store/profile.js and src/views/Profile.vue to the input. The session still clones one repository. Keep the vitest line so the missing runner is reported once, and name the Playwright script in the same sentence if you want the review to keep distinguishing the two.