fix: support fractional slice IDs (e.g. S03.5) in roadmap parser (#681)

The roadmap parser regex used (\w+) to capture slice/task IDs, which
only matches [a-zA-Z0-9_]. Fractional IDs like S03.5 (created by
/gsd steer) contain a dot, causing the parser to skip the entire line.

The dispatcher then jumps from S03 to S04, finds S04 blocked by
the unparsed S03.5, and gives up with 'earlier slice is not complete'.

Update the ID capture group to ([\w.]+) in both:
- roadmap-slices.ts (primary roadmap parser)
- files.ts (plan task parser, for consistency)

This allows dots in slice/task IDs while preserving all existing
behavior for standard IDs like S01, S02, T01, etc.

Closes #681
This commit is contained in:
Tom Boucher 2026-03-16 15:25:58 -04:00
parent a90aa0c8d6
commit 7b014e13fb
2 changed files with 2 additions and 2 deletions

View file

@ -436,7 +436,7 @@ function _parsePlanImpl(content: string): SlicePlan {
let currentTask: TaskPlanEntry | null = null;
for (const line of taskLines) {
const cbMatch = line.match(/^-\s+\[([ xX])\]\s+\*\*(\w+):\s+(.+?)\*\*\s*(.*)/);
const cbMatch = line.match(/^-\s+\[([ xX])\]\s+\*\*([\w.]+):\s+(.+?)\*\*\s*(.*)/);
if (cbMatch) {
if (currentTask) tasks.push(currentTask);

View file

@ -19,7 +19,7 @@ export function parseRoadmapSlices(content: string): RoadmapSliceEntry[] {
let currentSlice: RoadmapSliceEntry | null = null;
for (const line of checkboxItems) {
const cbMatch = line.match(/^\s*-\s+\[([ xX])\]\s+\*\*(\w+):\s+(.+?)\*\*\s*(.*)/);
const cbMatch = line.match(/^\s*-\s+\[([ xX])\]\s+\*\*([\w.]+):\s+(.+?)\*\*\s*(.*)/);
if (cbMatch) {
if (currentSlice) slices.push(currentSlice);