fix(kyberforge): stop dotfiles-repo $HOME from shadowing user scope in validate.sh

detect_scope() had the same bug class fixed in new-agent.sh (099bdec):
it checked for a .git directory before checking whether it had reached
$HOME, so a dotfiles-managed home directory (yadm, chezmoi bare-repo,
etc.) made validate.sh misresolve to project scope, deriving the
counterpart as ~/.github/agents/<name>.agent.md instead of the correct
~/.copilot/agents/<name>.agent.md and failing with a false "counterpart
file not found". Check the $HOME boundary before the .git check, same
fix shape as 099bdec.

Found via post-implementation review of issue #89.
This commit is contained in:
2026-08-11 18:34:27 +00:00
parent dc2a41034e
commit ffebdc6584
2 changed files with 31 additions and 1 deletions

View File

@@ -147,16 +147,22 @@ def find_apm_package_root(apm_yml_path):
return False return False
def detect_scope(start_dir): def detect_scope(start_dir):
home = os.path.expanduser('~')
current = os.path.abspath(start_dir) current = os.path.abspath(start_dir)
while True: while True:
apm_yml = os.path.join(current, 'apm.yml') apm_yml = os.path.join(current, 'apm.yml')
if os.path.isfile(apm_yml) and find_apm_package_root(apm_yml): if os.path.isfile(apm_yml) and find_apm_package_root(apm_yml):
return 'plugin', current return 'plugin', current
# $HOME is the user-scope boundary — checked before the .git test
# below, so a dotfiles-managed $HOME (yadm, chezmoi bare-repo, etc.)
# can't shadow user scope by being its own .git repo.
if current == home:
return 'user', home
if os.path.isdir(os.path.join(current, '.git')): if os.path.isdir(os.path.join(current, '.git')):
return 'project', current return 'project', current
parent = os.path.dirname(current) parent = os.path.dirname(current)
if parent == current: if parent == current:
return 'user', os.path.expanduser('~') return 'user', home
current = parent current = parent
agent_dir = os.path.dirname(agent_file) agent_dir = os.path.dirname(agent_file)

View File

@@ -68,6 +68,30 @@ EOF
refute_output --partial "FAIL" refute_output --partial "FAIL"
} }
@test "user scope: \$HOME being a dotfiles .git repo does not shadow user scope" {
local fake_home="$TMPDIR/fakehome"
mkdir -p "$fake_home/.git" "$fake_home/.claude/agents" "$fake_home/.copilot/agents"
cat > "$fake_home/.claude/agents/my-agent.md" <<EOF
---
name: my-agent
description: A valid agent description.
---
You are a test agent. When invoked, do the thing.
EOF
cat > "$fake_home/.copilot/agents/my-agent.agent.md" <<EOF
---
name: my-agent
description: A valid agent description.
---
You are a test agent. When invoked, do the thing.
EOF
run env HOME="$fake_home" bash "$SCRIPT" "$fake_home/.claude/agents/my-agent.md"
assert_success
refute_output --partial "FAIL"
}
@test "--help exits 0 and shows Usage:" { @test "--help exits 0 and shows Usage:" {
run bash "$SCRIPT" --help run bash "$SCRIPT" --help
assert_success assert_success