@su-record/vibe 2.9.36 → 2.9.38
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 +1 -1
- package/README.en.md +1 -1
- package/README.md +1 -1
- package/agents/compounder.md +6 -6
- package/agents/diagrammer.md +2 -2
- package/agents/e2e-tester.md +5 -5
- package/agents/qa/acceptance-tester.md +2 -2
- package/agents/refactor-cleaner.md +2 -2
- package/agents/tester.md +1 -1
- package/agents/ui/ui-antipattern-detector.md +1 -1
- package/agents/ui/ui-design-system-gen.md +3 -3
- package/agents/ui/ui-industry-analyzer.md +1 -1
- package/agents/ui/ui-layout-architect.md +1 -1
- package/agents/ui/ui-stack-implementer.md +1 -1
- package/commands/vibe.analyze.md +1 -1
- package/commands/vibe.contract.md +2 -2
- package/commands/vibe.figma.md +3 -3
- package/commands/vibe.harness.md +3 -3
- package/commands/vibe.regress.md +2 -2
- package/commands/vibe.review.md +4 -4
- package/commands/vibe.run.md +27 -27
- package/commands/vibe.scaffold.md +1 -1
- package/commands/vibe.spec.md +38 -38
- package/commands/vibe.trace.md +14 -14
- package/commands/vibe.utils.md +3 -3
- package/commands/vibe.verify.md +18 -18
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +12 -9
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +5 -3
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/llm/gpt-commands.js +1 -1
- package/dist/cli/postinstall/constants.js +1 -1
- package/dist/cli/postinstall/global-config.d.ts.map +1 -1
- package/dist/cli/postinstall/global-config.js +21 -15
- package/dist/cli/postinstall/global-config.js.map +1 -1
- package/dist/cli/setup/LegacyMigration.d.ts.map +1 -1
- package/dist/cli/setup/LegacyMigration.js +28 -6
- package/dist/cli/setup/LegacyMigration.js.map +1 -1
- package/dist/cli/utils.d.ts +6 -0
- package/dist/cli/utils.d.ts.map +1 -1
- package/dist/cli/utils.js +23 -0
- package/dist/cli/utils.js.map +1 -1
- package/dist/infra/lib/ReviewRace.js +1 -1
- package/dist/infra/lib/codex-proxy.js +1 -1
- package/dist/infra/lib/gpt/chat.d.ts +1 -1
- package/dist/infra/lib/gpt/chat.js +24 -24
- package/dist/infra/lib/gpt/chat.js.map +1 -1
- package/dist/infra/lib/gpt/orchestration.js +1 -1
- package/dist/infra/lib/gpt/specializations.d.ts +2 -2
- package/dist/infra/lib/gpt/specializations.js +3 -3
- package/hooks/scripts/lib/scope-from-spec.js +30 -0
- package/hooks/scripts/llm-orchestrate.js +2 -2
- package/hooks/scripts/prompt-dispatcher.js +15 -0
- package/hooks/scripts/session-start.js +7 -5
- package/hooks/scripts/utils.js +6 -1
- package/package.json +1 -1
- package/skills/arch-guard/SKILL.md +2 -2
- package/skills/arch-guard/agents/rule-generator.md +3 -3
- package/skills/arch-guard/scripts/check-boundaries.js +1 -1
- package/skills/arch-guard/templates/arch-rules.json +1 -1
- package/skills/capability-loop/SKILL.md +2 -2
- package/skills/capability-loop/templates/capability-spec.md +1 -1
- package/skills/claude-md-guide/SKILL.md +2 -2
- package/skills/design-audit/SKILL.md +3 -3
- package/skills/design-critique/SKILL.md +2 -2
- package/skills/design-distill/SKILL.md +1 -1
- package/skills/design-normalize/SKILL.md +4 -4
- package/skills/design-polish/SKILL.md +2 -2
- package/skills/design-teach/SKILL.md +6 -6
- package/skills/design-teach/templates/design-context.json +1 -1
- package/skills/devlog/SKILL.md +1 -1
- package/skills/event-planning/SKILL.md +1 -1
- package/skills/exec-plan/SKILL.md +5 -5
- package/skills/exec-plan/agents/decomposer.md +1 -1
- package/skills/exec-plan/templates/plan.md +2 -2
- package/skills/parallel-research/SKILL.md +3 -3
- package/skills/parallel-research/orchestrator.md +1 -1
- package/skills/parallel-research/templates/paper.md +1 -1
- package/skills/priority-todos/SKILL.md +1 -1
- package/skills/vibe-contract/SKILL.md +6 -6
- package/skills/vibe-interview/SKILL.md +6 -6
- package/skills/vibe-interview/checklists/feature.md +1 -1
- package/skills/vibe-plan/SKILL.md +10 -10
- package/skills/vibe-regress/SKILL.md +5 -5
- package/skills/vibe-regress/templates/bug.md +1 -1
- package/skills/vibe-regress/templates/test-jest.md +1 -1
- package/skills/vibe-regress/templates/test-vitest.md +1 -1
- package/skills/vibe-spec/SKILL.md +45 -45
- package/skills/vibe-spec-review/SKILL.md +21 -21
- package/skills/vibe-test/SKILL.md +1 -1
- package/vibe/constitution.md +2 -2
- package/vibe/templates/claudemd-template.md +4 -4
- package/vibe/templates/constitution-template.md +2 -2
- package/vibe/templates/feature-template.md +1 -1
|
@@ -12,6 +12,32 @@ import path from 'path';
|
|
|
12
12
|
|
|
13
13
|
const ACTIVE_STATUSES = new Set(['pending', 'in-progress', 'in_progress', 'active', 'running']);
|
|
14
14
|
|
|
15
|
+
/**
|
|
16
|
+
* scope-guard auto-derive 활성 여부.
|
|
17
|
+
*
|
|
18
|
+
* 기본값은 **off**. 사용자가 `.vibe/config.json` 의 `scopeGuard.enabled = true` 로
|
|
19
|
+
* 명시적으로 켤 때만 SPEC → scope.json 자동 합성을 수행한다. 이전 동작(자동 ON)은
|
|
20
|
+
* SPEC 외부 파일 편집에 매번 경고를 띄워 다수 사용자에게 노이즈가 됐기 때문.
|
|
21
|
+
*
|
|
22
|
+
* 이미 `auto: false` scope.json 을 직접 만들어 둔 사용자는 영향 없음 — scope-guard.js
|
|
23
|
+
* 자체는 scope.json 존재 여부만 본다.
|
|
24
|
+
*/
|
|
25
|
+
export function isScopeGuardEnabled(projectDir) {
|
|
26
|
+
try {
|
|
27
|
+
const candidates = [
|
|
28
|
+
path.join(projectDir, '.vibe', 'config.json'),
|
|
29
|
+
path.join(projectDir, '.claude', 'vibe', 'config.json'),
|
|
30
|
+
path.join(projectDir, '.coco', 'vibe', 'config.json'),
|
|
31
|
+
];
|
|
32
|
+
for (const p of candidates) {
|
|
33
|
+
if (!fs.existsSync(p)) continue;
|
|
34
|
+
const cfg = JSON.parse(fs.readFileSync(p, 'utf-8'));
|
|
35
|
+
if (cfg && cfg.scopeGuard && cfg.scopeGuard.enabled === true) return true;
|
|
36
|
+
}
|
|
37
|
+
} catch { /* ignore */ }
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
|
|
15
41
|
/**
|
|
16
42
|
* Vibe 에셋 루트 해석 — `.vibe/` (SSOT) 우선, legacy `.claude/vibe/`, `.coco/vibe/` fallback.
|
|
17
43
|
* 반환값은 projectDir 기준 상대 경로 문자열 (예: `.vibe`, `.claude/vibe`).
|
|
@@ -263,6 +289,10 @@ export function syncScopeFile(projectDir) {
|
|
|
263
289
|
import { fileURLToPath } from 'url';
|
|
264
290
|
if (process.argv[1] && fileURLToPath(import.meta.url) === path.resolve(process.argv[1])) {
|
|
265
291
|
const dir = process.argv[2] || process.env.CLAUDE_PROJECT_DIR || process.cwd();
|
|
292
|
+
if (!isScopeGuardEnabled(dir)) {
|
|
293
|
+
console.log('[scope-sync] · scopeGuard.enabled !== true — skipping (set in .vibe/config.json to opt in)');
|
|
294
|
+
process.exit(0);
|
|
295
|
+
}
|
|
266
296
|
const result = syncScopeFile(dir);
|
|
267
297
|
const label = {
|
|
268
298
|
created: '✓ scope.json created',
|
|
@@ -101,7 +101,7 @@ function isSimplePrompt(prompt) {
|
|
|
101
101
|
function resolveModel(providerName, config) {
|
|
102
102
|
if (providerName === 'gpt-spark') return config.models?.gptCodexSpark || 'gpt-5.3-codex-spark';
|
|
103
103
|
if (providerName === 'gpt-codex') return config.models?.gptCodex || 'gpt-5.3-codex';
|
|
104
|
-
if (providerName === 'gpt') return config.models?.gpt || 'gpt-5.
|
|
104
|
+
if (providerName === 'gpt') return config.models?.gpt || 'gpt-5.5';
|
|
105
105
|
if (providerName === 'gemini') return config.models?.gemini || 'gemini-3.1-pro-preview';
|
|
106
106
|
if (providerName === 'claude') return 'claude';
|
|
107
107
|
return providerName;
|
|
@@ -352,7 +352,7 @@ async function callProvider(providerName, prompt, sysPrompt, jsonMode, timeoutMs
|
|
|
352
352
|
} else if (providerName === 'gpt-codex') {
|
|
353
353
|
model = vibeConfig.models?.gptCodex || process.env.GPT_CODEX_MODEL || 'gpt-5.3-codex';
|
|
354
354
|
} else {
|
|
355
|
-
model = vibeConfig.models?.gpt || process.env.GPT_MODEL || 'gpt-5.
|
|
355
|
+
model = vibeConfig.models?.gpt || process.env.GPT_MODEL || 'gpt-5.5';
|
|
356
356
|
}
|
|
357
357
|
return await callCodexCli(prompt, sysPrompt, jsonMode, model, timeoutMs);
|
|
358
358
|
}
|
|
@@ -42,6 +42,21 @@ try {
|
|
|
42
42
|
|
|
43
43
|
if (!prompt) process.exit(0);
|
|
44
44
|
|
|
45
|
+
// 레거시 SSOT 통합 — `/vibe.*` 진입 시 `.claude/vibe/`·`.coco/vibe/` → `.vibe/` 자동 이동.
|
|
46
|
+
// `vibe init`/`update` 와 동일한 `consolidateLegacyVibe` (dist/cli/setup/LegacyMigration.js) 를 직접 재사용. Idempotent.
|
|
47
|
+
if (/^\s*\/vibe\b/i.test(prompt)) {
|
|
48
|
+
try {
|
|
49
|
+
const projectDir = process.env.CLAUDE_PROJECT_DIR || process.env.COCO_PROJECT_DIR || process.cwd();
|
|
50
|
+
const utils = await import('./utils.js');
|
|
51
|
+
const CLI_BASE = utils.getCliBaseUrl();
|
|
52
|
+
const { consolidateLegacyVibe } = await import(`${CLI_BASE}setup/LegacyMigration.js`);
|
|
53
|
+
const moved = consolidateLegacyVibe(projectDir);
|
|
54
|
+
if (moved.length > 0) {
|
|
55
|
+
process.stdout.write(`[vibe] Migrated legacy dirs → .vibe/ (${moved.join(', ')})\n`);
|
|
56
|
+
}
|
|
57
|
+
} catch { /* migration is best-effort */ }
|
|
58
|
+
}
|
|
59
|
+
|
|
45
60
|
// 패턴 → 실행할 스크립트 매핑
|
|
46
61
|
// 각 항목: { pattern, script, args, label }
|
|
47
62
|
const DISPATCH_RULES = [
|
|
@@ -94,12 +94,14 @@ async function main() {
|
|
|
94
94
|
}
|
|
95
95
|
}
|
|
96
96
|
|
|
97
|
-
// Scope sync —
|
|
97
|
+
// Scope sync — 사용자가 .vibe/config.json scopeGuard.enabled=true 로 켰을 때만 동작.
|
|
98
98
|
try {
|
|
99
|
-
const { syncScopeFile } = await import('./lib/scope-from-spec.js');
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
99
|
+
const { syncScopeFile, isScopeGuardEnabled } = await import('./lib/scope-from-spec.js');
|
|
100
|
+
if (isScopeGuardEnabled(PROJECT_DIR)) {
|
|
101
|
+
const result = syncScopeFile(PROJECT_DIR);
|
|
102
|
+
if (result.action === 'created' || result.action === 'updated' || result.action === 'removed') {
|
|
103
|
+
console.log(`\n🚧 Scope ${result.action} from active SPECs (${path.relative(PROJECT_DIR, path.join(projectVibeRoot(PROJECT_DIR), 'scope.json'))})`);
|
|
104
|
+
}
|
|
103
105
|
}
|
|
104
106
|
} catch { /* scope sync is best-effort */ }
|
|
105
107
|
|
package/hooks/scripts/utils.js
CHANGED
|
@@ -219,6 +219,10 @@ export function getLibBaseUrl() {
|
|
|
219
219
|
return getPackageUrl(path.join('dist', 'infra', 'lib'), 'constants.js');
|
|
220
220
|
}
|
|
221
221
|
|
|
222
|
+
export function getCliBaseUrl() {
|
|
223
|
+
return getPackageUrl(path.join('dist', 'cli'), 'index.js');
|
|
224
|
+
}
|
|
225
|
+
|
|
222
226
|
// ─── Hook Trace Logging ───
|
|
223
227
|
|
|
224
228
|
const HOOK_TRACE_PATH = path.join(VIBE_HOME_DIR, 'hook-traces.jsonl');
|
|
@@ -264,7 +268,8 @@ const MAX_COST_SIZE_BYTES = 5 * 1024 * 1024; // 5MB rotation
|
|
|
264
268
|
|
|
265
269
|
// 1K 토큰당 USD (추정치, 2026-04 기준)
|
|
266
270
|
const COST_PER_1K_TOKENS = {
|
|
267
|
-
'gpt-5.
|
|
271
|
+
'gpt-5.5': { input: 0.005, output: 0.030 },
|
|
272
|
+
'gpt-5.5-pro': { input: 0.030, output: 0.180 },
|
|
268
273
|
'gpt-5.3-codex': { input: 0.003, output: 0.010 },
|
|
269
274
|
'gpt-5.3-codex-spark': { input: 0.001, output: 0.005 },
|
|
270
275
|
'gemini-3.1-pro-preview': { input: 0.00125, output: 0.005 },
|
package/package.json
CHANGED
|
@@ -152,11 +152,11 @@ describe('Architecture Boundaries', () => {
|
|
|
152
152
|
| File | Purpose |
|
|
153
153
|
|------|---------|
|
|
154
154
|
| `tests/arch-guard.test.ts` | Executable boundary tests |
|
|
155
|
-
| `.
|
|
155
|
+
| `.vibe/arch-rules.json` | Machine-readable rules (for CI) |
|
|
156
156
|
|
|
157
157
|
## Customization
|
|
158
158
|
|
|
159
|
-
Users can add custom rules to `.
|
|
159
|
+
Users can add custom rules to `.vibe/arch-rules.json`:
|
|
160
160
|
|
|
161
161
|
```json
|
|
162
162
|
{
|
|
@@ -7,17 +7,17 @@ tools: [Read]
|
|
|
7
7
|
# Arch Rule Generator
|
|
8
8
|
|
|
9
9
|
## Role
|
|
10
|
-
Translates a detected architecture map into a precise, machine-checkable set of import boundary rules. Merges default rules for the detected pattern with any custom rules defined in `.
|
|
10
|
+
Translates a detected architecture map into a precise, machine-checkable set of import boundary rules. Merges default rules for the detected pattern with any custom rules defined in `.vibe/arch-rules.json`. Outputs a normalized rule set ready for the violation checker.
|
|
11
11
|
|
|
12
12
|
## Responsibilities
|
|
13
13
|
- Select default rule templates for the detected architecture pattern
|
|
14
|
-
- Merge with custom rules from `.
|
|
14
|
+
- Merge with custom rules from `.vibe/arch-rules.json` if present
|
|
15
15
|
- Resolve glob patterns to concrete layer names
|
|
16
16
|
- Deduplicate and normalize rule list
|
|
17
17
|
- Flag rules with low confidence (detected layer with no matching files)
|
|
18
18
|
|
|
19
19
|
## Input
|
|
20
|
-
Architecture map JSON from `arch-detector`, plus optional `.
|
|
20
|
+
Architecture map JSON from `arch-detector`, plus optional `.vibe/arch-rules.json` for user-defined overrides.
|
|
21
21
|
|
|
22
22
|
## Output
|
|
23
23
|
Normalized rule set JSON:
|
|
@@ -53,7 +53,7 @@ function resolveImport(fromFile, imp, baseDir) {
|
|
|
53
53
|
return path.resolve(path.dirname(fromFile), imp).replace(baseDir + path.sep, '').replace(/\\/g, '/');
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
const rulesPath = process.argv[2] || '.
|
|
56
|
+
const rulesPath = process.argv[2] || '.vibe/arch-rules.json';
|
|
57
57
|
const srcDir = path.resolve(process.argv[3] || 'src');
|
|
58
58
|
const baseDir = path.resolve('.');
|
|
59
59
|
|
|
@@ -115,7 +115,7 @@ Based on classification, build the appropriate artifact:
|
|
|
115
115
|
|
|
116
116
|
> **Problem**: The built capability didn't actually prevent the failure. This usually means the initial diagnosis was wrong (picked `Tool` when it needed `Guardrail`), or the failure has multiple missing capabilities.
|
|
117
117
|
>
|
|
118
|
-
> **Do NOT silently proceed** — a sub-standard capability log pollutes `.
|
|
118
|
+
> **Do NOT silently proceed** — a sub-standard capability log pollutes `.vibe/capabilities-log.md` and the failure will recur.
|
|
119
119
|
|
|
120
120
|
**Escalation loop:**
|
|
121
121
|
|
|
@@ -207,7 +207,7 @@ save_memory("capability-{name}", {
|
|
|
207
207
|
})
|
|
208
208
|
```
|
|
209
209
|
|
|
210
|
-
Update `.
|
|
210
|
+
Update `.vibe/capabilities-log.md`:
|
|
211
211
|
|
|
212
212
|
```markdown
|
|
213
213
|
## {date} — {capability-name}
|
|
@@ -108,7 +108,7 @@ Separate the collected information into 3 layers:
|
|
|
108
108
|
|
|
109
109
|
**Loaded only when working on a specific feature** → focus on what and why, leave how to the agent.
|
|
110
110
|
|
|
111
|
-
Storage location: `.
|
|
111
|
+
Storage location: `.vibe/specs/YYYY-MM-DD-{topic}.md`
|
|
112
112
|
|
|
113
113
|
```markdown
|
|
114
114
|
# {Feature Name} SPEC
|
|
@@ -124,7 +124,7 @@ Storage location: `.claude/vibe/specs/YYYY-MM-DD-{topic}.md`
|
|
|
124
124
|
|
|
125
125
|
**Per-session task list** → 2-5 minute units, with file paths specified.
|
|
126
126
|
|
|
127
|
-
Storage location: `.
|
|
127
|
+
Storage location: `.vibe/specs/{name}-execplan.md`
|
|
128
128
|
|
|
129
129
|
```markdown
|
|
130
130
|
# Execution Plan
|
|
@@ -131,11 +131,11 @@ When running on mobile stacks (React Native, Flutter, iOS, Android):
|
|
|
131
131
|
|
|
132
132
|
Before running the audit:
|
|
133
133
|
|
|
134
|
-
1. **Read** `.
|
|
134
|
+
1. **Read** `.vibe/design-context.json`
|
|
135
135
|
- If missing → display: "Run `/design-teach` first for better results" → proceed with defaults
|
|
136
136
|
- If parse error → display warning → proceed with defaults → recommend `/design-teach`
|
|
137
137
|
- If present → weight findings by `audience.context`, `constraints.accessibility`, `brand.personality`
|
|
138
|
-
2. **Read** `.
|
|
138
|
+
2. **Read** `.vibe/design-system/*/MASTER.md` (if exists) for token reference
|
|
139
139
|
|
|
140
140
|
## Next Steps
|
|
141
141
|
|
|
@@ -148,5 +148,5 @@ Before running the audit:
|
|
|
148
148
|
## Important
|
|
149
149
|
|
|
150
150
|
- **Read-only**: This skill produces a report. It does NOT modify code.
|
|
151
|
-
- **Context-aware**: If `.
|
|
151
|
+
- **Context-aware**: If `.vibe/design-context.json` exists, findings are weighted by project brand and audience.
|
|
152
152
|
- **Incremental**: When run on `.` (changed files), only audits files in current diff.
|
|
@@ -118,7 +118,7 @@ When running on mobile stacks (React Native, Flutter, iOS, Android):
|
|
|
118
118
|
|
|
119
119
|
Before running the critique:
|
|
120
120
|
|
|
121
|
-
1. **Read** `.
|
|
121
|
+
1. **Read** `.vibe/design-context.json`
|
|
122
122
|
- If missing → display: "Run `/design-teach` first for better results" → proceed with defaults
|
|
123
123
|
- If parse error → display warning → proceed with defaults → recommend `/design-teach`
|
|
124
124
|
- If present → adjust persona priorities by `audience.primary` and `audience.expertise`
|
|
@@ -135,5 +135,5 @@ Before running the critique:
|
|
|
135
135
|
## Important
|
|
136
136
|
|
|
137
137
|
- **Read-only**: Produces design critique report. No code modifications.
|
|
138
|
-
- **Context-aware**: Uses `.
|
|
138
|
+
- **Context-aware**: Uses `.vibe/design-context.json` for brand/audience context if available.
|
|
139
139
|
- **Complementary**: Pairs with `/design-audit` (technical) — critique focuses on UX quality.
|
|
@@ -110,7 +110,7 @@ Strip unnecessary visual elements. Every remaining element must justify its exis
|
|
|
110
110
|
|
|
111
111
|
Before running distillation:
|
|
112
112
|
|
|
113
|
-
1. **Read** `.
|
|
113
|
+
1. **Read** `.vibe/design-context.json`
|
|
114
114
|
- If missing → display: "Run `/design-teach` first for better results" → proceed with defaults
|
|
115
115
|
- If parse error → display warning → proceed with defaults → recommend `/design-teach`
|
|
116
116
|
- If present → preserve elements that match `brand.personality` (e.g., "playful" brand may justify decorative elements)
|
|
@@ -23,8 +23,8 @@ Replace hardcoded design values with design system tokens from MASTER.md. Ensure
|
|
|
23
23
|
|
|
24
24
|
Load token source in priority order:
|
|
25
25
|
|
|
26
|
-
1. `.
|
|
27
|
-
2. `.
|
|
26
|
+
1. `.vibe/design-system/{project}/MASTER.md` (project-specific)
|
|
27
|
+
2. `.vibe/design-context.json` (from `/design-teach`)
|
|
28
28
|
3. If neither exists → prompt: "Run `/design-teach` or create MASTER.md first. Proceeding with default token detection."
|
|
29
29
|
|
|
30
30
|
### Step 2: Scan for Hardcoded Values
|
|
@@ -111,11 +111,11 @@ Replace values in source files, preserving:
|
|
|
111
111
|
|
|
112
112
|
Before running normalization:
|
|
113
113
|
|
|
114
|
-
1. **Read** `.
|
|
114
|
+
1. **Read** `.vibe/design-context.json`
|
|
115
115
|
- If missing → display: "Run `/design-teach` first for better results" → proceed with defaults
|
|
116
116
|
- If parse error → display warning → proceed with defaults → recommend `/design-teach`
|
|
117
117
|
- If present → use `detectedStack.styling` to determine token format (CSS vars, Tailwind, etc.)
|
|
118
|
-
2. **Read** `.
|
|
118
|
+
2. **Read** `.vibe/design-system/*/MASTER.md`
|
|
119
119
|
- If missing → display: "Run `/design-teach` or create MASTER.md first. Proceeding with default token detection."
|
|
120
120
|
- If present → use as authoritative token source for replacements
|
|
121
121
|
|
|
@@ -111,11 +111,11 @@ Every interactive element must have ALL applicable states:
|
|
|
111
111
|
|
|
112
112
|
Before running polish:
|
|
113
113
|
|
|
114
|
-
1. **Read** `.
|
|
114
|
+
1. **Read** `.vibe/design-context.json`
|
|
115
115
|
- If missing → display: "Run `/design-teach` first for better results" → proceed with defaults
|
|
116
116
|
- If parse error → display warning → proceed with defaults → recommend `/design-teach`
|
|
117
117
|
- If present → apply brand-appropriate micro-interaction styles from `aesthetic.style`
|
|
118
|
-
2. **Read** `.
|
|
118
|
+
2. **Read** `.vibe/design-system/*/MASTER.md` (if exists) for token references
|
|
119
119
|
|
|
120
120
|
## Next Steps
|
|
121
121
|
|
|
@@ -8,7 +8,7 @@ priority: 50
|
|
|
8
8
|
|
|
9
9
|
# Design Teach — Project Design Context Gathering
|
|
10
10
|
|
|
11
|
-
Collect project-specific design context so all design-* skills produce tailored, brand-aware results. Saves to `.
|
|
11
|
+
Collect project-specific design context so all design-* skills produce tailored, brand-aware results. Saves to `.vibe/design-context.json`.
|
|
12
12
|
|
|
13
13
|
## Usage
|
|
14
14
|
|
|
@@ -29,8 +29,8 @@ Before asking questions, automatically gather existing signals:
|
|
|
29
29
|
| Color palette | Existing color definitions, brand assets |
|
|
30
30
|
| Typography | Font imports, font-family declarations |
|
|
31
31
|
| Component library | `package.json` dependencies (MUI, Chakra, shadcn, etc.) |
|
|
32
|
-
| Design system | `.
|
|
33
|
-
| Existing context | `.
|
|
32
|
+
| Design system | `.vibe/design-system/*/MASTER.md` |
|
|
33
|
+
| Existing context | `.vibe/design-context.json` (if updating) |
|
|
34
34
|
|
|
35
35
|
### Step 2: Ask Clarifying Questions
|
|
36
36
|
|
|
@@ -59,7 +59,7 @@ Present findings from Step 1, then ask what's missing:
|
|
|
59
59
|
|
|
60
60
|
### Step 3: Save Context
|
|
61
61
|
|
|
62
|
-
Write gathered context to `.
|
|
62
|
+
Write gathered context to `.vibe/design-context.json` using the Write tool.
|
|
63
63
|
|
|
64
64
|
**Schema (v1):**
|
|
65
65
|
|
|
@@ -118,7 +118,7 @@ When `/design-teach` is run again and `design-context.json` already exists:
|
|
|
118
118
|
Each design-* skill does the following when it runs:
|
|
119
119
|
|
|
120
120
|
```
|
|
121
|
-
1. Read `.
|
|
121
|
+
1. Read `.vibe/design-context.json`
|
|
122
122
|
2. File not found → print "Run /design-teach first for better results" → continue with defaults
|
|
123
123
|
3. Parse failure (invalid JSON) → warn "design-context.json parse failed" + continue with defaults → recommend re-running /design-teach
|
|
124
124
|
4. Success → apply context to analysis criteria
|
|
@@ -172,7 +172,7 @@ PRE-SHIP Phase:
|
|
|
172
172
|
- Dark mode: Required
|
|
173
173
|
|
|
174
174
|
### Saved
|
|
175
|
-
✅ .
|
|
175
|
+
✅ .vibe/design-context.json updated
|
|
176
176
|
```
|
|
177
177
|
|
|
178
178
|
## Important
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"brand": {
|
|
11
11
|
"personality": ["professional", "clean", "trustworthy", "efficient"],
|
|
12
12
|
"tone": "professional",
|
|
13
|
-
"existingAssets": ".
|
|
13
|
+
"existingAssets": ".vibe/brand/brand-guide.pdf"
|
|
14
14
|
},
|
|
15
15
|
"aesthetic": {
|
|
16
16
|
"style": "minimal",
|
package/skills/devlog/SKILL.md
CHANGED
|
@@ -61,14 +61,14 @@ For every decision point in the SPEC, resolve it NOW:
|
|
|
61
61
|
|
|
62
62
|
### Step 3: GENERATE — Write the ExecPlan
|
|
63
63
|
|
|
64
|
-
Output format: `.
|
|
64
|
+
Output format: `.vibe/specs/{feature-name}-execplan.md`
|
|
65
65
|
|
|
66
66
|
```markdown
|
|
67
67
|
# ExecPlan: {feature-name}
|
|
68
68
|
|
|
69
69
|
## Meta
|
|
70
|
-
- SPEC: .
|
|
71
|
-
- Feature: .
|
|
70
|
+
- SPEC: .vibe/specs/{name}.md
|
|
71
|
+
- Feature: .vibe/features/{name}.feature
|
|
72
72
|
- Generated: {timestamp}
|
|
73
73
|
- Phases: {count}
|
|
74
74
|
- Scenarios: {count}
|
|
@@ -118,7 +118,7 @@ Output format: `.claude/vibe/specs/{feature-name}-execplan.md`
|
|
|
118
118
|
|
|
119
119
|
### Step 4: PERSIST — Save and Link
|
|
120
120
|
|
|
121
|
-
1. Save ExecPlan to `.
|
|
121
|
+
1. Save ExecPlan to `.vibe/specs/{feature-name}-execplan.md`
|
|
122
122
|
2. Save session context: `save_memory("execplan-{feature}", {summary})`
|
|
123
123
|
3. Output execution command:
|
|
124
124
|
|
|
@@ -128,7 +128,7 @@ Ready to execute:
|
|
|
128
128
|
|
|
129
129
|
Or hand off to new session:
|
|
130
130
|
/vibe.utils --continue
|
|
131
|
-
→ Load: .
|
|
131
|
+
→ Load: .vibe/specs/{feature-name}-execplan.md
|
|
132
132
|
```
|
|
133
133
|
|
|
134
134
|
## Quality Checks
|
|
@@ -18,7 +18,7 @@ Reads a SPEC document and breaks it into a structured hierarchy of phases and ta
|
|
|
18
18
|
- Produce a flat numbered task list with parent-phase references
|
|
19
19
|
|
|
20
20
|
## Input
|
|
21
|
-
- SPEC document path (e.g., `.
|
|
21
|
+
- SPEC document path (e.g., `.vibe/specs/my-feature.spec.md`)
|
|
22
22
|
- Optional: existing codebase context to detect which files already exist
|
|
23
23
|
|
|
24
24
|
## Output
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
| Field | Value |
|
|
6
6
|
|-------|-------|
|
|
7
|
-
| SPEC | `.
|
|
8
|
-
| Feature | `.
|
|
7
|
+
| SPEC | `.vibe/specs/{{FEATURE_NAME}}.md` |
|
|
8
|
+
| Feature | `.vibe/features/{{FEATURE_NAME}}.feature` |
|
|
9
9
|
| Generated | {{GENERATED_DATE}} |
|
|
10
10
|
| Phases | {{PHASE_COUNT}} |
|
|
11
11
|
| Scenarios | {{SCENARIO_COUNT}} |
|
|
@@ -63,7 +63,7 @@ Parallel research complete
|
|
|
63
63
|
↓
|
|
64
64
|
Synthesize results
|
|
65
65
|
↓
|
|
66
|
-
Persist to .
|
|
66
|
+
Persist to .vibe/research/<topic-slug>/
|
|
67
67
|
├── synthesis.md (conversational report)
|
|
68
68
|
├── awesome-list.md (curated links/repos)
|
|
69
69
|
└── paper.md (structured survey for /vibe.spec Context)
|
|
@@ -75,7 +75,7 @@ Reference during implementation
|
|
|
75
75
|
|
|
76
76
|
### Output Location (SSOT)
|
|
77
77
|
|
|
78
|
-
All research artifacts live under `.
|
|
78
|
+
All research artifacts live under `.vibe/research/<topic-slug>/`. Reference `paper.md` explicitly when writing a SPEC (e.g. paste its path into the Context section). Re-running research on the same topic overwrites unless the slug collides across dates (then `-YYYYMMDD` suffix).
|
|
79
79
|
|
|
80
80
|
> Wire-up note: `/vibe.spec` does **not** yet auto-scan this directory — that integration is a follow-up. For now, cite the path manually.
|
|
81
81
|
|
|
@@ -98,7 +98,7 @@ Pass `--ephemeral` to skip persistence when exploring throwaway questions.
|
|
|
98
98
|
|
|
99
99
|
- [ ] All 4 research agents returned results (or documented why not)
|
|
100
100
|
- [ ] Results synthesized into actionable recommendations
|
|
101
|
-
- [ ] Three artifacts written to `.
|
|
101
|
+
- [ ] Three artifacts written to `.vibe/research/<slug>/` (synthesis / awesome-list / paper) — unless `--ephemeral`
|
|
102
102
|
- [ ] Every awesome-list entry has a one-line "why"
|
|
103
103
|
- [ ] Key findings reflected in SPEC Context section or implementation notes
|
|
104
104
|
- [ ] Conflicting recommendations resolved with reasoning
|
|
@@ -36,7 +36,7 @@ agents: [best-practices, framework-docs, codebase-patterns, security-advisory, s
|
|
|
36
36
|
### Phase 5: Persist as Reusable Dataset
|
|
37
37
|
- **Agent**: orchestrator (self)
|
|
38
38
|
- **Input**: Synthesis (Phase 3) + ranked output (Phase 4)
|
|
39
|
-
- **Output**: Three files under `.
|
|
39
|
+
- **Output**: Three files under `.vibe/research/<topic-slug>/`:
|
|
40
40
|
- `synthesis.md` — conversational synthesis (from `templates/synthesis.md`)
|
|
41
41
|
- `awesome-list.md` — curated links/repos by category (from `templates/awesome-list.md`)
|
|
42
42
|
- `paper.md` — structured survey for `/vibe.spec` Context injection (from `templates/paper.md`)
|
|
@@ -85,4 +85,4 @@ Parallel research across four specialized agents (best-practices, framework-docs
|
|
|
85
85
|
|
|
86
86
|
---
|
|
87
87
|
|
|
88
|
-
**Reuse**: cite this file by path (`.
|
|
88
|
+
**Reuse**: cite this file by path (`.vibe/research/{{SLUG}}/paper.md`) when writing a SPEC — paste the Findings and Recommendation sections into the SPEC's Context block.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: vibe-contract
|
|
3
3
|
tier: core
|
|
4
|
-
description: "API contract drift detection. Extracts HTTP/GraphQL/event/public-function contracts from SPEC into .
|
|
4
|
+
description: "API contract drift detection. Extracts HTTP/GraphQL/event/public-function contracts from SPEC into .vibe/contracts/<feature>.md, compares to implementation, and fails loudly on breaking drift (missing endpoints, removed required fields, type changes). P1 drifts auto-register as regressions via vibe-regress. Must use this skill when user runs /vibe.contract, when /vibe.spec completes, when /vibe.verify passes scenarios, or when the user says 'contract', 'API schema', 'breaking change', 'drift', '계약', '스키마 바뀜'."
|
|
5
5
|
triggers: [contract, drift, "계약", "API 변경", "breaking change", "schema drift"]
|
|
6
6
|
priority: 70
|
|
7
7
|
chain-next: []
|
|
@@ -18,7 +18,7 @@ Hidden vibe-coding weakness: as the implementation grows, response shapes drift
|
|
|
18
18
|
## Storage Contract
|
|
19
19
|
|
|
20
20
|
```
|
|
21
|
-
.
|
|
21
|
+
.vibe/contracts/
|
|
22
22
|
<feature>.md # contract SSOT (extracted from SPEC)
|
|
23
23
|
<feature>.snapshot.md # implementation snapshot (last check)
|
|
24
24
|
```
|
|
@@ -28,7 +28,7 @@ Hidden vibe-coding weakness: as the implementation grows, response shapes drift
|
|
|
28
28
|
```yaml
|
|
29
29
|
---
|
|
30
30
|
feature: string
|
|
31
|
-
extracted-from: .
|
|
31
|
+
extracted-from: .vibe/specs/<feature>.md
|
|
32
32
|
extracted-at: ISO-8601
|
|
33
33
|
source-spec-hash: sha256 # for change detection
|
|
34
34
|
endpoints:
|
|
@@ -75,14 +75,14 @@ endpoints:
|
|
|
75
75
|
3. Extraction failure (no such section) → **exit cleanly with `no-contract` state**. Not every feature has an API.
|
|
76
76
|
4. Success → convert to the frontmatter structure
|
|
77
77
|
5. `source-spec-hash`: sha256 of SPEC content (for next extract to detect change)
|
|
78
|
-
6. Save to `.
|
|
78
|
+
6. Save to `.vibe/contracts/<feature>.md` (no-op if file exists with the same hash)
|
|
79
79
|
|
|
80
80
|
**Caveat**: extraction is LLM-driven. Mark low-confidence fields with `# unconfirmed` so the user can review.
|
|
81
81
|
|
|
82
82
|
### 2. `check <feature>` — contract vs implementation
|
|
83
83
|
|
|
84
84
|
**Steps**:
|
|
85
|
-
1. Load `.
|
|
85
|
+
1. Load `.vibe/contracts/<feature>.md`. If missing → **suggest extract first**.
|
|
86
86
|
2. For each endpoint, find implementation:
|
|
87
87
|
- http: detect framework (Express, Fastify, Next.js API routes, Hono, ...)
|
|
88
88
|
- graphql: locate resolver files
|
|
@@ -90,7 +90,7 @@ endpoints:
|
|
|
90
90
|
- function: module export
|
|
91
91
|
3. Extract implementation signature/schema → compare against contract
|
|
92
92
|
4. Classify drift (severity table in command file)
|
|
93
|
-
5. Persist snapshot at `.
|
|
93
|
+
5. Persist snapshot at `.vibe/contracts/<feature>.snapshot.md` (current implementation state)
|
|
94
94
|
|
|
95
95
|
### 3. `diff <feature>` — changes since last snapshot
|
|
96
96
|
|
|
@@ -20,7 +20,7 @@ chain-next: [vibe-plan]
|
|
|
20
20
|
|
|
21
21
|
**Skip when**:
|
|
22
22
|
- Small bug fix on an existing project
|
|
23
|
-
- `.
|
|
23
|
+
- `.vibe/plans/{feature}.md` already exists (→ only update via `vibe-plan`)
|
|
24
24
|
|
|
25
25
|
## Core Loop
|
|
26
26
|
|
|
@@ -51,7 +51,7 @@ chain-next: [vibe-plan]
|
|
|
51
51
|
└──────────────────────┘
|
|
52
52
|
↓
|
|
53
53
|
4. Save collected results
|
|
54
|
-
.
|
|
54
|
+
.vibe/interviews/{feature}.md
|
|
55
55
|
↓
|
|
56
56
|
5. chain-next: vibe-plan
|
|
57
57
|
```
|
|
@@ -206,7 +206,7 @@ Incomplete items will be marked as "TBD" in the plan.
|
|
|
206
206
|
|
|
207
207
|
## Step 4: Save Collected Results
|
|
208
208
|
|
|
209
|
-
**Output file**: `.
|
|
209
|
+
**Output file**: `.vibe/interviews/{feature-name}.md`
|
|
210
210
|
|
|
211
211
|
**Structure**:
|
|
212
212
|
|
|
@@ -262,7 +262,7 @@ stoppedBy: user | auto
|
|
|
262
262
|
### Update `.last-feature` pointer
|
|
263
263
|
|
|
264
264
|
```
|
|
265
|
-
Write ".
|
|
265
|
+
Write ".vibe/.last-feature" ← feature-name (single line)
|
|
266
266
|
|
|
267
267
|
Run immediately after saving the interview file in Step 4.
|
|
268
268
|
This pointer is used by /vibe.spec (no args) for Smart Resume.
|
|
@@ -278,7 +278,7 @@ After the interview is complete, the `vibe-plan` skill is automatically activate
|
|
|
278
278
|
✅ Interview complete!
|
|
279
279
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
280
280
|
|
|
281
|
-
📄 .
|
|
281
|
+
📄 .vibe/interviews/{feature-name}.md
|
|
282
282
|
Required: 8/8
|
|
283
283
|
Optional: 12/14
|
|
284
284
|
Discovered: 3
|
|
@@ -345,7 +345,7 @@ User: 3
|
|
|
345
345
|
Claude: ⚠️ All required items complete. 10 optional items will be marked as TBD.
|
|
346
346
|
|
|
347
347
|
✅ Interview complete!
|
|
348
|
-
📄 .
|
|
348
|
+
📄 .vibe/interviews/parallax-website.md
|
|
349
349
|
|
|
350
350
|
→ vibe-plan skill is starting plan creation...
|
|
351
351
|
```
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
### R2. existing-project-context
|
|
13
13
|
**Q**: 기존 프로젝트의 기술 스택을 확인했나요?
|
|
14
|
-
**힌트**: CLAUDE.md, package.json, .
|
|
14
|
+
**힌트**: CLAUDE.md, package.json, .vibe/config.json 읽어서 자동 파악.
|
|
15
15
|
**follow-up**: 파악 결과를 사용자에게 요약해 확인 받기.
|
|
16
16
|
|
|
17
17
|
### R3. affected-areas
|