@odla-ai/cli 0.42.2 → 0.43.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.
package/dist/index.js CHANGED
@@ -56,7 +56,7 @@ import {
56
56
  startHostedSecurityJob,
57
57
  surfacePaths,
58
58
  validateInvocation
59
- } from "./chunk-K6ATAKGR.js";
59
+ } from "./chunk-T4OPSRME.js";
60
60
  import {
61
61
  exitCodeFor,
62
62
  redactSecrets
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@odla-ai/cli",
3
- "version": "0.42.2",
3
+ "version": "0.43.1",
4
4
  "description": "Agent-operable CLI for odla provisioning, calendar consent and connection lifecycle, System AI administration, Worker secrets, security jobs, and smoke checks.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://odla.ai/docs/packages/cli",
@@ -214,17 +214,24 @@ on the app. It is platform-side: there is nothing PM-specific to install or
214
214
  provision. Start a session by reading it, and keep it current while you build:
215
215
 
216
216
  ```cmd
217
- npx --yes @odla-ai/cli@latest pm next --app <appId>
217
+ npx --yes @odla-ai/cli@latest pm next --app <appId> # open goals, Ready, Doing
218
+ npx --yes @odla-ai/cli@latest pm start --app <appId> # claim the top Ready task
218
219
  ```
219
220
 
221
+ `pm next` ends by naming the command to run next, and `pm start` claims Ready
222
+ work in one call — it reads the current revision and compare-and-swaps against
223
+ it server-side, so you never carry a revision between commands. It cannot mark
224
+ work Ready: that contract is reviewed separately.
225
+
220
226
  For a durable supervisor loop, establish and persist an exact-project PM cursor:
221
227
 
222
228
  ```cmd
223
229
  npx --yes @odla-ai/cli@latest pm watch --app <appId> --entity task --jsonl
224
230
  ```
225
231
 
226
- A Ready event is a wake-up signal, not permission: reload the task and linked
227
- goal and win the current revision's atomic claim before starting. PM-attached
232
+ A Ready event is a wake-up signal, not permission: re-read `pm next` and win the
233
+ atomic claim before starting `pm start` does both, against the revision that
234
+ is current when it runs rather than the one the event carried. PM-attached
228
235
  comments use the same cursor (`--action comment.created`); general Discussion
229
236
  topics and mentions still use `discuss watch`.
230
237
 
@@ -16,14 +16,19 @@ for the current chat and should name the PM goal and task references.
16
16
  ## 1. Resolve context and read authoritative state
17
17
 
18
18
  ```cmd
19
- npx --yes @odla-ai/cli@latest context show --context <profile>
20
19
  npx --yes @odla-ai/cli@latest pm next --app <appId> --json
21
- npx --yes @odla-ai/cli@latest pm handoff --app <appId> --json
22
20
  ```
23
21
 
24
- Read any existing Doing task before selecting another. For each candidate, read
25
- the task, its goal, and their comments. If the current chat has a Codex Goal,
26
- confirm that its objective and verification still match these records.
22
+ `pm next` is the whole intake read: open goals, Ready candidates, and work
23
+ already in Doing, filtered by the server and projected to the fields you act on.
24
+ It ends with a `next:` line naming the exact command to run — follow that rather
25
+ than reconstructing the sequence from memory.
26
+
27
+ Add `pm handoff --app <appId> --json` when you need the fuller unresolved
28
+ picture (Backlog and Review as well, plus open bugs), and `--verbose` to either
29
+ when you need whole records with their audit trail. Read any existing Doing task
30
+ before selecting another. If the current chat has a Codex Goal, confirm that its
31
+ objective and verification still match these records.
27
32
 
28
33
  ## 2. Check alignment
29
34
 
@@ -68,16 +73,33 @@ Claim and release require `pm.execute`. Planning authority alone is
68
73
  intentionally insufficient, so the principal that approves a task does not
69
74
  silently become its executor.
70
75
 
71
- Review the latest task revision immediately before claiming:
76
+ Start the work in one call:
72
77
 
73
78
  ```cmd
74
- npx --yes @odla-ai/cli@latest pm task get <task-id> --json
75
- npx --yes @odla-ai/cli@latest pm task claim <task-id> --expected-revision <revision>
79
+ npx --yes @odla-ai/cli@latest pm start --app <appId> --json
80
+ npx --yes @odla-ai/cli@latest pm start --app <appId> <task-id> --json # a specific task
76
81
  ```
77
82
 
78
- Only one concurrent caller can win. On conflict, reload `pm next` and the task;
79
- do not retry with a guessed revision. Once claimed, use the repository's
80
- worktree procedure and mention the PM references in the execution chat:
83
+ `pm start` claims the top-ranked Ready task the board's own order, not a
84
+ tie-break it invents and narrows to one outcome with `--goal <goal-id>`. It
85
+ reads the current revision and compare-and-swaps against it server-side, so you
86
+ never carry a revision between commands, and it reloads once if the task moved
87
+ in between. It returns the claimed task, its goal, and the acceptance criteria
88
+ to work against, so starting work costs one command rather than four.
89
+
90
+ Only one concurrent caller can win. If the task is taken while starting it,
91
+ `pm start` says so and stops rather than retrying blindly; run it again to take
92
+ the next Ready task.
93
+
94
+ `pm start` deliberately cannot mark work Ready. That contract is reviewed
95
+ separately (step 3), so an agent cannot authorize its own work: starting
96
+ something that is not Ready refuses and names the command that readies it.
97
+
98
+ `pm task claim <id> --expected-revision <n>` still exists for a caller that has
99
+ already read the revision itself and wants the bare transition.
100
+
101
+ Once claimed, use the repository's worktree procedure and mention the PM
102
+ references in the execution chat:
81
103
 
82
104
  ```text
83
105
  [Task title](https://odla.ai/studio/pm/board/<task-id>)
@@ -61,7 +61,7 @@ npx --yes @odla-ai/cli@latest pm next --app <appId>
61
61
  ```
62
62
 
63
63
  ```cmd
64
- npx --yes @odla-ai/cli@latest pm task claim <id> --expected-revision <n>
64
+ npx --yes @odla-ai/cli@latest pm start --app <appId>
65
65
  ```
66
66
 
67
67
  ```cmd
@@ -87,15 +87,23 @@ npx --yes @odla-ai/cli@latest pm decision list --q "stripe"
87
87
  authorized immutable event log retains the deletion snapshot for recovery and
88
88
  audit until the exact project lifetime is purged.
89
89
  - `next --app <appId>` is the read-only intake view: open goals, current Doing
90
- work, and Ready candidates. It never claims or mutates work.
90
+ work, and Ready candidates. It never claims or mutates work, and its `next:`
91
+ line names the exact command to run next. Records are projected to the fields
92
+ you act on; `--verbose` returns whole records with their audit trail.
93
+ - `start --app <appId> [<task-id>]` claims Ready work in one call: it reads the
94
+ current revision and compare-and-swaps against it server-side, reloads once if
95
+ the task moved, and returns the task, its goal, and the acceptance criteria.
96
+ `--goal <id>` narrows the candidates. It cannot mark work Ready.
91
97
  - `watch --app <appId> --jsonl` establishes and resumes an exact-project PM
92
98
  lifecycle cursor. Persist checkpoint records, deduplicate at-least-once
93
99
  delivery by `eventId`, and use `--entity`, `--state`, `--by`, or `--self` for
94
100
  one stable consumer policy.
95
101
  - `task ready <id> --expected-revision <n>` validates and records the Ready
96
- contract. `task claim` atomically moves the reviewed Ready revision to Doing;
97
- `task release` explicitly returns an active claim to Ready. A stale revision
98
- or concurrent claim is a conflict, so reload instead of overwriting it.
102
+ contract. `task release` explicitly returns an active claim to Ready. A stale
103
+ revision or concurrent claim is a conflict, so reload instead of overwriting
104
+ it `pm start` does that reload for you. `task claim <id> --expected-revision
105
+ <n>` remains for a caller that has already read the revision and wants the
106
+ bare transition.
99
107
 
100
108
  Task lifecycle maintenance uses app/project PM mutation authority. `pm.plan`,
101
109
  `pm.execute`, and legacy `pm.write` all carry ordinary PM-write access, so their
@@ -114,13 +122,14 @@ the request in PM but do not require them to repeat it with a Ready transition.
114
122
  write:
115
123
 
116
124
  ```cmd
117
- npx --yes @odla-ai/cli@latest context show --context <profile>
118
125
  npx --yes @odla-ai/cli@latest pm next --app <appId>
119
126
  ```
120
127
 
121
- Then read `pm bug list --app <appId> --status open` and
122
- `pm decision list --app <appId> --limit 10`, plus
123
- the selected task, linked goal, and their comments. That is the state of the
128
+ That one read is open goals, Ready candidates, and Doing work, and it ends by
129
+ naming the command to run next. Then read `pm bug list --app <appId> --status
130
+ open` and `pm decision list --app <appId> --limit 10`, plus the linked goal and
131
+ its comments — `pm start` returns the task and goal you claim, so you do not
132
+ need to fetch those separately first. That is the state of the
124
133
  project—including anything a *different* agent left behind.
125
134
 
126
135
  Before project-mutating work, decide whether the request aligns to an existing
@@ -142,9 +151,11 @@ goal links and comments rather than sharing a working tree or status document.
142
151
  an actionable description and acceptance criteria, then run `pm task ready
143
152
  <id> --expected-revision <n>`. The stored column is still `todo` for API
144
153
  compatibility, but every product surface calls it Ready.
145
- - An agent starts only with `pm task claim <id> --expected-revision <n>`. The
146
- compare-and-set claim assigns the authenticated principal and moves the task
147
- to Doing. Never use `pm task set --column doing` to bypass it.
154
+ - An agent starts with `pm start --app <appId>`, which takes the top-ranked
155
+ Ready task (or the one you name). The compare-and-set claim assigns the
156
+ authenticated principal and moves the task to Doing; `pm start` performs that
157
+ swap against the revision it just read. Never use `pm task set --column doing`
158
+ to bypass it.
148
159
  - Use one claimed task and one owned worktree/branch. If you must stop before
149
160
  review, run `pm task release <id> --expected-revision <n>` and comment with
150
161
  the recovery point. Move to Review when evidence is ready; mark Done only