- 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
105 lines
5 KiB
YAML
105 lines
5 KiB
YAML
# designpaca CI — 자체 러너(linux-builder, host 모드)에서 돈다.
|
|
# host 러너에는 Node 가 없을 수 있으므로 uses: 액션을 쓰지 않고 전부 run: 으로 처리한다.
|
|
name: ci
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
pull_request:
|
|
workflow_dispatch:
|
|
|
|
jobs:
|
|
build:
|
|
runs-on: linux-builder
|
|
steps:
|
|
- name: checkout
|
|
env: { CI_TOKEN: "${{ github.token }}" }
|
|
run: |
|
|
# 토큰을 remote URL 에 넣지 않는다 — URL 은 .git/config 에 남고(host 모드라 다음 잡까지
|
|
# 워크스페이스가 남는다) fetch 명령행에도 보인다. 인증 헤더는 이 fetch 한 번에만 환경변수로 준다
|
|
# (GIT_CONFIG_COUNT, git 2.31+). 예전 실행이 남긴 토큰 URL remote 는 지우고 새로 만든다.
|
|
[ -d .git ] || git init -q .
|
|
git remote remove origin 2>/dev/null || true
|
|
git remote add origin "${GITHUB_SERVER_URL%/}/${GITHUB_REPOSITORY}.git"
|
|
auth="$(printf 'actions:%s' "$CI_TOKEN" | base64 | tr -d '\n')"
|
|
GIT_CONFIG_COUNT=1 GIT_CONFIG_KEY_0=http.extraheader \
|
|
GIT_CONFIG_VALUE_0="Authorization: Basic $auth" \
|
|
git fetch -q --depth 1 origin "$GITHUB_REF"
|
|
unset auth
|
|
git checkout -q -f FETCH_HEAD
|
|
git clean -qfdx
|
|
|
|
- name: 환경 확인
|
|
run: bash build/ci/verify-node.sh
|
|
|
|
- name: 의존성 설치
|
|
run: pnpm install --frozen-lockfile
|
|
|
|
- name: 스킬 문서 검사
|
|
run: node build/ci/lint-skill.mjs packages/skill
|
|
|
|
- name: 타입 검사
|
|
run: pnpm typecheck
|
|
|
|
# 빌드가 테스트보다 먼저다.
|
|
# CLI 테스트는 dist 를 검사하므로, 빌드 전에 돌리면 6개가 전부 SKIP 되고
|
|
# 그래도 초록으로 통과한다. 실측에서 그랬다 — pass 0 인데 성공이었다.
|
|
- name: 빌드
|
|
run: pnpm build
|
|
|
|
- name: 테스트
|
|
run: pnpm test
|
|
|
|
# SKIP 은 통과가 아니다. 건너뛴 테스트가 있으면 여기서 죽인다.
|
|
- name: 테스트가 실제로 돌았는지 확인
|
|
run: |
|
|
out="$(pnpm -r --filter './packages/**' test 2>&1)"
|
|
if echo "$out" | grep -q "# SKIP"; then
|
|
echo "$out" | grep -n "# SKIP" >&2
|
|
echo "건너뛴 테스트가 있다. 초록불이 거짓이 된다." >&2
|
|
exit 1
|
|
fi
|
|
echo "$out" | grep -E "^.*# (pass|fail) " || true
|
|
|
|
- name: 배포물 점검 (npx 경로 검증)
|
|
run: |
|
|
node packages/cli/scripts/verify-package.mjs
|
|
|
|
# 실제 사용자가 겪는 경로 그대로 확인한다.
|
|
# tarball 을 풀어 `node dist/index.js` 를 바로 부르면 안 된다 —
|
|
# 의존성이 없어서 ERR_MODULE_NOT_FOUND 로 죽고, 그건 배포물의 결함이
|
|
# 아니라 검증 방법의 결함이다. npx 는 의존성을 설치한 뒤에 실행한다.
|
|
cd packages/cli
|
|
tarball="$(pwd)/$(npm pack --silent)"
|
|
|
|
# tarball 안에 스킬이 실렸는지 먼저 본다
|
|
probe="$(mktemp -d)"
|
|
tar -xzf "$tarball" -C "$probe"
|
|
test -f "$probe/package/dist/skill/SKILL.md" || { echo "tarball 에 스킬이 없다" >&2; exit 1; }
|
|
head -1 "$probe/package/dist/skill/SKILL.md" | grep -q '^---$' || { echo "SKILL.md 프론트매터가 깨졌다(줄바꿈 확인)" >&2; exit 1; }
|
|
rm -rf "$probe"
|
|
|
|
# 설치 -> 실행 -> 제거 왕복
|
|
sandbox="$(mktemp -d)"
|
|
state_dir="$sandbox/.designpaca-state"
|
|
cd "$sandbox"
|
|
npm init -y >/dev/null 2>&1
|
|
npm i --no-audit --no-fund --silent "$tarball"
|
|
env DESIGNPACA_STATE_DIR="$state_dir" npx --no-install designpaca --version
|
|
env DESIGNPACA_STATE_DIR="$state_dir" npx --no-install designpaca install --target claude-code --scope project --yes
|
|
test -f .claude/skills/designpaca/SKILL.md || { echo "설치 후 스킬이 없다" >&2; exit 1; }
|
|
|
|
# --dry-run 은 어느 명령에서도 쓰지 않아야 한다 (v0.12.0 에서 update 가 무시했다)
|
|
cp "$state_dir/manifest.json" "$sandbox/manifest.before.json"
|
|
env DESIGNPACA_STATE_DIR="$state_dir" npx --no-install designpaca update --dry-run --force
|
|
cmp -s "$state_dir/manifest.json" "$sandbox/manifest.before.json" || { echo "update --dry-run 이 매니페스트를 바꿨다" >&2; exit 1; }
|
|
env DESIGNPACA_STATE_DIR="$state_dir" npx --no-install designpaca uninstall --dry-run --yes
|
|
test -f .claude/skills/designpaca/SKILL.md || { echo "uninstall --dry-run 이 파일을 지웠다" >&2; exit 1; }
|
|
|
|
env DESIGNPACA_STATE_DIR="$state_dir" npx --no-install designpaca doctor
|
|
env DESIGNPACA_STATE_DIR="$state_dir" npx --no-install designpaca uninstall --yes
|
|
test ! -f .claude/skills/designpaca/SKILL.md || { echo "제거 후에도 파일이 남았다" >&2; exit 1; }
|
|
cd / && rm -rf "$sandbox" "$tarball"
|
|
|
|
- name: 사이트 빌드
|
|
run: pnpm build:site
|