You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
hack — Local development without the port-collision tax
Run hack help <command> for the same content in the terminal. Global options: --no-interactive (or HACK_NO_INTERACTIVE=1); commands with --json emit a {ok, data, error} envelope on stdout.
Project
hack project
Inspect or manage project metadata
Usage
hack project <subcommand> [options]
Subcommands
Command
Summary
hack project owner
Inspect project ownership
Options
Option
Description
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack project owner
Inspect project ownership
Usage
hack project owner <subcommand> [options]
Subcommands
Command
Summary
hack project owner show
Show the local ownership metadata for the current project
Options
Option
Description
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack init
Initialize a repo (generate .hack/ with compose + config)
Usage
hack init [options]
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--manual
Skip discovery and define services manually (or generate a minimal compose in --auto)
--auto
Run non-interactive init with sensible defaults
--name <slug>
Project slug (default: repo name)
--dev-host <host>
DEV_HOST override
--oauth
Enable OAuth-safe alias host
--oauth-tld <tld>
OAuth alias TLD override (default: gy)
--no-discovery
Skip discovery and generate a minimal compose
`--with <claude
codex
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack up [services...]
Start project services (docker compose up)
Usage
hack up [services...] [options]
Arguments
Arg
Description
services
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--project <name>
Target a registered project by name (from ~/.hack/projects.json)
`--env <name
base>`
--branch <name>
Run against a branch-specific instance (compose name + hostnames)
--detach, -d
Run in background (docker compose up -d)
--profile <name[,name...]>
Enable one or more compose profiles (comma-separated)
`--target <auto
local
--json
Output JSON (machine-readable)
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack down
Stop project services (docker compose down)
Usage
hack down [options]
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--project <name>
Target a registered project by name (from ~/.hack/projects.json)
`--env <name
base>`
--branch <name>
Run against a branch-specific instance (compose name + hostnames)
--profile <name[,name...]>
Enable one or more compose profiles (comma-separated)
`--target <auto
local
--json
Output JSON (machine-readable)
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack restart [services...]
Restart the project or selected services
Usage
hack restart [services...] [options]
Arguments
Arg
Description
services
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--project <name>
Target a registered project by name (from ~/.hack/projects.json)
`--env <name
base>`
--branch <name>
Run against a branch-specific instance (compose name + hostnames)
--profile <name[,name...]>
Enable one or more compose profiles (comma-separated)
`--target <auto
local
--json
Output JSON (machine-readable)
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack ps
Show project status (docker compose ps)
Usage
hack ps [options]
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--project <name>
Target a registered project by name (from ~/.hack/projects.json)
--branch <name>
Run against a branch-specific instance (compose name + hostnames)
--profile <name[,name...]>
Enable one or more compose profiles (comma-separated)
--json
Output JSON (machine-readable)
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack tui
Open the project TUI (services + logs)
Usage
hack tui [options]
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--project <name>
Target a registered project by name (from ~/.hack/projects.json)
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack run <service> [cmd...]
Run a one-off command in a service container (docker compose run --rm)
Usage
hack run <service> [cmd...] [options]
Arguments
Arg
Description
service
cmd
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--project <name>
Target a registered project by name (from ~/.hack/projects.json)
`--env <name
base>`
--branch <name>
Run against a branch-specific instance (compose name + hostnames)
--workdir <path>
Working directory inside the container (docker compose run -w)
--profile <name[,name...]>
Enable one or more compose profiles (comma-separated)
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack exec <service> [cmd...]
Run a command in an already-running service container (docker compose exec)
Usage
hack exec<service> [cmd...] [options]
Arguments
Arg
Description
service
cmd
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--project <name>
Target a registered project by name (from ~/.hack/projects.json)
`--env <name
base>`
--branch <name>
Run against a branch-specific instance (compose name + hostnames)
--workdir <path>
Working directory inside the container (docker compose run -w)
--profile <name[,name...]>
Enable one or more compose profiles (comma-separated)
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack logs [service]
Tail logs (compose by default; Loki for queries/history via --loki/--query)
Usage
hack logs [service] [options]
Arguments
Arg
Description
service
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--project <name>
Target a registered project by name (from ~/.hack/projects.json)
--branch <name>
Run against a branch-specific instance (compose name + hostnames)
Enable one or more compose profiles (comma-separated)
--compose
Read logs directly from docker compose (bypass Loki)
--loki
Force Loki backend (do not fall back to docker compose logs)
--services <csv>
Filter Loki logs by service(s), comma-separated (e.g. api,www)
--query <logql>
Raw LogQL selector/query (overrides auto selector built from project + services)
--since <time>
Start time for Loki logs (RFC3339 or duration like 15m)
--until <time>
End time for Loki logs (RFC3339 or duration like 15m)
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack open [target]
Open a project URL (OAuth alias by default when enabled; otherwise dev host)
Usage
hack open [target] [options]
Arguments
Arg
Description
target
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--project <name>
Target a registered project by name (from ~/.hack/projects.json)
--branch <name>
Run against a branch-specific instance (compose name + hostnames)
`--prefer <auto
alias
--json
Output JSON (machine-readable)
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack branch
Manage branch aliases for a project
Usage
hack branch <subcommand> [options]
Subcommands
Command
Summary
hack branch add <name>
Register a branch alias for this project
hack branch list
List registered branch aliases for this project
hack branch remove <name>
Remove a branch alias for this project
hack branch open <name>
Open the branch host in a browser
Options
Option
Description
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack branch add <name>
Register a branch alias for this project
Usage
hack branch add <name> [options]
Arguments
Arg
Description
name
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--project <name>
Target a registered project by name (from ~/.hack/projects.json)
--note <text>
Optional note for the branch entry
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack branch list
List registered branch aliases for this project
Usage
hack branch list [options]
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--project <name>
Target a registered project by name (from ~/.hack/projects.json)
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack branch remove <name>
Remove a branch alias for this project
Usage
hack branch remove <name> [options]
Arguments
Arg
Description
name
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--project <name>
Target a registered project by name (from ~/.hack/projects.json)
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack branch open <name>
Open the branch host in a browser
Usage
hack branch open <name> [options]
Arguments
Arg
Description
name
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--project <name>
Target a registered project by name (from ~/.hack/projects.json)
`--prefer <auto
alias
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack config
Read/write hack.config.json values
Usage
hack config <subcommand> [options]
Subcommands
Command
Summary
hack config get <key>
Read a value from hack.config.json
hack config set <key> <value>
Update a value in hack.config.json
Options
Option
Description
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack config get <key>
Read a value from hack.config.json
Usage
hack config get <key> [options]
Arguments
Arg
Description
key
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--project <name>
Target a registered project by name (from ~/.hack/projects.json)
--global
Read/write global ~/.hack/hack.config.json
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack config set <key> <value>
Update a value in hack.config.json
Usage
hack config set<key><value> [options]
Arguments
Arg
Description
key
value
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--project <name>
Target a registered project by name (from ~/.hack/projects.json)
--global
Read/write global ~/.hack/hack.config.json
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack session
Manage persistent project workspaces with tmux-first onboarding
Usage
hack session <subcommand> [options]
Sessions keep a project workspace alive across terminal restarts, SSH reconnects, and long-running agent work. The guided default is tmux, including hack setup tmux for a popup picker. Other mux backends such as zellij still exist through sessions.mux, but the interactive session tooling is tmux-first today.
Subcommands
Command
Summary
hack session list
List active workspaces
hack session start [project]
Reuse the default project workspace or create an isolated one
hack session stop <workspace>
Stop a workspace
hack session attach <workspace>
Attach to an existing workspace
hack session exec <workspace> <command>
Send a command to a running workspace
hack session panes <workspace>
List panes in a tmux workspace
hack session capture <workspace>
Capture recent output from a tmux workspace
hack session tail <workspace>
Tail output from a tmux workspace
Options
Option
Description
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack session list
List active workspaces
Usage
hack session list [options]
Options
Option
Description
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack session start [project]
Reuse the default project workspace or create an isolated one
Usage
hack session start [project] [options]
Reuse the default project workspace when it already exists, or create an isolated long-running workspace with --new or --name. Use --detach when another tool should keep the workspace alive without attaching your terminal.
Arguments
Arg
Description
project
Project name or path
Options
Option
Description
--up
Run hack up -d before creating or attaching
--new
Create an isolated workspace instead of reusing the default project workspace
--name <value>
Suffix for an isolated workspace name (for example: agent-1 -> project--agent-1)
--detach, -d
Create or reuse the workspace without attaching (for GUI/non-TTY use)
`--env <name
base>`
`--service <global
service>`
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack session stop <workspace>
Stop a workspace
Usage
hack session stop <workspace> [options]
Arguments
Arg
Description
workspace
Workspace name
Options
Option
Description
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack session attach <workspace>
Attach to an existing workspace
Usage
hack session attach <workspace> [options]
Attach to a running workspace by name. Tmux switches clients instead of nesting tmux inside tmux, while zellij attaches to the named session directly.
Arguments
Arg
Description
workspace
Workspace name
Options
Option
Description
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack session exec <workspace> <command>
Send a command to a running workspace
Usage
hack session exec<workspace><command> [options]
Queue a command in the workspace without opening a new interactive attach flow. Tmux sends it to the active pane; zellij opens a new pane for the command. This is useful for long-running agents, background checks, or remote follow-up work.
Arguments
Arg
Description
workspace
Workspace name
command
Command to execute in workspace
Options
Option
Description
`--env <name
base>`
`--service <global
service>`
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack ssh [workspace]
Show SSH connection info for remote access to this machine
Usage
hack ssh [workspace] [options]
Show SSH connection info for this machine and optionally connect to a persistent workspace. Existing workspaces reuse their current mux backend, and newly created workspaces use the configured default backend.
Arguments
Arg
Description
workspace
Workspace to connect to
Options
Option
Description
--host, -H <value>
SSH host (hostname or IP)
--user, -u <value>
SSH username
--tailscale, -t
Use Tailscale SSH
--direct
Use direct SSH (requires --host)
--port, -p <value>
SSH port for direct connection (default: 22)
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
Global infrastructure
hack global
Manage machine-wide infra (DNS/TLS, Caddy proxy, logs)
Usage
hack global <subcommand> [options]
Subcommands
Command
Summary
hack global install
Bootstrap ~/.hack and start Caddy + Grafana/Loki/Alloy
hack global up
Start global infra containers
hack global down
Stop global infra containers
hack global status
Show status for global infra (containers + networks)
hack global logs [service]
Tail global infra logs (caddy|grafana|loki|alloy)
hack global ca
Export Caddy Local CA cert (print path or PEM)
hack global cert <hosts...>
Generate local TLS certs via mkcert (for non-Caddy services)
hack global trust
Trust Caddy Local CA (macOS) so https://*.hack is trusted
Migrate legacy hack.env.json/.env state to the new env config files
--json
Output JSON (machine-readable)
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack crash-capture
Capture OrbStack/system/docker diagnostics into .tmp for post-failure triage
Usage
hack crash-capture [options]
Collects structured snapshots after a runtime failure: hack status/logs, docker state, OrbStack process details, and filtered macOS unified logs.
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--since <duration>
Look-back window for system logs (for example: 30m, 2h)
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack daemon
Manage the local hack daemon (hackd)
Usage
hack daemon <subcommand> [options]
Subcommands
Command
Summary
hack daemon start
Start hackd (local daemon)
hack daemon stop
Stop hackd
hack daemon restart
Restart hackd
hack daemon status
Show hackd status
hack daemon metrics
Show hackd metrics
hack daemon logs
Show hackd logs
hack daemon clear
Clear stale hackd pid/socket files
hack daemon install
Install hackd as a launchd service (macOS)
hack daemon uninstall
Uninstall hackd launchd service (macOS)
Options
Option
Description
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack daemon start
Start hackd (local daemon)
Usage
hack daemon start [options]
Options
Option
Description
--foreground
Run hackd in the foreground (debug)
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack daemon stop
Stop hackd
Usage
hack daemon stop [options]
Options
Option
Description
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack daemon restart
Restart hackd
Usage
hack daemon restart [options]
Options
Option
Description
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack daemon status
Show hackd status
Usage
hack daemon status [options]
Options
Option
Description
--json
Output JSON (machine-readable)
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack daemon metrics
Show hackd metrics
Usage
hack daemon metrics [options]
Options
Option
Description
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack daemon logs
Show hackd logs
Usage
hack daemon logs [options]
Options
Option
Description
--tail <n>
Tail last N log lines (default: 200)
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack daemon clear
Clear stale hackd pid/socket files
Usage
hack daemon clear [options]
Options
Option
Description
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack daemon install
Install hackd as a launchd service (macOS)
Usage
hack daemon install [options]
Options
Option
Description
--run-at-load
Start hackd automatically on login
--no-run-at-load
Do not start hackd automatically on login
--gui-only
Only run in GUI sessions (default)
--no-gui-only
Run in all session types (including SSH)
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack daemon uninstall
Uninstall hackd launchd service (macOS)
Usage
hack daemon uninstall [options]
Options
Option
Description
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack update
Update hack to the latest release
Usage
hack update [options]
Downloads and installs the latest stable hack release from GitHub.
Notes:
Refuses to self-update when running from a Homebrew install, local dev wrapper, or symlink install.
Updates the current hack binary and refreshes assets.
Options
Option
Description
--check
Check for updates (do not install)
--yes
Apply update without prompting
--tag <tag>
Update to a specific release tag (e.g. v1.4.0)
--json
Output JSON (machine-readable)
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack version
Print version
Usage
hack version [options]
Options
Option
Description
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack help [path...]
Show help for a command (e.g. hack help global logs)
Usage
hack help [path...] [options]
Arguments
Arg
Description
path
Options
Option
Description
--all
Include experimental (unsupported) commands in help output
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
Agents
hack mcp
Manage MCP server integrations for coding agents
Usage
hack mcp <subcommand> [options]
Subcommands
Command
Summary
hack mcp serve
Run the MCP server over stdio
hack mcp install
Install MCP config for supported clients
hack mcp print
Print MCP config snippets
Options
Option
Description
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack mcp serve
Run the MCP server over stdio
Usage
hack mcp serve [options]
Options
Option
Description
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack mcp install
Install MCP config for supported clients
Usage
hack mcp install [options]
Options
Option
Description
`--scope <user
project>`
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--all
Target all supported clients
--cursor
Target Cursor MCP config
--claude
Target Claude CLI MCP config
--codex
Target Codex MCP config
--docs
Update AGENTS.md and CLAUDE.md with hack usage
--agents-md
Update AGENTS.md with hack usage
--claude-md
Update CLAUDE.md with hack usage
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack mcp print
Print MCP config snippets
Usage
hack mcp print [options]
Options
Option
Description
`--scope <user
project>`
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--all
Target all supported clients
--cursor
Target Cursor MCP config
--claude
Target Claude CLI MCP config
--codex
Target Codex MCP config
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack setup
Install integrations for coding agents
Usage
hack setup <subcommand> [options]
Subcommands
Command
Summary
hack setup tmux
Install the recommended tmux binding for hack workspaces
hack setup cursor
Install Cursor rules for hack CLI usage
hack setup claude
Install Claude Code hooks for hack CLI usage
hack setup codex
Install Codex skill for hack CLI usage
hack setup tickets
Remove or audit the deprecated Hack Tickets skill
hack setup agents
Install AGENTS.md / CLAUDE.md snippets for hack CLI usage
hack setup sync
Refresh project/global agent guidance and remove deprecated artifacts
hack setup mcp
Install MCP configs for hack CLI usage (no-shell only)
Options
Option
Description
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack setup tmux
Install the recommended tmux binding for hack workspaces
Usage
hack setup tmux [options]
Options
Option
Description
--check
Check whether integration is installed
--remove
Remove integration files/config
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack setup cursor
Install Cursor rules for hack CLI usage
Usage
hack setup cursor [options]
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--global
Use global (user) scope instead of project scope
--check
Check whether integration is installed
--remove
Remove integration files/config
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack setup claude
Install Claude Code hooks for hack CLI usage
Usage
hack setup claude [options]
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--global
Use global (user) scope instead of project scope
--check
Check whether integration is installed
--remove
Remove integration files/config
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack setup codex
Install Codex skill for hack CLI usage
Usage
hack setup codex [options]
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--global
Use global (user) scope instead of project scope
--check
Check whether integration is installed
--remove
Remove integration files/config
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack setup tickets
Remove or audit the deprecated Hack Tickets skill
Usage
hack setup tickets [options]
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--global
Use global (user) scope instead of project scope
--check
Check whether integration is installed
--remove
Remove integration files/config
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack setup agents
Install AGENTS.md / CLAUDE.md snippets for hack CLI usage
Usage
hack setup agents [options]
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--all
Target all supported clients
--agents-md
Target AGENTS.md
--claude-md
Target CLAUDE.md
--check
Check whether integration is installed
--remove
Remove integration files/config
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack setup sync
Refresh project/global agent guidance and remove deprecated artifacts
Usage
hack setup sync [options]
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--global
Use global (user) scope instead of project scope
--all-scopes
Target both project and global (user) scopes
--check
Check whether integration is installed
--remove
Remove integration files/config
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack setup mcp
Install MCP configs for hack CLI usage (no-shell only)
Usage
hack setup mcp [options]
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--global
Use global (user) scope instead of project scope
--all
Target all supported clients
--cursor
Target Cursor integration
--claude
Target Claude integration
--codex
Target Codex integration
--check
Check whether integration is installed
--remove
Remove integration files/config
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack agent
Agent utilities
Usage
hack agent <subcommand> [options]
Subcommands
Command
Summary
hack agent prime
Print agent primer text
hack agent patterns
Print agent init patterns guide
hack agent init
Print agent init prompt
hack agent onboard
Print the project onboarding prompt (agent-assisted setup)
Options
Option
Description
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack agent prime
Print agent primer text
Usage
hack agent prime [options]
Options
Option
Description
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack agent patterns
Print agent init patterns guide
Usage
hack agent patterns [options]
Options
Option
Description
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack agent init
Print agent init prompt
Usage
hack agent init [options]
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
`--client, -c <cursor
claude
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack agent onboard
Print the project onboarding prompt (agent-assisted setup)
Usage
hack agent onboard [options]
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
Secrets & env
hack secrets
Manage secrets in OS keychain (Bun.secrets)
Usage
hack secrets <subcommand> [options]
Subcommands
Command
Summary
hack secrets set [name]
Store a secret
hack secrets get [name]
Print a secret (exit 1 if missing)
hack secrets delete [name]
Delete a stored secret
Options
Option
Description
--service <service>
Override Bun.secrets service name (default: hack-cli)
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack secrets set [name]
Store a secret
Usage
hack secrets set [name] [options]
Arguments
Arg
Description
name
Options
Option
Description
--service <service>
Override Bun.secrets service name (default: hack-cli)
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack secrets get [name]
Print a secret (exit 1 if missing)
Usage
hack secrets get [name] [options]
Arguments
Arg
Description
name
Options
Option
Description
--service <service>
Override Bun.secrets service name (default: hack-cli)
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack secrets delete [name]
Delete a stored secret
Usage
hack secrets delete [name] [options]
Arguments
Arg
Description
name
Options
Option
Description
--service <service>
Override Bun.secrets service name (default: hack-cli)
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
Integrations
hack auth [args...]
Removed: Hack account sign-in no longer ships with the local-first CLI
Usage
hack auth [args...] [options]
Removed in v3: Hack no longer ships a centralized auth broker or hosted account surface.
Migration: Local workflows no longer require Hack account sign-in. Use local project ownership, tickets, env, and sessions directly.
Arguments
Arg
Description
args
Legacy subcommand and arguments
Options
Option
Description
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack org [args...]
Removed: hosted organization management is no longer part of Hack
Usage
hack org [args...] [options]
Removed in v3: Hack v3 dropped centralized org and membership administration with the broker-backed control plane.
Migration: Keep project ownership local and use native git collaboration plus repo-local tickets instead.
Arguments
Arg
Description
args
Legacy subcommand and arguments
Options
Option
Description
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack team [args...]
Removed: hosted team management is no longer part of Hack
Usage
hack team [args...] [options]
Removed in v3: Hack v3 removed broker-backed team and membership lifecycle management.
Migration: Use repo-local ownership plus native collaboration tools outside Hack.
Arguments
Arg
Description
args
Legacy subcommand and arguments
Options
Option
Description
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack linear [args...]
Removed: Linear integration is no longer part of Hack v3
Usage
hack linear [args...] [options]
Removed in v3: Hack v3 removed hosted planning and sync integrations to stay self-contained and local-first.
Migration: Use repo-local tickets for optional in-repo tracking and keep Linear outside Hack.
Arguments
Arg
Description
args
Legacy subcommand and arguments
Options
Option
Description
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack env
Set project env vars and local secrets
Usage
hack env <subcommand> [options]
Subcommands
Command
Summary
hack env list
List resolved env values for the selected overlay
hack env explain <key>
Explain a resolved env value without revealing it
hack env apply
Recreate one service with its resolved env
hack env add [key] [value]
Add or update an env value
hack env set [key] [value]
Alias for env add
hack env materialize
Write a compatibility .env file from the selected overlay
hack env exec [command...]
Run a host command with project env injected
hack env shell
Open a host shell with project env injected
hack env unset [key]
Remove an env value from the canonical config
hack env backend
Manage env/secret storage backend strategy
Options
Option
Description
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack env list
List resolved env values for the selected overlay
Usage
hack env list [options]
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--project <name>
Target a registered project by name (from ~/.hack/projects.json)
`--env <name
base>`
--json
Output JSON (machine-readable)
--show-secrets
Print secret values (keychain) in plaintext
`--service <global
service>`
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack env explain <key>
Explain a resolved env value without revealing it
Usage
hack env explain <key> [options]
Arguments
Arg
Description
key
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--project <name>
Target a registered project by name (from ~/.hack/projects.json)
`--env <name
base>`
--json
Output JSON (machine-readable)
`--service <global
service>`
`--target <host
compose>`
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack env apply
Recreate one service with its resolved env
Usage
hack env apply [options]
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--project <name>
Target a registered project by name (from ~/.hack/projects.json)
`--env <name
base>`
--json
Output JSON (machine-readable)
`--service <global
service>`
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack env add [key] [value]
Add or update an env value
Usage
hack env add [key] [value] [options]
Arguments
Arg
Description
key
value
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--project <name>
Target a registered project by name (from ~/.hack/projects.json)
`--env <name
base>`
--secret
Store value as an encrypted secure entry
--local
Write to the worktree-local env override file instead of the shared repo env file
`--service <global
service>`
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack env set [key] [value]
Alias for env add
Usage
hack env set [key] [value] [options]
Arguments
Arg
Description
key
value
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--project <name>
Target a registered project by name (from ~/.hack/projects.json)
`--env <name
base>`
--secret
Store value as an encrypted secure entry
--local
Write to the worktree-local env override file instead of the shared repo env file
`--service <global
service>`
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack env materialize
Write a compatibility .env file from the selected overlay
Usage
hack env materialize [options]
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--project <name>
Target a registered project by name (from ~/.hack/projects.json)
`--env <name
base>`
`--service <global
service>`
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack env exec [command...]
Run a host command with project env injected
Usage
hack env exec [command...] [options]
Inject the selected Hack env overlay directly into a one-off host command without materializing .hack/.env. To inspect a value, prefer printenv KEY or sh -lc 'printf "%s\n" "$KEY"'; echo $KEY expands in your current shell before Hack injects env.
Arguments
Arg
Description
command
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--project <name>
Target a registered project by name (from ~/.hack/projects.json)
`--env <name
base>`
`--service <global
service>`
`--target <host
compose>`
--shell <command>
Run a shell command string via /bin/sh -lc after env injection so $VAR expansion happens inside the child shell
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack env shell
Open a host shell with project env injected
Usage
hack env shell [options]
Start an interactive host shell with the selected Hack env overlay injected into the process environment.
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--project <name>
Target a registered project by name (from ~/.hack/projects.json)
`--env <name
base>`
`--service <global
service>`
`--target <host
compose>`
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack env unset [key]
Remove an env value from the canonical config
Usage
hack env unset [key] [options]
Arguments
Arg
Description
key
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--project <name>
Target a registered project by name (from ~/.hack/projects.json)
`--env <name
base>`
--local
Write to the worktree-local env override file instead of the shared repo env file
`--service <global
service>`
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack env backend
Manage env/secret storage backend strategy
Usage
hack env backend <subcommand> [options]
Subcommands
Command
Summary
hack env backend status
Show configured env/secret backend strategy
hack env backend use <backend>
Select env/secret backend strategy
Options
Option
Description
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack host
Run host-side commands with project env injected
Usage
hack host <subcommand> [options]
Use hack host when a command should run on your host machine, not inside the compose network, but still needs Hack-resolved env and host-local rewrites.
Subcommands
Command
Summary
hack host exec [command...]
Run a host command with project env injected
hack host shell
Open a host shell with project env injected
Options
Option
Description
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack host exec [command...]
Run a host command with project env injected
Usage
hack host exec [command...] [options]
Run a one-off command on the host with the selected Hack env overlay injected. Use --scope when you want service-scoped values without running inside that service container. To inspect a value, prefer printenv KEY or sh -lc 'printf "%s\n" "$KEY"'; echo $KEY expands in your current shell before Hack injects env.
Arguments
Arg
Description
command
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--project <name>
Target a registered project by name (from ~/.hack/projects.json)
`--env <name
base>`
`--scope <global
service>`
`--target <host
compose>`
--shell <command>
Run a shell command string via /bin/sh -lc after env injection so $VAR expansion happens inside the child shell
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack host shell
Open a host shell with project env injected
Usage
hack host shell [options]
Start an interactive host shell with the selected Hack env overlay injected. Use --scope when you want service-scoped values without running inside that service container.
Options
Option
Description
--path, -p <dir>
Run a project command against a repo path (overrides cwd search)
--project <name>
Target a registered project by name (from ~/.hack/projects.json)
`--env <name
base>`
`--scope <global
service>`
`--target <host
compose>`
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
Deprecated compatibility surface. It is no longer installed into agent instructions or skills.
Alias for hack x tickets <command>. Requires extension enabled.
Arguments
Arg
Description
args
Options
Option
Description
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
Extensions
hack x [args...]
Run extension commands
Usage
hack x [args...] [options]
Usage:
hack x list
hack x help
hack x [args...]
Extension commands accept their own flags and arguments.
Use hack x <namespace> help to see available commands.
Arguments
Arg
Description
args
Options
Option
Description
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
Fun
hack the
Crash override
Usage
hack the <subcommand> [options]
Subcommands
Command
Summary
hack the planet
Crash override
Options
Option
Description
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack the planet
Crash override
Usage
hack the planet [options]
Options
Option
Description
`--variant <cut
mash
--loop
Loop until Ctrl+C (default: true)
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
Experimental (unsupported)
These commands are source-available but outside the supported v3 product contract. They are hidden from default hack --help (see them with hack help --all) and print a warning when invoked.
hack dispatch — Beta: run branch-scoped jobs on remote nodes
hack gateway — Beta: manage the remote control plane entrypoint
hack node — Beta: manage remote execution nodes
hack remote — Beta: guided remote access and gateway helpers
Internal
hack internal
Manage hack-managed internal overrides
Usage
hack internal <subcommand> [options]
Subcommands
Command
Summary
hack internal extra-hosts
Manage internal Compose extra_hosts
Options
Option
Description
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)
--help, -h
Show help
--version, -v
Show version
hack internal extra-hosts
Manage internal Compose extra_hosts
Usage
hack internal extra-hosts <subcommand> [options]
Subcommands
Command
Summary
hack internal extra-hosts set <hostname> <target>
Set an internal extra_hosts entry
hack internal extra-hosts unset <hostname>
Remove an internal extra_hosts entry
hack internal extra-hosts list
List internal extra_hosts entries
Options
Option
Description
--no-interactive
Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1)