@jiggai/recipes 0.2.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,266 @@
1
+ # Command reference
2
+
3
+ All commands live under:
4
+
5
+ ```bash
6
+ openclaw recipes <command>
7
+ ```
8
+
9
+ ## `list`
10
+ List available recipes (builtin + workspace).
11
+
12
+ ```bash
13
+ openclaw recipes list
14
+ ```
15
+
16
+ Outputs JSON rows:
17
+ - `id`, `name`, `kind`, `source`
18
+
19
+ ## `show <id>`
20
+ Print the raw recipe markdown.
21
+
22
+ ```bash
23
+ openclaw recipes show development-team
24
+ ```
25
+
26
+ ## `status [id]`
27
+ Check missing skills for a recipe (or all recipes).
28
+
29
+ ```bash
30
+ openclaw recipes status
31
+ openclaw recipes status development-team
32
+ ```
33
+
34
+ ## `scaffold <recipeId>`
35
+ Scaffold a single agent workspace from an **agent** recipe.
36
+
37
+ ```bash
38
+ openclaw recipes scaffold project-manager --agent-id pm --name "Project Manager" --apply-config
39
+ ```
40
+
41
+ Options:
42
+ - `--agent-id <id>` (required)
43
+ - `--name <name>`
44
+ - `--overwrite` (overwrite recipe-managed files)
45
+ - `--apply-config` (write/update `agents.list[]` in OpenClaw config)
46
+
47
+ ## `scaffold-team <recipeId>`
48
+
49
+ ### Cron installation config
50
+ If a recipe declares `cronJobs`, scaffold will reconcile those jobs using the plugin config key:
51
+ - `plugins.entries.recipes.config.cronInstallation`: `off | prompt | on`
52
+ - `off`: never install/reconcile
53
+ - `prompt` (default): prompt each run (default answer is **No**)
54
+ - `on`: install/reconcile; new jobs follow `enabledByDefault`
55
+ Scaffold a shared **team workspace** + multiple agents from a **team** recipe.
56
+
57
+ ```bash
58
+ openclaw recipes scaffold-team development-team \
59
+ --team-id development-team-team \
60
+ --overwrite \
61
+ --apply-config
62
+ ```
63
+
64
+ Options:
65
+ - `--team-id <teamId>` (required)
66
+ - **Must end with `-team`** (enforced)
67
+ - `--overwrite`
68
+ - `--apply-config`
69
+
70
+ Creates a shared team workspace root:
71
+
72
+ - `~/.openclaw/workspace-<teamId>/...`
73
+
74
+ Standard folders:
75
+ - `inbox/`, `outbox/`, `shared/`, `notes/`
76
+ - `work/{backlog,in-progress,testing,done,assignments}`
77
+ - `roles/<role>/...` (role-specific recipe files)
78
+
79
+ Also creates agent config entries under `agents.list[]` (when `--apply-config`), with agent ids:
80
+ - `<teamId>-<role>`
81
+
82
+ ## `install <idOrSlug> [--yes]`
83
+ Install skills from ClawHub (confirmation-gated).
84
+
85
+ Default behavior: **global install** into `~/.openclaw/skills`.
86
+
87
+ ```bash
88
+ # Global (shared across all agents)
89
+ openclaw recipes install agentchat --yes
90
+
91
+ # Agent-scoped (into workspace-<agentId>/skills)
92
+ openclaw recipes install agentchat --yes --agent-id dev
93
+
94
+ # Team-scoped (into workspace-<teamId>/skills)
95
+ openclaw recipes install agentchat --yes --team-id development-team-team
96
+ ```
97
+
98
+ Behavior:
99
+ - If `idOrSlug` matches a recipe id, installs that recipe’s `requiredSkills` + `optionalSkills`.
100
+ - Otherwise treats it as a ClawHub skill slug.
101
+ - Installs via:
102
+ - `npx clawhub@latest --workdir <targetWorkspace> --dir skills install <slug>` (agent/team)
103
+ - `npx clawhub@latest --workdir ~/.openclaw --dir skills install <slug>` (global)
104
+ - Confirmation-gated unless `--yes`.
105
+ - In non-interactive mode (no TTY), requires `--yes`.
106
+
107
+ ## `bind`
108
+ Add/update a multi-agent routing binding (writes `bindings[]` in `~/.openclaw/openclaw.json`).
109
+
110
+ Examples:
111
+
112
+ ```bash
113
+ # Route one Telegram DM to an agent
114
+ openclaw recipes bind --agent-id dev --channel telegram --peer-kind dm --peer-id 6477250615
115
+
116
+ # Route all Telegram traffic to an agent (broad match)
117
+ openclaw recipes bind --agent-id dev --channel telegram
118
+ ```
119
+
120
+ Notes:
121
+ - `peer.kind` must be one of: `dm|group|channel`.
122
+ - Peer-specific bindings are inserted first (more specific wins).
123
+
124
+ ## `unbind`
125
+ Remove routing binding(s) from OpenClaw config (`bindings[]`).
126
+
127
+ Examples:
128
+
129
+ ```bash
130
+ # Remove a specific DM binding for an agent
131
+ openclaw recipes unbind --agent-id dev --channel telegram --peer-kind dm --peer-id 6477250615
132
+
133
+ # Remove ALL bindings that match this peer (any agent)
134
+ openclaw recipes unbind --channel telegram --peer-kind dm --peer-id 6477250615
135
+ ```
136
+
137
+ ## `bindings`
138
+ Print the current `bindings[]` from OpenClaw config.
139
+
140
+ ```bash
141
+ openclaw recipes bindings
142
+ ```
143
+
144
+ ## `migrate-team`
145
+ Migrate a legacy team scaffold into the new `workspace-<teamId>` layout.
146
+
147
+ ```bash
148
+ openclaw recipes migrate-team --team-id development-team-team --dry-run
149
+ openclaw recipes migrate-team --team-id development-team-team --mode move
150
+ ```
151
+
152
+ Options:
153
+ - `--dry-run`
154
+ - `--mode move|copy`
155
+ - `--overwrite` (merge into existing destination)
156
+
157
+ ## `dispatch`
158
+ Convert a natural-language request into file-first execution artifacts.
159
+
160
+ ## `tickets`
161
+ List tickets for a team across the standard workflow stages.
162
+
163
+ ```bash
164
+ openclaw recipes tickets --team-id <teamId>
165
+ openclaw recipes tickets --team-id <teamId> --json
166
+ ```
167
+
168
+ ## `cleanup-workspaces`
169
+ List (dry-run, default) or delete (with `--yes`) temporary test/scaffold team workspaces under your OpenClaw home directory.
170
+
171
+ Safety rails:
172
+ - Only considers `workspace-<teamId>` directories where `<teamId>`:
173
+ - ends with `-team`
174
+ - starts with an allowed prefix (default: `smoke-`, `qa-`, `tmp-`, `test-`)
175
+ - Refuses symlinks
176
+ - Protected teams (at minimum: `development-team`) are never deleted
177
+
178
+ Examples:
179
+ ```bash
180
+ # Dry-run (default): list what would be deleted
181
+ openclaw recipes cleanup-workspaces
182
+
183
+ # Actually delete eligible workspaces
184
+ openclaw recipes cleanup-workspaces --yes
185
+
186
+ # Custom prefixes (repeatable)
187
+ openclaw recipes cleanup-workspaces --prefix smoke- --prefix qa- --yes
188
+
189
+ # JSON output
190
+ openclaw recipes cleanup-workspaces --json
191
+ ```
192
+
193
+ ## `move-ticket`
194
+ Move a ticket file between workflow stages and update the ticket’s `Status:` field.
195
+
196
+ ```bash
197
+ openclaw recipes move-ticket --team-id <teamId> --ticket 0007 --to in-progress
198
+ openclaw recipes move-ticket --team-id <teamId> --ticket 0007 --to testing
199
+ openclaw recipes move-ticket --team-id <teamId> --ticket 0007 --to done --completed
200
+ ```
201
+
202
+ Stages:
203
+ - `backlog` → `Status: queued`
204
+ - `in-progress` → `Status: in-progress`
205
+ - `testing` → `Status: testing`
206
+ - `done` → `Status: done` (optional `Completed:` timestamp)
207
+
208
+ ## `assign`
209
+ Assign a ticket to an owner (updates `Owner:` and creates an assignment stub).
210
+
211
+ ```bash
212
+ openclaw recipes assign --team-id <teamId> --ticket 0007 --owner dev
213
+ openclaw recipes assign --team-id <teamId> --ticket 0007 --owner lead
214
+ ```
215
+
216
+ Owners (current): `dev|devops|lead|test`.
217
+
218
+ ## `take`
219
+ Shortcut: assign + move to in-progress.
220
+
221
+ ```bash
222
+ openclaw recipes take --team-id <teamId> --ticket 0007 --owner dev
223
+ ```
224
+
225
+ ## `handoff`
226
+ QA handoff in one step: move a ticket to `work/testing/`, set `Status: testing`, assign to a tester (default `test`), and write/update the assignment stub.
227
+
228
+ ```bash
229
+ openclaw recipes handoff --team-id <teamId> --ticket 0007
230
+ openclaw recipes handoff --team-id <teamId> --ticket 0007 --tester test
231
+ ```
232
+
233
+ Notes:
234
+ - Creates `work/testing/` if missing.
235
+ - Idempotent: if the ticket is already in `work/testing/`, it won’t re-move it; it will ensure fields + assignment stub.
236
+
237
+ ## `complete`
238
+ Shortcut: move to done + ensure `Status: done` + add `Completed:` timestamp.
239
+
240
+ ```bash
241
+ openclaw recipes complete --team-id <teamId> --ticket 0007
242
+ ```
243
+
244
+ ```bash
245
+ openclaw recipes dispatch \
246
+ --team-id development-team-team \
247
+ --request "Add a customer-support team recipe" \
248
+ --owner lead
249
+ ```
250
+
251
+ Options:
252
+ - `--team-id <teamId>` (required)
253
+ - `--request <text>` (optional; prompts in TTY)
254
+ - `--owner dev|devops|lead|test` (default: `dev`)
255
+ - `--yes` (skip review prompt)
256
+
257
+ Creates (createOnly):
258
+ - `workspace-<teamId>/inbox/<timestamp>-<slug>.md`
259
+ - `workspace-<teamId>/work/backlog/<NNNN>-<slug>.md`
260
+ - `workspace-<teamId>/work/assignments/<NNNN>-assigned-<owner>.md`
261
+
262
+ Ticket numbering:
263
+ - Scans `work/backlog`, `work/in-progress`, `work/testing`, `work/done` and uses max+1.
264
+
265
+ Review-before-write:
266
+ - Prints a JSON plan and asks for confirmation unless `--yes`.
@@ -0,0 +1,80 @@
1
+ # Installation
2
+
3
+ This repo is an **OpenClaw plugin** (not a standalone CLI). OpenClaw loads it and exposes the commands under:
4
+
5
+ - `openclaw recipes ...`
6
+
7
+ ## Prerequisites
8
+ - OpenClaw installed and working (`openclaw --version`)
9
+ - Node.js available (OpenClaw uses Node to load plugins)
10
+ - (For `recipes install`) you’ll need access to ClawHub (the command runs `npx clawhub@latest ...`).
11
+
12
+ ## Install
13
+ ### Option A (preferred): install from npm
14
+ Once published, you can install directly via npm:
15
+
16
+ ```bash
17
+ openclaw plugins install @jiggai/recipes
18
+ openclaw gateway restart
19
+ openclaw plugins list
20
+ ```
21
+
22
+ ### Option B: install from GitHub
23
+ ```bash
24
+ git clone https://github.com/JIGGAI/ClawRecipes.git ~/clawrecipes
25
+ openclaw plugins install --link ~/clawrecipes
26
+ openclaw gateway restart
27
+ openclaw plugins list
28
+ ```
29
+
30
+ ### Option B: already cloned
31
+ ```bash
32
+ openclaw plugins install --link ~/clawrecipes
33
+ openclaw gateway restart
34
+ openclaw plugins list
35
+ ```
36
+
37
+ Confirm it loaded:
38
+ ```bash
39
+ openclaw plugins list
40
+ # look for id: recipes
41
+ ```
42
+
43
+ 4) Try a basic command:
44
+ ```bash
45
+ openclaw recipes list
46
+ ```
47
+
48
+ ## Updating the plugin
49
+ If you pull a newer version from GitHub, restart the gateway so OpenClaw reloads the plugin:
50
+
51
+ ```bash
52
+ cd ~/clawrecipes
53
+ git pull
54
+ openclaw gateway restart
55
+ ```
56
+
57
+ ## Uninstall / disable
58
+ If installed via local path, remove the plugin install entry and restart:
59
+
60
+ ```bash
61
+ openclaw plugins uninstall recipes
62
+ openclaw gateway restart
63
+ ```
64
+
65
+ (If `plugins uninstall` is not available in your build, remove the path from your OpenClaw config’s plugin load paths and restart.)
66
+
67
+ ## Troubleshooting
68
+ ### Plugin loads but commands are missing
69
+ - Restart: `openclaw gateway restart`
70
+ - Check: `openclaw plugins list`
71
+ - Verify `openclaw.plugin.json` exists at repo root and has `id: "recipes"`.
72
+
73
+ ### `recipes install` fails
74
+ - Run `npx clawhub@latest --help` to confirm the CLI can run.
75
+ - Ensure you are logged into ClawHub if required (`npx clawhub@latest login`).
76
+ - Confirm the install scope you intended:
77
+ - global: `~/.openclaw/skills/<skill>`
78
+ - agent: `~/.openclaw/workspace-<agentId>/skills/<skill>`
79
+ - team: `~/.openclaw/workspace-<teamId>/skills/<skill>`
80
+ - If you change installs or config, restart: `openclaw gateway restart`.
@@ -0,0 +1,127 @@
1
+ # Recipe format
2
+
3
+ Recipes are Markdown files with YAML frontmatter.
4
+
5
+ They can be:
6
+ - **agent** recipes: scaffold a single agent workspace
7
+ - **team** recipes: scaffold a team workspace and multiple agents
8
+
9
+ ## File locations
10
+ Recipes are discovered from:
11
+ - Built-in: `recipes/default/*.md` inside this plugin
12
+ - Workspace-local: `<workspaceRoot>/recipes/*.md` (default)
13
+
14
+ ## Frontmatter (common)
15
+ ```yaml
16
+ ---
17
+ id: development-team
18
+ name: Development Team
19
+ kind: team # or agent
20
+ version: 0.1.0
21
+ description: ...
22
+
23
+ requiredSkills:
24
+ - some-skill
25
+ optionalSkills:
26
+ - another-skill
27
+ ---
28
+ ```
29
+
30
+ ### `requiredSkills` / `optionalSkills`
31
+ These are **ClawHub skill slugs**.
32
+
33
+ They’re used by:
34
+ - `openclaw recipes status` (detect missing skills)
35
+ - `openclaw recipes install <recipeId>` (install the listed skills)
36
+
37
+ ## Agent recipes
38
+ Agent recipes use templates + files.
39
+
40
+ ### `templates`
41
+ A string map of template keys → template bodies.
42
+
43
+ ### `files`
44
+ Each file entry writes a file under the agent’s workspace:
45
+
46
+ ```yaml
47
+ files:
48
+ - path: SOUL.md
49
+ template: soul
50
+ mode: createOnly # or overwrite
51
+ ```
52
+
53
+ Template rendering:
54
+ - Simple `{{var}}` replacement.
55
+ - No conditionals / no code execution.
56
+
57
+ Common vars:
58
+ - `agentId`
59
+ - `agentName`
60
+
61
+ ## Team recipes
62
+ Team recipes define a team plus multiple agents:
63
+
64
+ ```yaml
65
+ team:
66
+ teamId: development-team
67
+ name: Development Team
68
+
69
+ agents:
70
+ - role: lead
71
+ name: Dev Team Lead
72
+ - role: dev
73
+ name: Software Engineer
74
+ - role: devops
75
+ name: DevOps / SRE
76
+ ```
77
+
78
+ ### Team ID and agent IDs
79
+ - **Team IDs must end with `-team`** (enforced by `scaffold-team`).
80
+ - Agent IDs default to: `<teamId>-<role>`
81
+
82
+ ### Template namespacing for teams
83
+ For team recipes, file templates are namespaced by role:
84
+ - `lead.soul`, `dev.soul`, etc.
85
+
86
+ If a `files[].template` key does not contain a `.`, ClawRecipes prefixes it with `<role>.`.
87
+
88
+ ## Cron jobs (optional)
89
+ Recipes can optionally declare cron jobs to be reconciled during `scaffold` / `scaffold-team`.
90
+
91
+ ```yaml
92
+ cronJobs:
93
+ - id: daily-review
94
+ schedule: "0 14 * * 1-5" # 5-field cron
95
+ message: "Daily review: summarize inbox + calendar for today."
96
+ enabledByDefault: false
97
+ timezone: "America/New_York" # optional
98
+ channel: "telegram" # optional (default: last)
99
+ to: "<chatId or phone>" # optional
100
+ description: "Weekday daily review"
101
+ ```
102
+
103
+ Notes:
104
+ - `cronJobs[].id` must be **stable** within the recipe; it’s used for idempotent updates.
105
+ - Safe default behavior is conservative: when `cronInstallation=prompt`, the prompt default is **No**.
106
+ - When the user opts out, jobs are installed **disabled** (so they can be enabled later).
107
+
108
+ ## Tool policy
109
+ Recipes can include tool policy, which is written into `agents.list[].tools` when `--apply-config` is used:
110
+
111
+ ```yaml
112
+ tools:
113
+ profile: coding
114
+ allow:
115
+ - group:fs
116
+ - group:web
117
+ - group:runtime
118
+ deny: []
119
+ ```
120
+
121
+ Team recipes can override tools per-agent via `agents[].tools`.
122
+
123
+ ## Recommended conventions
124
+ - Keep `requiredSkills` minimal; use `optionalSkills` for “nice to have”.
125
+ - For teams, use file-first work queues:
126
+ - `work/backlog/0001-...md` style tickets
127
+ - filename ordering is the queue ordering
@@ -0,0 +1,62 @@
1
+ # Team workflow (file-first)
2
+
3
+ ClawRecipes’ differentiator is the **shared team workspace** + a simple, durable, file-first workflow.
4
+
5
+ ## Team workspace structure
6
+ When you scaffold a team:
7
+
8
+ ```
9
+ ~/.openclaw/workspace-<teamId>/
10
+ inbox/
11
+ outbox/
12
+ shared/
13
+ notes/
14
+ work/
15
+ backlog/
16
+ in-progress/
17
+ testing/
18
+ done/
19
+ assignments/
20
+ TEAM.md
21
+ ```
22
+
23
+ ## The loop
24
+ 1) **Intake**
25
+ - New requests land in `inbox/`.
26
+
27
+ 2) **Plan**
28
+ - Convert the request into a numbered ticket in `work/backlog/`.
29
+ - Filename ordering is the priority queue.
30
+
31
+ 3) **Execute**
32
+ - Move ticket file to `work/in-progress/` (or use `take`).
33
+ - Do work; write artifacts into `shared/` or agent workspaces.
34
+
35
+ 4) **Test**
36
+ - Move ticket to `work/testing/`.
37
+ - Assign `Owner: test` (or explicitly tag the tester role) and include clear “Verification steps” in the ticket.
38
+ - Tester verifies and either:
39
+ - moves to `work/done/` (pass), or
40
+ - bounces back to `work/in-progress/` with a bug note (fail)
41
+
42
+ 5) **Complete**
43
+ - Move ticket to `work/done/` (or use `complete`).
44
+ - Add `Completed:` timestamp (automated by `complete` or `move-ticket --completed`).
45
+
46
+ ## Dispatcher command
47
+ The lead can convert a natural-language request into artifacts with:
48
+
49
+ ```bash
50
+ openclaw recipes dispatch --team-id <teamId> --request "..." --owner dev
51
+ ```
52
+
53
+ This creates:
54
+ - an inbox entry
55
+ - a backlog ticket
56
+ - an assignment stub
57
+
58
+ ## Why file-first?
59
+ - Works offline
60
+ - Easy to version control
61
+ - Easy to audit and search
62
+ - Doesn’t depend on any single UI
@@ -0,0 +1,151 @@
1
+ # Tutorial: create your first recipe
2
+
3
+ This tutorial shows how to create a **team recipe** (shared workspace + multiple agents).
4
+
5
+ You’ll learn:
6
+ - where recipes live
7
+ - how frontmatter works
8
+ - how templates/files are written
9
+ - how to scaffold a team and run the file-first workflow
10
+
11
+ ## Step 0 — confirm ClawRecipes is installed
12
+ ```bash
13
+ openclaw plugins list
14
+ openclaw recipes list
15
+ ```
16
+
17
+ ## Step 1 — create a recipe file in your OpenClaw workspace
18
+ Create:
19
+
20
+ - `~/.openclaw/workspace/recipes/my-first-team.md`
21
+
22
+ Minimal example:
23
+
24
+ ```md
25
+ ---
26
+ id: my-first-team
27
+ name: My First Team
28
+ kind: team
29
+ version: 0.1.0
30
+ description: A tiny demo team
31
+
32
+ # Optional: skill slugs to install with `openclaw recipes install my-first-team`
33
+ requiredSkills: []
34
+
35
+ team:
36
+ teamId: my-first-team
37
+
38
+ agents:
39
+ - role: lead
40
+ name: Team Lead
41
+ tools:
42
+ profile: coding
43
+ allow: ["group:fs", "group:web"]
44
+ deny: ["exec"]
45
+
46
+ - role: worker
47
+ name: Worker
48
+ tools:
49
+ profile: coding
50
+ allow: ["group:fs", "group:web"]
51
+ deny: ["exec"]
52
+
53
+ templates:
54
+ lead.soul: |
55
+ # SOUL.md
56
+
57
+ You are the lead for {{teamId}}.
58
+ Convert requests into tickets and assign work.
59
+
60
+ lead.agents: |
61
+ # AGENTS.md
62
+
63
+ Team directory: {{teamDir}}
64
+
65
+ Workflow:
66
+ - Intake: check `inbox/`
67
+ - Normalize: create tickets in `work/backlog/`
68
+ - Assign: write stubs in `work/assignments/`
69
+
70
+ worker.soul: |
71
+ # SOUL.md
72
+
73
+ You are a worker on {{teamId}}.
74
+
75
+ worker.agents: |
76
+ # AGENTS.md
77
+
78
+ Team directory: {{teamDir}}
79
+
80
+ How you work:
81
+ - Pick the lowest numbered ticket assigned to you.
82
+ - Move it to `work/in-progress/`.
83
+ - Do the work.
84
+ - When ready for QA, move it to `work/testing/` and assign Owner to `test`.
85
+ - After QA passes, move it to `work/done/` and write a short completion report.
86
+
87
+ files:
88
+ - path: SOUL.md
89
+ template: soul
90
+ mode: createOnly
91
+ - path: AGENTS.md
92
+ template: agents
93
+ mode: createOnly
94
+
95
+ # Default tools if an agent doesn’t override tools above
96
+ tools:
97
+ profile: coding
98
+ allow: ["group:fs", "group:web"]
99
+ deny: ["exec"]
100
+ ---
101
+
102
+ # My First Team
103
+
104
+ This is a demo recipe.
105
+ ```
106
+
107
+ ## Step 2 — scaffold the team
108
+ Important: team ids must end with `-team`.
109
+
110
+ ```bash
111
+ openclaw recipes scaffold-team my-first-team --team-id my-first-team-team --apply-config
112
+ ```
113
+
114
+ You should now have:
115
+ - `~/.openclaw/workspace-my-first-team-team/` (team shared workspace)
116
+ - `~/.openclaw/workspace-my-first-team-team/roles/lead/`
117
+ - `~/.openclaw/workspace-my-first-team-team/roles/worker/`
118
+
119
+ ## Step 3 — dispatch a request
120
+ ```bash
121
+ openclaw recipes dispatch \
122
+ --team-id my-first-team-team \
123
+ --request "Draft a README for the team" \
124
+ --owner worker
125
+ ```
126
+
127
+ This will propose (or write, with `--yes`) three artifacts:
128
+ - an inbox entry
129
+ - a backlog ticket
130
+ - an assignment stub
131
+
132
+ ## Step 4 — run the workflow
133
+ Tickets move through lanes:
134
+ - `work/backlog/` → `work/in-progress/` → `work/testing/` → `work/done/`
135
+
136
+ - Move the ticket from `work/backlog/` → `work/in-progress/`
137
+ - Do the work
138
+ - When ready for QA:
139
+ - Move the ticket to `work/testing/`
140
+ - Set `Owner: test` and add **Verification steps** to the ticket
141
+ - After verification:
142
+ - Move the ticket to `work/done/` and add a short completion report
143
+
144
+ ## Common mistakes
145
+ - **Forgetting the `-team` suffix** on `--team-id` (required).
146
+ - Using `deny: ["exec"]` on agents that need to run commands.
147
+ - Not restarting the gateway after installing the plugin.
148
+
149
+ ## Next steps
150
+ - Read `docs/RECIPE_FORMAT.md` for full frontmatter coverage.
151
+ - Copy and modify a bundled recipe from `docs/BUNDLED_RECIPES.md`.