Skip to content

Commit 21ae235

Browse files
committed
Build local-first findings manager CLI
1 parent b2252de commit 21ae235

23 files changed

Lines changed: 1856 additions & 60 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ omv findings validate demo-traversal
4444
<!-- omv:skills:start -->
4545
| Skill | Command | Category | Purpose |
4646
|---|---|---|---|
47-
| `omv` | `/omv` | manager | Collection manager — lists skills, shows registry status |
47+
| `omv` | `/omv` | manager | Local-first project manager — shows workspace status, active finding next actions, archive state, and installed skills |
4848
| `omv-find` | `/omv-find` | research | Find and rank open-source packages worth auditing for passive CVE research |
4949
| `omv-audit` | `/omv-audit` | audit | Deep-audit a candidate finding — prove or disprove the vulnerability, fill Evidence.v1 fields for omv-report |
5050
| `omv-repro` | `/omv-repro` | audit | Guide local reproduction of a finding — walk through execution, record observed_result, confirm or block |

registry.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ skills:
1212
path: skills/omv
1313
invocation: /omv
1414
status: stable
15-
description: Collection manager — lists skills, shows registry status
15+
description: Local-first project manager — shows workspace status, active finding next actions, archive state, and installed skills
1616
produces: []
1717
consumes: []
1818

scripts/release_check.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
SYNC_SCRIPT = REPO_ROOT / "scripts" / "sync_skill_assets.py"
1919
SYNC_METADATA_SCRIPT = REPO_ROOT / "scripts" / "sync_metadata.py"
2020
STABLE_EVAL_CHECKS = [
21+
("skills/omv/scripts/check_output.py", "0", "skills/omv/evals/golden/next-workflow.md"),
22+
("skills/omv/scripts/check_output.py", "1", "skills/omv/evals/golden/archive-delegation.md"),
2123
("skills/omv-audit/scripts/check_output.py", "0", "skills/omv-audit/evals/golden/incomplete-observed-result.md"),
2224
("skills/omv-audit/scripts/check_output.py", "1", "skills/omv-audit/evals/golden/duplicate-blocked.md"),
2325
("skills/omv-audit/scripts/check_output.py", "2", "skills/omv-audit/evals/golden/confirmed-complete.md"),

skills/omv-audit/SKILL.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,22 @@ Stay in passive research mode: read public source code only. Do not send request
7272
omv findings validate <id>
7373
```
7474

75+
然后运行或建议:
76+
77+
```bash
78+
omv findings workflow
79+
```
80+
81+
Use the CLI result for lifecycle handoff:
82+
83+
- If the finding remains `candidate` because only `evidence.observed_result` is missing, tell the user to run `/omv-repro <id>`.
84+
- If the finding is `confirmed` and validation returns OK, tell the user to run `/omv-report <id>`.
85+
- If the finding is `blocked`, tell the user to review blockers and optionally run `omv findings archive <id> --reason blocked`.
86+
7587
## Deterministic Helpers
7688

7789
- `omv findings validate <id>` — 校验字段完整性,输出 readiness 分数
7890
- `omv findings promote <id> --status confirmed|blocked` — 更新 status 字段
91+
- `omv findings workflow` — 显示 active findings 的下一步动作
7992
- `python3 shared/scripts/resolve_source_path.py --ecosystem npm --pkg <name>` — 获取源文件 raw URL
8093
- `python3 shared/scripts/collect_metadata.py --repo <github-url>` — 获取仓库元数据

skills/omv-find/SKILL.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ For narrow requests, use `rg` inside the relevant reference to read only the nee
8181
- Sort by score descending.
8282
- Include data freshness, sources used, and uncertainty.
8383
- If the user asks to pass a confirmed finding to `omv-report`, create or output a `.omv/findings/<id>.yaml` Evidence.v1 handoff structured per `contracts/evidence.v1.yaml`. Do not emit a handoff packet for ordinary unconfirmed target lists.
84+
- When any `.omv/findings/<id>.yaml` candidate is created or updated, end by telling the user to run `omv findings workflow` or `/omv next` to choose the next audit target.
8485

8586
## Source File Discovery
8687

@@ -128,6 +129,7 @@ When a user asks to continue from a confirmed or blocked finding, use the Eviden
128129
2. If workspace file tools are available, run or suggest `omv findings init <id> --status candidate|confirmed|blocked`, then fill the YAML fields from verified evidence only.
129130
3. If file tools are not available, output a fenced YAML block titled `Save as .omv/findings/<id>.yaml`.
130131
4. Run or suggest `omv findings validate <id>` after filling the file.
132+
5. Run or suggest `omv findings workflow` after validation so the candidate appears in the local-first active queue.
131133

132134
Use `status: confirmed` only when tested version, source, sink, guard, local reproducer, and observed result are known. Use `status: candidate` for promising but unproven research and `status: blocked` when the missing evidence or duplicate risk should stop report generation.
133135

skills/omv-report/SKILL.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,20 @@ Use the validation result to choose output mode:
5757
- `status: candidate`: produce only triage notes or a draft outline clearly marked not ready for submission.
5858
- `status: confirmed`: proceed only if required evidence is present and readiness is at least 75/100; include validation warnings in the pre-submission checklist.
5959

60+
After producing a submission-ready report for a confirmed finding, suggest removing it from the active local queue:
61+
62+
```bash
63+
omv findings archive <id> --reason reported
64+
```
65+
66+
If the report was written under `.omv/reports/<id>/`, the archive command records those artifact paths in archive metadata. For a stricter local gate, use:
67+
68+
```bash
69+
omv findings archive <id> --reason reported --strict
70+
```
71+
72+
Do not archive automatically unless the user asks; archiving is project-management state, not part of Evidence.v1 validation.
73+
6074
---
6175

6276
## Severity

skills/omv-repro/SKILL.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,20 @@ Stay in passive research mode: do not execute any commands yourself. Guide the u
6464
omv findings validate <id>
6565
```
6666

67+
然后运行或建议:
68+
69+
```bash
70+
omv findings workflow
71+
```
72+
73+
Use the CLI result for lifecycle handoff:
74+
75+
- If reproduction confirms the finding and validation returns OK, tell the user to run `/omv-report <id>`.
76+
- If reproduction cannot continue and the finding is `blocked`, tell the user to review blockers and optionally run `omv findings archive <id> --reason not-reproducible`.
77+
- If validation still fails because audit fields are missing, tell the user to return to `/omv-audit <id>`.
78+
6779
## Deterministic Helpers
6880

6981
- `omv findings validate <id>` — 校验字段完整性,输出 readiness 分数
7082
- `omv findings promote <id> --status confirmed|blocked` — 更新 status 字段
83+
- `omv findings workflow` — 显示 active findings 的下一步动作

skills/omv/SKILL.md

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,29 @@
11
---
22
name: omv
3-
description: oh-my-vul collection manager. Lists installed omv-* skills, shows registry info, and displays version/status of the oh-my-vul skill collection. Use when the user types /omv, asks what oh-my-vul skills are available, or wants to see the collection status.
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.
44
---
55

66
# omv
77

8-
oh-my-vul collection manager for Claude Code.
8+
oh-my-vul local-first vulnerability research project manager for Claude Code.
99

1010
## Commands
1111

1212
```text
1313
/omv list — list all installed omv-* skills with one-line descriptions
14-
/omv status — show registry version, last updated, skill count
14+
/omv dashboard — show workspace, active workflow queue, and recent activity
15+
/omv status — show local .omv workspace status (delegates to omv CLI)
16+
/omv log — show local workspace activity log (delegates to omv CLI)
17+
/omv next — show active findings and recommended next actions
1518
/omv audit <id> — deep-audit a candidate finding (delegates to omv-audit skill)
1619
/omv repro <id> — guide local reproduction of a finding (delegates to omv-repro skill)
20+
/omv archive <id> --reason <reason>
21+
— archive an inactive finding (delegates to omv CLI)
22+
/omv restore <id> — restore an archived finding (delegates to omv CLI)
1723
/omv findings list — list .omv/findings evidence files (delegates to omv CLI)
24+
/omv findings workflow — show lifecycle next actions (delegates to omv CLI)
25+
/omv findings show <id> — show one finding's validation state and next action
26+
/omv findings open <id> — print one finding YAML path for editing
1827
/omv findings init <id> — create a finding template (delegates to omv CLI)
1928
/omv findings validate [id] — validate one or all findings (delegates to omv CLI)
2029
/omv findings promote <id> — update finding status (delegates to omv CLI)
@@ -38,29 +47,48 @@ Collection metadata lives in `references/registry.yaml`. Read it to show current
3847

3948
## State Directory
4049

41-
`.omv/` at the repository root stores findings and context snapshots. It is gitignored. Use `/omv-find` and `/omv-report` to create and read finding files under `.omv/findings/`.
50+
`.omv/` at the repository root stores findings, archive metadata, and the rebuildable local workspace index. It is private local research state and should be gitignored. Active findings live under `.omv/findings/`; inactive findings live under `.omv/archive/findings/`.
4251

43-
## omv findings — CLI Delegation
52+
## CLI Delegation
4453

45-
When the user invokes any `omv findings` subcommand, **run it as a shell command via `Bash` and display its output. Do not implement the behavior manually** (do not `mkdir`, do not write YAML directly).
54+
When the user invokes workspace, lifecycle, archive, or restore commands, **run the matching shell command via `Bash` and display its output. Do not implement the behavior manually** (do not `mkdir`, do not move files, do not write YAML directly).
4655

4756
| Invocation | Run this shell command |
4857
|---|---|
58+
| `/omv dashboard` | `omv dashboard` |
59+
| `/omv status` | `omv workspace status` |
60+
| `/omv log` | `omv workspace log` |
61+
| `/omv next` | `omv findings workflow` |
62+
| `/omv archive <id> --reason <reason>` | `omv findings archive <id> --reason <reason>` |
63+
| `/omv restore <id>` | `omv findings restore <id>` |
4964
| `/omv findings list` | `omv findings list` |
65+
| `/omv findings workflow` | `omv findings workflow` |
66+
| `/omv findings show <id>` | `omv findings show <id>` |
67+
| `/omv findings open <id>` | `omv findings open <id>` |
5068
| `/omv findings init <id>` | `omv findings init <id>` |
5169
| `/omv findings init <id> --status confirmed` | `omv findings init <id> --status confirmed` |
5270
| `/omv findings validate` | `omv findings validate` |
5371
| `/omv findings validate <id>` | `omv findings validate <id>` |
5472
| `/omv findings promote <id> --status <s>` | `omv findings promote <id> --status <s>` |
73+
| `/omv findings archive list` | `omv findings archive list` |
5574

5675
**If `omv` is not found on PATH**, output: "`omv` is not installed. Run: `npx oh-my-vul setup`"
5776

5877
### Subcommand reference
5978

79+
- **dashboard** — prints workspace status, active workflow queue, and recent activity in one view.
80+
- **workspace status** — prints workspace path, active/archive counts, status counts, and privacy warnings.
81+
- **workspace log** — prints the local activity trail for workspace init, finding init, promotion, archive, and restore.
6082
- **init `<id>`** — creates `.omv/findings/<id>.yaml` from the Evidence.v1 template; default `--status candidate`. If file exists, CLI errors — suggest `--force`.
6183
- **list** — prints ID / STATUS / READY / PACKAGE / VULNERABILITY table for every `.yaml` in `.omv/findings/`.
84+
- **workflow** — prints active findings sorted by priority with NEXT ACTION recommendations such as `/omv-audit`, `/omv-repro`, `/omv-report`, promotion, or archive.
85+
- **show `<id>`** — prints one finding's package, vulnerability, validation errors/warnings, missing fields, and next action. Use `--archived` to inspect archived findings.
86+
- **open `<id>`** — prints the Evidence.v1 YAML path and next action so the user can edit or inspect the local file.
6287
- **validate `[id|path]`** — checks required Evidence.v1 fields; exits non-zero on errors. No arg = validate whole ledger.
6388
- **promote `<id|path> --status <s>`** — updates the `status` field and re-validates. Valid statuses: `candidate`, `confirmed`, `blocked`.
89+
- **archive `<id> --reason <reason>`** — moves a finding to `.omv/archive/findings/` and removes it from active workflow views. For `--reason reported`, confirmed findings are checked for report artifacts under `.omv/reports/<id>/`; use `--strict` to block archive when those artifacts are missing.
90+
- **archive list** — lists archived findings and archive reasons.
91+
- **restore `<id>`** — moves an archived finding back to `.omv/findings/`.
6492

6593
## Workflow Overview
6694

@@ -77,6 +105,9 @@ When the user invokes any `omv findings` subcommand, **run it as a shell command
77105
updates .omv/findings/<id>.yaml (status: confirmed | blocked)
78106
79107
/omv-report → reads confirmed finding, generates VulDB/CVE/GHSA/OSV report
108+
109+
archive → omv findings archive <id> --reason reported
80110
```
81111

82112
Each finding uses one of three Evidence.v1 statuses: `candidate`, `confirmed`, or `blocked`.
113+
Use `omv dashboard`, `omv findings workflow`, or `/omv next` as the canonical active queue view after each stage. When the CLI prints a priority value, follow the highest-priority row first unless the user names a specific finding.

skills/omv/evals/evals.json

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
{
2+
"skill_name": "omv",
3+
"evals": [
4+
{
5+
"id": 0,
6+
"prompt": "/omv next",
7+
"expected_output": "The agent delegates next-action discovery to the CLI workflow dashboard.",
8+
"files": [
9+
"evals/golden/next-workflow.md"
10+
],
11+
"assertions": [
12+
{
13+
"type": "delegates_next_to_cli",
14+
"text": "next command must run omv findings workflow"
15+
}
16+
]
17+
},
18+
{
19+
"id": 1,
20+
"prompt": "/omv archive demo --reason reported",
21+
"expected_output": "The agent delegates archive requests to the CLI and does not move files manually.",
22+
"files": [
23+
"evals/golden/archive-delegation.md"
24+
],
25+
"assertions": [
26+
{
27+
"type": "delegates_archive_to_cli",
28+
"text": "archive command must run omv findings archive with reason"
29+
}
30+
]
31+
}
32+
]
33+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
Running:
2+
3+
```bash
4+
omv findings archive demo --reason reported
5+
```
6+
7+
I will display the CLI result. I will not move `.omv/findings/demo.yaml` manually or edit workspace index files directly.

0 commit comments

Comments
 (0)