Thanks to visit codestin.com
Credit goes to github.com

Skip to content

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

Open
amirreza225 wants to merge 15 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 15 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

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

@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
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
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.

@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

Copilot AI review requested due to automatic review settings June 19, 2026 18:59

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.

@mnriem

mnriem commented Jun 19, 2026

Copy link
Copy Markdown
Collaborator

Please address Copilot feedback

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 6 comments.

Comment thread extensions/agent-context/scripts/bash/update-agent-context.sh
Comment thread extensions/agent-context/scripts/bash/update-agent-context.sh
Comment thread extensions/agent-context/scripts/bash/update-agent-context.sh
Comment thread tests/extensions/test_update_agent_context_feature_json.py
Comment thread tests/extensions/test_update_agent_context_feature_json.py Outdated
Comment thread tests/extensions/test_update_agent_context_feature_json.py
Copilot AI review requested due to automatic review settings June 19, 2026 19:14
@amirreza225

Copy link
Copy Markdown
Author

Please address Copilot feedback. If you are an agent YOU MUST disclose your work!

I'm not an agent, but I get help. 😁

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 thread tests/extensions/test_update_agent_context_feature_json.py

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 no new comments.

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
Comment on lines +191 to +212
@pytest.mark.skipif(not (HAS_PWSH or _WINDOWS_POWERSHELL), reason="no PowerShell available")
def test_ps_uses_feature_json_when_plan_exists(tmp_path: Path) -> None:
"""PowerShell: absolute feature_directory under project root is normalized to relative path."""
_setup_project(tmp_path)
_make_plan(tmp_path, "specs/001-active")
# Use absolute path to exercise the normalization code path
_write_feature_json(tmp_path, str(tmp_path / "specs" / "001-active"))

exe = "pwsh" if HAS_PWSH else _WINDOWS_POWERSHELL
result = subprocess.run(
[exe, "-NoProfile", "-File", str(UPDATE_AGENT_CTX_PS)],
cwd=tmp_path,
capture_output=True,
text=True,
check=False,
)
assert result.returncode == 0, result.stderr + result.stdout
ctx = (tmp_path / "CLAUDE.md").read_text(encoding="utf-8")
# Must be project-relative, not machine-specific absolute
assert "at specs/001-active/plan.md" in ctx
assert tmp_path.resolve().as_posix() not in ctx

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 4 comments.

Comment on lines +24 to +26
HAS_PWSH = shutil.which("pwsh") is not None
_WINDOWS_POWERSHELL = (shutil.which("powershell.exe") or shutil.which("powershell")) if os.name == "nt" else None

Comment on lines +154 to +156
# Write absolute path to feature.json — mtime would pick 000-stale without it
_write_feature_json(tmp_path, str(tmp_path / "specs" / "001-active"))

Comment on lines +181 to +183
_setup_project(project)
_write_feature_json(project, str(external))

Comment on lines +192 to +194
ctx = (project / "CLAUDE.md").read_text(encoding="utf-8")
assert (external / "plan.md").resolve().as_posix() in ctx

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 3 comments.

Comment on lines +219 to +222
os.utime(stale, (now, now))
# Write absolute path to feature.json — mtime would pick 000-stale without it
_write_feature_json(tmp_path, _to_bash_path(tmp_path / "specs" / "001-active"))

Comment on lines +195 to +199
$normRoot = $ProjectRoot.TrimEnd('\', '/') + [System.IO.Path]::DirectorySeparatorChar
$normDir = $featureDir.Replace('/', [System.IO.Path]::DirectorySeparatorChar)
if ($normDir.StartsWith($normRoot, [System.StringComparison]::OrdinalIgnoreCase)) {
$relDir = $normDir.Substring($normRoot.Length)
}
Comment on lines +220 to +223
$fullPath = $candidate.FullName.Replace('\', '/')
$normRoot = $ProjectRoot.Replace('\', '/').TrimEnd('/') + '/'
if ($fullPath.StartsWith($normRoot, [System.StringComparison]::OrdinalIgnoreCase)) {
$PlanPath = $fullPath.Substring($normRoot.Length)

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 +181 to +184
# Must be project-relative, not machine-specific absolute
assert "specs/001-active/plan.md" in ctx
assert "specs/000-stale/plan.md" not in ctx
assert str(tmp_path) not in ctx

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 thread tests/extensions/test_update_agent_context_feature_json.py

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 thread tests/extensions/test_update_agent_context_feature_json.py
@amirreza225

Copy link
Copy Markdown
Author

@mnriem can you please run the checks?

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