Skip to content

Commit 83532d2

Browse files
committed
feat: add first-class Pi package support
1 parent 54f5d56 commit 83532d2

15 files changed

Lines changed: 151 additions & 31 deletions

File tree

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
## Unreleased
44

5+
## v1.1.0 - 2026-07-23
6+
7+
- Added first-class Pi package support with native `pi.skills` discovery, documented `/skill:omv-*` invocation, and bilingual install guidance.
58
- Fixed research workspace resolution so commands run from under `.omv/` (for example `.omv/checkouts/<pkg>`) reuse the owning project instead of creating a nested empty `.omv`. Supports `OMV_PROJECT_ROOT` / `OMV_ROOT` and global `--root <path>`.
69
- Fixed `omv dashboard` / `omv campaign list` treating AttackSurfaceList sidecars (`*.surfaces.yaml`) as Campaign.v1 files, which produced hard validation errors after `surfaces propose`.
710
- Confirmed evidence `file:line` checks now accept inclusive ranges (`path/file.go:12-18`) as well as column forms.

README.md

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
# oh-my-vul
44

5-
**Evidence-first vulnerability research for Codex and Claude Code.**
5+
**Evidence-first vulnerability research for Pi, Codex, and Claude Code.**
66

77
Plan the research, trace the evidence, reproduce locally, and turn confirmed findings into review-ready reports.
88

@@ -16,7 +16,7 @@ Plan the research, trace the evidence, reproduce locally, and turn confirmed fin
1616

1717
---
1818

19-
`oh-my-vul` combines agent skills with a local CLI to make open-source vulnerability research repeatable in Codex and Claude Code:
19+
`oh-my-vul` combines agent skills with a local CLI to make open-source vulnerability research repeatable in Pi, Codex, and Claude Code:
2020

2121
- **Start with a clear scope.** Campaigns and attack-surface cards turn a broad target into focused research questions.
2222
- **Keep claims tied to evidence.** Findings record the tested version, source, sink, guards, reproduction, and remaining unknowns.
@@ -26,7 +26,26 @@ Research state stays in a private `.omv/` workspace. The project is designed for
2626

2727
## Quick Start
2828

29-
**Requirements:** [Codex](https://developers.openai.com/codex/) or [Claude Code](https://docs.anthropic.com/en/docs/claude-code), Node.js 22 or later, and Python 3 for bundled Skill helpers. The deterministic report renderer additionally uses its pinned PyYAML dependency. Windows, Linux, and macOS are supported; on Windows, use a modern Windows Terminal or PowerShell for the Ink workspace.
29+
**Requirements:** [Pi](https://pi.dev/), [Codex](https://developers.openai.com/codex/), or [Claude Code](https://docs.anthropic.com/en/docs/claude-code), Node.js 22 or later, and Python 3 for bundled Skill helpers. The deterministic report renderer additionally uses its pinned PyYAML dependency. Windows, Linux, and macOS are supported; on Windows, use a modern Windows Terminal or PowerShell for the Ink workspace.
30+
31+
### Pi
32+
33+
Install the package directly into Pi:
34+
35+
```sh
36+
pi install npm:oh-my-vul
37+
```
38+
39+
Pi discovers all 10 bundled Skills. Invoke the project manager with `/skill:omv`, or call a focused Skill such as `/skill:omv-find` or `/skill:omv-audit`. For the complete local `.omv/` workspace, deterministic validation, and Ink dashboard, install the matching CLI as well:
40+
41+
```sh
42+
npm install --global oh-my-vul@latest
43+
omv start
44+
```
45+
46+
Pi manages the Skills itself, so Pi users should not run `omv setup`. Use `pi install npm:oh-my-vul -l` instead when the package should be enabled only for the current project.
47+
48+
### Codex and Claude Code
3049

3150
Install the CLI and add the skills to Codex:
3251

@@ -55,7 +74,7 @@ Open that project in Codex, then invoke the Skill (or choose it from `/skills`):
5574
$omv
5675
```
5776

58-
Claude Code users invoke `/omv`. The Skill applies the evidence and review gates, shows the active queue, and recommends the next action. From an interactive terminal, bare `omv` opens the Ink research workspace.
77+
Pi users invoke `/skill:omv`; Claude Code users invoke `/omv`. The Skill applies the evidence and review gates, shows the active queue, and recommends the next action. From an interactive terminal, bare `omv` opens the Ink research workspace.
5978

6079
## Interactive Workspace
6180

README.zh-CN.md

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
# oh-my-vul
44

5-
**面向 Codex 与 Claude Code 的证据优先漏洞研究工作台。**
5+
**面向 Pi、Codex 与 Claude Code 的证据优先漏洞研究工作台。**
66

77
从研究范围到报告草稿,每个结论都能回到本地证据。
88

@@ -26,7 +26,26 @@
2626

2727
## 快速开始
2828

29-
**环境要求:** [Codex](https://developers.openai.com/codex/)[Claude Code](https://docs.anthropic.com/en/docs/claude-code)、Node.js 22 或更高版本,以及供内置 Skill 辅助脚本使用的 Python 3。确定性报告渲染器还使用自身固定版本的 PyYAML 依赖。支持 Windows、Linux 和 macOS;Windows 建议使用新版 Windows Terminal 或 PowerShell 运行 Ink 工作台。
29+
**环境要求:** [Pi](https://pi.dev/)[Codex](https://developers.openai.com/codex/)[Claude Code](https://docs.anthropic.com/en/docs/claude-code)、Node.js 22 或更高版本,以及供内置 Skill 辅助脚本使用的 Python 3。确定性报告渲染器还使用自身固定版本的 PyYAML 依赖。支持 Windows、Linux 和 macOS;Windows 建议使用新版 Windows Terminal 或 PowerShell 运行 Ink 工作台。
30+
31+
### Pi
32+
33+
直接把 package 安装到 Pi:
34+
35+
```sh
36+
pi install npm:oh-my-vul
37+
```
38+
39+
Pi 会发现内置的全部 10 个 Skills。使用 `/skill:omv` 打开项目管理入口,也可以直接调用 `/skill:omv-find``/skill:omv-audit` 等专用 Skill。若要使用完整的本地 `.omv/` 工作区、确定性校验和 Ink 工作台,还需要安装配套 CLI:
40+
41+
```sh
42+
npm install --global oh-my-vul@latest
43+
omv start
44+
```
45+
46+
Pi 会自行管理 Skills,因此 Pi 用户不需要运行 `omv setup`。如果只想在当前项目启用,可使用 `pi install npm:oh-my-vul -l`
47+
48+
### Codex 与 Claude Code
3049

3150
全局安装 CLI,并把 Skills 装入 Codex:
3251

@@ -55,7 +74,7 @@ omv start --vuln xss,auth --no-interactive
5574
$omv
5675
```
5776

58-
Claude Code 用户调用 `/omv`。Skill 会自动启用证据与审查门槛,并显示正在处理的 finding 和下一步建议。在交互式终端中直接运行 `omv`,会打开 Ink 研究工作台。
77+
Pi 用户调用 `/skill:omv`Claude Code 用户调用 `/omv`。Skill 会自动启用证据与审查门槛,并显示正在处理的 finding 和下一步建议。在交互式终端中直接运行 `omv`,会打开 Ink 研究工作台。
5978

6079
## 交互式工作台
6180

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
{
22
"name": "oh-my-vul",
3-
"version": "1.0.0",
4-
"description": "Evidence-first vulnerability research skills for Codex and Claude Code",
3+
"version": "1.1.0",
4+
"description": "Evidence-first vulnerability research skills and CLI for Pi, Codex, and Claude Code",
55
"type": "module",
66
"main": "dist/index.js",
77
"types": "dist/index.d.ts",
8+
"pi": {
9+
"skills": [
10+
"./skills"
11+
]
12+
},
813
"exports": {
914
".": {
1015
"types": "./dist/index.d.ts",
@@ -72,6 +77,9 @@
7277
"registry.yaml"
7378
],
7479
"keywords": [
80+
"pi-package",
81+
"pi",
82+
"pi-skill",
7583
"claude-code",
7684
"codex",
7785
"security",
@@ -83,10 +91,10 @@
8391
"author": "bx33661",
8492
"repository": {
8593
"type": "git",
86-
"url": "git+https://github.com/bx33661/oh-my-vul.git",
87-
"homepage": "https://github.com/bx33661/oh-my-vul#readme",
88-
"bugs": "https://github.com/bx33661/oh-my-vul/issues"
94+
"url": "git+https://github.com/bx33661/oh-my-vul.git"
8995
},
96+
"homepage": "https://github.com/bx33661/oh-my-vul#readme",
97+
"bugs": "https://github.com/bx33661/oh-my-vul/issues",
9098
"license": "MIT",
9199
"devDependencies": {
92100
"@types/node": "^25.6.2",

registry.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# Lists all skills in this collection with their invocation, status, and contract bindings.
33

44
name: oh-my-vul
5-
version: "1.0.0"
5+
version: "1.1.0"
66
platform: codex,claude-code
77
updated: "2026-07-11"
88

scripts/check_npm_pack.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,14 @@ def main() -> None:
179179
if not isinstance(exports, dict) or set(exports) != {".", "./package.json"}:
180180
fail("package exports must contain only the root API and package.json")
181181

182+
keywords = package_json.get("keywords")
183+
if not isinstance(keywords, list) or "pi-package" not in keywords:
184+
fail("package keywords must include pi-package for Pi gallery discovery")
185+
186+
pi_manifest = package_json.get("pi")
187+
if not isinstance(pi_manifest, dict) or pi_manifest.get("skills") != ["./skills"]:
188+
fail("package pi.skills must declare the canonical ./skills directory")
189+
182190
package = npm_pack()
183191
files = package.get("files", [])
184192
if not isinstance(files, list):
@@ -189,6 +197,16 @@ def main() -> None:
189197
if missing:
190198
fail(f"missing required npm files: {', '.join(missing)}")
191199

200+
pi_skill_entries = {
201+
path.relative_to(REPO_ROOT).as_posix()
202+
for path in (REPO_ROOT / "skills").glob("*/SKILL.md")
203+
}
204+
missing_pi_skills = sorted(pi_skill_entries - paths)
205+
if missing_pi_skills:
206+
fail(f"missing Pi skill entries: {', '.join(missing_pi_skills)}")
207+
if len(pi_skill_entries) != 10:
208+
fail(f"expected 10 canonical Pi skills, found {len(pi_skill_entries)}")
209+
192210
missing_patterns = sorted(expected_pattern_pack_files() - paths)
193211
if missing_patterns:
194212
fail(f"missing PatternPack npm files: {', '.join(missing_patterns[:12])}")
@@ -226,6 +244,7 @@ def main() -> None:
226244
"version": package.get("version"),
227245
"filename": package.get("filename"),
228246
"files": len(paths),
247+
"piSkills": len(pi_skill_entries),
229248
"size": package.get("size"),
230249
"unpackedSize": package.get("unpackedSize"),
231250
},

skills/omv-find/references/pattern-packs.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ Each pack is a discovery filter plus a source -> sink -> guard checklist. Use it
1414
| `config-loader` | `yaml`, `proto`, `deser`, `auth`, `crypto` | config, yaml, json, dotenv, rc, schema, plugin config | config files, environment maps, CLI overrides, JSON/YAML objects | unsafe loader, deep merge, object hook, secret/key parsing | schema validation, safe loader, key denylist, null-prototype objects, secret handling |
1515
| `media-tool` | `ssrf`, `upload`, `overflow`, `infoleak`, `xxe` | image, svg, pdf, video, thumbnail, metadata, exif | uploaded files, remote media URLs, embedded metadata, SVG/XML | remote fetch, parser decode, thumbnailer shell, XML parser, native bindings | URL allowlist, file magic, parser sandbox, DTD disabled, bounded decode |
1616
| `webhook-client` | `ssrf`, `redirect`, `auth`, `crypto` | webhook, callback, integration, notifier, bot, oauth | user-provided webhook URLs, callback targets, token config | HTTP client, redirect follow, signature verifier, callback redirect | scheme/host allowlist, private-IP block, redirect policy, signature validation |
17-
| `ssrf-filter` | `ssrf`, `redirect` | ssrf, private ip, request filter, filtering agent, ipaddr, metadata | caller URL/options, DNS results, redirects | agent createConnection, fetch agent, socket connect, unix socket | non-unicast block after DNS, metadata/link-local reject, redirect and socketPath policy |
1817
| `upload-handler` | `upload`, `traversal`, `race`, `infoleak` | upload, multipart, avatar, import, attachment, file manager | multipart filenames, content types, temp files, user-supplied paths | extension checks, move/write, public storage, post-process parser | extension allowlist, content sniffing, hash rename, quarantine, atomic move |
1918

2019
## Discovery Rules

skills/omv/SKILL.md

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
---
22
name: omv
3-
description: oh-my-vul local-first vulnerability research project manager. Shows workspace status, next actions, installed omv-* skills, registry info, and delegates .omv findings lifecycle commands. Use when the user types /omv, asks what to do next, or manages local findings.
3+
description: oh-my-vul local-first vulnerability research project manager for Pi, Codex, and Claude Code. Shows workspace status, next actions, installed omv-* skills, registry info, and delegates .omv findings lifecycle commands. Use when the user invokes /skill:omv, $omv, or /omv; asks what to do next; or manages local findings.
44
---
55

66
# omv
77

8-
oh-my-vul local-first vulnerability research project manager for Codex and Claude Code.
8+
oh-my-vul local-first vulnerability research project manager for Pi, Codex, and Claude Code.
9+
10+
Invocation depends on the active platform: Pi uses `/skill:omv [args]`, Codex uses `$omv [args]`, and Claude Code uses `/omv [args]`. The command table below uses `/omv` as shorthand for the active platform's project-manager invocation.
911

1012
**Process first:** For any vulnerability research session (find / audit / report / “what next”), apply `using-omv` discipline — evidence before claims, CLI gates before “confirmed” or “ready to submit”, prefer campaign + attack-surface cards before bulk hypotheses. Do not invent parallel workflows outside `.omv/` + `omv` CLI.
1113

@@ -50,16 +52,16 @@ oh-my-vul local-first vulnerability research project manager for Codex and Claud
5052
/omv help — show this help text
5153
```
5254

53-
The first word after `/omv` is treated as the subcommand. Unknown subcommands show the help text.
55+
The first word after the platform-specific project-manager invocation is treated as the subcommand. Unknown subcommands show the help text.
5456

5557
## Skills in This Collection
5658

5759
| Skill | Invocation | Purpose |
5860
|---|---|---|
59-
| omv-find | `/omv-find` | Find and rank open-source packages worth auditing |
60-
| omv-audit | `/omv-audit` | Deep-audit a candidate finding, prove or disprove the vulnerability |
61-
| omv-repro | `/omv-repro` | Guide local reproduction, fill evidence.observed_result |
62-
| omv-report | `/omv-report` | Generate VulDB/CVE/GHSA/OSV advisory reports |
61+
| omv-find | `/skill:omv-find` on Pi; `$omv-find` on Codex; `/omv-find` on Claude Code | Find and rank open-source packages worth auditing |
62+
| omv-audit | `/skill:omv-audit` on Pi; `$omv-audit` on Codex; `/omv-audit` on Claude Code | Deep-audit a candidate finding, prove or disprove the vulnerability |
63+
| omv-repro | `/skill:omv-repro` on Pi; `$omv-repro` on Codex; `/omv-repro` on Claude Code | Guide local reproduction, fill evidence.observed_result |
64+
| omv-report | `/skill:omv-report` on Pi; `$omv-report` on Codex; `/omv-report` on Claude Code | Generate VulDB/CVE/GHSA/OSV advisory reports |
6365

6466
## Registry
6567

@@ -96,7 +98,7 @@ Use `omv help`, `omv help review`, `omv help findings`, `omv help repro`, or `om
9698
- `/omv restore <id>` -> `omv findings restore <id>`
9799
- `/omv findings ...` -> `omv findings ...`
98100

99-
**If `omv` is not found on PATH**, output: "`omv` is not installed. Run `npm install --global oh-my-vul`, then `omv setup --platform codex` in Codex or `omv setup --platform claude-code` in Claude Code."
101+
**If `omv` is not found on PATH**, output: "`omv` is not installed. Run `npm install --global oh-my-vul`. Pi users already have the Skills and should not run `omv setup`; Codex and Claude Code users should then run `omv setup --platform codex|claude-code` for their platform."
100102

101103
### Subcommand reference
102104

skills/omv/references/registry.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# Lists all skills in this collection with their invocation, status, and contract bindings.
33

44
name: oh-my-vul
5-
version: "1.0.0"
5+
version: "1.1.0"
66
platform: codex,claude-code
77
updated: "2026-07-11"
88

0 commit comments

Comments
 (0)