allye-pi 1.5.1

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,352 @@
1
+ ---
2
+ name: technical-planning
3
+ description: Workflow for breaking a story into tasks through a structured discussion phase. Use when the user has a story and wants to plan the technical implementation.
4
+ version: "1.4"
5
+ category: methodology
6
+ ---
7
+
8
+ # Technical Planning Workflow
9
+
10
+ Turns a story into actionable tasks through a **Discussion Phase** — surfacing gray areas, capturing decisions, and writing tasks with verifiable acceptance criteria and a runnable verification command.
11
+
12
+ **Never assume — always ask.** The user knows the direction they want, sometimes only after researching further. Your job is to surface the gray areas and present real options, not to quietly pick one and present it as the plan.
13
+
14
+ ---
15
+
16
+ ## Workflow Overview
17
+
18
+ ```
19
+ Get story → Search context → Discussion Phase → Create tasks → Move story to in_progress → Save decisions
20
+ ```
21
+
22
+ ---
23
+
24
+ ## 0. Scope: one feature, story by story
25
+
26
+ The steps below plan **one story at a time** — but the unit Technical Planning hands to the Orchestrator is the **feature**. When the target feature has multiple stories (a `planning-to-technical` handover usually lists several), work through every story under that feature in sequence, one at a time, running the full workflow (Steps 1–6) for each before starting the next.
27
+
28
+ **Emit only ONE `technical-to-orchestration` handover, at the very end — after the last story in the feature is planned, never after each individual story.** That handover must cover every story and every task, grouped by wave, which is only honest once all of the feature's stories have actually been planned. If the session ends before all stories are planned, save session state (Step 6) and resume in a fresh chat — don't emit a partial feature-level handover.
29
+
30
+ ---
31
+
32
+ ## Step 1: Get the Story
33
+
34
+ Fetch the story the user wants to plan:
35
+
36
+ ```
37
+ work_get(id: "{story uuid}" or work_key: "{PROJ-123}")
38
+ ```
39
+
40
+ Read the story's description, acceptance criteria, and parent context. If the story is part of a feature/epic, understand the broader scope:
41
+
42
+ ```
43
+ work_get(work_key: "{parent feature key}")
44
+ ```
45
+
46
+ ---
47
+
48
+ ## Step 2: Search for Context
49
+
50
+ Before planning, gather all relevant context:
51
+
52
+ ```
53
+ memory_search(query: "Session State {story key}")
54
+ memory_search(query: "decision {feature/epic key}")
55
+ memory_search(query: "{technical domain} architecture")
56
+ ```
57
+
58
+ If a relevant memory ID is found and context feels sparse, traverse its neighborhood:
59
+ ```
60
+ memory_graph(memory_id: "{id}", depth: 2) → surfaces connected decisions and blockers
61
+ ```
62
+
63
+ Also check if tasks already exist for this story:
64
+
65
+ ```
66
+ work_children(id: "{story uuid}")
67
+ ```
68
+
69
+ If tasks already exist, review them instead of creating new ones. The user may want to adjust the plan, not start over.
70
+
71
+ ---
72
+
73
+ ## Step 3: Discussion Phase
74
+
75
+ <EXTREMELY_IMPORTANT>
76
+ Complete the discussion phase — surfacing ambiguity before committing to a plan —
77
+ before creating any task. Skipping it leads to rework, wrong assumptions, and
78
+ wasted effort.
79
+ </EXTREMELY_IMPORTANT>
80
+
81
+ ### 3.1 Identify Gray Areas
82
+
83
+ Read the story and identify points where there are **multiple valid approaches**. These are gray areas — questions that don't have an obvious single answer.
84
+
85
+ Examples of gray areas:
86
+ - Which library/framework to use for X?
87
+ - Should this be a separate service or part of the monolith?
88
+ - How should we handle error case Y?
89
+ - What's the data model for Z?
90
+ - Should we optimize for read speed or write speed?
91
+ - How much backward compatibility do we need?
92
+
93
+ **Mandatory:** whenever a story implies infrastructure, stack, or architecture choices, that is always a gray area to raise explicitly — never left to chance or agent discretion by default.
94
+
95
+ **Need more than a hunch to evaluate an option?** Dispatch the `deep-search` agent (web research) or the `code-analyzer` agent (analyze a public repo), both via the `Agent` tool — research is available here, not only in Sandbox. Bring findings back into the discussion before locking a decision.
96
+
97
+ ### 3.2 Present Options with Trade-offs
98
+
99
+ For each gray area, present the user with **concrete options and trade-offs**:
100
+
101
+ ```markdown
102
+ ### Gray Area: How to handle file storage
103
+
104
+ **Option A: Local filesystem**
105
+ - ✅ Simple, no external dependency
106
+ - ❌ Doesn't scale, no redundancy
107
+
108
+ **Option B: S3-compatible object storage**
109
+ - ✅ Scalable, redundant, CDN-ready
110
+ - ❌ More complex setup, network dependency
111
+
112
+ **Option C: Database BLOBs**
113
+ - ✅ Transactional consistency with other data
114
+ - ❌ Database bloat, slower queries
115
+
116
+ **My recommendation:** Option B — best balance of scalability and maintainability for this use case.
117
+ ```
118
+
119
+ ### 3.3 Capture Decisions
120
+
121
+ As the user responds, classify each decision:
122
+
123
+ | Classification | Meaning | Rule |
124
+ |---------------|---------|------|
125
+ | **Locked decision** | The user explicitly chose this | Non-negotiable. Do not change without user approval. |
126
+ | **Agent discretion** | The user deferred to you | You decide, but document your rationale. Can be revisited. |
127
+
128
+ ### 3.4 Save Decisions as Memories
129
+
130
+ Save each significant decision immediately — don't wait until the end:
131
+
132
+ ```
133
+ memory_save(
134
+ title: "Decision — {short description}",
135
+ content: "## Decision\n{what was decided}\n\n## Classification\n{locked | agent-discretion}\n\n## Why\n{rationale}\n\n## Context\nStory: {story key}\nGray area: {what was ambiguous}",
136
+ tags: ["decision", "{story-key}", "{topic}"],
137
+ sector: "decisions"
138
+ )
139
+ ```
140
+
141
+ ### 3.5 Confirm All Gray Areas Are Resolved
142
+
143
+ Before moving to task creation, confirm with the user:
144
+
145
+ > "Here's a summary of what we decided:
146
+ > 1. {decision 1} — **locked**
147
+ > 2. {decision 2} — **agent discretion**
148
+ > 3. {decision 3} — **locked**
149
+ >
150
+ > Are we good to proceed with task creation?"
151
+
152
+ Also state the story's derived dispatch label: **AFK** if every task got a runnable
153
+ verification command, **HITL** if any task declared `verification: manual`. The
154
+ Orchestrator reads this rather than guessing, so a wrong label here becomes a story
155
+ dispatched to an unattended pane that then sits waiting for a human who is not watching.
156
+
157
+ ---
158
+
159
+ ## Step 4: Create Tasks
160
+
161
+ ### 4.1 Plan the Task Breakdown
162
+
163
+ Design tasks that are:
164
+
165
+ - **Atomic** — Each task produces a single, verifiable outcome
166
+ - **Concrete** — No vague tasks like "set up the project" or "implement the feature"
167
+
168
+ **Split by concern when a story spans them.** A story touching frontend, backend, and data modeling is usually 3+ tasks, not one — the Wave mechanic below (4.4) handles the ordering (e.g., data modeling before frontend when the payload shape is a hard dependency). These are illustrative categories, not a fixed taxonomy: decide the actual split with the user, scenario by scenario.
169
+
170
+ <!-- adapted from superpowers:writing-plans task right-sizing (MIT) -->
171
+ **Right-size each task**: the smallest unit that carries its own test cycle and is worth a fresh reviewer's gate. Fold setup/config into the task whose deliverable needs it; split only where a reviewer could reject one task while approving its neighbor.
172
+
173
+ ### 4.2 Deep Work Rule
174
+
175
+ <HARD-GATE>
176
+ Every task carries verifiable acceptance criteria in its description — a task
177
+ without them is not a task, it's a wish.
178
+ </HARD-GATE>
179
+
180
+ ### 4.2.1 Verification Rule
181
+
182
+ <HARD-GATE>
183
+ Every task carries a `## Verification` block: either a command that runs as
184
+ written, or `verification: manual` with the procedure. A task with neither
185
+ is not a task — a criterion nobody can check is a criterion nobody will.
186
+
187
+ Write the command while you still have the design in your head. Deferring it
188
+ to the Executor means it gets written by someone reconstructing your intent
189
+ from a description.
190
+
191
+ `verification: manual` is a legitimate answer for visual, infrastructure, and
192
+ one-off work — see `verification-loop` §4. It is not a shortcut for "I did not
193
+ want to think of a command": declaring it makes the whole story HITL, which
194
+ costs the Orchestrator its ability to dispatch that story unattended.
195
+ </HARD-GATE>
196
+
197
+ ### 4.2.2 No Placeholders
198
+
199
+ <HARD-GATE>
200
+ A task description contains what someone needs to do the work, not a promise to supply it
201
+ later. These are defects in a task, not shorthand:
202
+
203
+ - "TBD", "TODO", "details to follow"
204
+ - "Add appropriate error handling" — which errors, handled how?
205
+ - "Handle edge cases" — which ones? An edge case nobody named is an edge case nobody covers.
206
+ - "Similar to {other task}" — say it again here. Tasks are read in isolation and out of order.
207
+ - A criterion naming a type, function, or file that no task defines and no `Interfaces`
208
+ block produces.
209
+
210
+ Each of these reads as complete and defers the actual decision to whoever implements — who
211
+ has less context than you do right now, and no way to ask you.
212
+ </HARD-GATE>
213
+
214
+ ### 4.3 Task Description Template
215
+
216
+ ```markdown
217
+ ## What
218
+ {Concrete description of what to implement}
219
+
220
+ ## Acceptance Criteria
221
+ - [ ] {Criterion 1 — observable and testable}
222
+ - [ ] {Criterion 2}
223
+ - [ ] {Criterion 3}
224
+
225
+ ## Verification
226
+ {The exact command, runnable as written. It must be red-capable, deterministic,
227
+ fast, and agent-runnable — see the `verification-loop` skill §1.}
228
+
229
+ {or, when no such command exists:}
230
+ verification: manual
231
+ {the exact procedure a human follows, and what they should observe}
232
+
233
+ ## Files Likely Involved
234
+ - {file/path/1}
235
+ - {file/path/2}
236
+
237
+ ## Dependencies
238
+ - {Depends on TASK-XX} or "None — can be done independently"
239
+
240
+ ## Interfaces
241
+ **Consumes:** {names, types, and signatures this task calls that another task in this story
242
+ produces — or "Nothing from other tasks"}
243
+ **Produces:** {names, types, and signatures other tasks will call. Exact, not descriptive:
244
+ `createSession(userId: string): Session`, not "a session creator".}
245
+
246
+ ## Decisions Applied
247
+ - {Reference locked/agent-discretion decisions from discussion phase}
248
+ ```
249
+
250
+ The `Interfaces` block exists because whoever implements a task sees **only that task**.
251
+ Dependencies tell them what must finish first; interfaces tell them what to call when it
252
+ has. Writing "a session creator" instead of the signature moves the naming decision to
253
+ whoever implements second, and they will name it something else.
254
+
255
+ ### 4.4 Analyze Dependencies
256
+
257
+ Group tasks into **waves** based on dependencies:
258
+
259
+ ```
260
+ Wave 1 (independent — can be done in any order):
261
+ - Task A: Set up database schema
262
+ - Task B: Create API route structure
263
+
264
+ Wave 2 (depends on Wave 1):
265
+ - Task C: Implement CRUD endpoints (depends on A + B)
266
+ - Task D: Add input validation (depends on B)
267
+
268
+ Wave 3 (depends on Wave 2):
269
+ - Task E: Write integration tests (depends on C + D)
270
+ ```
271
+
272
+ Present the wave structure to the user so they understand the execution order.
273
+
274
+ ### 4.5 Create Tasks via Bulk Create
275
+
276
+ ```
277
+ work_bulk_create(work_items: [
278
+ {
279
+ "temp_id": "task-1",
280
+ "title": "Set up database schema for {feature}",
281
+ "item_type": "task",
282
+ "work_category": "backend",
283
+ "parent_key": "{STORY-KEY}",
284
+ "description": "{full description with acceptance criteria}"
285
+ },
286
+ {
287
+ "temp_id": "task-2",
288
+ "title": "Create API route structure for {feature}",
289
+ "item_type": "task",
290
+ "work_category": "backend",
291
+ "parent_key": "{STORY-KEY}",
292
+ "description": "{full description with acceptance criteria}"
293
+ }
294
+ ])
295
+ ```
296
+
297
+ **Reminder:** Maximum 50 items per `work_bulk_create` call.
298
+
299
+ ---
300
+
301
+ ## Step 5: Move Story to In Progress
302
+
303
+ ```
304
+ work_status_next(id: "{story uuid}")
305
+ ```
306
+
307
+ Once tasks are created and the plan is approved, this moves the story forward in the
308
+ board progression (typically backlog/todo → in_progress).
309
+
310
+ ---
311
+
312
+ ## Step 6: Save Planning Summary
313
+
314
+ Save a comprehensive planning memory:
315
+
316
+ ```
317
+ memory_save(
318
+ title: "Technical Plan — {STORY-KEY} {story title}",
319
+ content: "## Story\n{story key and title}\n\n## Decisions\n{list of locked and agent-discretion decisions}\n\n## Task Breakdown\n{wave structure with task keys}\n\n## Execution Order\n{which tasks first, which depend on what}\n\n## Risks\n{identified risks or uncertainties}",
320
+ tags: ["planning", "technical-plan", "{story-key}"],
321
+ sector: "plans"
322
+ )
323
+ ```
324
+
325
+ ---
326
+
327
+ ## Workflow Checklist
328
+
329
+ Before considering technical planning complete, verify:
330
+
331
+ - [ ] Story was read and understood in its full context
332
+ - [ ] Existing memories and decisions were searched
333
+ - [ ] Gray areas were identified and discussed with the user
334
+ - [ ] All decisions are classified (locked vs agent-discretion) and saved as memories
335
+ - [ ] Tasks have verifiable acceptance criteria
336
+ - [ ] Every task has a `## Verification` block — a runnable command, or `verification: manual` with a procedure
337
+ - [ ] Every task's `Interfaces` block names exact signatures, not descriptions
338
+ - [ ] No task description contains a placeholder or an unnamed edge case
339
+ - [ ] The story's AFK/HITL label is derived and stated
340
+ - [ ] Dependencies are mapped and wave structure is defined
341
+ - [ ] Tasks are created in Allye with proper parent relationship
342
+ - [ ] Story is moved to in_progress
343
+ - [ ] Planning summary is saved as memory
344
+ - [ ] All of the feature's stories are planned before the `technical-to-orchestration` handover is emitted (see §0)
345
+
346
+ ---
347
+
348
+ ## What Comes Next
349
+
350
+ **If the feature has more stories still unplanned, go back to Step 1 for the next story — no handover yet (see §0).**
351
+
352
+ Once the last story in the feature is planned, emit a **`technical-to-orchestration`** handover (see the `handover-protocol` skill) for the Orchestrator. Spell out the full reading list — doc, epic, feature, every story, every task, grouped by wave — and every locked architecture decision, across all the stories planned in this cycle. The Orchestrator has no other context; a vague pointer here becomes its problem later.
@@ -0,0 +1,303 @@
1
+ ---
2
+ name: tools-quickref
3
+ description: Complete quick reference for all Allye MCP tools and their actions with parameters, plus the concrete gotchas that cause silent failures or confusing errors. Use when you need to know how to call a specific Allye tool, or you hit an unexpected error/behavior from one.
4
+ version: "2.3"
5
+ category: reference
6
+ ---
7
+
8
+ # Allye Tools Quick Reference
9
+
10
+ ---
11
+
12
+ ## Gotchas (read this first if something didn't work as expected)
13
+
14
+ <!-- mined directly from the allye-mcp source, not guessed — see allye_mcp/application/tools/*.py -->
15
+
16
+ - **`work_create`/`work_bulk_create` require `work_category`**, even though it looks optional next to `item_type`. Omit it and the call fails, listing the full valid-category enum back to you (see below).
17
+ - **Item types include more than the obvious five**: `epic`, `feature`, `story`, `bug`, `hotfix`, `task`, `spike`, `subtask` — not just epic/feature/story/task/bug.
18
+ - **Assigning to someone else is two calls, not one.** `work_assign_to_me` only covers yourself. For anyone else: `team_members` (via `team`) to resolve their user id, then `work_update(id, assignee_id: "<their id>")`.
19
+ - **`work_update(id, work_status: "<status uuid>")` jumps directly to any status in one call** — not limited to one step forward. Fixed in allye-mcp commit `b9b6281` (2026-06-15, `develop`) after being a silent no-op; if a memory or doc claims status/assignee can't be set via `work_update`, that's stale. `work_status_next`/`work_status_done` remain valid for stepwise or done-jump flows; `work_update` is the direct alternative when you already know the target status id.
20
+ - **`work_update` still does NOT accept `parent_key`/`parent_id`.** Re-parenting is create-time only (`work_create`, `work_bulk_create`) — the `work_update` action in `work_items.py` never reads `payload.parent_key`, so passing it is silently ignored, not an error. Don't assume the 2026-06-15 status/assignee fix extended to parent.
21
+ - **`work_status_next` moves forward only.** It errors if the item is already at the last status in the board's progression, and there's no `work_status_prev`. Use `work_status_done` to jump straight to done regardless of current position, or `work_update(work_status: ...)` to jump to any specific status. See the `allye-board-progression` skill for the full resolution logic.
22
+ - **`work_bulk_create` caps at 50 items per call**, and each item takes `parent_temp_id` (reference another item in the same batch) **or** `parent_key` (reference an existing item) — never both on the same item.
23
+ - **`doc_create` needs `doc_emoji`** for every type except `folder` — check `doc_full_tree` for placement before creating, always; don't guess a parent location.
24
+ - **`memory_save` never silently fails or duplicates.** Every save resolves to one of four outcomes (`created`/`updated`/`superseded`/`noop` — see §intelligence). Treat `noop` as "already known," not an error to reword-and-retry past.
25
+ - **`memory_save` does not link a memory to a work item.** There is no `work_item_id` or `sprint_id` parameter — not on the MCP tool (`IntelligenceRequest`), not in its domain layer, and not on the backend's `SaveMemoryDto`. Passing them is silently discarded, not an error. To make a memory findable from a work item, put the key in `tags` and in the `title`.
26
+ - **Memory `sector` determines scope automatically — you never set scope directly** (mapping in §intelligence). Passing it wrong is the #1 way a memory ends up invisible to the rest of the team.
27
+ - **The memory relocation flow is one-time per user, ever** — always check `alreadyPrompted` on `memory_relocation_candidates` before offering it; offering it twice is exactly the nagging behavior the guard exists to prevent.
28
+ - **`initialize` returns `profile.user.id`** — the reliable way to know "who's currently logged in" when deciding self-assignment vs. assigning to someone else.
29
+ - **`work_statuses` omits `position`, `pipeline`, and `description`.** All three exist on the
30
+ record — `allye-api/prisma/seed-workflow.ts` writes them — but the MCP formatter
31
+ (`allye_mcp/application/tools/work_items.py:590-597`) emits only name, key, id, and colour.
32
+ You therefore cannot compute a status's place in the pipeline, nor tell a `product` status
33
+ from an `engineering` one, from this call.
34
+ - **`board_columns` gives no status mapping and no ordering.** Names and ids only. Since
35
+ `work_status_next` walks the board's visible ordered statuses, the transition it will make
36
+ cannot be predicted from the MCP surface. **Move one status, then read the item back.**
37
+ - **`team_switch` does not stick for every tool.** It reports that subsequent calls will use
38
+ the chosen team, but `work_children` still errors with "Team selection required", and
39
+ `work_list` returns items across teams. Pass `team_id` explicitly on any call whose result
40
+ must be team-scoped.
41
+
42
+ For the full memory methodology (when to search, when to save, sector selection, the `/save` protocol, graph traversal), see the `allye-memory-protocol` skill — this file only covers the action-level API surface.
43
+
44
+ ---
45
+
46
+ ## work_items
47
+
48
+ Manage work items: epics, features, stories, tasks, bugs, hotfixes, spikes, subtasks.
49
+
50
+ | Action | Description | Key Parameters |
51
+ |--------|-------------|----------------|
52
+ | `work_create` | Create a single work item | `work_title`*, `work_type`*, `work_category`*, `work_description`, `parent_key`, `work_priority`, `story_points` |
53
+ | `work_list` | List/search work items | `query`, `work_type`, `work_status` (status UUID — look up via `work_statuses()` first), `limit`, `offset` |
54
+ | `work_get` | Get a work item by ID or key | `id` or `work_key`* |
55
+ | `work_update` | Update a work item | `id`*, `work_title`, `work_description`, `work_priority`, `story_points`, `assignee_id`, `work_status` (status UUID — jumps straight to that status, any distance, not just one step), `work_due_date`, `work_tags`. **Not accepted:** `parent_key`/`parent_id` — re-parenting is create-time only |
56
+ | `work_children` | List child items of a parent | `id`* |
57
+ | `work_assign_to_me` | Assign a work item to yourself | `id`* |
58
+ | `work_status_next` | Move to next status in board progression (forward-only, errors at the last status) | `id`* |
59
+ | `work_status_done` | Move directly to done status | `id`* |
60
+ | `work_mine` | List items assigned to you | `limit`, `offset` (no status or item-type filter — not exposed by this action) |
61
+ | `work_bulk_create` | Create multiple items at once (max 50) | `work_items`* (array with `temp_id`, `title`, `item_type`, `work_category`, `parent_temp_id` **or** `parent_key`) |
62
+ | `work_statuses` | List all available statuses | — |
63
+
64
+ **Item types:** `epic`, `feature`, `story`, `bug`, `hotfix`, `task`, `spike`, `subtask`
65
+ **Priority values:** `critical`, `high`, `medium`, `low`
66
+ **Status categories:** `backlog`, `todo`, `in_progress`, `testing`, `review`, `deploying`, `done`, `cancelled`
67
+ **`work_category` is required on every create call** — values: `backend`, `frontend`, `mobile`, `fullstack`, `devops`, `infra`, `platform`, `sre`, `database`, `security`, `data`, `analytics`, `ai_ml`, `qa`, `automation`, `design`, `research`, `product`, `project`, `agile`, `support`, `operations`, `documentation`, `training`, `architecture`, `planning`, `development`
68
+
69
+ ---
70
+
71
+ ## boards
72
+
73
+ View boards and understand status progression.
74
+
75
+ | Action | Description | Key Parameters |
76
+ |--------|-------------|----------------|
77
+ | `board_list` | List all boards | `limit`, `offset` |
78
+ | `board_favorites` | List favorite boards | — |
79
+ | `board_get` | Get board details | `board_id`* |
80
+ | `board_columns` | Get board columns with statuses | `board_id`* |
81
+
82
+ ---
83
+
84
+ ## sprints
85
+
86
+ Manage sprint cycles.
87
+
88
+ | Action | Description | Key Parameters |
89
+ |--------|-------------|----------------|
90
+ | `sprint_list` | List all sprints | `limit`, `offset` (no `status` filter — not exposed by this action) |
91
+ | `sprint_active` | Get the currently active sprint | — |
92
+ | `sprint_get` | Get sprint details | `sprint_id`* |
93
+ | `sprint_work_items` | List work items in a sprint | `sprint_id`* |
94
+
95
+ ---
96
+
97
+ ## docs
98
+
99
+ Documentation pages and folders with tree navigation.
100
+
101
+ | Action | Description | Key Parameters |
102
+ |--------|-------------|----------------|
103
+ | `doc_create` | Create a document | `doc_title`*, `doc_emoji`* (required unless `doc_type` is `folder`), `doc_type` (`folder`/`page`/`api_doc`/`guide`, defaults to `page` if omitted), `doc_content`, `doc_parent_id` |
104
+ | `doc_list` | List documents | `limit`, `offset` |
105
+ | `doc_get` | Get document by ID | `id`* (always returns full content — `return_content` has no effect on this action) |
106
+ | `doc_update` | Update a document | `id`*, `doc_title`, `doc_content`, `doc_description` |
107
+ | `doc_delete` | Delete a document | `id`* |
108
+ | `doc_roots` | List root-level documents | — |
109
+ | `doc_recent` | List recently modified documents | `limit` |
110
+ | `doc_analytics` | Get document analytics (team-wide only, not per-document) | `team_id` (optional) |
111
+ | `doc_children` | List children of a document | `id`* |
112
+ | `doc_tree` | Get document tree from a root | `id`* |
113
+ | `doc_full_tree` | Get the entire document tree | — |
114
+ | `doc_move` | Move a document | `id`*, `doc_parent_id`, `doc_position` |
115
+ | `doc_publish` | Publish a document | `id`* |
116
+ | `doc_version` | Create a version snapshot | `id`*, `doc_version`* |
117
+ | `doc_duplicate` | Duplicate a document | `id`*, `doc_title`* |
118
+
119
+ **Doc types:** `folder`, `page`, `api_doc`, `guide`
120
+
121
+ ---
122
+
123
+ ## intelligence
124
+
125
+ Semantic memory system for cross-session continuity. **Full methodology (when/what to save, sector selection, the `/save` protocol) lives in the `allye-memory-protocol` skill — this is the action-level reference only.**
126
+
127
+ | Action | Description | Key Parameters |
128
+ |--------|-------------|----------------|
129
+ | `memory_save` | Save a memory (conflict-resolved, never a blind duplicate) | `title`*, `content`* (markdown), `tags`* (array), `sector` (default `knowledge`) |
130
+ | `memory_search` | Semantic search for memories | `query`* (natural language), `limit` (1-20), `tags`, `sector`, `scope` (`personal`\|`team`), `include_graph` (bool), `graph_depth` (1-5), `return_content` (bool) |
131
+ | `memory_graph` | BFS graph traversal from a memory node | `memory_id`* (UUID), `depth` (1-5, default 1), `relation_types` (filter), `include_invalidated` (bool), `graph_limit` (1-200) |
132
+ | `memory_relations` | 1-hop direct relations of a memory | `memory_id`* (UUID), `direction` (outgoing\|incoming\|both), `relation_types`, `include_invalidated` (bool) |
133
+ | `memory_preferences` | Load the user's pinned `preferences`-sector memories (not a search — fixed budget, no query needed) | — |
134
+ | `memory_relocation_candidates` | Step 1 of the one-time personal→team relocation flow — lists pre-sector-system memories with suggestions | `limit`, `offset` |
135
+ | `memory_relocation_apply` | Step 2 — apply the user-approved subset of relocation candidates | `relocations`* (array of `{memoryId, sector, teamId?}`) |
136
+ | `memory_relocation_dismiss` | "Not now" path for the relocation flow — sets the one-time marker without moving anything | — |
137
+
138
+ **Sectors** (pass `sector` on every save — omitting it defaults to `knowledge`, which is rarely what you want): `decisions`, `sessions`, `patterns`, `incidents`, `plans`, `knowledge`, `preferences`. Scope is derived automatically: `sessions`/`preferences` are always personal; the other five are always team — there is no separate `scope` parameter on save.
139
+
140
+ **`memory_save` outcomes** — every save resolves to exactly one of these (no blind-reject-by-similarity):
141
+ - `created` — new, independent memory
142
+ - `updated` — non-destructive merge into an existing memory
143
+ - `superseded` — new memory created, old one invalidated (kept for audit)
144
+ - `noop` — already fully captured; nothing written, response points at the existing memory
145
+
146
+ **Search behavior:**
147
+ - Uses AI embeddings, NOT keyword matching — write queries like natural language, not keyword lists
148
+ - Results ranked by semantic similarity
149
+ - `include_graph=true` returns `relatedMemories[]` alongside each result (1-hop neighbors)
150
+ - `return_content=false` by default (2-phase retrieval — metadata only, faster)
151
+
152
+ **Graph traversal tips:**
153
+ - After `memory_search`, use `memory_graph(memory_id, depth: 2)` to explore connected context
154
+ - Use `memory_relations` for a quick 1-hop check (faster than BFS)
155
+ - If timeout (408): reduce `depth`, add `relation_types` filter, or add `graph_limit`
156
+ - Relation types: `similar | extends | caused_by | supersedes | contradicts | depends_on`
157
+
158
+ ---
159
+
160
+ ## productivity
161
+
162
+ Personal TODO management. **The `todo_` prefix is only on action names — the fields themselves are NOT prefixed** (it's `title`/`content`, not `todo_title`/`todo_description`).
163
+
164
+ | Action | Description | Key Parameters |
165
+ |--------|-------------|----------------|
166
+ | `todo_create` | Create a TODO | `title`*, `content`* (markdown, required — not optional), `status`, `priority`, `category`, `tags`, `due_date` |
167
+ | `todo_list` | List TODOs (no status filter → returns pending + in_progress merged, not everything) | `status`, `category`, `priority`, `limit`, `offset` |
168
+ | `todo_get` | Get TODO by ID | `id`* |
169
+ | `todo_update` | Update a TODO | `id`*, `title`, `content`, `status`, `priority`, `category`, `tags`, `due_date` |
170
+ | `todo_delete` | Delete a TODO | `id`* |
171
+ | `todo_stats` | Get TODO statistics | — |
172
+ | `todo_search` | Search TODOs | `query`* |
173
+ | `todo_overdue` | List overdue TODOs | — |
174
+ | `todo_upcoming` | List upcoming TODOs | `days` (1-30) |
175
+ | `todo_categories` | List available categories | — |
176
+ | `todo_tags` | List used tags | — |
177
+ | `todo_help` | Show TODO help | — |
178
+
179
+ **`status` values:** `pending` (shown as "backlog" in the UI), `in_progress`, `completed`, `cancelled` — there is no separate boolean "completed" flag, status IS the completion state.
180
+ **`priority` values:** `low`, `medium`, `high`, `urgent`.
181
+
182
+ ---
183
+
184
+ ## skills
185
+
186
+ Manage and export workflow skills.
187
+
188
+ | Action | Description | Key Parameters |
189
+ |--------|-------------|----------------|
190
+ | `skill_create` | Create a skill | `skill_name`*, `skill_content`*, `skill_scope`*, `skill_category`*, `skill_description`, `skill_slug` (auto-generated if omitted), `skill_team_id` (required when `skill_scope: "team"`) |
191
+ | `skill_list` | List/search skills | `query`, `skill_scope`, `limit`, `offset` |
192
+ | `skill_get` | Get skill by ID | `skill_id`* or `id`* |
193
+ | `skill_update` | Update a skill | `skill_id`* or `id`*, `skill_name`, `skill_content`, `skill_description`, `skill_category`, `skill_is_active` |
194
+ | `skill_delete` | Delete a skill | `skill_id`* or `id`* |
195
+ | `skill_marketplace` | Browse marketplace skills | `query`, `limit`, `offset` |
196
+ | `skill_fork` | Fork a marketplace skill | `skill_id`* or `id`*, `skill_scope`* (only `personal`/`team`/`organization` — no `marketplace`) |
197
+ | `skill_export` | Export a skill in agent format | `skill_id`* or `id`*, `skill_export_format`* |
198
+ | `skill_import_github` | Import skill from GitHub | `repo_url`* |
199
+ | `skill_install` | Install a skill | `skill_id`* or `id`* |
200
+ | `skill_export_merged` | Export multiple skills merged | `skill_ids`*, `skill_export_format`* |
201
+
202
+ **`skill_create` requires all three of `skill_content`, `skill_scope`, and `skill_category`** — easy to miss since only `skill_name` reads as obviously required.
203
+ **Export formats:** `cursor`, `claude`, `copilot`, `windsurf`, `opencode`, `codex`, `gemini`
204
+ **Skill scopes (create):** `personal`, `team`, `organization`, `marketplace`
205
+ **Skill categories:** `frontend`, `backend`, `mobile`, `fullstack`, `devops`, `infrastructure`, `architecture`, `code_review`, `testing`, `security`, `documentation`, `performance`, `other`
206
+
207
+ ---
208
+
209
+ ## team
210
+
211
+ Team management, switching, and member lookup.
212
+
213
+ | Action | Description | Key Parameters |
214
+ |--------|-------------|----------------|
215
+ | `team_help` | Show team management help | — |
216
+ | `team_switch` | Switch active team | `team_query`* (name, prefix, or ID — partial match supported) |
217
+ | `team_list` | List available teams | — |
218
+ | `team_current` | Show current active team | — |
219
+ | `team_members` | List active members of a team — **the way to resolve a user id for `work_update(assignee_id: ...)`** | `team_query` (optional — defaults to the active team) |
220
+
221
+ ---
222
+
223
+ ## user_config
224
+
225
+ Personal configuration documents ("Core Documents"). **The title field is `name`, not `title`** — a common mix-up since every other tool in this reference uses `title`.
226
+
227
+ | Action | Description | Key Parameters |
228
+ |--------|-------------|----------------|
229
+ | `create` | Create a config document | `name`*, `content`*, `mode_id`, `is_default`, `metadata` |
230
+ | `list` | List config documents | `limit`, `offset`, `return_content` |
231
+ | `get` | Get config document | `id`* |
232
+ | `update` | Update config document | `id`*, `name`, `content`, `mode_id`, `is_default`, `metadata` |
233
+ | `delete` | Delete config document | `id`* |
234
+ | `help` | Show help | — |
235
+
236
+ ---
237
+
238
+ ## api_catalog
239
+
240
+ Browse API endpoint documentation.
241
+
242
+ | Action | Description | Key Parameters |
243
+ |--------|-------------|----------------|
244
+ | `api_catalog_search` | Search API endpoints | `query`* |
245
+ | `api_catalog_list` | List all endpoints | `limit`, `offset` |
246
+ | `api_catalog_get` | Get endpoint details | `api_spec_id`* or `id`* |
247
+
248
+ ---
249
+
250
+ ## initialize
251
+
252
+ Bootstrap Allye environment.
253
+
254
+ | Action | Description | Key Parameters |
255
+ |--------|-------------|----------------|
256
+ | `init` | Initialize/reload Allye environment, profile, and core documents. Returns `profile.user.id` — the way to resolve "who's logged in" | `include_user_docs` (bool, default `true` — set `false` for a lighter payload when you don't need personal documents) |
257
+
258
+ ---
259
+
260
+ ## health
261
+
262
+ **Not an action-based tool** — unlike everything else in this reference, there's no `action` parameter and no sub-actions. The tool itself is the check.
263
+
264
+ | Tool name | Description | Parameters |
265
+ |-----------|-------------|------------|
266
+ | `allye_health_check` | Check Allye backend health status | none |
267
+
268
+ ---
269
+
270
+ ## Common Patterns
271
+
272
+ ### Create a full work item hierarchy
273
+
274
+ ```
275
+ 1. work_create(work_title: "Epic", work_type: "epic") → get epic key
276
+ 2. work_bulk_create(work_items: [features + stories]) → parent_key: epic key
277
+ ```
278
+
279
+ ### Track progress on a task
280
+
281
+ ```
282
+ 1. work_get(work_key: "TASK-123") → read task details
283
+ 2. work_status_next(id: "...") → move to in_progress
284
+ 3. ... do the work ...
285
+ 4. work_status_done(id: "...") → mark complete
286
+ ```
287
+
288
+ Stepwise `work_status_next` is still the right default while work is actually progressing through each stage. To jump straight to a known target instead — correcting a status that's out of sync, for example — use `work_update(id: "...", work_status: "<target status uuid>")` from `work_statuses()` (see the Gotchas entry above).
289
+
290
+ ### Find and resume previous work
291
+
292
+ ```
293
+ 1. memory_search(query: "Session State") → find last session
294
+ 2. work_mine() → find active items (no status/type filter available)
295
+ 3. work_get(id: "...") → load item details
296
+ ```
297
+
298
+ ### Create documentation for a feature
299
+
300
+ ```
301
+ 1. doc_full_tree() → find where to place it
302
+ 2. doc_create(doc_title: "...", doc_type: "page", doc_emoji: "📄", doc_parent_id: "...")
303
+ ```