@hanzlaa/rcode 4.7.2 → 4.7.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/AGENTS.md CHANGED
@@ -24,7 +24,7 @@ If a user says "just keep going" or "don't stop until done", that authorization
24
24
 
25
25
  - Follow [Conventional Commits](https://www.conventionalcommits.org/) format: `type(scope): subject`
26
26
  - Types allowed: `feat`, `fix`, `docs`, `style`, `refactor`, `test`, `chore`, `perf`, `revert`
27
- - Scopes allowed: `agents`, `skills`, `workflows`, `templates`, `dashboard`, `docs`, `config`, `github`, `commands`, `memory`, `brand`, `cli`, `ci`, `release`, `meta`, `tasks`, `migrations`, `refs`, `state`, `hooks`, `install`, `parity`, `triggers`, `dogfood`, `namespace`, `planning`, `insights`, `help`, `roadmap`, `session`, `audits`, `execute`, `executor`, `plan`, `planner`, `readme`, `sync`, `sprint`, `agent-exp`, `extensibility`, `lens-audit`, `tiers`, `build`, `council`, `doctor`, `postinstall`, `progress`, `security`, `tools`, `uninstall`, `update`, `test`, `changelog`, `scopes`, `phases`, `references`, `kanban`, `orchestrator`, `orchpanel`, `status`, `bin`, `brain`, `dogfeed`, `new-project`, `package`, `rcode-tools`, `rihal-tools`, `team`, `usp`, `v4`, `observability`, `audit`, `agent-rules`, `cursor`, `i18n`, `phase`, `scaffold`, `campaign`, `ship`, `getting-started`, `do-router`, `milestone-health`, `modules`, `project-types`, `roadmapper`, `token`, plus numeric phase/sprint scopes (e.g. `docs(15)`, `feat(8.3)`)
27
+ - Scopes allowed: `agents`, `skills`, `workflows`, `templates`, `dashboard`, `docs`, `config`, `github`, `commands`, `memory`, `brand`, `cli`, `ci`, `release`, `meta`, `tasks`, `migrations`, `refs`, `state`, `hooks`, `init`, `install`, `parity`, `triggers`, `dogfood`, `namespace`, `planning`, `insights`, `help`, `roadmap`, `session`, `audits`, `execute`, `executor`, `plan`, `planner`, `readme`, `sync`, `sprint`, `agent-exp`, `extensibility`, `lens-audit`, `tiers`, `build`, `council`, `doctor`, `postinstall`, `progress`, `security`, `tools`, `uninstall`, `update`, `test`, `changelog`, `scopes`, `phases`, `references`, `kanban`, `orchestrator`, `orchpanel`, `status`, `bin`, `brain`, `dogfeed`, `new-project`, `package`, `rcode-tools`, `rihal-tools`, `team`, `usp`, `v4`, `observability`, `audit`, `agent-rules`, `cursor`, `i18n`, `phase`, `scaffold`, `campaign`, `ship`, `getting-started`, `do-router`, `milestone-health`, `modules`, `project-types`, `roadmapper`, `token`, plus numeric phase/sprint scopes (e.g. `docs(15)`, `feat(8.3)`)
28
28
  - Subject: lowercase first letter, imperative mood, no trailing period, under 72 chars
29
29
  - **NEVER add Claude/AI attribution to commit messages.** No "Generated with Claude Code", no "Co-Authored-By: Claude", no "🤖 Generated". The user does not want this.
30
30
  - **NEVER use `--no-verify`** to bypass hooks. If hooks fail, fix the underlying issue.
package/CONTRIBUTING.md CHANGED
@@ -286,6 +286,7 @@ We use [Conventional Commits](https://www.conventionalcommits.org/) format. The
286
286
  - `state` — `.rcode/state.json` and state-manipulation code paths
287
287
  - `refs` — files inside `rcode/references/`
288
288
  - `hooks` — `.claude/hooks/*` and install-time hook wiring
289
+ - `init` — `/rcode-init` command and init-time project bootstrap
289
290
  - `install` — installer flow, manifest, side-effects
290
291
  - `memory` — Memory Bank distillates and templates
291
292
  - `brand` — branding/voice across surfaces
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hanzlaa/rcode",
3
- "version": "4.7.2",
3
+ "version": "4.7.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": {
@@ -17,6 +17,21 @@ import { Icon } from '../icons-client.js';
17
17
  import { TaskPipeline } from './TaskPipeline.js';
18
18
  import { openRunnerPicker } from './RunnerPicker.js';
19
19
 
20
+ // ---- Acceptance criteria: SPRINT.md stores this as "- line\n- line";
21
+ // rendering it as raw text collapses the newlines into one run-on line. ----
22
+ export function AcceptanceList({ text }) {
23
+ const lines = String(text || '')
24
+ .split('\n')
25
+ .map(l => l.replace(/^\s*[-*]\s*/, '').trim())
26
+ .filter(Boolean);
27
+ if (!lines.length) return null;
28
+ return html`
29
+ <ul class="task-actions-list">
30
+ ${lines.map((line, i) => html`<li key=${i} class="task-action-step">${line}</li>`)}
31
+ </ul>
32
+ `;
33
+ }
34
+
20
35
  // ---- Toast helper (shared by CmdHint copy action and any view) ----
21
36
  export function showToast(msg) {
22
37
  const el = document.getElementById('toast');
@@ -372,7 +387,12 @@ export function TaskCard({ task: t }) {
372
387
  <strong>Phase:</strong> P${t.phaseId}${t.phaseName ? ' — ' + t.phaseName : ''}
373
388
  </div>
374
389
  ` : null}
375
- ${t.acceptance ? html`<div class="task-detail-row"><strong>Acceptance:</strong> ${t.acceptance}</div>` : null}
390
+ ${t.acceptance ? html`
391
+ <div class="task-actions">
392
+ <div class="task-actions-title">Acceptance</div>
393
+ <${AcceptanceList} text=${t.acceptance}/>
394
+ </div>
395
+ ` : null}
376
396
  ${t.assignee ? html`<div class="task-detail-row"><strong>Assignee:</strong> ${t.assignee}</div>` : null}
377
397
  ${(t.actions && t.actions.length) ? html`
378
398
  <div class="task-actions">
@@ -12,7 +12,7 @@ import { html, useState } from '../preact.js';
12
12
  import { useStore } from '../store.js';
13
13
  import { pct, humanDate, allSprints, sprintHints, chip, phaseMilestone, currentPhaseId } from '../util.js';
14
14
  import {
15
- Chip, ProgressBar, Breadcrumb, CmdHint, CmdHints, RunningBadge, SprintCard, TaskCard,
15
+ Chip, ProgressBar, Breadcrumb, CmdHint, CmdHints, RunningBadge, SprintCard, TaskCard, AcceptanceList,
16
16
  } from '../components/shared.js';
17
17
  import { openTermPanel, runningInSprint } from '../orchestrator.js';
18
18
  import { openFileViewer } from '../store.js';
@@ -115,8 +115,8 @@ function SprintDetail({ sprint: s, S }) {
115
115
  ${storiesWithAc.map(t => html`
116
116
  <div key=${t.id || t.title} class="item">
117
117
  <div class="item-title">${t.title}</div>
118
- <div style="color:var(--text-secondary);font-size:var(--text-sm);margin-top:4px;">
119
- ${t.acceptance}
118
+ <div style="margin-top:4px;">
119
+ <${AcceptanceList} text=${t.acceptance}/>
120
120
  </div>
121
121
  </div>
122
122
  `)}
@@ -149,17 +149,20 @@ function buildPhaseTree(projectDir, rawPhases, listCached, overrides) {
149
149
  goal = (obj.trim().split('\n').map(s => s.trim()).filter(Boolean)[0] || '').slice(0, 160);
150
150
  }
151
151
 
152
- // Stories: one per <task> block; title from <title>.
152
+ // Stories: one per <task> block; title from the task's own title="..."
153
+ // attribute (current planner output), falling back to a legacy nested
154
+ // <title> child element for older SPRINT.md files.
153
155
  const stories = [];
154
156
  const taskRe = /<task\b([^>]*)>([\s\S]*?)<\/task>/g;
155
157
  let tm;
156
158
  while ((tm = taskRe.exec(text))) {
157
- const idM = tm[1].match(/id="([^"]+)"/);
158
- const titleM = tm[2].match(/<title>([\s\S]*?)<\/title>/);
159
+ const idM = tm[1].match(/id="([^"]+)"/);
160
+ const titleAttrM = tm[1].match(/title="([^"]*)"/);
161
+ const titleTagM = tm[2].match(/<title>([\s\S]*?)<\/title>/);
159
162
  const acM = tm[2].match(/<acceptance_criteria>\s*([\s\S]*?)\s*<\/acceptance_criteria>/);
160
163
  const story = {
161
164
  id: idM ? idM[1] : `${sid}-task-${stories.length + 1}`,
162
- title: titleM ? titleM[1].trim() : `Task ${stories.length + 1}`,
165
+ title: (titleAttrM && titleAttrM[1].trim()) || (titleTagM && titleTagM[1].trim()) || `Task ${stories.length + 1}`,
163
166
  status: phaseComplete ? 'done' : 'todo',
164
167
  };
165
168
  if (ov[story.id]) story.status = ov[story.id].status;