Repository navigation
fix!: moved-config runs keep the owner's session; --compact one-line rows; IPv6 model addresses; calls link without memo; cli-base 0.99.0 - #2915
Merged
Conversation
… tool's sign-out In a run where only <PREFIX>_CONFIG_DIR (or the cache folder) is moved, the state folder is the owner's. cli-core 0.650.0 kept the files it removes itself, but still called the tool's own signOut hook, which deletes the session where the run's state folder says: the owner's (whatsapp-cli lost its private.db this way and now refuses with device.owners). - account remove skips signOut when the run's state folder lies in the owner's folders, and lists the sign-in under kept with the moved-run reason. - The owner's-folder check follows links, so a moved config folder that is a link to the owner's own no longer rewrites the owner's config.json. Keyring: Credentials with isolated deletes only the run's temporary entry (cli-base credentials.js remove), so the owner's entry was already safe. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…://[fd00::1] hostFetch takes no IPv6 literal as a host, so endpointFetch refused every non-loopback IPv6 model address with "is not a host". Such an address now goes through a small fetch with hostFetch's rules: only that host, the same deadline, and no redirect followed. https is required off this computer and plain http only to [::1], as for IPv4. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…D_HOSTS - cli-base 0.99.0 (peer range >=0.99.0): cli-dev manifest adds the shared hosts to every CLI, and same-entity-schema / same-error-reason fail the family audit. - CORE_HOSTS is now cli-base's SHARED_HOSTS plus the two default model providers, so the shared hosts are listed in one place. cli-base cannot read cli-core's list (the dependency points the other way). The hosts cli-core fetches stay covered (release-assets.githubusercontent.com by *.githubusercontent.com). No CLI imports CORE_HOSTS today. - No lint baseline row went stale with 0.99.0 (cli-dev lint: 69 in the baseline, 0 new). endpoint.ts joins the raw-network baseline: its loopback and IPv6-literal paths use the global fetch, because hostFetch takes no IP literal in brackets; the ternary had hidden it from the rule. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…he CLI's package.json doctor reports show/create named an issue page only when the app definition set `issues`, so max (which sets none) printed no link. issuesPage reads the installed package's `bugs` or `repository` when it is on GitHub and gives its /issues/new; the link fills the issue through GitHub's own parameters, so another host gets none. It reads the file only when a report command runs. Tests: the fallback, the issue link in the note a person reads, and a call in canonicalPersonContext's meetings. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…pe.oneLine) --compact promises one line per item, but an item answer (a show, a decision) printed as key: value lines on purpose. The owner chose an opt-in (option C): a RowShape with oneLine draws the item as the one row a list of it draws, and its sections still follow as rows, so a decision result lists one line per decision. Nothing changes for a row without it. memo's review show / confirm / reject adopt it in memo. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…number, without memo Only memo ran the people scan (memo people scan / memo sync), so without memo no call reached its CRM contact. pull now collects the callers it saved with a number and, through the optional MeetingStore.linkCallers, runs the scan's phone rule alone for them (linkPhones): no name, email or chat rule, no scan cursor moved, so memo's next scan still sees them. It reads the store's numbers once: 55-70 ms for 20,000 CRM contacts. A linking failure is a sync warning. Also: CORE_HOSTS is typed out equal to cli-base's SHARED_HOSTS plus the two model providers, with a test that keeps them equal, instead of importing SHARED_HOSTS: an import would stop every CLI still on cli-base 0.98 from loading. The peer range stays >=0.98.0. Changelog fragment. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… the callers' proposals first; endpoint branch tests Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…dress's off-host request raises Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Task
The cli-core round of 2026-11-13: one PR, so every WireCat CLI moves to one release that carries every fix. Source: the
review plan of 2026-11-12 (
reports/2026-11-12-cli-family-review.mdin cli-private) and whatsapp-cli #386. Therelease also carries #2906, #2910, #2912, #2913 and #2914, already on main.
Why
<PREFIX>_CONFIG_DIRmoved, the state folder is the owner's.0.650.0 kept the files cli-core deletes itself, but
account removestill called the tool's ownsignOut, whichdeletes the session where the run's state folder says: the owner's. wa lost its device this way and guards with
device.owners. A moved config folder that is a link to the owner's own also let cli-core rewrite the owner'sconfig.json.--compacton one item printedkey: valuelines, though its help promises one line. The owner chose option C:an opt-in row.
SHARED_HOSTStocli-dev manifest, beside cli-core'sCORE_HOSTS.https://[fd00::1]was refused:hostFetchtakes no IPv6 literal.issues; max sets none.people scan.What
account remove: a run whose state folder is the owner's never callssignOut; the sign-in is listed underkeptwith the moved-run reason. The owner's-folder check follows links. Keyring:
Credentialswithisolateddeletesonly the run's temporary entry (cli-base
credentials.jsremove), so that part was already safe.RowShape.oneLine: an item answer prints as the row a list of it prints (with the list's header and day line), andits
sectionsfollow as rows. Nothing changes for a row without it. memo'sreview show|confirm|rejectadopt it inmemo.
>=0.98.0).CORE_HOSTSis typed out as the two model providers plusSHARED_HOSTS, and a test keeps the two equal. ImportingSHARED_HOSTSinstead would stop every CLI still oncli-base 0.98 from loading; cli-base cannot read cli-core's list. No CLI reads
CORE_HOSTStoday.cli-dev lint: 69 violations, all in the baseline, 0 new);services/archive.tsandservices/project-gathering.tsare still flagged. One row added, an exception for theowner:
src/models/endpoint.ts fetch. The loopback[::1]path always used the globalfetch; a ternary hid itfrom the rule, and the new IPv6 path uses it too. It goes once cli-base's
hostFetchtakes bracketed IPv6 literals.hostFetch's rules: only that host, thesame deadline, no redirect followed.
network.host-undeclaredis now registered in cli-core's reasons.doctor reports show|create: withoutissues, the GitHub repository in the installed package'sbugsorrepositorygives<repo>/issues/new. Read only when a report command runs.pull) that saved callers with a number runs the scan's phone rule for those callers only(
linkPhones, through the optionalMeetingStore.linkCallers). No other rule, no scan cursor moved, so memo's nextscan still sees them. A failure is a sync warning.
Testing
account-remove.test.ts(sign-out with only config moved; the linked config folder),endpoint.test.ts(IPv6),
doctor-reports-command.test.ts(package.json fallback),compact.test.ts(oneLine equals the list row,also with a ref prefix and a time column),
call-phone-link.test.ts(a sync links the caller without a scan, leavessame-name contacts apart, and leaves the scan cursor unset).
canonicalPersonContext'smeetings; the issue link in the note a person reads.linkCallerson a store of 20,000 CRM contacts takes 55–70 ms (a store with many messenger identities thatcarry phones reads more rows). Only a sync that saved a caller with a number pays it: today the unpublished beeline.
docs:check,docs:lint,schema:check,check:dist,check:agent-process,help:examples,standards:check,ci:quick, and the full suite with coverage.🤖 Generated with Claude Code