Skip to content

fix: derive plan path from feature.json in update-agent-context#3069

Open
amirreza225 wants to merge 5 commits into
github:mainfrom
amirreza225:fix/3067-feature-json-plan-path
Open

fix: derive plan path from feature.json in update-agent-context#3069
amirreza225 wants to merge 5 commits into
github:mainfrom
amirreza225:fix/3067-feature-json-plan-path

Conversation

@amirreza225

Copy link
Copy Markdown

Summary

  • update-agent-context.sh and update-agent-context.ps1 now prefer .specify/feature.json (written by /speckit-specify) over the mtime heuristic when no explicit plan_path argument is given
  • Falls back to most-recently-modified specs/*/plan.md only when feature.json is absent or the derived plan.md does not exist yet (e.g. /speckit-plan hasn't run yet)
  • Handles absolute feature_directory values in both scripts, normalizing to project-relative paths for the context file output
  • PowerShell implementation is PS 5.1-compatible: nested Join-Path, IsPathRooted guard (Unix Join-Path does not treat absolute ChildPaths as "wins"), and manual prefix-strip instead of GetRelativePath

Fixes #3067

AI disclosure

This PR was written with AI assistance (Claude Code). All changes were reviewed, tested, and understood by me before submission.

Manual test results

Agent: Claude Code | OS/Shell: macOS/zsh

Command tested Notes
/speckit.specify/speckit.plan CLAUDE.md references the correct active feature's plan.md
Multi-spec repo with stale plan touched after specify CLAUDE.md still points to active feature, not the stale one

Test plan

  • uv run pytest tests/extensions/test_update_agent_context_feature_json.py — 4 new bash tests pass (2 PS skipped, no pwsh on CI)
  • uv run pytest tests/test_agent_config_consistency.py tests/extensions/test_extension_agent_context.py — all 62 existing tests pass

When `plan_path` is omitted, prefer `.specify/feature.json`
(written by /speckit-specify) over the mtime heuristic. The
old approach picked the most recently modified `specs/*/plan.md`,
which could inject an unrelated plan into CLAUDE.md if another
spec's plan was touched after the active feature directory was
created but before its own plan.md existed.

Bash: handle both relative and absolute feature_directory values,
normalizing absolute paths back to project-relative for the
context file. Fall back to mtime only when feature.json is absent
or the derived plan.md does not yet exist.

PowerShell: same logic, PS 5.1-compatible (nested Join-Path,
IsPathRooted guard to avoid Unix Join-Path mis-joining absolute
ChildPaths, manual prefix-strip instead of GetRelativePath).

Fixes github#3067
Copilot AI review requested due to automatic review settings June 19, 2026 12:47
@amirreza225 amirreza225 requested a review from mnriem as a code owner June 19, 2026 12:47

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the agent-context extension’s context refresh scripts so that, when no explicit plan_path argument is provided, they derive the active plan.md from .specify/feature.json (written by /speckit-specify) and only fall back to the “most recently modified specs/*/plan.md” heuristic when that source is unavailable or not yet present. It also adds tests to validate the new feature.json-first behavior.

Changes:

  • Bash: Prefer .specify/feature.json to resolve the active plan.md, with mtime fallback retained.
  • PowerShell: Implement the same “feature.json-first, mtime-second” selection logic and normalize feature paths.
  • Tests: Add coverage ensuring feature.json overrides the mtime heuristic (bash + PowerShell where available).

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 3 comments.

File Description
extensions/agent-context/scripts/bash/update-agent-context.sh Uses .specify/feature.json to select the active plan when plan_path isn’t provided; retains mtime fallback.
extensions/agent-context/scripts/powershell/update-agent-context.ps1 Mirrors bash behavior in PowerShell, including absolute-path normalization and mtime fallback.
tests/extensions/test_update_agent_context_feature_json.py Adds tests validating feature.json-first selection and stale-plan avoidance.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread extensions/agent-context/scripts/bash/update-agent-context.sh
Comment thread tests/extensions/test_update_agent_context_feature_json.py

@mnriem mnriem left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please address Copilot feedback

- bash: add explicit encoding="utf-8" to feature.json open() call
- powershell: replace GetRelativePath (.NET 5+ only) with manual
  prefix-strip in mtime fallback for PS 5.1 compatibility
- tests: add coverage for absolute feature_directory values
  (under and outside PROJECT_ROOT)
@amirreza225

Copy link
Copy Markdown
Author

All three Copilot comments have been addressed in commit 80600a2:

  1. GetRelativePath not available in PS 5.1 — replaced with a manual prefix-strip using StartsWith/Substring in both the feature.json path and the mtime fallback sections of update-agent-context.ps1.

  2. open() missing explicit encoding — added encoding="utf-8" to the json.load(open(...)) call in the feature.json snippet in update-agent-context.sh.

  3. No tests for absolute feature_directory — added two new bash tests:

    • test_bash_absolute_feature_dir_under_project_root: absolute path under $PROJECT_ROOT → context file contains project-relative path (not machine-specific absolute)
    • test_bash_absolute_feature_dir_outside_project_root: absolute path outside $PROJECT_ROOT → absolute path preserved as-is

All 70 tests pass locally.

@amirreza225

Copy link
Copy Markdown
Author

Please address Copilot feedback

Done

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 3 out of 3 changed files in this pull request and generated 5 comments.

Comment thread tests/extensions/test_update_agent_context_feature_json.py Outdated
Comment thread tests/extensions/test_update_agent_context_feature_json.py Outdated
Comment thread tests/extensions/test_update_agent_context_feature_json.py Outdated
Comment thread tests/extensions/test_update_agent_context_feature_json.py Outdated
Comment thread tests/extensions/test_update_agent_context_feature_json.py Outdated
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings June 19, 2026 18:07

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.

Comment thread tests/extensions/test_update_agent_context_feature_json.py Outdated
Comment thread tests/extensions/test_update_agent_context_feature_json.py Outdated

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 3/3 changed files
  • Comments generated: 2

Comment thread extensions/agent-context/scripts/bash/update-agent-context.sh
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings June 19, 2026 18:52

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.

Comment on lines +177 to +180
$fj = Get-Content -LiteralPath $FeatureJson -Raw -Encoding UTF8 | ConvertFrom-Json
$featureDir = $fj.feature_directory
if ($featureDir -is [string]) { $featureDir = $featureDir.TrimEnd('\\', '/') }
if ($featureDir) {
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: update-agent-context.sh:123-137

3 participants