Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
88 commits
Select commit Hold shift + click to select a range
97d3bfa
refactor(config): decode persisted documents
Waishnav Aug 23, 2026
ea7fea2
test(config): reject invalid persisted documents
Waishnav Aug 23, 2026
2bfa151
fix(config): preserve legacy extension fields
Waishnav Aug 23, 2026
a3f00c9
test(server): lock down mode tool surfaces
Waishnav Aug 23, 2026
f45882b
refactor(server): extract tool surface modules
Waishnav Aug 23, 2026
bc46c17
refactor(server): compose selected tool surface
Waishnav Aug 23, 2026
8b9cff2
fix(tools): log Codex operation failures
Waishnav Aug 23, 2026
f60d7a8
refactor(tools): keep instructions with adapters
Waishnav Aug 23, 2026
5975c4a
fix(ui): count trailing newlines consistently
Waishnav Aug 23, 2026
b1599df
fix(ui): avoid false overwrite patches
Waishnav Aug 23, 2026
ef39f36
feat(config): replace tool modes with claude and codex
Waishnav Aug 23, 2026
954b44b
refactor(tools): remove dedicated search tools
Waishnav Aug 23, 2026
18e32fa
docs(tools): document the converged surfaces
Waishnav Aug 23, 2026
915eff7
docs(tools): state local shell authority
Waishnav Aug 23, 2026
b4f631f
docs(tools): qualify the Claude inventory
Waishnav Aug 23, 2026
9236e28
docs(config): record tool mode env removal
Waishnav Aug 23, 2026
e5fe89d
feat(review): expose checkpoint availability
Waishnav Aug 23, 2026
3e1e738
feat(review): make aggregate review universal
Waishnav Aug 23, 2026
28496f9
docs(review): document the aggregate UI contract
Waishnav Aug 23, 2026
cc68d94
docs(review): include aggregate tool in inventories
Waishnav Aug 23, 2026
4102eee
fix(review): expose aggregate diff to MCP hosts
Waishnav Aug 23, 2026
4eb087f
refactor(tools): remove generic card payloads
Waishnav Aug 23, 2026
46ce4fb
refactor(ui): keep workspace and review cards only
Waishnav Aug 23, 2026
15f17df
docs(ui): add review surface evidence
Waishnav Aug 23, 2026
801a75e
test(ui): cover empty review titles
Waishnav Aug 23, 2026
11fdcf9
feat(config): define versioned JSONC schema
Waishnav Aug 23, 2026
7743f32
feat(config): migrate legacy JSON once
Waishnav Aug 23, 2026
ebb1dea
test(config): use persisted fixtures
Waishnav Aug 23, 2026
aa2d6ea
docs(config): document JSONC configuration
Waishnav Aug 23, 2026
c9ce866
fix(config): preserve migration and daemon ownership
Waishnav Aug 23, 2026
1726083
fix(config): make legacy migration race-safe
Waishnav Aug 23, 2026
8cf4fcb
fix(ci): normalize schema line endings
Waishnav Aug 23, 2026
d1ae286
fix(config): preserve tunnel URL during init
Waishnav Aug 23, 2026
b224129
fix(config): explain migration conflict recovery
Waishnav Aug 23, 2026
d5ef719
fix(config): preserve comments during init
Waishnav Aug 23, 2026
3f4ff9e
fix(config): anchor schema paths to modules
Waishnav Aug 23, 2026
9b98cc7
fix(review): preserve historical change snapshots
Waishnav Aug 25, 2026
e70c2b1
fix(ui): restore cards from durable tool output
Waishnav Aug 25, 2026
60f7f27
feat(cli): inspect Git-backed reviews
Waishnav Aug 25, 2026
ac1b616
fix(review): harden historical review restore
Waishnav Aug 25, 2026
809f1a4
test(cli): bind review smoke to package entrypoint
Waishnav Aug 25, 2026
1d01936
Merge pull request #249 from Waishnav/codex/v11-ui-reload
Waishnav Aug 26, 2026
0ac5c7a
fix(ui): use theme-specific provider logos
Waishnav Aug 29, 2026
0f2548d
chore(ui): refresh official provider assets
Waishnav Aug 29, 2026
16fada9
fix(ui): preserve workspace state on theme changes
Waishnav Aug 29, 2026
5edee0d
Merge pull request #255 from Waishnav/fix/provider-logo-theme-assets
Waishnav Aug 29, 2026
e4ef989
Delete docs/assets/v11-review-ui-interaction.mp4
Waishnav Aug 29, 2026
38e3c70
fix(claude): scope restricted agent authority
Waishnav Aug 30, 2026
802be13
chore(claude): pin agent SDK runtime
Waishnav Aug 30, 2026
dd0381a
fix(ui): use one vertical scrollbar for change review
Waishnav Aug 31, 2026
b26c728
Merge pull request #258 from Waishnav/fix/claude-subagent-permission-…
Waishnav Aug 31, 2026
5beb7b5
Merge pull request #261 from Waishnav/fix/review-single-scroll
Waishnav Aug 31, 2026
09a9969
fix: ship executable CLI launchers
Waishnav Aug 31, 2026
b9ea8bd
fix(claude): expose general shell execution
Waishnav Aug 31, 2026
78b5190
Merge pull request #263 from Waishnav/fix/claude-general-shell-contract
Waishnav Aug 31, 2026
7b57d70
fix: make npm package self-contained
Waishnav Aug 31, 2026
8a28dba
test: remove test-only helper coverage
Waishnav Aug 31, 2026
59fbd08
test: drop copy-only assertions
Waishnav Aug 31, 2026
a34976c
test: collapse request metadata cases
Waishnav Aug 31, 2026
b6b4d09
Merge pull request #262 from Waishnav/fix/npx-bin-permissions
Waishnav Aug 31, 2026
a354203
test: keep workspace reuse coverage at its owner
Waishnav Aug 31, 2026
72d7743
Merge pull request #265 from Waishnav/chore/trim-test-noise
Waishnav Aug 31, 2026
36d01ee
test: verify provider availability at snapshot seam
Waishnav Aug 31, 2026
8e625cd
test: drop trivial helper assertions
Waishnav Aug 31, 2026
750dc84
test: stop asserting runtime key internals
Waishnav Aug 31, 2026
cd0209d
test: keep agent formatting at CLI seam
Waishnav Aug 31, 2026
bde69d0
Merge pull request #275 from Waishnav/test/tdd-seam-cleanup
Waishnav Aug 31, 2026
a031c78
test: discover test files automatically
Waishnav Aug 31, 2026
89e2e74
chore(dev): use tsx watch for reloads
Waishnav Aug 31, 2026
811bf1b
Merge pull request #277 from Waishnav/chore/dev-test-tooling
Waishnav Aug 31, 2026
bd1f451
chore: adopt pnpm lockfile
Waishnav Aug 31, 2026
14832bb
chore: run tooling with pnpm
Waishnav Aug 31, 2026
75e4ed8
docs: use pnpm for local development
Waishnav Aug 31, 2026
d6dbe95
fix(ci): stabilize pnpm workflow
Waishnav Aug 31, 2026
6f90f49
docs: document local pnpm requirement
Waishnav Aug 31, 2026
9dc4873
chore(deps): upgrade Pierre diffs
Waishnav Aug 31, 2026
cdc20bd
fix(ui): prevent iOS diff text inflation
Waishnav Aug 31, 2026
3bd72a4
Merge pull request #281 from Waishnav/chore/pnpm-tooling
Waishnav Aug 31, 2026
f1dd016
Merge origin/main into fix/ios-diff-font-scaling
Waishnav Aug 31, 2026
35c2e2e
Merge pull request #282 from Waishnav/fix/ios-diff-font-scaling
Waishnav Aug 31, 2026
5100bbe
docs: document Tailscale Funnel root proxy setup
Waishnav Aug 31, 2026
69a00ee
Merge pull request #285 from Waishnav/docs/tailscale-funnel-root-proxy
Waishnav Aug 31, 2026
216e50d
fix: keep linked runtime aligned with source
Rokurolize Sep 5, 2026
62812de
test: cover migrated codex package paths
Rokurolize Sep 5, 2026
f582c69
test: assert codex surface registration
Rokurolize Sep 5, 2026
a971bef
fix: drop unshipped tool mode migration
Rokurolize Sep 5, 2026
f7577f1
test: separate package install smoke coverage
Rokurolize Sep 5, 2026
9ed4232
chore: trigger fork CI validation
Rokurolize Sep 5, 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
25 changes: 15 additions & 10 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ on:
- main
pull_request:

permissions:
contents: read

concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
Expand All @@ -24,22 +27,21 @@ jobs:
- windows-latest

env:
DEVSPACE_ALLOWED_ROOTS: ${{ github.workspace }}
DEVSPACE_OAUTH_OWNER_TOKEN: ci-owner-token-that-is-long-enough
DEVSPACE_PUBLIC_BASE_URL: http://127.0.0.1:7676

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

- name: Setup Node
uses: actions/setup-node@v4
- name: Setup pnpm and Node
uses: pnpm/setup@84cb39b217b10273981911c288cd62326dc7c6d2 # v2
with:
node-version: 22
cache: npm
runtime: node@22
cache: true
install: false

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

- name: Install Pi sandbox dependencies
if: matrix.os == 'ubuntu-latest'
Expand All @@ -51,15 +53,18 @@ jobs:
fi

- name: Typecheck
run: npm run typecheck
run: pnpm typecheck

- name: Test
env:
DEVSPACE_REQUIRE_PI_SANDBOX: ${{ matrix.os == 'ubuntu-latest' && '1' || '0' }}
run: npm test
run: pnpm test

- name: Package install smoke test
run: pnpm test:package-install

- name: Build
run: npm run build
run: pnpm build

- name: Doctor
run: node dist/cli.js doctor
15 changes: 9 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -246,11 +246,14 @@ This year, I began my journey to build a one-person, multi-agent company capable

For working on DevSpace itself:

Install pnpm 11.25.0, the version pinned in `package.json`, with
`npm install --global pnpm@11.25.0`, then:

```bash
npm install --include=dev
npm run dev
npm run typecheck
npm test
npm run build
npm run start
pnpm install --frozen-lockfile
pnpm dev
pnpm typecheck
pnpm test
pnpm build
pnpm start
```
4 changes: 4 additions & 0 deletions bin/devspace-agentd.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#!/usr/bin/env node
import { runEntrypoint } from "./run-entrypoint.js";

await runEntrypoint("../src/local-agent-daemon-main.ts", "../dist/local-agent-daemon-main.js");
4 changes: 4 additions & 0 deletions bin/devspace.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#!/usr/bin/env node
import { runEntrypoint } from "./run-entrypoint.js";

await runEntrypoint("../src/cli.ts", "../dist/cli.js");
20 changes: 20 additions & 0 deletions bin/run-entrypoint.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { existsSync } from "node:fs";
import { fileURLToPath } from "node:url";

export async function runEntrypoint(sourcePath, distPath) {
const sourceUrl = new URL(sourcePath, import.meta.url);
if (existsSync(fileURLToPath(sourceUrl))) {
try {
await import("tsx/esm");
} catch (error) {
throw new Error(
"DevSpace source checkout detected, but tsx is unavailable. Run `pnpm install` in the checkout; refusing to fall back to potentially stale dist output.",
{ cause: error },
);
}
await import(sourceUrl.href);
return;
}

await import(new URL(distPath, import.meta.url).href);
}
5 changes: 3 additions & 2 deletions docs/artifact-exchange.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
# Download a native file

DevSpace can save a file attached or generated by an MCP host, such as ChatGPT,
directly into an open workspace. Enable the tool with `DEVSPACE_ARTIFACTS=1`.
directly into an open workspace. Enable the tool with
`artifacts.enabled` in `~/.devspace/config.jsonc`.

## Workflow

Expand Down Expand Up @@ -36,7 +37,7 @@ file-object shape, trusted OpenAI download hosts, and redirects before streaming
Malformed references, unknown fields, absolute paths, traversal, and symlinked
parents are rejected.

Downloads are streamed under `DEVSPACE_ARTIFACT_MAX_FILE_BYTES` and published as
Downloads are streamed under `artifacts.maxFileBytes` and published as
owner-only files without overwriting an existing destination. The tool is
currently available on Linux. It is not registered on macOS, Windows, or BSD
because Node.js does not expose the required descriptor-relative filesystem
Expand Down
Binary file added docs/assets/v11-review-ui-after.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/assets/v11-review-ui-before.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
65 changes: 37 additions & 28 deletions docs/chatgpt-coding-workflow.md
Original file line number Diff line number Diff line change
Expand Up @@ -117,8 +117,8 @@ DevSpace discovers standard Agent Skills from:
It also keeps compatibility with:

- the bundled `subagents` skill when Subagents are enabled, unless `~/.devspace/skills/subagents/SKILL.md` exists
- `DEVSPACE_AGENT_DIR/skills`, defaulting to `~/.codex/skills`
- additional paths from `DEVSPACE_SKILL_PATHS`
- `skills.agentDir/skills`, defaulting to `~/.codex/skills`
- additional paths from `skills.paths`

When Subagents are enabled, DevSpace discovers agent profiles
from `~/.devspace/agents/*.md` and project `.devspace/agents/*.md`.
Expand All @@ -130,7 +130,7 @@ Example profiles are packaged under `examples/agents/` for users who want
starter templates. Copy or adapt them into one of the active profile directories
before use.

Legacy project paths such as `.pi/skills` can be added through `DEVSPACE_SKILL_PATHS` when needed.
Legacy project paths such as `.pi/skills` can be added to `skills.paths` when needed.

When `open_workspace` returns matching skills, the model should read the
advertised `SKILL.md` before following that skill.
Expand All @@ -140,8 +140,8 @@ Skill paths may be outside the workspace. DevSpace only permits reading:
- advertised `SKILL.md` files
- files under a skill directory after that skill's `SKILL.md` has been read

Set `DEVSPACE_SKILLS=0` to hide skills from workspace output. Enable Subagents
and choose providers through `devspace init` or the persisted provider
Set `skills.enabled` to `false` to hide skills from workspace output. Enable
Subagents and choose providers through `devspace init` or the persisted provider
configuration. The bundled `subagents` skill teaches the minimal
`devspace agents targets`, `devspace agents ls`, `devspace agents run`,
`devspace agents continue`, and `devspace agents show` workflow. The catalog
Expand All @@ -150,48 +150,57 @@ sessions for that workspace.

## Tool Names

DevSpace exposes these tool names:
The Claude surface exposes these tool names:

- `open_workspace`
- `read`
- `write`
- `edit`
- `bash`
- `show_changes`

By default, DevSpace also runs in `DEVSPACE_TOOL_MODE=minimal`, so dedicated
`grep`, `glob`, and `ls` tools are hidden. Use `bash` with command-line tools
such as `rg`, `find`, and `ls` for search and directory inspection.

Use `DEVSPACE_TOOL_MODE=full` to restore dedicated search and directory tools.

The experimental Codex-style surface is enabled with
`DEVSPACE_TOOL_MODE=codex`. It exposes:
DevSpace uses the Codex-style surface by default. It exposes:

- `open_workspace`
- `read`
- `apply_patch`
- `exec_command`
- `write_stdin`
- `show_changes`

In this mode, `write`, `edit`, `bash`, `grep`, `glob`, and `ls` are not
registered. `exec_command` returns a process session ID when a command is still
In this mode, `write`, `edit`, and `bash` are not registered. `exec_command`
returns a process session ID when a command is still
running after its yield window. Use `write_stdin` to poll it, send input, resize
a PTY, or send Ctrl-C. Set `tty: true` only for commands that need a terminal.

## Show Changes

By default, `DEVSPACE_WIDGETS=full`.

In that mode, DevSpace attaches widget UI to the exposed workspace, file, edit,
and shell tools. The aggregate `show_changes` tool is not exposed by default.
Set `tools.mode` to `claude` in `~/.devspace/config.jsonc` to expose `write`,
`edit`, and `bash` instead of the Codex mutation and command tools. Dedicated
MCP tools for `grep`, `glob`, and `ls` are not registered in either mode; use
the configured shell tool with command-line tools such as `rg`, `find`, and
`ls`.

Use `DEVSPACE_WIDGETS=off` to disable widget UI, or `DEVSPACE_WIDGETS=changes`
to expose the aggregate show-changes flow.
## Show Changes

When `show_changes` is exposed, call it exactly once after the final file
modification in any turn that changes files. It shows the combined changes for
that turn and advances the review point automatically. Reusing a workspace does
not change this workflow.
DevSpace exposes `show_changes` in both tool modes and attaches widget UI only
to `open_workspace` and `show_changes`. Reads, edits, and commands return normal
MCP results without creating an iframe for each call. Set `ui.enabled` to
`false` in `~/.devspace/config.jsonc` to disable UI metadata while keeping the
aggregate review tool available.

Call `show_changes` exactly once after the final file modification in any turn
that changes files. It shows the combined changes for that turn and advances
the review point automatically. Reusing a workspace does not change this
workflow.

The model-facing result stays compact: DevSpace returns the workspace ID, a
Git-backed `reviewRef`, and the summary text. MCP Apps hosts receive the full
file list and patch in result metadata for immediate rendering. If a host later
restores only the structured result, the review card can reopen that exact
`reviewRef` from DevSpace's Git review history without advancing the current
review point.

For local inspection, run `devspace show-changes <review-ref>`. Add `--json` to
include the parsed summary, file list, and patch.

## Shell Use

Expand Down
Loading
Loading