Provider model
AnalysisProvider { id, version, analyze(snapshot): ProjectModel } produces independently extracted base/head models. Core computes changes and evaluates clauses. No dynamic plugin discovery or external SDK exists.
| Kind | Supported observation | Boundaries |
|---|---|---|
| symbol | Named declarations, methods/accessors, top-level identifier variables | Whole declaration fingerprints; not behavioral equivalence |
| import | Written import/export specifier or literal dynamic import/require | Exact syntax; does not resolve identity |
| call-site | One fact per call: printed callee, lexical owner and the call's own text | Presence, not reachability or execution; nested calls and callback bodies are not part of the text |
| test-definition | Direct imported Vitest/Jest test/it, literal name, inline callback | No config selection, globals, namespaces or test.each; skip/todo excluded |
| dependency | TypeScript-resolved local imports/reexports and transitive local paths | Root tsconfig aliases supported; type-only path classification; external packages only direct written names |
| resolved-call | Direct bound top-level local function or variable-initialized function target | Imports/reexports resolve; typed callbacks, nested/anonymous functions, methods, dynamic dispatch and external calls remain unsupported |
| api | Explicitly typed exported function signatures, interfaces and type aliases | Body changes permitted for functions; classes/variables/inferred functions unsupported; no full compatibility checker |
API function signatures require explicit parameter and return annotations. Changes to a referenced named type may leave a function signature unchanged: preserve that type separately. This predicate compares the extracted surface exactly; it does not establish transitive API or behavioral compatibility. Type/interface declarations compare normalized AST structure.
The provider parses .ts, .tsx, .mts, .cts, .js, .jsx, .mjs, .cjs, including declarations. Source is analyzed as one isolated project using the root tsconfig's compiler options. Missing config extensions, nested tsconfig projects and project references emit global resolution/API diagnostics. It inventories all source files rather than using tsconfig include/exclude as an analysis boundary. Target dependencies and standard library types are not loaded. Run the target's compiler separately.
Literal static imports use TypeScript module resolution over snapshot files; relative and configured alias failures are unknown. Bare package specifiers can be represented as external:<specifier> but package aliases, exports conditions and dependency internals are not proven. Transitive paths are module-level paths; they are not symbol-level tree-shaking or runtime reachability. Dynamic import/require prevents proving dependency absence in affected paths.
A diagnostic's capability/file limits negative or missing predicates; global config failures also invalidate positive resolved observations. Unsupported calls and exports remain visible as nonblocking review diagnostics, while relevant verification clauses can return UNKNOWN. Parsing failures emit no facts for that file. Symlinks/submodules are opaque, never followed. Unsupported frameworks/languages appear in inventory but have no semantic facts.
Facts include source provenance, provider/version and subject. Call-site and resolved-call facts are individual occurrences. Their identity is the owner, the callee, the call's own normalized text and an ordinal among identical calls in that owner, never a line number. A call that only moves is unchanged. An edited call pairs its removed and added occurrence into one changed observation. Other kinds aggregate fingerprints with multiplicity. Reexports retain the exporting file as selector identity and the declaration's actual source as provenance. Moves/renames are remove/add. Tests cover aliasing, reexports, type-only paths, callbacks, config failure and explicit signature changes as well as original syntax extraction.