Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@
"name": "MTGVim"
},
"metadata": {
"description": "SoT gap, route, reflect, learn, browser-verify와 grill/prototype/merge-conflict/handoff/handon/to-prd/to-issues/arch-review를 제공하는 TigerKit Claude Code 플러그인입니다."
"description": "TigerKit `/tk:*` command plugin입니다."
},
"plugins": [
{
"name": "tk",
"source": "./",
"description": "SoT gap, route, reflect, learn, browser-verify와 grill/grooming/prototype/merge-conflict/handoff/handon/to-prd/to-issues/arch-review를 제공하는 TigerKit Claude Code 플러그인입니다. active command surface는 /tk:gap, /tk:route, /tk:reflect, /tk:learn, /tk:browser-verify, /tk:grill, /tk:grooming, /tk:prototype, /tk:arch-review, /tk:merge-conflict, /tk:handoff, /tk:handon, /tk:to-prd, /tk:to-issues 입니다."
"description": "TigerKit `/tk:*` command plugin입니다."
}
]
}
4 changes: 2 additions & 2 deletions .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "tk",
"description": "SoT gap, route, reflect, learn, browser-verify와 grill/grooming/prototype/merge-conflict/handoff/handon/to-prd/to-issues/arch-review를 제공하는 TigerKit Claude Code 플러그인입니다.",
"version": "16.5.13",
"description": "TigerKit `/tk:*` command plugin입니다.",
"version": "16.5.14",
"author": {
"name": "MTGVim"
},
Expand Down
11 changes: 11 additions & 0 deletions .tigerkit/docs/usage.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,17 @@ TigerKit은 일반 autopilot 또는 sealed workflow engine이 아니라 gap, rou
- `/tk:to-issues`는 vertical-slice issue draft 생성 surface입니다.
- `/tk:browser-verify`는 번들된 browser-verify 엔진 skill을 현재 repo에 대응하는 `~/.tigerkit/repos/<repo-key>/browser-verify/` profile과 함께 사용하는 direct QA / behavior verification surface입니다.

## Shared command boundaries

아래 경계는 여러 TigerKit command가 공통으로 따릅니다.

- command가 직접 소유한 artifact surface가 아니면 source tree, plugin manifest, command source를 임의 수정하지 않습니다.
- preview-only / report-only / draft-only surface는 그 경계를 유지하고 구현 완료처럼 포장하지 않습니다.
- 승인 우회, silent publish, chat dump, endless questioning, fake success 같은 운영 노이즈를 만들지 않습니다.
- 이미 코드나 artifact에서 직접 확인 가능한 사실은 다시 묻거나 장문 복붙으로 반복하지 않습니다.

개별 command 문서는 이 공통 경계를 반복 나열하는 대신, command-specific guidance와 output contract에 집중합니다.

## Command Surface

| Command | 역할 | 저장 성격 |
Expand Down
12 changes: 3 additions & 9 deletions commands/arch-review.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
description: boundary, ownership, coupling, 반복 마찰을 evidence-first로 검토하는 report-only 구조 리뷰입니다.
description: 구조 마찰을 검토합니다.
argument-hint: '"<scope|goal|area>" [--target <path|area>] [--print-checklist]'
---

Expand All @@ -9,14 +9,15 @@ argument-hint: '"<scope|goal|area>" [--target <path|area>] [--print-checklist]'

목표: `/tk:arch-review`는 코드베이스의 구조적 문제를 바로 리팩터링으로 밀지 않고, boundary, ownership, coupling, 반복 마찰을 evidence-first로 검토하는 report-only surface입니다.

canonical skill:
related wrapper skill:

```text
skills/arch-review/SKILL.md
```

## Core boundary

- 공통 command boundary는 `.tigerkit/docs/usage.md`의 `Shared command boundaries`를 따릅니다.
- report-only
- source 수정 금지
- auto refactor 금지
Expand Down Expand Up @@ -59,10 +60,3 @@ Arch Review 완료 | Arch Review 중단
▶️ First step:
- <one concrete next step>
```

## Non-goals

- 구현 완료 보고
- 근거 없는 대수술 제안
- source write 없는 척하면서 사실상 리팩터링 강행
- README/RFC 작성만으로 구조 문제가 해결됐다고 주장
13 changes: 3 additions & 10 deletions commands/browser-verify.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
description: 번들된 browser-verify 엔진 skill을 `~/.tigerkit` repo profile과 함께 사용하는 direct QA / behavior verification surface입니다.
description: browser-verify QA를 실행합니다.
argument-hint: '"<screen or verify task>" [--mode <env-diff|figma-diff|behavior-verify>] [--print-profile-template]'
---

Expand All @@ -9,7 +9,7 @@ argument-hint: '"<screen or verify task>" [--mode <env-diff|figma-diff|behavior-

목표: `/tk:browser-verify`는 프로비저닝 command가 아니라 direct QA surface입니다. 번들된 browser-verify 엔진 skill 지식을 사용하고, 현재 repo에 대응하는 `~/.tigerkit` repo-scoped profile을 읽어 visual QA / env diff / layout regression / SoT 대비 runtime behavior 검증을 수행합니다.

canonical skill:
related wrapper skill:

```text
skills/browser-verify/SKILL.md
Expand All @@ -21,6 +21,7 @@ browser-verify = bundled engine skill + repo-scoped profile -> run browser verif

## Core boundary

- 공통 command boundary는 `.tigerkit/docs/usage.md`의 `Shared command boundaries`를 따릅니다.
- 이 command는 user-global provisioning mode를 만들지 않습니다.
- engine install/update를 수행하지 않습니다.
- current repo에 대응하는 `~/.tigerkit` profile만 읽고, profile이 없을 때만 같은 repo-scoped 경로에 missing profile 파일을 신규 생성합니다.
Expand Down Expand Up @@ -135,11 +136,3 @@ Browser Verify 준비 완료 | Browser Verify 프로필 생성 완료 | Browser
/tk:browser-verify "figma랑 이 화면 맞는지 봐줘" --mode figma-diff
/tk:browser-verify "이 티켓 기준으로 저장 플로우가 실제로 동작하는지 검증" --mode behavior-verify
```

## Non-goals

- engine provisioning
- user-global profile provisioning
- full install/update workflow
- forced overwrite / merge of profile assets
- legacy profile auto-migration
128 changes: 20 additions & 108 deletions commands/gap.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
description: SoT와 현재 구현의 차이를 구현 전에 한 번 점검하는 분석 명령입니다.
description: SoT gap을 분석합니다.
argument-hint: "[SoT refs or pasted source] [--target <path|area>] [--print-report]"
---

Expand All @@ -11,7 +11,7 @@ argument-hint: "[SoT refs or pasted source] [--target <path|area>] [--print-repo

이 명령은 workflow를 생성하거나 고정하지 않습니다.

canonical skill:
related wrapper skill:

```text
skills/gap/SKILL.md
Expand Down Expand Up @@ -133,134 +133,46 @@ packet은 최소한 아래를 담아야 합니다.

`precedence.status`는 `resolved | unresolved`를 구분해야 하며, unresolved source conflict는 packet에서도 조용히 병합하지 않습니다. `Current`가 plan이나 generated artifact뿐이면 packet의 evidence type도 그대로 남겨, route나 후속 surface가 그것을 implementation proof로 착각하지 않게 합니다.

실제 저장이 필요할 때는 최종 markdown report를 만든 뒤 **설치된 TigerKit plugin cache에서 helper를 발견한 다음** 사용합니다. 현재 작업 repo의 `scripts/` 상대경로를 가정하면 안 되고, `CLAUDE_PLUGIN_ROOT`가 비어 있거나 marketplace mirror를 가리키는 경우도 있으므로 installPath/cache를 직접 확인합니다.
실제 저장이 필요할 때는 최종 markdown report를 만든 뒤 설치된 TigerKit helper `scripts/tigerkit_state.py`를 호출합니다. `CLAUDE_PLUGIN_ROOT`가 있으면 그것을 우선 쓰고, 없으면 설치된 plugin root를 조회합니다. command 문서는 현재 작업 repo에 TigerKit `scripts/`가 있다고 가정하지 않습니다.

enabled `tk@tiger-kit` install이 이 source checkout보다 오래되어 `draft-paths`, `gap-packet-paths`, `read-gap-packet`, `write-gap-packet` 같은 helper subcommand에서 `invalid choice`가 나오면 먼저 marketplace/plugin을 업데이트하거나, matching checkout/install root를 `CLAUDE_PLUGIN_ROOT`로 지정해야 합니다.

```bash
claude plugin marketplace update tiger-kit
claude plugin install tk@tiger-kit --scope user
```

```bash
TIGERKIT_STATE_SCRIPT="$({
python3 - <<'PY'
import json, re, subprocess
from pathlib import Path

def version_key_text(text: str):
try:
return tuple(int(part) for part in text.split('.'))
except Exception:
return (0,)

def version_key_path(path: Path):
return version_key_text(path.parent.parent.name)

def cache_path_for_version(version: str):
path = Path.home() / '.claude/plugins/cache/tiger-kit/tk' / version / 'scripts' / 'tigerkit_state.py'
return path if path.is_file() else None

candidates = []
seen = set()
try:
details = subprocess.check_output(['claude', 'plugin', 'details', 'tk'], text=True)
first = details.splitlines()[0].strip()
match = re.match(r'^tk\s+(\d+(?:\.\d+)*)$', first)
if match:
path = cache_path_for_version(match.group(1))
if path:
candidates.append(path)
seen.add(str(path))
except Exception:
pass
try:
plugins = json.loads(subprocess.check_output(['claude', 'plugin', 'list', '--json'], text=True))
except Exception:
plugins = []
for item in plugins:
if item.get('id') == 'tk@tiger-kit' and item.get('enabled'):
path = Path(item.get('installPath', '')) / 'scripts' / 'tigerkit_state.py'
if path.is_file() and str(path) not in seen:
candidates.append(path)
seen.add(str(path))
for path in sorted(Path.home().glob('.claude/plugins/cache/tiger-kit/tk/*/scripts/tigerkit_state.py'), key=version_key_path, reverse=True):
if str(path) not in seen:
candidates.append(path)
seen.add(str(path))
if not candidates:
raise SystemExit('TigerKit helper not found in installed plugin cache. Run `claude plugin marketplace update tiger-kit` and reinstall/update `tk@tiger-kit`.')
print(candidates[0])
PY
})"
python3 "$TIGERKIT_STATE_SCRIPT" write-gap --repo-root "$PWD" --report-file /absolute/path/to/final-gap-report.md
TIGERKIT_PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$({ claude plugin list --json | python3 -c 'import json,sys; print(next(item["installPath"] for item in json.load(sys.stdin) if item.get("id") == "tk@tiger-kit" and item.get("enabled")))'; })}"
python3 "$TIGERKIT_PLUGIN_ROOT/scripts/tigerkit_state.py" write-gap --repo-root "$PWD" --report-file /absolute/path/to/final-gap-report.md
```

packet path만 확인하려면:

```bash
python3 "$TIGERKIT_STATE_SCRIPT" gap-packet-paths --repo-root "$PWD"
TIGERKIT_PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$({ claude plugin list --json | python3 -c 'import json,sys; print(next(item["installPath"] for item in json.load(sys.stdin) if item.get("id") == "tk@tiger-kit" and item.get("enabled")))'; })}"
python3 "$TIGERKIT_PLUGIN_ROOT/scripts/tigerkit_state.py" gap-packet-paths --repo-root "$PWD"
```

현재 same repo/scope packet을 읽으려면:

```bash
python3 "$TIGERKIT_STATE_SCRIPT" read-gap-packet --repo-root "$PWD"
TIGERKIT_PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$({ claude plugin list --json | python3 -c 'import json,sys; print(next(item["installPath"] for item in json.load(sys.stdin) if item.get("id") == "tk@tiger-kit" and item.get("enabled")))'; })}"
python3 "$TIGERKIT_PLUGIN_ROOT/scripts/tigerkit_state.py" read-gap-packet --repo-root "$PWD"
```

packet json을 저장하려면:

```bash
python3 "$TIGERKIT_STATE_SCRIPT" write-gap-packet --repo-root "$PWD" --packet-file /absolute/path/to/final-gap-packet.json
TIGERKIT_PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$({ claude plugin list --json | python3 -c 'import json,sys; print(next(item["installPath"] for item in json.load(sys.stdin) if item.get("id") == "tk@tiger-kit" and item.get("enabled")))'; })}"
python3 "$TIGERKIT_PLUGIN_ROOT/scripts/tigerkit_state.py" write-gap-packet --repo-root "$PWD" --packet-file /absolute/path/to/final-gap-packet.json
```

stdin으로 직접 넘길 수도 있습니다.

```bash
TIGERKIT_STATE_SCRIPT="$({
python3 - <<'PY'
import json, re, subprocess
from pathlib import Path

def version_key_text(text: str):
try:
return tuple(int(part) for part in text.split('.'))
except Exception:
return (0,)

def version_key_path(path: Path):
return version_key_text(path.parent.parent.name)

def cache_path_for_version(version: str):
path = Path.home() / '.claude/plugins/cache/tiger-kit/tk' / version / 'scripts' / 'tigerkit_state.py'
return path if path.is_file() else None

candidates = []
seen = set()
try:
details = subprocess.check_output(['claude', 'plugin', 'details', 'tk'], text=True)
first = details.splitlines()[0].strip()
match = re.match(r'^tk\s+(\d+(?:\.\d+)*)$', first)
if match:
path = cache_path_for_version(match.group(1))
if path:
candidates.append(path)
seen.add(str(path))
except Exception:
pass
try:
plugins = json.loads(subprocess.check_output(['claude', 'plugin', 'list', '--json'], text=True))
except Exception:
plugins = []
for item in plugins:
if item.get('id') == 'tk@tiger-kit' and item.get('enabled'):
path = Path(item.get('installPath', '')) / 'scripts' / 'tigerkit_state.py'
if path.is_file() and str(path) not in seen:
candidates.append(path)
seen.add(str(path))
for path in sorted(Path.home().glob('.claude/plugins/cache/tiger-kit/tk/*/scripts/tigerkit_state.py'), key=version_key_path, reverse=True):
if str(path) not in seen:
candidates.append(path)
seen.add(str(path))
if not candidates:
raise SystemExit('TigerKit helper not found in installed plugin cache. Run `claude plugin marketplace update tiger-kit` and reinstall/update `tk@tiger-kit`.')
print(candidates[0])
PY
})"
python3 "$TIGERKIT_STATE_SCRIPT" write-gap --repo-root "$PWD" <<'EOF'
TIGERKIT_PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$({ claude plugin list --json | python3 -c 'import json,sys; print(next(item["installPath"] for item in json.load(sys.stdin) if item.get("id") == "tk@tiger-kit" and item.get("enabled")))'; })}"
python3 "$TIGERKIT_PLUGIN_ROOT/scripts/tigerkit_state.py" write-gap --repo-root "$PWD" <<'EOF'
<final gap markdown>
EOF
```
Expand Down
12 changes: 3 additions & 9 deletions commands/grill.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
description: 계획, 설계, RFC, 개선안을 수렴형 질문으로 압박 검증합니다.
description: 계획 허점을 압박 검증합니다.
argument-hint: '"<plan|RFC|idea>" [--target <path|area>] [--print-checklist]'
---

Expand All @@ -11,14 +11,15 @@ argument-hint: '"<plan|RFC|idea>" [--target <path|area>] [--print-checklist]'

사용자가 질문의 답을 모른다고 직접 말하면, 질문 자체는 유지하되 막힘을 줄이기 위해 브레인스토밍 기반 후보를 최대 3개까지 제안할 수 있습니다.

canonical skill:
related wrapper skill:

```text
skills/grill/SKILL.md
```

## Core boundary

- 공통 command boundary는 `.tigerkit/docs/usage.md`의 `Shared command boundaries`를 따릅니다.
- preview-only
- source 수정 금지
- 자동 문서 수정 금지
Expand Down Expand Up @@ -70,10 +71,3 @@ Grill 진행중 | Grill 중단 | Grill 요약
▶️ Next step:
- <continue questioning | proceed with assumptions | stop>
```

## Non-goals

- interview for its own sake
- source write
- approval을 가장한 강압적 endless questioning
- 이미 코드베이스에서 확인 가능한 사실 재질문
15 changes: 5 additions & 10 deletions commands/grooming.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
description: guidance 파일을 평가하고, 승인된 user-global 변경만 직접 반영하며 나머지는 suggestion-only로 남깁니다.
description: guidance 정비안을 점검합니다.
argument-hint: '"[scope]" [--scope <user|repo|all>] [--apply=true]'
---

Expand All @@ -9,21 +9,24 @@ argument-hint: '"[scope]" [--scope <user|repo|all>] [--apply=true]'

목표: `/tk:grooming`은 guidance 파일을 바로 정리했다고 주장하지 않고, 먼저 report-only로 평가한 뒤 승인된 범위의 user-global guidance만 직접 apply하고 나머지는 suggestion-only로 남기는 정비 surface입니다.

canonical skill:
related wrapper skill:

```text
skills/grooming/SKILL.md
```

## Core boundary

- 공통 command boundary는 `.tigerkit/docs/usage.md`의 `Shared command boundaries`를 따릅니다.
- default report-only
- no-publish 기본
- 승인 전 write 금지
- direct apply 대상은 `user-global` guidance만 허용
- repo shared / repo local guidance는 suggestion-only
- user-global direct apply와 repo suggestion-only가 한 변경 안에 섞이면 전체를 preview-only로 남김
- 원본 파일을 직접 읽고, 세션 주입 사본을 source of truth로 쓰지 않음
- 신규 guidance를 임의 추가하지 않음
- reflect/learn 역할 대체 금지

## Scope contract

Expand Down Expand Up @@ -98,11 +101,3 @@ Grooming 리포트 | Grooming 적용 완료 | Grooming 중단
▶️ Next step:
- <approve apply | review suggestions | rerun with narrower scope>
```

## Non-goals

- repo source code 수정
- repo guidance direct apply
- 신규 guidance를 임의 추가하는 것
- reflect/learn 역할 대체
- 승인 없는 광범위 rewrite
11 changes: 3 additions & 8 deletions commands/handoff.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
description: 다음 세션이나 다른 에이전트가 바로 이어받을 수 있는 handoff를 만듭니다.
description: current-first handoff를 만듭니다.
argument-hint: '"<goal or scope>" [--output <artifact path>] [--print-only]'
---

Expand All @@ -9,14 +9,15 @@ argument-hint: '"<goal or scope>" [--output <artifact path>] [--print-only]'

목표: `/tk:handoff`는 다음 세션이나 다른 에이전트가 바로 이어서 실행할 수 있는 handoff artifact를 만드는 surface입니다.

canonical skill:
related wrapper skill:

```text
skills/handoff/SKILL.md
```

## Core boundary

- 공통 command boundary는 `.tigerkit/docs/usage.md`의 `Shared command boundaries`를 따릅니다.
- 기본은 repo-scoped `~/.tigerkit` root 아래 worktree-scoped current-first write
- 대화 전문 복붙 금지
- 이미 있는 PRD/ADR/issue/diff는 경로/링크 참조 우선
Expand Down Expand Up @@ -72,9 +73,3 @@ Handoff 완료 | Handoff 미리보기 | Handoff 중단
▶️ Next step:
- <what the next agent should do first>
```

## Non-goals

- chat log dump
- vague diary text
- 이미 artifact에 있는 내용을 장문 복붙
Loading
Loading