From a43820725f3b766d1a299166348d9ddcaaa4afc4 Mon Sep 17 00:00:00 2001 From: Defame1297 Date: Sun, 5 Jul 2026 12:41:08 +0000 Subject: [PATCH 1/2] fix(install): resolve git hooks dir via git plumbing, drop stale manifest fields MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit scripts/install.sh hardcoded $REPO_ROOT/.git/hooks, which breaks under any git worktree checkout (.git is a file there, not a directory) — this is what blocks every worktree-based agent from pushing cleanly. Resolve the hooks directory via `git rev-parse --git-path hooks` instead, normalizing to an absolute path since git returns it relative to the queried repo root for plain checkouts but absolute for worktrees. Also drops `agents`/`skills` fields from plugins/bin, plugins/core, and plugins/gitea plugin.json where the referenced directories don't exist on main yet (bin never had an agents/ dir; core and gitea's real skill/agent content is still pending merge from an in-flight branch) — these were failing scripts/check-manifests.sh and blocking pushes for unrelated work. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01FNJWdVvdgvZCHi1hZGqgVQ --- plugins/bin/plugin.json | 1 - plugins/core/plugin.json | 4 ---- plugins/gitea/plugin.json | 4 ---- scripts/install.sh | 8 +++++++- tests/test-git-hooks-install.sh | 24 +++++++++++++++++++++++- 5 files changed, 30 insertions(+), 11 deletions(-) diff --git a/plugins/bin/plugin.json b/plugins/bin/plugin.json index ac57fff..dd3aedd 100644 --- a/plugins/bin/plugin.json +++ b/plugins/bin/plugin.json @@ -1,5 +1,4 @@ { - "agents": "agents/", "author": { "email": "defame1297@rkdr.net", "name": "Defame1297" diff --git a/plugins/core/plugin.json b/plugins/core/plugin.json index 0588d10..e0d2f31 100644 --- a/plugins/core/plugin.json +++ b/plugins/core/plugin.json @@ -1,5 +1,4 @@ { - "agents": "agents/", "author": { "email": "defame1297@rkdr.net", "name": "Defame1297" @@ -16,8 +15,5 @@ "license": "MIT", "mcpServers": ".mcp.json", "name": "core", - "skills": [ - "skills/" - ], "version": "1.0.0" } diff --git a/plugins/gitea/plugin.json b/plugins/gitea/plugin.json index c86abc8..18768f1 100644 --- a/plugins/gitea/plugin.json +++ b/plugins/gitea/plugin.json @@ -1,5 +1,4 @@ { - "agents": "agents/", "author": { "email": "defame1297@rkdr.net", "name": "Defame1297" @@ -16,8 +15,5 @@ "license": "MIT", "mcpServers": ".mcp.json", "name": "gitea", - "skills": [ - "skills/" - ], "version": "1.0.0" } diff --git a/scripts/install.sh b/scripts/install.sh index 7d6a82a..db98111 100755 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -30,10 +30,16 @@ done # Install git hooks into the current repo checkout HOOKS_SRC="$REPO_ROOT/scripts/git-hooks" if [[ -d "$HOOKS_SRC" ]]; then + # Unset inherited GIT_DIR/GIT_WORK_TREE — set by git when this script runs as + # a hook (e.g. pre-push), they override -C's directory-based discovery and + # would resolve against the invoking repo instead of $REPO_ROOT. + GIT_HOOKS_DIR="$(env -u GIT_DIR -u GIT_WORK_TREE git -C "$REPO_ROOT" rev-parse --git-path hooks)" + [[ "$GIT_HOOKS_DIR" = /* ]] || GIT_HOOKS_DIR="$REPO_ROOT/$GIT_HOOKS_DIR" + mkdir -p "$GIT_HOOKS_DIR" for hook_file in "$HOOKS_SRC"/*; do [[ -f "$hook_file" ]] || continue hook_name="$(basename "$hook_file")" - dest_hook="$REPO_ROOT/.git/hooks/$hook_name" + dest_hook="$GIT_HOOKS_DIR/$hook_name" cp "$hook_file" "$dest_hook" chmod +x "$dest_hook" done diff --git a/tests/test-git-hooks-install.sh b/tests/test-git-hooks-install.sh index 8785bbd..b4fd5aa 100755 --- a/tests/test-git-hooks-install.sh +++ b/tests/test-git-hooks-install.sh @@ -22,7 +22,7 @@ TEMP_HOME="$(mktemp -d)" trap 'rm -rf "$TEMP_REPO" "$TEMP_HOME"' EXIT mkdir -p "$TEMP_REPO/scripts" -mkdir -p "$TEMP_REPO/.git/hooks" +git -C "$TEMP_REPO" init -q # Minimal deploy-manifest.sh — empty deploy lists so install.sh reaches the # hook-copy block without attempting to copy files that don't exist in the @@ -90,6 +90,28 @@ else fi rmdir "$HOOKS_SRC/not-a-hook" +# --------------------------------------------------------------------------- +echo "" +echo "--- hook install: resolves correctly when GIT_DIR is inherited (hook context) ---" +# --------------------------------------------------------------------------- + +# Git sets GIT_DIR/GIT_WORK_TREE for child processes when this script itself +# runs as a hook (e.g. pre-push). Simulate that and confirm install.sh still +# resolves hooks against $TEMP_REPO, not the inherited GIT_DIR. +OTHER_REPO="$(mktemp -d)" +git -C "$OTHER_REPO" init -q +if HOME="$TEMP_HOME" GIT_DIR="$OTHER_REPO/.git" GIT_WORK_TREE="$OTHER_REPO" \ + bash "$TEMP_REPO/scripts/install.sh" > /dev/null 2>&1; then + if [[ -f "$TEMP_REPO/.git/hooks/post-push" ]]; then + pass "resolves \$TEMP_REPO/.git/hooks/ even with inherited GIT_DIR" + else + fail "installed into inherited GIT_DIR instead of \$TEMP_REPO" + fi +else + fail "install.sh failed when GIT_DIR/GIT_WORK_TREE were inherited" +fi +rm -rf "$OTHER_REPO" + # --------------------------------------------------------------------------- echo "" echo "--- hook install: idempotent ---" -- 2.43.0 From ba53e6544bcfc03c72e237152562b34abce78908 Mon Sep 17 00:00:00 2001 From: Defame1297 Date: Sun, 5 Jul 2026 12:52:52 +0000 Subject: [PATCH 2/2] fix(tests): isolate test-git-hooks-install.sh from inherited GIT_* env vars The test's own `git -C "$TEMP_REPO" init` silently re-targets an inherited GIT_DIR instead of creating a repo in the temp dir when this test itself runs inside a git hook (e.g. pre-push sets GIT_DIR to the invoking repo's gitdir). Unset all GIT_* vars at the top of the script so the temp repo fixture is actually isolated regardless of the calling context. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01FNJWdVvdgvZCHi1hZGqgVQ --- tests/test-git-hooks-install.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/test-git-hooks-install.sh b/tests/test-git-hooks-install.sh index b4fd5aa..8a36350 100755 --- a/tests/test-git-hooks-install.sh +++ b/tests/test-git-hooks-install.sh @@ -3,6 +3,12 @@ # Runs install.sh from a temp repo to avoid touching the real .git/hooks/. set -euo pipefail +# This script may itself run inside a git hook (e.g. pre-push), which sets +# GIT_DIR/GIT_EXEC_PATH/etc. in the environment. `git init`/`git -C` below +# would silently re-target the inherited GIT_DIR instead of creating an +# isolated repo in $TEMP_REPO, so start from a clean slate. +for var in $(compgen -v | grep '^GIT_'); do unset "$var"; done + REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" PASS=0 FAIL=0 -- 2.43.0