@su-record/vibe 2.12.5 → 2.13.0
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 +8 -2
- package/README.en.md +11 -11
- package/README.md +7 -7
- package/dist/cli/postinstall/fs-utils.d.ts +23 -0
- package/dist/cli/postinstall/fs-utils.d.ts.map +1 -1
- package/dist/cli/postinstall/fs-utils.js +71 -0
- package/dist/cli/postinstall/fs-utils.js.map +1 -1
- package/dist/cli/postinstall/fs-utils.test.js +69 -1
- package/dist/cli/postinstall/fs-utils.test.js.map +1 -1
- package/dist/cli/postinstall/main.d.ts.map +1 -1
- package/dist/cli/postinstall/main.js +12 -2
- package/dist/cli/postinstall/main.js.map +1 -1
- package/dist/cli/setup/CodexHooks.test.js +27 -0
- package/dist/cli/setup/CodexHooks.test.js.map +1 -1
- package/dist/cli/setup/ProjectSetup.js +2 -2
- package/dist/cli/setup/ProjectSetup.js.map +1 -1
- package/dist/infra/lib/DecisionTracer.d.ts +4 -0
- package/dist/infra/lib/DecisionTracer.d.ts.map +1 -1
- package/dist/infra/lib/DecisionTracer.js +4 -0
- package/dist/infra/lib/DecisionTracer.js.map +1 -1
- package/dist/infra/lib/LoopBreaker.d.ts +4 -0
- package/dist/infra/lib/LoopBreaker.d.ts.map +1 -1
- package/dist/infra/lib/LoopBreaker.js +4 -0
- package/dist/infra/lib/LoopBreaker.js.map +1 -1
- package/dist/infra/lib/ReviewRace.d.ts +4 -0
- package/dist/infra/lib/ReviewRace.d.ts.map +1 -1
- package/dist/infra/lib/ReviewRace.js +4 -0
- package/dist/infra/lib/ReviewRace.js.map +1 -1
- package/dist/infra/lib/SkillQualityGate.d.ts +4 -0
- package/dist/infra/lib/SkillQualityGate.d.ts.map +1 -1
- package/dist/infra/lib/SkillQualityGate.js +4 -0
- package/dist/infra/lib/SkillQualityGate.js.map +1 -1
- package/dist/infra/lib/UltraQA.d.ts +4 -0
- package/dist/infra/lib/UltraQA.d.ts.map +1 -1
- package/dist/infra/lib/UltraQA.js +4 -0
- package/dist/infra/lib/UltraQA.js.map +1 -1
- package/dist/infra/lib/VerificationLoop.d.ts +4 -0
- package/dist/infra/lib/VerificationLoop.d.ts.map +1 -1
- package/dist/infra/lib/VerificationLoop.js +4 -0
- package/dist/infra/lib/VerificationLoop.js.map +1 -1
- package/dist/infra/orchestrator/index.d.ts.map +1 -1
- package/dist/infra/orchestrator/index.js +1 -3
- package/dist/infra/orchestrator/index.js.map +1 -1
- package/dist/infra/orchestrator/parallelResearch.d.ts.map +1 -1
- package/dist/infra/orchestrator/parallelResearch.js +1 -4
- package/dist/infra/orchestrator/parallelResearch.js.map +1 -1
- package/dist/tools/convention/validateCodeQuality.d.ts.map +1 -1
- package/dist/tools/convention/validateCodeQuality.js +5 -4
- package/dist/tools/convention/validateCodeQuality.js.map +1 -1
- package/dist/tools/spec/traceabilityMatrix.d.ts +2 -0
- package/dist/tools/spec/traceabilityMatrix.d.ts.map +1 -1
- package/dist/tools/spec/traceabilityMatrix.js +50 -1
- package/dist/tools/spec/traceabilityMatrix.js.map +1 -1
- package/dist/tools/spec/traceabilityMatrix.path-resolution.test.d.ts +10 -0
- package/dist/tools/spec/traceabilityMatrix.path-resolution.test.d.ts.map +1 -0
- package/dist/tools/spec/traceabilityMatrix.path-resolution.test.js +89 -0
- package/dist/tools/spec/traceabilityMatrix.path-resolution.test.js.map +1 -0
- package/dist/tools/spec/traceabilityMatrix.test.js +19 -0
- package/dist/tools/spec/traceabilityMatrix.test.js.map +1 -1
- package/hooks/hooks.json +1 -0
- package/hooks/scripts/__tests__/.vibe/command-log.txt +39 -0
- package/hooks/scripts/__tests__/.vibe/memories/memories.db +0 -0
- package/hooks/scripts/__tests__/.vibe/memories/memories.db-shm +0 -0
- package/hooks/scripts/__tests__/.vibe/memories/memories.db-wal +0 -0
- package/hooks/scripts/__tests__/auto-test-debounce.test.js +145 -0
- package/hooks/scripts/__tests__/code-check-detectors.test.js +155 -0
- package/hooks/scripts/__tests__/dispatcher-inprocess.test.js +99 -0
- package/hooks/scripts/__tests__/post-edit-dispatcher.test.js +139 -0
- package/hooks/scripts/__tests__/pre-tool-guard.test.js +115 -1
- package/hooks/scripts/__tests__/run-ledger-verify-required.test.js +146 -0
- package/hooks/scripts/__tests__/run-ledger.test.js +330 -0
- package/hooks/scripts/__tests__/scope-from-spec.test.js +215 -0
- package/hooks/scripts/__tests__/sentinel-guard.test.js +79 -24
- package/hooks/scripts/__tests__/step-counter.test.js +95 -15
- package/hooks/scripts/__tests__/utils-npm-root.test.js +98 -0
- package/hooks/scripts/auto-commit.js +27 -1
- package/hooks/scripts/auto-format.js +85 -20
- package/hooks/scripts/auto-test.js +187 -37
- package/hooks/scripts/code-check.js +286 -90
- package/hooks/scripts/codex-hook-adapter.js +12 -1
- package/hooks/scripts/command-log.js +26 -16
- package/hooks/scripts/lib/dispatcher.js +38 -0
- package/hooks/scripts/lib/hook-context.js +101 -0
- package/hooks/scripts/lib/pr-gate-runner.js +62 -0
- package/hooks/scripts/lib/run-ledger.js +169 -0
- package/hooks/scripts/lib/scope-from-spec.js +40 -7
- package/hooks/scripts/post-edit-dispatcher.js +93 -20
- package/hooks/scripts/post-edit.js +40 -19
- package/hooks/scripts/pr-test-gate.js +8 -37
- package/hooks/scripts/pre-tool-dispatcher.js +18 -16
- package/hooks/scripts/pre-tool-guard.js +55 -52
- package/hooks/scripts/prompt-dispatcher.js +10 -0
- package/hooks/scripts/scope-guard.js +40 -39
- package/hooks/scripts/sentinel-guard.js +41 -41
- package/hooks/scripts/session-start.js +13 -1
- package/hooks/scripts/step-counter.js +100 -7
- package/hooks/scripts/stop-dispatcher.js +26 -0
- package/hooks/scripts/utils.js +63 -21
- package/hooks/scripts/verify-ledger.js +22 -0
- package/package.json +2 -2
- package/skills/spec/references/templates.md +11 -6
- package/skills/vibe.run/SKILL.md +144 -1681
- package/skills/vibe.run/references/brand-assets.md +59 -0
- package/skills/vibe.run/references/parallel-agents.md +326 -0
- package/skills/vibe.run/references/race-review.md +272 -0
- package/skills/vibe.run/references/ralph-loop.md +172 -0
- package/skills/vibe.run/references/ultrawork-mode.md +148 -0
- package/skills/vibe.trace/SKILL.md +25 -38
- package/skills/vibe.verify/SKILL.md +15 -0
- package/hooks/scripts/figma-guard.js +0 -219
package/CLAUDE.md
CHANGED
|
@@ -28,7 +28,7 @@ Transform imperative tasks into verifiable goals **before** coding:
|
|
|
28
28
|
|
|
29
29
|
Weak criteria ("make it work") require constant clarification. Strong criteria let the loop run independently.
|
|
30
30
|
|
|
31
|
-
### TypeScript (
|
|
31
|
+
### TypeScript (detected by Quality Gate hooks — violations injected as additionalContext; blocked by auto-commit verify gate, Stop warning, and pr-test-gate)
|
|
32
32
|
- No `any` / `as any` / `@ts-ignore` — use `unknown` + type guards; fix at root
|
|
33
33
|
- Explicit return types on all functions
|
|
34
34
|
|
|
@@ -39,7 +39,7 @@ Function ≤50 lines · Nesting ≤3 · Params ≤5 · Cyclomatic ≤10
|
|
|
39
39
|
No `console.log` in commits · No hardcoded strings/numbers · No commented-out code · No incomplete code without TODO
|
|
40
40
|
|
|
41
41
|
### Convergence (review / auto-fix loops)
|
|
42
|
-
- **Loop until P1 = 0 AND no new findings** — no round cap
|
|
42
|
+
- **Loop until P1 = 0 AND no new findings** — no round cap; the model follows this protocol — run/verify state is tracked in `.vibe/metrics/run-ledger.json`
|
|
43
43
|
- **Narrowing scope**: Round 1 full → Round 2 P1+P2 → Round 3+ P1 only
|
|
44
44
|
- **Stuck detection** (same findings/score 2 rounds in a row) → ask user (fill values / approve sub-100 / abort). Never silently proceed sub-100
|
|
45
45
|
- **`ultrawork` exception** — skip user prompt; record gaps as TODO to stay non-interactive
|
|
@@ -59,6 +59,12 @@ No `console.log` in commits · No hardcoded strings/numbers · No commented-out
|
|
|
59
59
|
| `.claude/settings.local.json` | Claude Code hooks (auto-generated, don't commit) |
|
|
60
60
|
| `~/.codex/config.toml` | Codex `notify` (turn-complete lifecycle hook, auto-installed) |
|
|
61
61
|
|
|
62
|
+
**`.vibe/config.json` behavior keys** (set per-project to tune gate behavior):
|
|
63
|
+
- `scopeGuard.enabled` / `scopeGuard.mode` — scope fence on/off; `warn` (default) or `block`
|
|
64
|
+
- `verifyGate.mode` — `warn` (default) or `block` (Stop hook blocks once if run started but verify not passed)
|
|
65
|
+
- `autoTest.mode` — `debounce` (default, 120s cooldown per unchanged test file) / `always` / `off`
|
|
66
|
+
- `qualityCheck.consoleAllow` — array of file globs where `console.log` is permitted
|
|
67
|
+
|
|
62
68
|
### Quality SSOT (3-tier)
|
|
63
69
|
| Path | Purpose |
|
|
64
70
|
|---|---|
|
package/README.en.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
[](https://nodejs.org/)
|
|
8
8
|
[](LICENSE)
|
|
9
9
|
|
|
10
|
-
Vibe is a quality harness for AI coding tools. It wraps around Claude Code, Codex, Cursor, or
|
|
10
|
+
Vibe is a quality harness for AI coding tools. It wraps around Claude Code, Codex, Cursor, or Antigravity CLI and automatically enforces type safety, code quality, and security — so you can vibe-code fast without shipping garbage.
|
|
11
11
|
|
|
12
12
|
```bash
|
|
13
13
|
npm install -g @su-record/vibe
|
|
@@ -156,19 +156,19 @@ The **third SSOT** alongside `CLAUDE.md` (code) and `AGENTS.md` (build). Google
|
|
|
156
156
|
|
|
157
157
|
## Quality Gates
|
|
158
158
|
|
|
159
|
-
|
|
159
|
+
Detection at edit time, blocking at deterministic gates — three layers of defense:
|
|
160
160
|
|
|
161
|
-
| Layer | What it
|
|
162
|
-
|
|
163
|
-
|
|
|
164
|
-
|
|
|
165
|
-
|
|
|
161
|
+
| Layer | What it does |
|
|
162
|
+
|-------|--------------|
|
|
163
|
+
| Edit hooks (Edit/Write) | **Detects** `any` types, `@ts-ignore`, `console.log`, functions > 50 lines → injects findings to the model (additionalContext) + records verify-required state |
|
|
164
|
+
| Deterministic gates | **auto-commit verify gate** (refuses commits until verify passes) · **Stop hook** verify-skip warn/block · **PR test gate** (incl. `gh pr create`) · **scope-guard** (monitors edits outside SPEC scope) |
|
|
165
|
+
| Review + convergence loop | 12 specialized reviewers in parallel → findings loop until P1 = 0. No round cap. Run/verify state tracked in `.vibe/metrics/run-ledger.json`. Stuck = ask user, never silently proceed. |
|
|
166
166
|
|
|
167
167
|
---
|
|
168
168
|
|
|
169
169
|
## Key Features
|
|
170
170
|
|
|
171
|
-
**40+ agents** — Exploration, implementation, architecture, parallel code review, UI/UX analysis, security audit, Figma analysis/building.
|
|
171
|
+
**40+ agents** — Exploration, implementation, architecture, parallel code review, UI/UX analysis, security audit, Figma analysis/building. The UI/Figma/Event groups (18 agents) are excluded from the global install — `vibe init` installs them project-locally (`.claude/agents/`) only when the stack/capability matches, so they never occupy context in unrelated projects.
|
|
172
172
|
|
|
173
173
|
**44 skills** — Not all loaded at once. 3-tier system prevents context overload:
|
|
174
174
|
|
|
@@ -178,7 +178,7 @@ Three layers of defense on every tool call:
|
|
|
178
178
|
| **Standard** | `vibe init` selects by stack | Stack/capability support | figma, design-audit, techdebt |
|
|
179
179
|
| **Optional** | Explicit `/skill` only | Reference, wrappers | chub-usage, context7 |
|
|
180
180
|
|
|
181
|
-
**Multi-LLM** — Claude Code or Codex runs the harness, GPT reasons, and
|
|
181
|
+
**Multi-LLM** — Claude Code or Codex runs the harness, GPT reasons, and Antigravity researches. Auto-routes by availability.
|
|
182
182
|
|
|
183
183
|
**Stack detection** — Auto-detects 24 frameworks (Next.js, Django, Rails, Go, Rust, Flutter, and more) and applies framework-specific rules and skills.
|
|
184
184
|
|
|
@@ -199,7 +199,7 @@ Three layers of defense on every tool call:
|
|
|
199
199
|
| [Claude Code](https://claude.ai/code) | Full support |
|
|
200
200
|
| [Codex](https://github.com/openai/codex) | Full support (`~/.codex/`, AGENTS.md, native hooks.json, config.toml notify, codex exec agent fallback) |
|
|
201
201
|
| [Cursor](https://cursor.sh) | Agents + Rules |
|
|
202
|
-
| [
|
|
202
|
+
| [Antigravity CLI](https://github.com/google-gemini/gemini-cli) | Agents + Skills |
|
|
203
203
|
|
|
204
204
|
---
|
|
205
205
|
|
|
@@ -234,7 +234,7 @@ Full guides, skill reference, and configuration details are in the [Wiki](https:
|
|
|
234
234
|
|
|
235
235
|
- Node.js >= 18.0.0
|
|
236
236
|
- Claude Code or Codex CLI
|
|
237
|
-
- GPT,
|
|
237
|
+
- GPT, Antigravity (optional)
|
|
238
238
|
|
|
239
239
|
## License
|
|
240
240
|
|
package/README.md
CHANGED
|
@@ -130,19 +130,19 @@ codex
|
|
|
130
130
|
|
|
131
131
|
## 품질 게이트
|
|
132
132
|
|
|
133
|
-
|
|
133
|
+
탐지는 편집 시점에, 차단은 결정론적 게이트에서 — 3계층 방어:
|
|
134
134
|
|
|
135
|
-
| 계층 |
|
|
136
|
-
|
|
137
|
-
|
|
|
138
|
-
|
|
|
139
|
-
| 수렴 루프 |
|
|
135
|
+
| 계층 | 동작 |
|
|
136
|
+
|------|------|
|
|
137
|
+
| 편집 훅 (Edit/Write) | `any` 타입, `@ts-ignore`, `console.log`, 50줄 초과 함수 **탐지** → 모델에 즉시 주입(additionalContext) + verify-required 상태 기록 |
|
|
138
|
+
| 결정론 게이트 | **auto-commit verify 게이트**(verify 통과 전 커밋 거부) · **Stop 훅** verify-skip 경고/차단 · **PR 테스트 게이트**(`gh pr create` 포함) · **scope-guard**(SPEC 범위 밖 편집 감시) |
|
|
139
|
+
| 리뷰 + 수렴 루프 | 12개 전문 리뷰어 병렬 실행 → findings P1=0까지 루프. 라운드 캡 없음. run/verify 상태는 `.vibe/metrics/run-ledger.json`에 추적. Stuck이면 사용자에게 질문, 절대 조용히 넘어가지 않음. |
|
|
140
140
|
|
|
141
141
|
---
|
|
142
142
|
|
|
143
143
|
## 주요 기능
|
|
144
144
|
|
|
145
|
-
**40+ 에이전트** — 탐색, 구현, 아키텍처, 병렬 코드 리뷰, UI/UX 분석, 보안 감사, Figma 분석/빌드.
|
|
145
|
+
**40+ 에이전트** — 탐색, 구현, 아키텍처, 병렬 코드 리뷰, UI/UX 분석, 보안 감사, Figma 분석/빌드. UI·Figma·Event 그룹(18개)은 전역 설치에서 제외되고, `vibe init`이 스택/capability가 맞는 프로젝트에만 로컬(`.claude/agents/`)로 설치 — 비해당 프로젝트의 컨텍스트를 점유하지 않습니다.
|
|
146
146
|
|
|
147
147
|
**44개 스킬** — 한 번에 다 로드되지 않음. 3-tier 시스템으로 컨텍스트 과부하 방지:
|
|
148
148
|
|
|
@@ -45,6 +45,29 @@ export declare function cleanupDuplicateSkillDirs(skillsDir: string): void;
|
|
|
45
45
|
* @param allowedSkills - 복사할 스킬 이름 목록
|
|
46
46
|
*/
|
|
47
47
|
export declare function copySkillsFiltered(src: string, dest: string, allowedSkills: ReadonlyArray<string>): void;
|
|
48
|
+
/**
|
|
49
|
+
* optional 스킬 정리 결정 결과
|
|
50
|
+
*/
|
|
51
|
+
export type OptionalSkillAction = 'removed' | 'skipped-user-modified' | 'skipped-not-vibe' | 'notice';
|
|
52
|
+
export interface OptionalSkillResult {
|
|
53
|
+
name: string;
|
|
54
|
+
action: OptionalSkillAction;
|
|
55
|
+
reason: string;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* 전역 스킬 디렉토리에서 optional 스킬을 정리한다.
|
|
59
|
+
*
|
|
60
|
+
* 안전 규칙:
|
|
61
|
+
* - vibe 소유이고 (SKILL.md `name:` 매치)
|
|
62
|
+
* - 배송된 내용과 동일(사용자 미수정)인 경우에만 삭제
|
|
63
|
+
* - 그 외에는 notice 로그만 남기고 보존
|
|
64
|
+
*
|
|
65
|
+
* @param globalSkillsDir - 전역 CLI 스킬 디렉토리 (e.g. ~/.claude/skills)
|
|
66
|
+
* @param optionalSkills - 정리 대상 스킬 이름 목록
|
|
67
|
+
* @param shippedSkillsDir - 패키지 내 skills/ 디렉토리 (비교 기준)
|
|
68
|
+
* @param dryRun - true이면 실제 삭제 없이 결과만 반환
|
|
69
|
+
*/
|
|
70
|
+
export declare function cleanupOptionalSkills(globalSkillsDir: string, optionalSkills: ReadonlyArray<string>, shippedSkillsDir: string, dryRun?: boolean): OptionalSkillResult[];
|
|
48
71
|
/**
|
|
49
72
|
* Codex는 Vibe의 `user-invocable: false` 메타데이터를 직접 해석하지 않는다.
|
|
50
73
|
* 내부 체인 전용 스킬은 공식 Codex skill policy로 implicit invocation을 막는다.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs-utils.d.ts","sourceRoot":"","sources":["../../../src/cli/postinstall/fs-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AAE/E;;GAEG;AACH,eAAO,MAAM,gBAAgB,2BAAqB,CAAC;AAEnD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAkB3D;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAI3C;AAKD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAahE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAIpD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAYnE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,GAChC,IAAI,CAON;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAOjE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,GACnC,IAAI,CAUN;AAqCD;;;GAGG;AACH,wBAAgB,iCAAiC,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAWzE"}
|
|
1
|
+
{"version":3,"file":"fs-utils.d.ts","sourceRoot":"","sources":["../../../src/cli/postinstall/fs-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AAE/E;;GAEG;AACH,eAAO,MAAM,gBAAgB,2BAAqB,CAAC;AAEnD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAkB3D;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAI3C;AAKD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAahE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAIpD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAYnE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,GAChC,IAAI,CAON;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAOjE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,GACnC,IAAI,CAUN;AAED;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,uBAAuB,GAAG,kBAAkB,GAAG,QAAQ,CAAC;AAEtG,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,mBAAmB,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB;AA0CD;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CACnC,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,aAAa,CAAC,MAAM,CAAC,EACrC,gBAAgB,EAAE,MAAM,EACxB,MAAM,UAAQ,GACb,mBAAmB,EAAE,CA2BvB;AAqCD;;;GAGG;AACH,wBAAgB,iCAAiC,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAWzE"}
|
|
@@ -131,6 +131,77 @@ export function copySkillsFiltered(src, dest, allowedSkills) {
|
|
|
131
131
|
copySkillsOverwrite(srcPath, destPath);
|
|
132
132
|
}
|
|
133
133
|
}
|
|
134
|
+
/**
|
|
135
|
+
* 설치된 스킬이 vibe 소유인지 판단한다.
|
|
136
|
+
*
|
|
137
|
+
* 판단 기준 (보수적): 배송된 스킬 이름 집합에 포함되고
|
|
138
|
+
* SKILL.md의 `name:` frontmatter가 디렉토리 이름과 일치하면 vibe 소유로 간주한다.
|
|
139
|
+
* 조건을 하나라도 충족하지 못하면 false를 반환한다.
|
|
140
|
+
*/
|
|
141
|
+
function isVibeOwnedSkill(skillDir, skillName, vibeSkillNames) {
|
|
142
|
+
if (!vibeSkillNames.has(skillName))
|
|
143
|
+
return false;
|
|
144
|
+
const skillMdPath = path.join(skillDir, 'SKILL.md');
|
|
145
|
+
if (!fs.existsSync(skillMdPath))
|
|
146
|
+
return false;
|
|
147
|
+
const content = fs.readFileSync(skillMdPath, 'utf-8');
|
|
148
|
+
const match = content.match(/^name:\s*(.+?)\s*$/m);
|
|
149
|
+
return match !== null && match[1] === skillName;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* 설치된 스킬이 사용자에 의해 수정되었는지 판단한다.
|
|
153
|
+
*
|
|
154
|
+
* 배송된 스킬의 SKILL.md 내용과 설치된 것의 내용을 비교한다.
|
|
155
|
+
* 배송 소스를 찾을 수 없으면 안전하게 수정됨으로 간주한다.
|
|
156
|
+
*/
|
|
157
|
+
function isUserModified(installedSkillDir, shippedSkillsDir, skillName) {
|
|
158
|
+
const installedPath = path.join(installedSkillDir, 'SKILL.md');
|
|
159
|
+
const shippedPath = path.join(shippedSkillsDir, skillName, 'SKILL.md');
|
|
160
|
+
if (!fs.existsSync(shippedPath))
|
|
161
|
+
return true; // 배송본 없음 → 보수적으로 수정됨 취급
|
|
162
|
+
if (!fs.existsSync(installedPath))
|
|
163
|
+
return false;
|
|
164
|
+
const installed = fs.readFileSync(installedPath, 'utf-8');
|
|
165
|
+
const shipped = fs.readFileSync(shippedPath, 'utf-8');
|
|
166
|
+
return installed !== shipped;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* 전역 스킬 디렉토리에서 optional 스킬을 정리한다.
|
|
170
|
+
*
|
|
171
|
+
* 안전 규칙:
|
|
172
|
+
* - vibe 소유이고 (SKILL.md `name:` 매치)
|
|
173
|
+
* - 배송된 내용과 동일(사용자 미수정)인 경우에만 삭제
|
|
174
|
+
* - 그 외에는 notice 로그만 남기고 보존
|
|
175
|
+
*
|
|
176
|
+
* @param globalSkillsDir - 전역 CLI 스킬 디렉토리 (e.g. ~/.claude/skills)
|
|
177
|
+
* @param optionalSkills - 정리 대상 스킬 이름 목록
|
|
178
|
+
* @param shippedSkillsDir - 패키지 내 skills/ 디렉토리 (비교 기준)
|
|
179
|
+
* @param dryRun - true이면 실제 삭제 없이 결과만 반환
|
|
180
|
+
*/
|
|
181
|
+
export function cleanupOptionalSkills(globalSkillsDir, optionalSkills, shippedSkillsDir, dryRun = false) {
|
|
182
|
+
const results = [];
|
|
183
|
+
if (!fs.existsSync(globalSkillsDir))
|
|
184
|
+
return results;
|
|
185
|
+
const vibeSkillNames = new Set(optionalSkills);
|
|
186
|
+
for (const skillName of optionalSkills) {
|
|
187
|
+
const skillDir = path.join(globalSkillsDir, skillName);
|
|
188
|
+
if (!fs.existsSync(skillDir))
|
|
189
|
+
continue;
|
|
190
|
+
if (!isVibeOwnedSkill(skillDir, skillName, vibeSkillNames)) {
|
|
191
|
+
results.push({ name: skillName, action: 'skipped-not-vibe', reason: 'SKILL.md name mismatch — not vibe-owned' });
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
if (isUserModified(skillDir, shippedSkillsDir, skillName)) {
|
|
195
|
+
results.push({ name: skillName, action: 'skipped-user-modified', reason: 'SKILL.md differs from shipped — user-modified, preserved' });
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
if (!dryRun) {
|
|
199
|
+
fs.rmSync(skillDir, { recursive: true, force: true });
|
|
200
|
+
}
|
|
201
|
+
results.push({ name: skillName, action: 'removed', reason: 'vibe-owned optional skill, content unchanged' });
|
|
202
|
+
}
|
|
203
|
+
return results;
|
|
204
|
+
}
|
|
134
205
|
const CODEX_POLICY_MARKER = '# VIBE managed Codex skill policy';
|
|
135
206
|
const CODEX_POLICY_CONTENT = `${CODEX_POLICY_MARKER}
|
|
136
207
|
policy:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs-utils.js","sourceRoot":"","sources":["../../../src/cli/postinstall/fs-utils.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fs-utils.js","sourceRoot":"","sources":["../../../src/cli/postinstall/fs-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { describe, expect, it } from 'vitest';
|
|
|
2
2
|
import fs from 'fs';
|
|
3
3
|
import os from 'os';
|
|
4
4
|
import path from 'path';
|
|
5
|
-
import { applyCodexSkillInvocationPolicies } from './fs-utils.js';
|
|
5
|
+
import { applyCodexSkillInvocationPolicies, cleanupOptionalSkills } from './fs-utils.js';
|
|
6
6
|
function writeSkill(root, name, frontmatter) {
|
|
7
7
|
const skillDir = path.join(root, name);
|
|
8
8
|
fs.mkdirSync(skillDir, { recursive: true });
|
|
@@ -28,4 +28,72 @@ describe('postinstall fs-utils', () => {
|
|
|
28
28
|
expect(fs.existsSync(path.join(skillDir, 'agents', 'openai.yaml'))).toBe(false);
|
|
29
29
|
});
|
|
30
30
|
});
|
|
31
|
+
describe('cleanupOptionalSkills', () => {
|
|
32
|
+
const OPTIONAL = ['commit-push-pr', 'git-worktree', 'tool-fallback', 'context7-usage'];
|
|
33
|
+
const SKILL_CONTENT = (name) => `---\nname: ${name}\ndescription: ${name}\n---\n\nBody\n`;
|
|
34
|
+
function setupDirs() {
|
|
35
|
+
const base = fs.mkdtempSync(path.join(os.tmpdir(), 'vibe-optional-'));
|
|
36
|
+
return {
|
|
37
|
+
globalSkillsDir: path.join(base, 'global'),
|
|
38
|
+
shippedSkillsDir: path.join(base, 'shipped'),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
it('removes vibe-owned optional skill when content matches shipped version', () => {
|
|
42
|
+
const { globalSkillsDir, shippedSkillsDir } = setupDirs();
|
|
43
|
+
const skillName = 'commit-push-pr';
|
|
44
|
+
const content = SKILL_CONTENT(skillName);
|
|
45
|
+
// 설치된 스킬 (shipped와 동일)
|
|
46
|
+
const installDir = path.join(globalSkillsDir, skillName);
|
|
47
|
+
fs.mkdirSync(installDir, { recursive: true });
|
|
48
|
+
fs.writeFileSync(path.join(installDir, 'SKILL.md'), content);
|
|
49
|
+
// shipped 스킬
|
|
50
|
+
const shippedDir = path.join(shippedSkillsDir, skillName);
|
|
51
|
+
fs.mkdirSync(shippedDir, { recursive: true });
|
|
52
|
+
fs.writeFileSync(path.join(shippedDir, 'SKILL.md'), content);
|
|
53
|
+
const results = cleanupOptionalSkills(globalSkillsDir, OPTIONAL, shippedSkillsDir);
|
|
54
|
+
expect(results[0].action).toBe('removed');
|
|
55
|
+
expect(fs.existsSync(installDir)).toBe(false);
|
|
56
|
+
});
|
|
57
|
+
it('preserves user-modified optional skill and returns skipped-user-modified', () => {
|
|
58
|
+
const { globalSkillsDir, shippedSkillsDir } = setupDirs();
|
|
59
|
+
const skillName = 'git-worktree';
|
|
60
|
+
const installDir = path.join(globalSkillsDir, skillName);
|
|
61
|
+
fs.mkdirSync(installDir, { recursive: true });
|
|
62
|
+
fs.writeFileSync(path.join(installDir, 'SKILL.md'), SKILL_CONTENT(skillName) + '\n## User Added Section\n');
|
|
63
|
+
const shippedDir = path.join(shippedSkillsDir, skillName);
|
|
64
|
+
fs.mkdirSync(shippedDir, { recursive: true });
|
|
65
|
+
fs.writeFileSync(path.join(shippedDir, 'SKILL.md'), SKILL_CONTENT(skillName));
|
|
66
|
+
const results = cleanupOptionalSkills(globalSkillsDir, OPTIONAL, shippedSkillsDir);
|
|
67
|
+
const result = results.find(r => r.name === skillName);
|
|
68
|
+
expect(result?.action).toBe('skipped-user-modified');
|
|
69
|
+
expect(fs.existsSync(installDir)).toBe(true);
|
|
70
|
+
});
|
|
71
|
+
it('skips skill whose SKILL.md name does not match directory name', () => {
|
|
72
|
+
const { globalSkillsDir, shippedSkillsDir } = setupDirs();
|
|
73
|
+
const skillName = 'tool-fallback';
|
|
74
|
+
// name이 디렉토리명과 다름 → not vibe-owned
|
|
75
|
+
const installDir = path.join(globalSkillsDir, skillName);
|
|
76
|
+
fs.mkdirSync(installDir, { recursive: true });
|
|
77
|
+
fs.writeFileSync(path.join(installDir, 'SKILL.md'), '---\nname: something-else\ndescription: custom\n---\n\nBody\n');
|
|
78
|
+
const results = cleanupOptionalSkills(globalSkillsDir, OPTIONAL, shippedSkillsDir);
|
|
79
|
+
const result = results.find(r => r.name === skillName);
|
|
80
|
+
expect(result?.action).toBe('skipped-not-vibe');
|
|
81
|
+
expect(fs.existsSync(installDir)).toBe(true);
|
|
82
|
+
});
|
|
83
|
+
it('dryRun=true returns removed action without deleting directory', () => {
|
|
84
|
+
const { globalSkillsDir, shippedSkillsDir } = setupDirs();
|
|
85
|
+
const skillName = 'context7-usage';
|
|
86
|
+
const content = SKILL_CONTENT(skillName);
|
|
87
|
+
const installDir = path.join(globalSkillsDir, skillName);
|
|
88
|
+
fs.mkdirSync(installDir, { recursive: true });
|
|
89
|
+
fs.writeFileSync(path.join(installDir, 'SKILL.md'), content);
|
|
90
|
+
const shippedDir = path.join(shippedSkillsDir, skillName);
|
|
91
|
+
fs.mkdirSync(shippedDir, { recursive: true });
|
|
92
|
+
fs.writeFileSync(path.join(shippedDir, 'SKILL.md'), content);
|
|
93
|
+
const results = cleanupOptionalSkills(globalSkillsDir, OPTIONAL, shippedSkillsDir, true);
|
|
94
|
+
const result = results.find(r => r.name === skillName);
|
|
95
|
+
expect(result?.action).toBe('removed');
|
|
96
|
+
expect(fs.existsSync(installDir)).toBe(true); // dryRun이므로 실제 삭제 없음
|
|
97
|
+
});
|
|
98
|
+
});
|
|
31
99
|
//# sourceMappingURL=fs-utils.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs-utils.test.js","sourceRoot":"","sources":["../../../src/cli/postinstall/fs-utils.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,iCAAiC,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"fs-utils.test.js","sourceRoot":"","sources":["../../../src/cli/postinstall/fs-utils.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../src/cli/postinstall/main.ts"],"names":[],"mappings":";AACA;;GAEG;
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../src/cli/postinstall/main.ts"],"names":[],"mappings":";AACA;;GAEG;AAsCH;;GAEG;AACH,wBAAgB,IAAI,IAAI,IAAI,CAqL3B"}
|
|
@@ -6,8 +6,8 @@ import path from 'path';
|
|
|
6
6
|
import fs from 'fs';
|
|
7
7
|
import os from 'os';
|
|
8
8
|
import { fileURLToPath } from 'url';
|
|
9
|
-
import { getCoreConfigDir, ensureDir, copyDirRecursive, removeDirRecursive, copySkillsFiltered, removeLegacySkills, replaceTemplatesInDir, cleanupDuplicateSkillDirs, applyCodexSkillInvocationPolicies, } from './fs-utils.js';
|
|
10
|
-
import { GLOBAL_SKILLS, LEGACY_SKILL_DIRS, CONDITIONAL_AGENT_GROUPS } from './constants.js';
|
|
9
|
+
import { getCoreConfigDir, ensureDir, copyDirRecursive, removeDirRecursive, copySkillsFiltered, removeLegacySkills, replaceTemplatesInDir, cleanupDuplicateSkillDirs, applyCodexSkillInvocationPolicies, cleanupOptionalSkills, } from './fs-utils.js';
|
|
10
|
+
import { GLOBAL_SKILLS, GLOBAL_SKILLS_OPTIONAL, LEGACY_SKILL_DIRS, CONDITIONAL_AGENT_GROUPS } from './constants.js';
|
|
11
11
|
import { cleanupGlobalSettingsHooks, ensureGlobalEnvSettings } from './global-config.js';
|
|
12
12
|
import { seedInlineSkills } from './inline-skills.js';
|
|
13
13
|
import { generateCursorRules } from './cursor-rules.js';
|
|
@@ -82,6 +82,16 @@ export function main() {
|
|
|
82
82
|
if (fs.existsSync(skillsSource)) {
|
|
83
83
|
ensureDir(sklsDir);
|
|
84
84
|
removeLegacySkills(sklsDir, LEGACY_SKILL_DIRS);
|
|
85
|
+
// optional 스킬 정리 — vibe 소유이고 사용자 미수정인 경우에만 삭제
|
|
86
|
+
const cleanupResults = cleanupOptionalSkills(sklsDir, GLOBAL_SKILLS_OPTIONAL, skillsSource);
|
|
87
|
+
for (const r of cleanupResults) {
|
|
88
|
+
if (r.action === 'removed') {
|
|
89
|
+
console.log(` optional skill removed: ${r.name}`);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
console.log(` optional skill notice [${r.name}]: ${r.reason}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
85
95
|
copySkillsFiltered(skillsSource, sklsDir, GLOBAL_SKILLS);
|
|
86
96
|
replaceTemplatesInDir(sklsDir);
|
|
87
97
|
if (label === 'codex')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../../src/cli/postinstall/main.ts"],"names":[],"mappings":";AACA;;GAEG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,yBAAyB,EACzB,iCAAiC,
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../../src/cli/postinstall/main.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,11 @@ import { describe, it, expect } from 'vitest';
|
|
|
2
2
|
import fs from 'fs';
|
|
3
3
|
import os from 'os';
|
|
4
4
|
import path from 'path';
|
|
5
|
+
import { fileURLToPath } from 'url';
|
|
5
6
|
import { buildCodexHooksConfig, installProjectCodexHooks } from './CodexHooks.js';
|
|
7
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
8
|
+
// src/cli/setup/ → 3 levels up → repo root
|
|
9
|
+
const REPO_ROOT = path.resolve(path.dirname(__filename), '..', '..', '..');
|
|
6
10
|
describe('CodexHooks', () => {
|
|
7
11
|
it('builds native Codex hooks that route through the vibe adapter', () => {
|
|
8
12
|
const config = buildCodexHooksConfig('/opt/vibe');
|
|
@@ -19,5 +23,28 @@ describe('CodexHooks', () => {
|
|
|
19
23
|
const config = JSON.parse(fs.readFileSync(hooksPath, 'utf-8'));
|
|
20
24
|
expect(config.hooks.PreToolUse[0].hooks[0].command).toContain('/opt/vibe/hooks/scripts/codex-hook-adapter.js');
|
|
21
25
|
});
|
|
26
|
+
// .codex/hooks.json은 머신별 절대 경로를 담는 로컬 설치 아티팩트
|
|
27
|
+
// (.claude/settings.local.json과 동급, gitignored). 도그푸딩된 로컬 파일이
|
|
28
|
+
// 있을 때만 인스톨러 출력과의 정합을 검증한다 — CI에는 파일이 없으므로 skip.
|
|
29
|
+
const localHooksPath = path.join(REPO_ROOT, '.codex', 'hooks.json');
|
|
30
|
+
it.skipIf(!fs.existsSync(localHooksPath))('local .codex/hooks.json is in sync with what installProjectCodexHooks would generate', () => {
|
|
31
|
+
const committed = JSON.parse(fs.readFileSync(localHooksPath, 'utf-8'));
|
|
32
|
+
// Verify structure: all 5 events present with adapter command
|
|
33
|
+
const events = ['SessionStart', 'UserPromptSubmit', 'PreToolUse', 'PostToolUse', 'Stop'];
|
|
34
|
+
for (const event of events) {
|
|
35
|
+
const cmd = committed.hooks[event][0].hooks[0].command;
|
|
36
|
+
expect(cmd).toContain('codex-hook-adapter.js');
|
|
37
|
+
expect(cmd).toContain(event);
|
|
38
|
+
}
|
|
39
|
+
// Verify all script paths in the committed file point to existing files
|
|
40
|
+
for (const event of events) {
|
|
41
|
+
const cmd = committed.hooks[event][0].hooks[0].command;
|
|
42
|
+
// extract quoted path: node "..." EventName
|
|
43
|
+
const match = cmd.match(/node\s+"([^"]+)"/);
|
|
44
|
+
if (match) {
|
|
45
|
+
expect(fs.existsSync(match[1]), `Script path missing: ${match[1]} (from ${event} hook)`).toBe(true);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
});
|
|
22
49
|
});
|
|
23
50
|
//# sourceMappingURL=CodexHooks.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodexHooks.test.js","sourceRoot":"","sources":["../../../src/cli/setup/CodexHooks.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAElF,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,MAAM,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;QAElD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAC7F,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QACxF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC5E,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC9E,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;QAEhF,wBAAwB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAEnD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAA6C,CAAC;QAC3G,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,+CAA+C,CAAC,CAAC;IACjH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"CodexHooks.test.js","sourceRoot":"","sources":["../../../src/cli/setup/CodexHooks.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -96,7 +96,7 @@ function adaptCodexInvocation(section) {
|
|
|
96
96
|
.replace('| Analyze | `/vibe.analyze` (code, docs, web, Figma) |', '| Analyze | `$vibe.analyze` or `/skills` -> `vibe.analyze` |')
|
|
97
97
|
.replace('| Harness check | `/vibe.harness` |', '| Harness check | `$vibe.harness` or `/skills` -> `vibe.harness` |')
|
|
98
98
|
.replace('| Project structure | `/vibe.scaffold` |', '| Project structure | `$vibe.scaffold` or `/skills` -> `vibe.scaffold` |')
|
|
99
|
-
.replace('At
|
|
99
|
+
.replace('At 85%+ context: save_memory → /new → /vibe.utils --continue (raised from 70% — /new discards KV prefix cache; compact less often to preserve cache reuse)', 'At 85%+ context: save_memory → /new → invoke `$vibe.utils --continue` or choose `vibe.utils` from `/skills`. (raised from 70% — /new discards KV prefix cache; compact less often to preserve cache reuse)')
|
|
100
100
|
.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}/`');
|
|
101
101
|
}
|
|
102
102
|
function adaptToCodex(section) {
|
|
@@ -310,7 +310,7 @@ function buildGlobalSection(language) {
|
|
|
310
310
|
lines.push('## Quality');
|
|
311
311
|
lines.push('');
|
|
312
312
|
lines.push('Convergence: loop until P1=0. Changed files only.');
|
|
313
|
-
lines.push('At
|
|
313
|
+
lines.push('At 85%+ context: save_memory → /new → /vibe.utils --continue (raised from 70% — /new discards KV prefix cache; compact less often to preserve cache reuse)');
|
|
314
314
|
lines.push('');
|
|
315
315
|
lines.push('## Git');
|
|
316
316
|
lines.push('');
|