feat(core,cli): harden install engine and extend skill lint and interview eval

- update only touches the recorded project root; project installs do not
  follow symlinks or junctions; repeated --force rotates .orig backups;
  uninstall never deletes outside the recorded root
- run npm/npx without a shell on Windows and pin optional tool versions
- skip the update check in CI and non-interactive output
- lint: cross-document section pointers, preflight row ids, gate rule
  numbers, per-document size budgets, gate copy equality
- eval: scenarios S19-S21, route and read-cost rejudging, interpretation
  card judging, temp-dir previews and table-form cards no longer fail
This commit is contained in:
Yun Chan 2026-10-06 16:55:38 +09:00
parent ee3bef2ce5
commit 9bcb45cbd3
122 changed files with 5836 additions and 831 deletions

View file

@ -69,6 +69,22 @@ MSG
exit 1
fi
# 이 러너는 PR CI 와 릴리스가 같은 host 를 공유한다. PR 잡이 러너 홈(~/.nvm 등)에 가짜 node 를
# 심으면 위 탐색이 그걸 PATH 에 올릴 수 있다. 실제로 쓰는 바이너리의 위치·해시를 항상 남기고,
# EXPECTED_NODE_SHA256 이 주어지면(릴리스 잡) 다를 때 멈춘다.
node_bin="$(command -v node)"
node_real="$(readlink -f "$node_bin" 2>/dev/null || echo "$node_bin")"
if command -v sha256sum >/dev/null 2>&1; then
node_sum="$(sha256sum "$node_real" | cut -d' ' -f1)"
else
node_sum="$(shasum -a 256 "$node_real" | cut -d' ' -f1)"
fi
echo "node 바이너리: $node_real (sha256 $node_sum)"
if [ -n "${EXPECTED_NODE_SHA256:-}" ] && [ "$node_sum" != "$EXPECTED_NODE_SHA256" ]; then
echo "node 바이너리 해시가 기대값(EXPECTED_NODE_SHA256)과 다르다 — 러너 오염 가능성이 있어 멈춘다" >&2
exit 1
fi
# pnpm 은 corepack 으로 확보한다 — 러너에 전역 설치를 요구하지 않는다
if ! command -v pnpm >/dev/null 2>&1; then
corepack enable >/dev/null 2>&1 || true