From 089da9763361883b9997348cab335ad1d5259dd5 Mon Sep 17 00:00:00 2001 From: Zhengshou Lai Date: Tue, 11 Aug 2026 21:16:05 +0800 Subject: [PATCH] install: refuse runner worktrees and bind the CLI Python. Keep editable installs on the canonical checkout so PATH mytoolkit cannot silently pick up a stale GHA _work tree. --- AGENTS.md | 12 +++++++++++- Makefile | 27 +++++++++++++++++++++++++-- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 535a50c..db545a3 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -144,10 +144,20 @@ mytoolkit init journal springer mydir 项目使用 `uv` 管理依赖。修改 `pyproject.toml` 后运行 `uv sync` 同步。 +### 本机安装(防串源) + +真源检出:`~/Documents/myBin/mytoolkit`(远程 `apaam/mytoolkit`)。 + ```bash -uv sync +cd ~/Documents/myBin/mytoolkit && make install +python3 -m pip show mytoolkit | grep Editable +# 必须是 .../Documents/myBin/mytoolkit ``` +- **禁止**在 `~/.xiaohe/actions-runner/_work/...` 或任意 GHA worktree 里 `pip install -e` +- **禁止**把 `xiaohe-agent/packages/mytoolkit` submodule 当开发树安装(那只是 pin) +- `make install` 会拒绝上述路径,并装进 PATH 上 `mytoolkit` 所用的 Python + ### 测试 ```bash diff --git a/Makefile b/Makefile index 9e5a996..fcffb9c 100644 --- a/Makefile +++ b/Makefile @@ -1,21 +1,44 @@ ROOT_DIR := $(shell pwd) -PYTHON ?= python3 +# Prefer an explicit PYTHON=; else the interpreter behind `mytoolkit` on PATH; +# else python3. Never silently install into a different Python than the CLI. +CLI_BIN := $(shell command -v mytoolkit 2>/dev/null) +CLI_PY := $(if $(CLI_BIN),$(shell head -1 "$(CLI_BIN)" 2>/dev/null | sed 's|^#!||'),) +PYTHON ?= $(if $(CLI_PY),$(CLI_PY),python3) .PHONY: help install uninstall sync-skill test help: @echo "Usage: make [target]" @echo "" - @echo " install Install mytoolkit in editable mode (current Python) and sync skill" + @echo " install Editable install into CLI Python + sync skill" + @echo " (refuse runner/_work trees; PYTHON=$(PYTHON))" @echo " sync-skill Copy the bundled agent skill to ~/.agents/skills/mytoolkit/" @echo " test Run the pytest suite" @echo " uninstall Uninstall mytoolkit and remove shell completions" +# Canonical checkout: ~/Documents/myBin/mytoolkit (apaam/mytoolkit). +# Do NOT `pip install -e` from GHA _work or xiaohe packages/ submodule. install: + @case "$(ROOT_DIR)" in \ + */_work/*|*/actions-runner/*|*/.xiaohe/actions-runner/*) \ + echo "ERROR: refuse install from runner/worktree: $(ROOT_DIR)" >&2; \ + echo "Use: cd ~/Documents/myBin/mytoolkit && make install" >&2; \ + exit 1 ;; \ + esac + @echo "Installing editable mytoolkit" + @echo " ROOT=$(ROOT_DIR)" + @echo " PYTHON=$(PYTHON)" $(PYTHON) -m pip install -e "$(ROOT_DIR)" --upgrade @echo "Installing shell completions…" @mytoolkit completion install || echo "Warning: completion install failed" @$(MAKE) -s sync-skill + @echo "Editable install:" + @$(PYTHON) -m pip show mytoolkit | awk '/^(Name|Version|Location|Editable project location):/' + @ed="$$($(PYTHON) -m pip show mytoolkit | awk -F': ' '/Editable project location:/ {print $$2}')"; \ + case "$$ed" in \ + */_work/*|*/actions-runner/*) \ + echo "ERROR: Editable still points at runner tree: $$ed" >&2; exit 1 ;; \ + esac sync-skill: @echo "Syncing agent skill to ~/.agents/skills/mytoolkit/ ..."