Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
dc7a506
workstream B M0: Rust daemon skeleton, contracts, hallucination check
claude Apr 16, 2026
ee78ab2
workstreams A + H + E + I scaffold; fixtures and CI land
claude Apr 16, 2026
035b476
cross-file arity, git churn, persistent cache, local-module whitelist
claude Apr 17, 2026
f2df148
debounced watcher, CodeLens, treemap drill-down, LLM summaries
claude Apr 17, 2026
36992bd
readme: reflect M1–M6 progress; add App state-machine webview tests
claude Apr 17, 2026
b92d4e2
diagnostics panel: j/k/Enter/. keyboard nav (spec §7.4)
claude Apr 17, 2026
3e303f5
semgrep runner, scan latency budget, fast-path for non-git workspaces
claude Apr 17, 2026
37d4d78
docs: per-workstream handoff guide
claude Apr 17, 2026
e51f68e
workstream F v1.1: WebGL / WebGPU binding check
claude Apr 17, 2026
90a40a0
fix(tests): isolate fixture scans so git discovery doesn't hit outer …
claude Apr 17, 2026
df00149
v1.1: Rust language support end-to-end
claude Apr 17, 2026
424d36f
grounding eval harness: precision/recall gate per spec §8
claude Apr 17, 2026
33fe26e
workstream I: cross-platform release + VSIX pipeline
claude Apr 17, 2026
f2a36c9
workstream D (Pyright CLI) + workstream I (first-run downloader)
claude Apr 17, 2026
bb52a65
grounding corpus → 25 cases + golden-output e2e test (spec §8)
claude Apr 17, 2026
b7b342e
workstream C (partial) + D (tsc) + Summary/Slice webview end-to-end
claude Apr 17, 2026
e3cb7d1
workstream E rules expansion + workstream C Joern detection + slice f…
claude Apr 17, 2026
9a86b2f
scanner parse-cache: skip tree-sitter on unchanged content (spec §2)
claude Apr 17, 2026
5bebeff
grounding corpus 25→35 + second golden fixture (slopfest)
claude Apr 17, 2026
6a76280
fix-apply, hover provider, PyTea presence, fix on hallucination diags
claude Apr 17, 2026
68a5d08
grounding corpus 35→50 — halfway to the spec §8 target of 100
claude Apr 17, 2026
56439ce
grounding corpus 50→76, precision 0.985 / recall 0.914
claude Apr 17, 2026
a37adc7
grounding corpus 76→101: spec §8 100-case target hit
claude Apr 17, 2026
7856577
readme: honest status after corpus-100, fix-apply, hover, tsc, slice,…
claude Apr 17, 2026
c959b8d
close the 22-point spec: per-panel error state, latency budgets, chec…
claude Apr 17, 2026
cdee856
close workstreams C (Joern CPGQL slice) and D (rust-analyzer LSP)
claude Apr 17, 2026
1a9bcfa
webview: Playwright e2e — all UI elements visible, clickable, and groovy
claude Apr 17, 2026
4e7847f
mcp/: Claude-callable MCP server fronting the daemon
claude Apr 17, 2026
3f70789
vibe feed — Claude ↔ user two-way loop (spec §0 bond-by-legibility)
claude Apr 17, 2026
2cdd8be
attention primitives — four visual cues so Claude can point, not just…
claude Apr 18, 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: 0 additions & 28 deletions .github/workflows/build.yml

This file was deleted.

74 changes: 74 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
name: CI

on:
push:
branches: [master]
pull_request:

jobs:
daemon:
name: daemon (Rust)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: install pyright (workstream D) + semgrep (workstream E)
run: pip install pyright semgrep
- run: cargo fmt --all -- --check
- run: cargo test --release --all
- name: fixture integration
run: ./test/run_fixtures.sh

extension:
name: extension + webview (TS)
runs-on: ubuntu-latest
needs: daemon
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- run: cargo build --release -p ive-daemon

- name: install webview deps
run: |
cd webview && npm ci
- name: webview test + build
run: |
cd webview && npm test && npm run build
- name: webview e2e (Playwright)
run: |
cd webview
npx playwright install --with-deps chromium
npx playwright test

- name: install extension deps
run: |
cd extension && npm ci
- name: extension typecheck
run: |
cd extension && npx tsc --noEmit
- name: extension unit tests
env:
IVE_DAEMON_PATH: ${{ github.workspace }}/target/release/ive-daemon
run: |
cd extension && npx vitest run
- name: extension build
run: |
cd extension && node esbuild.mjs

- name: install mcp deps
run: |
cd mcp && npm ci
- name: mcp typecheck + build
run: |
cd mcp && npx tsc --noEmit && node esbuild.mjs
- name: mcp e2e (drives daemon via MCP stdio)
run: |
cd mcp && npx vitest run
137 changes: 137 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
name: Release

# Produces the analyzer pack (ive-daemon binary) and the VSIX, then
# publishes both to a GitHub Release. Per spec §10 (workstream I) and
# §2 ("first-run analyzer-pack installer"), the extension is small and
# the daemon ships alongside — users download the pack on first run.
#
# Triggers:
# - tag push matching `v*` → full release
# - manual `workflow_dispatch` → dry-run artefacts, no release draft

on:
push:
tags:
- "v*"
workflow_dispatch:

permissions:
contents: write

jobs:
daemon:
name: daemon (${{ matrix.target }})
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
target: x86_64-unknown-linux-gnu
archive: tar.gz
- os: macos-latest
target: aarch64-apple-darwin
archive: tar.gz
- os: macos-latest
target: x86_64-apple-darwin
archive: tar.gz
- os: windows-latest
target: x86_64-pc-windows-msvc
archive: zip
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- uses: Swatinem/rust-cache@v2
- run: cargo test --release
- run: cargo build --release --target ${{ matrix.target }} -p ive-daemon
- name: package daemon
shell: bash
run: |
set -euo pipefail
out="ive-daemon-${{ matrix.target }}"
mkdir -p "$out"
if [[ "${{ matrix.target }}" == *-windows-* ]]; then
cp "target/${{ matrix.target }}/release/ive-daemon.exe" "$out/"
else
cp "target/${{ matrix.target }}/release/ive-daemon" "$out/"
fi
cp -r rules "$out/"
cp LICENSE "$out/"
cp README.md "$out/"
if [[ "${{ matrix.archive }}" == "zip" ]]; then
7z a "${out}.zip" "$out"
else
tar czf "${out}.tar.gz" "$out"
fi
- uses: actions/upload-artifact@v4
with:
name: daemon-${{ matrix.target }}
path: |
ive-daemon-${{ matrix.target }}.${{ matrix.archive }}

extension:
name: extension (VSIX)
runs-on: ubuntu-latest
needs: daemon
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- name: build daemon (linux; used by extension tests)
run: cargo build --release -p ive-daemon
- name: webview install + test + build
run: |
cd webview
npm ci
npm test
npm run build
- name: extension install + test + package
env:
IVE_DAEMON_PATH: ${{ github.workspace }}/target/release/ive-daemon
run: |
cd extension
npm ci
npx tsc --noEmit
npx vitest run
node esbuild.mjs
npx vsce package --no-yarn --out ../ive.vsix
- uses: actions/upload-artifact@v4
with:
name: vsix
path: ive.vsix

release:
name: draft release
runs-on: ubuntu-latest
needs: [daemon, extension]
if: startsWith(github.ref, 'refs/tags/v')
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
path: dist
- name: flatten artefacts
run: |
mkdir -p release-assets
find dist -maxdepth 2 -type f \( -name '*.tar.gz' -o -name '*.zip' -o -name 'ive.vsix' \) -exec cp {} release-assets/ \;
ls -lh release-assets/
- name: draft GitHub release
uses: softprops/action-gh-release@v2
with:
files: release-assets/*
draft: true
generate_release_notes: true
body: |
IVE ${{ github.ref_name }}

Built from commit ${{ github.sha }}.

- `ive.vsix` — VSCode extension bundle (install with `code --install-extension ive.vsix`)
- `ive-daemon-<platform>.*` — analyzer pack (daemon binary + rules). On first launch the extension downloads this to `~/.ive/` (workstream I) — you can drop it there yourself to skip the download.

See CHANGELOG.md in this tag for what changed.
28 changes: 24 additions & 4 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,8 +1,28 @@
# Rust
/target/
**/*.rs.bk

# Node
node_modules/
dist/
.ive/
.claude/
coverage/
out/
*.vsix
webview/node_modules/
coverage/
.vite/

# Playwright
test-results/
playwright-report/
playwright/.cache/
webview/e2e/screenshots/

# IVE runtime state
.ive/

# Staged release assets (populated by extension/esbuild.mjs)
extension/LICENSE
extension/resources/

# Editor / OS
.DS_Store
.claude/
29 changes: 26 additions & 3 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,32 @@
"name": "Run Extension",
"type": "extensionHost",
"request": "launch",
"args": ["--extensionDevelopmentPath=${workspaceFolder}"],
"outFiles": ["${workspaceFolder}/dist/**/*.js"],
"preLaunchTask": "npm: build"
"args": [
"--extensionDevelopmentPath=${workspaceFolder}/extension"
],
"outFiles": [
"${workspaceFolder}/extension/dist/**/*.js"
],
"preLaunchTask": "build:all",
"env": {
"IVE_DAEMON_PATH": "${workspaceFolder}/target/release/ive-daemon"
}
},
{
"name": "Run Extension + Fixture Workspace",
"type": "extensionHost",
"request": "launch",
"args": [
"--extensionDevelopmentPath=${workspaceFolder}/extension",
"${workspaceFolder}/test/fixtures/ai-slop/python"
],
"outFiles": [
"${workspaceFolder}/extension/dist/**/*.js"
],
"preLaunchTask": "build:all",
"env": {
"IVE_DAEMON_PATH": "${workspaceFolder}/target/release/ive-daemon"
}
}
]
}
56 changes: 47 additions & 9 deletions .vscode/tasks.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,57 @@
"version": "2.0.0",
"tasks": [
{
"type": "npm",
"script": "build",
"label": "build:daemon",
"type": "shell",
"command": "cargo build --release",
"group": "build",
"label": "npm: build",
"problemMatcher": ["$tsc"]
"problemMatcher": ["$rustc"]
},
{
"type": "npm",
"script": "watch",
"isBackground": true,
"label": "build:webview",
"type": "shell",
"command": "npm run build",
"options": { "cwd": "${workspaceFolder}/webview" },
"group": "build",
"problemMatcher": []
},
{
"label": "build:extension",
"type": "shell",
"command": "node esbuild.mjs",
"options": { "cwd": "${workspaceFolder}/extension" },
"group": "build",
"label": "npm: watch",
"problemMatcher": ["$tsc-watch"]
"problemMatcher": []
},
{
"label": "build:all",
"dependsOrder": "sequence",
"dependsOn": ["build:daemon", "build:webview", "build:extension"],
"group": { "kind": "build", "isDefault": true },
"problemMatcher": []
},
{
"label": "watch:webview",
"type": "shell",
"command": "npm run dev",
"options": { "cwd": "${workspaceFolder}/webview" },
"isBackground": true,
"problemMatcher": []
},
{
"label": "watch:extension",
"type": "shell",
"command": "node esbuild.mjs --watch",
"options": { "cwd": "${workspaceFolder}/extension" },
"isBackground": true,
"problemMatcher": []
},
{
"label": "test:all",
"type": "shell",
"command": "cargo test --release && cd webview && npx vitest run && cd ../extension && npx vitest run",
"group": "test",
"problemMatcher": []
}
]
}
17 changes: 0 additions & 17 deletions .vscodeignore

This file was deleted.

Loading
Loading