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 as099bdec. Found via post-implementation review of issue #89.
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user