Skip to content
Merged
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
e3c875f
feat(plugins): add reviewed OAuth AI providers
LIghtJUNction Oct 1, 2026
cab8b77
fix(tui): keep plugin auth resolution within provider module
LIghtJUNction Oct 2, 2026
3bb5281
Merge upstream main into plugin OAuth provider branch
LIghtJUNction Oct 2, 2026
f0344e9
feat(runtime-api): read what one tool call changed, from the snapshot…
gaord Oct 2, 2026
9a6921d
test(FEAT-027): freeze public policy and status behavior
Oct 3, 2026
993a66f
feat(FEAT-027): add narrow config policy contract facets
Oct 3, 2026
533eef6
feat(FEAT-027): project policy observations through host adapters
Oct 3, 2026
aa82e86
feat(FEAT-027): adopt portable permission and status handlers
Oct 3, 2026
a92c55b
test(FEAT-027): prove complete config policy extraction boundary
Oct 3, 2026
49ced23
fix(FEAT-027): preserve exact missing capability diagnostics
Oct 3, 2026
d8f79d4
refactor(FEAT-027): share monetary formatting and reconcile migration…
Oct 3, 2026
88ae611
test(FEAT-027): cover real Fleet drift observations and read-only status
Oct 3, 2026
6fc343d
fix(FEAT-027): make the config-policy tests portable to macOS and Win…
aboimpinto Oct 3, 2026
adde7a6
test(tasks): wait for idle store quiescence before measuring reloads
Oct 3, 2026
1afc0d6
fix(tasks): acknowledge worker inspection before crossing lifecycle b…
Oct 3, 2026
42e20e5
fix(tui): keep plugin OAuth routes off async stacks
LIghtJUNction Oct 4, 2026
e6c59fb
fix(ci): restore complete source blobs
LIghtJUNction Oct 4, 2026
c9dbfb4
feat(vision): report real image dimensions in vision results
asto18089 Oct 5, 2026
f0080cd
fix(windows): compare reviewed plugin paths canonical-to-canonical un…
Oct 5, 2026
ae357d6
fix(tui): keep long shells alive, and attach a dropped image
Oct 5, 2026
f227961
feat(plugins): add /plugin doctor to retire stale built-in state
Oct 5, 2026
21c8f86
fix(errors): name a rejected request instead of calling it internal
Oct 5, 2026
afeb684
chore: record the six filesystem calls in image attach
Oct 5, 2026
0858c5b
test(compaction): pin restore anchoring against pasted-summary anchor…
asto18089 Oct 5, 2026
ba76fe4
fix(plugins): resolve plugin paths off the runtime thread
Oct 5, 2026
804c631
docs(changelog): record the unreleased doctor and error-label notes
Oct 5, 2026
327ad28
fix(shell): expect a foreground timeout to keep running
Oct 5, 2026
fff8829
fix(search): honor the configured locale in Bing and DuckDuckGo scrapes
asto18089 Oct 5, 2026
7200e0e
feat(orcarouter): OAuth 2.0 + PKCE connect and a live chat catalog al…
hodeswildsmith455-boop Oct 5, 2026
ca59ff7
feat(automation): archive terminal runs on delete
asto18089 Oct 5, 2026
a1ce07e
Merge main: take main's LPAC realpath EPERM tolerance (5d110e82f)
Oct 5, 2026
4183c0d
test(plugins): open aged doctor fixtures with write-attribute access …
Oct 5, 2026
0c9f479
feat(runtime-api): serve a skill's body so a client can activate it
gaord Oct 5, 2026
4f27025
Merge main: six contributor fixes (#6844 #6859 #6852 #6851 #6848 #6847)
Oct 5, 2026
9dbc2ef
fix: name an exhausted xAI account, keep refusal reasons readable, an…
Oct 5, 2026
ed26af9
Merge main: #6870 #6863 #6854 #6855 #6856 into 0.10.1
Oct 5, 2026
5b51cee
fix(lint): rustfmt the outcome-word match in sanitize redact
Oct 5, 2026
65d3fb8
fix(tui): make model-facing text name facts, not imperatives
Oct 5, 2026
6f7c11f
fix(subagent): annotate spent-balance quota failures with their route
Oct 5, 2026
b015d0a
Merge remote-tracking branch 'origin/main' into wave/0.10.1-next
Oct 5, 2026
7903b96
fix(windows): scope Bun bundle listing and settle live workspace locks
Oct 5, 2026
a53b58b
Merge measured main budget repair into the release wave
Oct 5, 2026
5b3f4b3
fix(contract): pair composed wave descriptions with measured ceiling
Oct 5, 2026
67acbff
fix(runtime): retain selected app-server frontend through Engine disp…
Oct 5, 2026
3dd34fa
fix(runtime-api): mount thread-history mutation routes under runtime …
Hmbown Oct 6, 2026
b69ecca
fix(sandbox): default Linux workspace-write to bubblewrap, probed and…
Hmbown Oct 6, 2026
9c6b335
Merge remote-tracking branch 'origin/main' into resolve-6817
Hmbown Oct 6, 2026
cb1833d
fix(cli): accept hyphen-led values for mcp add --arg
Oct 6, 2026
6ae30c3
feat(account): point a fresh login at the managed Codewhale route
Oct 6, 2026
fc08a5b
fix(runtime-api): join the test env scope in call-change reads
Oct 6, 2026
f179d35
Merge origin/main into wave/0.10.1-next
Oct 6, 2026
2629863
fix(safety-gate): accept Stop-Process -Id $var proven bounded in-command
Oct 6, 2026
cdee23f
style(safety-gate): rustfmt + clippy for the pid-var proofs
Oct 6, 2026
9752aa4
fix(release): keep pending questions alive and repair CI fixtures
Oct 6, 2026
fa4709e
fix(runtime): acknowledge human answers and retire ended question waits
Oct 6, 2026
94078e0
fix(transfer): report to the canonical repo and use available contain…
Oct 6, 2026
9e68c17
build(web): migrate the recovered terminal website to Cloudflare cf
Oct 6, 2026
eb1b644
Merge pull request #6817 from gaord/feat/call-change-route
Hmbown Oct 6, 2026
6d97488
Merge pull request #6860 from asto18089/upstream/scrape-locale
Hmbown Oct 6, 2026
dd3c20b
Merge pull request #6858 from asto18089/upstream/vision-image-dimensions
Hmbown Oct 6, 2026
c5f2be8
Merge pull request #6864 from asto18089/upstream/run-archive
Hmbown Oct 6, 2026
50868f6
Merge pull request #6869 from gaord/feat/skill-detail-route
Hmbown Oct 6, 2026
653404c
Merge pull request #6857 from asto18089/upstream/compaction-anchor-th…
Hmbown Oct 6, 2026
3ebeb29
fix(tui): translate the session-only note /model adds after a switch
Lstarsky0 Oct 4, 2026
b0fb5f8
Integrate reviewed 0.10.1 contributor work and harden parked turns
Oct 6, 2026
7d3fe35
Merge original contributor PR #6832 by @aboimpinto
Oct 6, 2026
c147152
Merge original contributor PR #6867 by @hodeswildsmith455-boop
Oct 6, 2026
2ce6672
Merge original contributor PR #6805 by @LIghtJUNction
Oct 6, 2026
903b26e
docs(release): name the shipped computer-use 0.12.1 bundle
Oct 6, 2026
b43c3dc
fix(web): qualify computer-use downloads after the GitHub transfer
Oct 6, 2026
e090a58
Merge contributor #6875: localized model-switch receipts
Oct 6, 2026
a32639a
fix(mcp): state the process boundary in mcp connect and mcp validate
SparkofSpike Oct 6, 2026
a0e0122
fix(tui): bound debug dispatcher frames and preserve elevation authority
Oct 6, 2026
d24b019
0.10.1: keep local OAuth local and repair release qualification
Oct 6, 2026
e206669
Merge contributor PR #6878: clarify the MCP command process boundary
Oct 6, 2026
16e1596
test(weixin): wait for poll progress during an accepted approval
Oct 6, 2026
a47c5bb
fix(ci): allow parity the full workspace cold-build budget
Oct 6, 2026
9c27a58
fix(test): isolate shared shell imports and observe RLM request admis…
Oct 6, 2026
de1f308
fix(ci): give native artifacts the measured cold-build allowance
Oct 6, 2026
6cb0c9e
docs(config): defer constitution precedence to the owning prompt
Oct 6, 2026
6ad1fdd
fix(tui): keep Space folds reversible and tied to their answer
Oct 6, 2026
2b86186
fix(test): settle image mocks and own the HTTP sandbox home
Oct 6, 2026
2b660bc
Connect account profile constitutions to Engine turn admission
Oct 6, 2026
4ad7f8c
fix(ci): format admitted profile guidance and allow cold Mac qualific…
Oct 6, 2026
3f300f1
fix(account): load profile guidance through the shared TLS builder
Oct 6, 2026
31ba5ae
Enforce sandbox client token intent and exact control lease
Oct 6, 2026
be15abf
Keep Windows storage revalidation within atomic-save retries
Oct 6, 2026
ed5e3f1
fix(extension-host): ship the regenerated Windows storage bundle
Oct 6, 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
  •  
  •  
  •  
4 changes: 3 additions & 1 deletion .config/nextest.toml
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,9 @@ filter = 'package(codewhale-tui) & kind(lib) & test(/^fleet::manager::tests::/)'
test-group = 'fleet-manager-lifecycle'

[[profile.default.overrides]]
filter = 'package(codewhale-tui) & kind(lib) & (test(/^extension_host::/) | test(/^core::engine::.*extension/))'
# DSH preparation also launches the isolated host against the shared hermetic
# home. Keep its ACL grants/retirement in this existing serial lane.
filter = 'package(codewhale-tui) & kind(lib) & (test(/^extension_host::/) | test(/^core::engine::.*extension/) | test(/^plugins::install::dsh::/) | test(/^plugins::tests::dsh_/) | test(/^runtime_api::tests::dsh_package_preview_then_exact_install_over_http$/) | test(/^commands::groups::plugins::tests::dsh_import_reviews_without_installing_then_installs_the_exact_bundle$/))'
test-group = 'extension-host'

[[profile.default.overrides]]
Expand Down
25 changes: 17 additions & 8 deletions .github/scripts/release-workflows.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -848,21 +848,30 @@ function jobTimeout(source, job) {
return Number(match[1]);
}

// Pin the measured release-lane budget: fast setup and packaging fail quickly,
// while cross-platform compilation keeps real margin over the 40-45m Windows
// build observed on the release train.
// Fast setup and packaging fail quickly. Native builds need the same finite
// cold-build allowance as full CI: both 0.10.1 macOS artifacts hit the old
// 90m compilation cap before reaching their launch and inventory checks.
assert.equal(jobTimeout(candidate, "resolve"), 10);
assert.equal(jobTimeout(candidate, "web"), 15);
assert.equal(jobTimeout(artifacts, "pin"), 10);
assert.equal(jobTimeout(artifacts, "build"), 90);
assert.ok(
jobTimeout(artifacts, "build") >= jobTimeout(ci, "test"),
"native artifacts must allow the full CI cold-build budget",
);
for (const job of ["bundle", "windows-installer", "assemble", "smoke"]) {
assert.equal(jobTimeout(artifacts, job), 15, `${job} must keep the 15m packaging cap`);
}
assert.equal(jobTimeout(nightly, "build"), 90);
assert.equal(
jobTimeout(nightly, "build"), jobTimeout(artifacts, "build"),
"nightly and release must share the native cold-build allowance",
);
assert.equal(jobTimeout(release, "resolve"), 10);
// The v0.9.12 tag push finished every parity step and was then cancelled at
// 20 minutes inside rust-cache's post-run save; 45 keeps that margin.
assert.equal(jobTimeout(parityWorkflow, "parity"), 45);
// The 0.10.1 cold parity build exhausted 45 minutes before tests started.
// Reuse the full CI suite's budget rather than pinning an older release's cap.
assert.ok(
jobTimeout(parityWorkflow, "parity") >= jobTimeout(ci, "test"),
"release parity must allow the full CI suite's cold-build budget",
);

console.log(
"Workflow contracts OK: 6-target/12-asset single-runtime nightly and exact-head 7-target/34-asset release candidate.",
Expand Down
20 changes: 19 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -912,6 +912,12 @@ jobs:
save-if: ${{ github.ref == 'refs/heads/main' }}
- uses: taiki-e/install-action@nextest
if: needs.changes.outputs.heavy == 'true' && (matrix.os != 'ubuntu-latest' || github.event_name == 'workflow_dispatch' || github.event_name == 'pull_request')
- name: Check portable config policy boundary
if: needs.changes.outputs.heavy == 'true' && matrix.os == 'ubuntu-latest' && (github.event_name == 'workflow_dispatch' || github.event_name == 'pull_request')
shell: bash
run: |
python3 -B scripts/test_check_command_config_policy_proof.py
sh scripts/check-portable-config-policy.sh
- uses: actions/setup-node@v7
# The extension-host integration tests spawn the real bundle under
# Node >= 22.19; CODEWHALE_EXT_HOST_TESTS below makes a missing Node a
Expand Down Expand Up @@ -1012,6 +1018,7 @@ jobs:
if [ -n "$monitor" ]; then kill "$monitor" 2>/dev/null || true; fi
exit "$status"
env:
QA_PTY_DIAGNOSTICS_DIR: ${{ runner.temp }}/pty-failures
CODEWHALE_EXT_HOST_TESTS: '1'
CODEWHALE_EXT_HOST_BUN_TESTS: '1'
# sccache 0.17 panics resolving its config directory under the
Expand All @@ -1035,6 +1042,15 @@ jobs:
# forced 32 MiB lives in spawned binaries, which size their own
# stacks explicitly and never read this variable.
RUST_MIN_STACK: '16777216'
- name: Retain sealed terminal failure diagnostics
if: failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: terminal-failures-${{ runner.os }}-${{ github.sha }}-${{ github.run_attempt }}
path: ${{ runner.temp }}/pty-failures/
include-hidden-files: true
if-no-files-found: ignore
retention-days: 7
- name: Shared-process workspace qualification
if: github.event_name == 'workflow_dispatch' && inputs.workspace_test_mode == 'shared-process-twice' && matrix.os == 'ubuntu-latest'
shell: bash
Expand Down Expand Up @@ -1234,7 +1250,9 @@ jobs:
# The explicit Ubuntu-only qualification has no warm Test macOS leg, so
# retain these gates on the hosted fallback even when self-hosting is on.
if: needs.changes.outputs.heavy == 'true' && github.event_name != 'pull_request' && ((github.event_name == 'workflow_dispatch' && inputs.workspace_test_mode == 'shared-process-twice') || !(needs.changes.outputs.trusted == 'true' && vars.CW_SELF_HOSTED_MAC == 'true'))
timeout-minutes: 75
# Cold hosted builds consumed 73 minutes before eval could start (F run
# 37497498829). Match Test's compile allowance; RSS/eval limits stay intact.
timeout-minutes: 165
runs-on: macos-latest
steps:
- uses: actions/checkout@v7
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/nightly.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ env:
jobs:
build:
name: Build ${{ matrix.platform }}
timeout-minutes: 90
# Native builds use the same finite cold-build allowance as release/CI.
timeout-minutes: 165
strategy:
fail-fast: false
matrix:
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/release-artifacts.yml
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,9 @@ jobs:

build:
name: Build ${{ matrix.platform }}
timeout-minutes: 90
# Both cold macOS artifact builds on 0.10.1 exhausted 90 minutes inside
# compilation. Keep the full CI build budget; packaging stays capped below.
timeout-minutes: 165
# FreeBSD is a source-build target validated via `cargo check --target x86_64-unknown-freebsd -p codewhale-cli --locked`
# (see packaging/freebsd/README.md and docs/INSTALL.md#freebsd). The 7×1 prebuilt matrix stays 7 targets;
# FreeBSD has no prebuilt asset, no npm binary, and no matrix bloat — it builds from source.
Expand Down
7 changes: 5 additions & 2 deletions .github/workflows/release-parity.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,9 @@ env:
jobs:
parity:
name: Workspace parity
timeout-minutes: 45
# Cold check, Clippy, executable and test builds exceeded the old 45m
# limit before the suite started. Retain the full CI test-job budget.
timeout-minutes: 165
runs-on: ubuntu-latest
steps:
# Every caller's resolve job already proved GITHUB_SHA equals the
Expand Down Expand Up @@ -53,7 +55,8 @@ jobs:
echo "apt-get update failed (attempt $i); retrying in 15s"
sleep 15
done
sudo apt-get install -y libdbus-1-dev pkg-config
sudo apt-get install -y libdbus-1-dev pkg-config bubblewrap apparmor-profiles
sh scripts/prepare-linux-test-sandbox.sh
# Restore after the trusted lockfile is on disk. Key is OS + arch +
# explicit stable toolchain + rust-cache's Cargo.lock / rust-toolchain
# hash. Never interpolate github.event, github.ref, github.sha, or inputs.
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/web.yml
Original file line number Diff line number Diff line change
Expand Up @@ -162,8 +162,8 @@ jobs:
- name: Check Cloudflare deploy environment
run: npm run check:deploy-env
# npm's deploy script performs one OpenNext build, then deploys that exact
# bundle. Wrangler must not run a custom post-cache build: OpenNext
# populates the remote cache before it hands the bundle to Wrangler.
# bundle. OpenNext populates the remote cache before cf deploy --prebuilt;
# the bundler has no custom build that could invalidate that cache.
- name: Build and deploy exact OpenNext bundle
run: npm run deploy
- name: Verify exact deployed revision
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,9 @@ CODEWHALE_0_9_0_CUTOVER.md
# computer-use plugin smoke receipts (per-run local evidence)
crates/tui/plugins/computer-use/receipts/

# OrcaRouter provider screenshot evidence (per-run local evidence)
orca-evidence/

# Portable pet build entry points are source.
!pet/**/*.sh
!pet/verify.sh
45 changes: 43 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [0.10.1] - 2026-10-01

### Contributor integration and reliability

- Runtime clients can read one tool call's actual workspace changes and reviewed skill details (thanks @gaord, #6817 and #6869). In-flight snapshot pairs remain pending; missing objects and corrupt repository metadata are distinguished.
- Search accepts valid preferred locales, and image dimensions describe the same bytes sent to the model (thanks @asto18089, #6860 and #6858). Automation deletion keeps its definition until cleanup succeeds, and compaction preserves its original summary anchor (#6864 and #6857).
- Config/status/permission commands share portable contracts while the host retains mutation authority; queue workers acknowledge a scheduled retry for temporary first-claim contention and fail honestly on corruption (thanks @aboimpinto, #6832).
- Indefinite questions, approvals and elevation waits survive the TUI watchdog. Answers get time to resume the current turn; settled requests disappear by identity. Thanks @7jrxt42BxFZo4iAnN4CX for #6872.
- Configured approval expiry belongs to the held Engine request; hiding or covering its card cannot restart the deadline, and a late queued answer cannot approve an expired call.
- Tool discovery keeps the highest-ranked matches when a result batch exceeds the existing cache bounds, preserving search order and the 16 KiB limit (adapted from @AdityaVG13's #6393).
- Model-switch receipts now translate their session-only saving note in every complete locale pack; the three save commands remain directly usable (thanks @Lstarsky0, #6875).
- The bundled `computer-use` plugin is 0.12.1, reconciled with canonical source
`a656f67455fc5639f28304fbf61075db3925058a` while retaining Core's embedding
manifest and version contract.

Codewhale v0.10.1 focuses on reliability and first-run behavior. Turns that
stall now say so, approvals keep what you approved, plugin suggestions are
quieter, and Fleet runs can be checked before they spend anything.
Expand All @@ -17,6 +30,19 @@ note below before upgrading.

### Added

- `/plugin doctor` reports stale built-in records and snapshots, and
`/plugin doctor --fix` retires them. A user plugin, a snapshot a running
process names, and a snapshot inside the grace window are kept. The
previous `state.json` is kept as `state.json.pre-gc`.
- Reviewed plugins can declare named OpenAI-compatible OAuth routes. The host
owns PKCE, refresh and credential storage, and checks the review at each
request ([docs/PLUGIN_PROVIDERS.md](docs/PLUGIN_PROVIDERS.md), #6805).
The provider capability advances plugin review policy to v5 (v6 with the
extension host): older receipts require explicit review again.
- OrcaRouter account sign-in uses PKCE and saves the same durable API key as
manual setup; its live catalog keeps chat-capable rows and stated pricing
and modality facts (#6867).

- Experimental TypeScript extension host. New in this release and off by
default: turn it on with `[features] extension_host = true`. A plugin that
declares a `native` TypeScript or JavaScript entry (the Cordis / DeepSeek
Expand Down Expand Up @@ -259,6 +285,15 @@ note below before upgrading.

### Fixed

- A failure Codewhale can name is no longer labelled an internal fault. An HTTP
400/405/409/413/422 rejection, an out-of-credits 402, the context-budget stop
and a turn's own step or wall-clock ceiling now carry an input or budget
label, and a bare `ERROR` from a provider is reported as an unreadable error
instead of a warning. Refs #6843.
- A transient upstream failure reported as an error frame inside a successful
response is retried within the stream retry budget. When the budget is spent
the turn fails once with an error card instead of an amber warning that
promised a retry. Refs #6795.
- Diff lines and tool output wrap at grapheme boundaries, so emoji families,
skin tones and variation selectors no longer split across lines
([#6829](https://github.com/codewhale-hq/Codewhale/pull/6829), thanks @Lstarsky0).
Expand Down Expand Up @@ -1200,7 +1235,13 @@ note below before upgrading.

### Contributors

Seventeen contributors and issue reporters are credited below, including
- **[@AdityaVG13](https://github.com/AdityaVG13)** — supplied the discovery-cache priority correction adapted from [#6393](https://github.com/codewhale-hq/Codewhale/pull/6393), keeping highest-ranked tools through cache overflow. Its broader echo and fork-inheritance draft remains open.
- **[@7jrxt42BxFZo4iAnN4CX](https://github.com/7jrxt42BxFZo4iAnN4CX)** — reported indefinite questions cancelled by the TUI watchdog and supplied the timer evidence ([#6872](https://github.com/codewhale-hq/Codewhale/issues/6872)).

- **[@hodeswildsmith455-boop](https://github.com/hodeswildsmith455-boop)** — added OrcaRouter account sign-in with PKCE and its live chat catalog ([#6867](https://github.com/codewhale-hq/Codewhale/pull/6867)).
- **[@LIghtJUNction](https://github.com/LIghtJUNction)** — added reviewed plugin-provided AI routes with host-owned OAuth PKCE credentials and request-time authority checks ([#6805](https://github.com/codewhale-hq/Codewhale/pull/6805)).

Contributors and issue reporters are credited below, including
@cenab's provider report.

- **[@Guan0923](https://github.com/Guan0923)** — accepted case-insensitive HTTP(S) schemes in `config doctor` without rewriting the configured URL ([#6819](https://github.com/codewhale-hq/Codewhale/pull/6819)), and routed the Python and JavaScript execution tools through the session's execution policy ([#6820](https://github.com/codewhale-hq/Codewhale/pull/6820)).
Expand All @@ -1211,7 +1252,7 @@ Seventeen contributors and issue reporters are credited below, including
- **[@Andrea-Bruno](https://github.com/Andrea-Bruno)** — designed the Superfast Decision Gate and contributed its off-by-default shadow classifier ([#6604](https://github.com/codewhale-hq/Codewhale/pull/6604), [#6603](https://github.com/codewhale-hq/Codewhale/issues/6603)).
- **[@aiapienthusiast](https://github.com/aiapienthusiast)** — added Cheaper Inference to the bundled provider catalog ([#6761](https://github.com/codewhale-hq/Codewhale/pull/6761)).
- **[@gaord](https://github.com/gaord)** — let a client fork a thread at a named turn ([#6580](https://github.com/codewhale-hq/Codewhale/pull/6580)), let undo roll back files for the turn it is undoing ([#6483](https://github.com/codewhale-hq/Codewhale/pull/6483)), stopped resume and fork from duplicating threads and sessions ([#6406](https://github.com/codewhale-hq/Codewhale/pull/6406)), exposed user-defined provider routes to native clients ([#6404](https://github.com/codewhale-hq/Codewhale/pull/6404)), and kept a fork going when a turn lost its tool call ([#6664](https://github.com/codewhale-hq/Codewhale/pull/6664)).
- **[@Lstarsky0](https://github.com/Lstarsky0)** — moved the docs/work, legal, digest and FAQ pages onto the dictionary spine ([#6405](https://github.com/codewhale-hq/Codewhale/pull/6405), [#6417](https://github.com/codewhale-hq/Codewhale/pull/6417), [#6499](https://github.com/codewhale-hq/Codewhale/pull/6499), [#6574](https://github.com/codewhale-hq/Codewhale/pull/6574)), tightened the Chinese-branching ceiling to 18 ([#6403](https://github.com/codewhale-hq/Codewhale/pull/6403)), and made Fleet publish without a two-link window ([#6431](https://github.com/codewhale-hq/Codewhale/pull/6431)). Also moved the constitution page onto the dictionary spine and kept its install link in the selected locale ([#6733](https://github.com/codewhale-hq/Codewhale/pull/6733)), wrapped diff and tool output at grapheme boundaries ([#6829](https://github.com/codewhale-hq/Codewhale/pull/6829)), and translated the context inspector rows twelve packs still shipped in English ([#6831](https://github.com/codewhale-hq/Codewhale/pull/6831)).
- **[@Lstarsky0](https://github.com/Lstarsky0)** — moved the docs/work, legal, digest and FAQ pages onto the dictionary spine ([#6405](https://github.com/codewhale-hq/Codewhale/pull/6405), [#6417](https://github.com/codewhale-hq/Codewhale/pull/6417), [#6499](https://github.com/codewhale-hq/Codewhale/pull/6499), [#6574](https://github.com/codewhale-hq/Codewhale/pull/6574)), tightened the Chinese-branching ceiling to 18 ([#6403](https://github.com/codewhale-hq/Codewhale/pull/6403)), and made Fleet publish without a two-link window ([#6431](https://github.com/codewhale-hq/Codewhale/pull/6431)). Also moved the constitution page onto the dictionary spine and kept its install link in the selected locale ([#6733](https://github.com/codewhale-hq/Codewhale/pull/6733)), wrapped diff and tool output at grapheme boundaries ([#6829](https://github.com/codewhale-hq/Codewhale/pull/6829)), and translated the context inspector rows twelve packs still shipped in English ([#6831](https://github.com/codewhale-hq/Codewhale/pull/6831)). Translated the session-only note after model switches across the complete TUI locale packs ([#6875](https://github.com/codewhale-hq/Codewhale/pull/6875)).
- **[@aboimpinto](https://github.com/aboimpinto)** — restored a green Linux full-workspace test gate without loosening any test, twice ([#6581](https://github.com/codewhale-hq/Codewhale/pull/6581), [#6666](https://github.com/codewhale-hq/Codewhale/pull/6666)). Completed the seventeen-command portable session group, including `/structcopy` ([#6793](https://github.com/codewhale-hq/Codewhale/pull/6793)).
- **[@dajiaohuang](https://github.com/dajiaohuang)** — `codewhale config set` checks a known setting's value against its schema type before saving it ([#6568](https://github.com/codewhale-hq/Codewhale/pull/6568)).
- **[@jayanthvee](https://github.com/jayanthvee)** — reported and diagnosed that killing the npm launcher's `node.exe` ends Windows sessions without cleanup, with reproductions and fix directions ([#6827](https://github.com/codewhale-hq/Codewhale/issues/6827)).
Expand Down
34 changes: 28 additions & 6 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Thank you for your interest in contributing to codewhale! This document provides

### Prerequisites

- Rust 1.88 or later (edition 2024)
- Rust 1.89 or later (edition 2024)
- Cargo package manager
- Git

Expand All @@ -18,21 +18,43 @@ Thank you for your interest in contributing to codewhale! This document provides
cd CodeWhale
```

2. Build the project:
2. Build the current engine and terminal:
```bash
cargo build
CODEWHALE_BUILD_SHA="$(git rev-parse HEAD)" cargo build --locked -p codewhale-cli
```

3. Run tests:
3. Run the tests near your change (see [Fast local loop](#fast-local-loop)):
```bash
cargo test --workspace --all-features
scripts/dev-test.sh tui your_test_filter
```

4. Run with development settings:
```bash
cargo run --bin codewhale
./target/debug/codewhale --version
./target/debug/codewhale
```

### Testing the latest source

The canonical source is [`codewhale-hq/Codewhale`'s `main` branch](https://github.com/codewhale-hq/Codewhale/tree/main).
Release candidates land there after their CI gates pass, so contributors can
test and build on the same source. Tagged downloads remain the latest published
release; their version can lag the development version on `main`.

For a fresh checkout of the current source:

```bash
git clone --branch main https://github.com/codewhale-hq/Codewhale.git
cd Codewhale
CODEWHALE_BUILD_SHA="$(git rev-parse HEAD)" cargo build --release --locked -p codewhale-cli
./target/release/codewhale --version
./target/release/codewhale
```

Include the commit shown by `--version` when reporting a problem. If you work
from a fork, add the canonical repository as `upstream` and fetch `upstream/main`
before starting a change; preserve any local work when updating your branch.

## Development Workflow

### Code Style
Expand Down
Loading
Loading