Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
4d526f5
perf(issues): fetch the issue list's first page in one request (#9088)
27Bslash6 Oct 7, 2026
c4fea18
fix(agent): keep an Antigravity answer a trailing transport error cut…
seacen Oct 7, 2026
bb14e87
feat(issues): add multi_text and multi_url custom property types (MUL…
b0o0wen Oct 7, 2026
e0f84dd
fix(docs): use stable self-host upgrade references (MUL-7897) (#9091)
SATA260 Oct 7, 2026
647b18b
fix(search): recognize digit-containing issue prefixes across search …
Bohan-J Oct 8, 2026
fbd3470
MUL-7875 fix(daemon): preserve Hermes sessions across worktrees (ZIC-…
vicksiyi Oct 8, 2026
8db6cfe
fix(desktop): align navigation and tab toolbar content (#9127)
forrestchang Oct 8, 2026
13520a0
fix(cli): keep member names off free-form property lists (#9093)
SATA260 Oct 8, 2026
5063fc9
MUL-7869: fix(agent): fail kimi runs whose wire log records a failed …
ggbdpq Oct 8, 2026
00e24a8
fix(agent): create fresh OMP sessions without resume (#9131)
vicksiyi Oct 9, 2026
3bacc41
MUL-7573 fix(lark): clear the Typing reaction without trusting in-pro…
WitMiao Oct 9, 2026
e5d4acf
fix(ci): require Go 1.26.9 security patches (#9143)
Bohan-J Oct 9, 2026
c76a012
MUL-7936 fix(onboarding): replace archived Kimi CLI with Kimi Code CL…
xiaoxiaowesley Oct 9, 2026
cf6a8ca
MUL-7842 fix: patch Next.js GHSA-vcvr-r3jv-pc5j (#9007)
r05323028 Oct 9, 2026
10a7e51
MUL-7797 fix(daemon): detect the Codex CLI nested in ChatGPT.app (#8944)
SATA260 Oct 9, 2026
e7742b0
MUL-7776: fix(api): stop returning raw error text in 500 responses (#…
tauanbinato Oct 10, 2026
a3ff0f5
fix(mobile): adopt iOS scene lifecycle with Expo SDK 57 (MUL-7852, ZI…
vicksiyi Oct 10, 2026
c8d6a1f
MUL-7923: fix(test): isolate test home on Windows so tests stop overw…
zhangrui0517 Oct 10, 2026
5acefb6
fix(views): label text steps correctly in run details (#9153)
xiajiahang Oct 11, 2026
dd0d605
fix(chat): preserve follow-ups while the active head loads (#9134)
mameikagou Oct 11, 2026
b301178
test(billing): make date assertions time-zone independent (#9178)
Austin-AI2026 Oct 11, 2026
a820c9a
fix(task): preserve autopilot attribution after run completion (#9158)
xiajiahang Oct 11, 2026
3647ec9
MUL-7687 fix(wecom): push an issue notification through the acting ag…
basuotian Oct 12, 2026
d6956ed
feat(daemon): report full CLI build commit in local identity (MUL-795…
jikuya-kunihiko Oct 12, 2026
53b1bab
feat(cli): add opt-in daemon autostart (MUL-7731) (#8864)
zhangrui0517 Oct 12, 2026
41c9bba
fix(projects): preserve omitted fields in concurrent updates (#9111)
SATA260 Oct 12, 2026
756cdd9
MUL-7794 fix(wakeups): surface recoverable PR condition diagnostics […
vicksiyi Oct 12, 2026
92d0b66
MUL-7812: fix(agent): deliver MCP servers to Pi tasks (#9063)
SATA260 Oct 12, 2026
8a2f518
fix(agent): MUL-7781 / MUL-7793 interrupt Codex turns after repeated …
evan188199-tech Oct 12, 2026
eb59a69
fix(daemon): preserve host temp for Windows Claude Git Bash (#8985)
makesomethingshit Oct 12, 2026
3d02148
MUL-7697: fix(daemon): keep host TMP/TEMP for every Windows task (#9197)
multica-eve Oct 12, 2026
8046463
MUL-7937 fix(realtime): guard client send channel teardown (#9145)
kassdinzheng123 Oct 12, 2026
b115ec8
MUL-7851: fix(daemon): don't count host sleep as idle-watchdog silenc…
multica-eve Oct 12, 2026
432eb8e
fix(skills): restore legacy issue skill redirect for pre-merge daemon…
multica-eve Oct 13, 2026
74ff8aa
MUL-7983: fix(agent): handle CodeBuddy startup errors without abortin…
ggbdpq Oct 13, 2026
9310690
MUL-7933: fix(wakeups): drain inputs and due checks in one pass (#9202)
multica-eve Oct 13, 2026
bd04660
MUL-7978: feat(search): switch workspaces from the Mod+K palette (#9195)
tim-smart Oct 13, 2026
c6b451c
fix(views): route plain attachment download links through the re-sign…
erlinerd Oct 13, 2026
191c782
MUL-7988: recover daemon when profile health port is unavailable (#9217)
multica-eve Oct 13, 2026
0a979b1
fix(search): classify client cancellation separately from server erro…
Frezc Oct 13, 2026
55c40d5
MUL-7982: resume Codex across continued local worktrees (#9218)
multica-eve Oct 13, 2026
c73ea81
MUL-7994: send chat conversation starters on click (#9220)
multica-eve Oct 13, 2026
0f3993e
fix(cli): classify interrupted upload responses as network errors (#9…
sol713 Oct 13, 2026
5436c0c
fix(scheduler): stop a dense-cron autopilot trigger going permanently…
Battleplus Oct 13, 2026
691e5b4
test(wakeup): cover cross-issue conditions through scheduler (#9179)
sol713 Oct 13, 2026
765267e
fix(deploy): retain pnpm patches in Vercel and web Docker builds (MUL…
multica-eve Oct 13, 2026
7ab92d7
docs(changelog): add v0.6.2 release entry (2026-10-13) (MUL-7998) (#9…
multica-eve Oct 13, 2026
cac409f
chore: merge upstream main 7ab92d7622ec
Oct 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
8 changes: 6 additions & 2 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,14 @@ coverage
/docs/
*.md

# Only the web workspace is used by Dockerfile.web. Default-exclude future
# app workspaces so they do not silently enter the build context.
# Dockerfile.web needs the web workspace and root dependency patch inputs.
# Default-exclude other app files so they do not enter the build context.
/apps/*
!/apps/web/
!/apps/mobile
/apps/mobile/*
!/apps/mobile/patches
!/apps/mobile/patches/**

# Repository-only tooling
/.github/
Expand Down
8 changes: 8 additions & 0 deletions .github/RELEASING.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,14 @@ formulae, and container images.
The verification job runs the Go tests and `govulncheck` before any publishing
job starts. The vulnerability scan is fail-closed by default.

CI and release jobs require Go `~1.26.9`: at least 1.26.9, while accepting
newer 1.26 patches. This security floor is independent of the development
minimum in `server/go.mod`. A plain `1.26.x` can resolve to an older patch
while the `setup-go` version manifest catches up with an official Go release.
When raising the security floor, update all Go workflows and the pinned
Go builder image in `Dockerfile` together so shipped binaries also receive
the fixes.

## Emergency vulnerability-scan bypass

Use the bypass only when `govulncheck` itself or its live vulnerability database
Expand Down
31 changes: 19 additions & 12 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ jobs:
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: "1.26.x"
go-version: "~1.26.9"
check-latest: true
cache-dependency-path: server/go.sum

Expand Down Expand Up @@ -348,9 +348,9 @@ jobs:
id: go
uses: actions/setup-go@v5
with:
# Deliberately independent from the minimum patch in server/go.mod:
# CI follows the newest 1.26 patch available to setup-go.
go-version: "1.26.x"
# Keep the security floor even when the setup-go manifest lags;
# continue accepting newer patches within Go 1.26.
go-version: "~1.26.9"
check-latest: true
cache: false

Expand Down Expand Up @@ -450,7 +450,7 @@ jobs:
id: go
uses: actions/setup-go@v5
with:
go-version: "1.26.x"
go-version: "~1.26.9"
check-latest: true
cache: false

Expand Down Expand Up @@ -488,9 +488,9 @@ jobs:
- name: Setup Go
uses: actions/setup-go@v5
with:
# Deliberately independent from the minimum patch in server/go.mod:
# CI follows the newest 1.26 patch available to setup-go.
go-version: "1.26.x"
# Keep the security floor even when the setup-go manifest lags;
# continue accepting newer patches within Go 1.26.
go-version: "~1.26.9"
check-latest: true
cache-dependency-path: server/go.sum

Expand Down Expand Up @@ -527,9 +527,9 @@ jobs:
- name: Setup Go
uses: actions/setup-go@v5
with:
# Deliberately independent from the minimum patch in server/go.mod:
# CI follows the newest 1.26 patch available to setup-go.
go-version: "1.26.x"
# Keep the security floor even when the setup-go manifest lags;
# continue accepting newer patches within Go 1.26.
go-version: "~1.26.9"
check-latest: true
cache-dependency-path: server/go.sum

Expand All @@ -547,6 +547,13 @@ jobs:
# real skills instead of the test directories.
run: go test ./internal/daemon -v -run '^(TestListRuntimeLocalSkills_HermesFollowsTaskHome|TestLocalSkills_DiscoversACPProviderRoots)$' -count=1 -timeout=5m

- name: Test Windows Git Bash temp lifecycle
working-directory: server
run: |
$env:MULTICA_TEST_GIT_BASH = "$env:ProgramFiles\Git\usr\bin\bash.exe"
if (-not (Test-Path -LiteralPath $env:MULTICA_TEST_GIT_BASH)) { throw "Git for Windows is required" }
go test -tags=gitbashintegration ./internal/daemon -v -run '^(TestWindowsGitBashTaskTempLifecycle|TestTaskMulticaEnvironment.*|TestTaskTempBaseDir)$' -count=1 -timeout=5m

- name: Test Windows agent launcher argv/stdin handling
working-directory: server
# Agent prompts must never reach a Windows launcher through argv: the
Expand Down Expand Up @@ -788,7 +795,7 @@ jobs:
- uses: actions/checkout@v6
- uses: actions/setup-go@v5
with:
go-version: "1.26.x"
go-version: "~1.26.9"
cache-dependency-path: server/go.sum
- name: Verify Cursor background lifecycle and watchdog races
shell: bash
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/desktop-smoke.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@ jobs:
- name: Setup Go
uses: actions/setup-go@v5
with:
# Deliberately independent from the minimum patch in server/go.mod:
# CI follows the newest 1.26 patch available to setup-go.
go-version: "1.26.x"
# Keep the security floor even when the setup-go manifest lags;
# continue accepting newer patches within Go 1.26.
go-version: "~1.26.9"
check-latest: true
cache-dependency-path: server/go.sum

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/openclaw-config-smoke.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ jobs:
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: "1.26.x"
go-version: "~1.26.9"
check-latest: true
cache-dependency-path: server/go.sum

Expand Down
18 changes: 9 additions & 9 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,9 @@ jobs:
- name: Setup Go
uses: actions/setup-go@v5
with:
# Deliberately independent from the minimum patch in server/go.mod:
# releases follow the newest 1.26 patch available to setup-go.
go-version: "1.26.x"
# Keep the security floor even when the setup-go manifest lags;
# continue accepting newer patches within Go 1.26.
go-version: "~1.26.9"
check-latest: true
cache-dependency-path: server/go.sum

Expand Down Expand Up @@ -98,9 +98,9 @@ jobs:
- name: Setup Go
uses: actions/setup-go@v5
with:
# Deliberately independent from the minimum patch in server/go.mod:
# releases follow the newest 1.26 patch available to setup-go.
go-version: "1.26.x"
# Keep the security floor even when the setup-go manifest lags;
# continue accepting newer patches within Go 1.26.
go-version: "~1.26.9"
check-latest: true
cache-dependency-path: server/go.sum

Expand Down Expand Up @@ -424,9 +424,9 @@ jobs:
- name: Setup Go
uses: actions/setup-go@v5
with:
# Deliberately independent from the minimum patch in server/go.mod:
# releases follow the newest 1.26 patch available to setup-go.
go-version: "1.26.x"
# Keep the security floor even when the setup-go manifest lags;
# continue accepting newer patches within Go 1.26.
go-version: "~1.26.9"
check-latest: true
cache-dependency-path: server/go.sum

Expand Down
1 change: 1 addition & 0 deletions .goreleaser.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ builds:
- -s -w
- -X main.version={{.Version}}
- -X main.commit={{.ShortCommit}}
- -X main.buildCommit={{.FullCommit}}
- -X main.date={{.Date}}
env:
- CGO_ENABLED=0
Expand Down
5 changes: 5 additions & 0 deletions .vercelignore
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,11 @@ _features
!/apps/web/**
!/apps/docs
!/apps/docs/**
# Root pnpm patchedDependencies needs these files even for frontend-only installs.
!/apps/mobile
/apps/mobile/*
!/apps/mobile/patches
!/apps/mobile/patches/**
/scripts/

*.log
Expand Down
55 changes: 53 additions & 2 deletions CLI_AND_DAEMON.md
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,57 @@ availability stays independent of a third party's release cadence.
Desktop-managed daemons ignore both, because the Desktop app owns its bundled
CLI's lifecycle.

### Boot autostart

Opt-in: only `multica daemon autostart enable` registers the profile's
daemon with the OS, so the machine brings it back after a reboot or re-login
— without that, every reboot takes the runtime offline and queued runs sit
unclaimed. `daemon start` never registers on its own: it prints a one-line
hint when nothing is registered, and otherwise stays out of the way.

| Platform | Mechanism | Where |
| --- | --- | --- |
| Windows | Per-user Run key | `HKCU\Software\Microsoft\Windows\CurrentVersion\Run`, value `Multica` |
| macOS | launchd LaunchAgent | `~/Library/LaunchAgents/ai.multica.daemon.plist` (runs at login) |
| Linux | systemd user unit | `~/.config/systemd/user/multica-daemon.service`; without systemd, an XDG autostart entry under `~/.config/autostart/` |

Each entry runs `multica daemon start --foreground` for that profile — named
profiles get their own entry, so several daemons on one machine never collide.
Daemon settings are read from the profile's config (`multica config set ...`)
at start. Shell environment variables do **not** travel into a login session:
only `PATH` is snapshotted at registration (and refreshed while Multica owns
the entry), which is what keeps agent CLIs installed via Homebrew, nvm, or a
user bin directory discoverable — persist everything else with
`multica config set` or your user environment. On Linux, `enable` also tells
you (it does not run it for you) how to `loginctl enable-linger $USER` so a
headless machine starts the unit at boot rather than at first login.

```bash
multica daemon autostart enable # the only thing that registers
multica daemon autostart status # what is registered, and where
multica daemon autostart status --output json
multica daemon autostart disable # remove the registration
```

Refresh: while an entry exists and carries Multica's ownership marker,
`daemon start` silently rewrites it so a moved executable (a Homebrew
upgrade, a self-update) heals. An entry at the same path that Multica did
not create — your own systemd unit, a hand-written LaunchAgent — is never
refreshed and never overwritten: `enable`/`disable` refuse it and say which
file is in the way, and the refresh is additionally skipped when the daemon
was launched by an external supervisor (systemd `INVOCATION_ID` for a unit
that is not ours).

`daemon stop` stops the daemon but keeps the registration — it says nothing
about the next boot; `autostart disable` is what turns that off. Disabling
never disturbs a running daemon: on Linux the wants link is removed while
the managed unit file stays (unlinked), so the current session keeps the
unit's restart policy across a binary update and only the next-login start
goes away; on macOS the plist is deleted without a `launchctl bootout`, so
the process launchd is supervising keeps running. Daemons started by the
Multica Desktop app are never registered or refreshed here: the app owns
that daemon's lifecycle through its own app-start daemon preference.

### Stop

```bash
Expand Down Expand Up @@ -309,7 +360,7 @@ The daemon periodically scans `MULTICA_WORKSPACES_ROOT` and applies several disk

- **Hermes session store reclamation** — a conversation's Hermes transcript (`state.db`) lives at `<profile dir>/hermes-sessions/<agent-id>/<hermes-profile>/<conversation>/`, outside any task directory, so a follow-up turn can resume it (see [Hermes agent memory](#hermes-agent-memory)). A store untouched for `MULTICA_GC_HERMES_SESSION_TTL` is removed. The default matches the Codex session store rather than the memory store above: these hold full transcripts, and reclaiming an idle one costs a thread that starts fresh (with a continuity notice), not an agent that forgot what it learned. A store a running task holds is never reclaimed.
- **Hermes memory store reclamation** — a Hermes agent's long-term memory (`memories/`) lives at `<profile dir>/hermes-state/<agent-id>/<hermes-profile>/`, outside any task directory, so it survives across tasks and issues (see [Hermes agent memory](#hermes-agent-memory)). A store untouched for `MULTICA_GC_HERMES_MEMORY_TTL` is removed, giving a deleted agent's memory an eventual-reclamation guarantee. The default is deliberately long: these are a handful of markdown files, and reclaiming one is user-visible amnesia rather than a cache miss. A store a running task holds is never reclaimed.
- **Task temp dir reclamation** — every task gets a private temp directory (`multica-task-*`) under the system temp base (`/tmp`, or `MULTICA_AGENT_TEMP_BASE`), exported to the agent as `TMPDIR`/`TMP`/`TEMP`. It is removed when the run ends, but that removal never happens when the daemon is killed and does not succeed while a file inside is still open — common on Windows, where an open handle makes the delete fail outright. These directories live outside `MULTICA_WORKSPACES_ROOT`, so nothing else reclaimed them and whatever the end-of-run removal missed accumulated forever. Every GC cycle now sweeps the temp base. Liveness is decided by the directory's `.task_lock` — the same OS advisory lock an env root uses, which the kernel releases when the holding process dies — not by age: a directory still in use is never removed however old it is, including one owned by a different daemon sharing the same temp base, and a directory whose owner is gone is removed on the next cycle however new it is. Directories left by a daemon predating that lock carry no lock file, so nothing can be proven about them and age is the only signal available. Reclaiming those is an operator's explicit decision: `MULTICA_GC_TASK_TEMP_LEGACY_TTL` defaults to `0`, which leaves them in place. Set it to a duration only once you know no pre-lock daemon is still running tasks on this machine — a task may legitimately run for weeks (there is no default agent timeout), a daemon on another profile can still be on the old binary, and every daemon on the machine shares one temp base, so a TTL here can delete a `TMPDIR` that is still in use. Each GC cycle logs how many such directories it left alone. Even with a TTL set, a directory holding no task content is never reclaimed on age — an old empty leftover, or a shell left by a daemon that died between creating the directory and publishing its lock — because holding no content is exactly what a directory currently being published looks like, and deleting one of those would take the `TMPDIR` of a task that is starting. Those shells are a few bytes each. Only entries carrying the `multica-task-` prefix are ever considered — the temp base itself is usually shared with other programs — and a directory this sweep cannot read is never touched.
- **Task temp dir reclamation** — every task gets a private temp directory (`multica-task-*`) under the system temp base (`/tmp`, or `MULTICA_AGENT_TEMP_BASE`), exported to the agent as `TMPDIR`/`TMP`/`TEMP`. On Windows, every task instead inherits the daemon user's `TMP`/`TEMP`: Git Bash's `/tmp` mount is shared by all of the user's live Git Bash processes, whichever runtime started them, so it must never point at a task directory that will be deleted. `TMPDIR` stays task-local, and for Claude Code `CLAUDE_CODE_TMPDIR` defaults to that directory unless the user overrides it. It is removed when the run ends, but that removal never happens when the daemon is killed and does not succeed while a file inside is still open — common on Windows, where an open handle makes the delete fail outright. These directories live outside `MULTICA_WORKSPACES_ROOT`, so nothing else reclaimed them and whatever the end-of-run removal missed accumulated forever. Every GC cycle now sweeps the temp base. Liveness is decided by the directory's `.task_lock` — the same OS advisory lock an env root uses, which the kernel releases when the holding process dies — not by age: a directory still in use is never removed however old it is, including one owned by a different daemon sharing the same temp base, and a directory whose owner is gone is removed on the next cycle however new it is. Directories left by a daemon predating that lock carry no lock file, so nothing can be proven about them and age is the only signal available. Reclaiming those is an operator's explicit decision: `MULTICA_GC_TASK_TEMP_LEGACY_TTL` defaults to `0`, which leaves them in place. Set it to a duration only once you know no pre-lock daemon is still running tasks on this machine — a task may legitimately run for weeks (there is no default agent timeout), a daemon on another profile can still be on the old binary, and every daemon on the machine shares one temp base, so a TTL here can delete a `TMPDIR` that is still in use. Each GC cycle logs how many such directories it left alone. Even with a TTL set, a directory holding no task content is never reclaimed on age — an old empty leftover, or a shell left by a daemon that died between creating the directory and publishing its lock — because holding no content is exactly what a directory currently being published looks like, and deleting one of those would take the `TMPDIR` of a task that is starting. Those shells are a few bytes each. Only entries carrying the `multica-task-` prefix are ever considered — the temp base itself is usually shared with other programs — and a directory this sweep cannot read is never touched.

Configured patterns are basename-only — entries containing `/` or `\` are silently dropped — and `.git` subtrees are never descended into. The managed Codex cache is matched by its exact relative path, so a repository's own `.sandbox-bin` is not removed unless an operator explicitly adds that basename to `MULTICA_GC_ARTIFACT_PATTERNS`. The default list (`node_modules`, `.next`, `.turbo`) is intentionally narrow; extend it per deployment if your repos consistently produce other regenerable directories (for example, `MULTICA_GC_ARTIFACT_PATTERNS=node_modules,.next,.turbo,target,__pycache__`). To disable artifact cleanup entirely, including the managed Codex cache, set `MULTICA_GC_ARTIFACT_TTL=0`.

Expand Down Expand Up @@ -457,7 +508,7 @@ multica daemon start --profile staging
multica daemon start
```

Each profile gets its own config directory (`~/.multica/profiles/<name>/`), daemon state, health port, and workspace root. Daemon state means that profile's own `daemon.log`, `daemon.err.log`, and `daemon.pid` live in that directory too — see [Start](#start) for the layout, and pass `--profile <name>` to `daemon status` / `daemon logs` to act on it.
Each profile gets its own config directory (`~/.multica/profiles/<name>/`), daemon state, health port, and workspace root. Daemon state means that profile's own `daemon.log`, `daemon.err.log`, `daemon.pid`, and `daemon.port` live in that directory too — see [Start](#start) for the layout, and pass `--profile <name>` to `daemon status` / `daemon logs` to act on it. The daemon normally uses the profile-derived health port. If the OS refuses that port, it binds an available loopback port and records the actual port in `daemon.port` for lifecycle commands. The record is valid only while its daemon is alive; do not edit it to configure a port.

## Workspaces

Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ This keeps Docker simple while still isolating schema and data.

- Node.js `22`
- `pnpm` `10.28.2`
- Go `1.26.6`
- Go `1.26.9`
- Docker

## Important Rules
Expand Down
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# --- Build stage ---
FROM golang:1.26-alpine AS builder
FROM golang:1.26.9-alpine AS builder

RUN apk add --no-cache git

Expand Down
2 changes: 2 additions & 0 deletions Dockerfile.web
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ COPY pnpm-lock.yaml pnpm-workspace.yaml package.json turbo.json .npmrc ./
COPY apps/web/package.json apps/web/
# postinstall runs fumadocs-mdx which reads apps/web/source.config.ts
COPY apps/web/source.config.ts apps/web/source.config.ts
# Root pnpm patchedDependencies is read even without the mobile workspace.
COPY apps/mobile/patches/ apps/mobile/patches/
COPY packages/core/package.json packages/core/
COPY packages/ui/package.json packages/ui/
COPY packages/views/package.json packages/views/
Expand Down
Loading
Loading