@su-record/vibe 2.16.3 → 3.0.0

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 (353) hide show
  1. package/.env.example +15 -0
  2. package/CLAUDE.md +8 -8
  3. package/README.en.md +46 -29
  4. package/README.md +41 -24
  5. package/agents/acceptance-tester.md +56 -0
  6. package/agents/architect.md +25 -67
  7. package/agents/build-error-resolver.md +28 -97
  8. package/agents/code-reviewer.md +89 -0
  9. package/agents/diagrammer.md +34 -165
  10. package/agents/documenter.md +43 -0
  11. package/agents/e2e-tester.md +46 -277
  12. package/agents/event/event-ops.md +54 -77
  13. package/agents/event/event-planner.md +63 -0
  14. package/agents/figma/figma-engineer.md +76 -0
  15. package/agents/implementer.md +26 -41
  16. package/agents/security-reviewer.md +56 -0
  17. package/agents/tester.md +37 -33
  18. package/agents/ui/design-reviewer.md +62 -0
  19. package/agents/ui/design-system-gen.md +63 -0
  20. package/dist/__tests__/agent-model-sync.test.d.ts +2 -0
  21. package/dist/__tests__/agent-model-sync.test.d.ts.map +1 -0
  22. package/dist/__tests__/agent-model-sync.test.js +71 -0
  23. package/dist/__tests__/agent-model-sync.test.js.map +1 -0
  24. package/dist/cli/auth.d.ts.map +1 -1
  25. package/dist/cli/auth.js +8 -1
  26. package/dist/cli/auth.js.map +1 -1
  27. package/dist/cli/commands/index.d.ts +1 -0
  28. package/dist/cli/commands/index.d.ts.map +1 -1
  29. package/dist/cli/commands/index.js +1 -0
  30. package/dist/cli/commands/index.js.map +1 -1
  31. package/dist/cli/commands/info.d.ts.map +1 -1
  32. package/dist/cli/commands/info.js +2 -0
  33. package/dist/cli/commands/info.js.map +1 -1
  34. package/dist/cli/commands/llm.d.ts +11 -0
  35. package/dist/cli/commands/llm.d.ts.map +1 -0
  36. package/dist/cli/commands/llm.js +62 -0
  37. package/dist/cli/commands/llm.js.map +1 -0
  38. package/dist/cli/commands/remove.d.ts.map +1 -1
  39. package/dist/cli/commands/remove.js +8 -10
  40. package/dist/cli/commands/remove.js.map +1 -1
  41. package/dist/cli/commands/setup.d.ts.map +1 -1
  42. package/dist/cli/commands/setup.js +35 -1
  43. package/dist/cli/commands/setup.js.map +1 -1
  44. package/dist/cli/index.d.ts +0 -4
  45. package/dist/cli/index.d.ts.map +1 -1
  46. package/dist/cli/index.js +59 -6
  47. package/dist/cli/index.js.map +1 -1
  48. package/dist/cli/llm/config.d.ts.map +1 -1
  49. package/dist/cli/llm/config.js +7 -0
  50. package/dist/cli/llm/config.js.map +1 -1
  51. package/dist/cli/llm/index.d.ts +1 -0
  52. package/dist/cli/llm/index.d.ts.map +1 -1
  53. package/dist/cli/llm/index.js +1 -0
  54. package/dist/cli/llm/index.js.map +1 -1
  55. package/dist/cli/llm/model-refresh.d.ts +29 -0
  56. package/dist/cli/llm/model-refresh.d.ts.map +1 -0
  57. package/dist/cli/llm/model-refresh.js +139 -0
  58. package/dist/cli/llm/model-refresh.js.map +1 -0
  59. package/dist/cli/llm/zai-commands.d.ts +15 -0
  60. package/dist/cli/llm/zai-commands.d.ts.map +1 -0
  61. package/dist/cli/llm/zai-commands.js +64 -0
  62. package/dist/cli/llm/zai-commands.js.map +1 -0
  63. package/dist/cli/postinstall/claude-agents.d.ts.map +1 -1
  64. package/dist/cli/postinstall/claude-agents.js +16 -77
  65. package/dist/cli/postinstall/claude-agents.js.map +1 -1
  66. package/dist/cli/postinstall/constants.d.ts.map +1 -1
  67. package/dist/cli/postinstall/constants.js +81 -296
  68. package/dist/cli/postinstall/constants.js.map +1 -1
  69. package/dist/cli/postinstall/cursor-agents.d.ts +5 -0
  70. package/dist/cli/postinstall/cursor-agents.d.ts.map +1 -1
  71. package/dist/cli/postinstall/cursor-agents.js +26 -68
  72. package/dist/cli/postinstall/cursor-agents.js.map +1 -1
  73. package/dist/cli/postinstall/cursor-skills.d.ts.map +1 -1
  74. package/dist/cli/postinstall/cursor-skills.js +26 -30
  75. package/dist/cli/postinstall/cursor-skills.js.map +1 -1
  76. package/dist/cli/postinstall/main.d.ts.map +1 -1
  77. package/dist/cli/postinstall/main.js +0 -2
  78. package/dist/cli/postinstall/main.js.map +1 -1
  79. package/dist/cli/setup/Provisioner.d.ts.map +1 -1
  80. package/dist/cli/setup/Provisioner.js +19 -21
  81. package/dist/cli/setup/Provisioner.js.map +1 -1
  82. package/dist/cli/types.d.ts +15 -0
  83. package/dist/cli/types.d.ts.map +1 -1
  84. package/dist/cli/utils.d.ts +4 -1
  85. package/dist/cli/utils.d.ts.map +1 -1
  86. package/dist/cli/utils.js +4 -1
  87. package/dist/cli/utils.js.map +1 -1
  88. package/dist/infra/lib/FrameworkDetector.js +4 -4
  89. package/dist/infra/lib/FrameworkDetector.js.map +1 -1
  90. package/dist/infra/lib/OrchestrateWorkflow.js +2 -2
  91. package/dist/infra/lib/OrchestrateWorkflow.js.map +1 -1
  92. package/dist/infra/lib/browser/launch.js +1 -1
  93. package/dist/infra/lib/browser/launch.js.map +1 -1
  94. package/dist/infra/lib/browser/types.d.ts +1 -1
  95. package/dist/infra/lib/browser/types.js +1 -1
  96. package/dist/infra/lib/config/GlobalConfigManager.d.ts +2 -0
  97. package/dist/infra/lib/config/GlobalConfigManager.d.ts.map +1 -1
  98. package/dist/infra/lib/config/GlobalConfigManager.js +6 -0
  99. package/dist/infra/lib/config/GlobalConfigManager.js.map +1 -1
  100. package/dist/infra/lib/constants.d.ts +1 -1
  101. package/dist/infra/lib/constants.d.ts.map +1 -1
  102. package/dist/infra/lib/constants.js +4 -5
  103. package/dist/infra/lib/constants.js.map +1 -1
  104. package/dist/infra/lib/evolution/__tests__/integration.test.js +7 -7
  105. package/dist/infra/lib/evolution/__tests__/integration.test.js.map +1 -1
  106. package/dist/infra/lib/llm-availability.d.ts +4 -0
  107. package/dist/infra/lib/llm-availability.d.ts.map +1 -1
  108. package/dist/infra/lib/llm-availability.js +9 -1
  109. package/dist/infra/lib/llm-availability.js.map +1 -1
  110. package/dist/infra/lib/memory/index.d.ts +0 -2
  111. package/dist/infra/lib/memory/index.d.ts.map +1 -1
  112. package/dist/infra/lib/memory/index.js +0 -2
  113. package/dist/infra/lib/memory/index.js.map +1 -1
  114. package/dist/infra/lib/telemetry/SkillTelemetry.test.js +1 -1
  115. package/dist/infra/lib/telemetry/SkillTelemetry.test.js.map +1 -1
  116. package/dist/infra/lib/zai/client.d.ts +30 -0
  117. package/dist/infra/lib/zai/client.d.ts.map +1 -0
  118. package/dist/infra/lib/zai/client.js +124 -0
  119. package/dist/infra/lib/zai/client.js.map +1 -0
  120. package/dist/infra/lib/zai/index.d.ts +11 -0
  121. package/dist/infra/lib/zai/index.d.ts.map +1 -0
  122. package/dist/infra/lib/zai/index.js +10 -0
  123. package/dist/infra/lib/zai/index.js.map +1 -0
  124. package/dist/infra/lib/zai/orchestration.d.ts +15 -0
  125. package/dist/infra/lib/zai/orchestration.d.ts.map +1 -0
  126. package/dist/infra/lib/zai/orchestration.js +54 -0
  127. package/dist/infra/lib/zai/orchestration.js.map +1 -0
  128. package/dist/infra/lib/zai/types.d.ts +40 -0
  129. package/dist/infra/lib/zai/types.d.ts.map +1 -0
  130. package/dist/infra/lib/zai/types.js +5 -0
  131. package/dist/infra/lib/zai/types.js.map +1 -0
  132. package/dist/infra/orchestrator/SmartRouter.d.ts.map +1 -1
  133. package/dist/infra/orchestrator/SmartRouter.js +16 -34
  134. package/dist/infra/orchestrator/SmartRouter.js.map +1 -1
  135. package/dist/infra/orchestrator/index.d.ts +1 -0
  136. package/dist/infra/orchestrator/index.d.ts.map +1 -1
  137. package/dist/infra/orchestrator/index.js +11 -9
  138. package/dist/infra/orchestrator/index.js.map +1 -1
  139. package/dist/infra/orchestrator/types.d.ts +32 -9
  140. package/dist/infra/orchestrator/types.d.ts.map +1 -1
  141. package/dist/infra/orchestrator/types.js +68 -37
  142. package/dist/infra/orchestrator/types.js.map +1 -1
  143. package/dist/infra/orchestrator/types.test.d.ts +2 -0
  144. package/dist/infra/orchestrator/types.test.d.ts.map +1 -0
  145. package/dist/infra/orchestrator/types.test.js +57 -0
  146. package/dist/infra/orchestrator/types.test.js.map +1 -0
  147. package/dist/tools/index.d.ts +0 -4
  148. package/dist/tools/index.d.ts.map +1 -1
  149. package/dist/tools/index.js +0 -4
  150. package/dist/tools/index.js.map +1 -1
  151. package/dist/tools/memory/autoSaveContext.d.ts +0 -1
  152. package/dist/tools/memory/autoSaveContext.d.ts.map +1 -1
  153. package/dist/tools/memory/autoSaveContext.js +13 -27
  154. package/dist/tools/memory/autoSaveContext.js.map +1 -1
  155. package/hooks/scripts/__tests__/code-check-detectors.test.js +2 -2
  156. package/hooks/scripts/__tests__/run-ledger.test.js +1 -1
  157. package/hooks/scripts/__tests__/scope-from-spec.test.js +12 -12
  158. package/hooks/scripts/__tests__/step-counter.test.js +1 -1
  159. package/hooks/scripts/code-check.js +16 -203
  160. package/hooks/scripts/context-save.js +0 -11
  161. package/hooks/scripts/lib/scope-from-spec.js +9 -6
  162. package/hooks/scripts/llm-orchestrate.js +49 -0
  163. package/hooks/scripts/post-edit-dispatcher.js +1 -1
  164. package/hooks/scripts/prompt-dispatcher.js +7 -18
  165. package/hooks/scripts/session-start.js +25 -35
  166. package/package.json +4 -4
  167. package/skills/agents-md/SKILL.md +62 -15
  168. package/skills/arch-guard/SKILL.md +1 -1
  169. package/skills/brand-assets/SKILL.md +2 -2
  170. package/skills/capability-loop/SKILL.md +1 -1
  171. package/skills/chub-usage/SKILL.md +1 -1
  172. package/skills/commerce-patterns/SKILL.md +2 -2
  173. package/skills/commit-push-pr/SKILL.md +0 -1
  174. package/skills/context7-usage/SKILL.md +1 -1
  175. package/skills/create-prd/agents/edge-case-finder.md +4 -4
  176. package/skills/create-prd/agents/prioritizer.md +4 -4
  177. package/skills/create-prd/agents/requirements-writer.md +3 -3
  178. package/skills/create-prd/agents/researcher.md +3 -3
  179. package/skills/create-prd/agents/reviewer.md +3 -3
  180. package/skills/create-prd/orchestrator.md +2 -0
  181. package/skills/design-refine/SKILL.md +140 -0
  182. package/skills/{design-polish → design-refine}/templates/polish-report.md +1 -1
  183. package/skills/{design-normalize → design-refine}/templates/token-audit.md +3 -3
  184. package/skills/design-review/SKILL.md +143 -0
  185. package/skills/{design-audit → design-review}/agents/a11y-auditor.md +1 -1
  186. package/skills/{design-audit → design-review}/agents/performance-auditor.md +1 -1
  187. package/skills/{design-audit → design-review}/agents/responsive-auditor.md +1 -1
  188. package/skills/{design-audit → design-review}/agents/slop-detector.md +1 -1
  189. package/skills/{design-audit → design-review}/frameworks/core-web-vitals.md +1 -1
  190. package/skills/{design-audit → design-review}/frameworks/wcag-checklist.md +1 -1
  191. package/skills/{design-audit → design-review}/orchestrator.md +5 -3
  192. package/skills/{design-critique → design-review}/templates/critique-report.md +3 -3
  193. package/skills/{design-audit → design-review}/templates/report.md +3 -3
  194. package/skills/design-teach/SKILL.md +11 -11
  195. package/skills/docs/SKILL.md +14 -16
  196. package/skills/e2e-commerce/SKILL.md +1 -1
  197. package/skills/event-comms/SKILL.md +1 -1
  198. package/skills/event-ops/SKILL.md +2 -2
  199. package/skills/event-planning/SKILL.md +1 -1
  200. package/skills/exec-plan/SKILL.md +2 -2
  201. package/skills/exec-plan/orchestrator.md +2 -0
  202. package/skills/figma/SKILL.md +240 -148
  203. package/skills/figma/rubrics/css-mapping.md +125 -0
  204. package/skills/git-worktree/SKILL.md +1 -1
  205. package/skills/handoff/SKILL.md +1 -1
  206. package/skills/parallel-research/SKILL.md +14 -28
  207. package/skills/parallel-research/orchestrator.md +2 -0
  208. package/skills/priority-todos/SKILL.md +1 -1
  209. package/skills/regress/SKILL.md +11 -0
  210. package/skills/restraint/SKILL.md +72 -0
  211. package/skills/seo-checklist/SKILL.md +2 -2
  212. package/skills/spec/SKILL.md +65 -836
  213. package/skills/test/SKILL.md +3 -3
  214. package/skills/tool-fallback/SKILL.md +2 -2
  215. package/skills/vercel-react-best-practices/SKILL.md +1 -1
  216. package/skills/vibe/SKILL.md +20 -35
  217. package/skills/vibe.analyze/SKILL.md +7 -9
  218. package/skills/vibe.docs/SKILL.md +1 -1
  219. package/skills/vibe.event/SKILL.md +27 -27
  220. package/skills/vibe.figma/SKILL.md +14 -18
  221. package/skills/vibe.harness/SKILL.md +5 -5
  222. package/skills/vibe.llm/SKILL.md +50 -0
  223. package/skills/vibe.reason/SKILL.md +0 -2
  224. package/skills/vibe.review/SKILL.md +45 -49
  225. package/skills/vibe.run/SKILL.md +2 -5
  226. package/skills/vibe.run/references/parallel-agents.md +33 -98
  227. package/skills/vibe.spec/SKILL.md +38 -535
  228. package/skills/vibe.utils/SKILL.md +3 -3
  229. package/skills/vibe.verify/SKILL.md +70 -542
  230. package/skills/video-production/SKILL.md +1 -1
  231. package/vibe/rules/orchestrator-contract.md +57 -0
  232. package/vibe/rules/quality/performance.md +1 -1
  233. package/vibe/templates/claudemd-template.md +1 -1
  234. package/vibe/templates/spec-template.md +35 -185
  235. package/agents/architect-low.md +0 -41
  236. package/agents/architect-medium.md +0 -59
  237. package/agents/compounder.md +0 -261
  238. package/agents/docs/api-documenter.md +0 -99
  239. package/agents/docs/changelog-writer.md +0 -93
  240. package/agents/event/event-comms.md +0 -78
  241. package/agents/event/event-content.md +0 -68
  242. package/agents/event/event-image.md +0 -95
  243. package/agents/event/event-scheduler.md +0 -69
  244. package/agents/event/event-speaker.md +0 -86
  245. package/agents/explorer-low.md +0 -42
  246. package/agents/explorer-medium.md +0 -59
  247. package/agents/explorer.md +0 -48
  248. package/agents/figma/figma-analyst.md +0 -52
  249. package/agents/figma/figma-architect.md +0 -112
  250. package/agents/figma/figma-auditor.md +0 -82
  251. package/agents/figma/figma-builder.md +0 -100
  252. package/agents/implementer-low.md +0 -43
  253. package/agents/implementer-medium.md +0 -52
  254. package/agents/junior-mentor.md +0 -141
  255. package/agents/planning/requirements-analyst.md +0 -84
  256. package/agents/planning/ux-advisor.md +0 -83
  257. package/agents/qa/acceptance-tester.md +0 -86
  258. package/agents/qa/edge-case-finder.md +0 -93
  259. package/agents/qa/qa-coordinator.md +0 -131
  260. package/agents/refactor-cleaner.md +0 -143
  261. package/agents/research/best-practices.md +0 -199
  262. package/agents/research/codebase-patterns.md +0 -157
  263. package/agents/research/framework-docs.md +0 -188
  264. package/agents/research/security-advisory.md +0 -213
  265. package/agents/review/architecture-reviewer.md +0 -107
  266. package/agents/review/complexity-reviewer.md +0 -116
  267. package/agents/review/data-integrity-reviewer.md +0 -88
  268. package/agents/review/git-history-reviewer.md +0 -103
  269. package/agents/review/performance-reviewer.md +0 -86
  270. package/agents/review/python-reviewer.md +0 -150
  271. package/agents/review/rails-reviewer.md +0 -139
  272. package/agents/review/react-reviewer.md +0 -144
  273. package/agents/review/security-reviewer.md +0 -80
  274. package/agents/review/simplicity-reviewer.md +0 -140
  275. package/agents/review/test-coverage-reviewer.md +0 -116
  276. package/agents/review/typescript-reviewer.md +0 -127
  277. package/agents/searcher.md +0 -54
  278. package/agents/simplifier.md +0 -120
  279. package/agents/teams/debug-team.md +0 -70
  280. package/agents/teams/dev-team.md +0 -88
  281. package/agents/teams/docs-team.md +0 -80
  282. package/agents/teams/figma-team.md +0 -85
  283. package/agents/teams/fullstack-team.md +0 -83
  284. package/agents/teams/lite-team.md +0 -69
  285. package/agents/teams/migration-team.md +0 -78
  286. package/agents/teams/refactor-team.md +0 -94
  287. package/agents/teams/research-team.md +0 -86
  288. package/agents/teams/review-debate-team.md +0 -125
  289. package/agents/teams/security-team.md +0 -81
  290. package/agents/ui/ui-a11y-auditor.md +0 -93
  291. package/agents/ui/ui-antipattern-detector.md +0 -102
  292. package/agents/ui/ui-dataviz-advisor.md +0 -69
  293. package/agents/ui/ui-design-system-gen.md +0 -57
  294. package/agents/ui/ui-industry-analyzer.md +0 -49
  295. package/agents/ui/ui-layout-architect.md +0 -65
  296. package/agents/ui/ui-stack-implementer.md +0 -68
  297. package/agents/ui/ux-compliance-reviewer.md +0 -81
  298. package/agents/ui-previewer.md +0 -258
  299. package/hooks/scripts/__tests__/keyword-detector.test.js +0 -242
  300. package/hooks/scripts/keyword-detector.js +0 -226
  301. package/skills/characterization-test/SKILL.md +0 -209
  302. package/skills/characterization-test/agents/behavior-capturer.md +0 -50
  303. package/skills/characterization-test/agents/coverage-checker.md +0 -54
  304. package/skills/characterization-test/agents/reporter.md +0 -50
  305. package/skills/characterization-test/agents/test-writer.md +0 -49
  306. package/skills/characterization-test/rubrics/coverage-criteria.md +0 -53
  307. package/skills/characterization-test/templates/test-template.ts +0 -101
  308. package/skills/claude-md-guide/SKILL.md +0 -353
  309. package/skills/claude-md-guide/rubrics/anti-patterns.md +0 -88
  310. package/skills/design-audit/SKILL.md +0 -154
  311. package/skills/design-critique/SKILL.md +0 -140
  312. package/skills/design-distill/SKILL.md +0 -131
  313. package/skills/design-normalize/SKILL.md +0 -135
  314. package/skills/design-polish/SKILL.md +0 -132
  315. package/skills/figma-convert/SKILL.md +0 -236
  316. package/skills/figma-extract/SKILL.md +0 -242
  317. package/skills/interview/SKILL.md +0 -358
  318. package/skills/interview/checklists/api.md +0 -101
  319. package/skills/interview/checklists/feature.md +0 -88
  320. package/skills/interview/checklists/library.md +0 -95
  321. package/skills/interview/checklists/mobile.md +0 -89
  322. package/skills/interview/checklists/webapp.md +0 -97
  323. package/skills/interview/checklists/website.md +0 -99
  324. package/skills/plan/SKILL.md +0 -254
  325. package/skills/rob-pike/SKILL.md +0 -66
  326. package/skills/spec/references/askuser-examples.md +0 -57
  327. package/skills/spec/references/example-session.md +0 -87
  328. package/skills/spec/references/templates.md +0 -194
  329. package/skills/spec-review/SKILL.md +0 -725
  330. package/skills/systematic-debugging/SKILL.md +0 -142
  331. package/skills/techdebt/SKILL.md +0 -126
  332. package/skills/techdebt/agents/analyzer.md +0 -50
  333. package/skills/techdebt/agents/fixer.md +0 -41
  334. package/skills/techdebt/agents/reviewer.md +0 -47
  335. package/skills/techdebt/agents/scanner.md +0 -44
  336. package/skills/techdebt/orchestrator.md +0 -70
  337. package/skills/techdebt/rubrics/severity.md +0 -51
  338. package/skills/techdebt/scripts/scan.js +0 -90
  339. package/skills/techdebt/templates/report.md +0 -86
  340. package/skills/typescript-advanced-types/SKILL.md +0 -68
  341. package/skills/typescript-advanced-types/rubrics/type-patterns.md +0 -109
  342. package/skills/yagni-ladder/SKILL.md +0 -90
  343. /package/skills/{claude-md-guide → agents-md}/templates/claude-md.md +0 -0
  344. /package/skills/{design-polish → design-refine}/rubrics/polish-checklist.md +0 -0
  345. /package/skills/{design-normalize → design-refine}/rubrics/token-naming.md +0 -0
  346. /package/skills/{design-distill → design-refine}/templates/design-system.md +0 -0
  347. /package/skills/{design-audit → design-review}/agents/scorer.md +0 -0
  348. /package/skills/{design-audit → design-review}/rubrics/ai-slop-patterns.md +0 -0
  349. /package/skills/{design-audit → design-review}/rubrics/scoring.md +0 -0
  350. /package/skills/{design-critique → design-review}/rubrics/ux-heuristics.md +0 -0
  351. /package/skills/{figma-convert → figma}/rubrics/conversion-rules.md +0 -0
  352. /package/skills/{figma-extract → figma}/rubrics/image-rules.md +0 -0
  353. /package/skills/{figma-convert → figma}/templates/component.md +0 -0
@@ -1,142 +0,0 @@
1
- ---
2
- name: systematic-debugging
3
- user-invocable: false
4
- invocation: [auto]
5
- tier: core
6
- description: "Enforce reproduce-first, root-cause-first, failing-test-first debugging. Auto-activates on bug, error, fail, broken, crash, flaky keywords."
7
- triggers: [bug, error, fail, broken, crash, flaky, not working, regression, unexpected, stack trace, exception, debug]
8
- priority: 90
9
- ---
10
-
11
- # Systematic Debugging
12
-
13
- ## Hard Gates
14
-
15
- These rules have NO exceptions:
16
-
17
- 1. **Never fix before reproducing or observing the failure.**
18
- 2. **State a root-cause hypothesis before changing code.**
19
- 3. **Write a failing test (or equivalent) before fixing.**
20
- 4. **Test one hypothesis at a time.**
21
- 5. **No "while I'm here" refactoring during a fix.**
22
- 6. **3 failed fixes → suspect structural issue, stop patching.**
23
-
24
- These excuses are NOT allowed:
25
- - "It looks simple, I'll just fix it"
26
- - "No time, let me patch and move on"
27
- - "This seems like the issue, let me just change it"
28
-
29
- ## Workflow
30
-
31
- Follow this order strictly.
32
-
33
- ### Phase 1. Define The Problem
34
-
35
- ```text
36
- Problem: <expected> but got <actual> under <condition>
37
- ```
38
-
39
- Good: "Product detail API returns 500 when brand is null."
40
- Bad: "Serializer is broken because brand mapping seems wrong."
41
-
42
- ### Phase 2. Reproduce Or Instrument
43
-
44
- Priority:
45
- 1. Reproduce with existing test
46
- 2. Minimal integration test
47
- 3. Unit test
48
- 4. Reproduction script/command
49
- 5. Add logging/instrumentation to observe
50
-
51
- Rules:
52
- - Make reproduction path as small as possible.
53
- - If UI-only bug, prefer reproducing at a lower layer.
54
- - If flaky, add logging for inputs, timing, concurrency conditions.
55
- - If can't reproduce, do NOT proceed to fix — increase observability first.
56
-
57
- ### Phase 3. Gather Evidence
58
-
59
- Collect observable facts only:
60
- - Full error message and stack trace
61
- - Failing input values
62
- - Recent changed files/commits
63
- - Environment/config differences
64
- - Call path and data flow
65
-
66
- At each boundary (controller → service → repository), check:
67
- - What came in?
68
- - What went out?
69
- - What was transformed?
70
- - Under what condition does it break?
71
-
72
- Do NOT fix before locating the problem.
73
-
74
- ### Phase 4. Isolate Root Cause
75
-
76
- State exactly one candidate:
77
-
78
- ```text
79
- Hypothesis: <root cause> because <evidence>
80
- ```
81
-
82
- Good hypothesis conditions:
83
- - Points to a single cause
84
- - Connected to observed evidence
85
- - Falsifiable with a small experiment
86
-
87
- Bad: "Something async seems wrong" / "The whole serializer area is unstable"
88
-
89
- ### Phase 5. Lock The Failure
90
-
91
- Before fixing, lock the failure:
92
- 1. Automated failing test (preferred)
93
- 2. Add regression case to existing test
94
- 3. Minimal reproduction script
95
- 4. Temporary log/assertion guard
96
-
97
- The test MUST fail before fix, pass after fix.
98
-
99
- ### Phase 6. Single Fix
100
-
101
- Allowed:
102
- - Minimal code change addressing the root cause
103
- - Minimal supporting changes for verification
104
-
105
- Forbidden:
106
- - Bundling multiple "related" fixes
107
- - Refactoring alongside the fix
108
- - Formatting/renaming/cleanup
109
- - Adding null-guards without evidence
110
- - Swallowing exceptions
111
-
112
- If fix fails → go back to Phase 3. Previous hypothesis was wrong.
113
-
114
- ### Phase 7. Verify And Close
115
-
116
- ALL must be true:
117
- 1. Original reproduction path no longer fails
118
- 2. New failing guard now passes
119
- 3. Related tests don't break
120
- 4. Fix addresses cause, not symptom
121
-
122
- For flaky bugs: single pass is not enough. Repeat or vary conditions.
123
-
124
- ## Red Flags — Stop Immediately
125
-
126
- If you think any of these, STOP and go back:
127
-
128
- - "Let me just change this one line"
129
- - "I'll check logs later, let me fix first"
130
- - "I'll add the test later"
131
- - "Let me fix this and that together"
132
- - "The error is gone so it doesn't matter what caused it"
133
-
134
- ## Completion Checklist
135
-
136
- - [ ] Problem defined in one sentence
137
- - [ ] Failure reproduced or made observable
138
- - [ ] Evidence collected
139
- - [ ] Single root-cause hypothesis stated
140
- - [ ] Failing guard created before fix
141
- - [ ] Single fix applied
142
- - [ ] Verified via same reproduction path
@@ -1,126 +0,0 @@
1
- ---
2
- name: techdebt
3
- user-invocable: false
4
- invocation: [auto, chain]
5
- tier: core
6
- description: "Technical debt cleanup — detect and fix duplicate code, console.log, unused imports, any types, etc. Recommended before session end. Activates on techdebt, cleanup, debt keywords."
7
- triggers: [techdebt, cleanup, debt, unused imports, console.log, dead code]
8
- priority: 60
9
- chain-next: [commit-push-pr]
10
- ---
11
-
12
- # Techdebt — Technical Debt Cleanup
13
-
14
- Detect and clean up technical debt in the codebase before session end or periodically.
15
-
16
- ## Inspection Items
17
-
18
- ### 1. Duplicate Code
19
-
20
- - Check for similar functions/logic across multiple files
21
- - Identify code extractable into common utilities
22
- - Method: Detect similar code with `core_analyze_complexity`
23
-
24
- ### 2. Unused Code
25
-
26
- - Unused import statements
27
- - Unused variables/functions
28
- - Commented-out code blocks
29
-
30
- Detection tools:
31
-
32
- ```
33
- # Detect unused imports (using Grep tool)
34
- Grep: pattern="^import .+ from" → cross-reference usage
35
-
36
- # Detect commented-out code blocks
37
- Grep: pattern="^\\s*//.*\\b(function|const|let|var|class|import)\\b"
38
- ```
39
-
40
- ### 3. Debug Code
41
-
42
- - `console.log` / `console.error` / `console.warn`
43
- - `debugger` statements
44
- - Temporary comments: `// TODO`, `// FIXME`, `// HACK`, `// XXX`
45
-
46
- Detection tools:
47
-
48
- ```
49
- # Detect console statements (using Grep tool)
50
- Grep: pattern="console\\.(log|error|warn|debug)" glob="*.{ts,tsx}"
51
-
52
- # Detect TODO/FIXME
53
- Grep: pattern="(TODO|FIXME|HACK|XXX)" glob="*.{ts,tsx}"
54
-
55
- # Detect debugger statements
56
- Grep: pattern="\\bdebugger\\b" glob="*.{ts,tsx}"
57
- ```
58
-
59
- ### 4. Code Quality
60
-
61
- - `any` type usage (TypeScript)
62
- - Hardcoded values (magic numbers/strings)
63
- - Functions exceeding 50 lines
64
- - Nesting deeper than 4 levels
65
-
66
- Detection tools:
67
-
68
- ```
69
- # Detect any types (using Grep tool)
70
- Grep: pattern=": any\\b|as any\\b" glob="*.{ts,tsx}"
71
-
72
- # Analyze complexity with built-in VIBE tools
73
- core_analyze_complexity: filePath="src/**/*.ts"
74
- core_validate_code_quality: filePath="src/**/*.ts"
75
- ```
76
-
77
- ## Output Format
78
-
79
- ```markdown
80
- ## Technical Debt Report
81
-
82
- ### Duplicate Code (N items)
83
- - src/utils.ts:formatDate ↔ src/helpers.ts:formatDateTime
84
-
85
- ### Unused Imports (N items)
86
- - src/components/Button.tsx:3 — React (unused)
87
-
88
- ### Debug Code (N items)
89
- - src/api/auth.ts:23 — console.log
90
-
91
- ### Code Quality Issues (N items)
92
- - src/services/user.ts:45 — any type usage
93
- - src/utils/calc.ts:10 — magic number (hardcoded 365)
94
-
95
- Total: N technical debt items found.
96
- ```
97
-
98
- ## Auto-fix Scope
99
-
100
- ### Auto-fixable (Safe)
101
-
102
- | Item | Fix Method |
103
- |------|-----------|
104
- | Unused imports | Delete the import statement |
105
- | `console.log` / `debugger` | Delete the line |
106
- | Trailing whitespace / blank lines | Apply formatter |
107
-
108
- ### Requires Manual Review (Safety Guard)
109
-
110
- | Item | Reason |
111
- |------|--------|
112
- | Duplicate code extraction | Need to verify logic equivalence |
113
- | `any` type fixes | Need proper type design |
114
- | Magic number extraction | Need to decide constant names and locations |
115
- | Long function splitting | Need to decide logic separation criteria |
116
-
117
- > Always show the scope of changes to the user and get confirmation before auto-fixing.
118
-
119
- ## VIBE Tool Integration
120
-
121
- | Tool | Purpose |
122
- |------|---------|
123
- | `core_analyze_complexity` | Measure function complexity (nesting, line count) |
124
- | `core_validate_code_quality` | Detect code quality rule violations |
125
- | `core_suggest_improvements` | Generate improvement suggestions |
126
- | `core_check_coupling_cohesion` | Analyze module coupling/cohesion |
@@ -1,50 +0,0 @@
1
- ---
2
- name: techdebt-analyzer
3
- role: Analyzes severity and blast radius of each scanned finding
4
- tools: [Read, Grep]
5
- ---
6
-
7
- # Techdebt Analyzer
8
-
9
- ## Role
10
- Receives raw scan findings and evaluates each item's severity, effort to fix, and risk of breakage. Classifies findings into auto-fixable vs. manual-review categories and assigns a priority score to guide the fixer.
11
-
12
- ## Responsibilities
13
- - Classify each finding by severity: Critical / High / Medium / Low
14
- - Assess auto-fix safety: safe (delete line), risky (needs refactor), manual-only
15
- - Estimate fix effort: trivial (1 line), minor (< 10 lines), major (multi-file)
16
- - Detect clusters — multiple related findings that should be fixed together
17
- - Flag findings in test files separately (lower priority, different rules apply)
18
-
19
- ## Input
20
- Raw findings JSON array from `techdebt-scanner` with file, line, category, and snippet fields.
21
-
22
- ## Output
23
- Enriched findings list with severity and fix metadata:
24
- ```json
25
- [
26
- {
27
- "category": "console-log",
28
- "file": "src/api/auth.ts",
29
- "line": 12,
30
- "snippet": "console.log(token)",
31
- "severity": "High",
32
- "autoFixable": true,
33
- "effort": "trivial",
34
- "fixMethod": "delete-line"
35
- }
36
- ]
37
- ```
38
- Plus a summary: total counts by severity, estimated total fix time.
39
-
40
- ## Communication
41
- - Reports enriched findings to: `techdebt-fixer` (auto-fixable items) and orchestrator (manual items)
42
- - Receives instructions from: techdebt orchestrator (SKILL.md)
43
-
44
- ## Domain Knowledge
45
- Severity heuristics:
46
- - **Critical**: `any` in public API surface, `console.log` logging credentials/tokens
47
- - **High**: `any` in business logic, `console.log` in production paths
48
- - **Medium**: magic numbers, unused imports, commented-out blocks
49
- - **Low**: unused imports in test files, minor style issues
50
- Auto-fix safety rules: never auto-fix type changes, logic extractions, or multi-file changes.
@@ -1,41 +0,0 @@
1
- ---
2
- name: techdebt-fixer
3
- role: Generates safe auto-fix patches for trivially fixable techdebt items
4
- tools: [Read, Edit]
5
- ---
6
-
7
- # Techdebt Fixer
8
-
9
- ## Role
10
- Applies safe, deterministic fixes to auto-fixable findings identified by the analyzer. Operates strictly within the boundaries set by the analyzer — never attempts fixes marked `manual-only` or `risky`. Each fix is atomic and targets a single file at a time.
11
-
12
- ## Responsibilities
13
- - Delete `console.log`, `console.error`, `console.warn`, and `debugger` lines
14
- - Remove unused import statements (single-identifier and named imports)
15
- - Delete commented-out code blocks that contain dead code constructs
16
- - Preserve surrounding blank lines and indentation conventions
17
- - Record every change made for the reviewer's diff check
18
-
19
- ## Input
20
- Filtered findings list from `techdebt-analyzer` where `autoFixable: true` and `effort: "trivial"`, plus the full file content via Read.
21
-
22
- ## Output
23
- A change log of all edits applied:
24
- ```json
25
- [
26
- { "file": "src/api/auth.ts", "line": 12, "action": "deleted", "was": "console.log(token)" },
27
- { "file": "src/components/Button.tsx", "line": 3, "action": "deleted", "was": "import React from 'react'" }
28
- ]
29
- ```
30
- Edited files are modified in place using the Edit tool.
31
-
32
- ## Communication
33
- - Reports change log to: `techdebt-reviewer`
34
- - Receives instructions from: techdebt orchestrator (SKILL.md)
35
-
36
- ## Domain Knowledge
37
- Fix safety rules:
38
- - Only delete lines — never rewrite or rearrange code
39
- - When removing a named import `{ A, B }`, if only `A` is unused, rewrite to `{ B }`, not delete the line
40
- - Never remove imports flagged as side-effect imports (e.g., `import './styles.css'`)
41
- - Stop and escalate if a file has been modified by another agent in the same session
@@ -1,47 +0,0 @@
1
- ---
2
- name: techdebt-reviewer
3
- role: Reviews auto-fix patches for correctness and safety before presenting to user
4
- tools: [Read, Grep]
5
- ---
6
-
7
- # Techdebt Reviewer
8
-
9
- ## Role
10
- Acts as the final quality gate before fixes are presented to the user for confirmation. Re-reads every modified file, verifies that only the intended lines were changed, and checks that no new issues were introduced. Produces a human-readable summary with before/after context.
11
-
12
- ## Responsibilities
13
- - Re-read each modified file and diff against the change log from `techdebt-fixer`
14
- - Verify no unintended lines were altered (scope creep check)
15
- - Confirm removed imports were genuinely unused by re-scanning usage in file body
16
- - Check that removing a `console.log` did not break a surrounding `if` block structure
17
- - Produce a formatted summary grouped by category for user confirmation
18
-
19
- ## Input
20
- Change log JSON from `techdebt-fixer` plus current file content from Read tool.
21
-
22
- ## Output
23
- Human-readable review report:
24
- ```markdown
25
- ## Techdebt Fix Review
26
-
27
- ### Ready to Apply (N changes)
28
- - src/api/auth.ts:12 — removed console.log(token) [verified safe]
29
- - src/components/Button.tsx:3 — removed unused React import [verified safe]
30
-
31
- ### Flagged for Manual Review (N items)
32
- - src/services/user.ts:45 — any type, needs proper interface definition
33
-
34
- All changes are reversible with git checkout.
35
- ```
36
- Final confirmation prompt to user before any edits are committed.
37
-
38
- ## Communication
39
- - Reports review summary to: orchestrator / user
40
- - Receives instructions from: techdebt orchestrator (SKILL.md)
41
-
42
- ## Domain Knowledge
43
- Verification checklist:
44
- - Import removal: identifier must appear zero times outside the import line
45
- - Console removal: surrounding block must remain syntactically valid
46
- - Commented code removal: must not be a doc comment (`/** */`) or license header
47
- - Scope rule: reviewer changes nothing — read-only gate only
@@ -1,44 +0,0 @@
1
- ---
2
- name: techdebt-scanner
3
- role: Scans codebase for code smells — any types, console.log, unused imports, magic numbers
4
- tools: [Grep, Glob, Read]
5
- ---
6
-
7
- # Techdebt Scanner
8
-
9
- ## Role
10
- Performs broad pattern-based scanning across the codebase to locate instances of known code smells. Produces a raw findings list with file paths and line numbers. Does not assess severity — that is the analyzer's job.
11
-
12
- ## Responsibilities
13
- - Scan for `any` and `as any` TypeScript type violations
14
- - Detect `console.log`, `console.error`, `console.warn`, `debugger` statements
15
- - Find unused import statements by cross-referencing declaration vs. usage
16
- - Locate magic numbers and hardcoded string literals outside constant files
17
- - Detect commented-out code blocks containing code constructs
18
-
19
- ## Input
20
- - Root directory path to scan
21
- - Optional glob filter (e.g., `src/**/*.{ts,tsx}`)
22
- - Optional category filter (e.g., scan only `any-types`)
23
-
24
- ## Output
25
- Structured findings list in JSON format:
26
- ```json
27
- [
28
- { "category": "any-type", "file": "src/services/user.ts", "line": 34, "snippet": ": any" },
29
- { "category": "console-log", "file": "src/api/auth.ts", "line": 12, "snippet": "console.log(token)" },
30
- { "category": "magic-number", "file": "src/utils/calc.ts", "line": 10, "snippet": "* 365" }
31
- ]
32
- ```
33
-
34
- ## Communication
35
- - Reports findings to: `techdebt-analyzer`
36
- - Receives instructions from: techdebt orchestrator (SKILL.md)
37
-
38
- ## Domain Knowledge
39
- Scan patterns:
40
- - `any` types: `: any\b`, `as any\b`, `<any>`
41
- - Debug code: `console\.(log|error|warn|debug|info)`, `\bdebugger\b`
42
- - Magic numbers: numeric literals outside `const` declarations, ignoring 0, 1, -1, 100
43
- - Commented code: `^\s*//.*\b(function|const|let|var|class|import)\b`
44
- - Unused imports: declared in `import { X }` but `X` never referenced in file body
@@ -1,70 +0,0 @@
1
- ---
2
- name: techdebt-orchestrator
3
- type: orchestrator
4
- agents: [scanner, analyzer, fixer, reviewer]
5
- ---
6
-
7
- # Techdebt Orchestrator
8
-
9
- ## Workflow
10
-
11
- ### Phase 1: Scan
12
- - **Agent**: scanner
13
- - **Input**: Changed file paths (or root dir + glob filter)
14
- - **Output**: Raw findings list `[{category, file, line, snippet}]`
15
- - **Parallel**: yes — each file scanned independently
16
-
17
- ### Phase 2: Analyze
18
- - **Agent**: analyzer
19
- - **Input**: Raw findings list from Phase 1
20
- - **Output**: Scored findings with severity (P0–P3) and auto-fix eligibility flag
21
- - **Parallel**: no — requires full findings set for deduplication
22
-
23
- ### Phase 3: Fix
24
- - **Agent**: fixer
25
- - **Input**: Findings flagged `auto-fixable: true` from Phase 2
26
- - **Output**: Patch set (file edits) for each auto-fixable item
27
- - **Parallel**: yes — patches per file are independent
28
-
29
- ### Phase 4: Review
30
- - **Agent**: reviewer
31
- - **Input**: Patch set from Phase 3
32
- - **Output**: Approved patches + rejected patches with rejection reason
33
- - **Parallel**: no — needs holistic view to catch patch conflicts
34
-
35
- ### Phase 5: Apply
36
- - **Agent**: orchestrator (self)
37
- - **Input**: Approved patches from Phase 4 + manual-review items from Phase 2
38
- - **Output**: Applied fixes + final report with manual-review list
39
- - **Parallel**: no — sequential file writes to avoid conflicts
40
-
41
- ## DAG (Dependency Graph)
42
-
43
- ```mermaid
44
- graph TD
45
- A[Phase 1: Scanner\nparallel per file] --> B[Phase 2: Analyzer]
46
- B --> C[Phase 3: Fixer\nparallel per file]
47
- B --> E[Manual Review Items]
48
- C --> D[Phase 4: Reviewer]
49
- D --> F[Phase 5: Apply]
50
- E --> F
51
- ```
52
-
53
- ## Error Handling
54
-
55
- | Phase | Failure Mode | Strategy |
56
- |-------|-------------|----------|
57
- | Phase 1 | File unreadable / binary file | Skip file, log warning, continue |
58
- | Phase 1 | Glob returns 0 files | Escalate — prompt user to verify path |
59
- | Phase 2 | Analyzer returns 0 findings | Skip phases 3–4, output clean report |
60
- | Phase 3 | Patch generation fails for a file | Skip that file, flag for manual review |
61
- | Phase 4 | Reviewer rejects all patches | Fallback to manual-review-only report |
62
- | Phase 5 | Write conflict detected | Abort apply, show diff for manual resolution |
63
-
64
- ## Scalability Modes
65
-
66
- | Mode | When | Agents Used |
67
- |------|------|-------------|
68
- | Full | Normal operation | scanner + analyzer + fixer + reviewer |
69
- | Reduced | Time pressure / large repo | scanner + analyzer only (no auto-fix) |
70
- | Single | Quick scan / pre-commit check | scanner only — raw findings, no scoring |
@@ -1,51 +0,0 @@
1
- # Techdebt Severity Rubric
2
-
3
- ## P1 — Blocks Merge
4
-
5
- Issues that introduce bugs, security holes, or break type safety. Must fix before merging.
6
-
7
- | Pattern | Why P1 |
8
- |---------|--------|
9
- | `: any` / `as any` | Breaks TypeScript safety guarantee |
10
- | `@ts-ignore` | Hides real type errors |
11
- | `debugger` statement | Halts execution in production |
12
- | Hardcoded secrets / credentials | Security risk |
13
- | Circular imports causing runtime errors | Breaks module loading |
14
-
15
- **Rule**: P1 count must be 0 before merge.
16
-
17
- ## P2 — Fix Before PR
18
-
19
- Issues that reduce maintainability, performance, or correctness. Should be resolved before PR review.
20
-
21
- | Pattern | Why P2 |
22
- |---------|--------|
23
- | `console.log` / `console.warn` | Debug noise in production logs |
24
- | Functions > 50 lines | Violates complexity limit; hard to test |
25
- | Nesting depth > 4 | Cognitive overload; obscures logic |
26
- | Unused imports | Bundle bloat; misleading code |
27
- | TODO/FIXME without ticket | Ambiguous ownership |
28
- | Duplicate logic (2+ files) | Maintenance hazard |
29
-
30
- **Rule**: P2 items are warnings. Resolve or create a tracked P3 ticket before merge.
31
-
32
- ## P3 — Backlog
33
-
34
- Issues that are cosmetic or nice-to-have. Address during scheduled cleanup sessions.
35
-
36
- | Pattern | Why P3 |
37
- |---------|--------|
38
- | Magic numbers (non-critical) | Readability |
39
- | Commented-out code | Noise |
40
- | Inconsistent naming | Style drift |
41
- | Missing JSDoc on internal helpers | Documentation gap |
42
- | Slightly long files (200–499 lines) | Future extraction candidate |
43
-
44
- **Rule**: P3 items never block. Review weekly; archive when resolved.
45
-
46
- ## Convergence Rule
47
-
48
- - Round 1: address all P1 + P2
49
- - Round 2: address remaining P1 + P2 only
50
- - Round 3+: P1 only
51
- - Same findings as previous round → stop immediately
@@ -1,90 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * techdebt/scripts/scan.js
4
- * Scan a directory for technical debt patterns.
5
- * Usage: node scan.js <directory>
6
- * Output: JSON array of findings to stdout.
7
- */
8
-
9
- import fs from 'fs';
10
- import path from 'path';
11
-
12
- const TARGET_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx']);
13
-
14
- /** @returns {string[]} */
15
- function collectFiles(dir) {
16
- const results = [];
17
- for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
18
- if (entry.name.startsWith('.') || entry.name === 'node_modules' || entry.name === 'dist') continue;
19
- const full = path.join(dir, entry.name);
20
- if (entry.isDirectory()) results.push(...collectFiles(full));
21
- else if (TARGET_EXTENSIONS.has(path.extname(entry.name))) results.push(full);
22
- }
23
- return results;
24
- }
25
-
26
- /** @param {string} file @returns {import('./scan.js').Finding[]} */
27
- function scanFile(file) {
28
- const lines = fs.readFileSync(file, 'utf-8').split('\n');
29
- const findings = [];
30
- let functionLineStart = -1;
31
- let braceDepth = 0;
32
- let functionLineCount = 0;
33
- let maxNesting = 0;
34
- let currentNesting = 0;
35
-
36
- const push = (line, type, severity, message) =>
37
- findings.push({ file, line: line + 1, type, severity, message });
38
-
39
- for (let i = 0; i < lines.length; i++) {
40
- const raw = lines[i];
41
- const trimmed = raw.trim();
42
-
43
- if (/:\s*any\b|as\s+any\b/.test(trimmed)) push(i, 'any-type', 'P1', `'any' type usage detected`);
44
- if (/console\.(log|warn|error|debug)\s*\(/.test(trimmed)) push(i, 'console-log', 'P2', `console statement found`);
45
- if (/^import\s+/.test(trimmed)) {
46
- const match = trimmed.match(/^import\s+\{([^}]+)\}/);
47
- if (match) {
48
- const names = match[1].split(',').map(n => n.trim().split(/\s+as\s+/).pop());
49
- for (const name of names) {
50
- const usedElsewhere = lines.slice(i + 1).some(l => new RegExp(`\\b${name}\\b`).test(l));
51
- if (!usedElsewhere) push(i, 'unused-import', 'P2', `Possibly unused import: ${name}`);
52
- }
53
- }
54
- }
55
- const magicNumber = trimmed.match(/(?<![A-Za-z_$'"`])\b([2-9]\d{2,}|\d{4,})\b(?![A-Za-z_$'"`])/);
56
- if (magicNumber && !/^\s*(\/\/|\/\*)/.test(raw)) push(i, 'magic-number', 'P3', `Magic number: ${magicNumber[1]}`);
57
-
58
- const opens = (raw.match(/\{/g) || []).length;
59
- const closes = (raw.match(/\}/g) || []).length;
60
- if (/\bfunction\b|\=\>/.test(raw) && opens > closes) {
61
- functionLineStart = i;
62
- functionLineCount = 0;
63
- braceDepth = opens - closes;
64
- } else if (functionLineStart >= 0) {
65
- braceDepth += opens - closes;
66
- functionLineCount++;
67
- if (braceDepth <= 0) {
68
- if (functionLineCount > 50) push(functionLineStart, 'long-function', 'P2', `Function is ${functionLineCount} lines (limit: 50)`);
69
- functionLineStart = -1;
70
- }
71
- }
72
-
73
- const indent = raw.match(/^(\s*)/)[1].length;
74
- currentNesting = Math.floor(indent / 2);
75
- if (currentNesting > maxNesting) maxNesting = currentNesting;
76
- if (currentNesting > 4) push(i, 'deep-nesting', 'P2', `Nesting depth ${currentNesting} exceeds limit of 4`);
77
- }
78
-
79
- return findings;
80
- }
81
-
82
- const dir = process.argv[2] || process.cwd();
83
- if (!fs.existsSync(dir)) {
84
- process.stderr.write(`Directory not found: ${dir}\n`);
85
- process.exit(1);
86
- }
87
-
88
- const files = collectFiles(path.resolve(dir));
89
- const findings = files.flatMap(scanFile);
90
- process.stdout.write(JSON.stringify(findings, null, 2) + '\n');