@su-record/vibe 2.9.25 → 2.9.33

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.
Files changed (93) hide show
  1. package/CLAUDE.md +7 -4
  2. package/commands/vibe.figma.md +16 -0
  3. package/commands/vibe.run.md +6 -0
  4. package/commands/vibe.verify.md +22 -0
  5. package/dist/cli/auth.d.ts +7 -1
  6. package/dist/cli/auth.d.ts.map +1 -1
  7. package/dist/cli/auth.js +51 -11
  8. package/dist/cli/auth.js.map +1 -1
  9. package/dist/cli/collaborator.d.ts +5 -1
  10. package/dist/cli/collaborator.d.ts.map +1 -1
  11. package/dist/cli/collaborator.js +10 -5
  12. package/dist/cli/collaborator.js.map +1 -1
  13. package/dist/cli/commands/info.d.ts.map +1 -1
  14. package/dist/cli/commands/info.js +5 -21
  15. package/dist/cli/commands/info.js.map +1 -1
  16. package/dist/cli/commands/init.d.ts +13 -5
  17. package/dist/cli/commands/init.d.ts.map +1 -1
  18. package/dist/cli/commands/init.js +73 -32
  19. package/dist/cli/commands/init.js.map +1 -1
  20. package/dist/cli/commands/remove.d.ts.map +1 -1
  21. package/dist/cli/commands/remove.js +21 -8
  22. package/dist/cli/commands/remove.js.map +1 -1
  23. package/dist/cli/commands/update.d.ts.map +1 -1
  24. package/dist/cli/commands/update.js +14 -8
  25. package/dist/cli/commands/update.js.map +1 -1
  26. package/dist/cli/index.js +4 -2
  27. package/dist/cli/index.js.map +1 -1
  28. package/dist/cli/postinstall/global-config.d.ts.map +1 -1
  29. package/dist/cli/postinstall/global-config.js +8 -4
  30. package/dist/cli/postinstall/global-config.js.map +1 -1
  31. package/dist/cli/postinstall/main.d.ts.map +1 -1
  32. package/dist/cli/postinstall/main.js +11 -0
  33. package/dist/cli/postinstall/main.js.map +1 -1
  34. package/dist/cli/setup/LegacyMigration.d.ts +14 -0
  35. package/dist/cli/setup/LegacyMigration.d.ts.map +1 -1
  36. package/dist/cli/setup/LegacyMigration.js +61 -0
  37. package/dist/cli/setup/LegacyMigration.js.map +1 -1
  38. package/dist/cli/setup/ProjectSetup.d.ts +18 -7
  39. package/dist/cli/setup/ProjectSetup.d.ts.map +1 -1
  40. package/dist/cli/setup/ProjectSetup.js +144 -104
  41. package/dist/cli/setup/ProjectSetup.js.map +1 -1
  42. package/dist/cli/setup/Provisioner.js +2 -2
  43. package/dist/cli/setup/Provisioner.js.map +1 -1
  44. package/dist/cli/setup.d.ts +2 -2
  45. package/dist/cli/setup.d.ts.map +1 -1
  46. package/dist/cli/setup.js +2 -2
  47. package/dist/cli/setup.js.map +1 -1
  48. package/dist/cli/utils/cli-detector.d.ts +9 -6
  49. package/dist/cli/utils/cli-detector.d.ts.map +1 -1
  50. package/dist/cli/utils/cli-detector.js +127 -8
  51. package/dist/cli/utils/cli-detector.js.map +1 -1
  52. package/dist/infra/lib/browser/compare.d.ts +27 -0
  53. package/dist/infra/lib/browser/compare.d.ts.map +1 -1
  54. package/dist/infra/lib/browser/compare.js +55 -0
  55. package/dist/infra/lib/browser/compare.js.map +1 -1
  56. package/dist/infra/lib/browser/index.d.ts +2 -1
  57. package/dist/infra/lib/browser/index.d.ts.map +1 -1
  58. package/dist/infra/lib/browser/index.js +1 -1
  59. package/dist/infra/lib/browser/index.js.map +1 -1
  60. package/dist/infra/lib/figma/audit.d.ts +37 -0
  61. package/dist/infra/lib/figma/audit.d.ts.map +1 -0
  62. package/dist/infra/lib/figma/audit.js +130 -0
  63. package/dist/infra/lib/figma/audit.js.map +1 -0
  64. package/dist/infra/lib/figma/extract.d.ts +21 -1
  65. package/dist/infra/lib/figma/extract.d.ts.map +1 -1
  66. package/dist/infra/lib/figma/extract.js +84 -12
  67. package/dist/infra/lib/figma/extract.js.map +1 -1
  68. package/dist/infra/lib/figma/index.d.ts +4 -2
  69. package/dist/infra/lib/figma/index.d.ts.map +1 -1
  70. package/dist/infra/lib/figma/index.js +2 -1
  71. package/dist/infra/lib/figma/index.js.map +1 -1
  72. package/dist/infra/lib/figma/types.d.ts +31 -0
  73. package/dist/infra/lib/figma/types.d.ts.map +1 -1
  74. package/dist/infra/lib/memory/MemoryStorage.d.ts +5 -0
  75. package/dist/infra/lib/memory/MemoryStorage.d.ts.map +1 -1
  76. package/dist/infra/lib/memory/MemoryStorage.js +21 -2
  77. package/dist/infra/lib/memory/MemoryStorage.js.map +1 -1
  78. package/hooks/hooks.json +8 -0
  79. package/hooks/scripts/command-log.js +3 -3
  80. package/hooks/scripts/context-save.js +3 -3
  81. package/hooks/scripts/evolution-engine.js +2 -2
  82. package/hooks/scripts/figma-extract.js +134 -1
  83. package/hooks/scripts/lib/dispatcher.js +9 -5
  84. package/hooks/scripts/lib/scope-from-spec.js +20 -5
  85. package/hooks/scripts/prompt-dispatcher.js +5 -3
  86. package/hooks/scripts/scope-guard.js +3 -3
  87. package/hooks/scripts/session-start.js +3 -3
  88. package/hooks/scripts/step-counter.js +45 -0
  89. package/hooks/scripts/stop-notify.js +2 -2
  90. package/hooks/scripts/utils.js +62 -4
  91. package/package.json +1 -1
  92. package/skills/vibe-figma-extract/SKILL.md +22 -0
  93. package/vibe/templates/claudemd-template.md +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"MemoryStorage.js","sourceRoot":"","sources":["../../../../src/infra/lib/memory/MemoryStorage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MemoryStorage.js","sourceRoot":"","sources":["../../../../src/infra/lib/memory/MemoryStorage.ts"],"names":[],"mappings":"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"}
package/hooks/hooks.json CHANGED
@@ -63,6 +63,14 @@
63
63
  "command": "node {{VIBE_PATH}}/hooks/scripts/post-edit-dispatcher.js"
64
64
  }
65
65
  ]
66
+ },
67
+ {
68
+ "hooks": [
69
+ {
70
+ "type": "command",
71
+ "command": "node {{VIBE_PATH}}/hooks/scripts/step-counter.js"
72
+ }
73
+ ]
66
74
  }
67
75
  ],
68
76
  "UserPromptSubmit": [
@@ -1,14 +1,14 @@
1
1
  /**
2
2
  * PreToolUse Hook - 모든 Bash 명령어를 타임스탬프와 함께 로깅
3
3
  *
4
- * 로그 위치: .claude/command-log.txt
4
+ * 로그 위치: .vibe/command-log.txt (legacy .claude/vibe/ 또는 .coco/vibe/ 사용 중이면 그쪽)
5
5
  * exit 0 항상 통과 (로깅만 수행, 차단하지 않음)
6
6
  */
7
7
  import { appendFileSync, mkdirSync, existsSync } from 'fs';
8
8
  import path from 'path';
9
- import { PROJECT_DIR } from './utils.js';
9
+ import { PROJECT_DIR, projectVibeRoot } from './utils.js';
10
10
 
11
- const LOG_DIR = path.join(PROJECT_DIR, '.claude');
11
+ const LOG_DIR = projectVibeRoot(PROJECT_DIR);
12
12
  const LOG_FILE = path.join(LOG_DIR, 'command-log.txt');
13
13
  const MAX_CMD_LENGTH = 500;
14
14
 
@@ -6,7 +6,7 @@
6
6
  * 구조적 메타데이터를 자동 추출하여 세션 복원 품질을 높임.
7
7
  * (claw-code compact.rs 패턴 참조)
8
8
  */
9
- import { getToolsBaseUrl, getLibBaseUrl, PROJECT_DIR } from './utils.js';
9
+ import { getToolsBaseUrl, getLibBaseUrl, PROJECT_DIR, projectVibePath } from './utils.js';
10
10
  import { execSync } from 'child_process';
11
11
  import fs from 'fs';
12
12
  import path from 'path';
@@ -97,14 +97,14 @@ function extractStructuredMetadata() {
97
97
 
98
98
  try {
99
99
  // SPEC/TODO에서 진행 중 작업 추출
100
- const specDir = path.join(PROJECT_DIR, '.claude', 'vibe', 'specs');
100
+ const specDir = projectVibePath(PROJECT_DIR, 'specs');
101
101
  if (fs.existsSync(specDir)) {
102
102
  const specs = fs.readdirSync(specDir).filter(f => f.endsWith('.md')).slice(0, 3);
103
103
  for (const spec of specs) {
104
104
  metadata.pendingWork.push(`SPEC: ${spec.replace('.md', '')}`);
105
105
  }
106
106
  }
107
- const todoDir = path.join(PROJECT_DIR, '.claude', 'vibe', 'todos');
107
+ const todoDir = projectVibePath(PROJECT_DIR, 'todos');
108
108
  if (fs.existsSync(todoDir)) {
109
109
  const todos = fs.readdirSync(todoDir).filter(f => f.endsWith('.md')).slice(0, 3);
110
110
  for (const todo of todos) {
@@ -2,13 +2,13 @@
2
2
  * PostToolUse Hook - Evolution Engine
3
3
  * Write/Edit 이벤트 후 인사이트 추출 및 자동 생성 파이프라인 트리거
4
4
  */
5
- import { getLibBaseUrl, PROJECT_DIR } from './utils.js';
5
+ import { getLibBaseUrl, PROJECT_DIR, projectVibePath } from './utils.js';
6
6
  import fs from 'fs';
7
7
  import path from 'path';
8
8
 
9
9
  async function main() {
10
10
  // Evolution 활성화 여부 확인
11
- const configPath = path.join(PROJECT_DIR, '.claude', 'vibe', 'config.json');
11
+ const configPath = projectVibePath(PROJECT_DIR, 'config.json');
12
12
  let config = { mode: 'suggest', enabled: false };
13
13
 
14
14
  try {
@@ -161,6 +161,114 @@ function toRadialGradient(f) {
161
161
 
162
162
  const BLEND_MODES = { MULTIPLY:'multiply', SCREEN:'screen', OVERLAY:'overlay', DARKEN:'darken', LIGHTEN:'lighten', COLOR_DODGE:'color-dodge', COLOR_BURN:'color-burn', HARD_LIGHT:'hard-light', SOFT_LIGHT:'soft-light', DIFFERENCE:'difference', EXCLUSION:'exclusion', HUE:'hue', SATURATION:'saturation', COLOR:'color', LUMINOSITY:'luminosity' };
163
163
 
164
+ // Figma-only blend modes with no CSS equivalent (silent-drop hazards)
165
+ const UNSUPPORTED_BLEND_MODES = new Set(['LINEAR_BURN', 'LINEAR_DODGE', 'PLUS_DARKER', 'PLUS_LIGHTER']);
166
+
167
+ // ─── Raw extraction & Audit (Figma→CSS translation-loss detection) ──
168
+
169
+ /** Pull raw numeric Figma properties for later raw-vs-computed reconciliation. */
170
+ function extractRaw(n) {
171
+ const raw = {};
172
+ if (n.itemSpacing != null) raw.itemSpacing = n.itemSpacing;
173
+ if (n.paddingTop != null) raw.paddingTop = n.paddingTop;
174
+ if (n.paddingRight != null) raw.paddingRight = n.paddingRight;
175
+ if (n.paddingBottom != null) raw.paddingBottom = n.paddingBottom;
176
+ if (n.paddingLeft != null) raw.paddingLeft = n.paddingLeft;
177
+ if (n.cornerRadius != null) raw.cornerRadius = n.cornerRadius;
178
+ if (n.rectangleCornerRadii) raw.rectangleCornerRadii = n.rectangleCornerRadii;
179
+ if (n.strokeWeight != null) raw.strokeWeight = n.strokeWeight;
180
+ if (n.strokeAlign) raw.strokeAlign = n.strokeAlign;
181
+ if (n.blendMode) raw.blendMode = n.blendMode;
182
+ if (n.opacity != null) raw.opacity = n.opacity;
183
+ if (n.type === 'TEXT' && n.style) {
184
+ const s = n.style;
185
+ if (s.fontSize != null) raw.fontSize = s.fontSize;
186
+ if (s.lineHeightPx != null) raw.lineHeightPx = s.lineHeightPx;
187
+ if (s.letterSpacing != null) raw.letterSpacing = s.letterSpacing;
188
+ if (s.fontWeight != null) raw.fontWeight = s.fontWeight;
189
+ if (s.leadingTrim) raw.leadingTrim = s.leadingTrim;
190
+ if (s.textBoxTrim) raw.textBoxTrim = s.textBoxTrim;
191
+ }
192
+ return raw;
193
+ }
194
+
195
+ /** Detect Figma properties that do not cross the CSS boundary cleanly. */
196
+ function auditNode(n) {
197
+ const warnings = [];
198
+ // Stroke alignment — only CENTER maps to CSS border
199
+ if (n.strokeAlign && n.strokeAlign !== 'CENTER' && (n.strokes || []).some(s => s.visible !== false)) {
200
+ warnings.push({
201
+ property: 'strokeAlign',
202
+ value: n.strokeAlign,
203
+ severity: 'P1',
204
+ reason: `CSS border renders stroke centered; Figma ${n.strokeAlign} cannot be matched without box-sizing trade-offs.`,
205
+ });
206
+ }
207
+ // Node-level blend mode
208
+ if (n.blendMode && UNSUPPORTED_BLEND_MODES.has(n.blendMode)) {
209
+ warnings.push({
210
+ property: 'blendMode',
211
+ value: n.blendMode,
212
+ severity: 'P1',
213
+ reason: `mix-blend-mode has no equivalent for ${n.blendMode}.`,
214
+ });
215
+ }
216
+ // Per-fill blend mode
217
+ for (const f of n.fills || []) {
218
+ if (f.visible !== false && f.blendMode && UNSUPPORTED_BLEND_MODES.has(f.blendMode)) {
219
+ warnings.push({
220
+ property: 'fill.blendMode',
221
+ value: f.blendMode,
222
+ severity: 'P1',
223
+ reason: `background-blend-mode has no equivalent for ${f.blendMode}.`,
224
+ });
225
+ }
226
+ }
227
+ // leadingTrim / textBoxTrim (text-box-trim is Firefox-unsupported)
228
+ if (n.type === 'TEXT' && n.style) {
229
+ if (n.style.leadingTrim && n.style.leadingTrim !== 'NONE') {
230
+ warnings.push({
231
+ property: 'leadingTrim',
232
+ value: n.style.leadingTrim,
233
+ severity: 'P2',
234
+ reason: 'text-box-trim is not supported in Firefox; visual vertical alignment will drift.',
235
+ });
236
+ }
237
+ if (n.style.textBoxTrim && n.style.textBoxTrim !== 'NONE') {
238
+ warnings.push({
239
+ property: 'textBoxTrim',
240
+ value: n.style.textBoxTrim,
241
+ severity: 'P2',
242
+ reason: 'text-box-trim browser support is limited.',
243
+ });
244
+ }
245
+ }
246
+ // Constraints SCALE/CENTER — no CSS layout equivalent
247
+ if (n.constraints) {
248
+ const { horizontal, vertical } = n.constraints;
249
+ for (const [axis, val] of [['horizontal', horizontal], ['vertical', vertical]]) {
250
+ if (val === 'SCALE' || val === 'CENTER') {
251
+ warnings.push({
252
+ property: `constraints.${axis}`,
253
+ value: val,
254
+ severity: 'P2',
255
+ reason: `Figma ${val} constraint has no direct CSS mapping; responsive behavior will diverge.`,
256
+ });
257
+ }
258
+ }
259
+ }
260
+ // Individual stroke weights combined with non-center align
261
+ if (n.individualStrokeWeights && n.strokeAlign && n.strokeAlign !== 'CENTER') {
262
+ warnings.push({
263
+ property: 'individualStrokeWeights',
264
+ value: n.strokeAlign,
265
+ severity: 'P2',
266
+ reason: 'Per-side border widths only align cleanly when strokeAlign=CENTER.',
267
+ });
268
+ }
269
+ return warnings;
270
+ }
271
+
164
272
  // ─── CSS Extraction ─────────────────────────────────────────────────
165
273
 
166
274
  function extractCSS(n) {
@@ -327,10 +435,31 @@ function walk(node, parentAbsBBox) {
327
435
  r.css.top = `${Math.round(node.absoluteBoundingBox.y - parentAbsBBox.y)}px`;
328
436
  r.css.left = `${Math.round(node.absoluteBoundingBox.x - parentAbsBBox.x)}px`;
329
437
  }
438
+ // Raw Figma values (for raw-vs-computed reconciliation in verification phase)
439
+ const raw = extractRaw(node);
440
+ if (Object.keys(raw).length) r.raw = raw;
441
+ // Translation-loss warnings (Figma → CSS incompatibilities)
442
+ const warnings = auditNode(node);
443
+ if (warnings.length) r.warnings = warnings;
330
444
  if (node.children?.length) r.children = node.children.map(c => walk(c, node.absoluteBoundingBox));
331
445
  return r;
332
446
  }
333
447
 
448
+ /** Aggregate all warnings in a tree into a rollup keyed by severity. */
449
+ function rollupWarnings(tree) {
450
+ const all = [];
451
+ function visit(n) {
452
+ if (n.warnings?.length) {
453
+ for (const w of n.warnings) all.push({ nodeId: n.nodeId, name: n.name, ...w });
454
+ }
455
+ (n.children || []).forEach(visit);
456
+ }
457
+ visit(tree);
458
+ const p1 = all.filter(w => w.severity === 'P1').length;
459
+ const p2 = all.filter(w => w.severity === 'P2').length;
460
+ return { total: all.length, p1, p2, items: all };
461
+ }
462
+
334
463
  function collectRefs(node, set = new Set()) {
335
464
  if (node.imageRef) set.add(node.imageRef);
336
465
  if (node.fills) { for (const f of node.fills) { if (f.imageRef) set.add(f.imageRef); } }
@@ -345,7 +474,9 @@ async function cmdTree(token, fk, nid, depth) {
345
474
  const data = await apiFetch(`/files/${fk}/nodes?ids=${nid}${dp}`, token);
346
475
  const nd = data.nodes?.[nid];
347
476
  if (!nd?.document) fail(`Node ${nid} not found`);
348
- console.log(JSON.stringify(walk(nd.document), null, 2));
477
+ const tree = walk(nd.document);
478
+ tree.auditSummary = rollupWarnings(tree);
479
+ console.log(JSON.stringify(tree, null, 2));
349
480
  }
350
481
 
351
482
  async function cmdImages(token, fk, nid, outDir, depth) {
@@ -525,6 +656,7 @@ async function cmdRender(token, fk, nid, outDir, depth, scale) {
525
656
  const nd = treeData.nodes?.[nid];
526
657
  if (!nd?.document) fail(`Node ${nid} not found`);
527
658
  const tree = walk(nd.document);
659
+ tree.auditSummary = rollupWarnings(tree);
528
660
 
529
661
  // 2. 이미지 이름 매핑 (노드 name 기반)
530
662
  const sectionPrefix = kebab(tree.name);
@@ -607,6 +739,7 @@ async function cmdRender(token, fk, nid, outDir, depth, scale) {
607
739
  },
608
740
  images: imageMap,
609
741
  imageCount: Object.keys(imageMap).length,
742
+ auditSummary: tree.auditSummary,
610
743
  }, null, 2));
611
744
  }
612
745
 
@@ -18,11 +18,15 @@ const SCRIPTS_DIR = path.resolve(__dirname, '..');
18
18
 
19
19
  function loadHookConfig() {
20
20
  try {
21
- const configPath = path.join(
22
- process.env.CLAUDE_PROJECT_DIR || process.cwd(),
23
- '.claude', 'vibe', 'config.json'
24
- );
25
- if (!fs.existsSync(configPath)) return {};
21
+ const projectDir = process.env.CLAUDE_PROJECT_DIR || process.env.COCO_PROJECT_DIR || process.cwd();
22
+ // Vibe config 탐색 — `.vibe/` 를 SSOT 로 삼고, legacy `.claude/vibe/`, `.coco/vibe/` fallback
23
+ const candidates = [
24
+ path.join(projectDir, '.vibe', 'config.json'),
25
+ path.join(projectDir, '.claude', 'vibe', 'config.json'),
26
+ path.join(projectDir, '.coco', 'vibe', 'config.json'),
27
+ ];
28
+ const configPath = candidates.find(p => fs.existsSync(p));
29
+ if (!configPath) return {};
26
30
  return JSON.parse(fs.readFileSync(configPath, 'utf-8')).hooks || {};
27
31
  } catch {
28
32
  return {};
@@ -12,8 +12,23 @@ import path from 'path';
12
12
 
13
13
  const ACTIVE_STATUSES = new Set(['pending', 'in-progress', 'in_progress', 'active', 'running']);
14
14
 
15
+ /**
16
+ * Vibe 에셋 루트 해석 — `.vibe/` (SSOT) 우선, legacy `.claude/vibe/`, `.coco/vibe/` fallback.
17
+ * 반환값은 projectDir 기준 상대 경로 문자열 (예: `.vibe`, `.claude/vibe`).
18
+ */
19
+ function detectVibeRoot(projectDir) {
20
+ try {
21
+ if (fs.existsSync(path.join(projectDir, '.vibe'))) return '.vibe';
22
+ if (fs.existsSync(path.join(projectDir, '.claude', 'vibe'))) return '.claude/vibe';
23
+ if (fs.existsSync(path.join(projectDir, '.coco', 'vibe'))) return '.coco/vibe';
24
+ } catch { /* ignore */ }
25
+ return '.vibe';
26
+ }
27
+
15
28
  // 항상 허용: SPEC/plan/TODO 등 메타 문서는 구현 중에도 갱신 가능해야 함
16
- const DEFAULT_ALLOW = ['.claude/vibe/**', 'CLAUDE.md', 'AGENTS.md'];
29
+ function defaultAllow(projectDir) {
30
+ return [`${detectVibeRoot(projectDir)}/**`, 'CLAUDE.md', 'AGENTS.md'];
31
+ }
17
32
 
18
33
  function readFrontmatter(content) {
19
34
  if (!content.startsWith('---')) return {};
@@ -67,7 +82,7 @@ function extractPaths(markdown) {
67
82
  // 명백한 비경로 제외
68
83
  if (/^[A-Z_]+$/.test(raw)) continue; // 상수
69
84
  if (/^\d+$/.test(raw)) continue; // 숫자
70
- if (raw.startsWith('.') && !raw.startsWith('./') && !raw.startsWith('.claude')) continue;
85
+ if (raw.startsWith('.') && !raw.startsWith('./') && !raw.startsWith('.vibe') && !raw.startsWith('.claude') && !raw.startsWith('.coco')) continue;
71
86
 
72
87
  const normalized = raw.replace(/^\.\//, '').replace(/\\/g, '/');
73
88
  // 각 세그먼트 안전성 재검증 — "a.b.c" 같은 필드 경로 제거
@@ -126,7 +141,7 @@ function collapseDominated(globs) {
126
141
  * 프로젝트의 활성 SPEC 목록 수집.
127
142
  */
128
143
  export function findActiveSpecs(projectDir) {
129
- const specsDir = path.join(projectDir, '.claude', 'vibe', 'specs');
144
+ const specsDir = path.join(projectDir, detectVibeRoot(projectDir), 'specs');
130
145
  if (!fs.existsSync(specsDir)) return [];
131
146
  const results = [];
132
147
  const walk = (dir) => {
@@ -172,7 +187,7 @@ export function synthesizeScope(specFiles, { projectDir } = {}) {
172
187
  catch { return false; }
173
188
  })
174
189
  : derived;
175
- const allow = collapseDominated([...DEFAULT_ALLOW, ...verified]);
190
+ const allow = collapseDominated([...defaultAllow(projectDir || '.'), ...verified]);
176
191
  return {
177
192
  auto: true,
178
193
  mode: 'warn',
@@ -195,7 +210,7 @@ export function synthesizeScope(specFiles, { projectDir } = {}) {
195
210
  * @returns {{ action: 'created'|'updated'|'skipped-manual'|'skipped-no-specs'|'unchanged', path: string }}
196
211
  */
197
212
  export function syncScopeFile(projectDir) {
198
- const scopePath = path.join(projectDir, '.claude', 'vibe', 'scope.json');
213
+ const scopePath = path.join(projectDir, detectVibeRoot(projectDir), 'scope.json');
199
214
  const specs = findActiveSpecs(projectDir);
200
215
 
201
216
  // 기존 파일이 수동 관리면 스킵
@@ -162,7 +162,9 @@ const matched = DISPATCH_RULES.some(r =>
162
162
  if (!matched) {
163
163
  setImmediate(async () => {
164
164
  try {
165
- const configPath = path.join(process.env.CLAUDE_PROJECT_DIR || '.', '.claude', 'vibe', 'config.json');
165
+ const utils = await import('./utils.js');
166
+ const projectDir = process.env.CLAUDE_PROJECT_DIR || process.env.COCO_PROJECT_DIR || '.';
167
+ const configPath = utils.projectVibePath(projectDir, 'config.json');
166
168
  let gapEnabled = true;
167
169
  try {
168
170
  const fs = await import('fs');
@@ -173,12 +175,12 @@ if (!matched) {
173
175
  } catch { /* ignore */ }
174
176
 
175
177
  if (gapEnabled) {
176
- const LIB_BASE = (await import('./utils.js')).getLibBaseUrl();
178
+ const LIB_BASE = utils.getLibBaseUrl();
177
179
  const [memMod, gapMod] = await Promise.all([
178
180
  import(`${LIB_BASE}memory/MemoryStorage.js`),
179
181
  import(`${LIB_BASE}evolution/SkillGapDetector.js`),
180
182
  ]);
181
- const storage = new memMod.MemoryStorage(process.env.CLAUDE_PROJECT_DIR || '.');
183
+ const storage = new memMod.MemoryStorage(projectDir);
182
184
  const detector = new gapMod.SkillGapDetector(storage);
183
185
  detector.logMiss(prompt.slice(0, 200));
184
186
  storage.close();
@@ -21,9 +21,9 @@
21
21
 
22
22
  import fs from 'fs';
23
23
  import path from 'path';
24
- import { PROJECT_DIR, logHookDecision } from './utils.js';
24
+ import { PROJECT_DIR, logHookDecision, projectVibePath, projectVibeRoot } from './utils.js';
25
25
 
26
- const SCOPE_PATH = path.join(PROJECT_DIR, '.claude', 'vibe', 'scope.json');
26
+ const SCOPE_PATH = projectVibePath(PROJECT_DIR, 'scope.json');
27
27
 
28
28
  function readScope() {
29
29
  try {
@@ -131,7 +131,7 @@ lines.push(` file: ${rel}`);
131
131
  if (denied) lines.push(` reason: matches deny pattern`);
132
132
  else if (!allowed) lines.push(` reason: not in allow list`);
133
133
  if (scope.reason) lines.push(` declared scope: ${scope.reason}`);
134
- lines.push(` declared in: .claude/vibe/scope.json (mode=${scope.mode})`);
134
+ lines.push(` declared in: ${path.relative(PROJECT_DIR, SCOPE_PATH)} (mode=${scope.mode})`);
135
135
 
136
136
  const blocking = scope.mode === 'block';
137
137
  if (blocking) {
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * SessionStart Hook - 세션 시작 시 메모리/시간 로드 + 버전 체크
3
3
  */
4
- import { getToolsBaseUrl, PROJECT_DIR } from './utils.js';
4
+ import { getToolsBaseUrl, PROJECT_DIR, projectVibePath, projectVibeRoot } from './utils.js';
5
5
  import fs from 'fs';
6
6
  import path from 'path';
7
7
  import os from 'os';
@@ -99,14 +99,14 @@ async function main() {
99
99
  const { syncScopeFile } = await import('./lib/scope-from-spec.js');
100
100
  const result = syncScopeFile(PROJECT_DIR);
101
101
  if (result.action === 'created' || result.action === 'updated' || result.action === 'removed') {
102
- console.log(`\n🚧 Scope ${result.action} from active SPECs (.claude/vibe/scope.json)`);
102
+ console.log(`\n🚧 Scope ${result.action} from active SPECs (${path.relative(PROJECT_DIR, path.join(projectVibeRoot(PROJECT_DIR), 'scope.json'))})`);
103
103
  }
104
104
  } catch { /* scope sync is best-effort */ }
105
105
 
106
106
  // Autonomy status summary
107
107
  try {
108
108
  const fs = await import('fs');
109
- const configPath = `${PROJECT_DIR}/.claude/vibe/config.json`;
109
+ const configPath = projectVibePath(PROJECT_DIR, 'config.json');
110
110
  let autonomyMode = 'suggest';
111
111
  let sentinelEnabled = true;
112
112
 
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * PostToolUse Hook - 툴콜 스텝 카운터
4
+ *
5
+ * 목적: vibe 멀티-오케스트레이션의 "목표 달성까지 몇 스텝" 측정.
6
+ * 모든 성공 툴콜을 1 스텝으로 집계하여 `/vibe.verify` 리포트에 노출.
7
+ *
8
+ * 저장 위치: .claude/vibe/metrics/current-run.json
9
+ * - /vibe.run 시작 시 overwrite (feature, startedAt, steps=0)
10
+ * - 이후 툴콜마다 steps += 1
11
+ * - /vibe.verify가 읽어서 history.jsonl에 append 후 출력
12
+ *
13
+ * 실패 시 조용히 통과 (차단 금지).
14
+ */
15
+ import fs from 'fs';
16
+ import path from 'path';
17
+ import { PROJECT_DIR, projectVibePath } from './utils.js';
18
+
19
+ const METRICS_DIR = projectVibePath(PROJECT_DIR, 'metrics');
20
+ const CURRENT_RUN = path.join(METRICS_DIR, 'current-run.json');
21
+
22
+ try {
23
+ if (!fs.existsSync(METRICS_DIR)) {
24
+ fs.mkdirSync(METRICS_DIR, { recursive: true });
25
+ }
26
+
27
+ let data = { feature: null, startedAt: null, steps: 0 };
28
+ if (fs.existsSync(CURRENT_RUN)) {
29
+ try {
30
+ data = JSON.parse(fs.readFileSync(CURRENT_RUN, 'utf-8'));
31
+ } catch {
32
+ // 손상 파일 무시, 새로 시작
33
+ }
34
+ }
35
+
36
+ if (!data.startedAt) {
37
+ data.startedAt = new Date().toISOString();
38
+ }
39
+ data.steps = (data.steps || 0) + 1;
40
+
41
+ fs.writeFileSync(CURRENT_RUN, JSON.stringify(data, null, 2));
42
+ } catch {
43
+ // Never block on counter failure
44
+ }
45
+ process.exit(0);
@@ -23,7 +23,7 @@
23
23
 
24
24
  import fs from 'fs';
25
25
  import path from 'path';
26
- import { PROJECT_DIR, VIBE_PATH, readVibeConfig } from './utils.js';
26
+ import { PROJECT_DIR, VIBE_PATH, readVibeConfig, projectVibePath } from './utils.js';
27
27
 
28
28
  // Read hook input from stdin
29
29
  let input = '';
@@ -148,7 +148,7 @@ async function main() {
148
148
 
149
149
  // Load config
150
150
  let config = { notifications: { onStop: true, channels: ['discord', 'telegram', 'slack'] } };
151
- const configPath = path.join(PROJECT_DIR, '.claude/vibe/config.json');
151
+ const configPath = projectVibePath(PROJECT_DIR, 'config.json');
152
152
 
153
153
  try {
154
154
  if (fs.existsSync(configPath)) {
@@ -17,11 +17,69 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url));
17
17
  const DETECTED_VIBE_PATH = path.resolve(__dirname, '..', '..');
18
18
 
19
19
  export const VIBE_PATH = process.env.VIBE_PATH || DETECTED_VIBE_PATH;
20
- export const PROJECT_DIR = process.env.CLAUDE_PROJECT_DIR || '.';
20
+ export const PROJECT_DIR = process.env.CLAUDE_PROJECT_DIR || process.env.COCO_PROJECT_DIR || '.';
21
21
 
22
22
  // ~/.vibe/ 디렉토리 경로
23
23
  const VIBE_HOME_DIR = path.join(os.homedir(), '.vibe');
24
24
 
25
+ /**
26
+ * 프로젝트 내 Vibe 에셋 루트 해석.
27
+ *
28
+ * 신규 SSOT: `<project>/.vibe/` — CLI(Claude/coco)와 무관한 공용 디렉토리.
29
+ * Legacy fallback:
30
+ * - `<project>/.claude/vibe/` (Claude Code 프로젝트 초기화 흔적)
31
+ * - `<project>/.coco/vibe/` (coco 프로젝트 초기화 흔적)
32
+ *
33
+ * 해석 규칙 — **읽기**(lookup) 시:
34
+ * 1) `.vibe/` 가 존재하면 그 경로
35
+ * 2) `.claude/vibe/` 가 존재하면 그 경로
36
+ * 3) `.coco/vibe/` 가 존재하면 그 경로
37
+ * 4) 아무것도 없으면 기본값 `.vibe/` (생성 대상)
38
+ *
39
+ * **쓰기**(write) 시에는 항상 새 SSOT 인 `.vibe/` 로 수렴시키는 것이 원칙이지만,
40
+ * 기존 프로젝트의 legacy 파일이 있으면 해당 위치에 쓰는 것이 덜 파괴적이다.
41
+ * → `projectVibePath(projectDir)` 는 기본적으로 "존재하는 경로 우선".
42
+ * 새로 생성하려는 파일은 호출자가 존재 여부를 점검해 `.vibe/` 경로를 선택하거나
43
+ * `projectVibePathPreferred(projectDir)` 로 항상 `.vibe/` 를 얻어 쓸 수 있다.
44
+ */
45
+ export function projectVibeRoot(projectDir = PROJECT_DIR) {
46
+ try {
47
+ const vibeRoot = path.join(projectDir, '.vibe');
48
+ if (fs.existsSync(vibeRoot)) return vibeRoot;
49
+ const claudeVibe = path.join(projectDir, '.claude', 'vibe');
50
+ if (fs.existsSync(claudeVibe)) return claudeVibe;
51
+ const cocoVibe = path.join(projectDir, '.coco', 'vibe');
52
+ if (fs.existsSync(cocoVibe)) return cocoVibe;
53
+ } catch { /* ignore */ }
54
+ return path.join(projectDir, '.vibe');
55
+ }
56
+
57
+ /** `<project>/.vibe/` 를 무조건 반환 (신규 파일 생성용). */
58
+ export function projectVibePathPreferred(projectDir = PROJECT_DIR, ...sub) {
59
+ return path.join(projectDir, '.vibe', ...sub);
60
+ }
61
+
62
+ /** 읽기 우선 — 존재하는 legacy 경로를 반환, 없으면 새 `.vibe/`. */
63
+ export function projectVibePath(projectDir = PROJECT_DIR, ...sub) {
64
+ return path.join(projectVibeRoot(projectDir), ...sub);
65
+ }
66
+
67
+ /**
68
+ * 프로젝트 메모리 DB 디렉토리 해석.
69
+ * `.vibe/memories/` (신규) → `.claude/memories/` (legacy Claude) → `.coco/memories/` (legacy coco) → 기본 `.vibe/memories/`
70
+ */
71
+ export function projectMemoryDir(projectDir = PROJECT_DIR) {
72
+ try {
73
+ const candidates = [
74
+ path.join(projectDir, '.vibe', 'memories'),
75
+ path.join(projectDir, '.claude', 'memories'),
76
+ path.join(projectDir, '.coco', 'memories'),
77
+ ];
78
+ for (const c of candidates) if (fs.existsSync(c)) return c;
79
+ } catch { /* ignore */ }
80
+ return path.join(projectDir, '.vibe', 'memories');
81
+ }
82
+
25
83
  /**
26
84
  * ~/.vibe/config.json 읽기
27
85
  * @returns {object} 파싱된 config 또는 빈 객체
@@ -37,11 +95,11 @@ export function readVibeConfig() {
37
95
  }
38
96
 
39
97
  /**
40
- * 프로젝트 설정(.claude/vibe/config.json) 읽기
98
+ * 프로젝트 설정(.vibe/config.json) 읽기 — legacy `.claude/vibe/`, `.coco/vibe/` fallback 포함
41
99
  * @returns {object} 파싱된 config 또는 빈 객체
42
100
  */
43
101
  export function readProjectConfig() {
44
- const configPath = path.join(PROJECT_DIR, '.claude', 'vibe', 'config.json');
102
+ const configPath = projectVibePath(PROJECT_DIR, 'config.json');
45
103
  try {
46
104
  if (fs.existsSync(configPath)) {
47
105
  return JSON.parse(fs.readFileSync(configPath, 'utf-8'));
@@ -158,7 +216,7 @@ export function getToolsBaseUrl() {
158
216
  }
159
217
 
160
218
  export function getLibBaseUrl() {
161
- return getPackageUrl(path.join('dist', 'infra', 'lib'), 'gpt-api.js');
219
+ return getPackageUrl(path.join('dist', 'infra', 'lib'), 'constants.js');
162
220
  }
163
221
 
164
222
  // ─── Hook Trace Logging ───
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@su-record/vibe",
3
- "version": "2.9.25",
3
+ "version": "2.9.33",
4
4
  "description": "AI Coding Framework for Claude Code — 56 agents, 45 skills, multi-LLM orchestration",
5
5
  "type": "module",
6
6
  "main": "dist/cli/index.js",