@su-record/vibe 2.7.12 → 2.7.13

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 (331) hide show
  1. package/.env.example +37 -37
  2. package/CLAUDE.md +126 -126
  3. package/LICENSE +21 -21
  4. package/README.md +449 -580
  5. package/agents/architect-low.md +41 -41
  6. package/agents/architect-medium.md +59 -59
  7. package/agents/architect.md +80 -80
  8. package/agents/build-error-resolver.md +115 -115
  9. package/agents/compounder.md +261 -261
  10. package/agents/diagrammer.md +178 -178
  11. package/agents/docs/api-documenter.md +99 -99
  12. package/agents/docs/changelog-writer.md +93 -93
  13. package/agents/e2e-tester.md +294 -266
  14. package/agents/explorer-low.md +42 -42
  15. package/agents/explorer-medium.md +59 -59
  16. package/agents/explorer.md +48 -48
  17. package/agents/implementer-low.md +43 -43
  18. package/agents/implementer-medium.md +52 -52
  19. package/agents/implementer.md +54 -54
  20. package/agents/junior-mentor.md +141 -141
  21. package/agents/planning/requirements-analyst.md +84 -84
  22. package/agents/planning/ux-advisor.md +83 -83
  23. package/agents/qa/acceptance-tester.md +86 -86
  24. package/agents/qa/edge-case-finder.md +93 -93
  25. package/agents/refactor-cleaner.md +143 -143
  26. package/agents/research/best-practices-agent.md +199 -199
  27. package/agents/research/codebase-patterns-agent.md +157 -157
  28. package/agents/research/framework-docs-agent.md +188 -188
  29. package/agents/research/security-advisory-agent.md +213 -213
  30. package/agents/review/architecture-reviewer.md +107 -107
  31. package/agents/review/complexity-reviewer.md +116 -116
  32. package/agents/review/data-integrity-reviewer.md +88 -88
  33. package/agents/review/git-history-reviewer.md +103 -103
  34. package/agents/review/performance-reviewer.md +86 -86
  35. package/agents/review/python-reviewer.md +150 -150
  36. package/agents/review/rails-reviewer.md +139 -139
  37. package/agents/review/react-reviewer.md +144 -144
  38. package/agents/review/security-reviewer.md +80 -80
  39. package/agents/review/simplicity-reviewer.md +140 -140
  40. package/agents/review/test-coverage-reviewer.md +116 -116
  41. package/agents/review/typescript-reviewer.md +127 -127
  42. package/agents/searcher.md +54 -54
  43. package/agents/simplifier.md +120 -120
  44. package/agents/tester.md +49 -49
  45. package/agents/ui/ui-a11y-auditor.md +93 -93
  46. package/agents/ui/ui-antipattern-detector.md +94 -94
  47. package/agents/ui/ui-dataviz-advisor.md +69 -69
  48. package/agents/ui/ui-design-system-gen.md +57 -57
  49. package/agents/ui/ui-industry-analyzer.md +49 -49
  50. package/agents/ui/ui-layout-architect.md +65 -65
  51. package/agents/ui/ui-stack-implementer.md +68 -68
  52. package/agents/ui/ux-compliance-reviewer.md +81 -81
  53. package/agents/ui-previewer.md +260 -260
  54. package/commands/vibe.analyze.md +8 -0
  55. package/commands/vibe.review.md +10 -3
  56. package/commands/vibe.run.md +2078 -2022
  57. package/commands/vibe.spec.md +10 -10
  58. package/commands/vibe.spec.review.md +565 -558
  59. package/commands/vibe.utils.md +413 -413
  60. package/commands/vibe.verify.md +45 -0
  61. package/dist/cli/auth.d.ts.map +1 -1
  62. package/dist/cli/auth.js +1 -7
  63. package/dist/cli/auth.js.map +1 -1
  64. package/dist/cli/collaborator.js +52 -52
  65. package/dist/cli/commands/evolution.js +12 -12
  66. package/dist/cli/commands/info.d.ts.map +1 -1
  67. package/dist/cli/commands/info.js +55 -70
  68. package/dist/cli/commands/info.js.map +1 -1
  69. package/dist/cli/commands/init.d.ts.map +1 -1
  70. package/dist/cli/commands/init.js +6 -7
  71. package/dist/cli/commands/init.js.map +1 -1
  72. package/dist/cli/commands/remove.js +14 -14
  73. package/dist/cli/commands/sentinel.js +27 -27
  74. package/dist/cli/commands/setup.js +1 -1
  75. package/dist/cli/commands/setup.js.map +1 -1
  76. package/dist/cli/commands/skills.js +5 -5
  77. package/dist/cli/commands/slack.js +10 -10
  78. package/dist/cli/commands/telegram.js +12 -12
  79. package/dist/cli/commands/update.d.ts.map +1 -1
  80. package/dist/cli/commands/update.js +3 -4
  81. package/dist/cli/commands/update.js.map +1 -1
  82. package/dist/cli/detect.js +32 -32
  83. package/dist/cli/index.js +51 -55
  84. package/dist/cli/index.js.map +1 -1
  85. package/dist/cli/llm/claude-commands.js +16 -16
  86. package/dist/cli/llm/config.js +19 -19
  87. package/dist/cli/llm/config.js.map +1 -1
  88. package/dist/cli/llm/gemini-commands.d.ts +4 -6
  89. package/dist/cli/llm/gemini-commands.d.ts.map +1 -1
  90. package/dist/cli/llm/gemini-commands.js +52 -322
  91. package/dist/cli/llm/gemini-commands.js.map +1 -1
  92. package/dist/cli/llm/gpt-commands.js +21 -21
  93. package/dist/cli/llm/gpt-commands.js.map +1 -1
  94. package/dist/cli/llm/help.js +21 -21
  95. package/dist/cli/postinstall/constants.js +1 -1
  96. package/dist/cli/postinstall/constants.js.map +1 -1
  97. package/dist/cli/postinstall/cursor-agents.js +32 -32
  98. package/dist/cli/postinstall/cursor-rules.js +83 -83
  99. package/dist/cli/postinstall/cursor-skills.js +743 -743
  100. package/dist/cli/postinstall/inline-skills.js +1 -1
  101. package/dist/cli/postinstall/inline-skills.js.map +1 -1
  102. package/dist/cli/setup/Provisioner.js +42 -42
  103. package/dist/cli/types.d.ts +2 -16
  104. package/dist/cli/types.d.ts.map +1 -1
  105. package/dist/cli/utils.d.ts +0 -9
  106. package/dist/cli/utils.d.ts.map +1 -1
  107. package/dist/cli/utils.js +0 -28
  108. package/dist/cli/utils.js.map +1 -1
  109. package/dist/infra/lib/DeepInit.js +24 -24
  110. package/dist/infra/lib/IterationTracker.js +11 -11
  111. package/dist/infra/lib/PythonParser.js +108 -108
  112. package/dist/infra/lib/ReviewRace.js +96 -96
  113. package/dist/infra/lib/SkillFrontmatter.js +28 -28
  114. package/dist/infra/lib/SkillQualityGate.js +9 -9
  115. package/dist/infra/lib/SkillRepository.js +159 -159
  116. package/dist/infra/lib/UltraQA.js +99 -99
  117. package/dist/infra/lib/autonomy/AuditStore.js +41 -41
  118. package/dist/infra/lib/autonomy/ConfirmationStore.js +30 -30
  119. package/dist/infra/lib/autonomy/EventOutbox.js +38 -38
  120. package/dist/infra/lib/autonomy/PolicyEngine.js +18 -18
  121. package/dist/infra/lib/autonomy/SecuritySentinel.js +1 -1
  122. package/dist/infra/lib/autonomy/SuggestionStore.js +33 -33
  123. package/dist/infra/lib/config/GlobalConfigManager.d.ts +0 -2
  124. package/dist/infra/lib/config/GlobalConfigManager.d.ts.map +1 -1
  125. package/dist/infra/lib/config/GlobalConfigManager.js +0 -27
  126. package/dist/infra/lib/config/GlobalConfigManager.js.map +1 -1
  127. package/dist/infra/lib/embedding/VectorStore.js +22 -22
  128. package/dist/infra/lib/evolution/AgentAnalyzer.js +10 -10
  129. package/dist/infra/lib/evolution/DescriptionOptimizer.js +21 -21
  130. package/dist/infra/lib/evolution/GenerationRegistry.js +36 -36
  131. package/dist/infra/lib/evolution/InsightStore.js +90 -90
  132. package/dist/infra/lib/evolution/RollbackManager.js +5 -5
  133. package/dist/infra/lib/evolution/SkillBenchmark.js +23 -23
  134. package/dist/infra/lib/evolution/SkillEvalRunner.js +50 -50
  135. package/dist/infra/lib/evolution/SkillGapDetector.js +10 -10
  136. package/dist/infra/lib/evolution/UsageTracker.js +28 -28
  137. package/dist/infra/lib/gemini/auth.d.ts +4 -16
  138. package/dist/infra/lib/gemini/auth.d.ts.map +1 -1
  139. package/dist/infra/lib/gemini/auth.js +10 -405
  140. package/dist/infra/lib/gemini/auth.js.map +1 -1
  141. package/dist/infra/lib/gemini/capabilities.d.ts +4 -8
  142. package/dist/infra/lib/gemini/capabilities.d.ts.map +1 -1
  143. package/dist/infra/lib/gemini/capabilities.js +8 -166
  144. package/dist/infra/lib/gemini/capabilities.js.map +1 -1
  145. package/dist/infra/lib/gemini/chat.d.ts +4 -13
  146. package/dist/infra/lib/gemini/chat.d.ts.map +1 -1
  147. package/dist/infra/lib/gemini/chat.js +10 -323
  148. package/dist/infra/lib/gemini/chat.js.map +1 -1
  149. package/dist/infra/lib/gemini/completion.d.ts +5 -15
  150. package/dist/infra/lib/gemini/completion.d.ts.map +1 -1
  151. package/dist/infra/lib/gemini/completion.js +6 -97
  152. package/dist/infra/lib/gemini/completion.js.map +1 -1
  153. package/dist/infra/lib/gemini/constants.d.ts +2 -31
  154. package/dist/infra/lib/gemini/constants.d.ts.map +1 -1
  155. package/dist/infra/lib/gemini/constants.js +2 -77
  156. package/dist/infra/lib/gemini/constants.js.map +1 -1
  157. package/dist/infra/lib/gemini/index.d.ts +5 -8
  158. package/dist/infra/lib/gemini/index.d.ts.map +1 -1
  159. package/dist/infra/lib/gemini/index.js +4 -7
  160. package/dist/infra/lib/gemini/index.js.map +1 -1
  161. package/dist/infra/lib/gemini/models.d.ts +3 -4
  162. package/dist/infra/lib/gemini/models.d.ts.map +1 -1
  163. package/dist/infra/lib/gemini/models.js +8 -84
  164. package/dist/infra/lib/gemini/models.js.map +1 -1
  165. package/dist/infra/lib/gemini/orchestration.js +5 -5
  166. package/dist/infra/lib/gemini/types.d.ts +16 -44
  167. package/dist/infra/lib/gemini/types.d.ts.map +1 -1
  168. package/dist/infra/lib/gemini/types.js +1 -1
  169. package/dist/infra/lib/gpt/auth.d.ts +2 -5
  170. package/dist/infra/lib/gpt/auth.d.ts.map +1 -1
  171. package/dist/infra/lib/gpt/auth.js +8 -38
  172. package/dist/infra/lib/gpt/auth.js.map +1 -1
  173. package/dist/infra/lib/gpt/chat.d.ts +3 -3
  174. package/dist/infra/lib/gpt/chat.d.ts.map +1 -1
  175. package/dist/infra/lib/gpt/chat.js +37 -53
  176. package/dist/infra/lib/gpt/chat.js.map +1 -1
  177. package/dist/infra/lib/gpt/constants.d.ts +2 -5
  178. package/dist/infra/lib/gpt/constants.d.ts.map +1 -1
  179. package/dist/infra/lib/gpt/constants.js +4 -9
  180. package/dist/infra/lib/gpt/constants.js.map +1 -1
  181. package/dist/infra/lib/gpt/embedding.d.ts +1 -1
  182. package/dist/infra/lib/gpt/embedding.js +3 -3
  183. package/dist/infra/lib/gpt/embedding.js.map +1 -1
  184. package/dist/infra/lib/gpt/oauth.d.ts +6 -39
  185. package/dist/infra/lib/gpt/oauth.d.ts.map +1 -1
  186. package/dist/infra/lib/gpt/oauth.js +8 -340
  187. package/dist/infra/lib/gpt/oauth.js.map +1 -1
  188. package/dist/infra/lib/gpt/orchestration.js +5 -5
  189. package/dist/infra/lib/gpt/orchestration.js.map +1 -1
  190. package/dist/infra/lib/gpt/specializations.d.ts +2 -2
  191. package/dist/infra/lib/gpt/specializations.js +3 -3
  192. package/dist/infra/lib/gpt/specializations.js.map +1 -1
  193. package/dist/infra/lib/gpt/types.d.ts +1 -1
  194. package/dist/infra/lib/gpt/types.d.ts.map +1 -1
  195. package/dist/infra/lib/llm/auth/AuthProfileManager.d.ts +2 -2
  196. package/dist/infra/lib/llm/auth/AuthProfileManager.d.ts.map +1 -1
  197. package/dist/infra/lib/llm/auth/AuthProfileManager.js.map +1 -1
  198. package/dist/infra/lib/llm/auth/AuthProfileManager.test.js +1 -1
  199. package/dist/infra/lib/llm/auth/AuthProfileManager.test.js.map +1 -1
  200. package/dist/infra/lib/llm/auth/TokenRefresher.d.ts +1 -1
  201. package/dist/infra/lib/llm/auth/TokenRefresher.js +1 -1
  202. package/dist/infra/lib/llm/auth/index.d.ts +2 -12
  203. package/dist/infra/lib/llm/auth/index.d.ts.map +1 -1
  204. package/dist/infra/lib/llm/auth/index.js +5 -63
  205. package/dist/infra/lib/llm/auth/index.js.map +1 -1
  206. package/dist/infra/lib/llm/types.d.ts +1 -1
  207. package/dist/infra/lib/llm/types.d.ts.map +1 -1
  208. package/dist/infra/lib/memory/KnowledgeGraph.js +4 -4
  209. package/dist/infra/lib/memory/MemorySearch.js +57 -57
  210. package/dist/infra/lib/memory/MemoryStorage.js +181 -181
  211. package/dist/infra/lib/memory/ObservationStore.js +28 -28
  212. package/dist/infra/lib/memory/ReflectionStore.js +30 -30
  213. package/dist/infra/lib/memory/SessionRAGRetriever.js +7 -7
  214. package/dist/infra/lib/memory/SessionRAGStore.js +225 -225
  215. package/dist/infra/lib/memory/SessionSummarizer.js +9 -9
  216. package/dist/infra/orchestrator/AgentManager.js +12 -12
  217. package/dist/infra/orchestrator/AgentRegistry.js +65 -65
  218. package/dist/infra/orchestrator/MultiLlmResearch.js +8 -8
  219. package/dist/infra/orchestrator/SwarmOrchestrator.test.js +16 -16
  220. package/dist/infra/orchestrator/parallelResearch.js +24 -24
  221. package/dist/tools/convention/analyzeComplexity.test.js +115 -115
  222. package/dist/tools/convention/validateCodeQuality.test.js +104 -104
  223. package/dist/tools/memory/createMemoryTimeline.js +10 -10
  224. package/dist/tools/memory/getMemoryGraph.js +12 -12
  225. package/dist/tools/memory/getSessionContext.js +9 -9
  226. package/dist/tools/memory/linkMemories.js +14 -14
  227. package/dist/tools/memory/listMemories.js +4 -4
  228. package/dist/tools/memory/recallMemory.js +4 -4
  229. package/dist/tools/memory/saveMemory.js +4 -4
  230. package/dist/tools/memory/searchMemoriesAdvanced.js +23 -23
  231. package/dist/tools/semantic/analyzeDependencyGraph.js +12 -12
  232. package/dist/tools/semantic/astGrep.test.js +6 -6
  233. package/dist/tools/spec/prdParser.test.js +171 -171
  234. package/dist/tools/spec/specGenerator.js +169 -169
  235. package/dist/tools/spec/traceabilityMatrix.js +64 -64
  236. package/dist/tools/spec/traceabilityMatrix.test.js +28 -28
  237. package/hooks/gemini-hooks.json +73 -73
  238. package/hooks/hooks.json +137 -137
  239. package/hooks/scripts/code-check.js +70 -70
  240. package/hooks/scripts/context-save.js +212 -212
  241. package/hooks/scripts/hud-status.js +291 -291
  242. package/hooks/scripts/keyword-detector.js +214 -214
  243. package/hooks/scripts/llm-orchestrate.js +475 -646
  244. package/hooks/scripts/post-edit.js +32 -32
  245. package/hooks/scripts/pre-tool-guard.js +125 -125
  246. package/hooks/scripts/prompt-dispatcher.js +185 -185
  247. package/hooks/scripts/sentinel-guard.js +104 -104
  248. package/hooks/scripts/session-start.js +106 -106
  249. package/hooks/scripts/stop-notify.js +209 -209
  250. package/hooks/scripts/utils.js +100 -100
  251. package/languages/csharp-unity.md +515 -515
  252. package/languages/gdscript-godot.md +470 -470
  253. package/languages/ruby-rails.md +489 -489
  254. package/languages/typescript-angular.md +433 -433
  255. package/languages/typescript-astro.md +416 -416
  256. package/languages/typescript-electron.md +406 -406
  257. package/languages/typescript-nestjs.md +524 -524
  258. package/languages/typescript-svelte.md +407 -407
  259. package/languages/typescript-tauri.md +365 -365
  260. package/package.json +121 -121
  261. package/skills/agents-md/SKILL.md +120 -120
  262. package/skills/arch-guard/SKILL.md +180 -180
  263. package/skills/brand-assets/SKILL.md +146 -146
  264. package/skills/capability-loop/SKILL.md +167 -167
  265. package/skills/characterization-test/SKILL.md +206 -206
  266. package/skills/commerce-patterns/SKILL.md +59 -59
  267. package/skills/commit-push-pr/SKILL.md +75 -75
  268. package/skills/context7-usage/SKILL.md +105 -105
  269. package/skills/core-capabilities/SKILL.md +48 -48
  270. package/skills/e2e-commerce/SKILL.md +57 -57
  271. package/skills/exec-plan/SKILL.md +147 -147
  272. package/skills/frontend-design/SKILL.md +73 -73
  273. package/skills/git-worktree/SKILL.md +72 -72
  274. package/skills/handoff/SKILL.md +109 -109
  275. package/skills/parallel-research/SKILL.md +87 -87
  276. package/skills/priority-todos/SKILL.md +63 -63
  277. package/skills/seo-checklist/SKILL.md +57 -57
  278. package/skills/techdebt/SKILL.md +122 -122
  279. package/skills/tool-fallback/SKILL.md +103 -103
  280. package/skills/typescript-advanced-types/SKILL.md +65 -65
  281. package/skills/ui-ux-pro-max/SKILL.md +206 -206
  282. package/skills/vercel-react-best-practices/SKILL.md +59 -59
  283. package/skills/video-production/SKILL.md +51 -51
  284. package/vibe/config.json +29 -29
  285. package/vibe/constitution.md +227 -227
  286. package/vibe/rules/principles/communication-guide.md +98 -98
  287. package/vibe/rules/principles/development-philosophy.md +52 -52
  288. package/vibe/rules/principles/quick-start.md +102 -102
  289. package/vibe/rules/quality/bdd-contract-testing.md +393 -393
  290. package/vibe/rules/quality/checklist.md +276 -276
  291. package/vibe/rules/quality/performance.md +236 -236
  292. package/vibe/rules/quality/testing-strategy.md +440 -440
  293. package/vibe/rules/standards/anti-patterns.md +541 -541
  294. package/vibe/rules/standards/code-structure.md +291 -291
  295. package/vibe/rules/standards/complexity-metrics.md +313 -313
  296. package/vibe/rules/standards/git-workflow.md +237 -237
  297. package/vibe/rules/standards/naming-conventions.md +198 -198
  298. package/vibe/rules/standards/security.md +305 -305
  299. package/vibe/rules/writing/document-style.md +74 -74
  300. package/vibe/setup.sh +31 -31
  301. package/vibe/templates/constitution-template.md +252 -252
  302. package/vibe/templates/contract-backend-template.md +526 -526
  303. package/vibe/templates/contract-frontend-template.md +599 -599
  304. package/vibe/templates/feature-template.md +96 -96
  305. package/vibe/templates/spec-template.md +221 -221
  306. package/vibe/ui-ux-data/charts.csv +26 -26
  307. package/vibe/ui-ux-data/colors.csv +97 -97
  308. package/vibe/ui-ux-data/icons.csv +101 -101
  309. package/vibe/ui-ux-data/landing.csv +31 -31
  310. package/vibe/ui-ux-data/products.csv +96 -96
  311. package/vibe/ui-ux-data/react-performance.csv +45 -45
  312. package/vibe/ui-ux-data/stacks/astro.csv +54 -54
  313. package/vibe/ui-ux-data/stacks/flutter.csv +53 -53
  314. package/vibe/ui-ux-data/stacks/html-tailwind.csv +56 -56
  315. package/vibe/ui-ux-data/stacks/jetpack-compose.csv +53 -53
  316. package/vibe/ui-ux-data/stacks/nextjs.csv +53 -53
  317. package/vibe/ui-ux-data/stacks/nuxt-ui.csv +51 -51
  318. package/vibe/ui-ux-data/stacks/nuxtjs.csv +59 -59
  319. package/vibe/ui-ux-data/stacks/react-native.csv +52 -52
  320. package/vibe/ui-ux-data/stacks/react.csv +54 -54
  321. package/vibe/ui-ux-data/stacks/shadcn.csv +61 -61
  322. package/vibe/ui-ux-data/stacks/svelte.csv +54 -54
  323. package/vibe/ui-ux-data/stacks/swiftui.csv +51 -51
  324. package/vibe/ui-ux-data/stacks/vue.csv +50 -50
  325. package/vibe/ui-ux-data/styles.csv +68 -68
  326. package/vibe/ui-ux-data/typography.csv +57 -57
  327. package/vibe/ui-ux-data/ui-reasoning.csv +101 -101
  328. package/vibe/ui-ux-data/ux-guidelines.csv +99 -99
  329. package/vibe/ui-ux-data/version.json +31 -31
  330. package/vibe/ui-ux-data/web-interface.csv +31 -31
  331. package/commands/vibe.voice.md +0 -79
@@ -1,206 +1,206 @@
1
- ---
2
- name: characterization-test
3
- description: "Lock existing behavior with characterization tests before modifying code."
4
- triggers: [legacy, characterization test, lock behavior, regression prevention, before refactor, large file]
5
- priority: 65
6
- ---
7
-
8
- # Characterization Test Skill
9
-
10
- > **Philosophy: "Never change what you cannot verify"**
11
-
12
- Lock existing behavior with snapshot/characterization tests before modifying code. This prevents regressions in legacy, complex, or unfamiliar codebases.
13
-
14
- ## Pre-check (K1)
15
-
16
- > Are you modifying existing code with uncertain behavior? If the code is new (you just wrote it), well-tested, or trivially simple, skip characterization tests and write regular unit tests instead.
17
-
18
- ## When to Use
19
-
20
- | Scenario | Signal |
21
- |----------|--------|
22
- | Legacy file (>500 lines) | Large files with accumulated behavior |
23
- | Complex branching | Multiple if/else, switch, ternary chains |
24
- | API endpoint modification | Request/response contract must be preserved |
25
- | Database schema change | Migration must preserve existing data semantics |
26
- | Refactoring request | "refactor", "clean up", "simplify" keywords |
27
- | Unfamiliar code | No prior context about the module |
28
-
29
- ## Core Workflow
30
-
31
- ```
32
- ANALYZE → GENERATE → VERIFY → CHANGE → REGRESS → RECONCILE
33
- ```
34
-
35
- ### Step 1: ANALYZE
36
-
37
- Explore the target code to understand its current behavior.
38
-
39
- **Parallel exploration** (use sub-agents when available):
40
- - Read the target file(s)
41
- - Identify all public exports / API surface
42
- - Map branching paths (if/else, switch, try/catch)
43
- - List external dependencies and side effects
44
- - Check for existing tests
45
-
46
- **Analysis checklist:**
47
- - [ ] All public functions identified
48
- - [ ] Input parameter ranges documented
49
- - [ ] Edge cases listed (null, empty, boundary values)
50
- - [ ] Side effects cataloged (DB writes, file I/O, network calls)
51
- - [ ] Error paths mapped
52
-
53
- ### Step 2: GENERATE
54
-
55
- Create characterization tests that capture current behavior as-is.
56
-
57
- **TypeScript template:**
58
- ```typescript
59
- import { describe, it, expect } from 'vitest';
60
-
61
- describe('[ModuleName] characterization tests', () => {
62
- // Happy path - capture normal behavior
63
- it('should [describe current behavior]', () => {
64
- const result = targetFunction(normalInput);
65
- // Snapshot the ACTUAL output, not what you THINK it should be
66
- expect(result).toMatchSnapshot();
67
- });
68
-
69
- // Edge cases - capture boundary behavior
70
- it('should handle empty input', () => {
71
- const result = targetFunction('');
72
- expect(result).toMatchSnapshot();
73
- });
74
-
75
- // Error paths - capture failure modes
76
- it('should handle invalid input', () => {
77
- expect(() => targetFunction(null)).toThrowErrorMatchingSnapshot();
78
- });
79
- });
80
- ```
81
-
82
- **Python template:**
83
- ```python
84
- import pytest
85
-
86
- class TestModuleNameCharacterization:
87
- """Lock existing behavior before modification."""
88
-
89
- def test_normal_behavior(self, snapshot):
90
- result = target_function(normal_input)
91
- assert result == snapshot
92
-
93
- def test_empty_input(self, snapshot):
94
- result = target_function("")
95
- assert result == snapshot
96
-
97
- def test_invalid_input(self):
98
- with pytest.raises(Exception) as exc_info:
99
- target_function(None)
100
- assert str(exc_info.value) # Capture error message
101
- ```
102
-
103
- **Key principles:**
104
- - Test ACTUAL behavior, not expected behavior
105
- - Use `toMatchSnapshot()` / snapshot assertions
106
- - Cover every public function
107
- - Include edge cases and error paths
108
- - Do NOT fix bugs in characterization tests
109
-
110
- ### Step 3: VERIFY
111
-
112
- Run the characterization tests to confirm they pass with current code.
113
-
114
- ```bash
115
- # TypeScript
116
- npx vitest run --reporter=verbose [test-file]
117
-
118
- # Python
119
- pytest -v [test-file]
120
- ```
121
-
122
- - All tests MUST pass before proceeding
123
- - If any test fails, the characterization is wrong — fix the test, not the code
124
- - Update snapshots if needed: `npx vitest run -u [test-file]`
125
-
126
- ### Step 4: CHANGE
127
-
128
- Now implement the requested modification.
129
-
130
- - Make changes incrementally
131
- - Run characterization tests after each change
132
- - Any unexpected test failure = potential regression
133
-
134
- ### Step 5: REGRESS
135
-
136
- Run full characterization test suite after all changes.
137
-
138
- ```bash
139
- npx vitest run [characterization-test-file]
140
- ```
141
-
142
- - **All passing**: Changes preserve existing behavior
143
- - **Expected failures**: Tests for intentionally changed behavior
144
- - **Unexpected failures**: STOP — investigate regression
145
-
146
- ### Step 6: RECONCILE
147
-
148
- Update characterization tests to match new intended behavior.
149
-
150
- - Review each failing test individually
151
- - Confirm the failure is due to intentional change
152
- - Update snapshot: `npx vitest run -u`
153
- - Add NEW tests for new behavior
154
- - Document why each test changed
155
-
156
- ## Scenario-Specific Workflows
157
-
158
- ### Legacy File (>500 lines)
159
-
160
- 1. Generate function-level characterization tests
161
- 2. Focus on public API surface first
162
- 3. Add integration tests for cross-function flows
163
- 4. Refactor in small increments
164
-
165
- ### Complex Branching
166
-
167
- 1. Map all branches with a decision tree
168
- 2. Write one test per branch path
169
- 3. Include boundary values for each condition
170
- 4. Test combinations of related conditions
171
-
172
- ### API Endpoint
173
-
174
- 1. Capture request/response pairs for all routes
175
- 2. Test all HTTP methods, status codes, headers
176
- 3. Include authentication/authorization paths
177
- 4. Test error responses and validation messages
178
-
179
- ### Database Schema
180
-
181
- 1. Create fixtures with representative data
182
- 2. Test queries before and after migration
183
- 3. Verify data integrity post-migration
184
- 4. Test rollback scenarios
185
-
186
- ## Integration with VIBE Workflow
187
-
188
- ### With `/vibe.spec`
189
- Add characterization test phase to SPEC before implementation:
190
- ```
191
- ## Pre-Implementation
192
- - [ ] Characterization tests written for affected modules
193
- - [ ] All characterization tests passing
194
- ```
195
-
196
- ### With `/vibe.run`
197
- The implementation agent should:
198
- 1. Check for characterization tests before modifying files
199
- 2. Run them before and after changes
200
- 3. Flag any unexpected failures
201
-
202
- ### With `/vibe.review`
203
- Review agents verify:
204
- - Characterization tests exist for modified legacy code
205
- - No regressions in existing behavior
206
- - New behavior has corresponding new tests
1
+ ---
2
+ name: characterization-test
3
+ description: "Lock existing behavior with characterization tests before modifying code."
4
+ triggers: [legacy, characterization test, lock behavior, regression prevention, before refactor, large file]
5
+ priority: 65
6
+ ---
7
+
8
+ # Characterization Test Skill
9
+
10
+ > **Philosophy: "Never change what you cannot verify"**
11
+
12
+ Lock existing behavior with snapshot/characterization tests before modifying code. This prevents regressions in legacy, complex, or unfamiliar codebases.
13
+
14
+ ## Pre-check (K1)
15
+
16
+ > Are you modifying existing code with uncertain behavior? If the code is new (you just wrote it), well-tested, or trivially simple, skip characterization tests and write regular unit tests instead.
17
+
18
+ ## When to Use
19
+
20
+ | Scenario | Signal |
21
+ |----------|--------|
22
+ | Legacy file (>500 lines) | Large files with accumulated behavior |
23
+ | Complex branching | Multiple if/else, switch, ternary chains |
24
+ | API endpoint modification | Request/response contract must be preserved |
25
+ | Database schema change | Migration must preserve existing data semantics |
26
+ | Refactoring request | "refactor", "clean up", "simplify" keywords |
27
+ | Unfamiliar code | No prior context about the module |
28
+
29
+ ## Core Workflow
30
+
31
+ ```
32
+ ANALYZE → GENERATE → VERIFY → CHANGE → REGRESS → RECONCILE
33
+ ```
34
+
35
+ ### Step 1: ANALYZE
36
+
37
+ Explore the target code to understand its current behavior.
38
+
39
+ **Parallel exploration** (use sub-agents when available):
40
+ - Read the target file(s)
41
+ - Identify all public exports / API surface
42
+ - Map branching paths (if/else, switch, try/catch)
43
+ - List external dependencies and side effects
44
+ - Check for existing tests
45
+
46
+ **Analysis checklist:**
47
+ - [ ] All public functions identified
48
+ - [ ] Input parameter ranges documented
49
+ - [ ] Edge cases listed (null, empty, boundary values)
50
+ - [ ] Side effects cataloged (DB writes, file I/O, network calls)
51
+ - [ ] Error paths mapped
52
+
53
+ ### Step 2: GENERATE
54
+
55
+ Create characterization tests that capture current behavior as-is.
56
+
57
+ **TypeScript template:**
58
+ ```typescript
59
+ import { describe, it, expect } from 'vitest';
60
+
61
+ describe('[ModuleName] characterization tests', () => {
62
+ // Happy path - capture normal behavior
63
+ it('should [describe current behavior]', () => {
64
+ const result = targetFunction(normalInput);
65
+ // Snapshot the ACTUAL output, not what you THINK it should be
66
+ expect(result).toMatchSnapshot();
67
+ });
68
+
69
+ // Edge cases - capture boundary behavior
70
+ it('should handle empty input', () => {
71
+ const result = targetFunction('');
72
+ expect(result).toMatchSnapshot();
73
+ });
74
+
75
+ // Error paths - capture failure modes
76
+ it('should handle invalid input', () => {
77
+ expect(() => targetFunction(null)).toThrowErrorMatchingSnapshot();
78
+ });
79
+ });
80
+ ```
81
+
82
+ **Python template:**
83
+ ```python
84
+ import pytest
85
+
86
+ class TestModuleNameCharacterization:
87
+ """Lock existing behavior before modification."""
88
+
89
+ def test_normal_behavior(self, snapshot):
90
+ result = target_function(normal_input)
91
+ assert result == snapshot
92
+
93
+ def test_empty_input(self, snapshot):
94
+ result = target_function("")
95
+ assert result == snapshot
96
+
97
+ def test_invalid_input(self):
98
+ with pytest.raises(Exception) as exc_info:
99
+ target_function(None)
100
+ assert str(exc_info.value) # Capture error message
101
+ ```
102
+
103
+ **Key principles:**
104
+ - Test ACTUAL behavior, not expected behavior
105
+ - Use `toMatchSnapshot()` / snapshot assertions
106
+ - Cover every public function
107
+ - Include edge cases and error paths
108
+ - Do NOT fix bugs in characterization tests
109
+
110
+ ### Step 3: VERIFY
111
+
112
+ Run the characterization tests to confirm they pass with current code.
113
+
114
+ ```bash
115
+ # TypeScript
116
+ npx vitest run --reporter=verbose [test-file]
117
+
118
+ # Python
119
+ pytest -v [test-file]
120
+ ```
121
+
122
+ - All tests MUST pass before proceeding
123
+ - If any test fails, the characterization is wrong — fix the test, not the code
124
+ - Update snapshots if needed: `npx vitest run -u [test-file]`
125
+
126
+ ### Step 4: CHANGE
127
+
128
+ Now implement the requested modification.
129
+
130
+ - Make changes incrementally
131
+ - Run characterization tests after each change
132
+ - Any unexpected test failure = potential regression
133
+
134
+ ### Step 5: REGRESS
135
+
136
+ Run full characterization test suite after all changes.
137
+
138
+ ```bash
139
+ npx vitest run [characterization-test-file]
140
+ ```
141
+
142
+ - **All passing**: Changes preserve existing behavior
143
+ - **Expected failures**: Tests for intentionally changed behavior
144
+ - **Unexpected failures**: STOP — investigate regression
145
+
146
+ ### Step 6: RECONCILE
147
+
148
+ Update characterization tests to match new intended behavior.
149
+
150
+ - Review each failing test individually
151
+ - Confirm the failure is due to intentional change
152
+ - Update snapshot: `npx vitest run -u`
153
+ - Add NEW tests for new behavior
154
+ - Document why each test changed
155
+
156
+ ## Scenario-Specific Workflows
157
+
158
+ ### Legacy File (>500 lines)
159
+
160
+ 1. Generate function-level characterization tests
161
+ 2. Focus on public API surface first
162
+ 3. Add integration tests for cross-function flows
163
+ 4. Refactor in small increments
164
+
165
+ ### Complex Branching
166
+
167
+ 1. Map all branches with a decision tree
168
+ 2. Write one test per branch path
169
+ 3. Include boundary values for each condition
170
+ 4. Test combinations of related conditions
171
+
172
+ ### API Endpoint
173
+
174
+ 1. Capture request/response pairs for all routes
175
+ 2. Test all HTTP methods, status codes, headers
176
+ 3. Include authentication/authorization paths
177
+ 4. Test error responses and validation messages
178
+
179
+ ### Database Schema
180
+
181
+ 1. Create fixtures with representative data
182
+ 2. Test queries before and after migration
183
+ 3. Verify data integrity post-migration
184
+ 4. Test rollback scenarios
185
+
186
+ ## Integration with VIBE Workflow
187
+
188
+ ### With `/vibe.spec`
189
+ Add characterization test phase to SPEC before implementation:
190
+ ```
191
+ ## Pre-Implementation
192
+ - [ ] Characterization tests written for affected modules
193
+ - [ ] All characterization tests passing
194
+ ```
195
+
196
+ ### With `/vibe.run`
197
+ The implementation agent should:
198
+ 1. Check for characterization tests before modifying files
199
+ 2. Run them before and after changes
200
+ 3. Flag any unexpected failures
201
+
202
+ ### With `/vibe.review`
203
+ Review agents verify:
204
+ - Characterization tests exist for modified legacy code
205
+ - No regressions in existing behavior
206
+ - New behavior has corresponding new tests
@@ -1,59 +1,59 @@
1
- ---
2
- name: commerce-patterns
3
- description: "E-commerce domain patterns - cart, payment, inventory with transaction safety"
4
- triggers: [commerce, ecommerce, cart, payment, checkout, inventory, stock, order, pg, toss, stripe]
5
- priority: 70
6
- ---
7
-
8
- # Commerce Patterns
9
-
10
- ## Pre-check (K1)
11
-
12
- > Is this an e-commerce transaction flow? If building simple CRUD without payment/stock management, this skill is not needed.
13
-
14
- ## Gotchas & Traps
15
-
16
- These are the non-obvious failure modes LLMs typically miss:
17
-
18
- ### Payment
19
-
20
- | Trap | Consequence | Prevention |
21
- |------|-------------|------------|
22
- | No idempotency key | User double-clicks → charged twice | `idempotencyKey: order_${orderId}_${timestamp}` on every payment request |
23
- | Webhook not idempotent | Retry delivers duplicate events | Check `eventId` before processing, store processed events |
24
- | Missing webhook signature verification | Attacker forges payment confirmation | Always verify HMAC signature before processing |
25
- | No payment state machine | Order stuck in limbo | `PENDING → PROCESSING → AUTHORIZED → CAPTURED → COMPLETED` (+ FAILED, CANCELED, REFUNDED) |
26
-
27
- ### Inventory
28
-
29
- | Trap | Consequence | Prevention |
30
- |------|-------------|------------|
31
- | Non-atomic stock decrement | Race condition → negative stock | `UPDATE SET stock = stock - $1 WHERE stock >= $1` (atomic with check) |
32
- | No reservation TTL | Stock locked forever on abandoned checkout | 15-min reservation + scheduled cleanup job |
33
- | Commit without reservation | Stock sold twice | Two-phase: RESERVE (checkout start) → COMMIT (payment success) / RELEASE (failure) |
34
- | Optimistic lock without retry | Fails silently under contention | Use `version` column or `FOR UPDATE` for high-contention products |
35
-
36
- ### Cart & Pricing
37
-
38
- | Trap | Consequence | Prevention |
39
- |------|-------------|------------|
40
- | No price snapshot | Price changes between add and checkout | Store `price` at add time, revalidate at checkout entry |
41
- | No guest→user cart merge | Guest loses cart on login | Merge by `sessionId` on login, user cart takes priority for duplicates |
42
- | No cart expiration | Abandoned carts accumulate forever | TTL-based cleanup (e.g., 7 days) |
43
-
44
- ## Checkout Flow (Reference)
45
-
46
- ```
47
- Cart Validation → Order Creation (PENDING) → Stock Reservation (15min) → Payment
48
- ├─ Success → Order PAID, Stock COMMIT, Send Confirmation
49
- └─ Failure → Order FAILED, Stock RELEASE
50
- ```
51
-
52
- ## Done Criteria (K4)
53
-
54
- - [ ] Idempotency key on all payment requests
55
- - [ ] Webhook handler is idempotent (dedup by eventId)
56
- - [ ] Stock updates are atomic (SQL-level check)
57
- - [ ] Two-phase reservation implemented with TTL
58
- - [ ] Prices snapshot at cart add, revalidated at checkout
59
- - [ ] Payment state machine covers all transitions
1
+ ---
2
+ name: commerce-patterns
3
+ description: "E-commerce domain patterns - cart, payment, inventory with transaction safety"
4
+ triggers: [commerce, ecommerce, cart, payment, checkout, inventory, stock, order, pg, toss, stripe]
5
+ priority: 70
6
+ ---
7
+
8
+ # Commerce Patterns
9
+
10
+ ## Pre-check (K1)
11
+
12
+ > Is this an e-commerce transaction flow? If building simple CRUD without payment/stock management, this skill is not needed.
13
+
14
+ ## Gotchas & Traps
15
+
16
+ These are the non-obvious failure modes LLMs typically miss:
17
+
18
+ ### Payment
19
+
20
+ | Trap | Consequence | Prevention |
21
+ |------|-------------|------------|
22
+ | No idempotency key | User double-clicks → charged twice | `idempotencyKey: order_${orderId}_${timestamp}` on every payment request |
23
+ | Webhook not idempotent | Retry delivers duplicate events | Check `eventId` before processing, store processed events |
24
+ | Missing webhook signature verification | Attacker forges payment confirmation | Always verify HMAC signature before processing |
25
+ | No payment state machine | Order stuck in limbo | `PENDING → PROCESSING → AUTHORIZED → CAPTURED → COMPLETED` (+ FAILED, CANCELED, REFUNDED) |
26
+
27
+ ### Inventory
28
+
29
+ | Trap | Consequence | Prevention |
30
+ |------|-------------|------------|
31
+ | Non-atomic stock decrement | Race condition → negative stock | `UPDATE SET stock = stock - $1 WHERE stock >= $1` (atomic with check) |
32
+ | No reservation TTL | Stock locked forever on abandoned checkout | 15-min reservation + scheduled cleanup job |
33
+ | Commit without reservation | Stock sold twice | Two-phase: RESERVE (checkout start) → COMMIT (payment success) / RELEASE (failure) |
34
+ | Optimistic lock without retry | Fails silently under contention | Use `version` column or `FOR UPDATE` for high-contention products |
35
+
36
+ ### Cart & Pricing
37
+
38
+ | Trap | Consequence | Prevention |
39
+ |------|-------------|------------|
40
+ | No price snapshot | Price changes between add and checkout | Store `price` at add time, revalidate at checkout entry |
41
+ | No guest→user cart merge | Guest loses cart on login | Merge by `sessionId` on login, user cart takes priority for duplicates |
42
+ | No cart expiration | Abandoned carts accumulate forever | TTL-based cleanup (e.g., 7 days) |
43
+
44
+ ## Checkout Flow (Reference)
45
+
46
+ ```
47
+ Cart Validation → Order Creation (PENDING) → Stock Reservation (15min) → Payment
48
+ ├─ Success → Order PAID, Stock COMMIT, Send Confirmation
49
+ └─ Failure → Order FAILED, Stock RELEASE
50
+ ```
51
+
52
+ ## Done Criteria (K4)
53
+
54
+ - [ ] Idempotency key on all payment requests
55
+ - [ ] Webhook handler is idempotent (dedup by eventId)
56
+ - [ ] Stock updates are atomic (SQL-level check)
57
+ - [ ] Two-phase reservation implemented with TTL
58
+ - [ ] Prices snapshot at cart add, revalidated at checkout
59
+ - [ ] Payment state machine covers all transitions