| 20 |
20 |
|
- `--db` defaults to the desktop app's database (`com.goingson.app`'s
|
| 21 |
21 |
|
`app_data_dir`). The database must already exist; run GoingsOn once to create
|
| 22 |
22 |
|
the schema and the single desktop user.
|
| 23 |
|
- |
- Reads (`list_projects`, `list_tasks`, `get_task`, `list_events`, `get_event`)
|
| 24 |
|
- |
are always callable.
|
|
23 |
+ |
- Reads (`list_projects`, `list_tasks`, `get_task`, `list_ready_tasks`,
|
|
24 |
+ |
`get_task_graph`, `list_events`, `get_event`) are always callable.
|
| 25 |
25 |
|
- Writes are refused unless their capability is granted. Grant them with
|
| 26 |
26 |
|
`--grant go.task.bulk_import` (repeatable) or `--grant-all` for a fully-trusted
|
| 27 |
27 |
|
local session.
|
| 35 |
35 |
|
|
| 36 |
36 |
|
- `list_projects`: id, name, type, status. Every write that takes a project
|
| 37 |
37 |
|
takes its `project_id`, so this is how a name becomes an id.
|
| 38 |
|
- |
- `list_tasks(project_id?, project?, status?, tag?, limit?, offset?)`: compact task rows,
|
| 39 |
|
- |
paged (default 50, max 200). Descriptions over 240 chars are clipped and the
|
| 40 |
|
- |
row marked `truncated`; `get_task` has the full text. The reply carries
|
|
38 |
+ |
- `list_tasks(project_id?, project?, status?, tag?, blocked?, limit?, offset?)`: compact task
|
|
39 |
+ |
rows, paged (default 50, max 200). Descriptions over 240 chars are clipped and
|
|
40 |
+ |
the row marked `truncated`; `get_task` has the full text. The reply carries
|
| 41 |
41 |
|
`total` and, while pages remain, `next_offset`. Walk until it is absent.
|
| 42 |
|
- |
- `get_task(id)`: one task with subtasks and annotations.
|
|
42 |
+ |
`blocked` filters on the dependency graph: true keeps only tasks waiting on
|
|
43 |
+ |
something unfinished, false only startable ones.
|
|
44 |
+ |
- `get_task(id)`: one task with subtasks, annotations, and its `blocked_by` /
|
|
45 |
+ |
`blocks` edges. Every edge is listed, satisfied ones included, each carrying
|
|
46 |
+ |
`satisfied`, so what is still in the way is distinguishable from what the task
|
|
47 |
+ |
once waited for.
|
|
48 |
+ |
- `list_ready_tasks(project_id?, depth?, limit?)`: the work that can actually be
|
|
49 |
+ |
started, shallowest first then by urgency. `depth` (default 0) is how many
|
|
50 |
+ |
blocker-hops back to include, so 0 is available now and 1 also returns what
|
|
51 |
+ |
opens after one more completion. Prefer this over `list_tasks` when the
|
|
52 |
+ |
question is "what should I do next".
|
|
53 |
+ |
- `get_task_graph(project_id?)`: nodes, edges and cycles in one call, for
|
|
54 |
+ |
reasoning about ordering across a project. A project scope still includes
|
|
55 |
+ |
blockers living in other projects, since those are why its tasks are not
|
|
56 |
+ |
ready. Tasks with no edges either way are omitted.
|
| 43 |
57 |
|
- `list_events(from?, to?, project_id?, project?, recurring_only?, expand?, limit?, offset?)`:
|
| 44 |
58 |
|
calendar events in a window, paged on the same terms as `list_tasks`. Defaults
|
| 45 |
59 |
|
to the next 30 days. See "Events and recurrence" below for what `expand` does.
|
| 58 |
72 |
|
| `bulk_import_tasks([...])`, the `/dellm` primitive | `go.task.bulk_import` |
|
| 59 |
73 |
|
| `update_task(id, fields)`, overlays only the fields you pass | `go.task.update` |
|
| 60 |
74 |
|
| `complete_task(id)` | `go.task.complete` |
|
|
75 |
+ |
| `add_dependency(blocked_id, blocker_id)`, idempotent, refuses a cycle | `go.task.dependency.add` |
|
|
76 |
+ |
| `remove_dependency(blocked_id, blocker_id)` | `go.task.dependency.remove` |
|
| 61 |
77 |
|
| `report_problems([...], source?)`, the `/audit` and `/fuzz` primitive | `go.problem.report` |
|
| 62 |
78 |
|
| `promote_problem(id, description?, priority?)`, problem to task | `go.problem.promote` |
|
| 63 |
79 |
|
| `update_problem(id, {status?, project_id?})`, triage state and attribution | `go.problem.update` |
|