@su-record/vibe 2.0.11 → 2.2.1
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/settings.json +1 -1
- package/.claude/settings.local.json +5 -1
- package/{.vibe → .claude/vibe}/rules/quality/bdd-contract-testing.md +1 -1
- package/{.vibe → .claude/vibe}/setup.sh +1 -1
- package/CLAUDE.md +16 -6
- package/README.md +33 -15
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +100 -56
- package/dist/cli/index.js.map +1 -1
- package/dist/tools/reasoning/applyReasoningFramework.js +1 -1
- package/package.json +1 -2
- package/templates/feature-template.md +1 -1
- package/.claude/agents/explorer.md +0 -48
- package/.claude/agents/implementer.md +0 -53
- package/.claude/agents/research/best-practices-agent.md +0 -139
- package/.claude/agents/research/codebase-patterns-agent.md +0 -147
- package/.claude/agents/research/framework-docs-agent.md +0 -181
- package/.claude/agents/research/security-advisory-agent.md +0 -167
- package/.claude/agents/review/architecture-reviewer.md +0 -107
- package/.claude/agents/review/complexity-reviewer.md +0 -116
- package/.claude/agents/review/data-integrity-reviewer.md +0 -88
- package/.claude/agents/review/git-history-reviewer.md +0 -103
- package/.claude/agents/review/performance-reviewer.md +0 -86
- package/.claude/agents/review/python-reviewer.md +0 -152
- package/.claude/agents/review/rails-reviewer.md +0 -139
- package/.claude/agents/review/react-reviewer.md +0 -144
- package/.claude/agents/review/security-reviewer.md +0 -80
- package/.claude/agents/review/simplicity-reviewer.md +0 -140
- package/.claude/agents/review/test-coverage-reviewer.md +0 -116
- package/.claude/agents/review/typescript-reviewer.md +0 -127
- package/.claude/agents/searcher.md +0 -54
- package/.claude/agents/simplifier.md +0 -119
- package/.claude/agents/tester.md +0 -49
- package/.claude/commands/vibe.analyze.md +0 -239
- package/.claude/commands/vibe.compound.md +0 -261
- package/.claude/commands/vibe.continue.md +0 -88
- package/.claude/commands/vibe.diagram.md +0 -178
- package/.claude/commands/vibe.e2e.md +0 -266
- package/.claude/commands/vibe.reason.md +0 -306
- package/.claude/commands/vibe.review.md +0 -324
- package/.claude/commands/vibe.run.md +0 -760
- package/.claude/commands/vibe.spec.md +0 -383
- package/.claude/commands/vibe.tool.md +0 -153
- package/.claude/commands/vibe.ui.md +0 -137
- package/.claude/commands/vibe.verify.md +0 -238
- package/.claude/skills/git-worktree.md +0 -178
- package/.claude/skills/priority-todos.md +0 -236
- /package/{.vibe → .claude/vibe}/config.json +0 -0
- /package/{.vibe → .claude/vibe}/constitution.md +0 -0
- /package/{.vibe → .claude/vibe}/rules/core/communication-guide.md +0 -0
- /package/{.vibe → .claude/vibe}/rules/core/development-philosophy.md +0 -0
- /package/{.vibe → .claude/vibe}/rules/core/quick-start.md +0 -0
- /package/{.vibe → .claude/vibe}/rules/quality/checklist.md +0 -0
- /package/{.vibe → .claude/vibe}/rules/quality/testing-strategy.md +0 -0
- /package/{.vibe → .claude/vibe}/rules/standards/anti-patterns.md +0 -0
- /package/{.vibe → .claude/vibe}/rules/standards/code-structure.md +0 -0
- /package/{.vibe → .claude/vibe}/rules/standards/complexity-metrics.md +0 -0
- /package/{.vibe → .claude/vibe}/rules/standards/naming-conventions.md +0 -0
- /package/{.vibe → .claude/vibe}/rules/tools/mcp-hi-ai-guide.md +0 -0
- /package/{.vibe → .claude/vibe}/rules/tools/mcp-workflow.md +0 -0
package/.claude/settings.json
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"Bash(git push:*)",
|
|
11
11
|
"Bash(npm pack)",
|
|
12
12
|
"Bash(npm install:*)",
|
|
13
|
-
"Read(//private/tmp/test-vibe-bdd/.vibe/**)",
|
|
13
|
+
"Read(//private/tmp/test-vibe-bdd/.claude/vibe/**)",
|
|
14
14
|
"Read(//private/tmp/test-vibe-bdd/.claude/commands/**)",
|
|
15
15
|
"Bash(npm view:*)",
|
|
16
16
|
"Bash(gh release create:*)",
|
|
@@ -14,7 +14,11 @@
|
|
|
14
14
|
"Bash(claude mcp list:*)",
|
|
15
15
|
"Bash(C:Usersendba.localbinclaude.exe --version)",
|
|
16
16
|
"Bash(\"C:\\\\Users\\\\endba\\\\.local\\\\bin\\\\claude.exe\" --version)",
|
|
17
|
-
"Bash(npm cache clean:*)"
|
|
17
|
+
"Bash(npm cache clean:*)",
|
|
18
|
+
"Bash(git status:*)",
|
|
19
|
+
"Bash(gh pr create --repo anthropics/claude-plugins-official --title \"feat: add vibe plugin - SPEC-driven AI coding framework\" --body \"$\\(cat <<''EOF''\n## Plugin: vibe\n\nSPEC-driven AI coding framework for Claude Code with parallel agents, BDD verification, and quality assurance.\n\n### Features\n\n- **12 Slash Commands**: `/vibe.spec`, `/vibe.run`, `/vibe.verify`, `/vibe.review`, `/vibe.reason`, `/vibe.diagram`, and more\n- **16 Specialist Agents**: Security, performance, architecture reviewers + language-specific reviewers \\(Python, TypeScript, React, Rails\\)\n- **ULTRAWORK Pipeline**: Parallel execution with ~50% speed improvement through background agents and phase pipelining\n- **BDD Verification**: Behavior-driven development testing against SPEC requirements\n- **Context7 Integration**: Built-in support for up-to-date documentation lookup\n\n### Workflow\n\n```\n/vibe.spec \"feature\" → /vibe.run \"feature\" → /vibe.verify \"feature\"\n```\n\n### Repository\n\nhttps://github.com/su-record/vibe\n\n### License\n\nMIT\nEOF\n\\)\")",
|
|
20
|
+
"Bash(git rev-parse:*)",
|
|
21
|
+
"Bash(claude plugin:*)"
|
|
18
22
|
]
|
|
19
23
|
}
|
|
20
24
|
}
|
package/CLAUDE.md
CHANGED
|
@@ -4,7 +4,7 @@ SPEC 주도 AI 코딩 프레임워크 (Claude Code 전용)
|
|
|
4
4
|
|
|
5
5
|
## 코드 품질 기준 (필수)
|
|
6
6
|
|
|
7
|
-
모든 코드 작성 시 아래 기준을 준수합니다. 상세 규칙은 `.vibe/rules/` 참조.
|
|
7
|
+
모든 코드 작성 시 아래 기준을 준수합니다. 상세 규칙은 `.claude/vibe/rules/` 참조.
|
|
8
8
|
|
|
9
9
|
### 핵심 원칙
|
|
10
10
|
- **요청 범위만 수정** - 관련 없는 코드 건드리지 않음
|
|
@@ -47,11 +47,21 @@ SPEC 주도 AI 코딩 프레임워크 (Claude Code 전용)
|
|
|
47
47
|
|
|
48
48
|
**활성화 기능:**
|
|
49
49
|
- 병렬 서브에이전트 탐색 (3+ 동시)
|
|
50
|
+
- **백그라운드 에이전트** - 구현 중 다음 Phase 준비
|
|
51
|
+
- **Phase 파이프라이닝** - Phase 간 대기 시간 제거
|
|
50
52
|
- Boulder Loop (모든 Phase 완료까지 자동 진행)
|
|
51
53
|
- 에러 자동 재시도 (최대 3회)
|
|
52
54
|
- 컨텍스트 70%+ 시 자동 압축/저장
|
|
53
55
|
- Phase 간 확인 없이 연속 실행
|
|
54
56
|
|
|
57
|
+
**속도 비교:**
|
|
58
|
+
|
|
59
|
+
| Mode | Phase당 | 5 Phase |
|
|
60
|
+
|------|---------|---------|
|
|
61
|
+
| Sequential | ~2분 | ~10분 |
|
|
62
|
+
| Parallel Exploration | ~1.5분 | ~7.5분 |
|
|
63
|
+
| **ULTRAWORK Pipeline** | **~1분** | **~5분** |
|
|
64
|
+
|
|
55
65
|
## Commands
|
|
56
66
|
|
|
57
67
|
| 명령어 | 설명 |
|
|
@@ -97,7 +107,7 @@ SPEC 주도 AI 코딩 프레임워크 (Claude Code 전용)
|
|
|
97
107
|
해결한 문제를 자동 문서화:
|
|
98
108
|
|
|
99
109
|
```
|
|
100
|
-
.vibe/solutions/
|
|
110
|
+
.claude/vibe/solutions/
|
|
101
111
|
├── security/ # 보안 해결책
|
|
102
112
|
├── performance/ # 성능 최적화
|
|
103
113
|
├── database/ # DB 관련
|
|
@@ -203,7 +213,7 @@ git worktree remove ../review-123
|
|
|
203
213
|
|
|
204
214
|
### Priority Todos
|
|
205
215
|
```
|
|
206
|
-
.vibe/todos/
|
|
216
|
+
.claude/vibe/todos/
|
|
207
217
|
├── P1-security-sql-injection.md # 🔴 머지 차단
|
|
208
218
|
├── P2-perf-n1-query.md # 🟡 수정 권장
|
|
209
219
|
└── P3-style-extract-helper.md # 🔵 백로그
|
|
@@ -265,12 +275,12 @@ vibe는 자체 메모리 시스템으로 세션 간 컨텍스트를 유지합니
|
|
|
265
275
|
|
|
266
276
|
**반드시 포함:**
|
|
267
277
|
- `.claude/` 폴더 전체 (commands, agents, skills, settings.json)
|
|
268
|
-
- `.vibe/rules/`, `.vibe/specs/`, `.vibe/features/`, `.vibe/solutions/`, `.vibe/todos/`
|
|
278
|
+
- `.claude/vibe/rules/`, `.claude/vibe/specs/`, `.claude/vibe/features/`, `.claude/vibe/solutions/`, `.claude/vibe/todos/`
|
|
269
279
|
- `CLAUDE.md`
|
|
270
280
|
|
|
271
281
|
**제외:**
|
|
272
282
|
- `.claude/settings.local.json` (개인 설정, 자동 제외)
|
|
273
|
-
- `.vibe/mcp/` (node_modules, 자동 제외)
|
|
283
|
+
- `.claude/vibe/mcp/` (node_modules, 자동 제외)
|
|
274
284
|
|
|
275
285
|
## Getting Started
|
|
276
286
|
|
|
@@ -307,7 +317,7 @@ vibe init
|
|
|
307
317
|
│ └── Playwright E2E 테스트 │
|
|
308
318
|
│ │
|
|
309
319
|
│ 6. /vibe.compound │
|
|
310
|
-
│ └── 해결책 문서화 → .vibe/solutions/ │
|
|
320
|
+
│ └── 해결책 문서화 → .claude/vibe/solutions/ │
|
|
311
321
|
│ │
|
|
312
322
|
└─────────────────────────────────────────────────────────────────┘
|
|
313
323
|
```
|
package/README.md
CHANGED
|
@@ -24,11 +24,16 @@ SPEC 문서 하나로 AI가 바로 구현하고, **시나리오별 자동 검증
|
|
|
24
24
|
- **자동 컨텍스트 관리**: 80%+ 시 자동 저장, 세션 자동 복원
|
|
25
25
|
- **36개 내장 도구**: 코드 분석, 품질 검증, 세션 메모리 (MCP 오버헤드 제거)
|
|
26
26
|
|
|
27
|
-
### v2.
|
|
27
|
+
### v2.2.0 신규 기능
|
|
28
|
+
|
|
29
|
+
- **⚡ ULTRAWORK Pipeline**: 구현 중 백그라운드 에이전트로 다음 Phase 준비
|
|
30
|
+
- **🔄 Phase 파이프라이닝**: Phase 간 대기 시간 제거 (~50% 속도 향상)
|
|
31
|
+
|
|
32
|
+
### v2.1.0 기능
|
|
28
33
|
|
|
29
34
|
- **🔍 병렬 코드 리뷰**: 13+ 전문 에이전트가 동시 리뷰 (P1/P2/P3 우선순위)
|
|
30
35
|
- **🎭 E2E 테스트**: Playwright 기반 브라우저 자동화 (시각적 회귀, 비디오 녹화)
|
|
31
|
-
- **📚 지식 복리**: 해결책 자동 문서화 → `.vibe/solutions/`
|
|
36
|
+
- **📚 지식 복리**: 해결책 자동 문서화 → `.claude/vibe/solutions/`
|
|
32
37
|
- **🔬 병렬 리서치**: 요구사항 확정 후 4개 에이전트 동시 조사
|
|
33
38
|
|
|
34
39
|
---
|
|
@@ -37,25 +42,38 @@ SPEC 문서 하나로 AI가 바로 구현하고, **시나리오별 자동 검증
|
|
|
37
42
|
|
|
38
43
|
```bash
|
|
39
44
|
npm install -g @su-record/vibe
|
|
45
|
+
vibe init
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**생성되는 구조:**
|
|
49
|
+
|
|
50
|
+
```text
|
|
51
|
+
.claude/
|
|
52
|
+
├── commands/ # 슬래시 커맨드 (7개)
|
|
53
|
+
├── agents/ # 서브에이전트
|
|
54
|
+
├── settings.json # Hooks 설정
|
|
55
|
+
└── vibe/
|
|
56
|
+
├── rules/ # 코딩 규칙
|
|
57
|
+
├── specs/ # SPEC 문서
|
|
58
|
+
├── features/ # BDD Feature 파일
|
|
59
|
+
└── config.json # 프로젝트 설정
|
|
40
60
|
```
|
|
41
61
|
|
|
42
62
|
---
|
|
43
63
|
|
|
44
64
|
## Quick Start
|
|
45
65
|
|
|
46
|
-
### 1. 프로젝트 초기화 (터미널)
|
|
47
|
-
|
|
48
66
|
```bash
|
|
49
67
|
# 기존 프로젝트에서
|
|
50
68
|
vibe init
|
|
51
|
-
# →
|
|
69
|
+
# → 커맨드/에이전트 설치 + MCP 서버 등록 (context7, vibe-gemini, vibe-gpt)
|
|
52
70
|
|
|
53
71
|
# 새 프로젝트 생성
|
|
54
72
|
vibe init my-project
|
|
55
73
|
cd my-project
|
|
56
74
|
```
|
|
57
75
|
|
|
58
|
-
###
|
|
76
|
+
### 슬래시 커맨드 사용 (Claude Code)
|
|
59
77
|
|
|
60
78
|
```
|
|
61
79
|
/vibe.spec "로그인 기능" # SPEC 작성 (대화형)
|
|
@@ -73,7 +91,7 @@ cd my-project
|
|
|
73
91
|
│ /vibe.spec "기능명" │
|
|
74
92
|
│ ↓ 대화형 요구사항 수집 │
|
|
75
93
|
│ ↓ 요구사항 확정 후 4개 병렬 리서치 (v2.1.0) │
|
|
76
|
-
│ ↓ .vibe/specs/{기능명}.md + .feature │
|
|
94
|
+
│ ↓ .claude/vibe/specs/{기능명}.md + .feature │
|
|
77
95
|
├─────────────────────────────────────────────────────┤
|
|
78
96
|
│ /vibe.run "기능명" ultrawork │
|
|
79
97
|
│ ↓ 시나리오별 구현 + 즉시 검증 (SDD) │
|
|
@@ -89,7 +107,7 @@ cd my-project
|
|
|
89
107
|
│ ↓ Playwright E2E 테스트 │
|
|
90
108
|
├─────────────────────────────────────────────────────┤
|
|
91
109
|
│ /vibe.compound ← NEW (v2.1.0) │
|
|
92
|
-
│ ↓ 해결책 문서화 → .vibe/solutions/ │
|
|
110
|
+
│ ↓ 해결책 문서화 → .claude/vibe/solutions/ │
|
|
93
111
|
└─────────────────────────────────────────────────────┘
|
|
94
112
|
```
|
|
95
113
|
|
|
@@ -305,7 +323,7 @@ Playwright 기반 브라우저 자동화 테스트:
|
|
|
305
323
|
해결한 문제를 자동 문서화하여 지식 축적:
|
|
306
324
|
|
|
307
325
|
```
|
|
308
|
-
.vibe/solutions/
|
|
326
|
+
.claude/vibe/solutions/
|
|
309
327
|
├── security/ # 보안 해결책
|
|
310
328
|
├── performance/ # 성능 최적화
|
|
311
329
|
├── database/ # DB 관련
|
|
@@ -371,7 +389,7 @@ project/
|
|
|
371
389
|
│ ├── skills/ # 스킬 (2개) ← NEW
|
|
372
390
|
│ ├── settings.json # Hooks 설정
|
|
373
391
|
│ └── settings.local.json # 개인 설정 ← git 제외 (자동)
|
|
374
|
-
└── .vibe/
|
|
392
|
+
└── .claude/vibe/
|
|
375
393
|
├── config.json # 프로젝트 설정 ← git 공유
|
|
376
394
|
├── constitution.md # 프로젝트 원칙 ← git 공유
|
|
377
395
|
├── rules/ # 코딩 규칙 ← git 공유
|
|
@@ -389,7 +407,7 @@ project/
|
|
|
389
407
|
## Feature 파일 (BDD 시나리오)
|
|
390
408
|
|
|
391
409
|
```gherkin
|
|
392
|
-
# .vibe/features/login.feature
|
|
410
|
+
# .claude/vibe/features/login.feature
|
|
393
411
|
|
|
394
412
|
Feature: 로그인
|
|
395
413
|
|
|
@@ -454,7 +472,7 @@ Then: {예상 결과}
|
|
|
454
472
|
|
|
455
473
|
---
|
|
456
474
|
|
|
457
|
-
## Coding Rules (.vibe/rules/)
|
|
475
|
+
## Coding Rules (.claude/vibe/rules/)
|
|
458
476
|
|
|
459
477
|
### 언어별 규칙 자동 적용
|
|
460
478
|
|
|
@@ -651,8 +669,8 @@ User: 1
|
|
|
651
669
|
[대화 계속...]
|
|
652
670
|
|
|
653
671
|
✅ SPEC 문서 작성 완료!
|
|
654
|
-
📄 .vibe/specs/brick-game.md
|
|
655
|
-
📄 .vibe/features/brick-game.feature
|
|
672
|
+
📄 .claude/vibe/specs/brick-game.md
|
|
673
|
+
📄 .claude/vibe/features/brick-game.feature
|
|
656
674
|
|
|
657
675
|
다음 단계: /vibe.run "벽돌게임"
|
|
658
676
|
```
|
|
@@ -693,7 +711,7 @@ npm install -g @su-record/vibe
|
|
|
693
711
|
vibe update
|
|
694
712
|
|
|
695
713
|
# 또는 setup 스크립트 실행
|
|
696
|
-
./.vibe/setup.sh
|
|
714
|
+
./.claude/vibe/setup.sh
|
|
697
715
|
```
|
|
698
716
|
|
|
699
717
|
### 사용법
|
package/dist/cli/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAy1EH,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAE5C,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,qBAAqB,IAAI,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAC;AACnF,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAEzE,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AAErF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAEvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAE3E,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAErE,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAEjE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC"}
|
package/dist/cli/index.js
CHANGED
|
@@ -300,7 +300,7 @@ function getLLMAuthStatus() {
|
|
|
300
300
|
// GPT API 키 확인 (프로젝트 config)
|
|
301
301
|
if (!status.gpt) {
|
|
302
302
|
try {
|
|
303
|
-
const configPath = path.join(process.cwd(), '.vibe', 'config.json');
|
|
303
|
+
const configPath = path.join(process.cwd(), '.claude', 'vibe', 'config.json');
|
|
304
304
|
if (fs.existsSync(configPath)) {
|
|
305
305
|
const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
306
306
|
if (config.models?.gpt?.enabled) {
|
|
@@ -334,7 +334,7 @@ function getLLMAuthStatus() {
|
|
|
334
334
|
// Gemini API 키 확인 (프로젝트 config)
|
|
335
335
|
if (!status.gemini) {
|
|
336
336
|
try {
|
|
337
|
-
const configPath = path.join(process.cwd(), '.vibe', 'config.json');
|
|
337
|
+
const configPath = path.join(process.cwd(), '.claude', 'vibe', 'config.json');
|
|
338
338
|
if (fs.existsSync(configPath)) {
|
|
339
339
|
const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
340
340
|
if (config.models?.gemini?.enabled) {
|
|
@@ -641,7 +641,7 @@ function detectTechStacks(projectRoot) {
|
|
|
641
641
|
// ============================================================================
|
|
642
642
|
function setupCollaboratorAutoInstall(projectRoot) {
|
|
643
643
|
const packageJsonPath = path.join(projectRoot, 'package.json');
|
|
644
|
-
const vibeDir = path.join(projectRoot, '.vibe');
|
|
644
|
+
const vibeDir = path.join(projectRoot, '.claude', 'vibe');
|
|
645
645
|
const vibeVersion = getPackageJson().version;
|
|
646
646
|
// 1. Node.js 프로젝트: package.json 정리
|
|
647
647
|
if (fs.existsSync(packageJsonPath)) {
|
|
@@ -687,12 +687,15 @@ function setupCollaboratorAutoInstall(projectRoot) {
|
|
|
687
687
|
log(' ⚠️ package.json 수정 실패: ' + e.message + '\n');
|
|
688
688
|
}
|
|
689
689
|
}
|
|
690
|
-
// 2. .vibe/setup.sh 생성
|
|
690
|
+
// 2. .claude/vibe/setup.sh 생성
|
|
691
691
|
const setupShPath = path.join(vibeDir, 'setup.sh');
|
|
692
|
+
if (!fs.existsSync(vibeDir)) {
|
|
693
|
+
fs.mkdirSync(vibeDir, { recursive: true });
|
|
694
|
+
}
|
|
692
695
|
if (!fs.existsSync(setupShPath)) {
|
|
693
696
|
const setupScript = `#!/bin/bash
|
|
694
697
|
# Vibe 협업자 자동 설치 스크립트
|
|
695
|
-
# 사용법: ./.vibe/setup.sh
|
|
698
|
+
# 사용법: ./.claude/vibe/setup.sh
|
|
696
699
|
|
|
697
700
|
set -e
|
|
698
701
|
|
|
@@ -724,7 +727,7 @@ echo " /vibe.run \\"기능명\\" 구현 실행"
|
|
|
724
727
|
`;
|
|
725
728
|
fs.writeFileSync(setupShPath, setupScript);
|
|
726
729
|
fs.chmodSync(setupShPath, '755');
|
|
727
|
-
log(' ✅ 협업자 설치 스크립트 생성 (.vibe/setup.sh)\n');
|
|
730
|
+
log(' ✅ 협업자 설치 스크립트 생성 (.claude/vibe/setup.sh)\n');
|
|
728
731
|
}
|
|
729
732
|
// 3. README.md에 협업자 안내 추가
|
|
730
733
|
const readmePath = path.join(projectRoot, 'README.md');
|
|
@@ -741,7 +744,7 @@ npm install -g @su-record/vibe
|
|
|
741
744
|
vibe update
|
|
742
745
|
|
|
743
746
|
# 또는 setup 스크립트 실행
|
|
744
|
-
./.vibe/setup.sh
|
|
747
|
+
./.claude/vibe/setup.sh
|
|
745
748
|
\`\`\`
|
|
746
749
|
|
|
747
750
|
### 사용법
|
|
@@ -869,9 +872,9 @@ async function init(projectName) {
|
|
|
869
872
|
fs.mkdirSync(projectRoot, { recursive: true });
|
|
870
873
|
isNewProject = true;
|
|
871
874
|
}
|
|
872
|
-
const vibeDir = path.join(projectRoot, '.vibe');
|
|
875
|
+
const vibeDir = path.join(projectRoot, '.claude', 'vibe');
|
|
873
876
|
if (fs.existsSync(vibeDir)) {
|
|
874
|
-
log('❌ .vibe/ 폴더가 이미 존재합니다.');
|
|
877
|
+
log('❌ .claude/vibe/ 폴더가 이미 존재합니다.');
|
|
875
878
|
return;
|
|
876
879
|
}
|
|
877
880
|
ensureDir(vibeDir);
|
|
@@ -918,25 +921,33 @@ async function init(projectName) {
|
|
|
918
921
|
log(' ⚠️ Context7 MCP 수동 등록 필요\n');
|
|
919
922
|
}
|
|
920
923
|
}
|
|
921
|
-
// .vibe 폴더 구조 생성
|
|
924
|
+
// .claude/vibe 폴더 구조 생성
|
|
922
925
|
['specs', 'features'].forEach(dir => {
|
|
923
926
|
ensureDir(path.join(vibeDir, dir));
|
|
924
927
|
});
|
|
925
|
-
// 기존 .vibe/
|
|
926
|
-
const
|
|
927
|
-
if (fs.existsSync(
|
|
928
|
-
log('
|
|
928
|
+
// 기존 .vibe/ 폴더 마이그레이션 (레거시)
|
|
929
|
+
const legacyVibeDir = path.join(projectRoot, '.vibe');
|
|
930
|
+
if (fs.existsSync(legacyVibeDir)) {
|
|
931
|
+
log(' 🔄 레거시 .vibe/ 폴더 마이그레이션 중...\n');
|
|
929
932
|
try {
|
|
930
|
-
|
|
931
|
-
|
|
933
|
+
// specs, features 등 데이터 폴더 이동
|
|
934
|
+
['specs', 'features', 'solutions', 'todos', 'memory'].forEach(dir => {
|
|
935
|
+
const legacySrc = path.join(legacyVibeDir, dir);
|
|
936
|
+
const newDest = path.join(vibeDir, dir);
|
|
937
|
+
if (fs.existsSync(legacySrc) && !fs.existsSync(newDest)) {
|
|
938
|
+
copyDirRecursive(legacySrc, newDest);
|
|
939
|
+
}
|
|
940
|
+
});
|
|
941
|
+
removeDirRecursive(legacyVibeDir);
|
|
942
|
+
log(' ✅ .vibe/ → .claude/vibe/ 마이그레이션 완료\n');
|
|
932
943
|
}
|
|
933
944
|
catch (e) {
|
|
934
|
-
log(' ⚠️ .vibe/
|
|
945
|
+
log(' ⚠️ 마이그레이션 실패 - .vibe/ 폴더 수동 삭제 필요\n');
|
|
935
946
|
}
|
|
936
947
|
}
|
|
937
948
|
// .gitignore 업데이트
|
|
938
949
|
const gitignorePath = path.join(projectRoot, '.gitignore');
|
|
939
|
-
const mcpIgnore = '.vibe/mcp/';
|
|
950
|
+
const mcpIgnore = '.claude/vibe/mcp/';
|
|
940
951
|
if (fs.existsSync(gitignorePath)) {
|
|
941
952
|
let gitignore = fs.readFileSync(gitignorePath, 'utf-8');
|
|
942
953
|
if (!gitignore.includes(mcpIgnore)) {
|
|
@@ -1026,8 +1037,8 @@ async function init(projectName) {
|
|
|
1026
1037
|
fs.writeFileSync(projectClaudeMd, vibeContent);
|
|
1027
1038
|
log(' ✅ CLAUDE.md 생성\n');
|
|
1028
1039
|
}
|
|
1029
|
-
// .vibe/rules/ 복사
|
|
1030
|
-
const rulesSource = path.join(__dirname, '../../.vibe/rules');
|
|
1040
|
+
// .claude/vibe/rules/ 복사
|
|
1041
|
+
const rulesSource = path.join(__dirname, '../../.claude/vibe/rules');
|
|
1031
1042
|
const rulesTarget = path.join(vibeDir, 'rules');
|
|
1032
1043
|
const coreDirs = ['core', 'quality', 'standards', 'tools'];
|
|
1033
1044
|
coreDirs.forEach(dir => {
|
|
@@ -1050,7 +1061,7 @@ async function init(projectName) {
|
|
|
1050
1061
|
}
|
|
1051
1062
|
});
|
|
1052
1063
|
}
|
|
1053
|
-
log(' ✅ 코딩 규칙 설치 완료 (.vibe/rules/)\n');
|
|
1064
|
+
log(' ✅ 코딩 규칙 설치 완료 (.claude/vibe/rules/)\n');
|
|
1054
1065
|
// .claude/agents/ 복사
|
|
1055
1066
|
const agentsDir = path.join(claudeDir, 'agents');
|
|
1056
1067
|
ensureDir(agentsDir);
|
|
@@ -1097,17 +1108,17 @@ ${isNewProject ? `프로젝트 위치:
|
|
|
1097
1108
|
.claude/
|
|
1098
1109
|
├── commands/ # 슬래시 커맨드 (7개)
|
|
1099
1110
|
├── agents/ # 서브에이전트 (simplifier)
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
+
├── settings.json # Hooks 설정 (저장소 공유)
|
|
1112
|
+
└── vibe/
|
|
1113
|
+
├── config.json # 프로젝트 설정
|
|
1114
|
+
├── constitution.md # 프로젝트 원칙
|
|
1115
|
+
├── setup.sh # 협업자 설치 스크립트
|
|
1116
|
+
├── rules/ # 코딩 규칙
|
|
1117
|
+
│ ├── core/ # 핵심 원칙
|
|
1118
|
+
│ ├── quality/ # 품질 체크리스트
|
|
1119
|
+
│ └── languages/ # 언어별 규칙
|
|
1120
|
+
├── specs/ # SPEC 문서들
|
|
1121
|
+
└── features/ # BDD Feature 파일들
|
|
1111
1122
|
|
|
1112
1123
|
내장 도구: ✓ (35+)
|
|
1113
1124
|
협업자 자동 설치: ✓
|
|
@@ -1164,18 +1175,45 @@ async function checkAndUpgradeVibe() {
|
|
|
1164
1175
|
async function update() {
|
|
1165
1176
|
try {
|
|
1166
1177
|
const projectRoot = process.cwd();
|
|
1167
|
-
const vibeDir = path.join(projectRoot, '.vibe');
|
|
1178
|
+
const vibeDir = path.join(projectRoot, '.claude', 'vibe');
|
|
1168
1179
|
const claudeDir = path.join(projectRoot, '.claude');
|
|
1180
|
+
const legacyVibeDir = path.join(projectRoot, '.vibe');
|
|
1169
1181
|
// CI/프로덕션 환경에서는 스킵
|
|
1170
1182
|
if (process.env.NODE_ENV === 'production' || process.env.CI === 'true') {
|
|
1171
1183
|
return;
|
|
1172
1184
|
}
|
|
1173
|
-
|
|
1185
|
+
// 레거시 .vibe/ 폴더가 있으면 마이그레이션
|
|
1186
|
+
if (fs.existsSync(legacyVibeDir) && !fs.existsSync(vibeDir)) {
|
|
1187
|
+
log('🔄 .vibe/ → .claude/vibe/ 마이그레이션 중...\n');
|
|
1188
|
+
ensureDir(vibeDir);
|
|
1189
|
+
['specs', 'features', 'solutions', 'todos', 'memory', 'rules', 'config.json', 'constitution.md'].forEach(item => {
|
|
1190
|
+
const src = path.join(legacyVibeDir, item);
|
|
1191
|
+
const dst = path.join(vibeDir, item);
|
|
1192
|
+
if (fs.existsSync(src) && !fs.existsSync(dst)) {
|
|
1193
|
+
if (fs.statSync(src).isDirectory()) {
|
|
1194
|
+
copyDirRecursive(src, dst);
|
|
1195
|
+
}
|
|
1196
|
+
else {
|
|
1197
|
+
fs.copyFileSync(src, dst);
|
|
1198
|
+
}
|
|
1199
|
+
}
|
|
1200
|
+
});
|
|
1201
|
+
try {
|
|
1202
|
+
removeDirRecursive(legacyVibeDir);
|
|
1203
|
+
log(' ✅ 마이그레이션 완료\n');
|
|
1204
|
+
}
|
|
1205
|
+
catch (e) {
|
|
1206
|
+
log(' ⚠️ .vibe/ 폴더 수동 삭제 필요\n');
|
|
1207
|
+
}
|
|
1208
|
+
}
|
|
1209
|
+
if (!fs.existsSync(vibeDir) && !fs.existsSync(legacyVibeDir)) {
|
|
1174
1210
|
if (!options.silent) {
|
|
1175
1211
|
console.log('❌ vibe 프로젝트가 아닙니다. 먼저 vibe init을 실행하세요.');
|
|
1176
1212
|
}
|
|
1177
1213
|
return;
|
|
1178
1214
|
}
|
|
1215
|
+
// vibeDir이 없으면 생성
|
|
1216
|
+
ensureDir(vibeDir);
|
|
1179
1217
|
log('🔄 vibe 업데이트 중...\n');
|
|
1180
1218
|
// 최신 버전 확인
|
|
1181
1219
|
if (!options.silent) {
|
|
@@ -1183,11 +1221,11 @@ async function update() {
|
|
|
1183
1221
|
if (wasUpgraded)
|
|
1184
1222
|
return;
|
|
1185
1223
|
}
|
|
1186
|
-
// 마이그레이션: .agent/rules/ → .vibe/rules/
|
|
1224
|
+
// 마이그레이션: .agent/rules/ → .claude/vibe/rules/
|
|
1187
1225
|
const oldRulesDir = path.join(projectRoot, '.agent/rules');
|
|
1188
1226
|
const oldAgentDir = path.join(projectRoot, '.agent');
|
|
1189
1227
|
if (fs.existsSync(oldRulesDir)) {
|
|
1190
|
-
log(' 🔄 마이그레이션: .agent/rules/ → .vibe/rules/\n');
|
|
1228
|
+
log(' 🔄 마이그레이션: .agent/rules/ → .claude/vibe/rules/\n');
|
|
1191
1229
|
removeDirRecursive(oldRulesDir);
|
|
1192
1230
|
if (fs.existsSync(oldAgentDir) && fs.readdirSync(oldAgentDir).length === 0) {
|
|
1193
1231
|
fs.rmdirSync(oldAgentDir);
|
|
@@ -1283,8 +1321,8 @@ async function update() {
|
|
|
1283
1321
|
log(' ✅ CLAUDE.md 생성\n');
|
|
1284
1322
|
}
|
|
1285
1323
|
}
|
|
1286
|
-
// .vibe/rules/ 업데이트
|
|
1287
|
-
const rulesSource = path.join(__dirname, '../../.vibe/rules');
|
|
1324
|
+
// .claude/vibe/rules/ 업데이트
|
|
1325
|
+
const rulesSource = path.join(__dirname, '../../.claude/vibe/rules');
|
|
1288
1326
|
const rulesTarget = path.join(vibeDir, 'rules');
|
|
1289
1327
|
const coreDirs = ['core', 'quality', 'standards', 'tools'];
|
|
1290
1328
|
coreDirs.forEach(dir => {
|
|
@@ -1313,7 +1351,7 @@ async function update() {
|
|
|
1313
1351
|
if (detectedStacks.length > 0) {
|
|
1314
1352
|
log(` 🔍 감지된 기술 스택: ${detectedTypes.join(', ')}\n`);
|
|
1315
1353
|
}
|
|
1316
|
-
log(' ✅ 코딩 규칙 업데이트 완료 (.vibe/rules/)\n');
|
|
1354
|
+
log(' ✅ 코딩 규칙 업데이트 완료 (.claude/vibe/rules/)\n');
|
|
1317
1355
|
// .claude/agents/ 업데이트
|
|
1318
1356
|
const agentsDir = path.join(claudeDir, 'agents');
|
|
1319
1357
|
ensureDir(agentsDir);
|
|
@@ -1452,16 +1490,16 @@ async function update() {
|
|
|
1452
1490
|
catch (e) {
|
|
1453
1491
|
log(' ⚠️ MCP 등록 실패\n');
|
|
1454
1492
|
}
|
|
1455
|
-
// 기존
|
|
1493
|
+
// 기존 mcp/ 폴더 정리 (레거시)
|
|
1456
1494
|
const oldMcpDir = path.join(vibeDir, 'mcp');
|
|
1457
1495
|
if (fs.existsSync(oldMcpDir)) {
|
|
1458
|
-
log(' 🧹 기존
|
|
1496
|
+
log(' 🧹 기존 mcp/ 폴더 정리 중...\n');
|
|
1459
1497
|
try {
|
|
1460
1498
|
removeDirRecursive(oldMcpDir);
|
|
1461
|
-
log(' ✅
|
|
1499
|
+
log(' ✅ mcp/ 폴더 삭제 완료\n');
|
|
1462
1500
|
}
|
|
1463
1501
|
catch (e) {
|
|
1464
|
-
log(' ⚠️
|
|
1502
|
+
log(' ⚠️ mcp/ 폴더 수동 삭제 필요\n');
|
|
1465
1503
|
}
|
|
1466
1504
|
}
|
|
1467
1505
|
const packageJson = getPackageJson();
|
|
@@ -1470,7 +1508,7 @@ async function update() {
|
|
|
1470
1508
|
|
|
1471
1509
|
업데이트된 항목:
|
|
1472
1510
|
- 슬래시 커맨드 (7개)
|
|
1473
|
-
- 코딩 규칙 (.vibe/rules/)
|
|
1511
|
+
- 코딩 규칙 (.claude/vibe/rules/)
|
|
1474
1512
|
- 서브에이전트 (.claude/agents/)
|
|
1475
1513
|
- Hooks 설정
|
|
1476
1514
|
|
|
@@ -1484,9 +1522,10 @@ ${formatLLMStatus()}
|
|
|
1484
1522
|
}
|
|
1485
1523
|
function remove() {
|
|
1486
1524
|
const projectRoot = process.cwd();
|
|
1487
|
-
const vibeDir = path.join(projectRoot, '.vibe');
|
|
1525
|
+
const vibeDir = path.join(projectRoot, '.claude', 'vibe');
|
|
1526
|
+
const legacyVibeDir = path.join(projectRoot, '.vibe');
|
|
1488
1527
|
const claudeDir = path.join(projectRoot, '.claude');
|
|
1489
|
-
if (!fs.existsSync(vibeDir)) {
|
|
1528
|
+
if (!fs.existsSync(vibeDir) && !fs.existsSync(legacyVibeDir)) {
|
|
1490
1529
|
console.log('❌ vibe 프로젝트가 아닙니다.');
|
|
1491
1530
|
return;
|
|
1492
1531
|
}
|
|
@@ -1497,10 +1536,15 @@ function remove() {
|
|
|
1497
1536
|
unregisterMcp('vibe-gpt');
|
|
1498
1537
|
unregisterMcp('context7');
|
|
1499
1538
|
console.log(' ✅ MCP 서버 제거 완료\n');
|
|
1500
|
-
// .vibe 폴더 제거
|
|
1539
|
+
// .claude/vibe 폴더 제거
|
|
1501
1540
|
if (fs.existsSync(vibeDir)) {
|
|
1502
1541
|
removeDirRecursive(vibeDir);
|
|
1503
|
-
console.log(' ✅ .vibe/ 폴더 제거 완료\n');
|
|
1542
|
+
console.log(' ✅ .claude/vibe/ 폴더 제거 완료\n');
|
|
1543
|
+
}
|
|
1544
|
+
// 레거시 .vibe 폴더도 제거
|
|
1545
|
+
if (fs.existsSync(legacyVibeDir)) {
|
|
1546
|
+
removeDirRecursive(legacyVibeDir);
|
|
1547
|
+
console.log(' ✅ .vibe/ 폴더 제거 완료 (레거시)\n');
|
|
1504
1548
|
}
|
|
1505
1549
|
// .claude/commands 제거
|
|
1506
1550
|
const commandsDir = path.join(claudeDir, 'commands');
|
|
@@ -1544,7 +1588,7 @@ function remove() {
|
|
|
1544
1588
|
|
|
1545
1589
|
제거된 항목:
|
|
1546
1590
|
- MCP 서버 (vibe, context7)
|
|
1547
|
-
- .vibe/ 폴더
|
|
1591
|
+
- .claude/vibe/ 폴더
|
|
1548
1592
|
- 슬래시 커맨드 (7개)
|
|
1549
1593
|
- 서브에이전트 (5개)
|
|
1550
1594
|
- Hooks 설정
|
|
@@ -1568,7 +1612,7 @@ ${llmType === 'gpt' ? 'OpenAI API 키: https://platform.openai.com/api-keys' : '
|
|
|
1568
1612
|
return;
|
|
1569
1613
|
}
|
|
1570
1614
|
const projectRoot = process.cwd();
|
|
1571
|
-
const vibeDir = path.join(projectRoot, '.vibe');
|
|
1615
|
+
const vibeDir = path.join(projectRoot, '.claude', 'vibe');
|
|
1572
1616
|
const configPath = path.join(vibeDir, 'config.json');
|
|
1573
1617
|
if (!fs.existsSync(vibeDir)) {
|
|
1574
1618
|
console.log('❌ vibe 프로젝트가 아닙니다. 먼저 vibe init을 실행하세요.');
|
|
@@ -1615,7 +1659,7 @@ MCP: ${llmConfig.name}
|
|
|
1615
1659
|
}
|
|
1616
1660
|
function removeExternalLLM(llmType) {
|
|
1617
1661
|
const projectRoot = process.cwd();
|
|
1618
|
-
const vibeDir = path.join(projectRoot, '.vibe');
|
|
1662
|
+
const vibeDir = path.join(projectRoot, '.claude', 'vibe');
|
|
1619
1663
|
const configPath = path.join(vibeDir, 'config.json');
|
|
1620
1664
|
if (!fs.existsSync(vibeDir)) {
|
|
1621
1665
|
console.log('❌ vibe 프로젝트가 아닙니다.');
|
|
@@ -1670,7 +1714,7 @@ ChatGPT Plus 또는 Pro 구독이 있으면 Codex API를 사용할 수 있습니
|
|
|
1670
1714
|
`);
|
|
1671
1715
|
// config.json 업데이트
|
|
1672
1716
|
const projectRoot = process.cwd();
|
|
1673
|
-
const vibeDir = path.join(projectRoot, '.vibe');
|
|
1717
|
+
const vibeDir = path.join(projectRoot, '.claude', 'vibe');
|
|
1674
1718
|
const configPath = path.join(vibeDir, 'config.json');
|
|
1675
1719
|
if (fs.existsSync(configPath)) {
|
|
1676
1720
|
try {
|
|
@@ -1773,7 +1817,7 @@ ${activeAccount.email} 계정이 제거되었습니다.
|
|
|
1773
1817
|
`);
|
|
1774
1818
|
// config.json 업데이트
|
|
1775
1819
|
const projectRoot = process.cwd();
|
|
1776
|
-
const vibeDir = path.join(projectRoot, '.vibe');
|
|
1820
|
+
const vibeDir = path.join(projectRoot, '.claude', 'vibe');
|
|
1777
1821
|
const configPath = path.join(vibeDir, 'config.json');
|
|
1778
1822
|
if (fs.existsSync(configPath)) {
|
|
1779
1823
|
try {
|
|
@@ -1857,7 +1901,7 @@ Gemini Advanced 구독이 있으면 추가 비용 없이 사용할 수 있습니
|
|
|
1857
1901
|
`);
|
|
1858
1902
|
// config.json 업데이트
|
|
1859
1903
|
const projectRoot = process.cwd();
|
|
1860
|
-
const vibeDir = path.join(projectRoot, '.vibe');
|
|
1904
|
+
const vibeDir = path.join(projectRoot, '.claude', 'vibe');
|
|
1861
1905
|
const configPath = path.join(vibeDir, 'config.json');
|
|
1862
1906
|
if (fs.existsSync(configPath)) {
|
|
1863
1907
|
try {
|
|
@@ -1967,7 +2011,7 @@ ${activeAccount.email} 계정이 제거되었습니다.
|
|
|
1967
2011
|
`);
|
|
1968
2012
|
// config.json 업데이트
|
|
1969
2013
|
const projectRoot = process.cwd();
|
|
1970
|
-
const vibeDir = path.join(projectRoot, '.vibe');
|
|
2014
|
+
const vibeDir = path.join(projectRoot, '.claude', 'vibe');
|
|
1971
2015
|
const configPath = path.join(vibeDir, 'config.json');
|
|
1972
2016
|
if (fs.existsSync(configPath)) {
|
|
1973
2017
|
try {
|
|
@@ -2042,7 +2086,7 @@ Workflow:
|
|
|
2042
2086
|
}
|
|
2043
2087
|
function showStatus() {
|
|
2044
2088
|
const projectRoot = process.cwd();
|
|
2045
|
-
const vibeDir = path.join(projectRoot, '.vibe');
|
|
2089
|
+
const vibeDir = path.join(projectRoot, '.claude', 'vibe');
|
|
2046
2090
|
const configPath = path.join(vibeDir, 'config.json');
|
|
2047
2091
|
if (!fs.existsSync(vibeDir)) {
|
|
2048
2092
|
console.log('❌ vibe 프로젝트가 아닙니다. 먼저 vibe init을 실행하세요.');
|