# 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: | proto="${GITHUB_SERVER_URL%%://*}"; host="${GITHUB_SERVER_URL#*://}" url="$proto://actions:${CI_TOKEN}@${host%/}/${GITHUB_REPOSITORY}.git" [ -d .git ] || git init -q . git remote remove origin 2>/dev/null || true git remote add origin "$url" git fetch -q --depth 1 origin "$GITHUB_REF" 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)" cd "$sandbox" npm init -y >/dev/null 2>&1 npm i --no-audit --no-fund --silent "$tarball" npx --no-install designpaca --version npx --no-install designpaca install --target claude-code --scope project --yes test -f .claude/skills/designpaca/SKILL.md || { echo "설치 후 스킬이 없다" >&2; exit 1; } npx --no-install designpaca doctor 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