arcane-cli 1.18.0 → 1.20.0

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 (30) hide show
  1. package/README.md +4 -3
  2. package/dist/assets/.arcane/governance/spell-authoring-standards.md +34 -22
  3. package/dist/assets/.arcane/governance/threat-model.md +4 -4
  4. package/dist/assets/.arcane/spells/_fragments/action-required.md +27 -0
  5. package/dist/assets/.arcane/spells/_fragments/presence-report.md +1 -1
  6. package/dist/assets/.arcane/spells/spell-address-review.md +21 -8
  7. package/dist/assets/.arcane/spells/spell-adopt-docs.md +21 -8
  8. package/dist/assets/.arcane/spells/spell-app-store-accounts.md +22 -9
  9. package/dist/assets/.arcane/spells/spell-architect.md +21 -8
  10. package/dist/assets/.arcane/spells/spell-close-session.md +26 -13
  11. package/dist/assets/.arcane/spells/spell-commit-work.md +22 -9
  12. package/dist/assets/.arcane/spells/spell-create-pull-request.md +22 -9
  13. package/dist/assets/.arcane/spells/spell-eas-store-deploy.md +21 -8
  14. package/dist/assets/.arcane/spells/spell-full-cycle.md +21 -8
  15. package/dist/assets/.arcane/spells/spell-implement.md +1 -1
  16. package/dist/assets/.arcane/spells/spell-make-discoverable.md +21 -8
  17. package/dist/assets/.arcane/spells/spell-open-session.md +24 -10
  18. package/dist/assets/.arcane/spells/spell-parallel-workers.md +23 -10
  19. package/dist/assets/.arcane/spells/spell-plan.md +21 -8
  20. package/dist/assets/.arcane/spells/spell-review-batch.md +21 -8
  21. package/dist/assets/.arcane/spells/spell-review.md +22 -9
  22. package/dist/assets/.arcane/spells/spell-scope.md +21 -8
  23. package/dist/assets/.arcane/spells/spell-ship.md +21 -8
  24. package/dist/assets/.arcane/spells/spell-sync-pull-request.md +22 -9
  25. package/dist/assets/ai-context/system-prompt-context.md +1 -1
  26. package/dist/assets/schemas/presence.schema.json +28 -9
  27. package/dist/index.js +2157 -1829
  28. package/dist/index.js.map +1 -1
  29. package/package.json +1 -1
  30. package/dist/assets/.arcane/spells/_fragments/needs-you.md +0 -14
@@ -252,22 +252,35 @@ If `external_provider=jira` or `external_provider=other`, add explicit TODOs in
252
252
 
253
253
  ### 9. Present and Confirm
254
254
 
255
- <!-- fragment:needs-you:start -->
256
- **Needs you — required operator actions.** When this run leaves an action that only the operator can take, and the work is not correct or complete until it is taken, report it in one block at the very top of the final report, before every other section and before any optional next step:
255
+ <!-- fragment:action-required:start -->
256
+ **Action required — what only the operator can do.** When this run leaves an action that only the operator can take, report it in one block at the very top of the final report, before every other section and before any optional next step. The block exists because these are the operator's decisions to make, not because the agent is stuck: write it as a hand-off of authority, never as a plea for help. Frame it with a horizontal rule above and below, so it stands apart in a terminal as well as on a rendered page:
257
257
 
258
258
  ```markdown
259
- ## ⚠ Needs you
259
+ ---
260
+
261
+ ## 🚧 Action required
262
+
263
+ **Now**
264
+
265
+ - <exactly what to do: the command, the link, or the question> — <why only the operator can do it>
260
266
 
261
- - <exactly what to do: the command, the link, or the question> — <why the agent cannot do it itself>
267
+ **When you're at your desk**
268
+
269
+ - <exactly what to do> — <why only the operator can do it>
270
+
271
+ ---
262
272
  ```
263
273
 
264
- - **What belongs in it:** an action the work needs that only the operator can take — approving or merging a pull request, accepting a decision record, answering a question the work is waiting on, confirming a `guarded` push, running an interactive command such as `spell unblock-push`, or a step on an external platform the agent cannot reach. An optional suggestion, a next spell to run, or anything the agent could do itself is not a required action and stays out of the block.
265
- - **One line per action.** Say exactly what to do, then, after the dash, why the agent cannot do it. Write the command, link or question out in full; never point elsewhere with "see above".
274
+ - **What belongs in it:** an action only the operator can take — approving or merging a pull request, accepting a decision record, answering a question the work is waiting on, confirming a `guarded` push, running an interactive command such as `spell unblock-push`, or a step on an external platform the agent cannot reach. An optional suggestion, a next spell to run, or anything the agent could do itself is not a required action and stays out of the block.
275
+ - **Two tiers, one block.** **Now** holds what the work is not correct or complete without. **When you're at your desk** holds what only the operator can do but that can wait: a permission rule, a leftover remote branch, a credential to set up. Leave out a tier that has nothing in it; never split the tiers into two blocks.
276
+ - **One line per action.** Say exactly what to do, then, after the dash, why only the operator can do it. Write the command, link or question out in full; never point elsewhere with "see above".
266
277
  - **Never only among optional steps.** An action required for correctness is never listed only under next steps, suggestions, `Carry Forward` or `What's Next?`. It may be repeated there, but it always appears in this block.
267
- - **Omit it when empty.** When nothing needs the operator, leave the block out entirely: no heading and no "None" line.
278
+ - **Done items stay, struck through.** Within one session, once an item has been listed, keep it in every later report of the block; when the operator has done it, strike it through (`~~<the line>~~`) rather than dropping it, so progress shows and nothing disappears silently. The session's close carries only the open items forward.
279
+ - **Omit it when empty.** When nothing is left for the operator and nothing was struck through this session, leave the block out entirely: no heading, no rules and no "None" line.
268
280
  - **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
281
+ - **Report the Now tier to the presence channel.** When the **Now** tier has open items, also run `spell presence report --status waiting --required-action "<line 1>" --required-action "<line 2>"`, one flag per open line of that tier; the other tier is not blocking and is not reported. With no presence channel configured on this machine the command prints nothing and exits 0, so the block itself and the rest of the run are unchanged.
269
282
  - Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
270
- <!-- fragment:needs-you:end -->
283
+ <!-- fragment:action-required:end -->
271
284
 
272
285
  Present the execution plan to the user. Ask:
273
286
  1. Does the epic split make sense?
@@ -97,22 +97,35 @@ Workflow:
97
97
  - OR: BLOCK — [reason]
98
98
  ```
99
99
 
100
- <!-- fragment:needs-you:start -->
101
- **Needs you — required operator actions.** When this run leaves an action that only the operator can take, and the work is not correct or complete until it is taken, report it in one block at the very top of the final report, before every other section and before any optional next step:
100
+ <!-- fragment:action-required:start -->
101
+ **Action required — what only the operator can do.** When this run leaves an action that only the operator can take, report it in one block at the very top of the final report, before every other section and before any optional next step. The block exists because these are the operator's decisions to make, not because the agent is stuck: write it as a hand-off of authority, never as a plea for help. Frame it with a horizontal rule above and below, so it stands apart in a terminal as well as on a rendered page:
102
102
 
103
103
  ```markdown
104
- ## ⚠ Needs you
104
+ ---
105
105
 
106
- - <exactly what to do: the command, the link, or the question> — <why the agent cannot do it itself>
106
+ ## 🚧 Action required
107
+
108
+ **Now**
109
+
110
+ - <exactly what to do: the command, the link, or the question> — <why only the operator can do it>
111
+
112
+ **When you're at your desk**
113
+
114
+ - <exactly what to do> — <why only the operator can do it>
115
+
116
+ ---
107
117
  ```
108
118
 
109
- - **What belongs in it:** an action the work needs that only the operator can take — approving or merging a pull request, accepting a decision record, answering a question the work is waiting on, confirming a `guarded` push, running an interactive command such as `spell unblock-push`, or a step on an external platform the agent cannot reach. An optional suggestion, a next spell to run, or anything the agent could do itself is not a required action and stays out of the block.
110
- - **One line per action.** Say exactly what to do, then, after the dash, why the agent cannot do it. Write the command, link or question out in full; never point elsewhere with "see above".
119
+ - **What belongs in it:** an action only the operator can take — approving or merging a pull request, accepting a decision record, answering a question the work is waiting on, confirming a `guarded` push, running an interactive command such as `spell unblock-push`, or a step on an external platform the agent cannot reach. An optional suggestion, a next spell to run, or anything the agent could do itself is not a required action and stays out of the block.
120
+ - **Two tiers, one block.** **Now** holds what the work is not correct or complete without. **When you're at your desk** holds what only the operator can do but that can wait: a permission rule, a leftover remote branch, a credential to set up. Leave out a tier that has nothing in it; never split the tiers into two blocks.
121
+ - **One line per action.** Say exactly what to do, then, after the dash, why only the operator can do it. Write the command, link or question out in full; never point elsewhere with "see above".
111
122
  - **Never only among optional steps.** An action required for correctness is never listed only under next steps, suggestions, `Carry Forward` or `What's Next?`. It may be repeated there, but it always appears in this block.
112
- - **Omit it when empty.** When nothing needs the operator, leave the block out entirely: no heading and no "None" line.
123
+ - **Done items stay, struck through.** Within one session, once an item has been listed, keep it in every later report of the block; when the operator has done it, strike it through (`~~<the line>~~`) rather than dropping it, so progress shows and nothing disappears silently. The session's close carries only the open items forward.
124
+ - **Omit it when empty.** When nothing is left for the operator and nothing was struck through this session, leave the block out entirely: no heading, no rules and no "None" line.
113
125
  - **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
126
+ - **Report the Now tier to the presence channel.** When the **Now** tier has open items, also run `spell presence report --status waiting --required-action "<line 1>" --required-action "<line 2>"`, one flag per open line of that tier; the other tier is not blocking and is not reported. With no presence channel configured on this machine the command prints nothing and exits 0, so the block itself and the rest of the run are unchanged.
114
127
  - Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
115
- <!-- fragment:needs-you:end -->
128
+ <!-- fragment:action-required:end -->
116
129
 
117
130
  7. **Request human approval** — present the ship report and wait for explicit approval.
118
131
 
@@ -110,7 +110,7 @@ then classify **each conflicted hunk independently** — a single file can conta
110
110
  that one side's content is a strict superset of the other's. **STOP.** Do not guess, do not pick a
111
111
  side, do not attempt a "reasonable-looking" merge of the two. Abort the in-progress rebase/merge
112
112
  (`git rebase --abort` / `git merge --abort`) so the branch is left exactly as it was, then report:
113
- - First, the `## ⚠ Needs you` block described in Step 6, naming the manual resolution as the action.
113
+ - First, the `## 🚧 Action required` block described in Step 6, naming the manual resolution as the action.
114
114
  - The exact conflicting file(s) and hunk(s).
115
115
  - Both sides' conflicting content, verbatim.
116
116
  - That the recoverable ref from Step 1 still points at the pre-sync state.
@@ -172,22 +172,35 @@ report the discrepancy rather than declaring the sync done.
172
172
 
173
173
  ## Step 6 — Report
174
174
 
175
- <!-- fragment:needs-you:start -->
176
- **Needs you — required operator actions.** When this run leaves an action that only the operator can take, and the work is not correct or complete until it is taken, report it in one block at the very top of the final report, before every other section and before any optional next step:
175
+ <!-- fragment:action-required:start -->
176
+ **Action required — what only the operator can do.** When this run leaves an action that only the operator can take, report it in one block at the very top of the final report, before every other section and before any optional next step. The block exists because these are the operator's decisions to make, not because the agent is stuck: write it as a hand-off of authority, never as a plea for help. Frame it with a horizontal rule above and below, so it stands apart in a terminal as well as on a rendered page:
177
177
 
178
178
  ```markdown
179
- ## ⚠ Needs you
179
+ ---
180
+
181
+ ## 🚧 Action required
182
+
183
+ **Now**
184
+
185
+ - <exactly what to do: the command, the link, or the question> — <why only the operator can do it>
180
186
 
181
- - <exactly what to do: the command, the link, or the question> — <why the agent cannot do it itself>
187
+ **When you're at your desk**
188
+
189
+ - <exactly what to do> — <why only the operator can do it>
190
+
191
+ ---
182
192
  ```
183
193
 
184
- - **What belongs in it:** an action the work needs that only the operator can take — approving or merging a pull request, accepting a decision record, answering a question the work is waiting on, confirming a `guarded` push, running an interactive command such as `spell unblock-push`, or a step on an external platform the agent cannot reach. An optional suggestion, a next spell to run, or anything the agent could do itself is not a required action and stays out of the block.
185
- - **One line per action.** Say exactly what to do, then, after the dash, why the agent cannot do it. Write the command, link or question out in full; never point elsewhere with "see above".
194
+ - **What belongs in it:** an action only the operator can take — approving or merging a pull request, accepting a decision record, answering a question the work is waiting on, confirming a `guarded` push, running an interactive command such as `spell unblock-push`, or a step on an external platform the agent cannot reach. An optional suggestion, a next spell to run, or anything the agent could do itself is not a required action and stays out of the block.
195
+ - **Two tiers, one block.** **Now** holds what the work is not correct or complete without. **When you're at your desk** holds what only the operator can do but that can wait: a permission rule, a leftover remote branch, a credential to set up. Leave out a tier that has nothing in it; never split the tiers into two blocks.
196
+ - **One line per action.** Say exactly what to do, then, after the dash, why only the operator can do it. Write the command, link or question out in full; never point elsewhere with "see above".
186
197
  - **Never only among optional steps.** An action required for correctness is never listed only under next steps, suggestions, `Carry Forward` or `What's Next?`. It may be repeated there, but it always appears in this block.
187
- - **Omit it when empty.** When nothing needs the operator, leave the block out entirely: no heading and no "None" line.
198
+ - **Done items stay, struck through.** Within one session, once an item has been listed, keep it in every later report of the block; when the operator has done it, strike it through (`~~<the line>~~`) rather than dropping it, so progress shows and nothing disappears silently. The session's close carries only the open items forward.
199
+ - **Omit it when empty.** When nothing is left for the operator and nothing was struck through this session, leave the block out entirely: no heading, no rules and no "None" line.
188
200
  - **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
201
+ - **Report the Now tier to the presence channel.** When the **Now** tier has open items, also run `spell presence report --status waiting --required-action "<line 1>" --required-action "<line 2>"`, one flag per open line of that tier; the other tier is not blocking and is not reported. With no presence channel configured on this machine the command prints nothing and exits 0, so the block itself and the rest of the run are unchanged.
189
202
  - Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
190
- <!-- fragment:needs-you:end -->
203
+ <!-- fragment:action-required:end -->
191
204
 
192
205
  ```
193
206
  ✓ PR synced: <URL>
@@ -33,7 +33,7 @@
33
33
  - **Branch:** main
34
34
  - **Blockers:** None.
35
35
  - **Pending Verification:** None.
36
- - **Needs you:** None.
36
+ - **Action required:** None.
37
37
  - **Notes:** —
38
38
 
39
39
  > ✓ Consumed: YYYY-MM-DD — scaffold placeholder, not a real session; ships pre-consumed so the first
@@ -15,7 +15,7 @@
15
15
  "task",
16
16
  "message",
17
17
  "status",
18
- "needs_you",
18
+ "required_actions",
19
19
  "started_at",
20
20
  "reported_at",
21
21
  "ended_at",
@@ -73,11 +73,11 @@
73
73
  ],
74
74
  "description": "working: a spell is running; waiting: the session asked the operator for something; blocked: cannot proceed for an external reason; idle: open, no spell running; done: ended (set by end only)."
75
75
  },
76
- "needs_you": {
76
+ "required_actions": {
77
77
  "type": "array",
78
78
  "maxItems": 20,
79
79
  "items": {
80
- "$ref": "#/$defs/needsYou"
80
+ "$ref": "#/$defs/requiredAction"
81
81
  }
82
82
  },
83
83
  "started_at": {
@@ -216,7 +216,7 @@
216
216
  }
217
217
  }
218
218
  },
219
- "needsYou": {
219
+ "requiredAction": {
220
220
  "type": "object",
221
221
  "additionalProperties": false,
222
222
  "required": [
@@ -227,7 +227,7 @@
227
227
  "action": {
228
228
  "type": "string",
229
229
  "maxLength": 256,
230
- "description": "Exactly what the operator must do: one line of a '## ⚠ Needs you' block.",
230
+ "description": "Exactly what the operator must do: one line of a '## 🚧 Action required' block.",
231
231
  "minLength": 1
232
232
  },
233
233
  "reason": {
@@ -390,14 +390,33 @@
390
390
  "maxLength": 256,
391
391
  "description": "Absent keeps the stored value; null clears it."
392
392
  },
393
- "needs_you": {
393
+ "required_actions": {
394
394
  "type": "array",
395
395
  "maxItems": 20,
396
396
  "items": {
397
- "$ref": "#/$defs/needsYou"
397
+ "$ref": "#/$defs/requiredAction"
398
398
  },
399
399
  "description": "Replaces the stored list on every report; absent means []. More than 20 entries is refused with 400, never cut."
400
+ },
401
+ "needs_you": {
402
+ "type": "array",
403
+ "maxItems": 20,
404
+ "items": {
405
+ "$ref": "#/$defs/requiredAction"
406
+ },
407
+ "deprecated": true,
408
+ "description": "The name of required_actions before 1.20 (ARC-060 decision 14), accepted as required_actions for the 1.20 series. Never sent together with required_actions: a body with both is refused with 400 naming needs_you."
400
409
  }
410
+ },
411
+ "not": {
412
+ "properties": {
413
+ "required_actions": true,
414
+ "needs_you": true
415
+ },
416
+ "required": [
417
+ "required_actions",
418
+ "needs_you"
419
+ ]
401
420
  }
402
421
  },
403
422
  "end": {
@@ -528,7 +547,7 @@
528
547
  }
529
548
  },
530
549
  "event": {
531
- "description": "One change on GET /v0/events: the event name and the full record after the change. Exactly one event per accepted report, by the precedence started > resumed > needs_you > updated (architecture D5). The record is the truth and the event name is why it was sent: a consumer that alerts on 'needs you' reads the record's needs_you, because a first or a resumed report can carry lines under another event name.",
550
+ "description": "One change on GET /v0/events: the event name and the full record after the change. Exactly one event per accepted report, by the precedence started > resumed > action_required > updated (architecture D5). The record is the truth and the event name is why it was sent: a consumer that alerts on 'action required' reads the record's required_actions, because a first or a resumed report can carry lines under another event name.",
532
551
  "type": "object",
533
552
  "additionalProperties": false,
534
553
  "required": [
@@ -540,7 +559,7 @@
540
559
  "enum": [
541
560
  "session.started",
542
561
  "session.updated",
543
- "session.needs_you",
562
+ "session.action_required",
544
563
  "session.stale",
545
564
  "session.resumed",
546
565
  "session.ended",