@su-record/vibe 2.9.36 → 2.9.37
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/CLAUDE.md +1 -1
- package/README.en.md +1 -1
- package/README.md +1 -1
- package/agents/compounder.md +6 -6
- package/agents/diagrammer.md +2 -2
- package/agents/e2e-tester.md +5 -5
- package/agents/qa/acceptance-tester.md +2 -2
- package/agents/refactor-cleaner.md +2 -2
- package/agents/tester.md +1 -1
- package/agents/ui/ui-antipattern-detector.md +1 -1
- package/agents/ui/ui-design-system-gen.md +3 -3
- package/agents/ui/ui-industry-analyzer.md +1 -1
- package/agents/ui/ui-layout-architect.md +1 -1
- package/agents/ui/ui-stack-implementer.md +1 -1
- package/commands/vibe.analyze.md +1 -1
- package/commands/vibe.contract.md +2 -2
- package/commands/vibe.figma.md +3 -3
- package/commands/vibe.harness.md +3 -3
- package/commands/vibe.regress.md +2 -2
- package/commands/vibe.review.md +4 -4
- package/commands/vibe.run.md +27 -27
- package/commands/vibe.scaffold.md +1 -1
- package/commands/vibe.spec.md +38 -38
- package/commands/vibe.trace.md +14 -14
- package/commands/vibe.utils.md +3 -3
- package/commands/vibe.verify.md +18 -18
- package/hooks/scripts/prompt-dispatcher.js +15 -0
- package/hooks/scripts/utils.js +4 -0
- package/package.json +1 -1
- package/skills/arch-guard/SKILL.md +2 -2
- package/skills/arch-guard/agents/rule-generator.md +3 -3
- package/skills/arch-guard/scripts/check-boundaries.js +1 -1
- package/skills/arch-guard/templates/arch-rules.json +1 -1
- package/skills/capability-loop/SKILL.md +2 -2
- package/skills/capability-loop/templates/capability-spec.md +1 -1
- package/skills/claude-md-guide/SKILL.md +2 -2
- package/skills/design-audit/SKILL.md +3 -3
- package/skills/design-critique/SKILL.md +2 -2
- package/skills/design-distill/SKILL.md +1 -1
- package/skills/design-normalize/SKILL.md +4 -4
- package/skills/design-polish/SKILL.md +2 -2
- package/skills/design-teach/SKILL.md +6 -6
- package/skills/design-teach/templates/design-context.json +1 -1
- package/skills/devlog/SKILL.md +1 -1
- package/skills/event-planning/SKILL.md +1 -1
- package/skills/exec-plan/SKILL.md +5 -5
- package/skills/exec-plan/agents/decomposer.md +1 -1
- package/skills/exec-plan/templates/plan.md +2 -2
- package/skills/parallel-research/SKILL.md +3 -3
- package/skills/parallel-research/orchestrator.md +1 -1
- package/skills/parallel-research/templates/paper.md +1 -1
- package/skills/priority-todos/SKILL.md +1 -1
- package/skills/vibe-contract/SKILL.md +6 -6
- package/skills/vibe-interview/SKILL.md +6 -6
- package/skills/vibe-interview/checklists/feature.md +1 -1
- package/skills/vibe-plan/SKILL.md +10 -10
- package/skills/vibe-regress/SKILL.md +5 -5
- package/skills/vibe-regress/templates/bug.md +1 -1
- package/skills/vibe-regress/templates/test-jest.md +1 -1
- package/skills/vibe-regress/templates/test-vitest.md +1 -1
- package/skills/vibe-spec/SKILL.md +45 -45
- package/skills/vibe-spec-review/SKILL.md +21 -21
- package/skills/vibe-test/SKILL.md +1 -1
- package/vibe/constitution.md +2 -2
- package/vibe/templates/claudemd-template.md +4 -4
- package/vibe/templates/constitution-template.md +2 -2
- package/vibe/templates/feature-template.md +1 -1
package/commands/vibe.spec.md
CHANGED
|
@@ -12,8 +12,8 @@ argument-hint: "(선택) feature name, plan/interview file path, or idea"
|
|
|
12
12
|
```
|
|
13
13
|
/vibe.spec # 빈 시작 — "무엇을 만들까요?"부터
|
|
14
14
|
/vibe.spec "패럴랙스 웹사이트" # 아이디어/피처명 지정 시작
|
|
15
|
-
/vibe.spec ".
|
|
16
|
-
/vibe.spec ".
|
|
15
|
+
/vibe.spec ".vibe/plans/{feature}.md" # 기획서 입력 (plan 단계 스킵)
|
|
16
|
+
/vibe.spec ".vibe/interviews/{feature}.md" # interview 입력 (interview 단계 스킵)
|
|
17
17
|
/vibe.spec "docs/prd.md" # 외부 PRD/아이디어 파일 입력
|
|
18
18
|
/vibe.spec + 📎 첨부 # 첨부 기반 시작
|
|
19
19
|
/vibe.spec "feature-name" ultrawork # 중단 게이트 없이 자동 전 흐름 실행
|
|
@@ -38,20 +38,20 @@ Phase 0: Git branch setup
|
|
|
38
38
|
↓
|
|
39
39
|
Phase 0.5: Input 분석 + Smart resume 결정
|
|
40
40
|
- 첨부/파일/아이디어 감지
|
|
41
|
-
- 기존 .
|
|
41
|
+
- 기존 .vibe/{interviews,plans,specs}/ 확인
|
|
42
42
|
- 시작 단계 결정: interview | plan | spec | review
|
|
43
43
|
↓
|
|
44
44
|
Phase 1: Interview (skill: vibe-interview)
|
|
45
45
|
- 조건: interview 파일 없음
|
|
46
46
|
- 사용자 "그만"까지 반복 인터뷰
|
|
47
|
-
- 출력: .
|
|
47
|
+
- 출력: .vibe/interviews/{feature}.md
|
|
48
48
|
↓
|
|
49
49
|
[Stop Gate 1] — ultrawork 모드에서는 스킵
|
|
50
50
|
↓
|
|
51
51
|
Phase 2: Plan (skill: vibe-plan)
|
|
52
52
|
- 조건: plan 파일 없음
|
|
53
53
|
- interview → 마크다운 기획서 정제
|
|
54
|
-
- 출력: .
|
|
54
|
+
- 출력: .vibe/plans/{feature}.md
|
|
55
55
|
↓
|
|
56
56
|
[Stop Gate 2 + 분기 판단]
|
|
57
57
|
기획서 type 읽고 경로 결정:
|
|
@@ -63,7 +63,7 @@ Phase 3: SPEC 작성 (skill: vibe-spec)
|
|
|
63
63
|
- Parallel research (GPT/Gemini/Claude agents)
|
|
64
64
|
- Large scope 자동 분할
|
|
65
65
|
- Ambiguity scan + 품질 게이트(100점, 수렴까지 루프)
|
|
66
|
-
- 출력: .
|
|
66
|
+
- 출력: .vibe/specs/{feature}.md + .vibe/features/{feature}.feature
|
|
67
67
|
↓
|
|
68
68
|
Phase 4: SPEC Review (skill: vibe-spec-review)
|
|
69
69
|
- Race Review (GPT + Gemini, 라운드 수 캡 없음, 수렴까지 루프)
|
|
@@ -110,11 +110,11 @@ git branch --show-current
|
|
|
110
110
|
```
|
|
111
111
|
1. 📎 첨부 파일 있음? → 첨부 분석 → feature name 추출
|
|
112
112
|
2. 인자가 파일 경로? → 파일 위치로 시작 단계 결정:
|
|
113
|
-
.
|
|
114
|
-
.
|
|
115
|
-
.
|
|
113
|
+
.vibe/interviews/*.md → Phase 2 (plan)
|
|
114
|
+
.vibe/plans/*.md → Phase 3 (spec)
|
|
115
|
+
.vibe/specs/*.md → Phase 4 (review)
|
|
116
116
|
기타 (.md/.txt/.pdf) → Phase 2 (plan, 외부 PRD 흡수)
|
|
117
|
-
3. 인자가 feature name? → .
|
|
117
|
+
3. 인자가 feature name? → .vibe/에서 기존 파일 검색
|
|
118
118
|
existing spec → "리뷰 재실행? 이어서? 재작성?" 물음
|
|
119
119
|
existing plan → Phase 3 (spec)
|
|
120
120
|
existing interview → Phase 2 (plan)
|
|
@@ -129,14 +129,14 @@ git branch --show-current
|
|
|
129
129
|
```
|
|
130
130
|
알고리즘:
|
|
131
131
|
|
|
132
|
-
Step 1) .
|
|
132
|
+
Step 1) .vibe/.last-feature 확인 (pointer 파일)
|
|
133
133
|
- 파일 없음 → Step 2로
|
|
134
134
|
- 존재 → 해당 feature의 상태 요약 출력 + 확인 질문:
|
|
135
135
|
"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
136
136
|
🔄 마지막 작업: {feature-name}
|
|
137
137
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
138
|
-
✅ interview: .
|
|
139
|
-
✅ plan: .
|
|
138
|
+
✅ interview: .vibe/interviews/{feature}.md (status: complete, N일 전)
|
|
139
|
+
✅ plan: .vibe/plans/{feature}.md (N일 전)
|
|
140
140
|
❌ spec: 없음
|
|
141
141
|
→ 다음 단계: Phase 3 (vibe-spec 스킬 — SPEC 작성)
|
|
142
142
|
|
|
@@ -151,10 +151,10 @@ Step 1) .claude/vibe/.last-feature 확인 (pointer 파일)
|
|
|
151
151
|
- new → Step 3으로
|
|
152
152
|
- abort → 종료
|
|
153
153
|
|
|
154
|
-
Step 2) 진행 중 작업 목록 표시 (.
|
|
154
|
+
Step 2) 진행 중 작업 목록 표시 (.vibe/ 디렉토리 스캔)
|
|
155
155
|
수집:
|
|
156
156
|
features = {} (feature name → {hasInterview, hasPlan, hasSpec, mtime})
|
|
157
|
-
for each file in .
|
|
157
|
+
for each file in .vibe/interviews/*.md:
|
|
158
158
|
feature = basename without .md
|
|
159
159
|
features[feature].hasInterview = true
|
|
160
160
|
features[feature].interviewMtime = file.mtime
|
|
@@ -193,12 +193,12 @@ Step 3) 빈 시작 (기존 동작)
|
|
|
193
193
|
#### `.last-feature` 포인터 파일 갱신 규칙
|
|
194
194
|
|
|
195
195
|
```
|
|
196
|
-
경로: .
|
|
196
|
+
경로: .vibe/.last-feature
|
|
197
197
|
형식: 한 줄, feature name만 저장
|
|
198
198
|
예: "bean-landing\n"
|
|
199
199
|
|
|
200
200
|
⚠ 이 파일은 **개인 작업 포인터**이므로 git에 커밋하지 않는다.
|
|
201
|
-
`.gitignore` 에 `.
|
|
201
|
+
`.gitignore` 에 `.vibe/.last-feature` 엔트리 필수.
|
|
202
202
|
|
|
203
203
|
갱신 시점:
|
|
204
204
|
- Phase 1 (interview) 진입 시 → feature name 결정되면 즉시 기록
|
|
@@ -264,13 +264,13 @@ Step 3) 빈 시작 (기존 동작)
|
|
|
264
264
|
Load skill `vibe-interview` with input: {user_idea}
|
|
265
265
|
```
|
|
266
266
|
|
|
267
|
-
> **`.last-feature` 갱신**: vibe-interview 스킬이 feature name을 확정하는 즉시 `.
|
|
267
|
+
> **`.last-feature` 갱신**: vibe-interview 스킬이 feature name을 확정하는 즉시 `.vibe/.last-feature` 에 한 줄로 기록. 이후 Phase 2/3/4 진입 시에도 동일 기록 유지 (값이 같으면 no-op).
|
|
268
268
|
|
|
269
269
|
`vibe-interview` 스킬이 자체적으로:
|
|
270
270
|
- 프로젝트 타입 감지 (website/webapp/mobile/api/library/feature)
|
|
271
271
|
- 타입별 체크리스트 로드 (`skills/vibe-interview/checklists/{type}.md`)
|
|
272
272
|
- 반복 인터뷰 실행 (사용자 "그만"까지)
|
|
273
|
-
- `.
|
|
273
|
+
- `.vibe/interviews/{feature-name}.md` 저장
|
|
274
274
|
|
|
275
275
|
**Stop Gate 1**: Interview 완료 후 (ultrawork 모드 스킵)
|
|
276
276
|
|
|
@@ -279,7 +279,7 @@ Load skill `vibe-interview` with input: {user_idea}
|
|
|
279
279
|
✅ Interview 완료
|
|
280
280
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
281
281
|
|
|
282
|
-
📄 .
|
|
282
|
+
📄 .vibe/interviews/{feature}.md
|
|
283
283
|
Required: N/M | Optional: K/L | Discovered: X
|
|
284
284
|
|
|
285
285
|
다음 단계: 기획서 작성
|
|
@@ -295,14 +295,14 @@ Enter → 계속
|
|
|
295
295
|
**진입 조건:** plan 파일이 아직 없음
|
|
296
296
|
|
|
297
297
|
```
|
|
298
|
-
Load skill `vibe-plan` with input: .
|
|
298
|
+
Load skill `vibe-plan` with input: .vibe/interviews/{feature}.md
|
|
299
299
|
```
|
|
300
300
|
|
|
301
301
|
`vibe-plan` 스킬이 자체적으로:
|
|
302
302
|
- 템플릿 로드 (`~/.claude/vibe/templates/plan-template.md`)
|
|
303
303
|
- Interview 섹션별 정제
|
|
304
304
|
- UI 섹션 조건부 포함 (type 기반)
|
|
305
|
-
- `.
|
|
305
|
+
- `.vibe/plans/{feature}.md` 저장
|
|
306
306
|
|
|
307
307
|
**Stop Gate 2**: 기획서 완료 후 + 분기 판단 (ultrawork 모드 스킵)
|
|
308
308
|
|
|
@@ -311,7 +311,7 @@ Load skill `vibe-plan` with input: .claude/vibe/interviews/{feature}.md
|
|
|
311
311
|
✅ 기획서 완성
|
|
312
312
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
313
313
|
|
|
314
|
-
📄 .
|
|
314
|
+
📄 .vibe/plans/{feature}.md
|
|
315
315
|
Type: {type}
|
|
316
316
|
|
|
317
317
|
{type ∈ UI}:
|
|
@@ -334,7 +334,7 @@ Enter → 계속
|
|
|
334
334
|
**진입 조건:** spec 파일이 아직 없음 (또는 재작성 요청)
|
|
335
335
|
|
|
336
336
|
```
|
|
337
|
-
Load skill `vibe-spec` with input: .
|
|
337
|
+
Load skill `vibe-spec` with input: .vibe/plans/{feature}.md
|
|
338
338
|
```
|
|
339
339
|
|
|
340
340
|
`vibe-spec` 스킬이 PTCF 구조 SPEC 문서 + Feature(BDD) 파일 생성.
|
|
@@ -352,8 +352,8 @@ Load skill `vibe-spec` with input: .claude/vibe/plans/{feature}.md
|
|
|
352
352
|
|
|
353
353
|
**출력:**
|
|
354
354
|
|
|
355
|
-
- `.
|
|
356
|
-
- `.
|
|
355
|
+
- `.vibe/specs/{feature-name}.md` (또는 split folder)
|
|
356
|
+
- `.vibe/features/{feature-name}.feature` (또는 split folder)
|
|
357
357
|
|
|
358
358
|
### Phase 4: SPEC Review
|
|
359
359
|
|
|
@@ -378,7 +378,7 @@ Load skill `vibe-spec-review` with feature: {feature-name}
|
|
|
378
378
|
Load skill `vibe-contract` with: extract "{feature-name}"
|
|
379
379
|
```
|
|
380
380
|
|
|
381
|
-
If the SPEC has a `## API` / `## Endpoints` / `## Interface` section, extract the contract to `.
|
|
381
|
+
If the SPEC has a `## API` / `## Endpoints` / `## Interface` section, extract the contract to `.vibe/contracts/{feature-name}.md`. If the section is absent, exit cleanly (not every feature has an API).
|
|
382
382
|
|
|
383
383
|
The contract is referenced during Phase 5a implementation, and used by `/vibe.verify` for drift detection.
|
|
384
384
|
|
|
@@ -390,7 +390,7 @@ The contract is referenced during Phase 5a implementation, and used by `/vibe.ve
|
|
|
390
390
|
|
|
391
391
|
SPEC → code. Auto-checks at start:
|
|
392
392
|
- `/vibe.regress list --feature {feature-name}` — warn if any open regressions exist
|
|
393
|
-
- `.
|
|
393
|
+
- `.vibe/contracts/{feature-name}.md` — load if present, use as implementation guide
|
|
394
394
|
|
|
395
395
|
### Phase 5b: UI Track (type ∈ {website, webapp, mobile}일 때만)
|
|
396
396
|
|
|
@@ -402,7 +402,7 @@ SPEC → code. Auto-checks at start:
|
|
|
402
402
|
|
|
403
403
|
**`/vibe.figma`에 전달할 컨텍스트:**
|
|
404
404
|
|
|
405
|
-
- `.
|
|
405
|
+
- `.vibe/plans/{feature}.md` 경로
|
|
406
406
|
- 기획서의 §7 Look & Feel, §8 레이아웃, §9 반응형 섹션을 Phase 1 스토리보드 입력으로 사용
|
|
407
407
|
|
|
408
408
|
### Phase 6: Verify
|
|
@@ -421,7 +421,7 @@ UI + 로직 + 연결 검증 (후속 PR에서 3축 확장 예정).
|
|
|
421
421
|
|
|
422
422
|
SPEC ↔ 구현 추적.
|
|
423
423
|
|
|
424
|
-
> **Phase 7 완료 시**: `.
|
|
424
|
+
> **Phase 7 완료 시**: `.vibe/.last-feature` 삭제 (워크플로 완주 — 다음 `/vibe.spec` 호출은 빈 시작 또는 진행 중 작업 목록에서 시작).
|
|
425
425
|
|
|
426
426
|
## ultrawork 모드
|
|
427
427
|
|
|
@@ -455,7 +455,7 @@ Claude: 🔍 Input 분석
|
|
|
455
455
|
|
|
456
456
|
### 예시 2: 기획서에서 시작
|
|
457
457
|
```
|
|
458
|
-
User: /vibe.spec ".
|
|
458
|
+
User: /vibe.spec ".vibe/plans/bean-landing.md"
|
|
459
459
|
|
|
460
460
|
Claude: 🔍 Input 분석
|
|
461
461
|
입력: plan 파일 경로
|
|
@@ -474,8 +474,8 @@ User: /vibe.spec "bean-landing"
|
|
|
474
474
|
Claude: 🔍 Input 분석
|
|
475
475
|
입력: feature name
|
|
476
476
|
기존 파일 검색...
|
|
477
|
-
✅ interview: .
|
|
478
|
-
✅ plan: .
|
|
477
|
+
✅ interview: .vibe/interviews/bean-landing.md
|
|
478
|
+
✅ plan: .vibe/plans/bean-landing.md
|
|
479
479
|
❌ spec: 없음
|
|
480
480
|
→ 시작 단계: Phase 3 (vibe-spec)
|
|
481
481
|
|
|
@@ -489,8 +489,8 @@ User: /vibe.spec "bean-landing"
|
|
|
489
489
|
|
|
490
490
|
Claude: 🔍 Input 분석
|
|
491
491
|
기존 파일:
|
|
492
|
-
✅ spec: .
|
|
493
|
-
✅ feature: .
|
|
492
|
+
✅ spec: .vibe/specs/bean-landing.md
|
|
493
|
+
✅ feature: .vibe/features/bean-landing.feature
|
|
494
494
|
|
|
495
495
|
이미 SPEC이 존재합니다. 어떻게 진행할까요?
|
|
496
496
|
1. SPEC 리뷰 (Phase 4: vibe-spec-review 스킬 로드)
|
|
@@ -506,7 +506,7 @@ User: /vibe.spec
|
|
|
506
506
|
Claude: (.last-feature 읽기 → "bean-landing" 발견)
|
|
507
507
|
|
|
508
508
|
🔄 마지막 작업: bean-landing
|
|
509
|
-
✅ interview: .
|
|
509
|
+
✅ interview: .vibe/interviews/bean-landing.md (status: partial, 2일 전)
|
|
510
510
|
❌ plan: 없음
|
|
511
511
|
❌ spec: 없음
|
|
512
512
|
→ 다음 단계: Phase 2 (vibe-plan — 기획서 작성)
|
|
@@ -552,8 +552,8 @@ Claude: Feature: todo-app 선택
|
|
|
552
552
|
|
|
553
553
|
## Rollback / Resume
|
|
554
554
|
|
|
555
|
-
- 각 Phase 종료 시 상태가 `.
|
|
556
|
-
- **`.
|
|
555
|
+
- 각 Phase 종료 시 상태가 `.vibe/{interviews,plans,specs,features}/`에 저장됨
|
|
556
|
+
- **`.vibe/.last-feature` pointer**가 각 Phase 진입 시 갱신되어 "가장 최근에 작업한 feature" 추적 (Phase 7 완주 시 삭제)
|
|
557
557
|
- 중단 시 다시 `/vibe.spec`으로 돌아오면 Smart Resume Fallback 동작:
|
|
558
558
|
- 인자 있음 (`/vibe.spec "feature-name"` 또는 파일 경로) → 해당 feature의 가장 진행된 단계 다음으로 바로 진입
|
|
559
559
|
- 인자 없음 → `.last-feature` 우선 제안 → 거부하면 진행 중 작업 목록 제시 → 또 거부하면 빈 시작
|
package/commands/vibe.trace.md
CHANGED
|
@@ -28,24 +28,24 @@ Requirements Traceability Matrix (RTM) tracks the relationship between:
|
|
|
28
28
|
|
|
29
29
|
```
|
|
30
30
|
Step 1: Check if SPLIT structure exists (folder)
|
|
31
|
-
📁 .
|
|
32
|
-
📁 .
|
|
31
|
+
📁 .vibe/specs/{feature-name}/ → Folder with _index.md + phase files
|
|
32
|
+
📁 .vibe/features/{feature-name}/ → Folder with _index.feature + phase files
|
|
33
33
|
|
|
34
34
|
Step 2: If no folder, check single file
|
|
35
|
-
📄 .
|
|
36
|
-
📄 .
|
|
35
|
+
📄 .vibe/specs/{feature-name}.md → Single SPEC file
|
|
36
|
+
📄 .vibe/features/{feature-name}.feature → Single Feature file
|
|
37
37
|
|
|
38
38
|
Step 3: If neither exists → Error
|
|
39
39
|
```
|
|
40
40
|
|
|
41
41
|
**Split structure (folder) detected:**
|
|
42
42
|
```
|
|
43
|
-
📁 .
|
|
43
|
+
📁 .vibe/specs/{feature-name}/
|
|
44
44
|
├── _index.md → Master SPEC (read first)
|
|
45
45
|
├── phase-1-{name}.md → Phase 1 SPEC
|
|
46
46
|
└── ...
|
|
47
47
|
|
|
48
|
-
📁 .
|
|
48
|
+
📁 .vibe/features/{feature-name}/
|
|
49
49
|
├── _index.feature → Master Feature (read first)
|
|
50
50
|
├── phase-1-{name}.feature → Phase 1 scenarios
|
|
51
51
|
└── ...
|
|
@@ -55,8 +55,8 @@ Step 3: If neither exists → Error
|
|
|
55
55
|
|
|
56
56
|
**Single file detected:**
|
|
57
57
|
```
|
|
58
|
-
📄 .
|
|
59
|
-
📄 .
|
|
58
|
+
📄 .vibe/specs/{feature-name}.md → SPEC
|
|
59
|
+
📄 .vibe/features/{feature-name}.feature → Feature
|
|
60
60
|
```
|
|
61
61
|
|
|
62
62
|
**Additional (auto-detect):**
|
|
@@ -67,8 +67,8 @@ Step 3: If neither exists → Error
|
|
|
67
67
|
**Error if NEITHER file NOR folder found:**
|
|
68
68
|
```
|
|
69
69
|
❌ SPEC not found. Searched:
|
|
70
|
-
- .
|
|
71
|
-
- .
|
|
70
|
+
- .vibe/specs/{feature-name}/ (folder)
|
|
71
|
+
- .vibe/specs/{feature-name}.md (file)
|
|
72
72
|
|
|
73
73
|
Run /vibe.spec "{feature-name}" first.
|
|
74
74
|
```
|
|
@@ -145,8 +145,8 @@ Claude:
|
|
|
145
145
|
📊 Generating RTM for "login"...
|
|
146
146
|
|
|
147
147
|
Loading files:
|
|
148
|
-
✅ SPEC: .
|
|
149
|
-
✅ Feature: .
|
|
148
|
+
✅ SPEC: .vibe/specs/login.md (5 requirements)
|
|
149
|
+
✅ Feature: .vibe/features/login.feature (4 scenarios)
|
|
150
150
|
✅ Tests: 3 test files found
|
|
151
151
|
|
|
152
152
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
@@ -242,7 +242,7 @@ If the achievement rate does not improve between iterations (`isImproving` retur
|
|
|
242
242
|
| Option | Description |
|
|
243
243
|
|--------|-------------|
|
|
244
244
|
| `--html` | Output as HTML file |
|
|
245
|
-
| `--save` | Save to `.
|
|
245
|
+
| `--save` | Save to `.vibe/reports/{feature}-rtm.md` |
|
|
246
246
|
| `--json` | Output as JSON |
|
|
247
247
|
|
|
248
248
|
## Coverage Targets
|
|
@@ -260,7 +260,7 @@ If the achievement rate does not improve between iterations (`isImproving` retur
|
|
|
260
260
|
|
|
261
261
|
```
|
|
262
262
|
/vibe.trace가 정상 완료되면 (RTM 출력 + 사용자 확인 후):
|
|
263
|
-
Delete ".
|
|
263
|
+
Delete ".vibe/.last-feature"
|
|
264
264
|
|
|
265
265
|
이유: /vibe.trace는 vibe 워크플로의 마지막 Phase (Phase 7).
|
|
266
266
|
완주 후에는 다음 /vibe.spec 호출 시 "빈 시작" 또는 진행 중 목록에서 다른 feature를 시작해야 한다.
|
package/commands/vibe.utils.md
CHANGED
|
@@ -238,7 +238,7 @@ Detect and remove unused code with audit trail.
|
|
|
238
238
|
|
|
239
239
|
**Output:**
|
|
240
240
|
- Removed items list
|
|
241
|
-
- `.
|
|
241
|
+
- `.vibe/DELETION_LOG.md` updated
|
|
242
242
|
- Build/test verification
|
|
243
243
|
|
|
244
244
|
---
|
|
@@ -285,10 +285,10 @@ Document solved problems for knowledge accumulation.
|
|
|
285
285
|
**Usually auto-triggered by hooks when:**
|
|
286
286
|
- "bug fixed", "PR merged" detected
|
|
287
287
|
|
|
288
|
-
**Output location:** `.
|
|
288
|
+
**Output location:** `.vibe/solutions/`
|
|
289
289
|
|
|
290
290
|
```
|
|
291
|
-
.
|
|
291
|
+
.vibe/solutions/
|
|
292
292
|
├── security/ # Security solutions
|
|
293
293
|
├── performance/ # Performance optimizations
|
|
294
294
|
├── database/ # Database related
|
package/commands/vibe.verify.md
CHANGED
|
@@ -59,25 +59,25 @@ argument-hint: "feature name"
|
|
|
59
59
|
|
|
60
60
|
```
|
|
61
61
|
Step 1: Check if SPLIT structure exists (folder)
|
|
62
|
-
📁 .
|
|
63
|
-
📁 .
|
|
62
|
+
📁 .vibe/features/{feature-name}/ → Folder with _index.feature + phase files
|
|
63
|
+
📁 .vibe/specs/{feature-name}/ → Folder with _index.md + phase files
|
|
64
64
|
|
|
65
65
|
Step 2: If no folder, check single file
|
|
66
|
-
📄 .
|
|
67
|
-
📄 .
|
|
66
|
+
📄 .vibe/features/{feature-name}.feature → Single Feature file
|
|
67
|
+
📄 .vibe/specs/{feature-name}.md → Single SPEC file
|
|
68
68
|
|
|
69
69
|
Step 3: If neither exists → Error
|
|
70
70
|
```
|
|
71
71
|
|
|
72
72
|
**Split structure (folder) detected:**
|
|
73
73
|
```
|
|
74
|
-
📁 .
|
|
74
|
+
📁 .vibe/features/{feature-name}/
|
|
75
75
|
├── _index.feature → Master Feature (read first for scenario overview)
|
|
76
76
|
├── phase-1-{name}.feature → Phase 1 scenarios
|
|
77
77
|
├── phase-2-{name}.feature → Phase 2 scenarios
|
|
78
78
|
└── ...
|
|
79
79
|
|
|
80
|
-
📁 .
|
|
80
|
+
📁 .vibe/specs/{feature-name}/
|
|
81
81
|
├── _index.md → Master SPEC (read first for overview)
|
|
82
82
|
├── phase-1-{name}.md → Phase 1 SPEC
|
|
83
83
|
└── ...
|
|
@@ -87,15 +87,15 @@ Step 3: If neither exists → Error
|
|
|
87
87
|
|
|
88
88
|
**Single file detected:**
|
|
89
89
|
```
|
|
90
|
-
📄 .
|
|
91
|
-
📄 .
|
|
90
|
+
📄 .vibe/features/{feature-name}.feature → Scenario list
|
|
91
|
+
📄 .vibe/specs/{feature-name}.md → Verification criteria (reference)
|
|
92
92
|
```
|
|
93
93
|
|
|
94
94
|
**Error if NEITHER file NOR folder found:**
|
|
95
95
|
```
|
|
96
96
|
❌ Feature file not found. Searched:
|
|
97
|
-
- .
|
|
98
|
-
- .
|
|
97
|
+
- .vibe/features/{feature-name}/ (folder)
|
|
98
|
+
- .vibe/features/{feature-name}.feature (file)
|
|
99
99
|
|
|
100
100
|
Run /vibe.spec "{feature-name}" first.
|
|
101
101
|
```
|
|
@@ -184,16 +184,16 @@ For each UI scenario in Feature file:
|
|
|
184
184
|
|
|
185
185
|
### 3.5 Step Count (MANDATORY before Quality Report)
|
|
186
186
|
|
|
187
|
-
Read `.
|
|
187
|
+
Read `.vibe/metrics/current-run.json` to obtain the tool-call count from the preceding `/vibe.run` (and any follow-up work in this session). Then append a record to `.vibe/metrics/history.jsonl` and include the count in the Quality Report below.
|
|
188
188
|
|
|
189
189
|
```bash
|
|
190
190
|
# Read step count (ok if file missing — treat as 0)
|
|
191
|
-
STEPS=$(node -e "try{const d=JSON.parse(require('fs').readFileSync('.
|
|
191
|
+
STEPS=$(node -e "try{const d=JSON.parse(require('fs').readFileSync('.vibe/metrics/current-run.json','utf-8'));console.log(d.steps||0)}catch{console.log(0)}")
|
|
192
192
|
|
|
193
193
|
# Append history record
|
|
194
194
|
node -e "
|
|
195
195
|
const fs=require('fs'),path=require('path');
|
|
196
|
-
const dir='.
|
|
196
|
+
const dir='.vibe/metrics';
|
|
197
197
|
try{
|
|
198
198
|
const cur=JSON.parse(fs.readFileSync(path.join(dir,'current-run.json'),'utf-8'));
|
|
199
199
|
const rec={verifiedAt:new Date().toISOString(),feature:cur.feature,startedAt:cur.startedAt,steps:cur.steps||0};
|
|
@@ -295,8 +295,8 @@ For each failed scenario:
|
|
|
295
295
|
|
|
296
296
|
## Input
|
|
297
297
|
|
|
298
|
-
- `.
|
|
299
|
-
- `.
|
|
298
|
+
- `.vibe/features/{feature-name}.feature` or `.vibe/features/{feature-name}/` - BDD scenarios
|
|
299
|
+
- `.vibe/specs/{feature-name}.md` or `.vibe/specs/{feature-name}/` - SPEC document (reference)
|
|
300
300
|
- Implemented source code
|
|
301
301
|
|
|
302
302
|
## Output
|
|
@@ -311,7 +311,7 @@ For each failed scenario:
|
|
|
311
311
|
User: /vibe.verify "login"
|
|
312
312
|
|
|
313
313
|
Claude:
|
|
314
|
-
📄 Loading Feature: .
|
|
314
|
+
📄 Loading Feature: .vibe/features/login.feature
|
|
315
315
|
🔍 Starting verification...
|
|
316
316
|
|
|
317
317
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
@@ -432,7 +432,7 @@ After all scenarios pass, auto-invoke:
|
|
|
432
432
|
Load skill `vibe-contract` with: check "{feature-name}"
|
|
433
433
|
```
|
|
434
434
|
|
|
435
|
-
- Skip if `.
|
|
435
|
+
- Skip if `.vibe/contracts/{feature-name}.md` does not exist
|
|
436
436
|
- No drift → verify still passes
|
|
437
437
|
- **P1 drift** → demote verify to fail; auto-call `/vibe.regress register --from-contract`
|
|
438
438
|
- P2 / P3 drift → warning only; verify still passes
|
|
@@ -533,7 +533,7 @@ Stuck detected (same error as previous attempt):
|
|
|
533
533
|
1. Provide a fix hint (e.g., "check LoginForm.tsx line 42")
|
|
534
534
|
→ Apply → Re-verify → Continue loop
|
|
535
535
|
2. Type "proceed" → Record failure in
|
|
536
|
-
.
|
|
536
|
+
.vibe/todos/verify-failure-{scenario}.md,
|
|
537
537
|
continue to next scenario
|
|
538
538
|
3. Type "abort" → Stop entire verification
|
|
539
539
|
→ ultrawork mode: auto-record TODO + continue to next scenario
|
|
@@ -42,6 +42,21 @@ try {
|
|
|
42
42
|
|
|
43
43
|
if (!prompt) process.exit(0);
|
|
44
44
|
|
|
45
|
+
// 레거시 SSOT 통합 — `/vibe.*` 진입 시 `.claude/vibe/`·`.coco/vibe/` → `.vibe/` 자동 이동.
|
|
46
|
+
// `vibe init`/`update` 와 동일한 `consolidateLegacyVibe` (dist/cli/setup/LegacyMigration.js) 를 직접 재사용. Idempotent.
|
|
47
|
+
if (/^\s*\/vibe\b/i.test(prompt)) {
|
|
48
|
+
try {
|
|
49
|
+
const projectDir = process.env.CLAUDE_PROJECT_DIR || process.env.COCO_PROJECT_DIR || process.cwd();
|
|
50
|
+
const utils = await import('./utils.js');
|
|
51
|
+
const CLI_BASE = utils.getCliBaseUrl();
|
|
52
|
+
const { consolidateLegacyVibe } = await import(`${CLI_BASE}setup/LegacyMigration.js`);
|
|
53
|
+
const moved = consolidateLegacyVibe(projectDir);
|
|
54
|
+
if (moved.length > 0) {
|
|
55
|
+
process.stdout.write(`[vibe] Migrated legacy dirs → .vibe/ (${moved.join(', ')})\n`);
|
|
56
|
+
}
|
|
57
|
+
} catch { /* migration is best-effort */ }
|
|
58
|
+
}
|
|
59
|
+
|
|
45
60
|
// 패턴 → 실행할 스크립트 매핑
|
|
46
61
|
// 각 항목: { pattern, script, args, label }
|
|
47
62
|
const DISPATCH_RULES = [
|
package/hooks/scripts/utils.js
CHANGED
|
@@ -219,6 +219,10 @@ export function getLibBaseUrl() {
|
|
|
219
219
|
return getPackageUrl(path.join('dist', 'infra', 'lib'), 'constants.js');
|
|
220
220
|
}
|
|
221
221
|
|
|
222
|
+
export function getCliBaseUrl() {
|
|
223
|
+
return getPackageUrl(path.join('dist', 'cli'), 'index.js');
|
|
224
|
+
}
|
|
225
|
+
|
|
222
226
|
// ─── Hook Trace Logging ───
|
|
223
227
|
|
|
224
228
|
const HOOK_TRACE_PATH = path.join(VIBE_HOME_DIR, 'hook-traces.jsonl');
|
package/package.json
CHANGED
|
@@ -152,11 +152,11 @@ describe('Architecture Boundaries', () => {
|
|
|
152
152
|
| File | Purpose |
|
|
153
153
|
|------|---------|
|
|
154
154
|
| `tests/arch-guard.test.ts` | Executable boundary tests |
|
|
155
|
-
| `.
|
|
155
|
+
| `.vibe/arch-rules.json` | Machine-readable rules (for CI) |
|
|
156
156
|
|
|
157
157
|
## Customization
|
|
158
158
|
|
|
159
|
-
Users can add custom rules to `.
|
|
159
|
+
Users can add custom rules to `.vibe/arch-rules.json`:
|
|
160
160
|
|
|
161
161
|
```json
|
|
162
162
|
{
|
|
@@ -7,17 +7,17 @@ tools: [Read]
|
|
|
7
7
|
# Arch Rule Generator
|
|
8
8
|
|
|
9
9
|
## Role
|
|
10
|
-
Translates a detected architecture map into a precise, machine-checkable set of import boundary rules. Merges default rules for the detected pattern with any custom rules defined in `.
|
|
10
|
+
Translates a detected architecture map into a precise, machine-checkable set of import boundary rules. Merges default rules for the detected pattern with any custom rules defined in `.vibe/arch-rules.json`. Outputs a normalized rule set ready for the violation checker.
|
|
11
11
|
|
|
12
12
|
## Responsibilities
|
|
13
13
|
- Select default rule templates for the detected architecture pattern
|
|
14
|
-
- Merge with custom rules from `.
|
|
14
|
+
- Merge with custom rules from `.vibe/arch-rules.json` if present
|
|
15
15
|
- Resolve glob patterns to concrete layer names
|
|
16
16
|
- Deduplicate and normalize rule list
|
|
17
17
|
- Flag rules with low confidence (detected layer with no matching files)
|
|
18
18
|
|
|
19
19
|
## Input
|
|
20
|
-
Architecture map JSON from `arch-detector`, plus optional `.
|
|
20
|
+
Architecture map JSON from `arch-detector`, plus optional `.vibe/arch-rules.json` for user-defined overrides.
|
|
21
21
|
|
|
22
22
|
## Output
|
|
23
23
|
Normalized rule set JSON:
|
|
@@ -53,7 +53,7 @@ function resolveImport(fromFile, imp, baseDir) {
|
|
|
53
53
|
return path.resolve(path.dirname(fromFile), imp).replace(baseDir + path.sep, '').replace(/\\/g, '/');
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
const rulesPath = process.argv[2] || '.
|
|
56
|
+
const rulesPath = process.argv[2] || '.vibe/arch-rules.json';
|
|
57
57
|
const srcDir = path.resolve(process.argv[3] || 'src');
|
|
58
58
|
const baseDir = path.resolve('.');
|
|
59
59
|
|
|
@@ -115,7 +115,7 @@ Based on classification, build the appropriate artifact:
|
|
|
115
115
|
|
|
116
116
|
> **Problem**: The built capability didn't actually prevent the failure. This usually means the initial diagnosis was wrong (picked `Tool` when it needed `Guardrail`), or the failure has multiple missing capabilities.
|
|
117
117
|
>
|
|
118
|
-
> **Do NOT silently proceed** — a sub-standard capability log pollutes `.
|
|
118
|
+
> **Do NOT silently proceed** — a sub-standard capability log pollutes `.vibe/capabilities-log.md` and the failure will recur.
|
|
119
119
|
|
|
120
120
|
**Escalation loop:**
|
|
121
121
|
|
|
@@ -207,7 +207,7 @@ save_memory("capability-{name}", {
|
|
|
207
207
|
})
|
|
208
208
|
```
|
|
209
209
|
|
|
210
|
-
Update `.
|
|
210
|
+
Update `.vibe/capabilities-log.md`:
|
|
211
211
|
|
|
212
212
|
```markdown
|
|
213
213
|
## {date} — {capability-name}
|
|
@@ -108,7 +108,7 @@ Separate the collected information into 3 layers:
|
|
|
108
108
|
|
|
109
109
|
**Loaded only when working on a specific feature** → focus on what and why, leave how to the agent.
|
|
110
110
|
|
|
111
|
-
Storage location: `.
|
|
111
|
+
Storage location: `.vibe/specs/YYYY-MM-DD-{topic}.md`
|
|
112
112
|
|
|
113
113
|
```markdown
|
|
114
114
|
# {Feature Name} SPEC
|
|
@@ -124,7 +124,7 @@ Storage location: `.claude/vibe/specs/YYYY-MM-DD-{topic}.md`
|
|
|
124
124
|
|
|
125
125
|
**Per-session task list** → 2-5 minute units, with file paths specified.
|
|
126
126
|
|
|
127
|
-
Storage location: `.
|
|
127
|
+
Storage location: `.vibe/specs/{name}-execplan.md`
|
|
128
128
|
|
|
129
129
|
```markdown
|
|
130
130
|
# Execution Plan
|
|
@@ -131,11 +131,11 @@ When running on mobile stacks (React Native, Flutter, iOS, Android):
|
|
|
131
131
|
|
|
132
132
|
Before running the audit:
|
|
133
133
|
|
|
134
|
-
1. **Read** `.
|
|
134
|
+
1. **Read** `.vibe/design-context.json`
|
|
135
135
|
- If missing → display: "Run `/design-teach` first for better results" → proceed with defaults
|
|
136
136
|
- If parse error → display warning → proceed with defaults → recommend `/design-teach`
|
|
137
137
|
- If present → weight findings by `audience.context`, `constraints.accessibility`, `brand.personality`
|
|
138
|
-
2. **Read** `.
|
|
138
|
+
2. **Read** `.vibe/design-system/*/MASTER.md` (if exists) for token reference
|
|
139
139
|
|
|
140
140
|
## Next Steps
|
|
141
141
|
|
|
@@ -148,5 +148,5 @@ Before running the audit:
|
|
|
148
148
|
## Important
|
|
149
149
|
|
|
150
150
|
- **Read-only**: This skill produces a report. It does NOT modify code.
|
|
151
|
-
- **Context-aware**: If `.
|
|
151
|
+
- **Context-aware**: If `.vibe/design-context.json` exists, findings are weighted by project brand and audience.
|
|
152
152
|
- **Incremental**: When run on `.` (changed files), only audits files in current diff.
|
|
@@ -118,7 +118,7 @@ When running on mobile stacks (React Native, Flutter, iOS, Android):
|
|
|
118
118
|
|
|
119
119
|
Before running the critique:
|
|
120
120
|
|
|
121
|
-
1. **Read** `.
|
|
121
|
+
1. **Read** `.vibe/design-context.json`
|
|
122
122
|
- If missing → display: "Run `/design-teach` first for better results" → proceed with defaults
|
|
123
123
|
- If parse error → display warning → proceed with defaults → recommend `/design-teach`
|
|
124
124
|
- If present → adjust persona priorities by `audience.primary` and `audience.expertise`
|
|
@@ -135,5 +135,5 @@ Before running the critique:
|
|
|
135
135
|
## Important
|
|
136
136
|
|
|
137
137
|
- **Read-only**: Produces design critique report. No code modifications.
|
|
138
|
-
- **Context-aware**: Uses `.
|
|
138
|
+
- **Context-aware**: Uses `.vibe/design-context.json` for brand/audience context if available.
|
|
139
139
|
- **Complementary**: Pairs with `/design-audit` (technical) — critique focuses on UX quality.
|