@uzysjung/agent-harness 26.83.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.ko.md +279 -0
- package/README.md +306 -0
- package/dist/chunk-SDVAM5JZ.js +775 -0
- package/dist/chunk-SDVAM5JZ.js.map +1 -0
- package/dist/index.js +5412 -0
- package/dist/index.js.map +1 -0
- package/dist/trust-tier-drift.js +67 -0
- package/dist/trust-tier-drift.js.map +1 -0
- package/package.json +53 -0
- package/scripts/prune-ecc.sh +310 -0
- package/templates/CLAUDE.md +86 -0
- package/templates/agents/build-error-resolver.md +114 -0
- package/templates/agents/code-reviewer.md +237 -0
- package/templates/agents/data-analyst.md +69 -0
- package/templates/agents/plan-checker.md +118 -0
- package/templates/agents/reviewer.md +128 -0
- package/templates/agents/security-reviewer.md +108 -0
- package/templates/agents/silent-failure-hunter.md +50 -0
- package/templates/agents/strategist.md +86 -0
- package/templates/antigravity/AGENTS.md.template +58 -0
- package/templates/codex/AGENTS.md.template +94 -0
- package/templates/codex/README.md +69 -0
- package/templates/codex/config.toml.template +108 -0
- package/templates/codex/hooks/README.md +40 -0
- package/templates/codex/hooks/gate-check.sh +7 -0
- package/templates/codex/hooks/hito-counter.sh +7 -0
- package/templates/codex/hooks/session-start.sh +7 -0
- package/templates/codex/hooks/uncommitted-check.sh +7 -0
- package/templates/codex/skills/uzys-build/SKILL.md +24 -0
- package/templates/codex/skills/uzys-plan/SKILL.md +24 -0
- package/templates/codex/skills/uzys-review/SKILL.md +24 -0
- package/templates/codex/skills/uzys-ship/SKILL.md +24 -0
- package/templates/codex/skills/uzys-spec/SKILL.md +28 -0
- package/templates/codex/skills/uzys-test/SKILL.md +24 -0
- package/templates/commands/ecc/checkpoint.md +32 -0
- package/templates/commands/ecc/e2e.md +105 -0
- package/templates/commands/ecc/eval.md +88 -0
- package/templates/commands/ecc/evolve.md +7 -0
- package/templates/commands/ecc/harness-audit.md +73 -0
- package/templates/commands/ecc/instinct-status.md +8 -0
- package/templates/commands/ecc/promote.md +10 -0
- package/templates/commands/ecc/security-scan.md +10 -0
- package/templates/commands/uzys/auto.md +190 -0
- package/templates/commands/uzys/build.md +42 -0
- package/templates/commands/uzys/plan.md +55 -0
- package/templates/commands/uzys/review.md +44 -0
- package/templates/commands/uzys/ship.md +49 -0
- package/templates/commands/uzys/spec.md +93 -0
- package/templates/commands/uzys/test.md +58 -0
- package/templates/docs/PLAN.template.md +102 -0
- package/templates/hooks/agentshield-gate.sh +101 -0
- package/templates/hooks/checkpoint-snapshot.sh +115 -0
- package/templates/hooks/gate-check.sh +138 -0
- package/templates/hooks/hito-counter.sh +26 -0
- package/templates/hooks/karpathy-gate.sh +59 -0
- package/templates/hooks/mcp-pre-exec.sh +104 -0
- package/templates/hooks/protect-files.sh +41 -0
- package/templates/hooks/session-start.sh +40 -0
- package/templates/hooks/spec-drift-check.sh +86 -0
- package/templates/mcp-allowlist.example +24 -0
- package/templates/mcp.json +20 -0
- package/templates/opencode/.opencode/commands/uzys-build.md +22 -0
- package/templates/opencode/.opencode/commands/uzys-plan.md +22 -0
- package/templates/opencode/.opencode/commands/uzys-review.md +22 -0
- package/templates/opencode/.opencode/commands/uzys-ship.md +22 -0
- package/templates/opencode/.opencode/commands/uzys-spec.md +28 -0
- package/templates/opencode/.opencode/commands/uzys-test.md +22 -0
- package/templates/opencode/.opencode/plugins/uzys-harness.ts +146 -0
- package/templates/opencode/AGENTS.md.template +98 -0
- package/templates/opencode/README.md +34 -0
- package/templates/opencode/opencode.json.template +42 -0
- package/templates/project-claude/_base.md +23 -0
- package/templates/project-claude/fragments/csr-fastapi/active-rules.md +13 -0
- package/templates/project-claude/fragments/csr-fastapi/agents.md +5 -0
- package/templates/project-claude/fragments/csr-fastapi/boundaries.md +18 -0
- package/templates/project-claude/fragments/csr-fastapi/commands.md +6 -0
- package/templates/project-claude/fragments/csr-fastapi/plugins.md +2 -0
- package/templates/project-claude/fragments/csr-fastapi/skills.md +5 -0
- package/templates/project-claude/fragments/csr-fastapi/stack.md +6 -0
- package/templates/project-claude/fragments/csr-fastapi/tagline.md +1 -0
- package/templates/project-claude/fragments/csr-fastapi/workflow.md +8 -0
- package/templates/project-claude/fragments/csr-fastify/active-rules.md +13 -0
- package/templates/project-claude/fragments/csr-fastify/agents.md +5 -0
- package/templates/project-claude/fragments/csr-fastify/boundaries.md +18 -0
- package/templates/project-claude/fragments/csr-fastify/commands.md +6 -0
- package/templates/project-claude/fragments/csr-fastify/plugins.md +2 -0
- package/templates/project-claude/fragments/csr-fastify/skills.md +5 -0
- package/templates/project-claude/fragments/csr-fastify/stack.md +6 -0
- package/templates/project-claude/fragments/csr-fastify/tagline.md +1 -0
- package/templates/project-claude/fragments/csr-fastify/workflow.md +8 -0
- package/templates/project-claude/fragments/csr-supabase/active-rules.md +12 -0
- package/templates/project-claude/fragments/csr-supabase/agents.md +5 -0
- package/templates/project-claude/fragments/csr-supabase/boundaries.md +19 -0
- package/templates/project-claude/fragments/csr-supabase/commands.md +6 -0
- package/templates/project-claude/fragments/csr-supabase/plugins.md +4 -0
- package/templates/project-claude/fragments/csr-supabase/skills.md +7 -0
- package/templates/project-claude/fragments/csr-supabase/stack.md +6 -0
- package/templates/project-claude/fragments/csr-supabase/supabase-auth.md +21 -0
- package/templates/project-claude/fragments/csr-supabase/tagline.md +1 -0
- package/templates/project-claude/fragments/csr-supabase/workflow.md +8 -0
- package/templates/project-claude/fragments/data/active-rules.md +10 -0
- package/templates/project-claude/fragments/data/agents.md +6 -0
- package/templates/project-claude/fragments/data/boundaries.md +20 -0
- package/templates/project-claude/fragments/data/commands.md +6 -0
- package/templates/project-claude/fragments/data/plugins.md +2 -0
- package/templates/project-claude/fragments/data/skills.md +3 -0
- package/templates/project-claude/fragments/data/stack.md +7 -0
- package/templates/project-claude/fragments/data/tagline.md +1 -0
- package/templates/project-claude/fragments/data/workflow.md +9 -0
- package/templates/project-claude/fragments/executive/active-rules.md +6 -0
- package/templates/project-claude/fragments/executive/agents.md +6 -0
- package/templates/project-claude/fragments/executive/boundaries.md +17 -0
- package/templates/project-claude/fragments/executive/commands.md +11 -0
- package/templates/project-claude/fragments/executive/plugins.md +1 -0
- package/templates/project-claude/fragments/executive/skills.md +7 -0
- package/templates/project-claude/fragments/executive/stack.md +4 -0
- package/templates/project-claude/fragments/executive/tagline.md +1 -0
- package/templates/project-claude/fragments/executive/workflow.md +10 -0
- package/templates/project-claude/fragments/growth-marketing/active-rules.md +7 -0
- package/templates/project-claude/fragments/growth-marketing/agents.md +6 -0
- package/templates/project-claude/fragments/growth-marketing/boundaries.md +17 -0
- package/templates/project-claude/fragments/growth-marketing/commands.md +11 -0
- package/templates/project-claude/fragments/growth-marketing/plugins.md +9 -0
- package/templates/project-claude/fragments/growth-marketing/skills.md +8 -0
- package/templates/project-claude/fragments/growth-marketing/stack.md +7 -0
- package/templates/project-claude/fragments/growth-marketing/tagline.md +1 -0
- package/templates/project-claude/fragments/growth-marketing/workflow.md +11 -0
- package/templates/project-claude/fragments/project-management/active-rules.md +7 -0
- package/templates/project-claude/fragments/project-management/agents.md +6 -0
- package/templates/project-claude/fragments/project-management/boundaries.md +16 -0
- package/templates/project-claude/fragments/project-management/commands.md +10 -0
- package/templates/project-claude/fragments/project-management/plugins.md +6 -0
- package/templates/project-claude/fragments/project-management/skills.md +5 -0
- package/templates/project-claude/fragments/project-management/stack.md +4 -0
- package/templates/project-claude/fragments/project-management/tagline.md +1 -0
- package/templates/project-claude/fragments/project-management/workflow.md +12 -0
- package/templates/project-claude/fragments/ssr-htmx/active-rules.md +11 -0
- package/templates/project-claude/fragments/ssr-htmx/agents.md +5 -0
- package/templates/project-claude/fragments/ssr-htmx/boundaries.md +20 -0
- package/templates/project-claude/fragments/ssr-htmx/commands.md +6 -0
- package/templates/project-claude/fragments/ssr-htmx/plugins.md +2 -0
- package/templates/project-claude/fragments/ssr-htmx/skills.md +3 -0
- package/templates/project-claude/fragments/ssr-htmx/stack.md +6 -0
- package/templates/project-claude/fragments/ssr-htmx/tagline.md +1 -0
- package/templates/project-claude/fragments/ssr-htmx/workflow.md +8 -0
- package/templates/project-claude/fragments/ssr-nextjs/active-rules.md +12 -0
- package/templates/project-claude/fragments/ssr-nextjs/agents.md +5 -0
- package/templates/project-claude/fragments/ssr-nextjs/boundaries.md +20 -0
- package/templates/project-claude/fragments/ssr-nextjs/commands.md +6 -0
- package/templates/project-claude/fragments/ssr-nextjs/plugins.md +2 -0
- package/templates/project-claude/fragments/ssr-nextjs/skills.md +5 -0
- package/templates/project-claude/fragments/ssr-nextjs/stack.md +5 -0
- package/templates/project-claude/fragments/ssr-nextjs/tagline.md +1 -0
- package/templates/project-claude/fragments/ssr-nextjs/workflow.md +8 -0
- package/templates/project-claude/fragments/tooling/active-rules.md +11 -0
- package/templates/project-claude/fragments/tooling/agents.md +5 -0
- package/templates/project-claude/fragments/tooling/boundaries.md +17 -0
- package/templates/project-claude/fragments/tooling/commands.md +4 -0
- package/templates/project-claude/fragments/tooling/skills.md +4 -0
- package/templates/project-claude/fragments/tooling/stack.md +5 -0
- package/templates/project-claude/fragments/tooling/tagline.md +1 -0
- package/templates/project-claude/fragments/tooling/workflow.md +5 -0
- package/templates/rules/api-contract.md +33 -0
- package/templates/rules/change-management.md +80 -0
- package/templates/rules/cli-development.md +39 -0
- package/templates/rules/code-style.md +23 -0
- package/templates/rules/data-analysis.md +61 -0
- package/templates/rules/database.md +29 -0
- package/templates/rules/design-workflow.md +17 -0
- package/templates/rules/error-handling.md +23 -0
- package/templates/rules/gates-taxonomy.md +21 -0
- package/templates/rules/git-policy.md +102 -0
- package/templates/rules/htmx.md +42 -0
- package/templates/rules/nextjs.md +35 -0
- package/templates/rules/playwright-launch.md +66 -0
- package/templates/rules/pyside6.md +59 -0
- package/templates/rules/shadcn.md +33 -0
- package/templates/rules/ship-checklist.md +24 -0
- package/templates/rules/tauri.md +40 -0
- package/templates/rules/test-policy.md +62 -0
- package/templates/settings.json +71 -0
- package/templates/skills/agent-introspection-debugging/SKILL.md +153 -0
- package/templates/skills/continuous-learning-v2/SKILL.md +365 -0
- package/templates/skills/continuous-learning-v2/config.json +8 -0
- package/templates/skills/continuous-learning-v2/hooks/observe.sh +428 -0
- package/templates/skills/continuous-learning-v2/scripts/detect-project.sh +228 -0
- package/templates/skills/continuous-learning-v2/scripts/instinct-cli.py +1426 -0
- package/templates/skills/deep-research/SKILL.md +155 -0
- package/templates/skills/deep-research/agents/openai.yaml +7 -0
- package/templates/skills/e2e-testing/SKILL.md +326 -0
- package/templates/skills/e2e-testing/agents/openai.yaml +7 -0
- package/templates/skills/eval-harness/SKILL.md +279 -0
- package/templates/skills/eval-harness/agents/openai.yaml +7 -0
- package/templates/skills/gh-issue-workflow/ISSUE.template.md +58 -0
- package/templates/skills/gh-issue-workflow/SKILL.md +184 -0
- package/templates/skills/investor-materials/SKILL.md +96 -0
- package/templates/skills/investor-outreach/SKILL.md +91 -0
- package/templates/skills/market-research/SKILL.md +75 -0
- package/templates/skills/market-research/agents/openai.yaml +7 -0
- package/templates/skills/nextjs-turbopack/SKILL.md +44 -0
- package/templates/skills/north-star/NORTH_STAR.template.md +114 -0
- package/templates/skills/north-star/SKILL.md +103 -0
- package/templates/skills/python-patterns/SKILL.md +750 -0
- package/templates/skills/python-testing/SKILL.md +816 -0
- package/templates/skills/spec-scaling/SKILL.md +89 -0
- package/templates/skills/strategic-compact/SKILL.md +131 -0
- package/templates/skills/strategic-compact/suggest-compact.sh +54 -0
- package/templates/skills/ui-visual-review/SKILL.md +154 -0
- package/templates/skills/verification-loop/SKILL.md +126 -0
- package/templates/skills/verification-loop/agents/openai.yaml +7 -0
- package/templates/track-mcp-map.tsv +15 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
Review phase — 다중 관점 리뷰로 품질을 검증한다.
|
|
2
|
+
|
|
3
|
+
## Gate Check
|
|
4
|
+
|
|
5
|
+
Verify 단계가 완료되었는지 확인한다. 테스트가 통과하지 않았으면 경고.
|
|
6
|
+
|
|
7
|
+
## Process
|
|
8
|
+
|
|
9
|
+
1. agent-skills의 code-review-and-quality + security-and-hardening 스킬을 활성화한다.
|
|
10
|
+
2. **reviewer subagent를 호출한다** (SOD: 구현과 검증 분리):
|
|
11
|
+
- reviewer는 context: fork로 격리 실행
|
|
12
|
+
- 5축 리뷰: correctness, readability, architecture, security, performance
|
|
13
|
+
3. 프로젝트 레벨 에이전트도 활성화:
|
|
14
|
+
- code-reviewer (ECC, sonnet): 일상적 코드 리뷰
|
|
15
|
+
- security-reviewer (ECC, sonnet): OWASP Top 10, 보안 패턴
|
|
16
|
+
4. 산출물 유형에 따라 리뷰 관점 자동 선택:
|
|
17
|
+
- 코드: 5축 리뷰
|
|
18
|
+
- 문서/제안서: 논리 흐름, 설득력, 범위 커버리지
|
|
19
|
+
- UI: 디자인 일관성, 접근성, 반응형
|
|
20
|
+
5. **UI 변경이 있고 `docs/visual-review-<phase>.md`가 존재**하면 visual review 결과를 입력으로 흡수:
|
|
21
|
+
- REGRESSION 1건이라도 있으면 **Review Gate 차단** (CRITICAL과 동급)
|
|
22
|
+
- CHANGED 항목은 의도성 검증 (커밋 메시지/PR 본문과 매칭)
|
|
23
|
+
- 부재 시 ui-visual-review skill 호출 권유 (UI Track 한정)
|
|
24
|
+
|
|
25
|
+
## Severity Classification
|
|
26
|
+
|
|
27
|
+
| Severity | Action |
|
|
28
|
+
|----------|--------|
|
|
29
|
+
| CRITICAL | 즉시 수정 필수. Review 게이트 통과 불가 |
|
|
30
|
+
| HIGH | 수정 권장. 합리적 사유 있으면 예외 가능 |
|
|
31
|
+
| MEDIUM | 제안. 현재 PR에서 안 해도 됨 |
|
|
32
|
+
| LOW | 참고 |
|
|
33
|
+
|
|
34
|
+
## Gate
|
|
35
|
+
|
|
36
|
+
CRITICAL 이슈 0건이어야 Review 게이트 통과.
|
|
37
|
+
|
|
38
|
+
## Gate Status Update
|
|
39
|
+
|
|
40
|
+
이 단계가 성공적으로 완료되면 `.claude/gate-status.json`의 `review.completed`를 `true`로, `review.timestamp`를 현재 시각으로 업데이트한다.
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
jq '.review.completed = true | .review.timestamp = now | .review.timestamp = (now | strftime("%Y-%m-%dT%H:%M:%SZ"))' .claude/gate-status.json > /tmp/gate-tmp.json && mv /tmp/gate-tmp.json .claude/gate-status.json
|
|
44
|
+
```
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
Ship phase — 프리런치 체크리스트 실행 후 배포한다.
|
|
2
|
+
|
|
3
|
+
## Gate Check
|
|
4
|
+
|
|
5
|
+
Review 단계가 완료되었는지 확인한다. CRITICAL 이슈가 남아 있으면 경고.
|
|
6
|
+
|
|
7
|
+
## Process
|
|
8
|
+
|
|
9
|
+
1. agent-skills의 shipping-and-launch 스킬을 활성화한다.
|
|
10
|
+
2. `.claude/rules/ship-checklist.md` 게이트를 순차 확인:
|
|
11
|
+
|
|
12
|
+
- [ ] E2E 테스트 전부 PASS
|
|
13
|
+
- [ ] test-policy.md 커버리지 기준 충족
|
|
14
|
+
- [ ] `npx ecc-agentshield scan` — CRITICAL/HIGH 없음
|
|
15
|
+
- [ ] SPEC.md/PRD.md 대비 배포 항목 일치 확인
|
|
16
|
+
|
|
17
|
+
3. 하나라도 실패하면 배포 차단 + 실패 항목 보고.
|
|
18
|
+
|
|
19
|
+
4. 전부 통과하면:
|
|
20
|
+
- Railway MCP/플러그인으로 배포 (Railway 사용 시)
|
|
21
|
+
- Health check 엔드포인트 응답 확인
|
|
22
|
+
- 배포 후 smoke test
|
|
23
|
+
|
|
24
|
+
5. Post-Ship:
|
|
25
|
+
- SPEC/PRD 불일치 발견 시 → 업데이트 후 커밋
|
|
26
|
+
- 아키텍처 결정이 있었으면 → `docs/decisions/` 에 ADR 기록
|
|
27
|
+
- Change Log 최종 확정
|
|
28
|
+
|
|
29
|
+
## Issue Closure (issue_tracking: enabled 시)
|
|
30
|
+
|
|
31
|
+
PR body에 다음 컨벤션 강제 — 머지 시 GitHub Issue 자동 close:
|
|
32
|
+
- 완전 해결: `Closes #N` 또는 `Fixes #N`
|
|
33
|
+
- 부분 진행 (close 안 함): `Refs #N`
|
|
34
|
+
- 후속 issue 분기 시 원본 issue body의 "후속 작업" 섹션에 `#M` cross-link
|
|
35
|
+
|
|
36
|
+
`gh-issue-workflow` skill의 PR 컨벤션 검증 — 머지 직전 PR body grep으로 1건이라도 issue 참조 누락이면 경고.
|
|
37
|
+
|
|
38
|
+
## Hotfix Mode
|
|
39
|
+
|
|
40
|
+
긴급 수정 시 Build → Verify → Ship 단축 경로 허용.
|
|
41
|
+
Define/Plan/Review 게이트 건너뛰기 가능하지만, Verify(테스트)는 필수.
|
|
42
|
+
|
|
43
|
+
## Gate Status Update
|
|
44
|
+
|
|
45
|
+
이 단계가 성공적으로 완료되면 `.claude/gate-status.json`의 `ship.completed`를 `true`로, `ship.timestamp`를 현재 시각으로 업데이트한다.
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
jq '.ship.completed = true | .ship.timestamp = now | .ship.timestamp = (now | strftime("%Y-%m-%dT%H:%M:%SZ"))' .claude/gate-status.json > /tmp/gate-tmp.json && mv /tmp/gate-tmp.json .claude/gate-status.json
|
|
49
|
+
```
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
Define phase — 구조화된 스펙을 코드 작성 전에 작성한다.
|
|
2
|
+
|
|
3
|
+
## Process
|
|
4
|
+
|
|
5
|
+
1. 요청이 모호하면 먼저 아이디어를 정제한다 (agent-skills idea-refine 패턴 활용).
|
|
6
|
+
2. agent-skills의 spec-driven-development 스킬을 따라 SPEC.md를 작성한다.
|
|
7
|
+
- 6가지 핵심 영역: Objective, Commands, Project Structure, Code Style, Testing Strategy, Boundaries
|
|
8
|
+
3. 대형 프로젝트(비즈니스 맥락 필요)면 PRD 템플릿(Docs/dev/PRD-TEMPLATE-standalone.md)을 참조하여 확장.
|
|
9
|
+
4. Non-Goals를 반드시 명시한다 — "미언급 = 범위 밖" 원칙.
|
|
10
|
+
5. DO NOT CHANGE 영역을 식별하고 SPEC에 기록한다.
|
|
11
|
+
6. SPEC.md를 `docs/SPEC.md`에 저장한다.
|
|
12
|
+
|
|
13
|
+
## Pre-SPEC 필수 접수 (UI/Test/E2E)
|
|
14
|
+
|
|
15
|
+
SPEC 작성 **전에** 다음 항목을 사용자에게 질문하고 SPEC에 기록한다. 미기재 시 SPEC 미완료 — Build 단계에서 drift 버그로 이어짐.
|
|
16
|
+
|
|
17
|
+
### A. Test Environment Parity
|
|
18
|
+
|
|
19
|
+
1. **Prod DB 엔진** — Postgres/MySQL/SQLite/Redis 등 + 버전
|
|
20
|
+
2. **테스트 DB 전략** — testcontainer / docker-compose / staging DB / none. SQLite 대체는 Prod가 SQLite인 경우에만 허용 (test-policy.md Dev-Prod Parity)
|
|
21
|
+
3. **외부 의존성** — Stripe, Supabase, Railway, SES 등. 각각 Mock / Live staging 중 어떤 전략인지
|
|
22
|
+
|
|
23
|
+
→ SPEC.md "Testing Strategy" 섹션에 표로 정리.
|
|
24
|
+
|
|
25
|
+
### B. 핵심 E2E 플로우
|
|
26
|
+
|
|
27
|
+
- **Mock 금지 대상 목록**: 인증(login/callback/me), 결제(checkout/webhook), 파일업로드 등
|
|
28
|
+
- 각 플로우별 성공 기준 (예: "login → /me 200 + user_id 일치")
|
|
29
|
+
|
|
30
|
+
→ SPEC.md "Testing Strategy"의 E2E 하위 목록으로.
|
|
31
|
+
|
|
32
|
+
### C. Design Context (UI Track인 경우)
|
|
33
|
+
|
|
34
|
+
UI 포함 Track(csr-*/ssr-*/full)이면 SPEC 전에 다음 확인:
|
|
35
|
+
|
|
36
|
+
1. **`DESIGN.md` 존재 여부** — 디자인 방향/톤/레이아웃 원칙 기록. 없으면 `/teach` 또는 `/shape` 스킬로 먼저 작성 유도
|
|
37
|
+
2. **`.impeccable.md` 존재 여부** — 브랜드/청중/톤 컨텍스트. 없으면 `/teach` 선행
|
|
38
|
+
3. **디자인 참조물** — Figma 링크, 스크린샷, 경쟁사 레퍼런스 등
|
|
39
|
+
|
|
40
|
+
디자인 컨텍스트 없이 UI 코드 작성 금지. Generic AI 미학 산출물 방지.
|
|
41
|
+
|
|
42
|
+
### D'. GitHub Issue Tracking (선택)
|
|
43
|
+
|
|
44
|
+
`git remote -v`로 GitHub remote 확인 가능 + 사용자가 issue를 backlog/소통 채널로 쓰고 싶으면:
|
|
45
|
+
|
|
46
|
+
- `docs/SPEC.md`에 `issue_tracking: enabled` 라인 명시 (opt-in)
|
|
47
|
+
- 활성화 시 `gh-issue-workflow` skill이 `/uzys:plan`, `/uzys:build`, `/uzys:ship`에서 자동 결합
|
|
48
|
+
- ISSUE 본문은 `templates/skills/gh-issue-workflow/ISSUE.template.md`의 5섹션(배경/전제/방향성/AC/후속) 강제
|
|
49
|
+
|
|
50
|
+
기본은 비활성. SPEC에 명시 없으면 모든 단계에서 skip.
|
|
51
|
+
|
|
52
|
+
### D. North Star (선택, 대형 프로젝트 권장)
|
|
53
|
+
|
|
54
|
+
`docs/NORTH_STAR.md` 부재 + 다음 중 1개 이상 해당 시 작성 권장:
|
|
55
|
+
|
|
56
|
+
- 6개월 이상 지속 예상되는 프로젝트
|
|
57
|
+
- 복수 Phase / 복수 사용자 / 외부 의존성이 명확한 경우
|
|
58
|
+
- 신규 기능 우선순위 결정이 잦을 것으로 예상
|
|
59
|
+
|
|
60
|
+
작성 시 `north-star` 스킬 호출 → `templates/skills/north-star/NORTH_STAR.template.md`를 `docs/NORTH_STAR.md`로 복사 후 7개 섹션(NS Statement / NSM / Will-Won't / Phase / 4-gate / Versioning / Changelog) 채움. 단순 1회성 작업이면 skip.
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
위 A/B/C **세 블록은 SPEC 작성 전 접수** (D는 선택). 답변 없으면 "이 항목 정의가 필요합니다" 질문으로 돌아가 반복. 모두 수집된 후에 본 SPEC 작성 진행.
|
|
65
|
+
|
|
66
|
+
## Gate
|
|
67
|
+
|
|
68
|
+
이 단계가 완료되어야 `/uzys:plan`으로 진행 가능.
|
|
69
|
+
SPEC.md가 존재하고, 최소 Objective + Boundaries가 정의되어 있어야 완료.
|
|
70
|
+
|
|
71
|
+
## Auto-Actions
|
|
72
|
+
|
|
73
|
+
- SPEC.md가 300줄을 초과하면 spec-scaling 스킬로 기능별 분리 제안.
|
|
74
|
+
- change-management.md 규칙 적용: 이후 SPEC 변경 시 CR 분류.
|
|
75
|
+
|
|
76
|
+
## Gate Status Update
|
|
77
|
+
|
|
78
|
+
이 단계가 성공적으로 완료되면 `.claude/gate-status.json` 을 다음 두 동작으로 갱신한다:
|
|
79
|
+
|
|
80
|
+
1. `define.completed = true` + `define.timestamp = now`
|
|
81
|
+
2. **후속 5단계 (`plan` / `build` / `verify` / `review` / `ship`) 모두 리셋** — `completed = false`, `timestamp = null`
|
|
82
|
+
|
|
83
|
+
**원칙**: SPEC 재정의 = 새 cycle 시작 = 후속 모든 게이트 리셋. 이전 cycle 의 ship 완료 상태가 새 cycle 게이트를 만족시키는 정합성 위반을 차단한다 (gate bypass 방지).
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
jq '.define.completed = true
|
|
87
|
+
| .define.timestamp = (now | strftime("%Y-%m-%dT%H:%M:%SZ"))
|
|
88
|
+
| .plan.completed = false | .plan.timestamp = null
|
|
89
|
+
| .build.completed = false | .build.timestamp = null
|
|
90
|
+
| .verify.completed = false | .verify.timestamp = null
|
|
91
|
+
| .review.completed = false | .review.timestamp = null
|
|
92
|
+
| .ship.completed = false | .ship.timestamp = null' .claude/gate-status.json > /tmp/gate-tmp.json && mv /tmp/gate-tmp.json .claude/gate-status.json
|
|
93
|
+
```
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
Verify phase — TDD 워크플로우와 Track별 커버리지 게이트를 실행한다.
|
|
2
|
+
|
|
3
|
+
## Process
|
|
4
|
+
|
|
5
|
+
1. agent-skills의 test-driven-development 스킬을 따른다.
|
|
6
|
+
2. agent-skills의 **test-engineer 에이전트**를 활성화하여 테스트 전략 설계, 시나리오 분석(happy path, boundary, error path, concurrency)을 수행한다.
|
|
7
|
+
3. `.claude/rules/test-policy.md`의 Track별 커버리지 기준을 참조한다:
|
|
8
|
+
- UI 컴포넌트: 60%
|
|
9
|
+
- API 엔드포인트: 80%
|
|
10
|
+
- 비즈니스 로직: 90%
|
|
11
|
+
3. 브라우저 테스트가 필요한지 판단한다:
|
|
12
|
+
- UI 변경이 있으면 → browser-testing 스킬 + Playwright 활성화
|
|
13
|
+
- API/로직만이면 → unit/integration 테스트만
|
|
14
|
+
4. 전체 테스트 스위트를 실행하고 결과를 보고한다.
|
|
15
|
+
5. 커버리지가 기준 미달이면 추가 테스트 작성을 제안한다.
|
|
16
|
+
|
|
17
|
+
## 핵심 사용자 기능 플로우 E2E (필수)
|
|
18
|
+
|
|
19
|
+
다음 플로우가 프로젝트에 존재하면 **실환경(staging 또는 로컬 docker-compose) Live E2E 1건 이상 필수**:
|
|
20
|
+
|
|
21
|
+
- **인증**: login → magic-link/OAuth callback → /me (또는 보호된 엔드포인트) 200
|
|
22
|
+
- **결제**: checkout → webhook → refund (존재 시)
|
|
23
|
+
- **외부 API 의존 플로우**: Stripe, Supabase, Railway, SES 등
|
|
24
|
+
|
|
25
|
+
검증 방식: Mock이 아닌 실제 서비스 호출. unit/integration의 Mock 테스트는 보조.
|
|
26
|
+
Prod가 Postgres면 테스트도 Postgres (testcontainer/docker-compose) — test-policy.md Dev-Prod Parity 준수.
|
|
27
|
+
|
|
28
|
+
## UI Visual Review (UI Track 자동)
|
|
29
|
+
|
|
30
|
+
Track이 csr-*/ssr-*/full이고 E2E 테스트가 PASS인 경우, **`ui-visual-review` 스킬 호출 권유**:
|
|
31
|
+
|
|
32
|
+
- 핵심 화면 N개 자동 캡처 (chrome-devtools MCP 또는 Playwright)
|
|
33
|
+
- 이전 baseline과 diff (해시 → pixelmatch → 시각 비교 단계적)
|
|
34
|
+
- 에이전트 1차 판정 (REGRESSION / CHANGED / PASS)
|
|
35
|
+
- `docs/visual-review-<phase>.md` 보고서 → 사용자 승인 게이트
|
|
36
|
+
|
|
37
|
+
`docs/visual-pages.json` 부재 시 skill 첫 실행에서 핵심 화면 목록 질의. `data`/`tooling`/`executive` Track은 skip.
|
|
38
|
+
|
|
39
|
+
## Bug Fix Mode
|
|
40
|
+
|
|
41
|
+
버그 수정 시 Prove-It 패턴:
|
|
42
|
+
1. 버그를 재현하는 테스트 작성
|
|
43
|
+
2. 테스트가 실패하는지 확인 (버그 존재 증명)
|
|
44
|
+
3. 수정 구현
|
|
45
|
+
4. 테스트가 통과하는지 확인
|
|
46
|
+
5. 가드 테스트로 유지
|
|
47
|
+
|
|
48
|
+
## Gate
|
|
49
|
+
|
|
50
|
+
모든 테스트 PASS + 커버리지 기준 충족 시 완료.
|
|
51
|
+
|
|
52
|
+
## Gate Status Update
|
|
53
|
+
|
|
54
|
+
이 단계가 성공적으로 완료되면 `.claude/gate-status.json`의 `verify.completed`를 `true`로, `verify.timestamp`를 현재 시각으로 업데이트한다.
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
jq '.verify.completed = true | .verify.timestamp = now | .verify.timestamp = (now | strftime("%Y-%m-%dT%H:%M:%SZ"))' .claude/gate-status.json > /tmp/gate-tmp.json && mv /tmp/gate-tmp.json .claude/gate-status.json
|
|
58
|
+
```
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Plan — [Project Name]
|
|
2
|
+
|
|
3
|
+
> 6개월+ 프로젝트 또는 복수 Phase가 있는 경우 사용. 1-2주 단순 작업은 todo.md만으로 충분.
|
|
4
|
+
> 본 템플릿은 GoalTrack의 `docs/plan.md` 패턴을 일반화한 것.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 0. Sprint Contract
|
|
9
|
+
|
|
10
|
+
- **목표 (이번 sprint에서 달성할 outcome)**: [한 문장]
|
|
11
|
+
- **포함 (scope)**: [3-5개 bullet]
|
|
12
|
+
- **제외 (out of scope)**: [3-5개 bullet — Non-Goals]
|
|
13
|
+
- **완료 기준 (Definition of Done)**: [측정 가능한 조건]
|
|
14
|
+
- **제약 조건**: [기간, 리소스, 의존성]
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 1. Phase Overview
|
|
19
|
+
|
|
20
|
+
전체 프로젝트를 Phase로 나눈 큰 그림. 본 sprint가 어느 Phase에 속하는지 명시.
|
|
21
|
+
|
|
22
|
+
| Phase | 이름 | 목표 | 진입 조건 | 완료 조건 |
|
|
23
|
+
|-------|------|------|----------|----------|
|
|
24
|
+
| P1 | [이름] | [한 문장] | (시작) | [측정 가능 기준] |
|
|
25
|
+
| P2 | [이름] | [한 문장] | P1 완료 | [기준] |
|
|
26
|
+
| P3 | [이름] | [한 문장] | P2 완료 + [추가 조건] | [기준] |
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 2. Milestone × Dependency Graph
|
|
31
|
+
|
|
32
|
+
각 Phase 내부를 Milestone으로 분해 + 의존성 표기.
|
|
33
|
+
|
|
34
|
+
### 표기 규약
|
|
35
|
+
- `M1 → M2`: M1 완료 후 M2 시작 (직렬)
|
|
36
|
+
- `M1 ∥ M2`: 동시 진행 가능 (병렬)
|
|
37
|
+
- `M1 ⇒ M2`: M1의 산출물이 M2의 입력 (강한 의존)
|
|
38
|
+
- `M1 → {M2, M3} → M4`: M1 후 M2/M3 병렬 → 둘 다 끝나면 M4
|
|
39
|
+
|
|
40
|
+
### 예시 — Phase 1 분해
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
M1 (foundation) ⇒ {M2 (auth), M3 (data layer)} → M4 (UI integration) → M5 (E2E)
|
|
44
|
+
↘
|
|
45
|
+
M6 (CLI) ∥ M5
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
| Milestone | 산출물 | 의존성 | 예상 기간 | Status |
|
|
49
|
+
|-----------|--------|--------|---------|--------|
|
|
50
|
+
| M1 | [foundation 산출물] | (없음) | 3d | ⬜ |
|
|
51
|
+
| M2 | [auth 산출물] | M1 | 5d | ⬜ |
|
|
52
|
+
| M3 | [data layer] | M1 | 4d | ⬜ |
|
|
53
|
+
| M4 | [UI integration] | M2, M3 | 3d | ⬜ |
|
|
54
|
+
| M5 | [E2E suite] | M4 | 2d | ⬜ |
|
|
55
|
+
| M6 | [CLI] | M4 | 2d | ⬜ |
|
|
56
|
+
|
|
57
|
+
### 임계 경로 (Critical Path)
|
|
58
|
+
가장 긴 직렬 체인 — 일정 risk가 가장 큰 경로.
|
|
59
|
+
> M1 → M2 → M4 → M5 = 13일
|
|
60
|
+
|
|
61
|
+
병렬 경로 (M3, M6) 단축은 임계 경로 단축 안 됨. M2/M4 단축이 우선.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## 3. Per-Milestone Detail
|
|
66
|
+
|
|
67
|
+
각 Milestone의 task breakdown은 `docs/todo.md`에 위임.
|
|
68
|
+
본 문서에는 outcome + AC만.
|
|
69
|
+
|
|
70
|
+
### M1 — [이름]
|
|
71
|
+
- **Outcome**: [완료 시 무엇이 가능한가]
|
|
72
|
+
- **AC** (Acceptance Criteria):
|
|
73
|
+
- [ ] [측정 가능 조건 1]
|
|
74
|
+
- [ ] [측정 가능 조건 2]
|
|
75
|
+
- **References**: [SPEC §, ADR, 외부 문서]
|
|
76
|
+
|
|
77
|
+
(M2~Mn 동일 구조)
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## 4. Risk & Mitigation
|
|
82
|
+
|
|
83
|
+
| Risk | Likelihood | Impact | Mitigation | Owner |
|
|
84
|
+
|------|----------|--------|----------|------|
|
|
85
|
+
| [예: 외부 API rate limit] | M | H | mock + cache layer | [name] |
|
|
86
|
+
| [예: 마이그레이션 실패] | L | H | savepoint + rollback 스크립트 | [name] |
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## 5. Open Questions
|
|
91
|
+
|
|
92
|
+
해결되지 않은 의사결정. SPEC/NORTH_STAR 갱신 필요할 수도.
|
|
93
|
+
|
|
94
|
+
- [ ] [질문 1] — 결정자: [name], 마감: [date]
|
|
95
|
+
- [ ] [질문 2]
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## 6. Changelog
|
|
100
|
+
|
|
101
|
+
- YYYY-MM-DD: 초안
|
|
102
|
+
- (이후 갱신 기록)
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ============================================================
|
|
3
|
+
# agentshield-gate.sh — PreToolUse Skill hook (uzys:ship 차단)
|
|
4
|
+
#
|
|
5
|
+
# 목적: /uzys:ship Skill 실행 전 ECC AgentShield 보안 스캔 실행.
|
|
6
|
+
# CRITICAL 발견 + .agentshield-ignore 미매칭 시 exit 2.
|
|
7
|
+
#
|
|
8
|
+
# 입력: PreToolUse stdin JSON (Skill hook)
|
|
9
|
+
# 출력: stderr 경고 + exit 2 (차단) 또는 exit 0 (통과)
|
|
10
|
+
#
|
|
11
|
+
# 활성화 조건:
|
|
12
|
+
# 1. 이 hook이 settings.json Skill matcher에 등록
|
|
13
|
+
# 2. npx 명령 사용 가능 (Node.js 환경)
|
|
14
|
+
#
|
|
15
|
+
# False-positive 허용:
|
|
16
|
+
# .agentshield-ignore 파일 — 한 줄에 하나의 정규식.
|
|
17
|
+
# 매칭되는 finding은 CRITICAL이어도 무시.
|
|
18
|
+
# ============================================================
|
|
19
|
+
set -u
|
|
20
|
+
|
|
21
|
+
# Skill 이름 파싱 — uzys:ship 만 대상
|
|
22
|
+
INPUT=$(cat 2>/dev/null || echo "{}")
|
|
23
|
+
SKILL_NAME=""
|
|
24
|
+
if command -v jq &>/dev/null; then
|
|
25
|
+
SKILL_NAME=$(echo "$INPUT" | jq -r '.tool_input.skill // empty' 2>/dev/null || echo "")
|
|
26
|
+
else
|
|
27
|
+
SKILL_NAME=$(echo "$INPUT" | grep -oE '"skill"[[:space:]]*:[[:space:]]*"[^"]*"' | sed -E 's/.*"([^"]*)"$/\1/')
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
# 대상 아니면 즉시 통과
|
|
31
|
+
case "$SKILL_NAME" in
|
|
32
|
+
uzys:ship) ;;
|
|
33
|
+
*) exit 0 ;;
|
|
34
|
+
esac
|
|
35
|
+
|
|
36
|
+
PROJECT_DIR="${CLAUDE_PROJECT_DIR:-$(pwd)}"
|
|
37
|
+
IGNORE_FILE="$PROJECT_DIR/.agentshield-ignore"
|
|
38
|
+
SCAN_LOG="/tmp/agentshield-scan-$$.log"
|
|
39
|
+
|
|
40
|
+
cd "$PROJECT_DIR" || exit 0
|
|
41
|
+
|
|
42
|
+
# npx ecc-agentshield 실행 (타임아웃 안전 장치 없음 — ship 시점이라 사용자 대기 허용)
|
|
43
|
+
if ! command -v npx &>/dev/null; then
|
|
44
|
+
echo "[agentshield-gate] npx not found — scan skipped (manual review required)" >&2
|
|
45
|
+
exit 0
|
|
46
|
+
fi
|
|
47
|
+
|
|
48
|
+
npx ecc-agentshield@1.4.0 scan > "$SCAN_LOG" 2>&1 || true
|
|
49
|
+
|
|
50
|
+
# CRITICAL 섹션에서 finding 라인 추출
|
|
51
|
+
CRITICAL_FINDINGS=$(awk '
|
|
52
|
+
/● CRITICAL/ { in_crit=1; next }
|
|
53
|
+
/● HIGH|● MEDIUM|● LOW|● INFO/ { in_crit=0 }
|
|
54
|
+
in_crit && /^[[:space:]]*●/ { print }
|
|
55
|
+
' "$SCAN_LOG")
|
|
56
|
+
|
|
57
|
+
if [ -z "$CRITICAL_FINDINGS" ]; then
|
|
58
|
+
rm -f "$SCAN_LOG"
|
|
59
|
+
echo "[agentshield-gate] No CRITICAL findings. Ship allowed." >&2
|
|
60
|
+
exit 0
|
|
61
|
+
fi
|
|
62
|
+
|
|
63
|
+
# ignore 파일 매칭
|
|
64
|
+
FILTERED_FINDINGS=""
|
|
65
|
+
while IFS= read -r line; do
|
|
66
|
+
[ -z "$line" ] && continue
|
|
67
|
+
MATCHED=false
|
|
68
|
+
if [ -f "$IGNORE_FILE" ]; then
|
|
69
|
+
while IFS= read -r pattern; do
|
|
70
|
+
# 빈 라인 / 주석 skip
|
|
71
|
+
case "$pattern" in
|
|
72
|
+
""|"#"*) continue ;;
|
|
73
|
+
esac
|
|
74
|
+
# v26.11.2 — grep -F (fixed string) — `.*` 같은 regex로 모든 finding bypass 차단 (M4)
|
|
75
|
+
if echo "$line" | grep -qF "$pattern"; then
|
|
76
|
+
MATCHED=true
|
|
77
|
+
break
|
|
78
|
+
fi
|
|
79
|
+
done < "$IGNORE_FILE"
|
|
80
|
+
fi
|
|
81
|
+
if [ "$MATCHED" = false ]; then
|
|
82
|
+
FILTERED_FINDINGS="$FILTERED_FINDINGS$line"$'\n'
|
|
83
|
+
fi
|
|
84
|
+
done <<< "$CRITICAL_FINDINGS"
|
|
85
|
+
|
|
86
|
+
if [ -z "$FILTERED_FINDINGS" ]; then
|
|
87
|
+
rm -f "$SCAN_LOG"
|
|
88
|
+
echo "[agentshield-gate] CRITICAL findings all matched .agentshield-ignore. Ship allowed." >&2
|
|
89
|
+
exit 0
|
|
90
|
+
fi
|
|
91
|
+
|
|
92
|
+
# BLOCK
|
|
93
|
+
echo "[agentshield-gate] BLOCKED: CRITICAL security findings detected" >&2
|
|
94
|
+
echo "" >&2
|
|
95
|
+
echo "$FILTERED_FINDINGS" >&2
|
|
96
|
+
echo "" >&2
|
|
97
|
+
echo "다음 조치 중 하나 필요:" >&2
|
|
98
|
+
echo " 1. 실제 취약점 수정" >&2
|
|
99
|
+
echo " 2. false-positive인 경우 .agentshield-ignore에 정규식 추가" >&2
|
|
100
|
+
echo " 3. 스캔 로그 확인: $SCAN_LOG" >&2
|
|
101
|
+
exit 2
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ============================================================
|
|
3
|
+
# checkpoint-snapshot.sh — PostToolUse hook
|
|
4
|
+
#
|
|
5
|
+
# 목적: tool call count가 threshold 초과 시 현재 세션 스냅샷을
|
|
6
|
+
# docs/checkpoints/ 에 자동 저장하고 /compact 경고 flag 생성.
|
|
7
|
+
#
|
|
8
|
+
# 제약: Claude Code hook은 /compact 슬래시 커맨드를 직접 호출할 수
|
|
9
|
+
# 없음. 따라서 "자동 compact"는 불가능 — 대신 checkpoint 저장 +
|
|
10
|
+
# session-start 경고로 사용자 수동 /compact 유도.
|
|
11
|
+
#
|
|
12
|
+
# Exit codes: 항상 0 (async hook, 차단 금지)
|
|
13
|
+
# ============================================================
|
|
14
|
+
set -u
|
|
15
|
+
|
|
16
|
+
PROJECT_DIR="${CLAUDE_PROJECT_DIR:-$(pwd)}"
|
|
17
|
+
THRESHOLD="${CHECKPOINT_THRESHOLD:-40}"
|
|
18
|
+
SESSION_ID="${CLAUDE_SESSION_ID:-${PPID:-default}}"
|
|
19
|
+
COUNTER_FILE="/tmp/claude-checkpoint-count-${SESSION_ID}"
|
|
20
|
+
CHECKPOINT_DIR="$PROJECT_DIR/docs/checkpoints"
|
|
21
|
+
WARNING_FLAG="$PROJECT_DIR/.claude/compact-warning.flag"
|
|
22
|
+
|
|
23
|
+
# Counter increment
|
|
24
|
+
if [ -f "$COUNTER_FILE" ]; then
|
|
25
|
+
count=$(cat "$COUNTER_FILE" 2>/dev/null || echo 0)
|
|
26
|
+
count=$((count + 1))
|
|
27
|
+
echo "$count" > "$COUNTER_FILE"
|
|
28
|
+
else
|
|
29
|
+
count=1
|
|
30
|
+
echo "$count" > "$COUNTER_FILE"
|
|
31
|
+
fi
|
|
32
|
+
|
|
33
|
+
# Threshold 미도달이면 종료
|
|
34
|
+
if [ "$count" -lt "$THRESHOLD" ]; then
|
|
35
|
+
exit 0
|
|
36
|
+
fi
|
|
37
|
+
|
|
38
|
+
# threshold 초과 → checkpoint 저장
|
|
39
|
+
mkdir -p "$CHECKPOINT_DIR" 2>/dev/null || exit 0
|
|
40
|
+
|
|
41
|
+
TS=$(date +%Y%m%d-%H%M%S)
|
|
42
|
+
CHECKPOINT_FILE="$CHECKPOINT_DIR/${TS}.md"
|
|
43
|
+
|
|
44
|
+
# Git 정보 수집 (git 미존재 환경 안전)
|
|
45
|
+
GIT_BRANCH="(unknown)"
|
|
46
|
+
GIT_HEAD="(unknown)"
|
|
47
|
+
GIT_STATUS="(unknown)"
|
|
48
|
+
if command -v git &>/dev/null && [ -d "$PROJECT_DIR/.git" ]; then
|
|
49
|
+
GIT_BRANCH=$(cd "$PROJECT_DIR" && git branch --show-current 2>/dev/null || echo "(detached)")
|
|
50
|
+
GIT_HEAD=$(cd "$PROJECT_DIR" && git rev-parse --short HEAD 2>/dev/null || echo "(no commits)")
|
|
51
|
+
GIT_STATUS=$(cd "$PROJECT_DIR" && git status --short 2>/dev/null | head -20)
|
|
52
|
+
fi
|
|
53
|
+
|
|
54
|
+
# Gate status 수집
|
|
55
|
+
GATE_SUMMARY="(no gate-status.json)"
|
|
56
|
+
GATE_FILE="$PROJECT_DIR/.claude/gate-status.json"
|
|
57
|
+
if [ -f "$GATE_FILE" ] && command -v jq &>/dev/null; then
|
|
58
|
+
GATE_SUMMARY=$(jq -r '
|
|
59
|
+
"define: \(.define.completed // false)\n" +
|
|
60
|
+
"plan: \(.plan.completed // false)\n" +
|
|
61
|
+
"build: \(.build.completed // false)\n" +
|
|
62
|
+
"verify: \(.verify.completed // false)\n" +
|
|
63
|
+
"review: \(.review.completed // false)\n" +
|
|
64
|
+
"ship: \(.ship.completed // false)"
|
|
65
|
+
' "$GATE_FILE" 2>/dev/null || echo "(parse error)")
|
|
66
|
+
fi
|
|
67
|
+
|
|
68
|
+
# Checkpoint 파일 작성
|
|
69
|
+
cat > "$CHECKPOINT_FILE" <<EOF
|
|
70
|
+
# Checkpoint — $TS
|
|
71
|
+
|
|
72
|
+
> 자동 생성 by checkpoint-snapshot.sh (tool count $count >= $THRESHOLD).
|
|
73
|
+
> 사용자 수동 \`/compact\` 실행 권장. 이 파일은 compact 후 컨텍스트 복원 힌트로 사용.
|
|
74
|
+
|
|
75
|
+
## Git
|
|
76
|
+
|
|
77
|
+
- Branch: $GIT_BRANCH
|
|
78
|
+
- HEAD: $GIT_HEAD
|
|
79
|
+
|
|
80
|
+
### Changed Files
|
|
81
|
+
\`\`\`
|
|
82
|
+
$GIT_STATUS
|
|
83
|
+
\`\`\`
|
|
84
|
+
|
|
85
|
+
## Gate Status
|
|
86
|
+
|
|
87
|
+
\`\`\`
|
|
88
|
+
$GATE_SUMMARY
|
|
89
|
+
\`\`\`
|
|
90
|
+
|
|
91
|
+
## Session ID
|
|
92
|
+
- \`$SESSION_ID\`
|
|
93
|
+
- Tool count at snapshot: $count
|
|
94
|
+
|
|
95
|
+
## Recovery Hint
|
|
96
|
+
|
|
97
|
+
compact 후 다음을 확인:
|
|
98
|
+
1. \`git status\` — 변경 사항 복원
|
|
99
|
+
2. \`docs/SPEC.md\` + \`docs/todo.md\` — 현재 작업 컨텍스트
|
|
100
|
+
3. 위 Gate Status — 어느 단계에 있었는지
|
|
101
|
+
4. 최근 checkpoint: \`ls -t docs/checkpoints/ | head -5\`
|
|
102
|
+
EOF
|
|
103
|
+
|
|
104
|
+
# Counter 리셋
|
|
105
|
+
echo "0" > "$COUNTER_FILE"
|
|
106
|
+
|
|
107
|
+
# Warning flag 생성 (session-start hook이 감지해서 경고 재표시)
|
|
108
|
+
mkdir -p "$(dirname "$WARNING_FLAG")"
|
|
109
|
+
echo "$TS" > "$WARNING_FLAG"
|
|
110
|
+
|
|
111
|
+
# stderr에 즉시 경고 (async이므로 차단 안 됨)
|
|
112
|
+
echo "[checkpoint-snapshot] Tool count $count reached. Saved: $CHECKPOINT_FILE" >&2
|
|
113
|
+
echo "[checkpoint-snapshot] Consider running /compact to reclaim context window." >&2
|
|
114
|
+
|
|
115
|
+
exit 0
|