Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 0 additions & 4 deletions .ade/cto/identity.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,6 @@ memoryPolicy:
compactionThreshold: 0.7
preCompactionFlush: true
temporalDecayHalfLifeDays: 30
externalMcpAccess:
allowAll: true
allowedServers: []
blockedServers: []
openclawContextPolicy:
shareMode: filtered
blockedCategories:
Expand Down
52 changes: 26 additions & 26 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,15 @@ jobs:
with:
path: |
apps/desktop/node_modules
apps/mcp-server/node_modules
apps/ade-cli/node_modules
apps/web/node_modules
key: nm-${{ hashFiles('apps/desktop/package-lock.json','apps/mcp-server/package-lock.json','apps/web/package-lock.json') }}
key: nm-${{ hashFiles('apps/desktop/package-lock.json','apps/ade-cli/package-lock.json','apps/web/package-lock.json') }}

- name: Install all dependencies (parallel)
if: steps.cache.outputs.cache-hit != 'true'
run: |
cd apps/desktop && npm ci &
cd apps/mcp-server && npm ci &
cd apps/ade-cli && npm ci &
cd apps/web && npm ci &
wait

Expand Down Expand Up @@ -61,12 +61,12 @@ jobs:
with:
path: |
apps/desktop/node_modules
apps/mcp-server/node_modules
apps/ade-cli/node_modules
apps/web/node_modules
key: nm-${{ hashFiles('apps/desktop/package-lock.json','apps/mcp-server/package-lock.json','apps/web/package-lock.json') }}
key: nm-${{ hashFiles('apps/desktop/package-lock.json','apps/ade-cli/package-lock.json','apps/web/package-lock.json') }}
- run: cd apps/desktop && npm run typecheck

typecheck-mcp:
typecheck-ade-cli:
needs: install
runs-on: ubuntu-latest
steps:
Expand All @@ -78,10 +78,10 @@ jobs:
with:
path: |
apps/desktop/node_modules
apps/mcp-server/node_modules
apps/ade-cli/node_modules
apps/web/node_modules
key: nm-${{ hashFiles('apps/desktop/package-lock.json','apps/mcp-server/package-lock.json','apps/web/package-lock.json') }}
- run: cd apps/mcp-server && npm run typecheck
key: nm-${{ hashFiles('apps/desktop/package-lock.json','apps/ade-cli/package-lock.json','apps/web/package-lock.json') }}
- run: cd apps/ade-cli && npm run typecheck

typecheck-web:
needs: install
Expand All @@ -95,9 +95,9 @@ jobs:
with:
path: |
apps/desktop/node_modules
apps/mcp-server/node_modules
apps/ade-cli/node_modules
apps/web/node_modules
key: nm-${{ hashFiles('apps/desktop/package-lock.json','apps/mcp-server/package-lock.json','apps/web/package-lock.json') }}
key: nm-${{ hashFiles('apps/desktop/package-lock.json','apps/ade-cli/package-lock.json','apps/web/package-lock.json') }}
- run: cd apps/web && npm run typecheck

lint-desktop:
Expand All @@ -112,9 +112,9 @@ jobs:
with:
path: |
apps/desktop/node_modules
apps/mcp-server/node_modules
apps/ade-cli/node_modules
apps/web/node_modules
key: nm-${{ hashFiles('apps/desktop/package-lock.json','apps/mcp-server/package-lock.json','apps/web/package-lock.json') }}
key: nm-${{ hashFiles('apps/desktop/package-lock.json','apps/ade-cli/package-lock.json','apps/web/package-lock.json') }}
- run: cd apps/desktop && npm run lint

test-desktop:
Expand All @@ -133,12 +133,12 @@ jobs:
with:
path: |
apps/desktop/node_modules
apps/mcp-server/node_modules
apps/ade-cli/node_modules
apps/web/node_modules
key: nm-${{ hashFiles('apps/desktop/package-lock.json','apps/mcp-server/package-lock.json','apps/web/package-lock.json') }}
key: nm-${{ hashFiles('apps/desktop/package-lock.json','apps/ade-cli/package-lock.json','apps/web/package-lock.json') }}
- run: cd apps/desktop && npx vitest run --shard=${{ matrix.shard }}/8

test-mcp:
test-ade-cli:
needs: install
runs-on: ubuntu-latest
steps:
Expand All @@ -150,10 +150,10 @@ jobs:
with:
path: |
apps/desktop/node_modules
apps/mcp-server/node_modules
apps/ade-cli/node_modules
apps/web/node_modules
key: nm-${{ hashFiles('apps/desktop/package-lock.json','apps/mcp-server/package-lock.json','apps/web/package-lock.json') }}
- run: cd apps/mcp-server && npm test
key: nm-${{ hashFiles('apps/desktop/package-lock.json','apps/ade-cli/package-lock.json','apps/web/package-lock.json') }}
- run: cd apps/ade-cli && npm test

build:
needs: install
Expand All @@ -167,11 +167,11 @@ jobs:
with:
path: |
apps/desktop/node_modules
apps/mcp-server/node_modules
apps/ade-cli/node_modules
apps/web/node_modules
key: nm-${{ hashFiles('apps/desktop/package-lock.json','apps/mcp-server/package-lock.json','apps/web/package-lock.json') }}
key: nm-${{ hashFiles('apps/desktop/package-lock.json','apps/ade-cli/package-lock.json','apps/web/package-lock.json') }}
- run: cd apps/desktop && npm run build
- run: cd apps/mcp-server && npm run build
- run: cd apps/ade-cli && npm run build
- run: cd apps/web && npm run build

validate-docs:
Expand All @@ -186,9 +186,9 @@ jobs:
with:
path: |
apps/desktop/node_modules
apps/mcp-server/node_modules
apps/ade-cli/node_modules
apps/web/node_modules
key: nm-${{ hashFiles('apps/desktop/package-lock.json','apps/mcp-server/package-lock.json','apps/web/package-lock.json') }}
key: nm-${{ hashFiles('apps/desktop/package-lock.json','apps/ade-cli/package-lock.json','apps/web/package-lock.json') }}
- run: node scripts/validate-docs.mjs

# ── Gate: all jobs must pass ──────────────────────────────────────────
Expand All @@ -197,11 +197,11 @@ jobs:
needs:
- secret-scan
- typecheck-desktop
- typecheck-mcp
- typecheck-ade-cli
- typecheck-web
- lint-desktop
- test-desktop
- test-mcp
- test-ade-cli
- build
- validate-docs
runs-on: ubuntu-latest
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ __pycache__/
*.db

# Build outputs
/apps/mcp-server/dist/
/apps/ade-cli/dist/
/apps/desktop/release/
/apps/desktop/dist/
/apps/desktop/vendor/crsqlite/darwin-x64/
Expand Down
12 changes: 6 additions & 6 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@

- ADE is a local-first desktop application for orchestrating coding agents, missions, lanes, PR workflows, and proof/artifact capture.
- The main product lives in `apps/desktop` and is built with Electron, React, and TypeScript.
- The ADE MCP server lives in `apps/mcp-server` and shares core services with the desktop app.
- The ADE CLI lives in `apps/ade-cli` and shares core services with the desktop app.
- State is primarily stored under `.ade/` inside the active project, with runtime metadata in SQLite and machine-local files under `.ade/secrets`, `.ade/cache`, and `.ade/artifacts`.

## Working norms

- Preserve existing desktop app patterns before introducing new abstractions.
- Prefer fixing the underlying service or shared type rather than layering renderer-only workarounds on top.
- Keep IPC contracts, preload types, shared types, and renderer usage in sync whenever an interface changes.
- For ADE MCP changes, verify both headless MCP mode and the desktop socket-backed MCP path.
- For ADE CLI changes, verify both headless mode and the desktop socket-backed ADE RPC path.
- For computer-use changes, treat policy enforcement and artifact ownership as hard requirements, not prompt guidance.

## Validation
Expand All @@ -22,10 +22,10 @@
- `npm --prefix apps/desktop run test`
- `npm --prefix apps/desktop run build`
- `npm --prefix apps/desktop run lint`
- MCP checks:
- `npm --prefix apps/mcp-server run typecheck`
- `npm --prefix apps/mcp-server run test`
- `npm --prefix apps/mcp-server run build`
- ADE CLI checks:
- `npm --prefix apps/ade-cli run typecheck`
- `npm --prefix apps/ade-cli run test`
- `npm --prefix apps/ade-cli run build`
- Run the smallest relevant subset first when iterating, then finish with the broader checks that cover the touched surfaces.

## Terminology
Expand Down
10 changes: 5 additions & 5 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added

- **OpenAI responses-based verification** — `authDetector` now verifies OpenAI keys via `POST /v1/responses` with `gpt-5-nano`/`gpt-5-mini` fallback, distinguishing model-availability errors from invalid keys; secondary model-list fallback check for resilience
- **Scoped OpenCode tool selection** — `buildFallbackToolSelection`, `buildScopedMcpToolSelection`, and `resolveScopedMcpToolSelection` pipeline ensures sessions get exactly the tools matching current MCP server config; `refreshOpenCodeSessionToolSelection` called before every prompt
- **Scoped OpenCode tool selection** — `buildFallbackToolSelection`, `buildScopedMcpToolSelection`, and `resolveScopedMcpToolSelection` pipeline ensures sessions get exactly the tools matching current ADE CLI config; `refreshOpenCodeSessionToolSelection` called before every prompt
- **Isolated OpenCode server launches** — `openCodeServerManager` builds XDG-style isolated launch specs via `child_process.spawn`, sanitizes inherited `OPENCODE_*` env, and resolves binary via `resolveOpenCodeBinaryPath`; new test hooks for launch spec verification
- **MCP schema sanitization** — `sanitizeToolSchema` recursively normalizes tool JSON Schemas (adds missing `items`/`properties`, ensures `required` completeness, recurses through `anyOf`/`oneOf`/`allOf`) to prevent strict-provider rejections
- **ADE CLI schema sanitization** — `sanitizeToolSchema` recursively normalizes tool JSON Schemas (adds missing `items`/`properties`, ensures `required` completeness, recurses through `anyOf`/`oneOf`/`allOf`) to prevent strict-provider rejections
- **Provider verification badges** — ProvidersSection shows verification badges, failure state indicators, and auto-refreshes OpenCode inventory on key changes

### Changed
Expand All @@ -38,7 +38,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- **Provider task runner** — unified 306-line task runner dispatching to Claude, Codex, Cursor, and OpenCode paths with timeout enforcement and permission mode mapping (`providerTaskRunner.ts`)
- **Tool exposure policy** — score-based heuristics for frontend repo discovery tool exposure based on prompt content analysis (`toolExposurePolicy.ts`)
- **Runtime message types** — provider-agnostic message representation decoupling ADE internals from SDK types (`runtimeMessageTypes.ts`)
- **CLI MCP config normalization** — normalizes MCP server config between Claude (`type`) and Codex (`transport`) field formats (`cliMcpConfig.ts`)
- **CLI ADE CLI config normalization** — normalizes ADE CLI config between Claude (`type`) and Codex (`transport`) field formats (`cliMcpConfig.ts`)
- **Local provider discovery pipeline** — endpoint probing, model inspection, capability inference, harness profile assignment, and TTL-based caching for Ollama and LM Studio
- **900+ lines of new tool tests** — `globSearch.test.ts` (219 lines), `grepSearch.test.ts` (276 lines), `readFileRange.test.ts` (197 lines), expanded `universalTools.test.ts` (+364 lines)
- **Compaction engine tests** — 526-line test suite covering transcript persistence, compaction triggering, and token accounting
Expand Down Expand Up @@ -97,7 +97,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

- **Multimodal chat** — Claude agent chat now supports image attachments via base64 content blocks, with a new file upload picker and clipboard paste support in the composer
- **CTO daily logs** — CTO persona gains a Memory Protocol and Decision Framework; daily log utilities (append/read/list) auto-inject recent context into CTO sessions
- **External MCP auth service** — full OAuth and token-based authentication flows for connecting external MCP servers (795-line service with PKCE support)
- **ADE CLI auth service** — full OAuth and token-based authentication flows for connecting ADE CLI (795-line service with PKCE support)
- **Onboarding rewrite** — replaced the 1,373-line `OnboardingPage` with a focused 328-line `ProjectSetupPage`
- **New settings sections** — Lane Behavior, Lane Templates (expanded), Integrations, Workspace Settings, and AI Settings panels
- **Context doc preferences** — model, effort, and events settings now persist to the backend via new IPC handlers
Expand All @@ -114,7 +114,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- **Linear OAuth** — bundled public PKCE client-ID fallback so CTO Linear sync works without manual credential setup; fixed OAuth server to listen on port 19836 and force `prompt=consent`
- **Orchestrator tuning** — lowered dedupe/retention/pruning thresholds, capped `workerProgressChatState`, pruned config cache, reduced session signal retention and health sweep intervals
- **Main process** — simplified hardware acceleration logic, narrowed default background task flags in dev stability mode
- **CI** — tightened permissions, removed old inline release job, added MCP server dependency install before desktop typecheck
- **CI** — tightened permissions, removed old inline release job, added ADE CLI dependency install before desktop typecheck
- **Homepage & web** — refreshed landing page layout and styles, updated Tailwind config

### Removed
Expand Down
21 changes: 17 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
<img src="https://img.shields.io/badge/Electron-app-47848F?logo=electron&logoColor=white" alt="Electron" />
<img src="https://img.shields.io/badge/React-renderer-61DAFB?logo=react&logoColor=111827" alt="React" />
<img src="https://img.shields.io/badge/TypeScript-codebase-3178C6?logo=typescript&logoColor=white" alt="TypeScript" />
<img src="https://img.shields.io/badge/MCP-built--in-6f42c1" alt="MCP built in" />
<img src="https://img.shields.io/badge/ADE CLI-built--in-6f42c1" alt="ADE CLI built in" />
</p>

<p align="center">
Expand All @@ -48,16 +48,29 @@ ADE is built for people who want agents to operate inside a real development wor
- **Automations** -- Event-driven background execution with triggers and guardrails
- **PR workflows** -- Stacking, conflict simulation, and queue landing
- **Context packs** -- Structured, bounded context delivery for agents
- **ADE MCP server** -- Shared services for both desktop and headless MCP flows
- **ADE CLI** -- Agent-focused command-line access to ADE actions in desktop-backed and headless modes
- **Memory system** -- Persistent knowledge across sessions with semantic search
- **Runtime model support** -- Claude, Codex, OpenAI-compatible providers, and local models
- **Linear integration** -- Workflow automation triggered by Linear issues
- **Multi-repo aware workflows** -- Project-local state under `.ade/` plus machine-local secrets, cache, and artifacts

## Stack

- **Desktop** -- Electron, React, TypeScript, SQLite, node-pty
- **Protocols** -- Model Context Protocol (MCP), IPC, GitHub and Linear integrations
- **Runtime model support** -- Claude, Codex, OpenAI-compatible providers, and local models
- **Protocols** -- ADE CLI, IPC, GitHub and Linear integrations

## ADE CLI

ADE ships a real `ade` command for agents and local automation. The standalone package lives in `apps/ade-cli` and exposes `bin.ade`; after `cd apps/ade-cli && npm run build && npm link`, `ade doctor`, `ade lanes list`, and the rest of the command surface are available on `PATH`.

The macOS desktop app also bundles the same CLI at `/Applications/ADE.app/Contents/Resources/ade-cli/bin/ade`. Symlink that wrapper into a `PATH` directory to use `ade xyz` without installing Node separately:

```bash
/Applications/ADE.app/Contents/Resources/ade-cli/install-path.sh
ade doctor --project-root /path/to/project
```

Agents should use `ade doctor --json` for readiness, `ade actions list --text` for discovery, typed commands first, and `ade actions run <domain.action>` as the escape hatch for any ADE service action that does not yet have a typed command.

## Install

Expand Down
Loading
Loading