@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.
|
|
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
|
|
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="
|
|
119
|
-
|
|
118
|
+
<div style="margin-top:4px;">
|
|
119
|
+
<${AcceptanceList} text=${t.acceptance}/>
|
|
120
120
|
</div>
|
|
121
121
|
</div>
|
|
122
122
|
`)}
|
package/server/lib/scanner.js
CHANGED
|
@@ -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
|
|
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
|
|
158
|
-
const
|
|
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:
|
|
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;
|