chore(cli): release 1.0.0 — out of alpha
Some checks failed
CI / Broker tests (Postgres) (push) Has been cancelled
CI / Lint (push) Has been cancelled
CI / Typecheck (push) Has been cancelled
CI / Docker build (linux/amd64) (push) Has been cancelled

Promote CLI from 1.0.0-alpha.42 to stable 1.0.0 so
`npm i -g claudemesh-cli` installs the current release without
needing the @alpha dist-tag.

Both dist-tags now point at 1.0.0 — `@alpha` kept as an alias for
continuity so existing docs, install scripts, and scheduled upgrade
commands keep working.

upgrade + doctor commands updated to prefer the `latest` dist-tag
(falling back to `alpha`) and to suggest `npm i -g claudemesh-cli`
without the @alpha suffix.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Alejandro Gutiérrez
2026-04-20 02:06:11 +01:00
parent 3d2ab0cb4b
commit 163e1be70a
3 changed files with 14 additions and 11 deletions

View File

@@ -1,6 +1,6 @@
{ {
"name": "claudemesh-cli", "name": "claudemesh-cli",
"version": "1.0.0-alpha.42", "version": "1.0.0",
"description": "Peer mesh for Claude Code sessions — CLI + MCP server.", "description": "Peer mesh for Claude Code sessions — CLI + MCP server.",
"keywords": [ "keywords": [
"claude-code", "claude-code",

View File

@@ -225,14 +225,14 @@ async function checkNpmLatest(): Promise<Check> {
return { name: "CLI up-to-date", pass: true, detail: `npm unreachable (${res.status}) — skipped` }; return { name: "CLI up-to-date", pass: true, detail: `npm unreachable (${res.status}) — skipped` };
} }
const body = (await res.json()) as { "dist-tags"?: { alpha?: string; latest?: string } }; const body = (await res.json()) as { "dist-tags"?: { alpha?: string; latest?: string } };
const latest = body["dist-tags"]?.alpha ?? body["dist-tags"]?.latest; const latest = body["dist-tags"]?.latest ?? body["dist-tags"]?.alpha;
if (!latest) return { name: "CLI up-to-date", pass: true, detail: "no dist-tag — skipped" }; if (!latest) return { name: "CLI up-to-date", pass: true, detail: "no dist-tag — skipped" };
const up = latest === VERSION; const up = latest === VERSION;
return { return {
name: "CLI up-to-date", name: "CLI up-to-date",
pass: up, pass: up,
detail: up ? `latest ${latest}` : `installed ${VERSION} → latest ${latest}`, detail: up ? `latest ${latest}` : `installed ${VERSION} → latest ${latest}`,
fix: up ? undefined : "npm i -g claudemesh-cli@alpha", fix: up ? undefined : "npm i -g claudemesh-cli",
}; };
} catch { } catch {
return { name: "CLI up-to-date", pass: true, detail: "npm check skipped" }; return { name: "CLI up-to-date", pass: true, detail: "npm check skipped" };

View File

@@ -1,9 +1,10 @@
/** /**
* `claudemesh upgrade` — self-update the CLI to the latest alpha. * `claudemesh upgrade` — self-update the CLI to the latest release.
* *
* Strategy: * Strategy:
* 1. Query npm for the latest @alpha dist-tag. * 1. Query npm for the `latest` dist-tag (falls back to `alpha` for
* 2. If we're behind, run `npm i -g claudemesh-cli@alpha` via the same * users who still prefer the prerelease track).
* 2. If we're behind, run `npm i -g claudemesh-cli` via the same
* npm that installed us (detected from argv[1] path walk). * npm that installed us (detected from argv[1] path walk).
* 3. Print before/after versions. * 3. Print before/after versions.
* *
@@ -19,12 +20,14 @@ import { URLS, VERSION } from "~/constants/urls.js";
import { render } from "~/ui/render.js"; import { render } from "~/ui/render.js";
import { EXIT } from "~/constants/exit-codes.js"; import { EXIT } from "~/constants/exit-codes.js";
async function latestAlpha(): Promise<string | null> { async function latestVersion(): Promise<string | null> {
try { try {
const res = await fetch(URLS.NPM_REGISTRY, { signal: AbortSignal.timeout(8000) }); const res = await fetch(URLS.NPM_REGISTRY, { signal: AbortSignal.timeout(8000) });
if (!res.ok) return null; if (!res.ok) return null;
const body = (await res.json()) as { "dist-tags"?: { alpha?: string; latest?: string } }; const body = (await res.json()) as { "dist-tags"?: { alpha?: string; latest?: string } };
return body["dist-tags"]?.alpha ?? body["dist-tags"]?.latest ?? null; // Prefer the stable `latest` dist-tag; fall back to `alpha` for users
// on prerelease builds before 1.0 shipped.
return body["dist-tags"]?.latest ?? body["dist-tags"]?.alpha ?? null;
} catch { } catch {
return null; return null;
} }
@@ -55,7 +58,7 @@ export async function runUpgrade(opts: { check?: boolean; yes?: boolean } = {}):
["checking", "npm registry…"], ["checking", "npm registry…"],
]); ]);
const latest = await latestAlpha(); const latest = await latestVersion();
if (!latest) { if (!latest) {
render.warn("Could not reach npm registry — skipped."); render.warn("Could not reach npm registry — skipped.");
return EXIT.SUCCESS; return EXIT.SUCCESS;
@@ -79,7 +82,7 @@ export async function runUpgrade(opts: { check?: boolean; yes?: boolean } = {}):
const { npm, prefix } = findNpm(); const { npm, prefix } = findNpm();
const args = ["install", "-g"]; const args = ["install", "-g"];
if (prefix) args.push("--prefix", prefix); if (prefix) args.push("--prefix", prefix);
args.push("claudemesh-cli@alpha"); args.push("claudemesh-cli");
render.blank(); render.blank();
render.info(`Updating ${VERSION}${latest}`); render.info(`Updating ${VERSION}${latest}`);
@@ -89,7 +92,7 @@ export async function runUpgrade(opts: { check?: boolean; yes?: boolean } = {}):
const res = spawnSync(npm, args, { stdio: "inherit" }); const res = spawnSync(npm, args, { stdio: "inherit" });
if (res.status !== 0) { if (res.status !== 0) {
render.err(`npm exited with status ${res.status}`); render.err(`npm exited with status ${res.status}`);
render.hint("Try: npm i -g claudemesh-cli@alpha"); render.hint("Try: npm i -g claudemesh-cli");
return EXIT.INTERNAL_ERROR; return EXIT.INTERNAL_ERROR;
} }