Skip to content
Back to skills

Setup

DSecurity

SETUP COMMAND - Execute TodoWrite FIRST, then Check -> Gate -> Install -> Verify. TRIGGERS - itp setup, install dependencies, check prerequisites

  • 75 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 2, 2026
ai-agentstypescriptpythongoshellbashnodegitdocumentation

Works with

  • claude code
  • cli
  • mcp

Security analysis

D59/100
  • criticalModifies startup scripts or system services for persistence
  • criticalModifies startup scripts or system services for persistence
  • mediumInstalls packages at runtime which could introduce malicious dependencies
  • mediumInstalls packages at runtime which could introduce malicious dependencies

Pro scans all 2 files and shows the line behind each finding

Scanned October 2, 2026

npx -y skills add terrylica/cc-skills --skill setup --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Setup?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Setup
[![Security: D — Skills Directory](https://www.skillsdirectory.com/api/skills/terrylica-setup-e097f26b/badge)](https://www.skillsdirectory.com/skills/terrylica-setup-e097f26b)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: setup
description: SETUP COMMAND - Execute TodoWrite FIRST, then Check -> Gate -> Install -> Verify. TRIGGERS - itp setup, install dependencies, check prerequisites
allowed-tools: Read, Bash(brew:*), Bash(npm:*), Bash(uv:*), Bash(which:*), Bash(command -v:*), Bash(PLUGIN_DIR:*), Bash(source:*), AskUserQuestion, TodoWrite, TodoRead
argument-hint: "[--check | --install | --yes]"
disable-model-invocation: false
---

<!--
ADR: 2025-12-05-itp-setup-todowrite-workflow
-->

# ITP Setup

Verify and install dependencies required by the `/itp:go` workflow using TodoWrite-driven interactive workflow.

---

> **Self-Evolving Skill**: This skill improves through use. If instructions are wrong, parameters drifted, or a workaround was needed — fix this file immediately, don't defer. Only update for real, reproducible issues.

## MANDATORY FIRST ACTION

**YOUR FIRST ACTION MUST BE TodoWrite with the template below.**

DO NOT:

- Run any checks before TodoWrite
- Skip the interactive gate
- Install without user confirmation

**Execute this TodoWrite template EXACTLY:**

```
TodoWrite with todos:
- "Setup: Bootstrap cc-plugin-root resolver" | pending | "Bootstrapping path resolver"
- "Setup: Detect platform (macOS/Linux)" | pending | "Detecting platform"
- "Setup: Check Core Tools (uv, gh, prettier)" | pending | "Checking Core Tools"
- "Setup: Check Code Audit Tools (ruff, semgrep, jscpd, gitleaks)" | pending | "Checking Audit Tools"
- "Setup: Check Release Tools (node, semantic-release)" | pending | "Checking Release Tools"
- "Setup: Present findings and disclaimer" | pending | "Presenting findings"
- "Setup: GATE - Await user decision" | pending | "Awaiting user decision"
- "Setup: Install missing tools (if confirmed)" | pending | "Installing missing tools"
- "Setup: Verify installation" | pending | "Verifying installation"
```

**After TodoWrite completes, proceed to Phase 1 below.**

---

## Phase 1: Preflight Check

Mark each todo as `in_progress` before starting, `completed` when done.

### Todo 0: Bootstrap the `cc-plugin-root` resolver

Every later step resolves plugin paths with `cc-plugin-root`, so install it first. This is the ONE
place a marketplace-mirror path is hardcoded — it is the bootstrap, and by definition cannot use the
resolver it is installing. Idempotent; safe to re-run.

```bash
/usr/bin/env bash << 'SETUP_EOF'
set -euo pipefail
if command -v cc-plugin-root >/dev/null 2>&1; then
  echo "cc-plugin-root: already on PATH ($(command -v cc-plugin-root))"
  exit 0
fi
SRC="$HOME/.claude/plugins/marketplaces/cc-skills/scripts/cc-plugin-root"
if [[ ! -f "$SRC" ]]; then
  echo "cc-plugin-root: not found at $SRC — update the marketplace first:" >&2
  echo "  claude plugin marketplace update cc-skills" >&2
  exit 1
fi
mkdir -p "$HOME/.local/bin"
chmod +x "$SRC"
ln -sfn "$SRC" "$HOME/.local/bin/cc-plugin-root"
echo "cc-plugin-root: linked -> $HOME/.local/bin/cc-plugin-root"
command -v cc-plugin-root >/dev/null 2>&1 \
  || echo "WARNING: ~/.local/bin is not on PATH — add it to your shell profile." >&2
SETUP_EOF
```

**Why it exists**: the `CLAUDE_PLUGIN_ROOT` placeholder is not a shell variable — Claude Code substitutes it only
inside plugin manifests and sets it only in hook/MCP subprocess environments, so a skill that uses it
gets an empty string. `cc-plugin-root <plugin>` reads `~/.claude/plugins/installed_plugins.json` and
prints the live install path instead. See the
[skill-plugin-root guard spoke](../../../itp-hooks/docs/skill-plugin-root-guard.md).

### Todo 1: Detect Platform

```bash
/usr/bin/env bash << 'SETUP_EOF'
PLUGIN_DIR="$(cc-plugin-root itp)"
source "$PLUGIN_DIR/scripts/install-dependencies.sh" --detect-only
SETUP_EOF
```

Platform detection sets: `OS`, `PM` (package manager), `HAS_PROTO`

### Todo 2: Check Core Tools

Check each tool using `command -v`:

| Tool     | Check                 | Required |
| -------- | --------------------- | -------- |
| uv       | `command -v uv`       | Yes      |
| gh       | `command -v gh`       | Yes      |
| prettier | `command -v prettier` | Yes      |

Record findings:

- Found: `[OK] uv (installed)` -> mark completed
- Missing: `[x] prettier (missing)` -> note for Phase 3

### Todo 3: Check Code Audit Tools

| Tool     | Check                 | Required        |
| -------- | --------------------- | --------------- |
| ruff     | `command -v ruff`     | For code-audit  |
| semgrep  | `command -v semgrep`  | For code-audit  |
| jscpd    | `command -v jscpd`    | For code-audit  |
| gitleaks | `command -v gitleaks` | For secret-scan |

### Todo 4: Check Release Tools

| Tool             | Check                            | Required      |
| ---------------- | -------------------------------- | ------------- |
| node             | `command -v node`                | For release   |
| semantic-release | `npx semantic-release --version` | For release   |
| doppler          | `command -v doppler`             | For PyPI only |

---

## Phase 2: Present Findings (Interactive Gate)

### Todo 5: Present Findings

**Install-command source**: runtimes proto manages (`node`, `uv`) come from proto when `HAS_PROTO=true`; every other tool comes from the platform package manager (brew/apt) or its own universal installer. `scripts/install-dependencies.sh` `get_install_cmd` is the SSoT for these commands.

| Tool     | Command                                                  | Notes                                  |
| -------- | -------------------------------------------------------- | -------------------------------------- |
| uv       | `proto install uv --pin global` (else `brew install uv`) |                                        |
| node     | `proto install node --pin global` (else brew/nodesource) |                                        |
| gh       | `brew install gh`                                        | **Homebrew only** (iTerm2 issues)      |
| gitleaks | `brew install gitleaks`                                  | apt: `sudo apt install -y gitleaks`    |
| semgrep  | `brew install semgrep`                                   | apt: `python3 -m pip install --user semgrep` |
| doppler  | `brew install dopplerhq/cli/doppler`                     | apt: Doppler's install script          |
| ruff     | `uv tool install ruff`                                   |                                        |
| prettier | `npm i -g prettier`                                      |                                        |
| jscpd    | `npm i -g jscpd`                                         |                                        |

> **Warning**: gh CLI must be installed via Homebrew — other installs caused iTerm2 tab spawning issues with Claude Code. [ADR](/docs/adr/2026-01-12-mise-gh-cli-incompatibility.md)

**Display summary format (versions derived from actual tool output):**

```
=== SETUP PREFLIGHT COMPLETE ===

Found: X tools | Missing: Y tools

Your existing installations:
[OK] uv (<derived from: uv --version>)
[OK] gh (<derived from: gh --version>)
[x] gitleaks (missing)
...

Note: This plugin is developed against latest tool versions.
Your existing installations are respected.

Missing tools will be installed via:
  gitleaks -> brew install gitleaks
  uv       -> proto install uv --pin global
```

**IMPORTANT**: Version numbers must be derived dynamically from running the actual tool's version command. Never hardcode version numbers.

### Todo 6: GATE - Await User Decision

**If missing tools exist, STOP and ask user:**

Use AskUserQuestion with these options:

```
question: "Would you like to install the missing tools?"
header: "Install"
options:
  - label: "Install missing"
    description: "Automatically install all missing tools"
  - label: "Skip"
    description: "Show manual install commands and exit"
```

**IMPORTANT**: Do NOT proceed to Phase 3 until user responds.

**If ALL tools present**: Mark todo completed, skip to "All set!" message, mark todos 7-8 as N/A.

---

## Phase 3: Installation (Conditional)

### Todo 7: Install Missing Tools

**Only execute if**:

- User selected "Install missing"
- OR `--install` flag was passed (skip interactive gate)

Run installation commands for missing tools only:

```bash
/usr/bin/env bash << 'SETUP_EOF_2'
PLUGIN_DIR="$(cc-plugin-root itp)"
bash "$PLUGIN_DIR/scripts/install-dependencies.sh" --install
SETUP_EOF_2
```

**If user selected "Skip"**:

- Display manual install commands
- Mark todo as skipped
- Exit cleanly

### Todo 8: Verify Installation

Re-run checks to confirm tools are now available:

```bash
/usr/bin/env bash << 'PREFLIGHT_EOF'
PLUGIN_DIR="$(cc-plugin-root itp)"
bash "$PLUGIN_DIR/scripts/install-dependencies.sh" --check
PREFLIGHT_EOF
```

Mark todo completed only if verification passes.

---

## Flag Handling

| Flag        | Behavior                                    |
| ----------- | ------------------------------------------- |
| (none)      | Default: Check -> Gate -> Ask permission    |
| `--check`   | Same as default (hidden alias)              |
| `--install` | Check -> Skip gate -> Install automatically |
| `--yes`     | Alias for `--install`                       |

Parse `$ARGUMENTS` for flags:

```bash
case "$ARGUMENTS" in
  *--install*|*--yes*)
    SKIP_GATE=true
    ;;
  *)
    SKIP_GATE=false
    ;;
esac
```

---

## Edge Cases

| Case                              | Handling                                                          |
| --------------------------------- | ----------------------------------------------------------------- |
| All tools present                 | Todos 1-5 complete, Todo 6 shows "All set!", Todos 7-8 marked N/A |
| Some missing, user says "install" | Todos 7-8 execute normally                                        |
| Some missing, user says "skip"    | Show manual commands, mark todos 7-8 as skipped                   |
| `--install` flag passed           | Skip Todo 6 gate, proceed directly to install                     |
| macOS vs Linux                    | Todo 1 detects platform, install commands adapt                   |

## Troubleshooting

### semantic-release not found

```bash
# Install globally with npm
npm i -g semantic-release@25

# Or use npx (no global install needed)
npx semantic-release --version
```

### Permission errors with npm

```bash
/usr/bin/env bash << 'CONFIG_EOF'
# Fix npm permissions
mkdir -p ~/.npm-global
npm config set prefix '~/.npm-global'

# Add to your shell config
SHELL_RC="$([[ "$SHELL" == */zsh ]] && echo ~/.zshrc || echo ~/.bashrc)"
echo 'export PATH=~/.npm-global/bin:$PATH' >> "$SHELL_RC"
source "$SHELL_RC"
CONFIG_EOF
```

---

## Next Steps

Nothing to install. The itp-hooks hooks are shipped in `plugins/itp-hooks/hooks/hooks.json` and Claude Code loads them from the plugin itself — enabling the `itp-hooks` plugin is the whole installation step. The `/itp:tether` installer that used to inject them into `~/.claude/settings.json` was retired in issue #127 because that second registration made every matching event fire the hook twice.

### What the shipped hooks provide

- **PreToolUse guards**: the Write/Edit orchestrator (version, shell-safety, TypeScript-version, hoisted-deps, mise-hygiene and more), plus per-tool Bash guards
- **PostToolUse reminder**: prompts ADR sync after Bash/Write/Edit

**IMPORTANT:** A newly enabled plugin's hooks take effect after a Claude Code session restart.

## Post-Execution Reflection

After this skill completes, reflect before closing the task:

0. **Locate yourself.** — Find this SKILL.md's canonical path (Glob for this skill's name) before editing. All corrections target THIS file and its sibling references/ — never other documentation.
1. **What failed?** — Fix the instruction that caused it. If it could recur, add it as an anti-pattern.
2. **What worked better than expected?** — Promote it to recommended practice. Document why.
3. **What drifted?** — Any script, reference, or external dependency that no longer matches reality gets fixed now.
4. **Log it.** — Every change gets an evolution-log entry with trigger, fix, and evidence.

Do NOT defer. The next invocation inherits whatever you leave behind.

---

---

Files in this skill

  • SKILL.md11.4 KB
  • references/evolution-log.md683 B

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…