openqodex 0.6.0 → 0.6.1
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 +9 -3
- package/dist/bin.js +17 -17
- package/docs/agents.md +2 -0
- package/docs/github-action.md +1 -1
- package/docs/index.md +1 -0
- package/docs/llms.txt +1 -0
- package/docs/privacy.md +43 -0
- package/package.json +20 -4
- package/skills/openqodex/SKILL.md +10 -10
package/README.md
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
<picture>
|
|
2
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/openqodex/openqodex/main/.github/assets/readme-banner-dark.png">
|
|
3
|
+
<img alt="OpenQodex" src="https://raw.githubusercontent.com/openqodex/openqodex/main/.github/assets/readme-banner-light.png" width="1280">
|
|
4
|
+
</picture>
|
|
2
5
|
|
|
3
6
|
# OpenQodex
|
|
4
7
|
|
|
@@ -6,7 +9,7 @@
|
|
|
6
9
|
[](LICENSE)
|
|
7
10
|
[](https://github.com/openqodex/openqodex/actions/workflows/ci.yml)
|
|
8
11
|
|
|
9
|
-
OpenQodex is open source code review
|
|
12
|
+
OpenQodex is open source AI code review for Claude Code and Codex. It runs before you push, from your coding agent or your terminal. One command, `openqodex review`, works out your change: the commits not yet pushed plus everything uncommitted. It runs the scanners that fit the changed files and keeps only findings on the lines you changed. Then it starts its own reviewer, a separate Claude Code or Codex process that reads a frozen copy of the change. The reviewer checks every scanner finding and is given every changed line. OpenQodex checks its answer with scripts and prints one report. It needs Claude Code or Codex installed and logged in, and no other key, account or server.
|
|
10
13
|
|
|
11
14
|
## Install
|
|
12
15
|
|
|
@@ -163,11 +166,12 @@ The docs ship inside the package. `npx openqodex guide <topic>` prints a page of
|
|
|
163
166
|
- [Agents](docs/agents.md)
|
|
164
167
|
- [GitHub Action](docs/github-action.md)
|
|
165
168
|
- [Security](docs/security.md)
|
|
169
|
+
- [Privacy](docs/privacy.md)
|
|
166
170
|
- [FAQ](docs/faq.md)
|
|
167
171
|
|
|
168
172
|
## Telemetry
|
|
169
173
|
|
|
170
|
-
None. OpenQodex sends no usage data. semgrep runs with its own metrics switched off. See [docs/telemetry.md](docs/telemetry.md).
|
|
174
|
+
None. OpenQodex sends no usage data. semgrep runs with its own metrics switched off. See [docs/telemetry.md](docs/telemetry.md) and the privacy policy, [docs/privacy.md](docs/privacy.md).
|
|
171
175
|
|
|
172
176
|
## Security
|
|
173
177
|
|
|
@@ -179,6 +183,8 @@ OpenQodex is new and on the way to 1.0. Commands, flags and the config file can
|
|
|
179
183
|
|
|
180
184
|
## Made by Qodex
|
|
181
185
|
|
|
186
|
+
[](https://qodex.ai?utm_source=openqodex&utm_medium=readme)
|
|
187
|
+
|
|
182
188
|
OpenQodex is made by [Qodex](https://qodex.ai?utm_source=openqodex&utm_medium=readme), which also runs a hosted review on every pull request.
|
|
183
189
|
|
|
184
190
|
Licensed under [Apache 2.0](LICENSE). See [NOTICE](NOTICE) for the scanners' licences.
|
package/dist/bin.js
CHANGED
|
@@ -39813,7 +39813,7 @@ function launcherStarted(env = process.env, entry = process.argv[1]) {
|
|
|
39813
39813
|
return named !== void 0 && named !== "" && entry !== void 0 && resolve6(named) === resolve6(entry);
|
|
39814
39814
|
}
|
|
39815
39815
|
function directRunner(entry = process.argv[1]) {
|
|
39816
|
-
const npx = `npx -y openqodex@${"0.6.
|
|
39816
|
+
const npx = `npx -y openqodex@${"0.6.1"}`;
|
|
39817
39817
|
if (entry === void 0) return npx;
|
|
39818
39818
|
let file2;
|
|
39819
39819
|
let own2;
|
|
@@ -40223,7 +40223,7 @@ function composeIssue(problem, command, args2) {
|
|
|
40223
40223
|
`Scanners: ${scanners}`,
|
|
40224
40224
|
`Environment: ${osName()}, ${process.arch}, Node ${process.versions.node.split(".")[0]}`
|
|
40225
40225
|
].join("\n");
|
|
40226
|
-
return { title: `OpenQodex ${"0.6.
|
|
40226
|
+
return { title: `OpenQodex ${"0.6.1"}: ${problem.code}`, body: body2 };
|
|
40227
40227
|
}
|
|
40228
40228
|
function issueText(issue2) {
|
|
40229
40229
|
return [
|
|
@@ -41505,7 +41505,7 @@ Nothing was written.
|
|
|
41505
41505
|
const record3 = loadRecord(home);
|
|
41506
41506
|
const recordBefore = serialize(record3);
|
|
41507
41507
|
try {
|
|
41508
|
-
const runtime2 = planRuntime(record3, "0.6.
|
|
41508
|
+
const runtime2 = planRuntime(record3, "0.6.1", home);
|
|
41509
41509
|
const refused = runtime2.find((a2) => a2.failed);
|
|
41510
41510
|
if (refused) return fail2(`openqodex hook install: ${refused.path}: ${refused.note}`);
|
|
41511
41511
|
await applyAll(runtime2);
|
|
@@ -41618,7 +41618,7 @@ var init_hook = __esm({
|
|
|
41618
41618
|
BRANCH = /^[A-Za-z0-9._][A-Za-z0-9._/-]*$/;
|
|
41619
41619
|
CANNOT_TELL = "OpenQodex could not tell what this push sends; run openqodex review and push with plain git push";
|
|
41620
41620
|
ZERO_SHA = /^0+$/;
|
|
41621
|
-
MANAGED_LINE = (manager) => hookLine(`npx -y openqodex@${"0.6.
|
|
41621
|
+
MANAGED_LINE = (manager) => hookLine(`npx -y openqodex@${"0.6.1"}`, manager.args);
|
|
41622
41622
|
}
|
|
41623
41623
|
});
|
|
41624
41624
|
|
|
@@ -50102,7 +50102,7 @@ async function runReview(o2) {
|
|
|
50102
50102
|
created_at: (/* @__PURE__ */ new Date()).toISOString(),
|
|
50103
50103
|
lenses: lenses.map((l2) => ({ name: l2.name, confidenceFloor: l2.confidenceFloor })),
|
|
50104
50104
|
instructions_hash: instructions.hash,
|
|
50105
|
-
runtime_version: "0.6.
|
|
50105
|
+
runtime_version: "0.6.1",
|
|
50106
50106
|
...prep.target ? { target: prep.target } : {}
|
|
50107
50107
|
};
|
|
50108
50108
|
writeReportFiles(
|
|
@@ -53582,7 +53582,7 @@ ${USAGE2}
|
|
|
53582
53582
|
home,
|
|
53583
53583
|
oqHome: openqodexHomeDir(),
|
|
53584
53584
|
repoRoot,
|
|
53585
|
-
version: "0.6.
|
|
53585
|
+
version: "0.6.1",
|
|
53586
53586
|
written: [],
|
|
53587
53587
|
before: /* @__PURE__ */ new Map()
|
|
53588
53588
|
};
|
|
@@ -53675,7 +53675,7 @@ function maybeStartUpdate(home, state) {
|
|
|
53675
53675
|
child.unref();
|
|
53676
53676
|
}
|
|
53677
53677
|
function notices(home, state) {
|
|
53678
|
-
if (state.notice === null || state.notice.version !== "0.6.
|
|
53678
|
+
if (state.notice === null || state.notice.version !== "0.6.1") return;
|
|
53679
53679
|
process.stderr.write(`${state.notice.text}
|
|
53680
53680
|
`);
|
|
53681
53681
|
updateState(home, { notice: null });
|
|
@@ -53687,7 +53687,7 @@ function afterCommand(name2, args2) {
|
|
|
53687
53687
|
const state = readState(home);
|
|
53688
53688
|
const sub = name2 === "hook" ? args2[0] : void 0;
|
|
53689
53689
|
if (!launcherStarted()) {
|
|
53690
|
-
const note3 = name2 === "review" || name2 === "scan" ? pinnedNote(state, "0.6.
|
|
53690
|
+
const note3 = name2 === "review" || name2 === "scan" ? pinnedNote(state, "0.6.1") : null;
|
|
53691
53691
|
if (note3 !== null) process.stderr.write(`openqodex: ${note3}
|
|
53692
53692
|
`);
|
|
53693
53693
|
return;
|
|
@@ -53890,7 +53890,7 @@ async function writeBrief(p3, flags2, noGraph, scope, target) {
|
|
|
53890
53890
|
created_at: (/* @__PURE__ */ new Date()).toISOString(),
|
|
53891
53891
|
lenses: lenses.map((l2) => ({ name: l2.name, confidenceFloor: l2.confidenceFloor })),
|
|
53892
53892
|
instructions_hash: instructions.hash,
|
|
53893
|
-
runtime_version: "0.6.
|
|
53893
|
+
runtime_version: "0.6.1",
|
|
53894
53894
|
...target ? { target, run_id: runId } : {}
|
|
53895
53895
|
};
|
|
53896
53896
|
const impact = await buildImpact(p3, flags2, noGraph);
|
|
@@ -54026,7 +54026,7 @@ async function runAll(flags2, only, skip, noGraph) {
|
|
|
54026
54026
|
created_at: (/* @__PURE__ */ new Date()).toISOString(),
|
|
54027
54027
|
lenses: lenses.map((l2) => ({ name: l2.name, confidenceFloor: l2.confidenceFloor })),
|
|
54028
54028
|
instructions_hash: instructions.hash,
|
|
54029
|
-
runtime_version: "0.6.
|
|
54029
|
+
runtime_version: "0.6.1"
|
|
54030
54030
|
});
|
|
54031
54031
|
writeScan(repoRoot, dir, p3.scan);
|
|
54032
54032
|
const { impact, hot, note: note3 } = await buildHotSpots(p3, flags2, noGraph);
|
|
@@ -54174,7 +54174,7 @@ async function runFinalize(flags2, path11, all, args2, handedOff, runId) {
|
|
|
54174
54174
|
if (target !== void 0 && runId === void 0) {
|
|
54175
54175
|
throw new OpenQodexError(`this run reviewed ${target.spec}; finalize it with review --finalize --run ${basename11(dir)}`);
|
|
54176
54176
|
}
|
|
54177
|
-
if (manifest !== null && manifest.runtime_version !== void 0 && manifest.runtime_version !== "0.6.
|
|
54177
|
+
if (manifest !== null && manifest.runtime_version !== void 0 && manifest.runtime_version !== "0.6.1") {
|
|
54178
54178
|
if (target !== void 0) {
|
|
54179
54179
|
throw new OpenQodexError(`this brief was written by openqodex ${manifest.runtime_version}; run the review of ${target.spec} again`);
|
|
54180
54180
|
}
|
|
@@ -54481,7 +54481,7 @@ var init_fetch = __esm({
|
|
|
54481
54481
|
DEADLINE_MS2 = 12e4;
|
|
54482
54482
|
MB = 1024 * 1024;
|
|
54483
54483
|
LIMITS = { metadata: 20 * MB, attestations: 5 * MB, tarball: 50 * MB };
|
|
54484
|
-
VERSION = true ? "0.6.
|
|
54484
|
+
VERSION = true ? "0.6.1" : "dev";
|
|
54485
54485
|
UpdateFetchError = class extends Error {
|
|
54486
54486
|
constructor(message5) {
|
|
54487
54487
|
super(message5);
|
|
@@ -59817,7 +59817,7 @@ async function runUpdateWorker(opts) {
|
|
|
59817
59817
|
async function work(home, env, anyAge, wait) {
|
|
59818
59818
|
const now = Date.now();
|
|
59819
59819
|
const test = seam(env);
|
|
59820
|
-
const running = test.as ?? "0.6.
|
|
59820
|
+
const running = test.as ?? "0.6.1";
|
|
59821
59821
|
const from = activeVersion(home);
|
|
59822
59822
|
if (from === null || !existsSync15(launcherPath(home))) return { outcome: "failed", lines: ["No launcher install here; run npx openqodex init."] };
|
|
59823
59823
|
for (const tmp of tempRuntimes(home, false)) rmSync15(tmp, { recursive: true, force: true });
|
|
@@ -59946,14 +59946,14 @@ function statusLines(home) {
|
|
|
59946
59946
|
const launched = launcherStarted();
|
|
59947
59947
|
const allowed = updatesAllowed(home, process.env);
|
|
59948
59948
|
const lines3 = [
|
|
59949
|
-
`running ${"0.6.
|
|
59949
|
+
`running ${"0.6.1"}${launched ? " (through the launcher)" : " (pinned: not started through the launcher, never updates)"}`,
|
|
59950
59950
|
`latest seen ${state.latestSeen ?? "not checked yet"}`,
|
|
59951
59951
|
`last check ${ago(state.checkedAt)}`,
|
|
59952
59952
|
`updates ${allowed.why}`,
|
|
59953
59953
|
`last error ${state.lastError ?? "none"}`
|
|
59954
59954
|
];
|
|
59955
59955
|
if (!launched) {
|
|
59956
|
-
const note3 = pinnedNote(state, "0.6.
|
|
59956
|
+
const note3 = pinnedNote(state, "0.6.1");
|
|
59957
59957
|
if (note3 !== null) lines3.push(`note ${note3}`);
|
|
59958
59958
|
}
|
|
59959
59959
|
return lines3;
|
|
@@ -60245,7 +60245,7 @@ async function run12(args2) {
|
|
|
60245
60245
|
const { positionals } = parseFlags(args2, { positionals: 1 });
|
|
60246
60246
|
const topic = positionals[0];
|
|
60247
60247
|
if (topic === void 0 || topic === "skill") {
|
|
60248
|
-
const runner = launcherStarted() ? launcherRunner(launcherPath(openqodexHomeDir())) : `npx -y openqodex@${"0.6.
|
|
60248
|
+
const runner = launcherStarted() ? launcherRunner(launcherPath(openqodexHomeDir())) : `npx -y openqodex@${"0.6.1"}`;
|
|
60249
60249
|
process.stdout.write(renderSkill(runner));
|
|
60250
60250
|
return EXIT_OK;
|
|
60251
60251
|
}
|
|
@@ -60446,7 +60446,7 @@ function reportError(error62, command, args2) {
|
|
|
60446
60446
|
return EXIT_TOOL_FAILED;
|
|
60447
60447
|
}
|
|
60448
60448
|
async function main(argv) {
|
|
60449
|
-
const program2 = new Command("openqodex").description("Open source code review that runs inside your coding agent, before you push.").version("0.6.
|
|
60449
|
+
const program2 = new Command("openqodex").description("Open source code review that runs inside your coding agent, before you push.").version("0.6.1", "-v, --version", "Print the version").exitOverride();
|
|
60450
60450
|
for (const [name2, entry] of Object.entries(commands)) {
|
|
60451
60451
|
const command = program2.command(name2, { hidden: entry.hidden === true });
|
|
60452
60452
|
if (entry.usage !== void 0) command.usage(entry.usage);
|
package/docs/agents.md
CHANGED
|
@@ -168,6 +168,8 @@ Before each push it runs `openqodex hook pre-push` through the launcher. For eac
|
|
|
168
168
|
|
|
169
169
|
- The skill alone: `npx skills add openqodex/openqodex`. This writes the skill but no hook.
|
|
170
170
|
- Claude Code plugin: the repository holds a plugin marketplace with an `openqodex` plugin. The plugin carries the skill and the push gate hook. Its hook calls `npx -y openqodex@<version>`.
|
|
171
|
+
- Codex plugin: `plugins/codex/` packages the skill alone for the OpenAI plugin directory. It writes no hook and no instruction file.
|
|
172
|
+
- Cursor plugin: `.cursor-plugin/plugin.json` at the repository root makes the repository a Cursor plugin that carries the skill alone. It holds no rule. The rule that asks Cursor to review before every push comes from `init`, which writes `.cursor/rules/openqodex.mdc` in your repository. A rule shipped inside the plugin would go in a `rules/` folder at the repository root.
|
|
171
173
|
|
|
172
174
|
## Inside a sandbox
|
|
173
175
|
|
package/docs/github-action.md
CHANGED
package/docs/index.md
CHANGED
|
@@ -26,4 +26,5 @@ These pages ship inside the npm package. `npx openqodex guide <topic>` prints on
|
|
|
26
26
|
- `github-action`: run the scan on pull requests.
|
|
27
27
|
- `security`: what runs, what is sent where, and where files go.
|
|
28
28
|
- `telemetry`: there is none.
|
|
29
|
+
- `privacy`: the privacy policy: what OpenQodex collects (nothing) and every network call it makes.
|
|
29
30
|
- `faq`: short answers.
|
package/docs/llms.txt
CHANGED
package/docs/privacy.md
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Privacy
|
|
2
|
+
|
|
3
|
+
This page is the privacy policy for OpenQodex: the `openqodex` package on npm, its skill, its plugins for Claude Code, Codex and Cursor, its GitHub Action and its pre-commit hook. `security` and `telemetry` give the details behind each line.
|
|
4
|
+
|
|
5
|
+
## What OpenQodex collects
|
|
6
|
+
|
|
7
|
+
Nothing. OpenQodex collects no usage data, no crash reports and no identifiers. It has no server and no account, and it sends no telemetry. semgrep runs with its own metrics switched off.
|
|
8
|
+
|
|
9
|
+
## Who reviews your code
|
|
10
|
+
|
|
11
|
+
The review runs in a reviewer process OpenQodex starts on your machine: Claude Code or Codex, on your own login. That process sends the brief and what the reviewer reads to the model your login uses. OpenQodex adds no other model and needs no other key. By default the reviewer can also search the web, and Claude Code can open web pages; `reviewer_web: off` in `~/.openqodex/config.yaml` removes that.
|
|
12
|
+
|
|
13
|
+
When neither Claude Code nor Codex can be the reviewer, the coding agent you are in reviews the change itself, on the model that agent already uses.
|
|
14
|
+
|
|
15
|
+
## Every network use
|
|
16
|
+
|
|
17
|
+
OpenQodex and the built-in scanners send no code anywhere. They use the network for these things only:
|
|
18
|
+
|
|
19
|
+
- Scanner downloads on first use, into `~/.openqodex/tools/`. GitHub release files are checked against sha256 sums pinned in the package. semgrep and bandit come from PyPI through uv, with a Python 3.11 that uv downloads. oxlint comes from npm. brakeman and rubocop come from RubyGems. These package installs are pinned by version.
|
|
20
|
+
- Semgrep rule packs. semgrep fetches `p/default`, `p/security-audit` and `p/secrets` from the Semgrep registry on each run.
|
|
21
|
+
- The dependency check. When the change holds a lockfile, osv-scanner sends the names and versions of the dependencies in it to osv.dev. It never sends code.
|
|
22
|
+
- Custom scanners. `openqodex trust` reads the scanner's release from the GitHub API and downloads the asset.
|
|
23
|
+
- The problem report, only when you choose it. When OpenQodex fails, a scanner breaks, or you run `openqodex report`, it prints the GitHub issue it would create and two choices. Nothing is sent unless you press 1 or run `openqodex report --send-last`. The issue holds the OpenQodex version, the command and its arguments with paths and secrets taken out, the part that failed, a scrubbed error line, the scanner statuses and your platform. It never holds code, file names, paths, repository names, config or secrets.
|
|
24
|
+
- The daily version check, for an install made with `init`. It sends GET requests to `registry.npmjs.org` only, with nothing about you, your code or your repository. `security` describes what it checks before it installs a release.
|
|
25
|
+
- A review of a branch or a pull request. git fetches it from your own remote with git's own credentials, and the GitHub CLI, when it is installed and signed in, is asked for the pull request's base. OpenQodex reads no token.
|
|
26
|
+
|
|
27
|
+
`--offline` skips osv-scanner and semgrep and turns scanner downloads and the version check off.
|
|
28
|
+
|
|
29
|
+
The plugins, the GitHub Action and the pre-commit hook fetch the `openqodex` package from npm to run it.
|
|
30
|
+
|
|
31
|
+
The GitHub Action uploads its findings to code scanning in your own repository on GitHub: each finding's message, file path and line numbers, as a SARIF file. Set `upload-sarif: false` in the workflow to turn that off.
|
|
32
|
+
|
|
33
|
+
## Custom scanners
|
|
34
|
+
|
|
35
|
+
A custom scanner named in `.openqodex.yaml` is a command that runs on your machine with your permissions. It never runs until you approve that exact entry with `openqodex trust`, and an edited entry needs a new approval. After approval, a custom scanner does whatever its own command does, including any network use. OpenQodex does not control it.
|
|
36
|
+
|
|
37
|
+
## What stays on your machine
|
|
38
|
+
|
|
39
|
+
Scanners, caches and your approvals stay under `~/.openqodex/`. Each review writes its brief, findings and reports under `.openqodex/` in your repository. When gitleaks finds a secret in the change, OpenQodex removes it from the brief, every report file and the terminal.
|
|
40
|
+
|
|
41
|
+
## Contact
|
|
42
|
+
|
|
43
|
+
Questions about this page: siddhant@qodex.ai. Report a vulnerability through GitHub's private vulnerability reporting on the openqodex/openqodex repository, never in a public issue.
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "openqodex",
|
|
3
|
-
"version": "0.6.
|
|
4
|
-
"description": "Open source code review
|
|
3
|
+
"version": "0.6.1",
|
|
4
|
+
"description": "Open source AI code review for Claude Code and Codex, before you push: scanners on your changed lines, then a separate reviewer that checks every scanner finding and is given every changed line.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
|
-
"homepage": "https://
|
|
7
|
+
"homepage": "https://qodex.ai/openqodex",
|
|
8
8
|
"repository": {
|
|
9
9
|
"type": "git",
|
|
10
10
|
"url": "git+https://github.com/openqodex/openqodex.git",
|
|
@@ -15,12 +15,28 @@
|
|
|
15
15
|
},
|
|
16
16
|
"keywords": [
|
|
17
17
|
"code-review",
|
|
18
|
+
"ai-code-review",
|
|
19
|
+
"code-review-tool",
|
|
18
20
|
"static-analysis",
|
|
21
|
+
"sast",
|
|
22
|
+
"security",
|
|
23
|
+
"secret-scanning",
|
|
24
|
+
"linter",
|
|
25
|
+
"code-quality",
|
|
26
|
+
"pre-commit",
|
|
27
|
+
"pre-push",
|
|
28
|
+
"git-hooks",
|
|
19
29
|
"claude-code",
|
|
30
|
+
"claude-code-plugin",
|
|
31
|
+
"agent-skills",
|
|
20
32
|
"cursor",
|
|
21
33
|
"codex",
|
|
22
34
|
"cline",
|
|
23
|
-
"
|
|
35
|
+
"coding-agent",
|
|
36
|
+
"semgrep",
|
|
37
|
+
"gitleaks",
|
|
38
|
+
"osv-scanner",
|
|
39
|
+
"cli"
|
|
24
40
|
],
|
|
25
41
|
"engines": {
|
|
26
42
|
"node": ">=22"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: openqodex
|
|
3
|
-
description:
|
|
3
|
+
description: Code review for the current change, before it is pushed. One command runs the security, secret, dependency and lint scanners that fit the changed files, a separate reviewer that checks every scanner finding and is given every changed line, and prints the report. Use before every git push, when asked for a code review, a security scan, or to review changes, a diff or a pull request, and when a push was blocked or warned by OpenQodex.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# OpenQodex: review the change before it is pushed
|
|
@@ -27,13 +27,13 @@ When the file `~/.openqodex/bin/openqodex` exists, run it in place of `npx -y op
|
|
|
27
27
|
1. From the repository, run:
|
|
28
28
|
|
|
29
29
|
```
|
|
30
|
-
npx -y openqodex@0.6.
|
|
30
|
+
npx -y openqodex@0.6.1 review
|
|
31
31
|
```
|
|
32
32
|
|
|
33
33
|
It reviews the change: the commits not yet pushed plus everything uncommitted, untracked files included. To review the whole repository instead, run:
|
|
34
34
|
|
|
35
35
|
```
|
|
36
|
-
npx -y openqodex@0.6.
|
|
36
|
+
npx -y openqodex@0.6.1 review --all
|
|
37
37
|
```
|
|
38
38
|
|
|
39
39
|
2. Wait for it. A review takes one to three minutes. Many agents stop a command after two minutes, so give it up to ten minutes, or run it in the background and wait until it exits. While the reviewer works, it prints a progress line every 15 seconds on stderr. Do not start it a second time while one runs.
|
|
@@ -50,8 +50,8 @@ When the file `~/.openqodex/bin/openqodex` exists, run it in place of `npx -y op
|
|
|
50
50
|
When the developer asks you to review a branch or a pull request that is not their current work, name it:
|
|
51
51
|
|
|
52
52
|
```
|
|
53
|
-
npx -y openqodex@0.6.
|
|
54
|
-
npx -y openqodex@0.6.
|
|
53
|
+
npx -y openqodex@0.6.1 review feature/login
|
|
54
|
+
npx -y openqodex@0.6.1 review '#42'
|
|
55
55
|
```
|
|
56
56
|
|
|
57
57
|
Quote `#42`: in a shell `#` starts a comment. A pull request link works too. OpenQodex fetches the target, checks it out in a temporary folder and reviews what it added since it left its base. This is someone else's code: never run its tests, scripts, builds or services, and never edit it.
|
|
@@ -62,7 +62,7 @@ Quote `#42`: in a shell `#` starts a comment. A pull request link works too. Ope
|
|
|
62
62
|
- Never run `openqodex trust` without asking the developer first. It approves a custom scanner, which is a command that runs on their machine.
|
|
63
63
|
- Never set `OPENQODEX_SKIP`. It is the developer's switch, not yours.
|
|
64
64
|
- When the verdict is `blocked`, do not push unless the developer says so after seeing the findings.
|
|
65
|
-
- When OpenQodex prints "OpenQodex had a problem. Nothing has been sent." with `1 create a GitHub issue` and `2 ignore`, tell the developer in one line what went wrong and give them the two choices. Never choose 1 yourself. If they say 1, run `npx -y openqodex@0.6.
|
|
65
|
+
- When OpenQodex prints "OpenQodex had a problem. Nothing has been sent." with `1 create a GitHub issue` and `2 ignore`, tell the developer in one line what went wrong and give them the two choices. Never choose 1 yourself. If they say 1, run `npx -y openqodex@0.6.1 report --send-last` from the same folder. Anything else means 2: do nothing.
|
|
66
66
|
|
|
67
67
|
## Reading the report
|
|
68
68
|
|
|
@@ -74,7 +74,7 @@ Quote `#42`: in a shell `#` starts a comment. A pull request link works too. Ope
|
|
|
74
74
|
- `installing`: it is being downloaded for the first time; it is included from the next run. Say so to the developer rather than waiting.
|
|
75
75
|
- `not installed`: it could not be installed here; the reason says why.
|
|
76
76
|
- `needs Ruby 2.7+` or `needs Go`: brakeman and rubocop need Ruby, golangci-lint needs Go. OpenQodex does not install language runtimes. If the developer wants those scanners, they install Ruby or Go the usual way for their system (for example `brew install ruby go` on a Mac) and run the review again.
|
|
77
|
-
- `untrusted`: a custom scanner from the repo's config that the developer has not approved. Tell the developer; approving it is their decision (`npx -y openqodex@0.6.
|
|
77
|
+
- `untrusted`: a custom scanner from the repo's config that the developer has not approved. Tell the developer; approving it is their decision (`npx -y openqodex@0.6.1 trust`).
|
|
78
78
|
- `failed`: the scanner ran and broke; the reason has its error. A scanner problem never changes the exit code.
|
|
79
79
|
|
|
80
80
|
## Inside a sandbox
|
|
@@ -82,11 +82,11 @@ Quote `#42`: in a shell `#` starts a comment. A pull request link works too. Ope
|
|
|
82
82
|
Some agents run commands in a sandbox that cannot reach the network or write outside the project. There the first run cannot download the scanners, and the reviewer may not reach its model. Tell the developer to run this once in their own terminal, outside the agent:
|
|
83
83
|
|
|
84
84
|
```
|
|
85
|
-
npx -y openqodex@0.6.
|
|
85
|
+
npx -y openqodex@0.6.1 doctor --install
|
|
86
86
|
```
|
|
87
87
|
|
|
88
|
-
It downloads every scanner that fits the machine into `~/.openqodex/tools/`. If the review still says "Full review unavailable" inside the sandbox, the developer runs `npx -y openqodex@0.6.
|
|
88
|
+
It downloads every scanner that fits the machine into `~/.openqodex/tools/`. If the review still says "Full review unavailable" inside the sandbox, the developer runs `npx -y openqodex@0.6.1 review` in their own terminal.
|
|
89
89
|
|
|
90
90
|
## More
|
|
91
91
|
|
|
92
|
-
`npx -y openqodex@0.6.
|
|
92
|
+
`npx -y openqodex@0.6.1 guide` prints this guide. `npx -y openqodex@0.6.1 guide <topic>` prints a page of the docs, offline: `quickstart`, `config`, `scanners`, `custom-scanners`, `security`, `agents`, `cli`.
|