diff --git a/plugins/kyberforge/skills/agent-author/scripts/new-agent.sh b/plugins/kyberforge/skills/agent-author/scripts/new-agent.sh index 89016ce..7c5bc22 100755 --- a/plugins/kyberforge/skills/agent-author/scripts/new-agent.sh +++ b/plugins/kyberforge/skills/agent-author/scripts/new-agent.sh @@ -91,6 +91,9 @@ ROOT="$(cd "$ROOT" && pwd)" # (plugin/APM scope) — stop and return it. # - an apm.yml with no `type:` field is a marketplace-only manifest — skip # it, keep walking up. +# - reaching $HOME marks the user-scope boundary — stop, even if $HOME is +# itself a .git-tracked dotfiles directory (checked before the .git test +# below, so a dotfiles repo at $HOME can't shadow user scope). # - a .git directory marks the project-scope boundary — stop. # - filesystem root reached with neither found — boundary-reached. find_package_root() { @@ -101,6 +104,11 @@ find_package_root() { echo "$current" return fi + if [[ "$current" == "$HOME" ]]; then + echo "user" + echo "$current" + return + fi if [[ -d "$current/.git" ]]; then echo "project" echo "$current" @@ -127,17 +135,16 @@ case "$WALK_KIND" in SCOPE="plugin" PACKAGE_ROOT="$WALK_ROOT" ;; + user) + SCOPE="user" + ;; project) SCOPE="project" ;; boundary-reached) - if [[ "$ROOT" == "$HOME" ]]; then - SCOPE="user" - else - # Default fallback, same as the pre-walk-up script: no plugin/APM - # marker and not exactly $HOME means project scope. - SCOPE="project" - fi + # Default fallback, same as the pre-walk-up script: no plugin/APM + # marker, no $HOME boundary, and no .git means project scope. + SCOPE="project" ;; esac diff --git a/plugins/kyberforge/skills/agent-author/tests/new-agent.bats b/plugins/kyberforge/skills/agent-author/tests/new-agent.bats index 634cc4c..6546174 100644 --- a/plugins/kyberforge/skills/agent-author/tests/new-agent.bats +++ b/plugins/kyberforge/skills/agent-author/tests/new-agent.bats @@ -211,6 +211,17 @@ teardown() { rm -rf "$FAKE_HOME" } +@test "user scope: \$HOME being a dotfiles .git repo does not shadow user scope" { + FAKE_HOME="$(mktemp -d)" + mkdir "$FAKE_HOME/.git" + run env HOME="$FAKE_HOME" bash "$SCRIPT" my-agent "~" + assert_success + assert [ -f "$FAKE_HOME/.claude/agents/my-agent.md" ] + assert [ -f "$FAKE_HOME/.copilot/agents/my-agent.agent.md" ] + refute [ -d "$FAKE_HOME/.github" ] + rm -rf "$FAKE_HOME" +} + # --------------------------------------------------------------------------- # Name validation # ---------------------------------------------------------------------------