Repository navigation
Releases: WireCatLabs/cli-template
Releases · WireCatLabs/cli-template
Release list
0.10.0
Changed — may break callers
- The skeleton runs on cli-core 0.469.0 and cli-base 0.65.0; a CLI that pins cli-base moves both pins together.
A non-messenger CLI no longer offers messenger settings or thefollow-upsandlink-conversationsskills
(cli-core 0.468); runs record successes too, under cli-core 0.467's rules. cli-base 0.64 addscli-dev bundle, the
shared build that ships the bin as an esbuild bundle, and calendar words in the command vocabulary. cli-base 0.65 adds
the verbsserveandrevoke, andcli-dev lintfails on a baseline entry that names them: the skeleton's
lint/baseline/unknown-verb.json(mcp serve,mcp revoke) is gone, and a CLI made from the template removes the
same entries.<cli> upgradenow restarts the HTTP MCP server thatmcp server startstarted, on the new version,
and names the MCP sessions over stdio that still run the old one (cli-core #2117).
Added
- A CLI made from the template publishes its skill on ClawHub as
wirecat-<command>after each release.release.yml
gets a dry run through ClawHub's pinned workflow and, after the tag, a publish that only warns while ClawHub still holds
the version pending its scan (openclaw/clawhub#4046); the template's
own release skips both. The skill names its binary and npm package for OpenClaw (metadata.openclaw). It needs the
CLAWHUB_TOKENsecret, which the WireCatLabs organization shares. new --category calendarnames gcal-cli as the reference CLI inAGENTS.mdandDESIGN.md, and the
Reference CLIs page lists it, instead of "No reference CLI for this category yet". gcal-cli is the WireCat Google
Calendar CLI. A CLI made before this keeps what it wrote; edit itsAGENTS.mdby hand if you want the link.scripts/audit.shaudits beside gcal-cli too: it installs@wirecat/gcal-cliwith the other published CLIs
and passes itsgcalbin tocli-dev audit.- An agent publishes a release itself. The release skill and
bin/releaselet an agent merge the release pull
request and runbin/release, which publishes from GitHub Actions.bin/release --localstays the owner's, for
the first release.
Fixed
- The release audit never uses the owner's accounts. Its prompt now says: no sign-in, every folder moved, the
keyring hidden withDBUS_SESSION_BUS_ADDRESS=disabled:, and no command that writes to a service. bin/releaseraises the next free version to the level the changelog needs. When npm already had the version, it
took the next patch, so a release withAdded(0.1.1taken,0.1.2proposed) failedversion:checkand stopped;
it now proposes0.2.0. A generated CLI gets it with the next template update.- A CLI made from the template starts from an esbuild bundle.
pnpm buildrunstsc, then cli-base's
cli-dev bundle(WC-LAY-10), and the
bin becomes a loader fordist/bundle/: the skeleton'sconfig show --helpstarts in 151 ms instead of 366.
scripts/smoke-bundle.tsruns the bundle under Node (pnpm smoke:node, in CI) and Bun (pnpm smoke:bun).
0.9.0
Changed — may break callers
- The MCP server is
clidev <profile> mcp serve;mcpalone only shows its commands (WC-CMD-3).--http,
--portand--public-urlmove tomcp serve, andmcp --revokeis its own command,mcp revoke, still refused
underCLIDEV_READ_ONLY. There is no alias: a client set up withclaude mcp add clidev -- clidev personal mcp
gets the help and exits 2; set it up again with… mcp serve.mcp server startrunsmcp serve --http. - The skeleton runs on cli-core 0.463.0 and cli-base 0.63.0, the cli-base line cli-core 0.463 accepts; a CLI that
pins cli-base moves both pins together.skill show,skill statusandskill install --jsonanswer in the
one-thing envelope,{ item, meta }, so a script reads their fields underitem. mcp server startno longer offers--permission. cli-core added it to every CLI and passed it to a server
that refused it; now it is refused before anything starts. The profile'spermissionsstill make the server
stricter.
A CLI made from an older template keeps its own src/commands/mcp.ts, since src/ is a seed: copy the template's
file, and change claude mcp add lines in its docs to end in mcp serve.
Security
.gitleaks.tomlcatches Google OAuth tokens. gitleaks' own rules know Google API keys only, so an access token
(ya29.…) or a refresh token (1//…) with no keyword beside it went through. Two rules now catch them. A CLI takes
them withupgrade; scan its history once withgitleaks gitafter that, since CI scans all of it.
Fixed
- A command other than
mcp serveno longer loads the MCP library.src/commands/mcp.tsimportedportOfand
publicUrlOffrom@wirecat/cli-core/mcpat the top, so--versionanddoctorloaded the MCP server SDK too
(WC-LIFE-6).mcp serve --httpnow imports them when it runs. docs/security.mdsays whatmcp serve --httplistens on, what it keeps of each browser login, and that
mcp revokeends them.pnpm audit:commandsprints the CLI's own scorecard lines, not the last CLI's total, which was zoom-cli's. It
fails when the scorecard has no line for the CLI. Whether a new finding fails the run did not change.AGENTS.mdkeeps only what holds for the CLI's whole life. The one-time first task (interview, reference CLI,
rewrite the README and the MCP instructions) moved into theDESIGN.mdthatnewwrites, which the CLI owns and
deletes the section from when it is done.upgradedrops the old text fromAGENTS.md.newwrites afileslist that ships only what the CLI runs from:dist,skills,README.md,
CHANGELOG.mdandLICENSE. It copied the template's own list, so a new CLI published itssrc/with tests and
fakes,scripts/,.github/,bin/release,config/,lint/andtemplate.json(WC-REL-16).package.jsonis
a seed, so a CLI made before this trims its list by hand;pnpm smokethen checks the package still runs.docs/dev/TESTING.mdandci.ymlgive both reasonscontracts:upgradeis skipped: it needs local state of the
CLI's own and a published version to upgrade from (WC-TEST-14).docs/dev/reference-clis.mdshows the provider call cli-core has,store.accounts.registerProvider(entry).
@wirecat/cli-core/storeexports noregisterProviderfunction.
0.8.0
Fixed
- The fresh-audit prompt lets the auditor read the cli-base workflow files the CLI's workflows pin (WC-CI-8), as
the handbook's New CLI page now says.
Removed
mcp --permissionis gone. cli-core 0.449.0 checks a--permissionkey against the messenger's names
(messages,drafts,chatsand the like), so in a CLI made from this template it refused every value, its own
command paths included. It returns when cli-core can check a CLI's own permission names. Until then the profile's
permissionsare the way to make the MCP server stricter.mcp server startstill shows a--permissionoption,
which cli-core adds; the server it starts refuses it.
0.7.0
Changed — may break callers
- The skeleton runs on cli-core 0.449.0 and cli-base 0.62.0, the only cli-base line cli-core 0.449 accepts; a CLI
that pins cli-base moves both pins together. The commands and their help do not change, apart from themcp
additions below.
Added
clidev <profile> mcp --httpserves the profile to ChatGPT and Claude in the browser, on127.0.0.1behind the
owner's tunnel, with a one-time login code;--revokeends every login, and is refused underCLIDEV_READ_ONLY.
mcp server start|stop|statusruns it in the background (from cli-core 0.445.0):statusshows the port, the
connector address, the current login code and the apps logged in, and the background server writes no login code to
its log. A secondmcp --httpfor the same profile is refused.mcp --permission key=levelmakes a permission
stricter for one server, over stdio too. A CLI made from an older template takes this withupgrade, or mounts
mcpServerCommandon its ownmcpand passeslockFile: httpLockFile(tokenFile)toserveOverHttp.
Fixed
newwrites the speech model advice intodocs/dev/DESIGN.mdonly for--category messenger. A calendar or
notes CLI got "If this CLI defines a messenger, set its speechModels…" and a warning that no speech model hears a
language, though only a messenger transcribes voice messages.- The cron step
newprints points to the list of taken monthly minutes in cli-base's CI page (WC-CI-9), so
nobody has to readmonthly.ymlin every repository to find a free one. The examples now usegcal-cliand
gcal:calis the system calendar program on macOS and many Linux systems. - Every command spends less time getting ready (cli-base 0.62.0, cli-core 0.449.0). The check of shared commands now
describes each command once, not again for every group above it. It was about 60% of each command's setup; in tg a
warmrun(["--version"])went from 49 to 29 ms. It catches the same changes as before. bin/releaseno longer reports a release that passed as failed.gh run watchalso stops with an error when
one of its own requests to GitHub fails, while the run goes on; 0.6.1 was published, tagged and green, and the
script said it failed. It now waits for the run to finish, reads its result, and checks npm before it says anything.
It namesbin/release --localonly when npm refused the publish because it does not trust the workflow yet.
0.6.1
Fixed
doctoranswers when the settings fail to load for an unexpected reason, with the message under
settings.error; before, any error other than a CLI error stopped the command.- The MCP server's instructions name text from other people, with the names and titles around it, as data that is
never followed.AGENTS.mdnow says to rewrite them for the kinds of text the CLI carries. CLAUDE.mdnames its one local rule: before1.0.0,Addedraises the minor version, aspnpm version:check
already enforced.docs/dev/TESTING.mdand the CI comment say when to addpnpm contracts:upgrade: once the CLI keeps local state
of its own, not only with a store.- The kit's page is split:
kit/README.mdsays how to runnewandupgrade, andkit/DEVELOPING.mdholds what
the template repository must provide. Itstemplate.jsonexamples say they are cut short and link the real file.
0.6.0
Changed — may break callers
- The skeleton runs on cli-core 0.444.0; cli-base stays at 0.59.0, the only line cli-core 0.444 accepts. A run
record now hides more of what was typed: a full 40-character commit hash, and the value of a flag or argument named
like a secret (--pin <chat>). A test of a CLI that expects such a word back inruns showneeds updating. The
commands and their help do not change.
Security
- A run record and a kept error message hide hex keys and a password written after its name with a space (from
cli-core 0.444.0). A random-looking run of 20 or more lower-case hex characters is[redacted]; a short commit
hash, a UUID and upper-case hex stay. More secret names are known (passwd,pwd,private_key,pass,pin,
otp,2fa,clave,пароль,кодand others), and the value after one is hidden after a space as well as after
=or:(password hunter2), unless it is letters only.docs/security.mdsays what is found and what is not.
Added
pnpm kit:e2echecks that a password typed after its name is[redacted]in the failed run's record.
0.5.0
Changed — may break callers
- The skeleton runs on cli-core 0.442.0; cli-base stays at 0.59.0, the only line cli-core 0.442 accepts. A CLI
with its own program that callsrecordRunsnow keeps the command line in its run records without passing the
typed words throughrun(), secrets hidden; the skeleton's commands record through cli-core and need nothing.
Security
- A run record and a kept error message find a secret by what it looks like (from cli-core 0.442.0): a token in
a known format, aBearerorBasiccredential, the value after a secret name such aspassword=, and a
random-looking string of 20 or more characters.docs/security.mdsays what is found and what is not. - A config that will not load no longer lets a run record keep the typed words (from cli-core 0.442.0). The words
are masked, asrecord_input falsewould.
Added
pnpm kit:e2echecks that a token typed as a word is[redacted]in the failed run's record.
0.4.0
Changed — may break callers
- The skeleton runs on cli-core 0.440.0; cli-base stays at 0.59.0, the only line cli-core 0.440 accepts. The
--recordhelp now says what a run keeps: "keep this run, with the command as typed and secrets hidden;
record_input false leaves the typed words out", no longer "ids and timings, never content".docs/commands.md
changes with it, and a CLI that keeps help snapshots refreshes them once. A command a CLI records itself with
recordedorstartRecordingcan keep its command line by passingcontext: runContextOf(…); the skeleton's
commands record through cli-core and need nothing.
Security
- A phone number no longer reaches a run record (from cli-core 0.440.0). One written with its "+" and country
code, or 11 to 15 digits in a row, is[redacted]inside the word typed, so a long id of that length is hidden as
well.docs/security.mdsays so.
Fixed
pnpm docs:spellalso checksAGENTS.md,CLAUDE.mdandskills/.package.jsonis copied once, so a CLI
adds them to its owndocs:spellby hand.
0.3.0
Changed — may break callers
- The skeleton runs on cli-core 0.439.0; cli-base stays at 0.59.0. A run record now keeps the command line as
typed, soruns showtells what was run; a secret is still[redacted]. The new settingrecord_input
(config set record_input false) brings back the masking of every typed word.config setandconfig unsetlist
record_input, so a CLI's help snapshot changes once. A test or page of a CLI that says a run never holds what was
typed needs updating. An argument or option that carries a secret is marked withsecretInput()from
@wirecat/cli-core/cli; the skeleton has none to mark.
Security
- A first word refused as a profile no longer reaches the run record as the run's
profile, and an error that
quotes--token=…orpassword=…no longer keeps the value (from cli-core 0.438.0 and 0.439.0).
Fixed
docs/dev/reference-clis.mdlinks the evidence for what it says about other repositories, no longer calls
whatsapp-cli the handbook's worked example, points a mail CLI at cli-memo's mail import, and no longer saysconfig
hides messenger settings whenmessengerisfalse.pnpm release:checkalso runssecurity:no-leakandpackage:check, which onlybin/release --localran.
package.jsonis copied once, so a CLI adds both to its ownrelease:checkby hand.SECURITY.mdasks never to send a session beside a token, a password and private content.
0.2.0
Added
skill install --for hermesgives Hermes Agent the skill, andskill statusreports the copy Hermes reads.
A bareskill installstill writes only Claude Code's folder and~/.agents/skills, which OpenClaw reads too.search_rerankeris a new setting inconfig set. Only a CLI that adds cli-core's message search uses it.
Changed — may break callers
- The skeleton runs on cli-core 0.437.0 and cli-base 0.59.0. cli-core 0.437 accepts only cli-base 0.59.x, so a
CLI that pins cli-base moves both.--help-allnow givesclidev personal mcpas the profile example, not
clidev personal doctor, sincedoctortakes no profile; a CLI that keeps help snapshots refreshes them once.
skill status --jsongains ahermesentry besidetargets. A run started by OpenClaw hasagent: openclaw,
and one started from an OpenClaw chat addsagent.from_chat: true: a reader ofrun.jsonthat refuses unknown
keys must accept it. bin/releaserunschangelog restorefrom the installed cli-base, throughpnpm exec cli-devlike the fold,
not fromnpx -p @wirecat/cli-base@0.55.1outside the lockfile. A CLI that takes this file withupgradeneeds
cli-base 0.55.1 or later, which haschangelog restore.pnpm version:checkrefuses a release whose number is raised less than its changelog needs. Before1.0.0, a
section withChanged — may break callers,RemovedorAddedraises the minor; only fixes, security and docs
raise the patch. The release skill says the same.scripts/andpackage.jsonare copied once, so a CLI started
from an older template copiesscripts/version-level.tsand theversion:checkscript to get the check.- A new CLI starts with coverage floors just under what the skeleton's tests reach: lines 95, statements 92,
functions 85, branches 75, and still 50% lines per file. The template's kit has its own floor, whichnewleaves
out of the CLI'svitest.config.ts.
Fixed
newdrops akit/key from a config, not only akit/entry in a list, so the CLI'svitest.config.tshas
no coverage floor for a folder it does not have.docs/installation.mdgives the Node.js versionsenginesallows: 22.16 or a later 22.x, or 24 or later. It
read as if Node 23 worked.