Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
230 commits
Select commit Hold shift + click to select a range
f6a6d59
Omit None-code callables from Python get_method_bodies (#305)
rahlk Aug 3, 2026
30b3fa1
Fix dead release test gate: use outcome, not conclusion (#306)
rahlk Aug 3, 2026
76849a7
docs: spec for the python-sdk canonical schema v2 migration (#309)
rahlk Sep 3, 2026
048c244
docs: spec for a 2.0 static-analysis front end, superseding the v2 mo…
rahlk Sep 3, 2026
97da8f9
docs: implementation plan for CLDK 2.0 leg 1 (Python)
rahlk Sep 4, 2026
55a46e6
docs: record that the Neo4j vocabulary drift is not TypeScript-only
rahlk Sep 4, 2026
6a90fef
feat!: drop C analysis support
rahlk Sep 4, 2026
4ede190
feat(python): pin codeanalyzer-python 1.4.0 and export the v2 models
rahlk Sep 4, 2026
01569c3
fix(python): use codeanalyzer.options.EmitTarget, not the removed Out…
rahlk Sep 4, 2026
8a2232c
feat(python): probe the attached graph's vocabulary on connect
rahlk Sep 4, 2026
7261464
fix(python): stop widening __init__'s neo4j_uri contract, add a drive…
rahlk Sep 4, 2026
82ea448
fix(python): query the vocabulary codeanalyzer-python 1.4.0 actually …
rahlk Sep 4, 2026
12dba04
fix(python): unwrap the v2 analysis envelope, migrate the renamed con…
rahlk Sep 4, 2026
2e5ffda
fix(python): update mock builders to the 1.4.0 model shape, no assert…
rahlk Sep 4, 2026
a72de57
fix(python): repair _build_call_graph for real, fix decorator spellin…
rahlk Sep 4, 2026
6352dc3
fix(python): restore type=CALL_DEP on the local call graph
rahlk Sep 4, 2026
bb1683a
refactor: extract the query shape into a generic AnalysisBackend
rahlk Sep 4, 2026
1f6c9fd
fix: drop duplicate abstract-method-completeness test from task 5
rahlk Sep 4, 2026
b3b015b
feat(python): locate() and locate_many() — WIP, review findings outst…
rahlk Sep 4, 2026
6544994
refactor(python): take locate off the generic ABC, drop the inert col…
rahlk Sep 4, 2026
95c32e7
feat(python): populate LocateResult.node with the innermost body node
rahlk Sep 4, 2026
b686c0a
fix(python): stop fabricating module source over Neo4j, say why it is…
rahlk Sep 4, 2026
3bb9359
test(python): cover locate on the local backend and pin backend parity
rahlk Sep 4, 2026
4855005
fix(python): break equal-width locate ties the same way on both backends
rahlk Sep 4, 2026
27299f0
feat(python): add LocateResult.node_id, declare get_source on the bac…
rahlk Sep 4, 2026
43751ad
feat(python): implement get_source on the local backend
rahlk Sep 4, 2026
f14cbef
feat(python): implement get_source on the Neo4j backend
rahlk Sep 4, 2026
12f520d
feat(python): expose get_source on the PythonAnalysis facade
rahlk Sep 4, 2026
ccbccae
test(python): cover get_source and the #301 get_method_bodies omissio…
rahlk Sep 4, 2026
c2c051b
feat(python): expose the repository-artifact layer
rahlk Sep 4, 2026
491a945
test(python): cover the repository-artifact layer and backend parity
rahlk Sep 4, 2026
113ad13
feat(python): get_entrypoints()
rahlk Sep 4, 2026
98801fe
fix(python): read Package.ecosystem off the graph instead of hardcodi…
rahlk Sep 4, 2026
848d3d0
feat(python): expose entrypoint coverage and class-level entrypoints
rahlk Sep 4, 2026
d14d185
feat(python): resolve config reads to callables, expose unresolved re…
rahlk Sep 4, 2026
ab90d70
feat(python): resolve external call targets through external_symbols
rahlk Sep 5, 2026
17efafd
test(python): cover external symbol resolution on both backends
rahlk Sep 5, 2026
8a06c26
feat(python): probe PY_RESOLVES_TO presence on the Neo4j backend
rahlk Sep 5, 2026
7028bd1
docs(python): warn that get_method/_all_methods_in_class/_constructor…
rahlk Sep 5, 2026
a6e64b1
test(python): end-to-end suite against a live Neo4j graph
rahlk Sep 5, 2026
9edc812
fix(python): resolve PY_CALLS targets landing on :PyExternal to their…
rahlk Sep 5, 2026
0523998
docs(python): cross-link entrypoint accessor name collision
rahlk Sep 5, 2026
08a9d16
chore: remove two stale C-support leftovers
rahlk Sep 5, 2026
ecc35fa
feat(python): promote has_resolution_edges to the public API
rahlk Sep 5, 2026
fce8a2e
test(python): guard against a bare None PY_CALLS target in the fake C…
rahlk Sep 5, 2026
a69e6be
test(python): add the missing spec DoD test_body_not_truncated
rahlk Sep 5, 2026
554dcc3
docs(python): correct the resolution-probe rationale re: analysis level
rahlk Sep 5, 2026
198904e
docs: write up the leg-1 CHANGELOG entry properly
rahlk Sep 5, 2026
7ce3cad
docs: spec leg 1.5 — bounded queries and dataflow access
rahlk Sep 5, 2026
7da2170
docs: fold the addressing layer into leg 1.5 as step 3
rahlk Sep 5, 2026
86b545a
docs: explain why describe() is a second call, not a flag
rahlk Sep 5, 2026
3c56ffa
docs: implementation plan for leg 1.5
rahlk Sep 5, 2026
8a8fa33
docs: add Task 0 — delete the fifteen accessors that only raise
rahlk Sep 5, 2026
99b3267
docs: agent-facing API reference
rahlk Sep 5, 2026
5a2e53e
feat!: remove the fifteen Python accessors that only raise
rahlk Sep 5, 2026
8a2a8e0
docs: note PyCallsite's pending convergence and the prov mislabel
rahlk Sep 5, 2026
a5bce02
perf(python): collapse the Neo4j N+1 fan-out
rahlk Sep 5, 2026
c956ecb
fix(python): scope the per-parent child fetches to the application
rahlk Sep 5, 2026
b8b9d98
perf(python): scoping keywords on the enumerating accessors
rahlk Sep 5, 2026
9fce1a8
fix(python): a scoped query must tell "absent" from "empty"
rahlk Sep 5, 2026
b9760fb
test(python): scope regression for every signature-keyed child collec…
rahlk Sep 5, 2026
80df6cc
docs: current measured costs and the scoping keywords
rahlk Sep 5, 2026
7f0c156
docs(spec): correct §4.3 and record the unresolvable-selector ruling
rahlk Sep 5, 2026
6581320
fix(python): validate a root against the callable inventory, not the …
rahlk Sep 5, 2026
a47fabb
test(python): make the emitting parity module impossible to run by ac…
rahlk Sep 5, 2026
3f54b69
docs(python): correct the parity claims the last round shipped
rahlk Sep 5, 2026
0b1e2e1
fix(python): make node ids join to the graph (#320)
rahlk Sep 5, 2026
ca5ed1f
test(python): purge what the emitter created, not what its wipe reach…
rahlk Sep 5, 2026
693ad11
fix(python): give callable overviews the repo-relative path (#320)
rahlk Sep 5, 2026
f97a780
feat(python): name-based addressing, no URIs in the surface
rahlk Sep 5, 2026
36e3c05
fix(python): make analysis_level real, and address values honestly
rahlk Sep 5, 2026
22ba5c2
feat(python): per-callable control and data flow graphs
rahlk Sep 5, 2026
29cfb02
feat(python): page the per-callable graphs
rahlk Sep 5, 2026
efdb490
feat(python): backward and forward slicing over the v2 SDG
rahlk Sep 6, 2026
e1c28c8
fix(python): bound slices by default, at the depth the data chose
rahlk Sep 6, 2026
0472345
feat(python): paths, mixed flow queries, and hydration
rahlk Sep 6, 2026
f25d5a7
fix(python): name the argument that missed, and take in_module the wa…
rahlk Sep 6, 2026
1e51e0b
fix(python): unbounded flow defaults, one completeness protocol, hop-…
rahlk Sep 6, 2026
b511b43
docs(python): describe what leg 1.5 actually landed
rahlk Sep 6, 2026
3b66778
docs: spec for the CLDK 2.0 agent-facing query facade (#318)
rahlk Sep 6, 2026
d4a855a
feat(python): leg 1 — Python facade onto codeanalyzer-python 1.4.0 (#…
rahlk Sep 6, 2026
b5a18b4
feat(python): leg 1.5 — bounded queries, addressing, and dataflow (#323)
rahlk Sep 6, 2026
33943c2
fix(java): retire source-mode witnesses and refuse a None cache dir (…
rahlk Sep 6, 2026
ff0d00c
fix(java): retire source-mode witnesses and refuse a None cache dir (…
rahlk Sep 6, 2026
d455ba5
docs(spec,plan): leg 1.6 — scope by can:// id prefix, retire _module …
rahlk Sep 6, 2026
8b708d9
chore(python): pin codeanalyzer-python 1.4.1 and pin the body-node id…
rahlk Sep 6, 2026
9d09ede
docs(plan): leg 1.6 Task 4 — read the entrypoint report 1.4.1 project…
rahlk Sep 6, 2026
6b829cf
fix(python): scope every Neo4j statement on the can:// id prefix, not…
rahlk Sep 6, 2026
d7ce15c
fix(python): derive a callable's module key from its can:// id
rahlk Sep 6, 2026
2d9f791
fix(python): read the entrypoint report the 1.4.1 graph carries
rahlk Sep 6, 2026
292bc43
fix(python): seek locate through :PyCanNode on 1.4.1 graphs; read the…
rahlk Sep 6, 2026
0a7e5c0
test(python): time the query with coverage paused; record closure siz…
rahlk Sep 6, 2026
51a3415
docs(python): record id-prefix scoping, the 1.4.1 pin, and the graph …
rahlk Sep 6, 2026
b46cc91
fix(python): seek locate and resolve through :PySymbol on every serve…
rahlk Sep 6, 2026
e86b6a0
test(python): pause coverage around the timed tests with a marker tha…
rahlk Sep 6, 2026
eec105c
fix(python): reload the module keys once before calling an unknown mo…
rahlk Sep 6, 2026
63b19ae
test(python): audit every inline Cypher statement, and scope every ar…
rahlk Sep 6, 2026
068da62
feat(python): leg 1.6 — scope by can:// id prefix, retire _module, pi…
rahlk Sep 6, 2026
e712ecd
chore(release): 2.0.0-rc.2
rahlk Sep 6, 2026
98dc942
chore(release): 2.0.0-rc.2 (#331)
rahlk Sep 6, 2026
901cdac
ci(release): point codeanalyzer-python at the uv-installed interpreter
rahlk Sep 6, 2026
a1b7b3a
ci(release): point codeanalyzer-python at the uv-installed interprete…
rahlk Sep 6, 2026
6015858
docs(spec): leg 2.5 — TypeScript to Python's leg-1.6 maturity
rahlk Sep 6, 2026
a9359c8
docs: spec leg 2.5 — TypeScript to Python's leg-1.6 maturity (#334)
rahlk Sep 6, 2026
63e70fa
refactor(commons): lift the language-neutral bounds, paging and key h…
rahlk Sep 6, 2026
943b934
docs(plan): leg 2.5a — tasks 0-4; T0 recorded as done; TS-5..TS-11 fr…
rahlk Sep 6, 2026
ccf384a
feat(typescript): v2 models mirroring codeanalyzer-typescript 1.2.0
rahlk Sep 6, 2026
14ffb0b
docs(plan): leg 2.5a — T1 as done; synthesized_callables keying and t…
rahlk Sep 6, 2026
bf187c4
feat(typescript): inherit the generic backend ABC and drive codeanaly…
rahlk Sep 6, 2026
54d2d14
ci(release): bundle the pinned codeanalyzer-java jar, not releases/la…
rahlk Sep 6, 2026
fca671f
docs: spec leg 3 — Java to Python's leg-1.6 maturity (#338)
rahlk Sep 6, 2026
35b400f
fix(typescript): address Task 2 review
rahlk Sep 6, 2026
7d1c70a
docs(typescript): record the per-label seek measurements and the writ…
rahlk Sep 6, 2026
c794c57
feat(typescript): Neo4j backend on the codeanalyzer-typescript 1.2.0 …
rahlk Sep 6, 2026
f85926f
fix(typescript): address Task 3 review
rahlk Sep 6, 2026
536ed55
refactor(commons): lift _semver and the artifact reconstructors
rahlk Sep 6, 2026
cd10133
docs(typescript): record the schema-v2 migration and the 1.2.0 pin
rahlk Sep 6, 2026
8240493
docs(typescript): tick Task 2 and correct the plan's scope-predicate …
rahlk Sep 6, 2026
0170f67
fix(typescript): address the leg-2.5a review — populate the graph-bac…
rahlk Sep 6, 2026
f34af3f
docs(typescript): implementation plan for leg 2.5b — the query surface
rahlk Sep 6, 2026
173c5e7
refactor(commons): language-neutral BodyRef and Span; pin codeanalyze…
rahlk Sep 6, 2026
ea73c0a
feat(typescript): addressing surface — locate, resolve, source, describe
rahlk Sep 6, 2026
86c4e93
ci(release): build the release body from install + assets, not the ch…
rahlk Sep 6, 2026
7b7a05f
feat(typescript): per-callable graphs, slices, reachability and flow …
rahlk Sep 6, 2026
2240c98
ci: label pull requests from their conventional-commit title
rahlk Sep 6, 2026
6ab7abc
docs: fix the logo on PyPI — raw URL, and the variant that reads on w…
rahlk Sep 6, 2026
49df63e
feat(typescript): entrypoints and the artifact layer on the facade; r…
rahlk Sep 7, 2026
72b6206
fix(typescript): scope path interiors, align the miss messages, and c…
rahlk Sep 7, 2026
3c6b2e2
fix(python): a per-callable graph must contain its self-loops
rahlk Sep 7, 2026
17e2bb5
test(typescript): assert what the Neo4j projection answers, not what …
rahlk Sep 7, 2026
53ccad7
test: name the write-gated modules a run skipped
rahlk Sep 7, 2026
ce71e5f
ci(release): bundle the pinned codeanalyzer-java jar, not releases/la…
rahlk Sep 6, 2026
b9a1da9
docs: spec leg 3 — Java to Python's leg-1.6 maturity (#338)
rahlk Sep 6, 2026
22ab47c
docs(java): implementation plan for leg 3a — Java on schema v2
rahlk Sep 6, 2026
d765aa3
test(java): codeanalyzer-java 3.0.1 fixtures for daytrader8 at L1 and L4
rahlk Sep 6, 2026
d9c8768
test(java): point the Java suites at the 3.0.1 fixtures, retire the 2…
rahlk Sep 6, 2026
f8dbe0a
test(java): store the 3.0.1 fixtures gzip-compressed
rahlk Sep 6, 2026
9542a9f
feat(java): v2 models mirroring codeanalyzer-java 3.0.1, v1 field nam…
rahlk Sep 6, 2026
3129af5
fix(java): address Task 1 review
rahlk Sep 6, 2026
fe11692
feat(java): inherit the generic backend ABC, drive codeanalyzer-java …
rahlk Sep 6, 2026
758e127
feat(java): Neo4j backend on the codeanalyzer-java 3.0.1 vocabulary, …
rahlk Sep 6, 2026
b03354e
fix(java): qualify local-class names by their declaring callable, hon…
rahlk Sep 6, 2026
781684c
docs(java): record the schema-v2 migration, the 3.0.1 floor and the s…
rahlk Sep 6, 2026
cb9001e
feat(java): drive the analyzer through the codeanalyzer-java wheel an…
rahlk Sep 6, 2026
ce141f4
fix(java): report the analyzer's own L3/L4 degradation instead of ret…
rahlk Sep 6, 2026
f800805
fix(java): answer get_test_methods off the graph, repair the changelo…
rahlk Sep 6, 2026
49b4199
docs: one release-notes block for the three legs
rahlk Sep 7, 2026
155887f
docs(java): implementation plan for leg 3b — the query surface
rahlk Sep 6, 2026
e394f81
feat(java): the addressing vocabulary — package-derived dotted names …
rahlk Sep 7, 2026
67a55a5
docs(java): record how the shared resolver reconciles with leg 2.5b
rahlk Sep 7, 2026
345b673
fix(java): "supplied none" is not "derive it", and an ambiguity advic…
rahlk Sep 7, 2026
be32b7f
docs(java): record that a4's signature spellings are a pruning artifact
rahlk Sep 7, 2026
af7efd4
feat(java): addressing — locate, resolve, source, describe
rahlk Sep 7, 2026
655c596
feat(java): per-callable graphs, slices, reachability and flow predic…
rahlk Sep 7, 2026
275aec1
feat(java): entrypoints, artifacts and leaf accessors; record the que…
rahlk Sep 7, 2026
368452a
fix(java): a located call site says what it resolves to over Neo4j too
rahlk Sep 7, 2026
8493b6c
test(java): the fake Cypher engine binds a WHERE to the OPTIONAL MATC…
rahlk Sep 7, 2026
3389637
fix(java): J-6's implicit callables refuse a graph and a value, not a…
rahlk Sep 7, 2026
16bbbdf
fix(java): scope the interior of the two variable-length SDG walks
rahlk Sep 7, 2026
d654e0b
fix(java): a formal_in ref is answered from the parameter list, not t…
rahlk Sep 7, 2026
982bd57
fix(java): a graph that homed no external answers {}, not 'never asked'
rahlk Sep 7, 2026
6482232
fix(java): the port probe counts only an edge whose target is a node
rahlk Sep 7, 2026
5de1df3
fix(commons): a bodyless locate() result is refused in its own words
rahlk Sep 7, 2026
eddae40
fix(commons): 'Narrow it with by naming ...' is not a sentence
rahlk Sep 7, 2026
369a3e3
fix(commons): reaches(x, x) answers the cycle question it is advertis…
rahlk Sep 7, 2026
92476bd
docs(java): a signature's parameter tail is not erased, in the models…
rahlk Sep 7, 2026
d69fc28
docs: name the real helper and the real body-node count
rahlk Sep 7, 2026
eb954f7
docs(java): get_method_bodies returns 1,117, and omits only implicit …
rahlk Sep 7, 2026
6fd1fcd
docs(java): the a4 caveat's evidence was measured with the walk J-8 r…
rahlk Sep 7, 2026
eab53f7
docs(java): three "arrives in 3b" forward references, shipped inside 3b
rahlk Sep 7, 2026
19d7822
docs(commons): the ambiguity advice changed for all three languages
rahlk Sep 7, 2026
7eaff2f
docs(java): say that get_config_readers is [] for every key
rahlk Sep 7, 2026
5eff68b
docs(java): three statements to four is an extra round trip
rahlk Sep 7, 2026
d07ad8d
docs(java): J-3 erratum — the tail separates overloads, not types
rahlk Sep 7, 2026
90f9a4d
docs(java): two facts this leg established and did not write down
rahlk Sep 7, 2026
aac9ea3
docs: cite TypeScript's own measurement for the port-lattice claim
rahlk Sep 7, 2026
8e04705
docs: rewrap the paragraph the raiser note ran into
rahlk Sep 7, 2026
72aa9d2
docs(java): name the label a JBodyNode actually carries beside its own
rahlk Sep 7, 2026
9885042
test(python): compare the same analysis, then tolerate only what the …
rahlk Sep 7, 2026
dfc44a1
fix(neo4j): scope the reachability walk's last node, and stop scoping…
rahlk Sep 7, 2026
df36a1d
test(neo4j): teach the scope audit what a quantified hop binds
rahlk Sep 7, 2026
b6551b8
feat(java): take up codeanalyzer-java 3.0.3, and the four value acces…
rahlk Sep 7, 2026
17740d7
docs(java): say that the interprocedural value verbs answer, and what…
rahlk Sep 7, 2026
5ae8716
test(java): re-emit the reference graph at 3.0.3 and assert the lift …
rahlk Sep 7, 2026
969bbe3
test: one spelling per test variable, and a retired one fails the run
rahlk Sep 7, 2026
7dfeba5
Merge pull request #342 from codellm-devkit/feat/issue-335-ts-schema-v2
rahlk Sep 7, 2026
8a1f789
Merge pull request #357 from codellm-devkit/feat/issue-343-ts-query-s…
rahlk Sep 7, 2026
8bb93ed
Merge remote-tracking branch 'origin/release/2.0' into feat/issue-311…
rahlk Sep 7, 2026
b2c1d90
Merge branch 'feat/issue-311-java-query-surface' into fix/issue-356-r…
rahlk Sep 7, 2026
4c4fdff
Merge branch 'fix/issue-356-reaches-termination' into feat/issue-354-…
rahlk Sep 7, 2026
9af6168
Merge pull request #358 from codellm-devkit/feat/issue-311-java-query…
rahlk Sep 7, 2026
8e72265
Merge pull request #364 from codellm-devkit/fix/issue-356-reaches-ter…
rahlk Sep 7, 2026
2b38dac
Merge pull request #365 from codellm-devkit/feat/issue-354-codeanalyz…
rahlk Sep 7, 2026
d9c5eb7
Merge remote-tracking branch 'origin/release/2.0' into fix/issue-349-…
rahlk Sep 7, 2026
ade490e
Merge pull request #353 from codellm-devkit/fix/issue-349-self-loop-e…
rahlk Sep 7, 2026
5377452
feat(java): the six deferred v1 accessors answer, on both backends
rahlk Sep 7, 2026
cdac4d0
test(java): the six v1 accessors, offline and against the reference g…
rahlk Sep 7, 2026
61b92ce
Merge remote-tracking branch 'origin/release/2.0' into feat/issue-366…
rahlk Sep 7, 2026
322f8c0
Merge pull request #367 from codellm-devkit/feat/issue-366-java-v1-ac…
rahlk Sep 7, 2026
b20f582
Merge pull request #348 from codellm-devkit/fix/release-notes-shape
rahlk Sep 7, 2026
bf521eb
feat(typescript): take up codeanalyzer-typescript 1.4.0's binding layer
rahlk Sep 7, 2026
962c20d
feat(java): take up codeanalyzer-java 3.1.0 — config-read tiers and t…
rahlk Sep 7, 2026
32d7ea7
feat(typescript): move the pin to 1.5.0 and take its UTF-8 spans
rahlk Sep 7, 2026
c2a2e73
test(java): re-emit the reference graph with 3.1.0, and record what t…
rahlk Sep 8, 2026
c38bb52
Merge pull request #370 from codellm-devkit/feat/issue-368-cants-140
rahlk Sep 8, 2026
de7f2da
Merge remote-tracking branch 'origin/release/2.0' into feat/issue-369…
rahlk Sep 8, 2026
9325591
Merge pull request #371 from codellm-devkit/feat/issue-369-canj-310
rahlk Sep 8, 2026
c9ff5e6
chore(release): 2.0.0-rc.3
rahlk Sep 8, 2026
7a0e77c
Merge pull request #372 from codellm-devkit/chore/release-2.0.0-rc.3
rahlk Sep 8, 2026
74ebba8
test(java): establish "no build tool on PATH" instead of assuming it
rahlk Sep 8, 2026
0e586b3
Merge pull request #373 from codellm-devkit/chore/release-2.0.0-rc.3
rahlk Sep 8, 2026
4fdd427
fix(java): raise the Neo4j floor to codeanalyzer-java 3.1.0
rahlk Sep 8, 2026
a231e6a
feat(id)!: read can://<app>/<lang>/... on all three backends
rahlk Sep 8, 2026
85d21f9
docs: state the new floors and the two prefixes each backend carries
rahlk Sep 8, 2026
b22b3f0
docs: a consumer skill for the CLDK query surface
rahlk Sep 8, 2026
2ffab0a
fix(java): the Neo4j floor is 3.1.1, not 3.1.0
rahlk Sep 8, 2026
ac769aa
test: record the new generation's measurements, and restore the parit…
rahlk Sep 8, 2026
28bdde3
Merge pull request #375 from codellm-devkit/fix/java-graph-floor-3.1.0
rahlk Sep 8, 2026
37158e0
Merge remote-tracking branch 'origin/release/2.0' into feat/issue-376…
rahlk Sep 8, 2026
2130f04
Merge pull request #378 from codellm-devkit/feat/issue-376-app-outermost
rahlk Sep 8, 2026
c3043cb
chore(release): 2.0.0-rc.4
rahlk Sep 8, 2026
af133c8
Merge pull request #379 from codellm-devkit/chore/release-2.0.0-rc.4
rahlk Sep 8, 2026
5e8e581
feat: take up codeanalyzer-python 1.5.1, java 3.1.2 and typescript 1.5.3
rahlk Sep 9, 2026
c5df93e
refactor(models)!: relax the schema-v2 mirrors from extra="forbid" to…
rahlk Sep 9, 2026
5414c03
Merge pull request #385 from codellm-devkit/chore/issue-384-analyzer-…
rahlk Sep 10, 2026
96c0a7b
Merge pull request #387 from codellm-devkit/chore/issue-386-relax-mod…
rahlk Sep 10, 2026
55b9c59
chore(release): 2.0.0-rc.5
rahlk Sep 10, 2026
26f2bd8
Merge pull request #388 from codellm-devkit/chore/release-2.0.0-rc.5
rahlk Sep 10, 2026
99035e4
docs(spec): java 3.2.0 text model — the Neo4j projection catches up t…
rahlk Sep 10, 2026
51bdb2e
feat(java): consume codeanalyzer-java 3.2.0's text model in the Neo4j…
rahlk Sep 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions .github/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Configures GitHub's auto-generated release notes — the "What's Changed" section
# appended by `generate_release_notes` in .github/workflows/release.yml. Merged PRs
# are grouped under these emoji headings by label, matching the sibling analyzer
# repositories so a reader sees one shape across the org.
changelog:
exclude:
authors:
- dependabot
- github-actions
categories:
# Order matters: a PR lands in the FIRST category whose label it carries, so a
# breaking fix must be seen as breaking before it is seen as a fix.
- title: 🚨 Breaking Changes
labels: [breaking]
- title: 🚀 Features
labels: [enhancement, kind/feature]
- title: 🐛 Fixes
labels: [bug, fix]
- title: ♻️ Refactoring
labels: [refactoring]
- title: ⚡️ Performance
labels: [performance]
- title: 📚 Documentation
labels: [documentation, doc]
- title: 🚦 Tests
labels: [test]
- title: 🛠 Other Changes
labels: ["*"]
51 changes: 51 additions & 0 deletions .github/workflows/pr-label.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
name: Label pull requests

# The release notes group merged PRs by label (.github/release.yml). Every PR in this
# repository has historically been unlabelled, so without this every entry would land in
# the catch-all "Other Changes" heading and a breaking change would read like a chore.
# Titles here follow conventional commits already, so the label is derivable rather than
# something a human has to remember.

on:
pull_request_target:
types: [opened, edited, reopened, synchronize]

permissions:
pull-requests: write

jobs:
label:
runs-on: ubuntu-latest
steps:
- name: Apply a label from the conventional-commit prefix
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TITLE: ${{ github.event.pull_request.title }}
NUMBER: ${{ github.event.pull_request.number }}
REPO: ${{ github.repository }}
run: |
set -euo pipefail
# A "!" before the colon marks a breaking change in conventional commits
# (feat(python)!: ...). That wins over the type, because a breaking fix is
# first of all breaking.
if printf '%s' "$TITLE" | grep -qE '^[a-z]+(\([^)]*\))?!:'; then
label=breaking
else
type=$(printf '%s' "$TITLE" | sed -nE 's/^([a-z]+)(\([^)]*\))?:.*/\1/p')
case "$type" in
feat) label=enhancement ;;
fix) label=fix ;;
perf) label=performance ;;
refactor) label=refactoring ;;
docs) label=documentation ;;
test) label=test ;;
ci|build|chore) label=other ;;
*) label="" ;;
esac
fi
if [ -z "$label" ]; then
echo "::notice::'$TITLE' has no conventional-commit type; leaving it unlabelled (it will appear under Other Changes)."
exit 0
fi
echo "Labelling #$NUMBER as '$label'."
gh pr edit "$NUMBER" --repo "$REPO" --add-label "$label"
112 changes: 67 additions & 45 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ jobs:
- name: Check out code
uses: actions/checkout@v4

# Load-bearing for **Maven**, not for the analyzer. The analyzer jar and the JVM it runs
# on come from the `codeanalyzer-java` wheel (#339), but codeanalyzer-java's own auto-build
# shells out to `mvn`, which needs a JDK on PATH; without one the Java e2e degrades to a
# declared-only call graph and CI goes green on a partial answer. Do not delete this step.
- name: Set up GraalVM CE Java 11
uses: graalvm/setup-graalvm@v1
with:
Expand All @@ -39,62 +43,35 @@ jobs:
- name: Install Python package dependencies
run: uv sync --all-groups --frozen

# codeanalyzer-python provisions a virtualenv for the project it analyses and
# discovers a base interpreter for it (SYSTEM_PYTHON, else PATH/pyenv/conda/asdf).
# A uv-managed interpreter is on none of those on a runner, so every test that
# runs the real analyzer errored at setup (release run 34023739548). Point it
# at the interpreter uv just installed -- the override the analyzer documents.
- name: Point codeanalyzer-python at the analysis interpreter
run: echo "SYSTEM_PYTHON=$(uv python find 3.11)" >> "$GITHUB_ENV"

- name: Run Tests
id: test
# continue-on-error is deliberate: without it a red suite fails the job
# immediately and the tag-deletion step below never runs. It must be paired
# with `outcome` (not `conclusion`) in that step — see the comment there.
continue-on-error: true
run: uv run make test

- name: Delete tag on failure
if: steps.test.conclusion == 'failure'
# MUST be `outcome`, not `conclusion`: continue-on-error rewrites `conclusion`
# to `success`, so `steps.test.conclusion == 'failure'` is never true and this
# step never fires. `outcome` preserves the step's real result.
if: steps.test.outcome == 'failure'
run: |
echo "Tests failed. Deleting tag ${GITHUB_REF#refs/tags/}..."
git push --delete origin ${GITHUB_REF#refs/tags/}
exit 1

- name: Inject the latest Code Analyzer JAR
run: |
# The release has multiple .jar assets (the versioned codeanalyzer-<v>.jar and an
# unversioned codeanalyzer.jar) — select only the versioned one so $CODE_ANALYZER_URL
# is a single URL.
CODE_ANALYZER_URL=$(curl -s https://api.github.com/repos/codellm-devkit/codeanalyzer-java/releases/latest | jq -r '.assets[] | select(.name | test("^codeanalyzer-[0-9].*\\.jar$")) | .browser_download_url')
echo "Downloading: $CODE_ANALYZER_URL"
wget -q "$CODE_ANALYZER_URL"
mkdir -p ${{ github.workspace }}/cldk/analysis/java/codeanalyzer/jar/
mv codeanalyzer-*.jar ${{ github.workspace }}/cldk/analysis/java/codeanalyzer/jar/

- name: Build Package
run: uv build

- name: Verify the codeanalyzer JAR is bundled
# Guard against the hatchling/.gitignore regression (issue #284): a jarless wheel
# installs fine but fails at runtime with "codeanalyzer jar not found". Fail the
# release here rather than publish a broken artifact to PyPI.
#
# The listing is captured before grepping: piping `tar tzf` (which decompresses the
# whole 32MB sdist) straight into `grep -q` lets grep close the pipe on first match,
# SIGPIPE-killing tar and — under `pipefail` — reporting a false "missing JAR".
run: |
set -euo pipefail
jar_re='codeanalyzer/jar/codeanalyzer-[0-9][^/]*\.jar$'
fail=0
for f in dist/*.whl dist/*.tar.gz; do
case "$f" in
*.whl) listing=$(unzip -l "$f") ;;
*.tar.gz) listing=$(tar tzf "$f") ;;
esac
if grep -qE "$jar_re" <<<"$listing"; then
echo " ✓ $f"
else
echo "::error::$f is missing the codeanalyzer JAR"
grep -i '\.jar' <<<"$listing" || echo " (no .jar entries at all)"
fail=1
fi
done
if [ "$fail" -ne 0 ]; then
echo "Refusing to publish a jarless release."; exit 1
fi
echo "codeanalyzer JAR present in wheel and sdist ✓"

- name: Extract release notes from CHANGELOG.md
id: notes
# Source the release body from the hand-written CHANGELOG.md section for this tag —
Expand All @@ -120,13 +97,58 @@ jobs:
} >> "$GITHUB_OUTPUT"
echo "Release notes for $version:"; echo "$notes"

# The release body is install one-liners plus a download table; the categorized
# "What's Changed" (merged PRs grouped under emoji headings via .github/release.yml)
# is appended by generate_release_notes below. The hand-written CHANGELOG section
# stays the ANNOUNCEMENT's seed rather than the release body: a changelog entry
# explains a change to a maintainer, a release body tells a user what to install.
# Indented code blocks avoid backticks inside the heredoc.
- name: Compose release notes header (install + download)
run: |
set -euo pipefail
REPO="codellm-devkit/python-sdk"
TAG="${GITHUB_REF#refs/tags/}" # e.g. v2.0.0-rc.2
VERSION="${TAG#v}" # 2.0.0-rc.2
# PyPI normalizes 2.0.0-rc.2 to 2.0.0rc2, and the built artifacts carry the
# normalized spelling, so the install line and the asset links must use it.
# Done with sed rather than packaging.version: this runs on the runner's bare
# python3, which is not the uv-managed environment the tests use.
PV=$(printf '%s' "$VERSION" \
| sed -E 's/-?alpha\.?([0-9]+)/a\1/; s/-?beta\.?([0-9]+)/b\1/; s/-(rc|a|b)\.?([0-9]+)/\1\2/')
BASE="/${REPO}/releases/download/${TAG}"
PRE=""
case "$PV" in *rc*|*a*|*b*) PRE="--pre " ;; esac
cat > "$RUNNER_TEMP/RELEASE_BODY.md" <<EOF
## Install cldk ${TAG}

PyPI:

pip install ${PRE}cldk==${PV}

With the read-only Neo4j backend:

pip install ${PRE}'cldk[neo4j]==${PV}'

## Download

| File | Description |
| --- | --- |
| [cldk-${PV}-py3-none-any.whl](${BASE}/cldk-${PV}-py3-none-any.whl) | Python wheel |
| [cldk-${PV}.tar.gz](${BASE}/cldk-${PV}.tar.gz) | Source distribution |
EOF
echo "----- composed header -----"; cat "$RUNNER_TEMP/RELEASE_BODY.md"

- name: Publish Release on GitHub
uses: softprops/action-gh-release@v2
with:
files: dist/*
body: ${{ steps.notes.outputs.notes }}
# Auto-open a repo-level Discussion linked to this release, seeded with
# the same notes. Requires Discussions enabled and this category to exist.
body_path: ${{ runner.temp }}/RELEASE_BODY.md
generate_release_notes: true # categorized "What's Changed"; see .github/release.yml
# An rc tag is a candidate, not the repository's latest release.
prerelease: ${{ contains(github.ref_name, '-rc') }}
# Auto-open a repo-level Discussion linked to this release, seeded with this
# body. Requires Discussions enabled and this category to exist. The prose
# announcement is curated afterwards (see CLAUDE.md).
discussion_category_name: Announcements
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Expand Down
11 changes: 5 additions & 6 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
.mtj.tmp/

# Package Files #
*.jar
*.war
*.nar
*.ear
Expand Down Expand Up @@ -53,11 +52,11 @@ scratch*
*.json
!devcontainer.json

# Blessed TS unit-test fixture: hand-built from a sample app whose source (incl. src/external.ts)
# was never committed, so it cannot be regenerated by running codeanalyzer-typescript again. The
# bulk-accessor tests assert exact-set constants (signature counts, ownerless sets) against this
# exact file -- losing it breaks the suite for every fresh clone (#298).
!tests/resources/typescript/analysis_json/slim/analysis.json
# Blessed TS unit-test fixtures: analysis.json at each level, generated by the pinned
# codeanalyzer-typescript from tests/resources/typescript/application (see the README there), and
# the sample app's own manifests, which the analyzer's artifact layer reads.
!tests/resources/typescript/analysis_json/v2/*/analysis.json
!tests/resources/typescript/application/*.json


# Python compiled files and env
Expand Down
Loading