openqodex 0.2.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -3
- package/dist/bin.js +11674 -4437
- package/docs/agents.md +30 -3
- package/docs/cli.md +59 -78
- package/docs/config.md +9 -0
- package/docs/github-action.md +1 -1
- package/docs/llms.txt +1 -0
- package/docs/plumbing.md +93 -0
- package/docs/quickstart.md +9 -0
- package/docs/scanners.md +6 -0
- package/docs/security.md +31 -3
- package/package.json +6 -4
- package/skills/openqodex/SKILL.md +22 -9
- package/templates/README.md +14 -2
- package/templates/repo/team-section.md +7 -0
package/docs/agents.md
CHANGED
|
@@ -30,6 +30,24 @@ Inside a repository, `init` also asks: "Add the git pre-push hook, so every push
|
|
|
30
30
|
|
|
31
31
|
The tables below name the file for each agent. Cursor has no instruction file in the home folder, so its rule in the repository carries the same section. In an existing file, the section is appended and your own text stays as it is. `--uninstall` removes exactly that section, and nothing around it.
|
|
32
32
|
|
|
33
|
+
## The team section in the repository
|
|
34
|
+
|
|
35
|
+
Inside a repository, `init` in user scope also asks: "Add a review section to this repo's CLAUDE.md and AGENTS.md, so teammates' agents review before they push too?" The default is yes, and `--yes` answers yes. `--no-repo` answers no. The answer is recorded for that repository and asked no more; `--yes` or `--no-repo` on a later `init` replaces it.
|
|
36
|
+
|
|
37
|
+
The section goes into `CLAUDE.md` and `AGENTS.md` at the root of the repository, and `init` creates a file that is not there. It is meant for a teammate who has installed nothing, so it names only the pinned `npx` command:
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
<!-- openqodex:start -->
|
|
41
|
+
## Review with OpenQodex before you push
|
|
42
|
+
- Before any `git push`, run `npx -y openqodex@<version> review --agent` from the repository root and follow the brief it prints to the end, including the finalize command it names.
|
|
43
|
+
- Run that review in a separate subagent when your agent has one: the agent that wrote the code does not judge its own work.
|
|
44
|
+
- Do not push on a blocked verdict unless the developer says so after seeing the findings.
|
|
45
|
+
- The report is in `.openqodex/reviews/`.
|
|
46
|
+
<!-- openqodex:end -->
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
The two files show in `git status`, and `init` says to commit them. `init` writes neither file through a symbolic link. A section you edited is yours: a later `init` and `--uninstall` leave it as it is. `--uninstall` removes our untouched section, and deletes a file only when `init` created it and nothing else is in it. In project scope the same two files carry the instruction section instead, never both.
|
|
50
|
+
|
|
33
51
|
## The review runs in a separate subagent
|
|
34
52
|
|
|
35
53
|
The skill hands the review to a subagent whose only task is the review, so the agent that wrote the code does not judge its own work. In Claude Code, that is a subagent started with the Agent tool. In Codex, Cursor and other hosts, the skill uses their sub-task or background agent feature when there is one. Where the host has none, the agent tells you the review is not independent, and the report's summary says so on its first line.
|
|
@@ -47,15 +65,17 @@ Both are meant to be committed, so the whole team shares them. A file that exist
|
|
|
47
65
|
|
|
48
66
|
## User scope and project scope
|
|
49
67
|
|
|
50
|
-
The default is user scope. `init` writes into your home folder, so one install works in every repository. A rule file it must put inside a repository is added to `.git/info/exclude`, so it does not show in `git status`. The two repo folder files
|
|
68
|
+
The default is user scope. `init` writes into your home folder, so one install works in every repository. A rule file it must put inside a repository is added to `.git/info/exclude`, so it does not show in `git status`. The two repo folder files and the team section above are the exception: they are meant to be committed.
|
|
51
69
|
|
|
52
70
|
`--project` writes the files into the repository instead, for a team to commit. Run it inside a git repository.
|
|
53
71
|
|
|
54
72
|
## The launcher
|
|
55
73
|
|
|
56
|
-
In user scope, the push gate hooks call a launcher, not npx. `init` copies the package to `~/.openqodex/runtime/<version>/` and checks the copy runs. It then writes `~/.openqodex/bin/openqodex`, a small script that runs
|
|
74
|
+
In user scope, the push gate hooks, the skill and the Cursor and Cline rules call a launcher, not npx. Every user-scope install gets it, with or without a hook. `init` copies the package to `~/.openqodex/runtime/<version>/` and checks the copy runs. It writes the version to the first line of `~/.openqodex/runtime/current`, then writes `~/.openqodex/bin/openqodex`, a small script that runs the copy that line names with your Node. When the line is missing, is not a version, or names a copy that is gone, the script runs the version `init` installed. The hooks and the skill's commands call that script by its full path, so they do not depend on npx or your `PATH`. A copy is never changed once written: when a folder of the same version with other contents is in the way, `init` stops and names it.
|
|
75
|
+
|
|
76
|
+
The user-scope skill is a short stub: when to run, who reviews (a separate subagent where the host has one), and one command, `<launcher> guide skill`, which prints the full procedure of the version the launcher runs, with every command written for the launcher. No file `init` writes in user scope names a version or holds the procedure, so an update changes none of them. In user scope the Cursor and Cline rules call the launcher too, and say to run `<launcher> guide skill` when the skill is not loaded.
|
|
57
77
|
|
|
58
|
-
In project scope, the hooks call `npx -y openqodex@<version
|
|
78
|
+
In project scope, the hooks, the skill and the rules call `npx -y openqodex@<version>` and the skill holds the full procedure, because the launcher path would not exist on a teammate's machine. These files, and the review section `init` adds to a repository's `CLAUDE.md` and `AGENTS.md`, stay on the version they name: an update never changes them. Run `init` again to move them.
|
|
59
79
|
|
|
60
80
|
## Claude Code
|
|
61
81
|
|
|
@@ -64,9 +84,16 @@ In project scope, the hooks call `npx -y openqodex@<version>`, because the launc
|
|
|
64
84
|
| Skill | `~/.claude/skills/openqodex/SKILL.md` | `.claude/skills/openqodex/SKILL.md` |
|
|
65
85
|
| Push gate hook | merged into `~/.claude/settings.json` | merged into `.claude/settings.json` |
|
|
66
86
|
| Instructions | a marked section in `~/.claude/CLAUDE.md` | a marked section in `CLAUDE.md` |
|
|
87
|
+
| Permission rules | merged into `permissions.allow` of `~/.claude/settings.json` | none |
|
|
67
88
|
|
|
68
89
|
The hook is one `PreToolUse` entry. It matches the `Bash` tool and runs only for `git push` commands. It calls `openqodex hook check`.
|
|
69
90
|
|
|
91
|
+
In user scope, `init` adds rules so Claude Code runs these review commands without asking, and the agent can review unattended: `<launcher> review --agent`, `review --finalize`, `review --agent --all` and `review --finalize --all`, each also with ` --offline` at the end, plus `guide`, `guide skill` and `guide <topic>`. Each rule matches one exact line, so the same command with any other flag, such as `--output` or `--config`, or chained with `&&`, still asks you. `scan`, `doctor`, `trust`, `update`, `init` and `report` still ask you. The brief's finalize command is one of these lines too, unless the review was run with `--config`. Project scope writes no permission rule: a committed settings file would decide for every teammate. A rule you already had is left alone, and `init --uninstall` removes only the rules `init` added. When a later version grants a different set, the next `init` removes the rules an earlier version added and adds the new ones. When your home path holds a space or another character the shell would read, the launcher is written in single quotes in the skill and in the rules alike. When the launcher's path holds `*`, which Claude Code reads as a wildcard, `init` writes no rule and says so in one line; Claude Code then asks before each review command.
|
|
92
|
+
|
|
93
|
+
A skill, rule or permission rule an earlier `init` wrote, such as the full-text skill of 0.2.1, is replaced by the next `init` only while it is still exactly as written. One you edited is left as it is, and `init` says so.
|
|
94
|
+
|
|
95
|
+
Neither the skill `init` writes nor `guide skill` carries the sentence that tells an agent to prefer `~/.openqodex/bin/openqodex`: in user scope the launcher already runs every command, and in project scope the skill keeps the version the team committed.
|
|
96
|
+
|
|
70
97
|
## Codex CLI
|
|
71
98
|
|
|
72
99
|
| What | User scope | Project scope |
|
package/docs/cli.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Commands
|
|
2
2
|
|
|
3
|
-
Run every command with `npx openqodex <command>`, or `openqodex <command>` when the package is installed.
|
|
3
|
+
Run every command with `npx openqodex <command>`, or `openqodex <command>` when the package is installed. `openqodex --help` lists the four commands below: `init`, `review`, `update` and `trust`. The commands that hooks, the skill and the Action call (`scan`, `doctor`, `hook`, `guide`, `demo`, `report`) still work; `plumbing` describes them.
|
|
4
4
|
|
|
5
5
|
## Exit codes
|
|
6
6
|
|
|
@@ -22,11 +22,11 @@ By default the change is the commits not yet pushed plus everything uncommitted,
|
|
|
22
22
|
4. The point where the branch left the remote's default branch (`origin/HEAD`).
|
|
23
23
|
5. The last commit, `HEAD`.
|
|
24
24
|
|
|
25
|
-
A repository with no commits checks every file.
|
|
25
|
+
A repository with no commits checks every file. A review of your own change never fetches from a remote; a review of a branch or a pull request does (see "Reviewing a branch or a pull request").
|
|
26
26
|
|
|
27
27
|
## Shared flags
|
|
28
28
|
|
|
29
|
-
`scan`, `review`, `doctor`, `trust` and `guide` accept these flags. `demo` accepts only `--no-color`, `--quiet`, `--verbose`, `--no-install` and `--offline`. `init` and `
|
|
29
|
+
`scan`, `review`, `doctor`, `trust` and `guide` accept these flags. `demo` accepts only `--no-color`, `--quiet`, `--verbose`, `--no-install` and `--offline`. `init`, `hook` and `update` accept none of them.
|
|
30
30
|
|
|
31
31
|
- `--cwd <dir>`: find the repository from `<dir>`. A relative `--output` path still resolves from the folder you ran the command in.
|
|
32
32
|
- `--config <path>`: read this config file instead of `.openqodex.yaml` at the repo root.
|
|
@@ -36,7 +36,7 @@ A repository with no commits checks every file. OpenQodex never fetches from a r
|
|
|
36
36
|
- `--quiet`: no progress lines on stderr.
|
|
37
37
|
- `--verbose`: print the stack when OpenQodex itself fails.
|
|
38
38
|
- `--no-install`: do not download missing scanners. The report lists them as not installed.
|
|
39
|
-
- `--offline`: no built-in scanner goes online. osv-scanner and semgrep are skipped and listed as disabled. Scanner downloads are off.
|
|
39
|
+
- `--offline`: no built-in scanner goes online. osv-scanner and semgrep are skipped and listed as disabled. Scanner downloads are off. The daily version check does not start after this run.
|
|
40
40
|
|
|
41
41
|
`doctor --install` together with `--offline` or `--no-install` exits 2.
|
|
42
42
|
|
|
@@ -47,12 +47,15 @@ Progress goes to stderr. The report goes to stdout.
|
|
|
47
47
|
## review
|
|
48
48
|
|
|
49
49
|
```
|
|
50
|
-
openqodex review [--agent
|
|
50
|
+
openqodex review [--agent] [--all | --base <ref> | --uncommitted] [--no-graph] [--only <list>] [--skip <list>]
|
|
51
|
+
openqodex review [--agent] <branch | #number | pull request link> [--base <ref>] [--no-graph] [--only <list>] [--skip <list>]
|
|
52
|
+
openqodex review --finalize [--run <id> | path]
|
|
51
53
|
```
|
|
52
54
|
|
|
53
55
|
- `--agent`: run the scanners, write the brief and print it. Your agent runs this.
|
|
54
|
-
- `--finalize [path]`: check the agent's findings and write the report. Without a path it reads `agent-findings.json` in the newest report folder. With a path it finds the run by the `change_id` in that file.
|
|
55
|
-
-
|
|
56
|
+
- `--finalize [path]`: check the agent's findings and write the report. Without a path it reads `agent-findings.json` in the newest report folder. With a path it finds the run by the `change_id` in that file. `--run <id>` names the run folder instead; a review of a branch or a pull request is finalized only that way.
|
|
57
|
+
- `<branch>`, `#<number>` or a pull request link: review that branch or pull request instead of your own change. See "Reviewing a branch or a pull request".
|
|
58
|
+
- Neither flag: run the scanners on the change and print their report, with the formats, flags and exit codes above. Then one line on stderr says how to get the full review from your agent, so `--format json` stays one JSON document. `scan` (see `plumbing`) does the same without that line.
|
|
56
59
|
- `--base`, `--uncommitted`: see "Which change is checked".
|
|
57
60
|
- `--all`: review the whole repository instead of the change. See "Reviewing the whole repository".
|
|
58
61
|
- `--no-graph`: do not build the code graph for this run.
|
|
@@ -66,10 +69,44 @@ A scanner name is a built-in name such as `semgrep`, or `custom:<name>` for a cu
|
|
|
66
69
|
- the findings file breaks the shape, naming the first wrong field;
|
|
67
70
|
- the change moved since the brief;
|
|
68
71
|
- the config changed since the brief;
|
|
69
|
-
- a finding cites a scanner rule or candidate that is not in this scan
|
|
72
|
+
- a finding cites a scanner rule or candidate that is not in this scan;
|
|
73
|
+
- the brief was written by another openqodex version that is not installed in `~/.openqodex/runtime/`;
|
|
74
|
+
- for a branch or a pull request, the temporary checkout moved from the reviewed commit or is gone.
|
|
75
|
+
|
|
76
|
+
When the launcher started the review, the brief's finalize command is the plain line `<launcher> review --finalize`, with `--all` and `--offline` as the review had them, run from the repository root; it finds the run through `.openqodex/latest.json` (`latest-all.json` for `--all`). With `--config`, or when npx started the review, the command names the repository, the config and the findings file, so it works from any folder. When the version that runs `--finalize` is not the one that wrote the brief, and that one is installed by `init` or an update, it hands the run to that version by its findings file and exits with its code. A version reached that way never hands off again.
|
|
70
77
|
|
|
71
78
|
It never repairs a finding. Fix what it names, or run `review --agent` again.
|
|
72
79
|
|
|
80
|
+
### Deleted lines
|
|
81
|
+
|
|
82
|
+
A finding counts toward the verdict only on a line the change added or modified. A change that only deletes lines, such as a removed check, has no such line, so the lines next to each deletion count too: the line just above and the line just below it in the new file. The brief lists each deletion point ("2 lines deleted after line 14 of app/auth.py") and tells the agent to cite one of those lines and say what was removed. Any other line the change did not touch stays under "Outside the changed lines".
|
|
83
|
+
|
|
84
|
+
### Reviewing a branch or a pull request
|
|
85
|
+
|
|
86
|
+
`review <branch>` reviews a branch that is not your current work, and `review '#42'` or `review https://github.com/<owner>/<repo>/pull/42` a pull request. Quote `#42` in a shell, where `#` starts a comment. A bare number is a branch name. The branch may be local, `origin/<name>`, or a branch on the remote that is fetched on demand.
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
openqodex review --agent feature/login
|
|
90
|
+
openqodex review --agent '#42'
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
The change is what the target added since it left its base: from the merge base of the two to the target's head, read from the commits, never from a work tree. Commits that landed on the base after the split are not part of it. The base is, in this order:
|
|
94
|
+
|
|
95
|
+
1. `--base <ref>`.
|
|
96
|
+
2. The pull request's base, which `gh` names when it is installed and signed in. For a branch, only when it has exactly one open pull request.
|
|
97
|
+
3. `review.default_base`.
|
|
98
|
+
4. The remote's default branch (`origin/HEAD`), read without the network.
|
|
99
|
+
|
|
100
|
+
Without `gh`, a branch review uses the next source, and a review of `#<number>` says in one line that the pull request's base is not known. The first line of the output and the brief say which base was used and where it came from.
|
|
101
|
+
|
|
102
|
+
The head is fetched first: a branch from its remote, so a stale `origin/<name>` is brought up to date, and a pull request from `pull/<number>/head`, the ref GitHub keeps for every pull request. That ref is the one host convention OpenQodex uses. A base named as `<remote>/<branch>` is fetched too, even when this clone has never seen it. Fetches use git and its own credentials; OpenQodex reads no token. A fetch writes only `refs/remotes/<remote>/<branch>` for a branch, or a ref of its own under `refs/openqodex/tmp/` for a pull request, removed when the review ends: no configured fetch mapping, no tags, no pruning, so your branches and tags never change. A pull request link must name a remote of this repository whose host is exactly `github.com`. In a partial clone, a file that is not downloaded is never fetched for the checkout and the review stops with one line; this needs git 2.44 or newer. An older git fetches such a file itself, so with `--offline` a target review in a partial clone refuses to start on it. For `#<number>`, when `gh` names the repository the pull request was opened against and one of your remotes points at it, the head and the base are fetched from that remote, and a line says which. A local branch is read as it is. `--offline` fetches nothing and calls no `gh`, and says in one line when the target is not available locally.
|
|
103
|
+
|
|
104
|
+
The files are read in a temporary checkout of the head in `~/.openqodex/checkouts/`, a folder only you can open. Making it, and every later git call in it (the code graph included), runs nothing from the repository: no git hook, no file system monitor, no clean, smudge or process filter (including one an include adds only for linked work trees), no submodule. Files stored in Git LFS hold their pointers, and one line says so. Your settings apply, never the target's: the config and `custom-instructions.md` are read from your repository. Checking the target out runs nothing from it, and a link in it becomes a small plain file holding the link's target. The scanners you approved for this repository do run on the target's files, with this repository's settings; one named only in the target's config never runs. If you review pull requests from people you do not trust, approve only custom scanners that do not execute the code they scan. When the target is your current commit and your work tree is clean, the files are read in place. With uncommitted work, the committed head is reviewed in a checkout, and one line says your uncommitted work is not part of it.
|
|
105
|
+
|
|
106
|
+
Without `--agent`, the scanners report on the change and the checkout is removed at the end. With `--agent`, the brief names the checkout, tells the agent to read the code there and never to run its tests or scripts, and prints the finalize line with `--run <id>`, run from your repository. The run folder stays in your repository. Finalize checks that the checkout is still at the reviewed commit. It removes the checkout when it succeeds or when the review must be run again, and keeps it after an error the agent can fix in its findings file. A target review writes no receipt, so it never replaces the review of the change you are about to push. A later `review` removes a checkout left for more than 24 hours.
|
|
107
|
+
|
|
108
|
+
`review --all` and `--uncommitted` cannot be combined with a target.
|
|
109
|
+
|
|
73
110
|
### Reviewing the whole repository
|
|
74
111
|
|
|
75
112
|
`review --all` treats every file in the repository as the change: every tracked file and every untracked file git does not ignore, as they are on disk, minus `exclude` and `.openqodex/`. Every line of every text file is in scope, so the scanners report on the whole repository with no changed-line filter. Submodules, symbolic links, unreadable files and files over 5 MB are listed in the brief as left out.
|
|
@@ -82,18 +119,10 @@ The brief includes `.openqodex/custom-instructions.md` when the repo has one; a
|
|
|
82
119
|
|
|
83
120
|
`--all` cannot be combined with `--base` or `--uncommitted`. The git hook and the GitHub Action never run it.
|
|
84
121
|
|
|
85
|
-
## scan
|
|
86
|
-
|
|
87
|
-
```
|
|
88
|
-
openqodex scan [--base <ref>] [--uncommitted] [--only <list>] [--skip <list>]
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
Runs the scanners on the change and prints the report. No model is involved. The git hook, the pre-commit hook and the GitHub Action run this command.
|
|
92
|
-
|
|
93
122
|
## init
|
|
94
123
|
|
|
95
124
|
```
|
|
96
|
-
openqodex init [--agent <name>]... [--project] [--hook <pre-push|none>] [--yes] [--uninstall] [--dry-run]
|
|
125
|
+
openqodex init [--agent <name>]... [--project] [--hook <pre-push|none>] [--no-repo] [--yes] [--uninstall] [--dry-run]
|
|
97
126
|
```
|
|
98
127
|
|
|
99
128
|
Installs OpenQodex into your coding agents.
|
|
@@ -101,29 +130,13 @@ Installs OpenQodex into your coding agents.
|
|
|
101
130
|
- `--agent <name>`: `claude-code`, `cursor`, `codex`, `cline` or `all`. Repeat it for several. Without it, `init` uses every agent it finds.
|
|
102
131
|
- `--project`: write the files into the repository for a team to commit. The default writes them in your home folder.
|
|
103
132
|
- `--hook <pre-push|none>`: answer the pre-push hook question without asking. Without it, `init` asks once per repository and records the answer.
|
|
104
|
-
- `--
|
|
133
|
+
- `--no-repo`: do not add the team review section to the repository's `CLAUDE.md` and `AGENTS.md`. Without it, `init` without `--project` asks once per repository (default yes) and records the answer; `--yes` or `--no-repo` on a later run replaces the recorded answer. A file the repository's git ignore rules hide is left alone, with one line saying why, since it could not be committed.
|
|
134
|
+
- `--yes`, `-y`: do not ask. It adds the team review section, even where this repository answered no before (only `--no-repo` keeps it out), and adds the pre-push hook unless this repository answered no to it before or `--hook none` says so. Without a terminal, `init` needs this flag.
|
|
105
135
|
- `--uninstall`: remove what `init` wrote. A file you edited after `init` is left in place.
|
|
106
136
|
- `--dry-run`: print the plan and write nothing.
|
|
107
137
|
|
|
108
138
|
`init` does not take the flags listed under "Flags every command below accepts". `agents` lists each file it writes.
|
|
109
139
|
|
|
110
|
-
## doctor
|
|
111
|
-
|
|
112
|
-
```
|
|
113
|
-
openqodex doctor [--install] [--json]
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
Prints the Node and git versions, the repository, the config, the OpenQodex home folder and the state of each scanner. It lists custom scanners with their approval state.
|
|
117
|
-
|
|
118
|
-
- `--install`: download every scanner that fits this machine, and wait for all of them.
|
|
119
|
-
- `--json`: print the same facts as JSON.
|
|
120
|
-
|
|
121
|
-
`doctor` always prints its table. It then exits 2 in three cases:
|
|
122
|
-
|
|
123
|
-
- git is missing;
|
|
124
|
-
- the config does not load;
|
|
125
|
-
- the `--cwd` folder does not exist.
|
|
126
|
-
|
|
127
140
|
## trust
|
|
128
141
|
|
|
129
142
|
```
|
|
@@ -138,59 +151,27 @@ Approves the custom scanners in `.openqodex.yaml`. For each new or changed entry
|
|
|
138
151
|
|
|
139
152
|
Without a terminal and without `--yes`, `trust` exits 2. `custom-scanners` explains the whole step.
|
|
140
153
|
|
|
141
|
-
##
|
|
142
|
-
|
|
143
|
-
```
|
|
144
|
-
openqodex hook check
|
|
145
|
-
openqodex hook install [--force]
|
|
146
|
-
openqodex hook uninstall
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
- `hook check`: the push gate. The Claude Code and Codex hooks call it before a shell command. It reads the hook's JSON on stdin. It always exits 0.
|
|
150
|
-
- `hook install`: add a git pre-push hook to this repository. It also sets up the launcher in `~/.openqodex/`, which the hook calls. The hook runs `hook pre-push`, which scans each commit the push sends against the remote's tip of its branch (`agents` has the details). It stops the push only when the scan exits 1. A scan that fails for its own reasons never stops the push.
|
|
151
|
-
- `hook install` refuses to replace a hook it did not write. `--force` replaces it and keeps the old hook as `pre-push.openqodex.bak`.
|
|
152
|
-
- `hook uninstall`: remove that hook and put back the one it replaced. A hook you edited after install is left in place.
|
|
153
|
-
|
|
154
|
-
When the repository uses husky or lefthook, `hook install` writes nothing. It prints the line to add to their pre-push hook: `npx -y openqodex@<version> hook pre-push || [ $? -ne 1 ]`. The part after `||` makes the line stop the push only on exit 1, as the hook `hook install` writes does: a scan that fails for its own reasons (exit 2) never stops the push.
|
|
155
|
-
|
|
156
|
-
`init` asks whether to install the git hook. `agents` explains the push gate.
|
|
157
|
-
|
|
158
|
-
## guide
|
|
154
|
+
## update
|
|
159
155
|
|
|
160
156
|
```
|
|
161
|
-
openqodex
|
|
157
|
+
openqodex update [--now | --rollback | --off | --on | --status]
|
|
162
158
|
```
|
|
163
159
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
## demo
|
|
167
|
-
|
|
168
|
-
```
|
|
169
|
-
openqodex demo [dir]
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
Builds the demo repository in `<dir>`, or in a new temporary folder. A relative `<dir>` resolves from the folder you run the command in. The folder must be empty or new. The demo commits a clean baseline, then adds a change with planted bugs and leaves it uncommitted. It scans that change and prints the report. When some scanners are still installing, it says so and asks you to run `scan` again. The secret in the demo is generated each time and works nowhere.
|
|
173
|
-
|
|
174
|
-
## report
|
|
175
|
-
|
|
176
|
-
```
|
|
177
|
-
openqodex report "<what went wrong>"
|
|
178
|
-
openqodex report --send-last
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
- `report "<what went wrong>"`: report a problem with OpenQodex. It prints the issue it would create and the two choices, the same as after a failure. It exits 0. Words that hold a path, a file name, a key or token, or an email address are refused with exit 2: remove them and run it again. Your user name and the repository's name are replaced with `<name>`.
|
|
182
|
-
- `report --send-last`: print the last issue shown in this repository again, then create it exactly as it was shown. Outside a repository it uses the last one shown outside a repository. It refuses a saved issue that is a link, is not in the saved shape, or changed after it was shown.
|
|
183
|
-
|
|
184
|
-
The issue holds only the command and its flags, a short diagnostic, the status of each scanner, the operating system, the CPU type and the Node version. For a scanner the diagnostic is its failure class only, such as `exited with code 2` or `timed out after 60 s`, never its output. For an internal error it is the error's class and first line, cut to 120 characters. Every path, file name, key or token, email address, user name and repository name is removed first, and a custom scanner is shown as `custom scanner`. It never holds code, diffs, findings, config or logs.
|
|
160
|
+
Checks npm for a newer release and installs it now, in the foreground, the same way the daily check does. It works only for an install made with `npx openqodex init`: run through `~/.openqodex/bin/openqodex`, which hooks and the installed skill call. Run any other way (npx, a project-scope file), it exits 2 and says to run `npx openqodex init`.
|
|
185
161
|
|
|
186
|
-
|
|
162
|
+
- No flag: install the newest release that is at least 24 hours old and whose build record verifies, then print what happened.
|
|
163
|
+
- `--now`: also install a release younger than 24 hours. Verification is the same.
|
|
164
|
+
- `--rollback`: turn updates off, then point the launcher back at the version that was active before the last update. It exits 2 and changes nothing when that version's copy is gone or when `update: off` cannot be written.
|
|
165
|
+
- `--off`, `--on`: write `update: off` or `update: on` to `~/.openqodex/config.yaml`. `init --uninstall` removes that file when `update` created it and it is unchanged, and removes the update state.
|
|
166
|
+
- `--status`: print the same update lines as `doctor`.
|
|
187
167
|
|
|
188
|
-
|
|
168
|
+
Each release is checked before anything of it runs: its sha512 must match the registry's, and its npm provenance must be signed by this repository's release workflow on `main` (see `security`). A release that fails is skipped, recorded, and not downloaded again for 7 days. An update writes no agent file and never writes inside a repository: the user-scope skill asks the launcher for the procedure with `guide skill`, so it always matches the active version. A foreground `update`, `--rollback`, `--off` and `--on` wait up to 60 seconds while another `init`, uninstall or update runs, then exit 2 with one line. `update` also removes runtime copies older than 7 days, except the one `init` installed, the current one and the previous one.
|
|
189
169
|
|
|
190
|
-
|
|
170
|
+
After an update the next command prints one line on stderr: `openqodex updated to X (was Y). Roll back: openqodex update --rollback`. The agent push hook does not print it.
|
|
191
171
|
|
|
192
172
|
## Environment variables
|
|
193
173
|
|
|
194
174
|
- `OPENQODEX_HOME`: where OpenQodex keeps scanners, the launcher and approvals. The default is `~/.openqodex`.
|
|
195
175
|
- `OPENQODEX_SKIP=1`: the push gate lets the push through and says so. It is your switch, not your agent's.
|
|
176
|
+
- `OPENQODEX_AUTO_UPDATE=0`: no daily version check. `OPENQODEX_OFFLINE=1` and a set `CI` variable do the same.
|
|
196
177
|
- `NO_COLOR`: no colour in the terminal report.
|
package/docs/config.md
CHANGED
|
@@ -216,3 +216,12 @@ The code graph lists the callers and importers of the code a change touches, for
|
|
|
216
216
|
- `graph.budget_ms`: the time the graph may take, in milliseconds. The default is `10000`.
|
|
217
217
|
- `graph.max_files`: the most files the graph reads. The default is `4000`.
|
|
218
218
|
- `graph.max_file_bytes`: a file larger than this, in bytes, is left out of the graph. The default is `524288`.
|
|
219
|
+
|
|
220
|
+
## The user config, ~/.openqodex/config.yaml
|
|
221
|
+
|
|
222
|
+
One file in your home folder holds what is yours, not the team's. It has one key today, and `OPENQODEX_HOME` moves it with the rest of `~/.openqodex/`.
|
|
223
|
+
|
|
224
|
+
- `update`: `on` or `off`. The default is `on`. `off` stops the daily version check. `openqodex update --off` and `--on` write it.
|
|
225
|
+
|
|
226
|
+
A file that does not parse, or an `update` value that is neither `on` nor `off`, turns updates off until it is fixed. `openqodex doctor` says why updates are off.
|
|
227
|
+
|
package/docs/github-action.md
CHANGED
package/docs/llms.txt
CHANGED
package/docs/plumbing.md
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Plumbing commands
|
|
2
|
+
|
|
3
|
+
`openqodex --help` lists four commands: `init`, `review`, `update` and `trust`. The commands below still work the same way. They are hidden from `--help` because hooks, the skill, the Action or OpenQodex itself call them, not people in daily use.
|
|
4
|
+
|
|
5
|
+
## scan
|
|
6
|
+
|
|
7
|
+
Plain `openqodex review` does the same. Kept under this name for the git pre-push hook of earlier releases, the pre-commit hook and the GitHub Action, which call it.
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
openqodex scan [--base <ref>] [--uncommitted] [--only <list>] [--skip <list>]
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Runs the scanners on the change and prints the report. No model is involved. The git hook, the pre-commit hook and the GitHub Action run this command.
|
|
14
|
+
|
|
15
|
+
## doctor
|
|
16
|
+
|
|
17
|
+
For you, when a scanner is missing or slow to install. The skill asks you to run `doctor --install` once when the agent runs in a sandbox.
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
openqodex doctor [--install] [--json]
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Prints the Node and git versions, the repository, the config, the OpenQodex home folder and the state of each scanner. It lists custom scanners with their approval state.
|
|
24
|
+
|
|
25
|
+
- `--install`: download every scanner that fits this machine, and wait for all of them.
|
|
26
|
+
- `--json`: print the same facts as JSON.
|
|
27
|
+
|
|
28
|
+
Under "Updates" it prints the running version and whether the launcher started it, the newest version the last check saw and when, the last check, whether updates are on (and why not), and the last update error. For a version not started through the launcher (npx, a project-scope file), it says when that pinned version is behind the newest one a check saw. Without a check on this machine, it says nothing about that.
|
|
29
|
+
|
|
30
|
+
`doctor` always prints its table. It then exits 2 in three cases:
|
|
31
|
+
|
|
32
|
+
- git is missing;
|
|
33
|
+
- the config does not load;
|
|
34
|
+
- the `--cwd` folder does not exist.
|
|
35
|
+
|
|
36
|
+
## hook
|
|
37
|
+
|
|
38
|
+
Called by the agent push hooks and the git pre-push hook that `init` writes. You run `hook install` and `hook uninstall` yourself when you want the git hook without `init`.
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
openqodex hook check
|
|
42
|
+
openqodex hook install [--force]
|
|
43
|
+
openqodex hook uninstall
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
- `hook check`: the push gate. The Claude Code and Codex hooks call it before a shell command. It reads the hook's JSON on stdin. It always exits 0.
|
|
47
|
+
- `hook install`: add a git pre-push hook to this repository. It also sets up the launcher in `~/.openqodex/`, which the hook calls. The hook runs `hook pre-push`, which scans each commit the push sends against the remote's tip of its branch (`agents` has the details). It stops the push only when the scan exits 1. A scan that fails for its own reasons never stops the push.
|
|
48
|
+
- `hook install` refuses to replace a hook it did not write. `--force` replaces it and keeps the old hook as `pre-push.openqodex.bak`.
|
|
49
|
+
- `hook uninstall`: remove that hook and put back the one it replaced. A hook you edited after install is left in place.
|
|
50
|
+
|
|
51
|
+
When the repository uses husky or lefthook, `hook install` writes nothing. It prints the line to add to their pre-push hook: `npx -y openqodex@<version> hook pre-push || [ $? -ne 1 ]`. The part after `||` makes the line stop the push only on exit 1, as the hook `hook install` writes does: a scan that fails for its own reasons (exit 2) never stops the push.
|
|
52
|
+
|
|
53
|
+
`init` asks whether to install the git hook. `agents` explains the push gate.
|
|
54
|
+
|
|
55
|
+
## guide
|
|
56
|
+
|
|
57
|
+
For agents: the skill reads the docs offline with it.
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
openqodex guide [skill | topic]
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
`guide skill`, and `guide` with no topic, print the full review procedure of the running version: the shipped skill with every command written for the runner that started it, the launcher's full path when the launcher started it, else `npx -y openqodex@<version>`. The skill `init` writes in user scope is a short stub that tells the agent to run `<launcher> guide skill` and follow what it prints. With a topic, it prints that page of these docs. An unknown topic lists the topics and exits 2.
|
|
64
|
+
|
|
65
|
+
## demo
|
|
66
|
+
|
|
67
|
+
For a first look: builds a repo with planted bugs to scan.
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
openqodex demo [dir]
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Builds the demo repository in `<dir>`, or in a new temporary folder. A relative `<dir>` resolves from the folder you run the command in. The folder must be empty or new. The demo commits a clean baseline, then adds a change with planted bugs and leaves it uncommitted. It scans that change and prints the report. When some scanners are still installing, it says so and asks you to run `scan` again. The secret in the demo is generated each time and works nowhere.
|
|
74
|
+
|
|
75
|
+
## report
|
|
76
|
+
|
|
77
|
+
Offered by OpenQodex itself after an internal failure.
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
openqodex report "<what went wrong>"
|
|
81
|
+
openqodex report --send-last
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
- `report "<what went wrong>"`: report a problem with OpenQodex. It prints the issue it would create and the two choices, the same as after a failure. It exits 0. Words that hold a path, a file name, a key or token, or an email address are refused with exit 2: remove them and run it again. Your user name and the repository's name are replaced with `<name>`.
|
|
85
|
+
- `report --send-last`: print the last issue shown in this repository again, then create it exactly as it was shown. Outside a repository it uses the last one shown outside a repository. It refuses a saved issue that is a link, is not in the saved shape, or changed after it was shown.
|
|
86
|
+
|
|
87
|
+
The issue holds only the command and its flags, a short diagnostic, the status of each scanner, the operating system, the CPU type and the Node version. For a scanner the diagnostic is its failure class only, such as `exited with code 2` or `timed out after 60 s`, never its output. For an internal error it is the error's class and first line, cut to 120 characters. Every path, file name, key or token, email address, user name and repository name is removed first, and a custom scanner is shown as `custom scanner`. It never holds code, diffs, findings, config or logs.
|
|
88
|
+
|
|
89
|
+
When the issue could not be saved, OpenQodex says so and does not offer `--send-last`.
|
|
90
|
+
|
|
91
|
+
In a terminal, press 1 or 2. Any other key, Enter, Ctrl-C or the end of input counts as 2. Without a terminal (an agent, a git hook, CI), OpenQodex prints the issue and how to create it later with `openqodex report --send-last`; doing nothing ignores it.
|
|
92
|
+
|
|
93
|
+
Choice 1 creates the issue with the GitHub CLI when `gh auth status` says you are signed in. Otherwise it opens the new issue page on GitHub with the title and body filled in, and prints the link. OpenQodex never signs you in. Choice 2 sends nothing. Nothing leaves your machine without choice 1. The last issue shown is kept in `.openqodex/last-report.json`, which git ignores.
|
package/docs/quickstart.md
CHANGED
|
@@ -53,6 +53,15 @@ review my whole repo with openqodex
|
|
|
53
53
|
|
|
54
54
|
The agent runs `openqodex review --all --agent`. The scanners check every file, and the brief tells the agent where to start: the most-called functions and the files with the most scanner hits. See `docs/cli.md` for the details.
|
|
55
55
|
|
|
56
|
+
To review a teammate's branch or a pull request before it merges, without leaving your own work, say:
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
review the branch feature/login with openqodex
|
|
60
|
+
review pull request #42 with openqodex
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
The agent runs `openqodex review --agent feature/login` or `openqodex review --agent '#42'`. OpenQodex fetches the branch or the pull request, checks it out in a temporary folder and reviews what it added since it left its base. Your working folder is not touched. See "Reviewing a branch or a pull request" in `docs/cli.md`.
|
|
64
|
+
|
|
56
65
|
## 3. Read the report
|
|
57
66
|
|
|
58
67
|
The agent tells you the verdict and the most serious findings. The full report is in `.openqodex/reviews/<time>-<id>/report.md` in your repo. `.openqodex/.gitignore` keeps the reports out of git; `git status` shows only the two files above and that `.gitignore`, the first time.
|
package/docs/scanners.md
CHANGED
|
@@ -35,6 +35,12 @@ The report lists every selected scanner with one status. A scanner left out with
|
|
|
35
35
|
|
|
36
36
|
A scanner problem never changes the exit code.
|
|
37
37
|
|
|
38
|
+
## Changed scanner settings
|
|
39
|
+
|
|
40
|
+
Several scanners read settings or an ignore list from the repository, as OpenQodex runs them. At the repository root only: gitleaks `.gitleaks.toml`, `gitleaks.toml` and `.gitleaksignore`; semgrep `.semgrepignore`; hadolint `.hadolint.yaml` and `.hadolint.yml`; actionlint `.github/actionlint.yaml` and `.github/actionlint.yml`. In any folder: ruff `ruff.toml` and `.ruff.toml`, and `pyproject.toml` when the change touches its `[tool.ruff` table; shellcheck `.shellcheckrc` and `shellcheckrc`; osv-scanner `osv-scanner.toml`. A change to one of them can hide that scanner's findings.
|
|
41
|
+
|
|
42
|
+
In a review, each such changed file is a major candidate of that scanner, rule `settings-file`, on its first changed line; the reviewer verifies it and raises it or drops it with a reason. In a scan (`scan`, plain `review`, the git hook, the Action) nobody can clear it, so the report lists it under "This change edits a scanner settings file" and it never counts toward the verdict. `--only`, `--skip` and `scanners.disable` leave it out with its scanner.
|
|
43
|
+
|
|
38
44
|
## semgrep
|
|
39
45
|
|
|
40
46
|
- Version: 1.94.0.
|
package/docs/security.md
CHANGED
|
@@ -25,7 +25,7 @@ npx openqodex trust
|
|
|
25
25
|
|
|
26
26
|
The stored sha256 is checked against the project's checksum file when the project publishes one. Otherwise it is the hash of your first download. `custom-scanners` explains the difference.
|
|
27
27
|
|
|
28
|
-
Agents that follow the OpenQodex skill are told never to run `openqodex trust` without asking you.
|
|
28
|
+
Agents that follow the OpenQodex skill are told never to run `openqodex trust` without asking you. In user scope, `init` adds rules so Claude Code runs exactly `review --agent`, `review --finalize`, `review --agent --all` and `review --finalize --all` (each also with ` --offline`), `guide` and `guide <topic>` through the launcher without asking. An `ask` or `deny` rule in your own or your organisation's managed Claude Code settings still wins over these. Any other flag, any other command (`scan`, `doctor`, `trust`, `update`, `init`, `report`) and `init --project` grant nothing.
|
|
29
29
|
|
|
30
30
|
## What is sent where
|
|
31
31
|
|
|
@@ -37,10 +37,35 @@ OpenQodex and the built-in scanners use the network for these things only:
|
|
|
37
37
|
- Semgrep rule packs. semgrep fetches `p/default`, `p/security-audit` and `p/secrets` from the Semgrep registry on each run. Its metrics are off. The rules are never bundled in the package.
|
|
38
38
|
- 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.
|
|
39
39
|
- Custom scanners. `openqodex trust` reads the release from the GitHub API and downloads the asset. After approval, a custom scanner does whatever its own command does.
|
|
40
|
+
- The daily version check, for an install made with `init`. See "Updates" below.
|
|
41
|
+
- A review of a branch or a pull request (`review <branch>`, `review '#<number>'`). git fetches the branch or `pull/<number>/head` from your remote with its own credentials, and `gh`, when it is installed and signed in, is asked for the pull request's base. OpenQodex reads no token. The target is checked out in `~/.openqodex/checkouts/`, a folder only you can open, with every git hook and filter switched off, so checking it out runs nothing from it, and a link in it becomes a small plain file. The scanners you approved for this repository do run on the target's files, with this repository's settings; one named only in the target's config never runs. If you review pull requests from people you do not trust, approve only custom scanners that do not execute the code they scan.
|
|
40
42
|
|
|
41
43
|
golangci-lint runs with the Go module proxy off, so it downloads no modules.
|
|
42
44
|
|
|
43
|
-
`--offline` skips osv-scanner and semgrep, which the report lists as disabled. It also turns scanner downloads off.
|
|
45
|
+
`--offline` skips osv-scanner and semgrep, which the report lists as disabled. It also turns scanner downloads off and the version check. A review of a branch or a pull request with `--offline` fetches nothing and calls no `gh`.
|
|
46
|
+
|
|
47
|
+
## Updates
|
|
48
|
+
|
|
49
|
+
An install made with `npx openqodex init` runs through the launcher `~/.openqodex/bin/openqodex`. After a `review`, `scan`, `hook check` or `hook pre-push` that the launcher started, at most once every 24 hours, OpenQodex starts a background process and the command exits without waiting for it.
|
|
50
|
+
|
|
51
|
+
What it sends: GET requests to `registry.npmjs.org` only, over https, with no body and no header but the user agent `openqodex/<version>`. First the openqodex package's release list. Then, for a newer release, its tarball and its attestations. Nothing about you, your code or your repository is sent. Every redirect must stay on `registry.npmjs.org`.
|
|
52
|
+
|
|
53
|
+
What it installs: a release that is newer than the running one, in the same major version, at least 24 hours old, not deprecated, not a prerelease, and fit for your Node. Before any of its code runs:
|
|
54
|
+
|
|
55
|
+
- the tarball's sha512 must equal the registry's `dist.integrity`;
|
|
56
|
+
- its SLSA provenance must verify in full with Sigstore: the certificate chain to the Fulcio roots, the certificate transparency entry, the transparency log entry and the signature;
|
|
57
|
+
- the signing certificate must be issued to `https://github.com/openqodex/openqodex/.github/workflows/release.yml@refs/heads/main` by `https://token.actions.githubusercontent.com`, compared exactly;
|
|
58
|
+
- the signed statement must name `pkg:npm/openqodex@<version>` with the downloaded tarball's sha512.
|
|
59
|
+
|
|
60
|
+
A stolen npm publish token is therefore not enough to reach your machine: the release must come out of this repository's release workflow on `main`. The 24 hour age is a window to deprecate a bad release before installs take it.
|
|
61
|
+
|
|
62
|
+
The Sigstore trust data (Fulcio roots, log keys) ships inside each release, so verification makes no other network call. When Sigstore rotates a key that an old release does not know, that release cannot verify newer ones. It stays on its version and says once how to update by hand: `npx openqodex@latest init`.
|
|
63
|
+
|
|
64
|
+
A verified release is unpacked into a temporary folder under `~/.openqodex/runtime/`. A link in the tarball, or a path that leaves the folder, stops it. No install script runs. The new copy must print its own version. Only then, holding the lock below, the updater checks again that updates are still on, that OpenQodex is still installed and that no other update, rollback or `init` changed the active version meanwhile. It then renames the copy to `~/.openqodex/runtime/<version>/` and switches `~/.openqodex/runtime/current` by a second rename. A version folder is never replaced: when one with other contents is already there, the release is skipped. An update writes no agent file and nothing inside a repository.
|
|
65
|
+
|
|
66
|
+
The lock: while `init`, `init --uninstall`, `hook install`, `update --rollback`, `update --off`, `update --on` or an update's switch runs, OpenQodex briefly opens a listener on 127.0.0.1, on a port between 20000 and 32000 derived from the path of `~/.openqodex`, so that two of them never run at once; it accepts no data and answers nothing, and the operating system closes it when the process ends, however it ends. When the listener cannot be opened at all, those commands stop with one line saying why, and the daily check skips the switch. The port is predictable, so a local program that holds it stops install, uninstall and updates until it lets go; nothing is installed or changed while it is held. A command that waited 60 seconds for it names the port and the line that shows the holder (`lsof -nP -iTCP:<port> -sTCP:LISTEN`), and the daily check records the same as its last error, which `openqodex update --status` and `doctor` show.
|
|
67
|
+
|
|
68
|
+
Updates are off with `openqodex update --off`, `update: off` in `~/.openqodex/config.yaml`, `OPENQODEX_AUTO_UPDATE=0`, `--offline` or `OPENQODEX_OFFLINE=1`, and whenever `CI` is set. A run through `npx` or a project-scope file never checks.
|
|
44
69
|
|
|
45
70
|
OpenQodex sends no telemetry. See `telemetry`.
|
|
46
71
|
|
|
@@ -59,7 +84,10 @@ In your home folder, under `~/.openqodex/` (`OPENQODEX_HOME` moves it):
|
|
|
59
84
|
- `tools/<scanner>/<version>/`: the scanners.
|
|
60
85
|
- `tools/uv-python/`: the Python 3.11 for semgrep and bandit.
|
|
61
86
|
- `cache/`: the download caches for uv and npm.
|
|
62
|
-
- `runtime/<version>/` and `bin/openqodex`: the copy of the package and the launcher that the hooks call, written by `init`.
|
|
87
|
+
- `runtime/<version>/` and `bin/openqodex`: the copy of the package and the launcher that the hooks call, written by `init`. Updates add copies beside it; a copy is never changed after it is written. `init` and `openqodex update` remove copies older than 7 days, except the one `init` installed, the current one and the previous one.
|
|
88
|
+
- `runtime/current`: the version the launcher runs, and on a second line the version a rollback goes back to.
|
|
89
|
+
- `update.json`: the state of the version check, private to you.
|
|
90
|
+
- `config.yaml`: your own settings; today only `update`.
|
|
63
91
|
- `install.json`: what `init` and `hook install` wrote, so an uninstall removes only that.
|
|
64
92
|
- `trust.json`: your approvals of custom scanners.
|
|
65
93
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "openqodex",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Open source code review that runs inside your coding agent, before you push.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -41,16 +41,18 @@
|
|
|
41
41
|
"LICENSE",
|
|
42
42
|
"NOTICE"
|
|
43
43
|
],
|
|
44
|
-
"dependencies": {},
|
|
45
44
|
"devDependencies": {
|
|
46
45
|
"@clack/prompts": "^1.8.1",
|
|
46
|
+
"@sigstore/bundle": "5.0.0",
|
|
47
|
+
"@sigstore/protobuf-specs": "0.5.2",
|
|
48
|
+
"@sigstore/verify": "4.1.2",
|
|
47
49
|
"commander": "^14.0.3",
|
|
48
50
|
"picocolors": "^1.1.1",
|
|
49
51
|
"yaml": "^2.9.1",
|
|
50
52
|
"zod": "^4.6.5",
|
|
51
53
|
"@openqodex/core": "0.1.0",
|
|
52
|
-
"@openqodex/
|
|
53
|
-
"@openqodex/
|
|
54
|
+
"@openqodex/graph": "0.1.0",
|
|
55
|
+
"@openqodex/scanners": "0.1.0"
|
|
54
56
|
},
|
|
55
57
|
"scripts": {
|
|
56
58
|
"build": "tsup",
|