@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,215 +0,0 @@
1
- import { describe, it, expect, beforeEach } from 'vitest';
2
- import { SearchService } from './SearchService.js';
3
- import { CsvDataLoader } from './CsvDataLoader.js';
4
- import { join } from 'path';
5
- import { fileURLToPath } from 'url';
6
- import { dirname } from 'path';
7
- const __filename = fileURLToPath(import.meta.url);
8
- const __dirname = dirname(__filename);
9
- const fixturesPath = join(__dirname, '../../../tests/fixtures/ui-ux-data');
10
- describe('SearchService', () => {
11
- let loader;
12
- let service;
13
- beforeEach(() => {
14
- loader = new CsvDataLoader(fixturesPath, { quiet: true });
15
- service = new SearchService(loader);
16
- service.initialize();
17
- });
18
- describe('search', () => {
19
- it('should search product domain and return results', () => {
20
- const result = service.search('SaaS', 'product');
21
- expect(result).toBeDefined();
22
- expect(result.domain).toBe('product');
23
- expect(result.query).toBe('SaaS');
24
- expect(result.count).toBeGreaterThanOrEqual(0);
25
- });
26
- it('should return empty results for non-matching query', () => {
27
- const result = service.search('xyzabc123notfound', 'product');
28
- expect(result.count).toBe(0);
29
- expect(result.results).toEqual([]);
30
- });
31
- it('should respect maxResults parameter', () => {
32
- const result = service.search('design', 'product', 1);
33
- expect(result.count).toBeLessThanOrEqual(1);
34
- });
35
- it('should clamp maxResults to upper bound', () => {
36
- const result = service.search('design', 'product', 1000);
37
- expect(result.count).toBeLessThanOrEqual(50);
38
- });
39
- it('should search color domain', () => {
40
- const result = service.search('SaaS', 'color');
41
- expect(result.domain).toBe('color');
42
- expect(result.file).toBe('colors.csv');
43
- });
44
- it('should search typography domain', () => {
45
- const result = service.search('modern', 'typography');
46
- expect(result.domain).toBe('typography');
47
- });
48
- it('should search landing domain', () => {
49
- const result = service.search('hero', 'landing');
50
- expect(result.domain).toBe('landing');
51
- });
52
- it('should return proper search result structure', () => {
53
- const result = service.search('SaaS', 'product');
54
- expect(result).toHaveProperty('domain');
55
- expect(result).toHaveProperty('query');
56
- expect(result).toHaveProperty('file');
57
- expect(result).toHaveProperty('count');
58
- expect(result).toHaveProperty('results');
59
- expect(Array.isArray(result.results)).toBe(true);
60
- });
61
- it('should include score and index in results', () => {
62
- const result = service.search('SaaS', 'product', 5);
63
- if (result.results.length > 0) {
64
- const firstResult = result.results[0];
65
- expect(firstResult).toHaveProperty('item');
66
- expect(firstResult).toHaveProperty('score');
67
- expect(firstResult).toHaveProperty('index');
68
- expect(typeof firstResult.score).toBe('number');
69
- expect(typeof firstResult.index).toBe('number');
70
- }
71
- });
72
- });
73
- describe('searchStack', () => {
74
- it('should search stack-specific data', () => {
75
- const result = service.searchStack('Image Optimization', 'nextjs');
76
- expect(result).toBeDefined();
77
- expect(result.domain).toBe('nextjs');
78
- });
79
- it('should return results for valid stack', () => {
80
- const result = service.searchStack('routing', 'nextjs');
81
- expect(result.count).toBeGreaterThanOrEqual(0);
82
- });
83
- it('should return empty results for unknown stack', () => {
84
- const result = service.searchStack('test', 'unknownstack');
85
- expect(result.count).toBe(0);
86
- });
87
- it('should respect maxResults for stack search', () => {
88
- const result = service.searchStack('performance', 'nextjs', 1);
89
- expect(result.count).toBeLessThanOrEqual(1);
90
- });
91
- });
92
- describe('detectDomain', () => {
93
- it('should detect style domain from keywords', () => {
94
- const domain = service.detectDomain('glassmorphism design');
95
- expect(domain).toBe('style');
96
- });
97
- it('should detect color domain from keywords', () => {
98
- const domain = service.detectDomain('hex color palette');
99
- expect(domain).toBe('color');
100
- });
101
- it('should detect landing domain from keywords', () => {
102
- const domain = service.detectDomain('hero landing page');
103
- expect(domain).toBe('landing');
104
- });
105
- it('should detect typography domain from keywords', () => {
106
- const domain = service.detectDomain('font pairing google fonts');
107
- expect(domain).toBe('typography');
108
- });
109
- it('should detect chart domain from keywords', () => {
110
- const domain = service.detectDomain('bar chart visualization');
111
- expect(domain).toBe('chart');
112
- });
113
- it('should default to product domain when no keywords match', () => {
114
- const domain = service.detectDomain('xyzqwerty notaword');
115
- expect(domain).toBe('product');
116
- });
117
- it('should handle single word queries', () => {
118
- const domain = service.detectDomain('color');
119
- expect(typeof domain).toBe('string');
120
- });
121
- });
122
- describe('auto domain detection in search', () => {
123
- it('should auto-detect domain when not specified', () => {
124
- const result = service.search('glassmorphism modern');
125
- expect(result.domain).toBe('style');
126
- });
127
- it('should use provided domain over auto-detection', () => {
128
- const result = service.search('glassmorphism', 'color');
129
- expect(result.domain).toBe('color');
130
- });
131
- it('should fall back to product domain for generic query', () => {
132
- const result = service.search('something');
133
- expect(typeof result.domain).toBe('string');
134
- });
135
- });
136
- describe('LRU cache', () => {
137
- it('should cache search results', () => {
138
- const query = 'SaaS business';
139
- const result1 = service.search(query, 'product', 10);
140
- const result2 = service.search(query, 'product', 10);
141
- expect(result1).toEqual(result2);
142
- });
143
- it('should return cached result on second call', () => {
144
- const query = 'modern design';
145
- const result1 = service.search(query, 'style');
146
- const result2 = service.search(query, 'style');
147
- expect(result1.results).toEqual(result2.results);
148
- });
149
- it('should use different cache entries for different domains', () => {
150
- const query = 'blue';
151
- const resultColor = service.search(query, 'color');
152
- const resultStyle = service.search(query, 'style');
153
- expect(resultColor.domain).toBe('color');
154
- expect(resultStyle.domain).toBe('style');
155
- });
156
- it('should use different cache entries for different maxResults', () => {
157
- const query = 'design';
158
- const result1 = service.search(query, 'style', 1);
159
- const result2 = service.search(query, 'style', 5);
160
- expect(result1.count).toBeLessThanOrEqual(1);
161
- expect(result2.count).toBeLessThanOrEqual(5);
162
- });
163
- });
164
- describe('query sanitization', () => {
165
- it('should truncate query longer than 200 characters', () => {
166
- const longQuery = 'a'.repeat(300);
167
- const result = service.search(longQuery, 'product');
168
- expect(result.query.length).toBeLessThanOrEqual(200);
169
- });
170
- it('should limit query tokens to 20', () => {
171
- const manyTokens = Array(30).fill('word').join(' ');
172
- const result = service.search(manyTokens, 'product');
173
- const tokenCount = result.query.split(/\s+/).length;
174
- expect(tokenCount).toBeLessThanOrEqual(20);
175
- });
176
- it('should trim whitespace from query', () => {
177
- const result = service.search(' query with spaces ', 'product');
178
- expect(result.query).toBe('query with spaces');
179
- });
180
- });
181
- describe('clearCache', () => {
182
- it('should clear expired cache entries', () => {
183
- const service2 = new SearchService(loader);
184
- service2.initialize();
185
- service2.search('test', 'product');
186
- service2.clearCache();
187
- expect(true).toBe(true);
188
- });
189
- });
190
- describe('edge cases', () => {
191
- it('should handle empty query', () => {
192
- const result = service.search('', 'product');
193
- expect(result.count).toBe(0);
194
- });
195
- it('should handle query with only stopwords', () => {
196
- const result = service.search('the and or', 'product');
197
- expect(result.count).toBe(0);
198
- });
199
- it('should handle special characters in query', () => {
200
- const result = service.search('design@ui#style', 'style');
201
- expect(typeof result.count).toBe('number');
202
- });
203
- it('should handle Korean text queries', () => {
204
- const result = service.search('디자인', 'product');
205
- expect(typeof result.count).toBe('number');
206
- });
207
- it('should initialize only once', () => {
208
- const service2 = new SearchService(loader);
209
- service2.initialize();
210
- service2.initialize();
211
- expect(true).toBe(true);
212
- });
213
- });
214
- });
215
- //# sourceMappingURL=SearchService.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SearchService.test.js","sourceRoot":"","sources":["../../../../src/infra/lib/ui-ux/SearchService.test.ts"],"names":[],"mappings":"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"}
@@ -1,36 +0,0 @@
1
- /**
2
- * 공유 테스트 헬퍼 — 모든 테스트에서 재사용 가능한 유틸리티
3
- */
4
- /** 고유한 임시 테스트 디렉토리 생성 */
5
- export declare function createTempDir(prefix?: string): string;
6
- /** 임시 디렉토리 정리 (afterEach에서 사용) */
7
- export declare function cleanupTempDir(dir: string): void;
8
- export interface TestVibeConfig {
9
- stackTypes: string[];
10
- capabilities: string[];
11
- projectName?: string;
12
- details?: string;
13
- }
14
- /** 테스트용 vibe 프로젝트 설정 생성 */
15
- export declare function createTestConfig(overrides?: Partial<TestVibeConfig>): TestVibeConfig;
16
- /** 디스크에 테스트 설정 파일 생성 */
17
- export declare function writeTestConfig(dir: string, config?: Partial<TestVibeConfig>): string;
18
- export interface TestSkillOptions {
19
- name: string;
20
- description?: string;
21
- triggers?: string[];
22
- priority?: number;
23
- body?: string;
24
- }
25
- /** 테스트용 SKILL.md 생성 */
26
- export declare function createTestSkill(dir: string, options: TestSkillOptions): string;
27
- /** JSONL 파일에서 이벤트 파싱 */
28
- export declare function parseJsonl<T = Record<string, unknown>>(content: string): T[];
29
- /** 지정 시간(ms) 대기 */
30
- export declare function sleep(ms: number): Promise<void>;
31
- /** 함수 실행 시간 측정 (ms) */
32
- export declare function measureTime<T>(fn: () => T | Promise<T>): Promise<{
33
- result: T;
34
- durationMs: number;
35
- }>;
36
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test-helpers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,yBAAyB;AACzB,wBAAgB,aAAa,CAAC,MAAM,SAAc,GAAG,MAAM,CAI1D;AAED,kCAAkC;AAClC,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAQhD;AAID,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,2BAA2B;AAC3B,wBAAgB,gBAAgB,CAAC,SAAS,GAAE,OAAO,CAAC,cAAc,CAAM,GAAG,cAAc,CAQxF;AAED,wBAAwB;AACxB,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,MAAM,CAMrF;AAID,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,uBAAuB;AACvB,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAqB9E;AAID,wBAAwB;AACxB,wBAAgB,UAAU,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,EAAE,CAM5E;AAID,mBAAmB;AACnB,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED,uBAAuB;AACvB,wBAAsB,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,CAAC,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAKzG"}
@@ -1,85 +0,0 @@
1
- /**
2
- * 공유 테스트 헬퍼 — 모든 테스트에서 재사용 가능한 유틸리티
3
- */
4
- import { rmSync, mkdirSync, writeFileSync, existsSync } from 'fs';
5
- import { join } from 'path';
6
- import { tmpdir } from 'os';
7
- // ─── 임시 디렉토리 관리 ───
8
- /** 고유한 임시 테스트 디렉토리 생성 */
9
- export function createTempDir(prefix = 'vibe-test') {
10
- const dir = join(tmpdir(), `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2)}`);
11
- mkdirSync(dir, { recursive: true });
12
- return dir;
13
- }
14
- /** 임시 디렉토리 정리 (afterEach에서 사용) */
15
- export function cleanupTempDir(dir) {
16
- try {
17
- if (existsSync(dir)) {
18
- rmSync(dir, { recursive: true, force: true });
19
- }
20
- }
21
- catch {
22
- // Ignore cleanup errors on Windows (file locking)
23
- }
24
- }
25
- /** 테스트용 vibe 프로젝트 설정 생성 */
26
- export function createTestConfig(overrides = {}) {
27
- return {
28
- stackTypes: ['typescript-react'],
29
- capabilities: [],
30
- projectName: 'test-project',
31
- details: 'Test project for unit tests',
32
- ...overrides,
33
- };
34
- }
35
- /** 디스크에 테스트 설정 파일 생성 */
36
- export function writeTestConfig(dir, config) {
37
- const configDir = join(dir, '.claude', 'vibe');
38
- mkdirSync(configDir, { recursive: true });
39
- const configPath = join(configDir, 'config.json');
40
- writeFileSync(configPath, JSON.stringify(createTestConfig(config), null, 2));
41
- return configPath;
42
- }
43
- /** 테스트용 SKILL.md 생성 */
44
- export function createTestSkill(dir, options) {
45
- const skillDir = join(dir, options.name);
46
- mkdirSync(skillDir, { recursive: true });
47
- const frontmatter = [
48
- '---',
49
- `name: ${options.name}`,
50
- `description: "${options.description ?? `Test skill ${options.name}`}"`,
51
- ];
52
- if (options.triggers) {
53
- frontmatter.push(`triggers: [${options.triggers.join(', ')}]`);
54
- }
55
- if (options.priority !== undefined) {
56
- frontmatter.push(`priority: ${options.priority}`);
57
- }
58
- frontmatter.push('---');
59
- const content = frontmatter.join('\n') + '\n\n' + (options.body ?? `# ${options.name}\n\nTest skill content.\n`);
60
- const filePath = join(skillDir, 'SKILL.md');
61
- writeFileSync(filePath, content);
62
- return filePath;
63
- }
64
- // ─── JSONL 헬퍼 ───
65
- /** JSONL 파일에서 이벤트 파싱 */
66
- export function parseJsonl(content) {
67
- return content
68
- .trim()
69
- .split('\n')
70
- .filter(line => line.trim().length > 0)
71
- .map(line => JSON.parse(line));
72
- }
73
- // ─── 타이밍 유틸 ───
74
- /** 지정 시간(ms) 대기 */
75
- export function sleep(ms) {
76
- return new Promise(resolve => setTimeout(resolve, ms));
77
- }
78
- /** 함수 실행 시간 측정 (ms) */
79
- export async function measureTime(fn) {
80
- const start = performance.now();
81
- const result = await fn();
82
- const durationMs = Math.round(performance.now() - start);
83
- return { result, durationMs };
84
- }
85
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/test-helpers/index.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=index.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../src/test-helpers/index.test.ts"],"names":[],"mappings":""}
@@ -1,92 +0,0 @@
1
- import { describe, it, expect, afterEach } from 'vitest';
2
- import { existsSync, readFileSync } from 'fs';
3
- import { createTempDir, cleanupTempDir, createTestConfig, writeTestConfig, createTestSkill, parseJsonl, measureTime, } from './index.js';
4
- describe('test-helpers', () => {
5
- const dirs = [];
6
- afterEach(() => {
7
- for (const dir of dirs)
8
- cleanupTempDir(dir);
9
- dirs.length = 0;
10
- });
11
- describe('createTempDir / cleanupTempDir', () => {
12
- it('should create a unique temporary directory', () => {
13
- const dir = createTempDir();
14
- dirs.push(dir);
15
- expect(existsSync(dir)).toBe(true);
16
- expect(dir).toContain('vibe-test');
17
- });
18
- it('should accept custom prefix', () => {
19
- const dir = createTempDir('custom-prefix');
20
- dirs.push(dir);
21
- expect(dir).toContain('custom-prefix');
22
- });
23
- it('should cleanup directory', () => {
24
- const dir = createTempDir();
25
- expect(existsSync(dir)).toBe(true);
26
- cleanupTempDir(dir);
27
- expect(existsSync(dir)).toBe(false);
28
- });
29
- });
30
- describe('createTestConfig', () => {
31
- it('should return default config', () => {
32
- const config = createTestConfig();
33
- expect(config.stackTypes).toEqual(['typescript-react']);
34
- expect(config.capabilities).toEqual([]);
35
- expect(config.projectName).toBe('test-project');
36
- });
37
- it('should accept overrides', () => {
38
- const config = createTestConfig({ stackTypes: ['python-django'], capabilities: ['commerce'] });
39
- expect(config.stackTypes).toEqual(['python-django']);
40
- expect(config.capabilities).toEqual(['commerce']);
41
- });
42
- });
43
- describe('writeTestConfig', () => {
44
- it('should write config file to disk', () => {
45
- const dir = createTempDir();
46
- dirs.push(dir);
47
- const configPath = writeTestConfig(dir, { projectName: 'my-project' });
48
- expect(existsSync(configPath)).toBe(true);
49
- const content = JSON.parse(readFileSync(configPath, 'utf-8'));
50
- expect(content.projectName).toBe('my-project');
51
- });
52
- });
53
- describe('createTestSkill', () => {
54
- it('should create SKILL.md with frontmatter', () => {
55
- const dir = createTempDir();
56
- dirs.push(dir);
57
- const skillPath = createTestSkill(dir, {
58
- name: 'test-skill',
59
- description: 'A test skill',
60
- triggers: ['test', 'demo'],
61
- priority: 50,
62
- });
63
- expect(existsSync(skillPath)).toBe(true);
64
- const content = readFileSync(skillPath, 'utf-8');
65
- expect(content).toContain('name: test-skill');
66
- expect(content).toContain('triggers: [test, demo]');
67
- expect(content).toContain('priority: 50');
68
- });
69
- });
70
- describe('parseJsonl', () => {
71
- it('should parse JSONL content', () => {
72
- const content = '{"a":1}\n{"a":2}\n{"a":3}\n';
73
- const result = parseJsonl(content);
74
- expect(result).toHaveLength(3);
75
- expect(result[0].a).toBe(1);
76
- expect(result[2].a).toBe(3);
77
- });
78
- it('should skip empty lines', () => {
79
- const content = '{"a":1}\n\n{"a":2}\n';
80
- const result = parseJsonl(content);
81
- expect(result).toHaveLength(2);
82
- });
83
- });
84
- describe('measureTime', () => {
85
- it('should measure sync function duration', async () => {
86
- const { result, durationMs } = await measureTime(() => 42);
87
- expect(result).toBe(42);
88
- expect(durationMs).toBeGreaterThanOrEqual(0);
89
- });
90
- });
91
- });
92
- //# sourceMappingURL=index.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/test-helpers/index.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=curated-release-notes.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"curated-release-notes.test.d.ts","sourceRoot":"","sources":["../../src/tests/curated-release-notes.test.ts"],"names":[],"mappings":""}
@@ -1,160 +0,0 @@
1
- import { readFileSync } from 'node:fs';
2
- import { resolve } from 'node:path';
3
- import { describe, expect, it } from 'vitest';
4
- import { classifyCommits, createReleaseNotes, selectChangedSpecPaths, selectPreviousSemanticTag, } from '../tools/release/releaseNotes.js';
5
- const CLASSIFICATION_CASES = [
6
- ['feat: add packets', 'Added'],
7
- ['fix(parser): reject drift', 'Fixed'],
8
- ['docs: explain packets', 'Documentation'],
9
- ['refactor: split compiler', 'Internal'],
10
- ['chore: refresh fixtures', 'Internal'],
11
- ['perf: cache parsing', 'Changed'],
12
- ];
13
- describe('selectPreviousSemanticTag', () => {
14
- it('REQ-release-notes-001 uses the previous semantic version and ignores log tags', () => {
15
- const tags = ['log-20260720', 'v3.1.9', 'v3.2.0', 'v3.2.1'];
16
- expect(selectPreviousSemanticTag(tags, 'v3.2.1')).toBe('v3.2.0');
17
- });
18
- });
19
- describe('REQ-release-notes-003 classifyCommits', () => {
20
- it.each(CLASSIFICATION_CASES)('REQ-release-notes-003 places %s in %s', (subject, section) => {
21
- const result = classifyCommits([{ subject, body: '' }]);
22
- expect(result[section]).toEqual([subject.replace(/^[^:]+:\s*/, '')]);
23
- });
24
- it('puts breaking changes first and excludes merge and version commits', () => {
25
- const result = classifyCommits([
26
- { subject: 'feat!: replace packet schema', body: '' },
27
- { subject: 'Merge pull request #45', body: '' },
28
- { subject: '3.2.1', body: '' },
29
- ]);
30
- expect(result.Breaking).toEqual(['replace packet schema']);
31
- expect(Object.values(result).flat()).not.toContain('Merge pull request #45');
32
- expect(Object.values(result).flat()).not.toContain('3.2.1');
33
- });
34
- });
35
- describe('createReleaseNotes', () => {
36
- it('REQ-release-notes-002 includes the SPEC overview and every requirement', () => {
37
- const spec = `# SPEC: Execution Packets
38
-
39
- ## 1. Overview / Goal
40
-
41
- Compile canonical specifications into deterministic execution packets.
42
-
43
- ## 2. Requirements
44
-
45
- | ID | Requirement | Done Criteria |
46
- |----|-------------|---------------|
47
- | REQ-packet-001 | Preserve every requirement | D1 |
48
- | REQ-packet-002 | Reject stale packets | D2 |
49
- `;
50
- const notes = createReleaseNotes({
51
- currentTag: 'v3.2.1',
52
- previousTag: 'v3.2.0',
53
- specs: [{ path: '.vibe/specs/execution-packet-compiler.md', content: spec }],
54
- commits: [
55
- { subject: 'feat: compile execution packets', body: '' },
56
- { subject: 'fix: reject tampered evidence', body: '' },
57
- ],
58
- });
59
- expect(notes).toContain('## Highlights');
60
- expect(notes).toContain('Compile canonical specifications into deterministic execution packets.');
61
- expect(notes).toContain('Preserve every requirement');
62
- expect(notes).toContain('Reject stale packets');
63
- expect(notes).toContain('## Added');
64
- expect(notes).toContain('## Fixed');
65
- expect(notes).toContain('## Verification');
66
- expect(notes).toContain('`v3.2.0..v3.2.1`');
67
- });
68
- });
69
- describe('release workflow', () => {
70
- it('REQ-release-notes-004 checks out full history and publishes a generated notes file', () => {
71
- const workflow = readFileSync(resolve('.github/workflows/release.yml'), 'utf8');
72
- expect(workflow).toMatch(/fetch-depth:\s*0/);
73
- expect(workflow).toContain('generate-release-notes');
74
- expect(workflow).toContain('--notes-file');
75
- expect(workflow).not.toContain('--generate-notes');
76
- });
77
- it('REQ-release-notes-006 preserves the build and full test gates', () => {
78
- const workflow = readFileSync(resolve('.github/workflows/release.yml'), 'utf8');
79
- expect(workflow).toContain('pnpm build');
80
- expect(workflow).toContain('pnpm test -- --reporter=default');
81
- });
82
- });
83
- describe('published release contract', () => {
84
- it('REQ-release-notes-005 renders the required public sections', () => {
85
- const notes = createReleaseNotes({
86
- currentTag: 'v3.2.1',
87
- previousTag: 'v3.2.0',
88
- specs: [{ path: 'feature.md', content: '# SPEC: Feature\n\n## Overview\nUseful change.' }],
89
- commits: [
90
- { subject: 'feat: add capability', body: '' },
91
- { subject: 'fix: correct behavior', body: '' },
92
- ],
93
- });
94
- expect(notes).toContain('## Highlights');
95
- expect(notes).toContain('## Added');
96
- expect(notes).toContain('## Fixed');
97
- expect(notes).toContain('## Verification');
98
- });
99
- });
100
- describe('release notes CLI', () => {
101
- it('excludes deleted specifications from the current tag lookup', () => {
102
- const cli = readFileSync(resolve('src/cli/generate-release-notes.ts'), 'utf8');
103
- expect(cli).toContain("'--diff-filter=AMR'");
104
- });
105
- it('detects renames so pure moves can be filtered', () => {
106
- const cli = readFileSync(resolve('src/cli/generate-release-notes.ts'), 'utf8');
107
- expect(cli).toContain("'--name-status'");
108
- expect(cli).toContain("'-M'");
109
- });
110
- // pathspec 은 rename 짝을 잘라 R100 을 A 로 만든다 — 경로 필터는 순수 함수 쪽에 있어야 한다
111
- it('does not restrict the spec diff with a pathspec', () => {
112
- const cli = readFileSync(resolve('src/cli/generate-release-notes.ts'), 'utf8');
113
- expect(cli).not.toContain("'--', '.vibe/specs'");
114
- });
115
- });
116
- /**
117
- * 디렉토리 재편이 릴리즈 노트를 오염시키던 회귀를 막는다:
118
- * 레거시 `.claude/vibe/specs/` → `.vibe/specs/` 이전만으로 몇 달 전 feature 가
119
- * 신규 Highlights 로 올라갔다 (v3.2.8 준비 중 발견).
120
- */
121
- describe('selectChangedSpecPaths', () => {
122
- it('keeps added and modified specs', () => {
123
- const nameStatus = ['A\t.vibe/specs/new-feature.md', 'M\t.vibe/specs/existing.md'].join('\n');
124
- expect(selectChangedSpecPaths(nameStatus)).toEqual([
125
- '.vibe/specs/new-feature.md',
126
- '.vibe/specs/existing.md',
127
- ]);
128
- });
129
- it('drops pure renames — a move is not release content', () => {
130
- const nameStatus = 'R100\t.claude/vibe/specs/old-feature.md\t.vibe/specs/old-feature.md';
131
- expect(selectChangedSpecPaths(nameStatus)).toEqual([]);
132
- });
133
- it('keeps a rename that also changed content, using the new path', () => {
134
- const nameStatus = 'R087\t.vibe/specs/before.md\t.vibe/specs/after.md';
135
- expect(selectChangedSpecPaths(nameStatus)).toEqual(['.vibe/specs/after.md']);
136
- });
137
- it('drops deletions — they do not exist at the current tag', () => {
138
- expect(selectChangedSpecPaths('D\t.vibe/specs/removed.md')).toEqual([]);
139
- });
140
- it('ignores non-markdown entries and blank lines', () => {
141
- const nameStatus = ['A\t.vibe/specs/notes.txt', '', 'A\t.vibe/specs/real.md'].join('\n');
142
- expect(selectChangedSpecPaths(nameStatus)).toEqual(['.vibe/specs/real.md']);
143
- });
144
- // 경로 필터가 git pathspec 이 아니라 이 함수에 있어야 하는 이유:
145
- // pathspec 으로 제한하면 rename 원본이 밖에 있을 때 git 이 R100 대신 A 를 낸다.
146
- it('filters to .vibe/specs/ so the diff can run without a pathspec', () => {
147
- const nameStatus = [
148
- 'M\tsrc/cli/index.ts',
149
- 'A\tCLAUDE.md',
150
- 'M\t.vibe/features/thing.feature',
151
- 'A\t.vibe/specs/real.md',
152
- ].join('\n');
153
- expect(selectChangedSpecPaths(nameStatus)).toEqual(['.vibe/specs/real.md']);
154
- });
155
- it('drops the legacy .claude/vibe/specs source side of a move', () => {
156
- const nameStatus = 'R100\t.claude/vibe/specs/a.md\t.vibe/specs/a.md';
157
- expect(selectChangedSpecPaths(nameStatus)).toEqual([]);
158
- });
159
- });
160
- //# sourceMappingURL=curated-release-notes.test.js.map