Skip to content

fix: review fixes 2026-11-12 — declared hosts, sign-in lock, cli-core 0.648.0 helpers, own-catalogue pins - #165

Merged
leemour merged 3 commits into
mainfrom
fix/review-2026-11-12
Nov 13, 2026
Merged

leemour merged 3 commits into
mainfrom
fix/review-2026-11-12

Conversation

@leemour

@leemour leemour commented Nov 13, 2026

Copy link
Copy Markdown
Member

Task

Review fixes for mail from the CLI family review of 2026-11-12 (report 2026-11-12-cli-family-review.md in cli-private): DEBT-335, BUG-748, BUG-754.c, DEBT-336, IDEA-288, DEBT-338, DEBT-341, plus adoption of cli-core 0.648.0, cli-base 0.98.0 and cli-testing 0.7.0.

Why

  • mail sent HTTP through the global fetch and declared no hosts, so WireCat Desktop could not show where its data goes, and cli-base 0.98.0's raw-network lint flagged discovery and the sender score (WC-CMD-32).
  • sign-ins.json was read, changed and written with no lock, so two sign-ins at once could lose one record.
  • mail kept its own copies of the store opener and the Google OAuth provider, and pinned cli-core's whole MCP catalogue, so every cli-core release forced an adoption PR.
  • The upgrade contract started from 0.16.3, eight releases back.

What

  • DEBT-335 / BUG-748: sign-in, the Google account check, ISPDB/autoconfig discovery and RDAP lookups go through hostFetch. DESKTOP lists the fixed hosts, including every built-in provider's IMAP and SMTP server (a test keeps the list in step). userHosts names the person's mail server, their domain's autoconfig file and the registries from IANA's list; each of those calls may reach only its own host. contracts/wirecat.json is generated, checked and shipped. The raw-network baseline is gone. 17 printed help links and OAuth scope URLs are undeclared-host overrides with reasons, so the override budget goes from 16 to 30.
  • BUG-754.c: sign-ins.json changes under cli-core's acquireLock, waiting up to 10 s.
  • DEBT-336: openMailStore → openAppStore; the Google provider → cli-core's googleProvider. The codec stays: cli-core 0.648.0 has no googleSignIn yet.
  • IDEA-288: mcp-catalogue.json pins only mail's own commands (ownCatalogue), plus explicit invariants: no session start and no store reset over MCP; schedule run|exec are writes, per cli-core's default (schedule.run/schedule.exec at ask). mcp-tools.json is in cli-testing 0.7.0's short form.
  • DEBT-338: the upgrade contract resolves the previous published version itself ("previous": {}), and the schema notice is a pattern. contracts/previous/ is removed.
  • DEBT-341: AGENTS.md names mail-cli as the reference CLI for mail.
  • cli-core 0.648.0 side effects: the refused Google account check gets the reason mail.google-account-refused, so the new unknown-profile answer does not turn a new profile's refused sign-in into "no profile named …". The generated-unit test runs with an absolute-only PATH, because pnpm adds ./node_modules/.bin and cli-core now refuses a schedule saved with it.
  • Actions pins as in Dependabot build(deps): bump pnpm/action-setup from 6.1.0 to 6.1.1 #159–build(deps): bump WireCatLabs/cli-base/.github/workflows/release-checks.yml from 0.77.0 to 0.93.0 #161; Dependabot now groups Actions updates. Stale lint baseline rows and overrides are removed.

Not changed, with reasons:

  • FIND-2584 session start --provider: WC-ACCT-8 names no replacement word.
  • DEBT-334: the IMAP retry loop retries socket commands and already uses cli-base backoffMs; retrying() wraps an HTTP fetch.
  • DEBT-345: main validation already has cancel-in-progress: false.

Testing

Local, on Node 24: standards:check, lint, typecheck, test:coverage (358 tests), lint:commands, audit:commands, contracts:check, contracts:upgrade (previous 0.24.0), docs:check, generate:check, security:no-leak, package:check (packed install finds the manifest), test:matrix:check. No live check: mail keeps no live record, and nothing ran against a real mailbox.

🤖 Generated with Claude Code

leemour and others added 3 commits November 13, 2026 00:43
…om npm (review 2026-11-12)

- DEBT-335 / BUG-748 (WC-CMD-32): sign-in, the Google account lookup, server
  discovery (ISPDB, autoconfig) and the sender score's RDAP lookups go through
  cli-base hostFetch. DESKTOP lists the fixed hosts, including the IMAP and SMTP
  servers of every built-in provider; userHosts names the mail server, the
  domain's autoconfig file and the registry IANA's list gives. Each discovery
  and RDAP call may reach only its own host, so an off-host redirect is refused.
  contracts/wirecat.json is generated in `generate` and shipped; the
  raw-network baseline is gone; help links and OAuth scope URLs are honest
  undeclared-host overrides (override budget 16 -> 30).
- BUG-754.c: sign-ins.json is read, changed and written under cli-core's
  acquireLock, waiting up to 10 s for another sign-in.
- DEBT-338: the upgrade contract resolves the previous published version
  itself (`"previous": {}`); the schema notice is a diagnosticPattern;
  contracts/previous is removed. mcp-tools.json in cli-testing 0.7.0 short form.
- DEBT-341: AGENTS.md names mail-cli as the mail reference CLI.
- cli-base 0.98.0, cli-testing 0.7.0; stale lint baseline rows and overrides
  removed; Dependabot groups Actions updates.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…check; skip the lock when no record goes

The smoke refused any path under contracts/ in files; the manifest is the one
file Desktop reads from the tarball (WC-CMD-29), as in b24. recordSignIn again
touches no disk when there is nothing to remove.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…, pin only mail's own MCP commands

- DEBT-336: openMailStore is cli-core's openAppStore; the Google OAuth
  provider is cli-core's googleProvider (same endpoints and parameters).
- IDEA-288: the MCP catalogue pin is ownCatalogue (mail's own commands), plus
  explicit invariants: no session start or store reset over MCP, schedule
  run|exec are writes (cli-core's family rule, keys schedule.run/exec at ask).
- Google's refused account lookup carries mail.google-account-refused, so
  cli-core 0.648.0's unknown-profile rewrite (FIND-2583) does not turn it into
  "no profile named ..." during session start.
- The generated-unit test runs with an absolute-only PATH: pnpm adds
  ./node_modules/.bin, and cli-core 0.648.0 refuses a schedule saved with it.
- Actions pins: pnpm/action-setup v6.1.1, cli-base node-ci and release-checks
  v0.93.0 (Dependabot #159-#161).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@socket-security

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Updated@​wirecat/​cli-base@​0.77.1 ⏵ 0.98.099 +2100100 +196 +170
Updated@​wirecat/​cli-core@​0.569.0 ⏵ 0.648.098 +1100100 +19670
Updated@​wirecat/​cli-testing@​0.5.3 ⏵ 0.7.095 +13100100 +194 +1100

View full report

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