Skip to content

chore: stop shipping two claims nothing exercised - #51

Merged
mangit955 merged 5 commits into
mainfrom
chore/finish-1.0
Aug 5, 2026
Merged

chore: stop shipping two claims nothing exercised#51
mangit955 merged 5 commits into
mainfrom
chore/finish-1.0

Conversation

@mangit955

@mangit955 mangit955 commented Aug 5, 2026

Copy link
Copy Markdown
Owner

Why

Two things were claimed and never exercised, and both had been that way long
enough that only a stranger would have found them.

Windows was advertised as a supported platform. docs/getting-started/install.md
listed it in the platform row, and five other places documented
%LOCALAPPDATA%\woopcode\ paths. But runCommand in tools/command.ts spawns
sh -c, which Windows has no equivalent of, so run_terminal and run_tests
the two tools the agent leans on hardest — cannot run there at all. The approval
classifier compounds it: it knows rm -rf, sudo and chmod, not
del /f /s /q or reg delete, so every Windows command falls through to the
fail-closed default and asks. CI never caught it because the matrix is ubuntu and
macOS.

onboarding/test-reset.ts had never worked. It targeted
./config/providers.json — a path inside the repository, where user
configuration has never lived — while getConfigDir puts it in
~/.config/woopcode/. Every invocation raised ENOENT and reset nothing. It is
listed in CLAUDE.md's command table, which is exactly how it stayed broken: the
only check on it was somebody running it by hand.

Alongside those, the README's first screen opened with "an early-stage project"
and a table of repository-aware, terminal-first, visible execution — claims
that carry no information because every competing agent makes them.

What

Change Shape
Windows claim removed from six places Docs say macOS and Linux, WSL on Windows. The win32 branch in config/paths.ts stays — it is correct, costs nothing, and is what WSL or a later port would want — but now carries a comment saying why it is unreachable.
CI matrix left at two entries windows-latest is deliberately absent and the matrix records why. Adding it would produce a permanently red job documenting nothing the docs do not now say outright. The platform is a port, not a matrix entry.
test-reset.ts rewritten Imports getConfigDir rather than rebuilding the path, so the two cannot drift again. Moves the whole config directory aside instead of blanking apiKey fields, and refuses to clobber an existing backup.
Headless no-provider error Named GEMINI_API_KEY only, sending a user holding an OpenAI key to buy a credential they already had. Now names every supported vendor variable.
README first screen Replaced with claims that are specific and checkable — writes stop on a diff with no path around the review, unrecognised shell commands are treated as destructive, plan mode is gated twice and why both gates are needed, provider reasoning is replayed per provider.
homepage, description, version homepage pointed at the GitHub README rather than the deployed docs site; both it and the two deep links were checked with curl before committing. Version 0.9.0.

The tradeoff worth naming is the CI one. The obvious move was to add
windows-latest and fix the fallout, and that was the plan until the shell
dependency turned up. Supporting the platform means replacing the sh -c spawn,
the /proc and pgrep process-group handling, the POSIX signal semantics, and
teaching the classifier a second command vocabulary — the last of which is
security-critical. That is a port. Removing an untrue claim is the honest change
that fits in this PR; the alternative was a red job standing in for a decision
nobody had made.

The test-reset.ts reset moves the directory rather than blanking keys because
ensureProviderConfigured treats a keyless provider and a missing config
identically, but the rest of a first run does not — conversation.json and
execution-log.json are what separate "no key yet" from "never run before".

Verified

bun run verify --all on the tree as it stands, after the final commit:

  ok    docs lint  0.1s
  ok    docs surface  0.1s
  ok    type check  1.5s
  ok    tests  14.7s

4 gate(s) passed.

Order-dependence sweep, since a test file was added:

$ bun test $(git ls-files '*.test.ts' '*.test.tsx' | sort -r)
 1412 pass
 0 fail
Ran 1412 tests across 92 files. [14.34s]

The new packages/tests/config/testReset.integration.test.ts was checked against
the bug it covers: reverting onboarding/test-reset.ts to the previous version
turns two of its three cases red. The third passes either way, because the old
script also errored on a missing backup.

Failure paths were exercised by running them rather than by trusting the
documentation, each against a temporary XDG_CONFIG_HOME:

  • corrupt providers.json → moved aside with a timestamped name, defaults
    recreated, startup continues
  • approvalMode: "YOLO-TRUST-EVERYTHING" → resolves to auto-read-only, the
    default, not to anything permissive
  • no key with no terminal → errors naming the fix rather than hanging

https://woop-code.vercel.app and both README deep links returned 200.
bun cli.ts --version prints 0.9.0.

Not verified: nothing here was run on Windows or WSL — the change removes a
claim rather than making one, so there is no Windows behaviour to test. And
verify.ts:55 uses new URL(".", import.meta.url).pathname, which yields
/C:/... on Windows; harmless now that the platform is not claimed, but it is
the same class of bug and would bite a future port.

Windows was listed as supported in six places while `runCommand` spawns
`sh -c`, which Windows has no equivalent of — so `run_terminal` and
`run_tests`, the two tools the agent leans on hardest, cannot run there.
The approval classifier compounds it: it knows `rm -rf`, `sudo` and
`chmod`, not `del /f /s /q`, so every Windows command falls through to
the fail-closed default and asks.

CI never caught this because the matrix is ubuntu and macOS. Adding
windows-latest would produce a permanently red job, so the matrix keeps
its two entries and records why the third is missing.

The `win32` branch in config/paths.ts stays. It is correct, it costs
nothing, and it is what WSL or a later port would want — it just no
longer implies a platform that works.
test-reset.ts targeted ./config/providers.json — inside the repository,
where user configuration has never lived. Real config is in
~/.config/woopcode/, so every invocation raised ENOENT and reset
nothing. It is listed in CLAUDE.md's command table, which is how it
stayed broken: the only check on it was somebody running it by hand.

It now imports getConfigDir rather than rebuilding the path, so the two
cannot drift again, and moves the whole directory aside instead of
blanking apiKey fields. Conversation history and the execution log are
what separate "no key yet" from "never run before", and a first run has
neither.

Also names every supported vendor variable in the headless no-provider
error. It said GEMINI_API_KEY only, sending a user holding an OpenAI key
to buy a credential they already had.

Covered by a subprocess integration test: two of its three cases fail
against the previous script.
The first screen opened with "an early-stage project" and a table of
repository-aware, terminal-first and visible execution — claims that
carry no information because every competing agent makes them, on a
project with three provider integrations, a benchmark harness and a
four-gate pre-commit system.

Replaced with the things that are specific and checkable: writes stop on
a diff with no path around the review, unrecognised shell commands are
treated as destructive, plan mode is gated in two places and why both
are needed, provider reasoning is replayed per provider because both
Anthropic and OpenAI fail silently without it, and tools are tested
against a real filesystem.

The provider-maturity note stays — that Gemini is best-tested is useful
to someone choosing — but as a fact rather than an apology. Platform
support is now stated up front, so a Windows user learns it here rather
than after installing.

npm description likewise: it was generic enough to describe any agent.
Points homepage at the deployed documentation site rather than the
GitHub README, and links it from the top of the README. Both were
checked with curl before being committed; the previous value sent
anyone arriving from npm to a file rather than the docs.
@vercel

vercel Bot commented Aug 5, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
woop-code Ready Ready Preview Aug 5, 2026 10:26am

The ship command told me to end every commit body with a
Co-Authored-By trailer naming a model, and every PR body with a
"Generated with Claude Code" footer. Neither says anything about why a
change exists, and the contribution record on this repository is the
maintainer's.

The rule now covers PR bodies, issues and review comments too, so it
cannot come back through a path the commit rule does not reach.

No existing commit carried the trailer. The footer was removed from the
body of #51.
@mangit955
mangit955 marked this pull request as ready for review August 5, 2026 10:27
@mangit955
mangit955 merged commit 18d4721 into main Aug 5, 2026
6 checks passed
@mangit955
mangit955 deleted the chore/finish-1.0 branch August 5, 2026 10:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant