@su-record/vibe 3.2.2 → 3.2.3
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/dist/__tests__/stakes-contract.test.d.ts +2 -0
- package/dist/__tests__/stakes-contract.test.d.ts.map +1 -0
- package/dist/__tests__/stakes-contract.test.js +110 -0
- package/dist/__tests__/stakes-contract.test.js.map +1 -0
- package/hooks/scripts/__tests__/.vibe/command-log.txt +3 -3
- package/package.json +1 -1
- package/skills/vibe/SKILL.md +14 -0
- package/skills/vibe.review/SKILL.md +8 -0
- package/skills/vibe.run/SKILL.md +4 -0
- package/skills/vibe.spec/SKILL.md +1 -0
- package/vibe/rules/loop-contract.md +18 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stakes-contract.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/stakes-contract.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
/**
|
|
5
|
+
* Stakes-proportional pipeline — 정적 계약 테스트 (SPEC: stakes-proportional-pipeline).
|
|
6
|
+
*
|
|
7
|
+
* 스킬 본문 규칙은 모델이 읽는 계약이므로, 규칙이 각 파일에 존재·유지되는지를
|
|
8
|
+
* 순수 fs 검사로 고정한다 (wiring-integrity 선례). D1–D5 게이트.
|
|
9
|
+
*/
|
|
10
|
+
const ROOT = path.resolve(__dirname, '..', '..');
|
|
11
|
+
function read(rel) {
|
|
12
|
+
return fs.readFileSync(path.join(ROOT, rel), 'utf-8');
|
|
13
|
+
}
|
|
14
|
+
describe('D2 — loop-contract.md: Stakes 매핑 SSOT', () => {
|
|
15
|
+
const doc = read('vibe/rules/loop-contract.md');
|
|
16
|
+
it('stakes 파라미터가 기본값 production 으로 정의된다', () => {
|
|
17
|
+
expect(doc).toMatch(/\|\s*`stakes`\s*\|\s*`production`\s*\|/);
|
|
18
|
+
});
|
|
19
|
+
it('Stakes 매핑 표에 demo/prototype/production 3단계가 있다', () => {
|
|
20
|
+
for (const level of ['`demo`', '`prototype`', '`production`']) {
|
|
21
|
+
expect(doc, `Stakes 표에 ${level} 행 누락`).toContain(level);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
it('demo/prototype 는 max_iterations 1 + 검증 스크립트 신규 생성 금지', () => {
|
|
25
|
+
expect(doc).toContain('신규 생성 금지');
|
|
26
|
+
expect(doc).toMatch(/`demo`[^\n]*\|\s*1\s*\|/);
|
|
27
|
+
});
|
|
28
|
+
it('불확실 시 상향(production) 원칙이 명시된다', () => {
|
|
29
|
+
expect(doc).toMatch(/불확실하면 항상 상향|불확실하면 상향/);
|
|
30
|
+
});
|
|
31
|
+
it('JUDGE 검증 산출물 절제: git diff --numstat 기반 P2 경고 (advisory)', () => {
|
|
32
|
+
expect(doc).toContain('JUDGE 검증 산출물 절제');
|
|
33
|
+
expect(doc).toContain('git diff --numstat');
|
|
34
|
+
expect(doc).toContain('P2');
|
|
35
|
+
expect(doc).toMatch(/게이트 통과 여부를 바꾸지 않는다/);
|
|
36
|
+
});
|
|
37
|
+
it('production 기본 동작 불변: max_iterations 기본 10 유지', () => {
|
|
38
|
+
expect(doc).toMatch(/\|\s*`max_iterations`\s*\|\s*10\s*\|/);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
describe('D1 — vibe 디스패처: stakes 분류 규칙', () => {
|
|
42
|
+
const doc = read('skills/vibe/SKILL.md');
|
|
43
|
+
it('Phase 1-b Stakes 분류 섹션이 존재한다', () => {
|
|
44
|
+
expect(doc).toContain('Phase 1-b: Stakes 분류');
|
|
45
|
+
});
|
|
46
|
+
it('경량 프로파일 매핑(--max-iter 1, 리뷰 1패스, 검증 스크립트 신규 생성 금지)이 명시된다', () => {
|
|
47
|
+
expect(doc).toContain('--max-iter 1');
|
|
48
|
+
expect(doc).toContain('리뷰 1패스');
|
|
49
|
+
expect(doc).toContain('검증 스크립트 신규 생성 금지');
|
|
50
|
+
});
|
|
51
|
+
it('SSOT 로 loop-contract.md 를 참조한다', () => {
|
|
52
|
+
expect(doc).toMatch(/loop-contract\.md[^\n]*Stakes|Stakes[^\n]*loop-contract\.md/);
|
|
53
|
+
});
|
|
54
|
+
it('불확실 시 상향 + SPEC 승인 편승 질문이 명시된다', () => {
|
|
55
|
+
expect(doc).toContain('불확실하면 상향');
|
|
56
|
+
expect(doc).toMatch(/SPEC 승인 메시지에 stakes 확인 질문/);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
describe('D3 — vibe.spec: 승인 게이트 stakes 편승 질문', () => {
|
|
60
|
+
const doc = read('skills/vibe.spec/SKILL.md');
|
|
61
|
+
it('Stakes 편승 질문 규칙이 승인 섹션에 존재한다', () => {
|
|
62
|
+
expect(doc).toContain('Stakes 편승 질문');
|
|
63
|
+
expect(doc).toMatch(/demo\/prototype\/production/);
|
|
64
|
+
});
|
|
65
|
+
it('별도 추가 왕복 금지가 명시된다', () => {
|
|
66
|
+
expect(doc).toMatch(/추가 확인 왕복을 만들지 않는다/);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
describe('D4 — vibe.run: stakes 프로파일 + JUDGE 절제 참조', () => {
|
|
70
|
+
const doc = read('skills/vibe.run/SKILL.md');
|
|
71
|
+
it('Stakes 프로파일 섹션이 loop-contract 를 SSOT 로 참조한다', () => {
|
|
72
|
+
expect(doc).toContain('Stakes 프로파일');
|
|
73
|
+
expect(doc).toMatch(/SSOT[^\n]*loop-contract\.md/);
|
|
74
|
+
});
|
|
75
|
+
it('demo/prototype 에서 검증 스크립트 신규 생성 금지가 명시된다', () => {
|
|
76
|
+
expect(doc).toContain('검증 스크립트 신규 생성 금지');
|
|
77
|
+
});
|
|
78
|
+
it('JUDGE 검증 산출물 절제(P2, git diff --numstat, advisory)가 명시된다', () => {
|
|
79
|
+
expect(doc).toContain('git diff --numstat');
|
|
80
|
+
expect(doc).toMatch(/P2 경고/);
|
|
81
|
+
expect(doc).toMatch(/advisory/);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
describe('D5 — vibe.review: 리뷰어 스케일링', () => {
|
|
85
|
+
const doc = read('skills/vibe.review/SKILL.md');
|
|
86
|
+
it('스케일링 표가 존재한다 (demo ≤5 → 2종)', () => {
|
|
87
|
+
expect(doc).toContain('리뷰어 스케일링');
|
|
88
|
+
expect(doc).toMatch(/demo[^\n]*≤5[^\n]*2종/);
|
|
89
|
+
});
|
|
90
|
+
it('production 행은 기존 Core Reviewers 전체를 유지한다', () => {
|
|
91
|
+
expect(doc).toMatch(/production[^\n]*Core Reviewers 전체/);
|
|
92
|
+
// 기존 기본 셋 불변 검증 — Core Reviewers 표의 focus 들이 그대로 존재
|
|
93
|
+
for (const focus of [
|
|
94
|
+
'security-reviewer',
|
|
95
|
+
'focus: correctness',
|
|
96
|
+
'focus: data-integrity',
|
|
97
|
+
'focus: performance',
|
|
98
|
+
'focus: architecture',
|
|
99
|
+
'focus: complexity',
|
|
100
|
+
'focus: git-history',
|
|
101
|
+
'focus: test-coverage',
|
|
102
|
+
]) {
|
|
103
|
+
expect(doc, `Core Reviewers 에서 ${focus} 가 사라짐 — production 불변 위반`).toContain(focus);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
it('SSOT 로 loop-contract.md 를 참조한다', () => {
|
|
107
|
+
expect(doc).toMatch(/loop-contract\.md[^\n]*Stakes/);
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
//# sourceMappingURL=stakes-contract.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stakes-contract.test.js","sourceRoot":"","sources":["../../src/__tests__/stakes-contract.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
[2026-07-
|
|
2
|
-
[2026-07-
|
|
3
|
-
[2026-07-
|
|
1
|
+
[2026-07-22T17:14:22.091Z] rm -rf /
|
|
2
|
+
[2026-07-22T17:14:22.167Z] ls -la
|
|
3
|
+
[2026-07-22T17:14:22.264Z] rm -rf src/infra/lib/evolution/
|
package/package.json
CHANGED
package/skills/vibe/SKILL.md
CHANGED
|
@@ -75,6 +75,19 @@ user-invocable: true
|
|
|
75
75
|
|
|
76
76
|
복수 의도면 우선순위: resume > figma-driven > new feature > 기타.
|
|
77
77
|
|
|
78
|
+
### Phase 1-b: Stakes 분류 (태스크 무게)
|
|
79
|
+
|
|
80
|
+
의도와 별개로 태스크의 **무게(stakes)** 를 분류한다 — 매핑 SSOT: `vibe/rules/loop-contract.md`의 Stakes 표.
|
|
81
|
+
|
|
82
|
+
| stakes | 판정 신호 | 적용 프로파일 |
|
|
83
|
+
|---|---|---|
|
|
84
|
+
| `demo` | 명시 키워드(데모·일회성·실험·테스트용·throwaway·토이), 기존 프로젝트 코드와 무관한 신규 폴더, `.vibe/config.json` 없는 임시 디렉토리 | `--max-iter 1` + 리뷰 1패스 + **검증 스크립트 신규 생성 금지** |
|
|
85
|
+
| `prototype` | 검증용 초기 버전 명시, 배포 대상 아님 | demo 와 동일 프로파일 |
|
|
86
|
+
| `production` | 기본값 — 신호 없음 | 기존 기본 동작 (수렴 루프, 기본 리뷰어 셋) |
|
|
87
|
+
|
|
88
|
+
- **불확실하면 상향한다** (production). 신호가 상충하면 SPEC 승인 메시지에 stakes 확인 질문 1개를 편승시킨다 — 별도 확인 왕복을 만들지 않는다.
|
|
89
|
+
- 판정 결과는 Phase 3 실행 계획에 `Stakes:` 줄로 명시하고 spec/run/review 체인에 전달한다.
|
|
90
|
+
|
|
78
91
|
> **⚠️ 위 표는 닫힌 화이트리스트가 아니라 "흔한 케이스 빠른 경로"다.** 표에 없는 요구사항이라도 막지 말고 **Catch-all 라우팅**(아래)으로 처리한다.
|
|
79
92
|
|
|
80
93
|
### Catch-all 라우팅 (표에 없는 의도)
|
|
@@ -125,6 +138,7 @@ user-invocable: true
|
|
|
125
138
|
Input: 자연어 ("패럴랙스 웹사이트 만들어줘")
|
|
126
139
|
Resume: 없음 (신규)
|
|
127
140
|
Keywords: 없음
|
|
141
|
+
Stakes: production (신호 없음 — 기본 상향)
|
|
128
142
|
|
|
129
143
|
Phase 1: /vibe.spec → 단일 패스 SPEC + 승인 (유일한 의무 게이트)
|
|
130
144
|
Phase 2: /vibe.figma → UI 디자인 트랙 (type=website 감지)
|
|
@@ -105,6 +105,14 @@ Detect project tech stack FIRST before launching reviewers.
|
|
|
105
105
|
|
|
106
106
|
### Phase 2: Parallel Agent Review (STACK-AWARE)
|
|
107
107
|
|
|
108
|
+
**리뷰어 스케일링 (stakes × 변경 파일 수)** — stakes 정의 SSOT: `vibe/rules/loop-contract.md` Stakes 표. 위임(서브에이전트)마다 컨텍스트 재주입 비용이 발생하므로, 리뷰어 수는 태스크 무게에 비례시킨다:
|
|
109
|
+
|
|
110
|
+
| stakes | 변경 파일 | 리뷰어 셋 |
|
|
111
|
+
|---|---|---|
|
|
112
|
+
| demo | ≤5 | correctness + security **2종만** |
|
|
113
|
+
| demo / prototype | >5 또는 prototype | correctness + security + data-integrity **3종** |
|
|
114
|
+
| production | 무관 | 아래 Core Reviewers 전체 (기존 기본 동작 — 불변) |
|
|
115
|
+
|
|
108
116
|
**Spawn the reviewers as concurrent native subagents in ONE message** — one `code-reviewer` instance per focus plus `security-reviewer`, each scoped to the changed files:
|
|
109
117
|
|
|
110
118
|
```
|
package/skills/vibe.run/SKILL.md
CHANGED
|
@@ -135,6 +135,10 @@ Scenario verification failed
|
|
|
135
135
|
- PASS → 다음 scenario
|
|
136
136
|
- stuck (같은 failure가 이전 라운드와 동일, `loop-ledger.js check-stuck`) → automationLevel confirm: 사용자 질문; autonomous: TODO + next scenario
|
|
137
137
|
|
|
138
|
+
**Stakes 프로파일 (SSOT: `vibe/rules/loop-contract.md` Stakes 표):**
|
|
139
|
+
- `demo`/`prototype` → max_iterations 1, 리뷰 1패스, **검증 스크립트 신규 생성 금지** — 검증은 기존 테스트 러너·브라우저 게이트만 사용한다. 새 verify_*.py / 검증 전용 스크립트 파일을 만들지 않는다.
|
|
140
|
+
- JUDGE 검증 산출물 절제 (모든 stakes): 이번 feature 신규 검증 코드 바이트 합이 신규 구현 코드 바이트 합을 초과하면 (`git diff --numstat` 기준) P2 경고를 run-ledger 에 기록한다. advisory — 게이트 통과 여부는 불변.
|
|
141
|
+
|
|
138
142
|
---
|
|
139
143
|
|
|
140
144
|
## **ULTRAWORK Mode** (ulw) — deprecated alias
|
|
@@ -181,6 +181,7 @@ SPEC 요약(Goal, Done Criteria, 시나리오 수, Out of Scope, 열린 Assumpti
|
|
|
181
181
|
- 수정 요청 → 반영 후 재제시 (사용자 주도 반복 — 자동 루프 아님).
|
|
182
182
|
- `automationLevel: autonomous` → 승인 생략, 요약만 출력하고 진행.
|
|
183
183
|
- 승인 후 SPEC 변경은 코드 변경과 같은 커밋으로 (SPEC-First — `vibe.run` 참조).
|
|
184
|
+
- **Stakes 편승 질문**: 디스패처의 stakes 판정(`vibe/rules/loop-contract.md` Stakes 표)이 불확실하거나 신호가 상충하면, 이 승인 메시지에 stakes 확인 질문 1개(demo/prototype/production 선택지)를 포함한다. 별도의 추가 확인 왕복을 만들지 않는다 — 승인 게이트가 유일한 질문 지점이다.
|
|
184
185
|
|
|
185
186
|
## Output
|
|
186
187
|
|
|
@@ -42,6 +42,24 @@
|
|
|
42
42
|
| `--interactive` | off | 단계별 확인 모드 (회전마다 사람 승인 — 과거의 기본값) |
|
|
43
43
|
| `--max-iter N` | — | 회전 상한 명시 (N=1이면 1회 시도) |
|
|
44
44
|
| `automationLevel` | `confirm` | `confirm`(SPEC·stuck에서 질문) / `autonomous`(기록 후 계속, 비대화형) — `.vibe/config.json` |
|
|
45
|
+
| `stakes` | `production` | 태스크 무게. `demo` / `prototype` / `production` — 아래 매핑이 SSOT |
|
|
46
|
+
|
|
47
|
+
## Stakes — 태스크 무게 비례 실행 (SSOT)
|
|
48
|
+
|
|
49
|
+
파이프라인 깊이는 태스크의 무게에 비례해야 한다. 분류는 `/vibe` 디스패처 Phase 1이 수행하고, 매핑 정의는 이 표가 유일하다. **판정이 불확실하면 항상 상향(production)한다.**
|
|
50
|
+
|
|
51
|
+
| stakes | 판정 신호 | max_iterations | 리뷰 | 검증 스크립트 |
|
|
52
|
+
|---|---|---|---|---|
|
|
53
|
+
| `demo` | 명시 키워드(데모·일회성·실험·테스트용·throwaway·토이) / 기존 프로젝트 코드와 무관한 신규 폴더 / `.vibe/config.json` 없는 임시 디렉토리 | 1 | 1패스 (리뷰어 스케일링 최소 셋) | **신규 생성 금지** — 기존 테스트 러너·브라우저 게이트만 사용 |
|
|
54
|
+
| `prototype` | 검증용 초기 버전 명시 / 유지보수 가능성 있으나 배포 대상 아님 | 1 | 1패스 (리뷰어 스케일링 축소 셋) | 신규 생성 금지 |
|
|
55
|
+
| `production` | 기본값 — 신호 없음·상충 포함 | 10 | 수렴 루프 (기본 리뷰어 셋) | 허용 |
|
|
56
|
+
|
|
57
|
+
- demo/prototype 판정 신호가 상충하면 SPEC 승인 메시지에 stakes 확인 질문 1개를 **편승**시킨다 (별도 왕복 금지) — `vibe.spec` 승인 게이트 참조.
|
|
58
|
+
- production 행은 기존 기본 동작과 동일하다 — 이 표의 도입으로 기본 동작은 변하지 않는다.
|
|
59
|
+
|
|
60
|
+
### JUDGE 검증 산출물 절제 (모든 stakes 공통)
|
|
61
|
+
|
|
62
|
+
JUDGE는 이번 feature의 **신규 생성 파일** 기준으로 검증 코드 총량(테스트·검증 스크립트)과 구현 코드 총량을 `git diff --numstat` 로 비교한다. 검증 코드 바이트 합 > 구현 코드 바이트 합이면 **P2 경고**를 run-ledger 에 기록한다 (restraint 원칙의 프로세스 적용). 경고는 advisory — 게이트 통과 여부를 바꾸지 않는다.
|
|
45
63
|
|
|
46
64
|
## 금지 (루프 권한 경계)
|
|
47
65
|
|