tribunal-kit 7.0.0 → 9.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 (349) hide show
  1. package/.agent/ARCHITECTURE.md +2 -2
  2. package/.agent/config/claude.json +18 -0
  3. package/.agent/config/plugin.json +102 -0
  4. package/.agent/config/slash-commands.json +103 -0
  5. package/.agent/config/specialist-registry.json +415 -0
  6. package/.agent/config/system-prompt.md +244 -0
  7. package/.agent/history/architecture-graph.yaml +302 -3
  8. package/.agent/history/graph-cache.json +515 -45
  9. package/.agent/history/memory.db +0 -0
  10. package/.agent/history/snapshots/bin__adapter-install.js.json +13 -0
  11. package/.agent/history/snapshots/bin__global-store.js.json +15 -0
  12. package/.agent/history/snapshots/bin__mcp-server.js.json +19 -0
  13. package/.agent/history/snapshots/bin__proxy-server.js.json +20 -0
  14. package/.agent/history/snapshots/bin__spawn-agent.js.json +12 -0
  15. package/.agent/history/snapshots/bin__tk-proxy.js.json +21 -0
  16. package/.agent/history/snapshots/bin__tribunal-kit.js.json +9 -7
  17. package/.agent/history/snapshots/bin__wrapper.js.json +14 -0
  18. package/.agent/history/snapshots/eslint.config.js.json +1 -2
  19. package/.agent/history/snapshots/scripts__benchmark.js.json +14 -0
  20. package/.agent/history/snapshots/scripts__changelog.js.json +1 -2
  21. package/.agent/history/snapshots/scripts__fix-vbc.js.json +11 -0
  22. package/.agent/history/snapshots/scripts__stress_benchmark.js.json +15 -0
  23. package/.agent/history/snapshots/scripts__sync-version.js.json +1 -2
  24. package/.agent/history/snapshots/scripts__validate-payload.js.json +1 -2
  25. package/.agent/history/snapshots/scripts__visual_audit.js.json +11 -0
  26. package/.agent/history/snapshots/test__integration__bridges.test.js.json +1 -2
  27. package/.agent/history/snapshots/test__integration__graceful_degradation.test.js.json +12 -0
  28. package/.agent/history/snapshots/test__integration__init.test.js.json +1 -2
  29. package/.agent/history/snapshots/test__integration__minimal_change_pipeline.test.js.json +13 -0
  30. package/.agent/history/snapshots/test__integration__parallel_tribunal.test.js.json +12 -0
  31. package/.agent/history/snapshots/test__integration__routing.test.js.json +1 -2
  32. package/.agent/history/snapshots/test__integration__swarm_dispatcher.test.js.json +1 -2
  33. package/.agent/history/snapshots/test__integration__sync_status.test.js.json +13 -0
  34. package/.agent/history/snapshots/test__integration__wave2.test.js.json +1 -2
  35. package/.agent/history/snapshots/test__integration__wrapper.test.js.json +13 -0
  36. package/.agent/history/snapshots/test__unit__align.test.js.json +10 -0
  37. package/.agent/history/snapshots/test__unit__args.test.js.json +3 -3
  38. package/.agent/history/snapshots/test__unit__audit_release.test.js.json +16 -0
  39. package/.agent/history/snapshots/test__unit__case_law_manager.test.js.json +1 -2
  40. package/.agent/history/snapshots/test__unit__cicd_validator.test.js.json +12 -0
  41. package/.agent/history/snapshots/test__unit__compile.test.js.json +10 -0
  42. package/.agent/history/snapshots/test__unit__context_broker.test.js.json +1 -2
  43. package/.agent/history/snapshots/test__unit__contract_engine.test.js.json +13 -0
  44. package/.agent/history/snapshots/test__unit__copyDir.test.js.json +3 -3
  45. package/.agent/history/snapshots/test__unit__graph_tools.test.js.json +1 -2
  46. package/.agent/history/snapshots/test__unit__guardrail_engine.test.js.json +10 -0
  47. package/.agent/history/snapshots/test__unit__impact_classifier.test.js.json +12 -0
  48. package/.agent/history/snapshots/test__unit__init.test.js.json +14 -0
  49. package/.agent/history/snapshots/test__unit__inner_loop_validator.test.js.json +1 -2
  50. package/.agent/history/snapshots/test__unit__integrity_manifest.test.js.json +13 -0
  51. package/.agent/history/snapshots/test__unit__learn.test.js.json +11 -0
  52. package/.agent/history/snapshots/test__unit__marathon.test.js.json +22 -0
  53. package/.agent/history/snapshots/test__unit__mcp_server.test.js.json +16 -0
  54. package/.agent/history/snapshots/test__unit__memory.test.js.json +13 -0
  55. package/.agent/history/snapshots/test__unit__minimal_change.test.js.json +10 -0
  56. package/.agent/history/snapshots/test__unit__native.test.js.json +10 -0
  57. package/.agent/history/snapshots/test__unit__optimize.test.js.json +13 -0
  58. package/.agent/history/snapshots/test__unit__path_resolution.test.js.json +14 -0
  59. package/.agent/history/snapshots/test__unit__production_readiness_evidence.test.js.json +21 -0
  60. package/.agent/history/snapshots/test__unit__selfInstall.test.js.json +3 -3
  61. package/.agent/history/snapshots/test__unit__semver.test.js.json +3 -3
  62. package/.agent/history/snapshots/test__unit__skill_evolution.test.js.json +11 -0
  63. package/.agent/history/snapshots/test__unit__stress.test.js.json +15 -0
  64. package/.agent/history/snapshots/test__unit__swarm_dispatcher.test.js.json +3 -3
  65. package/.agent/history/snapshots/test__unit__utils.test.js.json +10 -0
  66. package/.agent/routing_index.json +2 -2
  67. package/.agent/scripts/ast_context_loader.js +137 -0
  68. package/.agent/scripts/memory_engine.js +581 -0
  69. package/.agent/scripts/payload_schemas.js +146 -0
  70. package/.agent/scripts/prompt_compiler.js +59 -11
  71. package/.agent/scripts/swarm_dispatcher.js +295 -67
  72. package/.agent/scripts/token_budget_broker.js +117 -6
  73. package/.agent/skills/12-principles-of-animation/SKILL.md +19 -16
  74. package/.agent/skills/60fps-animation/SKILL.md +47 -21
  75. package/.agent/skills/accessible-animation/SKILL.md +19 -16
  76. package/.agent/skills/adapt/SKILL.md +19 -16
  77. package/.agent/skills/advanced-rag-pipelines/SKILL.md +41 -40
  78. package/.agent/skills/agent-organizer/SKILL.md +9 -59
  79. package/.agent/skills/agentic-patterns/SKILL.md +9 -57
  80. package/.agent/skills/agentic-workflows-2026/SKILL.md +45 -8
  81. package/.agent/skills/ai-app-hardening/SKILL.md +31 -5
  82. package/.agent/skills/ai-prompt-injection-defense/SKILL.md +28 -66
  83. package/.agent/skills/animation-on-scroll/SKILL.md +19 -16
  84. package/.agent/skills/animation-systems/SKILL.md +19 -15
  85. package/.agent/skills/antfu-conventions/SKILL.md +19 -18
  86. package/.agent/skills/api-patterns/SKILL.md +8 -58
  87. package/.agent/skills/api-security-auditor/SKILL.md +8 -58
  88. package/.agent/skills/app-builder/SKILL.md +9 -59
  89. package/.agent/skills/appflow-wireframe/SKILL.md +13 -57
  90. package/.agent/skills/apple-design/SKILL.md +22 -14
  91. package/.agent/skills/architecture/SKILL.md +9 -59
  92. package/.agent/skills/audit-and-fix/SKILL.md +19 -16
  93. package/.agent/skills/authentication-best-practices/SKILL.md +8 -58
  94. package/.agent/skills/backend-security-expert/SKILL.md +32 -65
  95. package/.agent/skills/baseline-ui/SKILL.md +22 -14
  96. package/.agent/skills/bash-linux/SKILL.md +9 -59
  97. package/.agent/skills/behavioral-modes/SKILL.md +9 -57
  98. package/.agent/skills/better-colors/SKILL.md +22 -14
  99. package/.agent/skills/better-typography/SKILL.md +26 -14
  100. package/.agent/skills/better-ui/SKILL.md +54 -19
  101. package/.agent/skills/bolder/SKILL.md +19 -16
  102. package/.agent/skills/brainstorming/SKILL.md +9 -57
  103. package/.agent/skills/browser-native-ai/SKILL.md +9 -28
  104. package/.agent/skills/build-primitive/SKILL.md +19 -16
  105. package/.agent/skills/building-native-ui/SKILL.md +9 -59
  106. package/.agent/skills/cicd-pro/SKILL.md +21 -28
  107. package/.agent/skills/clarify/SKILL.md +19 -16
  108. package/.agent/skills/clean-code/SKILL.md +18 -61
  109. package/.agent/skills/cloud-architect/SKILL.md +21 -28
  110. package/.agent/skills/cobejs/SKILL.md +19 -15
  111. package/.agent/skills/code-review-checklist/SKILL.md +8 -58
  112. package/.agent/skills/codebase-design/SKILL.md +33 -22
  113. package/.agent/skills/colorize/SKILL.md +19 -16
  114. package/.agent/skills/compact-landing/SKILL.md +19 -16
  115. package/.agent/skills/company-logos/SKILL.md +19 -16
  116. package/.agent/skills/config-validator/SKILL.md +9 -59
  117. package/.agent/skills/containerization-pro/SKILL.md +21 -28
  118. package/.agent/skills/context-engineering-pro/SKILL.md +31 -5
  119. package/.agent/skills/create-design-md/SKILL.md +22 -14
  120. package/.agent/skills/critique/SKILL.md +20 -11
  121. package/.agent/skills/csharp-developer/SKILL.md +8 -58
  122. package/.agent/skills/data-validation-schemas/SKILL.md +9 -59
  123. package/.agent/skills/database-design/SKILL.md +27 -67
  124. package/.agent/skills/delight/SKILL.md +19 -16
  125. package/.agent/skills/deployment-procedures/SKILL.md +9 -59
  126. package/.agent/skills/design-lab/SKILL.md +19 -16
  127. package/.agent/skills/devops-engineer/SKILL.md +8 -58
  128. package/.agent/skills/devops-incident-responder/SKILL.md +9 -59
  129. package/.agent/skills/diagnosing-bugs/SKILL.md +20 -21
  130. package/.agent/skills/distill/SKILL.md +19 -16
  131. package/.agent/skills/documentation-templates/SKILL.md +9 -59
  132. package/.agent/skills/domain-modeling/SKILL.md +19 -18
  133. package/.agent/skills/duckdb-analytical-sql/SKILL.md +31 -5
  134. package/.agent/skills/edge-ai-mobile/SKILL.md +31 -5
  135. package/.agent/skills/edge-computing/SKILL.md +9 -59
  136. package/.agent/skills/emil-design-eng/SKILL.md +21 -24
  137. package/.agent/skills/error-resilience/SKILL.md +31 -66
  138. package/.agent/skills/expo-router-v4/SKILL.md +31 -5
  139. package/.agent/skills/extract-design-system/SKILL.md +9 -59
  140. package/.agent/skills/fabel-protocol/SKILL.md +26 -8
  141. package/.agent/skills/fixing-accessibility/SKILL.md +22 -14
  142. package/.agent/skills/fixing-metadata/SKILL.md +19 -16
  143. package/.agent/skills/fixing-motion-performance/SKILL.md +22 -14
  144. package/.agent/skills/framer-motion-expert/SKILL.md +9 -57
  145. package/.agent/skills/frontend-design/SKILL.md +27 -7
  146. package/.agent/skills/frontend-security-expert/SKILL.md +8 -58
  147. package/.agent/skills/game-design-expert/SKILL.md +9 -59
  148. package/.agent/skills/game-engineering-expert/SKILL.md +9 -59
  149. package/.agent/skills/generative-ui-expert/SKILL.md +9 -28
  150. package/.agent/skills/geo-fundamentals/SKILL.md +9 -59
  151. package/.agent/skills/git-pro/SKILL.md +19 -30
  152. package/.agent/skills/github-operations/SKILL.md +8 -58
  153. package/.agent/skills/gpt-taste/SKILL.md +19 -16
  154. package/.agent/skills/gsap-core/SKILL.md +8 -78
  155. package/.agent/skills/gsap-frameworks/SKILL.md +8 -78
  156. package/.agent/skills/gsap-performance/SKILL.md +9 -77
  157. package/.agent/skills/gsap-plugins/SKILL.md +9 -77
  158. package/.agent/skills/gsap-react/SKILL.md +9 -21
  159. package/.agent/skills/gsap-scrolltrigger/SKILL.md +8 -78
  160. package/.agent/skills/gsap-timeline/SKILL.md +9 -77
  161. package/.agent/skills/gsap-utils/SKILL.md +9 -77
  162. package/.agent/skills/harden/SKILL.md +19 -16
  163. package/.agent/skills/harness-protocol/SKILL.md +9 -21
  164. package/.agent/skills/i18n-localization/SKILL.md +9 -59
  165. package/.agent/skills/impeccable/SKILL.md +19 -18
  166. package/.agent/skills/improve-codebase-architecture/SKILL.md +19 -17
  167. package/.agent/skills/improve-ui/SKILL.md +22 -14
  168. package/.agent/skills/intelligent-routing/SKILL.md +9 -23
  169. package/.agent/skills/knowledge-graph/SKILL.md +9 -21
  170. package/.agent/skills/landing-page/SKILL.md +19 -16
  171. package/.agent/skills/lint-and-validate/SKILL.md +9 -59
  172. package/.agent/skills/llm-engineering/SKILL.md +8 -58
  173. package/.agent/skills/local-first/SKILL.md +9 -59
  174. package/.agent/skills/local-first-architecture/SKILL.md +37 -20
  175. package/.agent/skills/lottie-animation/SKILL.md +19 -15
  176. package/.agent/skills/marquee-loop/SKILL.md +19 -16
  177. package/.agent/skills/masked-reveal/SKILL.md +19 -15
  178. package/.agent/skills/mcp-builder/SKILL.md +9 -59
  179. package/.agent/skills/micro-interaction/SKILL.md +19 -16
  180. package/.agent/skills/mobile-design/SKILL.md +8 -58
  181. package/.agent/skills/monorepo-management/SKILL.md +9 -59
  182. package/.agent/skills/morphing-icons/SKILL.md +19 -15
  183. package/.agent/skills/motion-engineering/SKILL.md +22 -15
  184. package/.agent/skills/nextjs-react-expert/SKILL.md +35 -67
  185. package/.agent/skills/nodejs-best-practices/SKILL.md +34 -61
  186. package/.agent/skills/observability/SKILL.md +8 -58
  187. package/.agent/skills/opentelemetry-observability/SKILL.md +31 -5
  188. package/.agent/skills/page-transition-animation/SKILL.md +19 -16
  189. package/.agent/skills/parallel-agents/SKILL.md +9 -59
  190. package/.agent/skills/performance-profiling/SKILL.md +8 -58
  191. package/.agent/skills/plan-writing/SKILL.md +36 -69
  192. package/.agent/skills/platform-engineer/SKILL.md +9 -59
  193. package/.agent/skills/platform-engineering-opentofu/SKILL.md +31 -5
  194. package/.agent/skills/playwright-ai-e2e/SKILL.md +31 -5
  195. package/.agent/skills/playwright-best-practices/SKILL.md +9 -59
  196. package/.agent/skills/polish/SKILL.md +19 -16
  197. package/.agent/skills/powershell-windows/SKILL.md +8 -58
  198. package/.agent/skills/pricing-page/SKILL.md +19 -16
  199. package/.agent/skills/product-aware-heuristics/SKILL.md +27 -8
  200. package/.agent/skills/progressive-blur/SKILL.md +19 -16
  201. package/.agent/skills/project-idioms/SKILL.md +9 -59
  202. package/.agent/skills/property-based-testing/SKILL.md +31 -5
  203. package/.agent/skills/python-patterns/SKILL.md +9 -59
  204. package/.agent/skills/python-pro/SKILL.md +35 -67
  205. package/.agent/skills/quieter/SKILL.md +19 -16
  206. package/.agent/skills/react-doctor/SKILL.md +19 -16
  207. package/.agent/skills/react-specialist/SKILL.md +26 -65
  208. package/.agent/skills/readme-builder/SKILL.md +9 -59
  209. package/.agent/skills/realtime-patterns/SKILL.md +8 -58
  210. package/.agent/skills/red-team-tactics/SKILL.md +9 -59
  211. package/.agent/skills/redesign-skill/SKILL.md +19 -16
  212. package/.agent/skills/review-animations/SKILL.md +21 -25
  213. package/.agent/skills/rust-pro/SKILL.md +30 -61
  214. package/.agent/skills/seo-fundamentals/SKILL.md +9 -59
  215. package/.agent/skills/server-management/SKILL.md +9 -59
  216. package/.agent/skills/shadcn-ui-expert/SKILL.md +9 -59
  217. package/.agent/skills/shape/SKILL.md +19 -16
  218. package/.agent/skills/skill-creator/SKILL.md +36 -86
  219. package/.agent/skills/soft-skill/SKILL.md +19 -16
  220. package/.agent/skills/sounds-on-the-web/SKILL.md +19 -16
  221. package/.agent/skills/sql-pro/SKILL.md +47 -62
  222. package/.agent/skills/supabase-postgres-best-practices/SKILL.md +9 -59
  223. package/.agent/skills/svg-animation/SKILL.md +19 -15
  224. package/.agent/skills/swiftui-expert/SKILL.md +9 -59
  225. package/.agent/skills/swiss-design/SKILL.md +19 -16
  226. package/.agent/skills/system-design-pro/SKILL.md +21 -26
  227. package/.agent/skills/systematic-debugging/SKILL.md +19 -60
  228. package/.agent/skills/systematic-debugging/condition-based-waiting.md +115 -0
  229. package/.agent/skills/systematic-debugging/defense-in-depth.md +122 -0
  230. package/.agent/skills/systematic-debugging/root-cause-tracing.md +169 -0
  231. package/.agent/skills/tailwind-patterns/SKILL.md +8 -58
  232. package/.agent/skills/taste-skill/SKILL.md +19 -16
  233. package/.agent/skills/tdd-workflow/SKILL.md +65 -25
  234. package/.agent/skills/test-result-analyzer/SKILL.md +9 -59
  235. package/.agent/skills/testing-patterns/SKILL.md +8 -58
  236. package/.agent/skills/thermo-nuclear-code-quality-review/SKILL.md +19 -18
  237. package/.agent/skills/thinking-protocol/SKILL.md +33 -2
  238. package/.agent/skills/to-spring-or-not-to-spring/SKILL.md +19 -15
  239. package/.agent/skills/transitions-dev/SKILL.md +19 -15
  240. package/.agent/skills/trend-researcher/SKILL.md +9 -59
  241. package/.agent/skills/typescript-advanced/SKILL.md +21 -64
  242. package/.agent/skills/typeset/SKILL.md +19 -16
  243. package/.agent/skills/ui-reasoning-engine/SKILL.md +27 -8
  244. package/.agent/skills/ui-skill-packs/SKILL.md +26 -16
  245. package/.agent/skills/ui-skills-root/SKILL.md +22 -14
  246. package/.agent/skills/ui-ux-pro-max/SKILL.md +38 -12
  247. package/.agent/skills/ui-ux-researcher/SKILL.md +9 -59
  248. package/.agent/skills/vector-search-pgvector/SKILL.md +31 -5
  249. package/.agent/skills/verification-before-completion/SKILL.md +125 -0
  250. package/.agent/skills/vue-expert/SKILL.md +9 -57
  251. package/.agent/skills/vulnerability-scanner/SKILL.md +8 -58
  252. package/.agent/skills/web-accessibility-auditor/SKILL.md +9 -59
  253. package/.agent/skills/web-design-guidelines/SKILL.md +27 -7
  254. package/.agent/skills/web-quality-audit/SKILL.md +19 -16
  255. package/.agent/skills/webapp-testing/SKILL.md +9 -59
  256. package/.agent/skills/webgpu-performance/SKILL.md +9 -28
  257. package/.agent/skills/whimsy-injector/SKILL.md +9 -57
  258. package/.agent/skills/workflow-optimizer/SKILL.md +9 -57
  259. package/.agent/skills/zero-trust-passkeys/SKILL.md +31 -5
  260. package/.agent/templates/DESIGN.md +680 -160
  261. package/.agent/templates/sdd/implementer-prompt.md +53 -0
  262. package/.agent/templates/sdd/re-review-prompt.md +28 -0
  263. package/.agent/templates/sdd/task-reviewer-prompt.md +59 -0
  264. package/.agent/workflows/acf.md +4 -0
  265. package/.agent/workflows/api-tester.md +5 -0
  266. package/.agent/workflows/audit.md +5 -0
  267. package/.agent/workflows/brainstorm.md +17 -1
  268. package/.agent/workflows/changelog.md +5 -0
  269. package/.agent/workflows/contract.md +19 -0
  270. package/.agent/workflows/create.md +6 -1
  271. package/.agent/workflows/debug.md +5 -0
  272. package/.agent/workflows/deploy.md +6 -1
  273. package/.agent/workflows/enhance.md +6 -1
  274. package/.agent/workflows/fix-ci.md +5 -0
  275. package/.agent/workflows/fix.md +5 -0
  276. package/.agent/workflows/generate.md +5 -0
  277. package/.agent/workflows/marathon.md +6 -1
  278. package/.agent/workflows/migrate.md +5 -0
  279. package/.agent/workflows/minimal.md +4 -0
  280. package/.agent/workflows/orchestrate.md +6 -1
  281. package/.agent/workflows/performance-benchmarker.md +6 -1
  282. package/.agent/workflows/pipeline.md +5 -0
  283. package/.agent/workflows/plan.md +6 -1
  284. package/.agent/workflows/preview.md +6 -1
  285. package/.agent/workflows/refactor.md +6 -0
  286. package/.agent/workflows/review-ai.md +5 -0
  287. package/.agent/workflows/review.md +5 -0
  288. package/.agent/workflows/sdd.md +122 -0
  289. package/.agent/workflows/session.md +5 -0
  290. package/.agent/workflows/status.md +4 -0
  291. package/.agent/workflows/super-prompt.md +4 -0
  292. package/.agent/workflows/swarm.md +6 -1
  293. package/.agent/workflows/test.md +6 -1
  294. package/.agent/workflows/tribunal-backend.md +5 -0
  295. package/.agent/workflows/tribunal-cicd.md +5 -0
  296. package/.agent/workflows/tribunal-database.md +5 -0
  297. package/.agent/workflows/tribunal-full.md +8 -0
  298. package/.agent/workflows/tribunal-mobile.md +5 -0
  299. package/.agent/workflows/tribunal-performance.md +5 -0
  300. package/.agent/workflows/tribunal-speed.md +5 -0
  301. package/.agent/workflows/tribunal-ui.md +7 -0
  302. package/.agents/plugins/marketplace.json +20 -0
  303. package/.claude/CLAUDE.md +442 -0
  304. package/.claude-plugin/marketplace.json +17 -0
  305. package/.claude-plugin/plugin.json +26 -0
  306. package/.codex-plugin/plugin.json +45 -0
  307. package/.cursor-plugin/plugin.json +26 -0
  308. package/.devin-plugin/plugin.json +14 -0
  309. package/.hermes-plugin/__init__.py +102 -0
  310. package/.hermes-plugin/plugin.yaml +6 -0
  311. package/.kimi-plugin/plugin.json +38 -0
  312. package/.opencode/INSTALL.md +41 -0
  313. package/.opencode/plugins/tribunal.js +101 -0
  314. package/.pi/extensions/tribunal.ts +133 -0
  315. package/CONTRIBUTING.md +1 -1
  316. package/README.md +253 -218
  317. package/SECURITY.md +3 -3
  318. package/bin/adapter-install.js +240 -0
  319. package/bin/global-store.js +48 -0
  320. package/bin/mcp-server.js +568 -252
  321. package/bin/proxy-server.js +113 -0
  322. package/bin/spawn-agent.js +39 -0
  323. package/bin/tk-proxy.js +34 -0
  324. package/bin/wrapper.js +1 -0
  325. package/dist/cli.js +355 -355
  326. package/dist/commands/init.js +8 -51
  327. package/dist/commands/status.js +61 -36
  328. package/dist/commands/validate.js +22 -31
  329. package/dist/esm/index.mjs +142 -142
  330. package/dist/index.d.ts +349 -343
  331. package/dist/tui/banner.js +77 -0
  332. package/dist/tui/index.js +21 -0
  333. package/dist/tui/reviewer-grid.js +90 -0
  334. package/dist/tui/shimmer.js +91 -0
  335. package/dist/tui/theme.js +130 -0
  336. package/dist/tui/tree.js +93 -0
  337. package/dist/tui/wizard.js +148 -0
  338. package/dist/utils/helpers.js +5 -41
  339. package/gemini-extension.json +6 -0
  340. package/hooks/hooks-cursor.json +16 -0
  341. package/hooks/hooks.json +16 -0
  342. package/hooks/session-start.js +77 -0
  343. package/package.json +165 -129
  344. package/scripts/audit_skill_sdo.js +87 -0
  345. package/scripts/build-graph.js +71 -0
  346. package/scripts/modernize_skills.js +254 -0
  347. package/.agent/history/snapshots/migrate_refs.js.json +0 -11
  348. package/.agent/scripts/compile_router.py +0 -5
  349. package/.agent/scripts/migrate_skills_frontmatter.py +0 -5
@@ -0,0 +1,77 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Minimalist framed header cards and status banners.
5
+ * Parity with Brainless & Claude Code design tokens.
6
+ */
7
+
8
+ const { isTTY, hasColor, hasTrueColor, RGB, GLYPHS, color, bold, getColumns } = require('./theme');
9
+
10
+ function renderBanner(version = '8.0.0', quiet = false) {
11
+ if (quiet) return;
12
+ if (!isTTY && !hasColor) {
13
+ console.error(`TRIBUNAL-KIT v${version} — Anti-Hallucination Governance Layer`);
14
+ return;
15
+ }
16
+
17
+ const g = GLYPHS;
18
+ const cols = getColumns();
19
+ const width = Math.min(84, Math.max(64, cols));
20
+ const innerWidth = width - 4;
21
+
22
+ const titleLeft = `🛡️ TRIBUNAL-KIT v${version}`;
23
+ const rightPill = '[Fortress Mode · ⚡ Rust Core]';
24
+ const leftLen = titleLeft.length; // emojis and text
25
+ const rightLen = rightPill.length;
26
+
27
+ const spaces = innerWidth > leftLen + rightLen ? innerWidth - (leftLen + rightLen) : 2;
28
+
29
+ const borderTop = ` ${g.boxTl}${g.boxH.repeat(innerWidth + 2)}${g.boxTr}`;
30
+ const borderBottom = ` ${g.boxBl}${g.boxH.repeat(innerWidth + 2)}${g.boxBr}`;
31
+
32
+ const coloredBorderTop = color(RGB.SLATE_700, borderTop);
33
+ const coloredBorderBottom = color(RGB.SLATE_700, borderBottom);
34
+ const pipe = color(RGB.SLATE_700, g.boxV);
35
+
36
+ // Gradient title line
37
+ let boldTitle;
38
+ if (hasTrueColor) {
39
+ let res = '🛡️ ';
40
+ const text = `TRIBUNAL-KIT v${version}`;
41
+ const len = text.length;
42
+ for (let i = 0; i < len; i++) {
43
+ const ratio = i / len;
44
+ const r = 255;
45
+ const gVal = Math.floor(105 + ratio * 80);
46
+ const bVal = Math.floor(74 - ratio * 30);
47
+ res += `\x1b[38;2;${r};${gVal};${bVal}m\x1b[1m${text[i]}\x1b[0m`;
48
+ }
49
+ boldTitle = res;
50
+ } else {
51
+ boldTitle = bold(titleLeft);
52
+ }
53
+
54
+ const coloredRightPill = color(RGB.ZINC_500, rightPill);
55
+ const subtitle = 'Autonomous Anti-Hallucination Governance Layer for AI Coding Agents';
56
+ const subSpaces = Math.max(0, innerWidth - subtitle.length);
57
+ const coloredSubtitle = color(RGB.ZINC_400, subtitle);
58
+
59
+ console.log();
60
+ console.log(coloredBorderTop);
61
+ console.log(` ${pipe} ${boldTitle}${' '.repeat(spaces)}${coloredRightPill} ${pipe}`);
62
+ console.log(` ${pipe} ${coloredSubtitle}${' '.repeat(subSpaces)} ${pipe}`);
63
+ console.log(coloredBorderBottom);
64
+ console.log();
65
+ }
66
+
67
+ function renderSectionHeader(title) {
68
+ const g = GLYPHS;
69
+ const prefix = color(RGB.FLAME, g.chevron);
70
+ const boldTitle = bold(title);
71
+ console.log(` ${prefix} ${boldTitle}`);
72
+ }
73
+
74
+ module.exports = {
75
+ renderBanner,
76
+ renderSectionHeader,
77
+ };
@@ -0,0 +1,21 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Tribunal-Kit TUI Primitives & Design System.
5
+ */
6
+
7
+ const theme = require('./theme');
8
+ const banner = require('./banner');
9
+ const tree = require('./tree');
10
+ const shimmer = require('./shimmer');
11
+ const reviewerGrid = require('./reviewer-grid');
12
+ const wizard = require('./wizard');
13
+
14
+ module.exports = {
15
+ ...theme,
16
+ ...banner,
17
+ ...tree,
18
+ ...shimmer,
19
+ ...reviewerGrid,
20
+ ...wizard,
21
+ };
@@ -0,0 +1,90 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Multi-column live parallel reviewer status matrix.
5
+ * Animates all 28 Tribunal reviewers running concurrently.
6
+ */
7
+
8
+ const { isTTY, hasColor, RGB, GLYPHS, color, bold, getColumns } = require('./theme');
9
+
10
+ const ALL_REVIEWERS = [
11
+ ['logic-auditor', 'Logic & Correctness'],
12
+ ['security-scanner', 'Security / OWASP'],
13
+ ['type-safety-gate', 'Type Safety'],
14
+ ['schema-reviewer', 'Schema / Database'],
15
+ ['resilience-guard', 'Fault Tolerance'],
16
+ ['sql-injection-gate', 'SQL Parameterization'],
17
+ ['dependency-analyzer', 'Supply Chain / Deps'],
18
+ ['prompt-injection-def', 'Prompt Defense'],
19
+ ['complexity-reviewer', 'Code Complexity'],
20
+ ['memory-leak-auditor', 'Resource Leaks'],
21
+ ['pipeline-checker', 'CI/CD Workflows'],
22
+ ['cognitive-boundary', 'Fabel Protocol'],
23
+ ['accessibility-eval', 'WCAG 2.2 AA'],
24
+ ['auth-boundary-gate', 'Auth & RBAC'],
25
+ ['jwt-algorithm-guard', 'JWT Algorithms'],
26
+ ['anti-hallucination-p0', 'Package Verification'],
27
+ ['rate-limit-reviewer', 'API Throttling'],
28
+ ['error-handling-gate', 'Async Error Traps'],
29
+ ['context-budget-auditor', 'Context Windows'],
30
+ ['model-param-validator', 'Model Signatures'],
31
+ ['stream-error-reviewer', 'SSE / Streaming'],
32
+ ['cost-explosion-guard', 'Token Runaway'],
33
+ ['case-law-enforcer', 'Precedent Engine'],
34
+ ['behavioral-contract', 'Contract Tests'],
35
+ ['sanitization-auditor', 'Input Sanitization'],
36
+ ['secrets-leak-guard', 'Zero Hardcoded Keys'],
37
+ ['dag-cycle-detector', 'DAG Schedules'],
38
+ ['vbc-evidence-auditor', 'Evidence Gate'],
39
+ ];
40
+
41
+ function renderReviewerGrid(completedCount = 28) {
42
+ if (!isTTY && !hasColor) {
43
+ console.log(' ✔ 28/28 Reviewers passed verification gates.');
44
+ return;
45
+ }
46
+
47
+ const g = GLYPHS;
48
+ const cols = getColumns();
49
+ const numCols = cols >= 100 ? 3 : (cols >= 68 ? 2 : 1);
50
+ const colWidth = Math.floor(Math.max(20, cols - 6) / numCols);
51
+
52
+ console.log();
53
+ const headerTitle = ` 🛡️ Tribunal Parallel Reviewer Swarm (28 Reviewers)`;
54
+ console.log(bold(headerTitle));
55
+ console.log(` ${color(RGB.SLATE_700, g.boxH.repeat(Math.min(84, cols - 4)))}`);
56
+
57
+ for (let r = 0; r < Math.ceil(ALL_REVIEWERS.length / numCols); r++) {
58
+ let line = ' ';
59
+ for (let c = 0; c < numCols; c++) {
60
+ const idx = r * numCols + c;
61
+ if (idx >= ALL_REVIEWERS.length) break;
62
+
63
+ const [name] = ALL_REVIEWERS[idx];
64
+ const isDone = idx < completedCount;
65
+
66
+ const icon = isDone
67
+ ? color(RGB.EMERALD, g.success)
68
+ : color(RGB.FLAME, '⠋');
69
+
70
+ const nameColored = isDone
71
+ ? color(RGB.WHITE, name)
72
+ : color(RGB.ZINC_500, name);
73
+
74
+ const itemStr = `${icon} ${nameColored}`;
75
+ const rawLen = 2 + name.length;
76
+ const pad = Math.max(1, colWidth - rawLen);
77
+
78
+ line += itemStr + ' '.repeat(pad);
79
+ }
80
+ console.log(line);
81
+ }
82
+
83
+ console.log(` ${color(RGB.SLATE_700, g.boxH.repeat(Math.min(84, cols - 4)))}`);
84
+ console.log();
85
+ }
86
+
87
+ module.exports = {
88
+ renderReviewerGrid,
89
+ ALL_REVIEWERS,
90
+ };
@@ -0,0 +1,91 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Shimmering gradient text animation & zero-flicker Braille spinner.
5
+ * Mirrors the Brainless CSS shimmer effect in Node.js ANSI TrueColor.
6
+ */
7
+
8
+ const { isTTY, hasColor, hasTrueColor, RGB, GLYPHS, color, bold } = require('./theme');
9
+
10
+ function renderShimmerText(text, frame) {
11
+ let out = '';
12
+ const numChars = text.length;
13
+ const wavePos = ((frame * 0.18) % (numChars + 4)) - 2;
14
+
15
+ for (let i = 0; i < numChars; i++) {
16
+ const dist = Math.abs(i - wavePos);
17
+ const intensity = Math.max(0, Math.min(1, 1.0 - dist / 3.0));
18
+
19
+ // Interpolate between FLAME #cd694a and bright CORAL #ffe4d6
20
+ const r = Math.floor(205 + intensity * 50);
21
+ const g = Math.floor(105 + intensity * 123);
22
+ const b = Math.floor(74 + intensity * 140);
23
+
24
+ out += `\x1b[38;2;${r};${g};${b}m\x1b[1m${text[i]}\x1b[0m`;
25
+ }
26
+ return out;
27
+ }
28
+
29
+ class ShimmerSpinner {
30
+ constructor(verb, details = '') {
31
+ this.verb = verb;
32
+ this.details = details;
33
+ this.timer = null;
34
+ this.frame = 0;
35
+ this.startTime = Date.now();
36
+ }
37
+
38
+ start() {
39
+ if (!isTTY || !hasColor) {
40
+ console.log(` · ${this.verb} (${this.details})`);
41
+ return this;
42
+ }
43
+
44
+ const braille = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
45
+
46
+ // Hide cursor to prevent flicker
47
+ process.stderr.write('\x1b[?25l');
48
+
49
+ this.timer = setInterval(() => {
50
+ const elapsed = ((Date.now() - this.startTime) / 1000).toFixed(1);
51
+ const spinnerChar = braille[this.frame % braille.length];
52
+
53
+ const shimmerVerb = hasTrueColor
54
+ ? renderShimmerText(this.verb, this.frame)
55
+ : bold(this.verb);
56
+
57
+ const dot = color(RGB.FLAME, '·');
58
+ const timerText = color(RGB.ZINC_500, `(${elapsed}s · ${this.details})`);
59
+ const spinColored = color(RGB.FLAME, spinnerChar);
60
+
61
+ process.stderr.write(`\r\x1b[2K ${dot} ${spinColored} ${shimmerVerb} ${timerText}`);
62
+ this.frame++;
63
+ }, 60);
64
+
65
+ return this;
66
+ }
67
+
68
+ finish(successMsg = null) {
69
+ if (this.timer) {
70
+ clearInterval(this.timer);
71
+ this.timer = null;
72
+ }
73
+
74
+ if (isTTY && hasColor) {
75
+ // Clear line and restore cursor
76
+ process.stderr.write('\r\x1b[2K\x1b[?25h');
77
+ }
78
+
79
+ if (successMsg) {
80
+ const g = GLYPHS;
81
+ const check = color(RGB.EMERALD, g.success);
82
+ const boldMsg = bold(successMsg);
83
+ console.log(` ${check} ${color(RGB.WHITE, boldMsg)}`);
84
+ }
85
+ }
86
+ }
87
+
88
+ module.exports = {
89
+ ShimmerSpinner,
90
+ renderShimmerText,
91
+ };
@@ -0,0 +1,130 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Terminal theme, TrueColor palette, and Unicode glyph tokens.
5
+ * Parity with Rust core TUI & Brainless (Claude Code / Codex / Grok) design system.
6
+ */
7
+
8
+ const isTTY = Boolean(process.stdout && process.stdout.isTTY);
9
+ const noColor = Boolean(process.env.NO_COLOR || process.env.CI);
10
+ const colorTerm = (process.env.COLORTERM || '').toLowerCase();
11
+ const term = (process.env.TERM || '').toLowerCase();
12
+
13
+ const hasColor = !noColor && (isTTY || Boolean(process.env.FORCE_COLOR));
14
+ const hasTrueColor = hasColor && (
15
+ colorTerm === 'truecolor' ||
16
+ colorTerm === '24bit' ||
17
+ term.includes('256color') ||
18
+ term.includes('xterm') ||
19
+ process.platform === 'win32'
20
+ );
21
+
22
+ const isUtf8 = !noColor && (
23
+ Boolean(process.env.WT_SESSION) ||
24
+ Boolean(process.env.TERM_PROGRAM) ||
25
+ (process.env.LANG || '').toLowerCase().includes('utf') ||
26
+ process.platform !== 'win32'
27
+ );
28
+
29
+ const RGB = {
30
+ SLATE_900: [13, 13, 15],
31
+ SLATE_800: [30, 30, 34],
32
+ SLATE_700: [47, 47, 51],
33
+ ZINC_600: [86, 95, 137],
34
+ ZINC_500: [122, 122, 122],
35
+ ZINC_400: [161, 161, 170],
36
+ ZINC_200: [228, 228, 231],
37
+ WHITE: [237, 237, 237],
38
+
39
+ // Accents (Flame / Amber / Coral)
40
+ FLAME: [205, 105, 74], // #cd694a
41
+ CORAL_BRIGHT: [231, 148, 117], // #e79475
42
+ AMBER: [245, 158, 11], // #f59e0b
43
+ GOLD: [255, 215, 0], // #ffd700
44
+
45
+ // Status
46
+ EMERALD: [78, 169, 111], // #4ea96f
47
+ CYAN: [125, 207, 255], // #7dcfff
48
+ ROSE: [244, 63, 94], // #f43f5e
49
+ PURPLE: [177, 167, 255], // #b1a7ff
50
+ };
51
+
52
+ const UTF8_GLYPHS = {
53
+ bullet: '⏺',
54
+ success: '✔',
55
+ failure: '✖',
56
+ warning: '⚠',
57
+ branch: '⎿',
58
+ treeMid: '├──',
59
+ treeEnd: '└──',
60
+ chevron: '❯',
61
+ diamond: '◆',
62
+ boxTl: '╭',
63
+ boxTr: '╮',
64
+ boxBl: '╰',
65
+ boxBr: '╯',
66
+ boxH: '─',
67
+ boxV: '│',
68
+ dot: '·',
69
+ check: '[✔]',
70
+ uncheck: '[ ]',
71
+ };
72
+
73
+ const ASCII_GLYPHS = {
74
+ bullet: '*',
75
+ success: '+',
76
+ failure: 'x',
77
+ warning: '!',
78
+ branch: '\\-',
79
+ treeMid: '|--',
80
+ treeEnd: '`--',
81
+ chevron: '>',
82
+ diamond: '*',
83
+ boxTl: '+',
84
+ boxTr: '+',
85
+ boxBl: '+',
86
+ boxBr: '+',
87
+ boxH: '-',
88
+ boxV: '|',
89
+ dot: '.',
90
+ check: '[x]',
91
+ uncheck: '[ ]',
92
+ };
93
+
94
+ const GLYPHS = isUtf8 ? UTF8_GLYPHS : ASCII_GLYPHS;
95
+
96
+ function color(rgb, text) {
97
+ if (!hasColor) return String(text);
98
+ if (hasTrueColor && Array.isArray(rgb)) {
99
+ return `\x1b[38;2;${rgb[0]};${rgb[1]};${rgb[2]}m${text}\x1b[0m`;
100
+ }
101
+ // Fallback ANSI 16-color
102
+ return `\x1b[96m${text}\x1b[0m`;
103
+ }
104
+
105
+ function bold(text) {
106
+ if (!hasColor) return String(text);
107
+ return `\x1b[1m${text}\x1b[0m`;
108
+ }
109
+
110
+ function dim(text) {
111
+ if (!hasColor) return String(text);
112
+ return `\x1b[90m${text}\x1b[0m`;
113
+ }
114
+
115
+ function getColumns() {
116
+ return (process.stdout && process.stdout.columns) || 80;
117
+ }
118
+
119
+ module.exports = {
120
+ isTTY,
121
+ hasColor,
122
+ hasTrueColor,
123
+ isUtf8,
124
+ RGB,
125
+ GLYPHS,
126
+ color,
127
+ bold,
128
+ dim,
129
+ getColumns,
130
+ };
@@ -0,0 +1,93 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Hierarchical action tree nodes (⏺ / ⎿) matching the Brainless agent specification.
5
+ */
6
+
7
+ const { isTTY, RGB, GLYPHS, color, bold } = require('./theme');
8
+
9
+ class ActionTree {
10
+ constructor(options = {}) {
11
+ this.staggerMs = isTTY ? (options.staggerMs ?? 15) : 0;
12
+ }
13
+
14
+ sleep(ms) {
15
+ if (ms <= 0) return Promise.resolve();
16
+ return new Promise(resolve => setTimeout(resolve, ms));
17
+ }
18
+
19
+ async action(verb, target = null) {
20
+ const g = GLYPHS;
21
+ const bullet = color(RGB.EMERALD, g.bullet);
22
+ const coloredVerb = color(RGB.WHITE, bold(verb));
23
+
24
+ if (target) {
25
+ const openParen = color(RGB.ZINC_600, '(');
26
+ const coloredTarget = color(RGB.CYAN, target);
27
+ const closeParen = color(RGB.ZINC_600, ')');
28
+ console.log(` ${bullet} ${coloredVerb}${openParen}${coloredTarget}${closeParen}`);
29
+ } else {
30
+ console.log(` ${bullet} ${coloredVerb}`);
31
+ }
32
+
33
+ if (this.staggerMs > 0) {
34
+ await this.sleep(this.staggerMs);
35
+ }
36
+ }
37
+
38
+ async branch(message) {
39
+ const g = GLYPHS;
40
+ const branchGlyph = color(RGB.ZINC_600, g.branch);
41
+ const coloredMsg = color(RGB.ZINC_400, message);
42
+ console.log(` ${branchGlyph} ${coloredMsg}`);
43
+
44
+ if (this.staggerMs > 0) {
45
+ await this.sleep(this.staggerMs);
46
+ }
47
+ }
48
+
49
+ async itemSuccess(title, detail = null) {
50
+ const g = GLYPHS;
51
+ const check = color(RGB.EMERALD, g.success);
52
+ const coloredTitle = color(RGB.WHITE, title);
53
+
54
+ if (detail) {
55
+ const coloredDetail = color(RGB.ZINC_500, detail);
56
+ console.log(` ${check} ${coloredTitle} ${coloredDetail}`);
57
+ } else {
58
+ console.log(` ${check} ${coloredTitle}`);
59
+ }
60
+
61
+ if (this.staggerMs > 0) {
62
+ await this.sleep(this.staggerMs);
63
+ }
64
+ }
65
+
66
+ itemWarning(message) {
67
+ const g = GLYPHS;
68
+ const warn = color(RGB.AMBER, g.warning);
69
+ const coloredMsg = color(RGB.AMBER, message);
70
+ console.log(` ${warn} ${coloredMsg}`);
71
+ }
72
+
73
+ itemError(message) {
74
+ const g = GLYPHS;
75
+ const err = color(RGB.ROSE, g.failure);
76
+ const coloredMsg = color(RGB.ROSE, message);
77
+ console.log(` ${err} ${coloredMsg}`);
78
+ }
79
+
80
+ complete(message) {
81
+ const g = GLYPHS;
82
+ const check = color(RGB.EMERALD, g.success);
83
+ const boldMsg = bold(message);
84
+ const colored = color(RGB.WHITE, boldMsg);
85
+ console.log();
86
+ console.log(` ${check} ${colored}`);
87
+ console.log();
88
+ }
89
+ }
90
+
91
+ module.exports = {
92
+ ActionTree,
93
+ };
@@ -0,0 +1,148 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Zero-dependency interactive terminal multi-select wizard.
5
+ * Handles keyboard navigation, space-to-toggle, and non-TTY fallback.
6
+ */
7
+
8
+ const readline = require('readline');
9
+ const { isTTY, hasColor, RGB, GLYPHS, color, bold } = require('./theme');
10
+
11
+ class WizardPrompt {
12
+ displaySummary(question, options) {
13
+ const g = GLYPHS;
14
+ const prefix = color(RGB.AMBER, '?');
15
+ const boldQ = bold(question);
16
+ console.log(` ${prefix} ${boldQ}`);
17
+
18
+ for (const opt of options) {
19
+ const check = opt.selected
20
+ ? color(RGB.EMERALD, g.check)
21
+ : color(RGB.ZINC_600, g.uncheck);
22
+
23
+ const labelColored = opt.selected
24
+ ? color(RGB.WHITE, opt.label)
25
+ : color(RGB.ZINC_500, opt.label);
26
+
27
+ const detailColored = color(RGB.ZINC_600, opt.detail || '');
28
+
29
+ console.log(` ${check} ${labelColored} ${detailColored}`);
30
+ }
31
+
32
+ const hint = '[Space] Toggle · [Enter] Confirm · [A] Select All';
33
+ console.log(` ${color(RGB.ZINC_600, hint)}`);
34
+ console.log();
35
+ }
36
+
37
+ async selectMultiple(question, initialOptions) {
38
+ if (!isTTY || !process.stdin.isTTY) {
39
+ this.displaySummary(question, initialOptions);
40
+ return initialOptions;
41
+ }
42
+
43
+ const options = initialOptions.map(opt => ({ ...opt }));
44
+ let cursor = 0;
45
+ const g = GLYPHS;
46
+
47
+ return new Promise(resolve => {
48
+ readline.emitKeypressEvents(process.stdin);
49
+ if (process.stdin.isTTY) {
50
+ process.stdin.setRawMode(true);
51
+ }
52
+ process.stdin.resume();
53
+
54
+ // Hide cursor
55
+ process.stdout.write('\x1b[?25l');
56
+
57
+ const render = (isFinal = false) => {
58
+ // Move back up lines if not initial render
59
+ const totalLines = options.length + 3;
60
+
61
+ let out = '';
62
+ const prefix = color(RGB.AMBER, '?');
63
+ out += ` ${prefix} ${bold(question)}\n`;
64
+
65
+ options.forEach((opt, idx) => {
66
+ const isCursor = idx === cursor;
67
+ const pointer = isCursor ? color(RGB.FLAME, g.chevron) : ' ';
68
+ const check = opt.selected
69
+ ? color(RGB.EMERALD, g.check)
70
+ : color(RGB.ZINC_600, g.uncheck);
71
+
72
+ const labelColored = opt.selected
73
+ ? color(RGB.WHITE, bold(opt.label))
74
+ : color(RGB.ZINC_400, opt.label);
75
+
76
+ const detailColored = color(RGB.ZINC_600, opt.detail || '');
77
+ out += ` ${pointer} ${check} ${labelColored} ${detailColored}\n`;
78
+ });
79
+
80
+ if (isFinal) {
81
+ out += ` ${color(RGB.EMERALD, '✔ Configuration selected.')}\n`;
82
+ } else {
83
+ const hint = '[Space] Toggle · [Enter] Confirm · [A] All · [↑/↓] Move';
84
+ out += ` ${color(RGB.ZINC_600, hint)}\n`;
85
+ }
86
+
87
+ return { out, totalLines };
88
+ };
89
+
90
+ let renderedOnce = false;
91
+
92
+ const draw = (isFinal = false) => {
93
+ const { out } = render(isFinal);
94
+ if (renderedOnce) {
95
+ // Clear and rewrite lines
96
+ process.stdout.write(`\x1b[${options.length + 2}A\r`);
97
+ }
98
+ process.stdout.write(out);
99
+ renderedOnce = true;
100
+ };
101
+
102
+ draw();
103
+
104
+ const onKeypress = (str, key) => {
105
+ if (!key) return;
106
+
107
+ if (key.ctrl && key.name === 'c') {
108
+ cleanup();
109
+ process.exit(130);
110
+ }
111
+
112
+ if (key.name === 'up' || key.name === 'k') {
113
+ cursor = (cursor - 1 + options.length) % options.length;
114
+ draw();
115
+ } else if (key.name === 'down' || key.name === 'j') {
116
+ cursor = (cursor + 1) % options.length;
117
+ draw();
118
+ } else if (key.name === 'space') {
119
+ options[cursor].selected = !options[cursor].selected;
120
+ draw();
121
+ } else if (str === 'a' || str === 'A') {
122
+ const allSelected = options.every(o => o.selected);
123
+ options.forEach(o => (o.selected = !allSelected));
124
+ draw();
125
+ } else if (key.name === 'return' || key.name === 'enter') {
126
+ cleanup();
127
+ draw(true);
128
+ resolve(options);
129
+ }
130
+ };
131
+
132
+ const cleanup = () => {
133
+ process.stdin.removeListener('keypress', onKeypress);
134
+ if (process.stdin.isTTY) {
135
+ process.stdin.setRawMode(false);
136
+ }
137
+ process.stdin.pause();
138
+ process.stdout.write('\x1b[?25h'); // restore cursor
139
+ };
140
+
141
+ process.stdin.on('keypress', onKeypress);
142
+ });
143
+ }
144
+ }
145
+
146
+ module.exports = {
147
+ WizardPrompt,
148
+ };