@su-record/vibe 3.2.14 → 3.2.16

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 (351) hide show
  1. package/dist/cli/commands/index.d.ts +1 -1
  2. package/dist/cli/commands/index.d.ts.map +1 -1
  3. package/dist/cli/commands/index.js +1 -1
  4. package/dist/cli/commands/index.js.map +1 -1
  5. package/dist/cli/commands/info.d.ts +3 -1
  6. package/dist/cli/commands/info.d.ts.map +1 -1
  7. package/dist/cli/commands/info.js +12 -3
  8. package/dist/cli/commands/info.js.map +1 -1
  9. package/dist/cli/commands/init.d.ts +0 -7
  10. package/dist/cli/commands/init.d.ts.map +1 -1
  11. package/dist/cli/commands/init.js +5 -37
  12. package/dist/cli/commands/init.js.map +1 -1
  13. package/dist/cli/commands/update.d.ts.map +1 -1
  14. package/dist/cli/commands/update.js +4 -6
  15. package/dist/cli/commands/update.js.map +1 -1
  16. package/dist/cli/commands/upgrade.d.ts +1 -1
  17. package/dist/cli/commands/upgrade.d.ts.map +1 -1
  18. package/dist/cli/commands/upgrade.js +7 -2
  19. package/dist/cli/commands/upgrade.js.map +1 -1
  20. package/dist/cli/postinstall/claude-agents.js +1 -1
  21. package/dist/cli/postinstall/claude-agents.js.map +1 -1
  22. package/dist/cli/postinstall/constants.d.ts +0 -1
  23. package/dist/cli/postinstall/constants.d.ts.map +1 -1
  24. package/dist/cli/postinstall/constants.js +0 -8
  25. package/dist/cli/postinstall/constants.js.map +1 -1
  26. package/dist/cli/postinstall/main.d.ts.map +1 -1
  27. package/dist/cli/postinstall/main.js +20 -13
  28. package/dist/cli/postinstall/main.js.map +1 -1
  29. package/dist/cli/postinstall.d.ts +0 -3
  30. package/dist/cli/postinstall.d.ts.map +1 -1
  31. package/dist/cli/postinstall.js +0 -3
  32. package/dist/cli/postinstall.js.map +1 -1
  33. package/dist/cli/setup/InstallHome.d.ts +27 -0
  34. package/dist/cli/setup/InstallHome.d.ts.map +1 -0
  35. package/dist/cli/setup/InstallHome.js +105 -0
  36. package/dist/cli/setup/InstallHome.js.map +1 -0
  37. package/dist/cli/setup/ProjectSetup.d.ts +0 -8
  38. package/dist/cli/setup/ProjectSetup.d.ts.map +1 -1
  39. package/dist/cli/setup/ProjectSetup.js +0 -96
  40. package/dist/cli/setup/ProjectSetup.js.map +1 -1
  41. package/dist/cli/setup.d.ts +1 -1
  42. package/dist/cli/setup.d.ts.map +1 -1
  43. package/dist/cli/setup.js +1 -1
  44. package/dist/cli/setup.js.map +1 -1
  45. package/dist/infra/lib/codex-proxy.d.ts +126 -0
  46. package/dist/infra/lib/codex-proxy.d.ts.map +1 -1
  47. package/dist/infra/lib/codex-proxy.js +16 -16
  48. package/dist/infra/lib/codex-proxy.js.map +1 -1
  49. package/dist/infra/lib/figma/audit.d.ts.map +1 -1
  50. package/dist/infra/lib/figma/audit.js +0 -2
  51. package/dist/infra/lib/figma/audit.js.map +1 -1
  52. package/dist/infra/lib/figma/extract.d.ts +6 -1
  53. package/dist/infra/lib/figma/extract.d.ts.map +1 -1
  54. package/dist/infra/lib/figma/extract.js +17 -15
  55. package/dist/infra/lib/figma/extract.js.map +1 -1
  56. package/dist/infra/lib/figma/types.d.ts +103 -0
  57. package/dist/infra/lib/figma/types.d.ts.map +1 -1
  58. package/dist/infra/lib/figma/types.js +8 -0
  59. package/dist/infra/lib/figma/types.js.map +1 -1
  60. package/hooks/scripts/clone-extract.js +16 -1
  61. package/hooks/scripts/code-check.js +12 -5
  62. package/hooks/scripts/lib/dispatcher.js +43 -3
  63. package/hooks/scripts/utils.js +32 -2
  64. package/package.json +10 -8
  65. package/dist/__tests__/agent-model-sync.test.d.ts +0 -2
  66. package/dist/__tests__/agent-model-sync.test.d.ts.map +0 -1
  67. package/dist/__tests__/agent-model-sync.test.js +0 -71
  68. package/dist/__tests__/agent-model-sync.test.js.map +0 -1
  69. package/dist/__tests__/architecture.test.d.ts +0 -2
  70. package/dist/__tests__/architecture.test.d.ts.map +0 -1
  71. package/dist/__tests__/architecture.test.js +0 -207
  72. package/dist/__tests__/architecture.test.js.map +0 -1
  73. package/dist/__tests__/engines-contract.test.d.ts +0 -2
  74. package/dist/__tests__/engines-contract.test.d.ts.map +0 -1
  75. package/dist/__tests__/engines-contract.test.js +0 -72
  76. package/dist/__tests__/engines-contract.test.js.map +0 -1
  77. package/dist/__tests__/instruction-drift.test.d.ts +0 -2
  78. package/dist/__tests__/instruction-drift.test.d.ts.map +0 -1
  79. package/dist/__tests__/instruction-drift.test.js +0 -116
  80. package/dist/__tests__/instruction-drift.test.js.map +0 -1
  81. package/dist/__tests__/skill-namespace.test.d.ts +0 -2
  82. package/dist/__tests__/skill-namespace.test.d.ts.map +0 -1
  83. package/dist/__tests__/skill-namespace.test.js +0 -60
  84. package/dist/__tests__/skill-namespace.test.js.map +0 -1
  85. package/dist/__tests__/stakes-contract.test.d.ts +0 -2
  86. package/dist/__tests__/stakes-contract.test.d.ts.map +0 -1
  87. package/dist/__tests__/stakes-contract.test.js +0 -173
  88. package/dist/__tests__/stakes-contract.test.js.map +0 -1
  89. package/dist/__tests__/stuck-semantics.test.d.ts +0 -2
  90. package/dist/__tests__/stuck-semantics.test.d.ts.map +0 -1
  91. package/dist/__tests__/stuck-semantics.test.js +0 -161
  92. package/dist/__tests__/stuck-semantics.test.js.map +0 -1
  93. package/dist/__tests__/wiring-integrity.test.d.ts +0 -2
  94. package/dist/__tests__/wiring-integrity.test.d.ts.map +0 -1
  95. package/dist/__tests__/wiring-integrity.test.js +0 -160
  96. package/dist/__tests__/wiring-integrity.test.js.map +0 -1
  97. package/dist/cli/commands/info.test.d.ts +0 -2
  98. package/dist/cli/commands/info.test.d.ts.map +0 -1
  99. package/dist/cli/commands/info.test.js +0 -74
  100. package/dist/cli/commands/info.test.js.map +0 -1
  101. package/dist/cli/commands/upgrade.test.d.ts +0 -2
  102. package/dist/cli/commands/upgrade.test.d.ts.map +0 -1
  103. package/dist/cli/commands/upgrade.test.js +0 -99
  104. package/dist/cli/commands/upgrade.test.js.map +0 -1
  105. package/dist/cli/design/design-md-parser.test.d.ts +0 -2
  106. package/dist/cli/design/design-md-parser.test.d.ts.map +0 -1
  107. package/dist/cli/design/design-md-parser.test.js +0 -149
  108. package/dist/cli/design/design-md-parser.test.js.map +0 -1
  109. package/dist/cli/detect.characterization.test.d.ts +0 -7
  110. package/dist/cli/detect.characterization.test.d.ts.map +0 -1
  111. package/dist/cli/detect.characterization.test.js +0 -294
  112. package/dist/cli/detect.characterization.test.js.map +0 -1
  113. package/dist/cli/postinstall/cursor-agents.d.ts +0 -13
  114. package/dist/cli/postinstall/cursor-agents.d.ts.map +0 -1
  115. package/dist/cli/postinstall/cursor-agents.js +0 -89
  116. package/dist/cli/postinstall/cursor-agents.js.map +0 -1
  117. package/dist/cli/postinstall/cursor-rules.d.ts +0 -11
  118. package/dist/cli/postinstall/cursor-rules.d.ts.map +0 -1
  119. package/dist/cli/postinstall/cursor-rules.js +0 -205
  120. package/dist/cli/postinstall/cursor-rules.js.map +0 -1
  121. package/dist/cli/postinstall/cursor-skills.d.ts +0 -9
  122. package/dist/cli/postinstall/cursor-skills.d.ts.map +0 -1
  123. package/dist/cli/postinstall/cursor-skills.js +0 -796
  124. package/dist/cli/postinstall/cursor-skills.js.map +0 -1
  125. package/dist/cli/postinstall/fs-utils.test.d.ts +0 -2
  126. package/dist/cli/postinstall/fs-utils.test.d.ts.map +0 -1
  127. package/dist/cli/postinstall/fs-utils.test.js +0 -259
  128. package/dist/cli/postinstall/fs-utils.test.js.map +0 -1
  129. package/dist/cli/setup/CodexHooks.test.d.ts +0 -2
  130. package/dist/cli/setup/CodexHooks.test.d.ts.map +0 -1
  131. package/dist/cli/setup/CodexHooks.test.js +0 -52
  132. package/dist/cli/setup/CodexHooks.test.js.map +0 -1
  133. package/dist/cli/setup/GlobalInstaller.test.d.ts +0 -2
  134. package/dist/cli/setup/GlobalInstaller.test.d.ts.map +0 -1
  135. package/dist/cli/setup/GlobalInstaller.test.js +0 -16
  136. package/dist/cli/setup/GlobalInstaller.test.js.map +0 -1
  137. package/dist/cli/utils/cli-detector.test.d.ts +0 -2
  138. package/dist/cli/utils/cli-detector.test.d.ts.map +0 -1
  139. package/dist/cli/utils/cli-detector.test.js +0 -52
  140. package/dist/cli/utils/cli-detector.test.js.map +0 -1
  141. package/dist/infra/lib/SkillFrontmatter.test.d.ts +0 -2
  142. package/dist/infra/lib/SkillFrontmatter.test.d.ts.map +0 -1
  143. package/dist/infra/lib/SkillFrontmatter.test.js +0 -60
  144. package/dist/infra/lib/SkillFrontmatter.test.js.map +0 -1
  145. package/dist/infra/lib/__tests__/AutomationLevel.test.d.ts +0 -2
  146. package/dist/infra/lib/__tests__/AutomationLevel.test.d.ts.map +0 -1
  147. package/dist/infra/lib/__tests__/AutomationLevel.test.js +0 -297
  148. package/dist/infra/lib/__tests__/AutomationLevel.test.js.map +0 -1
  149. package/dist/infra/lib/__tests__/ComponentRegistry.test.d.ts +0 -2
  150. package/dist/infra/lib/__tests__/ComponentRegistry.test.d.ts.map +0 -1
  151. package/dist/infra/lib/__tests__/ComponentRegistry.test.js +0 -99
  152. package/dist/infra/lib/__tests__/ComponentRegistry.test.js.map +0 -1
  153. package/dist/infra/lib/__tests__/DecisionTracer.test.d.ts +0 -2
  154. package/dist/infra/lib/__tests__/DecisionTracer.test.d.ts.map +0 -1
  155. package/dist/infra/lib/__tests__/DecisionTracer.test.js +0 -274
  156. package/dist/infra/lib/__tests__/DecisionTracer.test.js.map +0 -1
  157. package/dist/infra/lib/__tests__/InteractiveCheckpoint.test.d.ts +0 -2
  158. package/dist/infra/lib/__tests__/InteractiveCheckpoint.test.d.ts.map +0 -1
  159. package/dist/infra/lib/__tests__/InteractiveCheckpoint.test.js +0 -350
  160. package/dist/infra/lib/__tests__/InteractiveCheckpoint.test.js.map +0 -1
  161. package/dist/infra/lib/__tests__/LoopBreaker.test.d.ts +0 -2
  162. package/dist/infra/lib/__tests__/LoopBreaker.test.d.ts.map +0 -1
  163. package/dist/infra/lib/__tests__/LoopBreaker.test.js +0 -340
  164. package/dist/infra/lib/__tests__/LoopBreaker.test.js.map +0 -1
  165. package/dist/infra/lib/__tests__/VerificationLoop.test.d.ts +0 -2
  166. package/dist/infra/lib/__tests__/VerificationLoop.test.d.ts.map +0 -1
  167. package/dist/infra/lib/__tests__/VerificationLoop.test.js +0 -486
  168. package/dist/infra/lib/__tests__/VerificationLoop.test.js.map +0 -1
  169. package/dist/infra/lib/config/GlobalConfigManager.test.d.ts +0 -2
  170. package/dist/infra/lib/config/GlobalConfigManager.test.d.ts.map +0 -1
  171. package/dist/infra/lib/config/GlobalConfigManager.test.js +0 -9
  172. package/dist/infra/lib/config/GlobalConfigManager.test.js.map +0 -1
  173. package/dist/infra/lib/embedding/__tests__/EmbeddingProvider.test.d.ts +0 -2
  174. package/dist/infra/lib/embedding/__tests__/EmbeddingProvider.test.d.ts.map +0 -1
  175. package/dist/infra/lib/embedding/__tests__/EmbeddingProvider.test.js +0 -43
  176. package/dist/infra/lib/embedding/__tests__/EmbeddingProvider.test.js.map +0 -1
  177. package/dist/infra/lib/embedding/__tests__/VectorStore.test.d.ts +0 -2
  178. package/dist/infra/lib/embedding/__tests__/VectorStore.test.d.ts.map +0 -1
  179. package/dist/infra/lib/embedding/__tests__/VectorStore.test.js +0 -94
  180. package/dist/infra/lib/embedding/__tests__/VectorStore.test.js.map +0 -1
  181. package/dist/infra/lib/embedding/__tests__/cosine.test.d.ts +0 -2
  182. package/dist/infra/lib/embedding/__tests__/cosine.test.d.ts.map +0 -1
  183. package/dist/infra/lib/embedding/__tests__/cosine.test.js +0 -73
  184. package/dist/infra/lib/embedding/__tests__/cosine.test.js.map +0 -1
  185. package/dist/infra/lib/evolution/__tests__/deprecation.test.d.ts +0 -2
  186. package/dist/infra/lib/evolution/__tests__/deprecation.test.d.ts.map +0 -1
  187. package/dist/infra/lib/evolution/__tests__/deprecation.test.js +0 -251
  188. package/dist/infra/lib/evolution/__tests__/deprecation.test.js.map +0 -1
  189. package/dist/infra/lib/evolution/__tests__/eval.test.d.ts +0 -2
  190. package/dist/infra/lib/evolution/__tests__/eval.test.d.ts.map +0 -1
  191. package/dist/infra/lib/evolution/__tests__/eval.test.js +0 -603
  192. package/dist/infra/lib/evolution/__tests__/eval.test.js.map +0 -1
  193. package/dist/infra/lib/evolution/__tests__/generation.test.d.ts +0 -2
  194. package/dist/infra/lib/evolution/__tests__/generation.test.d.ts.map +0 -1
  195. package/dist/infra/lib/evolution/__tests__/generation.test.js +0 -396
  196. package/dist/infra/lib/evolution/__tests__/generation.test.js.map +0 -1
  197. package/dist/infra/lib/evolution/__tests__/insight.test.d.ts +0 -2
  198. package/dist/infra/lib/evolution/__tests__/insight.test.d.ts.map +0 -1
  199. package/dist/infra/lib/evolution/__tests__/insight.test.js +0 -204
  200. package/dist/infra/lib/evolution/__tests__/insight.test.js.map +0 -1
  201. package/dist/infra/lib/evolution/__tests__/integration.test.d.ts +0 -2
  202. package/dist/infra/lib/evolution/__tests__/integration.test.d.ts.map +0 -1
  203. package/dist/infra/lib/evolution/__tests__/integration.test.js +0 -206
  204. package/dist/infra/lib/evolution/__tests__/integration.test.js.map +0 -1
  205. package/dist/infra/lib/evolution/__tests__/lifecycle.test.d.ts +0 -2
  206. package/dist/infra/lib/evolution/__tests__/lifecycle.test.d.ts.map +0 -1
  207. package/dist/infra/lib/evolution/__tests__/lifecycle.test.js +0 -350
  208. package/dist/infra/lib/evolution/__tests__/lifecycle.test.js.map +0 -1
  209. package/dist/infra/lib/evolution/__tests__/parity.test.d.ts +0 -2
  210. package/dist/infra/lib/evolution/__tests__/parity.test.d.ts.map +0 -1
  211. package/dist/infra/lib/evolution/__tests__/parity.test.js +0 -319
  212. package/dist/infra/lib/evolution/__tests__/parity.test.js.map +0 -1
  213. package/dist/infra/lib/llm/auth/AuthProfileManager.test.d.ts +0 -5
  214. package/dist/infra/lib/llm/auth/AuthProfileManager.test.d.ts.map +0 -1
  215. package/dist/infra/lib/llm/auth/AuthProfileManager.test.js +0 -168
  216. package/dist/infra/lib/llm/auth/AuthProfileManager.test.js.map +0 -1
  217. package/dist/infra/lib/llm/auth/TokenRefresher.test.d.ts +0 -2
  218. package/dist/infra/lib/llm/auth/TokenRefresher.test.d.ts.map +0 -1
  219. package/dist/infra/lib/llm/auth/TokenRefresher.test.js +0 -120
  220. package/dist/infra/lib/llm/auth/TokenRefresher.test.js.map +0 -1
  221. package/dist/infra/lib/llm/timeout.test.d.ts +0 -2
  222. package/dist/infra/lib/llm/timeout.test.d.ts.map +0 -1
  223. package/dist/infra/lib/llm/timeout.test.js +0 -50
  224. package/dist/infra/lib/llm/timeout.test.js.map +0 -1
  225. package/dist/infra/lib/llm-availability.test.d.ts +0 -2
  226. package/dist/infra/lib/llm-availability.test.d.ts.map +0 -1
  227. package/dist/infra/lib/llm-availability.test.js +0 -37
  228. package/dist/infra/lib/llm-availability.test.js.map +0 -1
  229. package/dist/infra/lib/memory/KnowledgeGraph.test.d.ts +0 -2
  230. package/dist/infra/lib/memory/KnowledgeGraph.test.d.ts.map +0 -1
  231. package/dist/infra/lib/memory/KnowledgeGraph.test.js +0 -189
  232. package/dist/infra/lib/memory/KnowledgeGraph.test.js.map +0 -1
  233. package/dist/infra/lib/memory/MemorySearch.test.d.ts +0 -2
  234. package/dist/infra/lib/memory/MemorySearch.test.d.ts.map +0 -1
  235. package/dist/infra/lib/memory/MemorySearch.test.js +0 -149
  236. package/dist/infra/lib/memory/MemorySearch.test.js.map +0 -1
  237. package/dist/infra/lib/memory/MemoryStorage.test.d.ts +0 -2
  238. package/dist/infra/lib/memory/MemoryStorage.test.d.ts.map +0 -1
  239. package/dist/infra/lib/memory/MemoryStorage.test.js +0 -198
  240. package/dist/infra/lib/memory/MemoryStorage.test.js.map +0 -1
  241. package/dist/infra/lib/memory/SessionRAGRetriever.test.d.ts +0 -2
  242. package/dist/infra/lib/memory/SessionRAGRetriever.test.d.ts.map +0 -1
  243. package/dist/infra/lib/memory/SessionRAGRetriever.test.js +0 -180
  244. package/dist/infra/lib/memory/SessionRAGRetriever.test.js.map +0 -1
  245. package/dist/infra/lib/memory/SessionRAGStore.test.d.ts +0 -2
  246. package/dist/infra/lib/memory/SessionRAGStore.test.d.ts.map +0 -1
  247. package/dist/infra/lib/memory/SessionRAGStore.test.js +0 -326
  248. package/dist/infra/lib/memory/SessionRAGStore.test.js.map +0 -1
  249. package/dist/infra/lib/memory/__tests__/InMemoryStorage.test.d.ts +0 -2
  250. package/dist/infra/lib/memory/__tests__/InMemoryStorage.test.d.ts.map +0 -1
  251. package/dist/infra/lib/memory/__tests__/InMemoryStorage.test.js +0 -114
  252. package/dist/infra/lib/memory/__tests__/InMemoryStorage.test.js.map +0 -1
  253. package/dist/infra/lib/memory/__tests__/ReflectionStore.test.d.ts +0 -2
  254. package/dist/infra/lib/memory/__tests__/ReflectionStore.test.d.ts.map +0 -1
  255. package/dist/infra/lib/memory/__tests__/ReflectionStore.test.js +0 -196
  256. package/dist/infra/lib/memory/__tests__/ReflectionStore.test.js.map +0 -1
  257. package/dist/infra/lib/memory/index.test.d.ts +0 -2
  258. package/dist/infra/lib/memory/index.test.d.ts.map +0 -1
  259. package/dist/infra/lib/memory/index.test.js +0 -23
  260. package/dist/infra/lib/memory/index.test.js.map +0 -1
  261. package/dist/infra/lib/telemetry/SkillTelemetry.test.d.ts +0 -2
  262. package/dist/infra/lib/telemetry/SkillTelemetry.test.d.ts.map +0 -1
  263. package/dist/infra/lib/telemetry/SkillTelemetry.test.js +0 -124
  264. package/dist/infra/lib/telemetry/SkillTelemetry.test.js.map +0 -1
  265. package/dist/infra/lib/ui-ux/Bm25Engine.test.d.ts +0 -2
  266. package/dist/infra/lib/ui-ux/Bm25Engine.test.d.ts.map +0 -1
  267. package/dist/infra/lib/ui-ux/Bm25Engine.test.js +0 -159
  268. package/dist/infra/lib/ui-ux/Bm25Engine.test.js.map +0 -1
  269. package/dist/infra/lib/ui-ux/CsvDataLoader.test.d.ts +0 -2
  270. package/dist/infra/lib/ui-ux/CsvDataLoader.test.d.ts.map +0 -1
  271. package/dist/infra/lib/ui-ux/CsvDataLoader.test.js +0 -141
  272. package/dist/infra/lib/ui-ux/CsvDataLoader.test.js.map +0 -1
  273. package/dist/infra/lib/ui-ux/DesignSystemGenerator.test.d.ts +0 -2
  274. package/dist/infra/lib/ui-ux/DesignSystemGenerator.test.d.ts.map +0 -1
  275. package/dist/infra/lib/ui-ux/DesignSystemGenerator.test.js +0 -370
  276. package/dist/infra/lib/ui-ux/DesignSystemGenerator.test.js.map +0 -1
  277. package/dist/infra/lib/ui-ux/SearchService.test.d.ts +0 -2
  278. package/dist/infra/lib/ui-ux/SearchService.test.d.ts.map +0 -1
  279. package/dist/infra/lib/ui-ux/SearchService.test.js +0 -215
  280. package/dist/infra/lib/ui-ux/SearchService.test.js.map +0 -1
  281. package/dist/test-helpers/index.d.ts +0 -36
  282. package/dist/test-helpers/index.d.ts.map +0 -1
  283. package/dist/test-helpers/index.js +0 -85
  284. package/dist/test-helpers/index.js.map +0 -1
  285. package/dist/test-helpers/index.test.d.ts +0 -2
  286. package/dist/test-helpers/index.test.d.ts.map +0 -1
  287. package/dist/test-helpers/index.test.js +0 -92
  288. package/dist/test-helpers/index.test.js.map +0 -1
  289. package/dist/tests/curated-release-notes.test.d.ts +0 -2
  290. package/dist/tests/curated-release-notes.test.d.ts.map +0 -1
  291. package/dist/tests/curated-release-notes.test.js +0 -160
  292. package/dist/tests/curated-release-notes.test.js.map +0 -1
  293. package/dist/tools/convention/analyzeComplexity.test.d.ts +0 -2
  294. package/dist/tools/convention/analyzeComplexity.test.d.ts.map +0 -1
  295. package/dist/tools/convention/analyzeComplexity.test.js +0 -207
  296. package/dist/tools/convention/analyzeComplexity.test.js.map +0 -1
  297. package/dist/tools/convention/validateCodeQuality.test.d.ts +0 -2
  298. package/dist/tools/convention/validateCodeQuality.test.d.ts.map +0 -1
  299. package/dist/tools/convention/validateCodeQuality.test.js +0 -230
  300. package/dist/tools/convention/validateCodeQuality.test.js.map +0 -1
  301. package/dist/tools/loop/validateLoopDefinition.test.d.ts +0 -14
  302. package/dist/tools/loop/validateLoopDefinition.test.d.ts.map +0 -1
  303. package/dist/tools/loop/validateLoopDefinition.test.js +0 -229
  304. package/dist/tools/loop/validateLoopDefinition.test.js.map +0 -1
  305. package/dist/tools/spec/executionPacket.test.d.ts +0 -2
  306. package/dist/tools/spec/executionPacket.test.d.ts.map +0 -1
  307. package/dist/tools/spec/executionPacket.test.js +0 -374
  308. package/dist/tools/spec/executionPacket.test.js.map +0 -1
  309. package/dist/tools/spec/prdParser.test.d.ts +0 -6
  310. package/dist/tools/spec/prdParser.test.d.ts.map +0 -1
  311. package/dist/tools/spec/prdParser.test.js +0 -332
  312. package/dist/tools/spec/prdParser.test.js.map +0 -1
  313. package/dist/tools/spec/specGenerator.test.d.ts +0 -2
  314. package/dist/tools/spec/specGenerator.test.d.ts.map +0 -1
  315. package/dist/tools/spec/specGenerator.test.js +0 -130
  316. package/dist/tools/spec/specGenerator.test.js.map +0 -1
  317. package/dist/tools/spec/traceabilityMatrix.path-resolution.test.d.ts +0 -10
  318. package/dist/tools/spec/traceabilityMatrix.path-resolution.test.d.ts.map +0 -1
  319. package/dist/tools/spec/traceabilityMatrix.path-resolution.test.js +0 -120
  320. package/dist/tools/spec/traceabilityMatrix.path-resolution.test.js.map +0 -1
  321. package/dist/tools/spec/traceabilityMatrix.test.d.ts +0 -6
  322. package/dist/tools/spec/traceabilityMatrix.test.d.ts.map +0 -1
  323. package/dist/tools/spec/traceabilityMatrix.test.js +0 -359
  324. package/dist/tools/spec/traceabilityMatrix.test.js.map +0 -1
  325. package/hooks/scripts/__tests__/.vibe/command-log.txt +0 -3
  326. package/hooks/scripts/__tests__/anchor-inbox.test.js +0 -119
  327. package/hooks/scripts/__tests__/auto-test-debounce.test.js +0 -145
  328. package/hooks/scripts/__tests__/clone-behaviors.test.js +0 -152
  329. package/hooks/scripts/__tests__/clone-merge-responsive.test.js +0 -106
  330. package/hooks/scripts/__tests__/code-check-detectors.test.js +0 -213
  331. package/hooks/scripts/__tests__/code-check-false-positive.test.js +0 -74
  332. package/hooks/scripts/__tests__/code-check-memory-write.test.js +0 -81
  333. package/hooks/scripts/__tests__/codex-hook-adapter.test.js +0 -64
  334. package/hooks/scripts/__tests__/curation-index.test.js +0 -157
  335. package/hooks/scripts/__tests__/dispatcher-inprocess.test.js +0 -99
  336. package/hooks/scripts/__tests__/figma-extract.test.js +0 -338
  337. package/hooks/scripts/__tests__/fixtures/seq-harness.js +0 -13
  338. package/hooks/scripts/__tests__/fixtures/seq-step.js +0 -22
  339. package/hooks/scripts/__tests__/hook-payload.test.js +0 -29
  340. package/hooks/scripts/__tests__/llm-orchestrate-antigravity.test.js +0 -66
  341. package/hooks/scripts/__tests__/loop-ledger.test.js +0 -321
  342. package/hooks/scripts/__tests__/post-edit-dispatcher.test.js +0 -139
  343. package/hooks/scripts/__tests__/pre-tool-guard.test.js +0 -523
  344. package/hooks/scripts/__tests__/recipe-extractor.test.js +0 -244
  345. package/hooks/scripts/__tests__/run-ledger-verify-required.test.js +0 -151
  346. package/hooks/scripts/__tests__/run-ledger.test.js +0 -481
  347. package/hooks/scripts/__tests__/scope-from-spec.test.js +0 -215
  348. package/hooks/scripts/__tests__/sentinel-guard.test.js +0 -263
  349. package/hooks/scripts/__tests__/step-counter.test.js +0 -459
  350. package/hooks/scripts/__tests__/stop-dispatcher-sequential.test.js +0 -74
  351. package/hooks/scripts/__tests__/utils-npm-root.test.js +0 -99
@@ -1,120 +0,0 @@
1
- /**
2
- * Traceability Matrix — Path Resolution & Empty-Status Tests
3
- *
4
- * These tests use real temp directories (no vi.mock) to verify:
5
- * (a) .vibe/specs/ primary path is used and reported correctly
6
- * (b) legacy .claude/specs/ fallback works when .vibe/ is absent
7
- * (c) spec with no REQ-IDs produces status 'empty' + warning + markdown block
8
- */
9
- import { describe, it, expect, afterEach } from 'vitest';
10
- import * as nodefs from 'fs';
11
- import * as nodepath from 'path';
12
- import * as os from 'os';
13
- import { generateTraceabilityMatrix, formatMatrixAsMarkdown, } from './traceabilityMatrix.js';
14
- // ── helpers ────────────────────────────────────────────────────────────────
15
- function makeTmpDir() {
16
- return nodefs.mkdtempSync(nodepath.join(os.tmpdir(), 'rtm-test-'));
17
- }
18
- function writeFile(dir, relPath, content) {
19
- const full = nodepath.join(dir, relPath);
20
- nodefs.mkdirSync(nodepath.dirname(full), { recursive: true });
21
- nodefs.writeFileSync(full, content, 'utf-8');
22
- }
23
- const SPEC_WITH_REQS = `# SPEC: my-feature
24
-
25
- ## Task
26
-
27
- ### Phase 1: Setup
28
-
29
- 1. REQ-my-feature-001: Initialize the system
30
- 2. REQ-my-feature-002: Configure the database
31
- `;
32
- const SPEC_WITHOUT_REQS = `# SPEC: empty-feature
33
-
34
- ## Task
35
-
36
- ### Phase 1: Setup
37
-
38
- 1. [ ] Initialize the system
39
- 2. [ ] Configure the database
40
- `;
41
- // ── tests ──────────────────────────────────────────────────────────────────
42
- describe('Path Resolution (real filesystem)', () => {
43
- const dirs = [];
44
- afterEach(() => {
45
- for (const dir of dirs) {
46
- nodefs.rmSync(dir, { recursive: true, force: true });
47
- }
48
- dirs.length = 0;
49
- });
50
- it('(a) resolves .vibe/specs/<feature>.md as primary path', () => {
51
- const tmp = makeTmpDir();
52
- dirs.push(tmp);
53
- writeFile(tmp, '.vibe/specs/my-feature.md', SPEC_WITH_REQS);
54
- const matrix = generateTraceabilityMatrix('my-feature', { projectPath: tmp });
55
- expect(matrix.status).toBe('ok');
56
- expect(matrix.items.length).toBeGreaterThanOrEqual(2);
57
- expect(matrix.items[0].specFile).toBe('.vibe/specs/my-feature.md');
58
- expect(matrix.warnings).toHaveLength(0);
59
- const ids = matrix.items.map(i => i.requirementId);
60
- expect(ids).toContain('REQ-my-feature-001');
61
- expect(ids).toContain('REQ-my-feature-002');
62
- });
63
- it('(b) falls back to .claude/specs/<feature>.md when .vibe/ is absent', () => {
64
- const tmp = makeTmpDir();
65
- dirs.push(tmp);
66
- writeFile(tmp, '.claude/specs/my-feature.md', SPEC_WITH_REQS);
67
- const matrix = generateTraceabilityMatrix('my-feature', { projectPath: tmp });
68
- expect(matrix.status).toBe('ok');
69
- expect(matrix.items.length).toBeGreaterThanOrEqual(2);
70
- expect(matrix.items[0].specFile).toBe('.claude/specs/my-feature.md');
71
- });
72
- it('(c) spec without REQ-IDs → status empty, warning present, markdown shows gate-failure block', () => {
73
- const tmp = makeTmpDir();
74
- dirs.push(tmp);
75
- writeFile(tmp, '.vibe/specs/empty-feature.md', SPEC_WITHOUT_REQS);
76
- const matrix = generateTraceabilityMatrix('empty-feature', { projectPath: tmp });
77
- expect(matrix.status).toBe('empty');
78
- expect(matrix.items).toHaveLength(0);
79
- expect(matrix.warnings.length).toBeGreaterThanOrEqual(1);
80
- expect(matrix.warnings[0]).toMatch(/REQ-\*/);
81
- expect(matrix.warnings[0]).toMatch(/coverage gate/i);
82
- const md = formatMatrixAsMarkdown(matrix);
83
- expect(md).toContain('NO REQUIREMENTS EXTRACTED');
84
- expect(md).toContain('not usable as a coverage gate');
85
- expect(md).toMatch(/status.*empty.*failed/i);
86
- expect(md).not.toContain('## Summary');
87
- });
88
- });
89
- // ── split-SPEC (directory) tests ───────────────────────────────────────────
90
- describe('Split SPEC directory resolution', () => {
91
- const dirs = [];
92
- afterEach(() => {
93
- for (const dir of dirs) {
94
- nodefs.rmSync(dir, { recursive: true, force: true });
95
- }
96
- dirs.length = 0;
97
- });
98
- it('reads requirements from .vibe/specs/{feature}/ phase files (table-based REQ IDs)', () => {
99
- const tmp = makeTmpDir();
100
- dirs.push(tmp);
101
- writeFile(tmp, '.vibe/specs/split-feat/_index.md', '# SPEC: split-feat (index)\n\n분할 SPEC 인덱스.\n');
102
- writeFile(tmp, '.vibe/specs/split-feat/phase-1-core.md', '# Phase 1\n\n| ID | Requirement | Done |\n|---|---|---|\n| REQ-split-feat-001 | 코어 데이터 로딩 | D1 |\n');
103
- writeFile(tmp, '.vibe/specs/split-feat/phase-2-ui.md', '# Phase 2\n\n| ID | Requirement | Done |\n|---|---|---|\n| REQ-split-feat-002 | UI 렌더링 | D2 |\n');
104
- writeFile(tmp, '.vibe/features/split-feat/phase-1-core.feature', 'Feature: core\n');
105
- const matrix = generateTraceabilityMatrix('split-feat', { projectPath: tmp });
106
- const ids = matrix.items.map((i) => i.requirementId).sort();
107
- expect(ids).toEqual(['REQ-split-feat-001', 'REQ-split-feat-002']);
108
- expect(matrix.status).not.toBe('empty');
109
- });
110
- it('reads scenarios from .vibe/features/{feature}/ directory', () => {
111
- const tmp = makeTmpDir();
112
- dirs.push(tmp);
113
- writeFile(tmp, '.vibe/specs/dir-feat/phase-1.md', 'REQ-dir-feat-001: 데이터 저장\n');
114
- writeFile(tmp, '.vibe/features/dir-feat/phase-1.feature', '### Scenario 1: 데이터 저장 성공\n**Verification**: REQ-dir-feat-001\n');
115
- const matrix = generateTraceabilityMatrix('dir-feat', { projectPath: tmp });
116
- expect(matrix.items).toHaveLength(1);
117
- expect(matrix.items[0].featureScenario).toBeTruthy();
118
- });
119
- });
120
- //# sourceMappingURL=traceabilityMatrix.path-resolution.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"traceabilityMatrix.path-resolution.test.js","sourceRoot":"","sources":["../../../src/tools/spec/traceabilityMatrix.path-resolution.test.ts"],"names":[],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- /**
2
- * Traceability Matrix Tests
3
- * RTM generation, coverage calculation, output formatting
4
- */
5
- export {};
6
- //# sourceMappingURL=traceabilityMatrix.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"traceabilityMatrix.test.d.ts","sourceRoot":"","sources":["../../../src/tools/spec/traceabilityMatrix.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -1,359 +0,0 @@
1
- /**
2
- * Traceability Matrix Tests
3
- * RTM generation, coverage calculation, output formatting
4
- */
5
- import { describe, it, expect, vi } from 'vitest';
6
- import { generateTraceabilityMatrix, formatMatrixAsMarkdown, formatMatrixAsHtml, } from './traceabilityMatrix.js';
7
- // Mock fs module
8
- vi.mock('fs', () => ({
9
- existsSync: vi.fn((filePath) => {
10
- // Simulate: only .claude/specs/ and .claude/features/ exist in mock project
11
- return (filePath.includes('test-feature.md') ||
12
- filePath.includes('test-feature.feature'));
13
- }),
14
- readFileSync: vi.fn((path) => {
15
- if (path.includes('test-feature.md')) {
16
- return `# SPEC: test-feature
17
-
18
- ## Task
19
-
20
- ### Phase 1: Setup
21
-
22
- 1. [ ] REQ-test-001: Setup authentication
23
- 2. [ ] REQ-test-002: Create login form
24
- 3. [ ] REQ-test-003: Implement validation
25
- `;
26
- }
27
- if (path.includes('test-feature.feature')) {
28
- return `# Feature: test-feature
29
-
30
- ## Scenarios
31
-
32
- ### Scenario 1: User can login
33
- \`\`\`gherkin
34
- Given user is on login page
35
- When user enters valid credentials
36
- Then user is logged in
37
- \`\`\`
38
- **Verification**: REQ-test-001
39
-
40
- ### Scenario 2: Validation errors
41
- \`\`\`gherkin
42
- Given user is on login page
43
- When user enters invalid email
44
- Then error message is shown
45
- \`\`\`
46
- **Verification**: REQ-test-003
47
- `;
48
- }
49
- throw new Error(`File not found: ${path}`);
50
- }),
51
- readdirSync: vi.fn(() => []),
52
- }));
53
- describe('Traceability Matrix', () => {
54
- describe('generateTraceabilityMatrix()', () => {
55
- it('should generate matrix for a feature', () => {
56
- const matrix = generateTraceabilityMatrix('test-feature', {
57
- projectPath: '/mock/project',
58
- specPath: '.claude/vibe/specs/test-feature.md',
59
- featurePath: '.claude/vibe/features/test-feature.feature',
60
- });
61
- expect(matrix.featureName).toBe('test-feature');
62
- expect(matrix.generatedAt).toBeDefined();
63
- expect(matrix.items).toBeInstanceOf(Array);
64
- expect(matrix.summary).toBeDefined();
65
- });
66
- it('should extract requirements from SPEC', () => {
67
- const matrix = generateTraceabilityMatrix('test-feature', {
68
- projectPath: '/mock/project',
69
- });
70
- // Should find REQ-test-001, REQ-test-002, REQ-test-003
71
- expect(matrix.items.length).toBeGreaterThan(0);
72
- });
73
- it('should map scenarios to requirements', () => {
74
- const matrix = generateTraceabilityMatrix('test-feature', {
75
- projectPath: '/mock/project',
76
- });
77
- // REQ-test-001 should be mapped to Scenario 1
78
- const req001 = matrix.items.find(i => i.requirementId === 'REQ-test-001');
79
- expect(req001?.featureScenario).toBeDefined();
80
- });
81
- it('should calculate coverage correctly', () => {
82
- const matrix = generateTraceabilityMatrix('test-feature', {
83
- projectPath: '/mock/project',
84
- });
85
- expect(matrix.summary.totalRequirements).toBeGreaterThan(0);
86
- expect(matrix.summary.coveragePercent).toBeGreaterThanOrEqual(0);
87
- expect(matrix.summary.coveragePercent).toBeLessThanOrEqual(100);
88
- });
89
- });
90
- describe('TraceSummary', () => {
91
- it('should track uncovered requirements', () => {
92
- const matrix = generateTraceabilityMatrix('test-feature', {
93
- projectPath: '/mock/project',
94
- });
95
- // REQ-test-002 has no scenario, should be uncovered or partial
96
- const uncoveredOrPartial = [
97
- ...matrix.summary.uncoveredRequirements,
98
- ...matrix.summary.partialRequirements,
99
- ];
100
- expect(uncoveredOrPartial.length).toBeGreaterThanOrEqual(0);
101
- });
102
- it('should calculate spec coverage', () => {
103
- const matrix = generateTraceabilityMatrix('test-feature', {
104
- projectPath: '/mock/project',
105
- });
106
- expect(matrix.summary.specCovered).toBeLessThanOrEqual(matrix.summary.totalRequirements);
107
- });
108
- it('should calculate feature coverage', () => {
109
- const matrix = generateTraceabilityMatrix('test-feature', {
110
- projectPath: '/mock/project',
111
- });
112
- expect(matrix.summary.featureCovered).toBeLessThanOrEqual(matrix.summary.totalRequirements);
113
- });
114
- it('should calculate test coverage', () => {
115
- const matrix = generateTraceabilityMatrix('test-feature', {
116
- projectPath: '/mock/project',
117
- });
118
- expect(matrix.summary.testCovered).toBeLessThanOrEqual(matrix.summary.totalRequirements);
119
- });
120
- });
121
- describe('formatMatrixAsMarkdown()', () => {
122
- it('should format matrix as markdown', () => {
123
- const matrix = {
124
- featureName: 'test-feature',
125
- status: 'ok',
126
- warnings: [],
127
- items: [
128
- {
129
- requirementId: 'REQ-test-001',
130
- requirementDesc: 'Test requirement',
131
- specSection: 'Phase 1',
132
- specFile: 'spec.md',
133
- featureScenario: 'Scenario 1',
134
- featureFile: 'feature.feature',
135
- testFile: 'test.spec.ts',
136
- testName: 'should test something',
137
- coverage: 'full',
138
- },
139
- {
140
- requirementId: 'REQ-test-002',
141
- requirementDesc: 'Another requirement',
142
- specSection: 'Phase 1',
143
- specFile: 'spec.md',
144
- coverage: 'none',
145
- },
146
- ],
147
- summary: {
148
- totalRequirements: 2,
149
- specCovered: 2,
150
- featureCovered: 1,
151
- testCovered: 1,
152
- coveragePercent: 50,
153
- uncoveredRequirements: ['REQ-test-002'],
154
- partialRequirements: [],
155
- },
156
- generatedAt: new Date().toISOString(),
157
- };
158
- const markdown = formatMatrixAsMarkdown(matrix);
159
- expect(markdown).toContain('# Requirements Traceability Matrix');
160
- expect(markdown).toContain('test-feature');
161
- expect(markdown).toContain('## Summary');
162
- expect(markdown).toContain('## Traceability Matrix');
163
- expect(markdown).toContain('REQ-test-001');
164
- expect(markdown).toContain('REQ-test-002');
165
- expect(markdown).toContain('50%');
166
- });
167
- it('should include recommendations section', () => {
168
- const matrix = {
169
- featureName: 'test',
170
- status: 'ok',
171
- warnings: [],
172
- items: [],
173
- summary: {
174
- totalRequirements: 1,
175
- specCovered: 1,
176
- featureCovered: 0,
177
- testCovered: 0,
178
- coveragePercent: 0,
179
- uncoveredRequirements: ['REQ-test-001'],
180
- partialRequirements: [],
181
- },
182
- generatedAt: new Date().toISOString(),
183
- };
184
- const markdown = formatMatrixAsMarkdown(matrix);
185
- expect(markdown).toContain('## Recommendations');
186
- });
187
- it('should show success message at 100% coverage', () => {
188
- const matrix = {
189
- featureName: 'test',
190
- status: 'ok',
191
- warnings: [],
192
- items: [{
193
- requirementId: 'REQ-test-001',
194
- requirementDesc: 'Test',
195
- coverage: 'full',
196
- }],
197
- summary: {
198
- totalRequirements: 1,
199
- specCovered: 1,
200
- featureCovered: 1,
201
- testCovered: 1,
202
- coveragePercent: 100,
203
- uncoveredRequirements: [],
204
- partialRequirements: [],
205
- },
206
- generatedAt: new Date().toISOString(),
207
- };
208
- const markdown = formatMatrixAsMarkdown(matrix);
209
- expect(markdown).toContain('All requirements are fully covered');
210
- });
211
- });
212
- describe('formatMatrixAsHtml()', () => {
213
- it('should format matrix as HTML', () => {
214
- const matrix = {
215
- featureName: 'test-feature',
216
- status: 'ok',
217
- warnings: [],
218
- items: [
219
- {
220
- requirementId: 'REQ-test-001',
221
- requirementDesc: 'Test requirement',
222
- specSection: 'Phase 1',
223
- coverage: 'full',
224
- },
225
- ],
226
- summary: {
227
- totalRequirements: 1,
228
- specCovered: 1,
229
- featureCovered: 1,
230
- testCovered: 1,
231
- coveragePercent: 100,
232
- uncoveredRequirements: [],
233
- partialRequirements: [],
234
- },
235
- generatedAt: new Date().toISOString(),
236
- };
237
- const html = formatMatrixAsHtml(matrix);
238
- expect(html).toContain('<!DOCTYPE html>');
239
- expect(html).toContain('<title>RTM: test-feature</title>');
240
- expect(html).toContain('<table>');
241
- expect(html).toContain('REQ-test-001');
242
- });
243
- it('should include CSS styles', () => {
244
- const matrix = {
245
- featureName: 'test',
246
- status: 'ok',
247
- warnings: [],
248
- items: [],
249
- summary: {
250
- totalRequirements: 0,
251
- specCovered: 0,
252
- featureCovered: 0,
253
- testCovered: 0,
254
- coveragePercent: 0,
255
- uncoveredRequirements: [],
256
- partialRequirements: [],
257
- },
258
- generatedAt: new Date().toISOString(),
259
- };
260
- const html = formatMatrixAsHtml(matrix);
261
- expect(html).toContain('<style>');
262
- expect(html).toContain('.full');
263
- expect(html).toContain('.partial');
264
- expect(html).toContain('.none');
265
- });
266
- it('should include coverage bar', () => {
267
- const matrix = {
268
- featureName: 'test',
269
- status: 'ok',
270
- warnings: [],
271
- items: [],
272
- summary: {
273
- totalRequirements: 2,
274
- specCovered: 1,
275
- featureCovered: 1,
276
- testCovered: 1,
277
- coveragePercent: 50,
278
- uncoveredRequirements: [],
279
- partialRequirements: [],
280
- },
281
- generatedAt: new Date().toISOString(),
282
- };
283
- const html = formatMatrixAsHtml(matrix);
284
- expect(html).toContain('coverage-bar');
285
- expect(html).toContain('coverage-fill');
286
- expect(html).toContain('width: 50%');
287
- });
288
- it('should escape HTML in descriptions', () => {
289
- const matrix = {
290
- featureName: 'test',
291
- status: 'ok',
292
- warnings: [],
293
- items: [{
294
- requirementId: 'REQ-test-001',
295
- requirementDesc: '<script>alert("xss")</script>',
296
- coverage: 'none',
297
- }],
298
- summary: {
299
- totalRequirements: 1,
300
- specCovered: 0,
301
- featureCovered: 0,
302
- testCovered: 0,
303
- coveragePercent: 0,
304
- uncoveredRequirements: ['REQ-test-001'],
305
- partialRequirements: [],
306
- },
307
- generatedAt: new Date().toISOString(),
308
- };
309
- const html = formatMatrixAsHtml(matrix);
310
- expect(html).not.toContain('<script>');
311
- expect(html).toContain('&lt;script&gt;');
312
- });
313
- });
314
- describe('Coverage calculation', () => {
315
- it('should mark as full when all mappings exist', () => {
316
- const item = {
317
- requirementId: 'REQ-001',
318
- requirementDesc: 'Test',
319
- specSection: 'Phase 1',
320
- featureScenario: 'Scenario 1',
321
- testName: 'test case',
322
- coverage: 'full',
323
- };
324
- expect(item.coverage).toBe('full');
325
- });
326
- it('should mark as partial when some mappings exist', () => {
327
- const item = {
328
- requirementId: 'REQ-001',
329
- requirementDesc: 'Test',
330
- specSection: 'Phase 1',
331
- featureScenario: 'Scenario 1',
332
- coverage: 'partial',
333
- };
334
- expect(item.coverage).toBe('partial');
335
- });
336
- it('should mark as none when no mappings exist', () => {
337
- const item = {
338
- requirementId: 'REQ-001',
339
- requirementDesc: 'Test',
340
- coverage: 'none',
341
- };
342
- expect(item.coverage).toBe('none');
343
- });
344
- });
345
- });
346
- describe('Integration', () => {
347
- it('should generate complete RTM workflow', () => {
348
- const matrix = generateTraceabilityMatrix('test-feature', {
349
- projectPath: '/mock/project',
350
- });
351
- const markdown = formatMatrixAsMarkdown(matrix);
352
- const html = formatMatrixAsHtml(matrix);
353
- expect(markdown.length).toBeGreaterThan(100);
354
- expect(html.length).toBeGreaterThan(100);
355
- expect(markdown).toContain(matrix.featureName);
356
- expect(html).toContain(matrix.featureName);
357
- });
358
- });
359
- //# sourceMappingURL=traceabilityMatrix.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"traceabilityMatrix.test.js","sourceRoot":"","sources":["../../../src/tools/spec/traceabilityMatrix.test.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- [2026-07-28T08:41:21.912Z] rm -rf /
2
- [2026-07-28T08:41:22.008Z] ls -la
3
- [2026-07-28T08:41:22.129Z] rm -rf src/infra/lib/evolution/
@@ -1,119 +0,0 @@
1
- /**
2
- * ANCHOR / 인박스 결정론 기록 테스트 — 감사 2026-07-28 (L3·L5).
3
- *
4
- * JUDGE·RECORD·stuck 은 명령으로 판정되는데 ANCHOR 와 인박스만 산문 지시였다.
5
- * 재고정 대상과 인박스 블록 형식을 코드가 보장하는지 검증한다.
6
- */
7
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
8
- import fs from 'fs';
9
- import os from 'os';
10
- import path from 'path';
11
- import { buildAnchor } from '../lib/anchor.js';
12
- import { prependInboxBlock, countInboxBlocks } from '../lib/inbox.js';
13
-
14
- let dir;
15
-
16
- const write = (rel, content) => {
17
- const p = path.join(dir, rel);
18
- fs.mkdirSync(path.dirname(p), { recursive: true });
19
- fs.writeFileSync(p, content, 'utf-8');
20
- };
21
-
22
- beforeEach(() => {
23
- dir = fs.mkdtempSync(path.join(os.tmpdir(), 'vibe-anchor-'));
24
- });
25
-
26
- afterEach(() => {
27
- try { fs.rmSync(dir, { recursive: true, force: true }); } catch { /* ignore */ }
28
- });
29
-
30
- describe('buildAnchor — 디스크 재고정', () => {
31
- it('아티팩트가 없으면 missing 으로 보고한다 (기억으로 메우지 않는다)', () => {
32
- const a = buildAnchor(dir);
33
- expect(a.missing).toContain('feature');
34
- expect(a.missing).toContain('spec');
35
- expect(a.spec).toBeNull();
36
- });
37
-
38
- it('.last-feature 로 feature 를 해석하고 SPEC 경로를 찾는다', () => {
39
- write('.vibe/.last-feature', 'login\n');
40
- write('.vibe/specs/login.md', '# login SPEC\n');
41
-
42
- const a = buildAnchor(dir);
43
- expect(a.feature).toBe('login');
44
- expect(a.spec).toBe(path.join('.vibe', 'specs', 'login.md'));
45
- expect(a.missing).not.toContain('spec');
46
- });
47
-
48
- it('인자로 넘긴 feature 가 .last-feature 보다 우선한다', () => {
49
- write('.vibe/.last-feature', 'login\n');
50
- write('.vibe/specs/signup.md', '# signup SPEC\n');
51
-
52
- expect(buildAnchor(dir, 'signup').spec).toBe(path.join('.vibe', 'specs', 'signup.md'));
53
- });
54
-
55
- it('분할 SPEC 은 _index.md 로 해석한다', () => {
56
- write('.vibe/specs/checkout/_index.md', '# checkout\n');
57
- expect(buildAnchor(dir, 'checkout').spec).toBe(path.join('.vibe', 'specs', 'checkout', '_index.md'));
58
- });
59
-
60
- it('레거시 경로로 폴백한다', () => {
61
- write('.claude/vibe/specs/legacy.md', '# legacy\n');
62
- expect(buildAnchor(dir, 'legacy').spec).toBe(path.join('.claude', 'vibe', 'specs', 'legacy.md'));
63
- });
64
-
65
- it('run-ledger 와 scope.json 을 함께 재고정한다', () => {
66
- write('.vibe/metrics/run-ledger.json', JSON.stringify({ runFeature: 'login', verifyPassed: true }));
67
- write('.vibe/scope.json', '{}');
68
-
69
- const a = buildAnchor(dir, 'login');
70
- expect(a.ledger?.verifyPassed).toBe(true);
71
- expect(a.scope).toBe(path.join('.vibe', 'scope.json'));
72
- expect(a.missing).not.toContain('run-ledger');
73
- });
74
-
75
- it('직전 인박스 블록 하나만 가져온다', () => {
76
- prependInboxBlock(dir, { loop: 'old', result: 'ok', at: '2026-07-27T00:00:00Z', lines: ['이전'] });
77
- prependInboxBlock(dir, { loop: 'new', result: 'stuck', at: '2026-07-28T00:00:00Z', lines: ['최신'] });
78
-
79
- const a = buildAnchor(dir, 'x');
80
- expect(a.latestInbox).toContain('new');
81
- expect(a.latestInbox).not.toContain('old');
82
- });
83
- });
84
-
85
- describe('prependInboxBlock — 최신순 리뷰 큐', () => {
86
- it('블록을 최상단에 쌓는다', () => {
87
- prependInboxBlock(dir, { loop: 'first', result: 'ok', at: '2026-07-27T00:00:00Z' });
88
- prependInboxBlock(dir, { loop: 'second', result: 'fail', at: '2026-07-28T00:00:00Z' });
89
-
90
- const raw = fs.readFileSync(path.join(dir, '.vibe/loops/inbox.md'), 'utf-8');
91
- expect(raw.indexOf('## second')).toBeLessThan(raw.indexOf('## first'));
92
- expect(countInboxBlocks(dir)).toBe(2);
93
- });
94
-
95
- it('헤더는 한 번만 쓴다', () => {
96
- prependInboxBlock(dir, { loop: 'a', result: 'ok', at: '2026-07-28T00:00:00Z' });
97
- prependInboxBlock(dir, { loop: 'b', result: 'ok', at: '2026-07-28T00:00:01Z' });
98
-
99
- const raw = fs.readFileSync(path.join(dir, '.vibe/loops/inbox.md'), 'utf-8');
100
- expect(raw.match(/# Loop Inbox/g)).toHaveLength(1);
101
- });
102
-
103
- it('필수 필드가 없으면 기록하지 않는다 (fail-open)', () => {
104
- expect(prependInboxBlock(dir, { loop: 'x', result: 'ok' })).toBe(false);
105
- expect(countInboxBlocks(dir)).toBe(0);
106
- });
107
-
108
- it('본문 줄을 목록으로 적는다', () => {
109
- prependInboxBlock(dir, {
110
- loop: 'nightly', result: 'stuck', at: '2026-07-28T00:00:00Z',
111
- lines: ['발견: 3건 / 처리: 0건', '리뷰 필요: REQ-004'],
112
- });
113
-
114
- const raw = fs.readFileSync(path.join(dir, '.vibe/loops/inbox.md'), 'utf-8');
115
- expect(raw).toContain('## nightly — 2026-07-28T00:00:00Z — stuck');
116
- expect(raw).toContain('- 발견: 3건 / 처리: 0건');
117
- expect(raw).toContain('- 리뷰 필요: REQ-004');
118
- });
119
- });