Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
9730c3a
Refactor
owjs3901 May 20, 2026
c3c0eee
Refactor
owjs3901 May 20, 2026
0db6666
Delete PARALLELIZATION.md
owjs3901 May 20, 2026
7e8df38
Impl svg
owjs3901 May 20, 2026
f6fe72f
implement erd
owjs3901 May 20, 2026
71146ea
Improve performance
owjs3901 May 20, 2026
a8cc233
Improve
owjs3901 May 20, 2026
64365b7
Merge remote-tracking branch 'origin/main' into refactor
owjs3901 May 20, 2026
027c02c
docs: add performance audit reports
owjs3901 May 20, 2026
d75075a
feat(lsp): scaffold vespertide-lsp crate with tower-lsp-server 0.23
owjs3901 May 20, 2026
bcec8f8
chore: add extension placeholder directories for Session B
owjs3901 May 20, 2026
6321aaa
feat(lsp): add DocumentState and tree-sitter parser bootstrap
owjs3901 May 20, 2026
109d7db
feat(lsp): add did_open/did_change/did_close + position mapping + wor…
owjs3901 May 20, 2026
d34d834
feat(lsp): real-time diagnostics via vespertide-planner validation
owjs3901 May 20, 2026
db50e8e
feat(lsp): hover (column + FK preview) and cross-file go-to-definition
owjs3901 May 20, 2026
cde8c86
feat(lsp): context-aware completion (column types, actions, cross-fil…
owjs3901 May 20, 2026
bc61aaa
feat(lsp): drift detection (killer feature) + JSON/YAML formatting
owjs3901 May 20, 2026
d2ef0bc
ci(lsp): cross-compile vespertide-lsp for 5 platforms on lsp-v* tag
owjs3901 May 20, 2026
758adcf
feat(vscode): add VSCode extension for vespertide-lsp
owjs3901 May 20, 2026
f572d33
feat(zed): add Zed extension for vespertide-lsp
owjs3901 May 20, 2026
0585e6e
ci(vscode): platform-specific VSIX release on vscode-v* tag
owjs3901 May 20, 2026
a971e09
docs: add RELEASE.md covering LSP + VSCode + Zed release flow
owjs3901 May 20, 2026
cad5918
test(fuzz): add fuzz_lsp_request panic-safety target
owjs3901 May 20, 2026
d374001
feat(lsp): add deterministic document iteration
owjs3901 May 21, 2026
120b463
fix(lsp): validate schemas with workspace context
owjs3901 May 21, 2026
46fa8c8
fix(lsp): republish cross-file diagnostics
owjs3901 May 21, 2026
a05edb5
feat(lsp): add disk-discovered workspace tables
owjs3901 May 21, 2026
92df16c
feat(lsp): use disk tables for validation and completion
owjs3901 May 21, 2026
fabfa17
impl lsp
owjs3901 May 22, 2026
cb4831c
Add note
owjs3901 May 22, 2026
bd2257b
Fix inlay_hint
owjs3901 May 22, 2026
885f2fb
Impl sementic token
owjs3901 May 22, 2026
15e615d
Implement lsp feature
owjs3901 May 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
34 changes: 34 additions & 0 deletions .cargo/mutants.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# cargo-mutants configuration for vespertide.
# Mutation testing complements unit/property tests by mutating source AST
# and verifying tests FAIL. Survived mutants = test gap.
#
# Run locally:
# cargo install --locked cargo-mutants
# cargo mutants --in-place --timeout-multiplier 3.0 -vV
#
# Run on changed lines only (used by PR CI):
# cargo mutants --in-diff git.diff --in-place

# Skip patterns that produce noise (Debug/Display/From impls, generated boilerplate)
exclude_re = [
"impl Debug",
"impl Display",
"impl From<",
"impl std::error::Error",
"fn fmt\\(",
# RawSql is an opaque escape hatch by design
"MigrationAction::RawSql",
]

# Focus on logic-heavy crates. Exclude:
# - schema-gen: tool, not library
# - macro: proc-macro coverage handled via trybuild
# - exporter: snapshot tests catch most mutations trivially (output diff)
exclude_globs = [
"crates/vespertide-schema-gen/**",
"crates/vespertide-macro/**",
"crates/vespertide-exporter/**",
]

# 3× baseline test time per mutant (handles proptest variance)
timeout_multiplier = 3.0
1 change: 1 addition & 0 deletions .changepacks/changepack_log_py8izYJZIfSolhHmyu236.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"changes":{"crates/vespertide-exporter/Cargo.toml":"Minor","crates/vespertide-planner/Cargo.toml":"Minor","crates/vespertide-query/Cargo.toml":"Minor","crates/vespertide-core/Cargo.toml":"Minor","crates/vespertide-lsp/Cargo.toml":"Minor","crates/vespertide-config/Cargo.toml":"Minor","crates/vespertide-loader/Cargo.toml":"Minor","crates/vespertide/Cargo.toml":"Minor","crates/vespertide-naming/Cargo.toml":"Minor","crates/vespertide-cli/Cargo.toml":"Minor","crates/vespertide-macro/Cargo.toml":"Minor"},"note":"Refactor and Impl lsp","date":"2026-05-22T12:04:07.053304800Z"}
60 changes: 60 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# Dependabot configuration for vespertide.
# https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
#
# Keeps GitHub Actions and Cargo dependencies up to date.
# `changepacks/action@main` is grouped under `ignore` per project policy
# (org-internal action intentionally tracks main).

version: 2
updates:
# GitHub Actions: actions are pinned to major version tags (e.g. `@v6`),
# so minor/patch updates within a major are picked up automatically by the
# runner. Dependabot only proposes MAJOR-version bumps for review.
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
day: "monday"
time: "06:00"
timezone: "Asia/Seoul"
open-pull-requests-limit: 5
groups:
github-actions-major:
applies-to: version-updates
update-types:
- "major"
patterns:
- "*"
ignore:
# Internal action intentionally pinned to main branch.
- dependency-name: "changepacks/action"
# Skip non-major updates: major tags auto-pick patches/minors.
- dependency-name: "*"
update-types: ["version-update:semver-minor", "version-update:semver-patch"]

# Cargo dependencies: weekly minor/patch updates, group by ecosystem.
- package-ecosystem: "cargo"
directory: "/"
schedule:
interval: "weekly"
day: "monday"
time: "06:00"
timezone: "Asia/Seoul"
open-pull-requests-limit: 10
groups:
cargo-patches:
applies-to: version-updates
update-types:
- "patch"
patterns:
- "*"
cargo-minor:
applies-to: version-updates
update-types:
- "minor"
patterns:
- "*"
ignore:
# sea-orm is pinned to RC; manual updates only.
- dependency-name: "sea-orm"
update-types: ["version-update:semver-major"]
218 changes: 182 additions & 36 deletions .github/workflows/CI.yml
Original file line number Diff line number Diff line change
@@ -1,13 +1,20 @@
# AGENTS.md policy: Every `.rs` file must stay ≤ 1000 lines.
#
# GitHub Actions pinning policy: third-party actions use major version tags
# only (e.g. `@v6`, not `@v6.0.2`) so security patches and bug fixes within
# the same major are picked up automatically. Dependabot proposes only
# major bumps (see `.github/dependabot.yml`). The `changepacks/action@main`
# reference is intentionally kept on `main` per project policy.
name: CI

on:
push:
branches:
- main
paths-ignore:
- '**/*.md'
- "**/*.md"
- LICENSE
- '**/*.gitignore'
- "**/*.gitignore"
- .editorconfig
pull_request:
workflow_dispatch:
Expand All @@ -17,52 +24,114 @@ concurrency:
cancel-in-progress: true

jobs:
test:
name: Test
fmt:
name: fmt
runs-on: ubuntu-latest
container:
image: xd009642/tarpaulin:develop-nightly
options: --security-opt seccomp=unconfined
steps:
- uses: actions/checkout@v5
- uses: oven-sh/setup-bun@v2
- uses: actions/checkout@v6
- uses: actions-rust-lang/setup-rust-toolchain@v1
with:
bun-version: latest
components: rustfmt
- name: Check formatting
run: cargo fmt --all -- --check

clippy:
name: clippy
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions-rust-lang/setup-rust-toolchain@v1
- name: Install
uses: dtolnay/rust-toolchain@stable
with:
components: clippy, rustfmt
- name: Build
run: cargo check
components: clippy
- name: Lint
run: cargo clippy --all-targets --all-features -- -D warnings && cargo fmt --check
run: cargo clippy --workspace --all-targets --all-features -- -D warnings

test:
name: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions-rust-lang/setup-rust-toolchain@v1
- name: Test
run: |
# rust coverage issue
echo 'max_width = 100000' > .rustfmt.toml
echo 'tab_spaces = 4' >> .rustfmt.toml
echo 'newline_style = "Unix"' >> .rustfmt.toml
echo 'fn_call_width = 100000' >> .rustfmt.toml
echo 'fn_params_layout = "Compressed"' >> .rustfmt.toml
echo 'chain_width = 100000' >> .rustfmt.toml
echo 'merge_derives = true' >> .rustfmt.toml
echo 'use_small_heuristics = "Default"' >> .rustfmt.toml
cargo fmt
cargo tarpaulin --engine llvm --out Lcov Stdout --workspace --exclude app
- name: Upload to codecov.io
uses: codecov/codecov-action@v5
run: cargo test --workspace --all-features

test-parallelism:
name: Parallelism (RAYON_NUM_THREADS=${{ matrix.threads }})
runs-on: ubuntu-latest
strategy:
matrix:
threads: ["1", "4"]
steps:
- uses: actions/checkout@v6
- uses: actions-rust-lang/setup-rust-toolchain@v1
- name: Test with Rayon thread count
run: cargo test --workspace --all-features --exclude vespertide-fuzz
env:
RAYON_NUM_THREADS: ${{ matrix.threads }}

# SQL validity gates: daemon-free real-engine and parser-level validation.
# - SQLite: in-memory execution via rusqlite (bundled = static link)
# - PG/MySQL/SQLite syntax: sqlparser-rs pure Rust 3-dialect parser
# - PG strict: pg_query = PG's real C parser (FFI, Linux/macOS only)
# No Docker, no daemon, no service container — runs on plain ubuntu-latest.
sql-validity:
name: SQL validity (daemon-free)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions-rust-lang/setup-rust-toolchain@v1
- name: Install build-essential for pg_query (PG C parser)
run: sudo apt-get update && sudo apt-get install -y build-essential libreadline-dev zlib1g-dev flex bison
- name: Run SQLite in-memory exec property test
run: cargo test -p vespertide-query --test sql_sqlite_exec --release
- name: Run sqlparser 3-dialect parse property test
run: cargo test -p vespertide-query --test sql_dialect_parse --release
- name: Run pg_query (real PG parser) property test
run: cargo test -p vespertide-query --test sql_pg_query --release

# cargo-deny enforces license/advisory/multiple-version policy; cargo-semver-checks blocks accidental semver-major API changes.
deny:
name: cargo-deny
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions-rust-lang/setup-rust-toolchain@v1
- uses: EmbarkStudios/cargo-deny-action@v2
with:
token: ${{ secrets.CODECOV_TOKEN }}
fail_ci_if_error: true
files: lcov.info
if: github.ref == 'refs/heads/main'
command: check all

semver-checks:
name: cargo-semver-checks
runs-on: ubuntu-latest
if: github.event_name == 'pull_request'
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- uses: actions-rust-lang/setup-rust-toolchain@v1
- uses: obi1kenobi/cargo-semver-checks-action@v2
with:
# Only check published crates; skip cli (binary) and schema-gen (publish=false)
package: vespertide,vespertide-core,vespertide-config,vespertide-loader,vespertide-naming,vespertide-planner,vespertide-query,vespertide-exporter,vespertide-macro
feature-group: default-features

# publish
changepacks:
name: changepacks
runs-on: ubuntu-latest
needs: test
needs:
- fmt
- clippy
- test
- test-parallelism
- sql-validity
- doc
- schema-drift
- insta-pending
- line-budget
- coverage
- deny
- semver-checks
permissions:
# create pull request comments
pull-requests: write
Expand All @@ -71,10 +140,87 @@ jobs:
# Create brench to create pull request
contents: write
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v6
# changepacks/action@main: project-internal action intentionally tracks main.
- uses: changepacks/action@main
id: changepacks
with:
publish: true
env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}

doc:
name: doc
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions-rust-lang/setup-rust-toolchain@v1
- name: Check docs
run: RUSTDOCFLAGS="-D warnings" cargo doc --no-deps --workspace

schema-drift:
name: schema-drift
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions-rust-lang/setup-rust-toolchain@v1
- name: Regenerate schemas
run: cargo run -p vespertide-schema-gen -- --out _tmp_schemas
- name: Check schema drift
run: git diff --no-index --exit-code -- schemas _tmp_schemas

insta-pending:
name: insta-pending
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions-rust-lang/setup-rust-toolchain@v1
- name: Run exporter snapshots
run: cargo test -p vespertide-exporter
- name: Fail on pending snapshots
run: |
pending=$(find . -name '*.snap.new' -type f -print)
if [ -n "$pending" ]; then
printf '%s\n' "Pending insta snapshots:" "$pending"
exit 1
fi

line-budget:
name: line-budget
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Check Rust line budget
run: sh scripts/check-line-budget.sh

coverage:
name: coverage
runs-on: ubuntu-latest
container:
image: xd009642/tarpaulin:develop-nightly
options: --security-opt seccomp=unconfined
steps:
- uses: actions/checkout@v6
- uses: oven-sh/setup-bun@v2
with:
bun-version: latest
- name: Coverage
run: |
# rust coverage issue
echo 'max_width = 100000' > .rustfmt.toml
echo 'tab_spaces = 4' >> .rustfmt.toml
echo 'newline_style = "Unix"' >> .rustfmt.toml
echo 'fn_call_width = 100000' >> .rustfmt.toml
echo 'fn_params_layout = "Compressed"' >> .rustfmt.toml
echo 'chain_width = 100000' >> .rustfmt.toml
echo 'merge_derives = true' >> .rustfmt.toml
echo 'use_small_heuristics = "Default"' >> .rustfmt.toml
cargo fmt
cargo tarpaulin --engine llvm --out Lcov Stdout --workspace --exclude app
- name: Upload to codecov.io
uses: codecov/codecov-action@v6
with:
token: ${{ secrets.CODECOV_TOKEN }}
fail_ci_if_error: true
files: lcov.info
if: github.ref == 'refs/heads/main'
31 changes: 31 additions & 0 deletions .github/workflows/bench.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
name: benchmarks

on:
pull_request:
paths:
- "crates/**/*.rs"
- "crates/**/benches/**"
- "crates/**/Cargo.toml"
workflow_dispatch:

jobs:
bench:
name: criterion (informational)
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v6

- uses: actions-rust-lang/setup-rust-toolchain@v1

- name: Compile benchmarks
run: cargo bench --workspace --no-run

- name: Run benchmarks (informational)
run: cargo bench --workspace -- --output-format bencher | tee bench-results.txt

- name: Upload results
uses: actions/upload-artifact@v7
with:
name: bench-results
path: bench-results.txt
Loading
Loading