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
@@ -1,64 +1,5 @@
1
- import os
2
- import re
3
- import logging
4
- from pathlib import Path
1
+ """
2
+ DEPRECATED — Legacy Python frontmatter migration script.
3
+ Skill frontmatter and VBC protocol verification is managed by node scripts/fix-vbc.js and node .agent/scripts/strengthen_skills.js.
4
+ """
5
5
 
6
- logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s")
7
-
8
- AGENT_DIR = Path(__file__).parent.parent
9
- SKILLS_DIR = AGENT_DIR / "skills"
10
-
11
- FRONTMATTER_REGEX = re.compile(r"^---\n(.*?)\n---", re.DOTALL | re.MULTILINE)
12
-
13
- def inject_routing_frontmatter(content: str) -> str:
14
- """Injects a baseline routing block into the YAML frontmatter if it doesn't exist."""
15
- match = FRONTMATTER_REGEX.search(content)
16
- if not match:
17
- return content
18
-
19
- frontmatter_text = match.group(1)
20
-
21
- if "\nrouting:" in frontmatter_text or frontmatter_text.startswith("routing:"):
22
- # Already migrated
23
- return content
24
-
25
- # Append the routing block to the end of the frontmatter
26
- new_routing_block = "\nrouting:\n domain: general\n tier: basic"
27
- new_frontmatter = frontmatter_text + new_routing_block
28
-
29
- # Replace the old frontmatter with the new one
30
- new_content = content[:match.start(1)] + new_frontmatter + content[match.end(1):]
31
- return new_content
32
-
33
- def main():
34
- if not SKILLS_DIR.exists():
35
- logging.error(f"Skills directory not found: {SKILLS_DIR}")
36
- return
37
-
38
- skill_dirs = [d for d in SKILLS_DIR.iterdir() if d.is_dir()]
39
- migrated_count = 0
40
- skipped_count = 0
41
-
42
- logging.info(f"Scanning {len(skill_dirs)} skill directories for migration...")
43
-
44
- for skill_dir in skill_dirs:
45
- skill_file = skill_dir / "SKILL.md"
46
- if not skill_file.exists():
47
- continue
48
-
49
- with open(skill_file, "r", encoding="utf-8") as f:
50
- content = f.read()
51
-
52
- new_content = inject_routing_frontmatter(content)
53
-
54
- if new_content != content:
55
- with open(skill_file, "w", encoding="utf-8") as f:
56
- f.write(new_content)
57
- migrated_count += 1
58
- else:
59
- skipped_count += 1
60
-
61
- logging.info(f"Migration complete: {migrated_count} files updated, {skipped_count} skipped.")
62
-
63
- if __name__ == "__main__":
64
- main()
@@ -4,74 +4,70 @@
4
4
  * Minifies markdown documentation in the .agent directory to save tokens.
5
5
  */
6
6
 
7
- "use strict";
7
+ 'use strict';
8
8
 
9
- const fs = require("fs");
10
- const path = require("path");
9
+ const fs = require('fs');
10
+ const path = require('path');
11
11
 
12
12
  function minifyMarkdown(filePath) {
13
- let content = fs.readFileSync(filePath, "utf8");
13
+ let content = fs.readFileSync(filePath, 'utf8');
14
14
  const originalLen = content.length;
15
15
 
16
16
  // 1. Strip repetitive Output Format templates
17
- content = content.replace(/## Output Format\n\n```[\s\S]*?```\n/g, "");
17
+ content = content.replace(/## Output Format\n\n```[\s\S]*?```\n/g, '');
18
18
 
19
19
  // 2. Convert bloated Cross-Workflow Navigation tables to dense YAML lists
20
20
  content = content.replace(
21
21
  /## Cross-Workflow Navigation\n\n\|.*?\|[\s\S]*?(?=\n## |\Z)/g,
22
- (match) => {
23
- const lines = match.trim().split("\n");
22
+ match => {
23
+ const lines = match.trim().split('\n');
24
24
  const out = [];
25
25
  for (const line of lines) {
26
- if (
27
- line.startsWith("|") &&
28
- !line.startsWith("|:") &&
29
- !line.startsWith("| After")
30
- ) {
26
+ if (line.startsWith('|') && !line.startsWith('|:') && !line.startsWith('| After')) {
31
27
  const parts = line
32
- .split("|")
33
- .map((p) => p.trim())
28
+ .split('|')
29
+ .map(p => p.trim())
34
30
  .filter(Boolean);
35
31
  if (parts.length >= 2) {
36
32
  out.push(`- ${parts[0]} -> ${parts[1]}`);
37
33
  }
38
34
  }
39
35
  }
40
- return "## Cross-Workflow Navigation\n" + out.join("\n") + "\n";
36
+ return '## Cross-Workflow Navigation\n' + out.join('\n') + '\n';
41
37
  },
42
38
  );
43
39
 
44
40
  // 3. Collapse multiple empty lines into a single one
45
- content = content.replace(/\n{3,}/g, "\n\n");
41
+ content = content.replace(/\n{3,}/g, '\n\n');
46
42
 
47
43
  // 4. Remove padding from remaining tables to save space tokens
48
- content = content.replace(/^\|.+|$/gm, (match) => {
44
+ content = content.replace(/^\|.+|$/gm, match => {
49
45
  let line = match;
50
46
  // remove spaces around |
51
- line = line.replace(/\s+\|\s+/g, "|");
52
- line = line.replace(/\|\s+/g, "|");
53
- line = line.replace(/\s+\|/g, "|");
47
+ line = line.replace(/\s+\|\s+/g, '|');
48
+ line = line.replace(/\|\s+/g, '|');
49
+ line = line.replace(/\s+\|/g, '|');
54
50
  return line;
55
51
  });
56
52
 
57
53
  // 5. Remove conversational blockquotes > if they don't contain WARNING/NOTE/IMPORTANT
58
- content = content.replace(/^>.*$/gm, (match) => {
54
+ content = content.replace(/^>.*$/gm, match => {
59
55
  if (
60
- match.includes("⚠️") ||
61
- match.includes("WARNING") ||
62
- match.includes("CRITICAL") ||
63
- match.includes("!")
56
+ match.includes('⚠️') ||
57
+ match.includes('WARNING') ||
58
+ match.includes('CRITICAL') ||
59
+ match.includes('!')
64
60
  ) {
65
61
  return match;
66
62
  }
67
- return match.replace(/> /g, "").replace(/>/g, "");
63
+ return match.replace(/> /g, '').replace(/>/g, '');
68
64
  });
69
65
 
70
66
  // 6. Dense Examples (convert ❌ Bad: and ✅ Good: blocks to single lines)
71
- content = content.replace(/\n❌ Bad:/g, "");
72
- content = content.replace(/\n✅ Good:/g, "");
67
+ content = content.replace(/\n❌ Bad:/g, '');
68
+ content = content.replace(/\n✅ Good:/g, '');
73
69
 
74
- fs.writeFileSync(filePath, content, "utf8");
70
+ fs.writeFileSync(filePath, content, 'utf8');
75
71
  return [originalLen, content.length];
76
72
  }
77
73
 
@@ -89,12 +85,12 @@ function walkDir(dir, callback) {
89
85
  }
90
86
 
91
87
  function main() {
92
- const agentDir = path.join(".agent");
88
+ const agentDir = path.join('.agent');
93
89
  let totalOriginal = 0;
94
90
  let totalNew = 0;
95
91
 
96
- walkDir(agentDir, (file) => {
97
- if (file.endsWith(".md")) {
92
+ walkDir(agentDir, file => {
93
+ if (file.endsWith('.md')) {
98
94
  const [orig, newLen] = minifyMarkdown(file);
99
95
  totalOriginal += orig;
100
96
  totalNew += newLen;
@@ -104,7 +100,7 @@ function main() {
104
100
  const saved = totalOriginal - totalNew;
105
101
  const percent = totalOriginal > 0 ? (saved / totalOriginal) * 100 : 0;
106
102
 
107
- console.log("Minification Complete.");
103
+ console.log('Minification Complete.');
108
104
  console.log(`Original size: ${totalOriginal} bytes`);
109
105
  console.log(`New size: ${totalNew} bytes`);
110
106
  console.log(`Saved: ${saved} bytes (${percent.toFixed(1)}%)`);
@@ -29,42 +29,41 @@
29
29
  * node .agent/scripts/minimal_change_engine.js search --query "fetchRetry"
30
30
  */
31
31
 
32
- "use strict";
32
+ 'use strict';
33
33
 
34
- const fs = require("fs");
35
- const path = require("path");
34
+ const fs = require('fs');
35
+ const path = require('path');
36
36
 
37
37
  // ── Shared Utilities & Colors ────────────────────────────────────────────────
38
- const { GREEN, YELLOW, CYAN, RED, BOLD, DIM, RESET } = require("./_colors");
39
- const { findAgentDir, loadJson, walkDir, DEFAULT_SKIP_DIRS } = require("./_utils");
38
+ const { loadJson, DEFAULT_SKIP_DIRS } = require('./_utils');
40
39
 
41
40
  // ── Decision Order Hierarchy ─────────────────────────────────────────────────
42
41
  const DECISION_HIERARCHY = [
43
- "NO_CHANGE",
44
- "REUSE",
45
- "CONFIGURE",
46
- "DELETE",
47
- "MODIFY",
48
- "EXTEND",
49
- "CREATE",
42
+ 'NO_CHANGE',
43
+ 'REUSE',
44
+ 'CONFIGURE',
45
+ 'DELETE',
46
+ 'MODIFY',
47
+ 'EXTEND',
48
+ 'CREATE',
50
49
  ];
51
50
 
52
51
  // ── 14 Standardized Complexity Flag Types ────────────────────────────────────
53
52
  const COMPLEXITY_FLAG_TYPES = [
54
- "UNNECESSARY_ABSTRACTION",
55
- "DUPLICATE_FUNCTIONALITY",
56
- "DEPENDENCY_BLOAT",
57
- "FILE_PROLIFERATION",
58
- "PREMATURE_GENERALIZATION",
59
- "SCOPE_EXPANSION",
60
- "UNNECESSARY_REWRITE",
61
- "FRAMEWORK_REINVENTION",
62
- "STANDARD_LIBRARY_REINVENTION",
63
- "EXCESSIVE_BOILERPLATE",
64
- "SPECULATIVE_FEATURE",
65
- "UNJUSTIFIED_INFRASTRUCTURE",
66
- "UNNECESSARY_CONFIGURATION",
67
- "DEAD_CODE_INTRODUCTION",
53
+ 'UNNECESSARY_ABSTRACTION',
54
+ 'DUPLICATE_FUNCTIONALITY',
55
+ 'DEPENDENCY_BLOAT',
56
+ 'FILE_PROLIFERATION',
57
+ 'PREMATURE_GENERALIZATION',
58
+ 'SCOPE_EXPANSION',
59
+ 'UNNECESSARY_REWRITE',
60
+ 'FRAMEWORK_REINVENTION',
61
+ 'STANDARD_LIBRARY_REINVENTION',
62
+ 'EXCESSIVE_BOILERPLATE',
63
+ 'SPECULATIVE_FEATURE',
64
+ 'UNJUSTIFIED_INFRASTRUCTURE',
65
+ 'UNNECESSARY_CONFIGURATION',
66
+ 'DEAD_CODE_INTRODUCTION',
68
67
  ];
69
68
 
70
69
  // ── Strictness Configurations ────────────────────────────────────────────────
@@ -133,10 +132,10 @@ function calculateMinimalityScore(budget, classification, flags = []) {
133
132
  }
134
133
 
135
134
  // Penalties for complexity flags based on severity
136
- flags.forEach((flag) => {
137
- if (flag.severity === "high" || flag.severity === "critical") {
135
+ flags.forEach(flag => {
136
+ if (flag.severity === 'high' || flag.severity === 'critical') {
138
137
  score -= 15;
139
- } else if (flag.severity === "medium") {
138
+ } else if (flag.severity === 'medium') {
140
139
  score -= 8;
141
140
  } else {
142
141
  score -= 4;
@@ -163,55 +162,55 @@ function calculateMinimalityScore(budget, classification, flags = []) {
163
162
  /**
164
163
  * Detects potential complexity flags within a proposed change or spec.
165
164
  */
166
- function detectComplexityFlags(proposal = {}, existingSymbols = [], mode = "balanced") {
165
+ function detectComplexityFlags(proposal = {}, _existingSymbols = [], mode = 'balanced') {
167
166
  const flags = [];
168
167
  const limits = STRICTNESS_CONFIGS[mode] || STRICTNESS_CONFIGS.balanced;
169
168
 
170
169
  // Check 1: Dependency Bloat
171
170
  if (proposal.dependencies_added > limits.max_deps_warn) {
172
171
  flags.push({
173
- type: "DEPENDENCY_BLOAT",
174
- severity: proposal.dependencies_added > 1 ? "high" : "medium",
172
+ type: 'DEPENDENCY_BLOAT',
173
+ severity: proposal.dependencies_added > 1 ? 'high' : 'medium',
175
174
  evidence: `${proposal.dependencies_added} new dependency/dependencies proposed.`,
176
- location: proposal.target_file || "package.json",
177
- reason: "Adding dependencies increases security attack surface and maintenance overhead.",
178
- recommended_action: "Use standard library or existing codebase utilities.",
175
+ location: proposal.target_file || 'package.json',
176
+ reason: 'Adding dependencies increases security attack surface and maintenance overhead.',
177
+ recommended_action: 'Use standard library or existing codebase utilities.',
179
178
  });
180
179
  }
181
180
 
182
181
  // Check 2: File Proliferation
183
182
  if (proposal.files_added > limits.max_files_added_warn) {
184
183
  flags.push({
185
- type: "FILE_PROLIFERATION",
186
- severity: proposal.files_added > 3 ? "high" : "medium",
184
+ type: 'FILE_PROLIFERATION',
185
+ severity: proposal.files_added > 3 ? 'high' : 'medium',
187
186
  evidence: `${proposal.files_added} new files proposed for creation.`,
188
- location: proposal.target_file || "workspace",
189
- reason: "Creating multiple new files increases architectural noise and fragmentation.",
190
- recommended_action: "Modify or extend existing files instead of creating new ones.",
187
+ location: proposal.target_file || 'workspace',
188
+ reason: 'Creating multiple new files increases architectural noise and fragmentation.',
189
+ recommended_action: 'Modify or extend existing files instead of creating new ones.',
191
190
  });
192
191
  }
193
192
 
194
193
  // Check 3: Unnecessary Abstraction
195
194
  if (proposal.new_abstractions > limits.max_abstractions_warn) {
196
195
  flags.push({
197
- type: "UNNECESSARY_ABSTRACTION",
198
- severity: "medium",
196
+ type: 'UNNECESSARY_ABSTRACTION',
197
+ severity: 'medium',
199
198
  evidence: `${proposal.new_abstractions} new abstraction layer(s) proposed.`,
200
- location: proposal.target_file || "codebase",
201
- reason: "Adding wrappers or single-consumer interfaces increases complexity without benefit.",
202
- recommended_action: "Implement concrete logic directly without extra abstraction.",
199
+ location: proposal.target_file || 'codebase',
200
+ reason: 'Adding wrappers or single-consumer interfaces increases complexity without benefit.',
201
+ recommended_action: 'Implement concrete logic directly without extra abstraction.',
203
202
  });
204
203
  }
205
204
 
206
205
  // Check 4: Duplicate Functionality
207
206
  if (proposal.duplicate_candidates && proposal.duplicate_candidates.length > 0) {
208
- proposal.duplicate_candidates.forEach((cand) => {
207
+ proposal.duplicate_candidates.forEach(cand => {
209
208
  flags.push({
210
- type: "DUPLICATE_FUNCTIONALITY",
211
- severity: "high",
209
+ type: 'DUPLICATE_FUNCTIONALITY',
210
+ severity: 'high',
212
211
  evidence: `Existing equivalent symbol '${cand.name}' found in ${cand.file}`,
213
212
  location: cand.file,
214
- reason: "Duplicate functionality leads to fragmented state and maintenance confusion.",
213
+ reason: 'Duplicate functionality leads to fragmented state and maintenance confusion.',
215
214
  recommended_action: `Reuse '${cand.name}' from ${cand.file}`,
216
215
  });
217
216
  });
@@ -220,11 +219,11 @@ function detectComplexityFlags(proposal = {}, existingSymbols = [], mode = "bala
220
219
  // Check 5: Framework/Stdlib Reinvention
221
220
  if (proposal.reinventing_stdlib) {
222
221
  flags.push({
223
- type: "STANDARD_LIBRARY_REINVENTION",
224
- severity: "medium",
222
+ type: 'STANDARD_LIBRARY_REINVENTION',
223
+ severity: 'medium',
225
224
  evidence: `Proposed custom utility '${proposal.reinventing_stdlib.name}'`,
226
- location: proposal.target_file || "utils",
227
- reason: "Language standard library already provides built-in methods for this.",
225
+ location: proposal.target_file || 'utils',
226
+ reason: 'Language standard library already provides built-in methods for this.',
228
227
  recommended_action: `Use native JS/TS methods (e.g., Array.prototype, URL, crypto).`,
229
228
  });
230
229
  }
@@ -238,26 +237,26 @@ function detectComplexityFlags(proposal = {}, existingSymbols = [], mode = "bala
238
237
  function searchRepositoryForCapability(query, searchDir) {
239
238
  const matches = [];
240
239
 
241
- if (!query || typeof query !== "string") return matches;
240
+ if (!query || typeof query !== 'string') return matches;
242
241
 
243
242
  let agentDir = null;
244
243
  let current = path.resolve(searchDir || process.cwd());
245
244
  const rootPath = path.parse(current).root;
246
245
  while (current !== rootPath) {
247
- const candidate = path.join(current, ".agent");
246
+ const candidate = path.join(current, '.agent');
248
247
  if (fs.existsSync(candidate) && fs.statSync(candidate).isDirectory()) {
249
248
  agentDir = candidate;
250
249
  break;
251
250
  }
252
251
  current = path.dirname(current);
253
252
  }
254
- const repoRoot = agentDir ? path.dirname(agentDir) : (searchDir || process.cwd());
253
+ const repoRoot = agentDir ? path.dirname(agentDir) : searchDir || process.cwd();
255
254
 
256
255
  const normalizedQuery = query.toLowerCase();
257
- const searchKeywords = normalizedQuery.split(/\s+/).filter((k) => k.length > 2);
256
+ const searchKeywords = normalizedQuery.split(/\s+/).filter(k => k.length > 2);
258
257
 
259
258
  // Search package.json dependencies
260
- const pkgPath = path.join(repoRoot, "package.json");
259
+ const pkgPath = path.join(repoRoot, 'package.json');
261
260
  if (fs.existsSync(pkgPath)) {
262
261
  const pkg = loadJson(pkgPath);
263
262
  if (pkg) {
@@ -265,12 +264,12 @@ function searchRepositoryForCapability(query, searchDir) {
265
264
  ...pkg.dependencies,
266
265
  ...pkg.devDependencies,
267
266
  };
268
- Object.keys(allDeps).forEach((dep) => {
267
+ Object.keys(allDeps).forEach(dep => {
269
268
  if (dep.toLowerCase().includes(normalizedQuery)) {
270
269
  matches.push({
271
- type: "dependency",
270
+ type: 'dependency',
272
271
  name: dep,
273
- file: "package.json",
272
+ file: 'package.json',
274
273
  snippet: `Version: ${allDeps[dep]}`,
275
274
  });
276
275
  }
@@ -286,28 +285,31 @@ function searchRepositoryForCapability(query, searchDir) {
286
285
  for (const entry of entries) {
287
286
  const fullPath = path.join(dir, entry.name);
288
287
  if (entry.isDirectory()) {
289
- if (DEFAULT_SKIP_DIRS.has(entry.name) || entry.name === "target") {
288
+ if (DEFAULT_SKIP_DIRS.has(entry.name) || entry.name === 'target') {
290
289
  continue;
291
290
  }
292
291
  scan(fullPath);
293
292
  } else if (entry.isFile() && /\.(js|ts|tsx|jsx|json|md)$/.test(entry.name)) {
294
293
  try {
295
- const content = fs.readFileSync(fullPath, "utf8");
294
+ const content = fs.readFileSync(fullPath, 'utf8');
296
295
  const lower = content.toLowerCase();
297
296
 
298
- const hasMatch = searchKeywords.some((kw) => lower.includes(kw));
297
+ const hasMatch = searchKeywords.some(kw => lower.includes(kw));
299
298
  if (hasMatch) {
300
299
  const relPath = path.relative(repoRoot, fullPath);
301
300
  // Extract function/class exports
302
- const symbolRegex = /(?:export\s+(?:function|class|const|let|var|type|interface)|module\.exports\s*=)\s+([A-Za-z0-9_]+)/g;
301
+ const symbolRegex =
302
+ /(?:export\s+(?:function|class|const|let|var|type|interface)|module\.exports\s*=)\s+([A-Za-z0-9_]+)/g;
303
303
  let m;
304
304
  while ((m = symbolRegex.exec(content)) !== null) {
305
305
  if (m[1].toLowerCase().includes(normalizedQuery)) {
306
306
  matches.push({
307
- type: "symbol",
307
+ type: 'symbol',
308
308
  name: m[1],
309
309
  file: relPath,
310
- snippet: content.substring(Math.max(0, m.index - 40), m.index + 80).replace(/\n/g, " "),
310
+ snippet: content
311
+ .substring(Math.max(0, m.index - 40), m.index + 80)
312
+ .replace(/\n/g, ' '),
311
313
  });
312
314
  }
313
315
  }
@@ -334,37 +336,37 @@ function classifyProposal(taskDescription, proposal = {}, repoMatches = []) {
334
336
  const estimatedLinesAdded = proposal.estimated_lines_added || 0;
335
337
 
336
338
  if (repoMatches.length > 0 && filesAdded === 0) {
337
- return "REUSE";
339
+ return 'REUSE';
338
340
  }
339
341
 
340
342
  if (filesAdded === 0 && filesModified === 0 && filesDeleted === 0) {
341
- return "NO_CHANGE";
343
+ return 'NO_CHANGE';
342
344
  }
343
345
 
344
346
  if (proposal.is_config_only) {
345
- return "CONFIGURE";
347
+ return 'CONFIGURE';
346
348
  }
347
349
 
348
350
  if (filesDeleted > 0 && filesAdded === 0 && estimatedLinesAdded === 0) {
349
- return "DELETE";
351
+ return 'DELETE';
350
352
  }
351
353
 
352
354
  if (filesAdded === 0 && filesModified <= 2 && newAbstractions === 0) {
353
- return "MODIFY";
355
+ return 'MODIFY';
354
356
  }
355
357
 
356
358
  if (filesAdded <= 2 && newAbstractions <= 1) {
357
- return "EXTEND";
359
+ return 'EXTEND';
358
360
  }
359
361
 
360
- return "CREATE";
362
+ return 'CREATE';
361
363
  }
362
364
 
363
365
  /**
364
366
  * Evaluates an implementation proposal completely.
365
367
  */
366
368
  function evaluateMinimalChange(taskDescription, proposal = {}, options = {}) {
367
- const mode = options.mode || "balanced";
369
+ const mode = options.mode || 'balanced';
368
370
  const searchDir = options.cwd || process.cwd();
369
371
 
370
372
  const budget = calculateChangeBudget(proposal);
@@ -379,18 +381,20 @@ function evaluateMinimalChange(taskDescription, proposal = {}, options = {}) {
379
381
  const score = calculateMinimalityScore(budget, classification, flags);
380
382
 
381
383
  const reuseOpportunities = repoMatches.map(
382
- (m) => `Reuse existing ${m.type} '${m.name}' in ${m.file}`,
384
+ m => `Reuse existing ${m.type} '${m.name}' in ${m.file}`,
383
385
  );
384
386
 
385
387
  const recommendedReductions = [];
386
388
  if (budget.dependencies_added > 0) {
387
- recommendedReductions.push("Avoid introducing new npm dependencies; leverage existing utilities.");
389
+ recommendedReductions.push(
390
+ 'Avoid introducing new npm dependencies; leverage existing utilities.',
391
+ );
388
392
  }
389
393
  if (budget.files_added > 1) {
390
- recommendedReductions.push("Combine proposed new files into existing module structure.");
394
+ recommendedReductions.push('Combine proposed new files into existing module structure.');
391
395
  }
392
396
  if (budget.new_abstractions > 0) {
393
- recommendedReductions.push("Remove single-use interface/class abstractions.");
397
+ recommendedReductions.push('Remove single-use interface/class abstractions.');
394
398
  }
395
399
 
396
400
  return {
@@ -399,7 +403,7 @@ function evaluateMinimalChange(taskDescription, proposal = {}, options = {}) {
399
403
  change_budget: budget,
400
404
  complexity_flags: flags,
401
405
  reuse_opportunities: reuseOpportunities,
402
- unnecessary_changes: flags.map((f) => f.evidence),
406
+ unnecessary_changes: flags.map(f => f.evidence),
403
407
  recommended_reductions: recommendedReductions,
404
408
  decision_order: DECISION_HIERARCHY,
405
409
  passed: score >= (STRICTNESS_CONFIGS[mode]?.min_score_pass || 75),
@@ -409,14 +413,18 @@ function evaluateMinimalChange(taskDescription, proposal = {}, options = {}) {
409
413
  // ── CLI Main Entry Point ────────────────────────────────────────────────────
410
414
  if (require.main === module) {
411
415
  const args = process.argv.slice(2);
412
- const command = args[0] || "evaluate";
413
- const taskArg = args.find((a) => a.startsWith("--task="))?.split("=")[1] || "Default Task";
414
- const modeArg = args.find((a) => a.startsWith("--mode="))?.split("=")[1] || "balanced";
415
-
416
- if (command === "evaluate" || command === "audit") {
417
- const result = evaluateMinimalChange(taskArg, { files_modified: 1, estimated_lines_added: 12 }, { mode: modeArg });
416
+ const command = args[0] || 'evaluate';
417
+ const taskArg = args.find(a => a.startsWith('--task='))?.split('=')[1] || 'Default Task';
418
+ const modeArg = args.find(a => a.startsWith('--mode='))?.split('=')[1] || 'balanced';
419
+
420
+ if (command === 'evaluate' || command === 'audit') {
421
+ const result = evaluateMinimalChange(
422
+ taskArg,
423
+ { files_modified: 1, estimated_lines_added: 12 },
424
+ { mode: modeArg },
425
+ );
418
426
  console.log(JSON.stringify(result, null, 2));
419
- } else if (command === "search") {
427
+ } else if (command === 'search') {
420
428
  const matches = searchRepositoryForCapability(taskArg);
421
429
  console.log(JSON.stringify(matches, null, 2));
422
430
  } else {