refactor(web): remove install script, simplify onboarding to 3 steps
Drop /install route (curl|bash script). Install is just `npm i -g claudemesh-cli`. Update hero, FAQ, getting-started, and join flow to reflect the simplified 3-step onboarding: install → join → launch. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -146,46 +146,23 @@ export default function GettingStartedPage() {
|
|||||||
<STEP
|
<STEP
|
||||||
n="1"
|
n="1"
|
||||||
title="Install the CLI"
|
title="Install the CLI"
|
||||||
cmd="curl -fsSL https://claudemesh.com/install | bash"
|
cmd="npm i -g claudemesh-cli"
|
||||||
note="Checks Node >= 20, installs claudemesh-cli from npm, registers the MCP server + status hooks in Claude Code. Equivalent to: npm install -g claudemesh-cli && claudemesh install"
|
note="Requires Node.js 20+. Installs the claudemesh CLI globally."
|
||||||
>
|
>
|
||||||
<p>
|
<p>
|
||||||
One command installs the CLI globally and configures Claude Code.
|
One command. If you get a permissions error, see{" "}
|
||||||
The script is short and auditable —{" "}
|
|
||||||
<Link
|
<Link
|
||||||
href="https://claudemesh.com/install"
|
href="https://docs.npmjs.com/resolving-eacces-permissions-errors"
|
||||||
className="underline decoration-[var(--cm-fg-tertiary)] underline-offset-4 hover:text-[var(--cm-fg)]"
|
className="underline decoration-[var(--cm-fg-tertiary)] underline-offset-4 hover:text-[var(--cm-fg)]"
|
||||||
>
|
>
|
||||||
read it first
|
npm docs
|
||||||
</Link>{" "}
|
</Link>
|
||||||
if you prefer.
|
.
|
||||||
</p>
|
</p>
|
||||||
</STEP>
|
</STEP>
|
||||||
|
|
||||||
<div
|
|
||||||
className="py-3 text-center text-xs text-[var(--cm-fg-tertiary)]"
|
|
||||||
style={{ fontFamily: "var(--cm-font-mono)" }}
|
|
||||||
>
|
|
||||||
or install manually:
|
|
||||||
<code className="ml-2 rounded bg-[var(--cm-bg-elevated)] px-2 py-1 text-[var(--cm-fg-secondary)]">
|
|
||||||
npm install -g claudemesh-cli && claudemesh install
|
|
||||||
</code>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<STEP
|
<STEP
|
||||||
n="2"
|
n="2"
|
||||||
title="Restart Claude Code"
|
|
||||||
note="The MCP server and status hooks registered in step 1 only take effect after a restart."
|
|
||||||
>
|
|
||||||
<p>
|
|
||||||
Close and reopen Claude Code (or your IDE with Claude Code
|
|
||||||
extension). This loads the claudemesh MCP server so the 43 mesh
|
|
||||||
tools appear.
|
|
||||||
</p>
|
|
||||||
</STEP>
|
|
||||||
|
|
||||||
<STEP
|
|
||||||
n="3"
|
|
||||||
title="Join a mesh"
|
title="Join a mesh"
|
||||||
cmd="claudemesh join https://claudemesh.com/join/eyJ2IjoxLC..."
|
cmd="claudemesh join https://claudemesh.com/join/eyJ2IjoxLC..."
|
||||||
note="Replace the URL with your actual invite link. The CLI verifies the ed25519 signature, generates your keypair locally, and enrolls with the broker."
|
note="Replace the URL with your actual invite link. The CLI verifies the ed25519 signature, generates your keypair locally, and enrolls with the broker."
|
||||||
@@ -204,7 +181,7 @@ export default function GettingStartedPage() {
|
|||||||
</STEP>
|
</STEP>
|
||||||
|
|
||||||
<STEP
|
<STEP
|
||||||
n="4"
|
n="3"
|
||||||
title="Launch with real-time messaging"
|
title="Launch with real-time messaging"
|
||||||
cmd="claudemesh launch --name Alice"
|
cmd="claudemesh launch --name Alice"
|
||||||
note="Wraps `claude` with the mesh dev-channel. Peers can message you in real-time. Without launch, mesh tools still work but messages are pull-only via check_messages."
|
note="Wraps `claude` with the mesh dev-channel. Peers can message you in real-time. Without launch, mesh tools still work but messages are pull-only via check_messages."
|
||||||
|
|||||||
@@ -1,100 +0,0 @@
|
|||||||
/**
|
|
||||||
* GET /install — serves a shell installer for claudemesh-cli.
|
|
||||||
*
|
|
||||||
* Intended to be piped into bash:
|
|
||||||
* curl -fsSL https://claudemesh.com/install | bash
|
|
||||||
*
|
|
||||||
* The script is kept short + auditable. It does not try to install
|
|
||||||
* Node for the user — it checks for a compatible Node + npm and
|
|
||||||
* directs them to install Node themselves if missing. Running `bash`
|
|
||||||
* against a domain you do not fully trust is always a risk; publishing
|
|
||||||
* the script this way (rather than obfuscating it behind a binary
|
|
||||||
* blob) lets security-conscious users inspect before executing.
|
|
||||||
*/
|
|
||||||
|
|
||||||
const SCRIPT = `#!/usr/bin/env bash
|
|
||||||
# claudemesh-cli installer
|
|
||||||
# Source: https://claudemesh.com/install
|
|
||||||
# Audit: curl -fsSL https://claudemesh.com/install | less
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
RED=$'\\033[31m'; GREEN=$'\\033[32m'; DIM=$'\\033[2m'; BOLD=$'\\033[1m'; RESET=$'\\033[0m'
|
|
||||||
|
|
||||||
say() { printf "%s\\n" "$*"; }
|
|
||||||
ok() { printf "%s✓%s %s\\n" "\${GREEN}" "\${RESET}" "$*"; }
|
|
||||||
err() { printf "%s✗%s %s\\n" "\${RED}" "\${RESET}" "$*" >&2; }
|
|
||||||
|
|
||||||
say ""
|
|
||||||
say "\${BOLD}claudemesh-cli installer\${RESET}"
|
|
||||||
say "$(printf '%.0s─' {1..40})"
|
|
||||||
|
|
||||||
# --- preflight ------------------------------------------------------
|
|
||||||
|
|
||||||
if ! command -v node >/dev/null 2>&1; then
|
|
||||||
err "Node.js is not installed."
|
|
||||||
say " Install Node.js 20 or newer: \${BOLD}https://nodejs.org\${RESET}"
|
|
||||||
say " Or via nvm: \${DIM}curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash\${RESET}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
NODE_MAJOR=$(node -p "process.versions.node.split('.')[0]")
|
|
||||||
if [ "$NODE_MAJOR" -lt 20 ]; then
|
|
||||||
err "Node.js $(node -v) is too old — claudemesh-cli needs >= 20."
|
|
||||||
say " Upgrade: \${BOLD}https://nodejs.org\${RESET}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
ok "Node.js $(node -v)"
|
|
||||||
|
|
||||||
if ! command -v npm >/dev/null 2>&1; then
|
|
||||||
err "npm is not installed (usually ships with Node)."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
ok "npm $(npm -v)"
|
|
||||||
|
|
||||||
# --- install --------------------------------------------------------
|
|
||||||
|
|
||||||
say ""
|
|
||||||
say "Installing \${BOLD}claudemesh-cli\${RESET} from npm…"
|
|
||||||
if ! npm install -g claudemesh-cli; then
|
|
||||||
err "npm install failed."
|
|
||||||
say " If this is a permissions error on macOS/Linux, try:"
|
|
||||||
say " \${DIM}sudo npm install -g claudemesh-cli\${RESET}"
|
|
||||||
say " or configure npm to use a user-owned prefix:"
|
|
||||||
say " \${DIM}https://docs.npmjs.com/resolving-eacces-permissions-errors\${RESET}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
ok "claudemesh-cli installed ($(claudemesh --version))"
|
|
||||||
|
|
||||||
# --- register MCP + hooks ------------------------------------------
|
|
||||||
|
|
||||||
say ""
|
|
||||||
say "Registering Claude Code MCP server + status hooks…"
|
|
||||||
if ! claudemesh install; then
|
|
||||||
err "claudemesh install failed — run it manually to see the error."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# --- done -----------------------------------------------------------
|
|
||||||
|
|
||||||
say ""
|
|
||||||
say "\${GREEN}\${BOLD}Done.\${RESET}"
|
|
||||||
say ""
|
|
||||||
say "Next steps:"
|
|
||||||
say " 1. Restart Claude Code so the MCP tools appear."
|
|
||||||
say " 2. Join a mesh: \${BOLD}claudemesh join <invite-url>\${RESET}"
|
|
||||||
say " 3. Launch with push: \${BOLD}claudemesh launch\${RESET}"
|
|
||||||
say ""
|
|
||||||
say "Need an invite? Visit \${BOLD}https://claudemesh.com\${RESET}"
|
|
||||||
say ""
|
|
||||||
`;
|
|
||||||
|
|
||||||
export function GET(): Response {
|
|
||||||
return new Response(SCRIPT, {
|
|
||||||
status: 200,
|
|
||||||
headers: {
|
|
||||||
"Content-Type": "text/x-shellscript; charset=utf-8",
|
|
||||||
"Cache-Control": "public, max-age=300, s-maxage=600",
|
|
||||||
"X-Content-Type-Options": "nosniff",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
@@ -6,7 +6,7 @@ interface Props {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const JOIN_CMD = (token: string) => `claudemesh join ${token}`;
|
const JOIN_CMD = (token: string) => `claudemesh join ${token}`;
|
||||||
const INSTALL_CMD = "curl -fsSL https://claudemesh.com/install | bash";
|
const INSTALL_CMD = "npm i -g claudemesh-cli";
|
||||||
|
|
||||||
export const InstallToggle = ({ token }: Props) => {
|
export const InstallToggle = ({ token }: Props) => {
|
||||||
const [hasCli, setHasCli] = useState<"unknown" | "yes" | "no">("unknown");
|
const [hasCli, setHasCli] = useState<"unknown" | "yes" | "no">("unknown");
|
||||||
@@ -127,8 +127,7 @@ export const InstallToggle = ({ token }: Props) => {
|
|||||||
className="mt-2 text-xs text-[var(--cm-fg-tertiary)]"
|
className="mt-2 text-xs text-[var(--cm-fg-tertiary)]"
|
||||||
style={{ fontFamily: "var(--cm-font-serif)" }}
|
style={{ fontFamily: "var(--cm-font-serif)" }}
|
||||||
>
|
>
|
||||||
Installs the CLI, registers the MCP server + status hooks in
|
Installs the CLI globally. Requires Node.js 20+.
|
||||||
Claude Code. Restart Claude Code after this step.
|
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
<li className="rounded-[var(--cm-radius-md)] border border-[var(--cm-clay)]/40 bg-[var(--cm-bg-elevated)] p-5">
|
<li className="rounded-[var(--cm-radius-md)] border border-[var(--cm-clay)]/40 bg-[var(--cm-bg-elevated)] p-5">
|
||||||
@@ -175,10 +174,8 @@ export const InstallToggle = ({ token }: Props) => {
|
|||||||
className="mt-2 text-xs text-[var(--cm-fg-tertiary)]"
|
className="mt-2 text-xs text-[var(--cm-fg-tertiary)]"
|
||||||
style={{ fontFamily: "var(--cm-font-serif)" }}
|
style={{ fontFamily: "var(--cm-font-serif)" }}
|
||||||
>
|
>
|
||||||
Restart Claude Code first, then launch. Peers see you appear on
|
Spawns Claude Code with mesh connectivity, peer messaging,
|
||||||
the mesh. Or run plain{" "}
|
and native access to deployed MCP services.
|
||||||
<code style={{ fontFamily: "var(--cm-font-mono)" }}>claude</code>{" "}
|
|
||||||
— tools work, but messages are pull-only.
|
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ const ITEMS = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
q: "How do I get started?",
|
q: "How do I get started?",
|
||||||
a: "Three commands. First: `curl -fsSL https://claudemesh.com/install | bash` — this checks Node >= 20, installs the CLI from npm, and registers the MCP server + status hooks. Then restart Claude Code. Second: `claudemesh join <invite-url>` — paste the invite link to generate your ed25519 keypair and enroll with the broker. Third: `claudemesh launch --name YourName` — this spawns Claude Code with real-time peer messaging. See the Getting Started guide for full details.",
|
a: "Three commands. First: `npm i -g claudemesh-cli` — installs the CLI from npm (requires Node >= 20). Second: `claudemesh join <invite-url>` — paste the invite link to generate your ed25519 keypair and enroll with the broker. Third: `claudemesh launch --name YourName` — spawns Claude Code with mesh connectivity, peer messaging, and deployed MCP services.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
q: "Does claudemesh send my code or prompts to the cloud?",
|
q: "Does claudemesh send my code or prompts to the cloud?",
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ export const Hero = () => {
|
|||||||
style={{ fontFamily: "var(--cm-font-mono)" }}
|
style={{ fontFamily: "var(--cm-font-mono)" }}
|
||||||
>
|
>
|
||||||
<span className="text-[var(--cm-clay)]">$</span>
|
<span className="text-[var(--cm-clay)]">$</span>
|
||||||
<span>curl -fsSL claudemesh.com/install | bash</span>
|
<span>npm i -g claudemesh-cli</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Reveal>
|
</Reveal>
|
||||||
|
|||||||
Reference in New Issue
Block a user