Awesome-omni-skill hatch
Provision exe.dev cloud VMs for development. Use when user wants to create projects, feature branches, spike prototypes, manage VMs, or deploy to Vercel/Convex. Triggers on "new project", "feature branch", "spike", "VM", "exe.dev", "cloud development".
git clone https://github.com/diegosouzapw/awesome-omni-skill
T=$(mktemp -d) && git clone --depth=1 https://github.com/diegosouzapw/awesome-omni-skill "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/devops/hatch" ~/.claude/skills/diegosouzapw-awesome-omni-skill-hatch && rm -rf "$T"
skills/devops/hatch/SKILL.mdHatch - Cloud Development CLI
Hatch provisions exe.dev VMs with GitHub, Vercel, and Convex integration.
Hatch is installed at
~/.hatch-cli. All commands must be run from that directory using pnpm dev.
Commands
List projects and VMs
cd ~/.hatch-cli && pnpm dev list --json
Use first to find project names. Returns JSON with projects array and vms array.
Check status of VMs, spikes, and PRs
cd ~/.hatch-cli && pnpm dev status --json
Returns dashboard with VM liveness, spike progress, and PR review/CI status.
Options:
- Output as JSON (recommended for agents)--json
- Filter to a specific project--project <name>
Use after starting a spike to check progress, PR review status, and CI checks. Automatically detects if a "running" spike has actually completed.
Create new project
cd ~/.hatch-cli && pnpm dev new <project-name> --dry-run cd ~/.hatch-cli && pnpm dev new <project-name> --confirm <token>
Creates a new project with GitHub repo, Vercel deployment, and Convex backend. Takes 5-10 minutes. Returns Vercel URL when complete.
Options:
- Show what will be created and get a confirmation token--dry-run
- Execute with a token from--confirm <token>--dry-run
- Skip confirmation (interactive terminal only)-f, --force
Create feature VM (interactive development)
cd ~/.hatch-cli && pnpm dev feature <name> --project <project> --dry-run cd ~/.hatch-cli && pnpm dev feature <name> --project <project> --confirm <token>
Creates isolated VM with git branch and a separate Convex project for isolation. Returns SSH host and preview URL. User will SSH in and drive development with Claude Code.
Options:
- Show what will be created and get a confirmation token--dry-run
- Execute with a token from--confirm <token>--dry-run
- Skip confirmation (interactive terminal only)-f, --force
Autonomous spike (fire and forget)
cd ~/.hatch-cli && pnpm dev spike <name> --project <project> --prompt "<instructions>" --dry-run cd ~/.hatch-cli && pnpm dev spike <name> --project <project> --prompt "<instructions>" --confirm <token>
Creates VM, runs Claude Agent SDK autonomously, creates PR when done.
Options:
- Block until spike completes (default: return immediately)--wait
- Max time when using--timeout <minutes>
(default: 240)--wait
- Output result as JSON--json
- Show what will be created and get a confirmation token--dry-run
- Execute with a token from--confirm <token>--dry-run
- Skip confirmation (interactive terminal only)-f, --force
Show detailed spike progress
cd ~/.hatch-cli && pnpm dev progress <feature> --project <project>
Shows detailed spike progress for a feature VM including plan steps checklist and recent log activity.
Options:
- Output as JSON (recommended for agents)--json
Use after starting a spike to see plan step progress and recent activity without SSH.
Clean up
cd ~/.hatch-cli && pnpm dev clean <name> --project <project> --dry-run cd ~/.hatch-cli && pnpm dev clean <name> --project <project> --confirm <token>
Deletes VM and Convex feature project after PR is merged.
Options:
- Show what will be deleted and get a confirmation token--dry-run
- Execute with a token from--confirm <token>--dry-run
- Skip confirmation (interactive terminal only)-f, --force
Add existing project
cd ~/.hatch-cli && pnpm dev add <project-name>
Adds an existing GitHub/Vercel/Convex project to Hatch tracking.
Clone project repo locally
cd ~/.hatch-cli && pnpm dev clone --project <name> [--path <dir>] [--pull] [--json]
Clones a project's GitHub repo to
~/projects/<name>/repo/. If already cloned, pulls latest changes. Use --pull to only pull (skip clone logic). Use before spikes to give the agent fresh codebase context.
Show VM connection info
cd ~/.hatch-cli && pnpm dev connect
Shows SSH connection details for active VMs.
Generate config file
cd ~/.hatch-cli && pnpm dev config
Generates
hatch.json config file with credentials and defaults.
Hatch uses an Anthropic API key (
anthropicApiKey in the config JSON) for spike agent authentication. The config wizard prompts for this key during setup.
Options:
- Create per-project config at--project <name>~/.hatch/configs/<name>.json
- Refresh GitHub token (preserves orgs/teams/env vars; API keys don't expire)--refresh
Per-project configuration
Per-project configs live at
~/.hatch/configs/<project-name>.json. Commands with --project auto-resolve the right config.
# Create config for a specific project cd ~/.hatch-cli && pnpm dev config --project my-app # List all project configs cd ~/.hatch-cli && pnpm dev config list --json # Validate a project's tokens before use cd ~/.hatch-cli && pnpm dev config check --project my-app --json # Push project config to remote VM cd ~/.hatch-cli && pnpm dev config-push <ssh-host> --project my-app
When
--project is provided on feature/spike/clean commands, the matching config is used automatically. Falls back to ~/.hatch.json if no project-specific config exists.
Update hatch
cd ~/.hatch-cli && pnpm dev update
Pulls latest code, reinstalls dependencies, rebuilds, and updates OpenClaw skills if installed.
Destroy project (HUMAN ONLY)
DO NOT USE THIS COMMAND. Project destruction must be performed manually by a human operator. If asked to destroy a project, instruct the user to run
hatch destroy <project-name> themselves. The destroy command now requires a two-step --dry-run → --confirm <token> flow as an additional safeguard.
Execution Plans
Spikes always create a structured execution plan before writing any code.
How it works
- The agent reads
and project context (docs/plans/_template.md
,docs/architecture.md
)docs/patterns.md - Creates
with goal, approach, and step-by-step checklistdocs/plans/<spike-name>.md - Commits the plan as the first commit on the branch
- Executes each step in order, checking boxes and logging decisions as it goes
- Final commit marks the plan status as "completed"
Continuing a spike
When using
--continue, the agent reads the existing plan and resumes from the first unchecked step.
Plan progress in status
hatch status shows plan progress when available:
Plan: 3/5 steps completed
When to Use Feature vs Spike
Use feature
when:
feature- The task is complex or requires exploration
- The user wants to learn the codebase
- Requirements are unclear and need iteration
- Multiple back-and-forth interactions are expected
- The user explicitly asks for interactive development
Use spike
when:
spike- The task is well-defined and can be described in a prompt
- The user wants a "fire and forget" experience
- Simple features: add a form, create an API endpoint, etc.
- The user asks for something to be "spiked" or done "autonomously"
- Time is limited and the user doesn't want to SSH in
Rule of thumb: If you can describe the task completely in 1-2 sentences, use spike. If you need to ask clarifying questions or the task has many unknowns, use feature.
Crafting better spike prompts: When running
spike --dry-run, the repo is automatically cloned/pulled to a local path (shown as "Local mirror" in the output). Browse the codebase — especially docs/architecture.md, docs/patterns.md, and relevant source files — to write more specific, context-aware prompts that reference actual file paths, component names, and patterns used in the project.
Iterating on a Spike
When a user wants to make changes to an existing spike (e.g., "add phone number to that form"), you can continue the spike instead of starting fresh.
Checking for Active Spikes
cd ~/.hatch-cli && pnpm dev list --json
Look for VMs with
spikeStatus: "completed" matching the project. These are eligible for continuation.
Continuing a Spike
cd ~/.hatch-cli && pnpm dev spike <feature> --project <project> --continue <vm-name> --prompt "additional changes"
Options:
- Continue an existing spike on the specified VM--continue <vm-name>
- Block until iteration completes--wait
- Output result as JSON--json
What Happens on Continuation
The agent will:
- Load context of all previous prompts from
~/spike-context.json - Make changes based on the new prompt
- Add new commits to the existing branch
- Push to update the existing PR (no new PR created)
When to Ask About Continuation
When the user's request relates to a recently completed spike:
- Check for active spikes in the same project
- Ask: "You have an active spike 'feature-name' with PR at [url]. Continue that spike with additional changes, or start a new one?"
- If continuing, use
--continue <vm-name>
Continuation Limitations
- Can only continue spikes with
spikeStatus: "completed" - Cannot continue while a spike is still running
- If VM is unreachable, user must clean and start fresh
Monitoring Spike Progress
After starting a spike, monitor with these SSH commands:
# Human-readable log (best for following along) ssh <vm>.exe.xyz 'tail -f ~/spike.log' # Structured progress events (JSON lines) ssh <vm>.exe.xyz 'tail -f ~/spike-progress.jsonl' # Check if done ssh <vm>.exe.xyz 'test -f ~/spike-done && echo "Done" || echo "Running"' # Get final result (includes cost) ssh <vm>.exe.xyz 'cat ~/spike-result.json' # Get PR URL ssh <vm>.exe.xyz 'cat ~/pr-url.txt'
Spike Output Files
The spike writes these files to the VM home directory:
| File | Description |
|---|---|
| Human-readable progress log |
| Structured tool use events (JSON lines) |
| Final status, session ID, token usage, USD cost |
| Marker file indicating completion |
| The created PR URL |
Observability (Structured Logs)
Generated projects include structured logging. In development, the server logger writes JSON log entries to
~/.harness/logs/app.jsonl on the VM.
Log Query Commands
Run these from the project root on the VM:
| Command | Description |
|---|---|
| Last 50 log entries (human-readable) |
| Error-level entries only |
| Requests slower than 200ms |
| Aggregate stats by route |
| Truncate log file |
Additional flags:
--route <path>, --since <5m|1h|30s>, --limit <n>, --json.
Cost Tracking
Spikes track token usage and cost in
~/spike-result.json:
{ "status": "completed", "sessionId": "session_abc123", "cost": { "inputTokens": 45000, "outputTokens": 12000, "totalUsd": 0.0234 } }
Report costs to the user when a spike completes.
Environment Safety
CRITICAL: Always confirm with the human before taking action. Never run provisioning, destructive, or deployment commands without first showing the human exactly what you plan to do and getting explicit approval.
Commands that create, modify, or destroy resources (
new, spike, feature, clean, destroy) enforce a two-step --dry-run → --confirm <token> flow. Agents should use this instead of relying on manual approval of interactive prompts.
Pre-flight check (required before any provisioning command)
Before running
hatch new, hatch feature, hatch spike, hatch clean, or hatch add:
- Gather context: Run
andhatch list --json
to understand the current state.hatch config check --project <name> --json - Show the human a summary that includes:
- The exact command you plan to run (with
)--dry-run - Which project and config will be used (
or~/.hatch/configs/<name>.json
)~/.hatch.json - Which GitHub org, Vercel team, and Convex deployment will be affected
- For spikes: the full prompt text
- For clean: what resources will be deleted (VM name, Convex project)
- The exact command you plan to run (with
- Run with
to get a confirmation token, then run with--dry-run
after human approval.--confirm <token>
General rules
- Never assume config: Always pass
explicitly. Do not rely on the global fallback when per-project configs exist.--project <name> - Cross-check project names: The
value must match both the project name in--project
and the config filename inhatch list
. Mismatches mean wrong credentials.~/.hatch/configs/ - NEVER run
: This command permanently deletes Convex and Vercel projects. Only a human operator should run destroy. If a user asks you to destroy a project, tell them to run the command manually.hatch destroy
Workflows
Every workflow follows the same pattern: gather context → show the human → get approval → execute. For spikes specifically: gather context → read local repo → draft prompt → iterate with human on prompt → execute.
Create new project
# 1. Check which config will be used cd ~/.hatch-cli && pnpm dev config list --json # 2. Show the human: "I'll create project 'my-app' using config ~/.hatch/configs/my-app.json # (GitHub org: X, Vercel team: Y). This provisions a temporary VM. Proceed?" # 3. Dry run to get a confirmation token: cd ~/.hatch-cli && pnpm dev new my-app --dry-run # 4. After approval, confirm with the token: cd ~/.hatch-cli && pnpm dev new my-app --confirm <token>
Share Vercel URL when complete.
Manual feature development
# 1. Gather context cd ~/.hatch-cli && pnpm dev list --json cd ~/.hatch-cli && pnpm dev config check --project my-app --json # 2. Show the human: "I'll create feature VM 'my-feature' for project 'my-app' # using config ~/.hatch/configs/my-app.json (GitHub: org/my-app, Convex: my-app). # This creates a VM, git branch, and isolated Convex project. Proceed?" # 3. Dry run to get a confirmation token: cd ~/.hatch-cli && pnpm dev feature my-feature --project my-app --dry-run # 4. After approval, confirm with the token: cd ~/.hatch-cli && pnpm dev feature my-feature --project my-app --confirm <token>
Share SSH host so user can connect with Claude Code.
Autonomous spike
# 1. Gather context cd ~/.hatch-cli && pnpm dev list --json cd ~/.hatch-cli && pnpm dev config check --project my-app --json # 2. Show the human: "I'll spike 'my-feature' on project 'my-app' # using config ~/.hatch/configs/my-app.json. # Prompt: 'Add contact form' # This creates a VM, runs Claude autonomously, and opens a PR. Proceed?" # 3. Dry run to get a confirmation token (also clones/pulls repo locally): cd ~/.hatch-cli && pnpm dev spike my-feature --project my-app --prompt "Add contact form" --dry-run # The dry-run output includes a "Local mirror" path (e.g. ~/projects/my-app/repo/). # Read the local repo to understand the codebase before crafting your spike prompt. # Key files to check: docs/architecture.md, docs/patterns.md, CLAUDE.md, and relevant source files. # 4. Draft a detailed prompt based on what you learned from the codebase, then # SHOW IT TO THE HUMAN for review before executing. Example: # # "Here's the spike prompt I'd like to run: # # Add a contact form to the /contact page. Use the existing FormCard component # from packages/ui/src/components/form-card.tsx. Fields: name, email, message. # Submit via a Convex mutation in convex/contact.ts. Add success toast using # the existing useToast hook. # # Want me to adjust anything before I run it?" # # Iterate with the human until they approve the prompt. # 5. After the human approves the prompt, confirm with the token: cd ~/.hatch-cli && pnpm dev spike my-feature --project my-app --prompt "<final approved prompt>" --confirm <token> # 6. Check status (VM liveness, spike progress, PR review/CI) cd ~/.hatch-cli && pnpm dev status --project my-app --json # 7. Optionally monitor progress ssh <vm>.exe.xyz 'tail -f ~/spike.log' # 8. Check for completion ssh <vm>.exe.xyz 'test -f ~/spike-done && cat ~/spike-result.json' # 9. Clean up after PR is merged (dry-run first, then confirm) cd ~/.hatch-cli && pnpm dev clean my-feature --project my-app --dry-run cd ~/.hatch-cli && pnpm dev clean my-feature --project my-app --confirm <token>
Share PR URL when complete.
Blocking spike (wait for completion)
cd ~/.hatch-cli && pnpm dev spike my-feature --project my-app --prompt "Add contact form" --wait --json
Returns full result including PR URL and cost when done.
Anthropic API Key
Spikes use the
anthropicApiKey from the project config (~/.hatch/configs/<name>.json). The key is injected inline via the SSH command — it is not written to the VM environment, so interactive claude sessions on the VM use your own subscription. If the API key is invalid, update it in the config file and retry.
Error Handling
If a spike fails:
- Check
for error details~/spike.log - The VM remains running for debugging
- User can SSH in and fix issues manually
- Or clean up with
and try againcd ~/.hatch-cli && pnpm dev clean
If the spike command itself fails (before agent starts):
- The command automatically rolls back and deletes the VM
- Check error message for the cause (missing config, auth failure, network issues, etc.)
- For auth failures: update
in the project config (anthropicApiKey
) and retry~/.hatch/configs/<name>.json
Important: Do Not Modify VM Code Directly
NEVER SSH into a spike VM to make code changes directly. This bypasses the Claude agent running on the VM which has full project context, proper tooling, and tracks its work.
Instead:
- Use
to iteratehatch spike --continue <vm-name> --prompt "description of changes" - The agent on the VM has Claude Code with Bash, Read, Write, Edit, Glob, and Grep tools
- Direct SSH modifications will conflict with the agent's work and won't be tracked
You may SSH into VMs only for read-only monitoring (e.g.,
tail -f ~/spike.log).