Companion to the atcli and dns changes (PR #1 in each): every writing command is now marked as writing in every document an agent might read, and the agent skill ships as a first-class artifact — bundled with the binary.
What #
writes?: false | 'network' | 'local'on theCommandinterface; every runnable command (105) classified: 50 network / 13 local / 42 reads. Network = state on tangled/knots/spindles or public records (repo create/delete/edit/rename/sync/star, collaborator grants, issue & pr mutations incl. merge, run trigger/cancel, release upload/delete-file, string/secret/user/ssh-key mutations, knot/spindle registration and membership,api). Local = durable machine state only (auth login/logout/switch, setup-git, repo clone/remote, pr checkout, config, alias, shell --install, skill install). Reads = everything else; caches (completion cache, last-check stamp, knots.json) and downloads are treated as incidental reads, not writes.- New generated
skills/tangled/reference.md(from the command tree viasrc/reference.ts+tools/reference.ts --check): marker under each writing command's summary, a "Which commands write" section up top, and an exhaustiveness check — the generator refuses to run while any runnable command lacks the declaration. The xrpc-style caveat is generalized into a smallCAVEATSmap, used fortangled apiand bothlabelcommands (usage-dependent writeness, markednetworkas the safe direction). Two new tests: reference currency + a tree-walk that every runnable command declareswrites. - New
tangled skill show/skill installcommand (src/commands/skill.ts):showprints the guide, or guide + generated reference as one document (--brieffor guide only);installwrites.claude/skills/tangled/(project or--global). Thegit-credential-tangledbusybox path insrc/cli.tsis untouched. tools/manifest.tsupdated so the bundle actually shipsskills/tangled/and observes the new skill runs.README.mdgains a What writes section.
Judgment calls (flagged for review) #
auth logout=localalthough it also revokes the server-side session — mirrors atcli's logout; the doc line says it "ends the session and forgets the tokens".repo remote=local(rewrites this checkout's remotes/config); a caveat could be added if agents should be warned about overwriting existing remotes.tangled shell=localwholesale though bareshell bashonly prints — mirrors atcli'scompletiontreatment; the skill table scopes the write to--install/--uninstall.- tangled's
Commandhas nodefaultfield, so baretangled skillprints help;show/installare explicit.
Tests #
tsc -p . --noEmitclean;node --test13/13 pass.tools/reference.ts --checkpasses;npm run build+npm run manifestverified (47 members, all observed reads covered).- Smoke-tested offline only: no real knot/atproto calls, no auth, no push.