tribunal-kit 6.0.0 → 7.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/.agent/.manifest.json +78 -0
  2. package/.agent/ARCHITECTURE.md +19 -241
  3. package/.agent/agents/accessibility-reviewer.md +23 -16
  4. package/.agent/agents/ai-code-reviewer.md +25 -21
  5. package/.agent/agents/anti-pattern-reviewer.md +12 -7
  6. package/.agent/agents/api-architect.md +1 -0
  7. package/.agent/agents/backend-specialist.md +23 -22
  8. package/.agent/agents/cloud-engineer.md +1 -0
  9. package/.agent/agents/code-archaeologist.md +1 -0
  10. package/.agent/agents/complexity-reviewer.md +10 -7
  11. package/.agent/agents/database-architect.md +3 -2
  12. package/.agent/agents/db-latency-auditor.md +6 -2
  13. package/.agent/agents/debugger.md +3 -2
  14. package/.agent/agents/dependency-reviewer.md +1 -0
  15. package/.agent/agents/devops-engineer.md +9 -8
  16. package/.agent/agents/documentation-writer.md +6 -5
  17. package/.agent/agents/explorer-agent.md +1 -0
  18. package/.agent/agents/frontend-reviewer.md +21 -17
  19. package/.agent/agents/frontend-specialist.md +23 -20
  20. package/.agent/agents/game-developer.md +1 -0
  21. package/.agent/agents/interaction-reviewer.md +10 -5
  22. package/.agent/agents/logic-reviewer.md +3 -0
  23. package/.agent/agents/minimalist-reviewer.md +6 -0
  24. package/.agent/agents/mobile-developer.md +7 -6
  25. package/.agent/agents/mobile-reviewer.md +14 -13
  26. package/.agent/agents/orchestrator.md +3 -0
  27. package/.agent/agents/penetration-tester.md +1 -0
  28. package/.agent/agents/performance-optimizer.md +6 -5
  29. package/.agent/agents/performance-reviewer.md +6 -6
  30. package/.agent/agents/pipeline-reviewer.md +144 -0
  31. package/.agent/agents/precedence-reviewer.md +1 -0
  32. package/.agent/agents/product-manager.md +1 -0
  33. package/.agent/agents/product-owner.md +1 -0
  34. package/.agent/agents/product-reviewer.md +12 -7
  35. package/.agent/agents/project-planner.md +3 -0
  36. package/.agent/agents/qa-automation-engineer.md +50 -43
  37. package/.agent/agents/resilience-reviewer.md +1 -0
  38. package/.agent/agents/schema-reviewer.md +1 -0
  39. package/.agent/agents/security-auditor.md +24 -24
  40. package/.agent/agents/seo-specialist.md +33 -23
  41. package/.agent/agents/sql-reviewer.md +5 -4
  42. package/.agent/agents/supervisor-agent.md +12 -2
  43. package/.agent/agents/swarm-worker-contracts.md +13 -13
  44. package/.agent/agents/swarm-worker-registry.md +51 -51
  45. package/.agent/agents/system-architect.md +1 -0
  46. package/.agent/agents/test-coverage-reviewer.md +25 -22
  47. package/.agent/agents/test-engineer.md +12 -11
  48. package/.agent/agents/throughput-optimizer.md +45 -40
  49. package/.agent/agents/type-safety-reviewer.md +5 -4
  50. package/.agent/agents/ui-ux-auditor.md +6 -4
  51. package/.agent/agents/ui-visual-auditor.md +3 -0
  52. package/.agent/agents/ux-reviewer.md +11 -6
  53. package/.agent/agents/visual-reviewer.md +11 -6
  54. package/.agent/agents/vitals-reviewer.md +5 -4
  55. package/.agent/history/memory/.memory.idx +3716 -1
  56. package/.agent/history/memory/MEMORY.md +246 -1
  57. package/.agent/mcp_config.json +1 -6
  58. package/.agent/routing_index.json +2034 -263
  59. package/.agent/rules/GEMINI.md +12 -10
  60. package/.agent/rules/GEMINI_PLANNER.md +19 -21
  61. package/.agent/scripts/_colors.js +52 -54
  62. package/.agent/scripts/_utils.js +52 -53
  63. package/.agent/scripts/auto_preview.js +39 -43
  64. package/.agent/scripts/bundle_analyzer.js +47 -60
  65. package/.agent/scripts/case_law_manager.js +200 -294
  66. package/.agent/scripts/checklist.js +73 -94
  67. package/.agent/scripts/cicd_validator.js +305 -0
  68. package/.agent/scripts/compile_router.py +4 -111
  69. package/.agent/scripts/context_broker.js +317 -412
  70. package/.agent/scripts/contract_engine.js +402 -0
  71. package/.agent/scripts/dependency_analyzer.js +112 -124
  72. package/.agent/scripts/graph_builder.js +75 -103
  73. package/.agent/scripts/graph_visualizer.js +10 -12
  74. package/.agent/scripts/graph_zoom.js +38 -55
  75. package/.agent/scripts/guardrail_engine.js +195 -145
  76. package/.agent/scripts/impact_classifier.js +55 -30
  77. package/.agent/scripts/inner_loop_validator.js +108 -159
  78. package/.agent/scripts/integrity_manifest.js +59 -67
  79. package/.agent/scripts/lint_runner.js +65 -75
  80. package/.agent/scripts/marathon_harness.js +131 -208
  81. package/.agent/scripts/migrate_skills_frontmatter.py +4 -63
  82. package/.agent/scripts/minify_context.js +29 -33
  83. package/.agent/scripts/minimal_change_engine.js +95 -87
  84. package/.agent/scripts/mutation_runner.js +46 -62
  85. package/.agent/scripts/pipeline_engine.js +320 -209
  86. package/.agent/scripts/prompt_compiler.js +118 -93
  87. package/.agent/scripts/schema_validator.js +73 -121
  88. package/.agent/scripts/security_scan.js +88 -117
  89. package/.agent/scripts/session_manager.js +52 -69
  90. package/.agent/scripts/signal_detector.js +24 -22
  91. package/.agent/scripts/skill_evolution.js +184 -245
  92. package/.agent/scripts/skill_integrator.js +35 -48
  93. package/.agent/scripts/socratic_gate_policy.js +15 -12
  94. package/.agent/scripts/strengthen_skills.js +29 -33
  95. package/.agent/scripts/swarm_dispatcher.js +120 -151
  96. package/.agent/scripts/test_runner.js +54 -56
  97. package/.agent/scripts/token_budget_broker.js +9 -7
  98. package/.agent/scripts/trace_engine.js +126 -0
  99. package/.agent/scripts/verify_all.js +76 -93
  100. package/.agent/scripts/visual_audit.js +16 -21
  101. package/.agent/skill_topic_map.json +237 -0
  102. package/.agent/skills/12-principles-of-animation/SKILL.md +7 -0
  103. package/.agent/skills/60fps-animation/SKILL.md +7 -0
  104. package/.agent/skills/accessible-animation/SKILL.md +5 -1
  105. package/.agent/skills/adapt/SKILL.md +7 -1
  106. package/.agent/skills/advanced-rag-pipelines/SKILL.md +1 -0
  107. package/.agent/skills/agent-organizer/SKILL.md +1 -0
  108. package/.agent/skills/agentic-patterns/SKILL.md +33 -25
  109. package/.agent/skills/agentic-workflows-2026/SKILL.md +80 -0
  110. package/.agent/skills/ai-app-hardening/SKILL.md +59 -0
  111. package/.agent/skills/ai-prompt-injection-defense/SKILL.md +7 -6
  112. package/.agent/skills/animation-on-scroll/SKILL.md +24 -15
  113. package/.agent/skills/animation-systems/SKILL.md +11 -10
  114. package/.agent/skills/antfu-conventions/SKILL.md +7 -2
  115. package/.agent/skills/api-patterns/SKILL.md +14 -10
  116. package/.agent/skills/api-security-auditor/SKILL.md +15 -14
  117. package/.agent/skills/app-builder/SKILL.md +1 -0
  118. package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +2 -2
  119. package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +1 -1
  120. package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +12 -12
  121. package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +3 -3
  122. package/.agent/skills/apple-design/SKILL.md +8 -7
  123. package/.agent/skills/architecture/SKILL.md +3 -2
  124. package/.agent/skills/audit-and-fix/SKILL.md +8 -5
  125. package/.agent/skills/authentication-best-practices/SKILL.md +9 -8
  126. package/.agent/skills/backend-security-expert/SKILL.md +1 -0
  127. package/.agent/skills/baseline-ui/SKILL.md +8 -7
  128. package/.agent/skills/bash-linux/SKILL.md +1 -0
  129. package/.agent/skills/behavioral-modes/SKILL.md +1 -0
  130. package/.agent/skills/better-colors/SKILL.md +11 -7
  131. package/.agent/skills/better-typography/SKILL.md +30 -16
  132. package/.agent/skills/better-ui/SKILL.md +17 -10
  133. package/.agent/skills/bolder/SKILL.md +6 -0
  134. package/.agent/skills/brainstorming/SKILL.md +6 -4
  135. package/.agent/skills/browser-native-ai/SKILL.md +5 -4
  136. package/.agent/skills/build-primitive/SKILL.md +5 -0
  137. package/.agent/skills/building-native-ui/SKILL.md +1 -0
  138. package/.agent/skills/cicd-pro/SKILL.md +2 -1
  139. package/.agent/skills/clarify/SKILL.md +19 -14
  140. package/.agent/skills/clean-code/SKILL.md +16 -15
  141. package/.agent/skills/cloud-architect/SKILL.md +1 -0
  142. package/.agent/skills/cobejs/SKILL.md +7 -9
  143. package/.agent/skills/code-review-checklist/SKILL.md +1 -0
  144. package/.agent/skills/codebase-design/SKILL.md +7 -2
  145. package/.agent/skills/colorize/SKILL.md +8 -3
  146. package/.agent/skills/compact-landing/SKILL.md +8 -3
  147. package/.agent/skills/company-logos/SKILL.md +6 -0
  148. package/.agent/skills/config-validator/SKILL.md +10 -9
  149. package/.agent/skills/containerization-pro/SKILL.md +6 -5
  150. package/.agent/skills/context-engineering-pro/SKILL.md +70 -0
  151. package/.agent/skills/create-design-md/SKILL.md +13 -5
  152. package/.agent/skills/critique/SKILL.md +10 -8
  153. package/.agent/skills/csharp-developer/SKILL.md +1 -0
  154. package/.agent/skills/data-validation-schemas/SKILL.md +28 -23
  155. package/.agent/skills/database-design/SKILL.md +2 -1
  156. package/.agent/skills/delight/SKILL.md +6 -0
  157. package/.agent/skills/deployment-procedures/SKILL.md +2 -1
  158. package/.agent/skills/design-lab/SKILL.md +5 -0
  159. package/.agent/skills/devops-engineer/SKILL.md +3 -2
  160. package/.agent/skills/devops-incident-responder/SKILL.md +2 -1
  161. package/.agent/skills/diagnosing-bugs/SKILL.md +12 -2
  162. package/.agent/skills/distill/SKILL.md +7 -2
  163. package/.agent/skills/documentation-templates/SKILL.md +3 -2
  164. package/.agent/skills/domain-modeling/SKILL.md +12 -4
  165. package/.agent/skills/duckdb-analytical-sql/SKILL.md +59 -0
  166. package/.agent/skills/edge-ai-mobile/SKILL.md +50 -0
  167. package/.agent/skills/edge-computing/SKILL.md +9 -8
  168. package/.agent/skills/emil-design-eng/SKILL.md +43 -27
  169. package/.agent/skills/error-resilience/SKILL.md +34 -16
  170. package/.agent/skills/expo-router-v4/SKILL.md +81 -0
  171. package/.agent/skills/extract-design-system/SKILL.md +12 -11
  172. package/.agent/skills/fabel-protocol/SKILL.md +24 -17
  173. package/.agent/skills/fixing-accessibility/SKILL.md +23 -16
  174. package/.agent/skills/fixing-metadata/SKILL.md +24 -13
  175. package/.agent/skills/fixing-motion-performance/SKILL.md +7 -5
  176. package/.agent/skills/framer-motion-expert/SKILL.md +29 -15
  177. package/.agent/skills/frontend-design/SKILL.md +21 -13
  178. package/.agent/skills/frontend-security-expert/SKILL.md +1 -0
  179. package/.agent/skills/game-design-expert/SKILL.md +1 -0
  180. package/.agent/skills/game-engineering-expert/SKILL.md +1 -0
  181. package/.agent/skills/generative-ui-expert/SKILL.md +3 -2
  182. package/.agent/skills/geo-fundamentals/SKILL.md +2 -1
  183. package/.agent/skills/git-pro/SKILL.md +10 -9
  184. package/.agent/skills/github-operations/SKILL.md +2 -1
  185. package/.agent/skills/gpt-taste/SKILL.md +7 -0
  186. package/.agent/skills/gsap-core/SKILL.md +26 -22
  187. package/.agent/skills/gsap-frameworks/SKILL.md +6 -5
  188. package/.agent/skills/gsap-performance/SKILL.md +4 -3
  189. package/.agent/skills/gsap-plugins/SKILL.md +34 -33
  190. package/.agent/skills/gsap-react/SKILL.md +9 -8
  191. package/.agent/skills/gsap-scrolltrigger/SKILL.md +34 -33
  192. package/.agent/skills/gsap-timeline/SKILL.md +18 -15
  193. package/.agent/skills/gsap-utils/SKILL.md +25 -24
  194. package/.agent/skills/harden/SKILL.md +9 -3
  195. package/.agent/skills/harness-protocol/SKILL.md +1 -0
  196. package/.agent/skills/i18n-localization/SKILL.md +10 -9
  197. package/.agent/skills/impeccable/SKILL.md +5 -0
  198. package/.agent/skills/improve-codebase-architecture/SKILL.md +10 -5
  199. package/.agent/skills/improve-ui/SKILL.md +12 -5
  200. package/.agent/skills/intelligent-routing/SKILL.md +7 -6
  201. package/.agent/skills/knowledge-graph/SKILL.md +1 -0
  202. package/.agent/skills/landing-page/SKILL.md +1 -0
  203. package/.agent/skills/lint-and-validate/SKILL.md +9 -4
  204. package/.agent/skills/llm-engineering/SKILL.md +55 -54
  205. package/.agent/skills/local-first/SKILL.md +20 -19
  206. package/.agent/skills/local-first-architecture/SKILL.md +6 -1
  207. package/.agent/skills/lottie-animation/SKILL.md +7 -3
  208. package/.agent/skills/marquee-loop/SKILL.md +1 -0
  209. package/.agent/skills/masked-reveal/SKILL.md +17 -4
  210. package/.agent/skills/mcp-builder/SKILL.md +13 -10
  211. package/.agent/skills/micro-interaction/SKILL.md +20 -5
  212. package/.agent/skills/mobile-design/SKILL.md +26 -15
  213. package/.agent/skills/monorepo-management/SKILL.md +3 -2
  214. package/.agent/skills/morphing-icons/SKILL.md +16 -6
  215. package/.agent/skills/motion-engineering/SKILL.md +19 -15
  216. package/.agent/skills/nextjs-react-expert/SKILL.md +26 -21
  217. package/.agent/skills/nodejs-best-practices/SKILL.md +89 -76
  218. package/.agent/skills/observability/SKILL.md +45 -44
  219. package/.agent/skills/opentelemetry-observability/SKILL.md +59 -0
  220. package/.agent/skills/page-transition-animation/SKILL.md +6 -3
  221. package/.agent/skills/parallel-agents/SKILL.md +7 -2
  222. package/.agent/skills/performance-profiling/SKILL.md +24 -13
  223. package/.agent/skills/plan-writing/SKILL.md +1 -0
  224. package/.agent/skills/platform-engineer/SKILL.md +3 -2
  225. package/.agent/skills/platform-engineering-opentofu/SKILL.md +68 -0
  226. package/.agent/skills/playwright-ai-e2e/SKILL.md +60 -0
  227. package/.agent/skills/playwright-best-practices/SKILL.md +29 -28
  228. package/.agent/skills/polish/SKILL.md +13 -12
  229. package/.agent/skills/powershell-windows/SKILL.md +1 -0
  230. package/.agent/skills/pricing-page/SKILL.md +8 -3
  231. package/.agent/skills/product-aware-heuristics/SKILL.md +122 -72
  232. package/.agent/skills/progressive-blur/SKILL.md +9 -4
  233. package/.agent/skills/project-idioms/SKILL.md +1 -0
  234. package/.agent/skills/property-based-testing/SKILL.md +58 -0
  235. package/.agent/skills/python-patterns/SKILL.md +1 -0
  236. package/.agent/skills/python-pro/SKILL.md +1 -0
  237. package/.agent/skills/quieter/SKILL.md +6 -0
  238. package/.agent/skills/react-doctor/SKILL.md +6 -0
  239. package/.agent/skills/react-specialist/SKILL.md +32 -28
  240. package/.agent/skills/readme-builder/SKILL.md +1 -0
  241. package/.agent/skills/realtime-patterns/SKILL.md +34 -33
  242. package/.agent/skills/red-team-tactics/SKILL.md +1 -0
  243. package/.agent/skills/redesign-skill/SKILL.md +6 -0
  244. package/.agent/skills/review-animations/SKILL.md +5 -2
  245. package/.agent/skills/review-animations/STANDARDS.md +37 -23
  246. package/.agent/skills/rust-pro/SKILL.md +1 -0
  247. package/.agent/skills/seo-fundamentals/SKILL.md +4 -3
  248. package/.agent/skills/server-management/SKILL.md +1 -0
  249. package/.agent/skills/shadcn-ui-expert/SKILL.md +28 -22
  250. package/.agent/skills/shape/SKILL.md +9 -2
  251. package/.agent/skills/skill-creator/SKILL.md +1 -0
  252. package/.agent/skills/soft-skill/SKILL.md +6 -0
  253. package/.agent/skills/sounds-on-the-web/SKILL.md +1 -0
  254. package/.agent/skills/sql-pro/SKILL.md +1 -0
  255. package/.agent/skills/supabase-postgres-best-practices/SKILL.md +1 -0
  256. package/.agent/skills/svg-animation/SKILL.md +16 -7
  257. package/.agent/skills/swiftui-expert/SKILL.md +1 -0
  258. package/.agent/skills/swiss-design/SKILL.md +5 -0
  259. package/.agent/skills/system-design-pro/SKILL.md +1 -0
  260. package/.agent/skills/systematic-debugging/SKILL.md +1 -0
  261. package/.agent/skills/tailwind-patterns/SKILL.md +25 -11
  262. package/.agent/skills/taste-skill/SKILL.md +6 -0
  263. package/.agent/skills/tdd-workflow/SKILL.md +5 -0
  264. package/.agent/skills/test-result-analyzer/SKILL.md +1 -0
  265. package/.agent/skills/testing-patterns/SKILL.md +123 -115
  266. package/.agent/skills/thermo-nuclear-code-quality-review/SKILL.md +5 -0
  267. package/.agent/skills/thinking-protocol/SKILL.md +3 -0
  268. package/.agent/skills/to-spring-or-not-to-spring/SKILL.md +9 -8
  269. package/.agent/skills/transitions-dev/SKILL.md +19 -6
  270. package/.agent/skills/trend-researcher/SKILL.md +1 -0
  271. package/.agent/skills/typescript-advanced/SKILL.md +23 -18
  272. package/.agent/skills/typeset/SKILL.md +10 -1
  273. package/.agent/skills/ui-reasoning-engine/SKILL.md +67 -48
  274. package/.agent/skills/ui-skill-packs/SKILL.md +6 -1
  275. package/.agent/skills/ui-skills-root/SKILL.md +39 -38
  276. package/.agent/skills/ui-ux-pro-max/SKILL.md +34 -26
  277. package/.agent/skills/ui-ux-researcher/SKILL.md +1 -0
  278. package/.agent/skills/vector-search-pgvector/SKILL.md +78 -0
  279. package/.agent/skills/vue-expert/SKILL.md +22 -19
  280. package/.agent/skills/vulnerability-scanner/SKILL.md +22 -21
  281. package/.agent/skills/web-accessibility-auditor/SKILL.md +2 -1
  282. package/.agent/skills/web-design-guidelines/SKILL.md +16 -10
  283. package/.agent/skills/web-quality-audit/SKILL.md +5 -0
  284. package/.agent/skills/webapp-testing/SKILL.md +14 -13
  285. package/.agent/skills/webgpu-performance/SKILL.md +1 -0
  286. package/.agent/skills/whimsy-injector/SKILL.md +9 -5
  287. package/.agent/skills/workflow-optimizer/SKILL.md +1 -0
  288. package/.agent/skills/zero-trust-passkeys/SKILL.md +90 -0
  289. package/.agent/templates/DESIGN.md +119 -110
  290. package/.agent/templates/design-tokens.json +9 -6
  291. package/.agent/workflows/acf.md +1 -0
  292. package/.agent/workflows/api-tester.md +1 -0
  293. package/.agent/workflows/audit.md +1 -0
  294. package/.agent/workflows/brainstorm.md +1 -0
  295. package/.agent/workflows/changelog.md +1 -0
  296. package/.agent/workflows/contract.md +60 -0
  297. package/.agent/workflows/create.md +1 -0
  298. package/.agent/workflows/debug.md +1 -0
  299. package/.agent/workflows/deploy.md +1 -0
  300. package/.agent/workflows/enhance.md +1 -0
  301. package/.agent/workflows/fix-ci.md +89 -0
  302. package/.agent/workflows/fix.md +1 -0
  303. package/.agent/workflows/generate.md +1 -0
  304. package/.agent/workflows/marathon.md +1 -0
  305. package/.agent/workflows/migrate.md +1 -0
  306. package/.agent/workflows/minimal.md +9 -7
  307. package/.agent/workflows/orchestrate.md +1 -0
  308. package/.agent/workflows/performance-benchmarker.md +1 -0
  309. package/.agent/workflows/pipeline.md +26 -21
  310. package/.agent/workflows/plan.md +1 -0
  311. package/.agent/workflows/preview.md +1 -0
  312. package/.agent/workflows/refactor.md +3 -2
  313. package/.agent/workflows/review-ai.md +4 -3
  314. package/.agent/workflows/review.md +1 -0
  315. package/.agent/workflows/session.md +1 -0
  316. package/.agent/workflows/status.md +1 -0
  317. package/.agent/workflows/strengthen-skills.md +1 -0
  318. package/.agent/workflows/super-prompt.md +1 -0
  319. package/.agent/workflows/swarm.md +15 -3
  320. package/.agent/workflows/test.md +8 -7
  321. package/.agent/workflows/tribunal-backend.md +3 -2
  322. package/.agent/workflows/tribunal-cicd.md +104 -0
  323. package/.agent/workflows/tribunal-database.md +1 -0
  324. package/.agent/workflows/tribunal-frontend.md +8 -6
  325. package/.agent/workflows/tribunal-full.md +15 -14
  326. package/.agent/workflows/tribunal-mobile.md +6 -5
  327. package/.agent/workflows/tribunal-performance.md +1 -0
  328. package/.agent/workflows/tribunal-speed.md +1 -0
  329. package/.agent/workflows/tribunal-ui.md +29 -21
  330. package/.agent/workflows/ui-ux-pro-max.md +19 -15
  331. package/CONTRIBUTING.md +3 -3
  332. package/README.md +160 -88
  333. package/SECURITY.md +11 -11
  334. package/bin/mcp-server.js +512 -233
  335. package/bin/tribunal-kit.js +29 -30
  336. package/bin/wrapper.js +45 -48
  337. package/dist/cli.js +26 -0
  338. package/dist/commands/case.js +2 -0
  339. package/dist/commands/contract.js +440 -0
  340. package/dist/commands/memory.js +3 -2
  341. package/dist/commands/native.js +36 -0
  342. package/dist/commands/status.js +6 -0
  343. package/dist/esm/index.mjs +32 -0
  344. package/dist/index.d.ts +58 -3
  345. package/package.json +20 -16
  346. package/scripts/benchmark.js +62 -86
  347. package/scripts/changelog.js +67 -73
  348. package/scripts/fix-vbc.js +13 -15
  349. package/scripts/fix-vbc.ps1 +2 -118
  350. package/scripts/stress_benchmark.js +358 -0
  351. package/scripts/sync-version.js +71 -41
  352. package/scripts/validate-payload.js +23 -30
  353. package/scripts/visual_audit.js +23 -13
@@ -8,24 +8,24 @@
8
8
  * line number reporting, configurable --max-mutants.
9
9
  */
10
10
 
11
- const fs = require("fs");
12
- const path = require("path");
13
- const { spawnSync } = require("child_process");
11
+ const fs = require('fs');
12
+ const path = require('path');
13
+ const { spawnSync } = require('child_process');
14
14
 
15
15
  // ── Mutation Definitions ──────────────────────────────────────────────────────
16
16
  const MUTATIONS = [
17
- { name: "Strict Equality", pattern: /===/g, replacement: "!==" },
18
- { name: "Strict Inequality", pattern: /!==/g, replacement: "===" },
19
- { name: "Logical AND", pattern: /&&/g, replacement: "||" },
20
- { name: "Logical OR", pattern: /\|\|/g, replacement: "&&" },
21
- { name: "True -> False", pattern: /\btrue\b/g, replacement: "false" },
22
- { name: "False -> True", pattern: /\bfalse\b/g, replacement: "true" },
23
- { name: "Greater Than", pattern: /(?<!=)>(?!=)/g, replacement: "<" },
24
- { name: "Less Than", pattern: /(?<!=)<(?!=)/g, replacement: ">" },
17
+ { name: 'Strict Equality', pattern: /===/g, replacement: '!==' },
18
+ { name: 'Strict Inequality', pattern: /!==/g, replacement: '===' },
19
+ { name: 'Logical AND', pattern: /&&/g, replacement: '||' },
20
+ { name: 'Logical OR', pattern: /\|\|/g, replacement: '&&' },
21
+ { name: 'True -> False', pattern: /\btrue\b/g, replacement: 'false' },
22
+ { name: 'False -> True', pattern: /\bfalse\b/g, replacement: 'true' },
23
+ { name: 'Greater Than', pattern: /(?<!=)>(?!=)/g, replacement: '<' },
24
+ { name: 'Less Than', pattern: /(?<!=)<(?!=)/g, replacement: '>' },
25
25
  {
26
- name: "Return Early Removal",
26
+ name: 'Return Early Removal',
27
27
  pattern: /\breturn\b/g,
28
- replacement: "/* return */",
28
+ replacement: '/* return */',
29
29
  },
30
30
  ];
31
31
 
@@ -34,17 +34,17 @@ const MUTATIONS = [
34
34
  function buildCodeMask(source) {
35
35
  const mask = new Array(source.length).fill(true);
36
36
  let inString = false;
37
- let stringChar = "";
37
+ let stringChar = '';
38
38
  let inBlockComment = false;
39
39
  let inLineComment = false;
40
40
 
41
41
  for (let i = 0; i < source.length; i++) {
42
42
  const ch = source[i];
43
- const next = source[i + 1] || "";
43
+ const next = source[i + 1] || '';
44
44
 
45
45
  if (inBlockComment) {
46
46
  mask[i] = false;
47
- if (ch === "*" && next === "/") {
47
+ if (ch === '*' && next === '/') {
48
48
  mask[i + 1] = false;
49
49
  inBlockComment = false;
50
50
  i++;
@@ -54,7 +54,7 @@ function buildCodeMask(source) {
54
54
 
55
55
  if (inLineComment) {
56
56
  mask[i] = false;
57
- if (ch === "\n") {
57
+ if (ch === '\n') {
58
58
  inLineComment = false;
59
59
  }
60
60
  continue;
@@ -62,7 +62,7 @@ function buildCodeMask(source) {
62
62
 
63
63
  if (inString) {
64
64
  mask[i] = false;
65
- if (ch === "\\") {
65
+ if (ch === '\\') {
66
66
  i++;
67
67
  if (i < source.length) mask[i] = false;
68
68
  continue;
@@ -74,7 +74,7 @@ function buildCodeMask(source) {
74
74
  }
75
75
 
76
76
  // Entering block comment
77
- if (ch === "/" && next === "*") {
77
+ if (ch === '/' && next === '*') {
78
78
  mask[i] = false;
79
79
  mask[i + 1] = false;
80
80
  inBlockComment = true;
@@ -83,7 +83,7 @@ function buildCodeMask(source) {
83
83
  }
84
84
 
85
85
  // Entering line comment
86
- if (ch === "/" && next === "/") {
86
+ if (ch === '/' && next === '/') {
87
87
  mask[i] = false;
88
88
  mask[i + 1] = false;
89
89
  inLineComment = true;
@@ -92,7 +92,7 @@ function buildCodeMask(source) {
92
92
  }
93
93
 
94
94
  // Entering string
95
- if (ch === '"' || ch === "'" || ch === "`") {
95
+ if (ch === '"' || ch === "'" || ch === '`') {
96
96
  mask[i] = false;
97
97
  inString = true;
98
98
  stringChar = ch;
@@ -110,7 +110,7 @@ function buildCodeMask(source) {
110
110
  function getLineNumber(source, charIndex) {
111
111
  let line = 1;
112
112
  for (let i = 0; i < charIndex && i < source.length; i++) {
113
- if (source[i] === "\n") line++;
113
+ if (source[i] === '\n') line++;
114
114
  }
115
115
  return line;
116
116
  }
@@ -123,7 +123,7 @@ let backupPath = null;
123
123
  function safeRestore() {
124
124
  if (targetFile && originalContent) {
125
125
  try {
126
- fs.writeFileSync(targetFile, originalContent, "utf-8");
126
+ fs.writeFileSync(targetFile, originalContent, 'utf-8');
127
127
  } catch {
128
128
  // Last resort: tell user where the backup is
129
129
  if (backupPath) {
@@ -141,29 +141,29 @@ function safeRestore() {
141
141
  }
142
142
 
143
143
  // šŸ›‘ ABSOLUTE SAFETY NET
144
- process.on("SIGINT", () => {
144
+ process.on('SIGINT', () => {
145
145
  safeRestore();
146
- console.error("\n[Tribunal] Mutation Engine aborted. Target file restored.");
146
+ console.error('\n[Tribunal] Mutation Engine aborted. Target file restored.');
147
147
  process.exit(1);
148
148
  });
149
149
 
150
- process.on("uncaughtException", (err) => {
150
+ process.on('uncaughtException', err => {
151
151
  safeRestore();
152
- console.error("\n[Tribunal] Critical error. File restored.", err);
152
+ console.error('\n[Tribunal] Critical error. File restored.', err);
153
153
  process.exit(1);
154
154
  });
155
155
 
156
- process.on("exit", safeRestore);
156
+ process.on('exit', safeRestore);
157
157
 
158
158
  // ── CLI Argument Parsing ──────────────────────────────────────────────────────
159
159
  function parseCliArgs(argv) {
160
160
  const args = argv.slice(2);
161
161
  let maxMutants = 5; // default per mutation type
162
162
  let fileToMutate = null;
163
- let testCommandParts = [];
163
+ const testCommandParts = [];
164
164
 
165
165
  for (let i = 0; i < args.length; i++) {
166
- if (args[i] === "--max-mutants" && args[i + 1]) {
166
+ if (args[i] === '--max-mutants' && args[i + 1]) {
167
167
  maxMutants = parseInt(args[i + 1], 10) || 5;
168
168
  i++; // skip next
169
169
  } else if (!fileToMutate) {
@@ -173,7 +173,7 @@ function parseCliArgs(argv) {
173
173
  }
174
174
  }
175
175
 
176
- return { fileToMutate, testCommand: testCommandParts.join(" "), maxMutants };
176
+ return { fileToMutate, testCommand: testCommandParts.join(' '), maxMutants };
177
177
  }
178
178
 
179
179
  // ── Main Engine ───────────────────────────────────────────────────────────────
@@ -185,9 +185,9 @@ function runMutationTesting(fileToMutate, testCommand, maxMutantsPerType) {
185
185
  process.exit(1);
186
186
  }
187
187
 
188
- originalContent = fs.readFileSync(targetFile, "utf-8");
189
- backupPath = targetFile + ".bak";
190
- fs.writeFileSync(backupPath, originalContent, "utf-8");
188
+ originalContent = fs.readFileSync(targetFile, 'utf-8');
189
+ backupPath = targetFile + '.bak';
190
+ fs.writeFileSync(backupPath, originalContent, 'utf-8');
191
191
 
192
192
  console.log(`\n━━━ Tribunal Mutation Engine v2.1 ━━━`);
193
193
  console.log(`Target: ${fileToMutate}`);
@@ -195,11 +195,9 @@ function runMutationTesting(fileToMutate, testCommand, maxMutantsPerType) {
195
195
  console.log(`Max/type: ${maxMutantsPerType}`);
196
196
  console.log(`\nExecuting baseline test run...`);
197
197
 
198
- const baseline = spawnSync(testCommand, { shell: true, stdio: "pipe" });
198
+ const baseline = spawnSync(testCommand, { shell: true, stdio: 'pipe' });
199
199
  if (baseline.status !== 0) {
200
- console.error(
201
- `ERROR: Baseline test failed! Fix your tests before mutating.`,
202
- );
200
+ console.error(`ERROR: Baseline test failed! Fix your tests before mutating.`);
203
201
  console.error(baseline.stderr.toString());
204
202
  safeRestore();
205
203
  process.exit(1);
@@ -220,10 +218,7 @@ function runMutationTesting(fileToMutate, testCommand, maxMutantsPerType) {
220
218
  const matchIndices = [];
221
219
  let m;
222
220
 
223
- while (
224
- (m = regex.exec(originalContent)) !== null &&
225
- matchIndices.length < maxMutantsPerType
226
- ) {
221
+ while ((m = regex.exec(originalContent)) !== null && matchIndices.length < maxMutantsPerType) {
227
222
  // Context-aware: skip matches that are inside strings or comments
228
223
  const matchStart = m.index;
229
224
  const matchEnd = m.index + m[0].length - 1;
@@ -250,12 +245,10 @@ function runMutationTesting(fileToMutate, testCommand, maxMutantsPerType) {
250
245
  mutatedString +
251
246
  originalContent.substring(index + length);
252
247
 
253
- fs.writeFileSync(targetFile, mutatedContent, "utf-8");
248
+ fs.writeFileSync(targetFile, mutatedContent, 'utf-8');
254
249
 
255
- process.stdout.write(
256
- ` [Mutant #${totalMutants}] ${mutation.name} (L${lineNum}) ... `,
257
- );
258
- const run = spawnSync(testCommand, { shell: true, stdio: "pipe" });
250
+ process.stdout.write(` [Mutant #${totalMutants}] ${mutation.name} (L${lineNum}) ... `);
251
+ const run = spawnSync(testCommand, { shell: true, stdio: 'pipe' });
259
252
 
260
253
  if (run.status !== 0) {
261
254
  console.log(`āœ… KILLED`);
@@ -272,12 +265,11 @@ function runMutationTesting(fileToMutate, testCommand, maxMutantsPerType) {
272
265
  }
273
266
 
274
267
  // Restore immediately after each mutant
275
- fs.writeFileSync(targetFile, originalContent, "utf-8");
268
+ fs.writeFileSync(targetFile, originalContent, 'utf-8');
276
269
  }
277
270
  }
278
271
 
279
- const score =
280
- totalMutants > 0 ? Math.round((killedMutants / totalMutants) * 100) : 100;
272
+ const score = totalMutants > 0 ? Math.round((killedMutants / totalMutants) * 100) : 100;
281
273
 
282
274
  console.log(`\n━━━ Mutation Summary ━━━`);
283
275
  console.log(` Total Mutants: ${totalMutants}`);
@@ -288,14 +280,10 @@ function runMutationTesting(fileToMutate, testCommand, maxMutantsPerType) {
288
280
  if (survivors.length > 0) {
289
281
  console.log(`\n━━━ Surviving Mutants (Weak Test Coverage) ━━━`);
290
282
  survivors.forEach((s, i) => {
291
- console.log(
292
- ` ${i + 1}. Line ${s.line}: ${s.type} (${s.original} → ${s.mutated})`,
293
- );
283
+ console.log(` ${i + 1}. Line ${s.line}: ${s.type} (${s.original} → ${s.mutated})`);
294
284
  });
295
285
  console.log(`\n ⚠ These lines have no test that catches the mutation.`);
296
- console.log(
297
- ` Add assertions that would FAIL if the operator were swapped.`,
298
- );
286
+ console.log(` Add assertions that would FAIL if the operator were swapped.`);
299
287
  }
300
288
 
301
289
  process.exit(score < 80 ? 1 : 0);
@@ -305,13 +293,9 @@ function runMutationTesting(fileToMutate, testCommand, maxMutantsPerType) {
305
293
  const { fileToMutate, testCommand, maxMutants } = parseCliArgs(process.argv);
306
294
 
307
295
  if (!fileToMutate || !testCommand) {
308
- console.log(
309
- `Usage: node mutation_runner.js <target_file> [--max-mutants N] <test_command>`,
310
- );
296
+ console.log(`Usage: node mutation_runner.js <target_file> [--max-mutants N] <test_command>`);
311
297
  console.log(`\nExamples:`);
312
- console.log(
313
- ` node mutation_runner.js src/math.js "npx jest src/math.test.js"`,
314
- );
298
+ console.log(` node mutation_runner.js src/math.js "npx jest src/math.test.js"`);
315
299
  console.log(
316
300
  ` node mutation_runner.js src/auth.js --max-mutants 10 "npx jest test/auth.test.js"`,
317
301
  );