@hanzlaa/rcode 4.10.1 → 4.10.3
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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hanzlaa/rcode",
|
|
3
|
-
"version": "4.10.
|
|
3
|
+
"version": "4.10.3",
|
|
4
4
|
"description": "rcode — the AI team that never forgets. Persistent memory, specialist agents, and slash commands for AI IDEs. Works in Claude Code, Cursor, Gemini, VS Code, and Antigravity.",
|
|
5
5
|
"main": "cli/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -602,6 +602,14 @@ node .rcode/bin/rcode-tools.cjs state record-council \
|
|
|
602
602
|
node .rcode/bin/rcode-tools.cjs state record-session
|
|
603
603
|
```
|
|
604
604
|
|
|
605
|
+
**Also record the decision itself (closes #1036-adjacent gap — dashboard "Decisions (ADRs)" reads `state.json`'s `decisions[]`, which `record-council` above does NOT populate; only `state add-decision` does).** Write one concise line per DISTINCT consensus decision the council reached — not the full synthesis prose, not one line per panelist. A council session that reached one architectural consensus gets one `add-decision` call; a session with 2-3 genuinely separate decisions gets that many calls. `add-decision` takes the summary as a plain positional argument (no `--summary-file` flag exists on this subcommand — verified against `rcode-tools.cjs`'s actual implementation, don't invent flags), so keep each summary to one shell-safe line:
|
|
606
|
+
|
|
607
|
+
```bash
|
|
608
|
+
node .rcode/bin/rcode-tools.cjs state add-decision "{one-line consensus decision, e.g. 'Password reset: opaque crypto token, sha256-hashed on existing user record, 15-30min single-use expiry, console-stub email'}"
|
|
609
|
+
```
|
|
610
|
+
|
|
611
|
+
If the council reached no real consensus (pure disagreement, or panelists only asked clarifying questions), skip this call — don't manufacture a decision that wasn't made.
|
|
612
|
+
|
|
605
613
|
> **Note:** If `rcode-tools.cjs` state commands fail (e.g. state.json missing or not yet initialized), continue without error — state tracking is optional, the session artifact saved in Step 5 is mandatory.
|
|
606
614
|
|
|
607
615
|
## Success Criteria
|
|
@@ -31,7 +31,11 @@ else
|
|
|
31
31
|
fi
|
|
32
32
|
```
|
|
33
33
|
|
|
34
|
-
Use `$EXEC_AGENT` as the `subagent_type` in every Task spawn below (Pattern A, Pattern B subagent route). No other change to the spawn prompt is needed — the persona file's own conditional clause tells it to load the full executor playbook when it sees `subagent_type` = itself and a SPRINT.md path in the prompt.
|
|
34
|
+
Use `$EXEC_AGENT` as the `subagent_type` in every Task spawn below (Pattern A, Pattern B subagent route). No other change to the spawn prompt is needed — the persona file's own conditional clause tells it to load the full executor playbook when it sees `subagent_type` = itself and a SPRINT.md path in the prompt.
|
|
35
|
+
|
|
36
|
+
**Fall back to `rcode-executor` and note the fallback in SUMMARY.md's Deviations section (do not fail the sprint) when:**
|
|
37
|
+
- `$EXEC_AGENT` is a persona and that persona's agent file is not installed in this project, OR
|
|
38
|
+
- The persona agent **declines/refuses the role** — a persona's own scope-discipline and anti-injection instincts may correctly distrust a spawn prompt that merely *asserts* "you are the sprint executor" without provenance from a real `/rcode-execute` dispatch (confirmed live: this happens; a hand-authored trigger reads exactly like a prompt-injection attempt to the persona, and refusing that is the correct default). Detect this by the spawn returning zero commits / zero file changes with a refusal-shaped response (no tool calls, explanation citing lack of authorization or wrong capability lane) rather than a normal execution report. Retry once with `rcode-executor`; do not retry the same persona a second time.
|
|
35
39
|
</step>
|
|
36
40
|
|
|
37
41
|
<process>
|
|
@@ -382,6 +386,35 @@ TASK_COMMIT=$(git rev-parse --short HEAD)
|
|
|
382
386
|
TASK_COMMITS+=("Task ${TASK_NUM}: ${TASK_COMMIT}")
|
|
383
387
|
```
|
|
384
388
|
|
|
389
|
+
**5.5. Sync dashboard state (closes the manual/`--wave N` state-sync gap):**
|
|
390
|
+
|
|
391
|
+
The dashboard reads task status from `.rcode/state.json`'s `phases[].sprints[].stories[]`, not from SUMMARY.md or git. `state story move` only works on a story that's already registered — and the planner does not register stories into state.json when it writes SPRINT.md (see `#590` fallback in `scanner.js`). Without this step, a task that is fully committed and tested still shows "todo" on the dashboard until the ENTIRE phase's status flips to complete, which is silently wrong for any partial/single-wave run (`--wave N`, a manually re-run single plan, a checkpoint-interrupted resume).
|
|
392
|
+
|
|
393
|
+
Run this after every task's commit, not just at the end of the plan:
|
|
394
|
+
|
|
395
|
+
```bash
|
|
396
|
+
# Ensure the parent sprint is marked active (idempotent — no-op if already started)
|
|
397
|
+
node ".rcode/bin/rcode-tools.cjs" state sprint start --sprint "${SPRINT_ID}" >/dev/null 2>&1
|
|
398
|
+
|
|
399
|
+
# Try to move the story directly by its SPRINT.md task id first
|
|
400
|
+
MOVE_RESULT=$(node ".rcode/bin/rcode-tools.cjs" state story move --id "${TASK_ID}" --status done 2>&1)
|
|
401
|
+
if echo "$MOVE_RESULT" | grep -qi "not found"; then
|
|
402
|
+
# Story was never registered (planner doesn't pre-register) — register it now.
|
|
403
|
+
# state story add assigns ids in {sprint}.{N} sequence matching the order
|
|
404
|
+
# tasks are added, which matches SPRINT.md's own <task id> numbering as
|
|
405
|
+
# long as tasks are committed in the order they appear in the file.
|
|
406
|
+
node ".rcode/bin/rcode-tools.cjs" state story add --sprint "${SPRINT_ID}" --title "${TASK_TITLE}" >/dev/null 2>&1
|
|
407
|
+
node ".rcode/bin/rcode-tools.cjs" state story move --id "${TASK_ID}" --status done >/dev/null 2>&1
|
|
408
|
+
fi
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
Non-fatal: if either `rcode-tools.cjs` call fails for a reason other than "not found" (e.g. state.json corrupted), log a one-line warning and continue — dashboard staleness is not a reason to fail a task that verified and committed successfully.
|
|
412
|
+
|
|
413
|
+
When the whole plan finishes (all tasks done), mark the sprint complete too:
|
|
414
|
+
```bash
|
|
415
|
+
node ".rcode/bin/rcode-tools.cjs" state sprint complete --sprint "${SPRINT_ID}" >/dev/null 2>&1
|
|
416
|
+
```
|
|
417
|
+
|
|
385
418
|
**6. Check for untracked generated files:**
|
|
386
419
|
```bash
|
|
387
420
|
git status --short | grep '^??'
|
|
@@ -28,7 +28,7 @@ export function DecisionsView() {
|
|
|
28
28
|
if (!decisions.length) {
|
|
29
29
|
return html`
|
|
30
30
|
<div id="view-decisions" class="view active">
|
|
31
|
-
<div class="view-title">Decisions (ADRs)</div>
|
|
31
|
+
<div class="view-title">Decisions (Architecture Decision Records — ADRs)</div>
|
|
32
32
|
<div class="empty">
|
|
33
33
|
No decisions recorded yet.
|
|
34
34
|
<div class="empty-action">Decisions made during /rcode-council appear here</div>
|
|
@@ -47,7 +47,7 @@ export function DecisionsView() {
|
|
|
47
47
|
|
|
48
48
|
return html`
|
|
49
49
|
<div id="view-decisions" class="view active">
|
|
50
|
-
<div class="view-title">Decisions (ADRs)</div>
|
|
50
|
+
<div class="view-title">Decisions (Architecture Decision Records — ADRs)</div>
|
|
51
51
|
<div class="filter-bar">
|
|
52
52
|
<input
|
|
53
53
|
class="filter-input"
|