Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
0535b15
feat(desktop): establish Tauri and React application foundation
cedricroulof Sep 8, 2026
451c6e3
feat(desktop): add native workspace and platform services
cedricroulof Sep 8, 2026
0bcc73b
feat(desktop): build dashboards and integrated analysis workspace
cedricroulof Sep 8, 2026
0956bc0
test(desktop): verify migration and document native workflows
cedricroulof Sep 8, 2026
3e10020
fix(desktop): correct platform endpoints and Windows analysis execution
cedricroulof Sep 8, 2026
6b779ff
style(desktop): apply red white and black brand palette
cedricroulof Sep 8, 2026
1c4d297
feat(cloud): prefill the device code in the verification link
cedricroulof Sep 8, 2026
144a04a
feat(analysis): find the compilation context without the user
cedricroulof Sep 8, 2026
a4971c1
fix(desktop): stop telling a signed-in user they are signed out
cedricroulof Sep 8, 2026
5ea5d27
chore: ignore the native spikes' build output
cedricroulof Sep 9, 2026
874807b
docs(cloud): design running an analysis on a local folder in the cloud
cedricroulof Sep 9, 2026
3480b7b
feat(desktop): connect a GitHub account from the application
cedricroulof Sep 9, 2026
cf43b53
feat(desktop): keep clones together instead of asking where each one …
cedricroulof Sep 9, 2026
c2d3267
docs(cloud): the quoted cost is not on the job view, and the design a…
cedricroulof Sep 9, 2026
5aa6b5a
docs(cloud): plan the desktop Run in cloud implementation
cedricroulof Sep 9, 2026
b0b19e8
feat(desktop): pack a workspace into the archive the platform accepts
cedricroulof Sep 9, 2026
a7a2a25
feat(desktop): run the open folder in the cloud, and stop at its price
cedricroulof Sep 9, 2026
8603ace
feat(desktop): say how many files are going up
cedricroulof Sep 9, 2026
7b16b2f
feat(desktop): offer the open folder to the cloud, once its price is …
cedricroulof Sep 9, 2026
4933023
feat(desktop): say which findings the cloud produced
cedricroulof Sep 9, 2026
58238a8
fix(desktop): open the analysis that already covers a commit, and sto…
cedricroulof Sep 9, 2026
28de230
fix(desktop): use the states the platform actually reports
cedricroulof Sep 9, 2026
cfb0ac6
fix(desktop): show what a run costs, before and after it happens
cedricroulof Sep 9, 2026
f6258cb
fix(desktop): open the results a finished run promised
cedricroulof Sep 9, 2026
abf1f4a
fix(desktop): clone to a path git accepts, and make the findings list…
cedricroulof Sep 9, 2026
553bdd5
feat(desktop): open several folders at once, and name what was analysed
cedricroulof Sep 9, 2026
a3e9e04
feat(desktop): a folder remembers which files were open
cedricroulof Sep 9, 2026
a64adc2
perf(desktop): stop one report download from stalling the whole inter…
cedricroulof Sep 9, 2026
25872ce
fix(desktop): say what is happening, and show every folder that is open
cedricroulof Sep 9, 2026
548682e
fix(desktop): count real progress, since nothing here is allowed to spin
cedricroulof Sep 9, 2026
79fd677
fix(desktop): stop a finished analysis from seizing its own tab
cedricroulof Sep 9, 2026
046c41e
feat(desktop): reopen the folders and analyser the last session had
cedricroulof Sep 9, 2026
50f1f47
feat(desktop): estimate a cloud run from analyses that actually ran
cedricroulof Sep 9, 2026
181dc35
fix(desktop): show the account, every repository, and why a run found…
cedricroulof Sep 9, 2026
3bd2820
style(desktop): format the Rust sources as the release check expects
cedricroulof Sep 9, 2026
1c5f5b2
build(desktop): stop asking for an MSI a pre-release version cannot fill
cedricroulof Sep 9, 2026
2234430
fix(desktop): a restored session gives the run its analyser, not just…
cedricroulof Sep 10, 2026
231e105
feat(desktop): one way to start an analysis, and a history that shows…
cedricroulof Sep 10, 2026
cfd28a3
fix(desktop): one Analyser button, four repositories, and room to bre…
cedricroulof Sep 10, 2026
9dba0e4
feat(desktop): start a cloud analysis where you are and be told when …
cedricroulof Sep 10, 2026
b8a474f
fix(desktop): show a cloud run working from wherever it was started
cedricroulof Sep 10, 2026
1da0cb6
fix(desktop): drop the "Dossier ouvert" block from the sidebar
cedricroulof Sep 10, 2026
a7aed32
style(desktop): every grey comes from one token set
cedricroulof Sep 10, 2026
700512b
style(desktop): a type scale of 14, 13, 12 and 11
cedricroulof Sep 10, 2026
c901e52
style(desktop): three corner radii
cedricroulof Sep 10, 2026
b9eac5e
feat(desktop): one entry point, one status bar, one home
cedricroulof Sep 10, 2026
bc5e5b3
feat(desktop): the desktop remembers local runs and knows what is ins…
cedricroulof Sep 10, 2026
f44214e
feat(desktop): analyses that were run here stay, and a finding is one…
cedricroulof Sep 10, 2026
8831e39
feat(desktop): find a file by name, and analyse without saving first
cedricroulof Sep 10, 2026
ed77e1a
feat(desktop): say what a card will do, and which tools are here
cedricroulof Sep 10, 2026
eb40f5a
feat(desktop): the home shows numbers first, errors speak French, mes…
cedricroulof Sep 10, 2026
47097c9
fix(desktop): Refuser on a quote actually refuses it
cedricroulof Sep 10, 2026
55ed669
feat(desktop): the sidebar's Nouvelle analyse says which folder, and …
cedricroulof Sep 10, 2026
1e18b23
docs(desktop): design for tool-failure reports
cedricroulof Sep 10, 2026
fe9921a
docs(desktop): implementation plan for tool-failure reports
cedricroulof Sep 10, 2026
71eee3a
feat(desktop): gather and send a tool-failure report
cedricroulof Sep 10, 2026
082c88a
feat(desktop): report a tool that failed, privately, to the team
cedricroulof Sep 10, 2026
0ec2a0e
style(desktop): format with Prettier, as the workflow checks
cedricroulof Sep 10, 2026
f2c5127
ci(desktop): publish installers as a GitHub Release on every v-tag
cedricroulof Sep 10, 2026
072af3b
chore: keep source files LF in the repository
cedricroulof Sep 10, 2026
50f6f3d
ci(desktop): show Prettier's diff when the check fails
cedricroulof Sep 10, 2026
1fb471f
fix(ci): give the bundle a square icon so the AppImage build stops ab…
cedricroulof Sep 10, 2026
8752917
release: 6.0.0-beta.2, the Linux packages beta.1 never shipped
cedricroulof Sep 10, 2026
7890ae6
docs(desktop): beta.2's release page carries the full notes
cedricroulof Sep 10, 2026
7f02acd
Merge branch 'master' into feat/tauri-react-desktop
cedricroulof Sep 10, 2026
32b917e
test(desktop) add first tests for App, bridge, Dashboard, Dialog, Log…
nihilistaken Sep 18, 2026
3475bde
chore: drop the editor-agent directory from .gitignore
cedricroulof Sep 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
11 changes: 11 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,14 @@
*.sh text eol=lf
Dockerfile text eol=lf
entrypoint.sh text eol=lf

# Source files are LF in the repository, whatever the committer's platform.
# A CRLF blob passes Prettier on one runner and fails on another.
*.ts text eol=lf
*.tsx text eol=lf
*.css text eol=lf
*.json text eol=lf
*.md text eol=lf
*.yml text eol=lf
*.rs text eol=lf
*.toml text eol=lf
206 changes: 108 additions & 98 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -1,121 +1,131 @@
name: Build Electron App

# Pushes to master and develop only run the test suite. Artifacts are published
# from version tags alone (v5.1.0, v5.2.0-beta.1, ...), so merging a PR never
# republishes a release, and the tag is the single trigger for a build.
name: CoreTrace Desktop
# Every push and pull request is checked and built on the three desktops.
# A tag v<version> additionally builds the installers on each and publishes
# them as a GitHub Release, whose notes are docs/releases/v<version>.md. A
# version with a pre-release suffix (6.0.0-beta.1) is published as a
# pre-release; a plain one becomes the latest release.
on:
push:
branches:
- master
- develop
tags:
- "v*"
branches: [master, develop, feat/tauri-react-desktop]
tags: ["v*"]
pull_request:
branches:
- master

branches: [master]
workflow_dispatch:
permissions:
contents: read

jobs:
test:
runs-on: ubuntu-24.04
check:
strategy:
fail-fast: false
matrix:
os: [windows-2022, ubuntu-24.04, macos-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22.15.0
cache: "npm"

- name: Install dependencies
run: npm ci

- name: Build renderer bundle
run: npm run build:renderer

- name: Run tests
run: npm test
node-version: "22.19.0"
cache: npm
- uses: dtolnay/rust-toolchain@1.95.0
with:
components: rustfmt, clippy
- name: Linux desktop dependencies
if: runner.os == 'Linux'
run: sudo apt-get update && sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf libssl-dev libdbus-1-dev
- uses: Swatinem/rust-cache@v2
with:
workspaces: src-tauri -> target
- run: npm ci
- name: Verify release versions
run: node scripts/check-desktop-version.cjs
- name: Verify bundle icons
run: node scripts/check-bundle-icons.cjs
- run: npm run check
- run: npm run format:check
- name: Show what Prettier would change
# --check only names files; when it fails, the diff says why.
if: failure()
shell: bash
run: |
npx prettier --write desktop vite.config.ts vitest.config.ts >/dev/null
git --no-pager diff --stat
git --no-pager diff | head -120 | cat -A | head -120
- run: npm test
- run: cargo fmt --manifest-path src-tauri/Cargo.toml --check
- run: cargo clippy --manifest-path src-tauri/Cargo.toml --all-targets -- -D warnings
- run: cargo test --manifest-path src-tauri/Cargo.toml --locked
- name: Build desktop
run: npm run tauri -- build --no-bundle
- uses: actions/upload-artifact@v4
with:
name: coretrace-desktop-${{ runner.os }}-${{ runner.arch }}
path: |
src-tauri/target/release/coretrace-desktop.exe
src-tauri/target/release/coretrace-desktop
if-no-files-found: error

release:
# Only a tag publishes, and only after every desktop passed its checks.
if: startsWith(github.ref, 'refs/tags/v')
needs: test
# Only this job publishes, so only this job gets a write-capable token.
needs: check
permissions:
contents: write
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
# windows-2022 pinned: windows-latest (now windows-2025, build 26100)
# breaks node-gyp VS detection during the node-pty native rebuild.
#
# macOS ships two jobs rather than one universal build: node-pty and
# node-llama-cpp are native modules, so each architecture is compiled on
# a runner of that architecture. macos-latest is Apple Silicon;
# macos-15-intel is the x64 runner that replaced the retired macos-13
# (a macos-13 job sits queued forever instead of failing).
# The builds are unsigned — see the note below.
os: [windows-2022, ubuntu-24.04, macos-latest, macos-15-intel]

include:
- os: windows-2022
args: --bundles nsis
- os: macos-latest
args: --target universal-apple-darwin --bundles dmg
- os: ubuntu-24.04
args: --bundles deb,appimage
runs-on: ${{ matrix.os }}
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22.15.0
cache: "npm"

# The tag is what users see; package.json is what electron-builder writes
# into the artifacts and the update manifests. If they disagree, the
# updater serves a version nobody can find, so stop before publishing.
- name: Verify the tag matches package.json
node-version: "22.19.0"
cache: npm
- uses: dtolnay/rust-toolchain@1.95.0
with:
# A universal macOS binary is built from both architectures.
targets: ${{ runner.os == 'macOS' && 'aarch64-apple-darwin,x86_64-apple-darwin' || '' }}
- name: Linux desktop dependencies
if: runner.os == 'Linux'
run: sudo apt-get update && sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf libssl-dev libdbus-1-dev
- uses: Swatinem/rust-cache@v2
with:
workspaces: src-tauri -> target
- run: npm ci
- name: Verify release versions
run: node scripts/check-desktop-version.cjs
- name: Verify bundle icons
run: node scripts/check-bundle-icons.cjs
- name: Release notes
id: notes
shell: bash
run: |
set -euo pipefail
tag="${GITHUB_REF_NAME#v}"
pkg="$(node -p "require('./package.json').version")"
if [ "$tag" != "$pkg" ]; then
echo "::error::Tag $GITHUB_REF_NAME does not match package.json version $pkg."
file="docs/releases/${GITHUB_REF_NAME}.md"
if [ ! -f "$file" ]; then
echo "No release notes at $file; write them before tagging." >&2
exit 1
fi
echo "Releasing $pkg from tag $GITHUB_REF_NAME."

# Only `-beta.N` prereleases are recognised: electron-builder names the
# update manifest after the prerelease identifier, and `beta` is the one
# the in-app channel selector reads (see updaterHandlers.js).
- name: Determine release channel
id: channel
shell: bash
run: |
set -euo pipefail
version="${GITHUB_REF_NAME#v}"
if [[ "$version" == *-* ]]; then
if [[ ! "$version" =~ -beta\.[0-9]+$ ]]; then
echo "::error::Prerelease versions must end in -beta.N (got $version)."
exit 1
fi
echo "prerelease=true" >> "$GITHUB_OUTPUT"
else
echo "prerelease=false" >> "$GITHUB_OUTPUT"
fi

- name: Install dependencies
run: npm ci

# macOS artifacts are deliberately unsigned and un-notarized: that needs a
# paid Apple Developer account, and we would rather ship a build testers
# can run today. Gatekeeper blocks the first launch, so users open the app
# once with right-click > Open, or run `xattr -cr /Applications/CtraceGUI.app`.
# To sign later, restore an Apple certificate here and set `identity`,
# `hardenedRuntime` and `notarize` in the `mac` block of package.json.
- name: Publish
{
echo "body<<NOTES_EOF"
cat "$file"
echo
echo "NOTES_EOF"
} >> "$GITHUB_OUTPUT"
- name: Build installers and publish
uses: tauri-apps/tauri-action@v0
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CSC_IDENTITY_AUTO_DISCOVERY: false
EP_PRE_RELEASE: ${{ steps.channel.outputs.prerelease }}
run: npm run dist:publish
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tagName: ${{ github.ref_name }}
releaseName: CoreTrace Desktop ${{ github.ref_name }}
releaseBody: ${{ steps.notes.outputs.body }}
releaseDraft: false
prerelease: ${{ contains(github.ref_name, '-') }}
includeUpdaterJson: false
args: ${{ matrix.args }}
27 changes: 17 additions & 10 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
dist
.env
node_modules
.codex
.claude
.claw
.claw-cache
.claw-logs
ctrace-report.txt
bundle.js
dist
.env
node_modules
.codex
.claw
.claw-cache
.claw-logs
ctrace-report.txt
bundle.js
src-tauri/target/
src-tauri/gen/
coverage/
*.tsbuildinfo
# The native spikes: exploratory Rust/Floem work that has never been committed here, and 12 GB of
# rebuildable build output beside it. Ignored whole, so `git add -A` cannot sweep the tree into a
# commit about something else. Committing the spikes is a decision to take deliberately.
native/
Loading
Loading