fix: critical setup flow bugs (fatal shell redirects, wrong scripts, sync installs)#33
Conversation
…sync installs) - Fix Step 8 completion banner: move from ! fence to regular bash fence so <N> placeholders aren't shell-redirected - Fix Step 3a Telegram scout: replace incorrect ops-slack-autolink call with direct keychain check - Fix Step 2b GSD install: replace bash claude plugin commands (not shell commands) with slash command instructions - Fix setup.sh: add 30s timeout to brew installs and silence npm stdout with &>/dev/null - Fix CLI appendix + Step 3b.2: add Linux date fallback alongside macOS date -v-1d - Fix ops-welcome: detect actual skill/agent counts dynamically instead of hardcoding 15/9 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
Mention Blocks like a regular teammate with your question or request: @blocks review this pull request Run |
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
| if ! command -v "$tool" &>/dev/null; then | ||
| if command -v brew &>/dev/null; then | ||
| brew install "$brew_pkg" 2>/dev/null && INSTALLED+=("$tool") && return 0 | ||
| timeout 30 brew install "$brew_pkg" &>/dev/null && INSTALLED+=("$tool") && return 0 |
There was a problem hiding this comment.
Bug: The script uses the timeout command, which is not available on macOS by default. With set -e enabled, this will cause the script to exit prematurely.
Severity: HIGH
Suggested Fix
Before using the timeout command, check if it is available using command -v timeout. If it is not found, either fall back to running brew install without a timeout or consider installing coreutils via brew to make timeout available.
Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent.
Verify if this is a real issue. If it is, propose a fix; if not, explain why it's not
valid.
Location: claude-ops/scripts/setup.sh#L17
Potential issue: The script is configured with `set -e`, which causes it to exit
immediately if any command fails. On line 17, the `timeout` command is used to limit the
execution time of `brew install`. However, `timeout` is a GNU utility and is not
available by default on macOS, where this script is intended to run. When the script
attempts to execute the non-existent `timeout` command, it fails with exit code 127.
This triggers `set -e` and causes the entire script to terminate silently, preventing
the auto-installation of required tools and breaking the setup process for users on
standard macOS systems.
Did we get this right? 👍 / 👎 to inform future reviews.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 811b92de77
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
|
||
| Run the detector and parse its JSON output: | ||
| ```! | ||
| ${CLAUDE_PLUGIN_ROOT}/bin/ops-setup-preflight &>/dev/null & |
There was a problem hiding this comment.
Stop referencing missing ops-setup-preflight binary
Step 0 now tells the setup flow to run ${CLAUDE_PLUGIN_ROOT}/bin/ops-setup-preflight, but there is no such executable in this repo (repo-wide search for ops-setup-preflight only finds this reference). Because the very next instruction says to wait for /tmp/ops-preflight/.complete and to avoid re-running probes, this can stall the wizard or leave it waiting on cache files that are never produced. Please add the binary or guard this step with an existence check and fallback to direct probes.
Useful? React with 👍 / 👎.
| if ! command -v "$tool" &>/dev/null; then | ||
| if command -v brew &>/dev/null; then | ||
| brew install "$brew_pkg" 2>/dev/null && INSTALLED+=("$tool") && return 0 | ||
| timeout 30 brew install "$brew_pkg" &>/dev/null && INSTALLED+=("$tool") && return 0 |
There was a problem hiding this comment.
Guard brew install timeout for macOS compatibility
Wrapping Homebrew installs with timeout 30 assumes timeout is present, but default macOS environments do not ship GNU timeout (users typically only have it as gtimeout after installing coreutils). In that common setup, missing tools will no longer auto-install even when brew is available, so setup silently regresses on first-run machines. Add a command -v timeout check or a macOS-safe fallback before using this wrapper.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 3 potential issues.
Bugbot Autofix is ON, but it could not run because the branch was deleted or merged before autofix could start.
Reviewed by Cursor Bugbot for commit 811b92d. Configure here.
| if ! command -v "$tool" &>/dev/null; then | ||
| if command -v brew &>/dev/null; then | ||
| brew install "$brew_pkg" 2>/dev/null && INSTALLED+=("$tool") && return 0 | ||
| timeout 30 brew install "$brew_pkg" &>/dev/null && INSTALLED+=("$tool") && return 0 |
There was a problem hiding this comment.
timeout unavailable on macOS breaks all brew auto-installs
High Severity
The timeout command is not available on macOS by default — it's a GNU coreutils utility. Since this script explicitly checks for brew (a macOS package manager), its primary target is macOS. On every macOS system without coreutils installed, timeout 30 brew install ... will fail with "command not found," causing the && chain to short-circuit. Every tool that could be auto-installed will silently land in MISSING instead. The old brew install worked; the new code regresses it entirely on macOS.
Reviewed by Cursor Bugbot for commit 811b92d. Configure here.
| - Existing registry: `cat /tmp/ops-preflight/existing-registry.json` | ||
| - Existing prefs: `cat /tmp/ops-preflight/existing-prefs.json` | ||
|
|
||
| Wait for `/tmp/ops-preflight/.complete` to exist before reading (it should be ready within 2-3 seconds). NEVER re-run a probe that already has cached results — read the cache file instead. |
There was a problem hiding this comment.
Preflight script referenced in SKILL.md doesn't exist
High Severity
Step 0 executes ${CLAUDE_PLUGIN_ROOT}/bin/ops-setup-preflight via a ! fence, but no ops-setup-preflight script exists in the bin/ directory. The error is suppressed by &>/dev/null &, so it fails silently. The LLM is then instructed to wait for /tmp/ops-preflight/.complete to appear before proceeding — that file will never be created, causing the setup wizard to hang indefinitely at Step 0.
Reviewed by Cursor Bugbot for commit 811b92d. Configure here.
| # --- Dynamic counts --- | ||
| PLUGIN_ROOT="$(cd "$(dirname "$0")/.." && pwd)" | ||
| SKILL_COUNT=$(ls -d "${PLUGIN_ROOT}/skills"/*/ 2>/dev/null | wc -l | tr -d ' ') | ||
| AGENT_COUNT=$(ls "${PLUGIN_ROOT}/agents"/*.md 2>/dev/null | wc -l | tr -d ' ') |
There was a problem hiding this comment.
pipefail crashes welcome script on empty glob match
Medium Severity
The script has set -euo pipefail (line 4). If the ls -d or ls glob on these lines matches nothing (e.g., empty directory, broken symlink for $0, partial install), ls exits non-zero. With pipefail, the whole pipeline returns that non-zero code, and since SKILL_COUNT=$(...) is a plain assignment (not local), set -e terminates the script immediately. The welcome banner would cut off after the progress bars without showing the summary or /ops:setup instructions. Adding || true after the pipeline would prevent this.
Reviewed by Cursor Bugbot for commit 811b92d. Configure here.
There was a problem hiding this comment.
Pull request overview
This PR updates the claude-ops setup flow documentation and bootstrap scripts to prevent fatal shell parsing issues, correct incorrect setup steps, improve cross-platform compatibility, and make the welcome banner show live skill/agent counts.
Changes:
- Added a “preflight” step and updated
/ops:setupinstructions (GSD install via slash commands, Telegram scout, WhatsApp date fallback, completion banner fence change). - Updated
scripts/setup.shauto-installs (Homebrew install wrapped with a timeout; npm install output silenced more aggressively). - Updated
bin/ops-welcometo compute skill/agent counts dynamically from the filesystem.
Reviewed changes
Copilot reviewed 2 out of 3 changed files in this pull request and generated 4 comments.
| File | Description |
|---|---|
| claude-ops/skills/setup/SKILL.md | Setup wizard doc updates: new preflight concept, corrected Telegram/GSD instructions, Linux date fallback, completion banner fence change. |
| claude-ops/scripts/setup.sh | Adjusts auto-install behavior for brew and npm install output suppression. |
| claude-ops/bin/ops-welcome | Replaces hardcoded “15 skills / 9 agents” with dynamic directory-based counts. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| ## Step 0 — Preflight (runs in background while you read) | ||
|
|
||
| Run the detector and parse its JSON output: | ||
| ```! | ||
| ${CLAUDE_PLUGIN_ROOT}/bin/ops-setup-preflight &>/dev/null & | ||
| ``` | ||
|
|
||
| **Preflight data**: All probe results are cached at `/tmp/ops-preflight/`. Before running ANY diagnostic command, check if the result already exists there: | ||
| - CLI status: `cat /tmp/ops-preflight/clis.txt` | ||
| - Slack: `cat /tmp/ops-preflight/slack.json` | ||
| - Telegram: `cat /tmp/ops-preflight/telegram.txt` | ||
| - gog/Gmail: `cat /tmp/ops-preflight/gog-gmail.json` | ||
| - gog/Calendar: `cat /tmp/ops-preflight/gog-cal.json` | ||
| - WhatsApp: `cat /tmp/ops-preflight/wacli-doctor.json` and `wacli-chats.json` | ||
| - MCP servers: `cat /tmp/ops-preflight/mcp-servers.txt` |
There was a problem hiding this comment.
ops-setup-preflight is referenced here, but there is no claude-ops/bin/ops-setup-preflight (or any other file by that name) in the repo. As written, this preflight step will fail and the documented /tmp/ops-preflight/* cache files (and .complete) will never be produced. Either add the missing script to claude-ops/bin/ (and ensure it creates the listed cache files), or remove/replace this step.
Also: the WhatsApp cache bullet lists wacli-chats.json without the /tmp/ops-preflight/ prefix, unlike the other entries.
| ```bash | ||
| for svc in telegram-api-id telegram-api-hash telegram-phone telegram-session; do | ||
| security find-generic-password -s "$svc" -w 2>/dev/null | ||
| security find-generic-password -s "$svc" -w 2>/dev/null && echo "FOUND: $svc" |
There was a problem hiding this comment.
This keychain “scout” command uses security find-generic-password ... -w, which prints the secret value to stdout. With the added && echo "FOUND: $svc", the password will be emitted into the session output/logs whenever the item exists, which is a credential leak. For an existence check, suppress stdout (or omit -w) and rely on the exit code, then print only the service name.
| security find-generic-password -s "$svc" -w 2>/dev/null && echo "FOUND: $svc" | |
| security find-generic-password -s "$svc" >/dev/null 2>&1 && echo "FOUND: $svc" |
| After displaying the summary, run the completion banner to celebrate the successful setup. Pass the actual counts from the setup session: | ||
|
|
||
| ```! | ||
| ```bash | ||
| bash ${CLAUDE_PLUGIN_ROOT}/bin/ops-setup-complete --channels <N> --projects <N> --agents 9 --skills 15 | ||
| ``` |
There was a problem hiding this comment.
This completion command still hard-codes --agents 9 --skills 15 even though the surrounding text says to “Pass the actual counts from the setup session.” Consider making these placeholders (like --channels <N>) or deriving them from the detected filesystem counts so the banner stays accurate as skills/agents change.
| if ! command -v "$tool" &>/dev/null; then | ||
| if command -v brew &>/dev/null; then | ||
| brew install "$brew_pkg" 2>/dev/null && INSTALLED+=("$tool") && return 0 | ||
| timeout 30 brew install "$brew_pkg" &>/dev/null && INSTALLED+=("$tool") && return 0 | ||
| fi |
There was a problem hiding this comment.
timeout is not available by default on macOS (common Homebrew installs provide gtimeout unless coreutils is installed with default names). Using timeout 30 brew install ... will therefore fail on a typical macOS setup and prevent auto-install from working. Add a check/fallback (e.g., use gtimeout when present, or run brew install without a timeout when neither exists).
* docs: rewrite READMEs with correct install flow, MCP vs CLI guide, and org URLs (#11) - All GitHub URLs now point to Lifecycle-Innovations-Limited/claude-ops - Root README: correct /plugin marketplace add + install commands, MCP vs CLI comparison table showing what each path gains/loses per integration - Inner README: consistent /ops:* colon syntax, GSD as optional, integrations split into CLI-only / MCP-only / choose-with-tradeoffs / plugin-bundled - setup.sh: auto-install missing core tools + npm deps on SessionStart - plugin.json: updated author URL, homepage, repository - marketplace.json + SECURITY.md: updated email Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: clarify Telegram setup is fully automated (phone + 2 codes) (#12) Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: add GSD companion plugin auto-install to setup wizard (#13) Setup wizard now offers to install GSD (Get Shit Done) as a companion plugin. Pulls latest version via plugin marketplace. Users choose [Install GSD] or [Skip]. Enhances /ops:go, /ops:projects, /ops:next dashboards with project roadmap state. Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: replace gitleaks-action with local binary * Add CONTRIBUTING.md and issue/PR templates Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(ci): update gitleaks to v8.30.1 — linux_x64 asset name * feat: add /ops:uninstall skill for complete plugin removal (#26) Interactive uninstall that cleans up everything: keychain credentials, preferences, cache, shell profile exports, MCP registrations, and the plugin itself. Confirms each deletion step before proceeding. Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(telegram): graceful degradation when credentials are missing (#28) Server no longer exits at startup when TELEGRAM_API_ID/HASH/SESSION are unset. It starts as a valid MCP server and returns a clear "not configured" error on every tool call instead of crashing, keeping the plugin loadable without Telegram credentials. Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: polish README with ASCII art and terminal aesthetic (#29) Rewrote README with block ASCII logo, terminal-style /ops:go dashboard mockup, box-drawing tables throughout, and section headers — no content removed. Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(setup): fix CLI probes, add appendix, improve registry/prefs/Telegram/WhatsApp flows (#30) * fix(setup): fix CLI probes, add appendix, improve registry/prefs/Telegram flows - Replace broken `gog inbox list` probe with `gog gmail labels list --json` - Replace broken `gog cal events --time-min` probe with `gog cal list --json --max 3` - Add CLI Reference Appendix with exact, tested syntax for gog, wacli, Slack, and keychain - Preferences step now always asks owner name, timezone (7 options), verbosity, and default channels — never auto-fills from memory - Registry step now scans filesystem for git repos via find and presents multiSelect; adds "Auto-detect from existing registry" option - Add parallelization rule to Hard Rules: run all diagnostic probes in parallel, background slow commands - Telegram flow now requires explicit opt-in ask before starting phone/auth flow; no silent skip - WhatsApp backfill failures are now swallowed silently; summary line never shows message counts or 0-result spam - Never show user's real name or email unless explicitly provided in the current session - Fix `wacli chats` → `wacli chats list` (correct subcommand) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: add first-run onboarding banners (ops-welcome + ops-setup-complete) Animated ASCII art welcome sequence on first SessionStart (gates on preferences.json existence). Setup completion dashboard with channel/ project/agent/skill counts. Both scripts use ANSI colors with NO_COLOR graceful degradation. SessionStart hook updated to run welcome before setup check. Setup SKILL.md Step 8 calls completion banner with actual counts. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: critical setup flow bugs (fatal shell redirects, wrong scripts, sync installs) (#33) - Fix Step 8 completion banner: move from ! fence to regular bash fence so <N> placeholders aren't shell-redirected - Fix Step 3a Telegram scout: replace incorrect ops-slack-autolink call with direct keychain check - Fix Step 2b GSD install: replace bash claude plugin commands (not shell commands) with slash command instructions - Fix setup.sh: add 30s timeout to brew installs and silence npm stdout with &>/dev/null - Fix CLI appendix + Step 3b.2: add Linux date fallback alongside macOS date -v-1d - Fix ops-welcome: detect actual skill/agent counts dynamically instead of hardcoding 15/9 Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: preflight data gatherer for zero-wait setup * fix: critical setup flow bugs (fatal shell redirects, wrong scripts, sync installs) - Fix Step 8 completion banner: move from ! fence to regular bash fence so <N> placeholders aren't shell-redirected - Fix Step 3a Telegram scout: replace incorrect ops-slack-autolink call with direct keychain check - Fix Step 2b GSD install: replace bash claude plugin commands (not shell commands) with slash command instructions - Fix setup.sh: add 30s timeout to brew installs and silence npm stdout with &>/dev/null - Fix CLI appendix + Step 3b.2: add Linux date fallback alongside macOS date -v-1d - Fix ops-welcome: detect actual skill/agent counts dynamically instead of hardcoding 15/9 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: preflight data gatherer for zero-wait setup Add ops-setup-preflight script that runs all environment probes in parallel as background jobs, writing results to /tmp/ops-preflight/ so the setup wizard has zero-latency data by the time the user answers the first question. Update ops-setup-detect to read from the preflight cache when available, avoiding redundant probes. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…sync installs) (#33) - Fix Step 8 completion banner: move from ! fence to regular bash fence so <N> placeholders aren't shell-redirected - Fix Step 3a Telegram scout: replace incorrect ops-slack-autolink call with direct keychain check - Fix Step 2b GSD install: replace bash claude plugin commands (not shell commands) with slash command instructions - Fix setup.sh: add 30s timeout to brew installs and silence npm stdout with &>/dev/null - Fix CLI appendix + Step 3b.2: add Linux date fallback alongside macOS date -v-1d - Fix ops-welcome: detect actual skill/agent counts dynamically instead of hardcoding 15/9 Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: rewrite READMEs with correct install flow, MCP vs CLI guide, and org URLs (#11) - All GitHub URLs now point to Lifecycle-Innovations-Limited/claude-ops - Root README: correct /plugin marketplace add + install commands, MCP vs CLI comparison table showing what each path gains/loses per integration - Inner README: consistent /ops:* colon syntax, GSD as optional, integrations split into CLI-only / MCP-only / choose-with-tradeoffs / plugin-bundled - setup.sh: auto-install missing core tools + npm deps on SessionStart - plugin.json: updated author URL, homepage, repository - marketplace.json + SECURITY.md: updated email Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: clarify Telegram setup is fully automated (phone + 2 codes) (#12) Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: add GSD companion plugin auto-install to setup wizard (#13) Setup wizard now offers to install GSD (Get Shit Done) as a companion plugin. Pulls latest version via plugin marketplace. Users choose [Install GSD] or [Skip]. Enhances /ops:go, /ops:projects, /ops:next dashboards with project roadmap state. Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: replace gitleaks-action with local binary * Add CONTRIBUTING.md and issue/PR templates Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(ci): update gitleaks to v8.30.1 — linux_x64 asset name * feat: add /ops:uninstall skill for complete plugin removal (#26) Interactive uninstall that cleans up everything: keychain credentials, preferences, cache, shell profile exports, MCP registrations, and the plugin itself. Confirms each deletion step before proceeding. Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(telegram): graceful degradation when credentials are missing (#28) Server no longer exits at startup when TELEGRAM_API_ID/HASH/SESSION are unset. It starts as a valid MCP server and returns a clear "not configured" error on every tool call instead of crashing, keeping the plugin loadable without Telegram credentials. Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: polish README with ASCII art and terminal aesthetic (#29) Rewrote README with block ASCII logo, terminal-style /ops:go dashboard mockup, box-drawing tables throughout, and section headers — no content removed. Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(setup): fix CLI probes, add appendix, improve registry/prefs/Telegram/WhatsApp flows (#30) * fix(setup): fix CLI probes, add appendix, improve registry/prefs/Telegram flows - Replace broken `gog inbox list` probe with `gog gmail labels list --json` - Replace broken `gog cal events --time-min` probe with `gog cal list --json --max 3` - Add CLI Reference Appendix with exact, tested syntax for gog, wacli, Slack, and keychain - Preferences step now always asks owner name, timezone (7 options), verbosity, and default channels — never auto-fills from memory - Registry step now scans filesystem for git repos via find and presents multiSelect; adds "Auto-detect from existing registry" option - Add parallelization rule to Hard Rules: run all diagnostic probes in parallel, background slow commands - Telegram flow now requires explicit opt-in ask before starting phone/auth flow; no silent skip - WhatsApp backfill failures are now swallowed silently; summary line never shows message counts or 0-result spam - Never show user's real name or email unless explicitly provided in the current session - Fix `wacli chats` → `wacli chats list` (correct subcommand) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: add first-run onboarding banners (ops-welcome + ops-setup-complete) Animated ASCII art welcome sequence on first SessionStart (gates on preferences.json existence). Setup completion dashboard with channel/ project/agent/skill counts. Both scripts use ANSI colors with NO_COLOR graceful degradation. SessionStart hook updated to run welcome before setup check. Setup SKILL.md Step 8 calls completion banner with actual counts. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: critical setup flow bugs (fatal shell redirects, wrong scripts, sync installs) (#33) - Fix Step 8 completion banner: move from ! fence to regular bash fence so <N> placeholders aren't shell-redirected - Fix Step 3a Telegram scout: replace incorrect ops-slack-autolink call with direct keychain check - Fix Step 2b GSD install: replace bash claude plugin commands (not shell commands) with slash command instructions - Fix setup.sh: add 30s timeout to brew installs and silence npm stdout with &>/dev/null - Fix CLI appendix + Step 3b.2: add Linux date fallback alongside macOS date -v-1d - Fix ops-welcome: detect actual skill/agent counts dynamically instead of hardcoding 15/9 Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: preflight data gatherer for zero-wait setup * fix: critical setup flow bugs (fatal shell redirects, wrong scripts, sync installs) - Fix Step 8 completion banner: move from ! fence to regular bash fence so <N> placeholders aren't shell-redirected - Fix Step 3a Telegram scout: replace incorrect ops-slack-autolink call with direct keychain check - Fix Step 2b GSD install: replace bash claude plugin commands (not shell commands) with slash command instructions - Fix setup.sh: add 30s timeout to brew installs and silence npm stdout with &>/dev/null - Fix CLI appendix + Step 3b.2: add Linux date fallback alongside macOS date -v-1d - Fix ops-welcome: detect actual skill/agent counts dynamically instead of hardcoding 15/9 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: preflight data gatherer for zero-wait setup Add ops-setup-preflight script that runs all environment probes in parallel as background jobs, writing results to /tmp/ops-preflight/ so the setup wizard has zero-latency data by the time the user answers the first question. Update ops-setup-detect to read from the preflight cache when available, avoiding redundant probes. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>


Summary
!fence to regularbashfence —<N>placeholders inside a!block are interpreted as shell input redirects, causing the command to failops-slack-autolink.mjs --scout-only(wrong binary) with direct keychain check usingsecurity find-generic-passwordfor all 4 Telegram credential entriesclaude plugin marketplace add ...bash commands (not valid shell) with slash command instructions, clarifying these run in Claude Code not terminalbrew installwithtimeout 30to prevent SessionStart hook hangs2>/dev/nullto&>/dev/nullon both npm install lines to suppress stdout noisedate -d '1 day ago'fallback alongside macOS-onlydate -v-1d15 skills / 9 agentswith dynamiclscounts fromskills/*/andagents/*.mdTest plan
/ops:setupand verify Step 8 banner fires without redirect errorssetup.shcompletes in ≤30s even on slow Homebrewops-welcomeshows correct live skill/agent counts🤖 Generated with Claude Code
Note
Medium Risk
Touches SessionStart/setup flow paths by adding
timeoutaround Homebrew installs, changing output redirection, and updating wizard commands; mistakes here could still block onboarding or hide install errors. Changes are localized to shell scripts and setup documentation, with no runtime business logic or data model changes.Overview
Resolves several setup/onboarding footguns: the setup wizard now uses a background preflight cache, corrects Telegram keychain “scout” instructions, and replaces invalid GSD install shell commands with Claude Code slash-command guidance.
Hardens the SessionStart
scripts/setup.shauto-installs by adding atimeouttobrew installand fully silencingnpm installoutput, and updates WhatsAppwaclidate handling to work on both macOS and Linux.Updates
bin/ops-welcometo compute and display dynamic counts for skills and agents instead of hardcoded numbers, and adjusts the final completion banner snippet to avoid shell redirect parsing issues.Reviewed by Cursor Bugbot for commit 811b92d. Bugbot is set up for automated code reviews on this repo. Configure here.