@su-record/vibe 2.12.4 → 2.12.5

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 (63) hide show
  1. package/CLAUDE.md +2 -1
  2. package/dist/cli/commands/init.d.ts +8 -0
  3. package/dist/cli/commands/init.d.ts.map +1 -1
  4. package/dist/cli/commands/init.js +24 -1
  5. package/dist/cli/commands/init.js.map +1 -1
  6. package/dist/cli/postinstall/claude-agents.d.ts +11 -1
  7. package/dist/cli/postinstall/claude-agents.d.ts.map +1 -1
  8. package/dist/cli/postinstall/claude-agents.js +22 -2
  9. package/dist/cli/postinstall/claude-agents.js.map +1 -1
  10. package/dist/cli/postinstall/constants.d.ts +18 -0
  11. package/dist/cli/postinstall/constants.d.ts.map +1 -1
  12. package/dist/cli/postinstall/constants.js +50 -0
  13. package/dist/cli/postinstall/constants.js.map +1 -1
  14. package/dist/cli/postinstall/index.d.ts +1 -1
  15. package/dist/cli/postinstall/index.d.ts.map +1 -1
  16. package/dist/cli/postinstall/index.js +1 -1
  17. package/dist/cli/postinstall/index.js.map +1 -1
  18. package/dist/cli/postinstall/main.d.ts.map +1 -1
  19. package/dist/cli/postinstall/main.js +4 -3
  20. package/dist/cli/postinstall/main.js.map +1 -1
  21. package/dist/cli/postinstall.d.ts +1 -1
  22. package/dist/cli/postinstall.d.ts.map +1 -1
  23. package/dist/cli/postinstall.js +1 -1
  24. package/dist/cli/postinstall.js.map +1 -1
  25. package/dist/infra/lib/ContextCompressor.d.ts +11 -2
  26. package/dist/infra/lib/ContextCompressor.d.ts.map +1 -1
  27. package/dist/infra/lib/ContextCompressor.js +26 -41
  28. package/dist/infra/lib/ContextCompressor.js.map +1 -1
  29. package/dist/infra/lib/ContextCompressor.test.d.ts +2 -0
  30. package/dist/infra/lib/ContextCompressor.test.d.ts.map +1 -0
  31. package/dist/infra/lib/ContextCompressor.test.js +25 -0
  32. package/dist/infra/lib/ContextCompressor.test.js.map +1 -0
  33. package/dist/infra/lib/embedding/VectorStore.d.ts +9 -2
  34. package/dist/infra/lib/embedding/VectorStore.d.ts.map +1 -1
  35. package/dist/infra/lib/embedding/VectorStore.js +42 -19
  36. package/dist/infra/lib/embedding/VectorStore.js.map +1 -1
  37. package/dist/infra/lib/memory/MemoryStorage.d.ts +12 -0
  38. package/dist/infra/lib/memory/MemoryStorage.d.ts.map +1 -1
  39. package/dist/infra/lib/memory/MemoryStorage.js +57 -0
  40. package/dist/infra/lib/memory/MemoryStorage.js.map +1 -1
  41. package/dist/infra/lib/memory/ReflectionStore.d.ts.map +1 -1
  42. package/dist/infra/lib/memory/ReflectionStore.js +8 -27
  43. package/dist/infra/lib/memory/ReflectionStore.js.map +1 -1
  44. package/dist/infra/orchestrator/LLMCluster.d.ts +4 -0
  45. package/dist/infra/orchestrator/LLMCluster.d.ts.map +1 -1
  46. package/dist/infra/orchestrator/LLMCluster.js +35 -8
  47. package/dist/infra/orchestrator/LLMCluster.js.map +1 -1
  48. package/hooks/hooks.json +2 -9
  49. package/hooks/scripts/auto-commit.js +3 -10
  50. package/hooks/scripts/auto-format.js +11 -6
  51. package/hooks/scripts/code-check.js +17 -20
  52. package/hooks/scripts/session-start.js +28 -15
  53. package/hooks/scripts/utils.js +33 -9
  54. package/package.json +1 -1
  55. package/skills/arch-guard/SKILL.md +2 -2
  56. package/skills/characterization-test/SKILL.md +2 -2
  57. package/skills/exec-plan/SKILL.md +2 -2
  58. package/skills/spec/SKILL.md +6 -312
  59. package/skills/spec/references/askuser-examples.md +57 -0
  60. package/skills/spec/references/example-session.md +87 -0
  61. package/skills/spec/references/templates.md +189 -0
  62. package/skills/vibe.run/SKILL.md +2 -2
  63. package/vibe/templates/claudemd-template.md +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ReflectionStore.js","sourceRoot":"","sources":["../../../../src/infra/lib/memory/ReflectionStore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ReflectionStore.js","sourceRoot":"","sources":["../../../../src/infra/lib/memory/ReflectionStore.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,sEAAsE;AAGtE,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AA2CpC,MAAM,eAAe,GAAG,IAAI,CAAC;AAC7B,MAAM,eAAe,GAAG,IAAI,CAAC;AAE7B,SAAS,UAAU;IACjB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzD,OAAO,GAAG,SAAS,IAAI,IAAI,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,aAAa,CAAC,GAAa,EAAE,QAAgB;IACpD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,IAAI,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,GAAG,CAAC;IAExC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC,SAAS;IAC3B,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1E,IAAI,QAAQ,GAAG,OAAO,GAAG,QAAQ;YAAE,MAAM;QACzC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClB,QAAQ,IAAI,OAAO,CAAC;IACtB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,OAAO,eAAe;IAClB,EAAE,CAAoB;IACtB,aAAa,CAAU;IAE/B,YAAY,OAAsB;QAChC,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAChC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IACjD,CAAC;IAED;;OAEG;IACI,IAAI,CAAC,KAAsB;QAChC,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC;QAE5E,oCAAoC;QACpC,MAAM,QAAQ,GAAG,aAAa,CAAC,mBAAmB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC9E,MAAM,SAAS,GAAG,aAAa,CAAC,mBAAmB,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,CAAC;QAChF,MAAM,QAAQ,GAAG,aAAa,CAAC,mBAAmB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC9E,MAAM,YAAY,GAAG,mBAAmB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAE7D,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;YAC3C,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YACvC,CAAC,CAAC,GAAG,CAAC;QAER,oEAAoE;QACpE,qDAAqD;QACrD,uDAAuD;QACvD,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;KAGf,CAAC,CAAC,GAAG,CACJ,EAAE,EACF,KAAK,CAAC,SAAS,IAAI,IAAI,EACvB,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,OAAO,EACb,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EACxB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EACzB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EACxB,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAC5B,KAAK,EACL,SAAS,CACV,CAAC;QACF,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,KAAa,EAAE,QAAgB,EAAE;QAC7C,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;;SAO5B,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAoB,CAAC;gBACxC,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACxC,CAAC;YAAC,MAAM,CAAC;gBACP,sCAAsC;YACxC,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,KAAK,GAAG,CAAC;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;KAK5B,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAoB,CAAC;QAC5D,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACI,YAAY,CAAC,SAAiB;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;KAG5B,CAAC,CAAC,GAAG,CAAC,SAAS,CAAoB,CAAC;QACrC,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACI,SAAS,CAAC,QAAgB,EAAE;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;KAI5B,CAAC,CAAC,GAAG,CAAC,KAAK,CAAoB,CAAC;QACjC,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACI,YAAY,CAAC,WAAmB,GAAG,EAAE,QAAgB,EAAE;QAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;KAK5B,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAoB,CAAC;QAC3C,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACI,OAAO,CAAC,EAAU;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC,GAAG,CAAC,EAAE,CAA8B,CAAC;QAC3G,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAChD,CAAC;IAED;;OAEG;IACI,QAAQ;QACb,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC,GAAG,EAAqB,CAAC;QACnG,OAAO,MAAM,CAAC,GAAG,CAAC;IACpB,CAAC;IAEO,eAAe,CAAC,GAAkB;QACxC,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,IAAI,EAAE,GAAG,CAAC,IAAsB;YAChC,OAAO,EAAE,GAAG,CAAC,OAA4B;YACzC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;YACtD,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE;YACzD,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;YACtD,YAAY,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE;YAClE,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,SAAS,EAAE,GAAG,CAAC,SAAS;SACzB,CAAC;IACJ,CAAC;CACF"}
@@ -36,8 +36,12 @@ export interface LLMClusterOptions {
36
36
  export declare class LLMCluster {
37
37
  private defaultSystemPrompt;
38
38
  constructor(options?: LLMClusterOptions);
39
+ private static readonly CLAUDE_CLI_TIMEOUT_MS;
39
40
  /**
40
41
  * Claude CLI 오케스트레이션 (claude --print)
42
+ *
43
+ * 비동기 spawn — execSync는 최대 180초 이벤트 루프를 블로킹해
44
+ * multiQuery의 GPT/Antigravity 병렬성을 무효화하므로 사용하지 않는다.
41
45
  */
42
46
  claudeOrchestrate(prompt: string, systemPrompt?: string): Promise<string>;
43
47
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"LLMCluster.d.ts","sourceRoot":"","sources":["../../../src/infra/orchestrator/LLMCluster.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;IAC5B,WAAW,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;IACpC,MAAM,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,mBAAmB,CAAS;gBAExB,OAAO,GAAE,iBAAsB;IAI3C;;OAEG;IACG,iBAAiB,CACrB,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC;IAmBlB;;OAEG;IACG,cAAc,CAClB,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAC/B,OAAO,CAAC,MAAM,CAAC;IAQlB;;OAEG;IACG,sBAAsB,CAC1B,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAC/B,OAAO,CAAC,MAAM,CAAC;IAQlB;;OAEG;IACG,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI1D;;;OAGG;IACG,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIlD;;OAEG;IACG,UAAU,CACd,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAC5E,OAAO,CAAC,mBAAmB,CAAC;IAkC/B;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,eAAe,CAAC;CAyB9C;AAKD,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,UAAU,CAKrE"}
1
+ {"version":3,"file":"LLMCluster.d.ts","sourceRoot":"","sources":["../../../src/infra/orchestrator/LLMCluster.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;IAC5B,WAAW,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;IACpC,MAAM,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,mBAAmB,CAAS;gBAExB,OAAO,GAAE,iBAAsB;IAM3C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAU;IAEvD;;;;;OAKG;IACG,iBAAiB,CACrB,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC;IAuClB;;OAEG;IACG,cAAc,CAClB,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAC/B,OAAO,CAAC,MAAM,CAAC;IAQlB;;OAEG;IACG,sBAAsB,CAC1B,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAC/B,OAAO,CAAC,MAAM,CAAC;IAQlB;;OAEG;IACG,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI1D;;;OAGG;IACG,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIlD;;OAEG;IACG,UAAU,CACd,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAC5E,OAAO,CAAC,mBAAmB,CAAC;IAkC/B;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,eAAe,CAAC;CAyB9C;AAKD,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,UAAU,CAKrE"}
@@ -2,7 +2,7 @@
2
2
  * LLMCluster - Multi-LLM 병렬 쿼리 및 상태 관리
3
3
  * GPT, Antigravity, Claude 지원
4
4
  */
5
- import { execSync } from 'child_process';
5
+ import { spawn } from 'child_process';
6
6
  import * as gptApi from '../lib/gpt/index.js';
7
7
  import * as antigravityApi from '../lib/antigravity/index.js';
8
8
  import { warnLog } from '../lib/utils.js';
@@ -14,8 +14,14 @@ export class LLMCluster {
14
14
  constructor(options = {}) {
15
15
  this.defaultSystemPrompt = options.defaultSystemPrompt ?? 'You are a helpful assistant.';
16
16
  }
17
+ // WHY 180s: claude --print는 긴 추론에서 수 분까지 걸릴 수 있으나,
18
+ // 그 이상은 행으로 간주하고 종료한다 (기존 execSync timeout과 동일).
19
+ static CLAUDE_CLI_TIMEOUT_MS = 180000;
17
20
  /**
18
21
  * Claude CLI 오케스트레이션 (claude --print)
22
+ *
23
+ * 비동기 spawn — execSync는 최대 180초 이벤트 루프를 블로킹해
24
+ * multiQuery의 GPT/Antigravity 병렬성을 무효화하므로 사용하지 않는다.
19
25
  */
20
26
  async claudeOrchestrate(prompt, systemPrompt) {
21
27
  const sys = systemPrompt ?? this.defaultSystemPrompt;
@@ -23,14 +29,35 @@ export class LLMCluster {
23
29
  // 재귀 가드 — spawn된 자식 claude 세션의 UserPromptSubmit/Stop hook이
24
30
  // 다시 외부 LLM/오케스트레이션을 돌리는 fork 폭주를 차단한다.
25
31
  // hook 스크립트는 VIBE_HOOK_DEPTH 가 존재하면 즉시 종료한다.
26
- const result = execSync(`claude --print --dangerously-skip-permissions`, {
27
- input: fullPrompt,
28
- timeout: 180000,
29
- encoding: 'utf-8',
30
- stdio: ['pipe', 'pipe', 'pipe'],
31
- env: { ...process.env, VIBE_HOOK_DEPTH: process.env.VIBE_HOOK_DEPTH ?? '1' },
32
+ return new Promise((resolve, reject) => {
33
+ const child = spawn('claude', ['--print', '--dangerously-skip-permissions'], {
34
+ stdio: ['pipe', 'pipe', 'pipe'],
35
+ env: { ...process.env, VIBE_HOOK_DEPTH: process.env.VIBE_HOOK_DEPTH ?? '1' },
36
+ });
37
+ let stdout = '';
38
+ let stderr = '';
39
+ const timer = setTimeout(() => {
40
+ child.kill('SIGKILL');
41
+ reject(new Error(`claude --print timed out after ${LLMCluster.CLAUDE_CLI_TIMEOUT_MS}ms`));
42
+ }, LLMCluster.CLAUDE_CLI_TIMEOUT_MS);
43
+ child.stdout.on('data', (chunk) => { stdout += chunk.toString(); });
44
+ child.stderr.on('data', (chunk) => { stderr += chunk.toString(); });
45
+ child.on('error', (err) => {
46
+ clearTimeout(timer);
47
+ reject(err);
48
+ });
49
+ child.on('close', (code) => {
50
+ clearTimeout(timer);
51
+ if (code === 0) {
52
+ resolve(stdout.trim());
53
+ }
54
+ else {
55
+ reject(new Error(`claude --print failed (code ${code}): ${stderr.slice(0, 500)}`));
56
+ }
57
+ });
58
+ child.stdin.write(fullPrompt);
59
+ child.stdin.end();
32
60
  });
33
- return result.trim();
34
61
  }
35
62
  /**
36
63
  * GPT 오케스트레이션
@@ -1 +1 @@
1
- {"version":3,"file":"LLMCluster.js","sourceRoot":"","sources":["../../../src/infra/orchestrator/LLMCluster.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LLMCluster.js","sourceRoot":"","sources":["../../../src/infra/orchestrator/LLMCluster.ts"],"names":[],"mappings":"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"}
package/hooks/hooks.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "_comment": "Dispatcher pattern — PreToolUse/PostToolUse/Stop는 단일 디스패처가 stdin을 한 번 읽어 순차 실행 (병렬 spawn 폭주 제거, cascade 격리, config.hooks.{name}.enabled 토글 지원). UserPromptSubmit은 VIBE_HOOK_DEPTH 재귀 가드 탑재된 prompt-dispatcher 사용.",
2
+ "_comment": "Dispatcher pattern — PreToolUse/PostToolUse/Stop는 단일 디스패처가 stdin을 한 번 읽어 순차 실행 (병렬 spawn 폭주 제거, cascade 격리, config.hooks.{name}.enabled 토글 지원). UserPromptSubmit은 VIBE_HOOK_DEPTH 재귀 가드 탑재된 prompt-dispatcher 사용. SessionStart matcher가 compact를 제외하는 이유: session-start.js가 컨텍스트 앞단에 현재 시각/24h 카운트 등 동적 값을 주입하므로, compact마다 재발화하면 압축 후 프리픽스가 매번 달라져 prefix cache를 무효화한다.",
3
3
  "permissions": {
4
4
  "allow": [],
5
5
  "deny": [],
@@ -8,6 +8,7 @@
8
8
  "hooks": {
9
9
  "SessionStart": [
10
10
  {
11
+ "matcher": "startup|resume|clear",
11
12
  "hooks": [
12
13
  {
13
14
  "type": "command",
@@ -74,14 +75,6 @@
74
75
  }
75
76
  ],
76
77
  "UserPromptSubmit": [
77
- {
78
- "hooks": [
79
- {
80
- "type": "command",
81
- "command": "echo '[INTERRUPT RULE] If this message follows a user interrupt (Ctrl+C/Escape), the previous task is CANCELLED. Do NOT resume interrupted work. Respond ONLY to this new message.'"
82
- }
83
- ]
84
- },
85
78
  {
86
79
  "hooks": [
87
80
  {
@@ -31,14 +31,6 @@ function getCurrentBranch() {
31
31
  }).trim();
32
32
  }
33
33
 
34
- function hasChanges() {
35
- const status = execSync('git status --porcelain', {
36
- cwd: PROJECT_DIR,
37
- encoding: 'utf-8',
38
- }).trim();
39
- return status.length > 0;
40
- }
41
-
42
34
  function getChangedFiles() {
43
35
  const status = execSync('git status --porcelain', {
44
36
  cwd: PROJECT_DIR,
@@ -88,9 +80,10 @@ try {
88
80
  process.exit(0);
89
81
  }
90
82
 
91
- if (!hasChanges()) process.exit(0);
92
-
83
+ // 변경 유무와 파일 목록을 단일 `git status --porcelain` 호출로 처리
93
84
  const files = getChangedFiles();
85
+ if (files.length === 0) process.exit(0);
86
+
94
87
  const msg = buildCommitMessage(files);
95
88
 
96
89
  execSync('git add -A', { cwd: PROJECT_DIR, stdio: 'ignore' });
@@ -19,13 +19,18 @@ function getFilePath() {
19
19
  return input.file_path || input.path || '';
20
20
  }
21
21
 
22
+ // PATH 직접 스캔 — `which` execSync는 매 파일 저장마다 자식 프로세스를 동기
23
+ // spawn하므로, fs.existsSync로 대체하고 프로세스 내 캐싱한다.
24
+ const _binCache = new Map();
22
25
  function hasBin(name) {
23
- try {
24
- execSync(`which ${name}`, { stdio: 'ignore' });
25
- return true;
26
- } catch {
27
- return false;
28
- }
26
+ const cached = _binCache.get(name);
27
+ if (cached !== undefined) return cached;
28
+ const candidates = process.platform === 'win32' ? [`${name}.exe`, `${name}.cmd`, name] : [name];
29
+ const found = (process.env.PATH || '').split(path.delimiter).some(
30
+ dir => dir && candidates.some(c => existsSync(path.join(dir, c))),
31
+ );
32
+ _binCache.set(name, found);
33
+ return found;
29
34
  }
30
35
 
31
36
  function hasPrettier() {
@@ -225,35 +225,32 @@ function clearFailure(filePath) {
225
225
  }
226
226
 
227
227
  async function main() {
228
+ const files = getModifiedFiles();
229
+ if (files.length === 0) return;
230
+
228
231
  // 1. Code quality check (changed files only — never scan entire project)
229
232
  try {
230
- const files = getModifiedFiles();
231
- if (files.length > 0) {
232
- const module = await import(`${BASE_URL}convention/index.js`);
233
- const result = await module.validateCodeQuality({
234
- targetPath: files[0],
235
- projectPath: PROJECT_DIR,
236
- });
237
- const text = result.content[0].text;
238
- // Output P1/P2 only — skip P3 (style)
239
- const critical = text.split('\n').filter(l => /\b(error|critical|P1|P2)\b/i.test(l)).slice(0, 3);
240
- if (critical.length > 0) {
241
- console.log('[CODE CHECK]', critical.join(' | '));
242
- trackFailure(files[0], critical);
243
- } else {
244
- clearFailure(files[0]);
245
- }
246
- emitSelfHealMessages(files[0]);
233
+ const module = await import(`${BASE_URL}convention/index.js`);
234
+ const result = await module.validateCodeQuality({
235
+ targetPath: files[0],
236
+ projectPath: PROJECT_DIR,
237
+ });
238
+ const text = result.content[0].text;
239
+ // Output P1/P2 only — skip P3 (style)
240
+ const critical = text.split('\n').filter(l => /\b(error|critical|P1|P2)\b/i.test(l)).slice(0, 3);
241
+ if (critical.length > 0) {
242
+ console.log('[CODE CHECK]', critical.join(' | '));
243
+ trackFailure(files[0], critical);
244
+ } else {
245
+ clearFailure(files[0]);
247
246
  }
247
+ emitSelfHealMessages(files[0]);
248
248
  } catch {
249
249
  // Silently continue on check failure — never block progress
250
250
  }
251
251
 
252
252
  // 2. 관찰 자동 캡처
253
253
  try {
254
- const files = getModifiedFiles();
255
- if (files.length === 0) return;
256
-
257
254
  const memModule = await import(`${BASE_URL}memory/index.js`);
258
255
  const { type, title } = classifyObservation(files);
259
256
 
@@ -1,12 +1,11 @@
1
1
  /**
2
2
  * SessionStart Hook - 세션 시작 시 메모리/시간 로드 + 버전 체크
3
3
  */
4
- import { getToolsBaseUrl, PROJECT_DIR, projectVibePath, projectVibeRoot } from './utils.js';
4
+ import { getToolsBaseUrl, getGlobalNpmPath, 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';
8
8
  import https from 'https';
9
- import { execSync } from 'child_process';
10
9
 
11
10
  const BASE_URL = getToolsBaseUrl();
12
11
 
@@ -33,6 +32,30 @@ function fetchLatestVersion() {
33
32
  });
34
33
  }
35
34
 
35
+ // 버전 체크 결과 24시간 파일 캐시 — 매 SessionStart마다 npm registry에
36
+ // HTTP 요청(타임아웃 시 3초 블로킹)을 보내지 않도록 한다. 릴리즈 주기 대비
37
+ // 하루 1회 확인이면 충분하다.
38
+ const VERSION_CACHE_PATH = path.join(os.homedir(), '.vibe', 'version-check.json');
39
+ const VERSION_CACHE_TTL_MS = 24 * 60 * 60 * 1000;
40
+
41
+ async function getLatestVersionCached() {
42
+ try {
43
+ const cached = JSON.parse(fs.readFileSync(VERSION_CACHE_PATH, 'utf8'));
44
+ if (cached.version && Date.now() - cached.checkedAt < VERSION_CACHE_TTL_MS) {
45
+ return cached.version;
46
+ }
47
+ } catch { /* 캐시 없음/손상 → 네트워크 조회 */ }
48
+
49
+ const version = await fetchLatestVersion();
50
+ if (version) {
51
+ try {
52
+ fs.mkdirSync(path.dirname(VERSION_CACHE_PATH), { recursive: true });
53
+ fs.writeFileSync(VERSION_CACHE_PATH, JSON.stringify({ version, checkedAt: Date.now() }));
54
+ } catch { /* 캐시 기록 실패는 무시 */ }
55
+ }
56
+ return version;
57
+ }
58
+
36
59
  function compareVersions(a, b) {
37
60
  const partsA = a.replace(/^v/, '').split('.').map(Number);
38
61
  const partsB = b.replace(/^v/, '').split('.').map(Number);
@@ -47,18 +70,8 @@ function compareVersions(a, b) {
47
70
 
48
71
  function getCurrentVersion() {
49
72
  try {
50
- let globalNpmPath;
51
- try {
52
- globalNpmPath = execSync('npm root -g', { encoding: 'utf8', timeout: 3000 }).trim();
53
- } catch {
54
- const homeDir = os.homedir();
55
- const fallbacks = [
56
- '/usr/local/lib/node_modules',
57
- path.join(homeDir, '.npm-global', 'lib', 'node_modules'),
58
- ];
59
- globalNpmPath = fallbacks.find(p => fs.existsSync(p)) || fallbacks[0];
60
- }
61
- const pkgPath = path.join(globalNpmPath, '@su-record', 'vibe', 'package.json');
73
+ // getToolsBaseUrl()이 이미 `npm root -g` 결과를 캐싱하므로 재사용 — 중복 spawn 제거
74
+ const pkgPath = path.join(getGlobalNpmPath(), '@su-record', 'vibe', 'package.json');
62
75
  if (fs.existsSync(pkgPath)) {
63
76
  return JSON.parse(fs.readFileSync(pkgPath, 'utf8')).version || null;
64
77
  }
@@ -77,7 +90,7 @@ async function main() {
77
90
  memoryModule.startSession({ projectPath: PROJECT_DIR }),
78
91
  timeModule.getCurrentTime({ format: 'human', timezone: 'Asia/Seoul' }),
79
92
  memoryModule.listMemories({ limit: 5, projectPath: PROJECT_DIR }),
80
- fetchLatestVersion(),
93
+ getLatestVersionCached(),
81
94
  ]);
82
95
 
83
96
  console.log(session.content[0].text);
@@ -75,32 +75,44 @@ export function projectMemoryDir(projectDir = PROJECT_DIR) {
75
75
  return path.join(projectDir, '.vibe', 'memories');
76
76
  }
77
77
 
78
+ // config 캐시 — 훅 스크립트는 단명 프로세스이므로 프로세스 생명주기 내에서
79
+ // config 파일이 바뀌지 않는다고 가정한다 (llm-orchestrate처럼 한 프로세스에서
80
+ // 3회 이상 읽는 경로의 중복 read+parse 제거).
81
+ let _vibeConfigCache = null;
82
+ let _projectConfigCache = null;
83
+
78
84
  /**
79
- * ~/.vibe/config.json 읽기
85
+ * ~/.vibe/config.json 읽기 (프로세스 내 캐시)
80
86
  * @returns {object} 파싱된 config 또는 빈 객체
81
87
  */
82
88
  export function readVibeConfig() {
89
+ if (_vibeConfigCache !== null) return _vibeConfigCache;
83
90
  const configPath = path.join(VIBE_HOME_DIR, 'config.json');
84
91
  try {
85
92
  if (fs.existsSync(configPath)) {
86
- return JSON.parse(fs.readFileSync(configPath, 'utf-8'));
93
+ _vibeConfigCache = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
94
+ return _vibeConfigCache;
87
95
  }
88
96
  } catch { /* ignore */ }
89
- return {};
97
+ _vibeConfigCache = {};
98
+ return _vibeConfigCache;
90
99
  }
91
100
 
92
101
  /**
93
- * 프로젝트 설정(.vibe/config.json) 읽기 — legacy `.claude/vibe/` fallback 포함
102
+ * 프로젝트 설정(.vibe/config.json) 읽기 — legacy `.claude/vibe/` fallback 포함 (프로세스 내 캐시)
94
103
  * @returns {object} 파싱된 config 또는 빈 객체
95
104
  */
96
105
  export function readProjectConfig() {
106
+ if (_projectConfigCache !== null) return _projectConfigCache;
97
107
  const configPath = projectVibePath(PROJECT_DIR, 'config.json');
98
108
  try {
99
109
  if (fs.existsSync(configPath)) {
100
- return JSON.parse(fs.readFileSync(configPath, 'utf-8'));
110
+ _projectConfigCache = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
111
+ return _projectConfigCache;
101
112
  }
102
113
  } catch { /* ignore */ }
103
- return {};
114
+ _projectConfigCache = {};
115
+ return _projectConfigCache;
104
116
  }
105
117
 
106
118
  /**
@@ -153,7 +165,7 @@ function toFileUrl(fsPath) {
153
165
 
154
166
  // 전역 npm 경로 캐시
155
167
  let _globalNpmPath = null;
156
- function getGlobalNpmPath() {
168
+ export function getGlobalNpmPath() {
157
169
  if (_globalNpmPath === null) {
158
170
  try {
159
171
  _globalNpmPath = execSync('npm root -g', { encoding: 'utf8' }).trim();
@@ -190,20 +202,32 @@ function hasRuntimeDeps(packageRoot) {
190
202
  * 패키지 하위 경로의 file:// URL 반환 (크로스 플랫폼)
191
203
  * 우선순위: 로컬 빌드 → ~/.vibe/ → 전역 npm
192
204
  * 각 후보는 probeFile 존재 + 런타임 deps 해석 가능해야 채택 (dist-only 복사본 회피)
205
+ *
206
+ * 프로세스 내 메모이제이션: getToolsBaseUrl/getLibBaseUrl/getCliBaseUrl이 한 훅
207
+ * 프로세스에서 각각 호출되면 최악 6회 동기 stat이 반복되므로 결과를 캐싱한다.
193
208
  */
209
+ const _packageUrlCache = new Map();
194
210
  function getPackageUrl(subpath, probeFile) {
211
+ const cacheKey = `${subpath}|${probeFile}`;
212
+ const cached = _packageUrlCache.get(cacheKey);
213
+ if (cached) return cached;
214
+
195
215
  const localRoot = VIBE_PATH;
196
216
  const vibeRoot = path.join(VIBE_HOME_DIR, 'node_modules', '@su-record', 'vibe');
197
217
  const globalRoot = path.join(getGlobalNpmPath(), '@su-record', 'vibe');
198
218
 
199
219
  const candidates = [localRoot, vibeRoot, globalRoot];
220
+ let result = null;
200
221
  for (const root of candidates) {
201
222
  const target = path.join(root, subpath);
202
223
  if (fs.existsSync(path.join(target, probeFile)) && hasRuntimeDeps(root)) {
203
- return toFileUrl(target);
224
+ result = toFileUrl(target);
225
+ break;
204
226
  }
205
227
  }
206
- return toFileUrl(path.join(globalRoot, subpath));
228
+ if (result === null) result = toFileUrl(path.join(globalRoot, subpath));
229
+ _packageUrlCache.set(cacheKey, result);
230
+ return result;
207
231
  }
208
232
 
209
233
  export function getToolsBaseUrl() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@su-record/vibe",
3
- "version": "2.12.4",
3
+ "version": "2.12.5",
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",
@@ -3,8 +3,8 @@ name: arch-guard
3
3
  user-invocable: false
4
4
  invocation: [auto]
5
5
  tier: core
6
- description: "Generate architecture boundary tests that mechanically enforce layer constraints. Use when adding new modules, refactoring layers, or after detecting circular dependencies. Creates import-rule tests (e.g., 'UI must not import DB') that fail CI on violation. Must use this skill when user mentions layer enforcement, dependency rules, or architectural boundaries — even casually like 'make sure services don't import controllers'."
7
- triggers: [arch guard, architecture test, layer test, boundary test, structural test, arch validation]
6
+ description: "Generate import-rule tests that mechanically enforce architecture layer constraints (e.g., 'UI must not import DB') for new modules, layer refactors, or circular dependencies."
7
+ triggers: [arch guard, architecture test, layer test, boundary test, structural test, arch validation, layer enforcement, dependency rules, architectural boundaries, circular dependency]
8
8
  priority: 60
9
9
  ---
10
10
 
@@ -3,8 +3,8 @@ name: characterization-test
3
3
  user-invocable: false
4
4
  invocation: [auto]
5
5
  tier: core
6
- description: "Lock existing behavior with characterization tests before modifying code. Use BEFORE any refactor, rewrite, or large-scale modification of existing code — especially legacy code without tests. Captures current input/output behavior as test cases so regressions are caught immediately. Must use this skill when touching files >200 lines with no existing tests, when user says 'refactor', 'rewrite', 'modernize', or 'clean up' existing code."
7
- triggers: [legacy, characterization test, lock behavior, regression prevention, before refactor, large file]
6
+ description: "Lock existing behavior with characterization tests BEFORE refactoring or modifying legacy/untested code (files >200 lines without tests)."
7
+ triggers: [legacy, characterization test, lock behavior, regression prevention, before refactor, large file, refactor, rewrite, modernize, clean up]
8
8
  priority: 65
9
9
  ---
10
10
 
@@ -3,8 +3,8 @@ name: exec-plan
3
3
  user-invocable: false
4
4
  invocation: [auto, chain]
5
5
  tier: core
6
- description: "Convert SPEC into a self-contained execution plan that agents can run autonomously for hours. Use when a SPEC has 3+ phases, multiple files to change, or complex dependencies between tasks. Produces a plan with explicit file paths, interface extracts, and acceptance criteria so agents never need to 'figure out' context. Must use this skill when launching long-running autonomous work, parallelizing implementation across agents, or when user says 'execute this spec' or 'run this plan'."
7
- triggers: [exec plan, execution plan, autonomous plan, self-contained plan, long-running]
6
+ description: "Convert a SPEC (3+ phases or multi-file) into a self-contained execution plan explicit file paths, interfaces, acceptance criteria that agents can run autonomously."
7
+ triggers: [exec plan, execution plan, autonomous plan, self-contained plan, long-running, execute this spec, run this plan, parallel implementation]
8
8
  priority: 70
9
9
  chain-next: [commit-push-pr]
10
10
  ---