@retasc/cli 1.47.0 → 1.48.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -6,6 +6,27 @@ release commits and the issues they reference.
6
6
 
7
7
  Dates are the npm publish date. Each entry names the RTSC issue behind it.
8
8
 
9
+ ## 1.48.0 (2026-09-08)
10
+
11
+ - **RTSC-859** — `retasc key mint --hosted`: a key now says at mint what it is for.
12
+ `workspace` (the default, and what every bind door says explicitly) expects the local
13
+ watchdog; `hosted` is for a cloud agent or CI that will never have one.
14
+
15
+ Why: a workspace key sent raw to the server with no proxy is two things at once and the
16
+ server cannot tell which, a hosted agent working as documented or a laptop whose config
17
+ went stale. Both got the same advice on every claim, run `bind`, which a hosted agent
18
+ cannot do. With `kind` on the row, a hosted key is told the one true thing (renew your
19
+ own leases) and shows "no folder (hosted)" on the Agents page as a fact rather than a
20
+ gap; a workspace key with no runner gets the firm remedy, because for that row it is
21
+ true. A key that said nothing, which includes every key minted before this and any bare
22
+ `key mint` since, keeps the old hedged text, since nothing on the row can say which it
23
+ is. `--hosted` and `--install` are refused together: one wires a local watchdog, the
24
+ other says there will never be one.
25
+
26
+ `retasc mcp install --no-watchdog` is not deprecated (it writes exactly a hosted
27
+ deployment's config) but now says, once, that a key used that way should be minted
28
+ `--hosted`.
29
+
9
30
  ## 1.47.0 (2026-09-08)
10
31
 
11
32
  - **RTSC-864** — `retasc key mint` now prints every remote-key config block a hosted
@@ -515,6 +515,9 @@ export async function completeWorkspaceSetup(args) {
515
515
  projectId: projectId,
516
516
  agentName: opts.agent,
517
517
  runtime: opts.runtime ?? "claude-code",
518
+ // RTSC-859 — bind is the folder door, so this is a workspace key, and the row
519
+ // says so rather than leaving it to the server's default.
520
+ kind: "workspace",
518
521
  // RTSC-810 — named after the FOLDER, the leaf only, exactly as the setup-token
519
522
  // door has done since RTSC-532: the Keys list is the folder map (`client-a →
520
523
  // ENG`), and the old prefix-plus-"key" name told nobody which folder held it.
@@ -267,6 +267,15 @@ export function installMcp(opts) {
267
267
  console.log("Two things it does not cover, both safe (they fall back to the normal 30-minute lease timeout): if the proxy stops, renewal stops; and a claim made elsewhere — another terminal, direct HTTP MCP, or a previous proxy before a restart — is renewed by nobody. Heartbeat or checkpoint those yourself.");
268
268
  return;
269
269
  }
270
+ // RTSC-859 — this is the direct HTTP form, no watchdog, which is exactly a HOSTED
271
+ // deployment's shape. It is the correct config for one (RTSC-864 documents it), and it
272
+ // is NOT deprecated. But the key it wires does not know what it is for unless it was
273
+ // minted `--hosted`, and a workspace key used this way is told on every claim to go
274
+ // and wire the watchdog it is deliberately running without. Say so once, here, where
275
+ // the choice is being made, rather than warning on every claim afterwards.
276
+ console.log("\nNo watchdog: nothing on a machine will renew this key's claims. If this key runs " +
277
+ "from a cloud agent or CI, mint it with `retasc key mint --hosted` so Retasc knows " +
278
+ "and stops advising it to run `bind`; a hosted key is expected to heartbeat itself.");
270
279
  const res = tryClaudeCli(opts.url, opts.key, scope);
271
280
  if (res.ok) {
272
281
  console.log(`✓ Registered MCP server "${SERVER_NAME}" with Claude Code (scope: ${scope}).`);
package/dist/index.js CHANGED
@@ -365,10 +365,22 @@ key
365
365
  .option("--agent <name>", "Agent member name (default: auto, \"{you}'s {runtime}\")")
366
366
  .option("--runtime <runtime>", "Label for this agent in the Dash (claude-code | codex | grok | …). Does NOT choose where MCP config is written — `retasc setup` wires every harness on the machine.", "claude-code")
367
367
  .option("--name <label>", "Key label")
368
+ // RTSC-859 — say at mint that this key will never have a local runner. Without it
369
+ // the server cannot tell a cloud agent working as documented from a laptop whose
370
+ // config went stale, and hands both the same advice: run `bind`, which a hosted
371
+ // agent cannot.
372
+ .option("--hosted", "This key runs somewhere with no local install (a cloud agent, CI): never told to run bind, never mistaken for a stale setup")
368
373
  .option("--install", "Also wire the key into your agent via MCP")
369
374
  .option("--scope <scope>", "MCP install scope if --install: local | project", "local")
370
375
  .action(async (opts) => {
371
376
  requireLogin();
377
+ // RTSC-859 — the two flags contradict each other. `--install` wires a local watchdog;
378
+ // `--hosted` declares there will never be one. Accepting both produced a row the Dash
379
+ // labelled "no local watchdog" for a laptop that was running one, silenced its
380
+ // stale-CLI nudge, and had the proxy's `name_workspace` refused on every start.
381
+ if (opts.hosted && opts.install) {
382
+ fail(new Error("--hosted and --install contradict each other: --install wires a local watchdog, --hosted says this key will never have one. Pick one."));
383
+ }
372
384
  try {
373
385
  const res = (await api.mintKey({
374
386
  orgId: opts.orgId,
@@ -376,6 +388,14 @@ key
376
388
  agentName: opts.agent,
377
389
  runtime: opts.runtime,
378
390
  keyName: opts.name,
391
+ // RTSC-859 — said only when the caller actually said something. `--hosted` is
392
+ // the word for a cloud agent or CI. `--install` wires the watchdog right here, so
393
+ // that key is a workspace key by construction. A BARE `key mint` says nothing:
394
+ // it is the documented hosted path (RTSC-864, llms.txt) AND the manual-wiring
395
+ // path, and stamping `workspace` on it sent every cloud agent minted that way a
396
+ // firm "re-run bind in that folder" for a folder that never existed. Absent keeps
397
+ // the honest hedge, which is exactly right for a key we know nothing about.
398
+ ...(opts.hosted ? { kind: "hosted" } : opts.install ? { kind: "workspace" } : {}),
379
399
  }));
380
400
  console.log(`✓ Minted key: ${res.key}`);
381
401
  console.log(" (Shown once — store it now.)");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@retasc/cli",
3
- "version": "1.47.0",
3
+ "version": "1.48.0",
4
4
  "description": "Retasc CLI — the issue tracker AI agents pull work from. Sign in with GitHub or Google, create projects, mint agent API keys, and wire your agent to the Retasc MCP server in one command.",
5
5
  "type": "module",
6
6
  "bin": {