Skip to main content
Every version of @retasc/cli published to npm, newest first. Dates are the npm publish date, and each entry names the issue behind it.

1.20.0 (2026-08-04)

  • RTSC-561 — the org gained an admin role, and the CLI stopped refusing it. retasc billing gated on role !== "owner" client-side, so it would have refused an admin locally for a call the server allows. Owner-only copy in bind and the command help now names both roles.

1.19.0 (2026-08-03)

  • RTSC-495retasc bind --setup <code> sets a folder up with no sign-in and nothing to answer, so an agent can do it on behalf of someone who does not use a terminal. The Dash’s connect step now hands over a block you paste to your agent, with this command inside it. Everything the interactive bind would ask was already answered in the browser, and the code carries those answers across. An agent’s shell is not a TTY, so the ordinary path refuses it outright at the first prompt.
    The code is single-use and lives ten minutes. The alternative — pasting a real API key into the prompt — needed no backend at all, but would have left a long-lived credential in an agent’s conversation history forever. A folder that is already connected is refused rather than silently replaced, and the refusal happens BEFORE the code is spent, so a mix-up costs nothing.
  • RTSC-532 — the agent says which folder it is in, and the key remembers. Binding the wrong folder used to look exactly like success: the agent still called in, so the Dash went green, while the folder you actually work in had no Retasc in it. The prompt now asks the agent to report its full path and wait before it runs anything, and the confirmation names the real path instead of “This folder”. The key it creates is named after that folder, so the Keys page shows which folder each key belongs to (client-a) instead of naming them all after the project (ENG key).

1.18.0 (2026-08-02)

  • RTSC-530 — setting up from scratch now asks where your work comes from, and imports it in the same command. retasc bind used to offer one thing at the project step: name a new project. So someone arriving from Jira had to invent a project they didn’t want, run retasc import afterwards to get the one they did, and leave the empty one behind — and projects can’t be deleted individually.
    Pick a tracker and the import runs right there, then the folder binds to the project it created. Pick “start from scratch” and it behaves exactly as before. This is the same fork the Dash has always offered; importing isn’t a separate errand, it’s one of the ways a first project comes into existence. Only when the org has no projects — binding a second folder in an existing org is still just picking from the list. Declining at the import confirmation falls back to naming a project rather than abandoning setup: you still asked to bind the folder.

1.17.0 (2026-08-02)

  • RTSC-529 — the column mapping is a numbered picker, like every other prompt. It was the only one that made you type a word. Picking an org, a project, a source, a list, a reviewer, a sign-in door or whether to install globally are all numbered lists reading Choose a number — and the reviewer picker appears two lines below this one, so a single import taught two input styles within four lines of output.
    Enter still takes the suggestion, now marked in the list rather than described beside it. Typing the word still works for anyone who has learned the vocabulary; it just isn’t what the prompt advertises.

1.16.1 (2026-08-02)

  • RTSC-528 — two things the first real retasc import run turned up. The progress bar never appeared. It only started drawing once it had seen the run reported as running, and a 15-issue import finishes before that is ever observed, so the output went straight from Importing… to ✓ Imported. with a silent gap. It now draws the moment the run starts, sweeping while it waits for counts and switching to the real bar once they arrive. Still silent without a terminal and under NO_COLOR. The column prompt didn’t say what to do. It read to do [todo] (todo / doing / done / canceled):, where nothing is a verb, so the first person to run it had to guess that you type one of the words. Now:
    The suggestion is no longer repeated among the alternatives, which is what made the old line read as four equal options behind a mysterious bracket.

1.16.0 (2026-08-02)

  • RTSC-526retasc import catches up with the Dash on four things. It warns before a second import. Re-importing does not duplicate anything, but it does re-sync: status, labels, title and body are replaced with whatever the source says now. Import from Jira, spend two weeks moving issues along in Retasc, re-import to pick up new tickets, and those two weeks of changes snap back. You now get told, with the date of the last import, before the confirmation. The run shows progress, as a bar that fills while it works, rather than a silent wait that looks like it has hung. The run is server-side, so pressing Ctrl-C out of boredom never stopped it anyway. The column list is grouped under your own tool’s sections (Not started, Active, Done, Closed) instead of arriving flat. On a twenty-column board that is the difference between scannable and a wall. Columns that were not mapped are named. If a column appears between the moment you set the mapping and the moment the import runs, its issues land in todo. They used to show as a number; now they are listed, with what to do about it.

1.15.0 (2026-08-02)

  • RTSC-524 — new command: retasc import. Bring a Linear, Jira, Asana, ClickUp or Shortcut project across without opening a browser. This was the last thing the terminal could not do. Everything else — sign in, make or join an org, create a project, wire the folder, pull work — already worked end to end, but importing meant stopping and finishing in the Dash.
    It walks you through the source, your credentials, which team or project to take, and then what each of your columns means. That last part is the point, and it is asked rather than guessed: a tool lets its users name their own columns, so the only honest way to know what one means is to ask you. Pressing Enter accepts a suggestion derived from the column’s type in your tool, never its name — a column called “Rejected” that is really an in-progress lane maps to doing, not canceled. A column mapped to review needs a named reviewer, chosen per column, because two “awaiting acceptance” columns can belong to different people. Columns holding work nobody has started cannot be mapped to review at all, and the CLI says why rather than letting the server refuse it later. Your source token is never an argument. There is no --token, because anything passed that way lands in shell history and in ps output. Secrets are typed with echo off, or taken from RETASC_IMPORT_<FIELD> for scripted runs. The run is confirmed before anything is written, and afterwards you are offered the imported identity the migration just created for you, through the same prompt retasc join uses.

1.14.0 (2026-08-02)

  • RTSC-523 — setup asks before installing anything on your machine. retasc bind and retasc join are one command you paste and answer, and somewhere in the middle they ran npm install -g @retasc/cli. It said so, but it never asked. That is the only step in a folder-scoped command that changes the machine rather than the folder, and a shared npm prefix is exactly what plenty of developers keep clean.
    Both answers leave the folder bound identically. Option 2 is not a per-project install: nothing is written to the folder, so it needs no package.json and cannot fail for want of an npm project. Your answer is remembered, because it is a question about the machine and the machine has not changed by the time you bind a second folder. You are only asked when it would actually happen. If retasc already works, there is nothing to decide and nothing is said. Without a TTY it installs, exactly as before. That is deliberate rather than a leftover: when an agent runs setup on someone’s behalf, that person never types retasc, but their agent starts the MCP server every session, and the on-demand route would cost them seconds and a network dependency every single time. --no-install on bind and join declines without a TTY, for a developer whose own agent is doing the setup.

1.13.1 (2026-08-02)

  • RTSC-522 — the changelog is public, and five releases that were never written down now are. It used to be unreachable by anyone who installs the CLI: it did not ship in the tarball, the README never mentioned it, and the source repo is private so the npm repository link 404s for the public. It is now at docs.retasc.com/changelog, and ships in the package. 1.1.0, 1.1.1, 1.1.3, 1.2.1 and 1.2.2 were published and never described. They are reconstructed here from their release commits and the issues they reference, so every version on npm now has an entry. Each one carries its publish date. Also fixed two npm-facing details: the package description still said “sign in with GitHub”, which stopped being the whole truth at 1.11.0, and the bug-report link pointed at a private repository that 404s for everyone npm showed it to.

1.13.0 (2026-08-02)

  • RTSC-521 — five commands stopped answering you with a JSON dump. whoami, org create, project create, key list and members list printed the raw payload. whoami is the one people actually noticed, because it is the command you run to find out who you are:
    The one fact you wanted was a bracket to parse, next to a document id that means nothing. Now:
    key list and members list are aligned tables, and state reads as words: a revoked key says revoked rather than an epoch, and a spent invite shows no expiry date because the date stopped meaning anything. Auto-minted session keys are folded into a count instead of drowning the keys you can actually manage. Ids follow one rule: shown when a command takes them, dropped when nothing does. So org create gives you the org id and names the command that wants it, and never mentions ownerMemberId. --json on all five, emitting exactly what they printed before. Anything scripted against the old output keeps working by adding the flag. whoami’s binding block is unchanged. It was already the useful half.

1.12.0 (2026-08-02)

  • RTSC-519retasc bind now tells you it finished, and what to do next. It used to end on the last thing it did (“This folder is bound to org Acme / project ACM”) and stop. So the person who set up their own org was left reading a status line and guessing whether anything else was required, while the invited teammate, who arrives through retasc join, was told. Both commands now end the same way:
    The restart half matters: .mcp.json is read when an MCP client starts, so an agent already open on that folder won’t see Retasc until it restarts — and bind is routinely run from inside a session that’s already there. The sentence lives in the tail both commands share, rather than a copy in each, so neither can lose it again.
  • RTSC-507 — “none of these are me” now covers the tools you were asked about, not the whole org forever. Declining wrote one org-wide flag, checked before the list of imported people was even read. So the January answer “I was never in ClickUp” — correct, and the cheapest possible answer to give — meant that when the org migrated off Jira in June, where you did have an account, you were never offered your placeholder. Not by retasc identity, not by retasc join, not by the Dash, not ever. Your Jira authorship, comments and assignments stayed on a placeholder permanently, and only an owner could repair it. Claiming was already tracked per source, so someone who claimed their ClickUp identity was correctly re-asked at every later migration. Declining being the more final of the two was backwards. The decline row now names what it covers:
    and retasc identity says so when nothing is left:
    That replaces wording saying the answer “covers the whole org, including later migrations” and pointing at an owner. It existed only to describe this bug. Needs the matching backend deploy. The copy above is a promise the server keeps, so publish this only after convex deploy and migrations:backfillDismissedSources have run. Against an older backend the CLI would say a later import will ask again, and it would not.

1.11.0 (2026-08-02)

  • RTSC-508 — you can now sign in with Google, not only GitHub. Google sign-in shipped for the web Dash first, which left a one-way street: an account created through that door reached the Dash and nothing else, because every login-gated command here sat behind a GitHub-only device flow. retasc login would start a GitHub device flow for an account GitHub had never heard of. That blocked bind, init, key, members, billing and identity outright — including the sign-in step inside retasc bind and retasc join, so a teammate invited through the web could not finish setting up their folder at all. With no flag, login now asks which door you use:
    After a successful sign-in the door is remembered, so later logins offer it back and Enter takes it:
    A default only ever appears once it is a recorded fact about you. On a first login there is none, and Enter is not an answer — because the wrong door is not a mistake you correct next time (see below). The remembered door is a default, not a lock: the other one is still one keystroke, and a typo re-prompts rather than being read as “the usual”. retasc login --google / --github skip the question. A non-interactive run is unchanged: no prompt, GitHub, exactly as before. The same question appears inside bind and join when they sign you in for you. Signing in through the wrong door is not a typo you correct on the next run. Google and GitHub are deliberately separate identities — doors are linked only on a provider’s own immutable account id, never on a matching email address, because email is an account-takeover vector. So a Google sign-in by someone who already has a GitHub account here creates a second identity with its own membership, and the CLI cannot merge them back. That is why the question is asked rather than guessed, and why a non-answer re-prompts instead of falling through to a door. Needs AUTH_GOOGLE_DEVICE_ID / AUTH_GOOGLE_DEVICE_SECRET on the deployment (operations/runbooks/google-device-client.md). Where they aren’t set, the CLI says so in one line and names GitHub as the way in meanwhile, rather than failing opaquely.

1.10.0 (2026-08-01)

  • RTSC-477 — new command: retasc identity. It shows the people a migration carried into your org and asks which one is you — the same question retasc join asks, on demand.
    join asks this once, at the moment you accept an invite. Placeholders arrive with every migration, though, and claiming is per source tool rather than per person: the backend is built for “claim your ClickUp one now, your Jira one in six months”. So a team that onboarded by CLI a year ago had no terminal path to a later import’s history at all, and had to open the Dash or leave it on placeholders. Three narrower cases join skips on purpose are covered too: --yes, a non-interactive run, and --no-bind. It asks the question, so it needs a TTY and refuses without one rather than exiting 0 in silence. There is deliberately no --yes and no identity claim <name>: linking someone pulls their authorship and their dispatch lane onto your account, irreversibly, with no CLI way back, so it is never answered on a script’s behalf. It also names the ending, which join does not. “Nothing waiting for you” and “you’ve already said none of these are you” are the same empty list from the inside and mean opposite things — the second is permanent and org-wide, so it still applies after a later migration that really did carry you across. That case now says so, and points at the owner, who is the only one who can undo it.

1.9.0 (2026-07-31)

Behaviour change, read this if you script join: retasc join <code> used to redeem an invite and stop. It now also sets up the folder you run it in — mints a key, writes a binding, wires the MCP marker. --no-bind reproduces the old behaviour exactly, same output and same exit code. Every other command is unchanged. join also no longer exits 1 telling you to run retasc login first. It starts the device flow itself when there is no session, and refuses with the same message bind uses when there is no TTY to run one in.
  • RTSC-492retasc join is now the whole of an invited teammate’s setup, in one command run from the folder their agent will work in:
    It signs them in (device flow, only when there is no session), redeems the invite, offers them any identity a migration carried across, picks the project, makes retasc durable, mints a key, binds the folder and wires the MCP marker. It used to be three commands with an ordering trap in them, and the first of those three was retasc login — which is not something you can tell someone who has installed nothing yet. The target case is that an invited teammate never opens the Dash at all. With no imports and one project, the only thing they type is the GitHub device code: every prompt is conditional on there being a real choice.
    • Takes a full invite link or a bare rtscinv_… code. The code is what the server matches, so unwrapping a paste belongs at the edge that accepts typed input, not in the mutation that grants membership.
    • A member is never offered a project they cannot create (createProject is owner-only), and an org with no projects names what to ask an owner for instead of failing opaquely.
    • Imported placeholders are offered once per source tool, each behind an explicit confirm, in the same words the Dash uses. --yes skips that question and never answers it: claiming another person’s history is irreversible and has no CLI path back.
    • --no-bind keeps the old redeem-only behaviour for anything scripted against it.
    Under it, bind and join now share one implementation of the folder half — the project pick, the launcher ladder, the mint, the binding and the marker — so the fix that landed in 1.8.0 cannot drift back out of one of them.
  • RTSC-498retasc doctor now says which platform the CLI is actually tested on. Nothing in the product stated one: the READMEs never mentioned platforms and package.json declares only engines.node, so someone hitting a problem on Linux or Windows had no way to tell their own mistake from a bug from a platform we never targeted. macOS is the only platform we run end to end. It’s a note in doctor rather than a line in the README on purpose. A README is read by everyone, and for the majority on macOS a standing disclaimer about platforms they aren’t using is noise they read before they’ve even installed. doctor already knows which machine it’s on, so the people the limit applies to are exactly the people who see it, and on macOS nothing is printed at all. The note claims a limit, not a blockage: much of the CLI is plain Node and should work fine, and package.json still carries no os field, so installing is never refused anywhere Node 18+ runs. Windows and Linux are named as platforms we intend to support properly; anything else is told it’s untested without being promised a roadmap it isn’t on.

1.8.0 (2026-07-31)

  • RTSC-493 — the MCP marker no longer names a command that may not exist. It used to hardcode retasc, which is only on PATH after a global install — but the Dash tells people to run npx @retasc/cli bind, and npx unpacks into its own cache and installs nothing. So a bind printed every success line, really did bind the folder, and left an agent that could not start the Retasc MCP server at all. The failure surfaced later, somewhere else, as a broken server rather than a failed setup. bind now resolves a launcher and proves it by running it before writing anything: it uses an existing retasc if there is one, otherwise installs the CLI globally, and if that install lands where PATH cannot see it, the marker names the binary’s absolute path instead. Only when none of that works does it fall back to a version-pinned npx, which is slower and needs the network — and if even that will not start, it says so outright rather than reporting success. retasc doctor now checks the same thing, so a folder bound by an older version reports why its agent cannot start and names the repair.

1.7.2 (2026-07-21)

  • RTSC-297retasc bind no longer strands a new org silently. It creates the org server-side before the project picker runs, so aborting at the project step (reachable by a typo since 1.x’s picker gives up after 3 bad answers) left an org behind with no project, no key, and no local binding — invisible from the CLI and quietly accruing on the billing rail. Bind now names the org and prints the exact resume command (retasc bind --org-id <id>) when it aborts before the workspace is bound. Selecting a pre-existing org and then aborting is untouched — nothing is reclaimed.

1.7.1 (2026-07-21)

  • RTSC-321 — the liveness watchdog now stops heartbeating an issue the moment it moves to review (RTSC-257): the server releases the lease there, so the proxy no longer pings a dead lease until the next heartbeat fails. It is treated as a release, not a close — the branch/worktree is preserved for the review + PR (never reaped). The reviewer’s send-back (review → todo) still self-heals via the failed-heartbeat path, since it can’t be told apart from a doing → todo edit by request args alone.

1.7.0 (2026-07-21)

  • RTSC-306retasc claim / retasc next now pull lane-scoped by default: only issues assigned to your principal or left unassigned, never another human’s work. The old --mine flag is retired — that behavior is the default now. The new --all-lanes flag opts back into the whole ready pool when you need to pick up an absent teammate’s work. When your lane is empty but ready work is stranded in another lane, the CLI says so and points you at --all-lanes instead of reading as “nothing to do”.

1.6.3 (2026-07-20)

  • RTSC-266 — README now links the setup page, the docs quickstart, and the parallel-agents guide instead of only the bare homepage. npm package pages are a real entry point and only re-render on publish, so this ships as its own patch release. No code changes.

1.6.2 (2026-07-20)

  • RTSC-269retasc bind’s org/project picker no longer treats a typo as “create new”. Answering 1) (a fumbled 1) used to select nothing and fall straight through to creating a new org/project, which then hit the owner gate and surfaced as a redacted Server Error. Invalid input now re-prompts; only the explicit trailing option creates. The answer must be plain digits, so the non-canonical forms Number() happily parses (0x4, 4e0, +4, 4.0) can’t reach the create branch either.
  • RTSC-269 — the picker gives up after 3 invalid answers instead of looping, and a closed stdin (Ctrl-D, or a pipe running dry) now exits with an error rather than hanging. readline.question() never settles at EOF, so any prompt in bind could previously wedge the CLI with no output and no exit.

1.6.1 (2026-07-20)

  • RTSC-263 — owner/member permission denials now print a readable reason and the next step instead of an opaque Server Error. Hitting an owner-only command as a member reports “Owner role required.” with “Ask <owner> to create a project.” on its own line. The backend change does the work; the CLI already read the structured payload (1.5.0), so this release carries only the hardening below.
  • RTSC-263formatError now strips U+0085, U+2028 and U+2029 in addition to the ASCII control characters. All three are mandatory line breaks, so a server message interpolating a user-controlled name could previously forge extra lines in terminal output.

1.6.0 (2026-07-20)

  • RTSC-262doctor and whoami no longer report “not bound” for a folder whose Retasc MCP is registered in Claude Code local scope (the claude mcp add default — stored in Claude’s own config, not ./.mcp.json). The binding lookup now reads both legal per-folder locations, and when both exist the local-scope entry wins, matching Claude Code’s documented precedence (local > project) — doctor names the org the agent actually uses, and warns when a differing ./.mcp.json marker is being shadowed.
  • RTSC-262claim/tidy/done resolve the key through the same entry selection, so the CLI can no longer say ”✓ bound” in one command and “No Retasc MCP key found” in another for the same folder.
  • RTSC-262 — the illegal-global-server check is now presence-based: a hand-added user-scope entry is detected in every shape (including keyless), and an unreadable ~/.claude.json reports “cannot verify” instead of a false all-clear.
  • RTSC-262 — honest failure modes: server-unreachable (timeouts, 5xx, rate limits) is no longer reported as a rejected key, whoami/doctor requests are bounded by a 10s timeout, and server-derived strings are stripped of control characters before printing.
  • RTSC-262bind hardening: re-binding to the same org/project is an idempotent success (no key churn for provisioning scripts); replacing a different binding non-interactively without --yes now fails loudly with exit 1 instead of silently succeeding as a no-op; a cloned repo’s committed marker no longer triggers the replace prompt (minting your own key under it is what bind is for).
  • RTSC-262 — (security) a keystore-resolved key now only ever travels to the keystore’s own URL — a hostile RETASC_MCP_URL planted next to a committed secret-free marker can no longer redirect a teammate’s real key.

1.5.0 (2026-07-20)

  • RTSC-261 — backend failures you’re meant to act on now print what actually went wrong instead of ✗ Server Error. Convex masks any plain server throw in production, so every precondition — a consumed invite code, an expired one, a suspended membership — reached the terminal as the same opaque string. retasc join was the worst case: an invited teammate hit an unreadable wall at the very first step. Errors now carry a machine-readable code, a readable message, and an optional hint printed on its own line:
    This release covers invite redemption; the remaining surfaces (auth/key problems, not-found lookups, billing gating, import/restore) follow. Internal invariants stay masked deliberately — those are our bugs, not yours, and their messages describe server state. Upgrade before your teammates redeem invites: an older CLI can’t read the new payload and prints it as raw JSON.

1.4.0 (2026-07-19)

  • RTSC-279 — new retasc billing command: the org’s whole billing picture in the terminal instead of only in the Dash. Prints the subscription and spending caps, what’s owed right now, and the charge + confirmed on-chain payment history — both org-scoped across every payment link the org has ever used, so changing payment link no longer hides prior history. Owner-only (it reuses the same owner-gated functions the Dash renders; the client-side role check is UX, the server still gates). --org-id selects the org when you belong to more than one, --json emits the raw payload. Payments are a live read of Xenarch’s authoritative records and degrade to a note rather than failing the command.
  • RTSC-279 — (server-side, no CLI change) the MCP usage meter now reports two clearly-named figures instead of one misleading wouldBeBillUsd: lifetimeMeteredEstimateUsd (all-time activity repriced at today’s rate card — a diagnostic, not an amount owed) and pendingUsd (what is actually owed right now, the same figure the Dash shows). A new billing_summary MCP tool exposes the full billing detail to agents whose human principal owns the org.

1.3.2 (2026-07-17)

  • RTSC-250 — serialize patchConfig under a cross-process advisory lock so concurrent CLI/MCP processes can’t lose an update. Previously a lock-free load-modify-save meant a defaultOrgId/defaultProjectPrefix write racing the hourly token refresh could write back the old single-use refreshToken, breaking the next refresh and forcing a device re-login a non-interactive context can’t perform. The lock re-reads the freshest config inside the critical section and stamps a nonce so a stolen-from holder never deletes the new owner’s lock. Also sweeps orphaned .config.json.<uuid>.tmp files left by a hard kill, age-gated so a concurrent writer’s in-flight temp is never touched.

1.3.1 (2026-07-17)

  • RTSC-179 — atomic config write (temp file + rename) so a reader never sees a truncated config.json; adds RETASC_DIR support.
  • RTSC-178 — token refresh now classifies transient backend errors vs a genuinely expired refresh token, so a one-off backend blip no longer drags a valid session through a full device re-login.

1.3.0 (2026-07-08)

  • Auto-reap branches on MCP close: when the watchdog proxy observes a session’s own claim close terminally and successfully, it removes that issue’s clean, merged rtsc-NN/* worktree and branch out-of-band (retasc tidy --prune --only <id>), instead of orphaning them until a human ran retasc tidy. Exposes tidy --only <RTSC-NN>.

1.2.4 (2026-07-07)

  • RTSC-170 — credential-file permission hardening: config.json, bindings.json, and the fallback .mcp.json are written 0600 (dirs 0700) with no world-readable creation window.

1.2.3 (2026-07-05)

  • RTSC-150 — watchdog isClaimLost fix: no longer drops a live lease when a payload field merely contains the string CLAIM_LOST.

1.2.2 (2026-07-04)

  • RTSC-148retasc claim takes the issue as a positional argument, and never silently falls through to next_issue. retasc claim 143, claim RTSC-143 and claim rtsc-143 all resolve to that issue; a bare number expands against the workspace’s prefix, resolved over the workspace key rather than global config. Excess arguments now error loudly instead of being dropped by Commander, which was how “claim this specific issue” quietly became “claim whatever is next”.

1.2.1 (2026-07-04)

  • RTSC-143 — one tolerant tool-result parser, and a loud failure when the claim fence is off. The proxy and claim each had their own silent copy of the parser; they are now one (lib/toolresult.ts), which recovers the leading JSON value when a footer trails the payload, refuses to recover from an isError response or concatenated JSON, and warns on stderr when it degrades so a shape regression is never silent. Session-key minting retries once with a 5s timeout and checks res.ok. On a double failure it still fails soft, but says loudly that the per-session claim fence is OFF, and the proxy appends that notice to whoami so the agent sees the degraded state rather than it sitting in an MCP log file nobody opens.

1.2.0 (2026-07-04)

  • RTSC-137 — org-membership commands: retasc members invite|list|revoke and retasc join.

1.1.3 (2026-07-02)

  • RTSC-131retasc --version reads package.json instead of a frozen literal. It was hardcoded to 1.1.1, so the published 1.1.2 still reported 1.1.1. The version is now read at runtime relative to the compiled file, making package.json the single source of truth.

1.1.2 (2026-07-02)

  • RTSC-130 — republish the bind auto-wire fix that had changed CLI source without a version bump (npm versions are immutable).

1.1.1 (2026-06-28)

  • RTSC-98claim, tidy and done resolve the keystore key through the same resolver the proxy uses. After 1.1.0 moved keys out of the repo, a secret-free .mcp.json was understood by the proxy but not by those three commands, which still only knew the legacy inline-key path and bailed with “No Retasc MCP key found”. The two resolvers had drifted, so they are now one (resolveConn in lib/keystore.ts): explicit RETASC_MCP_KEY, then a legacy inline key, then the canonical secret-free marker. Legacy markers keep working.

1.1.0 (2026-06-28)

  • RTSC-92 — workspace keys move to a home keystore, and the folder marker becomes secret-free. Secrets no longer sit in a project tree. The key lives in ~/.retasc/bindings.json (mode 0600), keyed by an opaque workspace id rather than a path, so nothing leaks a home directory and a checkout stays portable across a team. What lands in the repo is a marker carrying only that id, which is why ./.mcp.json is safe to commit. doctor reports whether a binding is keystore-backed or legacy, and flags a workspace id already bound at a different folder. A cloned repo whose marker has no key on this machine is reported as such rather than as broken.

1.0.0 (2026-06-27)

  • RTSC-89 — initial npm publish as @retasc/cli (bin stays retasc).
Last modified on August 6, 2026