@holmes-lab/holmes-kit 0.5.0 → 0.7.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/CHANGELOG.md +65 -0
- package/README.md +15 -9
- package/dist/.build-id +1 -1
- package/dist/holmes/cpg/foundation/cfg.js +487 -4
- package/dist/holmes/cpg/foundation/ddg.js +251 -5
- package/dist/holmes/cpg/foundation/language-matrix.d.ts +17 -0
- package/dist/holmes/cpg/foundation/language-matrix.js +52 -4
- package/dist/holmes/cpg/language-capability.js +15 -3
- package/dist/holmes/cpg/language-parser-walk.js +63 -5
- package/dist/holmes/mcp/handlers.js +40 -28
- package/dist/holmes/rtm/flow-sensitive-taint.js +18 -2
- package/dist/holmes/rtm/rtm-builder.d.ts +6 -14
- package/dist/holmes/rtm/rtm-builder.js +117 -0
- package/dist/holmes/rtm/taint-vocabulary.d.ts +1 -1
- package/dist/holmes/rtm/taint-vocabulary.js +46 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,71 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
<!-- @implements A-SPEC-209 -->
|
|
8
|
+
## [0.7.0] - 2026-09-02
|
|
9
|
+
|
|
10
|
+
GOAL-7langs completes: all six analysis axes (relations, ast, cfg, ddg, cdg, taint) are now
|
|
11
|
+
corpus-validated for all seven official languages — 42 cells, every one a measurement. The
|
|
12
|
+
README's language table becomes a byte-pinned render of the same derivation, so it can no
|
|
13
|
+
longer drift from what the code actually does.
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
|
|
17
|
+
- **Taint for all seven languages** (REQ-524): five vocabularies join the table (selected by
|
|
18
|
+
extension, never unioned), the flow-sensitive lane generalizes from Python-only to every
|
|
19
|
+
language with a CFG, and two measured engine holes close (Java/C# call nodes including
|
|
20
|
+
constructors; Java callee vs receiver). Validated with positive AND negative controls per
|
|
21
|
+
language, then measured over ten corpora: Go/Rust/Java/C# report zero (library code — same
|
|
22
|
+
structural decomposition as before), C++ reports two REAL argv→execv flows in leveldb's test
|
|
23
|
+
harness (verified; benign by intent, exactly what a taint tool should surface).
|
|
24
|
+
- **Imports reach the graph in all seven languages** (REQ-525): extraction is a table row per
|
|
25
|
+
language; resolution is per-language semantics (Go strips the go.mod module prefix and fans
|
|
26
|
+
out to the package directory — with go.mod discovered by walking up from the file; Rust maps
|
|
27
|
+
crate::/super::/self:: and retries once without a trailing item segment; Java/C# resolve by
|
|
28
|
+
UNIQUE path suffix; C++ resolves quoted includes with extension preserved); ambiguity and
|
|
29
|
+
externals resolve to nothing, never to a guess. **Capability moved on measured arrival:
|
|
30
|
+
go 389, rust 64, java 2,688, csharp 316 (measurement overturned the ~0 expectation), cpp 482
|
|
31
|
+
resolved edges.**
|
|
32
|
+
- **The README language table is a render** (REQ-526): a marker block generated from the live
|
|
33
|
+
matrix plus a corpus-evidence column (functions, zero violations, stated limits — C++'s 32.1%
|
|
34
|
+
L1 refusal rate is in the table), byte-pinned by the suite like docs/language-support.md.
|
|
35
|
+
The old hand-written table claimed "Full Support" for every language before it was true.
|
|
36
|
+
|
|
37
|
+
<!-- @implements A-SPEC-209 -->
|
|
38
|
+
## [0.6.0] - 2026-09-02
|
|
39
|
+
|
|
40
|
+
Three more languages earn corpus-validated control- and data-flow: Java, C#, and Rust join
|
|
41
|
+
TypeScript, Python and Go. Six of seven official languages now build CFG/DDG/CDG with zero
|
|
42
|
+
invariant violations over real open-source corpora. Every grade in the matrix is a measurement.
|
|
43
|
+
|
|
44
|
+
### Added
|
|
45
|
+
|
|
46
|
+
- **Java CFG/DDG/CDG** (REQ-520): rides the TS chassis (same probed shapes for if/while/for/do
|
|
47
|
+
and the try clauses) plus the four seams where Java's semantics live: ONE switch node carrying
|
|
48
|
+
two styles (old groups fall through, arrow rules never touch), try-with-resources with resource
|
|
49
|
+
defs, catch parameters inside catch_formal_parameter, and field/method names excluded from
|
|
50
|
+
uses (`this.x = x` reads x once). **Measured over gson+junit4: 8,376/8,376 functions, zero
|
|
51
|
+
refusals, zero violations, 19,818 REACHING_DEF + 7,622 CDG edges.** The corpus caught three
|
|
52
|
+
would-have-shipped defects — named comment nodes, empty bodies (`while (c()) ;` — latent for
|
|
53
|
+
TS too), and Java's wrapperless else that lowered an else-if CONDITION as a statement.
|
|
54
|
+
- **C# CFG/DDG/CDG** (REQ-521): same face as Java, opposite semantics where it hurts — switch
|
|
55
|
+
fallthrough is a compile error (sections isolate), `yield` is the iterator protocol
|
|
56
|
+
(yield return continues, yield break exits), and `#if/#else` arms are ALTERNATIVES lowered as
|
|
57
|
+
branches. **Measured over Newtonsoft.Json+RestSharp: 9,184 functions, zero violations; the
|
|
58
|
+
only refusals are designed (preproc_elif 3, goto 1); 51 files (4.4%) refuse honestly at L1
|
|
59
|
+
where conditional compilation crosses syntax.** One sealed design was corrected mid-slice and
|
|
60
|
+
re-sealed: a declaration pattern binds at the switch HEADER, because a def on the point that
|
|
61
|
+
uses it can never reach.
|
|
62
|
+
- **Rust CFG/DDG/CDG** (REQ-522): control flow is an EXPRESSION in Rust (measured: if 1,170 /
|
|
63
|
+
match 468 / for 307 all inside expression_statement), which creates a new failure mode — a
|
|
64
|
+
zero-violation but HOLLOW graph. The corpus gate therefore demands branch edges exist, not
|
|
65
|
+
just that invariants hold. Match is exhaustive (no phantom escape — rustc enforces it), `?` is
|
|
66
|
+
an implicit early return (both paths leave the point), bare `loop` is infinite, let-else's
|
|
67
|
+
else arm diverges, and pattern bindings follow the lowercase-initial convention (documented
|
|
68
|
+
heuristic). **Measured over ripgrep+serde: 5,247/5,247 functions, zero refusals, zero
|
|
69
|
+
violations, 4,786 branch edges (avg 5.6 blocks/function), 13,647 REACHING_DEF + 6,808 CDG
|
|
70
|
+
edges.**
|
|
71
|
+
|
|
7
72
|
<!-- @implements A-SPEC-209 -->
|
|
8
73
|
## [0.5.0] - 2026-09-02
|
|
9
74
|
|
package/README.md
CHANGED
|
@@ -217,15 +217,21 @@ flowchart LR
|
|
|
217
217
|
Holmes-Kit embeds native AST & Code Property Graph (D-CPG) analyzers to track causal relationships and anchor implementations across diverse technology stacks.
|
|
218
218
|
|
|
219
219
|
### 💻 Supported Programming Languages
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
|
223
|
-
|
|
|
224
|
-
| **
|
|
225
|
-
| **
|
|
226
|
-
| **
|
|
227
|
-
| **
|
|
228
|
-
| **
|
|
220
|
+
|
|
221
|
+
<!-- language-matrix:begin -->
|
|
222
|
+
| Language | relations | ast | cfg | ddg | cdg | taint | Corpus evidence |
|
|
223
|
+
| :--- | :---: | :---: | :---: | :---: | :---: | :---: | :--- |
|
|
224
|
+
| **TypeScript / JavaScript** | ● | ● | ● | ● | ● | ● | 10,929 functions (this repository), zero invariant violations |
|
|
225
|
+
| **Python** | ● | ● | ● | ● | ● | ● | 1,209 functions (jarvis), zero invariant violations |
|
|
226
|
+
| **C#** | ● | ● | ● | ● | ● | ● | 9,184 functions (Newtonsoft.Json + RestSharp), zero invariant violations — 4.4% of files refuse at L1 (preprocessor across syntax) |
|
|
227
|
+
| **Java** | ● | ● | ● | ● | ● | ● | 8,376 functions (gson + junit4), zero invariant violations |
|
|
228
|
+
| **Go** | ● | ● | ● | ● | ● | ● | 2,637 functions (gin + cobra), zero invariant violations |
|
|
229
|
+
| **Rust** | ● | ● | ● | ● | ● | ● | 5,247 functions (ripgrep + serde), zero invariant violations |
|
|
230
|
+
| **C++** | ● | ● | ● | ● | ● | ● | 1,762 functions (nlohmann + fmt + leveldb), zero invariant violations — 32.1% of template/macro-heavy files refuse at L1 — layers above speak only for what parses |
|
|
231
|
+
|
|
232
|
+
Every grade is a measurement, not a goal: a cell moves only when a real corpus proves it.
|
|
233
|
+
Full per-cell bases (and every stated limit) live in [docs/language-support.md](docs/language-support.md), which is generated from the same derivation and byte-pinned by the suite — as is this table.
|
|
234
|
+
<!-- language-matrix:end -->
|
|
229
235
|
|
|
230
236
|
### 🖥️ Supported Operating Systems & Runtimes
|
|
231
237
|
| OS / Platform | Architecture | Status | Notes |
|
package/dist/.build-id
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
7cb32c4-mtjifuwa
|