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.
- expedait_cli-0.4.0/CHANGELOG.md +92 -0
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/PKG-INFO +108 -2
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/README.md +106 -0
- expedait_cli-0.4.0/expedait_cli/client.py +411 -0
- expedait_cli-0.4.0/expedait_cli/commands/context_cmd.py +160 -0
- expedait_cli-0.4.0/expedait_cli/commands/deliverables.py +524 -0
- expedait_cli-0.4.0/expedait_cli/commands/processes.py +603 -0
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/expedait_cli/commands/projects.py +25 -4
- expedait_cli-0.4.0/expedait_cli/commands/roles.py +196 -0
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/expedait_cli/main.py +4 -0
- expedait_cli-0.4.0/expedait_cli/ops.py +203 -0
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/pyproject.toml +2 -2
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/tests/test_client.py +34 -0
- expedait_cli-0.4.0/tests/test_commands/test_context_files.py +140 -0
- expedait_cli-0.4.0/tests/test_commands/test_deliverables_write.py +203 -0
- expedait_cli-0.4.0/tests/test_commands/test_processes.py +174 -0
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/tests/test_commands/test_projects.py +37 -16
- expedait_cli-0.4.0/tests/test_commands/test_roles.py +90 -0
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/uv.lock +1 -1
- expedait_cli-0.3.0/CHANGELOG.md +0 -35
- expedait_cli-0.3.0/expedait_cli/client.py +0 -184
- expedait_cli-0.3.0/expedait_cli/commands/context_cmd.py +0 -40
- expedait_cli-0.3.0/expedait_cli/commands/deliverables.py +0 -245
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/.github/workflows/ci.yml +0 -0
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/.github/workflows/publish.yml +0 -0
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/.gitignore +0 -0
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/CLAUDE.md +0 -0
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/LICENSE +0 -0
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/expedait_cli/__init__.py +0 -0
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/expedait_cli/auth.py +0 -0
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/expedait_cli/commands/__init__.py +0 -0
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/expedait_cli/commands/auth_cmd.py +0 -0
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/expedait_cli/commands/comments.py +0 -0
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/expedait_cli/commands/init_cmd.py +0 -0
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/expedait_cli/commands/objectives.py +0 -0
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/expedait_cli/commands/review.py +0 -0
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/expedait_cli/config.py +0 -0
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/expedait_cli/formatters.py +0 -0
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/expedait_cli/settings.py +0 -0
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/tests/__init__.py +0 -0
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/tests/conftest.py +0 -0
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/tests/test_auth.py +0 -0
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/tests/test_commands/__init__.py +0 -0
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/tests/test_commands/test_auth_cmd.py +0 -0
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/tests/test_commands/test_comments.py +0 -0
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/tests/test_commands/test_context.py +0 -0
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/tests/test_commands/test_deliverables.py +0 -0
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/tests/test_commands/test_init_cmd.py +0 -0
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/tests/test_commands/test_objectives.py +0 -0
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/tests/test_commands/test_review.py +0 -0
- {expedait_cli-0.3.0 → expedait_cli-0.4.0}/tests/test_config.py +0 -0
- {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.
|
|
4
|
-
Summary: CLI for Expedait project management —
|
|
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
|