diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index d28e6a2..5bd580d 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -6,14 +6,14 @@ }, "metadata": { "description": "AI-native Vibe Coding — From idea to Deploy, Zero friction. Unified plugin with 13 agents, 5 commands, 6 skills, team-based parallel build, 20 design styles, screen-spec generator.", - "version": "0.1.11" + "version": "0.1.12" }, "plugins": [ { "name": "wigtn-plugins", "description": "Unified AI-native Vibe Coding plugin: PRD generation, digging analysis, screen-spec (IA / User Flow / Wireframe HTML / Dev Handoff), team-based parallel implementation, quality-gated auto-commit, 20 design styles, frontend (React/Next.js), backend (NestJS/Prisma), mobile (React Native/Expo), AI integration (STT/LLM), DevOps (Docker/CI-CD). 13 agents, 5 commands, 6 skills.", "source": "./plugins/wigtn-plugins", - "version": "0.1.11", + "version": "0.1.12", "author": { "name": "WIGTN Crew", "email": "rukais2294@gmail.com" diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 4786fd0..8d0d637 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "wigtn-plugins", - "version": "0.1.11", + "version": "0.1.12", "description": "AI-native Vibe Coding — From idea to Deploy, Zero friction. Unified plugin with 13 agents, 5 commands, 6 skills, team-based parallel build, 20 design styles.", "author": { "name": "WIGTN Crew", diff --git a/CLAUDE.md b/CLAUDE.md index ea6fa6e..d6f9c41 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,7 +4,7 @@ A unified Claude Code plugin enabling AI-powered Vibe Coding: idea to production with minimal friction. -**Version**: 0.1.11 +**Version**: 0.1.12 **License**: Apache-2.0 **Repository**: https://github.com/wigtn/wigtn-plugins @@ -64,7 +64,8 @@ plugins/wigtn-plugins/ - **PASS** (커밋): critical 0 AND major 0 AND minor <5 - **Security Critical**: critical의 부분집합 → 항상 FAIL (zero-tolerance, no score-cap hack) - **정밀도**: major+ finding은 게이트 반영 전 adversarial refute 1회로 오탐 강등 -- **하드 게이트 (hook 강제)**: 게이트가 프롬프트라 컨텍스트가 차면 스킵될 수 있으므로, `hooks.json`의 PreToolUse가 `git commit`을 가로채 강제한다. 롤업 PASS 시 `/auto-commit`이 `.wigtn/gate-pass`(mtime = PASS 시각)를 기록하고, 커밋 메시지에 `Quality Score:` 신호가 있는데 30분 내 아티팩트가 없으면 hook이 커밋을 **차단(exit 2)**한다. 수동 커밋(신호 없음)·`--no-review`(신호 제거)는 무마찰. 하네스가 막으므로 프롬프트 준수에 의존하지 않는다. +- **하드 게이트 (hook 강제)**: 게이트가 프롬프트라 컨텍스트가 차면 스킵될 수 있으므로, `hooks.json`의 PreToolUse가 `git commit`을 가로채 강제한다. 롤업 PASS 시 `/auto-commit`이 repo 루트(`git rev-parse --show-toplevel`)의 `.wigtn/gate-pass`(mtime = PASS 시각)를 기록하고, 커밋 메시지에 `Quality Score:` 신호가 있는데 30분 내 아티팩트가 없으면 hook이 커밋을 **차단(exit 2)**한다. 수동 커밋(신호 없음)·`--no-review`(신호 제거)는 무마찰. hook·auto-commit 모두 toplevel 기준이라 하위 디렉토리 cwd에서도 일치한다. +- **객관 체크 게이트 (opt-in, PASS 날조 방어)**: gate-pass는 모델이 쓰는 아티팩트라 리뷰 날조 시 함께 써질 수 있다. repo 루트에 실행권한 있는 `.wigtn/checks.sh`(예: `npm test && npm run typecheck`)를 두면 hook이 커밋 직전 **직접 실행**해 non-zero면 차단 — 테스트/타입체크 exit code는 모델이 못 꾸미므로 "리뷰가 좋았음"이 아니라 "객관 검증 통과"를 강제한다. 파일 없으면 기존 무마찰 동작. ## Conventions diff --git a/README.cn.md b/README.cn.md index 7eba972..adc9efb 100644 --- a/README.cn.md +++ b/README.cn.md @@ -6,7 +6,7 @@ **一个插件。13 个智能体。从创意到生产。** -![Version](https://img.shields.io/badge/v0.1.11-Unified_Plugin-FF6B6B?style=for-the-badge) +![Version](https://img.shields.io/badge/v0.1.12-Unified_Plugin-FF6B6B?style=for-the-badge) ![Agents](https://img.shields.io/badge/13-Agents-5A67D8?style=for-the-badge) ![Commands](https://img.shields.io/badge/5-Commands-38B2AC?style=for-the-badge) ![Skills](https://img.shields.io/badge/6-Skills-00D4AA?style=for-the-badge) diff --git a/README.ko.md b/README.ko.md index ccc62e4..087a8c0 100644 --- a/README.ko.md +++ b/README.ko.md @@ -6,7 +6,7 @@ **하나의 플러그인. 13개 에이전트. 아이디어에서 프로덕션까지.** -![Version](https://img.shields.io/badge/v0.1.11-Unified_Plugin-FF6B6B?style=for-the-badge) +![Version](https://img.shields.io/badge/v0.1.12-Unified_Plugin-FF6B6B?style=for-the-badge) ![Agents](https://img.shields.io/badge/13-Agents-5A67D8?style=for-the-badge) ![Commands](https://img.shields.io/badge/5-Commands-38B2AC?style=for-the-badge) ![Skills](https://img.shields.io/badge/6-Skills-00D4AA?style=for-the-badge) diff --git a/README.md b/README.md index 9eb7913..cb1640f 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ **One plugin. 13 agents. From idea to production.** -![Version](https://img.shields.io/badge/v0.1.11-Unified_Plugin-FF6B6B?style=for-the-badge) +![Version](https://img.shields.io/badge/v0.1.12-Unified_Plugin-FF6B6B?style=for-the-badge) ![Agents](https://img.shields.io/badge/13-Agents-5A67D8?style=for-the-badge) ![Commands](https://img.shields.io/badge/5-Commands-38B2AC?style=for-the-badge) ![Skills](https://img.shields.io/badge/6-Skills-00D4AA?style=for-the-badge) diff --git a/plugins/wigtn-plugins/.claude-plugin/plugin.json b/plugins/wigtn-plugins/.claude-plugin/plugin.json index f0be779..9ab339b 100644 --- a/plugins/wigtn-plugins/.claude-plugin/plugin.json +++ b/plugins/wigtn-plugins/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "wigtn-plugins", - "version": "0.1.11", + "version": "0.1.12", "description": "AI-native Vibe Coding — From idea to Deploy, Zero friction. 13 agents, 5 commands, 6 skills, team-based parallel build, 20 design styles, screen-spec generator (IA / User Flow / Wireframe HTML), WIGTN-brand PPT generator.", "agents": [ "./agents/architecture-decision.md", diff --git a/plugins/wigtn-plugins/commands/auto-commit.md b/plugins/wigtn-plugins/commands/auto-commit.md index 7272f25..a926d1e 100644 --- a/plugins/wigtn-plugins/commands/auto-commit.md +++ b/plugins/wigtn-plugins/commands/auto-commit.md @@ -223,16 +223,20 @@ ls PLAN_*.md PRD.md 2>/dev/null > **왜**: 품질 게이트는 프롬프트 지시라 컨텍스트가 차면 조용히 스킵될 수 있다. hook(`hooks.json` PreToolUse)이 커밋을 실제로 차단하려면, "게이트가 방금 PASS했다"는 **검증 아티팩트**가 필요하다. 이 단계는 롤업이 **PASS**로 확정됐을 때만 실행한다(FAIL/WARN-잔존이면 실행하지 않음 → 아티팩트 없음 → 커밋 hook 차단). ```bash -# 롤업이 PASS로 확정된 경우에만 실행한다. -grep -qxF '.wigtn/' .git/info/exclude 2>/dev/null || echo '.wigtn/' >> .git/info/exclude # 아티팩트가 커밋에 섞이지 않도록 (tracked .gitignore 미변경) -mkdir -p .wigtn -echo "PASS $(git rev-parse --short HEAD 2>/dev/null || echo INITIAL) $(git rev-parse --abbrev-ref HEAD 2>/dev/null)" > .wigtn/gate-pass # mtime = PASS 시각. hook이 30분 신선도로 검증 +# 롤업이 PASS로 확정된 경우에만 실행한다. 아티팩트는 git repo 루트(toplevel)에 둔다 +# — hook이 하위 디렉토리에서 커밋해도 동일 위치를 조회하도록(cwd 결합 방지). +ROOT=$(git rev-parse --show-toplevel 2>/dev/null || echo .) +grep -qxF '.wigtn/' "$ROOT/.git/info/exclude" 2>/dev/null || echo '.wigtn/' >> "$ROOT/.git/info/exclude" # 커밋 혼입 방지 (tracked .gitignore 미변경) +mkdir -p "$ROOT/.wigtn" +echo "PASS $(git rev-parse --short HEAD 2>/dev/null || echo INITIAL) $(git rev-parse --abbrev-ref HEAD 2>/dev/null)" > "$ROOT/.wigtn/gate-pass" # mtime = PASS 시각. hook이 30분 신선도로 검증 ``` -- **아티팩트 의미**: 파일의 **mtime**이 곧 "게이트 PASS 시각"이다. hook은 `find .wigtn/gate-pass -mmin -30`으로 **30분 이내 PASS**만 유효 처리한다 — 지난 세션의 오래된 통과나, 게이트를 건너뛴 커밋을 막는다. +- **아티팩트 의미**: 파일의 **mtime**이 곧 "게이트 PASS 시각"이다. hook은 `find "$ROOT/.wigtn/gate-pass" -mmin -30`으로 **30분 이내 PASS**만 유효 처리한다 — 지난 세션의 오래된 통과나, 게이트를 건너뛴 커밋을 막는다. `$ROOT`는 hook·auto-commit 양쪽 모두 `git rev-parse --show-toplevel`로 해석하므로 하위 디렉토리 cwd에서도 일치한다. - **재작성 금지**: 이 파일은 오직 이 단계(PASS 확정)에서만 쓴다. Step 6에서 커밋 직전에 `touch`하거나 미리 생성하지 않는다 — 그러면 하드 게이트가 무의미해진다. - **커밋 후 자동 무효화**: 다음 게이트 실행 전까지 mtime이 늙으므로 재사용되지 않는다. 별도 삭제 로직 불필요. +> **객관 체크 게이트 (opt-in, PASS 날조 방어)**: 위 gate-pass는 결국 프롬프트가 쓰는 아티팩트라 모델이 리뷰를 날조하고 써버릴 수 있다("리뷰가 일어났고 PASS했음"만 강제, "리뷰가 좋았음"은 아님). 이를 닫으려면 repo 루트에 실행권한 있는 **`.wigtn/checks.sh`**(예: `#!/usr/bin/env bash` + `npm test && npm run typecheck`)를 두면, hook이 커밋 직전 **직접 실행**해 non-zero면 차단한다. 테스트/타입체크의 exit code는 모델이 못 꾸미므로, 팀이 이 파일을 두는 순간 게이트가 "리뷰가 좋았음"이 아니라 **"객관 검증이 실제로 통과했음"**을 강제한다. 파일이 없으면 기존 동작(무마찰). 주의: hook에서 동기 실행되므로 checks.sh는 빠른 것(타입체크·핵심 테스트)으로 유지한다. + ### Step 4: 변경 분석 및 타입 결정 | 변경 패턴 | 커밋 타입 | 예시 | diff --git a/plugins/wigtn-plugins/hooks/hooks.json b/plugins/wigtn-plugins/hooks/hooks.json index 9f987d6..1500984 100644 --- a/plugins/wigtn-plugins/hooks/hooks.json +++ b/plugins/wigtn-plugins/hooks/hooks.json @@ -15,7 +15,7 @@ "hooks": [ { "type": "command", - "command": "bash -c 'INPUT=$(cat); CMD=$(echo \"$INPUT\" | jq -r \".tool_input.command // empty\"); if echo \"$CMD\" | grep -qE \"git[[:space:]]+commit\" && echo \"$CMD\" | grep -q \"Quality Score:\"; then if [ -z \"$(find .wigtn/gate-pass -mmin -30 2>/dev/null)\" ]; then echo \"BLOCKED: WIGTN quality gate did not pass for this pipeline commit. The message contains a Quality Score: line but no fresh PASS verdict (.wigtn/gate-pass) was recorded. Run the /auto-commit quality gate so it writes the verdict, or use --no-review for an emergency hotfix (it omits the Quality Score line and bypasses this check).\" >&2; exit 2; fi; fi'" + "command": "bash -c 'INPUT=$(cat); CMD=$(echo \"$INPUT\" | jq -r \".tool_input.command // empty\"); if echo \"$CMD\" | grep -qE \"git[[:space:]]+commit\" && echo \"$CMD\" | grep -q \"Quality Score:\"; then ROOT=$(git rev-parse --show-toplevel 2>/dev/null || echo .); if [ -z \"$(find \"$ROOT/.wigtn/gate-pass\" -mmin -30 2>/dev/null)\" ]; then echo \"BLOCKED: WIGTN quality gate did not pass for this pipeline commit. Message has a Quality Score: line but no fresh PASS verdict ($ROOT/.wigtn/gate-pass). Run the /auto-commit quality gate, or use --no-review for an emergency hotfix (omits the Quality Score line).\" >&2; exit 2; fi; if [ -x \"$ROOT/.wigtn/checks.sh\" ]; then if ! ( cd \"$ROOT\" && ./.wigtn/checks.sh >/tmp/wigtn-checks.log 2>&1 ); then echo \"BLOCKED: WIGTN objective checks (.wigtn/checks.sh) failed — a fabricated review cannot pass real test/typecheck exit codes. See /tmp/wigtn-checks.log.\" >&2; exit 2; fi; fi; fi'" } ] }