@su-record/vibe 3.2.13 → 3.2.14
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 +15 -14
- package/README.en.md +1 -1
- package/README.md +1 -1
- package/dist/__tests__/engines-contract.test.d.ts +2 -0
- package/dist/__tests__/engines-contract.test.d.ts.map +1 -0
- package/dist/__tests__/engines-contract.test.js +72 -0
- package/dist/__tests__/engines-contract.test.js.map +1 -0
- package/dist/__tests__/instruction-drift.test.d.ts +2 -0
- package/dist/__tests__/instruction-drift.test.d.ts.map +1 -0
- package/dist/__tests__/instruction-drift.test.js +116 -0
- package/dist/__tests__/instruction-drift.test.js.map +1 -0
- package/dist/__tests__/stakes-contract.test.js +7 -0
- package/dist/__tests__/stakes-contract.test.js.map +1 -1
- package/dist/__tests__/stuck-semantics.test.js +52 -0
- package/dist/__tests__/stuck-semantics.test.js.map +1 -1
- package/dist/cli/setup/ProjectSetup.d.ts +6 -0
- package/dist/cli/setup/ProjectSetup.d.ts.map +1 -1
- package/dist/cli/setup/ProjectSetup.js +19 -13
- package/dist/cli/setup/ProjectSetup.js.map +1 -1
- package/hooks/hooks.json +1 -1
- package/hooks/scripts/__tests__/.vibe/command-log.txt +3 -3
- package/hooks/scripts/__tests__/anchor-inbox.test.js +119 -0
- package/hooks/scripts/__tests__/code-check-false-positive.test.js +74 -0
- package/hooks/scripts/__tests__/fixtures/seq-harness.js +13 -0
- package/hooks/scripts/__tests__/fixtures/seq-step.js +22 -0
- package/hooks/scripts/__tests__/stop-dispatcher-sequential.test.js +74 -0
- package/hooks/scripts/code-check.js +60 -50
- package/hooks/scripts/lib/anchor.js +74 -0
- package/hooks/scripts/lib/console-allow.js +66 -0
- package/hooks/scripts/lib/dispatcher.js +28 -16
- package/hooks/scripts/lib/inbox.js +60 -0
- package/hooks/scripts/loop-ledger.js +24 -1
- package/hooks/scripts/post-edit-dispatcher.js +4 -3
- package/hooks/scripts/post-edit.js +2 -2
- package/package.json +5 -3
- package/skills/vibe/SKILL.md +2 -1
- package/skills/vibe.clone/references/verification-loops.md +6 -3
- package/skills/vibe.loop/SKILL.md +7 -4
- package/skills/vibe.review/SKILL.md +5 -1
- package/skills/vibe.run/references/e2e-and-autofix.md +1 -1
- package/skills/vibe.run/references/process-steps.md +1 -1
- package/vibe/constitution.md +1 -1
- package/vibe/rules/loop-contract.md +40 -3
- package/vibe/rules/quality/checklist.md +3 -3
- package/vibe/templates/constitution-template.md +1 -1
package/CLAUDE.md
CHANGED
|
@@ -7,12 +7,14 @@
|
|
|
7
7
|
> - `AGENTS.md` — **Codex** (100% supported)
|
|
8
8
|
>
|
|
9
9
|
> `AGENTS.md` is regenerated from this file via `/vibe.docs agent`. Edit here first.
|
|
10
|
+
> **Translation rule** (so this file never carries both syntaxes): `/vibe.*` → `$vibe.*`, and
|
|
11
|
+
> Codex has no top-level `/vibe.*` slash commands — entrypoints are skills, reachable via `/skills`.
|
|
10
12
|
|
|
11
13
|
## Hard Rules
|
|
12
14
|
|
|
13
15
|
### Behavior
|
|
14
16
|
- **Modify only requested scope** — Every changed line traces to the user's request
|
|
15
|
-
- **Edit existing files over creating new** — Fix at source
|
|
17
|
+
- **Edit existing files over creating new** — Fix at source. Creating files is correct when the user asks for a new feature, module, or scaffold — an explicit request overrides this default
|
|
16
18
|
- **Preserve existing style** — Match conventions even if you'd do it differently
|
|
17
19
|
- **Respect Ctrl+C / Escape** — Previous task CANCELLED
|
|
18
20
|
- **State assumptions, ask when uncertain** — Don't pick silently when ambiguity exists; push back if a simpler approach exists
|
|
@@ -88,11 +90,10 @@ Legacy: 기존 `.claude/vibe/` 는 런타임에 자동 인식되며 `vibe init`/
|
|
|
88
90
|
|
|
89
91
|
## Workflow
|
|
90
92
|
|
|
91
|
-
|
|
93
|
+
`/vibe` is the **single slash entry point**. Natural-language requirement (+ optional URL/image/PDF/file attachments) → vibe analyzes intent, confirms the SPEC once (the only mandatory human gate), then loops per `vibe/rules/loop-contract.md` until gates pass. `automationLevel: autonomous` skips the confirmation for non-interactive runs.
|
|
92
94
|
|
|
93
95
|
```
|
|
94
|
-
|
|
95
|
-
/vibe "<requirement>" [+ 📎 attachments] # Claude Code
|
|
96
|
+
/vibe "<requirement>" [+ 📎 attachments]
|
|
96
97
|
→ Intent classification (new feature / figma-driven / clone / resume / review / regress / contract / scaffold / docs / analyze / harness / test / continue / image)
|
|
97
98
|
→ Smart Resume detection (.vibe/{specs,features}/ — legacy interviews/plans 는 입력 컨텍스트로만 인식)
|
|
98
99
|
→ SPEC confirmation (1-time approval; skipped on automationLevel: autonomous)
|
|
@@ -100,20 +101,20 @@ $vibe "<requirement>" [+ 📎 attachments] # Codex
|
|
|
100
101
|
```
|
|
101
102
|
|
|
102
103
|
**Advanced (explicit phase) entrypoints** — still available for power users when you know exactly which phase to run:
|
|
103
|
-
-
|
|
104
|
-
-
|
|
105
|
-
-
|
|
106
|
-
-
|
|
107
|
-
-
|
|
108
|
-
-
|
|
109
|
-
-
|
|
110
|
-
-
|
|
111
|
-
-
|
|
104
|
+
- `/vibe.spec` — single-pass SPEC (인라인 질문 → SPEC 1패스 → 승인 1회; 구 interview/plan/spec-review 4단계는 폐지)
|
|
105
|
+
- `/vibe.figma` — Figma ↔ code (UI track)
|
|
106
|
+
- `/vibe.run` — SPEC-driven implementation
|
|
107
|
+
- `/vibe.verify` — implementation vs SPEC verification
|
|
108
|
+
- `/vibe.regress` — regression test auto-evolution. Auto-registers on verify failure; `generate` produces preventive tests; `cluster` promotes recurring patterns.
|
|
109
|
+
- `/vibe.contract` — API contract drift detection. Compares the contract extracted from the SPEC against the implementation; P1 drift auto-propagates to regress.
|
|
110
|
+
- `/vibe.trace` — Requirements Traceability Matrix
|
|
111
|
+
- `/vibe.loop` — loop engineering. Goal loops whose completion is judged by deterministic gates (run-ledger/tests), with stuck detection by discover-hash and a human triage inbox. Loops never push/release.
|
|
112
|
+
- `/vibe.test` — vibe self-test across the CC ↔ Codex harnesses. Subcommands: `parity` (static), `report` (runtime), `compare` (diff). P1 drift auto-propagates to regress. Recommended before every release.
|
|
112
113
|
|
|
113
114
|
| Task Size | Approach |
|
|
114
115
|
|---|---|
|
|
115
116
|
| 1–2 files | Plan Mode |
|
|
116
|
-
| 3+ files |
|
|
117
|
+
| 3+ files | `/vibe "<requirement>"` (or `/vibe.spec` to start at the SPEC phase) |
|
|
117
118
|
|
|
118
119
|
## Loop Contract (default execution model)
|
|
119
120
|
|
package/README.en.md
CHANGED
|
@@ -254,7 +254,7 @@ Full guides, skill reference, and configuration details are in the [Wiki](https:
|
|
|
254
254
|
|
|
255
255
|
## Requirements
|
|
256
256
|
|
|
257
|
-
- Node.js >=
|
|
257
|
+
- Node.js >= 20.12.0 (`better-sqlite3` needs Node 20+, `@clack/prompts` needs 20.12+)
|
|
258
258
|
- Claude Code or Codex CLI
|
|
259
259
|
- GPT, Antigravity (optional — second opinions only)
|
|
260
260
|
|
package/README.md
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engines-contract.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/engines-contract.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* engines.node 계약 테스트
|
|
3
|
+
*
|
|
4
|
+
* `package.json` 의 engines.node 는 프로덕션 의존성이 실제로 요구하는 최소 Node
|
|
5
|
+
* 버전보다 낮으면 안 된다. 낮으면 npm 이 "지원됨" 이라고 안내한 환경에서
|
|
6
|
+
* better-sqlite3 네이티브 빌드가 깨지거나 런타임에 실패한다.
|
|
7
|
+
*
|
|
8
|
+
* 배경: v3.2.13 까지 engines.node 가 ">=18.0.0" 이었으나 better-sqlite3 는 Node 20+,
|
|
9
|
+
* @clack/prompts 는 20.12+ 를 요구했다. 둘 다 optionalDependencies 가 아니라
|
|
10
|
+
* dependencies 이므로 Node 18 사용자에게 그대로 도달했다.
|
|
11
|
+
*/
|
|
12
|
+
import { describe, it, expect } from 'vitest';
|
|
13
|
+
import fs from 'fs';
|
|
14
|
+
import path from 'path';
|
|
15
|
+
import { fileURLToPath } from 'url';
|
|
16
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
17
|
+
const ROOT = path.resolve(__dirname, '..', '..');
|
|
18
|
+
function readJson(file) {
|
|
19
|
+
return JSON.parse(fs.readFileSync(file, 'utf-8'));
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* engines 범위 문자열에서 허용되는 최소 버전을 [major, minor] 로 뽑는다.
|
|
23
|
+
* `20.x || 22.x || 23.x` → [20, 0] · `>= 20.12.0` → [20, 12] · `18 || 20 || >=22` → [18, 0]
|
|
24
|
+
*/
|
|
25
|
+
function minSupported(range) {
|
|
26
|
+
// 버전 토큰은 통째로 잡는다 — `\d+(\.\d+)?` 로 자르면 "20.12.0" 이 ["20.12", "0"] 이 된다
|
|
27
|
+
const tokens = range.match(/\d+(?:\.\d+)*/g) ?? [];
|
|
28
|
+
const versions = tokens.map((t) => {
|
|
29
|
+
const [maj, min] = t.split('.');
|
|
30
|
+
return [Number(maj), Number(min ?? 0)];
|
|
31
|
+
});
|
|
32
|
+
if (versions.length === 0)
|
|
33
|
+
return [0, 0];
|
|
34
|
+
return versions.reduce((lo, v) => (v[0] !== lo[0] ? (v[0] < lo[0] ? v : lo) : v[1] < lo[1] ? v : lo));
|
|
35
|
+
}
|
|
36
|
+
function gte(a, b) {
|
|
37
|
+
return a[0] !== b[0] ? a[0] > b[0] : a[1] >= b[1];
|
|
38
|
+
}
|
|
39
|
+
const rootPkg = readJson(path.join(ROOT, 'package.json'));
|
|
40
|
+
const declared = minSupported(rootPkg.engines?.node ?? '');
|
|
41
|
+
describe('engines.node 계약', () => {
|
|
42
|
+
it('engines.node 가 선언돼 있다', () => {
|
|
43
|
+
expect(rootPkg.engines?.node).toBeTruthy();
|
|
44
|
+
});
|
|
45
|
+
it('모든 프로덕션 의존성의 최소 Node 요구를 만족한다', () => {
|
|
46
|
+
const deps = Object.keys(rootPkg.dependencies ?? {});
|
|
47
|
+
expect(deps.length).toBeGreaterThan(0);
|
|
48
|
+
const violations = [];
|
|
49
|
+
for (const dep of deps) {
|
|
50
|
+
const depPkgPath = path.join(ROOT, 'node_modules', dep, 'package.json');
|
|
51
|
+
if (!fs.existsSync(depPkgPath))
|
|
52
|
+
continue; // 미설치 환경에서는 건너뛴다
|
|
53
|
+
const depRange = readJson(depPkgPath).engines?.node;
|
|
54
|
+
if (!depRange)
|
|
55
|
+
continue;
|
|
56
|
+
const required = minSupported(depRange);
|
|
57
|
+
if (!gte(declared, required)) {
|
|
58
|
+
violations.push(`${dep} requires node "${depRange}" (min ${required.join('.')}) but package.json declares "${rootPkg.engines?.node}"`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
expect(violations).toEqual([]);
|
|
62
|
+
});
|
|
63
|
+
it('README 의 Node 요구사항이 package.json 과 일치한다', () => {
|
|
64
|
+
for (const readme of ['README.md', 'README.en.md']) {
|
|
65
|
+
const text = fs.readFileSync(path.join(ROOT, readme), 'utf-8');
|
|
66
|
+
const match = text.match(/Node\.js\s*>=\s*(\d+\.\d+\.\d+)/);
|
|
67
|
+
expect(match, `${readme} 에 "Node.js >= X.Y.Z" 요구사항 줄이 없다`).toBeTruthy();
|
|
68
|
+
expect(minSupported(match[1]), `${readme} 의 Node 요구사항이 package.json 과 다르다`).toEqual(declared);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
//# sourceMappingURL=engines-contract.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engines-contract.test.js","sourceRoot":"","sources":["../../src/__tests__/engines-contract.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instruction-drift.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/instruction-drift.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { adaptToCodex, buildGlobalSection } from '../cli/setup/ProjectSetup.js';
|
|
5
|
+
/**
|
|
6
|
+
* 지침 표면 드리프트 가드 — 감사 2026-07-27.
|
|
7
|
+
*
|
|
8
|
+
* 같은 규칙이 여러 파일에 적혀 있는 것 자체는 결함이 아니다. agent 프롬프트와
|
|
9
|
+
* skill reference 는 임의의 사용자 프로젝트로 배포되므로 자기완결적이어야 하고,
|
|
10
|
+
* 포인터로 바꾸면 dual-harness-doctrine 의 "암묵적 동작에 의존하지 않는다" 를
|
|
11
|
+
* 위반한다. 실제 위험은 **드리프트** — 한 곳만 고치면 나머지가 조용히 낡는다.
|
|
12
|
+
*
|
|
13
|
+
* 실제로 갈라져 있던 것:
|
|
14
|
+
* constitution.md "Functions ≤30 lines (recommended), ≤50 (allowed)" ← CLAUDE.md 는 ≤50
|
|
15
|
+
* ProjectSetup.ts 전역 Git include 가 repo CLAUDE.md 의 부분집합
|
|
16
|
+
* ProjectSetup.ts 3+ files 진입점이 `/vibe.spec`, 같은 파일 hard trigger 는 `/vibe`
|
|
17
|
+
*/
|
|
18
|
+
const ROOT = path.resolve(__dirname, '..', '..');
|
|
19
|
+
function read(rel) {
|
|
20
|
+
return fs.readFileSync(path.join(ROOT, rel), 'utf-8');
|
|
21
|
+
}
|
|
22
|
+
/** SSOT: CLAUDE.md "Complexity Limits" */
|
|
23
|
+
// 간격에서 `≤` 를 제외한다 — 포함하면 "Nesting ≤3 · Params ≤5" 에서 nesting 이 5 를 집는다
|
|
24
|
+
const LIMITS = [
|
|
25
|
+
{ name: '함수 길이', re: /functions?\b[^.\n|≤]{0,24}≤\s*(\d+)\s*lines/gi, value: 50 },
|
|
26
|
+
{ name: '중첩 깊이', re: /nesting\b[^.\n|≤]{0,24}≤\s*(\d+)/gi, value: 3 },
|
|
27
|
+
{ name: '파라미터 수', re: /params?(?:eters)?\b[^.\n|≤]{0,24}≤\s*(\d+)/gi, value: 5 },
|
|
28
|
+
{ name: '순환 복잡도', re: /cyclomatic\b[^.\n|≤]{0,24}≤\s*(\d+)/gi, value: 10 },
|
|
29
|
+
];
|
|
30
|
+
/** 복잡도 한계를 숫자로 다시 적는 문서 — 새로 적는 문서가 생기면 여기 등록한다 */
|
|
31
|
+
const DOCS_RESTATING_LIMITS = [
|
|
32
|
+
'CLAUDE.md',
|
|
33
|
+
'AGENTS.md',
|
|
34
|
+
'vibe/constitution.md',
|
|
35
|
+
'vibe/templates/claudemd-template.md',
|
|
36
|
+
'vibe/templates/constitution-template.md',
|
|
37
|
+
'vibe/rules/standards/complexity-metrics.md',
|
|
38
|
+
'vibe/rules/quality/checklist.md',
|
|
39
|
+
'agents/implementer.md',
|
|
40
|
+
'agents/code-reviewer.md',
|
|
41
|
+
'skills/vibe.run/references/race-review.md',
|
|
42
|
+
'skills/vibe.run/references/guidelines-and-tools.md',
|
|
43
|
+
'skills/vibe.capability-loop/agents/implementer.md',
|
|
44
|
+
];
|
|
45
|
+
describe('복잡도 한계가 모든 재기술 지점에서 같다', () => {
|
|
46
|
+
it.each(DOCS_RESTATING_LIMITS)('%s', (rel) => {
|
|
47
|
+
const doc = read(rel);
|
|
48
|
+
for (const limit of LIMITS) {
|
|
49
|
+
for (const [, n] of doc.matchAll(limit.re)) {
|
|
50
|
+
expect(Number(n), `${rel}: ${limit.name} 한계가 SSOT(CLAUDE.md)와 다르다`).toBe(limit.value);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
/**
|
|
56
|
+
* 전역 규약(`~/.claude/CLAUDE.md`)은 ProjectSetup.buildGlobalSection 이 생성한다.
|
|
57
|
+
* 설치본은 손댈 수 없으므로 생성기 소스와 repo CLAUDE.md 를 비교한다.
|
|
58
|
+
*/
|
|
59
|
+
describe('전역 규약 생성기가 repo CLAUDE.md 와 어긋나지 않는다', () => {
|
|
60
|
+
const GENERATOR = 'src/cli/setup/ProjectSetup.ts';
|
|
61
|
+
/** `.vibe/{a,b,c}` 중괄호 안 항목 집합 */
|
|
62
|
+
function vibeIncludeSet(text) {
|
|
63
|
+
const m = text.match(/Include\*{0,2}:\s*`\.vibe\/\{([^}]+)\}`/);
|
|
64
|
+
if (!m)
|
|
65
|
+
throw new Error('Include 목록을 찾지 못했다');
|
|
66
|
+
return new Set(m[1].split(',').map(s => s.trim()));
|
|
67
|
+
}
|
|
68
|
+
it('Git include 목록이 같다', () => {
|
|
69
|
+
expect(vibeIncludeSet(read(GENERATOR))).toEqual(vibeIncludeSet(read('CLAUDE.md')));
|
|
70
|
+
});
|
|
71
|
+
it('3+ files 진입점이 hard trigger 와 같은 `/vibe` 를 가리킨다', () => {
|
|
72
|
+
const table = buildGlobalSection('en');
|
|
73
|
+
const row = table.match(/\| 3\+ files \| ([^|]+)\|/);
|
|
74
|
+
expect(row?.[1], '표와 hard trigger 가 다른 진입점을 지시하면 같은 조건에 지시가 둘이 된다')
|
|
75
|
+
.toMatch(/`\/vibe`/);
|
|
76
|
+
expect(table).toContain('run `/vibe` FIRST');
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
/**
|
|
80
|
+
* Codex 전역 규약은 buildGlobalSection 출력을 변환해 만든다. 행별 정확 문자열
|
|
81
|
+
* 치환이던 시절, 생성기 문구를 고치면 변환이 조용히 누락됐다 — 결과물로 검증한다.
|
|
82
|
+
*/
|
|
83
|
+
describe('Codex 변환이 슬래시 커맨드를 남기지 않는다', () => {
|
|
84
|
+
const codex = adaptToCodex(buildGlobalSection('en'));
|
|
85
|
+
it('vibe 진입점이 모두 `$vibe` 형태다', () => {
|
|
86
|
+
// Codex 안내 문장 자체의 `/vibe.*` 표기(= 존재하지 않는다는 설명)만 예외
|
|
87
|
+
const leftovers = codex
|
|
88
|
+
.split('\n')
|
|
89
|
+
.filter(l => /\/vibe\b/.test(l) && !l.includes('not top-level'));
|
|
90
|
+
expect(leftovers, `변환되지 않은 줄:\n${leftovers.join('\n')}`).toEqual([]);
|
|
91
|
+
});
|
|
92
|
+
it('hard trigger 도 함께 변환된다', () => {
|
|
93
|
+
expect(codex).toContain('run `$vibe` FIRST');
|
|
94
|
+
});
|
|
95
|
+
it('Codex 는 commands/ 를 제외 목록에서 뺀다', () => {
|
|
96
|
+
expect(codex).toContain('`~/.codex/{rules,agents,skills}/`');
|
|
97
|
+
});
|
|
98
|
+
it('`.claude/` 경로가 남지 않는다', () => {
|
|
99
|
+
expect(codex).not.toMatch(/~\/\.claude\//);
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
/**
|
|
103
|
+
* console.log 탐지 범위 규칙은 lib/console-allow.js 하나만 둔다.
|
|
104
|
+
* code-check.js 와 post-edit.js 가 각자 들고 있던 시절, allow-list 없는 쪽이
|
|
105
|
+
* 있는 쪽의 예외 설계를 무력화해 `src/cli/**` 에서도 경고가 남았다.
|
|
106
|
+
*/
|
|
107
|
+
describe('console.log 허용 경로 규칙이 한 곳에만 있다', () => {
|
|
108
|
+
const HOOKS = ['hooks/scripts/code-check.js', 'hooks/scripts/post-edit.js'];
|
|
109
|
+
it.each(HOOKS)('%s 가 공용 모듈을 쓴다', (rel) => {
|
|
110
|
+
expect(read(rel)).toMatch(/from '\.{1,2}\/lib\/console-allow\.js'/);
|
|
111
|
+
});
|
|
112
|
+
it.each(HOOKS)('%s 가 허용 글로브를 자체 정의하지 않는다', (rel) => {
|
|
113
|
+
expect(read(rel), `${rel}: 허용 경로 목록이 다시 등장`).not.toMatch(/DEFAULT_CONSOLE_ALLOW_GLOBS/);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
//# sourceMappingURL=instruction-drift.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instruction-drift.test.js","sourceRoot":"","sources":["../../src/__tests__/instruction-drift.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,6 +34,13 @@ describe('D2 — loop-contract.md: Stakes 매핑 SSOT', () => {
|
|
|
34
34
|
expect(doc).toContain('P2');
|
|
35
35
|
expect(doc).toMatch(/게이트 통과 여부를 바꾸지 않는다/);
|
|
36
36
|
});
|
|
37
|
+
/**
|
|
38
|
+
* run-ledger 스키마에 경고 필드가 없다 — "run-ledger 에 기록한다" 는 갈 곳 없는 지시였다.
|
|
39
|
+
* 감사 2026-07-28(L4): 문서를 구현에 맞춰 보고용으로 내렸다.
|
|
40
|
+
*/
|
|
41
|
+
it('절제 경고를 run-ledger 에 적재한다고 주장하지 않는다', () => {
|
|
42
|
+
expect(doc).not.toMatch(/P2 경고[^\n]{0,20}run-ledger 에 기록/);
|
|
43
|
+
});
|
|
37
44
|
it('production 기본 동작 불변: max_iterations 기본 10 유지', () => {
|
|
38
45
|
expect(doc).toMatch(/\|\s*`max_iterations`\s*\|\s*10\s*\|/);
|
|
39
46
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stakes-contract.test.js","sourceRoot":"","sources":["../../src/__tests__/stakes-contract.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stakes-contract.test.js","sourceRoot":"","sources":["../../src/__tests__/stakes-contract.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,6 +29,13 @@ const DOCS_STATING_STUCK = [
|
|
|
29
29
|
'skills/vibe/SKILL.md',
|
|
30
30
|
'skills/vibe.run/references/automation-level.md',
|
|
31
31
|
'skills/vibe.run/references/coverage-loop.md',
|
|
32
|
+
// 감사 2026-07-27: 아래 둘이 목록에 없어서, 가드가 있는데도 "stuck → 완료 기록"
|
|
33
|
+
// 위반이 살아남았다. 커버리지 목록 자체가 드리프트의 통로였다.
|
|
34
|
+
'skills/vibe.run/references/process-steps.md',
|
|
35
|
+
'skills/vibe.clone/references/verification-loops.md',
|
|
36
|
+
// 감사 2026-07-28(L1): vibe.review 는 같은 상태를 "stuck" 이 아니라 "converged" 라
|
|
37
|
+
// 불러서 위 가드를 통째로 비켜갔다 — 단어가 아니라 의미로도 막는다 (아래 수렴 절).
|
|
38
|
+
'skills/vibe.review/SKILL.md',
|
|
32
39
|
];
|
|
33
40
|
describe('stuck 시맨틱 — SSOT', () => {
|
|
34
41
|
const ssot = read('vibe/rules/loop-contract.md');
|
|
@@ -66,6 +73,23 @@ describe('stuck 시맨틱 — 문서 간 정합', () => {
|
|
|
66
73
|
expect(doc, `${rel}: 미달 처리 규칙 없음`)
|
|
67
74
|
.toMatch(/완료로 기록하지 않는다|as complete|TODO|인박스/);
|
|
68
75
|
});
|
|
76
|
+
/**
|
|
77
|
+
* 위 검사는 "미달 처리 규칙을 언급하는가" 만 본다 — 언급하면서 동시에 완료로
|
|
78
|
+
* 기록하라고 적을 수 있다. 실제로 process-steps.md 는 "TODO + done", clone 의
|
|
79
|
+
* verification-loops.md 는 "record TODO ... and complete" 로 적혀 있었다.
|
|
80
|
+
* 위반 문구 자체를 금지한다.
|
|
81
|
+
*/
|
|
82
|
+
it.each(DOCS_STATING_STUCK)('%s 가 stuck 을 완료로 기록하라고 적지 않는다', (rel) => {
|
|
83
|
+
const doc = read(rel);
|
|
84
|
+
if (!/stuck/i.test(doc))
|
|
85
|
+
return;
|
|
86
|
+
for (const line of doc.split('\n')) {
|
|
87
|
+
if (!/stuck/i.test(line))
|
|
88
|
+
continue;
|
|
89
|
+
expect(line, `${rel}: stuck 을 완료로 기록하는 지시`)
|
|
90
|
+
.not.toMatch(/TODO \+ done|without prompting and complete\b/i);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
69
93
|
/**
|
|
70
94
|
* stuck 은 **발견 해시**로 판정한다. 커버리지 수치로 바꿔 적으면 판정이 달라진다 —
|
|
71
95
|
* 커버리지가 그대로여도 남은 항목이 바뀌었으면 진전이고, 반대로 커버리지가 올라도
|
|
@@ -84,6 +108,34 @@ describe('stuck 시맨틱 — 문서 간 정합', () => {
|
|
|
84
108
|
* 요약을 여러 곳에 두었더니 `quick` 의 "최소 JUDGE" 가 빠지고 `ralplan` 이
|
|
85
109
|
* 누락되는 식으로 어긋났다 — 부분 요약은 전체 사본보다 드리프트를 알아채기 어렵다.
|
|
86
110
|
*/
|
|
111
|
+
/**
|
|
112
|
+
* "발견이 안 바뀜" 은 수렴이 아니라 stuck 이다 — 남은 P1 이 0 일 때만 수렴이다.
|
|
113
|
+
* vibe.review 는 이 상태를 "converged → DONE" 이라 적어, stuck 단어를 쓰지 않는 것만으로
|
|
114
|
+
* 위 가드를 전부 비켜갔다 (감사 2026-07-28 L1). 부르는 이름과 무관하게 막는다.
|
|
115
|
+
*/
|
|
116
|
+
describe('발견 불변을 P1 조건 없이 완료로 부르지 않는다', () => {
|
|
117
|
+
const DOCS_STATING_CONVERGENCE = [
|
|
118
|
+
'skills/vibe.review/SKILL.md',
|
|
119
|
+
'vibe/rules/loop-contract.md',
|
|
120
|
+
'CLAUDE.md',
|
|
121
|
+
'AGENTS.md',
|
|
122
|
+
];
|
|
123
|
+
it.each(DOCS_STATING_CONVERGENCE)('%s', (rel) => {
|
|
124
|
+
for (const line of read(rel).split('\n')) {
|
|
125
|
+
const claimsDone = /→\s*(?:DONE|완료)|means DONE|= *converged/i.test(line);
|
|
126
|
+
if (!claimsDone)
|
|
127
|
+
continue;
|
|
128
|
+
if (!/unchanged|안 바뀌|동일|no new findings|새 발견/i.test(line))
|
|
129
|
+
continue;
|
|
130
|
+
expect(line, `${rel}: 발견 불변만으로 완료 선언 (P1=0 조건 없음)`)
|
|
131
|
+
.toMatch(/P1 *= *0|P1=0/);
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
it('vibe.review 가 P1 잔존 시 stuck 임을 명시한다', () => {
|
|
135
|
+
expect(read('skills/vibe.review/SKILL.md'))
|
|
136
|
+
.toMatch(/P1 *> *0[^\n]*(?:STUCK|stuck)/);
|
|
137
|
+
});
|
|
138
|
+
});
|
|
87
139
|
describe('deprecated 별칭 매핑 정합', () => {
|
|
88
140
|
const ssot = read('vibe/rules/loop-contract.md');
|
|
89
141
|
it('SSOT 에 별칭 5종이 모두 정의돼 있다', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stuck-semantics.test.js","sourceRoot":"","sources":["../../src/__tests__/stuck-semantics.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAEjD,SAAS,IAAI,CAAC,GAAW;IACvB,OAAO,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;AACxD,CAAC;AAED,iDAAiD;AACjD,MAAM,kBAAkB,GAAG;IACzB,6BAA6B;IAC7B,WAAW;IACX,WAAW;IACX,sBAAsB;IACtB,gDAAgD;IAChD,6CAA6C;
|
|
1
|
+
{"version":3,"file":"stuck-semantics.test.js","sourceRoot":"","sources":["../../src/__tests__/stuck-semantics.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ import { TechStack, StackDetails } from '../types.js';
|
|
|
6
6
|
* constitution.md 생성 또는 업데이트
|
|
7
7
|
*/
|
|
8
8
|
export declare function updateConstitution(coreDir: string, detectedStacks: TechStack[], stackDetails: StackDetails): void;
|
|
9
|
+
export declare function adaptToCodex(section: string): string;
|
|
9
10
|
/**
|
|
10
11
|
* 전역 ~/.claude/CLAUDE.md 생성/갱신 — vibe 규약(룰·키워드·워크플로) 전역 주입
|
|
11
12
|
*/
|
|
@@ -33,6 +34,11 @@ export declare function generateProjectAgentsMd(projectRoot: string, detectedSta
|
|
|
33
34
|
* @param createIfMissing false 시 존재하는 파일만 갱신
|
|
34
35
|
*/
|
|
35
36
|
export declare function generateProjectAntigravityMd(projectRoot: string, detectedStacks: TechStack[], stackDetails: StackDetails, createIfMissing?: boolean): void;
|
|
37
|
+
/**
|
|
38
|
+
* 전역 VIBE 규약 섹션 (프로젝트 독립) — ~/.claude/CLAUDE.md, ~/.codex/AGENTS.md
|
|
39
|
+
* export 이유: 하네스별 변환 결과를 테스트가 직접 검증한다 (instruction-drift.test.ts).
|
|
40
|
+
*/
|
|
41
|
+
export declare function buildGlobalSection(language: string): string;
|
|
36
42
|
/**
|
|
37
43
|
* 프로젝트 core 폴더 설정
|
|
38
44
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectSetup.d.ts","sourceRoot":"","sources":["../../../src/cli/setup/ProjectSetup.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,EAA8B,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAelF;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,SAAS,EAAE,EAC3B,YAAY,EAAE,YAAY,GACzB,IAAI,CA8CN;
|
|
1
|
+
{"version":3,"file":"ProjectSetup.d.ts","sourceRoot":"","sources":["../../../src/cli/setup/ProjectSetup.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,EAA8B,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAelF;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,SAAS,EAAE,EAC3B,YAAY,EAAE,YAAY,GACzB,IAAI,CA8CN;AAsED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD;AAGD;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAI7C;AAqBD;;GAEG;AACH,wBAAgB,2BAA2B,IAAI,IAAI,CAIlD;AAED;;GAEG;AACH,wBAAgB,2BAA2B,IAAI,IAAI,CAIlD;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,SAAS,EAAE,EAC3B,YAAY,EAAE,YAAY,EAC1B,eAAe,GAAE,OAAc,GAC9B,IAAI,CAON;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,SAAS,EAAE,EAC3B,YAAY,EAAE,YAAY,EAC1B,eAAe,GAAE,OAAc,GAC9B,IAAI,CAiBN;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,SAAS,EAAE,EAC3B,YAAY,EAAE,YAAY,EAC1B,eAAe,GAAE,OAAc,GAC9B,IAAI,CAQN;AA2ED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CA2E3D;AA2FD;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,EAAE,QAAQ,UAAQ,GAAG,IAAI,CAchG;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,GAAE,MAAkB,GAAG,IAAI,CAkC7F;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAiC1D;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,GAAE,MAAkB,GAAG,IAAI,CAyDzF;AA6CD;;GAEG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,SAAS,EAAE,EAC3B,YAAY,EAAE,YAAY,EAC1B,QAAQ,UAAQ,EAChB,UAAU,SAAY,GACrB,IAAI,CA8BN;AAaD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,GAAE,MAAM,EAAO,GAAG,IAAI,CAmF3F"}
|
|
@@ -89,18 +89,21 @@ function adaptSection(section, label, dirName, targetFile) {
|
|
|
89
89
|
.replace(/`CLAUDE\.md`/g, `\`${targetFile}\``)
|
|
90
90
|
.replace(new RegExp(`${dirName.replace('.', '\\.')}\\/CLAUDE\\.md`, 'g'), `${dirName}/${targetFile}`);
|
|
91
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* Codex 는 top-level `/vibe.*` 슬래시 커맨드가 없다 — 진입점은 skill 이다.
|
|
94
|
+
*
|
|
95
|
+
* 행마다 정확 문자열로 치환하면 buildGlobalSection 문구가 바뀔 때 조용히 어긋난다
|
|
96
|
+
* (감사 2026-07-27: `| 3+ files |` 행과 `Exclude:` 행이 실제로 그렇게 깨져 있었다).
|
|
97
|
+
* 변환은 규칙 하나로 하고, Codex 전용 안내만 따로 덧붙인다.
|
|
98
|
+
*/
|
|
92
99
|
function adaptCodexInvocation(section) {
|
|
93
100
|
return section
|
|
101
|
+
.replace(/\/vibe(\.[a-z-]+)?\b/g, (_match, sub) => `$vibe${sub ?? ''}`)
|
|
94
102
|
.replace('## Workflow\n\n| Task | Command |', '## Workflow\n\nCodex exposes Vibe as skills, not top-level `/vibe.*` slash commands. Invoke with `$vibe`, `$vibe.spec`, or `/skills`.\n\n| Task | Codex invocation |')
|
|
95
|
-
|
|
96
|
-
.replace('
|
|
97
|
-
.replace('| Analyze | `/vibe.analyze` (code, docs, web, Figma) |', '| Analyze | `$vibe.analyze` or `/skills` -> `vibe.analyze` |')
|
|
98
|
-
.replace('| Harness check | `/vibe.harness` |', '| Harness check | `$vibe.harness` or `/skills` -> `vibe.harness` |')
|
|
99
|
-
.replace('| Project structure | `/vibe.scaffold` |', '| Project structure | `$vibe.scaffold` or `/skills` -> `vibe.scaffold` |')
|
|
100
|
-
.replace('At 85%+ context: save_memory → /new → /vibe.continue (raised from 70% — /new discards KV prefix cache; compact less often to preserve cache reuse)', 'At 85%+ context: save_memory → /new → invoke `$vibe.continue` or choose `vibe.continue` from `/skills`. (raised from 70% — /new discards KV prefix cache; compact less often to preserve cache reuse)')
|
|
101
|
-
.replace('Exclude: `~/.codex/{rules,commands,agents,skills}/`, `.codex/settings.local.json`, `.vibe/{memories,checkpoints,metrics}/`', 'Exclude: `~/.codex/{rules,agents,skills}/`, `.codex/settings.local.json`, `.vibe/{memories,checkpoints,metrics}/`');
|
|
103
|
+
// 접두만 매칭 — 뒤쪽 항목이 늘어도 깨지지 않는다 (Codex 는 commands/ 를 쓰지 않는다)
|
|
104
|
+
.replace('Exclude: `~/.codex/{rules,commands,agents,skills}/`', 'Exclude: `~/.codex/{rules,agents,skills}/`');
|
|
102
105
|
}
|
|
103
|
-
function adaptToCodex(section) {
|
|
106
|
+
export function adaptToCodex(section) {
|
|
104
107
|
return adaptCodexInvocation(adaptSection(section, 'Codex', '.codex', 'AGENTS.md'));
|
|
105
108
|
}
|
|
106
109
|
const adaptToAntigravity = (section) => adaptSection(section, 'Antigravity', '.gemini', 'GEMINI.md');
|
|
@@ -258,8 +261,11 @@ function analyzeProjectStructure(projectRoot) {
|
|
|
258
261
|
packageManager,
|
|
259
262
|
};
|
|
260
263
|
}
|
|
261
|
-
/**
|
|
262
|
-
|
|
264
|
+
/**
|
|
265
|
+
* 전역 VIBE 규약 섹션 (프로젝트 독립) — ~/.claude/CLAUDE.md, ~/.codex/AGENTS.md
|
|
266
|
+
* export 이유: 하네스별 변환 결과를 테스트가 직접 검증한다 (instruction-drift.test.ts).
|
|
267
|
+
*/
|
|
268
|
+
export function buildGlobalSection(language) {
|
|
263
269
|
const lines = [];
|
|
264
270
|
lines.push('# VIBE');
|
|
265
271
|
lines.push('');
|
|
@@ -299,7 +305,7 @@ function buildGlobalSection(language) {
|
|
|
299
305
|
lines.push('| Task | Command |');
|
|
300
306
|
lines.push('|------|---------|');
|
|
301
307
|
lines.push('| 1-2 files | Plan Mode |');
|
|
302
|
-
lines.push('| 3+ files | `/vibe.spec` |');
|
|
308
|
+
lines.push('| 3+ files | `/vibe` (or `/vibe.spec` to start at the SPEC phase) |');
|
|
303
309
|
lines.push('| Analyze | `/vibe.analyze` (code, docs, web, Figma) |');
|
|
304
310
|
lines.push('| Harness check | `/vibe.harness` |');
|
|
305
311
|
lines.push('| Project structure | `/vibe.scaffold` |');
|
|
@@ -320,8 +326,8 @@ function buildGlobalSection(language) {
|
|
|
320
326
|
lines.push('');
|
|
321
327
|
lines.push('## Git');
|
|
322
328
|
lines.push('');
|
|
323
|
-
lines.push('Include: `.vibe/{plans,specs,features,todos,config.json,constitution.md}`, `CLAUDE.md`');
|
|
324
|
-
lines.push('Exclude: `~/.claude/{rules,commands,agents,skills}/`, `.claude/settings.local.json`, `.vibe/{memories,checkpoints,metrics}/`');
|
|
329
|
+
lines.push('Include: `.vibe/{plans,specs,features,todos,research,regressions,contracts,recipes,anti-patterns,loops,config.json,constitution.md}`, `CLAUDE.md`');
|
|
330
|
+
lines.push('Exclude: `~/.claude/{rules,commands,agents,skills}/`, `.claude/settings.local.json`, `.codex/hooks.json`, `.vibe/{memories,checkpoints,metrics}/`');
|
|
325
331
|
return lines.join('\n');
|
|
326
332
|
}
|
|
327
333
|
/** 프로젝트별 VIBE 섹션 (스택·구조·커맨드) — 프로젝트 루트 CLAUDE.md/AGENTS.md */
|