From a29f3e5cf41d11ccfff2968e40828bcf0763c633 Mon Sep 17 00:00:00 2001 From: Koshkoshinsk Date: Mon, 20 Apr 2026 12:18:22 +0000 Subject: [PATCH] feat(new-setup-2): bundle Telegram install into one script Extract the /add-telegram preflight + install commands into setup/install-telegram.sh so /new-setup-2 can run the adapter install programmatically when the user picks Telegram, then hand off to /add-telegram for credentials and pairing. Co-Authored-By: Claude Opus 4.7 (1M context) --- .claude/skills/new-setup-2/SKILL.md | 4 +- setup/install-telegram.sh | 72 +++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 2 deletions(-) create mode 100755 setup/install-telegram.sh diff --git a/.claude/skills/new-setup-2/SKILL.md b/.claude/skills/new-setup-2/SKILL.md index 869a710..ba70704 100644 --- a/.claude/skills/new-setup-2/SKILL.md +++ b/.claude/skills/new-setup-2/SKILL.md @@ -1,7 +1,7 @@ --- name: new-setup-2 description: Follow-on to /new-setup. Captures the operator and agent names, wires a real messaging channel, and adds quality-of-life extras. Linear rollthrough; every step is skippable. Invoked when the user picks "continue setup" at the end of /new-setup. -allowed-tools: Bash(bash setup/probe.sh) Bash(pnpm exec tsx setup/index.ts *) Bash(pnpm exec tsx scripts/init-first-agent.ts *) +allowed-tools: Bash(bash setup/probe.sh) Bash(bash setup/install-telegram.sh) Bash(pnpm exec tsx setup/index.ts *) Bash(pnpm exec tsx scripts/init-first-agent.ts *) --- # NanoClaw phase-2 setup @@ -61,7 +61,7 @@ Print the list as plain prose. **Do not use `AskUserQuestion` for this step** When the user picks one: -1. **Install the adapter.** Invoke the matching `/add-` skill via the Skill tool. It copies the adapter source in from the `channels` branch, registers it, installs the pinned npm package, and handles credentials. Some channels (e.g. Telegram) also run a pairing step as part of their flow. +1. **Install the adapter.** For **Telegram**, run `bash setup/install-telegram.sh` directly — it bundles the preflight + fetch + copy + register + `pnpm install` + build from `/add-telegram` into one idempotent call, then continue with credentials and pairing (invoke `/add-telegram` afterwards and its preflight will skip straight to Credentials). For every other channel, invoke the matching `/add-` skill via the Skill tool; it copies the adapter source in from the `channels` branch, registers it, installs the pinned npm package, and handles credentials. Some channels also run a pairing step as part of their flow. 2. **Capture platform IDs.** After the `/add-` skill finishes, you need two values: the operator's user-id on that platform, and the chat/channel platform-id. Each channel surfaces these differently — consult the **Channel Info** section at the bottom of that skill's `SKILL.md` for the exact path. For Telegram, for example, the `pair-telegram` step emits `PLATFORM_ID` and `ADMIN_USER_ID` in a status block once the user sends the 4-digit code. 3. **Wire the agent.** Run `init-first-agent.ts` in DM mode with `--no-cli-bonus` (this keeps the new agent off the CLI messaging group so the pre-existing throwaway agent still owns CLI routing cleanly): diff --git a/setup/install-telegram.sh b/setup/install-telegram.sh new file mode 100755 index 0000000..7eaf9e1 --- /dev/null +++ b/setup/install-telegram.sh @@ -0,0 +1,72 @@ +#!/usr/bin/env bash +# Setup helper: install-telegram — bundles the preflight + install commands +# from the /add-telegram skill into one idempotent script so /new-setup-2 can +# run them programmatically before continuing to credentials and pairing. +# +# Copies the Telegram adapter, helpers, tests, and the pair-telegram setup +# step in from the `channels` branch; appends the self-registration import; +# registers the `pair-telegram` entry in the setup STEPS map; installs the +# pinned @chat-adapter/telegram package; builds. All steps are safe to re-run. +set -euo pipefail + +PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +cd "$PROJECT_ROOT" + +echo "=== NANOCLAW SETUP: INSTALL_TELEGRAM ===" + +CHANNEL_FILES=( + src/channels/telegram.ts + src/channels/telegram-pairing.ts + src/channels/telegram-pairing.test.ts + src/channels/telegram-markdown-sanitize.ts + src/channels/telegram-markdown-sanitize.test.ts + setup/pair-telegram.ts +) + +needs_install=false +for f in "${CHANNEL_FILES[@]}"; do + [[ -f "$f" ]] || needs_install=true +done +grep -q "import './telegram.js';" src/channels/index.ts || needs_install=true +grep -q "'pair-telegram':" setup/index.ts || needs_install=true +grep -q '"@chat-adapter/telegram"' package.json || needs_install=true +[[ -d node_modules/@chat-adapter/telegram ]] || needs_install=true + +if ! $needs_install; then + echo "STATUS: already-installed" + echo "=== END ===" + exit 0 +fi + +echo "STEP: fetch-channels-branch" +git fetch origin channels + +echo "STEP: copy-files" +for f in "${CHANNEL_FILES[@]}"; do + git show "origin/channels:$f" > "$f" +done + +echo "STEP: register-import" +if ! grep -q "import './telegram.js';" src/channels/index.ts; then + printf "import './telegram.js';\n" >> src/channels/index.ts +fi + +echo "STEP: register-setup-step" +if ! grep -q "'pair-telegram':" setup/index.ts; then + awk ' + { print } + /register: \(\) => import/ && !inserted { + print " '\''pair-telegram'\'': () => import('\''./pair-telegram.js'\'')," + inserted = 1 + } + ' setup/index.ts > setup/index.ts.tmp && mv setup/index.ts.tmp setup/index.ts +fi + +echo "STEP: pnpm-install" +pnpm install @chat-adapter/telegram@4.26.0 + +echo "STEP: pnpm-build" +pnpm run build + +echo "STATUS: installed" +echo "=== END ==="