setup

Interactive project setup — detects your project, configures metaswarm, writes project-local files

191 stars

Best use case

setup is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

Interactive project setup — detects your project, configures metaswarm, writes project-local files

Teams using setup should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/setup/SKILL.md --create-dirs "https://raw.githubusercontent.com/dsifry/metaswarm/main/skills/setup/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/setup/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How setup Compares

Feature / AgentsetupStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

Interactive project setup — detects your project, configures metaswarm, writes project-local files

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# Setup

Interactive, Claude-guided setup for metaswarm. Detects your stack, asks targeted questions, writes project-local files, and creates command shims. Replaces both `npx metaswarm init` and the old `/metaswarm-setup` command.

<CRITICAL-REQUIREMENTS>
Setup MUST produce these 3 mandatory outputs. A shell script handles them automatically — you MUST run it.

After Phase 2 (user questions), determine the correct coverage command from the detection results, then run this Bash command:

```bash
bash "${CLAUDE_PLUGIN_ROOT}/lib/setup-mandatory-files.sh" "$(pwd)" <threshold> "<coverage-command>"
```

Where:
- `<threshold>` is the user's chosen percentage (e.g., `100`)
- `<coverage-command>` is the enforcement command for their test runner:
  - pytest → `"pytest --cov --cov-fail-under=<threshold>"`
  - vitest/pnpm → `"pnpm vitest run --coverage"`
  - jest/npm → `"npx jest --coverage"`
  - go → `"go test -coverprofile=coverage.out ./..."`
  - cargo → `"cargo tarpaulin --fail-under <threshold>"`

The script handles:
1. **CLAUDE.md** — appends metaswarm section (or writes new), skips if already present
2. **`.coverage-thresholds.json`** — writes at project root with correct thresholds and command
3. **6 shims in `.claude/commands/`** — writes `start-task.md`, `prime.md`, `review-design.md`, `self-reflect.md`, `pr-shepherd.md`, `brainstorm.md`

The script outputs JSON with what was created/skipped/errored. Check that `"status": "ok"`.

**If the script is not available or fails**, fall back to writing these files manually with the Write tool. Do NOT skip them.
</CRITICAL-REQUIREMENTS>

## Pre-Flight

### Existing Profile Check

Use Glob to check if `.metaswarm/project-profile.json` exists.

- **If it exists**: Read it, present the current configuration summary, and ask the user via AskUserQuestion: "You already have a metaswarm project profile. Re-run setup (overwrites choices) or skip?" Options: "Re-run setup" / "Skip". If the user skips, stop with: "Setup skipped. Existing configuration unchanged."
- **If it does not exist**: Continue to Project Detection.

---

## Phase 1: Project Detection

Scan the project directory silently using Glob and Read. Do NOT ask the user for any of this information. Detect everything, then present results.

### 1.1 Language

Check for marker files at the project root:

| Marker File | Language |
|---|---|
| `package.json` | Node.js / JavaScript |
| `tsconfig.json` | TypeScript (refines Node.js to TypeScript) |
| `pyproject.toml` OR `setup.py` OR `requirements.txt` | Python |
| `go.mod` | Go |
| `Cargo.toml` | Rust |
| `pom.xml` OR `build.gradle` OR `build.gradle.kts` | Java |
| `Gemfile` | Ruby |
| `Makefile` (alone, no other markers) | Unknown (ask user) |

If `tsconfig.json` exists alongside `package.json`, the language is "TypeScript".

If multiple languages are detected, note all of them but use the primary one (most infrastructure) for command generation.

**If no language detected**: Use AskUserQuestion to ask the user what language/stack they are using before proceeding.

### 1.2 Framework

**Node.js/TypeScript** — Read `package.json` and check `dependencies` + `devDependencies`:

| Dependency | Framework |
|---|---|
| `next` | Next.js |
| `nuxt` OR `nuxt3` | Nuxt |
| `@angular/core` | Angular |
| `svelte` OR `@sveltejs/kit` | SvelteKit |
| `react` (without next/nuxt) | React |
| `vue` (without nuxt) | Vue |
| `express` | Express |
| `fastify` | Fastify |
| `hono` | Hono |
| `@nestjs/core` | NestJS |

**Python** — Check `pyproject.toml` or `requirements.txt` for: `fastapi`, `django`, `flask`.

**Go** — Read `go.mod` for: `github.com/gin-gonic/gin` (Gin), `github.com/labstack/echo` (Echo), `github.com/gofiber/fiber` (Fiber).

If no framework detected, set to `null`.

### 1.3 Package Manager (Node.js only)

| Lock File | Package Manager |
|---|---|
| `pnpm-lock.yaml` | pnpm |
| `yarn.lock` | yarn |
| `bun.lockb` | bun |
| `package-lock.json` | npm |

Default to `npm` if no lock file found. For non-Node.js, set to `null`.

### 1.4 Test Runner

**Node.js/TypeScript** (first match wins):
1. Glob for `vitest.config.*` or `vitest` in devDependencies -> `vitest`
2. Glob for `jest.config.*` or `jest` in devDependencies -> `jest`
3. `mocha` in devDependencies -> `mocha`

**Python**: Check for `[tool.pytest]` in `pyproject.toml` or `pytest` in dependencies -> `pytest` (default for Python).

**Go**: `go test` (built-in). **Rust**: `cargo test` (built-in). **Java/Maven**: `mvn test`. **Java/Gradle**: `gradle test`.

### 1.5 Linter

| Marker | Linter |
|---|---|
| `.eslintrc*` OR `eslint.config.*` OR `eslint` in devDependencies | eslint |
| `biome.json` OR `@biomejs/biome` in devDependencies | biome |
| `[tool.ruff]` in `pyproject.toml` OR `ruff.toml` | ruff |
| `.golangci.yml` OR `.golangci.yaml` | golangci-lint |
| `.clippy.toml` or clippy in Cargo.toml | clippy |

### 1.6 Formatter

| Marker | Formatter |
|---|---|
| `.prettierrc*` OR `prettier` in devDependencies | prettier |
| `biome.json` (also formats) | biome |
| `black` in Python deps | black |
| `[tool.ruff.format]` in `pyproject.toml` | ruff format |
| `rustfmt.toml` OR `.rustfmt.toml` | rustfmt |

If biome detected as both linter and formatter, report once as "Biome (lint + format)".

### 1.7 Type Checker

| Marker | Type Checker |
|---|---|
| `tsconfig.json` | tsc |
| `mypy` in Python deps OR `[tool.mypy]` in `pyproject.toml` | mypy |
| `pyright` in Python deps OR `pyrightconfig.json` | pyright |

Go (`go vet`) and Rust (`cargo check`) have built-in type checking — note but do not list separately.

### 1.8 CI Detection

| Marker | CI System |
|---|---|
| `.github/workflows/*.yml` | GitHub Actions |
| `.gitlab-ci.yml` | GitLab CI |
| `Jenkinsfile` | Jenkins |
| `.circleci/config.yml` | CircleCI |

### 1.9 Git Hooks Detection

| Marker | Hook System |
|---|---|
| `.husky/` | Husky |
| `.pre-commit-config.yaml` | pre-commit |
| `.lefthook.yml` | Lefthook |

### 1.10 Present Results

After all detection, present findings:

```
I detected the following about your project:

  Language:        {language}
  Framework:       {framework or "None detected"}
  Package manager: {package_manager or "N/A"}
  Test runner:     {test_runner or "None detected"}
  Linter:          {linter or "None detected"}
  Formatter:       {formatter or "None detected"}
  Type checker:    {type_checker or "None detected"}
  CI:              {ci or "None detected"}
  Git hooks:       {git_hooks or "None detected"}
```

---

## Phase 2: Interactive Questions

Use AskUserQuestion to ask ONLY questions relevant based on detection. 3-5 questions maximum.

**Always ask:**

1. **Coverage threshold** — "What test coverage threshold do you want to enforce?" Options: "100% (Recommended)" / "80%" / "60%" / "Custom"

**Ask only if relevant:**

2. **External AI tools** — Ask only for non-trivial projects: "Set up external AI tools (Codex/Gemini) for cost savings on implementation?" Options: "Yes" / "No"

3. **Visual review** — Ask only if a web framework was detected (Next.js, Nuxt, React, Vue, Angular, SvelteKit, Django, Flask): "Enable visual screenshot review for UI changes?" Options: "Yes" / "No"

4. **CI pipeline** — Ask only if NO CI detected: "Create a GitHub Actions CI pipeline?" Options: "Yes (Recommended)" / "No"

5. **Git hooks** — Ask only if NO hooks detected: "Set up git hooks for pre-push quality checks?" Options: "Yes (Recommended)" / "No"

---

## Phase 3: Write Required Files

### Step 1: Run the mandatory files script

This is the FIRST thing to do after Phase 2. Determine the coverage command, then run:

```bash
bash "${CLAUDE_PLUGIN_ROOT}/lib/setup-mandatory-files.sh" "$(pwd)" <threshold> "<coverage-command>"
```

Example for Python with pytest at 100%:
```bash
bash "${CLAUDE_PLUGIN_ROOT}/lib/setup-mandatory-files.sh" "$(pwd)" 100 "pytest --cov --cov-fail-under=100"
```

Check the JSON output. If `"status": "ok"`, the 3 mandatory files are done. Report to the user what was created.

If the script fails or is not found, write the files manually (see CRITICAL-REQUIREMENTS above for what they are).

### Step 2: Customize CLAUDE.md TODO sections

If CLAUDE.md was newly written (not appended), use Edit to replace the TODO placeholders:
- Replace `npm test` / `npm run test:coverage` with the detected test/coverage commands
- Replace `TypeScript strict mode` / `ESLint + Prettier` with the detected language tools
- Remove the `<!-- TODO: ... -->` comment lines

If CLAUDE.md was appended to (existing file), this step is not needed.

---

### Step 3: Additional files

#### Knowledge Base

Read each file from `./knowledge/`:
- `patterns.jsonl`, `gotchas.jsonl`, `decisions.jsonl`, `api-behaviors.jsonl`, `codebase-facts.jsonl`, `anti-patterns.jsonl`, `facts.jsonl`

Write them to `.beads/knowledge/` in the project. Skip any that already exist.

#### Shell Utilities

Read each file from `./bin/`:
- `estimate-cost.sh`, `external-tools-verify.sh`, `pr-comments-check.sh`, `pr-comments-filter.sh`

Write them to `bin/` in the project. Make executable with `chmod +x`. Skip any that already exist.

#### TypeScript Scripts

Read each file from `./scripts/`:
- `beads-fetch-pr-comments.ts`, `beads-fetch-conversation-history.ts`

Write them to `scripts/` in the project. Skip any that already exist.

**Note**: The former `beads-self-reflect.ts` script is no longer bundled — the standalone beads plugin (v0.63.3+) provides `bd compact` for semantic summarization natively.

**Node.js dependency warning**: If Node.js was NOT detected as the project language, print:
> "Note: scripts/*.ts require Node.js (npx tsx) to run. Some advanced features (PR comment fetching, conversation history) will work once Node.js is available. Core metaswarm functionality does not require Node.js."

#### Conditional Files

| Condition | Source | Destination |
|---|---|---|
| User chose YES for CI | `./templates/ci.yml` | `.github/workflows/ci.yml` |
| User chose YES for git hooks AND Husky detected or Node.js project | `./templates/pre-push` | `.husky/pre-push` (chmod +x) |
| User chose YES for external tools | `./templates/external-tools.yaml` | `.metaswarm/external-tools.yaml` |
| Always | `./templates/.env.example` | `.env.example` |
| Always | `./templates/SERVICE-INVENTORY.md` | `SERVICE-INVENTORY.md` |
| Always | `./templates/gitignore` | Merge into existing `.gitignore` (append missing entries, never duplicate) |

For `.gitignore`, read the existing file (if any), then append language-specific entries that are not already present. Always ensure `.env`, `.DS_Store`, and `*.log` are included.

---

## Phase 4: Profile Creation

Write `.metaswarm/project-profile.json` with all detection results and user choices:

```json
{
  "metaswarm_version": "1.0.0",
  "distribution": "plugin",
  "installed_at": "{current ISO 8601 timestamp}",
  "updated_at": "{current ISO 8601 timestamp}",
  "detection": {
    "language": "{detected language}",
    "framework": "{detected framework or null}",
    "test_runner": "{detected test runner}",
    "linter": "{detected linter or null}",
    "formatter": "{detected formatter or null}",
    "package_manager": "{detected package manager or null}",
    "type_checker": "{detected type checker or null}",
    "ci": "{detected CI system or null}",
    "git_hooks": "{detected hook system or null}"
  },
  "choices": {
    "coverage_threshold": 100,
    "external_tools": false,
    "visual_review": false,
    "ci_pipeline": false,
    "git_hooks": false
  },
  "commands": {
    "test": "{resolved test command}",
    "coverage": "{resolved coverage command}",
    "lint": "{resolved lint command or null}",
    "typecheck": "{resolved typecheck command or null}",
    "format_check": "{resolved format check command or null}"
  }
}
```

Fill all values from detection and user answers. Use `null` for anything not detected.

Command resolution reference:

| Test Runner | Pkg Mgr | Test Command | Coverage Command |
|---|---|---|---|
| vitest | pnpm | `pnpm vitest run` | `pnpm vitest run --coverage` |
| vitest | npm | `npx vitest run` | `npx vitest run --coverage` |
| vitest | yarn | `yarn vitest run` | `yarn vitest run --coverage` |
| jest | pnpm | `pnpm jest` | `pnpm jest --coverage` |
| jest | npm | `npx jest` | `npx jest --coverage` |
| jest | yarn | `yarn jest` | `yarn jest --coverage` |
| mocha | any | `npx mocha` | `npx nyc mocha` |
| pytest | -- | `pytest` | `pytest --cov --cov-fail-under={threshold}` |
| go test | -- | `go test ./...` | `go test -coverprofile=coverage.out ./...` |
| cargo test | -- | `cargo test` | `cargo tarpaulin --fail-under {threshold}` |
| mvn test | -- | `mvn test` | `mvn test jacoco:report` |
| gradle test | -- | `gradle test` | `gradle test jacocoTestReport` |

---

## Phase 5: Post-Setup Actions

### 5.1 External Tools (if enabled)

1. Check if Codex and Gemini CLIs are installed via Bash (`command -v codex`, `command -v gemini`)
2. For tools not installed, tell the user how to install them
3. For installed tools, verify with `--version`
4. Update `.metaswarm/external-tools.yaml` — set `enabled: true` for installed tools, `enabled: false` for missing ones

### 5.2 Visual Review (if enabled)

1. Run `npx playwright install chromium` via Bash
2. Report success or failure

### 5.3 Git Hooks (if enabled)

**Node.js/TypeScript**: Install Husky if not present, run `npx husky init`, write pre-push hook.
**Python**: Suggest `pip install pre-commit` and offer to create `.pre-commit-config.yaml`.
**Other**: Suggest appropriate hook tools for the ecosystem.

---

## Phase 6: Summary

Present a final summary:

```
Setup complete! Here's what was configured:

  Project:         {name}
  Language:        {language}
  Framework:       {framework or "None"}
  Test runner:     {test_runner} -> `{test command}`
  Coverage:        {threshold}% -> `{coverage command}`
  Linter:          {linter or "None"}
  Formatter:       {formatter or "None"}
  CI:              {ci or "None"}
  Git hooks:       {hooks or "None"}
  External tools:  {Enabled/Disabled}
  Visual review:   {Enabled/Disabled}

Mandatory files:
  ✔ CLAUDE.md          — {written new / appended metaswarm section / already had it}
  ✔ .coverage-thresholds.json — {threshold}% coverage, enforcement: `{command}`
  ✔ .claude/commands/   — 6 shims: start-task, prime, review-design, self-reflect, pr-shepherd, brainstorm

Other files written:
  {list every other file written or modified with its path}

You're all set! Run /start-task to begin working.
```

**Command naming**: When recommending commands to the user, always use the short shim names (`/start-task`, `/prime`, `/brainstorm`, etc.), NOT the namespaced plugin names (`/metaswarm:start-task`). The shims you just created in `.claude/commands/` make the short names work. The short names are easier to type and remember.

Offer 1-2 relevant tips based on configuration:
- If external tools enabled: "Use `/external-tools-health` to check tool status."
- If no CI set up: "Consider adding CI later -- metaswarm includes a template at `./templates/ci.yml`."
- If visual review enabled: "The visual review skill will screenshot your app during development."

---

## Missing Setup Auto-Detection

If `/start-task` is invoked and `.metaswarm/project-profile.json` does not exist, the start skill should auto-route here. This skill will run the full setup flow, then hand back to `/start-task` to continue with the user's original request.

---

## Error Handling

- If any Bash command fails, report the error and offer to skip that step or retry.
- If a file cannot be read, note it and continue with other detection.
- If AskUserQuestion is dismissed, use defaults: 100% coverage, no external tools, no visual review.
- Never leave the project half-configured. The pre-flight check allows re-running setup to completion.
- All template paths are hardcoded in this skill. Never construct file paths from user-provided input.

---

## Final Verification (run this before declaring setup complete)

Before saying "setup complete", run this Bash command to verify the 3 mandatory files:

```bash
echo "CLAUDE.md:"; grep -c "metaswarm" CLAUDE.md 2>/dev/null || echo "MISSING"; echo "coverage:"; ls .coverage-thresholds.json 2>/dev/null || echo "MISSING"; echo "shims:"; ls .claude/commands/start-task.md .claude/commands/prime.md .claude/commands/brainstorm.md 2>/dev/null || echo "MISSING"
```

If any output says "MISSING", go back and run the setup-mandatory-files.sh script or create the files manually. Do NOT declare success with missing files.

When reporting available commands to the user, use the **short names** (`/start-task`, `/prime`, `/brainstorm`, etc.) — NOT the namespaced names (`/metaswarm:start-task`). The command shims make the short names work. Do NOT recommend commands that don't exist (e.g., `/metaswarm:start`, `/metaswarm:status`, `/metaswarm:architect-agent`).

Related Skills

visual-review

191
from dsifry/metaswarm

Take screenshots of web pages and UI using Playwright for visual review and iteration

status

191
from dsifry/metaswarm

Diagnostic status report — shows metaswarm installation state, project setup, and potential issues

start

191
from dsifry/metaswarm

Use when starting work on any task, when the user mentions metaswarm, or when the user wants to begin tracked development work

pr-shepherd

191
from dsifry/metaswarm

Monitor a PR through to merge — handle CI failures, review comments, and thread resolution automatically until all checks pass

plan-review-gate

191
from dsifry/metaswarm

Automatic adversarial review gate that spawns 3 independent reviewers in parallel after any plan is drafted - all must PASS before presenting to user

orchestrated-execution

191
from dsifry/metaswarm

4-phase execution loop for work units - IMPLEMENT, VALIDATE, ADVERSARIAL REVIEW, COMMIT

migrate

191
from dsifry/metaswarm

Migrate from npm-installed metaswarm to the marketplace plugin — removes redundant files with safety checks

handling-pr-comments

191
from dsifry/metaswarm

Address PR review feedback systematically — fetch inline comments, review bodies, handle outside-diff-range comments, resolve threads with proper attribution

external-tools

191
from dsifry/metaswarm

Delegate implementation and review tasks to external AI CLI tools (Codex, Gemini) with cross-model adversarial review

design-review-gate

191
from dsifry/metaswarm

Automatic review gate that runs after brainstorming completes - spawns PM, Architect, Designer, Security, and CTO agents in parallel, iterates until all approve

create-issue

191
from dsifry/metaswarm

Create comprehensive GitHub issues with TDD plans, acceptance criteria, and agent instructions for autonomous PR lifecycle management

brainstorming-extension

191
from dsifry/metaswarm

Enforces design review gate after brainstorming — bridges superpowers:brainstorming into the metaswarm quality pipeline