#!/usr/bin/env bash # 共享 Development-Manager 执行器薄入口:核对 deps/development-manager 与 index 钉住的提交一致且无修改, # 构建(或复用缓存的)dm-server 二进制后执行 `dm-server agent-exec`。结果仅为本地完整性证据(SELF)。 set -euo pipefail script_dir=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd) root=$(cd -- "$script_dir/.." && pwd) sub_path="deps/development-manager" dm="$root/$sub_path" die() { echo "agent-exec: $*" >&2 exit 2 } # 在 DM checkout 内执行 git;清除 pre-commit 可能继承的仓库环境变量,避免读取超级仓的索引或对象库。 dm_git() { env -u GIT_DIR -u GIT_WORK_TREE -u GIT_INDEX_FILE git -C "$dm" "$@" } index_entry=$(git -C "$root" ls-files -s -- "$sub_path") || index_entry="" if [ -z "$index_entry" ]; then die "index 中不存在 $sub_path 的 gitlink,拒绝执行" fi read -r mode pin _ <<<"$index_entry" if [ "$mode" != "160000" ]; then die "$sub_path 在 index 中不是 gitlink(mode=$mode),拒绝执行" fi if ! [[ "$pin" =~ ^[0-9a-f]{40}$ ]]; then die "$sub_path 的 index 钉住值无效:$pin" fi remedy="请运行 git submodule update --init deps/development-manager" if [ ! -e "$dm/.git" ]; then die "$sub_path 未检出;$remedy" fi top=$(dm_git rev-parse --show-toplevel 2>/dev/null) || top="" real_dm=$(cd -- "$dm" && pwd -P) if [ -z "$top" ] || [ "$top" != "$real_dm" ]; then die "$sub_path 不是独立的 checkout;$remedy" fi head=$(dm_git rev-parse HEAD 2>/dev/null) || head="" if [ "$head" != "$pin" ]; then die "$sub_path 的 HEAD(${head:-未知})与 index 钉住的 $pin 不一致;$remedy" fi dirty=$(dm_git status --porcelain --ignore-submodules=all) || die "无法读取 $sub_path 的工作区状态,拒绝执行" if [ -n "$dirty" ]; then die "$sub_path 存在未提交的修改,拒绝执行" fi cache_dir="${AGENT_EXEC_CACHE:-${XDG_CACHE_HOME:-$HOME/.cache}/agent-system-dev/agent-exec}" bin="$cache_dir/dm-server-$pin" if [ ! -x "$bin" ]; then command -v go >/dev/null 2>&1 || die "未找到 go,无法构建 dm-server" mkdir -p "$cache_dir" tmp=$(mktemp "$cache_dir/.dm-server-$pin.XXXXXX") trap 'rm -f "$tmp"' EXIT if ! (cd "$dm" && env -u GIT_DIR -u GIT_WORK_TREE -u GIT_INDEX_FILE GOWORK=off go build -trimpath -o "$tmp" ./cmd/dm-server); then die "构建 dm-server 失败" fi chmod 0755 "$tmp" mv -f "$tmp" "$bin" trap - EXIT fi exec "$bin" agent-exec "$@"