expedait-cli 0.3.0__tar.gz → 0.4.0__tar.gz

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.
Files changed (52) hide show
  1. expedait_cli-0.4.0/CHANGELOG.md +92 -0
  2. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/PKG-INFO +108 -2
  3. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/README.md +106 -0
  4. expedait_cli-0.4.0/expedait_cli/client.py +411 -0
  5. expedait_cli-0.4.0/expedait_cli/commands/context_cmd.py +160 -0
  6. expedait_cli-0.4.0/expedait_cli/commands/deliverables.py +524 -0
  7. expedait_cli-0.4.0/expedait_cli/commands/processes.py +603 -0
  8. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/expedait_cli/commands/projects.py +25 -4
  9. expedait_cli-0.4.0/expedait_cli/commands/roles.py +196 -0
  10. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/expedait_cli/main.py +4 -0
  11. expedait_cli-0.4.0/expedait_cli/ops.py +203 -0
  12. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/pyproject.toml +2 -2
  13. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/tests/test_client.py +34 -0
  14. expedait_cli-0.4.0/tests/test_commands/test_context_files.py +140 -0
  15. expedait_cli-0.4.0/tests/test_commands/test_deliverables_write.py +203 -0
  16. expedait_cli-0.4.0/tests/test_commands/test_processes.py +174 -0
  17. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/tests/test_commands/test_projects.py +37 -16
  18. expedait_cli-0.4.0/tests/test_commands/test_roles.py +90 -0
  19. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/uv.lock +1 -1
  20. expedait_cli-0.3.0/CHANGELOG.md +0 -35
  21. expedait_cli-0.3.0/expedait_cli/client.py +0 -184
  22. expedait_cli-0.3.0/expedait_cli/commands/context_cmd.py +0 -40
  23. expedait_cli-0.3.0/expedait_cli/commands/deliverables.py +0 -245
  24. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/.github/workflows/ci.yml +0 -0
  25. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/.github/workflows/publish.yml +0 -0
  26. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/.gitignore +0 -0
  27. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/CLAUDE.md +0 -0
  28. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/LICENSE +0 -0
  29. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/expedait_cli/__init__.py +0 -0
  30. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/expedait_cli/auth.py +0 -0
  31. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/expedait_cli/commands/__init__.py +0 -0
  32. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/expedait_cli/commands/auth_cmd.py +0 -0
  33. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/expedait_cli/commands/comments.py +0 -0
  34. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/expedait_cli/commands/init_cmd.py +0 -0
  35. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/expedait_cli/commands/objectives.py +0 -0
  36. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/expedait_cli/commands/review.py +0 -0
  37. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/expedait_cli/config.py +0 -0
  38. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/expedait_cli/formatters.py +0 -0
  39. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/expedait_cli/settings.py +0 -0
  40. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/tests/__init__.py +0 -0
  41. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/tests/conftest.py +0 -0
  42. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/tests/test_auth.py +0 -0
  43. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/tests/test_commands/__init__.py +0 -0
  44. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/tests/test_commands/test_auth_cmd.py +0 -0
  45. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/tests/test_commands/test_comments.py +0 -0
  46. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/tests/test_commands/test_context.py +0 -0
  47. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/tests/test_commands/test_deliverables.py +0 -0
  48. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/tests/test_commands/test_init_cmd.py +0 -0
  49. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/tests/test_commands/test_objectives.py +0 -0
  50. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/tests/test_commands/test_review.py +0 -0
  51. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/tests/test_config.py +0 -0
  52. {expedait_cli-0.3.0 → expedait_cli-0.4.0}/tests/test_settings.py +0 -0
@@ -0,0 +1,92 @@
1
+ # Changelog
2
+
3
+ ## 0.4.0
4
+
5
+ Bring the CLI to parity with the hosted MCP server's write surface — agents can
6
+ now create and adapt content, processes, and roles, not just read them. Every
7
+ new command supports `--format json` and reports a per-op summary.
8
+
9
+ ### Added
10
+ - **Deliverable writes** (mirror MCP `write_deliverable`):
11
+ - `deliverables write --ops @file.json` — ordered batch of `create` / `edit` /
12
+ `rename` / `save_version` / `set_state` ops, chainable with `id="$last"` or
13
+ named refs (`ref="x"` on create, `id="@x"` later). Pre-flight validates op
14
+ shape and reference ordering; ops stop on first failure (rest `skipped`) and
15
+ the command exits non-zero on partial failure.
16
+ - Ergonomic subcommands on top: `deliverables create`, `edit`, `rename`,
17
+ `save-version`, `set-state` (states: Not Started, In Progress, Review,
18
+ Approved, Completed, Final). `--content` / `--instructions` accept `@file`,
19
+ `-` (stdin), or a literal.
20
+ - **`processes` command group** (mirror MCP `list_processes` / `get_process` /
21
+ `write_process`): `processes list`, `processes get PROCESS_ID` (full template
22
+ tree — phases, rows, deliverable-type cards, owner roles, objective
23
+ subprocesses), and `processes write --ops` (create/update/delete process,
24
+ phases, rows, deliverable types; `set_dependencies`; `set_owner_roles`). Named
25
+ refs, optional card layout with auto-placement (`after_type_id` / append),
26
+ role-name resolution, and an in-use delete guard (`confirm_in_use`).
27
+ - **`roles` command group** (mirror MCP `list_roles` / `write_role`):
28
+ `roles list`, `roles create`, `roles update`, `roles delete`, and
29
+ `roles write --ops`.
30
+ - **Context-file management** under the `context` group — manage the uploaded
31
+ files that feed a deliverable's (or objective's) LLM context: `context files`
32
+ (list), `context add` (upload; re-upload by name replaces), `context
33
+ file-content` (parsed text), `context download-file`, `context remove-file`,
34
+ and `context set-file --exclude/--include` (toggle a file in/out of the LLM
35
+ context). External source links remain web-app integration flows.
36
+ - `expedait_cli/ops.py` — shared multi-op engine (`RefResolver`, `run_ops`,
37
+ `render_ops`) behind all three write surfaces, mirroring the MCP server's
38
+ `_common.py` run-ops scaffold.
39
+ - `client.BackendError` + an op-safe request path so per-op failures are
40
+ captured and reported instead of aborting the whole command.
41
+ - `deliverables types` — list deliverable types so you can find the `--type` id
42
+ that `deliverables create` needs.
43
+ - `projects workspace [PROJECT_ID]` — deliverables grouped by phase (mirrors the
44
+ MCP `get_project_workspace` tool); the structure-aware view the flat
45
+ `deliverables list` can't give.
46
+
47
+ ### Fixed
48
+ - `processes write` no longer crashes with an uncaught `KeyError` when an
49
+ `update_phase_row` op omits `position`; it now reports a clean per-op
50
+ `missing_field` error.
51
+ - `--content` / `--instructions` / `--ops` with a missing or unreadable `@file`
52
+ now raise a clear usage error instead of leaking an `OSError` traceback. The
53
+ three duplicate readers were consolidated into one helper (`ops.read_value_arg`).
54
+ - `projects download` no longer crashes. It passed a `fmt=` argument that the
55
+ client method never accepted (a `TypeError` on every run, hidden by a loosely
56
+ mocked test). The backend `/download` endpoint has no format parameter, so the
57
+ dead `--download-format` option was removed; the command always extracts the
58
+ markdown + images ZIP.
59
+
60
+ ## 0.3.0
61
+
62
+ Adapt the CLI to the product's four-primitive domain model (objectives,
63
+ deliverables, context, review).
64
+
65
+ ### Added
66
+ - `deliverables` command group (`list`, `get`, `inspect`, `download`) — the
67
+ rename of `pages`, pointed at `/api/v1/deliverables/...`.
68
+ - `deliverables get --include` — comma-separated section reads (`meta`,
69
+ `content`, `template`, `requirements`, `writer_instructions`, `dependencies`,
70
+ `external_context`, `score`, `comments`, `versions`), defaulting to `content`.
71
+ `meta` surfaces `parent_deliverable_id`.
72
+ - `objectives overview DELIVERABLE_ID` — objective metadata plus its full
73
+ descendant tree.
74
+ - `context get DELIVERABLE_ID` — read-only LLM context snapshot for a
75
+ deliverable.
76
+ - `review` command group: `review issues DELIVERABLE_ID [--state open|muted|all]`
77
+ and `review mute ISSUE_ID [--note TEXT] [--unmute]`.
78
+ - `comments create --agent-run-id` to link a comment to a build run.
79
+ - `expedait-cli` console-script alias so `uvx expedait-cli …` keeps working.
80
+
81
+ ### Changed
82
+ - `comments create` now resolves anchor offsets from the deliverable content;
83
+ only `--text` and `--selected-text` are required. `--start-offset` /
84
+ `--end-offset` remain available as explicit overrides.
85
+ - Renamed `comments create --source-page-id` → `--source-deliverable-id`
86
+ (payload field `source_page_id` → `source_deliverable_id`).
87
+ - `comments resolve` / `comments delete` now use the deliverable-scoped routes
88
+ `/api/v1/deliverables/{id}/comments/{comment_id}`.
89
+
90
+ ### Deprecated
91
+ - The `pages` command group. `expedait pages …` still works for one release
92
+ (warns and forwards to `deliverables`) and will then be removed.
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: expedait-cli
3
- Version: 0.3.0
4
- Summary: CLI for Expedait project management — download specs, post comments
3
+ Version: 0.4.0
4
+ Summary: CLI for Expedait project management — read and write deliverables, processes, roles, and comments
5
5
  License-Expression: Apache-2.0
6
6
  License-File: LICENSE
7
7
  Requires-Python: >=3.11
@@ -103,6 +103,7 @@ expedait auth logout # Clear stored credentials
103
103
  ```bash
104
104
  expedait projects list # List all projects
105
105
  expedait projects get PROJECT_ID # Get project details
106
+ expedait projects workspace PROJECT_ID # Deliverables grouped by phase (structure-aware view)
106
107
  expedait projects download PROJECT_ID # Extract all deliverables to .expedait/context/
107
108
  expedait projects download PROJECT_ID --output-dir ./specs # Extract to a custom directory
108
109
  ```
@@ -111,6 +112,7 @@ expedait projects download PROJECT_ID --output-dir ./specs # Extract to a custo
111
112
 
112
113
  ```bash
113
114
  expedait deliverables list --project-id PROJECT_ID # List deliverables in a project
115
+ expedait deliverables types # List deliverable types (find the --type ID for create)
114
116
  expedait deliverables get DELIVERABLE_ID # Print deliverable markdown content
115
117
  expedait deliverables get DELIVERABLE_ID --include meta,content,dependencies,score
116
118
  expedait deliverables inspect DELIVERABLE_ID # Full context (content + comments + deps + lock)
@@ -123,6 +125,43 @@ expedait deliverables download DELIVERABLE_ID # Extract to .expedait/cont
123
125
  `parent_deliverable_id` (non-null ⇒ this deliverable is a child nested under an
124
126
  objective).
125
127
 
128
+ #### Writing deliverables
129
+
130
+ Mirrors the MCP `write_deliverable` tool. Ergonomic subcommands cover the common
131
+ cases; `write --ops` applies an ordered batch in one call.
132
+
133
+ ```bash
134
+ expedait deliverables create --project P --type TYPE_ID --title "Vision" \
135
+ [--content @vision.md] [--parent-deliverable-id ID] # create (content: @file, - for stdin, or literal)
136
+ expedait deliverables edit DELIVERABLE_ID --content @body.md # replace content (autosave, no version bump)
137
+ expedait deliverables rename DELIVERABLE_ID --title "New title" # rename without touching content
138
+ expedait deliverables save-version DELIVERABLE_ID --reason "checkpoint" # explicit snapshot
139
+ expedait deliverables set-state DELIVERABLE_ID --state "Review" # transition workflow state
140
+ ```
141
+
142
+ Valid states: `Not Started`, `In Progress`, `Review`, `Approved`, `Completed`,
143
+ `Final`.
144
+
145
+ For multi-step writes, `write --ops` takes a JSON ops array (`@file.json`, `-`
146
+ for stdin, or inline). Each op is one of `create`, `edit`, `rename`,
147
+ `save_version`, `set_state`. Chain ops on a freshly-created deliverable with
148
+ `"id": "$last"` (the previous op's deliverable) or bind a name on create
149
+ (`"ref": "x"`) and reference it later as `"id": "@x"`:
150
+
151
+ ```bash
152
+ expedait deliverables write --ops @ops.json
153
+ # ops.json:
154
+ # [
155
+ # {"op": "create", "ref": "v", "project_id": 1, "deliverable_type_id": 3, "title": "Vision"},
156
+ # {"op": "edit", "id": "@v", "content": "# Product Vision\n..."},
157
+ # {"op": "set_state", "id": "@v", "state": "Review"}
158
+ # ]
159
+ ```
160
+
161
+ Ops run in order and stop on the first failure (the rest report `skipped`); the
162
+ output reports per-op `{status: ok | error | skipped}`, and the command exits
163
+ non-zero if any op failed.
164
+
126
165
  ### Objectives
127
166
 
128
167
  ```bash
@@ -135,6 +174,23 @@ expedait objectives overview DELIVERABLE_ID # Objective metadata + full descen
135
174
  expedait context get DELIVERABLE_ID # The LLM context snapshot for one deliverable
136
175
  ```
137
176
 
177
+ A deliverable's (or objective's) context is built from dependency deliverables,
178
+ linked external sources, and **uploaded context files**. The CLI manages the
179
+ file half of that surface — attach reference docs an agent should write against,
180
+ and toggle whether each one feeds the LLM context:
181
+
182
+ ```bash
183
+ expedait context files DELIVERABLE_ID # List attached context files
184
+ expedait context add DELIVERABLE_ID ./reference.md # Upload a context file (re-upload by name replaces)
185
+ expedait context file-content FILE_ID # Parsed text the file contributes to context
186
+ expedait context download-file FILE_ID -o ./out.md # Download a file's raw bytes
187
+ expedait context set-file FILE_ID --exclude # Exclude from LLM context (or --include)
188
+ expedait context remove-file FILE_ID # Delete a context file
189
+ ```
190
+
191
+ External source links (Notion, GitHub, etc.) are created through the web app's
192
+ integration flows, not the CLI.
193
+
138
194
  ### Review
139
195
 
140
196
  ```bash
@@ -161,6 +217,56 @@ text in the deliverable to compute anchor offsets. Pass `--start-offset` and
161
217
  `--end-offset` to anchor explicitly (e.g. when the selected text appears more
162
218
  than once).
163
219
 
220
+ ### Processes (Process Designer)
221
+
222
+ A *process* is a project type plus the template tree it owns: phases → rows →
223
+ deliverable-type cards, dependency edges, owner roles, and objective
224
+ subprocesses. Editing it reshapes **every** project instantiated from it.
225
+ Mirrors the MCP `list_processes` / `get_process` / `write_process` tools.
226
+
227
+ ```bash
228
+ expedait processes list # List processes (project types)
229
+ expedait processes get PROCESS_ID # Full template tree (phases, rows, cards, roles)
230
+ expedait processes write --ops @ops.json # Build or adapt a process in one call
231
+ ```
232
+
233
+ `write --ops` ops: `create_process`, `update_process`, `duplicate_process`,
234
+ `delete_process`, `create_phase`, `update_phase`, `delete_phase`,
235
+ `create_phase_row`, `update_phase_row`, `delete_phase_row`,
236
+ `create_deliverable_type`, `update_deliverable_type`, `delete_deliverable_type`,
237
+ `set_dependencies`, `set_owner_roles`. Ops chain via named refs (`"ref": "x"` on
238
+ a create op, `"@x"` later). Card layout is optional — omit `col_position` and
239
+ cards auto-place (append, or just after `after_type_id`). `set_owner_roles`
240
+ accepts role names or ids. Delete ops refuse an in-use template unless the op
241
+ carries `"confirm_in_use": true`.
242
+
243
+ ```jsonc
244
+ // ops.json — build a process end to end in one call
245
+ [
246
+ {"op": "create_process", "ref": "p", "name": "Product Dev"},
247
+ {"op": "create_phase", "ref": "ph", "process_id": "@p", "name": "Discovery"},
248
+ {"op": "create_deliverable_type", "ref": "vision", "phase_id": "@ph", "name": "Vision"},
249
+ {"op": "create_deliverable_type", "ref": "prd", "phase_id": "@ph", "name": "PRD", "after_type_id": "@vision"},
250
+ {"op": "set_dependencies", "type_id": "@prd", "dependency_ids": ["@vision"]},
251
+ {"op": "set_owner_roles", "type_id": "@prd", "role_names": ["Product Manager"]}
252
+ ]
253
+ ```
254
+
255
+ ### Roles
256
+
257
+ A *role* is a workspace project role — the owner-role pool assigned to
258
+ deliverable types. A role's `instructions` is its LLM coaching persona. Mirrors
259
+ the MCP `list_roles` / `write_role` tools.
260
+
261
+ ```bash
262
+ expedait roles list # List project roles
263
+ expedait roles create --name "Product Manager" \ # Create (instructions: @file, -, or literal)
264
+ [--description "owns the roadmap"] [--instructions @pm.md]
265
+ expedait roles update ROLE_ID --name "Lead PM" # Update name/description/instructions
266
+ expedait roles delete ROLE_ID # Delete a role
267
+ expedait roles write --ops @ops.json # Batch (create_role/update_role/delete_role)
268
+ ```
269
+
164
270
  ### Global Options
165
271
 
166
272
  ```bash
@@ -92,6 +92,7 @@ expedait auth logout # Clear stored credentials
92
92
  ```bash
93
93
  expedait projects list # List all projects
94
94
  expedait projects get PROJECT_ID # Get project details
95
+ expedait projects workspace PROJECT_ID # Deliverables grouped by phase (structure-aware view)
95
96
  expedait projects download PROJECT_ID # Extract all deliverables to .expedait/context/
96
97
  expedait projects download PROJECT_ID --output-dir ./specs # Extract to a custom directory
97
98
  ```
@@ -100,6 +101,7 @@ expedait projects download PROJECT_ID --output-dir ./specs # Extract to a custo
100
101
 
101
102
  ```bash
102
103
  expedait deliverables list --project-id PROJECT_ID # List deliverables in a project
104
+ expedait deliverables types # List deliverable types (find the --type ID for create)
103
105
  expedait deliverables get DELIVERABLE_ID # Print deliverable markdown content
104
106
  expedait deliverables get DELIVERABLE_ID --include meta,content,dependencies,score
105
107
  expedait deliverables inspect DELIVERABLE_ID # Full context (content + comments + deps + lock)
@@ -112,6 +114,43 @@ expedait deliverables download DELIVERABLE_ID # Extract to .expedait/cont
112
114
  `parent_deliverable_id` (non-null ⇒ this deliverable is a child nested under an
113
115
  objective).
114
116
 
117
+ #### Writing deliverables
118
+
119
+ Mirrors the MCP `write_deliverable` tool. Ergonomic subcommands cover the common
120
+ cases; `write --ops` applies an ordered batch in one call.
121
+
122
+ ```bash
123
+ expedait deliverables create --project P --type TYPE_ID --title "Vision" \
124
+ [--content @vision.md] [--parent-deliverable-id ID] # create (content: @file, - for stdin, or literal)
125
+ expedait deliverables edit DELIVERABLE_ID --content @body.md # replace content (autosave, no version bump)
126
+ expedait deliverables rename DELIVERABLE_ID --title "New title" # rename without touching content
127
+ expedait deliverables save-version DELIVERABLE_ID --reason "checkpoint" # explicit snapshot
128
+ expedait deliverables set-state DELIVERABLE_ID --state "Review" # transition workflow state
129
+ ```
130
+
131
+ Valid states: `Not Started`, `In Progress`, `Review`, `Approved`, `Completed`,
132
+ `Final`.
133
+
134
+ For multi-step writes, `write --ops` takes a JSON ops array (`@file.json`, `-`
135
+ for stdin, or inline). Each op is one of `create`, `edit`, `rename`,
136
+ `save_version`, `set_state`. Chain ops on a freshly-created deliverable with
137
+ `"id": "$last"` (the previous op's deliverable) or bind a name on create
138
+ (`"ref": "x"`) and reference it later as `"id": "@x"`:
139
+
140
+ ```bash
141
+ expedait deliverables write --ops @ops.json
142
+ # ops.json:
143
+ # [
144
+ # {"op": "create", "ref": "v", "project_id": 1, "deliverable_type_id": 3, "title": "Vision"},
145
+ # {"op": "edit", "id": "@v", "content": "# Product Vision\n..."},
146
+ # {"op": "set_state", "id": "@v", "state": "Review"}
147
+ # ]
148
+ ```
149
+
150
+ Ops run in order and stop on the first failure (the rest report `skipped`); the
151
+ output reports per-op `{status: ok | error | skipped}`, and the command exits
152
+ non-zero if any op failed.
153
+
115
154
  ### Objectives
116
155
 
117
156
  ```bash
@@ -124,6 +163,23 @@ expedait objectives overview DELIVERABLE_ID # Objective metadata + full descen
124
163
  expedait context get DELIVERABLE_ID # The LLM context snapshot for one deliverable
125
164
  ```
126
165
 
166
+ A deliverable's (or objective's) context is built from dependency deliverables,
167
+ linked external sources, and **uploaded context files**. The CLI manages the
168
+ file half of that surface — attach reference docs an agent should write against,
169
+ and toggle whether each one feeds the LLM context:
170
+
171
+ ```bash
172
+ expedait context files DELIVERABLE_ID # List attached context files
173
+ expedait context add DELIVERABLE_ID ./reference.md # Upload a context file (re-upload by name replaces)
174
+ expedait context file-content FILE_ID # Parsed text the file contributes to context
175
+ expedait context download-file FILE_ID -o ./out.md # Download a file's raw bytes
176
+ expedait context set-file FILE_ID --exclude # Exclude from LLM context (or --include)
177
+ expedait context remove-file FILE_ID # Delete a context file
178
+ ```
179
+
180
+ External source links (Notion, GitHub, etc.) are created through the web app's
181
+ integration flows, not the CLI.
182
+
127
183
  ### Review
128
184
 
129
185
  ```bash
@@ -150,6 +206,56 @@ text in the deliverable to compute anchor offsets. Pass `--start-offset` and
150
206
  `--end-offset` to anchor explicitly (e.g. when the selected text appears more
151
207
  than once).
152
208
 
209
+ ### Processes (Process Designer)
210
+
211
+ A *process* is a project type plus the template tree it owns: phases → rows →
212
+ deliverable-type cards, dependency edges, owner roles, and objective
213
+ subprocesses. Editing it reshapes **every** project instantiated from it.
214
+ Mirrors the MCP `list_processes` / `get_process` / `write_process` tools.
215
+
216
+ ```bash
217
+ expedait processes list # List processes (project types)
218
+ expedait processes get PROCESS_ID # Full template tree (phases, rows, cards, roles)
219
+ expedait processes write --ops @ops.json # Build or adapt a process in one call
220
+ ```
221
+
222
+ `write --ops` ops: `create_process`, `update_process`, `duplicate_process`,
223
+ `delete_process`, `create_phase`, `update_phase`, `delete_phase`,
224
+ `create_phase_row`, `update_phase_row`, `delete_phase_row`,
225
+ `create_deliverable_type`, `update_deliverable_type`, `delete_deliverable_type`,
226
+ `set_dependencies`, `set_owner_roles`. Ops chain via named refs (`"ref": "x"` on
227
+ a create op, `"@x"` later). Card layout is optional — omit `col_position` and
228
+ cards auto-place (append, or just after `after_type_id`). `set_owner_roles`
229
+ accepts role names or ids. Delete ops refuse an in-use template unless the op
230
+ carries `"confirm_in_use": true`.
231
+
232
+ ```jsonc
233
+ // ops.json — build a process end to end in one call
234
+ [
235
+ {"op": "create_process", "ref": "p", "name": "Product Dev"},
236
+ {"op": "create_phase", "ref": "ph", "process_id": "@p", "name": "Discovery"},
237
+ {"op": "create_deliverable_type", "ref": "vision", "phase_id": "@ph", "name": "Vision"},
238
+ {"op": "create_deliverable_type", "ref": "prd", "phase_id": "@ph", "name": "PRD", "after_type_id": "@vision"},
239
+ {"op": "set_dependencies", "type_id": "@prd", "dependency_ids": ["@vision"]},
240
+ {"op": "set_owner_roles", "type_id": "@prd", "role_names": ["Product Manager"]}
241
+ ]
242
+ ```
243
+
244
+ ### Roles
245
+
246
+ A *role* is a workspace project role — the owner-role pool assigned to
247
+ deliverable types. A role's `instructions` is its LLM coaching persona. Mirrors
248
+ the MCP `list_roles` / `write_role` tools.
249
+
250
+ ```bash
251
+ expedait roles list # List project roles
252
+ expedait roles create --name "Product Manager" \ # Create (instructions: @file, -, or literal)
253
+ [--description "owns the roadmap"] [--instructions @pm.md]
254
+ expedait roles update ROLE_ID --name "Lead PM" # Update name/description/instructions
255
+ expedait roles delete ROLE_ID # Delete a role
256
+ expedait roles write --ops @ops.json # Batch (create_role/update_role/delete_role)
257
+ ```
258
+
153
259
  ### Global Options
154
260
 
155
261
  ```bash