@su-record/vibe 3.2.25 → 3.2.26
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/.codex-plugin/plugin.json +34 -0
- package/CLAUDE.md +1 -1
- package/README.en.md +41 -11
- package/README.md +68 -13
- package/dist/cli/setup/CodexHooks.d.ts +1 -0
- package/dist/cli/setup/CodexHooks.d.ts.map +1 -1
- package/dist/cli/setup/CodexHooks.js +1 -0
- package/dist/cli/setup/CodexHooks.js.map +1 -1
- package/hooks/plugin-hooks.json +123 -0
- package/hooks/scripts/codex-hook-adapter.js +24 -0
- package/package.json +5 -2
- package/skills/vibe.harness/SKILL.md +1 -41
- package/skills/vibe.harness/references/report-template.md +46 -0
- package/vibe/rules/principles/dual-harness-doctrine.md +13 -6
- package/vibe/templates/loop-template.md +13 -7
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "vibe",
|
|
3
|
+
"version": "3.2.26",
|
|
4
|
+
"description": "Verification harness for AI coding agents — \"done\" is decided by deterministic gates (test exit codes, run-ledger, regression memory), not the model self-report.",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "su-record",
|
|
7
|
+
"url": "https://github.com/su-record"
|
|
8
|
+
},
|
|
9
|
+
"homepage": "https://github.com/su-record/vibe",
|
|
10
|
+
"repository": "https://github.com/su-record/vibe",
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"verification",
|
|
14
|
+
"spec",
|
|
15
|
+
"testing",
|
|
16
|
+
"code-review",
|
|
17
|
+
"loop",
|
|
18
|
+
"harness"
|
|
19
|
+
],
|
|
20
|
+
"skills": "./skills/",
|
|
21
|
+
"hooks": "./hooks/plugin-hooks.json",
|
|
22
|
+
"interface": {
|
|
23
|
+
"displayName": "Vibe",
|
|
24
|
+
"shortDescription": "Deterministic gates for AI coding — nothing unverified ships",
|
|
25
|
+
"longDescription": "Natural-language requirement to a SPEC you approve once, then an ANCHOR→ACT→JUDGE→RECORD loop that runs until deterministic gates pass. Completion is judged by test exit codes and a run-ledger, never by self-report.",
|
|
26
|
+
"developerName": "su-record",
|
|
27
|
+
"category": "Developer Tools",
|
|
28
|
+
"websiteURL": "https://github.com/su-record/vibe",
|
|
29
|
+
"defaultPrompt": [
|
|
30
|
+
"Use Vibe to turn this requirement into an approved SPEC and implement it.",
|
|
31
|
+
"Use Vibe to review my changes until there are zero P1 findings."
|
|
32
|
+
]
|
|
33
|
+
}
|
|
34
|
+
}
|
package/CLAUDE.md
CHANGED
|
@@ -80,7 +80,7 @@ Loop semantics SSOT: `vibe/rules/loop-contract.md` (ANCHOR→ACT→JUDGE→RECOR
|
|
|
80
80
|
Legacy: 기존 `.claude/vibe/` 는 런타임에 자동 인식되며 `vibe init`/`update` 시 `.vibe/` 로 이동한다.
|
|
81
81
|
|
|
82
82
|
### Dual-Harness Doctrine
|
|
83
|
-
하네스 차이는 경로가 아니라 **인지 방식**(CC=추론 / Codex=직역)에 있다. 원칙: **암묵적 동작에 의존하지 않는다 — 추론은 `/vibe` 디스패처가 앞단에서, skill 본문은 전부 명시적으로.** ("명시성 공통분모 + 추론 앞단"). Hook은 의도별 매핑: 라이프사이클(turn 완료) → Codex `config.toml notify`, 나머지(SessionStart·UserPromptSubmit·Pre/PostToolUse) → Codex 네이티브 hook(`.codex/hooks.json` + `codex-hook-adapter.js`). AGENTS.md soft-hook 은 폐기하지 않고 **훅 미설치 환경의 2차 방어선**으로 유지(직역이라 신뢰성↑). 전문: `vibe/rules/principles/dual-harness-doctrine.md`.
|
|
83
|
+
하네스 차이는 경로가 아니라 **인지 방식**(CC=추론 / Codex=직역)에 있다. 원칙: **암묵적 동작에 의존하지 않는다 — 추론은 `/vibe` 디스패처가 앞단에서, skill 본문은 전부 명시적으로.** ("명시성 공통분모 + 추론 앞단"). Hook은 의도별 매핑: 라이프사이클(turn 완료) → Codex `config.toml notify`, 나머지(SessionStart·UserPromptSubmit·Pre/PostToolUse·Pre/PostCompact) → Codex 네이티브 hook(`.codex/hooks.json` + `codex-hook-adapter.js`). **`PostCompact` 는 압축 직후 `loop-ledger.js anchor` 로 재고정한다** — ANCHOR 가 컨텍스트 소실에 대비하는 장치인데 정작 압축 시점에 자동 실행이 없었다. AGENTS.md soft-hook 은 폐기하지 않고 **훅 미설치 환경의 2차 방어선**으로 유지(직역이라 신뢰성↑). 전문: `vibe/rules/principles/dual-harness-doctrine.md`.
|
|
84
84
|
|
|
85
85
|
### Gotchas
|
|
86
86
|
- `better-sqlite3` WAL mode — synchronous API
|
package/README.en.md
CHANGED
|
@@ -59,7 +59,7 @@ One entry point. Single-pass SPEC → one approval → loop until the gates pass
|
|
|
59
59
|
|
|
60
60
|
**Loop-default** — After SPEC approval, vibe loops (ANCHOR→ACT→JUDGE→RECORD) until gates pass, with deterministic stuck/iteration guards. `--interactive` for step-by-step confirmation; `--max-iter N` to cap iterations; `automationLevel: autonomous` (`.vibe/config.json`) runs non-interactively to completion.
|
|
61
61
|
|
|
62
|
-
**Loop engineering** — `/vibe.loop` designs and installs autonomous goal loops (triage → run/verify pipelines). Completion is judged by deterministic gates (run-ledger/tests), not self-report
|
|
62
|
+
**Loop engineering** — `/vibe.loop` designs and installs autonomous goal loops (triage → run/verify pipelines). Completion is judged by deterministic gates (run-ledger/tests), not self-report — and so is runaway protection: iterations are counted in code, tracking **total rounds** and **verified rounds** separately so a thrashing loop is distinguishable from a genuinely large one. Results land in a human triage inbox — loops never push or release.
|
|
63
63
|
|
|
64
64
|
---
|
|
65
65
|
|
|
@@ -181,6 +181,8 @@ Detection at edit time, blocking at deterministic gates:
|
|
|
181
181
|
|-------|--------------|
|
|
182
182
|
| Edit hooks (Edit/Write) | **Detects** only low-false-positive hard rules — `any`/`@ts-ignore`, `console.log` → injects findings to the model (additionalContext). No length/nesting heuristics — the model judges those better in context |
|
|
183
183
|
| Deterministic gates | **PR test gate** (runs the actual test suite before PR creation, incl. `gh pr create`) · **auto-commit verify gate** (refuses commits until verify passes) · **Stop hook** verify-skip warn/block · **scope-guard** (opt-in; monitors edits outside SPEC scope) · **sentinel** (blocks destructive commands and harness self-modification) |
|
|
184
|
+
| Node gates | Gates are not only at the end of the pipeline — the **SPEC Code Guard** checks downstream requirements (REQ IDs, Stakes, Done Criteria, unfilled placeholders) **before** approval and sends failures back to SPEC authoring (backward edge) |
|
|
185
|
+
| Human gates | **Gate objects** — a pending question is written to disk (`.vibe/gates/`) so it survives a dead session. **Cost gate** — approval is requested only before irreversible spend (paid generation) or unusually large agent fan-out; normal scale passes through |
|
|
184
186
|
| Review + convergence loop | Parallel `code-reviewer` instances — one per focus (correctness / architecture / performance / data-integrity / …) — plus `security-reviewer`. Loops until P1 = 0, with convergence decided by discover-hash: two identical rounds = stuck, ask the user. Never silently proceeds. |
|
|
185
187
|
|
|
186
188
|
---
|
|
@@ -217,29 +219,57 @@ Skills teach only what the model doesn't know (domain gotchas, current APIs, pro
|
|
|
217
219
|
|-----|--------|
|
|
218
220
|
| [Claude Code](https://claude.ai/code) | Full support |
|
|
219
221
|
| [Codex](https://github.com/openai/codex) | Full support (`~/.codex/`, AGENTS.md, native hooks.json, config.toml notify, codex exec agent fallback) |
|
|
220
|
-
| [Cursor](https://cursor.sh) | Agents + Rules |
|
|
221
222
|
| Antigravity CLI (`agy`) | Agents + Skills |
|
|
222
223
|
|
|
223
224
|
---
|
|
224
225
|
|
|
225
226
|
## Commands
|
|
226
227
|
|
|
228
|
+
Start with `/vibe` and it routes the rest. Below is the list for when you want to call a specific phase directly.
|
|
229
|
+
|
|
230
|
+
**Core flow**
|
|
231
|
+
|
|
227
232
|
| Command | Purpose |
|
|
228
233
|
|---------|---------|
|
|
229
|
-
| `/vibe` | Main entry point — natural language requirement → single-pass SPEC → one approval → loop until gates pass |
|
|
230
|
-
| `/vibe.spec` |
|
|
234
|
+
| `/vibe` | **Main entry point** — natural language requirement → single-pass SPEC → one approval → loop until gates pass |
|
|
235
|
+
| `/vibe.spec` | Explicit single-pass SPEC (inline questions → SPEC + BDD → approval) |
|
|
231
236
|
| `/vibe.run` | Implement from SPEC |
|
|
232
|
-
| `/vibe.figma` | Figma ↔ Code (read or write, 3 modes) |
|
|
233
|
-
| `/vibe.design` | DESIGN.md visual quality SSOT — init / lint / verify / sync / preview |
|
|
234
237
|
| `/vibe.verify` | Verify implementation against SPEC Done criteria — result recorded in the run ledger |
|
|
238
|
+
| `/vibe.continue` | Session restore — pick up after `save_memory` → `/new` at 85%+ context |
|
|
239
|
+
|
|
240
|
+
**Verification & quality**
|
|
241
|
+
|
|
242
|
+
| Command | Purpose |
|
|
243
|
+
|---------|---------|
|
|
244
|
+
| `/vibe.review` | Parallel review by focus (correctness / security / performance …) — converges to P1 = 0 |
|
|
235
245
|
| `/vibe.regress` | Regression test auto-evolution — auto-registers on verify failure, promotes recurring patterns |
|
|
246
|
+
| `/vibe.contract` | SPEC API contract ↔ implementation drift detection — P1 drift propagates to regress |
|
|
236
247
|
| `/vibe.trace` | Requirements traceability matrix |
|
|
248
|
+
| `/vibe.loop` | Design and install autonomous goal loops — completion judged by deterministic gates |
|
|
249
|
+
| `/vibe.test` | vibe self-test (CC ↔ Codex parity) — recommended before every release |
|
|
250
|
+
| `/vibe.harness` | Diagnose Harness Engineering maturity (6-axis, N/100) |
|
|
251
|
+
|
|
252
|
+
**Design & UI**
|
|
253
|
+
|
|
254
|
+
| Command | Purpose |
|
|
255
|
+
|---------|---------|
|
|
256
|
+
| `/vibe.figma` | Figma ↔ Code (read or write, 3 modes) |
|
|
257
|
+
| `/vibe.design` | DESIGN.md visual quality SSOT — init / lint / verify / sync / preview |
|
|
258
|
+
| `/vibe.clone` | Reference site URL → reproduce markup in your stack (pixel verification loop) |
|
|
259
|
+
| `/vibe.image` | Image generation (Antigravity) — icons, banners, mockups |
|
|
260
|
+
|
|
261
|
+
**Analysis, docs & ops**
|
|
262
|
+
|
|
263
|
+
| Command | Purpose |
|
|
264
|
+
|---------|---------|
|
|
237
265
|
| `/vibe.analyze` | Analyze any target — code, documents, websites, Figma |
|
|
266
|
+
| `/vibe.reason` | Structure hypotheses, evidence and trade-offs for hard problems |
|
|
267
|
+
| `/vibe.docs` | Keep README, guides, architecture, release notes and diagrams in sync with the code |
|
|
238
268
|
| `/vibe.scaffold` | Generate or audit project folder structure |
|
|
239
|
-
| `/vibe.
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
269
|
+
| `/vibe.llm` | Refresh the available model list per provider |
|
|
270
|
+
|
|
271
|
+
> These are the common ones. The full installed skill list lives in [SKILL-CATALOG.md](SKILL-CATALOG.md),
|
|
272
|
+
> and requirements not in the table are handled by `/vibe`'s description-based catch-all routing.
|
|
243
273
|
|
|
244
274
|
---
|
|
245
275
|
|
|
@@ -248,7 +278,7 @@ Skills teach only what the model doesn't know (domain gotchas, current APIs, pro
|
|
|
248
278
|
Full guides, skill reference, and configuration details are in the [Wiki](https://github.com/su-record/vibe/wiki).
|
|
249
279
|
|
|
250
280
|
- [README (Korean)](README.md)
|
|
251
|
-
- [Release Notes](
|
|
281
|
+
- [Release Notes](https://github.com/su-record/vibe/releases) — generated deterministically by CI from SPECs and commits on each tag
|
|
252
282
|
|
|
253
283
|
---
|
|
254
284
|
|
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
[](https://nodejs.org/)
|
|
8
8
|
[](LICENSE)
|
|
9
9
|
|
|
10
|
-
**English** — Vibe is a **verification harness** for AI coding agents. It wraps Claude Code, Codex,
|
|
10
|
+
**English** — Vibe is a **verification harness** for AI coding agents. It wraps Claude Code, Codex, and Antigravity CLI so that "done" is decided by deterministic gates — test exit codes, run-ledgers, regression memory — instead of the model's self-report. Models already plan and implement well; what's missing is a reason to trust "it's done." Vibe supplies that ground truth: vibe-code fast, but nothing unverified ships. Install with `npm install -g @su-record/vibe && vibe init`, then throw a natural-language requirement at `/vibe` — one SPEC approval, then an autonomous ANCHOR→ACT→JUDGE→RECORD loop until the gates pass. *(Full docs below are in Korean; the CLI works in any language.)*
|
|
11
11
|
|
|
12
12
|
Vibe는 AI 코딩을 위한 **검증 하네스(verification harness)** 입니다. 출처가 있는 컨텍스트로 SPEC을 고정하고, **완료 판정을 모델의 자기 보고가 아니라 결정론적 게이트(테스트 exit code, run-ledger, 회귀 기억)에 맡긴 뒤 실행별 Evidence Bundle을 남깁니다.** Model Judge는 발견만 제안하고, Human Taste는 release에서만 판단합니다. 빠르게 바이브 코딩하되, 검증 안 된 코드가 나가지 않게.
|
|
13
13
|
|
|
@@ -153,6 +153,8 @@ codex
|
|
|
153
153
|
|------|------|
|
|
154
154
|
| 편집 훅 (Edit/Write) | 오탐률 낮은 하드룰만 **탐지** — `any`/`@ts-ignore`, `console.log` → 모델에 즉시 주입(additionalContext). 함수 길이·중첩 같은 휴리스틱은 없음 — 모델이 컨텍스트 안에서 더 정확히 판단 |
|
|
155
155
|
| 결정론 게이트 | **PR 테스트 게이트**(PR 생성 전 테스트 스위트 직접 실행, `gh pr create` 포함) · **auto-commit verify 게이트**(verify 통과 전 커밋 거부) · **Stop 훅** verify-skip 경고/차단 · **scope-guard**(opt-in, SPEC 범위 밖 편집 감시) · **sentinel**(파괴적 명령·하네스 자기 수정 차단) |
|
|
156
|
+
| 노드 게이트 | 게이트를 파이프라인 끝에만 두지 않음 — **SPEC Code Guard**가 승인 **전에** 하류 요구사항(REQ-ID·Stakes·Done Criteria·미치환 placeholder)을 검사하고, 실패하면 SPEC 작성으로 되돌림(backward edge) |
|
|
157
|
+
| 사람 게이트 | **게이트 객체** — 대기 중인 질문을 디스크(`.vibe/gates/`)에 남겨 세션이 끊겨도 무엇을 묻는지 살아남음. **비용 게이트** — 되돌릴 수 없는 지출(유료 생성)과 이상 규모 팬아웃 직전에만 승인 요청(평상시 규모는 통과) |
|
|
156
158
|
| 리뷰 + 수렴 루프 | `code-reviewer`를 관점(focus)별 병렬 인스턴스로 실행(correctness/architecture/performance/data-integrity/…) + `security-reviewer`. P1=0까지 루프하되 수렴은 discover-hash가 판정 — 2라운드 동일 findings면 stuck으로 확정하고 사람에게 질문. 절대 조용히 넘어가지 않음 |
|
|
157
159
|
|
|
158
160
|
---
|
|
@@ -179,7 +181,28 @@ codex
|
|
|
179
181
|
|
|
180
182
|
**Smart Resume** — `.last-feature` 포인터가 마지막 작업을 추적. 인자 없이 `/vibe`를 호출하면 중단된 위치를 보여주거나 진행 중 feature 목록을 제시.
|
|
181
183
|
|
|
182
|
-
**루프 엔지니어링** — `/vibe.loop`로 자율 목표 루프를 설계·설치(트리아지 → run/verify 파이프라인). 완료 판정은 자기 보고가 아니라 결정론 게이트(run-ledger/테스트)가 내리고, 결과는 사람 리뷰 인박스로 — 루프는 push/release를 하지 않습니다.
|
|
184
|
+
**루프 엔지니어링** — `/vibe.loop`로 자율 목표 루프를 설계·설치(트리아지 → run/verify 파이프라인). 완료 판정은 자기 보고가 아니라 결정론 게이트(run-ledger/테스트)가 내리고, 폭주 방어도 마찬가지 — 회전 수를 코드가 세고 **전체 회전**과 **검증을 통과한 회전**을 따로 집계해 헛도는 루프와 큰 작업을 구분합니다. 결과는 사람 리뷰 인박스로 — 루프는 push/release를 하지 않습니다.
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## 플러그인으로 설치 (실험적)
|
|
189
|
+
|
|
190
|
+
npm 전역 설치와 **병행**하는 경로다. ChatGPT 와 Codex 는 플러그인 디렉토리를 공유하므로, 한 번 패키징하면 양쪽에 올라간다.
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
# 저장소를 그대로 플러그인으로 설치해 검증 (repo 스코프 마켓플레이스가 이미 포함돼 있다)
|
|
194
|
+
# .agents/plugins/marketplace.json → source.path "./"
|
|
195
|
+
# 1) ChatGPT 데스크톱 앱 재시작
|
|
196
|
+
# 2) Plugins Directory 에서 "Vibe (local)" → vibe 설치
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
| 번들 | ChatGPT 앱 | Codex CLI |
|
|
200
|
+
|---|---|---|
|
|
201
|
+
| skills (52) | ✅ | ✅ |
|
|
202
|
+
| hooks | **미확인** — 훅 문서가 Codex 아래에만 있다 | ✅ (trust 승인 후) |
|
|
203
|
+
|
|
204
|
+
> ⚠️ 훅은 설치·활성화만으로 신뢰되지 않는다 — Codex 가 정의를 검토·승인할 때까지 건너뛴다.
|
|
205
|
+
> `vibe init`·`vibe upgrade` 같은 CLI 와 프로젝트 로컬 훅 설치는 플러그인이 대체하지 못하므로 npm 설치는 계속 필요하다.
|
|
183
206
|
|
|
184
207
|
---
|
|
185
208
|
|
|
@@ -189,25 +212,57 @@ codex
|
|
|
189
212
|
|-----|------|
|
|
190
213
|
| [Claude Code](https://claude.ai/code) | 전체 지원 |
|
|
191
214
|
| [Codex](https://github.com/openai/codex) | 전체 지원 (`~/.codex/`, AGENTS.md, native hooks.json, config.toml notify, codex exec agent fallback) |
|
|
192
|
-
| [Cursor](https://cursor.sh) | 에이전트 + 룰 |
|
|
193
215
|
| Antigravity CLI (`agy`) | 에이전트 + 스킬 |
|
|
194
216
|
|
|
195
217
|
---
|
|
196
218
|
|
|
197
219
|
## 명령어
|
|
198
220
|
|
|
221
|
+
`/vibe` 하나로 시작하면 나머지는 vibe 가 라우팅한다. 아래는 특정 단계를 직접 부르고 싶을 때의 목록이다.
|
|
222
|
+
|
|
223
|
+
**핵심 흐름**
|
|
224
|
+
|
|
199
225
|
| 명령어 | 용도 |
|
|
200
226
|
|--------|------|
|
|
201
227
|
| `/vibe` | **메인 진입점** — 자연어 요구사항 → SPEC 1패스 → 1회 승인 → 게이트 통과까지 루프 |
|
|
202
|
-
| `/vibe.spec` |
|
|
203
|
-
| `/vibe.run` |
|
|
204
|
-
| `/vibe.
|
|
205
|
-
| `/vibe.
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
|
210
|
-
|
|
228
|
+
| `/vibe.spec` | SPEC 1패스 명시적 호출 — 인라인 질문 → SPEC + BDD → 승인 |
|
|
229
|
+
| `/vibe.run` | SPEC 기반 구현 |
|
|
230
|
+
| `/vibe.verify` | 구현이 SPEC Done 기준에 맞는지 검증 — 결과는 run-ledger 에 기록 |
|
|
231
|
+
| `/vibe.continue` | 세션 복원 — 85%+ 컨텍스트에서 `save_memory` → `/new` 후 이어서 |
|
|
232
|
+
|
|
233
|
+
**검증 · 품질**
|
|
234
|
+
|
|
235
|
+
| 명령어 | 용도 |
|
|
236
|
+
|--------|------|
|
|
237
|
+
| `/vibe.review` | 관점별 병렬 리뷰 (correctness / security / performance …) — P1=0 까지 수렴 |
|
|
238
|
+
| `/vibe.regress` | 회귀 테스트 자동 진화 — verify 실패 자동 등록, 반복 패턴 승격 |
|
|
239
|
+
| `/vibe.contract` | SPEC API 계약 ↔ 구현 drift 탐지 — P1 drift 는 regress 로 전파 |
|
|
240
|
+
| `/vibe.trace` | 요구사항 추적 매트릭스 (RTM) |
|
|
241
|
+
| `/vibe.loop` | 자율 목표 루프 설계·설치 — 완료는 결정론 게이트가 판정 |
|
|
242
|
+
| `/vibe.test` | vibe 설치 자가검진 (CC ↔ Codex 동등성) — 릴리즈 전 권장 |
|
|
243
|
+
| `/vibe.harness` | 프로젝트 하네스 품질 6축 진단 (N/100) |
|
|
244
|
+
|
|
245
|
+
**설계 · UI**
|
|
246
|
+
|
|
247
|
+
| 명령어 | 용도 |
|
|
248
|
+
|--------|------|
|
|
249
|
+
| `/vibe.figma` | Figma ↔ 코드 (읽기 또는 쓰기, 3가지 모드) |
|
|
250
|
+
| `/vibe.design` | DESIGN.md 시각 품질 SSOT — init / lint / verify / sync / preview |
|
|
251
|
+
| `/vibe.clone` | 참조 사이트 URL → 현재 스택으로 마크업 재현 (픽셀 검증 루프) |
|
|
252
|
+
| `/vibe.image` | 이미지 생성 (Antigravity) — 아이콘 / 배너 / 목업 |
|
|
253
|
+
|
|
254
|
+
**분석 · 문서 · 운영**
|
|
255
|
+
|
|
256
|
+
| 명령어 | 용도 |
|
|
257
|
+
|--------|------|
|
|
258
|
+
| `/vibe.analyze` | 코드·문서·웹·Figma 분석 → 근거 있는 리포트 |
|
|
259
|
+
| `/vibe.reason` | 복잡한 문제의 가설·근거·트레이드오프 구조화 |
|
|
260
|
+
| `/vibe.docs` | README·가이드·아키텍처·릴리즈 노트·다이어그램을 코드와 동기화 |
|
|
261
|
+
| `/vibe.scaffold` | 새 프로젝트 구조 생성 / 기존 구조 감사 |
|
|
262
|
+
| `/vibe.llm` | provider 별 사용 가능 모델 목록 갱신 |
|
|
263
|
+
|
|
264
|
+
> 위는 자주 쓰는 것들이다. 설치된 전체 스킬 목록은 [SKILL-CATALOG.md](SKILL-CATALOG.md) 에 있고,
|
|
265
|
+
> 표에 없는 요구사항도 `/vibe` 가 description 기반 Catch-all 라우팅으로 처리한다.
|
|
211
266
|
|
|
212
267
|
---
|
|
213
268
|
|
|
@@ -216,7 +271,7 @@ codex
|
|
|
216
271
|
상세 가이드, 스킬 레퍼런스, 설정 방법은 [Wiki](https://github.com/su-record/vibe/wiki)를 참고하세요.
|
|
217
272
|
|
|
218
273
|
- [README (English)](README.en.md)
|
|
219
|
-
- [릴리스 노트](
|
|
274
|
+
- [릴리스 노트](https://github.com/su-record/vibe/releases) — 태그마다 CI 가 SPEC·커밋에서 결정론적으로 생성
|
|
220
275
|
|
|
221
276
|
---
|
|
222
277
|
|
|
@@ -14,6 +14,7 @@ export interface CodexHooksConfig {
|
|
|
14
14
|
Stop: CodexHookEntry[];
|
|
15
15
|
/** CC 의 context_window_* Notification 등가물 — Codex 에는 임계치 알림이 없다 */
|
|
16
16
|
PreCompact: CodexHookEntry[];
|
|
17
|
+
PostCompact: CodexHookEntry[];
|
|
17
18
|
};
|
|
18
19
|
}
|
|
19
20
|
export declare function buildCodexHooksConfig(coreDir?: string): CodexHooksConfig;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodexHooks.d.ts","sourceRoot":"","sources":["../../../src/cli/setup/CodexHooks.ts"],"names":[],"mappings":"AAKA,UAAU,gBAAgB;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,cAAc;IACtB,KAAK,EAAE,gBAAgB,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE;QACL,YAAY,EAAE,cAAc,EAAE,CAAC;QAC/B,gBAAgB,EAAE,cAAc,EAAE,CAAC;QACnC,UAAU,EAAE,cAAc,EAAE,CAAC;QAC7B,WAAW,EAAE,cAAc,EAAE,CAAC;QAC9B,IAAI,EAAE,cAAc,EAAE,CAAC;QACvB,mEAAmE;QACnE,UAAU,EAAE,cAAc,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"CodexHooks.d.ts","sourceRoot":"","sources":["../../../src/cli/setup/CodexHooks.ts"],"names":[],"mappings":"AAKA,UAAU,gBAAgB;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,cAAc;IACtB,KAAK,EAAE,gBAAgB,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE;QACL,YAAY,EAAE,cAAc,EAAE,CAAC;QAC/B,gBAAgB,EAAE,cAAc,EAAE,CAAC;QACnC,UAAU,EAAE,cAAc,EAAE,CAAC;QAC7B,WAAW,EAAE,cAAc,EAAE,CAAC;QAC9B,IAAI,EAAE,cAAc,EAAE,CAAC;QACvB,mEAAmE;QACnE,UAAU,EAAE,cAAc,EAAE,CAAC;QAC7B,WAAW,EAAE,cAAc,EAAE,CAAC;KAC/B,CAAC;CACH;AAaD,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,MAA2B,GAAG,gBAAgB,CAa5F;AAaD,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,MAA2B,GACnC,IAAI,CAWN"}
|
|
@@ -21,6 +21,7 @@ export function buildCodexHooksConfig(coreDir = getCoreConfigDir()) {
|
|
|
21
21
|
PostToolUse: [hookEntry(normalizedCoreDir, 'PostToolUse')],
|
|
22
22
|
Stop: [hookEntry(normalizedCoreDir, 'Stop')],
|
|
23
23
|
PreCompact: [hookEntry(normalizedCoreDir, 'PreCompact')],
|
|
24
|
+
PostCompact: [hookEntry(normalizedCoreDir, 'PostCompact')],
|
|
24
25
|
},
|
|
25
26
|
};
|
|
26
27
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodexHooks.js","sourceRoot":"","sources":["../../../src/cli/setup/CodexHooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"CodexHooks.js","sourceRoot":"","sources":["../../../src/cli/setup/CodexHooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAwBxD,SAAS,cAAc,CAAC,OAAe,EAAE,SAAiB;IACxD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,uBAAuB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACvG,OAAO,QAAQ,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,SAAS,EAAE,CAAC;AAC3D,CAAC;AAED,SAAS,SAAS,CAAC,OAAe,EAAE,SAAiB;IACnD,OAAO;QACL,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;KAC1E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,UAAkB,gBAAgB,EAAE;IACxE,MAAM,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACtD,OAAO;QACL,KAAK,EAAE;YACL,YAAY,EAAE,CAAC,SAAS,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;YAC5D,gBAAgB,EAAE,CAAC,SAAS,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAAC;YACpE,UAAU,EAAE,CAAC,SAAS,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;YACxD,WAAW,EAAE,CAAC,SAAS,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;YAC1D,IAAI,EAAE,CAAC,SAAS,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;YAC5C,UAAU,EAAE,CAAC,SAAS,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;YACxD,WAAW,EAAE,CAAC,SAAS,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;SAC3D;KACF,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,SAAiB;IAC1C,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,EAAE,CAAC;QACzC,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,CAAC;QAC9E,OAAO,MAAiC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,WAAmB,EACnB,UAAkB,gBAAgB,EAAE;IAEpC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACpD,SAAS,CAAC,QAAQ,CAAC,CAAC;IAEpB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG;QACX,GAAG,QAAQ;QACX,KAAK,EAAE,qBAAqB,CAAC,OAAO,CAAC,CAAC,KAAK;KAC5C,CAAC;IACF,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_comment": "플러그인 번들용 훅 정의. hooks/hooks.json 과 같은 내용이되 경로가 다르다 — npm 설치 경로는 postinstall 이 {{VIBE_PATH}} 를 치환하지만, 플러그인은 치환 단계가 없어 런타임 환경변수 ${PLUGIN_ROOT} 를 쓴다. 두 파일이 갈라지지 않도록 plugin-manifest.test.ts 가 이벤트 집합을 대조한다.",
|
|
3
|
+
"hooks": {
|
|
4
|
+
"SessionStart": [
|
|
5
|
+
{
|
|
6
|
+
"matcher": "startup|resume|clear",
|
|
7
|
+
"hooks": [
|
|
8
|
+
{
|
|
9
|
+
"type": "command",
|
|
10
|
+
"command": "node ${PLUGIN_ROOT}/hooks/scripts/session-start.js"
|
|
11
|
+
}
|
|
12
|
+
]
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"PreToolUse": [
|
|
16
|
+
{
|
|
17
|
+
"matcher": "Bash",
|
|
18
|
+
"hooks": [
|
|
19
|
+
{
|
|
20
|
+
"type": "command",
|
|
21
|
+
"command": "node ${PLUGIN_ROOT}/hooks/scripts/pre-tool-dispatcher.js Bash"
|
|
22
|
+
}
|
|
23
|
+
]
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"matcher": "Edit",
|
|
27
|
+
"hooks": [
|
|
28
|
+
{
|
|
29
|
+
"type": "command",
|
|
30
|
+
"command": "node ${PLUGIN_ROOT}/hooks/scripts/pre-tool-dispatcher.js Edit"
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"matcher": "Write",
|
|
36
|
+
"hooks": [
|
|
37
|
+
{
|
|
38
|
+
"type": "command",
|
|
39
|
+
"command": "node ${PLUGIN_ROOT}/hooks/scripts/pre-tool-dispatcher.js Write"
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"matcher": "mcp__github__create_pull_request",
|
|
45
|
+
"hooks": [
|
|
46
|
+
{
|
|
47
|
+
"type": "command",
|
|
48
|
+
"command": "node ${PLUGIN_ROOT}/hooks/scripts/pr-test-gate.js"
|
|
49
|
+
}
|
|
50
|
+
]
|
|
51
|
+
}
|
|
52
|
+
],
|
|
53
|
+
"PostToolUse": [
|
|
54
|
+
{
|
|
55
|
+
"matcher": "Write|Edit",
|
|
56
|
+
"hooks": [
|
|
57
|
+
{
|
|
58
|
+
"type": "command",
|
|
59
|
+
"command": "node ${PLUGIN_ROOT}/hooks/scripts/post-edit-dispatcher.js"
|
|
60
|
+
}
|
|
61
|
+
]
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"matcher": "Edit|Write|Bash|Task|SlashCommand|NotebookEdit",
|
|
65
|
+
"hooks": [
|
|
66
|
+
{
|
|
67
|
+
"type": "command",
|
|
68
|
+
"command": "node ${PLUGIN_ROOT}/hooks/scripts/step-counter.js"
|
|
69
|
+
}
|
|
70
|
+
]
|
|
71
|
+
}
|
|
72
|
+
],
|
|
73
|
+
"UserPromptSubmit": [
|
|
74
|
+
{
|
|
75
|
+
"hooks": [
|
|
76
|
+
{
|
|
77
|
+
"type": "command",
|
|
78
|
+
"command": "node ${PLUGIN_ROOT}/hooks/scripts/prompt-dispatcher.js"
|
|
79
|
+
}
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
],
|
|
83
|
+
"Notification": [
|
|
84
|
+
{
|
|
85
|
+
"matcher": "context_window_80",
|
|
86
|
+
"hooks": [
|
|
87
|
+
{
|
|
88
|
+
"type": "command",
|
|
89
|
+
"command": "node ${PLUGIN_ROOT}/hooks/scripts/context-save.js medium"
|
|
90
|
+
}
|
|
91
|
+
]
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"matcher": "context_window_90",
|
|
95
|
+
"hooks": [
|
|
96
|
+
{
|
|
97
|
+
"type": "command",
|
|
98
|
+
"command": "node ${PLUGIN_ROOT}/hooks/scripts/context-save.js high"
|
|
99
|
+
}
|
|
100
|
+
]
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"matcher": "context_window_95",
|
|
104
|
+
"hooks": [
|
|
105
|
+
{
|
|
106
|
+
"type": "command",
|
|
107
|
+
"command": "node ${PLUGIN_ROOT}/hooks/scripts/context-save.js critical"
|
|
108
|
+
}
|
|
109
|
+
]
|
|
110
|
+
}
|
|
111
|
+
],
|
|
112
|
+
"Stop": [
|
|
113
|
+
{
|
|
114
|
+
"hooks": [
|
|
115
|
+
{
|
|
116
|
+
"type": "command",
|
|
117
|
+
"command": "node ${PLUGIN_ROOT}/hooks/scripts/stop-dispatcher.js"
|
|
118
|
+
}
|
|
119
|
+
]
|
|
120
|
+
}
|
|
121
|
+
]
|
|
122
|
+
}
|
|
123
|
+
}
|
|
@@ -133,6 +133,27 @@ function handlePreCompact() {
|
|
|
133
133
|
// stdout 주입 없음 — 압축 직전에 컨텍스트를 더 늘리는 것은 역효과다.
|
|
134
134
|
}
|
|
135
135
|
|
|
136
|
+
/**
|
|
137
|
+
* PostCompact → ANCHOR 재고정.
|
|
138
|
+
*
|
|
139
|
+
* loop-contract 는 ANCHOR 의 존재 이유를 "컨텍스트가 오염되거나 compact 로 소실돼도
|
|
140
|
+
* 루프는 깨지지 않는다" 로 규정한다. 그런데 정작 **압축 직후 자동 재고정이 없었다** —
|
|
141
|
+
* 모델이 스스로 `anchor` 를 다시 부르기를 기대하는 상태였다. 압축은 그 기대가 가장
|
|
142
|
+
* 깨지기 쉬운 순간이다(방금 지시를 잃은 참이다).
|
|
143
|
+
*
|
|
144
|
+
* PreCompact 가 압축 **전** 체크포인트를 저장한다면, PostCompact 는 압축 **후**
|
|
145
|
+
* 디스크에서 사실을 다시 읽어 컨텍스트에 넣는다. 둘은 짝이다.
|
|
146
|
+
*
|
|
147
|
+
* 재고정 결과는 additionalContext 로 주입한다 — 압축 직후는 컨텍스트가 비어 있어
|
|
148
|
+
* 주입 비용이 가장 싸고 효용이 가장 크다.
|
|
149
|
+
*/
|
|
150
|
+
function handlePostCompact() {
|
|
151
|
+
const out = combinedOutput(runScript('loop-ledger.js', ['anchor']));
|
|
152
|
+
if (out && out.trim()) {
|
|
153
|
+
writeAdditionalContext('[vibe] ANCHOR (post-compact re-anchor):\n' + out.trim());
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
136
157
|
switch (eventName) {
|
|
137
158
|
case 'SessionStart':
|
|
138
159
|
writeAdditionalContext(combinedOutput(runScript('session-start.js')));
|
|
@@ -152,6 +173,9 @@ switch (eventName) {
|
|
|
152
173
|
case 'PreCompact':
|
|
153
174
|
handlePreCompact();
|
|
154
175
|
break;
|
|
176
|
+
case 'PostCompact':
|
|
177
|
+
handlePostCompact();
|
|
178
|
+
break;
|
|
155
179
|
default:
|
|
156
180
|
break;
|
|
157
181
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@su-record/vibe",
|
|
3
|
-
"version": "3.2.
|
|
3
|
+
"version": "3.2.26",
|
|
4
4
|
"description": "AI Coding Framework for Claude Code — 7+ agents, 52 skills, multi-LLM orchestration",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/cli/index.js",
|
|
@@ -34,7 +34,9 @@
|
|
|
34
34
|
"test:coverage": "vitest run --coverage",
|
|
35
35
|
"prepublishOnly": "pnpm build",
|
|
36
36
|
"postinstall": "node -e \"import('./dist/cli/postinstall/main.js').then(m=>m.main()).catch(e=>process.stderr.write('\\u26a0\\ufe0f vibe postinstall skipped: '+((e&&e.message)||e)+'\\n Assets and hooks were not installed. Run: npx vibe upgrade\\n'))\"",
|
|
37
|
-
"release": "bash scripts/release.sh"
|
|
37
|
+
"release": "bash scripts/release.sh",
|
|
38
|
+
"sync:plugin-version": "npx tsx scripts/sync-plugin-version.ts",
|
|
39
|
+
"version": "npx tsx scripts/sync-plugin-version.ts && git add .codex-plugin/plugin.json"
|
|
38
40
|
},
|
|
39
41
|
"keywords": [
|
|
40
42
|
"ai",
|
|
@@ -94,6 +96,7 @@
|
|
|
94
96
|
"vitest": "^4.1.10"
|
|
95
97
|
},
|
|
96
98
|
"files": [
|
|
99
|
+
".codex-plugin/",
|
|
97
100
|
"dist/",
|
|
98
101
|
"vibe/",
|
|
99
102
|
"languages/",
|
|
@@ -110,47 +110,7 @@ and dispatch concurrently when capacity permits:
|
|
|
110
110
|
|
|
111
111
|
### 3. Generate Report
|
|
112
112
|
|
|
113
|
-
|
|
114
|
-
## Harness Diagnosis (N/100)
|
|
115
|
-
|
|
116
|
-
### Score and Grade
|
|
117
|
-
- **Score**: N/100
|
|
118
|
-
- **Grade**: [S / A / B / C / D]
|
|
119
|
-
|
|
120
|
-
| Grade | Range | Description |
|
|
121
|
-
|-------|-------|-------------|
|
|
122
|
-
| S | 90-100 | Production-ready Harness |
|
|
123
|
-
| A | 75-89 | Well-structured, minor gaps |
|
|
124
|
-
| B | 60-74 | Functional but missing key elements |
|
|
125
|
-
| C | 40-59 | Basic setup, significant gaps |
|
|
126
|
-
| D | 0-39 | Minimal or no Harness |
|
|
127
|
-
|
|
128
|
-
### Axis Scores
|
|
129
|
-
|
|
130
|
-
| Axis | Score | Details |
|
|
131
|
-
|------|-------|---------|
|
|
132
|
-
| Scaffolding | /20 | [findings] |
|
|
133
|
-
| Context | /20 | [findings] |
|
|
134
|
-
| Planning | /15 | [findings] |
|
|
135
|
-
| Orchestration | /15 | [findings] |
|
|
136
|
-
| Verification | /15 | [findings] |
|
|
137
|
-
| Compounding | /15 | [findings] |
|
|
138
|
-
|
|
139
|
-
### Top 3 Improvements
|
|
140
|
-
|
|
141
|
-
1. **[lowest axis]**: [specific action with command]
|
|
142
|
-
2. **[second lowest]**: [specific action with command]
|
|
143
|
-
3. **[third lowest]**: [specific action with command]
|
|
144
|
-
|
|
145
|
-
### Auto-Fixable Items
|
|
146
|
-
|
|
147
|
-
The following can be improved immediately:
|
|
148
|
-
1. [ ] `/vibe.scaffold` — generate missing project directories
|
|
149
|
-
2. [ ] `vibe init` — initialize AI configuration
|
|
150
|
-
3. [ ] `vibe update` — regenerate CLAUDE.md from project analysis
|
|
151
|
-
|
|
152
|
-
Proceed with auto-fix? (y/n)
|
|
153
|
-
```
|
|
113
|
+
형식: `references/report-template.md` (Step 3 호출 시에만 읽는다).
|
|
154
114
|
|
|
155
115
|
### 4. Save Report
|
|
156
116
|
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Harness Diagnosis — 리포트 형식
|
|
2
|
+
|
|
3
|
+
> `vibe.harness` Step 3 이 출력하는 진단 리포트의 형식. 채점 루브릭은 SKILL.md 의
|
|
4
|
+
> `### 2. Score Each Axis` 가 SSOT 다 — 점수 기준을 여기에 다시 적지 않는다.
|
|
5
|
+
|
|
6
|
+
```markdown
|
|
7
|
+
## Harness Diagnosis (N/100)
|
|
8
|
+
|
|
9
|
+
### Score and Grade
|
|
10
|
+
- **Score**: N/100
|
|
11
|
+
- **Grade**: [S / A / B / C / D]
|
|
12
|
+
|
|
13
|
+
| Grade | Range | Description |
|
|
14
|
+
|-------|-------|-------------|
|
|
15
|
+
| S | 90-100 | Production-ready Harness |
|
|
16
|
+
| A | 75-89 | Well-structured, minor gaps |
|
|
17
|
+
| B | 60-74 | Functional but missing key elements |
|
|
18
|
+
| C | 40-59 | Basic setup, significant gaps |
|
|
19
|
+
| D | 0-39 | Minimal or no Harness |
|
|
20
|
+
|
|
21
|
+
### Axis Scores
|
|
22
|
+
|
|
23
|
+
| Axis | Score | Details |
|
|
24
|
+
|------|-------|---------|
|
|
25
|
+
| Scaffolding | /20 | [findings] |
|
|
26
|
+
| Context | /20 | [findings] |
|
|
27
|
+
| Planning | /15 | [findings] |
|
|
28
|
+
| Orchestration | /15 | [findings] |
|
|
29
|
+
| Verification | /15 | [findings] |
|
|
30
|
+
| Compounding | /15 | [findings] |
|
|
31
|
+
|
|
32
|
+
### Top 3 Improvements
|
|
33
|
+
|
|
34
|
+
1. **[lowest axis]**: [specific action with command]
|
|
35
|
+
2. **[second lowest]**: [specific action with command]
|
|
36
|
+
3. **[third lowest]**: [specific action with command]
|
|
37
|
+
|
|
38
|
+
### Auto-Fixable Items
|
|
39
|
+
|
|
40
|
+
The following can be improved immediately:
|
|
41
|
+
1. [ ] `/vibe.scaffold` — generate missing project directories
|
|
42
|
+
2. [ ] `vibe init` — initialize AI configuration
|
|
43
|
+
3. [ ] `vibe update` — regenerate CLAUDE.md from project analysis
|
|
44
|
+
|
|
45
|
+
Proceed with auto-fix? (y/n)
|
|
46
|
+
```
|
|
@@ -32,17 +32,24 @@
|
|
|
32
32
|
|
|
33
33
|
## Hooks Across Harnesses
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
Codex는 네이티브 hook을 지원한다(`codex features list` → `hooks: stable`). 두 하네스의 이벤트 집합은 이제 거의 겹치므로, **경로만 다르고 의도는 같게** 매핑한다.
|
|
36
36
|
|
|
37
|
-
Codex
|
|
37
|
+
> 과거 이 자리에는 "Codex에 완전한 등가물이 없다" 고 적혀 있었다. 실측(2026-08-13)으로 낡은 서술임을 확인했다 — Codex는 SessionStart · UserPromptSubmit · PreToolUse · PostToolUse · PermissionRequest · Stop · SessionEnd · Pre/PostCompact · SubagentStart/Stop 를 제공한다.
|
|
38
38
|
|
|
39
39
|
| hook 의도 | Claude Code | Codex |
|
|
40
40
|
|---|---|---|
|
|
41
|
-
|
|
|
42
|
-
|
|
|
43
|
-
| pre-edit / scope guard | `PreToolUse` (동기 deny) |
|
|
44
|
-
| 키워드 디스패치 | `UserPromptSubmit` | `.codex/hooks.json` → `UserPromptSubmit` |
|
|
41
|
+
| 세션 시작 | `SessionStart` | `.codex/hooks.json` → `SessionStart` |
|
|
42
|
+
| 키워드 디스패치 | `UserPromptSubmit` | `UserPromptSubmit` |
|
|
43
|
+
| pre-edit / scope guard | `PreToolUse` (동기 deny) | `PreToolUse` (동기 deny) |
|
|
45
44
|
| 금지 패턴 차단 | `PreToolUse` | `PreToolUse` + AGENTS.md 규칙 (이중 방어) |
|
|
45
|
+
| 편집 후 품질 검사 | `PostToolUse` | `PostToolUse` |
|
|
46
|
+
| 압축 전 체크포인트 | `Notification` (context_window_*) | `PreCompact` — 임계치 추정이 아닌 확정 신호라 더 정확 |
|
|
47
|
+
| **압축 후 재고정** | (없음 — 모델이 `anchor` 호출) | **`PostCompact` → `loop-ledger.js anchor`** |
|
|
48
|
+
| 라이프사이클 (turn 완료) | `Stop` hook | `config.toml` 의 `notify` (아래 참조) |
|
|
49
|
+
|
|
50
|
+
**`Stop` 이 아니라 `notify` 를 쓰는 이유**: Codex 도 `Stop` 이벤트를 제공하고 vibe 도 등록해 두었지만, turn 완료 후처리(auto-commit·devlog)는 `notify` 가 담당한다. 둘 다에서 실행하면 커밋이 중복된다 — `Stop` 핸들러는 의도적으로 비워 둔다.
|
|
51
|
+
|
|
52
|
+
**미등록 이벤트와 이유**: `SessionEnd`(타임아웃 1초 — 무거운 작업 불가) · `SubagentStart/Stop`(계측 외 용도 없음) · `PermissionRequest`(비용 게이트를 하네스 강제로 올릴 자리 — 후보로 남김).
|
|
46
53
|
|
|
47
54
|
**구현**: `hooks/scripts/codex-hook-adapter.js`가 Codex hook 이벤트를 기존 vibe hook 스크립트로 번역하고 deny 결정(JSON)을 보존한다. 설치는 `installProjectCodexHooks()` → `.codex/hooks.json` (프로젝트 로컬, gitignored). 라이프사이클 후처리(auto-commit·devlog)는 `codex-notify.js`가 `notify` 경로로 담당한다.
|
|
48
55
|
|
|
@@ -52,18 +52,24 @@ status: active
|
|
|
52
52
|
- `verify: tests` — `test_command` exit code 0
|
|
53
53
|
- `verify: none` — 파이프라인 마지막 스킬 완료 시
|
|
54
54
|
- 연속 2회 `discoverHash` 동일 → stuck으로 중단, 인박스 기록
|
|
55
|
+
- `max_iterations` 소진 → 잔여를 인박스로 이월. **회전 수는 코드가 센다** —
|
|
56
|
+
`loop-ledger.js iteration <name> <verified|unverified>` 로 기록하고
|
|
57
|
+
`budget <name> <max>` 로 확인한다 (모델이 세지 않는다)
|
|
58
|
+
- 실행 실패(스킬 미설치·도구 부재·명령 비정상 종료) → stuck 이 아니라 즉시 종료.
|
|
59
|
+
같은 방식으로 재시도하지 않는다
|
|
60
|
+
|
|
61
|
+
전문: `vibe/rules/loop-contract.md` (예산 · 실행 실패 절)
|
|
55
62
|
|
|
56
63
|
## 인박스 보고 형식
|
|
57
64
|
|
|
58
|
-
|
|
65
|
+
블록 형식과 최신순 정렬은 **명령이 보장한다** — 손으로 마크다운을 쓰지 않는다:
|
|
59
66
|
|
|
67
|
+
```bash
|
|
68
|
+
node "$HOOKS_DIR/loop-ledger.js" inbox {loop-name} <ok|fail|stuck> \
|
|
69
|
+
"발견: N건 / 처리: M건 / 검증: {기준과 결과}" \
|
|
70
|
+
"리뷰 필요: {사람이 확인해야 할 사항 — 없으면 없음}"
|
|
60
71
|
```
|
|
61
|
-
## [{loop-name}] {YYYY-MM-DD HH:mm}
|
|
62
72
|
|
|
63
|
-
-
|
|
64
|
-
- **처리한 항목**: {항목 설명}
|
|
65
|
-
- **검증 상태**: verifyPassed=true | false
|
|
66
|
-
- **리뷰 필요**: {사람이 확인해야 할 사항. 없으면 "없음"}
|
|
67
|
-
```
|
|
73
|
+
기록되는 형식: `## {loop-name} — {ISO 시각} — {결과}` + 본문 줄들.
|
|
68
74
|
|
|
69
75
|
> 루프는 push·release·배포를 수행하지 않는다. auto-commit verify 게이트 통과 시 커밋까지만.
|