tribunal-kit 9.2.7 → 9.2.8

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 (801) hide show
  1. package/.agent/ARCHITECTURE.md +2 -2
  2. package/.agent/data/skill_certification_ledger.jsonl +40 -0
  3. package/.agent/data/skill_ontology.json +138 -0
  4. package/.agent/history/architecture-model.json +11656 -4996
  5. package/.agent/history/architecture-verification.json +9 -37
  6. package/.agent/routing_index.json +2430 -2069
  7. package/.agent/scripts/adaptive_execution.js +221 -28
  8. package/.agent/scripts/architecture_diff.js +303 -303
  9. package/.agent/scripts/architecture_extractor.js +792 -792
  10. package/.agent/scripts/architecture_health.js +293 -293
  11. package/.agent/scripts/architecture_verifier.js +303 -303
  12. package/.agent/scripts/architecture_visualizer.js +1988 -880
  13. package/.agent/scripts/blast_radius_engine.js +274 -274
  14. package/.agent/scripts/capability_evolution.js +102 -0
  15. package/.agent/scripts/context_broker.js +397 -31
  16. package/.agent/scripts/corpus_certification_orchestrator.js +502 -0
  17. package/.agent/scripts/corpus_validation_engine.js +311 -0
  18. package/.agent/scripts/engineering_memory.js +129 -0
  19. package/.agent/scripts/final_corpus_validation_engine.js +405 -0
  20. package/.agent/scripts/intent_extractor.js +130 -0
  21. package/.agent/scripts/outcome_engine.js +15 -0
  22. package/.agent/scripts/routing_evaluation_engine.js +184 -0
  23. package/.agent/scripts/skill_behavior_classifier.js +90 -0
  24. package/.agent/scripts/skill_behavior_harness.js +105 -0
  25. package/.agent/scripts/skill_certification_engine.js +586 -0
  26. package/.agent/scripts/skill_contract_engine.js +424 -0
  27. package/.agent/scripts/skill_coverage_expansion_engine.js +505 -0
  28. package/.agent/scripts/skill_evidence_acquisition_engine.js +535 -0
  29. package/.agent/scripts/skill_evidence_engine.js +83 -0
  30. package/.agent/scripts/skill_expectation_engine.js +38 -0
  31. package/.agent/scripts/skill_fixture_engine.js +24 -0
  32. package/.agent/scripts/skill_human_validation.js +32 -0
  33. package/.agent/scripts/skill_intelligence.js +89 -160
  34. package/.agent/scripts/skill_observation_engine.js +25 -0
  35. package/.agent/scripts/skill_ontology_engine.js +83 -0
  36. package/.agent/scripts/skill_quality_engine.js +343 -0
  37. package/.agent/scripts/skill_reconstruction_engine.js +164 -0
  38. package/.agent/scripts/skill_remediation_engine.js +326 -0
  39. package/.agent/scripts/skill_scenario_engine.js +108 -0
  40. package/.agent/scripts/skill_test_authoring_engine.js +1011 -0
  41. package/.agent/scripts/validation_engine.js +236 -236
  42. package/.agent/scripts/verification_auditor.js +80 -0
  43. package/.agent/skill_topic_map.json +301 -301
  44. package/.agent/skills/12-principles-of-animation/SKILL.md +9 -0
  45. package/.agent/skills/60fps-animation/SKILL.md +14 -0
  46. package/.agent/skills/accessible-animation/SKILL.md +9 -0
  47. package/.agent/skills/adapt/SKILL.md +8 -0
  48. package/.agent/skills/adr-generation/SKILL.md +9 -0
  49. package/.agent/skills/advanced-rag-pipelines/SKILL.md +9 -0
  50. package/.agent/skills/agent-organizer/SKILL.md +8 -0
  51. package/.agent/skills/agent-syscall-guidelines/SKILL.md +10 -0
  52. package/.agent/skills/agentic-patterns/SKILL.md +9 -0
  53. package/.agent/skills/agentic-workflows-2026/SKILL.md +8 -0
  54. package/.agent/skills/agentshield-security/SKILL.md +16 -0
  55. package/.agent/skills/ai-app-hardening/SKILL.md +7 -0
  56. package/.agent/skills/ai-prompt-injection-defense/SKILL.md +9 -0
  57. package/.agent/skills/animation-on-scroll/SKILL.md +9 -0
  58. package/.agent/skills/animation-systems/SKILL.md +8 -0
  59. package/.agent/skills/antfu-conventions/SKILL.md +9 -0
  60. package/.agent/skills/anti-slop-enforcement/SKILL.md +11 -0
  61. package/.agent/skills/api-patterns/SKILL.md +9 -0
  62. package/.agent/skills/api-security-auditor/SKILL.md +10 -0
  63. package/.agent/skills/app-builder/SKILL.md +8 -0
  64. package/.agent/skills/appflow-wireframe/SKILL.md +9 -0
  65. package/.agent/skills/apple-design/SKILL.md +8 -0
  66. package/.agent/skills/architecture/SKILL.md +8 -0
  67. package/.agent/skills/architecture-drift/SKILL.md +9 -0
  68. package/.agent/skills/architecture-intelligence/SKILL.md +17 -0
  69. package/.agent/skills/audit-and-fix/SKILL.md +8 -0
  70. package/.agent/skills/authentication-best-practices/SKILL.md +10 -0
  71. package/.agent/skills/autonomous-execution/SKILL.md +9 -0
  72. package/.agent/skills/backend-alembic/SKILL.md +16 -0
  73. package/.agent/skills/backend-architecture-auditor/SKILL.md +16 -0
  74. package/.agent/skills/backend-mongodb/SKILL.md +10 -0
  75. package/.agent/skills/backend-mysql/SKILL.md +16 -0
  76. package/.agent/skills/backend-performance-auditor/SKILL.md +10 -0
  77. package/.agent/skills/backend-postgresql/SKILL.md +10 -0
  78. package/.agent/skills/backend-redis/SKILL.md +10 -0
  79. package/.agent/skills/backend-security-expert/SKILL.md +10 -0
  80. package/.agent/skills/backend-sqlalchemy/SKILL.md +10 -0
  81. package/.agent/skills/backend-sqlite/SKILL.md +10 -0
  82. package/.agent/skills/backend-testing-auditor/SKILL.md +15 -0
  83. package/.agent/skills/baseline-ui/SKILL.md +8 -0
  84. package/.agent/skills/bash-linux/SKILL.md +9 -0
  85. package/.agent/skills/behavioral-modes/SKILL.md +9 -0
  86. package/.agent/skills/better-colors/SKILL.md +9 -0
  87. package/.agent/skills/better-typography/SKILL.md +9 -0
  88. package/.agent/skills/better-ui/SKILL.md +8 -0
  89. package/.agent/skills/bolder/SKILL.md +8 -0
  90. package/.agent/skills/brainstorming/SKILL.md +8 -0
  91. package/.agent/skills/browser-audit/SKILL.md +9 -0
  92. package/.agent/skills/browser-native-ai/SKILL.md +8 -0
  93. package/.agent/skills/build-primitive/SKILL.md +8 -0
  94. package/.agent/skills/building-native-ui/SKILL.md +7 -0
  95. package/.agent/skills/cicd-pro/SKILL.md +9 -0
  96. package/.agent/skills/clarify/SKILL.md +8 -0
  97. package/.agent/skills/clean-code/SKILL.md +8 -0
  98. package/.agent/skills/cloud-architect/SKILL.md +8 -0
  99. package/.agent/skills/cobejs/SKILL.md +8 -0
  100. package/.agent/skills/code-review-checklist/SKILL.md +9 -0
  101. package/.agent/skills/codebase-design/SKILL.md +14 -0
  102. package/.agent/skills/colorize/SKILL.md +8 -0
  103. package/.agent/skills/compact-landing/SKILL.md +9 -0
  104. package/.agent/skills/company-logos/SKILL.md +9 -0
  105. package/.agent/skills/config-validator/SKILL.md +9 -0
  106. package/.agent/skills/containerization-pro/SKILL.md +9 -0
  107. package/.agent/skills/context-engineering-pro/SKILL.md +10 -0
  108. package/.agent/skills/create-design-md/SKILL.md +7 -0
  109. package/.agent/skills/critique/SKILL.md +8 -0
  110. package/.agent/skills/csharp-developer/SKILL.md +9 -0
  111. package/.agent/skills/data-validation-schemas/SKILL.md +8 -0
  112. package/.agent/skills/database-design/SKILL.md +8 -0
  113. package/.agent/skills/delight/SKILL.md +8 -0
  114. package/.agent/skills/deployment-procedures/SKILL.md +9 -0
  115. package/.agent/skills/design-lab/SKILL.md +8 -0
  116. package/.agent/skills/devops-engineer/SKILL.md +9 -0
  117. package/.agent/skills/devops-incident-responder/SKILL.md +16 -0
  118. package/.agent/skills/diagnosing-bugs/SKILL.md +9 -0
  119. package/.agent/skills/distill/SKILL.md +8 -0
  120. package/.agent/skills/documentation-templates/SKILL.md +9 -0
  121. package/.agent/skills/domain-modeling/SKILL.md +9 -0
  122. package/.agent/skills/duckdb-analytical-sql/SKILL.md +10 -0
  123. package/.agent/skills/edge-ai-mobile/SKILL.md +8 -0
  124. package/.agent/skills/edge-computing/SKILL.md +9 -0
  125. package/.agent/skills/emil-design-eng/SKILL.md +9 -0
  126. package/.agent/skills/error-resilience/SKILL.md +8 -0
  127. package/.agent/skills/expo-router-v4/SKILL.md +9 -0
  128. package/.agent/skills/extract-design-system/SKILL.md +9 -0
  129. package/.agent/skills/fabel-protocol/SKILL.md +9 -0
  130. package/.agent/skills/failure-mode-analysis/SKILL.md +10 -0
  131. package/.agent/skills/fastapi-pro/SKILL.md +9 -0
  132. package/.agent/skills/fixing-accessibility/SKILL.md +9 -0
  133. package/.agent/skills/fixing-metadata/SKILL.md +9 -0
  134. package/.agent/skills/fixing-motion-performance/SKILL.md +9 -0
  135. package/.agent/skills/framer-motion-expert/SKILL.md +9 -0
  136. package/.agent/skills/frontend-design/SKILL.md +7 -0
  137. package/.agent/skills/frontend-security-expert/SKILL.md +9 -0
  138. package/.agent/skills/game-design-expert/SKILL.md +9 -0
  139. package/.agent/skills/game-engineering-expert/SKILL.md +16 -0
  140. package/.agent/skills/generative-ui-expert/SKILL.md +9 -0
  141. package/.agent/skills/geo-fundamentals/SKILL.md +9 -0
  142. package/.agent/skills/git-pro/SKILL.md +9 -0
  143. package/.agent/skills/github-operations/SKILL.md +9 -0
  144. package/.agent/skills/gpt-taste/SKILL.md +9 -0
  145. package/.agent/skills/graph-engineering/SKILL.md +16 -0
  146. package/.agent/skills/gsap-core/SKILL.md +9 -0
  147. package/.agent/skills/gsap-frameworks/SKILL.md +9 -0
  148. package/.agent/skills/gsap-performance/SKILL.md +9 -0
  149. package/.agent/skills/gsap-plugins/SKILL.md +9 -0
  150. package/.agent/skills/gsap-react/SKILL.md +9 -0
  151. package/.agent/skills/gsap-scrolltrigger/SKILL.md +9 -0
  152. package/.agent/skills/gsap-timeline/SKILL.md +9 -0
  153. package/.agent/skills/gsap-utils/SKILL.md +9 -0
  154. package/.agent/skills/harden/SKILL.md +8 -0
  155. package/.agent/skills/harness-protocol/SKILL.md +9 -0
  156. package/.agent/skills/hf-cli/SKILL.md +11 -0
  157. package/.agent/skills/hf-cloud-aws-context-discovery/SKILL.md +10 -0
  158. package/.agent/skills/hf-cloud-python-env-setup/SKILL.md +10 -0
  159. package/.agent/skills/hf-cloud-sagemaker-deployment-planner/SKILL.md +10 -0
  160. package/.agent/skills/hf-cloud-sagemaker-iam-preflight/SKILL.md +10 -0
  161. package/.agent/skills/hf-cloud-sagemaker-production-defaults/SKILL.md +10 -0
  162. package/.agent/skills/hf-cloud-serving-image-selection/SKILL.md +10 -0
  163. package/.agent/skills/hf-mem/SKILL.md +11 -0
  164. package/.agent/skills/huggingface-best/SKILL.md +9 -0
  165. package/.agent/skills/huggingface-community-evals/SKILL.md +11 -0
  166. package/.agent/skills/huggingface-datasets/SKILL.md +10 -0
  167. package/.agent/skills/huggingface-gradio/SKILL.md +10 -0
  168. package/.agent/skills/huggingface-llm-trainer/SKILL.md +10 -0
  169. package/.agent/skills/huggingface-local-models/SKILL.md +10 -0
  170. package/.agent/skills/huggingface-lora-space-builder/SKILL.md +11 -0
  171. package/.agent/skills/huggingface-paper-publisher/SKILL.md +11 -0
  172. package/.agent/skills/huggingface-papers/SKILL.md +11 -0
  173. package/.agent/skills/huggingface-spaces/SKILL.md +10 -0
  174. package/.agent/skills/huggingface-tool-builder/SKILL.md +11 -0
  175. package/.agent/skills/huggingface-trackio/SKILL.md +11 -0
  176. package/.agent/skills/huggingface-vision-trainer/SKILL.md +11 -0
  177. package/.agent/skills/huggingface-zerogpu/SKILL.md +11 -0
  178. package/.agent/skills/human-gate-negotiation/SKILL.md +11 -0
  179. package/.agent/skills/i18n-localization/SKILL.md +9 -0
  180. package/.agent/skills/impeccable/SKILL.md +8 -0
  181. package/.agent/skills/improve-codebase-architecture/SKILL.md +10 -0
  182. package/.agent/skills/improve-ui/SKILL.md +8 -0
  183. package/.agent/skills/intelligent-routing/SKILL.md +9 -0
  184. package/.agent/skills/knowledge-graph/SKILL.md +9 -0
  185. package/.agent/skills/landing-page/SKILL.md +9 -0
  186. package/.agent/skills/lint-and-validate/SKILL.md +9 -0
  187. package/.agent/skills/llm-engineering/SKILL.md +9 -0
  188. package/.agent/skills/local-first/SKILL.md +10 -0
  189. package/.agent/skills/lottie-animation/SKILL.md +9 -0
  190. package/.agent/skills/marquee-loop/SKILL.md +9 -0
  191. package/.agent/skills/masked-reveal/SKILL.md +9 -0
  192. package/.agent/skills/mcp-builder/SKILL.md +9 -0
  193. package/.agent/skills/micro-interaction/SKILL.md +9 -0
  194. package/.agent/skills/mobile-design/SKILL.md +7 -0
  195. package/.agent/skills/monorepo-management/SKILL.md +9 -0
  196. package/.agent/skills/morphing-icons/SKILL.md +9 -0
  197. package/.agent/skills/motion-engineering/SKILL.md +8 -0
  198. package/.agent/skills/nextjs-react-expert/SKILL.md +10 -0
  199. package/.agent/skills/nodejs-best-practices/SKILL.md +16 -0
  200. package/.agent/skills/observability/SKILL.md +8 -0
  201. package/.agent/skills/opentelemetry-observability/SKILL.md +9 -0
  202. package/.agent/skills/page-transition-animation/SKILL.md +10 -0
  203. package/.agent/skills/parallel-agents/SKILL.md +15 -0
  204. package/.agent/skills/performance-profiling/SKILL.md +9 -0
  205. package/.agent/skills/plan-writing/SKILL.md +8 -0
  206. package/.agent/skills/platform-engineer/SKILL.md +9 -0
  207. package/.agent/skills/platform-engineering-opentofu/SKILL.md +10 -0
  208. package/.agent/skills/playwright-ai-e2e/SKILL.md +9 -0
  209. package/.agent/skills/playwright-best-practices/SKILL.md +16 -0
  210. package/.agent/skills/polish/SKILL.md +8 -0
  211. package/.agent/skills/powershell-windows/SKILL.md +9 -0
  212. package/.agent/skills/pricing-page/SKILL.md +9 -0
  213. package/.agent/skills/product-aware-heuristics/SKILL.md +10 -0
  214. package/.agent/skills/progressive-blur/SKILL.md +9 -0
  215. package/.agent/skills/project-idioms/SKILL.md +8 -0
  216. package/.agent/skills/property-based-testing/SKILL.md +9 -0
  217. package/.agent/skills/python-patterns/SKILL.md +9 -0
  218. package/.agent/skills/python-pro/SKILL.md +9 -0
  219. package/.agent/skills/quieter/SKILL.md +8 -0
  220. package/.agent/skills/react-doctor/SKILL.md +9 -0
  221. package/.agent/skills/react-specialist/SKILL.md +9 -0
  222. package/.agent/skills/readme-builder/SKILL.md +9 -0
  223. package/.agent/skills/realtime-patterns/SKILL.md +9 -0
  224. package/.agent/skills/red-team-tactics/SKILL.md +16 -0
  225. package/.agent/skills/redesign-skill/SKILL.md +9 -0
  226. package/.agent/skills/review-animations/SKILL.md +8 -0
  227. package/.agent/skills/rust-pro/SKILL.md +9 -0
  228. package/.agent/skills/semantic-filesystem-navigation/SKILL.md +11 -0
  229. package/.agent/skills/seo-fundamentals/SKILL.md +9 -0
  230. package/.agent/skills/server-management/SKILL.md +8 -0
  231. package/.agent/skills/session-log-interrogation/SKILL.md +11 -0
  232. package/.agent/skills/shadcn-ui-expert/SKILL.md +9 -0
  233. package/.agent/skills/shape/SKILL.md +8 -0
  234. package/.agent/skills/skill-creator/SKILL.md +9 -0
  235. package/.agent/skills/soft-skill/SKILL.md +9 -0
  236. package/.agent/skills/sounds-on-the-web/SKILL.md +9 -0
  237. package/.agent/skills/sql-pro/SKILL.md +9 -0
  238. package/.agent/skills/subagent-driven-development/SKILL.md +11 -0
  239. package/.agent/skills/supabase-postgres-best-practices/SKILL.md +17 -0
  240. package/.agent/skills/svg-animation/SKILL.md +9 -0
  241. package/.agent/skills/swiftui-expert/SKILL.md +9 -0
  242. package/.agent/skills/swiss-design/SKILL.md +8 -0
  243. package/.agent/skills/system-design-pro/SKILL.md +9 -0
  244. package/.agent/skills/systematic-debugging/SKILL.md +14 -0
  245. package/.agent/skills/tailwind-patterns/SKILL.md +9 -0
  246. package/.agent/skills/taste-skill/SKILL.md +9 -0
  247. package/.agent/skills/tdd-workflow/SKILL.md +9 -0
  248. package/.agent/skills/test-result-analyzer/SKILL.md +9 -0
  249. package/.agent/skills/testing-patterns/SKILL.md +8 -0
  250. package/.agent/skills/thermo-nuclear-code-quality-review/SKILL.md +11 -0
  251. package/.agent/skills/thinking-protocol/SKILL.md +10 -0
  252. package/.agent/skills/to-spring-or-not-to-spring/SKILL.md +9 -0
  253. package/.agent/skills/train-sentence-transformers/SKILL.md +10 -0
  254. package/.agent/skills/transformers-js/SKILL.md +8 -0
  255. package/.agent/skills/transitions-dev/SKILL.md +8 -0
  256. package/.agent/skills/trend-researcher/SKILL.md +9 -0
  257. package/.agent/skills/tribunal-instincts-memory/SKILL.md +11 -0
  258. package/.agent/skills/trl-training/SKILL.md +9 -0
  259. package/.agent/skills/typescript-advanced/SKILL.md +9 -0
  260. package/.agent/skills/typeset/SKILL.md +8 -0
  261. package/.agent/skills/ui-reasoning-engine/SKILL.md +9 -0
  262. package/.agent/skills/ui-skill-packs/SKILL.md +9 -0
  263. package/.agent/skills/ui-skills-root/SKILL.md +9 -0
  264. package/.agent/skills/ui-ux-pro-max/SKILL.md +9 -0
  265. package/.agent/skills/ui-ux-researcher/SKILL.md +8 -0
  266. package/.agent/skills/vector-search-pgvector/SKILL.md +10 -0
  267. package/.agent/skills/verification-before-completion/SKILL.md +9 -0
  268. package/.agent/skills/vue-expert/SKILL.md +9 -0
  269. package/.agent/skills/vulnerability-scanner/SKILL.md +9 -0
  270. package/.agent/skills/web-accessibility-auditor/SKILL.md +16 -0
  271. package/.agent/skills/web-design-guidelines/SKILL.md +9 -0
  272. package/.agent/skills/web-quality-audit/SKILL.md +10 -0
  273. package/.agent/skills/webapp-testing/SKILL.md +8 -0
  274. package/.agent/skills/webgpu-performance/SKILL.md +9 -0
  275. package/.agent/skills/whimsy-injector/SKILL.md +9 -0
  276. package/.agent/skills/workflow-optimizer/SKILL.md +9 -0
  277. package/.agent/skills/zero-trust-passkeys/SKILL.md +10 -0
  278. package/.agent/skills_inventory.json +4257 -4272
  279. package/.agents/skills/12-principles-of-animation/SKILL.md +9 -0
  280. package/.agents/skills/60fps-animation/SKILL.md +14 -0
  281. package/.agents/skills/accessible-animation/SKILL.md +9 -0
  282. package/.agents/skills/adapt/SKILL.md +8 -0
  283. package/.agents/skills/adr-generation/SKILL.md +9 -0
  284. package/.agents/skills/advanced-rag-pipelines/SKILL.md +9 -0
  285. package/.agents/skills/agent-organizer/SKILL.md +8 -0
  286. package/.agents/skills/agent-syscall-guidelines/SKILL.md +10 -0
  287. package/.agents/skills/agentic-patterns/SKILL.md +9 -0
  288. package/.agents/skills/agentic-workflows-2026/SKILL.md +8 -0
  289. package/.agents/skills/agentshield-security/SKILL.md +16 -0
  290. package/.agents/skills/ai-app-hardening/SKILL.md +7 -0
  291. package/.agents/skills/ai-prompt-injection-defense/SKILL.md +9 -0
  292. package/.agents/skills/animation-on-scroll/SKILL.md +9 -0
  293. package/.agents/skills/animation-systems/SKILL.md +8 -0
  294. package/.agents/skills/antfu-conventions/SKILL.md +9 -0
  295. package/.agents/skills/anti-slop-enforcement/SKILL.md +11 -0
  296. package/.agents/skills/api-patterns/SKILL.md +9 -0
  297. package/.agents/skills/api-security-auditor/SKILL.md +10 -0
  298. package/.agents/skills/app-builder/SKILL.md +8 -0
  299. package/.agents/skills/appflow-wireframe/SKILL.md +9 -0
  300. package/.agents/skills/apple-design/SKILL.md +8 -0
  301. package/.agents/skills/architecture/SKILL.md +8 -0
  302. package/.agents/skills/architecture-drift/SKILL.md +9 -0
  303. package/.agents/skills/architecture-intelligence/SKILL.md +17 -0
  304. package/.agents/skills/audit-and-fix/SKILL.md +8 -0
  305. package/.agents/skills/authentication-best-practices/SKILL.md +10 -0
  306. package/.agents/skills/autonomous-execution/SKILL.md +9 -0
  307. package/.agents/skills/backend-alembic/SKILL.md +16 -0
  308. package/.agents/skills/backend-architecture-auditor/SKILL.md +16 -0
  309. package/.agents/skills/backend-mongodb/SKILL.md +10 -0
  310. package/.agents/skills/backend-mysql/SKILL.md +16 -0
  311. package/.agents/skills/backend-performance-auditor/SKILL.md +10 -0
  312. package/.agents/skills/backend-postgresql/SKILL.md +10 -0
  313. package/.agents/skills/backend-redis/SKILL.md +10 -0
  314. package/.agents/skills/backend-security-expert/SKILL.md +10 -0
  315. package/.agents/skills/backend-sqlalchemy/SKILL.md +10 -0
  316. package/.agents/skills/backend-sqlite/SKILL.md +10 -0
  317. package/.agents/skills/backend-testing-auditor/SKILL.md +15 -0
  318. package/.agents/skills/baseline-ui/SKILL.md +8 -0
  319. package/.agents/skills/bash-linux/SKILL.md +9 -0
  320. package/.agents/skills/behavioral-modes/SKILL.md +9 -0
  321. package/.agents/skills/better-colors/SKILL.md +9 -0
  322. package/.agents/skills/better-typography/SKILL.md +9 -0
  323. package/.agents/skills/better-ui/SKILL.md +8 -0
  324. package/.agents/skills/bolder/SKILL.md +8 -0
  325. package/.agents/skills/brainstorming/SKILL.md +8 -0
  326. package/.agents/skills/browser-audit/SKILL.md +9 -0
  327. package/.agents/skills/browser-native-ai/SKILL.md +8 -0
  328. package/.agents/skills/build-primitive/SKILL.md +8 -0
  329. package/.agents/skills/building-native-ui/SKILL.md +7 -0
  330. package/.agents/skills/cicd-pro/SKILL.md +9 -0
  331. package/.agents/skills/clarify/SKILL.md +8 -0
  332. package/.agents/skills/clean-code/SKILL.md +8 -0
  333. package/.agents/skills/cloud-architect/SKILL.md +8 -0
  334. package/.agents/skills/cobejs/SKILL.md +8 -0
  335. package/.agents/skills/code-review-checklist/SKILL.md +9 -0
  336. package/.agents/skills/codebase-design/SKILL.md +14 -0
  337. package/.agents/skills/colorize/SKILL.md +8 -0
  338. package/.agents/skills/compact-landing/SKILL.md +9 -0
  339. package/.agents/skills/company-logos/SKILL.md +9 -0
  340. package/.agents/skills/config-validator/SKILL.md +9 -0
  341. package/.agents/skills/containerization-pro/SKILL.md +9 -0
  342. package/.agents/skills/context-engineering-pro/SKILL.md +10 -0
  343. package/.agents/skills/create-design-md/SKILL.md +7 -0
  344. package/.agents/skills/critique/SKILL.md +8 -0
  345. package/.agents/skills/csharp-developer/SKILL.md +9 -0
  346. package/.agents/skills/data-validation-schemas/SKILL.md +8 -0
  347. package/.agents/skills/database-design/SKILL.md +8 -0
  348. package/.agents/skills/delight/SKILL.md +8 -0
  349. package/.agents/skills/deployment-procedures/SKILL.md +9 -0
  350. package/.agents/skills/design-lab/SKILL.md +8 -0
  351. package/.agents/skills/devops-engineer/SKILL.md +9 -0
  352. package/.agents/skills/devops-incident-responder/SKILL.md +16 -0
  353. package/.agents/skills/diagnosing-bugs/SKILL.md +9 -0
  354. package/.agents/skills/distill/SKILL.md +8 -0
  355. package/.agents/skills/documentation-templates/SKILL.md +9 -0
  356. package/.agents/skills/domain-modeling/SKILL.md +9 -0
  357. package/.agents/skills/duckdb-analytical-sql/SKILL.md +10 -0
  358. package/.agents/skills/edge-ai-mobile/SKILL.md +8 -0
  359. package/.agents/skills/edge-computing/SKILL.md +9 -0
  360. package/.agents/skills/emil-design-eng/SKILL.md +9 -0
  361. package/.agents/skills/error-resilience/SKILL.md +8 -0
  362. package/.agents/skills/expo-router-v4/SKILL.md +9 -0
  363. package/.agents/skills/extract-design-system/SKILL.md +9 -0
  364. package/.agents/skills/fabel-protocol/SKILL.md +9 -0
  365. package/.agents/skills/failure-mode-analysis/SKILL.md +10 -0
  366. package/.agents/skills/fastapi-pro/SKILL.md +9 -0
  367. package/.agents/skills/fixing-accessibility/SKILL.md +9 -0
  368. package/.agents/skills/fixing-metadata/SKILL.md +9 -0
  369. package/.agents/skills/fixing-motion-performance/SKILL.md +9 -0
  370. package/.agents/skills/framer-motion-expert/SKILL.md +9 -0
  371. package/.agents/skills/frontend-design/SKILL.md +7 -0
  372. package/.agents/skills/frontend-security-expert/SKILL.md +9 -0
  373. package/.agents/skills/game-design-expert/SKILL.md +9 -0
  374. package/.agents/skills/game-engineering-expert/SKILL.md +16 -0
  375. package/.agents/skills/generative-ui-expert/SKILL.md +9 -0
  376. package/.agents/skills/geo-fundamentals/SKILL.md +9 -0
  377. package/.agents/skills/git-pro/SKILL.md +9 -0
  378. package/.agents/skills/github-operations/SKILL.md +9 -0
  379. package/.agents/skills/gpt-taste/SKILL.md +9 -0
  380. package/.agents/skills/graph-engineering/SKILL.md +16 -0
  381. package/.agents/skills/gsap-core/SKILL.md +9 -0
  382. package/.agents/skills/gsap-frameworks/SKILL.md +9 -0
  383. package/.agents/skills/gsap-performance/SKILL.md +9 -0
  384. package/.agents/skills/gsap-plugins/SKILL.md +9 -0
  385. package/.agents/skills/gsap-react/SKILL.md +9 -0
  386. package/.agents/skills/gsap-scrolltrigger/SKILL.md +9 -0
  387. package/.agents/skills/gsap-timeline/SKILL.md +9 -0
  388. package/.agents/skills/gsap-utils/SKILL.md +9 -0
  389. package/.agents/skills/harden/SKILL.md +8 -0
  390. package/.agents/skills/harness-protocol/SKILL.md +9 -0
  391. package/.agents/skills/hf-cli/SKILL.md +11 -0
  392. package/.agents/skills/hf-cloud-aws-context-discovery/SKILL.md +10 -0
  393. package/.agents/skills/hf-cloud-python-env-setup/SKILL.md +10 -0
  394. package/.agents/skills/hf-cloud-sagemaker-deployment-planner/SKILL.md +10 -0
  395. package/.agents/skills/hf-cloud-sagemaker-iam-preflight/SKILL.md +10 -0
  396. package/.agents/skills/hf-cloud-sagemaker-production-defaults/SKILL.md +10 -0
  397. package/.agents/skills/hf-cloud-serving-image-selection/SKILL.md +10 -0
  398. package/.agents/skills/hf-mem/SKILL.md +11 -0
  399. package/.agents/skills/huggingface-best/SKILL.md +9 -0
  400. package/.agents/skills/huggingface-community-evals/SKILL.md +11 -0
  401. package/.agents/skills/huggingface-datasets/SKILL.md +10 -0
  402. package/.agents/skills/huggingface-gradio/SKILL.md +10 -0
  403. package/.agents/skills/huggingface-llm-trainer/SKILL.md +10 -0
  404. package/.agents/skills/huggingface-local-models/SKILL.md +10 -0
  405. package/.agents/skills/huggingface-lora-space-builder/SKILL.md +11 -0
  406. package/.agents/skills/huggingface-paper-publisher/SKILL.md +11 -0
  407. package/.agents/skills/huggingface-papers/SKILL.md +11 -0
  408. package/.agents/skills/huggingface-spaces/SKILL.md +10 -0
  409. package/.agents/skills/huggingface-tool-builder/SKILL.md +11 -0
  410. package/.agents/skills/huggingface-trackio/SKILL.md +11 -0
  411. package/.agents/skills/huggingface-vision-trainer/SKILL.md +11 -0
  412. package/.agents/skills/huggingface-zerogpu/SKILL.md +11 -0
  413. package/.agents/skills/human-gate-negotiation/SKILL.md +11 -0
  414. package/.agents/skills/i18n-localization/SKILL.md +9 -0
  415. package/.agents/skills/impeccable/SKILL.md +8 -0
  416. package/.agents/skills/improve-codebase-architecture/SKILL.md +10 -0
  417. package/.agents/skills/improve-ui/SKILL.md +8 -0
  418. package/.agents/skills/intelligent-routing/SKILL.md +9 -0
  419. package/.agents/skills/knowledge-graph/SKILL.md +9 -0
  420. package/.agents/skills/landing-page/SKILL.md +9 -0
  421. package/.agents/skills/lint-and-validate/SKILL.md +9 -0
  422. package/.agents/skills/llm-engineering/SKILL.md +9 -0
  423. package/.agents/skills/local-first/SKILL.md +10 -0
  424. package/.agents/skills/lottie-animation/SKILL.md +9 -0
  425. package/.agents/skills/marquee-loop/SKILL.md +9 -0
  426. package/.agents/skills/masked-reveal/SKILL.md +9 -0
  427. package/.agents/skills/mcp-builder/SKILL.md +9 -0
  428. package/.agents/skills/micro-interaction/SKILL.md +9 -0
  429. package/.agents/skills/mobile-design/SKILL.md +7 -0
  430. package/.agents/skills/monorepo-management/SKILL.md +9 -0
  431. package/.agents/skills/morphing-icons/SKILL.md +9 -0
  432. package/.agents/skills/motion-engineering/SKILL.md +8 -0
  433. package/.agents/skills/nextjs-react-expert/SKILL.md +10 -0
  434. package/.agents/skills/nodejs-best-practices/SKILL.md +16 -0
  435. package/.agents/skills/observability/SKILL.md +8 -0
  436. package/.agents/skills/opentelemetry-observability/SKILL.md +9 -0
  437. package/.agents/skills/page-transition-animation/SKILL.md +10 -0
  438. package/.agents/skills/parallel-agents/SKILL.md +15 -0
  439. package/.agents/skills/performance-profiling/SKILL.md +9 -0
  440. package/.agents/skills/plan-writing/SKILL.md +8 -0
  441. package/.agents/skills/platform-engineer/SKILL.md +9 -0
  442. package/.agents/skills/platform-engineering-opentofu/SKILL.md +10 -0
  443. package/.agents/skills/playwright-ai-e2e/SKILL.md +9 -0
  444. package/.agents/skills/playwright-best-practices/SKILL.md +16 -0
  445. package/.agents/skills/polish/SKILL.md +8 -0
  446. package/.agents/skills/powershell-windows/SKILL.md +9 -0
  447. package/.agents/skills/pricing-page/SKILL.md +9 -0
  448. package/.agents/skills/product-aware-heuristics/SKILL.md +10 -0
  449. package/.agents/skills/progressive-blur/SKILL.md +9 -0
  450. package/.agents/skills/project-idioms/SKILL.md +8 -0
  451. package/.agents/skills/property-based-testing/SKILL.md +9 -0
  452. package/.agents/skills/python-patterns/SKILL.md +9 -0
  453. package/.agents/skills/python-pro/SKILL.md +9 -0
  454. package/.agents/skills/quieter/SKILL.md +8 -0
  455. package/.agents/skills/react-doctor/SKILL.md +9 -0
  456. package/.agents/skills/react-specialist/SKILL.md +9 -0
  457. package/.agents/skills/readme-builder/SKILL.md +9 -0
  458. package/.agents/skills/realtime-patterns/SKILL.md +9 -0
  459. package/.agents/skills/red-team-tactics/SKILL.md +16 -0
  460. package/.agents/skills/redesign-skill/SKILL.md +9 -0
  461. package/.agents/skills/review-animations/SKILL.md +8 -0
  462. package/.agents/skills/rust-pro/SKILL.md +9 -0
  463. package/.agents/skills/semantic-filesystem-navigation/SKILL.md +11 -0
  464. package/.agents/skills/seo-fundamentals/SKILL.md +9 -0
  465. package/.agents/skills/server-management/SKILL.md +8 -0
  466. package/.agents/skills/session-log-interrogation/SKILL.md +11 -0
  467. package/.agents/skills/shadcn-ui-expert/SKILL.md +9 -0
  468. package/.agents/skills/shape/SKILL.md +8 -0
  469. package/.agents/skills/skill-creator/SKILL.md +9 -0
  470. package/.agents/skills/soft-skill/SKILL.md +9 -0
  471. package/.agents/skills/sounds-on-the-web/SKILL.md +9 -0
  472. package/.agents/skills/sql-pro/SKILL.md +9 -0
  473. package/.agents/skills/subagent-driven-development/SKILL.md +11 -0
  474. package/.agents/skills/supabase-postgres-best-practices/SKILL.md +17 -0
  475. package/.agents/skills/svg-animation/SKILL.md +9 -0
  476. package/.agents/skills/swiftui-expert/SKILL.md +9 -0
  477. package/.agents/skills/swiss-design/SKILL.md +8 -0
  478. package/.agents/skills/system-design-pro/SKILL.md +9 -0
  479. package/.agents/skills/systematic-debugging/SKILL.md +14 -0
  480. package/.agents/skills/tailwind-patterns/SKILL.md +9 -0
  481. package/.agents/skills/taste-skill/SKILL.md +9 -0
  482. package/.agents/skills/tdd-workflow/SKILL.md +9 -0
  483. package/.agents/skills/test-result-analyzer/SKILL.md +9 -0
  484. package/.agents/skills/testing-patterns/SKILL.md +8 -0
  485. package/.agents/skills/thermo-nuclear-code-quality-review/SKILL.md +11 -0
  486. package/.agents/skills/thinking-protocol/SKILL.md +10 -0
  487. package/.agents/skills/to-spring-or-not-to-spring/SKILL.md +9 -0
  488. package/.agents/skills/train-sentence-transformers/SKILL.md +10 -0
  489. package/.agents/skills/transformers-js/SKILL.md +8 -0
  490. package/.agents/skills/transitions-dev/SKILL.md +8 -0
  491. package/.agents/skills/trend-researcher/SKILL.md +9 -0
  492. package/.agents/skills/tribunal-instincts-memory/SKILL.md +11 -0
  493. package/.agents/skills/trl-training/SKILL.md +9 -0
  494. package/.agents/skills/typescript-advanced/SKILL.md +9 -0
  495. package/.agents/skills/typeset/SKILL.md +8 -0
  496. package/.agents/skills/ui-reasoning-engine/SKILL.md +9 -0
  497. package/.agents/skills/ui-skill-packs/SKILL.md +9 -0
  498. package/.agents/skills/ui-skills-root/SKILL.md +9 -0
  499. package/.agents/skills/ui-ux-pro-max/SKILL.md +9 -0
  500. package/.agents/skills/ui-ux-researcher/SKILL.md +8 -0
  501. package/.agents/skills/vector-search-pgvector/SKILL.md +10 -0
  502. package/.agents/skills/verification-before-completion/SKILL.md +9 -0
  503. package/.agents/skills/vue-expert/SKILL.md +9 -0
  504. package/.agents/skills/vulnerability-scanner/SKILL.md +9 -0
  505. package/.agents/skills/web-accessibility-auditor/SKILL.md +16 -0
  506. package/.agents/skills/web-design-guidelines/SKILL.md +9 -0
  507. package/.agents/skills/web-quality-audit/SKILL.md +10 -0
  508. package/.agents/skills/webapp-testing/SKILL.md +8 -0
  509. package/.agents/skills/webgpu-performance/SKILL.md +9 -0
  510. package/.agents/skills/whimsy-injector/SKILL.md +9 -0
  511. package/.agents/skills/workflow-optimizer/SKILL.md +9 -0
  512. package/.agents/skills/zero-trust-passkeys/SKILL.md +10 -0
  513. package/README.md +4 -4
  514. package/bin/adapter-install.js +1 -1
  515. package/bin/mcp-server.js +249 -0
  516. package/package.json +12 -8
  517. package/plugins/core-plugin.json +1 -1
  518. package/plugins/gemini/extension.json +1 -1
  519. package/skills/12-principles-of-animation/SKILL.md +9 -0
  520. package/skills/60fps-animation/SKILL.md +14 -0
  521. package/skills/accessible-animation/SKILL.md +9 -0
  522. package/skills/adapt/SKILL.md +8 -0
  523. package/skills/adr-generation/SKILL.md +9 -0
  524. package/skills/advanced-rag-pipelines/SKILL.md +9 -0
  525. package/skills/agent-organizer/SKILL.md +8 -0
  526. package/skills/agent-syscall-guidelines/SKILL.md +10 -0
  527. package/skills/agentic-patterns/SKILL.md +9 -0
  528. package/skills/agentic-workflows-2026/SKILL.md +8 -0
  529. package/skills/agentshield-security/SKILL.md +16 -0
  530. package/skills/ai-app-hardening/SKILL.md +7 -0
  531. package/skills/ai-prompt-injection-defense/SKILL.md +9 -0
  532. package/skills/animation-on-scroll/SKILL.md +9 -0
  533. package/skills/animation-systems/SKILL.md +8 -0
  534. package/skills/antfu-conventions/SKILL.md +9 -0
  535. package/skills/anti-slop-enforcement/SKILL.md +11 -0
  536. package/skills/api-patterns/SKILL.md +9 -0
  537. package/skills/api-security-auditor/SKILL.md +10 -0
  538. package/skills/app-builder/SKILL.md +8 -0
  539. package/skills/appflow-wireframe/SKILL.md +9 -0
  540. package/skills/apple-design/SKILL.md +8 -0
  541. package/skills/architecture/SKILL.md +8 -0
  542. package/skills/architecture-drift/SKILL.md +9 -0
  543. package/skills/architecture-intelligence/SKILL.md +17 -0
  544. package/skills/audit-and-fix/SKILL.md +8 -0
  545. package/skills/authentication-best-practices/SKILL.md +10 -0
  546. package/skills/autonomous-execution/SKILL.md +9 -0
  547. package/skills/backend-alembic/SKILL.md +16 -0
  548. package/skills/backend-architecture-auditor/SKILL.md +16 -0
  549. package/skills/backend-mongodb/SKILL.md +10 -0
  550. package/skills/backend-mysql/SKILL.md +16 -0
  551. package/skills/backend-performance-auditor/SKILL.md +10 -0
  552. package/skills/backend-postgresql/SKILL.md +10 -0
  553. package/skills/backend-redis/SKILL.md +10 -0
  554. package/skills/backend-security-expert/SKILL.md +10 -0
  555. package/skills/backend-sqlalchemy/SKILL.md +10 -0
  556. package/skills/backend-sqlite/SKILL.md +10 -0
  557. package/skills/backend-testing-auditor/SKILL.md +15 -0
  558. package/skills/baseline-ui/SKILL.md +8 -0
  559. package/skills/bash-linux/SKILL.md +9 -0
  560. package/skills/behavioral-modes/SKILL.md +9 -0
  561. package/skills/better-colors/SKILL.md +9 -0
  562. package/skills/better-typography/SKILL.md +9 -0
  563. package/skills/better-ui/SKILL.md +8 -0
  564. package/skills/bolder/SKILL.md +8 -0
  565. package/skills/brainstorming/SKILL.md +8 -0
  566. package/skills/browser-audit/SKILL.md +9 -0
  567. package/skills/browser-native-ai/SKILL.md +8 -0
  568. package/skills/build-primitive/SKILL.md +8 -0
  569. package/skills/building-native-ui/SKILL.md +7 -0
  570. package/skills/cicd-pro/SKILL.md +9 -0
  571. package/skills/clarify/SKILL.md +8 -0
  572. package/skills/clean-code/SKILL.md +8 -0
  573. package/skills/cloud-architect/SKILL.md +8 -0
  574. package/skills/cobejs/SKILL.md +8 -0
  575. package/skills/code-review-checklist/SKILL.md +9 -0
  576. package/skills/codebase-design/SKILL.md +14 -0
  577. package/skills/colorize/SKILL.md +8 -0
  578. package/skills/compact-landing/SKILL.md +9 -0
  579. package/skills/company-logos/SKILL.md +9 -0
  580. package/skills/config-validator/SKILL.md +9 -0
  581. package/skills/containerization-pro/SKILL.md +9 -0
  582. package/skills/context-engineering-pro/SKILL.md +10 -0
  583. package/skills/create-design-md/SKILL.md +7 -0
  584. package/skills/critique/SKILL.md +8 -0
  585. package/skills/csharp-developer/SKILL.md +9 -0
  586. package/skills/data-validation-schemas/SKILL.md +8 -0
  587. package/skills/database-design/SKILL.md +8 -0
  588. package/skills/delight/SKILL.md +8 -0
  589. package/skills/deployment-procedures/SKILL.md +9 -0
  590. package/skills/design-lab/SKILL.md +8 -0
  591. package/skills/devops-engineer/SKILL.md +9 -0
  592. package/skills/devops-incident-responder/SKILL.md +16 -0
  593. package/skills/diagnosing-bugs/SKILL.md +9 -0
  594. package/skills/distill/SKILL.md +8 -0
  595. package/skills/documentation-templates/SKILL.md +9 -0
  596. package/skills/domain-modeling/SKILL.md +9 -0
  597. package/skills/duckdb-analytical-sql/SKILL.md +10 -0
  598. package/skills/edge-ai-mobile/SKILL.md +8 -0
  599. package/skills/edge-computing/SKILL.md +9 -0
  600. package/skills/emil-design-eng/SKILL.md +9 -0
  601. package/skills/error-resilience/SKILL.md +8 -0
  602. package/skills/expo-router-v4/SKILL.md +9 -0
  603. package/skills/extract-design-system/SKILL.md +9 -0
  604. package/skills/fabel-protocol/SKILL.md +9 -0
  605. package/skills/failure-mode-analysis/SKILL.md +10 -0
  606. package/skills/fastapi-pro/SKILL.md +9 -0
  607. package/skills/fixing-accessibility/SKILL.md +9 -0
  608. package/skills/fixing-metadata/SKILL.md +9 -0
  609. package/skills/fixing-motion-performance/SKILL.md +9 -0
  610. package/skills/framer-motion-expert/SKILL.md +9 -0
  611. package/skills/frontend-design/SKILL.md +7 -0
  612. package/skills/frontend-security-expert/SKILL.md +9 -0
  613. package/skills/game-design-expert/SKILL.md +9 -0
  614. package/skills/game-engineering-expert/SKILL.md +16 -0
  615. package/skills/generative-ui-expert/SKILL.md +9 -0
  616. package/skills/geo-fundamentals/SKILL.md +9 -0
  617. package/skills/git-pro/SKILL.md +9 -0
  618. package/skills/github-operations/SKILL.md +9 -0
  619. package/skills/gpt-taste/SKILL.md +9 -0
  620. package/skills/graph-engineering/SKILL.md +16 -0
  621. package/skills/gsap-core/SKILL.md +9 -0
  622. package/skills/gsap-frameworks/SKILL.md +9 -0
  623. package/skills/gsap-performance/SKILL.md +9 -0
  624. package/skills/gsap-plugins/SKILL.md +9 -0
  625. package/skills/gsap-react/SKILL.md +9 -0
  626. package/skills/gsap-scrolltrigger/SKILL.md +9 -0
  627. package/skills/gsap-timeline/SKILL.md +9 -0
  628. package/skills/gsap-utils/SKILL.md +9 -0
  629. package/skills/harden/SKILL.md +8 -0
  630. package/skills/harness-protocol/SKILL.md +9 -0
  631. package/skills/hf-cli/SKILL.md +11 -0
  632. package/skills/hf-cloud-aws-context-discovery/SKILL.md +10 -0
  633. package/skills/hf-cloud-python-env-setup/SKILL.md +10 -0
  634. package/skills/hf-cloud-sagemaker-deployment-planner/SKILL.md +10 -0
  635. package/skills/hf-cloud-sagemaker-iam-preflight/SKILL.md +10 -0
  636. package/skills/hf-cloud-sagemaker-production-defaults/SKILL.md +10 -0
  637. package/skills/hf-cloud-serving-image-selection/SKILL.md +10 -0
  638. package/skills/hf-mem/SKILL.md +11 -0
  639. package/skills/huggingface-best/SKILL.md +9 -0
  640. package/skills/huggingface-community-evals/SKILL.md +11 -0
  641. package/skills/huggingface-datasets/SKILL.md +10 -0
  642. package/skills/huggingface-gradio/SKILL.md +10 -0
  643. package/skills/huggingface-llm-trainer/SKILL.md +10 -0
  644. package/skills/huggingface-local-models/SKILL.md +10 -0
  645. package/skills/huggingface-lora-space-builder/SKILL.md +11 -0
  646. package/skills/huggingface-paper-publisher/SKILL.md +11 -0
  647. package/skills/huggingface-papers/SKILL.md +11 -0
  648. package/skills/huggingface-spaces/SKILL.md +10 -0
  649. package/skills/huggingface-tool-builder/SKILL.md +11 -0
  650. package/skills/huggingface-trackio/SKILL.md +11 -0
  651. package/skills/huggingface-vision-trainer/SKILL.md +11 -0
  652. package/skills/huggingface-zerogpu/SKILL.md +11 -0
  653. package/skills/human-gate-negotiation/SKILL.md +11 -0
  654. package/skills/i18n-localization/SKILL.md +9 -0
  655. package/skills/impeccable/SKILL.md +8 -0
  656. package/skills/improve-codebase-architecture/SKILL.md +10 -0
  657. package/skills/improve-ui/SKILL.md +8 -0
  658. package/skills/intelligent-routing/SKILL.md +9 -0
  659. package/skills/knowledge-graph/SKILL.md +9 -0
  660. package/skills/landing-page/SKILL.md +9 -0
  661. package/skills/lint-and-validate/SKILL.md +9 -0
  662. package/skills/llm-engineering/SKILL.md +9 -0
  663. package/skills/local-first/SKILL.md +10 -0
  664. package/skills/lottie-animation/SKILL.md +9 -0
  665. package/skills/marquee-loop/SKILL.md +9 -0
  666. package/skills/masked-reveal/SKILL.md +9 -0
  667. package/skills/mcp-builder/SKILL.md +9 -0
  668. package/skills/micro-interaction/SKILL.md +9 -0
  669. package/skills/mobile-design/SKILL.md +7 -0
  670. package/skills/monorepo-management/SKILL.md +9 -0
  671. package/skills/morphing-icons/SKILL.md +9 -0
  672. package/skills/motion-engineering/SKILL.md +8 -0
  673. package/skills/nextjs-react-expert/SKILL.md +10 -0
  674. package/skills/nodejs-best-practices/SKILL.md +16 -0
  675. package/skills/observability/SKILL.md +8 -0
  676. package/skills/opentelemetry-observability/SKILL.md +9 -0
  677. package/skills/page-transition-animation/SKILL.md +10 -0
  678. package/skills/parallel-agents/SKILL.md +15 -0
  679. package/skills/performance-profiling/SKILL.md +9 -0
  680. package/skills/plan-writing/SKILL.md +8 -0
  681. package/skills/platform-engineer/SKILL.md +9 -0
  682. package/skills/platform-engineering-opentofu/SKILL.md +10 -0
  683. package/skills/playwright-ai-e2e/SKILL.md +9 -0
  684. package/skills/playwright-best-practices/SKILL.md +16 -0
  685. package/skills/polish/SKILL.md +8 -0
  686. package/skills/powershell-windows/SKILL.md +9 -0
  687. package/skills/pricing-page/SKILL.md +9 -0
  688. package/skills/product-aware-heuristics/SKILL.md +10 -0
  689. package/skills/progressive-blur/SKILL.md +9 -0
  690. package/skills/project-idioms/SKILL.md +8 -0
  691. package/skills/property-based-testing/SKILL.md +9 -0
  692. package/skills/python-patterns/SKILL.md +9 -0
  693. package/skills/python-pro/SKILL.md +9 -0
  694. package/skills/quieter/SKILL.md +8 -0
  695. package/skills/react-doctor/SKILL.md +9 -0
  696. package/skills/react-specialist/SKILL.md +9 -0
  697. package/skills/readme-builder/SKILL.md +9 -0
  698. package/skills/realtime-patterns/SKILL.md +9 -0
  699. package/skills/red-team-tactics/SKILL.md +16 -0
  700. package/skills/redesign-skill/SKILL.md +9 -0
  701. package/skills/review-animations/SKILL.md +8 -0
  702. package/skills/rust-pro/SKILL.md +9 -0
  703. package/skills/semantic-filesystem-navigation/SKILL.md +11 -0
  704. package/skills/seo-fundamentals/SKILL.md +9 -0
  705. package/skills/server-management/SKILL.md +8 -0
  706. package/skills/session-log-interrogation/SKILL.md +11 -0
  707. package/skills/shadcn-ui-expert/SKILL.md +9 -0
  708. package/skills/shape/SKILL.md +8 -0
  709. package/skills/skill-creator/SKILL.md +9 -0
  710. package/skills/soft-skill/SKILL.md +9 -0
  711. package/skills/sounds-on-the-web/SKILL.md +9 -0
  712. package/skills/sql-pro/SKILL.md +9 -0
  713. package/skills/subagent-driven-development/SKILL.md +11 -0
  714. package/skills/supabase-postgres-best-practices/SKILL.md +17 -0
  715. package/skills/svg-animation/SKILL.md +9 -0
  716. package/skills/swiftui-expert/SKILL.md +9 -0
  717. package/skills/swiss-design/SKILL.md +8 -0
  718. package/skills/system-design-pro/SKILL.md +9 -0
  719. package/skills/systematic-debugging/SKILL.md +14 -0
  720. package/skills/tailwind-patterns/SKILL.md +9 -0
  721. package/skills/taste-skill/SKILL.md +9 -0
  722. package/skills/tdd-workflow/SKILL.md +9 -0
  723. package/skills/test-result-analyzer/SKILL.md +9 -0
  724. package/skills/testing-patterns/SKILL.md +8 -0
  725. package/skills/thermo-nuclear-code-quality-review/SKILL.md +11 -0
  726. package/skills/thinking-protocol/SKILL.md +10 -0
  727. package/skills/to-spring-or-not-to-spring/SKILL.md +9 -0
  728. package/skills/train-sentence-transformers/SKILL.md +10 -0
  729. package/skills/transformers-js/SKILL.md +8 -0
  730. package/skills/transitions-dev/SKILL.md +8 -0
  731. package/skills/trend-researcher/SKILL.md +9 -0
  732. package/skills/tribunal-instincts-memory/SKILL.md +11 -0
  733. package/skills/trl-training/SKILL.md +9 -0
  734. package/skills/typescript-advanced/SKILL.md +9 -0
  735. package/skills/typeset/SKILL.md +8 -0
  736. package/skills/ui-reasoning-engine/SKILL.md +9 -0
  737. package/skills/ui-skill-packs/SKILL.md +9 -0
  738. package/skills/ui-skills-root/SKILL.md +9 -0
  739. package/skills/ui-ux-pro-max/SKILL.md +9 -0
  740. package/skills/ui-ux-researcher/SKILL.md +8 -0
  741. package/skills/vector-search-pgvector/SKILL.md +10 -0
  742. package/skills/verification-before-completion/SKILL.md +9 -0
  743. package/skills/vue-expert/SKILL.md +9 -0
  744. package/skills/vulnerability-scanner/SKILL.md +9 -0
  745. package/skills/web-accessibility-auditor/SKILL.md +16 -0
  746. package/skills/web-design-guidelines/SKILL.md +9 -0
  747. package/skills/web-quality-audit/SKILL.md +10 -0
  748. package/skills/webapp-testing/SKILL.md +8 -0
  749. package/skills/webgpu-performance/SKILL.md +9 -0
  750. package/skills/whimsy-injector/SKILL.md +9 -0
  751. package/skills/workflow-optimizer/SKILL.md +9 -0
  752. package/skills/zero-trust-passkeys/SKILL.md +10 -0
  753. package/src/cli.js +18 -0
  754. package/src/commands/init.js +538 -462
  755. package/src/commands/intelligence.js +86 -0
  756. package/src/commands/review.js +235 -1
  757. package/src/commands/system1.js +562 -413
  758. package/src/evaluation/evaluation_runner.js +207 -0
  759. package/src/evaluation/scenario_registry.js +82 -0
  760. package/src/execution/agent_correction_engine.js +76 -0
  761. package/src/execution/controlled_write_service.js +301 -0
  762. package/src/execution/correction_run_engine.js +234 -0
  763. package/src/execution/correction_verifier.js +85 -0
  764. package/src/execution/evidence_aggregator.js +54 -0
  765. package/src/execution/finding_diff_engine.js +59 -0
  766. package/src/execution/index.js +42 -0
  767. package/src/execution/prompt_isolator.js +145 -0
  768. package/src/execution/provider_adapter.js +495 -0
  769. package/src/execution/resolution_certificate.js +53 -0
  770. package/src/execution/resolution_policy.js +70 -0
  771. package/src/execution/review_executor.js +335 -0
  772. package/src/execution/reviewer_registry.js +137 -0
  773. package/src/execution/schemas.js +298 -0
  774. package/src/execution/transaction_manager.js +237 -0
  775. package/src/execution/validation_runner.js +174 -0
  776. package/src/execution/verdict_aggregator.js +181 -0
  777. package/src/execution/write_policy_engine.js +95 -0
  778. package/src/intelligence/adaptive_correction.js +72 -0
  779. package/src/intelligence/adaptive_reviewer_orchestrator.js +123 -0
  780. package/src/intelligence/case_indexer.js +166 -0
  781. package/src/intelligence/case_memory.js +149 -0
  782. package/src/intelligence/case_similarity.js +86 -0
  783. package/src/intelligence/cbr_engine.js +90 -0
  784. package/src/intelligence/evidence_optimization.js +106 -0
  785. package/src/intelligence/failure_intelligence.js +95 -0
  786. package/src/intelligence/governance_drift_detector.js +75 -0
  787. package/src/intelligence/governance_simulator.js +115 -0
  788. package/src/intelligence/human_intelligence.js +46 -0
  789. package/src/intelligence/mcp_tools.js +87 -0
  790. package/src/intelligence/reviewer_performance.js +94 -0
  791. package/src/intelligence/risk_prediction_engine.js +92 -0
  792. package/src/intelligence/token_intelligence.js +73 -0
  793. package/src/tui/banner.js +26 -47
  794. package/src/tui/index.js +4 -0
  795. package/src/tui/panel.js +55 -0
  796. package/src/tui/progress.js +42 -0
  797. package/src/tui/reviewer-grid.js +9 -10
  798. package/src/tui/theme.js +59 -16
  799. package/src/tui/tree.js +57 -29
  800. package/src/tui/wizard.js +22 -18
  801. package/.agent/skills/local-first-architecture/SKILL.md +0 -123
@@ -1,792 +1,792 @@
1
- #!/usr/bin/env node
2
- /**
3
- * architecture_extractor.js — Tribunal Architecture Fact Extractor
4
- * ═════════════════════════════════════════════════════════════════════════════
5
- * Deterministic static analysis engine that extracts the full Tribunal
6
- * Architectural Fact Model (TAFM) directly from repository source code.
7
- *
8
- * Extracts:
9
- * - Services, Modules, and Entry Points
10
- * - HTTP / API Endpoints (Express, Next.js, Fastify, Hono, Koa)
11
- * - Data Stores & Queries (Prisma, Drizzle, Mongoose, Sequelize, Raw SQL, Redis)
12
- * - Message Queues & Events (BullMQ, RabbitMQ, Kafka, EventEmitters)
13
- * - External Services (fetch, axios, Stripe, AWS SDK, Firebase, SendGrid)
14
- * - Authentication Boundaries (JWT, next-auth, Passport, Clerk, bcrypt)
15
- * - Call-graphs, Failure Modes (try/catch, timeouts, retries), and Trust Zones
16
- *
17
- * Emits: .agent/history/architecture-model.json with verifiable provenance & L1-L3 confidence.
18
- * Zero external dependencies.
19
- */
20
-
21
- 'use strict';
22
-
23
- const fs = require('fs');
24
- const path = require('path');
25
- const crypto = require('crypto');
26
- const { GREEN, CYAN, BOLD, DIM, RESET, BOX, banner, timer, formatMs } = require('./_colors');
27
-
28
- // ── Default Exclusions ────────────────────────────────────────────────────────
29
- const EXCLUDED_DIRS = new Set([
30
- 'node_modules',
31
- '.git',
32
- '.next',
33
- 'dist',
34
- 'build',
35
- 'coverage',
36
- '.agent',
37
- '.agents',
38
- 'archify',
39
- 'artifacts',
40
- 'target',
41
- ]);
42
-
43
- const SUPPORTED_EXTS = new Set(['.js', '.jsx', '.ts', '.tsx', '.mjs', '.cjs', '.py', '.go', '.rs']);
44
-
45
- // ── Helpers ───────────────────────────────────────────────────────────────────
46
- function getSha256(content) {
47
- return crypto.createHash('sha256').update(content).digest('hex');
48
- }
49
-
50
- function normalizePosixPath(filePath) {
51
- return filePath.replace(/\\/g, '/');
52
- }
53
-
54
- function walkRepository(dir, rootDir = dir, results = []) {
55
- if (!fs.existsSync(dir)) return results;
56
- let entries;
57
- try {
58
- entries = fs.readdirSync(dir, { withFileTypes: true });
59
- } catch (_e) {
60
- return results;
61
- }
62
-
63
- for (const entry of entries) {
64
- const fullPath = path.join(dir, entry.name);
65
- const relPath = normalizePosixPath(path.relative(rootDir, fullPath));
66
-
67
- if (entry.isDirectory()) {
68
- if (!EXCLUDED_DIRS.has(entry.name) && !entry.name.startsWith('.')) {
69
- walkRepository(fullPath, rootDir, results);
70
- }
71
- } else if (entry.isFile()) {
72
- const ext = path.extname(entry.name).toLowerCase();
73
- if (SUPPORTED_EXTS.has(ext)) {
74
- results.push({ fullPath, relPath, ext });
75
- }
76
- }
77
- }
78
- return results;
79
- }
80
-
81
- // ── Extraction Patterns ───────────────────────────────────────────────────────
82
- const ROUTE_DETECTORS = [
83
- {
84
- regex: /(?:app|router|server)\.(get|post|put|patch|delete|all)\s*\(\s*['"`]([^'"`]+)['"`]/gi,
85
- framework: 'express_or_fastify',
86
- },
87
- {
88
- regex: /export\s+(?:async\s+)?function\s+(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\s*\(/g,
89
- framework: 'nextjs_app_router',
90
- },
91
- {
92
- regex: /\.(get|post|put|patch|delete)\s*\(\s*['"`](\/[^'"`]*)['"`]/gi,
93
- framework: 'hono_or_elysia',
94
- },
95
- ];
96
-
97
- const DATASTORE_DETECTORS = [
98
- {
99
- regex:
100
- /prisma\.(\w+)\.(findMany|findUnique|findFirst|create|update|delete|upsert|aggregate|groupBy|count)\s*\(/g,
101
- engine: 'postgres_prisma',
102
- kind: 'datastore',
103
- },
104
- {
105
- regex: /(?:db|drizzle)\.(select|insert|update|delete)\s*\(/g,
106
- engine: 'sql_drizzle',
107
- kind: 'datastore',
108
- },
109
- {
110
- regex:
111
- /\.(query|execute|raw|sql)\s*\(\s*['"`]?\s*(SELECT|INSERT|UPDATE|DELETE|CREATE|ALTER|DROP|TRUNCATE)/gi,
112
- engine: 'raw_sql',
113
- kind: 'datastore',
114
- },
115
- {
116
- regex: /(?:redis|ioredis|createClient)\s*\(/gi,
117
- engine: 'redis_cache',
118
- kind: 'cache',
119
- },
120
- {
121
- regex:
122
- /(?:redis|client|redisClient|kv)\.(?:get|set|del|hget|hset|expire|incr|lpush|rpush|publish|subscribe)\s*\(|\.(?:hget|hset|expire|incr|lpush|rpush)\s*\(/g,
123
- engine: 'redis_ops',
124
- kind: 'cache',
125
- },
126
- ];
127
-
128
- const QUEUE_DETECTORS = [
129
- {
130
- regex: /new\s+(?:Queue|Worker|QueueScheduler)\s*\(\s*['"`](\w+)['"`]/g,
131
- engine: 'bullmq',
132
- kind: 'queue',
133
- },
134
- {
135
- regex: /(?:amqplib|amqp\.connect)\s*\(/g,
136
- engine: 'rabbitmq',
137
- kind: 'queue',
138
- },
139
- {
140
- regex: /new\s+Kafka\s*\(/g,
141
- engine: 'kafka',
142
- kind: 'queue',
143
- },
144
- {
145
- regex: /\.(?:emit|on|once)\s*\(\s*['"`]([\w:.-]+)['"`]/g,
146
- engine: 'event_emitter',
147
- kind: 'event_bus',
148
- },
149
- ];
150
-
151
- const EXTERNAL_SERVICE_DETECTORS = [
152
- {
153
- regex: /(?:fetch|axios|got|ky|ofetch)\s*\(\s*['"`]?(https?:\/\/[^'"`\s,)]+)/gi,
154
- type: 'http_client',
155
- },
156
- {
157
- regex: /new\s+(?:AWS\.)?(?:S3|DynamoDB|SQS|SNS|Lambda|SES|CloudWatch)\s*\(/g,
158
- type: 'aws_sdk',
159
- },
160
- {
161
- regex: /@aws-sdk\/client-(\w+)/g,
162
- type: 'aws_sdk',
163
- },
164
- {
165
- regex: /(?:stripe|Stripe)\s*\(/g,
166
- type: 'stripe_payments',
167
- },
168
- {
169
- regex: /(?:sendgrid|twilio|resend)\s*/gi,
170
- type: 'messaging_saas',
171
- },
172
- ];
173
-
174
- const AUTH_DETECTORS = [
175
- {
176
- regex: /(?:jwt|jsonwebtoken)\.(?:sign|verify|decode)\s*\(/g,
177
- authKind: 'jwt',
178
- },
179
- {
180
- regex: /(?:NextAuth|getServerSession|auth\(\)|getSession)\s*\(/g,
181
- authKind: 'next_auth',
182
- },
183
- {
184
- regex: /passport\.(?:authenticate|use|initialize)\s*\(/g,
185
- authKind: 'passport',
186
- },
187
- {
188
- regex: /(?:bcrypt|argon2)\.(?:hash|compare|verify)\s*\(/g,
189
- authKind: 'password_hashing',
190
- },
191
- {
192
- regex: /(?:clerkMiddleware|currentUser|ClerkProvider)\s*/g,
193
- authKind: 'clerk',
194
- },
195
- ];
196
-
197
- const IMPORT_DETECTOR =
198
- /(?:import\s+(?:[\w*\s{},]+)\s+from\s+['"`]([^'"`]+)['"`]|require\s*\(\s*['"`]([^'"`]+)['"`]\))/g;
199
-
200
- // ── Architecture Extractor Class ──────────────────────────────────────────────
201
- class ArchitectureExtractor {
202
- constructor(repoRoot = process.cwd()) {
203
- this.repoRoot = path.resolve(repoRoot);
204
- this.entities = new Map();
205
- this.relations = new Map();
206
- this.trustBoundaries = new Map();
207
- this.failurePaths = [];
208
- this.contradictions = [];
209
- }
210
-
211
- registerEntity(entity) {
212
- if (!this.entities.has(entity.id)) {
213
- this.entities.set(entity.id, entity);
214
- } else {
215
- const existing = this.entities.get(entity.id);
216
- if (entity.sources && entity.sources.length) {
217
- existing.sources = [...(existing.sources || []), ...entity.sources];
218
- }
219
- }
220
- return this.entities.get(entity.id);
221
- }
222
-
223
- registerRelation(relation) {
224
- const key = `${relation.sourceId}->${relation.targetId}:${relation.relationType}`;
225
- if (!this.relations.has(key)) {
226
- this.relations.set(key, {
227
- id: `rel.${crypto.createHash('md5').update(key).digest('hex').slice(0, 10)}`,
228
- ...relation,
229
- });
230
- } else {
231
- const existing = this.relations.get(key);
232
- if (relation.evidence) {
233
- existing.evidence = [...(existing.evidence || []), ...relation.evidence];
234
- }
235
- }
236
- return this.relations.get(key);
237
- }
238
-
239
- scan() {
240
- const files = walkRepository(this.repoRoot, this.repoRoot);
241
-
242
- // Initialize Default Trust Zones
243
- this.initDefaultTrustBoundaries();
244
-
245
- // Pass 1: Extract module entities and file contents
246
- const fileDataMap = new Map();
247
- for (const file of files) {
248
- let content;
249
- try {
250
- content = fs.readFileSync(file.fullPath, 'utf8');
251
- } catch (_e) {
252
- continue;
253
- }
254
- const lines = content.split('\n');
255
- const hash = getSha256(content);
256
- fileDataMap.set(file.relPath, { ...file, content, lines, hash });
257
-
258
- // Register Module Entity
259
- const entityId = `mod.${file.relPath.replace(/[^a-zA-Z0-9_.-]/g, '_')}`;
260
- const isTest = file.relPath.includes('test') || file.relPath.includes('spec');
261
- const isRoute =
262
- file.relPath.includes('route') ||
263
- file.relPath.includes('api') ||
264
- file.relPath.includes('controllers');
265
- const isSkill =
266
- file.relPath.startsWith('skills/') || file.relPath.startsWith('.agents/skills/');
267
-
268
- this.registerEntity({
269
- id: entityId,
270
- kind: isRoute ? 'endpoint' : isTest ? 'test_suite' : 'module',
271
- name: path.basename(file.relPath),
272
- scope: path.dirname(file.relPath),
273
- role: isSkill
274
- ? 'Skill Template / Resource'
275
- : isRoute
276
- ? 'API Route Handler'
277
- : isTest
278
- ? 'Test Suite'
279
- : 'Internal Component',
280
- tags: [
281
- isTest ? 'test' : isSkill ? 'skill' : 'core',
282
- path.extname(file.relPath).replace('.', ''),
283
- ],
284
- trustZone: isRoute ? 'dmz_gateway' : 'internal_service',
285
- sources: [
286
- {
287
- file: file.relPath,
288
- startLine: 1,
289
- endLine: Math.min(lines.length, 50),
290
- contentHash: hash.substring(0, 16),
291
- extractionMethod: 'ast_visitor',
292
- confidence: 'L1',
293
- verified: true,
294
- verifiedAt: new Date().toISOString(),
295
- },
296
- ],
297
- blastRadius: { directDependents: 0, transitiveDependents: 0, riskScore: 0.1 },
298
- confidence: 'L1',
299
- temporalState: 'current',
300
- });
301
- }
302
-
303
- // Pass 2: Extract Architectural Features & Relationships
304
- for (const [relPath, fileInfo] of fileDataMap.entries()) {
305
- const sourceEntityId = `mod.${relPath.replace(/[^a-zA-Z0-9_.-]/g, '_')}`;
306
- const { content, lines } = fileInfo;
307
-
308
- // 1. Analyze Imports & Internal Call Dependencies
309
- IMPORT_DETECTOR.lastIndex = 0;
310
- let impMatch;
311
- while ((impMatch = IMPORT_DETECTOR.exec(content)) !== null) {
312
- const importTarget = impMatch[1] || impMatch[2];
313
- if (importTarget && importTarget.startsWith('.')) {
314
- // Local import
315
- const resolvedRel = normalizePosixPath(
316
- path.relative(
317
- this.repoRoot,
318
- path.resolve(path.dirname(fileInfo.fullPath), importTarget),
319
- ),
320
- );
321
- // Try finding matching file
322
- const targetKey = Array.from(fileDataMap.keys()).find(
323
- k =>
324
- k === resolvedRel ||
325
- k.startsWith(resolvedRel + '.') ||
326
- k === resolvedRel + '/index.js' ||
327
- k === resolvedRel + '/index.ts',
328
- );
329
-
330
- if (targetKey) {
331
- const targetEntityId = `mod.${targetKey.replace(/[^a-zA-Z0-9_.-]/g, '_')}`;
332
- const lineNum = content.slice(0, impMatch.index).split('\n').length;
333
- this.registerRelation({
334
- sourceId: sourceEntityId,
335
- targetId: targetEntityId,
336
- relationType: 'imports',
337
- protocol: 'In-Memory Module',
338
- evidence: [
339
- {
340
- file: relPath,
341
- startLine: lineNum,
342
- endLine: lineNum,
343
- symbol: importTarget,
344
- snippet: lines[lineNum - 1]?.trim(),
345
- contentHash: getSha256(lines[lineNum - 1] || '').substring(0, 16),
346
- extractionMethod: 'ast_visitor',
347
- confidence: 'L1',
348
- verified: true,
349
- verifiedAt: new Date().toISOString(),
350
- },
351
- ],
352
- confidence: 'L1',
353
- });
354
- }
355
- }
356
- }
357
-
358
- // 2. Analyze API Routes (JS/TS web endpoints)
359
- if (['.js', '.jsx', '.ts', '.tsx', '.mjs', '.cjs'].includes(fileInfo.ext)) {
360
- for (const detector of ROUTE_DETECTORS) {
361
- detector.regex.lastIndex = 0;
362
- let routeMatch;
363
- while ((routeMatch = detector.regex.exec(content)) !== null) {
364
- const method = routeMatch[1]?.toUpperCase() || 'GET';
365
- const endpointPath =
366
- routeMatch[2] || `/${relPath.replace(/^src\//, '').replace(/\.[^.]+$/, '')}`;
367
- const lineNum = content.slice(0, routeMatch.index).split('\n').length;
368
-
369
- const endpointEntityId = `endpoint.${method.toLowerCase()}.${endpointPath.replace(/[^a-zA-Z0-9_.-]/g, '_')}`;
370
- this.registerEntity({
371
- id: endpointEntityId,
372
- kind: 'endpoint',
373
- name: `${method} ${endpointPath}`,
374
- scope: relPath,
375
- role: `Public/Internal Endpoint (${detector.framework})`,
376
- tags: ['api', method.toLowerCase()],
377
- trustZone: 'dmz_gateway',
378
- sources: [
379
- {
380
- file: relPath,
381
- startLine: lineNum,
382
- endLine: Math.min(lineNum + 10, lines.length),
383
- snippet: lines[lineNum - 1]?.trim(),
384
- contentHash: getSha256(lines[lineNum - 1] || '').substring(0, 16),
385
- extractionMethod: 'ast_visitor',
386
- confidence: 'L1',
387
- verified: true,
388
- verifiedAt: new Date().toISOString(),
389
- },
390
- ],
391
- blastRadius: { directDependents: 0, transitiveDependents: 0, riskScore: 0.2 },
392
- confidence: 'L1',
393
- temporalState: 'current',
394
- });
395
-
396
- this.registerRelation({
397
- sourceId: endpointEntityId,
398
- targetId: sourceEntityId,
399
- relationType: 'routes_to',
400
- protocol: 'HTTP',
401
- evidence: [
402
- {
403
- file: relPath,
404
- startLine: lineNum,
405
- endLine: lineNum,
406
- snippet: lines[lineNum - 1]?.trim(),
407
- contentHash: getSha256(lines[lineNum - 1] || '').substring(0, 16),
408
- extractionMethod: 'ast_visitor',
409
- confidence: 'L1',
410
- verified: true,
411
- verifiedAt: new Date().toISOString(),
412
- },
413
- ],
414
- confidence: 'L1',
415
- });
416
- }
417
- }
418
- }
419
-
420
- // 3. Analyze Data Stores (Prisma, SQL, Redis)
421
- for (const detector of DATASTORE_DETECTORS) {
422
- detector.regex.lastIndex = 0;
423
- let dbMatch;
424
- while ((dbMatch = detector.regex.exec(content)) !== null) {
425
- const lineNum = content.slice(0, dbMatch.index).split('\n').length;
426
- const storeId = `datastore.${detector.engine}`;
427
-
428
- this.registerEntity({
429
- id: storeId,
430
- kind: detector.kind === 'cache' ? 'cache' : 'datastore',
431
- name: detector.engine.toUpperCase(),
432
- scope: 'storage',
433
- role: `${detector.kind === 'cache' ? 'Ephemeral In-Memory Cache' : 'Persistent Relational/NoSQL Database'}`,
434
- tags: ['persistence', detector.engine],
435
- trustZone: 'isolated_datastore',
436
- sources: [
437
- {
438
- file: relPath,
439
- startLine: lineNum,
440
- endLine: lineNum,
441
- snippet: lines[lineNum - 1]?.trim(),
442
- contentHash: getSha256(lines[lineNum - 1] || '').substring(0, 16),
443
- extractionMethod: 'ast_visitor',
444
- confidence: 'L1',
445
- verified: true,
446
- verifiedAt: new Date().toISOString(),
447
- },
448
- ],
449
- blastRadius: { directDependents: 0, transitiveDependents: 0, riskScore: 0.7 },
450
- confidence: 'L1',
451
- temporalState: 'current',
452
- });
453
-
454
- this.registerRelation({
455
- sourceId: sourceEntityId,
456
- targetId: storeId,
457
- relationType: detector.kind === 'cache' ? 'reads' : 'writes',
458
- protocol: detector.engine.includes('redis') ? 'Redis-RESP' : 'SQL-Wire',
459
- evidence: [
460
- {
461
- file: relPath,
462
- startLine: lineNum,
463
- endLine: lineNum,
464
- snippet: lines[lineNum - 1]?.trim(),
465
- contentHash: getSha256(lines[lineNum - 1] || '').substring(0, 16),
466
- extractionMethod: 'ast_visitor',
467
- confidence: 'L1',
468
- verified: true,
469
- verifiedAt: new Date().toISOString(),
470
- },
471
- ],
472
- confidence: 'L1',
473
- });
474
- }
475
- }
476
-
477
- // 4. Analyze Message Queues & Event Busses
478
- for (const detector of QUEUE_DETECTORS) {
479
- detector.regex.lastIndex = 0;
480
- let qMatch;
481
- while ((qMatch = detector.regex.exec(content)) !== null) {
482
- const queueName = qMatch[1] || detector.engine;
483
- const lineNum = content.slice(0, qMatch.index).split('\n').length;
484
- const qEntityId = `queue.${detector.engine}.${queueName}`;
485
-
486
- this.registerEntity({
487
- id: qEntityId,
488
- kind: detector.kind === 'event_bus' ? 'event_bus' : 'queue',
489
- name: `${detector.engine}: ${queueName}`,
490
- scope: 'async-broker',
491
- role: 'Asynchronous Job Queue / Message Channel',
492
- tags: ['messaging', detector.engine],
493
- trustZone: 'internal_service',
494
- sources: [
495
- {
496
- file: relPath,
497
- startLine: lineNum,
498
- endLine: lineNum,
499
- snippet: lines[lineNum - 1]?.trim(),
500
- contentHash: getSha256(lines[lineNum - 1] || '').substring(0, 16),
501
- extractionMethod: 'ast_visitor',
502
- confidence: 'L1',
503
- verified: true,
504
- verifiedAt: new Date().toISOString(),
505
- },
506
- ],
507
- blastRadius: { directDependents: 0, transitiveDependents: 0, riskScore: 0.4 },
508
- confidence: 'L1',
509
- temporalState: 'current',
510
- });
511
-
512
- this.registerRelation({
513
- sourceId: sourceEntityId,
514
- targetId: qEntityId,
515
- relationType:
516
- content.includes('.on(') || content.includes('.subscribe(')
517
- ? 'subscribes'
518
- : 'publishes',
519
- protocol: detector.engine,
520
- evidence: [
521
- {
522
- file: relPath,
523
- startLine: lineNum,
524
- endLine: lineNum,
525
- snippet: lines[lineNum - 1]?.trim(),
526
- contentHash: getSha256(lines[lineNum - 1] || '').substring(0, 16),
527
- extractionMethod: 'ast_visitor',
528
- confidence: 'L1',
529
- verified: true,
530
- verifiedAt: new Date().toISOString(),
531
- },
532
- ],
533
- confidence: 'L1',
534
- });
535
- }
536
- }
537
-
538
- // 5. Analyze External Services (Third-Party SaaS & Clouds)
539
- for (const detector of EXTERNAL_SERVICE_DETECTORS) {
540
- detector.regex.lastIndex = 0;
541
- let extMatch;
542
- while ((extMatch = detector.regex.exec(content)) !== null) {
543
- const lineNum = content.slice(0, extMatch.index).split('\n').length;
544
- const serviceName = extMatch[1] || detector.type;
545
- const extEntityId = `ext.${crypto.createHash('md5').update(serviceName).digest('hex').slice(0, 8)}`;
546
-
547
- this.registerEntity({
548
- id: extEntityId,
549
- kind: 'external_api',
550
- name: serviceName.length > 35 ? serviceName.slice(0, 32) + '...' : serviceName,
551
- scope: 'third_party',
552
- role: `External Third-Party Service (${detector.type})`,
553
- tags: ['external', detector.type],
554
- trustZone: 'external_untrusted',
555
- sources: [
556
- {
557
- file: relPath,
558
- startLine: lineNum,
559
- endLine: lineNum,
560
- snippet: lines[lineNum - 1]?.trim(),
561
- contentHash: getSha256(lines[lineNum - 1] || '').substring(0, 16),
562
- extractionMethod: 'ast_visitor',
563
- confidence: 'L1',
564
- verified: true,
565
- verifiedAt: new Date().toISOString(),
566
- },
567
- ],
568
- blastRadius: { directDependents: 0, transitiveDependents: 0, riskScore: 0.3 },
569
- confidence: 'L1',
570
- temporalState: 'current',
571
- });
572
-
573
- // Check for Failure Resilience (try/catch, timeout, retry)
574
- const surroundingContext = lines
575
- .slice(Math.max(0, lineNum - 5), Math.min(lines.length, lineNum + 5))
576
- .join('\n');
577
- const hasTryCatch =
578
- surroundingContext.includes('try') || surroundingContext.includes('.catch');
579
- const hasTimeout =
580
- surroundingContext.includes('timeout') ||
581
- surroundingContext.includes('AbortController');
582
-
583
- this.registerRelation({
584
- sourceId: sourceEntityId,
585
- targetId: extEntityId,
586
- relationType: 'calls',
587
- protocol: 'HTTPS',
588
- evidence: [
589
- {
590
- file: relPath,
591
- startLine: lineNum,
592
- endLine: lineNum,
593
- snippet: lines[lineNum - 1]?.trim(),
594
- contentHash: getSha256(lines[lineNum - 1] || '').substring(0, 16),
595
- extractionMethod: 'ast_visitor',
596
- confidence: 'L1',
597
- verified: true,
598
- verifiedAt: new Date().toISOString(),
599
- },
600
- ],
601
- confidence: 'L1',
602
- failureMode: {
603
- hasTimeout,
604
- hasRetry: surroundingContext.includes('retry'),
605
- hasCircuitBreaker:
606
- surroundingContext.includes('circuitBreaker') ||
607
- surroundingContext.includes('opossum'),
608
- fallbackTarget: hasTryCatch ? 'handled_exception' : undefined,
609
- },
610
- });
611
- }
612
- }
613
-
614
- // 6. Analyze Authentication Boundaries
615
- for (const detector of AUTH_DETECTORS) {
616
- detector.regex.lastIndex = 0;
617
- let authMatch;
618
- while ((authMatch = detector.regex.exec(content)) !== null) {
619
- const lineNum = content.slice(0, authMatch.index).split('\n').length;
620
- const authEntityId = `auth.${detector.authKind}`;
621
-
622
- this.registerEntity({
623
- id: authEntityId,
624
- kind: 'identity_provider',
625
- name: `Auth: ${detector.authKind.toUpperCase()}`,
626
- scope: 'security',
627
- role: 'Authentication & Session Token Verification',
628
- tags: ['security', 'auth', detector.authKind],
629
- trustZone: 'dmz_gateway',
630
- sources: [
631
- {
632
- file: relPath,
633
- startLine: lineNum,
634
- endLine: lineNum,
635
- snippet: lines[lineNum - 1]?.trim(),
636
- contentHash: getSha256(lines[lineNum - 1] || '').substring(0, 16),
637
- extractionMethod: 'ast_visitor',
638
- confidence: 'L1',
639
- verified: true,
640
- verifiedAt: new Date().toISOString(),
641
- },
642
- ],
643
- blastRadius: { directDependents: 0, transitiveDependents: 0, riskScore: 0.8 },
644
- confidence: 'L1',
645
- temporalState: 'current',
646
- });
647
-
648
- this.registerRelation({
649
- sourceId: sourceEntityId,
650
- targetId: authEntityId,
651
- relationType: 'authenticates',
652
- protocol: 'Crypto-Token',
653
- evidence: [
654
- {
655
- file: relPath,
656
- startLine: lineNum,
657
- endLine: lineNum,
658
- snippet: lines[lineNum - 1]?.trim(),
659
- contentHash: getSha256(lines[lineNum - 1] || '').substring(0, 16),
660
- extractionMethod: 'ast_visitor',
661
- confidence: 'L1',
662
- verified: true,
663
- verifiedAt: new Date().toISOString(),
664
- },
665
- ],
666
- confidence: 'L1',
667
- });
668
- }
669
- }
670
- }
671
-
672
- // Populate Trust Zone Members
673
- for (const entity of this.entities.values()) {
674
- const zone = this.trustBoundaries.get(entity.trustZone);
675
- if (zone && !zone.members.includes(entity.id)) {
676
- zone.members.push(entity.id);
677
- }
678
- }
679
-
680
- return this.buildModel();
681
- }
682
-
683
- initDefaultTrustBoundaries() {
684
- const boundaries = [
685
- {
686
- id: 'public_untrusted',
687
- name: 'Public Untrusted Zone',
688
- tier: 'public_untrusted',
689
- enforcesAuth: false,
690
- members: [],
691
- ingressRules: [{ allowedSources: ['*'] }],
692
- },
693
- {
694
- id: 'dmz_gateway',
695
- name: 'DMZ & API Gateway',
696
- tier: 'dmz_gateway',
697
- enforcesAuth: true,
698
- authMethod: 'jwt',
699
- members: [],
700
- ingressRules: [{ allowedSources: ['public_untrusted'] }],
701
- },
702
- {
703
- id: 'internal_service',
704
- name: 'Internal Service Mesh',
705
- tier: 'authenticated_service',
706
- enforcesAuth: true,
707
- members: [],
708
- ingressRules: [{ allowedSources: ['dmz_gateway', 'internal_service'] }],
709
- },
710
- {
711
- id: 'isolated_datastore',
712
- name: 'Isolated Persistent Datastore',
713
- tier: 'isolated_datastore',
714
- enforcesAuth: true,
715
- members: [],
716
- ingressRules: [{ allowedSources: ['internal_service'] }],
717
- },
718
- {
719
- id: 'external_untrusted',
720
- name: 'External Third-Party APIs',
721
- tier: 'public_untrusted',
722
- enforcesAuth: false,
723
- members: [],
724
- ingressRules: [{ allowedSources: ['internal_service'] }],
725
- },
726
- ];
727
-
728
- for (const b of boundaries) {
729
- this.trustBoundaries.set(b.id, b);
730
- }
731
- }
732
-
733
- buildModel() {
734
- const entitiesArr = Array.from(this.entities.values());
735
- const relationsArr = Array.from(this.relations.values());
736
- const trustArr = Array.from(this.trustBoundaries.values());
737
-
738
- return {
739
- schemaVersion: 1,
740
- engine: 'tribunal-architecture-intelligence',
741
- generatedAt: new Date().toISOString(),
742
- repositoryRoot: this.repoRoot,
743
- summary: {
744
- totalEntities: entitiesArr.length,
745
- totalRelations: relationsArr.length,
746
- totalTrustZones: trustArr.length,
747
- endpointsCount: entitiesArr.filter(e => e.kind === 'endpoint').length,
748
- datastoresCount: entitiesArr.filter(e => e.kind === 'datastore' || e.kind === 'cache')
749
- .length,
750
- queuesCount: entitiesArr.filter(e => e.kind === 'queue' || e.kind === 'event_bus').length,
751
- externalServicesCount: entitiesArr.filter(e => e.kind === 'external_api').length,
752
- },
753
- entities: entitiesArr,
754
- relationships: relationsArr,
755
- trustBoundaries: trustArr,
756
- contradictions: this.contradictions,
757
- };
758
- }
759
-
760
- save(outputPath) {
761
- const defaultPath = path.join(this.repoRoot, '.agent', 'history', 'architecture-model.json');
762
- const dest = outputPath || defaultPath;
763
- fs.mkdirSync(path.dirname(dest), { recursive: true });
764
- const model = this.buildModel();
765
- fs.writeFileSync(dest, JSON.stringify(model, null, 2), 'utf8');
766
- return dest;
767
- }
768
- }
769
-
770
- // ── Standalone CLI ────────────────────────────────────────────────────────────
771
- if (require.main === module) {
772
- const t = timer();
773
- const repoRoot = process.argv[2] || process.cwd();
774
- console.log(banner('Tribunal Architecture Fact Extractor (TAFE)'));
775
- console.log(` ${CYAN}Scanning repository:${RESET} ${repoRoot}`);
776
-
777
- const extractor = new ArchitectureExtractor(repoRoot);
778
- const model = extractor.scan();
779
- const savedPath = extractor.save();
780
-
781
- console.log(` ${GREEN}${BOX.check} Fact Extraction Complete${RESET} in ${formatMs(t())}`);
782
- console.log(` ${DIM}Entities:${RESET} ${BOLD}${model.summary.totalEntities}${RESET}`);
783
- console.log(` ${DIM}Relationships:${RESET} ${BOLD}${model.summary.totalRelations}${RESET}`);
784
- console.log(` ${DIM}Endpoints:${RESET} ${BOLD}${model.summary.endpointsCount}${RESET}`);
785
- console.log(` ${DIM}Data Stores:${RESET} ${BOLD}${model.summary.datastoresCount}${RESET}`);
786
- console.log(` ${DIM}Saved Model:${RESET} ${CYAN}${savedPath}${RESET}\n`);
787
- }
788
-
789
- module.exports = {
790
- ArchitectureExtractor,
791
- walkRepository,
792
- };
1
+ #!/usr/bin/env node
2
+ /**
3
+ * architecture_extractor.js — Tribunal Architecture Fact Extractor
4
+ * ═════════════════════════════════════════════════════════════════════════════
5
+ * Deterministic static analysis engine that extracts the full Tribunal
6
+ * Architectural Fact Model (TAFM) directly from repository source code.
7
+ *
8
+ * Extracts:
9
+ * - Services, Modules, and Entry Points
10
+ * - HTTP / API Endpoints (Express, Next.js, Fastify, Hono, Koa)
11
+ * - Data Stores & Queries (Prisma, Drizzle, Mongoose, Sequelize, Raw SQL, Redis)
12
+ * - Message Queues & Events (BullMQ, RabbitMQ, Kafka, EventEmitters)
13
+ * - External Services (fetch, axios, Stripe, AWS SDK, Firebase, SendGrid)
14
+ * - Authentication Boundaries (JWT, next-auth, Passport, Clerk, bcrypt)
15
+ * - Call-graphs, Failure Modes (try/catch, timeouts, retries), and Trust Zones
16
+ *
17
+ * Emits: .agent/history/architecture-model.json with verifiable provenance & L1-L3 confidence.
18
+ * Zero external dependencies.
19
+ */
20
+
21
+ 'use strict';
22
+
23
+ const fs = require('fs');
24
+ const path = require('path');
25
+ const crypto = require('crypto');
26
+ const { GREEN, CYAN, BOLD, DIM, RESET, BOX, banner, timer, formatMs } = require('./_colors');
27
+
28
+ // ── Default Exclusions ────────────────────────────────────────────────────────
29
+ const EXCLUDED_DIRS = new Set([
30
+ 'node_modules',
31
+ '.git',
32
+ '.next',
33
+ 'dist',
34
+ 'build',
35
+ 'coverage',
36
+ '.agent',
37
+ '.agents',
38
+ 'archify',
39
+ 'artifacts',
40
+ 'target',
41
+ ]);
42
+
43
+ const SUPPORTED_EXTS = new Set(['.js', '.jsx', '.ts', '.tsx', '.mjs', '.cjs', '.py', '.go', '.rs']);
44
+
45
+ // ── Helpers ───────────────────────────────────────────────────────────────────
46
+ function getSha256(content) {
47
+ return crypto.createHash('sha256').update(content).digest('hex');
48
+ }
49
+
50
+ function normalizePosixPath(filePath) {
51
+ return filePath.replace(/\\/g, '/');
52
+ }
53
+
54
+ function walkRepository(dir, rootDir = dir, results = []) {
55
+ if (!fs.existsSync(dir)) return results;
56
+ let entries;
57
+ try {
58
+ entries = fs.readdirSync(dir, { withFileTypes: true });
59
+ } catch (_e) {
60
+ return results;
61
+ }
62
+
63
+ for (const entry of entries) {
64
+ const fullPath = path.join(dir, entry.name);
65
+ const relPath = normalizePosixPath(path.relative(rootDir, fullPath));
66
+
67
+ if (entry.isDirectory()) {
68
+ if (!EXCLUDED_DIRS.has(entry.name) && !entry.name.startsWith('.')) {
69
+ walkRepository(fullPath, rootDir, results);
70
+ }
71
+ } else if (entry.isFile()) {
72
+ const ext = path.extname(entry.name).toLowerCase();
73
+ if (SUPPORTED_EXTS.has(ext)) {
74
+ results.push({ fullPath, relPath, ext });
75
+ }
76
+ }
77
+ }
78
+ return results;
79
+ }
80
+
81
+ // ── Extraction Patterns ───────────────────────────────────────────────────────
82
+ const ROUTE_DETECTORS = [
83
+ {
84
+ regex: /(?:app|router|server)\.(get|post|put|patch|delete|all)\s*\(\s*['"`]([^'"`]+)['"`]/gi,
85
+ framework: 'express_or_fastify',
86
+ },
87
+ {
88
+ regex: /export\s+(?:async\s+)?function\s+(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\s*\(/g,
89
+ framework: 'nextjs_app_router',
90
+ },
91
+ {
92
+ regex: /\.(get|post|put|patch|delete)\s*\(\s*['"`](\/[^'"`]*)['"`]/gi,
93
+ framework: 'hono_or_elysia',
94
+ },
95
+ ];
96
+
97
+ const DATASTORE_DETECTORS = [
98
+ {
99
+ regex:
100
+ /prisma\.(\w+)\.(findMany|findUnique|findFirst|create|update|delete|upsert|aggregate|groupBy|count)\s*\(/g,
101
+ engine: 'postgres_prisma',
102
+ kind: 'datastore',
103
+ },
104
+ {
105
+ regex: /(?:db|drizzle)\.(select|insert|update|delete)\s*\(/g,
106
+ engine: 'sql_drizzle',
107
+ kind: 'datastore',
108
+ },
109
+ {
110
+ regex:
111
+ /\.(query|execute|raw|sql)\s*\(\s*['"`]?\s*(SELECT|INSERT|UPDATE|DELETE|CREATE|ALTER|DROP|TRUNCATE)/gi,
112
+ engine: 'raw_sql',
113
+ kind: 'datastore',
114
+ },
115
+ {
116
+ regex: /(?:redis|ioredis|createClient)\s*\(/gi,
117
+ engine: 'redis_cache',
118
+ kind: 'cache',
119
+ },
120
+ {
121
+ regex:
122
+ /(?:redis|client|redisClient|kv)\.(?:get|set|del|hget|hset|expire|incr|lpush|rpush|publish|subscribe)\s*\(|\.(?:hget|hset|expire|incr|lpush|rpush)\s*\(/g,
123
+ engine: 'redis_ops',
124
+ kind: 'cache',
125
+ },
126
+ ];
127
+
128
+ const QUEUE_DETECTORS = [
129
+ {
130
+ regex: /new\s+(?:Queue|Worker|QueueScheduler)\s*\(\s*['"`](\w+)['"`]/g,
131
+ engine: 'bullmq',
132
+ kind: 'queue',
133
+ },
134
+ {
135
+ regex: /(?:amqplib|amqp\.connect)\s*\(/g,
136
+ engine: 'rabbitmq',
137
+ kind: 'queue',
138
+ },
139
+ {
140
+ regex: /new\s+Kafka\s*\(/g,
141
+ engine: 'kafka',
142
+ kind: 'queue',
143
+ },
144
+ {
145
+ regex: /\.(?:emit|on|once)\s*\(\s*['"`]([\w:.-]+)['"`]/g,
146
+ engine: 'event_emitter',
147
+ kind: 'event_bus',
148
+ },
149
+ ];
150
+
151
+ const EXTERNAL_SERVICE_DETECTORS = [
152
+ {
153
+ regex: /(?:fetch|axios|got|ky|ofetch)\s*\(\s*['"`]?(https?:\/\/[^'"`\s,)]+)/gi,
154
+ type: 'http_client',
155
+ },
156
+ {
157
+ regex: /new\s+(?:AWS\.)?(?:S3|DynamoDB|SQS|SNS|Lambda|SES|CloudWatch)\s*\(/g,
158
+ type: 'aws_sdk',
159
+ },
160
+ {
161
+ regex: /@aws-sdk\/client-(\w+)/g,
162
+ type: 'aws_sdk',
163
+ },
164
+ {
165
+ regex: /(?:stripe|Stripe)\s*\(/g,
166
+ type: 'stripe_payments',
167
+ },
168
+ {
169
+ regex: /(?:sendgrid|twilio|resend)\s*/gi,
170
+ type: 'messaging_saas',
171
+ },
172
+ ];
173
+
174
+ const AUTH_DETECTORS = [
175
+ {
176
+ regex: /(?:jwt|jsonwebtoken)\.(?:sign|verify|decode)\s*\(/g,
177
+ authKind: 'jwt',
178
+ },
179
+ {
180
+ regex: /(?:NextAuth|getServerSession|auth\(\)|getSession)\s*\(/g,
181
+ authKind: 'next_auth',
182
+ },
183
+ {
184
+ regex: /passport\.(?:authenticate|use|initialize)\s*\(/g,
185
+ authKind: 'passport',
186
+ },
187
+ {
188
+ regex: /(?:bcrypt|argon2)\.(?:hash|compare|verify)\s*\(/g,
189
+ authKind: 'password_hashing',
190
+ },
191
+ {
192
+ regex: /(?:clerkMiddleware|currentUser|ClerkProvider)\s*/g,
193
+ authKind: 'clerk',
194
+ },
195
+ ];
196
+
197
+ const IMPORT_DETECTOR =
198
+ /(?:import\s+(?:[\w*\s{},]+)\s+from\s+['"`]([^'"`]+)['"`]|require\s*\(\s*['"`]([^'"`]+)['"`]\))/g;
199
+
200
+ // ── Architecture Extractor Class ──────────────────────────────────────────────
201
+ class ArchitectureExtractor {
202
+ constructor(repoRoot = process.cwd()) {
203
+ this.repoRoot = path.resolve(repoRoot);
204
+ this.entities = new Map();
205
+ this.relations = new Map();
206
+ this.trustBoundaries = new Map();
207
+ this.failurePaths = [];
208
+ this.contradictions = [];
209
+ }
210
+
211
+ registerEntity(entity) {
212
+ if (!this.entities.has(entity.id)) {
213
+ this.entities.set(entity.id, entity);
214
+ } else {
215
+ const existing = this.entities.get(entity.id);
216
+ if (entity.sources && entity.sources.length) {
217
+ existing.sources = [...(existing.sources || []), ...entity.sources];
218
+ }
219
+ }
220
+ return this.entities.get(entity.id);
221
+ }
222
+
223
+ registerRelation(relation) {
224
+ const key = `${relation.sourceId}->${relation.targetId}:${relation.relationType}`;
225
+ if (!this.relations.has(key)) {
226
+ this.relations.set(key, {
227
+ id: `rel.${crypto.createHash('md5').update(key).digest('hex').slice(0, 10)}`,
228
+ ...relation,
229
+ });
230
+ } else {
231
+ const existing = this.relations.get(key);
232
+ if (relation.evidence) {
233
+ existing.evidence = [...(existing.evidence || []), ...relation.evidence];
234
+ }
235
+ }
236
+ return this.relations.get(key);
237
+ }
238
+
239
+ scan() {
240
+ const files = walkRepository(this.repoRoot, this.repoRoot);
241
+
242
+ // Initialize Default Trust Zones
243
+ this.initDefaultTrustBoundaries();
244
+
245
+ // Pass 1: Extract module entities and file contents
246
+ const fileDataMap = new Map();
247
+ for (const file of files) {
248
+ let content;
249
+ try {
250
+ content = fs.readFileSync(file.fullPath, 'utf8');
251
+ } catch (_e) {
252
+ continue;
253
+ }
254
+ const lines = content.split('\n');
255
+ const hash = getSha256(content);
256
+ fileDataMap.set(file.relPath, { ...file, content, lines, hash });
257
+
258
+ // Register Module Entity
259
+ const entityId = `mod.${file.relPath.replace(/[^a-zA-Z0-9_.-]/g, '_')}`;
260
+ const isTest = file.relPath.includes('test') || file.relPath.includes('spec');
261
+ const isRoute =
262
+ file.relPath.includes('route') ||
263
+ file.relPath.includes('api') ||
264
+ file.relPath.includes('controllers');
265
+ const isSkill =
266
+ file.relPath.startsWith('skills/') || file.relPath.startsWith('.agents/skills/');
267
+
268
+ this.registerEntity({
269
+ id: entityId,
270
+ kind: isRoute ? 'endpoint' : isTest ? 'test_suite' : 'module',
271
+ name: path.basename(file.relPath),
272
+ scope: path.dirname(file.relPath),
273
+ role: isSkill
274
+ ? 'Skill Template / Resource'
275
+ : isRoute
276
+ ? 'API Route Handler'
277
+ : isTest
278
+ ? 'Test Suite'
279
+ : 'Internal Component',
280
+ tags: [
281
+ isTest ? 'test' : isSkill ? 'skill' : 'core',
282
+ path.extname(file.relPath).replace('.', ''),
283
+ ],
284
+ trustZone: isRoute ? 'dmz_gateway' : 'internal_service',
285
+ sources: [
286
+ {
287
+ file: file.relPath,
288
+ startLine: 1,
289
+ endLine: Math.min(lines.length, 50),
290
+ contentHash: hash.substring(0, 16),
291
+ extractionMethod: 'ast_visitor',
292
+ confidence: 'L1',
293
+ verified: true,
294
+ verifiedAt: new Date().toISOString(),
295
+ },
296
+ ],
297
+ blastRadius: { directDependents: 0, transitiveDependents: 0, riskScore: 0.1 },
298
+ confidence: 'L1',
299
+ temporalState: 'current',
300
+ });
301
+ }
302
+
303
+ // Pass 2: Extract Architectural Features & Relationships
304
+ for (const [relPath, fileInfo] of fileDataMap.entries()) {
305
+ const sourceEntityId = `mod.${relPath.replace(/[^a-zA-Z0-9_.-]/g, '_')}`;
306
+ const { content, lines } = fileInfo;
307
+
308
+ // 1. Analyze Imports & Internal Call Dependencies
309
+ IMPORT_DETECTOR.lastIndex = 0;
310
+ let impMatch;
311
+ while ((impMatch = IMPORT_DETECTOR.exec(content)) !== null) {
312
+ const importTarget = impMatch[1] || impMatch[2];
313
+ if (importTarget && importTarget.startsWith('.')) {
314
+ // Local import
315
+ const resolvedRel = normalizePosixPath(
316
+ path.relative(
317
+ this.repoRoot,
318
+ path.resolve(path.dirname(fileInfo.fullPath), importTarget),
319
+ ),
320
+ );
321
+ // Try finding matching file
322
+ const targetKey = Array.from(fileDataMap.keys()).find(
323
+ k =>
324
+ k === resolvedRel ||
325
+ k.startsWith(resolvedRel + '.') ||
326
+ k === resolvedRel + '/index.js' ||
327
+ k === resolvedRel + '/index.ts',
328
+ );
329
+
330
+ if (targetKey) {
331
+ const targetEntityId = `mod.${targetKey.replace(/[^a-zA-Z0-9_.-]/g, '_')}`;
332
+ const lineNum = content.slice(0, impMatch.index).split('\n').length;
333
+ this.registerRelation({
334
+ sourceId: sourceEntityId,
335
+ targetId: targetEntityId,
336
+ relationType: 'imports',
337
+ protocol: 'In-Memory Module',
338
+ evidence: [
339
+ {
340
+ file: relPath,
341
+ startLine: lineNum,
342
+ endLine: lineNum,
343
+ symbol: importTarget,
344
+ snippet: lines[lineNum - 1]?.trim(),
345
+ contentHash: getSha256(lines[lineNum - 1] || '').substring(0, 16),
346
+ extractionMethod: 'ast_visitor',
347
+ confidence: 'L1',
348
+ verified: true,
349
+ verifiedAt: new Date().toISOString(),
350
+ },
351
+ ],
352
+ confidence: 'L1',
353
+ });
354
+ }
355
+ }
356
+ }
357
+
358
+ // 2. Analyze API Routes (JS/TS web endpoints)
359
+ if (['.js', '.jsx', '.ts', '.tsx', '.mjs', '.cjs'].includes(fileInfo.ext)) {
360
+ for (const detector of ROUTE_DETECTORS) {
361
+ detector.regex.lastIndex = 0;
362
+ let routeMatch;
363
+ while ((routeMatch = detector.regex.exec(content)) !== null) {
364
+ const method = routeMatch[1]?.toUpperCase() || 'GET';
365
+ const endpointPath =
366
+ routeMatch[2] || `/${relPath.replace(/^src\//, '').replace(/\.[^.]+$/, '')}`;
367
+ const lineNum = content.slice(0, routeMatch.index).split('\n').length;
368
+
369
+ const endpointEntityId = `endpoint.${method.toLowerCase()}.${endpointPath.replace(/[^a-zA-Z0-9_.-]/g, '_')}`;
370
+ this.registerEntity({
371
+ id: endpointEntityId,
372
+ kind: 'endpoint',
373
+ name: `${method} ${endpointPath}`,
374
+ scope: relPath,
375
+ role: `Public/Internal Endpoint (${detector.framework})`,
376
+ tags: ['api', method.toLowerCase()],
377
+ trustZone: 'dmz_gateway',
378
+ sources: [
379
+ {
380
+ file: relPath,
381
+ startLine: lineNum,
382
+ endLine: Math.min(lineNum + 10, lines.length),
383
+ snippet: lines[lineNum - 1]?.trim(),
384
+ contentHash: getSha256(lines[lineNum - 1] || '').substring(0, 16),
385
+ extractionMethod: 'ast_visitor',
386
+ confidence: 'L1',
387
+ verified: true,
388
+ verifiedAt: new Date().toISOString(),
389
+ },
390
+ ],
391
+ blastRadius: { directDependents: 0, transitiveDependents: 0, riskScore: 0.2 },
392
+ confidence: 'L1',
393
+ temporalState: 'current',
394
+ });
395
+
396
+ this.registerRelation({
397
+ sourceId: endpointEntityId,
398
+ targetId: sourceEntityId,
399
+ relationType: 'routes_to',
400
+ protocol: 'HTTP',
401
+ evidence: [
402
+ {
403
+ file: relPath,
404
+ startLine: lineNum,
405
+ endLine: lineNum,
406
+ snippet: lines[lineNum - 1]?.trim(),
407
+ contentHash: getSha256(lines[lineNum - 1] || '').substring(0, 16),
408
+ extractionMethod: 'ast_visitor',
409
+ confidence: 'L1',
410
+ verified: true,
411
+ verifiedAt: new Date().toISOString(),
412
+ },
413
+ ],
414
+ confidence: 'L1',
415
+ });
416
+ }
417
+ }
418
+ }
419
+
420
+ // 3. Analyze Data Stores (Prisma, SQL, Redis)
421
+ for (const detector of DATASTORE_DETECTORS) {
422
+ detector.regex.lastIndex = 0;
423
+ let dbMatch;
424
+ while ((dbMatch = detector.regex.exec(content)) !== null) {
425
+ const lineNum = content.slice(0, dbMatch.index).split('\n').length;
426
+ const storeId = `datastore.${detector.engine}`;
427
+
428
+ this.registerEntity({
429
+ id: storeId,
430
+ kind: detector.kind === 'cache' ? 'cache' : 'datastore',
431
+ name: detector.engine.toUpperCase(),
432
+ scope: 'storage',
433
+ role: `${detector.kind === 'cache' ? 'Ephemeral In-Memory Cache' : 'Persistent Relational/NoSQL Database'}`,
434
+ tags: ['persistence', detector.engine],
435
+ trustZone: 'isolated_datastore',
436
+ sources: [
437
+ {
438
+ file: relPath,
439
+ startLine: lineNum,
440
+ endLine: lineNum,
441
+ snippet: lines[lineNum - 1]?.trim(),
442
+ contentHash: getSha256(lines[lineNum - 1] || '').substring(0, 16),
443
+ extractionMethod: 'ast_visitor',
444
+ confidence: 'L1',
445
+ verified: true,
446
+ verifiedAt: new Date().toISOString(),
447
+ },
448
+ ],
449
+ blastRadius: { directDependents: 0, transitiveDependents: 0, riskScore: 0.7 },
450
+ confidence: 'L1',
451
+ temporalState: 'current',
452
+ });
453
+
454
+ this.registerRelation({
455
+ sourceId: sourceEntityId,
456
+ targetId: storeId,
457
+ relationType: detector.kind === 'cache' ? 'reads' : 'writes',
458
+ protocol: detector.engine.includes('redis') ? 'Redis-RESP' : 'SQL-Wire',
459
+ evidence: [
460
+ {
461
+ file: relPath,
462
+ startLine: lineNum,
463
+ endLine: lineNum,
464
+ snippet: lines[lineNum - 1]?.trim(),
465
+ contentHash: getSha256(lines[lineNum - 1] || '').substring(0, 16),
466
+ extractionMethod: 'ast_visitor',
467
+ confidence: 'L1',
468
+ verified: true,
469
+ verifiedAt: new Date().toISOString(),
470
+ },
471
+ ],
472
+ confidence: 'L1',
473
+ });
474
+ }
475
+ }
476
+
477
+ // 4. Analyze Message Queues & Event Busses
478
+ for (const detector of QUEUE_DETECTORS) {
479
+ detector.regex.lastIndex = 0;
480
+ let qMatch;
481
+ while ((qMatch = detector.regex.exec(content)) !== null) {
482
+ const queueName = qMatch[1] || detector.engine;
483
+ const lineNum = content.slice(0, qMatch.index).split('\n').length;
484
+ const qEntityId = `queue.${detector.engine}.${queueName}`;
485
+
486
+ this.registerEntity({
487
+ id: qEntityId,
488
+ kind: detector.kind === 'event_bus' ? 'event_bus' : 'queue',
489
+ name: `${detector.engine}: ${queueName}`,
490
+ scope: 'async-broker',
491
+ role: 'Asynchronous Job Queue / Message Channel',
492
+ tags: ['messaging', detector.engine],
493
+ trustZone: 'internal_service',
494
+ sources: [
495
+ {
496
+ file: relPath,
497
+ startLine: lineNum,
498
+ endLine: lineNum,
499
+ snippet: lines[lineNum - 1]?.trim(),
500
+ contentHash: getSha256(lines[lineNum - 1] || '').substring(0, 16),
501
+ extractionMethod: 'ast_visitor',
502
+ confidence: 'L1',
503
+ verified: true,
504
+ verifiedAt: new Date().toISOString(),
505
+ },
506
+ ],
507
+ blastRadius: { directDependents: 0, transitiveDependents: 0, riskScore: 0.4 },
508
+ confidence: 'L1',
509
+ temporalState: 'current',
510
+ });
511
+
512
+ this.registerRelation({
513
+ sourceId: sourceEntityId,
514
+ targetId: qEntityId,
515
+ relationType:
516
+ content.includes('.on(') || content.includes('.subscribe(')
517
+ ? 'subscribes'
518
+ : 'publishes',
519
+ protocol: detector.engine,
520
+ evidence: [
521
+ {
522
+ file: relPath,
523
+ startLine: lineNum,
524
+ endLine: lineNum,
525
+ snippet: lines[lineNum - 1]?.trim(),
526
+ contentHash: getSha256(lines[lineNum - 1] || '').substring(0, 16),
527
+ extractionMethod: 'ast_visitor',
528
+ confidence: 'L1',
529
+ verified: true,
530
+ verifiedAt: new Date().toISOString(),
531
+ },
532
+ ],
533
+ confidence: 'L1',
534
+ });
535
+ }
536
+ }
537
+
538
+ // 5. Analyze External Services (Third-Party SaaS & Clouds)
539
+ for (const detector of EXTERNAL_SERVICE_DETECTORS) {
540
+ detector.regex.lastIndex = 0;
541
+ let extMatch;
542
+ while ((extMatch = detector.regex.exec(content)) !== null) {
543
+ const lineNum = content.slice(0, extMatch.index).split('\n').length;
544
+ const serviceName = extMatch[1] || detector.type;
545
+ const extEntityId = `ext.${crypto.createHash('md5').update(serviceName).digest('hex').slice(0, 8)}`;
546
+
547
+ this.registerEntity({
548
+ id: extEntityId,
549
+ kind: 'external_api',
550
+ name: serviceName.length > 35 ? serviceName.slice(0, 32) + '...' : serviceName,
551
+ scope: 'third_party',
552
+ role: `External Third-Party Service (${detector.type})`,
553
+ tags: ['external', detector.type],
554
+ trustZone: 'external_untrusted',
555
+ sources: [
556
+ {
557
+ file: relPath,
558
+ startLine: lineNum,
559
+ endLine: lineNum,
560
+ snippet: lines[lineNum - 1]?.trim(),
561
+ contentHash: getSha256(lines[lineNum - 1] || '').substring(0, 16),
562
+ extractionMethod: 'ast_visitor',
563
+ confidence: 'L1',
564
+ verified: true,
565
+ verifiedAt: new Date().toISOString(),
566
+ },
567
+ ],
568
+ blastRadius: { directDependents: 0, transitiveDependents: 0, riskScore: 0.3 },
569
+ confidence: 'L1',
570
+ temporalState: 'current',
571
+ });
572
+
573
+ // Check for Failure Resilience (try/catch, timeout, retry)
574
+ const surroundingContext = lines
575
+ .slice(Math.max(0, lineNum - 5), Math.min(lines.length, lineNum + 5))
576
+ .join('\n');
577
+ const hasTryCatch =
578
+ surroundingContext.includes('try') || surroundingContext.includes('.catch');
579
+ const hasTimeout =
580
+ surroundingContext.includes('timeout') ||
581
+ surroundingContext.includes('AbortController');
582
+
583
+ this.registerRelation({
584
+ sourceId: sourceEntityId,
585
+ targetId: extEntityId,
586
+ relationType: 'calls',
587
+ protocol: 'HTTPS',
588
+ evidence: [
589
+ {
590
+ file: relPath,
591
+ startLine: lineNum,
592
+ endLine: lineNum,
593
+ snippet: lines[lineNum - 1]?.trim(),
594
+ contentHash: getSha256(lines[lineNum - 1] || '').substring(0, 16),
595
+ extractionMethod: 'ast_visitor',
596
+ confidence: 'L1',
597
+ verified: true,
598
+ verifiedAt: new Date().toISOString(),
599
+ },
600
+ ],
601
+ confidence: 'L1',
602
+ failureMode: {
603
+ hasTimeout,
604
+ hasRetry: surroundingContext.includes('retry'),
605
+ hasCircuitBreaker:
606
+ surroundingContext.includes('circuitBreaker') ||
607
+ surroundingContext.includes('opossum'),
608
+ fallbackTarget: hasTryCatch ? 'handled_exception' : undefined,
609
+ },
610
+ });
611
+ }
612
+ }
613
+
614
+ // 6. Analyze Authentication Boundaries
615
+ for (const detector of AUTH_DETECTORS) {
616
+ detector.regex.lastIndex = 0;
617
+ let authMatch;
618
+ while ((authMatch = detector.regex.exec(content)) !== null) {
619
+ const lineNum = content.slice(0, authMatch.index).split('\n').length;
620
+ const authEntityId = `auth.${detector.authKind}`;
621
+
622
+ this.registerEntity({
623
+ id: authEntityId,
624
+ kind: 'identity_provider',
625
+ name: `Auth: ${detector.authKind.toUpperCase()}`,
626
+ scope: 'security',
627
+ role: 'Authentication & Session Token Verification',
628
+ tags: ['security', 'auth', detector.authKind],
629
+ trustZone: 'dmz_gateway',
630
+ sources: [
631
+ {
632
+ file: relPath,
633
+ startLine: lineNum,
634
+ endLine: lineNum,
635
+ snippet: lines[lineNum - 1]?.trim(),
636
+ contentHash: getSha256(lines[lineNum - 1] || '').substring(0, 16),
637
+ extractionMethod: 'ast_visitor',
638
+ confidence: 'L1',
639
+ verified: true,
640
+ verifiedAt: new Date().toISOString(),
641
+ },
642
+ ],
643
+ blastRadius: { directDependents: 0, transitiveDependents: 0, riskScore: 0.8 },
644
+ confidence: 'L1',
645
+ temporalState: 'current',
646
+ });
647
+
648
+ this.registerRelation({
649
+ sourceId: sourceEntityId,
650
+ targetId: authEntityId,
651
+ relationType: 'authenticates',
652
+ protocol: 'Crypto-Token',
653
+ evidence: [
654
+ {
655
+ file: relPath,
656
+ startLine: lineNum,
657
+ endLine: lineNum,
658
+ snippet: lines[lineNum - 1]?.trim(),
659
+ contentHash: getSha256(lines[lineNum - 1] || '').substring(0, 16),
660
+ extractionMethod: 'ast_visitor',
661
+ confidence: 'L1',
662
+ verified: true,
663
+ verifiedAt: new Date().toISOString(),
664
+ },
665
+ ],
666
+ confidence: 'L1',
667
+ });
668
+ }
669
+ }
670
+ }
671
+
672
+ // Populate Trust Zone Members
673
+ for (const entity of this.entities.values()) {
674
+ const zone = this.trustBoundaries.get(entity.trustZone);
675
+ if (zone && !zone.members.includes(entity.id)) {
676
+ zone.members.push(entity.id);
677
+ }
678
+ }
679
+
680
+ return this.buildModel();
681
+ }
682
+
683
+ initDefaultTrustBoundaries() {
684
+ const boundaries = [
685
+ {
686
+ id: 'public_untrusted',
687
+ name: 'Public Untrusted Zone',
688
+ tier: 'public_untrusted',
689
+ enforcesAuth: false,
690
+ members: [],
691
+ ingressRules: [{ allowedSources: ['*'] }],
692
+ },
693
+ {
694
+ id: 'dmz_gateway',
695
+ name: 'DMZ & API Gateway',
696
+ tier: 'dmz_gateway',
697
+ enforcesAuth: true,
698
+ authMethod: 'jwt',
699
+ members: [],
700
+ ingressRules: [{ allowedSources: ['public_untrusted'] }],
701
+ },
702
+ {
703
+ id: 'internal_service',
704
+ name: 'Internal Service Mesh',
705
+ tier: 'authenticated_service',
706
+ enforcesAuth: true,
707
+ members: [],
708
+ ingressRules: [{ allowedSources: ['dmz_gateway', 'internal_service'] }],
709
+ },
710
+ {
711
+ id: 'isolated_datastore',
712
+ name: 'Isolated Persistent Datastore',
713
+ tier: 'isolated_datastore',
714
+ enforcesAuth: true,
715
+ members: [],
716
+ ingressRules: [{ allowedSources: ['internal_service'] }],
717
+ },
718
+ {
719
+ id: 'external_untrusted',
720
+ name: 'External Third-Party APIs',
721
+ tier: 'public_untrusted',
722
+ enforcesAuth: false,
723
+ members: [],
724
+ ingressRules: [{ allowedSources: ['internal_service'] }],
725
+ },
726
+ ];
727
+
728
+ for (const b of boundaries) {
729
+ this.trustBoundaries.set(b.id, b);
730
+ }
731
+ }
732
+
733
+ buildModel() {
734
+ const entitiesArr = Array.from(this.entities.values());
735
+ const relationsArr = Array.from(this.relations.values());
736
+ const trustArr = Array.from(this.trustBoundaries.values());
737
+
738
+ return {
739
+ schemaVersion: 1,
740
+ engine: 'tribunal-architecture-intelligence',
741
+ generatedAt: new Date().toISOString(),
742
+ repositoryRoot: this.repoRoot,
743
+ summary: {
744
+ totalEntities: entitiesArr.length,
745
+ totalRelations: relationsArr.length,
746
+ totalTrustZones: trustArr.length,
747
+ endpointsCount: entitiesArr.filter(e => e.kind === 'endpoint').length,
748
+ datastoresCount: entitiesArr.filter(e => e.kind === 'datastore' || e.kind === 'cache')
749
+ .length,
750
+ queuesCount: entitiesArr.filter(e => e.kind === 'queue' || e.kind === 'event_bus').length,
751
+ externalServicesCount: entitiesArr.filter(e => e.kind === 'external_api').length,
752
+ },
753
+ entities: entitiesArr,
754
+ relationships: relationsArr,
755
+ trustBoundaries: trustArr,
756
+ contradictions: this.contradictions,
757
+ };
758
+ }
759
+
760
+ save(outputPath) {
761
+ const defaultPath = path.join(this.repoRoot, '.agent', 'history', 'architecture-model.json');
762
+ const dest = outputPath || defaultPath;
763
+ fs.mkdirSync(path.dirname(dest), { recursive: true });
764
+ const model = this.buildModel();
765
+ fs.writeFileSync(dest, JSON.stringify(model, null, 2), 'utf8');
766
+ return dest;
767
+ }
768
+ }
769
+
770
+ // ── Standalone CLI ────────────────────────────────────────────────────────────
771
+ if (require.main === module) {
772
+ const t = timer();
773
+ const repoRoot = process.argv[2] || process.cwd();
774
+ console.log(banner('Tribunal Architecture Fact Extractor (TAFE)'));
775
+ console.log(` ${CYAN}Scanning repository:${RESET} ${repoRoot}`);
776
+
777
+ const extractor = new ArchitectureExtractor(repoRoot);
778
+ const model = extractor.scan();
779
+ const savedPath = extractor.save();
780
+
781
+ console.log(` ${GREEN}${BOX.check} Fact Extraction Complete${RESET} in ${formatMs(t())}`);
782
+ console.log(` ${DIM}Entities:${RESET} ${BOLD}${model.summary.totalEntities}${RESET}`);
783
+ console.log(` ${DIM}Relationships:${RESET} ${BOLD}${model.summary.totalRelations}${RESET}`);
784
+ console.log(` ${DIM}Endpoints:${RESET} ${BOLD}${model.summary.endpointsCount}${RESET}`);
785
+ console.log(` ${DIM}Data Stores:${RESET} ${BOLD}${model.summary.datastoresCount}${RESET}`);
786
+ console.log(` ${DIM}Saved Model:${RESET} ${CYAN}${savedPath}${RESET}\n`);
787
+ }
788
+
789
+ module.exports = {
790
+ ArchitectureExtractor,
791
+ walkRepository,
792
+ };