Slash commands catalog
9 slash commands. PM-facing surface of the plugin. All invoked as /frappe-stack:<command>.
Command
What it does
Refuses on
/frappe-stack:init
Configure the plugin to talk to your Frappe site: store API key/secret in OS keychain, register staging and production sites, point at your local config-repo checkout. Idempotent.
Frappe < v15, adding --prod before staging is configured
/frappe-stack:build
Build a DocType / Workflow / Dashboard / Report / Custom Field / Property Setter via the engineer agent.
is_production=1, reserved names, elevated fieldtypes without role, workflows without terminal state
/frappe-stack:pull
Site → git: write per-blueprint JSONs to the config-repo working tree. No commit by default.
Working tree conflicts, network error, unconfigured config_repo_local_path
/frappe-stack:push
Git → site (staging only). Idempotent.
--site=prod (always refused), uncommitted working tree, blueprint guardrail failure
/frappe-stack:diff
3-bucket structured diff: only-on-site / only-in-git / changed. Refuses to auto-resolve.
Unconfigured config_repo_local_path, dirty working tree
/frappe-stack:promote
Staging → prod via PR. Runs the pre-promote checklist; opens PR; watches merge → migrate.
Any checklist box failed (without --emergency), Friday-after-14:00 without --emergency, >5 unrelated blueprints
/frappe-stack:experiment
A/B in workflows: define / status / pause / resume / promote / abandon.
Promote with arm < 100 assignments, promote when CI crosses 0, define on a target without an existing workflow
/frappe-stack:review
Standalone reviewer + tester run. Does not mutate or open PRs.
No changes to review
/frappe-stack:ship
Tag a release after a successful prod migrate. Updates CHANGELOG.
Last promote not successful, dirty working tree, version not strictly greater than last tag
/frappe-stack:rollback
Rewind staging to a previous config-repo commit via stock REST. Idempotent.
--site=prod (production rolls back through reverting the merge), dirty working tree, audit-tagged resources being deleted, expired DeployControl token
Typical flow
%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#F5E6DD',
'primaryTextColor': '#2E2E2E',
'primaryBorderColor': '#8B1E24',
'lineColor': '#9E2A2F',
'secondaryColor': '#E7C1AD',
'tertiaryColor': '#ffffff',
'fontFamily': 'Inter, system-ui, sans-serif',
'fontSize': '14px'
}
}}%%
flowchart TD
A["/frappe-stack:init"]
B["/frappe-stack:build doctype Beneficiary"]
C["/frappe-stack:build workflow Beneficiary Approval"]
D["/frappe-stack:build dashboard Beneficiary Operations"]
E["/frappe-stack:review"]
F["/frappe-stack:diff"]
G["/frappe-stack:promote"]
H{{"PR review + merge + CI migrate"}}
I["/frappe-stack:ship v0.1.0"]
A --> B --> C --> D --> E --> F --> G --> H --> I
classDef step fill:#F5E6DD,stroke:#8B1E24,stroke-width:1.5px,color:#2E2E2E,rx:10,ry:10
classDef gate fill:#F28C38,stroke:#9E2A2F,stroke-width:1.5px,color:#ffffff
class A,B,C,D,E,F,G,I step
class H gate
Commands grouped by purpose
Purpose
Commands
Setup
init
Build
build, experiment
Sync
pull, push, diff
Review & ship
review, promote, ship
Argument hints
Each command's .md declares an argument-hint that Claude Code shows when the user types /frappe-stack:build (with a trailing space). The hints are short — they nudge correct usage without becoming documentation.
Command
argument-hint
init
<site-url> [--prod]
build
<type> <name> [--from-spec=<path>]
pull
[--site=staging\|prod] [--commit] [--push]
push
[--site=staging] [--dry-run]
diff
[--site=staging\|prod]
promote
[--emergency]
experiment
<action> [args]
review
[--blueprint=<name>] [--since=<git-ref>]
ship
<version> [--notes-from=<pr-number>]
Adding a command
Create commands/<name>.md with frontmatter:
---
description : <what it does, one sentence>
argument-hint : <example invocation>
---
Body: what it does, arguments, refuses-if, examples.
Add a row to this catalog.
If it spawns an agent, link to the agent's .md.
If it has refusals, mirror them into docs/hooks.md so the hook layer enforces them too.