Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
cbcf651
feat(desktop): add macOS app vertical slice
joesobo Aug 6, 2026
1a53d94
feat(desktop): harden Core runtime lifecycle
joesobo Aug 6, 2026
9f4c289
build(desktop): add verified macOS release path
joesobo Aug 6, 2026
921067e
docs(desktop): document release gate and website status
joesobo Aug 6, 2026
febf6d0
fix(desktop): harden React lifecycle boundaries
joesobo Aug 6, 2026
fd41c22
chore(lint): classify module declarations
joesobo Aug 6, 2026
25dc89c
fix(desktop): make runtime staging noninteractive
joesobo Aug 6, 2026
17fe144
refactor(graph): share cross-interface visual semantics
joesobo Aug 6, 2026
489ecc0
feat(desktop): add native workspace navigation
joesobo Aug 6, 2026
066073c
feat(desktop): match extension graph visuals
joesobo Aug 6, 2026
4d75c1a
fix(desktop): allow bundled Material icon data
joesobo Aug 6, 2026
aeb7c1b
fix(graph): expose NodeNext-compatible visuals
joesobo Aug 6, 2026
dcf079f
feat(desktop): add live graph physics controls
joesobo Aug 6, 2026
3d7d2c3
feat(desktop): refine workbench navigation and layout
joesobo Aug 7, 2026
cd40a17
fix(desktop): own hierarchy search dismissal
joesobo Aug 7, 2026
dd011cb
fix(desktop): confirm unsaved File actions
joesobo Aug 7, 2026
56bea92
fix(desktop): open large workspaces reliably
joesobo Aug 7, 2026
985862f
feat(desktop): deepen focused file navigation
joesobo Aug 7, 2026
da27284
feat(web): present the local desktop app
joesobo Aug 7, 2026
db9dad8
fix(ci): preserve package type boundaries
joesobo Aug 7, 2026
6371c45
fix(desktop): coalesce rapid file navigation
joesobo Aug 7, 2026
ec4a3c9
refactor(graph-renderer): own shared visual semantics
joesobo Aug 7, 2026
d0b6ec2
perf(desktop): warm Core before workspace open
joesobo Aug 7, 2026
737a191
docs(desktop): document bounded navigation timing
joesobo Aug 7, 2026
621ebc4
Merge remote-tracking branch 'origin/main' into codex/desktop-app-275
joesobo Aug 7, 2026
4646c1b
fix(graph-renderer): support extension E2E resolution
joesobo Aug 7, 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
5 changes: 5 additions & 0 deletions .changeset/calm-renderers-unite.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@codegraphy-dev/graph-renderer": minor
---

Own shared Material icon matching, Node geometry, connection sizing, and force-control semantics in the renderer package.
5 changes: 5 additions & 0 deletions .changeset/quiet-desktop-graph.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@codegraphy-dev/core": patch
---

Expose a cached CodeGraphy Workspace Relationship Graph request for local interfaces, with a focused File and Folder projection that avoids hydrating unused analysis facts.
5 changes: 5 additions & 0 deletions .changeset/soft-graphs-resize.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@codegraphy-dev/extension": patch
---

Keep Link Distance between 30 and 150 in the shared Graph View force contract and clamp stored values at the settings boundary.
174 changes: 174 additions & 0 deletions .github/workflows/desktop-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@
name: Desktop release

on:
workflow_dispatch:
inputs:
tag:
description: Exact desktop tag, for example desktop-v0.1.0
required: true
type: string

permissions:
contents: write

concurrency:
group: desktop-release-${{ inputs.tag }}
cancel-in-progress: false

jobs:
build-verify-draft:
name: Build, verify, and draft Apple Silicon release
runs-on: macos-26
timeout-minutes: 60
environment: desktop-release
env:
CODEGRAPHY_DESKTOP_TARGET: aarch64-apple-darwin
CODEGRAPHY_DESKTOP_REQUIRE_RELEASE_SIGNATURE: '1'

steps:
- name: Checkout
uses: actions/checkout@v6

- name: Validate release request
env:
RELEASE_TAG: ${{ inputs.tag }}
shell: bash
run: |
set -euo pipefail
version="$(node -p "require('./apps/desktop/package.json').version")"
expected_tag="desktop-v${version}"
test "$GITHUB_REF" = "refs/heads/main"
test "$RELEASE_TAG" = "$expected_tag"
test "$(uname -m)" = "arm64"
xcodebuild -version | grep -q '^Xcode 26\.'

- name: Setup pnpm
uses: pnpm/action-setup@v6.0.8
with:
version: 10.32.0

- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: 22.23.2
cache: pnpm

- name: Setup Rust
uses: dtolnay/rust-toolchain@1.96.0
with:
components: clippy,rustfmt
targets: aarch64-apple-darwin

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Test desktop release inputs
run: |
pnpm --filter @codegraphy-dev/desktop test
pnpm --filter @codegraphy-dev/desktop typecheck
cargo test --manifest-path apps/desktop/src-tauri/Cargo.toml --lib

- name: Import Developer ID certificate
id: signing
env:
APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }}
APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
APPLE_API_KEY_CONTENT: ${{ secrets.APPLE_API_KEY_P8 }}
APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }}
shell: bash
run: |
set -euo pipefail
keychain="$RUNNER_TEMP/codegraphy-signing.keychain-db"
certificate="$RUNNER_TEMP/codegraphy-developer-id.p12"
api_key_path="$RUNNER_TEMP/AuthKey_${APPLE_API_KEY}.p8"
keychain_password="$(openssl rand -hex 24)"

printf '%s' "$APPLE_CERTIFICATE" | base64 --decode > "$certificate"
printf '%s' "$APPLE_API_KEY_CONTENT" > "$api_key_path"
chmod 600 "$certificate" "$api_key_path"

security create-keychain -p "$keychain_password" "$keychain"
security set-keychain-settings -lut 21600 "$keychain"
security unlock-keychain -p "$keychain_password" "$keychain"
security import "$certificate" -k "$keychain" -P "$APPLE_CERTIFICATE_PASSWORD" -T /usr/bin/codesign
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "$keychain_password" "$keychain"
security list-keychains -d user -s "$keychain"

signing_identity="$(security find-identity -v -p codesigning "$keychain" | sed -n 's/.*"\(Developer ID Application:.*\)"/\1/p' | head -n 1)"
test -n "$signing_identity"
printf 'APPLE_SIGNING_IDENTITY=%s\n' "$signing_identity" >> "$GITHUB_ENV"
printf 'APPLE_API_KEY_PATH=%s\n' "$api_key_path" >> "$GITHUB_ENV"
printf 'KEYCHAIN_PATH=%s\n' "$keychain" >> "$GITHUB_ENV"

- name: Build signed and notarized app
env:
APPLE_API_ISSUER: ${{ secrets.APPLE_API_ISSUER }}
APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }}
run: pnpm --filter @codegraphy-dev/desktop exec tauri build --target "$CODEGRAPHY_DESKTOP_TARGET" --bundles app,dmg

- name: Sign, notarize, and staple final DMG
env:
APPLE_API_ISSUER: ${{ secrets.APPLE_API_ISSUER }}
APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }}
shell: bash
run: |
set -euo pipefail
bundle_root="apps/desktop/src-tauri/target/${CODEGRAPHY_DESKTOP_TARGET}/release/bundle/dmg"
dmg="$(find "$bundle_root" -maxdepth 1 -type f -name '*.dmg' -print -quit)"
test -n "$dmg"
codesign --force --sign "$APPLE_SIGNING_IDENTITY" --timestamp "$dmg"
xcrun notarytool submit "$dmg" --key "$APPLE_API_KEY_PATH" --key-id "$APPLE_API_KEY" --issuer "$APPLE_API_ISSUER" --wait
xcrun stapler staple "$dmg"

- name: Verify release bundle
run: pnpm --filter @codegraphy-dev/desktop check:bundle

- name: Prepare release assets
id: assets
shell: bash
run: |
set -euo pipefail
version="$(node -p "require('./apps/desktop/package.json').version")"
bundle_root="apps/desktop/src-tauri/target/${CODEGRAPHY_DESKTOP_TARGET}/release/bundle/dmg"
dmg="$(find "$bundle_root" -maxdepth 1 -type f -name '*.dmg' -print -quit)"
test -n "$dmg"
asset="$RUNNER_TEMP/CodeGraphy_${version}_aarch64.dmg"
cp "$dmg" "$asset"
(
cd "$RUNNER_TEMP"
shasum -a 256 "$(basename "$asset")" > "$(basename "$asset").sha256"
)
printf 'dmg=%s\n' "$asset" >> "$GITHUB_OUTPUT"
printf 'checksum=%s.sha256\n' "$asset" >> "$GITHUB_OUTPUT"

- name: Upload verified assets to draft release
env:
GH_TOKEN: ${{ github.token }}
RELEASE_TAG: ${{ inputs.tag }}
DMG_PATH: ${{ steps.assets.outputs.dmg }}
CHECKSUM_PATH: ${{ steps.assets.outputs.checksum }}
shell: bash
run: |
set -euo pipefail
version="$(node -p "require('./apps/desktop/package.json').version")"
notes="$RUNNER_TEMP/desktop-release-notes.md"
cat > "$notes" <<EOF
CodeGraphy ${version} for Apple Silicon Macs running macOS 26 or later.

This draft contains the Developer ID signed, notarized, stapled, and runtime-verified DMG plus its SHA-256 checksum. Keep the release as a draft until a maintainer completes the installed-app acceptance check documented in docs/RELEASING.md.
EOF

if release_json="$(gh api "repos/${GITHUB_REPOSITORY}/releases/tags/${RELEASE_TAG}" 2>/dev/null)"; then
test "$(jq -r '.draft' <<< "$release_json")" = "true"
else
gh release create "$RELEASE_TAG" --draft --target "$GITHUB_SHA" --title "CodeGraphy ${version} for macOS" --notes-file "$notes"
fi
gh release upload "$RELEASE_TAG" "$DMG_PATH" "$CHECKSUM_PATH" --clobber

- name: Remove signing keychain
if: always() && steps.signing.outcome != 'skipped'
shell: bash
run: |
if [[ -n "${KEYCHAIN_PATH:-}" && -f "$KEYCHAIN_PATH" ]]; then
security delete-keychain "$KEYCHAIN_PATH"
fi
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@ dist/
.DS_Store
dist-e2e/
/artifacts/
apps/desktop/src-tauri/binaries/*
apps/desktop/src-tauri/gen/
apps/desktop/src-tauri/runtime/
apps/desktop/src-tauri/target/
apps/desktop/public/material-icons/
.worktrees/
.playwright-mcp/
.playwright-cli/
Expand Down
3 changes: 3 additions & 0 deletions CONTEXT.md
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ Full and incremental updates acquire writer ownership before their final discove
| Surface | Ownership |
|---|---|
| **Core Package** | `@codegraphy-dev/core` owns headless Indexing, Graph Cache storage, plugin processing, Graph Query, and the `codegraphy` CLI. |
| **macOS Desktop App** | `@codegraphy-dev/desktop` owns the Tauri window, File and Folder hierarchy, lightweight editor, safe File access, Core process lifecycle, and adapters over Core and the graph renderer. |
| **VS Code Extension** | Owns VS Code lifecycle, the Graph View, editor actions, workspace settings UI, and adapters over Core and the renderer. |
| **tldraw Interface** | `@codegraphy-dev/tldraw` owns its launcher, tldraw document lifecycle, native shapes, controls, and adapters over Core and renderer physics. |
| **Graph Renderer** | `@codegraphy-dev/graph-renderer` owns WebGPU drawing and deterministic WebAssembly physics. It does not own product settings, persistence, or plugins. |
Expand Down Expand Up @@ -185,10 +186,12 @@ Extension chrome inherits the active VS Code theme. Graph Data Color may encode

## Package Boundaries

- `apps/desktop` owns the macOS product surface and its local Core process boundary.
- `packages/core` owns shared engine behavior and the CLI.
- `packages/extension` owns the VS Code product surface.
- `packages/tldraw` owns the tldraw offline product surface and launcher.
- `packages/graph-renderer` owns graph drawing and physics.
- `packages/graph-renderer` owns WebGPU drawing, WebAssembly physics, and deterministic visual semantics shared by interfaces, including Material Icon Theme matching, graph sizing metrics, icon geometry, and renderer input defaults. Each interface still owns and resolves its host theme colors.
- `packages/plugin-api` owns public Core plugin contracts.
- `packages/extension-plugin-api` owns public VS Code Extension plugin contracts.
- `packages/plugin-*` own optional Core or interface plugins.
Expand Down
16 changes: 12 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@

CodeGraphy indexes a folder and projects its files and declarations into Nodes. It renders imports, calls, references, inheritance, containment, tests, and plugin-defined Relationships.

Explore the graph inside VS Code or as native shapes in tldraw offline. Search, Graph Scope, and persistent filters narrow the VS Code view. The Core engine also supports the terminal CLI and agent queries.
Explore the graph in the macOS desktop app, inside VS Code, or as native shapes in tldraw offline. Search, Graph Scope, and persistent filters narrow the VS Code view. The Core engine also supports the terminal CLI and agent queries.

![CodeGraphy Relationship Graph interaction demo](./docs/media/readme/relationship-graph-demo.gif)

Expand All @@ -48,6 +48,7 @@ Join the [CodeGraphy Discord](https://discord.gg/Z75vbkt4Ry) for installation he
| Capability | What it provides |
|---|---|
| Relationship Graph | File, folder, package, Symbol, and plugin-defined Nodes connected by typed Edges. |
| macOS desktop app | A focused File hierarchy, multi-language CodeMirror editor with Markdown preview, and WebGPU Relationship Graph backed by local Core. |
| Search and filters | Temporary search plus workspace-local include and exclude rules. |
| Graph Scope | One panel for Node Type and Edge Type visibility. |
| Symbol Nodes | Functions, classes, interfaces, types, variables, constants, and language-specific declarations. |
Expand All @@ -72,6 +73,12 @@ Join the [CodeGraphy Discord](https://discord.gg/Z75vbkt4Ry) for installation he

## Install

### macOS desktop app

The Apple Silicon desktop app requires macOS 26 or later. The source, app bundle, DMG path, and release checks are in this repository, but there is no public download yet. Developer ID signing, notarization, and the installed-app acceptance check still gate the first release.

Do not treat an ad-hoc development DMG as a production artifact. See the [desktop app guide](./apps/desktop/README.md) for current behavior and the exact release gate.

### VS Code Extension

1. Install [CodeGraphy from the VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=codegraphy.codegraphy).
Expand Down Expand Up @@ -199,16 +206,17 @@ A public `codegraphy/skills` repository will host the skill once published.

`@codegraphy-dev/core` owns File Discovery, built-in analysis, Graph Cache watching, plugin activation, SQLite storage, Graph Query, and the CLI. It does not own rendering.

The VS Code extension connects Core to the editor lifecycle and React Graph View. It changes cached source facts only after an explicit Index or Re-index Workspace action. The tldraw interface connects Core data and shared physics to native tldraw shapes.
The macOS desktop app runs Core in a bundled local process and keeps File access and child-process control in Rust. Its webview combines a File hierarchy, CodeMirror, and the existing renderer. The VS Code extension connects Core to the editor lifecycle and React Graph View. The tldraw interface connects Core data and shared physics to native tldraw shapes.

`@codegraphy-dev/graph-renderer` owns WebGPU drawing and WebAssembly physics. Core plugins use `@codegraphy-dev/plugin-api`. VS Code Extension plugins use `@codegraphy-dev/extension-plugin-api`.
`@codegraphy-dev/graph-renderer` owns WebGPU drawing, WebAssembly physics, Node geometry, Material icon matching, connection sizing, and force-control semantics shared by the desktop app and VS Code extension. Interfaces still own host theme color resolution, settings persistence, and interaction policy. Core plugins use `@codegraphy-dev/plugin-api`. VS Code Extension plugins use `@codegraphy-dev/extension-plugin-api`.

| Package | Role |
|---|---|
| [`@codegraphy-dev/desktop`](./apps/desktop/README.md) | Tauri macOS app, local Core process boundary, File hierarchy, and editor. |
| [`@codegraphy-dev/core`](./packages/core/README.md) | Shared indexing, cache, plugin, query, and CLI engine. |
| [`@codegraphy-dev/extension`](./packages/extension/docs/README.md) | VS Code host and Graph View product integration. |
| [`@codegraphy-dev/tldraw`](./packages/tldraw/README.md) | macOS launcher and native tldraw offline canvas integration. |
| [`@codegraphy-dev/graph-renderer`](./packages/graph-renderer/README.md) | WebGPU graph renderer and WebAssembly physics. |
| [`@codegraphy-dev/graph-renderer`](./packages/graph-renderer/README.md) | Shared graph rendering, visual geometry, Material icon matching, and WebAssembly physics. |
| [`@codegraphy-dev/plugin-api`](./packages/plugin-api/README.md) | Public TypeScript contracts for Core plugins. |
| [`@codegraphy-dev/extension-plugin-api`](./packages/extension-plugin-api/README.md) | Public TypeScript contracts for VS Code Extension plugins. |
| `@codegraphy-dev/plugin-*` | Optional plugins for Core or an interface host. |
Expand Down
Loading