mixdog 1.0.12 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +75 -181
- package/package.json +4 -2
- package/scripts/build-shipped-history.mjs +131 -0
- package/scripts/lib/run-node-tests.mjs +235 -13
- package/scripts/lib/test-failure-records.mjs +5 -0
- package/scripts/lib/test-failure-summary.mjs +9 -3
- package/scripts/lib/test-spawn-ledger.mjs +19 -0
- package/scripts/prune-embedding-runtime.mjs +9 -5
- package/scripts/test-direct.mjs +16 -1
- package/src/agents/advisor/AGENT.md +38 -0
- package/src/agents/advisor/agent.json +6 -0
- package/src/agents/reviewer/AGENT.md +5 -2
- package/src/agents/reviewer/agent.json +1 -1
- package/src/defaults/shipped-history.json +381 -0
- package/src/defaults/skills/goal-management/SKILL.md +11 -5
- package/src/defaults/skills/setup/SKILL.md +5 -8
- package/src/defaults/skills/setup/references/actions.md +61 -31
- package/src/defaults/skills/setup/references/surfaces.md +12 -10
- package/src/lib/rules-builder.cjs +1 -1
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +3 -1
- package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +4 -0
- package/src/runtime/agent/orchestrator/config-presets.d.mts +1 -0
- package/src/runtime/agent/orchestrator/config-presets.mjs +44 -0
- package/src/runtime/agent/orchestrator/config-providers-merge.mjs +9 -1
- package/src/runtime/agent/orchestrator/config.mjs +102 -21
- package/src/runtime/agent/orchestrator/providers/account-pool.mjs +77 -26
- package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +44 -14
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +11 -2
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-login.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +3 -3
- package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +388 -0
- package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +92 -109
- package/src/runtime/agent/orchestrator/providers/custom-reasoning.mjs +107 -0
- package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +51 -9
- package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +14 -9
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +51 -11
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +6 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +7 -5
- package/src/runtime/agent/orchestrator/providers/openai-compat-options.mjs +12 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +27 -7
- package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +12 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +6 -1
- package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/quota-reading.mjs +70 -0
- package/src/runtime/agent/orchestrator/providers/registry.mjs +38 -3
- package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +19 -35
- package/src/runtime/agent/orchestrator/runtime-core/effort.mjs +5 -0
- package/src/runtime/agent/orchestrator/runtime-core/goal-mutations.mjs +0 -17
- package/src/runtime/agent/orchestrator/runtime-core/goal-state.mjs +0 -3
- package/src/runtime/agent/orchestrator/runtime-core/goal-store.mjs +0 -1
- package/src/runtime/agent/orchestrator/runtime-core/goal-text.mjs +1 -1
- package/src/runtime/agent/orchestrator/runtime-core/goal-tool-defs.mjs +1 -1
- package/src/runtime/agent/orchestrator/runtime-core/goal-tool-exec.mjs +1 -2
- package/src/runtime/agent/orchestrator/runtime-core/goal-turns.mjs +18 -4
- package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +7 -1
- package/src/runtime/agent/orchestrator/runtime-core/session-route-policy.mjs +16 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +2 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +2 -2
- package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +7 -7
- package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/loop/step-auto-effort.mjs +28 -3
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +24 -11
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +2 -6
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +63 -3
- package/src/runtime/agent/orchestrator/session/manager/session-tool-surface.mjs +4 -4
- package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +1 -0
- package/src/runtime/agent/orchestrator/stall-policy.mjs +0 -1
- package/src/runtime/agent/orchestrator/tools/builtin/atomic-write.mjs +18 -8
- package/src/runtime/agent/orchestrator/tools/builtin/cache-layers.mjs +19 -20
- package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +6 -11
- package/src/runtime/agent/orchestrator/tools/builtin/file-version-test-helpers.mjs +11 -0
- package/src/runtime/agent/orchestrator/tools/builtin/file-version.mjs +13 -0
- package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-single-file-rescue.mjs +8 -5
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-task-output.mjs +25 -12
- package/src/runtime/agent/orchestrator/tools/builtin/raw-content-publication.mjs +17 -0
- package/src/runtime/agent/orchestrator/tools/builtin/read-range-index.mjs +136 -76
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-render.mjs +15 -17
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-tool.mjs +4 -2
- package/src/runtime/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +11 -10
- package/src/runtime/agent/orchestrator/tools/builtin/read-source-windows.mjs +5 -3
- package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +30 -16
- package/src/runtime/agent/orchestrator/tools/builtin/snapshot-helpers.mjs +4 -11
- package/src/runtime/agent/orchestrator/tools/builtin/snapshot-store.mjs +7 -3
- package/src/runtime/agent/orchestrator/tools/builtin/snapshot-validation.mjs +16 -19
- package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-background.mjs +4 -1
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +14 -4
- package/src/runtime/agent/orchestrator/tools/patch/apply-patch/codex-batch.mjs +58 -8
- package/src/runtime/agent/orchestrator/tools/patch/content-guard.mjs +47 -0
- package/src/runtime/agent/orchestrator/tools/patch/delete-quarantine.mjs +155 -0
- package/src/runtime/agent/orchestrator/tools/patch/dispatch/native-proofs.mjs +6 -2
- package/src/runtime/agent/orchestrator/tools/patch/dispatch/native-snapshots.mjs +6 -2
- package/src/runtime/agent/orchestrator/tools/patch/dispatch.mjs +19 -16
- package/src/runtime/agent/orchestrator/tools/patch/matcher.mjs +13 -44
- package/src/runtime/agent/orchestrator/tools/patch/orchestrator.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/patch/post-patch-excerpts.mjs +5 -2
- package/src/runtime/agent/orchestrator/tools/patch/replay-capture.mjs +47 -7
- package/src/runtime/agent/orchestrator/tools/patch/rollback-state.mjs +72 -8
- package/src/runtime/agent/orchestrator/tools/patch/section-coalesce.mjs +3 -2
- package/src/runtime/agent/orchestrator/tools/patch/sequence/run.mjs +9 -1
- package/src/runtime/agent/orchestrator/tools/patch/sequence/units.mjs +9 -1
- package/src/runtime/agent/orchestrator/tools/patch/sequence.mjs +6 -6
- package/src/runtime/agent/orchestrator/tools/patch/ui-diff.mjs +16 -4
- package/src/runtime/agent/orchestrator/tools/patch/v4a-convert.mjs +35 -14
- package/src/runtime/agent/orchestrator/tools/patch/wave.mjs +42 -4
- package/src/runtime/agent/orchestrator/tools/shell-codepage.mjs +296 -0
- package/src/runtime/agent/orchestrator/tools/shell-exec-output.mjs +75 -24
- package/src/runtime/channels/lib/config.mjs +3 -8
- package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +7 -3
- package/src/{tui → runtime/channels}/lib/voice-setup.mjs +38 -22
- package/src/runtime/channels/lib/webhook/request-handler.mjs +42 -8
- package/src/runtime/computer-bridge/actions.mjs +2 -0
- package/src/runtime/effort-judge/judge-client.mjs +12 -3
- package/src/runtime/effort-judge/model-manifest.json +7 -7
- package/src/runtime/effort-judge/previous-human-request.mjs +162 -0
- package/src/runtime/effort-judge/verified-context-input.mjs +10 -0
- package/src/runtime/memory/lib/embedding-provider.mjs +12 -0
- package/src/runtime/memory/lib/http-router/session-routes.mjs +2 -1
- package/src/runtime/memory/lib/memory-config-flags.mjs +3 -2
- package/src/runtime/memory/lib/memory-embed.mjs +5 -0
- package/src/runtime/shared/agent-route-config.mjs +50 -2
- package/src/runtime/shared/bounded-file-read.mjs +166 -0
- package/src/runtime/shared/builtin-grandfathering.mjs +37 -0
- package/src/runtime/shared/config.mjs +24 -4
- package/src/runtime/shared/defaults-separation.mjs +263 -0
- package/src/runtime/shared/llm/anthropic-effort.mjs +4 -0
- package/src/runtime/shared/llm/model-catalog.mjs +23 -0
- package/src/runtime/shared/llm/usage-ledger-rollup.mjs +105 -1
- package/src/runtime/shared/llm/usage-ledger-worker.mjs +2 -1
- package/src/runtime/shared/llm/usage-ledger.mjs +72 -5
- package/src/runtime/shared/onnx-runtime-support.mjs +6 -0
- package/src/runtime/shared/orchestration.mjs +14 -6
- package/src/runtime/shared/projects.mjs +65 -48
- package/src/runtime/shared/provider-accounts.mjs +47 -6
- package/src/runtime/shared/quota-resume-store.mjs +255 -0
- package/src/runtime/shared/shipped-definitions.mjs +275 -0
- package/src/runtime/shared/tool-card-model.golden.json +3 -3
- package/src/runtime/shared/tool-result-summary.mjs +86 -15
- package/src/runtime/shared/transcript-metadata.mjs +2 -0
- package/src/runtime/shared/turn-review-reply.mjs +2 -0
- package/src/runtime/shared/turn-snapshot.mjs +65 -6
- package/src/runtime/shared/turn-worktree-snapshot.mjs +202 -22
- package/src/session-runtime/boot/apis.mjs +19 -0
- package/src/session-runtime/boot/config.mjs +4 -0
- package/src/session-runtime/boot/facade.mjs +4 -1
- package/src/session-runtime/boot/infrastructure.mjs +21 -2
- package/src/session-runtime/boot/session.mjs +3 -0
- package/src/session-runtime/channel-config-api.mjs +5 -0
- package/src/session-runtime/config-lifecycle/config-writers.mjs +3 -0
- package/src/session-runtime/config-lifecycle.mjs +31 -6
- package/src/session-runtime/goal-facade-api.mjs +4 -0
- package/src/session-runtime/lifecycle/inheritance.mjs +28 -6
- package/src/session-runtime/lifecycle/session-switch/context-switch.mjs +3 -0
- package/src/session-runtime/lifecycle/session-switch/resume.mjs +7 -1
- package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +6 -0
- package/src/session-runtime/lifecycle/teardown/session-close.mjs +14 -2
- package/src/session-runtime/media-api.mjs +32 -22
- package/src/session-runtime/model-recency.mjs +14 -0
- package/src/session-runtime/model-route/route-tuning.mjs +3 -5
- package/src/session-runtime/model-route/set-route.mjs +49 -21
- package/src/session-runtime/model-route-api.mjs +2 -1
- package/src/session-runtime/notification-bus.mjs +31 -6
- package/src/session-runtime/provider-auth/login.mjs +6 -0
- package/src/session-runtime/provider-models/catalog-load.mjs +3 -1
- package/src/session-runtime/provider-models/row-hydration.mjs +15 -14
- package/src/session-runtime/quick-model-rows/model-meta.mjs +26 -0
- package/src/session-runtime/quick-model-rows/provider-rows.mjs +40 -14
- package/src/session-runtime/resource-api.mjs +8 -1
- package/src/session-runtime/runtime-core.mjs +4 -0
- package/src/session-runtime/runtime-facade.mjs +20 -1
- package/src/session-runtime/runtime-review-api.mjs +12 -1
- package/src/session-runtime/services/agent-tool/helpers.mjs +4 -0
- package/src/session-runtime/services/agent-tool/index-write-queue.mjs +10 -15
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +11 -3
- package/src/session-runtime/services/agent-tool/spawn-preset.mjs +2 -0
- package/src/session-runtime/services/channel-admin.mjs +87 -13
- package/src/session-runtime/services/provider-admin.mjs +256 -63
- package/src/session-runtime/services/seeds.mjs +73 -142
- package/src/session-runtime/services/usage-dashboard-model.mjs +29 -0
- package/src/session-runtime/services/usage-dashboard.mjs +7 -0
- package/src/session-runtime/session-address.mjs +125 -0
- package/src/session-runtime/session-create.mjs +57 -2
- package/src/session-runtime/settings-builtin-tools-api.mjs +8 -0
- package/src/session-runtime/settings-compaction-api.mjs +13 -0
- package/src/session-runtime/setup-tool/executor.mjs +92 -40
- package/src/session-runtime/setup-tool/extended-actions.mjs +64 -5
- package/src/session-runtime/setup-tool/settings-contract.mjs +44 -1
- package/src/session-runtime/setup-tool/tool-defs.mjs +12 -7
- package/src/session-runtime/tool-surface.mjs +16 -9
- package/src/session-runtime/turn/session-ops.mjs +3 -0
- package/src/session-runtime/turn/share-ops.mjs +4 -1
- package/src/session-runtime/turn/turn-run/turn-prepare.mjs +6 -0
- package/src/session-runtime/usage-stats-api.mjs +15 -0
- package/src/session-runtime/workflow-agents-api/agent-editor.mjs +31 -5
- package/src/session-runtime/workflow-agents-api/agent-route.mjs +4 -0
- package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +27 -7
- package/src/standalone/daemon-boot-coordinator.mjs +10 -0
- package/src/standalone/daemon-drain-policy.mjs +9 -0
- package/src/standalone/daemon-stored-session-views.mjs +7 -8
- package/src/standalone/daemon.mjs +21 -5
- package/src/standalone/local-session-runtime.mjs +11 -0
- package/src/standalone/session-client.mjs +52 -7
- package/src/standalone/session-protocol.mjs +8 -0
- package/src/standalone/session-service/agent-tree/agent-child.mjs +2 -0
- package/src/standalone/session-service/entries/lifecycle.mjs +2 -0
- package/src/standalone/session-service/entries/session-loads.mjs +9 -0
- package/src/standalone/session-service/projection/revisions.mjs +28 -4
- package/src/standalone/session-service/projection.mjs +1 -0
- package/src/standalone/session-service/quota-resume.mjs +140 -0
- package/src/standalone/session-service/session-calls/session-action.mjs +2 -2
- package/src/standalone/session-service/session-calls.mjs +10 -2
- package/src/standalone/session-service/stored-reader.mjs +26 -1
- package/src/standalone/session-service.mjs +21 -0
- package/src/standalone/session-transport/routes.mjs +2 -0
- package/src/tui/app/doctor.mjs +7 -11
- package/src/tui/app/maintenance-pickers/auto-clear-picker.mjs +3 -5
- package/src/tui/app/settings-picker/settings-rows.mjs +4 -6
- package/src/tui/app/settings-picker/settings-toggles/store-toggles.mjs +1 -1
- package/src/tui/app/slash-dispatch/route-commands.mjs +3 -2
- package/src/tui/components/ContextPanel.jsx +5 -1
- package/src/tui/components/Spinner.jsx +34 -319
- package/src/tui/components/SpinnerByline.jsx +256 -0
- package/src/tui/components/use-spinner-progress.mjs +113 -0
- package/src/tui/dist/index.mjs +15540 -14452
- package/src/tui/session/agent-job-feed/execution-delivery.mjs +13 -1
- package/src/tui/session/agent-job-feed/notification-router.mjs +3 -0
- package/src/tui/session/agent-job-feed/pending-resume.mjs +14 -1
- package/src/tui/session/agent-job-feed.mjs +4 -0
- package/src/tui/session/context-state.mjs +13 -1
- package/src/tui/session/initial-state.mjs +6 -0
- package/src/tui/session/quota-resume.mjs +263 -0
- package/src/tui/session/session-api/intake/abort.mjs +39 -35
- package/src/tui/session/session-api/intake/submission.mjs +13 -21
- package/src/tui/session/session-api/intake.mjs +3 -3
- package/src/tui/session/session-api/integrations.mjs +5 -1
- package/src/tui/session/session-api/lifecycle/dispose.mjs +1 -0
- package/src/tui/session/session-api/lifecycle/inheritance.mjs +2 -2
- package/src/tui/session/session-api/lifecycle/session-reset.mjs +4 -0
- package/src/tui/session/session-api/lifecycle.mjs +71 -2
- package/src/tui/session/session-api/media.mjs +2 -2
- package/src/tui/session/session-api/quota-resume.mjs +21 -0
- package/src/tui/session/session-api/routes.mjs +2 -0
- package/src/tui/session/session-api/settings.mjs +1 -0
- package/src/tui/session/session-api.mjs +2 -0
- package/src/tui/session/session-flow/auto-clear.mjs +14 -6
- package/src/tui/session/session-flow/drain.mjs +52 -5
- package/src/tui/session/session-flow/queue/take-entries.mjs +2 -3
- package/src/tui/session/session-flow/queue.mjs +3 -0
- package/src/tui/session/session-flow/steering.mjs +11 -0
- package/src/tui/session/session-flow.mjs +1 -0
- package/src/tui/session/tool-approval.mjs +7 -2
- package/src/tui/session/transcript-intake.mjs +1 -0
- package/src/tui/session/turn.mjs +40 -3
- package/src/vendor/statusline/bin/statusline-route.mjs +3 -2
package/README.md
CHANGED
|
@@ -1,199 +1,80 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<img src="https://raw.githubusercontent.com/tribgames/mixdog/main/apps/desktop/build/mixdog.png"
|
|
2
|
+
<img src="https://raw.githubusercontent.com/tribgames/mixdog/main/apps/desktop/build/mixdog.png" width="80" alt="Mixdog">
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
5
|
<h1 align="center">Mixdog</h1>
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
|
-
|
|
9
|
-
Free, open-source desktop coding agent for Windows.
|
|
8
|
+
The open-source coding agent that uses 63% fewer tokens.
|
|
10
9
|
</p>
|
|
11
10
|
|
|
12
11
|
<p align="center">
|
|
13
|
-
<a href="https://github.com/tribgames/mixdog/releases/latest/download/mixdog-desktop-win-x64.exe">
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
<a href="https://github.com/tribgames/mixdog/releases/latest/download/mixdog-desktop-win-x64.exe"><img src="https://raw.githubusercontent.com/tribgames/mixdog/main/docs/assets/download-windows.svg" alt="Download for Windows" height="48"></a>
|
|
13
|
+
|
|
14
|
+
<a href="https://github.com/tribgames/mixdog/releases/latest/download/mixdog-desktop-mac-arm64.dmg"><img src="https://raw.githubusercontent.com/tribgames/mixdog/main/docs/assets/download-macos.svg" alt="Download for macOS" height="48"></a>
|
|
15
|
+
<br>
|
|
16
|
+
<sub>macOS button is for Apple Silicon (M1 and later). Intel Mac? <a href="https://github.com/tribgames/mixdog/releases/latest/download/mixdog-desktop-mac-x64.dmg">Download for Intel Mac</a></sub>
|
|
16
17
|
</p>
|
|
17
18
|
|
|
18
19
|
<p align="center">
|
|
19
|
-
<a href="https://github.com/tribgames/mixdog/releases/latest"><img src="https://img.shields.io/github/v/release/tribgames/mixdog?
|
|
20
|
-
<a href="
|
|
21
|
-
<img src="https://img.shields.io/badge/
|
|
20
|
+
<a href="https://github.com/tribgames/mixdog/releases/latest"><img alt="Release" src="https://img.shields.io/github/v/release/tribgames/mixdog?style=flat-square"></a>
|
|
21
|
+
<a href="https://www.npmjs.com/package/mixdog"><img alt="npm" src="https://img.shields.io/npm/v/mixdog?style=flat-square"></a>
|
|
22
|
+
<a href="LICENSE"><img alt="License" src="https://img.shields.io/badge/license-Apache--2.0-blue?style=flat-square"></a>
|
|
22
23
|
</p>
|
|
23
24
|
|
|
24
25
|
<p align="center">
|
|
25
|
-
<
|
|
26
|
-
|
|
26
|
+
<a href="https://aiscroll.io/mixdog/"><b>Website</b></a> ·
|
|
27
|
+
<a href="benchmarks/terminal-bench-2.1/"><b>Benchmarks</b></a> ·
|
|
28
|
+
<a href="#documentation"><b>Docs</b></a>
|
|
27
29
|
</p>
|
|
28
30
|
|
|
29
|
-
|
|
30
|
-
<img src="https://raw.githubusercontent.com/tribgames/mixdog/main/docs/assets/desktop.png" alt="Mixdog Desktop" width="860">
|
|
31
|
-
</p>
|
|
32
|
-
|
|
33
|
-
<a name="benchmarks"></a>
|
|
34
|
-
## Same performance, 63% fewer tokens
|
|
35
|
-
|
|
36
|
-
Mixdog and Codex CLI ran Terminal-Bench 2.1 on the same model, GPT-5.6 Sol
|
|
37
|
-
xhigh. Both passed the same share of tasks. Mixdog used 63% fewer tokens.
|
|
31
|
+
https://github.com/user-attachments/assets/af515dc9-b0fb-4b6a-aaa1-1d82db792ed0
|
|
38
32
|
|
|
39
|
-
|
|
40
|
-
| --- | --- | --- | --- |
|
|
41
|
-
| **Total tokens** (incl. cached input) | **156.5M** | 421.4M | **63% fewer** |
|
|
42
|
-
| Success rate | **86.5%** (385/445) | 86.1% (383/445) | matched |
|
|
43
|
-
| Priced cost per trial | **$0.476** | $0.782 | 39% lower |
|
|
44
|
-
| Median first request | **4.7k** | 14.4k | 67% smaller |
|
|
45
|
-
| Median final context | **18.5k** | 34.3k | 46% smaller |
|
|
46
|
-
| Wall time per trial | **415s** | 437s | matched |
|
|
33
|
+
## Highlights
|
|
47
34
|
|
|
48
|
-
|
|
35
|
+
- [63% fewer tokens](#benchmarks) than Codex CLI on the same model, at the
|
|
36
|
+
same success rate.
|
|
37
|
+
- [**Auto reasoning effort**](docs/auto-reasoning-effort.md) — each message
|
|
38
|
+
and tool step gets the effort it needs, judged in about 0.1 s by a 130 MB
|
|
39
|
+
model that runs locally on the CPU. On by default.
|
|
40
|
+
- Use the **Claude, ChatGPT, or Grok** subscription you already have, API
|
|
41
|
+
keys, or local models on your own GPU.
|
|
42
|
+
- Mix models by role and scale from **Solo to Swarm** — a strong model leads
|
|
43
|
+
while cheaper ones search, edit, and review in parallel.
|
|
44
|
+
- A full workspace: editor, terminals, Git and GitHub, code graph, and
|
|
45
|
+
language servers.
|
|
46
|
+
- Keeps working on its own with **Goals, schedules, and webhooks** — and
|
|
47
|
+
continues from your phone, end-to-end encrypted.
|
|
48
|
+
- Goes beyond code with **browser and desktop control**, Office and PDF
|
|
49
|
+
documents, and image and video generation.
|
|
50
|
+
- Runs on Windows and macOS. No config files.
|
|
49
51
|
|
|
50
|
-
|
|
51
|
-
trials per side — with unmodified task timeouts and resources, scored by the
|
|
52
|
-
official Harbor verifier.
|
|
53
|
-
- **Same conditions on both sides.** Same model and reasoning level, the same
|
|
54
|
-
kind of subscription sign-in, fast mode off, no retries of task failures or
|
|
55
|
-
agent timeouts.
|
|
56
|
-
- **Everything is published.** Verdicts, verifier output, and usage snapshots
|
|
57
|
-
for both sides, plus the scripts that recompute every number, are in
|
|
58
|
-
[`benchmarks/terminal-bench-2.1/`](benchmarks/terminal-bench-2.1/).
|
|
52
|
+
## Installation
|
|
59
53
|
|
|
60
|
-
|
|
54
|
+
Download the desktop app:
|
|
61
55
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
| Token change | Tasks |
|
|
56
|
+
| Platform | Download |
|
|
65
57
|
| --- | --- |
|
|
66
|
-
|
|
|
67
|
-
|
|
|
68
|
-
|
|
|
69
|
-
| 0–25% fewer | 2 |
|
|
70
|
-
| More tokens | 2 |
|
|
71
|
-
|
|
72
|
-
Pass counts were equal on 60 tasks; Mixdog passed more trials on 14 and Codex
|
|
73
|
-
CLI on 15. Mixdog used more tokens on `mteb-leaderboard` (6.8×) and
|
|
74
|
-
`crack-7z-hash` (1.4×). Every task is listed in
|
|
75
|
-
[`results.md`](benchmarks/terminal-bench-2.1/results.md).
|
|
76
|
-
|
|
77
|
-
<details>
|
|
78
|
-
<summary><b>Claude Opus 5 — Mixdog vs Claude Code</b> (single pass, 89 trials each)</summary>
|
|
58
|
+
| Windows (x64) | [`mixdog-desktop-win-x64.exe`](https://github.com/tribgames/mixdog/releases/latest/download/mixdog-desktop-win-x64.exe) |
|
|
59
|
+
| macOS (Apple Silicon) | [`mixdog-desktop-mac-arm64.dmg`](https://github.com/tribgames/mixdog/releases/latest/download/mixdog-desktop-mac-arm64.dmg) |
|
|
60
|
+
| macOS (Intel) | [`mixdog-desktop-mac-x64.dmg`](https://github.com/tribgames/mixdog/releases/latest/download/mixdog-desktop-mac-x64.dmg) |
|
|
79
61
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
| Solved | **79/89** | 77/89 | +2 tasks |
|
|
83
|
-
| Priced cost per run | **$104.29** | $129.21 | 19% lower |
|
|
84
|
-
| Median final context | **27.6k** | 38.2k | 28% smaller |
|
|
85
|
-
| Wall time per trial | **610s** | 708s | 1.16× faster |
|
|
62
|
+
Then sign in with a ChatGPT, Claude, or Grok account, or paste an API key. A
|
|
63
|
+
five-step tutorial walks you through the rest.
|
|
86
64
|
|
|
87
|
-
!
|
|
65
|
+
> [!NOTE]
|
|
66
|
+
> The Windows installer is not code-signed yet. If SmartScreen appears,
|
|
67
|
+
> choose **More info → Run anyway**. The Mac app is signed and notarized.
|
|
88
68
|
|
|
89
|
-
|
|
69
|
+
Or run it in the terminal (Node.js 22.19+ or 24+):
|
|
90
70
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
rates, not subscription charges. Results measure the pinned source revision.
|
|
96
|
-
The leaderboard is not accepting community submissions, so the runs are
|
|
97
|
-
published here instead.</sub>
|
|
98
|
-
|
|
99
|
-
## How it uses fewer tokens
|
|
100
|
-
|
|
101
|
-
- **A light start.** System instructions and tool descriptions are kept to
|
|
102
|
-
what the model needs.
|
|
103
|
-
*67% smaller first request — 4.7k tokens against 14.4k.*
|
|
104
|
-
- **Fewer round trips.** The agent picks the right tool first and runs
|
|
105
|
-
independent actions in one batch.
|
|
106
|
-
*33% fewer model requests — a median of 10 per trial against 16.*
|
|
107
|
-
- **Smaller requests.** Tools return only the part that was asked for, and
|
|
108
|
-
95% of terminal output is filtered before it reaches the model.
|
|
109
|
-
*46% less input per request — 24.3k tokens against 44.9k.*
|
|
110
|
-
- **Shorter output.** Less filler and repetition in replies.
|
|
111
|
-
*8% fewer output tokens.*
|
|
112
|
-
|
|
113
|
-
The benchmark ran one model in one session. In everyday use, more applies on
|
|
114
|
-
top of that:
|
|
115
|
-
|
|
116
|
-
- **Auto-clear.** After a long break, the conversation is compacted before
|
|
117
|
-
work resumes.
|
|
118
|
-
- **Light compaction.** Long sessions continue from a structured handoff
|
|
119
|
-
instead of the full history.
|
|
120
|
-
- **Database memory.** Past work is stored and searched, so the prompt does
|
|
121
|
-
not grow with the archive.
|
|
122
|
-
- **Code graph.** Query a project's structure instead of reading whole files.
|
|
123
|
-
- **Orchestration.** Hand routine work to cheaper models and keep the
|
|
124
|
-
expensive one for the steps that need it.
|
|
125
|
-
|
|
126
|
-
See [Context efficiency](docs/context-efficiency.md) for how each layer works.
|
|
127
|
-
|
|
128
|
-
## A model for each job
|
|
129
|
-
|
|
130
|
-
Not every step needs your most expensive model.
|
|
131
|
-
|
|
132
|
-
- **Mix models by role.** Let a strong model lead and plan while cheaper ones
|
|
133
|
-
search, edit, and review.
|
|
134
|
-
- **Dial delegation from Solo to Swarm.** The lead can do the work itself or
|
|
135
|
-
coordinate a team of agents working in parallel.
|
|
136
|
-
- **Workflows you can read.** Workflows and agents are plain Markdown
|
|
137
|
-
(`WORKFLOW.md`, `AGENT.md`) with visual editors in the app.
|
|
138
|
-
- **Every account in one place.** Claude, ChatGPT, and Grok subscriptions, API
|
|
139
|
-
keys, and local models side by side.
|
|
140
|
-
- **Run models on your own GPU.** The built-in Local Provider downloads and
|
|
141
|
-
runs models inside the app.
|
|
142
|
-
- **Know what it costs.** Usage by provider and model — input, output, cache
|
|
143
|
-
hits, and cost — plus quota windows and resets.
|
|
144
|
-
|
|
145
|
-
## Everything in one window
|
|
146
|
-
|
|
147
|
-
- **A full workspace.** Tabs and split panes, Monaco editor, terminals, file
|
|
148
|
-
explorer, and language servers that start when you open a file.
|
|
149
|
-
- **Git and GitHub built in.** Review changes, commit, and handle pull
|
|
150
|
-
requests, issues, Actions, and releases without leaving the app.
|
|
151
|
-
- **Code that stays clean.** The code graph maps a project's structure, and
|
|
152
|
-
Code Tidy formats, lints, and applies structural fixes.
|
|
153
|
-
- **Memory that lasts.** Mixdog remembers what matters across sessions and
|
|
154
|
-
searches past work on demand.
|
|
155
|
-
- **Extend it.** Add skills, MCP servers, and plugins from one Extensions view.
|
|
156
|
-
|
|
157
|
-
## It keeps working when you step away
|
|
158
|
-
|
|
159
|
-
- **Goals.** Set a Goal and the session keeps working toward it — pause and
|
|
160
|
-
resume whenever you like.
|
|
161
|
-
- **Schedules and webhooks.** Run a task on a timer or whenever a URL is
|
|
162
|
-
called.
|
|
163
|
-
- **Your phone is the remote.** Scan a QR code to continue the same live
|
|
164
|
-
session from your phone, end-to-end encrypted, with a notification when the
|
|
165
|
-
task finishes.
|
|
166
|
-
|
|
167
|
-
## Beyond code
|
|
168
|
-
|
|
169
|
-
- **Browser Use.** Operate real, signed-in web pages, with Chrome profile
|
|
170
|
-
import.
|
|
171
|
-
- **Computer Use.** Operate native Windows apps with guarded input and an
|
|
172
|
-
on-screen Stop control.
|
|
173
|
-
- **Documents.** Create and edit Word, Excel, PowerPoint, and PDF with
|
|
174
|
-
rendered previews.
|
|
175
|
-
- **Image and video Studio.** Generate and edit with a local gallery.
|
|
176
|
-
|
|
177
|
-
Browser Use and Computer Use are opt-in and ask for approval before their
|
|
178
|
-
first live call in each session.
|
|
179
|
-
|
|
180
|
-
## Get started
|
|
181
|
-
|
|
182
|
-
[Download the installer](https://github.com/tribgames/mixdog/releases/latest/download/mixdog-desktop-win-x64.exe)
|
|
183
|
-
and sign in. No config files, no YAML, no terminal.
|
|
184
|
-
|
|
185
|
-
- **One sign-in and you are working.** Use the ChatGPT, Claude, or Grok
|
|
186
|
-
subscription you already pay for, or paste an API key. Mixdog picks the
|
|
187
|
-
model for you.
|
|
188
|
-
- **Advanced setups, one switch each.** A team of agents, a model per role,
|
|
189
|
-
long-term memory, phone access — each is a toggle, not a config file.
|
|
190
|
-
- **You won't get lost.** A short tutorial gets you set up in five quick
|
|
191
|
-
steps.
|
|
192
|
-
- **Batteries included.** Git, Memory, Browser, and Office tools ship with the
|
|
193
|
-
app. Turn on what you need.
|
|
71
|
+
```bash
|
|
72
|
+
npm install -g mixdog
|
|
73
|
+
mixdog
|
|
74
|
+
```
|
|
194
75
|
|
|
195
76
|
<details>
|
|
196
|
-
<summary
|
|
77
|
+
<summary>Supported providers</summary>
|
|
197
78
|
|
|
198
79
|
- Anthropic API keys and Claude account OAuth
|
|
199
80
|
- OpenAI API keys and ChatGPT/Codex account OAuth
|
|
@@ -209,14 +90,7 @@ Cursor and Antigravity (Gemini) OAuth are off by default under
|
|
|
209
90
|
</details>
|
|
210
91
|
|
|
211
92
|
<details>
|
|
212
|
-
<summary
|
|
213
|
-
|
|
214
|
-
Mixdog also runs in the terminal. Requires Node.js 22.19+ (22.x) or 24+.
|
|
215
|
-
|
|
216
|
-
```bash
|
|
217
|
-
npm install -g mixdog
|
|
218
|
-
mixdog
|
|
219
|
-
```
|
|
93
|
+
<summary>Headless <code>mixdog exec</code></summary>
|
|
220
94
|
|
|
221
95
|
`mixdog exec` runs one non-interactive, single-model session without personal
|
|
222
96
|
memory, prior sessions, skills, MCP servers, or plugins:
|
|
@@ -226,15 +100,35 @@ mixdog exec --provider openai-oauth --model gpt-5.6-sol --effort xhigh "fix the
|
|
|
226
100
|
```
|
|
227
101
|
|
|
228
102
|
Web search is off by default (`--web-search` enables it). This does not block
|
|
229
|
-
shell networking — headless exec is not an offline sandbox.
|
|
230
|
-
|
|
231
|
-
Run `mixdog --help` for the full reference.
|
|
103
|
+
shell networking — headless exec is not an offline sandbox. Run
|
|
104
|
+
`mixdog --help` for the full reference.
|
|
232
105
|
|
|
233
106
|
</details>
|
|
234
107
|
|
|
235
|
-
##
|
|
108
|
+
## Benchmarks
|
|
109
|
+
|
|
110
|
+
<p align="center">
|
|
111
|
+
<picture>
|
|
112
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/tribgames/mixdog/main/benchmarks/terminal-bench-2.1/tb21-sol-vs-codex-dark.svg">
|
|
113
|
+
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/tribgames/mixdog/main/benchmarks/terminal-bench-2.1/tb21-sol-vs-codex-light.svg">
|
|
114
|
+
<img alt="Bar chart: Mixdog vs Codex CLI on Terminal-Bench 2.1" src="https://raw.githubusercontent.com/tribgames/mixdog/main/benchmarks/terminal-bench-2.1/tb21-sol-vs-codex-light.svg">
|
|
115
|
+
</picture>
|
|
116
|
+
</p>
|
|
117
|
+
|
|
118
|
+
<p align="center">
|
|
119
|
+
<i>All 89 Terminal-Bench 2.1 tasks × 5 trials on GPT-5.6 Sol xhigh, scored by the official Harbor verifier.</i>
|
|
120
|
+
</p>
|
|
121
|
+
|
|
122
|
+
Mixdog used fewer tokens on 87 of 89 tasks. With Claude Opus 5, it solved 2
|
|
123
|
+
more tasks than Claude Code at 19% lower cost. Every verdict, log, and script
|
|
124
|
+
is published in [`benchmarks/terminal-bench-2.1/`](benchmarks/terminal-bench-2.1/),
|
|
125
|
+
and [Context efficiency](docs/context-efficiency.md) explains where the
|
|
126
|
+
savings come from.
|
|
127
|
+
|
|
128
|
+
## Documentation
|
|
236
129
|
|
|
237
130
|
- [Context efficiency](docs/context-efficiency.md)
|
|
131
|
+
- [Auto reasoning effort](docs/auto-reasoning-effort.md)
|
|
238
132
|
- [Benchmarks](benchmarks/terminal-bench-2.1/)
|
|
239
133
|
- [Code Tidy](docs/code-tidy.md)
|
|
240
134
|
- [Git & GitHub](docs/git-github-integration.md)
|
|
@@ -250,5 +144,5 @@ you tokens, a star helps others find it.
|
|
|
250
144
|
|
|
251
145
|
## License
|
|
252
146
|
|
|
253
|
-
Mixdog is licensed under [Apache-2.0](LICENSE).
|
|
254
|
-
|
|
147
|
+
Mixdog is licensed under [Apache-2.0](LICENSE). Third-party components retain
|
|
148
|
+
their respective licenses; see [NOTICE.md](NOTICE.md).
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mixdog",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Open-source coding agent that matches Codex on Terminal-Bench 2.1 with 63% fewer tokens.",
|
|
@@ -57,7 +57,9 @@
|
|
|
57
57
|
],
|
|
58
58
|
"scripts": {
|
|
59
59
|
"postinstall": "node scripts/prune-embedding-runtime.mjs && node scripts/prepare-native-assets.mjs",
|
|
60
|
-
"prepack": "npm run build:tui",
|
|
60
|
+
"prepack": "npm run build:shipped-history && npm run build:tui",
|
|
61
|
+
"build:shipped-history": "node scripts/build-shipped-history.mjs",
|
|
62
|
+
"check:shipped-history": "node scripts/build-shipped-history.mjs --check",
|
|
61
63
|
"prepublishOnly": "node -e \"if(!process.env.CI){console.error('local npm publish is disabled — run npm run release:patch');process.exit(1)}\"",
|
|
62
64
|
"start": "node src/cli.mjs",
|
|
63
65
|
"test": "node scripts/test.mjs",
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* scripts/build-shipped-history.mjs — emit src/defaults/shipped-history.json:
|
|
4
|
+
* normalised-content hashes of every past shipped version of the agents,
|
|
5
|
+
* workflows, output styles and bundled skills, read from git history.
|
|
6
|
+
*
|
|
7
|
+
* The startup migration (src/session-runtime/services/seeds.mjs) treats a data
|
|
8
|
+
* dir copy matching any of these hashes as "unchanged" and moves it to a
|
|
9
|
+
* backup so the current shipped version applies. Hash and normalisation code
|
|
10
|
+
* is shared with the runtime (src/runtime/shared/shipped-definitions.mjs).
|
|
11
|
+
*
|
|
12
|
+
* Run: node scripts/build-shipped-history.mjs (also part of `prepack`)
|
|
13
|
+
* node scripts/build-shipped-history.mjs --check (release workflow)
|
|
14
|
+
* A shallow clone has no history: the committed file is left untouched.
|
|
15
|
+
*/
|
|
16
|
+
import { execFileSync } from 'node:child_process';
|
|
17
|
+
import { readFileSync, writeFileSync } from 'node:fs';
|
|
18
|
+
import { dirname, join } from 'node:path';
|
|
19
|
+
import { fileURLToPath } from 'node:url';
|
|
20
|
+
import {
|
|
21
|
+
SHIPPED_HISTORY_FILE,
|
|
22
|
+
hashDefinition,
|
|
23
|
+
hashText,
|
|
24
|
+
hashTree,
|
|
25
|
+
packDefinitionFrom,
|
|
26
|
+
} from '../src/runtime/shared/shipped-definitions.mjs';
|
|
27
|
+
|
|
28
|
+
const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..');
|
|
29
|
+
const OUT = join(ROOT, 'src', ...SHIPPED_HISTORY_FILE);
|
|
30
|
+
// --check: write nothing, exit 1 when the committed file differs (release gate).
|
|
31
|
+
const CHECK = process.argv.includes('--check');
|
|
32
|
+
|
|
33
|
+
const git = (...args) =>
|
|
34
|
+
execFileSync('git', args, { cwd: ROOT, maxBuffer: 1 << 28, stdio: ['ignore', 'pipe', 'inherit'] });
|
|
35
|
+
const lines = (buffer) => buffer.toString('utf8').split('\n').filter(Boolean);
|
|
36
|
+
|
|
37
|
+
if (git('rev-parse', '--is-shallow-repository').toString().trim() === 'true') {
|
|
38
|
+
console.warn('build-shipped-history: shallow clone, keeping the committed src/defaults/shipped-history.json');
|
|
39
|
+
process.exit(0);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const blobs = new Map();
|
|
43
|
+
const blob = (sha) => {
|
|
44
|
+
if (!blobs.has(sha)) blobs.set(sha, git('cat-file', 'blob', sha));
|
|
45
|
+
return blobs.get(sha);
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
/** Names (path segment after `prefix`) that ever existed under prefix. */
|
|
49
|
+
function everNames(prefix) {
|
|
50
|
+
const names = new Set();
|
|
51
|
+
for (const file of lines(git('log', '--name-only', '--format=', '--', prefix))) {
|
|
52
|
+
if (file.startsWith(`${prefix}/`)) names.add(file.slice(prefix.length + 1).split('/')[0]);
|
|
53
|
+
}
|
|
54
|
+
return [...names].sort();
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** Every version of `path`: Map of relative path -> blob sha, one per commit that touched it. */
|
|
58
|
+
function versionsOf(path) {
|
|
59
|
+
const versions = [];
|
|
60
|
+
for (const commit of lines(git('log', '--format=%H', '--', path))) {
|
|
61
|
+
const files = new Map();
|
|
62
|
+
for (const row of lines(git('ls-tree', '-r', commit, '--', path))) {
|
|
63
|
+
const [meta, file] = row.split('\t');
|
|
64
|
+
files.set(file.slice(path.length + 1) || file.split('/').pop(), meta.split(' ')[2]);
|
|
65
|
+
}
|
|
66
|
+
if (files.size) versions.push(files);
|
|
67
|
+
}
|
|
68
|
+
return versions;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const unique = (hashes) => [...new Set(hashes)].sort();
|
|
72
|
+
|
|
73
|
+
function packHistory(dir, entry) {
|
|
74
|
+
const out = {};
|
|
75
|
+
for (const id of everNames(dir)) {
|
|
76
|
+
const hashes = [];
|
|
77
|
+
for (const files of versionsOf(`${dir}/${id}`)) {
|
|
78
|
+
const read = (name) => (files.has(name) ? blob(files.get(name)).toString('utf8') : null);
|
|
79
|
+
const definition = packDefinitionFrom(read, entry, id);
|
|
80
|
+
if (definition) hashes.push(hashDefinition(definition));
|
|
81
|
+
}
|
|
82
|
+
if (hashes.length) out[id] = unique(hashes);
|
|
83
|
+
}
|
|
84
|
+
return out;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function outputStyleHistory() {
|
|
88
|
+
const out = {};
|
|
89
|
+
for (const name of everNames('src/output-styles')) {
|
|
90
|
+
const hashes = versionsOf(`src/output-styles/${name}`).map((files) => hashText(blob([...files.values()][0])));
|
|
91
|
+
if (hashes.length) out[name] = unique(hashes);
|
|
92
|
+
}
|
|
93
|
+
return out;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function skillHistory() {
|
|
97
|
+
const out = {};
|
|
98
|
+
for (const name of everNames('src/defaults/skills')) {
|
|
99
|
+
const hashes = versionsOf(`src/defaults/skills/${name}`).map((files) =>
|
|
100
|
+
hashTree([...files].map(([rel, sha]) => [rel, blob(sha)]))
|
|
101
|
+
);
|
|
102
|
+
if (hashes.length) out[name] = unique(hashes);
|
|
103
|
+
}
|
|
104
|
+
return out;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const history = {
|
|
108
|
+
agents: packHistory('src/agents', 'AGENT.md'),
|
|
109
|
+
workflows: packHistory('src/workflows', 'WORKFLOW.md'),
|
|
110
|
+
outputStyles: outputStyleHistory(),
|
|
111
|
+
skills: skillHistory(),
|
|
112
|
+
};
|
|
113
|
+
const text = `${JSON.stringify(history, null, 2)}\n`;
|
|
114
|
+
if (CHECK) {
|
|
115
|
+
let committed = '';
|
|
116
|
+
try {
|
|
117
|
+
committed = readFileSync(OUT, 'utf8');
|
|
118
|
+
} catch {
|
|
119
|
+
committed = '';
|
|
120
|
+
}
|
|
121
|
+
if (committed !== text) {
|
|
122
|
+
console.error(
|
|
123
|
+
'build-shipped-history: src/defaults/shipped-history.json is stale; run `npm run build:shipped-history` and commit it'
|
|
124
|
+
);
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
console.log('build-shipped-history: committed history is current');
|
|
128
|
+
} else {
|
|
129
|
+
writeFileSync(OUT, text);
|
|
130
|
+
console.log(`build-shipped-history: wrote ${OUT}`);
|
|
131
|
+
}
|