Commit Graph

1044 Commits

Author SHA1 Message Date
ROMB
3a417522c9 fix: phase-plan-index returns null/empty for files_modified, objective, task_count (#734)
cmdPhasePlanIndex had 3 mismatches with the canonical XML plan format
defined in templates/phase-prompt.md:

- files_modified: looked up fm['files-modified'] (hyphen) but plans use
  files_modified (underscore). Now checks underscore first, hyphen fallback.
- objective: read from YAML frontmatter but plans put it in <objective>
  XML tag. Now extracts first line from the tag, falls back to frontmatter.
- task_count: matched ## Task N markdown headings but plans use <task>
  XML tags. Now counts XML tags first, markdown fallback.

All three fixes preserve backward compat with legacy markdown-style plans.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 12:58:36 -06:00
Lex Christopherson
011df21dd0 fix(test): expect forward-slash paths in cmdInitTodos assertion
The source now outputs posix paths; update the test to match instead
of using path.join (which produces backslashes on Windows).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 11:38:24 -06:00
Lex Christopherson
9c27da0261 fix(windows): cross-platform path separators, JSON quoting, and dollar signs
- Add toPosixPath() helper to normalize output paths to forward slashes
- Use string concatenation for relative base paths instead of path.join()
- Apply toPosixPath() to all user-facing file paths in init.cjs output
- Use array-based execFileSync in test helpers to bypass shell quoting
  issues with JSON args and dollar signs on Windows cmd.exe

Fixes 7 test failures on Windows: frontmatter set/merge (3), init
path assertions (2), and state dollar-amount corruption (2).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 11:34:36 -06:00
TÂCHES
3affa48306 Merge pull request #783 from Hnturk/claude/laughing-haslett
fix: getMilestoneInfo() returns wrong version after milestone complet…
2026-02-27 09:26:15 -06:00
TÂCHES
10576a58da Merge pull request #785 from Tibsfox/fix/milestones-reverse-chronological
fix(milestone): insert MILESTONES.md entries in reverse chronological order
2026-02-27 09:23:14 -06:00
Tibsfox
732ea09f81 fix(milestone): insert MILESTONES.md entries in reverse chronological order
cmdMilestoneComplete previously appended new milestone entries at the
end of MILESTONES.md. Over successive milestones this produced
chronological order (oldest first), which is counterintuitive — users
expect the most recent milestone at the top.

This fix detects the file header (h1-h3) and inserts the new entry
immediately after it, pushing older entries down. Files without a
recognizable header get the entry prepended. New files still get a
default '# Milestones' header.

Adds 2 tests: single insertion ordering assertion and three-sequential-
completions verification (v1.2 < v1.1 < v1.0 in file order).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 03:46:37 -08:00
Tibsfox
367149d0b2 fix(milestone): scope stats, accomplishments, and archive to current milestone phases
cmdMilestoneComplete previously iterated ALL phase directories in
.planning/phases/, including phases from prior milestones that remain on
disk. This produced inflated stats, stale accomplishments from old
summaries, and --archive-phases moving directories that belong to
earlier milestones.

This fix parses ROADMAP.md to extract phase numbers for the current
milestone, builds a normalized Set for O(1) lookup, and filters all
phase directory operations through an isDirInMilestone() helper.

The helper handles edge cases: leading zeros (01 -> 1), letter suffixes
(3A), decimal phases (3.1), large numbers (456), and excludes
non-numeric directories (notes/, misc/).

Adds 5 tests covering scoped stats, scoped archive, prefix collision
guard, non-numeric directory exclusion, and large phase numbers.

Complements upstream PRs #756 and #783 which fix getMilestoneInfo()
milestone detection — this fix addresses milestone completion scoping.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 03:45:42 -08:00
Hnturk
38c19466ae fix: getMilestoneInfo() returns wrong version after milestone completion (#768)
Strip <details> blocks (shipped milestones) before matching, and extract
both version and name from the same ## heading for consistency.
2026-02-27 11:17:36 +03:00
Ethan Hurst
898b82dee0 fix(quick-1): remove MEDIUM severity test overfitting in config.test.cjs
- branching_strategy assertion changed from strictEqual 'none' to typeof string check
- plan_check and verifier assertions changed from strictEqual true to typeof boolean checks
- Add isolation comments to three tests that touch ~/.gsd/ on real filesystem
- Full test suite passes: 433 tests, all modules above 70% coverage
2026-02-26 05:49:31 +10:00
Ethan Hurst
c9e73e9c94 fix(quick-1): remove HIGH severity test overfitting in 4 test files
- frontmatter.test.cjs: delete FRONTMATTER_SCHEMAS describe block (4 tests asserting on lookup table shape)
- core.test.cjs: replace 12 per-profile per-agent matrix tests with 1 structural validation test
- commands.test.cjs: URL test uses URL.searchParams.get() instead of raw string includes
- state.test.cjs: date assertion uses before/after window to handle midnight boundary safely
2026-02-26 05:49:31 +10:00
Ethan Hurst
17299b6819 test(11-02): add cmdRoadmapUpdatePlanProgress tests
- Missing phase number error path
- Nonexistent phase error path
- No plans found returns updated:false
- Partial completion updates progress table
- Full completion checks checkbox and adds date
- Missing ROADMAP.md returns updated:false
- 6 new tests (24 total in roadmap suite)
- roadmap.cjs coverage jumps from 71% to 99.32%

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 05:49:31 +10:00
Ethan Hurst
5d0e42d69d test(11-01): add cmdRoadmapAnalyze edge-case and cmdRoadmapGetPhase success_criteria tests
- Disk status variants: researched, discussed, empty branches covered
- Milestone extraction: version numbers and headings from ## headings
- Missing phase details: checklist-only phases without detail sections
- Success criteria: array extraction from phase sections
- 7 new tests (18 total in roadmap suite)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 05:49:31 +10:00
Ethan Hurst
74a4851421 test(10-01): add dispatcher error paths and routing branch tests
- No-command and unknown-command error path tests
- Unknown subcommand tests for all 11 command groups
- --cwd= form parsing tests (valid, empty, invalid path)
- Routing branch tests: find-phase, init resume, init verify-work,
  roadmap update-plan-progress, state default load, summary-extract
- 22 new tests covering DISP-01 and DISP-02 requirements
2026-02-26 05:49:31 +10:00
Ethan Hurst
d5ef3b4f1f test(09-02): add cmdStateResolveBlocker and cmdStateRecordSession tests
- 5 tests for cmdStateResolveBlocker: case-insensitive removal, None placeholder on empty, missing text error, missing STATE.md, no-match succeeds
- 5 tests for cmdStateRecordSession: update all fields, timestamp-only update, None default resume-file, missing STATE.md, no session fields returns false
2026-02-26 05:49:31 +10:00
Ethan Hurst
763ff97764 test(09-02): add cmdStateAdvancePlan, cmdStateRecordMetric, cmdStateUpdateProgress tests
- 4 tests for cmdStateAdvancePlan: advance, last-plan complete, missing STATE.md, unparseable fields
- 4 tests for cmdStateRecordMetric: append row, None-yet placeholder, missing fields error, missing STATE.md
- 4 tests for cmdStateUpdateProgress: percent calculation, zero plans, missing Progress field, missing STATE.md
2026-02-26 05:49:31 +10:00
Ethan Hurst
29a87cba7c test(09-01): add cmdStateLoad, cmdStateGet, cmdStatePatch, cmdStateUpdate CLI tests
- 3 cmdStateLoad tests: state+config+roadmap detection, missing STATE.md, --raw flag output
- 5 cmdStateGet tests: full content, bold field extraction, section extraction, missing field error, missing file error
- 5 cmdStatePatch/cmdStateUpdate tests: batch update, failed fields reporting, single field update, field not found, missing STATE.md
2026-02-26 05:49:31 +10:00
Ethan Hurst
1ca7df13a0 test(09-01): add stateExtractField and stateReplaceField unit tests
- 4 stateExtractField tests: simple extraction, colon-in-value, null on missing, case-insensitive
- 4 stateReplaceField tests: replace value, null on missing, preserves surrounding content, round-trip
2026-02-26 05:49:31 +10:00
Ethan Hurst
ec943fec72 test(08-02): add cmdInitProgress, cmdInitQuick, cmdInitMapCodebase, cmdInitNewProject, cmdInitNewMilestone tests
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 05:47:33 +10:00
Ethan Hurst
add7799cee test(08-01): add cmdInitTodos, cmdInitMilestoneOp, cmdInitPhaseOp fallback tests
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 05:47:33 +10:00
Ethan Hurst
c027fe6542 test(07-02): add cmdCommit and cmdWebsearch tests for commands.cjs
cmdCommit tests (5 cases) with real git repos via createTempGitProject:
- commit_docs=false skip, .planning gitignored skip, nothing-to-commit
- Successful commit with hash and git log verification
- Amend mode with commit count verification

cmdWebsearch tests (6 cases) with fetch mocking and stdout interception:
- No API key returns available=false, no query returns error
- Successful response with correct result shape
- URL parameter construction verification
- API error (non-200) handling, network failure handling

Covers requirements CMD-04, CMD-05.
2026-02-26 05:47:33 +10:00
Ethan Hurst
d4ec9c69a9 test(07-01): add utility function tests for commands.cjs
Add 14 new tests across 5 describe blocks:
- cmdGenerateSlug: normal text, special chars, numbers, hyphens, empty input
- cmdCurrentTimestamp: date, filename, full, default format
- cmdListTodos: empty dir, multiple, area filter match/miss, malformed
- cmdVerifyPathExists: file, directory, missing, absolute, no-arg
- cmdResolveModel: known agent, unknown agent, default profile, no-arg

Covers requirements CMD-01, CMD-02, CMD-03.
2026-02-26 05:47:33 +10:00
Ethan Hurst
e0e7929449 test(05-02): add 7 requirements mark-complete ID format and edge case tests
- single requirement checkbox + traceability table update
- mixed prefixes (TEST-XX, REG-XX, INFRA-XX) in single call
- space-separated ID input format
- bracket-wrapped [REQ-01, REQ-02] input format
- mixed valid/invalid IDs: valid updated, invalid in not_found
- idempotent: re-marking already-complete does not corrupt
- missing REQUIREMENTS.md returns {updated: false, reason: 'not found'}
2026-02-26 05:47:19 +10:00
Ethan Hurst
5778ff3e59 test(05-01): add 5 milestone complete archiving and defensive tests
- --archive-phases flag moves phase dirs to milestones/vX.Y-phases/
- archived REQUIREMENTS.md contains header with version, SHIPPED, date
- STATE.md status/activity/description updated during milestone complete
- missing ROADMAP.md handled gracefully without crash
- empty phases directory handled with zero counts
2026-02-26 05:47:19 +10:00
Ethan Hurst
e8e497bc9d test(03-03): add 20 tests for verify references, commits, artifacts, key-links
- verify references (5): valid refs, missing refs, backtick paths, template skip, not found
- verify commits (3): valid hash, invalid hash, mixed valid+invalid
- verify artifacts (6): all criteria pass, missing file, line count, pattern, export, no artifacts
- verify key-links (6): pattern in source, pattern in target, pattern not found, no-pattern
  string inclusion, source not found, no key_links in frontmatter

Notes:
- parseMustHavesBlock requires 4-space indent for block name, 6-space for items,
  8-space for sub-keys; helpers use this format explicitly
- @https:// refs are NOT skipped by verify references (only backtick http refs are);
  test reflects actual behavior (only template expressions are skipped)
2026-02-26 05:47:19 +10:00
Ethan Hurst
ebe96fe9ee test(03-03): add 8 verify-summary tests including REG-03 and search(-1) regression
- verify-summary returns not found for nonexistent summary
- verify-summary passes for valid summary with real files and commits
- verify-summary reports missing files mentioned in backticks
- verify-summary detects self-check pass and fail indicators
- REG-03: returns self_check 'not_found' when no section exists (not a failure)
- search(-1) regression: guard on line 79 prevents -1 from content.search()
- respects --check-count parameter to limit file checking
2026-02-26 05:47:19 +10:00
Ethan Hurst
0342886eb0 feat(03-02): add comprehensive validate-health test suite
- 16 tests covering all 8 health checks (E001-E005, W001-W007, I001)
- 5 repair tests covering config creation, config reset, STATE regeneration, STATE backup, repairable_count
- Tests overall status logic (healthy/degraded/broken)
- All 21 tests pass with zero failures
2026-02-26 05:47:19 +10:00
Ethan Hurst
9f87ba215b test(03-01): add verify plan-structure and phase-completeness tests
- Add validPlanContent() helper for building valid PLAN.md fixtures
- 7 tests for verify plan-structure: missing frontmatter, valid plan,
  missing name, missing action, wave/depends_on, checkpoint/autonomous,
  and file-not-found
- 4 tests for verify phase-completeness: complete phase, missing summary,
  orphan summary, nonexistent phase
- All 14 tests in verify.test.cjs pass (3 existing + 11 new)
2026-02-26 05:47:19 +10:00
Ethan Hurst
339966e27d feat(03-01): add createTempGitProject helper to tests/helpers.cjs
- Creates temp dir with .planning/phases structure
- Initializes git repo with user config
- Writes initial PROJECT.md and commits it
- Exports createTempGitProject alongside existing helpers
2026-02-26 05:47:19 +10:00
Ethan Hurst
15dca91365 test(02-02): add frontmatter merge and validate CLI integration tests
- frontmatter merge: multi-field merge, conflict overwrite, missing file, invalid JSON
- frontmatter validate: all 3 schemas (plan, summary, verification), missing fields
  detection with count, unknown schema error, missing file error
2026-02-26 05:47:19 +10:00
Ethan Hurst
68b22fad10 test(02-02): add frontmatter get and set CLI integration tests
- frontmatter get: all fields, specific field, missing field, missing file, no frontmatter
- frontmatter set: update existing, add new, JSON array value, missing file, body preservation
- Per-test temp file creation and cleanup pattern
2026-02-26 05:47:19 +10:00
Ethan Hurst
ceb10de3dd test(02-01): add spliceFrontmatter, parseMustHavesBlock, and FRONTMATTER_SCHEMAS tests
- spliceFrontmatter: replace existing, add to plain content, exact body preservation
- parseMustHavesBlock: truths as strings, artifacts as objects with min_lines,
  key_links with from/to/via/pattern, nested arrays, missing block, no frontmatter
- FRONTMATTER_SCHEMAS: plan/summary/verification required fields, all schema names
2026-02-26 05:47:19 +10:00
Ethan Hurst
f722a6aeba test(02-01): add extractFrontmatter and reconstructFrontmatter unit tests
- extractFrontmatter: simple key-value, quotes, nested objects, block arrays,
  inline arrays, REG-04 quoted comma edge case, empty/missing frontmatter,
  emoji/non-ASCII, object-to-array conversion, empty line skipping
- reconstructFrontmatter: simple values, empty/short/long arrays, quoted
  colons/hashes, nested objects, nested arrays, null/undefined skipping
- Round-trip identity tests: simple, nested, and multi-type fixtures
2026-02-26 05:47:19 +10:00
Ethan Hurst
a5fd00278d test(01-02): add phase utility, string helper, and roadmap tests
- escapeRegex: special chars, empty string, plain string
- generateSlugInternal: kebab-case, special chars, null/empty
- normalizePhaseName: padding, letters, decimals, multi-level
- comparePhaseNum: numeric sort, letters, decimals, equality
- safeReadFile: existing file, missing file
- pathExistsInternal: existing, non-existing, absolute paths
- getMilestoneInfo: version extraction, defaults
- searchPhaseInDir: finding dirs, plans/summaries, incomplete,
  research/context detection, slug generation
- findPhaseInternal: current phases, archived milestones, null
- getRoadmapPhaseInternal: export exists (REG-02), goal extraction,
  colon-outside-bold format, missing roadmap, section text
2026-02-26 05:47:19 +10:00
Ethan Hurst
abeacf0290 test(01-01): add loadConfig and resolveModelInternal tests
- 10 loadConfig tests: defaults, model_profile, nested keys, branching,
  model_overrides presence/absence (REG-01), invalid JSON, parallelization
- 17 resolveModelInternal tests: all 3 profiles (quality/balanced/budget)
  with 4 agent types each, override precedence, opus->inherit mapping,
  unknown agent fallback
2026-02-26 05:47:19 +10:00
Lex Christopherson
0ca1a59ab3 feat: add YAML frontmatter sync to STATE.md for machine readability 2026-02-25 07:20:14 -06:00
TÂCHES
bc77456204 fix: handle multi-level decimal phases and escape regex in phase operations (#720)
Phase number parsing only matched single-decimal (e.g. 03.2) but crashed
on multi-level decimals (e.g. 03.2.1). Requirement IDs with regex
metacharacters (parentheses, dots) were interpolated raw into RegExp
constructors, causing SyntaxError crashes.

- Add escapeRegex() utility for safe regex interpolation
- Update normalizePhaseName/comparePhaseNum for multi-level decimals
- Replace all .replace('.', '\\.') with escapeRegex() across modules
- Escape reqId before regex interpolation in cmdPhaseComplete
- Update all phase dir matching regexes from (?:\.\d+)? to (?:\.\d+)*
- Add regression test for phase complete 03.2.1

Closes #621

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 13:32:02 -06:00
Colin Johnson
77d434709d Fix STATE.md decision corruption and dollar handling (#701) 2026-02-23 09:55:54 -06:00
TÂCHES
0176a3ec5b fix: map requirements-completed frontmatter in summary-extract (#627) (#716)
Add requirements_completed field to summary-extract output, mapping
from SUMMARY frontmatter requirements-completed key. Enables
/gsd:audit-milestone cross-check to receive data from SUMMARY source.

Re-applied from #631 against refactored codebase (commands.cjs + split tests).

Co-authored-by: Colin Johnson <Solvely-Colin@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 09:55:22 -06:00
TÂCHES
3704829aa6 fix: clamp progress bar percent to prevent RangeError crash (#715)
When orphaned SUMMARY.md files cause totalSummaries > totalPlans, the
progress percentage exceeds 100%, making String.repeat() throw RangeError
on negative arguments. Clamp percent to Math.min(100, ...) at all three
computation sites (state, commands, roadmap).

Closes #633

Co-authored-by: vinicius-tersi <vinicius-tersi@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 09:51:28 -06:00
Lex Christopherson
acb76fee16 test: add TBD guard coverage for phase_req_ids extraction
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 09:35:43 -06:00
dush999
ea3c22d345 fix: propagate phase_req_ids from ROADMAP to workflow agents (#684) (#702)
Added TBD guard test before merge.
2026-02-23 09:35:28 -06:00
Lex Christopherson
3a56a207a5 fix(gsd-tools): support --cwd override for state-snapshot
Add --cwd <path> / --cwd=<path> support so sandboxed subagents running
outside the project root can target a specific directory. Invalid paths
return a clear error. Tests ported to tests/state.test.cjs (the old
monolithic test file was split into domain files on main).

Closes #622

Co-Authored-By: Colin Johnson <colin@solvely.net>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 09:31:06 -06:00
Lex Christopherson
ed11f41ff2 Merge branch 'main' into fix/universal-phase-number-support
Rebased PR #639 onto refactored modular structure (lib/core.cjs, lib/phase.cjs, etc.)

Changes ported from monolithic gsd-tools.cjs to new modules:
- Add comparePhaseNum() helper to lib/core.cjs for universal phase sorting
- Update normalizePhaseName() regex to handle letter-suffix phases (12A, 12B)
- Update all phase-matching regexes across lib/*.cjs with [A-Z]? pattern
- Replace parseFloat-based sorting with comparePhaseNum throughout
- Add 15 new tests for comparePhaseNum, normalizePhaseName, and letter-suffix sorting

Sort order: 12 → 12.1 → 12.2 → 12A → 12A.1 → 12A.2 → 12B → 13

Co-Authored-By: vinicius-tersi <MDQ6VXNlcjUyNDk2NDYw>
2026-02-22 07:16:38 -06:00
Tyler Satre
fa2e156887 refactor: split gsd-tools.test.cjs into domain test files
Move 81 tests (18 describe blocks) from single monolithic test file
into 7 domain-specific test files under tests/ with shared helpers.
Test parity verified: 81/81 pass before and after split.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 10:30:54 -05:00