Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
c4bced2
Add multi-language support design doc and implementation checklist
donnfelker Apr 16, 2026
924b18d
feat(lang): Part A1 — language abstraction layer
donnfelker Apr 16, 2026
ee45a41
feat(lang): Part A2 — extract Go analyzer into goanalyzer package
donnfelker Apr 16, 2026
c3c24db
feat(lang): Part A3 — parameterize diff parser with FileFilter
donnfelker Apr 16, 2026
afaad02
feat(lang): Part A4 — route analyzers through language interfaces
donnfelker Apr 16, 2026
2c57941
feat(lang): Part A5 — regression gate; preserve churn score simple-co…
donnfelker Apr 16, 2026
f8d7110
feat(lang): Part B — multi-language orchestration
donnfelker Apr 16, 2026
27c18c8
fix(diff): restore .go detection after Filter refactor
donnfelker Apr 16, 2026
31a561b
feat(rust): C0-C1 scaffold rustanalyzer package with FileFilter
donnfelker Apr 16, 2026
e4e0b1a
feat(rust): C2 — FunctionExtractor via tree-sitter
donnfelker Apr 16, 2026
a3968aa
feat(rust): C3 — cognitive complexity calculator and scorer
donnfelker Apr 16, 2026
281d9e1
feat(rust): C4 — ImportResolver reads Cargo.toml and scans use/mod edges
donnfelker Apr 16, 2026
aad93c4
feat(rust): C5 — AnnotationScanner for mutator-disable annotations
donnfelker Apr 16, 2026
e7fdf4b
feat(rust): C6 — MutantGenerator emits canonical + Rust-specific oper…
donnfelker Apr 16, 2026
2046c0f
feat(rust): C7 — MutantApplier does text-based edits with re-parse gate
donnfelker Apr 16, 2026
8397004
feat(rust): C8 — TestRunner via cargo test with temp-copy isolation
donnfelker Apr 16, 2026
ad32574
feat(rust): C9 — broaden some_to_none beyond return context
donnfelker Apr 16, 2026
4f8ea30
feat(ts): D0-D1 scaffold tsanalyzer package with FileFilter and detector
donnfelker Apr 16, 2026
bb84c6a
feat(ts): D2 — FunctionExtractor tests and .tsx grammar fixture
donnfelker Apr 16, 2026
bceb582
feat(ts): D3 — cognitive complexity calculator and scorer
donnfelker Apr 16, 2026
eac2cd9
feat(ts): D4 — ImportResolver reads package.json and scans imports
donnfelker Apr 16, 2026
5e5cab7
feat(ts): D5 — AnnotationScanner tests
donnfelker Apr 16, 2026
a75df01
feat(ts): D6 — MutantGenerator tests for canonical and TS operators
donnfelker Apr 16, 2026
22991a6
feat(ts): D7 — MutantApplier does text-based edits with re-parse gate
donnfelker Apr 16, 2026
5794411
feat(ts): D8 — TestRunner tests via fake shell command
donnfelker Apr 16, 2026
f3f7502
fix(ts): align @/ alias resolver with ~/ semantics
donnfelker Apr 16, 2026
4a9be41
fix(ts): extend detector prune list to cover framework build dirs
donnfelker Apr 16, 2026
9099793
test(ts): cover bare-form branch_removal and .mjs/.cjs exclusion
donnfelker Apr 16, 2026
dde60c8
fix(rust): count logical ops in if let / while let conditions
donnfelker Apr 16, 2026
501c672
refactor(rust): collapse one-shot child-lookup loops
donnfelker Apr 16, 2026
95f79e0
feat(eval): E1 — mixed-repo end-to-end integration test
donnfelker Apr 16, 2026
9823e66
feat(eval): EVAL-1 harness + EVAL-2 Rust correctness cases
donnfelker Apr 16, 2026
88d0d49
feat(eval): EVAL-3 TypeScript correctness cases
donnfelker Apr 16, 2026
822c050
feat(eval): EVAL-4 cross-cutting multi-language suite
donnfelker Apr 16, 2026
a991fe6
ci: E2 — eval targets + Rust/Node toolchains in CI
donnfelker Apr 16, 2026
1a7ac4a
docs: E3 — README multi-language support
donnfelker Apr 16, 2026
5134b0e
docs: align README TS extensions with analyzer + record multi-lang fo…
donnfelker Apr 16, 2026
4d8ddc9
docs: trim README TS extension list to match analyzer (.ts, .tsx only)
donnfelker Apr 16, 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
56 changes: 56 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,41 @@
go-version: '1.26.1'
cache: true

# Rust toolchain is required by the mutation-flavored Rust evals
# (cargo test is how survived-vs-killed is decided). Without this
# step, the mutation evals t.Skip via exec.LookPath("cargo").
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable

Check warning

Code scanning / CodeQL

Unpinned tag for a non-immutable Action in workflow Medium

Unpinned 3rd party Action 'ci' step
Uses Step
uses 'dtolnay/rust-toolchain' with ref 'stable', not a pinned commit hash
with:
toolchain: stable
components: clippy

- name: Cache cargo registry + git + target
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
internal/lang/rustanalyzer/evaldata/**/target
cmd/diffguard/testdata/mixed-repo/**/target
key: cargo-${{ runner.os }}-${{ hashFiles('**/Cargo.toml', '**/Cargo.lock') }}
restore-keys: |
cargo-${{ runner.os }}-

# Node is required by the TS mutation evals (npm test -> vitest /
# node). Minimum 22.6 so `--experimental-strip-types` is default.
- uses: actions/setup-node@v4
with:
node-version: '22'

- name: Cache npm
uses: actions/cache@v4
with:
path: ~/.npm
key: npm-${{ runner.os }}-${{ hashFiles('**/package.json', '**/package-lock.json') }}
restore-keys: |
npm-${{ runner.os }}-

- name: Build
run: go build ./...

Expand All @@ -30,6 +65,27 @@
- name: Vet
run: go vet ./...

# Dedicated eval passes. These are redundant with `go test ./...`
# above (which runs the same tests when cargo/node are present) but
# we run them separately so a failed eval is attributed to the
# right language subsystem in the CI log.
- name: Eval — Rust (EVAL-2)
env:
CI: "true"
CARGO_INCREMENTAL: "0"
run: make eval-rust

- name: Eval — TypeScript (EVAL-3)
env:
CI: "true"
run: make eval-ts

- name: Eval — Mixed / cross-cutting (EVAL-4 + E1)
env:
CI: "true"
CARGO_INCREMENTAL: "0"
run: make eval-mixed

diffguard:
# Dogfooding: run diffguard's own quality gate against this repo.
# Mutation testing runs at 20% sample rate here as a fast smoke
Expand Down
Loading
Loading