docs(changelog): expand [Unreleased] with all 1.39.0-rc.4 changes since v1.38.5 (#2799)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
106
CHANGELOG.md
106
CHANGELOG.md
@@ -13,6 +13,22 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
||||
~700, useful for local LLMs with 32K–128K context (Sonnet 4.6 / Opus 4.7 don't need
|
||||
it). Re-run `gsd update` without `--minimal` to expand to the full surface. The
|
||||
install manifest now records `mode: "minimal" | "full"`. (#2762)
|
||||
- **`/gsd-edit-phase` command** — modify any field of an existing phase in ROADMAP.md
|
||||
without changing its number or position. Supports `--force` to skip the confirmation
|
||||
diff, validates `depends_on` references, and updates STATE.md on write. (#2617)
|
||||
- **Post-merge build & test gate** — execute-phase step 5.6 now runs in both parallel
|
||||
and serial mode. Adds a build gate that auto-detects the build command from
|
||||
`workflow.build_command` config, then falls back to Xcode (`.xcodeproj`), Makefile,
|
||||
Justfile, Cargo, Go, Python, or npm. Xcode/iOS projects run `xcodebuild build` and
|
||||
`xcodebuild test` automatically. (#2720)
|
||||
- **Extended runtime model profiles** — RUNTIME_PROFILE_MAP now covers `gemini`,
|
||||
`qwen`, `opencode`, and `copilot` runtimes with full three-tier (fast/balanced/opus)
|
||||
model mappings. Group B runtimes (kilo, cline, cursor, windsurf, augment, trae,
|
||||
codebuddy, antigravity) fall through to the existing unknown-runtime fallback. (#2612)
|
||||
- **Workstream config inheritance** — when `GSD_WORKSTREAM` is set, the root
|
||||
`.planning/config.json` is loaded first and deep-merged with the workstream config
|
||||
(workstream wins on conflict). Explicit `null` in a workstream config now correctly
|
||||
overrides a root value. (#2714)
|
||||
|
||||
### Fixed
|
||||
- **Codex install no longer corrupts existing `~/.codex/config.toml`** — the installer
|
||||
@@ -26,6 +42,96 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
||||
values, and unsupported value types. Both pre-write helper failures and write-time
|
||||
failures restore the pre-install snapshot and abort with a clear error rather than
|
||||
warn-and-continue. (#2760)
|
||||
- **Codex `[[agents]]` reverted to `[agents.<name>]` struct format** — the sequence
|
||||
format introduced in #2645 is rejected by codex-cli 0.124.0 with "invalid type:
|
||||
sequence, expected struct AgentsToml". Reverted to struct format which is correct for
|
||||
0.120.0+. The self-healing stripper handles both formats for configs written by prior
|
||||
GSD versions. (#2727)
|
||||
- **Codex legacy `[hooks]` map format auto-migrated** — Codex 0.124.0 requires
|
||||
`[[hooks]]` array-of-tables; old GSD installs that wrote `[hooks.shell]` map-style
|
||||
now self-heal on the next `gsd install --codex`. (#2637)
|
||||
- **`gsd-sdk` PATH verification tightened** — installer now probes for an executable
|
||||
`gsd-sdk` shim on PATH after confirming `sdk/dist/cli.js` is present, and attempts
|
||||
to materialize one via symlink at `~/.local/bin/gsd-sdk` when absent. Only prints
|
||||
`✓ GSD SDK ready` when the probe succeeds. (#2775, #2777)
|
||||
- **USER-PROFILE.md no longer triggers false "locally modified" warning** — the file
|
||||
was both preserved across reinstalls and tracked in `gsd-file-manifest.json`, causing
|
||||
the stale-hash diff to fire on every profile refresh. `USER_OWNED_ARTIFACTS` is now a
|
||||
single source of truth used by both the preserve and manifest write paths. (#2771)
|
||||
- **All `gsd-sdk query` handlers now respect `--ws`** — 18+ handlers accepted
|
||||
`_workstream` but never forwarded it to `planningPaths`/`loadConfig`. Workstream now
|
||||
scopes path resolution correctly in `initNewProject`, `configGet`, `configSet`,
|
||||
`commit`, `validateHealth`, and all other handlers. (#2731)
|
||||
- **`resolveModel` threads workstream** — config-query `resolveModel` ignored
|
||||
`_workstream` unlike `configGet`/`configPath`, so different workstreams with different
|
||||
`model_profile` settings would get the root profile instead of their own. (#2742)
|
||||
- **`parseMustHavesBlock` quoted strings** — fully-quoted truths containing `:` (e.g.
|
||||
`"App-side UUIDv4: generated locally"`) fell into the kv-parse branch, the regex
|
||||
failed, and `current` stayed as `{}`, crashing `annotate-dependencies` with
|
||||
`TypeError: t.trim is not a function`. Fixed in both `frontmatter.cjs` and
|
||||
`roadmap.cjs`. (#2757, #2734)
|
||||
- **`gsd state complete-phase` subcommand** — was missing; unknown subcommands fell
|
||||
through to `cmdStateLoad`. Now updates `Status`, `Last Activity`, and
|
||||
`Current Position` to `COMPLETE`. (#2735)
|
||||
- **Non-string `depends_on` values preserved** — numeric YAML scalars and kv-shaped
|
||||
truths were silently dropped by `annotate-dependencies` via an early `typeof t !==
|
||||
'string'` skip. A `coerceTruthToString` helper now coerces numbers/booleans and
|
||||
extracts a string field from object-shaped items. (#2770)
|
||||
- **Worktree isolation scoped to submodule-touching plans** — the previous guard
|
||||
unconditionally set `USE_WORKTREES=false` when `.gitmodules` existed. Now parses
|
||||
submodule paths and intersects per-plan `files_modified`; only plans that touch a
|
||||
submodule path skip worktree isolation. (#2772)
|
||||
- **Worktree cleanup uses inclusion filter** — the exclusion-based cleanup
|
||||
(`grep -v "$(pwd)$"`) failed in multi-workspace and cross-drive Windows setups,
|
||||
destroying the workspace's `.git` pointer. Cleanup now targets only
|
||||
`.claude/worktrees/agent-*` paths, which agent-spawned worktrees always use. (#2774)
|
||||
- **`Requirements:` header variants all parse correctly** — both `**Requirements:**`
|
||||
(colon inside bold) and `**Requirements**:` (colon outside bold) now match in
|
||||
`extractReqIds` and the `phase complete` traceability sweep. (#2769)
|
||||
- **`gsd-sdk query commit` paths passed via `--files`** — 81 invocations across 50
|
||||
files were passing paths positionally, which appended them to the commit subject and
|
||||
triggered the wholesale-stage fallback. All sites updated. (#2767)
|
||||
- **Phase detection in bullet/bold ROADMAP formats** — `phaseAdd`'s regex only matched
|
||||
heading format (`## Phase N:`), missing bullet checklist and bold entries. Broadened
|
||||
to all three formats with filesystem fallback on zero matches. (#2726)
|
||||
- **Plan-line overwrite when `**Plans:**` is empty** — `\s*` after `**Plans:**`
|
||||
matched newlines, causing `[^\n]+` to consume the first plan checkbox. Replaced with
|
||||
`[ \t]*` (horizontal whitespace only) and added section-boundary lookahead. (#2728)
|
||||
- **Phase-lifecycle `<details>`-wrapped active milestone** — `replaceInCurrentMilestone`
|
||||
silently dropped replacements when the active milestone was itself inside a `<details>`
|
||||
block (the after-slice was empty). Falls back to locating the last complete
|
||||
`<details>…</details>` span. (#2641)
|
||||
- **Phase-lifecycle project-code-prefixed directory names** — filesystem fallback regex
|
||||
`/^(\d+)-/` missed directories like `CK-45-foundation`. Updated to
|
||||
`/^(?:[A-Z][A-Z0-9]*-)?(\d+)-/i`.
|
||||
- **`roadmap.update-plan-progress` regex** — `\s*` crossing newlines shared the same
|
||||
corruption vector as `planCountPattern`; replaced with `[ \t]*` plus section-boundary
|
||||
lookahead.
|
||||
- **`replaceInCurrentMilestone` fast-path guard** — the `after.trim().length > 0`
|
||||
check incorrectly triggered when `after` contained only footer text, returning
|
||||
unchanged content instead of falling through to the slow path.
|
||||
- **`graphify` CLI updated to subcommand form** — `graphify . --update` was removed in
|
||||
v0.4.x in favour of `graphify update .`. Version detection now tries
|
||||
`graphify --version` before falling back to the Python importlib query. (#2732)
|
||||
- **LM Studio model identity validated in review workflow** — captures the full API
|
||||
response and compares the top-level `.model` field against `LM_STUDIO_MODEL`, emitting
|
||||
a warning when the served model differs. Empty-content responses no longer write error
|
||||
text into the review temp file (same fix applied to llama.cpp). (#2721)
|
||||
- **SDK `globalDefaults` preserved for nested config keys** — `workflow`, `git`,
|
||||
`hooks`, `agent_skills`, and `features` sections were missing the `globalDefaults`
|
||||
spread at the correct precedence level, silently dropping user values from
|
||||
`~/.gsd/defaults.json`. (#2673)
|
||||
- **`MODEL_ALIAS_MAP` updated to `claude-opus-4-7`** — both `MODEL_ALIAS_MAP` and
|
||||
`RUNTIME_PROFILE_MAP.claude.opus` were pinned to `claude-opus-4-6`. (#2733)
|
||||
- **Orchestrators wait for subagents before continuing** — 26 GSD workflow files now
|
||||
include an explicit `ORCHESTRATOR RULE` blockquote immediately after every `Task()`
|
||||
spawn, preventing the Codex parallel-work anti-pattern where the parent continues
|
||||
reading files and producing conflicting output. (#2729)
|
||||
|
||||
### Performance
|
||||
- **`discuss-phase` lazy file loading** — entry-point `@file` directives replaced with
|
||||
on-demand `Read()` calls gated behind mode routing. Tokens loaded at skill entry drop
|
||||
from ~13k to near zero; only the branch actually invoked is loaded. (#2606)
|
||||
|
||||
## [1.38.5] - 2026-04-25
|
||||
|
||||
|
||||
Reference in New Issue
Block a user