@su-record/vibe 3.2.13 → 3.2.15

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 (305) hide show
  1. package/CLAUDE.md +15 -14
  2. package/README.en.md +1 -1
  3. package/README.md +1 -1
  4. package/dist/cli/setup/ProjectSetup.d.ts +6 -0
  5. package/dist/cli/setup/ProjectSetup.d.ts.map +1 -1
  6. package/dist/cli/setup/ProjectSetup.js +19 -13
  7. package/dist/cli/setup/ProjectSetup.js.map +1 -1
  8. package/dist/infra/lib/codex-proxy.d.ts +126 -0
  9. package/dist/infra/lib/codex-proxy.d.ts.map +1 -1
  10. package/dist/infra/lib/codex-proxy.js +16 -16
  11. package/dist/infra/lib/codex-proxy.js.map +1 -1
  12. package/dist/infra/lib/figma/audit.d.ts.map +1 -1
  13. package/dist/infra/lib/figma/audit.js +0 -2
  14. package/dist/infra/lib/figma/audit.js.map +1 -1
  15. package/dist/infra/lib/figma/extract.d.ts +6 -1
  16. package/dist/infra/lib/figma/extract.d.ts.map +1 -1
  17. package/dist/infra/lib/figma/extract.js +17 -15
  18. package/dist/infra/lib/figma/extract.js.map +1 -1
  19. package/dist/infra/lib/figma/types.d.ts +103 -0
  20. package/dist/infra/lib/figma/types.d.ts.map +1 -1
  21. package/dist/infra/lib/figma/types.js +8 -0
  22. package/dist/infra/lib/figma/types.js.map +1 -1
  23. package/hooks/hooks.json +1 -1
  24. package/hooks/scripts/clone-extract.js +16 -1
  25. package/hooks/scripts/code-check.js +72 -55
  26. package/hooks/scripts/lib/anchor.js +74 -0
  27. package/hooks/scripts/lib/console-allow.js +66 -0
  28. package/hooks/scripts/lib/dispatcher.js +71 -19
  29. package/hooks/scripts/lib/inbox.js +60 -0
  30. package/hooks/scripts/loop-ledger.js +24 -1
  31. package/hooks/scripts/post-edit-dispatcher.js +4 -3
  32. package/hooks/scripts/post-edit.js +2 -2
  33. package/package.json +13 -9
  34. package/skills/vibe/SKILL.md +2 -1
  35. package/skills/vibe.clone/references/verification-loops.md +6 -3
  36. package/skills/vibe.loop/SKILL.md +7 -4
  37. package/skills/vibe.review/SKILL.md +5 -1
  38. package/skills/vibe.run/references/e2e-and-autofix.md +1 -1
  39. package/skills/vibe.run/references/process-steps.md +1 -1
  40. package/vibe/constitution.md +1 -1
  41. package/vibe/rules/loop-contract.md +40 -3
  42. package/vibe/rules/quality/checklist.md +3 -3
  43. package/vibe/templates/constitution-template.md +1 -1
  44. package/dist/__tests__/agent-model-sync.test.d.ts +0 -2
  45. package/dist/__tests__/agent-model-sync.test.d.ts.map +0 -1
  46. package/dist/__tests__/agent-model-sync.test.js +0 -71
  47. package/dist/__tests__/agent-model-sync.test.js.map +0 -1
  48. package/dist/__tests__/architecture.test.d.ts +0 -2
  49. package/dist/__tests__/architecture.test.d.ts.map +0 -1
  50. package/dist/__tests__/architecture.test.js +0 -207
  51. package/dist/__tests__/architecture.test.js.map +0 -1
  52. package/dist/__tests__/skill-namespace.test.d.ts +0 -2
  53. package/dist/__tests__/skill-namespace.test.d.ts.map +0 -1
  54. package/dist/__tests__/skill-namespace.test.js +0 -60
  55. package/dist/__tests__/skill-namespace.test.js.map +0 -1
  56. package/dist/__tests__/stakes-contract.test.d.ts +0 -2
  57. package/dist/__tests__/stakes-contract.test.d.ts.map +0 -1
  58. package/dist/__tests__/stakes-contract.test.js +0 -166
  59. package/dist/__tests__/stakes-contract.test.js.map +0 -1
  60. package/dist/__tests__/stuck-semantics.test.d.ts +0 -2
  61. package/dist/__tests__/stuck-semantics.test.d.ts.map +0 -1
  62. package/dist/__tests__/stuck-semantics.test.js +0 -109
  63. package/dist/__tests__/stuck-semantics.test.js.map +0 -1
  64. package/dist/__tests__/wiring-integrity.test.d.ts +0 -2
  65. package/dist/__tests__/wiring-integrity.test.d.ts.map +0 -1
  66. package/dist/__tests__/wiring-integrity.test.js +0 -160
  67. package/dist/__tests__/wiring-integrity.test.js.map +0 -1
  68. package/dist/cli/commands/info.test.d.ts +0 -2
  69. package/dist/cli/commands/info.test.d.ts.map +0 -1
  70. package/dist/cli/commands/info.test.js +0 -74
  71. package/dist/cli/commands/info.test.js.map +0 -1
  72. package/dist/cli/commands/upgrade.test.d.ts +0 -2
  73. package/dist/cli/commands/upgrade.test.d.ts.map +0 -1
  74. package/dist/cli/commands/upgrade.test.js +0 -99
  75. package/dist/cli/commands/upgrade.test.js.map +0 -1
  76. package/dist/cli/design/design-md-parser.test.d.ts +0 -2
  77. package/dist/cli/design/design-md-parser.test.d.ts.map +0 -1
  78. package/dist/cli/design/design-md-parser.test.js +0 -149
  79. package/dist/cli/design/design-md-parser.test.js.map +0 -1
  80. package/dist/cli/detect.characterization.test.d.ts +0 -7
  81. package/dist/cli/detect.characterization.test.d.ts.map +0 -1
  82. package/dist/cli/detect.characterization.test.js +0 -294
  83. package/dist/cli/detect.characterization.test.js.map +0 -1
  84. package/dist/cli/postinstall/fs-utils.test.d.ts +0 -2
  85. package/dist/cli/postinstall/fs-utils.test.d.ts.map +0 -1
  86. package/dist/cli/postinstall/fs-utils.test.js +0 -259
  87. package/dist/cli/postinstall/fs-utils.test.js.map +0 -1
  88. package/dist/cli/setup/CodexHooks.test.d.ts +0 -2
  89. package/dist/cli/setup/CodexHooks.test.d.ts.map +0 -1
  90. package/dist/cli/setup/CodexHooks.test.js +0 -52
  91. package/dist/cli/setup/CodexHooks.test.js.map +0 -1
  92. package/dist/cli/setup/GlobalInstaller.test.d.ts +0 -2
  93. package/dist/cli/setup/GlobalInstaller.test.d.ts.map +0 -1
  94. package/dist/cli/setup/GlobalInstaller.test.js +0 -16
  95. package/dist/cli/setup/GlobalInstaller.test.js.map +0 -1
  96. package/dist/cli/utils/cli-detector.test.d.ts +0 -2
  97. package/dist/cli/utils/cli-detector.test.d.ts.map +0 -1
  98. package/dist/cli/utils/cli-detector.test.js +0 -52
  99. package/dist/cli/utils/cli-detector.test.js.map +0 -1
  100. package/dist/infra/lib/SkillFrontmatter.test.d.ts +0 -2
  101. package/dist/infra/lib/SkillFrontmatter.test.d.ts.map +0 -1
  102. package/dist/infra/lib/SkillFrontmatter.test.js +0 -60
  103. package/dist/infra/lib/SkillFrontmatter.test.js.map +0 -1
  104. package/dist/infra/lib/__tests__/AutomationLevel.test.d.ts +0 -2
  105. package/dist/infra/lib/__tests__/AutomationLevel.test.d.ts.map +0 -1
  106. package/dist/infra/lib/__tests__/AutomationLevel.test.js +0 -297
  107. package/dist/infra/lib/__tests__/AutomationLevel.test.js.map +0 -1
  108. package/dist/infra/lib/__tests__/ComponentRegistry.test.d.ts +0 -2
  109. package/dist/infra/lib/__tests__/ComponentRegistry.test.d.ts.map +0 -1
  110. package/dist/infra/lib/__tests__/ComponentRegistry.test.js +0 -99
  111. package/dist/infra/lib/__tests__/ComponentRegistry.test.js.map +0 -1
  112. package/dist/infra/lib/__tests__/DecisionTracer.test.d.ts +0 -2
  113. package/dist/infra/lib/__tests__/DecisionTracer.test.d.ts.map +0 -1
  114. package/dist/infra/lib/__tests__/DecisionTracer.test.js +0 -274
  115. package/dist/infra/lib/__tests__/DecisionTracer.test.js.map +0 -1
  116. package/dist/infra/lib/__tests__/InteractiveCheckpoint.test.d.ts +0 -2
  117. package/dist/infra/lib/__tests__/InteractiveCheckpoint.test.d.ts.map +0 -1
  118. package/dist/infra/lib/__tests__/InteractiveCheckpoint.test.js +0 -350
  119. package/dist/infra/lib/__tests__/InteractiveCheckpoint.test.js.map +0 -1
  120. package/dist/infra/lib/__tests__/LoopBreaker.test.d.ts +0 -2
  121. package/dist/infra/lib/__tests__/LoopBreaker.test.d.ts.map +0 -1
  122. package/dist/infra/lib/__tests__/LoopBreaker.test.js +0 -340
  123. package/dist/infra/lib/__tests__/LoopBreaker.test.js.map +0 -1
  124. package/dist/infra/lib/__tests__/VerificationLoop.test.d.ts +0 -2
  125. package/dist/infra/lib/__tests__/VerificationLoop.test.d.ts.map +0 -1
  126. package/dist/infra/lib/__tests__/VerificationLoop.test.js +0 -486
  127. package/dist/infra/lib/__tests__/VerificationLoop.test.js.map +0 -1
  128. package/dist/infra/lib/config/GlobalConfigManager.test.d.ts +0 -2
  129. package/dist/infra/lib/config/GlobalConfigManager.test.d.ts.map +0 -1
  130. package/dist/infra/lib/config/GlobalConfigManager.test.js +0 -9
  131. package/dist/infra/lib/config/GlobalConfigManager.test.js.map +0 -1
  132. package/dist/infra/lib/embedding/__tests__/EmbeddingProvider.test.d.ts +0 -2
  133. package/dist/infra/lib/embedding/__tests__/EmbeddingProvider.test.d.ts.map +0 -1
  134. package/dist/infra/lib/embedding/__tests__/EmbeddingProvider.test.js +0 -43
  135. package/dist/infra/lib/embedding/__tests__/EmbeddingProvider.test.js.map +0 -1
  136. package/dist/infra/lib/embedding/__tests__/VectorStore.test.d.ts +0 -2
  137. package/dist/infra/lib/embedding/__tests__/VectorStore.test.d.ts.map +0 -1
  138. package/dist/infra/lib/embedding/__tests__/VectorStore.test.js +0 -94
  139. package/dist/infra/lib/embedding/__tests__/VectorStore.test.js.map +0 -1
  140. package/dist/infra/lib/embedding/__tests__/cosine.test.d.ts +0 -2
  141. package/dist/infra/lib/embedding/__tests__/cosine.test.d.ts.map +0 -1
  142. package/dist/infra/lib/embedding/__tests__/cosine.test.js +0 -73
  143. package/dist/infra/lib/embedding/__tests__/cosine.test.js.map +0 -1
  144. package/dist/infra/lib/evolution/__tests__/deprecation.test.d.ts +0 -2
  145. package/dist/infra/lib/evolution/__tests__/deprecation.test.d.ts.map +0 -1
  146. package/dist/infra/lib/evolution/__tests__/deprecation.test.js +0 -251
  147. package/dist/infra/lib/evolution/__tests__/deprecation.test.js.map +0 -1
  148. package/dist/infra/lib/evolution/__tests__/eval.test.d.ts +0 -2
  149. package/dist/infra/lib/evolution/__tests__/eval.test.d.ts.map +0 -1
  150. package/dist/infra/lib/evolution/__tests__/eval.test.js +0 -603
  151. package/dist/infra/lib/evolution/__tests__/eval.test.js.map +0 -1
  152. package/dist/infra/lib/evolution/__tests__/generation.test.d.ts +0 -2
  153. package/dist/infra/lib/evolution/__tests__/generation.test.d.ts.map +0 -1
  154. package/dist/infra/lib/evolution/__tests__/generation.test.js +0 -396
  155. package/dist/infra/lib/evolution/__tests__/generation.test.js.map +0 -1
  156. package/dist/infra/lib/evolution/__tests__/insight.test.d.ts +0 -2
  157. package/dist/infra/lib/evolution/__tests__/insight.test.d.ts.map +0 -1
  158. package/dist/infra/lib/evolution/__tests__/insight.test.js +0 -204
  159. package/dist/infra/lib/evolution/__tests__/insight.test.js.map +0 -1
  160. package/dist/infra/lib/evolution/__tests__/integration.test.d.ts +0 -2
  161. package/dist/infra/lib/evolution/__tests__/integration.test.d.ts.map +0 -1
  162. package/dist/infra/lib/evolution/__tests__/integration.test.js +0 -206
  163. package/dist/infra/lib/evolution/__tests__/integration.test.js.map +0 -1
  164. package/dist/infra/lib/evolution/__tests__/lifecycle.test.d.ts +0 -2
  165. package/dist/infra/lib/evolution/__tests__/lifecycle.test.d.ts.map +0 -1
  166. package/dist/infra/lib/evolution/__tests__/lifecycle.test.js +0 -350
  167. package/dist/infra/lib/evolution/__tests__/lifecycle.test.js.map +0 -1
  168. package/dist/infra/lib/evolution/__tests__/parity.test.d.ts +0 -2
  169. package/dist/infra/lib/evolution/__tests__/parity.test.d.ts.map +0 -1
  170. package/dist/infra/lib/evolution/__tests__/parity.test.js +0 -319
  171. package/dist/infra/lib/evolution/__tests__/parity.test.js.map +0 -1
  172. package/dist/infra/lib/llm/auth/AuthProfileManager.test.d.ts +0 -5
  173. package/dist/infra/lib/llm/auth/AuthProfileManager.test.d.ts.map +0 -1
  174. package/dist/infra/lib/llm/auth/AuthProfileManager.test.js +0 -168
  175. package/dist/infra/lib/llm/auth/AuthProfileManager.test.js.map +0 -1
  176. package/dist/infra/lib/llm/auth/TokenRefresher.test.d.ts +0 -2
  177. package/dist/infra/lib/llm/auth/TokenRefresher.test.d.ts.map +0 -1
  178. package/dist/infra/lib/llm/auth/TokenRefresher.test.js +0 -120
  179. package/dist/infra/lib/llm/auth/TokenRefresher.test.js.map +0 -1
  180. package/dist/infra/lib/llm/timeout.test.d.ts +0 -2
  181. package/dist/infra/lib/llm/timeout.test.d.ts.map +0 -1
  182. package/dist/infra/lib/llm/timeout.test.js +0 -50
  183. package/dist/infra/lib/llm/timeout.test.js.map +0 -1
  184. package/dist/infra/lib/llm-availability.test.d.ts +0 -2
  185. package/dist/infra/lib/llm-availability.test.d.ts.map +0 -1
  186. package/dist/infra/lib/llm-availability.test.js +0 -37
  187. package/dist/infra/lib/llm-availability.test.js.map +0 -1
  188. package/dist/infra/lib/memory/KnowledgeGraph.test.d.ts +0 -2
  189. package/dist/infra/lib/memory/KnowledgeGraph.test.d.ts.map +0 -1
  190. package/dist/infra/lib/memory/KnowledgeGraph.test.js +0 -189
  191. package/dist/infra/lib/memory/KnowledgeGraph.test.js.map +0 -1
  192. package/dist/infra/lib/memory/MemorySearch.test.d.ts +0 -2
  193. package/dist/infra/lib/memory/MemorySearch.test.d.ts.map +0 -1
  194. package/dist/infra/lib/memory/MemorySearch.test.js +0 -149
  195. package/dist/infra/lib/memory/MemorySearch.test.js.map +0 -1
  196. package/dist/infra/lib/memory/MemoryStorage.test.d.ts +0 -2
  197. package/dist/infra/lib/memory/MemoryStorage.test.d.ts.map +0 -1
  198. package/dist/infra/lib/memory/MemoryStorage.test.js +0 -198
  199. package/dist/infra/lib/memory/MemoryStorage.test.js.map +0 -1
  200. package/dist/infra/lib/memory/SessionRAGRetriever.test.d.ts +0 -2
  201. package/dist/infra/lib/memory/SessionRAGRetriever.test.d.ts.map +0 -1
  202. package/dist/infra/lib/memory/SessionRAGRetriever.test.js +0 -180
  203. package/dist/infra/lib/memory/SessionRAGRetriever.test.js.map +0 -1
  204. package/dist/infra/lib/memory/SessionRAGStore.test.d.ts +0 -2
  205. package/dist/infra/lib/memory/SessionRAGStore.test.d.ts.map +0 -1
  206. package/dist/infra/lib/memory/SessionRAGStore.test.js +0 -326
  207. package/dist/infra/lib/memory/SessionRAGStore.test.js.map +0 -1
  208. package/dist/infra/lib/memory/__tests__/InMemoryStorage.test.d.ts +0 -2
  209. package/dist/infra/lib/memory/__tests__/InMemoryStorage.test.d.ts.map +0 -1
  210. package/dist/infra/lib/memory/__tests__/InMemoryStorage.test.js +0 -114
  211. package/dist/infra/lib/memory/__tests__/InMemoryStorage.test.js.map +0 -1
  212. package/dist/infra/lib/memory/__tests__/ReflectionStore.test.d.ts +0 -2
  213. package/dist/infra/lib/memory/__tests__/ReflectionStore.test.d.ts.map +0 -1
  214. package/dist/infra/lib/memory/__tests__/ReflectionStore.test.js +0 -196
  215. package/dist/infra/lib/memory/__tests__/ReflectionStore.test.js.map +0 -1
  216. package/dist/infra/lib/memory/index.test.d.ts +0 -2
  217. package/dist/infra/lib/memory/index.test.d.ts.map +0 -1
  218. package/dist/infra/lib/memory/index.test.js +0 -23
  219. package/dist/infra/lib/memory/index.test.js.map +0 -1
  220. package/dist/infra/lib/telemetry/SkillTelemetry.test.d.ts +0 -2
  221. package/dist/infra/lib/telemetry/SkillTelemetry.test.d.ts.map +0 -1
  222. package/dist/infra/lib/telemetry/SkillTelemetry.test.js +0 -124
  223. package/dist/infra/lib/telemetry/SkillTelemetry.test.js.map +0 -1
  224. package/dist/infra/lib/ui-ux/Bm25Engine.test.d.ts +0 -2
  225. package/dist/infra/lib/ui-ux/Bm25Engine.test.d.ts.map +0 -1
  226. package/dist/infra/lib/ui-ux/Bm25Engine.test.js +0 -159
  227. package/dist/infra/lib/ui-ux/Bm25Engine.test.js.map +0 -1
  228. package/dist/infra/lib/ui-ux/CsvDataLoader.test.d.ts +0 -2
  229. package/dist/infra/lib/ui-ux/CsvDataLoader.test.d.ts.map +0 -1
  230. package/dist/infra/lib/ui-ux/CsvDataLoader.test.js +0 -141
  231. package/dist/infra/lib/ui-ux/CsvDataLoader.test.js.map +0 -1
  232. package/dist/infra/lib/ui-ux/DesignSystemGenerator.test.d.ts +0 -2
  233. package/dist/infra/lib/ui-ux/DesignSystemGenerator.test.d.ts.map +0 -1
  234. package/dist/infra/lib/ui-ux/DesignSystemGenerator.test.js +0 -370
  235. package/dist/infra/lib/ui-ux/DesignSystemGenerator.test.js.map +0 -1
  236. package/dist/infra/lib/ui-ux/SearchService.test.d.ts +0 -2
  237. package/dist/infra/lib/ui-ux/SearchService.test.d.ts.map +0 -1
  238. package/dist/infra/lib/ui-ux/SearchService.test.js +0 -215
  239. package/dist/infra/lib/ui-ux/SearchService.test.js.map +0 -1
  240. package/dist/test-helpers/index.d.ts +0 -36
  241. package/dist/test-helpers/index.d.ts.map +0 -1
  242. package/dist/test-helpers/index.js +0 -85
  243. package/dist/test-helpers/index.js.map +0 -1
  244. package/dist/test-helpers/index.test.d.ts +0 -2
  245. package/dist/test-helpers/index.test.d.ts.map +0 -1
  246. package/dist/test-helpers/index.test.js +0 -92
  247. package/dist/test-helpers/index.test.js.map +0 -1
  248. package/dist/tests/curated-release-notes.test.d.ts +0 -2
  249. package/dist/tests/curated-release-notes.test.d.ts.map +0 -1
  250. package/dist/tests/curated-release-notes.test.js +0 -160
  251. package/dist/tests/curated-release-notes.test.js.map +0 -1
  252. package/dist/tools/convention/analyzeComplexity.test.d.ts +0 -2
  253. package/dist/tools/convention/analyzeComplexity.test.d.ts.map +0 -1
  254. package/dist/tools/convention/analyzeComplexity.test.js +0 -207
  255. package/dist/tools/convention/analyzeComplexity.test.js.map +0 -1
  256. package/dist/tools/convention/validateCodeQuality.test.d.ts +0 -2
  257. package/dist/tools/convention/validateCodeQuality.test.d.ts.map +0 -1
  258. package/dist/tools/convention/validateCodeQuality.test.js +0 -230
  259. package/dist/tools/convention/validateCodeQuality.test.js.map +0 -1
  260. package/dist/tools/loop/validateLoopDefinition.test.d.ts +0 -14
  261. package/dist/tools/loop/validateLoopDefinition.test.d.ts.map +0 -1
  262. package/dist/tools/loop/validateLoopDefinition.test.js +0 -229
  263. package/dist/tools/loop/validateLoopDefinition.test.js.map +0 -1
  264. package/dist/tools/spec/executionPacket.test.d.ts +0 -2
  265. package/dist/tools/spec/executionPacket.test.d.ts.map +0 -1
  266. package/dist/tools/spec/executionPacket.test.js +0 -374
  267. package/dist/tools/spec/executionPacket.test.js.map +0 -1
  268. package/dist/tools/spec/prdParser.test.d.ts +0 -6
  269. package/dist/tools/spec/prdParser.test.d.ts.map +0 -1
  270. package/dist/tools/spec/prdParser.test.js +0 -332
  271. package/dist/tools/spec/prdParser.test.js.map +0 -1
  272. package/dist/tools/spec/specGenerator.test.d.ts +0 -2
  273. package/dist/tools/spec/specGenerator.test.d.ts.map +0 -1
  274. package/dist/tools/spec/specGenerator.test.js +0 -130
  275. package/dist/tools/spec/specGenerator.test.js.map +0 -1
  276. package/dist/tools/spec/traceabilityMatrix.path-resolution.test.d.ts +0 -10
  277. package/dist/tools/spec/traceabilityMatrix.path-resolution.test.d.ts.map +0 -1
  278. package/dist/tools/spec/traceabilityMatrix.path-resolution.test.js +0 -120
  279. package/dist/tools/spec/traceabilityMatrix.path-resolution.test.js.map +0 -1
  280. package/dist/tools/spec/traceabilityMatrix.test.d.ts +0 -6
  281. package/dist/tools/spec/traceabilityMatrix.test.d.ts.map +0 -1
  282. package/dist/tools/spec/traceabilityMatrix.test.js +0 -359
  283. package/dist/tools/spec/traceabilityMatrix.test.js.map +0 -1
  284. package/hooks/scripts/__tests__/.vibe/command-log.txt +0 -3
  285. package/hooks/scripts/__tests__/auto-test-debounce.test.js +0 -145
  286. package/hooks/scripts/__tests__/clone-behaviors.test.js +0 -152
  287. package/hooks/scripts/__tests__/clone-merge-responsive.test.js +0 -106
  288. package/hooks/scripts/__tests__/code-check-detectors.test.js +0 -213
  289. package/hooks/scripts/__tests__/code-check-memory-write.test.js +0 -81
  290. package/hooks/scripts/__tests__/codex-hook-adapter.test.js +0 -64
  291. package/hooks/scripts/__tests__/curation-index.test.js +0 -157
  292. package/hooks/scripts/__tests__/dispatcher-inprocess.test.js +0 -99
  293. package/hooks/scripts/__tests__/figma-extract.test.js +0 -338
  294. package/hooks/scripts/__tests__/hook-payload.test.js +0 -29
  295. package/hooks/scripts/__tests__/llm-orchestrate-antigravity.test.js +0 -66
  296. package/hooks/scripts/__tests__/loop-ledger.test.js +0 -321
  297. package/hooks/scripts/__tests__/post-edit-dispatcher.test.js +0 -139
  298. package/hooks/scripts/__tests__/pre-tool-guard.test.js +0 -523
  299. package/hooks/scripts/__tests__/recipe-extractor.test.js +0 -244
  300. package/hooks/scripts/__tests__/run-ledger-verify-required.test.js +0 -151
  301. package/hooks/scripts/__tests__/run-ledger.test.js +0 -481
  302. package/hooks/scripts/__tests__/scope-from-spec.test.js +0 -215
  303. package/hooks/scripts/__tests__/sentinel-guard.test.js +0 -263
  304. package/hooks/scripts/__tests__/step-counter.test.js +0 -459
  305. package/hooks/scripts/__tests__/utils-npm-root.test.js +0 -99
@@ -1,120 +0,0 @@
1
- /**
2
- * Traceability Matrix — Path Resolution & Empty-Status Tests
3
- *
4
- * These tests use real temp directories (no vi.mock) to verify:
5
- * (a) .vibe/specs/ primary path is used and reported correctly
6
- * (b) legacy .claude/specs/ fallback works when .vibe/ is absent
7
- * (c) spec with no REQ-IDs produces status 'empty' + warning + markdown block
8
- */
9
- import { describe, it, expect, afterEach } from 'vitest';
10
- import * as nodefs from 'fs';
11
- import * as nodepath from 'path';
12
- import * as os from 'os';
13
- import { generateTraceabilityMatrix, formatMatrixAsMarkdown, } from './traceabilityMatrix.js';
14
- // ── helpers ────────────────────────────────────────────────────────────────
15
- function makeTmpDir() {
16
- return nodefs.mkdtempSync(nodepath.join(os.tmpdir(), 'rtm-test-'));
17
- }
18
- function writeFile(dir, relPath, content) {
19
- const full = nodepath.join(dir, relPath);
20
- nodefs.mkdirSync(nodepath.dirname(full), { recursive: true });
21
- nodefs.writeFileSync(full, content, 'utf-8');
22
- }
23
- const SPEC_WITH_REQS = `# SPEC: my-feature
24
-
25
- ## Task
26
-
27
- ### Phase 1: Setup
28
-
29
- 1. REQ-my-feature-001: Initialize the system
30
- 2. REQ-my-feature-002: Configure the database
31
- `;
32
- const SPEC_WITHOUT_REQS = `# SPEC: empty-feature
33
-
34
- ## Task
35
-
36
- ### Phase 1: Setup
37
-
38
- 1. [ ] Initialize the system
39
- 2. [ ] Configure the database
40
- `;
41
- // ── tests ──────────────────────────────────────────────────────────────────
42
- describe('Path Resolution (real filesystem)', () => {
43
- const dirs = [];
44
- afterEach(() => {
45
- for (const dir of dirs) {
46
- nodefs.rmSync(dir, { recursive: true, force: true });
47
- }
48
- dirs.length = 0;
49
- });
50
- it('(a) resolves .vibe/specs/<feature>.md as primary path', () => {
51
- const tmp = makeTmpDir();
52
- dirs.push(tmp);
53
- writeFile(tmp, '.vibe/specs/my-feature.md', SPEC_WITH_REQS);
54
- const matrix = generateTraceabilityMatrix('my-feature', { projectPath: tmp });
55
- expect(matrix.status).toBe('ok');
56
- expect(matrix.items.length).toBeGreaterThanOrEqual(2);
57
- expect(matrix.items[0].specFile).toBe('.vibe/specs/my-feature.md');
58
- expect(matrix.warnings).toHaveLength(0);
59
- const ids = matrix.items.map(i => i.requirementId);
60
- expect(ids).toContain('REQ-my-feature-001');
61
- expect(ids).toContain('REQ-my-feature-002');
62
- });
63
- it('(b) falls back to .claude/specs/<feature>.md when .vibe/ is absent', () => {
64
- const tmp = makeTmpDir();
65
- dirs.push(tmp);
66
- writeFile(tmp, '.claude/specs/my-feature.md', SPEC_WITH_REQS);
67
- const matrix = generateTraceabilityMatrix('my-feature', { projectPath: tmp });
68
- expect(matrix.status).toBe('ok');
69
- expect(matrix.items.length).toBeGreaterThanOrEqual(2);
70
- expect(matrix.items[0].specFile).toBe('.claude/specs/my-feature.md');
71
- });
72
- it('(c) spec without REQ-IDs → status empty, warning present, markdown shows gate-failure block', () => {
73
- const tmp = makeTmpDir();
74
- dirs.push(tmp);
75
- writeFile(tmp, '.vibe/specs/empty-feature.md', SPEC_WITHOUT_REQS);
76
- const matrix = generateTraceabilityMatrix('empty-feature', { projectPath: tmp });
77
- expect(matrix.status).toBe('empty');
78
- expect(matrix.items).toHaveLength(0);
79
- expect(matrix.warnings.length).toBeGreaterThanOrEqual(1);
80
- expect(matrix.warnings[0]).toMatch(/REQ-\*/);
81
- expect(matrix.warnings[0]).toMatch(/coverage gate/i);
82
- const md = formatMatrixAsMarkdown(matrix);
83
- expect(md).toContain('NO REQUIREMENTS EXTRACTED');
84
- expect(md).toContain('not usable as a coverage gate');
85
- expect(md).toMatch(/status.*empty.*failed/i);
86
- expect(md).not.toContain('## Summary');
87
- });
88
- });
89
- // ── split-SPEC (directory) tests ───────────────────────────────────────────
90
- describe('Split SPEC directory resolution', () => {
91
- const dirs = [];
92
- afterEach(() => {
93
- for (const dir of dirs) {
94
- nodefs.rmSync(dir, { recursive: true, force: true });
95
- }
96
- dirs.length = 0;
97
- });
98
- it('reads requirements from .vibe/specs/{feature}/ phase files (table-based REQ IDs)', () => {
99
- const tmp = makeTmpDir();
100
- dirs.push(tmp);
101
- writeFile(tmp, '.vibe/specs/split-feat/_index.md', '# SPEC: split-feat (index)\n\n분할 SPEC 인덱스.\n');
102
- writeFile(tmp, '.vibe/specs/split-feat/phase-1-core.md', '# Phase 1\n\n| ID | Requirement | Done |\n|---|---|---|\n| REQ-split-feat-001 | 코어 데이터 로딩 | D1 |\n');
103
- writeFile(tmp, '.vibe/specs/split-feat/phase-2-ui.md', '# Phase 2\n\n| ID | Requirement | Done |\n|---|---|---|\n| REQ-split-feat-002 | UI 렌더링 | D2 |\n');
104
- writeFile(tmp, '.vibe/features/split-feat/phase-1-core.feature', 'Feature: core\n');
105
- const matrix = generateTraceabilityMatrix('split-feat', { projectPath: tmp });
106
- const ids = matrix.items.map((i) => i.requirementId).sort();
107
- expect(ids).toEqual(['REQ-split-feat-001', 'REQ-split-feat-002']);
108
- expect(matrix.status).not.toBe('empty');
109
- });
110
- it('reads scenarios from .vibe/features/{feature}/ directory', () => {
111
- const tmp = makeTmpDir();
112
- dirs.push(tmp);
113
- writeFile(tmp, '.vibe/specs/dir-feat/phase-1.md', 'REQ-dir-feat-001: 데이터 저장\n');
114
- writeFile(tmp, '.vibe/features/dir-feat/phase-1.feature', '### Scenario 1: 데이터 저장 성공\n**Verification**: REQ-dir-feat-001\n');
115
- const matrix = generateTraceabilityMatrix('dir-feat', { projectPath: tmp });
116
- expect(matrix.items).toHaveLength(1);
117
- expect(matrix.items[0].featureScenario).toBeTruthy();
118
- });
119
- });
120
- //# sourceMappingURL=traceabilityMatrix.path-resolution.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"traceabilityMatrix.path-resolution.test.js","sourceRoot":"","sources":["../../../src/tools/spec/traceabilityMatrix.path-resolution.test.ts"],"names":[],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- /**
2
- * Traceability Matrix Tests
3
- * RTM generation, coverage calculation, output formatting
4
- */
5
- export {};
6
- //# sourceMappingURL=traceabilityMatrix.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"traceabilityMatrix.test.d.ts","sourceRoot":"","sources":["../../../src/tools/spec/traceabilityMatrix.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -1,359 +0,0 @@
1
- /**
2
- * Traceability Matrix Tests
3
- * RTM generation, coverage calculation, output formatting
4
- */
5
- import { describe, it, expect, vi } from 'vitest';
6
- import { generateTraceabilityMatrix, formatMatrixAsMarkdown, formatMatrixAsHtml, } from './traceabilityMatrix.js';
7
- // Mock fs module
8
- vi.mock('fs', () => ({
9
- existsSync: vi.fn((filePath) => {
10
- // Simulate: only .claude/specs/ and .claude/features/ exist in mock project
11
- return (filePath.includes('test-feature.md') ||
12
- filePath.includes('test-feature.feature'));
13
- }),
14
- readFileSync: vi.fn((path) => {
15
- if (path.includes('test-feature.md')) {
16
- return `# SPEC: test-feature
17
-
18
- ## Task
19
-
20
- ### Phase 1: Setup
21
-
22
- 1. [ ] REQ-test-001: Setup authentication
23
- 2. [ ] REQ-test-002: Create login form
24
- 3. [ ] REQ-test-003: Implement validation
25
- `;
26
- }
27
- if (path.includes('test-feature.feature')) {
28
- return `# Feature: test-feature
29
-
30
- ## Scenarios
31
-
32
- ### Scenario 1: User can login
33
- \`\`\`gherkin
34
- Given user is on login page
35
- When user enters valid credentials
36
- Then user is logged in
37
- \`\`\`
38
- **Verification**: REQ-test-001
39
-
40
- ### Scenario 2: Validation errors
41
- \`\`\`gherkin
42
- Given user is on login page
43
- When user enters invalid email
44
- Then error message is shown
45
- \`\`\`
46
- **Verification**: REQ-test-003
47
- `;
48
- }
49
- throw new Error(`File not found: ${path}`);
50
- }),
51
- readdirSync: vi.fn(() => []),
52
- }));
53
- describe('Traceability Matrix', () => {
54
- describe('generateTraceabilityMatrix()', () => {
55
- it('should generate matrix for a feature', () => {
56
- const matrix = generateTraceabilityMatrix('test-feature', {
57
- projectPath: '/mock/project',
58
- specPath: '.claude/vibe/specs/test-feature.md',
59
- featurePath: '.claude/vibe/features/test-feature.feature',
60
- });
61
- expect(matrix.featureName).toBe('test-feature');
62
- expect(matrix.generatedAt).toBeDefined();
63
- expect(matrix.items).toBeInstanceOf(Array);
64
- expect(matrix.summary).toBeDefined();
65
- });
66
- it('should extract requirements from SPEC', () => {
67
- const matrix = generateTraceabilityMatrix('test-feature', {
68
- projectPath: '/mock/project',
69
- });
70
- // Should find REQ-test-001, REQ-test-002, REQ-test-003
71
- expect(matrix.items.length).toBeGreaterThan(0);
72
- });
73
- it('should map scenarios to requirements', () => {
74
- const matrix = generateTraceabilityMatrix('test-feature', {
75
- projectPath: '/mock/project',
76
- });
77
- // REQ-test-001 should be mapped to Scenario 1
78
- const req001 = matrix.items.find(i => i.requirementId === 'REQ-test-001');
79
- expect(req001?.featureScenario).toBeDefined();
80
- });
81
- it('should calculate coverage correctly', () => {
82
- const matrix = generateTraceabilityMatrix('test-feature', {
83
- projectPath: '/mock/project',
84
- });
85
- expect(matrix.summary.totalRequirements).toBeGreaterThan(0);
86
- expect(matrix.summary.coveragePercent).toBeGreaterThanOrEqual(0);
87
- expect(matrix.summary.coveragePercent).toBeLessThanOrEqual(100);
88
- });
89
- });
90
- describe('TraceSummary', () => {
91
- it('should track uncovered requirements', () => {
92
- const matrix = generateTraceabilityMatrix('test-feature', {
93
- projectPath: '/mock/project',
94
- });
95
- // REQ-test-002 has no scenario, should be uncovered or partial
96
- const uncoveredOrPartial = [
97
- ...matrix.summary.uncoveredRequirements,
98
- ...matrix.summary.partialRequirements,
99
- ];
100
- expect(uncoveredOrPartial.length).toBeGreaterThanOrEqual(0);
101
- });
102
- it('should calculate spec coverage', () => {
103
- const matrix = generateTraceabilityMatrix('test-feature', {
104
- projectPath: '/mock/project',
105
- });
106
- expect(matrix.summary.specCovered).toBeLessThanOrEqual(matrix.summary.totalRequirements);
107
- });
108
- it('should calculate feature coverage', () => {
109
- const matrix = generateTraceabilityMatrix('test-feature', {
110
- projectPath: '/mock/project',
111
- });
112
- expect(matrix.summary.featureCovered).toBeLessThanOrEqual(matrix.summary.totalRequirements);
113
- });
114
- it('should calculate test coverage', () => {
115
- const matrix = generateTraceabilityMatrix('test-feature', {
116
- projectPath: '/mock/project',
117
- });
118
- expect(matrix.summary.testCovered).toBeLessThanOrEqual(matrix.summary.totalRequirements);
119
- });
120
- });
121
- describe('formatMatrixAsMarkdown()', () => {
122
- it('should format matrix as markdown', () => {
123
- const matrix = {
124
- featureName: 'test-feature',
125
- status: 'ok',
126
- warnings: [],
127
- items: [
128
- {
129
- requirementId: 'REQ-test-001',
130
- requirementDesc: 'Test requirement',
131
- specSection: 'Phase 1',
132
- specFile: 'spec.md',
133
- featureScenario: 'Scenario 1',
134
- featureFile: 'feature.feature',
135
- testFile: 'test.spec.ts',
136
- testName: 'should test something',
137
- coverage: 'full',
138
- },
139
- {
140
- requirementId: 'REQ-test-002',
141
- requirementDesc: 'Another requirement',
142
- specSection: 'Phase 1',
143
- specFile: 'spec.md',
144
- coverage: 'none',
145
- },
146
- ],
147
- summary: {
148
- totalRequirements: 2,
149
- specCovered: 2,
150
- featureCovered: 1,
151
- testCovered: 1,
152
- coveragePercent: 50,
153
- uncoveredRequirements: ['REQ-test-002'],
154
- partialRequirements: [],
155
- },
156
- generatedAt: new Date().toISOString(),
157
- };
158
- const markdown = formatMatrixAsMarkdown(matrix);
159
- expect(markdown).toContain('# Requirements Traceability Matrix');
160
- expect(markdown).toContain('test-feature');
161
- expect(markdown).toContain('## Summary');
162
- expect(markdown).toContain('## Traceability Matrix');
163
- expect(markdown).toContain('REQ-test-001');
164
- expect(markdown).toContain('REQ-test-002');
165
- expect(markdown).toContain('50%');
166
- });
167
- it('should include recommendations section', () => {
168
- const matrix = {
169
- featureName: 'test',
170
- status: 'ok',
171
- warnings: [],
172
- items: [],
173
- summary: {
174
- totalRequirements: 1,
175
- specCovered: 1,
176
- featureCovered: 0,
177
- testCovered: 0,
178
- coveragePercent: 0,
179
- uncoveredRequirements: ['REQ-test-001'],
180
- partialRequirements: [],
181
- },
182
- generatedAt: new Date().toISOString(),
183
- };
184
- const markdown = formatMatrixAsMarkdown(matrix);
185
- expect(markdown).toContain('## Recommendations');
186
- });
187
- it('should show success message at 100% coverage', () => {
188
- const matrix = {
189
- featureName: 'test',
190
- status: 'ok',
191
- warnings: [],
192
- items: [{
193
- requirementId: 'REQ-test-001',
194
- requirementDesc: 'Test',
195
- coverage: 'full',
196
- }],
197
- summary: {
198
- totalRequirements: 1,
199
- specCovered: 1,
200
- featureCovered: 1,
201
- testCovered: 1,
202
- coveragePercent: 100,
203
- uncoveredRequirements: [],
204
- partialRequirements: [],
205
- },
206
- generatedAt: new Date().toISOString(),
207
- };
208
- const markdown = formatMatrixAsMarkdown(matrix);
209
- expect(markdown).toContain('All requirements are fully covered');
210
- });
211
- });
212
- describe('formatMatrixAsHtml()', () => {
213
- it('should format matrix as HTML', () => {
214
- const matrix = {
215
- featureName: 'test-feature',
216
- status: 'ok',
217
- warnings: [],
218
- items: [
219
- {
220
- requirementId: 'REQ-test-001',
221
- requirementDesc: 'Test requirement',
222
- specSection: 'Phase 1',
223
- coverage: 'full',
224
- },
225
- ],
226
- summary: {
227
- totalRequirements: 1,
228
- specCovered: 1,
229
- featureCovered: 1,
230
- testCovered: 1,
231
- coveragePercent: 100,
232
- uncoveredRequirements: [],
233
- partialRequirements: [],
234
- },
235
- generatedAt: new Date().toISOString(),
236
- };
237
- const html = formatMatrixAsHtml(matrix);
238
- expect(html).toContain('<!DOCTYPE html>');
239
- expect(html).toContain('<title>RTM: test-feature</title>');
240
- expect(html).toContain('<table>');
241
- expect(html).toContain('REQ-test-001');
242
- });
243
- it('should include CSS styles', () => {
244
- const matrix = {
245
- featureName: 'test',
246
- status: 'ok',
247
- warnings: [],
248
- items: [],
249
- summary: {
250
- totalRequirements: 0,
251
- specCovered: 0,
252
- featureCovered: 0,
253
- testCovered: 0,
254
- coveragePercent: 0,
255
- uncoveredRequirements: [],
256
- partialRequirements: [],
257
- },
258
- generatedAt: new Date().toISOString(),
259
- };
260
- const html = formatMatrixAsHtml(matrix);
261
- expect(html).toContain('<style>');
262
- expect(html).toContain('.full');
263
- expect(html).toContain('.partial');
264
- expect(html).toContain('.none');
265
- });
266
- it('should include coverage bar', () => {
267
- const matrix = {
268
- featureName: 'test',
269
- status: 'ok',
270
- warnings: [],
271
- items: [],
272
- summary: {
273
- totalRequirements: 2,
274
- specCovered: 1,
275
- featureCovered: 1,
276
- testCovered: 1,
277
- coveragePercent: 50,
278
- uncoveredRequirements: [],
279
- partialRequirements: [],
280
- },
281
- generatedAt: new Date().toISOString(),
282
- };
283
- const html = formatMatrixAsHtml(matrix);
284
- expect(html).toContain('coverage-bar');
285
- expect(html).toContain('coverage-fill');
286
- expect(html).toContain('width: 50%');
287
- });
288
- it('should escape HTML in descriptions', () => {
289
- const matrix = {
290
- featureName: 'test',
291
- status: 'ok',
292
- warnings: [],
293
- items: [{
294
- requirementId: 'REQ-test-001',
295
- requirementDesc: '<script>alert("xss")</script>',
296
- coverage: 'none',
297
- }],
298
- summary: {
299
- totalRequirements: 1,
300
- specCovered: 0,
301
- featureCovered: 0,
302
- testCovered: 0,
303
- coveragePercent: 0,
304
- uncoveredRequirements: ['REQ-test-001'],
305
- partialRequirements: [],
306
- },
307
- generatedAt: new Date().toISOString(),
308
- };
309
- const html = formatMatrixAsHtml(matrix);
310
- expect(html).not.toContain('<script>');
311
- expect(html).toContain('&lt;script&gt;');
312
- });
313
- });
314
- describe('Coverage calculation', () => {
315
- it('should mark as full when all mappings exist', () => {
316
- const item = {
317
- requirementId: 'REQ-001',
318
- requirementDesc: 'Test',
319
- specSection: 'Phase 1',
320
- featureScenario: 'Scenario 1',
321
- testName: 'test case',
322
- coverage: 'full',
323
- };
324
- expect(item.coverage).toBe('full');
325
- });
326
- it('should mark as partial when some mappings exist', () => {
327
- const item = {
328
- requirementId: 'REQ-001',
329
- requirementDesc: 'Test',
330
- specSection: 'Phase 1',
331
- featureScenario: 'Scenario 1',
332
- coverage: 'partial',
333
- };
334
- expect(item.coverage).toBe('partial');
335
- });
336
- it('should mark as none when no mappings exist', () => {
337
- const item = {
338
- requirementId: 'REQ-001',
339
- requirementDesc: 'Test',
340
- coverage: 'none',
341
- };
342
- expect(item.coverage).toBe('none');
343
- });
344
- });
345
- });
346
- describe('Integration', () => {
347
- it('should generate complete RTM workflow', () => {
348
- const matrix = generateTraceabilityMatrix('test-feature', {
349
- projectPath: '/mock/project',
350
- });
351
- const markdown = formatMatrixAsMarkdown(matrix);
352
- const html = formatMatrixAsHtml(matrix);
353
- expect(markdown.length).toBeGreaterThan(100);
354
- expect(html.length).toBeGreaterThan(100);
355
- expect(markdown).toContain(matrix.featureName);
356
- expect(html).toContain(matrix.featureName);
357
- });
358
- });
359
- //# sourceMappingURL=traceabilityMatrix.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"traceabilityMatrix.test.js","sourceRoot":"","sources":["../../../src/tools/spec/traceabilityMatrix.test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAIlD,OAAO,EACL,0BAA0B,EAC1B,sBAAsB,EACtB,kBAAkB,GAGnB,MAAM,yBAAyB,CAAC;AAEjC,iBAAiB;AACjB,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IACnB,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,QAAgB,EAAE,EAAE;QACrC,4EAA4E;QAC5E,OAAO,CACL,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC;YACpC,QAAQ,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAC1C,CAAC;IACJ,CAAC,CAAC;IACF,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAY,EAAE,EAAE;QACnC,IAAI,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACrC,OAAO;;;;;;;;;CASZ,CAAC;QACE,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;YAC1C,OAAO;;;;;;;;;;;;;;;;;;;CAmBZ,CAAC;QACE,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC,CAAC;IACF,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;CAC7B,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;QAC5C,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,MAAM,GAAG,0BAA0B,CAAC,cAAc,EAAE;gBACxD,WAAW,EAAE,eAAe;gBAC5B,QAAQ,EAAE,oCAAoC;gBAC9C,WAAW,EAAE,4CAA4C;aAC1D,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAChD,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,MAAM,GAAG,0BAA0B,CAAC,cAAc,EAAE;gBACxD,WAAW,EAAE,eAAe;aAC7B,CAAC,CAAC;YAEH,uDAAuD;YACvD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,MAAM,GAAG,0BAA0B,CAAC,cAAc,EAAE;gBACxD,WAAW,EAAE,eAAe;aAC7B,CAAC,CAAC;YAEH,8CAA8C;YAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,cAAc,CAAC,CAAC;YAC1E,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,WAAW,EAAE,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,MAAM,GAAG,0BAA0B,CAAC,cAAc,EAAE;gBACxD,WAAW,EAAE,eAAe;aAC7B,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAC5D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;YACjE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,MAAM,GAAG,0BAA0B,CAAC,cAAc,EAAE;gBACxD,WAAW,EAAE,eAAe;aAC7B,CAAC,CAAC;YAEH,+DAA+D;YAC/D,MAAM,kBAAkB,GAAG;gBACzB,GAAG,MAAM,CAAC,OAAO,CAAC,qBAAqB;gBACvC,GAAG,MAAM,CAAC,OAAO,CAAC,mBAAmB;aACtC,CAAC;YACF,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,MAAM,GAAG,0BAA0B,CAAC,cAAc,EAAE;gBACxD,WAAW,EAAE,eAAe;aAC7B,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAC3F,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,MAAM,GAAG,0BAA0B,CAAC,cAAc,EAAE;gBACxD,WAAW,EAAE,eAAe;aAC7B,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAC9F,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,MAAM,GAAG,0BAA0B,CAAC,cAAc,EAAE;gBACxD,WAAW,EAAE,eAAe;aAC7B,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAC3F,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,MAAM,GAAuB;gBACjC,WAAW,EAAE,cAAc;gBAC3B,MAAM,EAAE,IAAI;gBACZ,QAAQ,EAAE,EAAE;gBACZ,KAAK,EAAE;oBACL;wBACE,aAAa,EAAE,cAAc;wBAC7B,eAAe,EAAE,kBAAkB;wBACnC,WAAW,EAAE,SAAS;wBACtB,QAAQ,EAAE,SAAS;wBACnB,eAAe,EAAE,YAAY;wBAC7B,WAAW,EAAE,iBAAiB;wBAC9B,QAAQ,EAAE,cAAc;wBACxB,QAAQ,EAAE,uBAAuB;wBACjC,QAAQ,EAAE,MAAM;qBACjB;oBACD;wBACE,aAAa,EAAE,cAAc;wBAC7B,eAAe,EAAE,qBAAqB;wBACtC,WAAW,EAAE,SAAS;wBACtB,QAAQ,EAAE,SAAS;wBACnB,QAAQ,EAAE,MAAM;qBACjB;iBACF;gBACD,OAAO,EAAE;oBACP,iBAAiB,EAAE,CAAC;oBACpB,WAAW,EAAE,CAAC;oBACd,cAAc,EAAE,CAAC;oBACjB,WAAW,EAAE,CAAC;oBACd,eAAe,EAAE,EAAE;oBACnB,qBAAqB,EAAE,CAAC,cAAc,CAAC;oBACvC,mBAAmB,EAAE,EAAE;iBACxB;gBACD,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACtC,CAAC;YAEF,MAAM,QAAQ,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;YAEhD,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAC;YACjE,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YAC3C,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YACzC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;YACrD,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YAC3C,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YAC3C,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,MAAM,GAAuB;gBACjC,WAAW,EAAE,MAAM;gBACnB,MAAM,EAAE,IAAI;gBACZ,QAAQ,EAAE,EAAE;gBACZ,KAAK,EAAE,EAAE;gBACT,OAAO,EAAE;oBACP,iBAAiB,EAAE,CAAC;oBACpB,WAAW,EAAE,CAAC;oBACd,cAAc,EAAE,CAAC;oBACjB,WAAW,EAAE,CAAC;oBACd,eAAe,EAAE,CAAC;oBAClB,qBAAqB,EAAE,CAAC,cAAc,CAAC;oBACvC,mBAAmB,EAAE,EAAE;iBACxB;gBACD,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACtC,CAAC;YAEF,MAAM,QAAQ,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;YAChD,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,MAAM,GAAuB;gBACjC,WAAW,EAAE,MAAM;gBACnB,MAAM,EAAE,IAAI;gBACZ,QAAQ,EAAE,EAAE;gBACZ,KAAK,EAAE,CAAC;wBACN,aAAa,EAAE,cAAc;wBAC7B,eAAe,EAAE,MAAM;wBACvB,QAAQ,EAAE,MAAM;qBACjB,CAAC;gBACF,OAAO,EAAE;oBACP,iBAAiB,EAAE,CAAC;oBACpB,WAAW,EAAE,CAAC;oBACd,cAAc,EAAE,CAAC;oBACjB,WAAW,EAAE,CAAC;oBACd,eAAe,EAAE,GAAG;oBACpB,qBAAqB,EAAE,EAAE;oBACzB,mBAAmB,EAAE,EAAE;iBACxB;gBACD,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACtC,CAAC;YAEF,MAAM,QAAQ,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;YAChD,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,MAAM,GAAuB;gBACjC,WAAW,EAAE,cAAc;gBAC3B,MAAM,EAAE,IAAI;gBACZ,QAAQ,EAAE,EAAE;gBACZ,KAAK,EAAE;oBACL;wBACE,aAAa,EAAE,cAAc;wBAC7B,eAAe,EAAE,kBAAkB;wBACnC,WAAW,EAAE,SAAS;wBACtB,QAAQ,EAAE,MAAM;qBACjB;iBACF;gBACD,OAAO,EAAE;oBACP,iBAAiB,EAAE,CAAC;oBACpB,WAAW,EAAE,CAAC;oBACd,cAAc,EAAE,CAAC;oBACjB,WAAW,EAAE,CAAC;oBACd,eAAe,EAAE,GAAG;oBACpB,qBAAqB,EAAE,EAAE;oBACzB,mBAAmB,EAAE,EAAE;iBACxB;gBACD,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACtC,CAAC;YAEF,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;YAExC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;YAC3D,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACnC,MAAM,MAAM,GAAuB;gBACjC,WAAW,EAAE,MAAM;gBACnB,MAAM,EAAE,IAAI;gBACZ,QAAQ,EAAE,EAAE;gBACZ,KAAK,EAAE,EAAE;gBACT,OAAO,EAAE;oBACP,iBAAiB,EAAE,CAAC;oBACpB,WAAW,EAAE,CAAC;oBACd,cAAc,EAAE,CAAC;oBACjB,WAAW,EAAE,CAAC;oBACd,eAAe,EAAE,CAAC;oBAClB,qBAAqB,EAAE,EAAE;oBACzB,mBAAmB,EAAE,EAAE;iBACxB;gBACD,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACtC,CAAC;YAEF,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,MAAM,MAAM,GAAuB;gBACjC,WAAW,EAAE,MAAM;gBACnB,MAAM,EAAE,IAAI;gBACZ,QAAQ,EAAE,EAAE;gBACZ,KAAK,EAAE,EAAE;gBACT,OAAO,EAAE;oBACP,iBAAiB,EAAE,CAAC;oBACpB,WAAW,EAAE,CAAC;oBACd,cAAc,EAAE,CAAC;oBACjB,WAAW,EAAE,CAAC;oBACd,eAAe,EAAE,EAAE;oBACnB,qBAAqB,EAAE,EAAE;oBACzB,mBAAmB,EAAE,EAAE;iBACxB;gBACD,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACtC,CAAC;YAEF,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,MAAM,GAAuB;gBACjC,WAAW,EAAE,MAAM;gBACnB,MAAM,EAAE,IAAI;gBACZ,QAAQ,EAAE,EAAE;gBACZ,KAAK,EAAE,CAAC;wBACN,aAAa,EAAE,cAAc;wBAC7B,eAAe,EAAE,+BAA+B;wBAChD,QAAQ,EAAE,MAAM;qBACjB,CAAC;gBACF,OAAO,EAAE;oBACP,iBAAiB,EAAE,CAAC;oBACpB,WAAW,EAAE,CAAC;oBACd,cAAc,EAAE,CAAC;oBACjB,WAAW,EAAE,CAAC;oBACd,eAAe,EAAE,CAAC;oBAClB,qBAAqB,EAAE,CAAC,cAAc,CAAC;oBACvC,mBAAmB,EAAE,EAAE;iBACxB;gBACD,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACtC,CAAC;YAEF,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,IAAI,GAAc;gBACtB,aAAa,EAAE,SAAS;gBACxB,eAAe,EAAE,MAAM;gBACvB,WAAW,EAAE,SAAS;gBACtB,eAAe,EAAE,YAAY;gBAC7B,QAAQ,EAAE,WAAW;gBACrB,QAAQ,EAAE,MAAM;aACjB,CAAC;YAEF,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,IAAI,GAAc;gBACtB,aAAa,EAAE,SAAS;gBACxB,eAAe,EAAE,MAAM;gBACvB,WAAW,EAAE,SAAS;gBACtB,eAAe,EAAE,YAAY;gBAC7B,QAAQ,EAAE,SAAS;aACpB,CAAC;YAEF,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,IAAI,GAAc;gBACtB,aAAa,EAAE,SAAS;gBACxB,eAAe,EAAE,MAAM;gBACvB,QAAQ,EAAE,MAAM;aACjB,CAAC;YAEF,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,MAAM,GAAG,0BAA0B,CAAC,cAAc,EAAE;YACxD,WAAW,EAAE,eAAe;SAC7B,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAExC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,3 +0,0 @@
1
- [2026-07-26T21:23:30.218Z] rm -rf /
2
- [2026-07-26T21:23:30.325Z] ls -la
3
- [2026-07-26T21:23:30.427Z] rm -rf src/infra/lib/evolution/
@@ -1,145 +0,0 @@
1
- /**
2
- * auto-test.js debounce 테스트
3
- *
4
- * 검증 대상:
5
- * - debounce 모드에서 쿨다운 내 + 소스 미변경 → 스킵
6
- * - 쿨다운 만료 → 재실행
7
- * - 소스 변경 → 재실행
8
- * - mode='off' → 실행 안 함
9
- * - mode='always' → debounce 없이 항상 실행 시도
10
- */
11
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
12
- import { fileURLToPath } from 'url';
13
- import path from 'path';
14
- import fs from 'fs';
15
- import os from 'os';
16
- import { createHash } from 'crypto';
17
-
18
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
19
-
20
- let tmpDir;
21
- beforeEach(() => {
22
- tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'vibe-autotest-debounce-'));
23
- });
24
- afterEach(() => {
25
- try { fs.rmSync(tmpDir, { recursive: true, force: true }); } catch { /* ignore */ }
26
- });
27
-
28
- // debounce 로직 단위 테스트 (auto-test.js와 동일 알고리즘)
29
- const DEBOUNCE_COOLDOWN_MS = 120_000;
30
-
31
- function fileHash(filePath) {
32
- try {
33
- const content = fs.readFileSync(filePath, 'utf-8');
34
- return createHash('sha256').update(content).digest('hex').slice(0, 16);
35
- } catch {
36
- return '';
37
- }
38
- }
39
-
40
- function makeDebounceHelpers(stateFile) {
41
- function readState() {
42
- try {
43
- if (fs.existsSync(stateFile)) return JSON.parse(fs.readFileSync(stateFile, 'utf-8'));
44
- } catch { /* ignore */ }
45
- return {};
46
- }
47
-
48
- function writeState(state) {
49
- try {
50
- fs.mkdirSync(path.dirname(stateFile), { recursive: true });
51
- fs.writeFileSync(stateFile, JSON.stringify(state, null, 2), 'utf-8');
52
- } catch { /* ignore */ }
53
- }
54
-
55
- function shouldSkip(testFile, srcFile) {
56
- try {
57
- const state = readState();
58
- const entry = state[testFile];
59
- if (!entry) return false;
60
- const elapsed = Date.now() - entry.lastRun;
61
- if (elapsed > DEBOUNCE_COOLDOWN_MS) return false;
62
- const currentHash = fileHash(srcFile);
63
- if (currentHash !== entry.srcHash) return false;
64
- return true;
65
- } catch {
66
- return false;
67
- }
68
- }
69
-
70
- function updateState(testFile, srcFile) {
71
- const state = readState();
72
- state[testFile] = { lastRun: Date.now(), srcHash: fileHash(srcFile) };
73
- writeState(state);
74
- }
75
-
76
- return { shouldSkip, updateState, readState };
77
- }
78
-
79
- describe('auto-test debounce: 핵심 로직', () => {
80
- it('첫 실행: state 없음 → 스킵 안 함', () => {
81
- const stateFile = path.join(tmpDir, 'auto-test-state.json');
82
- const { shouldSkip } = makeDebounceHelpers(stateFile);
83
- const testFile = path.join(tmpDir, 'foo.test.ts');
84
- const srcFile = path.join(tmpDir, 'foo.ts');
85
- fs.writeFileSync(srcFile, 'const x = 1;\n', 'utf-8');
86
- expect(shouldSkip(testFile, srcFile)).toBe(false);
87
- });
88
-
89
- it('state 업데이트 후 쿨다운 내 + 소스 미변경 → 스킵', () => {
90
- const stateFile = path.join(tmpDir, 'auto-test-state.json');
91
- const { shouldSkip, updateState } = makeDebounceHelpers(stateFile);
92
- const testFile = path.join(tmpDir, 'foo.test.ts');
93
- const srcFile = path.join(tmpDir, 'foo.ts');
94
- fs.writeFileSync(srcFile, 'const x = 1;\n', 'utf-8');
95
- updateState(testFile, srcFile);
96
- // 소스 변경 없음 + 즉시 재호출 → 스킵
97
- expect(shouldSkip(testFile, srcFile)).toBe(true);
98
- });
99
-
100
- it('소스 변경 후 → 스킵 안 함 (재실행)', () => {
101
- const stateFile = path.join(tmpDir, 'auto-test-state.json');
102
- const { shouldSkip, updateState } = makeDebounceHelpers(stateFile);
103
- const testFile = path.join(tmpDir, 'foo.test.ts');
104
- const srcFile = path.join(tmpDir, 'foo.ts');
105
- fs.writeFileSync(srcFile, 'const x = 1;\n', 'utf-8');
106
- updateState(testFile, srcFile);
107
- // 소스 변경
108
- fs.writeFileSync(srcFile, 'const x = 2;\n', 'utf-8');
109
- expect(shouldSkip(testFile, srcFile)).toBe(false);
110
- });
111
-
112
- it('쿨다운 만료 → 스킵 안 함 (재실행)', () => {
113
- const stateFile = path.join(tmpDir, 'auto-test-state.json');
114
- const { shouldSkip, updateState, readState } = makeDebounceHelpers(stateFile);
115
- const testFile = path.join(tmpDir, 'foo.test.ts');
116
- const srcFile = path.join(tmpDir, 'foo.ts');
117
- fs.writeFileSync(srcFile, 'const x = 1;\n', 'utf-8');
118
- updateState(testFile, srcFile);
119
-
120
- // lastRun을 과거로 조작 (쿨다운 초과)
121
- const state = readState();
122
- state[testFile].lastRun = Date.now() - DEBOUNCE_COOLDOWN_MS - 1000;
123
- fs.mkdirSync(path.dirname(stateFile), { recursive: true });
124
- fs.writeFileSync(stateFile, JSON.stringify(state), 'utf-8');
125
-
126
- expect(shouldSkip(testFile, srcFile)).toBe(false);
127
- });
128
-
129
- it('state 파일 없어도 fail-open (스킵 안 함)', () => {
130
- const stateFile = path.join(tmpDir, 'nonexistent', 'state.json');
131
- const { shouldSkip } = makeDebounceHelpers(stateFile);
132
- const testFile = path.join(tmpDir, 'foo.test.ts');
133
- const srcFile = path.join(tmpDir, 'foo.ts');
134
- expect(shouldSkip(testFile, srcFile)).toBe(false);
135
- });
136
- });
137
-
138
- describe('auto-test: state 파일 경로 패턴', () => {
139
- it('state 파일이 .vibe/metrics/ 하위에 위치', () => {
140
- // 경로 패턴 검증 (실제 PROJECT_DIR은 다름)
141
- const expectedPattern = /\.vibe[/\\]metrics[/\\]auto-test-state\.json$/;
142
- const stateFile = path.join('/some/project', '.vibe', 'metrics', 'auto-test-state.json');
143
- expect(expectedPattern.test(stateFile)).toBe(true);
144
- });
145
- });