You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+1Lines changed: 1 addition & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,6 +4,7 @@
4
4
5
5
- Split the `omv` CLI dispatcher (`omv.ts`) into one module per command under `commands/`, collapsing 12 duplicated error handlers into one.
6
6
- Wired three commands that were validated and advertised but previously unreachable: `omv repro init`, `omv report artifacts`, and `omv findings doctor`. They now dispatch to the existing domain logic (`initReproArtifacts`, `checkReportArtifacts`, `doctorFinding`).
7
+
-`omv-find` now excludes packages that already exist in `.omv/findings/` or `.omv/archive/findings/`; pass `--include-known` to override. Added a behavior eval + golden output for local dedup.
@@ -54,19 +55,26 @@ Load `references/research-radar.md` only when the user asks for creative/radar/p
54
55
- Use the current date to compute freshness.
55
56
- Repositories with no default-branch commit in the last 12 months are stale unless the user asks for abandoned targets.
56
57
57
-
2.**Select maturity lane**
58
+
2.**Exclude local findings (dedup)**
59
+
- Read `.omv/index.json` in the workspace root. If it exists, collect all `findings[].id` entries regardless of status (`candidate`, `confirmed`, `blocked`) or `archived` flag.
60
+
- Also scan `.omv/findings/*.yaml` and `.omv/archive/findings/*.yaml` — extract `package.registry_name` and `package.ecosystem` from each file.
61
+
- Build an exclusion set of `(ecosystem, registry_name)` pairs.
62
+
- During candidate discovery (step 4), silently skip any package whose `(ecosystem, registry_name)` matches the exclusion set. Do not mention excluded packages in the output unless the user passes `--include-known`.
63
+
- If `.omv/index.json` does not exist or is empty, proceed normally with no exclusions.
5.**Scan source risk** — see `## Source File Discovery` for how to locate files before fetching.
86
+
6.**Scan source risk** — see `## Source File Discovery` for how to locate files before fetching.
79
87
- Inspect 2-5 relevant source files per surviving candidate.
80
88
- Build a concise source -> sink -> guard note.
81
89
- Keyword hits alone are low confidence.
82
90
- High-ranked projects need at least one exact file/function path or link.
83
91
- For radar requests, run only bounded passive diff checks: at most 3 recent commits/releases and 5 changed file names per candidate, then stop or mark `diff_signal: 未确认`.
84
92
- Check duplicate risk through passive public advisory/release/issue sources. Mark likely duplicate only when package, vulnerability class, affected behavior, sink, and version context strongly match.
85
93
86
-
6.**Score and filter**
94
+
7.**Score and filter**
87
95
- Score out of 100 using `references/scoring.md`.
88
96
- If `--vuln` is set, at least 70% of returned projects must be relevant to that class.
89
97
- If a narrow ecosystem/vulnerability combination has too few strong candidates, say so and return fewer results instead of padding.
@@ -92,7 +100,7 @@ Load `references/research-radar.md` only when the user asks for creative/radar/p
92
100
- Add concise audit-readiness notes for high-ranked candidates: entry file/function, local test or harness idea, expected guard, and blocker.
93
101
- Use sanitized examples in explanations unless the user supplied a real target as the audit subject.
94
102
95
-
7.**Output**
103
+
8.**Output**
96
104
- Use the table and follow-up sections in `references/output-contract.md`.
97
105
- Sort by score descending.
98
106
- Include data freshness, sources used, and uncertainty.
| 8 | synthetic-unzip-node | npm |https://github.com/example/synthetic-unzip-node| npmjs.com/package/synthetic-unzip-node | 30 | 2025-09 | GitHub estimate: 1k LOC | zip entry name | source entry.name -> sink writeFile in extract/unzip.js -> guard basename-only check | Zip Slip | extract/unzip.js | 49/100 |
11
+
12
+
**审计建议**
13
+
14
+
- synthetic-zip-stream: entry lib/extract.js#writeStream; local test feeds a zip fixture with `../` and absolute path entries, then asserts the resolved output path stays inside the target dir.
15
+
- synthetic-archive-guard: entry src/io.js#saveEntry; compare the order of normalize() vs the base-prefix check with a traversal fixture; confirm guard runs before the write.
16
+
- synthetic-tar-entry: entry extract.js#unpack; trace whether sanitize() runs before path join; add a unit case with a tar entry containing `../../`.
17
+
18
+
**数据新鲜度与限制**
19
+
20
+
验证日期: 2026-06-18. Sources used: sanitized fixture registry/source metadata and local source snippets. 星数与维护时间为 sanitized 测试数据,非真实抓取。`未确认` 字段单独列出,未从记忆推断。
0 commit comments