atabey 0.0.13 → 0.0.15

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 (282) hide show
  1. package/ATABEY.md +1 -1
  2. package/PRIVACY.md +8 -14
  3. package/README.md +405 -56
  4. package/bin/cli.js +72 -5
  5. package/dist/framework-mcp/src/index.js +988 -63
  6. package/dist/framework-mcp/src/index.js.map +1 -1
  7. package/dist/framework-mcp/src/tools/compliance/mask_pii.d.ts +17 -0
  8. package/dist/framework-mcp/src/tools/compliance/mask_pii.js +56 -0
  9. package/dist/framework-mcp/src/tools/compliance/mask_pii.js.map +1 -0
  10. package/dist/framework-mcp/src/tools/definitions.js +10 -9
  11. package/dist/framework-mcp/src/tools/definitions.js.map +1 -1
  12. package/dist/framework-mcp/src/tools/framework/run_tests.js +25 -0
  13. package/dist/framework-mcp/src/tools/framework/run_tests.js.map +1 -1
  14. package/dist/framework-mcp/src/tools/index.js +7 -8
  15. package/dist/framework-mcp/src/tools/index.js.map +1 -1
  16. package/dist/framework-mcp/src/tools/messaging/approve_operation.d.ts +22 -0
  17. package/dist/framework-mcp/src/tools/messaging/approve_operation.js +81 -0
  18. package/dist/framework-mcp/src/tools/messaging/approve_operation.js.map +1 -0
  19. package/dist/framework-mcp/src/tools/messaging/ask_human.d.ts +15 -0
  20. package/dist/framework-mcp/src/tools/messaging/ask_human.js +89 -20
  21. package/dist/framework-mcp/src/tools/messaging/ask_human.js.map +1 -1
  22. package/dist/framework-mcp/src/tools/observability/check_ports.d.ts +1 -0
  23. package/dist/framework-mcp/src/tools/observability/check_ports.js +24 -8
  24. package/dist/framework-mcp/src/tools/observability/check_ports.js.map +1 -1
  25. package/dist/framework-mcp/src/tools/quality/analyze_code_quality.js +13 -64
  26. package/dist/framework-mcp/src/tools/quality/analyze_code_quality.js.map +1 -1
  27. package/dist/framework-mcp/src/tools/schemas.d.ts +48 -53
  28. package/dist/framework-mcp/src/tools/schemas.js +18 -22
  29. package/dist/framework-mcp/src/tools/schemas.js.map +1 -1
  30. package/dist/framework-mcp/src/tools/shell/run_command.js +146 -90
  31. package/dist/framework-mcp/src/tools/shell/run_command.js.map +1 -1
  32. package/dist/framework-mcp/src/tools/types.d.ts +11 -105
  33. package/dist/framework-mcp/src/tools/types.js +1 -0
  34. package/dist/framework-mcp/src/tools/types.js.map +1 -1
  35. package/dist/framework-mcp/src/utils/auth.d.ts +36 -0
  36. package/dist/framework-mcp/src/utils/auth.js +79 -0
  37. package/dist/framework-mcp/src/utils/auth.js.map +1 -0
  38. package/dist/framework-mcp/src/utils/auto-rollback.d.ts +71 -0
  39. package/dist/framework-mcp/src/utils/auto-rollback.js +266 -0
  40. package/dist/framework-mcp/src/utils/auto-rollback.js.map +1 -0
  41. package/dist/framework-mcp/src/utils/compliance.js +12 -4
  42. package/dist/framework-mcp/src/utils/compliance.js.map +1 -1
  43. package/dist/framework-mcp/src/utils/context-optimizer.d.ts +69 -0
  44. package/dist/framework-mcp/src/utils/context-optimizer.js +157 -0
  45. package/dist/framework-mcp/src/utils/context-optimizer.js.map +1 -0
  46. package/dist/framework-mcp/src/utils/discipline.d.ts +68 -0
  47. package/dist/framework-mcp/src/utils/discipline.js +218 -0
  48. package/dist/framework-mcp/src/utils/discipline.js.map +1 -0
  49. package/dist/framework-mcp/src/utils/finops.d.ts +143 -0
  50. package/dist/framework-mcp/src/utils/finops.js +326 -0
  51. package/dist/framework-mcp/src/utils/finops.js.map +1 -0
  52. package/dist/framework-mcp/src/utils/human-in-loop.d.ts +95 -0
  53. package/dist/framework-mcp/src/utils/human-in-loop.js +216 -0
  54. package/dist/framework-mcp/src/utils/human-in-loop.js.map +1 -0
  55. package/dist/framework-mcp/src/utils/license-scanner.d.ts +71 -0
  56. package/dist/framework-mcp/src/utils/license-scanner.js +284 -0
  57. package/dist/framework-mcp/src/utils/license-scanner.js.map +1 -0
  58. package/dist/framework-mcp/src/utils/loop-detector.d.ts +105 -0
  59. package/dist/framework-mcp/src/utils/loop-detector.js +362 -0
  60. package/dist/framework-mcp/src/utils/loop-detector.js.map +1 -0
  61. package/dist/framework-mcp/src/utils/quality.d.ts +19 -0
  62. package/dist/framework-mcp/src/utils/quality.js +125 -0
  63. package/dist/framework-mcp/src/utils/quality.js.map +1 -0
  64. package/dist/framework-mcp/src/utils/rules-engine.d.ts +78 -0
  65. package/dist/framework-mcp/src/utils/rules-engine.js +232 -0
  66. package/dist/framework-mcp/src/utils/rules-engine.js.map +1 -0
  67. package/dist/framework-mcp/src/utils/silent-router.d.ts +49 -0
  68. package/dist/framework-mcp/src/utils/silent-router.js +155 -0
  69. package/dist/framework-mcp/src/utils/silent-router.js.map +1 -0
  70. package/dist/framework-mcp/src/utils/storage.d.ts +1 -0
  71. package/dist/framework-mcp/src/utils/storage.js +2 -2
  72. package/dist/framework-mcp/src/utils/storage.js.map +1 -1
  73. package/dist/framework-mcp/src/utils/telemetry-streamer.d.ts +133 -0
  74. package/dist/framework-mcp/src/utils/telemetry-streamer.js +397 -0
  75. package/dist/framework-mcp/src/utils/telemetry-streamer.js.map +1 -0
  76. package/dist/framework-mcp/tests/tools/file_system/file_system_tools.test.js +2 -2
  77. package/dist/framework-mcp/tests/tools/file_system/file_system_tools.test.js.map +1 -1
  78. package/dist/framework-mcp/tests/tools/framework/run_tests.test.d.ts +1 -0
  79. package/dist/framework-mcp/tests/tools/framework/run_tests.test.js +49 -0
  80. package/dist/framework-mcp/tests/tools/framework/run_tests.test.js.map +1 -0
  81. package/dist/framework-mcp/tests/tools/messaging/send_message.test.js +14 -5
  82. package/dist/framework-mcp/tests/tools/messaging/send_message.test.js.map +1 -1
  83. package/dist/framework-mcp/tests/tools/observability/check_ports.test.d.ts +1 -0
  84. package/dist/framework-mcp/tests/tools/observability/check_ports.test.js +44 -0
  85. package/dist/framework-mcp/tests/tools/observability/check_ports.test.js.map +1 -0
  86. package/dist/framework-mcp/tests/tools/shell/run_command.test.js +44 -14
  87. package/dist/framework-mcp/tests/tools/shell/run_command.test.js.map +1 -1
  88. package/dist/framework-mcp/tests/utils/auto-rollback.test.d.ts +7 -0
  89. package/dist/framework-mcp/tests/utils/auto-rollback.test.js +178 -0
  90. package/dist/framework-mcp/tests/utils/auto-rollback.test.js.map +1 -0
  91. package/dist/framework-mcp/tests/utils/context-optimizer.test.d.ts +1 -0
  92. package/dist/framework-mcp/tests/utils/context-optimizer.test.js +62 -0
  93. package/dist/framework-mcp/tests/utils/context-optimizer.test.js.map +1 -0
  94. package/dist/framework-mcp/tests/utils/finops.test.d.ts +7 -0
  95. package/dist/framework-mcp/tests/utils/finops.test.js +157 -0
  96. package/dist/framework-mcp/tests/utils/finops.test.js.map +1 -0
  97. package/dist/framework-mcp/tests/utils/human-in-loop.test.d.ts +1 -0
  98. package/dist/framework-mcp/tests/utils/human-in-loop.test.js +59 -0
  99. package/dist/framework-mcp/tests/utils/human-in-loop.test.js.map +1 -0
  100. package/dist/framework-mcp/tests/utils/license-scanner.test.d.ts +7 -0
  101. package/dist/framework-mcp/tests/utils/license-scanner.test.js +131 -0
  102. package/dist/framework-mcp/tests/utils/license-scanner.test.js.map +1 -0
  103. package/dist/framework-mcp/tests/utils/loop-detector.test.d.ts +7 -0
  104. package/dist/framework-mcp/tests/utils/loop-detector.test.js +204 -0
  105. package/dist/framework-mcp/tests/utils/loop-detector.test.js.map +1 -0
  106. package/dist/framework-mcp/tests/utils/rules-engine.test.d.ts +1 -0
  107. package/dist/framework-mcp/tests/utils/rules-engine.test.js +106 -0
  108. package/dist/framework-mcp/tests/utils/rules-engine.test.js.map +1 -0
  109. package/dist/framework-mcp/tests/utils/telemetry-streamer.test.d.ts +7 -0
  110. package/dist/framework-mcp/tests/utils/telemetry-streamer.test.js +201 -0
  111. package/dist/framework-mcp/tests/utils/telemetry-streamer.test.js.map +1 -0
  112. package/dist/src/cli/commands/check.js +16 -1
  113. package/dist/src/cli/commands/check.js.map +1 -1
  114. package/dist/src/cli/commands/dashboard.js +188 -164
  115. package/dist/src/cli/commands/dashboard.js.map +1 -1
  116. package/dist/src/cli/commands/gateway.js +2 -2
  117. package/dist/src/cli/commands/gateway.js.map +1 -1
  118. package/dist/src/cli/commands/init/scaffold-core.d.ts +2 -0
  119. package/dist/src/cli/commands/init/scaffold-core.js +16 -1
  120. package/dist/src/cli/commands/init/scaffold-core.js.map +1 -1
  121. package/dist/src/cli/commands/init/scaffold-ops.js +2 -2
  122. package/dist/src/cli/commands/init/scaffold-ops.js.map +1 -1
  123. package/dist/src/cli/commands/init/scaffold-standards.js +13 -1
  124. package/dist/src/cli/commands/init/scaffold-standards.js.map +1 -1
  125. package/dist/src/cli/commands/init.d.ts +4 -0
  126. package/dist/src/cli/commands/init.js +94 -31
  127. package/dist/src/cli/commands/init.js.map +1 -1
  128. package/dist/src/cli/commands/mcp.js +3 -1
  129. package/dist/src/cli/commands/mcp.js.map +1 -1
  130. package/dist/src/cli/commands/quickstart.d.ts +1 -1
  131. package/dist/src/cli/commands/quickstart.js +12 -24
  132. package/dist/src/cli/commands/quickstart.js.map +1 -1
  133. package/dist/src/cli/commands/script.js +8 -1
  134. package/dist/src/cli/commands/script.js.map +1 -1
  135. package/dist/src/cli/index.js +24 -23
  136. package/dist/src/cli/index.js.map +1 -1
  137. package/dist/src/cli/shims.js +7 -7
  138. package/dist/src/cli/utils/pkg.js +2 -3
  139. package/dist/src/cli/utils/pkg.js.map +1 -1
  140. package/dist/src/cli/utils/quality.d.ts +10 -0
  141. package/dist/src/cli/utils/quality.js +10 -0
  142. package/dist/src/cli/utils/quality.js.map +1 -0
  143. package/dist/src/modules/agents/definitions.js +45 -40
  144. package/dist/src/modules/agents/definitions.js.map +1 -1
  145. package/dist/src/modules/agents/registry/manager.js +6 -1
  146. package/dist/src/modules/agents/registry/manager.js.map +1 -1
  147. package/dist/src/modules/engines/agent-executor.d.ts +6 -10
  148. package/dist/src/modules/engines/agent-executor.js +63 -21
  149. package/dist/src/modules/engines/agent-executor.js.map +1 -1
  150. package/dist/src/modules/engines/agent-loop.d.ts +34 -0
  151. package/dist/src/modules/engines/agent-loop.js +102 -0
  152. package/dist/src/modules/engines/agent-loop.js.map +1 -0
  153. package/dist/src/modules/engines/evaluation-engine.d.ts +12 -2
  154. package/dist/src/modules/engines/evaluation-engine.js +78 -11
  155. package/dist/src/modules/engines/evaluation-engine.js.map +1 -1
  156. package/dist/src/modules/engines/quality-gate.d.ts +13 -5
  157. package/dist/src/modules/engines/quality-gate.js +39 -31
  158. package/dist/src/modules/engines/quality-gate.js.map +1 -1
  159. package/dist/src/modules/engines/routing-engine.d.ts +5 -3
  160. package/dist/src/modules/engines/routing-engine.js +16 -9
  161. package/dist/src/modules/engines/routing-engine.js.map +1 -1
  162. package/dist/src/modules/gateway/cost-tracker.d.ts +5 -0
  163. package/dist/src/modules/gateway/cost-tracker.js +71 -0
  164. package/dist/src/modules/gateway/cost-tracker.js.map +1 -1
  165. package/dist/src/modules/gateway/gateway.d.ts +4 -0
  166. package/dist/src/modules/gateway/gateway.js +8 -0
  167. package/dist/src/modules/gateway/gateway.js.map +1 -1
  168. package/dist/src/shared/audit.js +3 -2
  169. package/dist/src/shared/audit.js.map +1 -1
  170. package/dist/src/shared/pii.d.ts +41 -9
  171. package/dist/src/shared/pii.js +122 -31
  172. package/dist/src/shared/pii.js.map +1 -1
  173. package/dist/src/shared/storage.d.ts +62 -0
  174. package/dist/src/shared/storage.js +47 -7
  175. package/dist/src/shared/storage.js.map +1 -1
  176. package/dist/tests/embedding.test.d.ts +1 -0
  177. package/dist/tests/embedding.test.js +82 -0
  178. package/dist/tests/embedding.test.js.map +1 -0
  179. package/dist/tests/engines/evaluation-engine.test.d.ts +1 -0
  180. package/dist/tests/engines/evaluation-engine.test.js +71 -0
  181. package/dist/tests/engines/evaluation-engine.test.js.map +1 -0
  182. package/dist/tests/engines/planning-engine.test.d.ts +1 -0
  183. package/dist/tests/engines/planning-engine.test.js +100 -0
  184. package/dist/tests/engines/planning-engine.test.js.map +1 -0
  185. package/dist/tests/engines/quality-gate.test.d.ts +1 -0
  186. package/dist/tests/engines/quality-gate.test.js +59 -0
  187. package/dist/tests/engines/quality-gate.test.js.map +1 -0
  188. package/dist/tests/engines/risk-engine.test.d.ts +1 -0
  189. package/dist/tests/engines/risk-engine.test.js +80 -0
  190. package/dist/tests/engines/risk-engine.test.js.map +1 -0
  191. package/dist/tests/engines/routing-engine.test.d.ts +1 -0
  192. package/dist/tests/engines/routing-engine.test.js +78 -0
  193. package/dist/tests/engines/routing-engine.test.js.map +1 -0
  194. package/dist/tests/integration/hermes_locking.test.js +1 -0
  195. package/dist/tests/integration/hermes_locking.test.js.map +1 -1
  196. package/dist/tests/modules/engines/agent-executor.test.js +1 -1
  197. package/dist/tests/modules/engines/agent-executor.test.js.map +1 -1
  198. package/dist/tests/modules/gateway/cost-tracker.test.js +20 -1
  199. package/dist/tests/modules/gateway/cost-tracker.test.js.map +1 -1
  200. package/dist/tests/shared/lock.test.d.ts +1 -0
  201. package/dist/tests/shared/lock.test.js +95 -0
  202. package/dist/tests/shared/lock.test.js.map +1 -0
  203. package/dist/tests/shared/pii.test.d.ts +1 -0
  204. package/dist/tests/shared/pii.test.js +183 -0
  205. package/dist/tests/shared/pii.test.js.map +1 -0
  206. package/framework-mcp/README.md +307 -35
  207. package/framework-mcp/dist/dashboard/assets/index-B_rK57vi.js +1221 -0
  208. package/framework-mcp/dist/dashboard/index.html +1 -1
  209. package/framework-mcp/dist/framework-mcp/src/index.js +988 -63
  210. package/framework-mcp/dist/framework-mcp/src/tools/compliance/mask_pii.js +55 -0
  211. package/framework-mcp/dist/framework-mcp/src/tools/definitions.js +10 -9
  212. package/framework-mcp/dist/framework-mcp/src/tools/framework/run_tests.js +25 -0
  213. package/framework-mcp/dist/framework-mcp/src/tools/index.js +7 -8
  214. package/framework-mcp/dist/framework-mcp/src/tools/messaging/approve_operation.js +80 -0
  215. package/framework-mcp/dist/framework-mcp/src/tools/messaging/ask_human.js +89 -20
  216. package/framework-mcp/dist/framework-mcp/src/tools/observability/check_ports.js +24 -8
  217. package/framework-mcp/dist/framework-mcp/src/tools/quality/analyze_code_quality.js +13 -64
  218. package/framework-mcp/dist/framework-mcp/src/tools/schemas.js +18 -22
  219. package/framework-mcp/dist/framework-mcp/src/tools/shell/run_command.js +146 -90
  220. package/framework-mcp/dist/framework-mcp/src/tools/types.js +1 -0
  221. package/framework-mcp/dist/framework-mcp/src/utils/auth.js +78 -0
  222. package/framework-mcp/dist/framework-mcp/src/utils/auto-rollback.js +265 -0
  223. package/framework-mcp/dist/framework-mcp/src/utils/compliance.js +12 -4
  224. package/framework-mcp/dist/framework-mcp/src/utils/context-optimizer.js +156 -0
  225. package/framework-mcp/dist/framework-mcp/src/utils/discipline.js +217 -0
  226. package/framework-mcp/dist/framework-mcp/src/utils/finops.js +325 -0
  227. package/framework-mcp/dist/framework-mcp/src/utils/human-in-loop.js +215 -0
  228. package/framework-mcp/dist/framework-mcp/src/utils/license-scanner.js +283 -0
  229. package/framework-mcp/dist/framework-mcp/src/utils/loop-detector.js +361 -0
  230. package/framework-mcp/dist/framework-mcp/src/utils/quality.js +124 -0
  231. package/framework-mcp/dist/framework-mcp/src/utils/rules-engine.js +231 -0
  232. package/framework-mcp/dist/framework-mcp/src/utils/silent-router.js +154 -0
  233. package/framework-mcp/dist/framework-mcp/src/utils/storage.js +2 -2
  234. package/framework-mcp/dist/framework-mcp/src/utils/telemetry-streamer.js +396 -0
  235. package/framework-mcp/dist/src/cli/platforms/core.js +72 -0
  236. package/framework-mcp/dist/src/cli/platforms/index.js +5 -0
  237. package/framework-mcp/dist/src/cli/platforms/paths.js +101 -0
  238. package/framework-mcp/dist/src/cli/platforms/scaffold.js +72 -0
  239. package/framework-mcp/dist/src/cli/platforms/utils.js +75 -0
  240. package/framework-mcp/dist/src/cli/utils/claude.js +57 -0
  241. package/framework-mcp/dist/src/cli/utils/compliance.js +12 -0
  242. package/framework-mcp/dist/src/cli/utils/fs.js +138 -0
  243. package/framework-mcp/dist/src/cli/utils/pkg.js +282 -0
  244. package/framework-mcp/dist/src/cli/utils/quality.js +9 -0
  245. package/framework-mcp/dist/src/modules/agents/definitions.js +563 -0
  246. package/framework-mcp/dist/src/modules/agents/registry/analyst.js +39 -0
  247. package/framework-mcp/dist/src/modules/agents/registry/architect.js +42 -0
  248. package/framework-mcp/dist/src/modules/agents/registry/backend.js +50 -0
  249. package/framework-mcp/dist/src/modules/agents/registry/database.js +45 -0
  250. package/framework-mcp/dist/src/modules/agents/registry/devops.js +45 -0
  251. package/framework-mcp/dist/src/modules/agents/registry/explorer.js +37 -0
  252. package/framework-mcp/dist/src/modules/agents/registry/frontend.js +52 -0
  253. package/framework-mcp/dist/src/modules/agents/registry/git.js +36 -0
  254. package/framework-mcp/dist/src/modules/agents/registry/manager.js +64 -0
  255. package/framework-mcp/dist/src/modules/agents/registry/mobile.js +41 -0
  256. package/framework-mcp/dist/src/modules/agents/registry/native.js +41 -0
  257. package/framework-mcp/dist/src/modules/agents/registry/quality.js +43 -0
  258. package/framework-mcp/dist/src/modules/agents/registry/security.js +42 -0
  259. package/framework-mcp/dist/src/modules/agents/types.js +1 -0
  260. package/framework-mcp/dist/src/modules/engines/evaluation-engine.js +169 -0
  261. package/framework-mcp/dist/src/modules/engines/quality-gate.js +92 -0
  262. package/framework-mcp/dist/src/modules/engines/risk-engine.js +105 -0
  263. package/framework-mcp/dist/src/modules/engines/routing-engine.js +408 -0
  264. package/framework-mcp/dist/src/modules/engines/types.js +1 -0
  265. package/framework-mcp/dist/src/modules/providers/definitions.js +140 -0
  266. package/framework-mcp/dist/src/modules/providers/registry.js +18 -0
  267. package/framework-mcp/dist/src/modules/providers/shared.js +104 -0
  268. package/framework-mcp/dist/src/modules/providers/types.js +1 -0
  269. package/framework-mcp/dist/src/modules/skills/adapter-skills.js +449 -0
  270. package/framework-mcp/dist/src/modules/skills/definitions.js +70 -0
  271. package/framework-mcp/dist/src/shared/audit.js +220 -0
  272. package/framework-mcp/dist/src/shared/errors.js +68 -0
  273. package/framework-mcp/dist/src/shared/lock.js +159 -0
  274. package/framework-mcp/dist/src/shared/pii.js +122 -31
  275. package/framework-mcp/dist/src/shared/retention.js +170 -0
  276. package/framework-mcp/dist/src/shared/storage.js +47 -7
  277. package/framework-mcp/dist/src/shared/string.js +29 -0
  278. package/framework-mcp/package.json +8 -2
  279. package/mcp.json +12 -6
  280. package/package.json +11 -5
  281. package/templates/full/ATABEY_FULL.md +1 -1
  282. package/framework-mcp/dist/dashboard/assets/index-BAPGLiWE.js +0 -267
@@ -0,0 +1,169 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { scanProjectCompliance } from "../../cli/utils/compliance.js";
4
+ import { getFrameworkDir } from "../../cli/utils/memory.js";
5
+ import { appendFile, ensureDir, runCommandQuiet, writeTextFile } from "../../shared/fs.js";
6
+ import { logger } from "../../shared/logger.js";
7
+ import { asTraceID } from "../../shared/types.js";
8
+ export class EvaluationEngine {
9
+ /**
10
+ * Evaluates a completed task, calculates a score, and updates Specialty Memory.
11
+ * Saves lessons from both failures AND successes.
12
+ */
13
+ static evaluateTask(traceIdStr, agentName, durationMs, taskDescription) {
14
+ const traceId = asTraceID(traceIdStr);
15
+ logger.debug(`Starting evaluation for Trace ${traceId} by ${agentName}`);
16
+ let score = 100;
17
+ const metrics = {
18
+ compilation: true,
19
+ lint: true,
20
+ tests: true,
21
+ compliance: 0
22
+ };
23
+ const projectRoot = process.cwd();
24
+ const lessons = [];
25
+ // 1. Compliance Check (AST-based discipline check)
26
+ try {
27
+ const issues = scanProjectCompliance("src");
28
+ metrics.compliance = issues.length;
29
+ if (issues.length > 0) {
30
+ score -= Math.min(issues.length * 5, 40);
31
+ lessons.push("Compliance Violations Detected: Ensure strict adherence to zero-any, zero-console.log policies.");
32
+ }
33
+ else {
34
+ lessons.push("Compliance check passed: No any types or console.log violations found.");
35
+ }
36
+ }
37
+ catch (e) {
38
+ logger.debug("Compliance check failed during evaluation", e);
39
+ }
40
+ // 2. Compilation Check
41
+ try {
42
+ if (fs.existsSync(path.join(projectRoot, "tsconfig.json"))) {
43
+ runCommandQuiet("npx", ["tsc", "--noEmit"], projectRoot);
44
+ lessons.push("TypeScript compilation succeeded. Project is type-safe.");
45
+ }
46
+ }
47
+ catch {
48
+ metrics.compilation = false;
49
+ score -= 20;
50
+ lessons.push("Compilation Error: Always run 'npx tsc --noEmit' to verify type safety before completing a task.");
51
+ }
52
+ // 3. Lint Check
53
+ try {
54
+ if (fs.existsSync(path.join(projectRoot, "eslint.config.js"))) {
55
+ runCommandQuiet("npx", ["eslint", ".", "--max-warnings", "0"], projectRoot);
56
+ lessons.push("Lint check passed. Code follows project style guidelines.");
57
+ }
58
+ }
59
+ catch {
60
+ metrics.lint = false;
61
+ score -= 10;
62
+ }
63
+ // 4. Test Check
64
+ try {
65
+ if (fs.existsSync(path.join(projectRoot, "vitest.config.ts"))) {
66
+ runCommandQuiet("npx", ["vitest", "run", "--passWithNoTests"], projectRoot);
67
+ lessons.push("All tests passed. Changes are verified.");
68
+ }
69
+ }
70
+ catch {
71
+ metrics.tests = false;
72
+ score -= 20;
73
+ lessons.push("Test Failure: Ensure all unit tests pass before marking a task as COMPLETED.");
74
+ }
75
+ // 5. Efficiency Check
76
+ if (durationMs > 120000) {
77
+ score -= 10;
78
+ lessons.push("Task took longer than 2 minutes. Consider breaking large tasks into smaller steps.");
79
+ }
80
+ else if (score >= 80) {
81
+ lessons.push("Task completed efficiently within expected timeframe.");
82
+ }
83
+ // 6. Success Lesson — if score is high and no critical errors
84
+ if (score >= 80 && taskDescription) {
85
+ const successLesson = this.extractSuccessLesson(agentName, taskDescription);
86
+ if (successLesson) {
87
+ lessons.push(successLesson);
88
+ }
89
+ }
90
+ // Save all lessons to specialty memory
91
+ for (const lesson of lessons) {
92
+ this.updateSpecialtyMemory(agentName, lesson);
93
+ }
94
+ const result = {
95
+ traceId,
96
+ agent: agentName.replace("@", ""),
97
+ score: Math.max(0, score),
98
+ metrics,
99
+ durationMs,
100
+ timestamp: new Date().toISOString()
101
+ };
102
+ logger.debug(`Evaluation completed for ${agentName}: Score ${result.score}/100`);
103
+ return result;
104
+ }
105
+ /**
106
+ * Extract a meaningful success lesson from a completed task.
107
+ */
108
+ static extractSuccessLesson(agentName, taskDescription) {
109
+ const patterns = [
110
+ { keywords: ["api", "endpoint", "route", "rest"], lesson: "REST API pattern used successfully for this task." },
111
+ { keywords: ["auth", "login", "jwt", "token"], lesson: "Authentication/authorization pattern used successfully." },
112
+ { keywords: ["test", "spec", "vitest"], lesson: "Test-driven approach used successfully." },
113
+ { keywords: ["migration", "schema", "database", "sql"], lesson: "Database schema/migration pattern used successfully." },
114
+ { keywords: ["component", "react", "ui", "page"], lesson: "UI component pattern used successfully for this task." },
115
+ { keywords: ["middleware", "guard", "interceptor"], lesson: "Middleware/guard pattern used successfully." },
116
+ { keywords: ["service", "repository", "inject"], lesson: "Service/repository pattern used successfully." },
117
+ { keywords: ["error", "exception", "catch", "try"], lesson: "Error handling pattern used successfully." },
118
+ { keywords: ["config", "env", "environment"], lesson: "Configuration/environment pattern used successfully." },
119
+ ];
120
+ const lower = taskDescription.toLowerCase();
121
+ for (const { keywords, lesson } of patterns) {
122
+ if (keywords.some(k => lower.includes(k))) {
123
+ return lesson;
124
+ }
125
+ }
126
+ // Generic success lesson if no specific pattern matched
127
+ return "Task completed with score >= 80. Pattern/approach used was effective.";
128
+ }
129
+ /**
130
+ * Reads learned conventions from an agent's specialty memory.
131
+ * Used by silent-router to inject context into AI calls.
132
+ */
133
+ static readLearnedConventions(agentName) {
134
+ const cleanName = agentName.replace("@", "");
135
+ const fwDir = getFrameworkDir();
136
+ const filePath = path.join(fwDir, "memory", "specialties", `${cleanName}.md`);
137
+ try {
138
+ if (fs.existsSync(filePath)) {
139
+ const content = fs.readFileSync(filePath, "utf8").trim();
140
+ if (content)
141
+ return content;
142
+ }
143
+ }
144
+ catch {
145
+ // File might not exist yet
146
+ }
147
+ return "";
148
+ }
149
+ /**
150
+ * Appends learned lessons to the agent's specialty memory.
151
+ */
152
+ static updateSpecialtyMemory(agentName, lesson) {
153
+ const cleanName = agentName.replace("@", "");
154
+ const fwDir = getFrameworkDir();
155
+ const specialtiesDir = path.join(fwDir, "memory", "specialties");
156
+ ensureDir(specialtiesDir);
157
+ const filePath = path.join(specialtiesDir, `${cleanName}.md`);
158
+ const timestamp = new Date().toISOString().split("T")[0];
159
+ const entry = `- **[${timestamp}]**: ${lesson}\n`;
160
+ if (!fs.existsSync(filePath)) {
161
+ writeTextFile(filePath, `# Learned Conventions for @${cleanName}\n\n`);
162
+ }
163
+ // Avoid duplicate lessons on the same day
164
+ const currentContent = fs.readFileSync(filePath, "utf8");
165
+ if (!currentContent.includes(lesson)) {
166
+ appendFile(filePath, entry);
167
+ }
168
+ }
169
+ }
@@ -0,0 +1,92 @@
1
+ import { execSync } from "child_process";
2
+ import { scanProjectCompliance } from "../../cli/utils/compliance.js";
3
+ import { logger } from "../../shared/logger.js";
4
+ /**
5
+ * [ENGINE] Quality Gate
6
+ * Atabey Order v2 — Deterministic Quality Inspection Center.
7
+ * Inspects agent outputs and codebase against constitutional rules.
8
+ *
9
+ * v0.0.14: Selective file-level lint (not full-project), removed test execution
10
+ * from quality gate (tests are a CI concern), added `any` type detection.
11
+ */
12
+ export class QualityGate {
13
+ /**
14
+ * Puts an agent's work through quality testing.
15
+ * 1. Compliance (Constitutional compliance via AST scan)
16
+ * 2. Lint (Targeted file lint if filePath is provided)
17
+ * 3. Content Validation (Output quality check)
18
+ *
19
+ * Note: Test execution is intentionally excluded from the quality gate.
20
+ * Tests are run separately via 'npm test' in CI. The gate focuses on
21
+ * the immediate output quality, not full regression coverage.
22
+ */
23
+ static async check(agent, output, task, filePath) {
24
+ logger.info(`[QUALITY_GATE] Starting audit for ${agent}...`);
25
+ // Skip deep ecosystem commands during framework unit testing to prevent infinite recursion
26
+ const isTestEnv = process.env.VITEST === "true" || !!process.env.ATABEY_TEST_DIR;
27
+ if (!isTestEnv) {
28
+ // 1. Compliance Check (AST Analysis — scans src/ for policy violations)
29
+ const complianceIssues = scanProjectCompliance("src");
30
+ if (complianceIssues.length > 0) {
31
+ const summary = complianceIssues.map(i => `${i.file}:${i.line} (${i.rule})`).join(", ");
32
+ return {
33
+ passed: false,
34
+ reason: `Compliance issues found: ${summary}`,
35
+ findings: complianceIssues
36
+ };
37
+ }
38
+ // 2. Lint Check
39
+ if (filePath) {
40
+ try {
41
+ logger.debug("[QUALITY_GATE] Running ESLint on file...");
42
+ execSync(`npx eslint --no-eslintrc --rule '{"@typescript-eslint/no-explicit-any": "error"}' ${filePath}`, { stdio: "pipe" });
43
+ }
44
+ catch (err) {
45
+ const error = err;
46
+ return {
47
+ passed: false,
48
+ reason: "Lint check failed. Zero errors required.",
49
+ findings: error.stderr?.toString() || error.message
50
+ };
51
+ }
52
+ }
53
+ else {
54
+ logger.warn("[QUALITY_GATE] No filePath provided — skipping lint check.");
55
+ }
56
+ }
57
+ else {
58
+ logger.debug("[QUALITY_GATE] Framework unit test environment detected. Skipping ecosystem calls.");
59
+ }
60
+ // 3. Content Validation (Basic output quality check)
61
+ const contentCheck = this.validateOutputContent(output, task);
62
+ if (!contentCheck.passed) {
63
+ return contentCheck;
64
+ }
65
+ logger.info(`[QUALITY_GATE] Audit PASSED for ${agent}`);
66
+ return { passed: true, reason: "All quality gates passed." };
67
+ }
68
+ /**
69
+ * Validates the quality of agent output content.
70
+ * Checks for: empty output, error indicators, `any` type policy violations.
71
+ */
72
+ static validateOutputContent(output, _task) {
73
+ if (!output || output.trim().length < 10) {
74
+ return { passed: false, reason: "Output is too short or empty." };
75
+ }
76
+ // Check for hard error indicators
77
+ const errorIndicators = ["ERROR", "FAILED", "CRASHED", "TIMEOUT"];
78
+ for (const indicator of errorIndicators) {
79
+ if (output.toUpperCase().includes(indicator)) {
80
+ return { passed: false, reason: `Output contains error indicator: ${indicator}` };
81
+ }
82
+ }
83
+ // Zero Type Hole policy: detect TypeScript `any` type usage in output
84
+ if (/:\s*any\b/.test(output)) {
85
+ return {
86
+ passed: false,
87
+ reason: "Output contains `any` type — Zero Type Hole policy violation. Use explicit types.",
88
+ };
89
+ }
90
+ return { passed: true, reason: "Content validation passed." };
91
+ }
92
+ }
@@ -0,0 +1,105 @@
1
+ /**
2
+ * [SECURITY] Risk Engine (The Guardian)
3
+ * Calculates the danger level of a proposed task or operation.
4
+ */
5
+ export class RiskEngine {
6
+ static HIGH_RISK_KEYWORDS = [
7
+ { word: "delete", weight: 40 },
8
+ { word: "drop", weight: 50 },
9
+ { word: "truncate", weight: 50 },
10
+ { word: "rm -rf", weight: 60 },
11
+ { word: "purge", weight: 40 },
12
+ { word: "format", weight: 50 },
13
+ { word: "force", weight: 20 },
14
+ ];
15
+ static SENSITIVE_PATHS = [
16
+ { pattern: /\.env/i, weight: 50 },
17
+ { pattern: /config/i, weight: 20 },
18
+ { pattern: /database/i, weight: 30 },
19
+ { pattern: /auth/i, weight: 30 },
20
+ { pattern: /security/i, weight: 30 },
21
+ { pattern: /atabey/i, weight: 40 }, // Framework protection
22
+ ];
23
+ /**
24
+ * Assesses the risk of a natural language task or command string.
25
+ */
26
+ static assessTaskRisk(task) {
27
+ const factors = [];
28
+ let totalScore = 0;
29
+ // 1. Keyword Analysis
30
+ for (const { word, weight } of this.HIGH_RISK_KEYWORDS) {
31
+ if (new RegExp(`\\b${word}\\b`, "i").test(task)) {
32
+ factors.push({
33
+ factor: `Keyword: ${word}`,
34
+ score: weight,
35
+ description: `Detected high-risk keyword '${word}' in task description.`
36
+ });
37
+ totalScore += weight;
38
+ }
39
+ }
40
+ // 2. Path Sensitivity (if paths are mentioned in the task)
41
+ for (const { pattern, weight } of this.SENSITIVE_PATHS) {
42
+ if (pattern.test(task)) {
43
+ factors.push({
44
+ factor: `Sensitive Path: ${pattern.source}`,
45
+ score: weight,
46
+ description: `Task involves access to sensitive path or pattern: ${pattern.source}`
47
+ });
48
+ totalScore += weight;
49
+ }
50
+ }
51
+ // 3. Complexity Risk (Length of task as a proxy)
52
+ if (task.length > 300) {
53
+ const score = 10;
54
+ factors.push({
55
+ factor: "High Complexity",
56
+ score,
57
+ description: "Task description is unusually long, increasing the chance of misunderstanding."
58
+ });
59
+ totalScore += score;
60
+ }
61
+ return this.finalizeAssessment(totalScore, factors);
62
+ }
63
+ /**
64
+ * Assesses risk based on a proposed file change.
65
+ */
66
+ static assessChangeRisk(filePath, operation) {
67
+ const factors = [];
68
+ let totalScore = 0;
69
+ // 1. Operation Weight
70
+ const opWeights = { write: 30, replace: 5, patch: 10 };
71
+ totalScore += opWeights[operation];
72
+ factors.push({
73
+ factor: `Operation: ${operation}`,
74
+ score: opWeights[operation],
75
+ description: `A '${operation}' operation is inherently riskier than a surgical 'replace'.`
76
+ });
77
+ // 2. File Path Risk
78
+ for (const { pattern, weight } of this.SENSITIVE_PATHS) {
79
+ if (pattern.test(filePath)) {
80
+ factors.push({
81
+ factor: `Sensitive File: ${filePath}`,
82
+ score: weight,
83
+ description: "Modifying a sensitive file is high risk."
84
+ });
85
+ totalScore += weight;
86
+ }
87
+ }
88
+ return this.finalizeAssessment(totalScore, factors);
89
+ }
90
+ static finalizeAssessment(totalScore, factors) {
91
+ let severity = "LOW";
92
+ if (totalScore >= 80)
93
+ severity = "CRITICAL";
94
+ else if (totalScore >= 50)
95
+ severity = "HIGH";
96
+ else if (totalScore >= 20)
97
+ severity = "MEDIUM";
98
+ return {
99
+ totalScore: Math.min(totalScore, 100),
100
+ severity,
101
+ factors,
102
+ requiresApproval: totalScore >= 60
103
+ };
104
+ }
105
+ }