Repository navigation
Open
Description
Is your feature request related to a problem? Please describe.
Spec: docs/design/specs/2026-09-06-leg-2.5-typescript.md (branch docs/leg-2.5-typescript, 6015858; PR pending). Facade decisions: .claude/FACADE_DECISIONS.md. Part of codellm-devkit/.github#55. Ships in 2.0.0-rc.3.
release/2.0 pins codeanalyzer-typescript==0.4.3 (schema 1.0.0). The TypeScript models are the v1 identity-only mirror; TSCodeanalyzer passes --tsc-only (removed at 1.0.0); TSNeo4jBackend queries :Symbol/:CallSite/:CALLS and scopes on _module — zero overlap with the v2 graph. Nothing on the branch can read a 1.2.0 artifact.
Describe the solution you'd like
- G4 lift first: move the language-neutral bounds/paging/validation helpers (
check_*,reject_bare_string,check_selector,scope_paths,resolve_module_key,call_graph_scope,bounded_subgraph,EdgeOrder/edge_page, cursor codec,hop_sort_key,flow_path,slice_resolved,cone_sinks,as_slice_node,module_key_of, theSDG_RELS/VIAtables parameterised onP,module_dottedparameterised on the extension set) fromcldk/analysis/python/backend.py/python/neo4j/reconstruct.pyintocldk/analysis/commons/; Python re-imports; Python's suite unchanged in count and green on the 1.4.1 graph (bolt 7689). - G1 models:
cldk/models/typescript/rewritten as a pydantic mirror of cants'src/schema/schema.tsat 1.2.0 — envelope,TSApplicationwithid/kind/param_in/param_out/artifacts/dependencies/unresolved_imports/entrypoint_report/config_*, unifiedtypes{}bykind,TSCallable{id, span, body, cfg, cdg, ddg, summary, …},TSBodyNode,TSCallEdge{src,dst,prov,weight}; validated against a real 1.2.0analysis.jsonat-a 1..4. - G2 ABC:
TSAnalysisBackendinheritsAnalysisBackend[…]withP="TS",N="TS";TSCodeanalyzerdrops--tsc-only, requests the configured level, reads the v2 envelope. - Neo4j backend on the 1.2.0 vocabulary: every statement re-pointed at the 16 labels / 23 relationship types; prefix scoping with two prefixes (
can://typescript/<app>/,can://javascript/<app>/, TS-3) on every statement;_moduleused nowhere. - G5 probe: required relationship types, the
:Applicationanchor by id,analyzer_versionfloor1.2.0→GraphSchemaMismatchbelow it or for an absent application. - Pin
codeanalyzer-typescript==1.2.0independenciesand[tool.backend-versions]. - Existing accessors green on the live superset graph (bolt 7690): Tier A, the 1.x leaf accessors (G3), the four feat(typescript): the four bulk/projected accessors — parity with Python's #180/#181 surface (#298) #302 bulk accessors,
get_external_symbols; live dual-backend parity for each; the raisingget_entry_point_methods/get_service_entry_point_methodsremoved (replaced in 2.5b). - A multi-application audit for
TSNeo4jBackendin the leg-1.6 shape (class-level and inline statements), with a fake two-application graph carrying no_module. - CHANGELOG
[Unreleased]: pin bump, the refused-graph behaviour, the removed raising accessors.
Describe alternatives you've considered
Not stated in the original issue.
Additional context
Caveats
- The 1.2.0 wheel's compiled binary cannot start its dataflow workers (cants Reachability API: forward reachability (given a source, find all reachable sinks) #171) — analysis still completes, sequentially. Local emits for the reference graph use the source build; the pin is the wheel.
mainstampsanalyzer_version 1.2.0on post-1.2.0 graphs (cants Reachability API: reverse reachability (given a sink, find all sources that reach it) #172); until that is fixed the probe cannot distinguish them. 2.5a's floor is 1.2.0 either way.- Do not touch the query surface (2.5b): addressing, scoping keywords, per-callable pages, slices, paths, entrypoints, artifacts. This item makes TypeScript readable on v2 again with what it already had.
- Port 7687 on the development machine is an ssh tunnel; never a target.
tests/analysis/typescript/test_typescript_neo4j_backend.pyis live-gated onCLDK_TEST_NEO4J_*— check whether it emits before running it against a graph anyone cares about.
Definition of done
- Offline suite ≥ today's count; Python live suite on 7689 unchanged after the lift; TypeScript live suite on 7690 green; both contract tests green;
tests/test_public_surface.pyunchanged for Python. grep -c _module cldk/analysis/typescript/is 0 outside prose.- Attaching
TSNeo4jBackendto a 0.4.3-shaped graph (fake driver) raisesGraphSchemaMismatch. - One PR to
release/2.0, closing this issue.
Metadata
Metadata
Assignees
Labels
No labels
Activity
python-sdk2.0 — a static-analysis front end for humans and agents .github#55rahlk commentedon Sep 6, 2026
Two findings while preparing T3, recorded in the plan:
Both TypeScript live test files write the graph.
tests/analysis/typescript/test_typescript_neo4j_backend.pyandtest_typescript_bulk_parity_live.pypopulate Neo4j out of band (codeanalyzer-typescript --emit neo4jover Bolt) and default tobolt://localhost:7687/neo4j/neo4jwhenCLDK_TEST_NEO4J_*is unset — the same hazard #324 fixed for the Python writer. T3 gates both onCLDK_TEST_NEO4J_WRITE_URI/_WRITE_USER/_WRITE_PASSWORDwith no defaults and a prefix-scoped teardown before any live run.:CanNodeis not the seek label here. Measured on the superset graph (11,085:TSCallable): point lookups label-scan either way (~11 ms); a module-prefix lookup is 2× slower with:CanNode(index range seek over most of the label);any(p IN $prefixes WHERE …)defeats index seeks. Anchor on the specific label, spell the two-prefix scope asORover two bound parameters, and measure:TSBodyNodestatements individually.