@su-record/vibe 3.2.14 → 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 (294) hide show
  1. package/dist/infra/lib/codex-proxy.d.ts +126 -0
  2. package/dist/infra/lib/codex-proxy.d.ts.map +1 -1
  3. package/dist/infra/lib/codex-proxy.js +16 -16
  4. package/dist/infra/lib/codex-proxy.js.map +1 -1
  5. package/dist/infra/lib/figma/audit.d.ts.map +1 -1
  6. package/dist/infra/lib/figma/audit.js +0 -2
  7. package/dist/infra/lib/figma/audit.js.map +1 -1
  8. package/dist/infra/lib/figma/extract.d.ts +6 -1
  9. package/dist/infra/lib/figma/extract.d.ts.map +1 -1
  10. package/dist/infra/lib/figma/extract.js +17 -15
  11. package/dist/infra/lib/figma/extract.js.map +1 -1
  12. package/dist/infra/lib/figma/types.d.ts +103 -0
  13. package/dist/infra/lib/figma/types.d.ts.map +1 -1
  14. package/dist/infra/lib/figma/types.js +8 -0
  15. package/dist/infra/lib/figma/types.js.map +1 -1
  16. package/hooks/scripts/clone-extract.js +16 -1
  17. package/hooks/scripts/code-check.js +12 -5
  18. package/hooks/scripts/lib/dispatcher.js +43 -3
  19. package/package.json +10 -8
  20. package/dist/__tests__/agent-model-sync.test.d.ts +0 -2
  21. package/dist/__tests__/agent-model-sync.test.d.ts.map +0 -1
  22. package/dist/__tests__/agent-model-sync.test.js +0 -71
  23. package/dist/__tests__/agent-model-sync.test.js.map +0 -1
  24. package/dist/__tests__/architecture.test.d.ts +0 -2
  25. package/dist/__tests__/architecture.test.d.ts.map +0 -1
  26. package/dist/__tests__/architecture.test.js +0 -207
  27. package/dist/__tests__/architecture.test.js.map +0 -1
  28. package/dist/__tests__/engines-contract.test.d.ts +0 -2
  29. package/dist/__tests__/engines-contract.test.d.ts.map +0 -1
  30. package/dist/__tests__/engines-contract.test.js +0 -72
  31. package/dist/__tests__/engines-contract.test.js.map +0 -1
  32. package/dist/__tests__/instruction-drift.test.d.ts +0 -2
  33. package/dist/__tests__/instruction-drift.test.d.ts.map +0 -1
  34. package/dist/__tests__/instruction-drift.test.js +0 -116
  35. package/dist/__tests__/instruction-drift.test.js.map +0 -1
  36. package/dist/__tests__/skill-namespace.test.d.ts +0 -2
  37. package/dist/__tests__/skill-namespace.test.d.ts.map +0 -1
  38. package/dist/__tests__/skill-namespace.test.js +0 -60
  39. package/dist/__tests__/skill-namespace.test.js.map +0 -1
  40. package/dist/__tests__/stakes-contract.test.d.ts +0 -2
  41. package/dist/__tests__/stakes-contract.test.d.ts.map +0 -1
  42. package/dist/__tests__/stakes-contract.test.js +0 -173
  43. package/dist/__tests__/stakes-contract.test.js.map +0 -1
  44. package/dist/__tests__/stuck-semantics.test.d.ts +0 -2
  45. package/dist/__tests__/stuck-semantics.test.d.ts.map +0 -1
  46. package/dist/__tests__/stuck-semantics.test.js +0 -161
  47. package/dist/__tests__/stuck-semantics.test.js.map +0 -1
  48. package/dist/__tests__/wiring-integrity.test.d.ts +0 -2
  49. package/dist/__tests__/wiring-integrity.test.d.ts.map +0 -1
  50. package/dist/__tests__/wiring-integrity.test.js +0 -160
  51. package/dist/__tests__/wiring-integrity.test.js.map +0 -1
  52. package/dist/cli/commands/info.test.d.ts +0 -2
  53. package/dist/cli/commands/info.test.d.ts.map +0 -1
  54. package/dist/cli/commands/info.test.js +0 -74
  55. package/dist/cli/commands/info.test.js.map +0 -1
  56. package/dist/cli/commands/upgrade.test.d.ts +0 -2
  57. package/dist/cli/commands/upgrade.test.d.ts.map +0 -1
  58. package/dist/cli/commands/upgrade.test.js +0 -99
  59. package/dist/cli/commands/upgrade.test.js.map +0 -1
  60. package/dist/cli/design/design-md-parser.test.d.ts +0 -2
  61. package/dist/cli/design/design-md-parser.test.d.ts.map +0 -1
  62. package/dist/cli/design/design-md-parser.test.js +0 -149
  63. package/dist/cli/design/design-md-parser.test.js.map +0 -1
  64. package/dist/cli/detect.characterization.test.d.ts +0 -7
  65. package/dist/cli/detect.characterization.test.d.ts.map +0 -1
  66. package/dist/cli/detect.characterization.test.js +0 -294
  67. package/dist/cli/detect.characterization.test.js.map +0 -1
  68. package/dist/cli/postinstall/fs-utils.test.d.ts +0 -2
  69. package/dist/cli/postinstall/fs-utils.test.d.ts.map +0 -1
  70. package/dist/cli/postinstall/fs-utils.test.js +0 -259
  71. package/dist/cli/postinstall/fs-utils.test.js.map +0 -1
  72. package/dist/cli/setup/CodexHooks.test.d.ts +0 -2
  73. package/dist/cli/setup/CodexHooks.test.d.ts.map +0 -1
  74. package/dist/cli/setup/CodexHooks.test.js +0 -52
  75. package/dist/cli/setup/CodexHooks.test.js.map +0 -1
  76. package/dist/cli/setup/GlobalInstaller.test.d.ts +0 -2
  77. package/dist/cli/setup/GlobalInstaller.test.d.ts.map +0 -1
  78. package/dist/cli/setup/GlobalInstaller.test.js +0 -16
  79. package/dist/cli/setup/GlobalInstaller.test.js.map +0 -1
  80. package/dist/cli/utils/cli-detector.test.d.ts +0 -2
  81. package/dist/cli/utils/cli-detector.test.d.ts.map +0 -1
  82. package/dist/cli/utils/cli-detector.test.js +0 -52
  83. package/dist/cli/utils/cli-detector.test.js.map +0 -1
  84. package/dist/infra/lib/SkillFrontmatter.test.d.ts +0 -2
  85. package/dist/infra/lib/SkillFrontmatter.test.d.ts.map +0 -1
  86. package/dist/infra/lib/SkillFrontmatter.test.js +0 -60
  87. package/dist/infra/lib/SkillFrontmatter.test.js.map +0 -1
  88. package/dist/infra/lib/__tests__/AutomationLevel.test.d.ts +0 -2
  89. package/dist/infra/lib/__tests__/AutomationLevel.test.d.ts.map +0 -1
  90. package/dist/infra/lib/__tests__/AutomationLevel.test.js +0 -297
  91. package/dist/infra/lib/__tests__/AutomationLevel.test.js.map +0 -1
  92. package/dist/infra/lib/__tests__/ComponentRegistry.test.d.ts +0 -2
  93. package/dist/infra/lib/__tests__/ComponentRegistry.test.d.ts.map +0 -1
  94. package/dist/infra/lib/__tests__/ComponentRegistry.test.js +0 -99
  95. package/dist/infra/lib/__tests__/ComponentRegistry.test.js.map +0 -1
  96. package/dist/infra/lib/__tests__/DecisionTracer.test.d.ts +0 -2
  97. package/dist/infra/lib/__tests__/DecisionTracer.test.d.ts.map +0 -1
  98. package/dist/infra/lib/__tests__/DecisionTracer.test.js +0 -274
  99. package/dist/infra/lib/__tests__/DecisionTracer.test.js.map +0 -1
  100. package/dist/infra/lib/__tests__/InteractiveCheckpoint.test.d.ts +0 -2
  101. package/dist/infra/lib/__tests__/InteractiveCheckpoint.test.d.ts.map +0 -1
  102. package/dist/infra/lib/__tests__/InteractiveCheckpoint.test.js +0 -350
  103. package/dist/infra/lib/__tests__/InteractiveCheckpoint.test.js.map +0 -1
  104. package/dist/infra/lib/__tests__/LoopBreaker.test.d.ts +0 -2
  105. package/dist/infra/lib/__tests__/LoopBreaker.test.d.ts.map +0 -1
  106. package/dist/infra/lib/__tests__/LoopBreaker.test.js +0 -340
  107. package/dist/infra/lib/__tests__/LoopBreaker.test.js.map +0 -1
  108. package/dist/infra/lib/__tests__/VerificationLoop.test.d.ts +0 -2
  109. package/dist/infra/lib/__tests__/VerificationLoop.test.d.ts.map +0 -1
  110. package/dist/infra/lib/__tests__/VerificationLoop.test.js +0 -486
  111. package/dist/infra/lib/__tests__/VerificationLoop.test.js.map +0 -1
  112. package/dist/infra/lib/config/GlobalConfigManager.test.d.ts +0 -2
  113. package/dist/infra/lib/config/GlobalConfigManager.test.d.ts.map +0 -1
  114. package/dist/infra/lib/config/GlobalConfigManager.test.js +0 -9
  115. package/dist/infra/lib/config/GlobalConfigManager.test.js.map +0 -1
  116. package/dist/infra/lib/embedding/__tests__/EmbeddingProvider.test.d.ts +0 -2
  117. package/dist/infra/lib/embedding/__tests__/EmbeddingProvider.test.d.ts.map +0 -1
  118. package/dist/infra/lib/embedding/__tests__/EmbeddingProvider.test.js +0 -43
  119. package/dist/infra/lib/embedding/__tests__/EmbeddingProvider.test.js.map +0 -1
  120. package/dist/infra/lib/embedding/__tests__/VectorStore.test.d.ts +0 -2
  121. package/dist/infra/lib/embedding/__tests__/VectorStore.test.d.ts.map +0 -1
  122. package/dist/infra/lib/embedding/__tests__/VectorStore.test.js +0 -94
  123. package/dist/infra/lib/embedding/__tests__/VectorStore.test.js.map +0 -1
  124. package/dist/infra/lib/embedding/__tests__/cosine.test.d.ts +0 -2
  125. package/dist/infra/lib/embedding/__tests__/cosine.test.d.ts.map +0 -1
  126. package/dist/infra/lib/embedding/__tests__/cosine.test.js +0 -73
  127. package/dist/infra/lib/embedding/__tests__/cosine.test.js.map +0 -1
  128. package/dist/infra/lib/evolution/__tests__/deprecation.test.d.ts +0 -2
  129. package/dist/infra/lib/evolution/__tests__/deprecation.test.d.ts.map +0 -1
  130. package/dist/infra/lib/evolution/__tests__/deprecation.test.js +0 -251
  131. package/dist/infra/lib/evolution/__tests__/deprecation.test.js.map +0 -1
  132. package/dist/infra/lib/evolution/__tests__/eval.test.d.ts +0 -2
  133. package/dist/infra/lib/evolution/__tests__/eval.test.d.ts.map +0 -1
  134. package/dist/infra/lib/evolution/__tests__/eval.test.js +0 -603
  135. package/dist/infra/lib/evolution/__tests__/eval.test.js.map +0 -1
  136. package/dist/infra/lib/evolution/__tests__/generation.test.d.ts +0 -2
  137. package/dist/infra/lib/evolution/__tests__/generation.test.d.ts.map +0 -1
  138. package/dist/infra/lib/evolution/__tests__/generation.test.js +0 -396
  139. package/dist/infra/lib/evolution/__tests__/generation.test.js.map +0 -1
  140. package/dist/infra/lib/evolution/__tests__/insight.test.d.ts +0 -2
  141. package/dist/infra/lib/evolution/__tests__/insight.test.d.ts.map +0 -1
  142. package/dist/infra/lib/evolution/__tests__/insight.test.js +0 -204
  143. package/dist/infra/lib/evolution/__tests__/insight.test.js.map +0 -1
  144. package/dist/infra/lib/evolution/__tests__/integration.test.d.ts +0 -2
  145. package/dist/infra/lib/evolution/__tests__/integration.test.d.ts.map +0 -1
  146. package/dist/infra/lib/evolution/__tests__/integration.test.js +0 -206
  147. package/dist/infra/lib/evolution/__tests__/integration.test.js.map +0 -1
  148. package/dist/infra/lib/evolution/__tests__/lifecycle.test.d.ts +0 -2
  149. package/dist/infra/lib/evolution/__tests__/lifecycle.test.d.ts.map +0 -1
  150. package/dist/infra/lib/evolution/__tests__/lifecycle.test.js +0 -350
  151. package/dist/infra/lib/evolution/__tests__/lifecycle.test.js.map +0 -1
  152. package/dist/infra/lib/evolution/__tests__/parity.test.d.ts +0 -2
  153. package/dist/infra/lib/evolution/__tests__/parity.test.d.ts.map +0 -1
  154. package/dist/infra/lib/evolution/__tests__/parity.test.js +0 -319
  155. package/dist/infra/lib/evolution/__tests__/parity.test.js.map +0 -1
  156. package/dist/infra/lib/llm/auth/AuthProfileManager.test.d.ts +0 -5
  157. package/dist/infra/lib/llm/auth/AuthProfileManager.test.d.ts.map +0 -1
  158. package/dist/infra/lib/llm/auth/AuthProfileManager.test.js +0 -168
  159. package/dist/infra/lib/llm/auth/AuthProfileManager.test.js.map +0 -1
  160. package/dist/infra/lib/llm/auth/TokenRefresher.test.d.ts +0 -2
  161. package/dist/infra/lib/llm/auth/TokenRefresher.test.d.ts.map +0 -1
  162. package/dist/infra/lib/llm/auth/TokenRefresher.test.js +0 -120
  163. package/dist/infra/lib/llm/auth/TokenRefresher.test.js.map +0 -1
  164. package/dist/infra/lib/llm/timeout.test.d.ts +0 -2
  165. package/dist/infra/lib/llm/timeout.test.d.ts.map +0 -1
  166. package/dist/infra/lib/llm/timeout.test.js +0 -50
  167. package/dist/infra/lib/llm/timeout.test.js.map +0 -1
  168. package/dist/infra/lib/llm-availability.test.d.ts +0 -2
  169. package/dist/infra/lib/llm-availability.test.d.ts.map +0 -1
  170. package/dist/infra/lib/llm-availability.test.js +0 -37
  171. package/dist/infra/lib/llm-availability.test.js.map +0 -1
  172. package/dist/infra/lib/memory/KnowledgeGraph.test.d.ts +0 -2
  173. package/dist/infra/lib/memory/KnowledgeGraph.test.d.ts.map +0 -1
  174. package/dist/infra/lib/memory/KnowledgeGraph.test.js +0 -189
  175. package/dist/infra/lib/memory/KnowledgeGraph.test.js.map +0 -1
  176. package/dist/infra/lib/memory/MemorySearch.test.d.ts +0 -2
  177. package/dist/infra/lib/memory/MemorySearch.test.d.ts.map +0 -1
  178. package/dist/infra/lib/memory/MemorySearch.test.js +0 -149
  179. package/dist/infra/lib/memory/MemorySearch.test.js.map +0 -1
  180. package/dist/infra/lib/memory/MemoryStorage.test.d.ts +0 -2
  181. package/dist/infra/lib/memory/MemoryStorage.test.d.ts.map +0 -1
  182. package/dist/infra/lib/memory/MemoryStorage.test.js +0 -198
  183. package/dist/infra/lib/memory/MemoryStorage.test.js.map +0 -1
  184. package/dist/infra/lib/memory/SessionRAGRetriever.test.d.ts +0 -2
  185. package/dist/infra/lib/memory/SessionRAGRetriever.test.d.ts.map +0 -1
  186. package/dist/infra/lib/memory/SessionRAGRetriever.test.js +0 -180
  187. package/dist/infra/lib/memory/SessionRAGRetriever.test.js.map +0 -1
  188. package/dist/infra/lib/memory/SessionRAGStore.test.d.ts +0 -2
  189. package/dist/infra/lib/memory/SessionRAGStore.test.d.ts.map +0 -1
  190. package/dist/infra/lib/memory/SessionRAGStore.test.js +0 -326
  191. package/dist/infra/lib/memory/SessionRAGStore.test.js.map +0 -1
  192. package/dist/infra/lib/memory/__tests__/InMemoryStorage.test.d.ts +0 -2
  193. package/dist/infra/lib/memory/__tests__/InMemoryStorage.test.d.ts.map +0 -1
  194. package/dist/infra/lib/memory/__tests__/InMemoryStorage.test.js +0 -114
  195. package/dist/infra/lib/memory/__tests__/InMemoryStorage.test.js.map +0 -1
  196. package/dist/infra/lib/memory/__tests__/ReflectionStore.test.d.ts +0 -2
  197. package/dist/infra/lib/memory/__tests__/ReflectionStore.test.d.ts.map +0 -1
  198. package/dist/infra/lib/memory/__tests__/ReflectionStore.test.js +0 -196
  199. package/dist/infra/lib/memory/__tests__/ReflectionStore.test.js.map +0 -1
  200. package/dist/infra/lib/memory/index.test.d.ts +0 -2
  201. package/dist/infra/lib/memory/index.test.d.ts.map +0 -1
  202. package/dist/infra/lib/memory/index.test.js +0 -23
  203. package/dist/infra/lib/memory/index.test.js.map +0 -1
  204. package/dist/infra/lib/telemetry/SkillTelemetry.test.d.ts +0 -2
  205. package/dist/infra/lib/telemetry/SkillTelemetry.test.d.ts.map +0 -1
  206. package/dist/infra/lib/telemetry/SkillTelemetry.test.js +0 -124
  207. package/dist/infra/lib/telemetry/SkillTelemetry.test.js.map +0 -1
  208. package/dist/infra/lib/ui-ux/Bm25Engine.test.d.ts +0 -2
  209. package/dist/infra/lib/ui-ux/Bm25Engine.test.d.ts.map +0 -1
  210. package/dist/infra/lib/ui-ux/Bm25Engine.test.js +0 -159
  211. package/dist/infra/lib/ui-ux/Bm25Engine.test.js.map +0 -1
  212. package/dist/infra/lib/ui-ux/CsvDataLoader.test.d.ts +0 -2
  213. package/dist/infra/lib/ui-ux/CsvDataLoader.test.d.ts.map +0 -1
  214. package/dist/infra/lib/ui-ux/CsvDataLoader.test.js +0 -141
  215. package/dist/infra/lib/ui-ux/CsvDataLoader.test.js.map +0 -1
  216. package/dist/infra/lib/ui-ux/DesignSystemGenerator.test.d.ts +0 -2
  217. package/dist/infra/lib/ui-ux/DesignSystemGenerator.test.d.ts.map +0 -1
  218. package/dist/infra/lib/ui-ux/DesignSystemGenerator.test.js +0 -370
  219. package/dist/infra/lib/ui-ux/DesignSystemGenerator.test.js.map +0 -1
  220. package/dist/infra/lib/ui-ux/SearchService.test.d.ts +0 -2
  221. package/dist/infra/lib/ui-ux/SearchService.test.d.ts.map +0 -1
  222. package/dist/infra/lib/ui-ux/SearchService.test.js +0 -215
  223. package/dist/infra/lib/ui-ux/SearchService.test.js.map +0 -1
  224. package/dist/test-helpers/index.d.ts +0 -36
  225. package/dist/test-helpers/index.d.ts.map +0 -1
  226. package/dist/test-helpers/index.js +0 -85
  227. package/dist/test-helpers/index.js.map +0 -1
  228. package/dist/test-helpers/index.test.d.ts +0 -2
  229. package/dist/test-helpers/index.test.d.ts.map +0 -1
  230. package/dist/test-helpers/index.test.js +0 -92
  231. package/dist/test-helpers/index.test.js.map +0 -1
  232. package/dist/tests/curated-release-notes.test.d.ts +0 -2
  233. package/dist/tests/curated-release-notes.test.d.ts.map +0 -1
  234. package/dist/tests/curated-release-notes.test.js +0 -160
  235. package/dist/tests/curated-release-notes.test.js.map +0 -1
  236. package/dist/tools/convention/analyzeComplexity.test.d.ts +0 -2
  237. package/dist/tools/convention/analyzeComplexity.test.d.ts.map +0 -1
  238. package/dist/tools/convention/analyzeComplexity.test.js +0 -207
  239. package/dist/tools/convention/analyzeComplexity.test.js.map +0 -1
  240. package/dist/tools/convention/validateCodeQuality.test.d.ts +0 -2
  241. package/dist/tools/convention/validateCodeQuality.test.d.ts.map +0 -1
  242. package/dist/tools/convention/validateCodeQuality.test.js +0 -230
  243. package/dist/tools/convention/validateCodeQuality.test.js.map +0 -1
  244. package/dist/tools/loop/validateLoopDefinition.test.d.ts +0 -14
  245. package/dist/tools/loop/validateLoopDefinition.test.d.ts.map +0 -1
  246. package/dist/tools/loop/validateLoopDefinition.test.js +0 -229
  247. package/dist/tools/loop/validateLoopDefinition.test.js.map +0 -1
  248. package/dist/tools/spec/executionPacket.test.d.ts +0 -2
  249. package/dist/tools/spec/executionPacket.test.d.ts.map +0 -1
  250. package/dist/tools/spec/executionPacket.test.js +0 -374
  251. package/dist/tools/spec/executionPacket.test.js.map +0 -1
  252. package/dist/tools/spec/prdParser.test.d.ts +0 -6
  253. package/dist/tools/spec/prdParser.test.d.ts.map +0 -1
  254. package/dist/tools/spec/prdParser.test.js +0 -332
  255. package/dist/tools/spec/prdParser.test.js.map +0 -1
  256. package/dist/tools/spec/specGenerator.test.d.ts +0 -2
  257. package/dist/tools/spec/specGenerator.test.d.ts.map +0 -1
  258. package/dist/tools/spec/specGenerator.test.js +0 -130
  259. package/dist/tools/spec/specGenerator.test.js.map +0 -1
  260. package/dist/tools/spec/traceabilityMatrix.path-resolution.test.d.ts +0 -10
  261. package/dist/tools/spec/traceabilityMatrix.path-resolution.test.d.ts.map +0 -1
  262. package/dist/tools/spec/traceabilityMatrix.path-resolution.test.js +0 -120
  263. package/dist/tools/spec/traceabilityMatrix.path-resolution.test.js.map +0 -1
  264. package/dist/tools/spec/traceabilityMatrix.test.d.ts +0 -6
  265. package/dist/tools/spec/traceabilityMatrix.test.d.ts.map +0 -1
  266. package/dist/tools/spec/traceabilityMatrix.test.js +0 -359
  267. package/dist/tools/spec/traceabilityMatrix.test.js.map +0 -1
  268. package/hooks/scripts/__tests__/.vibe/command-log.txt +0 -3
  269. package/hooks/scripts/__tests__/anchor-inbox.test.js +0 -119
  270. package/hooks/scripts/__tests__/auto-test-debounce.test.js +0 -145
  271. package/hooks/scripts/__tests__/clone-behaviors.test.js +0 -152
  272. package/hooks/scripts/__tests__/clone-merge-responsive.test.js +0 -106
  273. package/hooks/scripts/__tests__/code-check-detectors.test.js +0 -213
  274. package/hooks/scripts/__tests__/code-check-false-positive.test.js +0 -74
  275. package/hooks/scripts/__tests__/code-check-memory-write.test.js +0 -81
  276. package/hooks/scripts/__tests__/codex-hook-adapter.test.js +0 -64
  277. package/hooks/scripts/__tests__/curation-index.test.js +0 -157
  278. package/hooks/scripts/__tests__/dispatcher-inprocess.test.js +0 -99
  279. package/hooks/scripts/__tests__/figma-extract.test.js +0 -338
  280. package/hooks/scripts/__tests__/fixtures/seq-harness.js +0 -13
  281. package/hooks/scripts/__tests__/fixtures/seq-step.js +0 -22
  282. package/hooks/scripts/__tests__/hook-payload.test.js +0 -29
  283. package/hooks/scripts/__tests__/llm-orchestrate-antigravity.test.js +0 -66
  284. package/hooks/scripts/__tests__/loop-ledger.test.js +0 -321
  285. package/hooks/scripts/__tests__/post-edit-dispatcher.test.js +0 -139
  286. package/hooks/scripts/__tests__/pre-tool-guard.test.js +0 -523
  287. package/hooks/scripts/__tests__/recipe-extractor.test.js +0 -244
  288. package/hooks/scripts/__tests__/run-ledger-verify-required.test.js +0 -151
  289. package/hooks/scripts/__tests__/run-ledger.test.js +0 -481
  290. package/hooks/scripts/__tests__/scope-from-spec.test.js +0 -215
  291. package/hooks/scripts/__tests__/sentinel-guard.test.js +0 -263
  292. package/hooks/scripts/__tests__/step-counter.test.js +0 -459
  293. package/hooks/scripts/__tests__/stop-dispatcher-sequential.test.js +0 -74
  294. 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