Build and smoke the complete Windows ARM64 binary family on GitHub native runners, wire npm, updater, bundle, website, and release inventory support, and preserve the originating contributor credit.
Move Linux ARM64 releases off the slower cross-link path, remove redundant matrix target installs, and update actionlint for the hosted ARM runner label.
Refs #4267.
Co-authored-by: w1w218 <[email protected]>
Signed-off-by: Hunter B <[email protected]>
Make the no-SDK contract check cover the normalized SDK path and both exit-code handoffs, from clang to PowerShell and from PowerShell to Cargo. Without these assertions the gate could stay green after breaking behavior that the HarmonyOS guide promises.
Signed-off-by: Hunter B <[email protected]>
Point Cargo's Windows OHOS linker at a repository-local cmd launcher that delegates to the existing PowerShell clang wrapper. This keeps the target triple, SDK sysroot, and MUSL define on the final Rust link while preserving Cargo's arguments and the native linker exit status.
Extend the no-SDK release gate and documentation to protect the full linker and rquickjs bindgen contract. Follow-up evidence from @shenjackyuanjie's PR #4470 completes the Windows linker path alongside @shenyongqing's original bindgen approach in PR #4384.
Co-authored-by: shenjackyuanjie <[email protected]>
Signed-off-by: Hunter B <[email protected]>
Extend check-ohos-deps.sh with a cargo-tree feature-graph assertion that
the OHOS target activates rquickjs's bindgen feature (forwarded to
rquickjs-sys) for codewhale-workflow-js — the only reason the crate
compiles for a target with no pre-generated QuickJS bindings. Pure
metadata: no SDK or target toolchain required. Positive path verified
against current main (bindgen landed in #4470); negative path verified
against a non-OHOS target.
Carried over from the #4459 review lane; the OHOS bindgen approach was
pioneered by @shenyongqing in #4384.
Signed-off-by: Hunter B <[email protected]>
Promote the workspace, npm wrapper, internal crate pins, generated web
facts, mirrored changelogs, current docs, and the remote-smoke default
from 0.9.0 to 0.9.1.
The 0.9.1 changelog entry covers the local web client, OpenCode Go, the
xAI device-login restore, calendar-anchored hourly automations,
content-watch canonical draft identities, and the remaining runtime and
Windows fixes, with contributor credits for @h3c-hexin, @zhangweiii,
@sternelee, and @seanthefuturegorilla.
check-versions.sh passes; check-published.sh 0.9.1 reports nothing
published, as expected before release.
Signed-off-by: Hunter B <[email protected]>
Allow the disposable bare remote to accept a tag from a depth-1 checkout. This keeps the release helper contract test hermetic under the Version drift job without requiring a full repository fetch.
Signed-off-by: Hunter B <[email protected]>
Integrate the underwater TUI, message-first Operate, Fleet and Workflow reliability, expanded model/provider catalog, exact custom-route restoration, docs-first site, localization, packaging, and release metadata for the v0.9.0 candidate.
Harden endpoint-bound credential provenance, approval and goal UX, Fleet attempt fencing and crash recovery, large-workspace mention discovery, Kimi budgeting, and release asset/version gates. Include the stopship Fleet and Workflow fixtures used by release dogfood.
Verified with workspace fmt/check/clippy/tests on Rust 1.88, release-script and npm suites, 18-crate publish dry run, production web build, Docker build check, secret scan, dependency audit, and protected-state hash validation.
Keep the exact-tag safety fixture aligned with the workspace release version so it continues exercising clean checkout, branch-ahead, and moved-remote-tag failures after version bumps.
Promote the expanded underwater release from the 0.8.68 candidate number to 0.9.0 across Cargo, npm, generated facts, changelogs, current docs, and the authoritative release ledger.\n\nDocument the final runtime, Operate, Fleet, motion, Inkling, community, and deferred-work cutlines without rewriting historical fixtures. Version and release-helper checks pass.
Treat the absence of version-pinned README install examples as a valid release state while continuing to update matching examples when present. Preflight every pinned README tag before any file writes so a stale example fails without leaving Cargo or npm metadata half-bumped.\n\nExercise the full helper in disposable fixtures for optional localized tags, matching-tag replacement, downstream completion, and atomic stale-tag rejection, and run that contract in CI.
Require exact-tag dispatches, immutable source checkouts, live tag revalidation before public writes, and stale-main-safe tag creation. Cargo and npm publication now fail closed unless the checkout is clean and matches the remote release tag, with moved-tag regression coverage and corrected operator sequencing.
Copy the codew shim into the GHCR image, smoke all three public binaries after push, and fail the GitHub Release if the container lane fails. Keep release copy on the canonical state volume and list the Android archive.
Allow only the exact CodeWhale Agent trailer on the already-merged v0.8.68 workflow commit. Keep every other malformed identity failing, document why mapping the bot to a human would be false credit, and normalize git-log record framing for full-SHA matching.
Move the final integration fixes into the dated release section, refresh the candidate ledger and crate inventory, and generate explicit community credits in the GitHub release body. Add a regression test for contributor-heading extraction.
Follow-up to #4354, which added MiniMax's Anthropic-dialect route as a
manual Provider impl and moved the $0.30/$1.20 bundled pricing from
MiniMax-M3 (now honestly unpriced) to MiniMax-M2.7. Three surfaces still
pinned the old expectations and broke CI on main:
- scripts/check-provider-registry.py only learns providers from the
provider!() macro plus a hardcoded manual-impl list; add
MinimaxAnthropic to that list.
- provider_metadata_defaults_match_runtime_helpers now expects the
AnthropicMessages wire format for MinimaxAnthropic.
- bundled_database_is_nonempty_and_honest asserts the priced row on
MiniMax-M2.7 and that MiniMax-M3's price stays honestly unknown.
- model_picker_hint_uses_model_registry_metadata checks M3 for the
honest 'price unknown' hint and M2.7 for the priced-row path.
Verified with cargo fmt, the provider-registry gate, the full
codewhale-config suite (370 passed), and the full codewhale-tui binary
suite (6682 passed; the two remaining failures are the container's
missing-Landlock parity test and the known run-in-temp-dir parallelism
flake, which passes in isolation).
Prepared with agent assistance.
Extract the Tasks, To-do, and worker ledger into an owned work-surface module with stable focus, scrolling, mouse actions, compact overflow, and safe cancellation. Keep Classic as the rollback shell while removing the migrated underwater strip from the legacy sidebar.
Make route billing distinguish metered API usage from OAuth, token-plan, and local routes; align direct startup, mode truth, slash-model performance, modal stack safety, hermetic tests, PTY gates, and atomic dogfood receipts.
Rewrite the README in plain developer language — what it is, install, use,
what it does, how to contribute — with details linked out to docs and
codewhale.net. The contributor-culture section stays substantive: feedback
is a gift, harvested PRs keep credit, first-contribution paths explicit.
Translate it into 简体中文, 日本語, Tiếng Việt, 한국어, and (new) Español
and Português so every complete UI locale has a README. Each translation
carries a source stamp, and scripts/check-readme-translations.py — wired
into CI — fails whenever the English README changes without translations
following, or when code blocks, links, or section structure drift.
Machine translations follow each pack's terminology; flagged for native
review.
Make the repo self-explaining where the work happens: crates/tui/AGENTS.md
(shell grammar contract, l10n rules, PTY QA traps), crates/tui/locales/
AGENTS.md (pack parity discipline, translation conventions, how to add a
locale), web/AGENTS.md (derived facts, gate list). The blanket AGENTS.md
gitignore now carves out these maintained files.
Rewrite the 0.8.68 changelog section to cover the complete candidate —
the full underwater shell, streaming/repaint work, the exec JSONL fix,
the 104-key localization layer, harvests, and doc-status work — and
resync the packaged mirror.
Update the catalog automation docs and tests to reflect the final dry-run-only design after CodeQL triage. Also preserve the already-merged #3985 feature-intro auth guard so this PR does not regress main.
Drop disk writes entirely so CodeQL clear-text-storage does not fire.
Automation still fetches/prints Models.dev stats, validates the offline
seed with snapshot --check, and scrubs credential-shaped keys in-memory.
Signed-off-by: CodeWhale Agent <[email protected]>
Network-fetched catalogs stay dry-run; disk writes require
CODEWHALE_MODELS_DEV_PATH so CodeQL clear-text storage does not fire on
remote JSON. OpenRouter listing remains inspect-only.
Signed-off-by: CodeWhale Agent <[email protected]>
Document that write_json only receives projected public metadata and
add a CodeQL suppression for clear-text storage on that path.
Signed-off-by: CodeWhale Agent <[email protected]>
Rebuild Models.dev/OpenRouter cache documents from allowlisted keys so
CodeQL does not treat network JSON as clear-text secret storage.
Signed-off-by: CodeWhale Agent <[email protected]>
Add scripts/catalog_models_dev.py for secret-free Models.dev catalog
refresh and snapshot validation, plus OpenRouter public /models listing
with sort/limit. Offline unit tests cover scrubbing and seed checks.
Signed-off-by: CodeWhale Agent <[email protected]>
The provider/model release-smoke matrix mapped `arcee ->
trinity-large-thinking`, but that id is Arcee's LARGE reasoning model (it is
DEFAULT_ARCEE_MODEL), the opposite of the cheap sentinel this matrix wants,
and app-server-smoke.test.sh expects arcee UNMAPPED — so the committed test
failed 3/18. Remove the arcee default so it is unmapped again (fails loud /
overridable via SMOKE_MODEL_ARCEE), which fixes the test and honors the
script's conservative "never guess a model id" design (#3205).
Also resolve a code/docs mismatch: the matrix only ships built-in cheap
defaults for a conservative subset (deepseek, zai, moonshot, openai) and
leaves openrouter, xiaomi-mimo, openai-codex, and arcee unmapped on purpose.
RUNTIME_API.md's "maps each to a cheap model" wording now states which
providers have built-in defaults and that the rest require SMOKE_MODEL_<SLUG>
overrides rather than a guessed id.
`bash scripts/release/app-server-smoke.test.sh` now passes all 18 checks.
Extend check-coauthor-trailers.py to fail bot/tool Co-authored-by trailers
on every non-merge commit in the checked range, not only harvested ones.
Add fixture-backed unit tests.
Signed-off-by: Hunter B <[email protected]>
Co-authored-by: Cursor <[email protected]>
codewhale-tui and codewhale-cli depend on codewhale-build-support as a
path+version build-dependency, and codewhale-tui depends on
codewhale-workflow-js the same way. Neither crate was in release_crates,
so cargo publish would fail on the dependents at release time. Add both
in dependency order.
Canonicalize CODEWHALE_BIN before temp-workspace probes so relative target paths keep working after cd, and assert the current repo_constitution source kind emitted by doctor --context-json.
- docs/LOCALIZATION.md: canonical tracking document for shipped,
planned, and deferred locales across website and README surfaces.
Includes Russian as next-priority and Arabic as RTL deferred.
- web/lib/i18n/config.ts: expand locale config with ALL_LOCALES
registry (9 tracked locales, 2 shipped) and LocaleStatus types.
Active `locales` array now derived from shipped status, enabling
>2 locale support without hard-coded arrays.
- web/components/locale-switcher.tsx: rewrite from hard-coded en↔zh
toggle to support any number of shipped locales (2 = toggle,
3+ = dropdown). Reads from ALL_LOCALES.
- web/middleware.ts: Accept-Language detection now matches against all
shipped locales instead of hard-coding Chinese-only detection.
- scripts/check-readme-locales.sh: symmetry check verifying main
README links all locale READMEs and no orphaned locale files exist.
Harvested from PR #3763 by @idling11
Co-authored-by: idling11 <[email protected]>
scripts/v0867-setup-qa.sh exercises the noninteractive contracts of the
v0.8.67 setup lane against isolated temp homes so the human manual pass
shrinks to visual confirmation only. It verifies, and exits non-zero on
regression: the doctor --json .setup block shape and
next_actions.constitution, that a configured API key never appears in
doctor --json, that a repo .codewhale/constitution.json surfaces in
--context-json, and that a legacy WHALE.md body is never loaded into the
context report. It then prints the remaining human-visual checks it
cannot cover. Wired into the QA matrix doc.
Tests:
- scripts/v0867-setup-qa.sh against target/release/codewhale-tui: 9 passed, 0 failed
`prepare-release.sh` and `check-versions.sh` only updated/guarded README
`--tag vX.Y.Z` examples, so the user-facing "verify your install" lines
(`codewhale --version # X.Y.Z`) and the docs/INSTALL.md npm-wrapper publish
pointer could go stale while the release gate still reported green. On the
0.8.66 candidate, docs/INSTALL.md still said 0.8.65 while check-versions passed.
- `prepare-release.sh` now bumps `codewhale --version # <version>` across
README*.md and docs/INSTALL.md, and the docs/INSTALL.md "wrapper is published
at vX.Y.Z" sentence (the v0.8.56 minimum-wrapper floor is preserved).
- `check-versions.sh` now fails when any of those snippets drift from the
workspace version. Narrowly scoped to those two snippet shapes to avoid
flagging unrelated historical prose ("as of vX").
Fixes#3767
`scripts/sync-changelog.sh` regenerates the binary-embedded
`crates/tui/CHANGELOG.md` as a rolling window of the most recent KEEP (15)
`## [` sections. It counted `## [Unreleased]` as one of those sections, so
whenever Unreleased had content the window silently dropped the oldest
*released* version. Adding the `## [0.8.66]` entry on the release candidate is
exactly what pushed `## [0.8.52]` out of the embedded changelog.
Count only released versions toward the keep window; `## [Unreleased]` is always
kept but never consumes a slot. The window now tracks a stable number of
releases regardless of in-progress notes, so:
- on `main` the embedded changelog regains the previously-dropped `0.8.51`;
- on the release branch (where `0.8.66` is added) `0.8.52` is retained instead
of being silently deleted.
`check-versions.sh` runs `sync-changelog.sh --check`, which stays consistent
because it uses the same script.
Fixes#3768
The retry wrapper should never let CODEWHALE_OHOS_DEP_RETRIES=0 skip the cargo tree probe and pass an empty dependency graph. Reject invalid retry counts before probing so the guard fails loudly instead.
The Version drift gate can fail when Cargo registry fetches briefly drop during the OHOS dependency graph probe. The underlying check is still useful, but a transient EOF should not be indistinguishable from real dependency drift.
Retry cargo tree a few times before failing, while preserving the final nonzero status for real errors. Document the CI hardening in both changelogs.
Register OpenModel across the shared provider registry, CLI model registry, TUI config, provider picker, and docs. Default the route to deepseek-v4-flash, use Anthropic Messages wire semantics, and keep Bearer auth so /v1/messages and /v1/models share one client.
This harvest also updates the config example to use deepseek-v4-flash instead of deepseek-chat, which the original PR notes is not available through OpenModel Messages.
Harvested from PR #3585 by @noaft.
Verification:
- cargo fmt
- CARGO_TARGET_DIR=/Volumes/VIXinSSD/codewhale-target CARGO_INCREMENTAL=0 cargo test -p codewhale-config --locked openmodel
- CARGO_TARGET_DIR=/Volumes/VIXinSSD/codewhale-target CARGO_INCREMENTAL=0 cargo test -p codewhale-tui --bin codewhale-tui --locked openmodel
- CARGO_TARGET_DIR=/Volumes/VIXinSSD/codewhale-target CARGO_INCREMENTAL=0 cargo test -p codewhale-agent --locked first_party_recent_provider_models_are_listed
Drain redirect responses in the npm release asset verifier before following them, and cap redirect recursion to match the existing HEAD helper.
Also clarify the 100-run workflow lookup window and add coverage for non-uploaded GitHub Release assets.
Add a release asset verification gate that compares the local and remote tag SHAs, confirms a successful Release workflow run for that SHA, and reruns the npm wrapper asset verifier against the public GitHub assets.
Strengthen npm release:check so stale or incomplete GitHub Release assets fail before publish, while local/mirror asset checks still work through explicit release-base overrides.
Document npm auth/OTP retry commands, final registry verification, and the legacy deepseek-tui no-republish rule.
Closes#2642.
Closes#2643.