savant-code 0.0.17 → 0.0.19

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 (1591) hide show
  1. package/.agents/skills/coding-csharp/SKILL.md +82 -0
  2. package/.agents/skills/coding-go/SKILL.md +76 -0
  3. package/.agents/skills/coding-java/SKILL.md +79 -0
  4. package/.agents/skills/coding-python/SKILL.md +87 -0
  5. package/.agents/skills/coding-rust/SKILL.md +83 -0
  6. package/.agents/skills/coding-typescript/SKILL.md +90 -0
  7. package/.agents/skills/release-workflow/SKILL.md +69 -0
  8. package/.bun-version +1 -0
  9. package/.commandcode/settings.json +11 -0
  10. package/.commandcode/taste/workflow/taste.md +6 -0
  11. package/.env.example +95 -0
  12. package/.gitattributes +43 -0
  13. package/.githooks/pre-push +35 -0
  14. package/.github/workflows/build-release-binaries.yml +163 -0
  15. package/.markdownlint.json +42 -0
  16. package/.markdownlintignore +21 -0
  17. package/.prettierignore +9 -0
  18. package/.prettierrc +23 -0
  19. package/.savantignore +3 -0
  20. package/AGENTS.md +97 -0
  21. package/ARCHITECTURE.md +241 -0
  22. package/CHANGELOG.md +2631 -0
  23. package/CONTRIBUTING.md +88 -0
  24. package/ECHO-freebuff.md +22 -0
  25. package/ECHO.md +722 -0
  26. package/FREEREADME.md +35 -0
  27. package/LEARNINGS.md +345 -0
  28. package/NOTICE +15 -0
  29. package/README.md +550 -348
  30. package/README.zh-CN.md +479 -0
  31. package/SECURITY.md +8 -0
  32. package/VERSION +1 -0
  33. package/WINDOWS.md +238 -0
  34. package/agents/README.md +41 -0
  35. package/agents/base-chat.ts +44 -0
  36. package/agents/basher.ts +107 -0
  37. package/agents/browser-use/browser-use.test.ts +211 -0
  38. package/agents/browser-use/browser-use.ts +259 -0
  39. package/agents/constants.ts +1 -0
  40. package/agents/context-pruner.ts +1076 -0
  41. package/agents/detective/detective.ts +168 -0
  42. package/agents/editor/best-of-n/best-of-n-selector2.ts +148 -0
  43. package/agents/editor/best-of-n/editor-implementor-gpt-5.ts +7 -0
  44. package/agents/editor/best-of-n/editor-implementor-opus.ts +7 -0
  45. package/agents/editor/best-of-n/editor-implementor.ts +196 -0
  46. package/agents/editor/best-of-n/editor-multi-prompt.ts +265 -0
  47. package/agents/file-explorer/directory-lister.ts +92 -0
  48. package/agents/file-explorer/glob-matcher.ts +96 -0
  49. package/agents/forge/forge.ts +146 -0
  50. package/agents/librarian/librarian.test.ts +289 -0
  51. package/agents/librarian/librarian.ts +158 -0
  52. package/agents/package.json +11 -0
  53. package/agents/recorder/recorder.ts +104 -0
  54. package/agents/researcher/researcher-docs.ts +32 -0
  55. package/agents/researcher/researcher-web.ts +40 -0
  56. package/agents/savant/savant-analyze.ts +11 -0
  57. package/agents/savant/savant-free-deepseek-flash.ts +13 -0
  58. package/agents/savant/savant-free-deepseek.ts +13 -0
  59. package/agents/savant/savant-free-evals.ts +9 -0
  60. package/agents/savant/savant-free-glm.ts +13 -0
  61. package/agents/savant/savant-free-kimi.ts +13 -0
  62. package/agents/savant/savant-free-mimo-pro.ts +13 -0
  63. package/agents/savant/savant-free-mimo.ts +13 -0
  64. package/agents/savant/savant-free-minimax-m3.ts +13 -0
  65. package/agents/savant/savant-free.ts +9 -0
  66. package/agents/savant/savant-scaffold.ts +15 -0
  67. package/agents/savant/savant.ts +706 -0
  68. package/agents/scout/scout.ts +305 -0
  69. package/agents/scribe/scribe.ts +54 -0
  70. package/agents/thinker/thinker-gemini.ts +26 -0
  71. package/agents/thinker/thinker-gpt.ts +21 -0
  72. package/agents/thinker/thinker-with-files-gemini.ts +66 -0
  73. package/agents/thinker/thinker.ts +99 -0
  74. package/agents/tmux-cli.ts +724 -0
  75. package/agents/tsconfig.json +12 -0
  76. package/agents/types/agent-definition.ts +1 -0
  77. package/agents/types/secret-agent-definition.ts +103 -0
  78. package/agents/types/tools.ts +465 -0
  79. package/agents/types/util-types.ts +167 -0
  80. package/agents/verifier/verifier.ts +80 -0
  81. package/art/savant-redesign.md +7 -0
  82. package/art/savant-text-graf.md +5 -0
  83. package/art/savant_ascii.md +88 -0
  84. package/assets/banner.png +0 -0
  85. package/bun.lock +1979 -0
  86. package/bunfig.toml +7 -0
  87. package/cli/README.md +111 -0
  88. package/cli/bunfig.toml +2 -0
  89. package/cli/cli_exit +1 -0
  90. package/cli/package.json +66 -0
  91. package/cli/release/README.md +348 -0
  92. package/{index.js → cli/release/index.js} +0 -0
  93. package/cli/release/package.json +56 -0
  94. package/cli/release-core/README.md +20 -0
  95. package/cli/release-core/package.json +4 -0
  96. package/cli/release-core/prepare-package.js +31 -0
  97. package/cli/release-staging/README.md +70 -0
  98. package/cli/release-staging/index.js +42 -0
  99. package/cli/release-staging/package.json +43 -0
  100. package/cli/scripts/build-binary.ts +469 -0
  101. package/cli/scripts/clean.ts +16 -0
  102. package/cli/scripts/prebuild-agents.ts +250 -0
  103. package/cli/scripts/release.ts +103 -0
  104. package/cli/scripts/smoke-binary.ts +280 -0
  105. package/cli/scripts/test-sdk-file-hooks.sh +87 -0
  106. package/cli/scripts/validate-cli-with-tmux.sh +43 -0
  107. package/cli/src/__tests__/README.md +256 -0
  108. package/cli/src/__tests__/bash-mode.test.ts +442 -0
  109. package/cli/src/__tests__/cli-args.test.ts +241 -0
  110. package/cli/src/__tests__/e2e/first-time-login.test.ts +173 -0
  111. package/cli/src/__tests__/e2e/logout-relogin-flow.test.ts +110 -0
  112. package/cli/src/__tests__/e2e/returning-user-auth.test.ts +111 -0
  113. package/cli/src/__tests__/e2e-cli.test.ts +185 -0
  114. package/cli/src/__tests__/helpers/mock-api-client.ts +64 -0
  115. package/cli/src/__tests__/helpers/terminal-watchdog-fixture.ts +50 -0
  116. package/cli/src/__tests__/home-directory-detection.test.ts +213 -0
  117. package/cli/src/__tests__/integration/agent-toolnames-validation.test.ts +63 -0
  118. package/cli/src/__tests__/integration/api-integration.test.ts +289 -0
  119. package/cli/src/__tests__/integration/credentials-storage.test.ts +453 -0
  120. package/cli/src/__tests__/integration/local-agents.test.ts +1187 -0
  121. package/cli/src/__tests__/integration/login-flow-instrumentation.test.ts +146 -0
  122. package/cli/src/__tests__/integration/login-polling-working.test.ts +287 -0
  123. package/cli/src/__tests__/integration/usage-refresh-on-completion.test.ts +177 -0
  124. package/cli/src/__tests__/integration-tmux.test.ts +186 -0
  125. package/cli/src/__tests__/mocks/hover-toggle-controller.ts +71 -0
  126. package/cli/src/__tests__/path-completion.test.ts +243 -0
  127. package/cli/src/__tests__/project-files-chat-id.test.ts +34 -0
  128. package/cli/src/__tests__/release/proxy-http-get.test.ts +670 -0
  129. package/cli/src/__tests__/release/wrapper-safety.test.ts +177 -0
  130. package/cli/src/__tests__/rerender-perf.integration.test.ts +283 -0
  131. package/cli/src/__tests__/terminal-reset-sequences.test.ts +36 -0
  132. package/cli/src/__tests__/terminal-watchdog.test.ts +114 -0
  133. package/cli/src/__tests__/test-utils.ts +266 -0
  134. package/cli/src/__tests__/tmux-poc.ts +150 -0
  135. package/cli/src/__tests__/unit/agent-mode-toggle.test.ts +138 -0
  136. package/cli/src/__tests__/unit/copy-button.test.tsx +188 -0
  137. package/cli/src/__tests__/unit/create-run-config.test.ts +77 -0
  138. package/cli/src/__tests__/unit/publish-confirmation.test.ts +70 -0
  139. package/cli/src/__tests__/unit/segmented-control.test.ts +167 -0
  140. package/cli/src/__tests__/utils/env.test.ts +210 -0
  141. package/cli/src/__tests__/utils/project-picker.test.ts +39 -0
  142. package/cli/src/agents/bundled-agents.generated.d.ts +14 -0
  143. package/cli/src/agents/bundled-agents.generated.ts +1962 -0
  144. package/cli/src/app.tsx +383 -0
  145. package/cli/src/chat.tsx +2008 -0
  146. package/cli/src/cli-args.ts +183 -0
  147. package/cli/src/commands/__tests__/bash-command.test.ts +449 -0
  148. package/cli/src/commands/__tests__/command-args.test.ts +325 -0
  149. package/cli/src/commands/__tests__/copy-conversation.test.ts +240 -0
  150. package/cli/src/commands/__tests__/dev-command.test.ts +128 -0
  151. package/cli/src/commands/__tests__/diagnostics-command.test.ts +35 -0
  152. package/cli/src/commands/__tests__/image.test.ts +99 -0
  153. package/cli/src/commands/__tests__/init.test.ts +479 -0
  154. package/cli/src/commands/__tests__/loop-command.test.ts +89 -0
  155. package/cli/src/commands/__tests__/new-command-rotates-chat.test.ts +87 -0
  156. package/cli/src/commands/__tests__/permissions-command.test.ts +93 -0
  157. package/cli/src/commands/__tests__/process-diagnostics.test.ts +54 -0
  158. package/cli/src/commands/__tests__/prompt-builders.test.ts +69 -0
  159. package/cli/src/commands/__tests__/registry-gating.test.ts +125 -0
  160. package/cli/src/commands/__tests__/rewind-command.test.ts +227 -0
  161. package/cli/src/commands/__tests__/router-connect-chatgpt.test.ts +72 -0
  162. package/cli/src/commands/__tests__/router-input.test.ts +302 -0
  163. package/cli/src/commands/__tests__/router-provider-setup.test.ts +180 -0
  164. package/cli/src/commands/__tests__/savant-free-command-aliases.test.ts +56 -0
  165. package/cli/src/commands/ads.ts +45 -0
  166. package/cli/src/commands/command-registry.ts +1112 -0
  167. package/cli/src/commands/copy-conversation.ts +386 -0
  168. package/cli/src/commands/goal.ts +87 -0
  169. package/cli/src/commands/health-command.ts +61 -0
  170. package/cli/src/commands/help.ts +13 -0
  171. package/cli/src/commands/image.ts +20 -0
  172. package/cli/src/commands/init.ts +121 -0
  173. package/cli/src/commands/loop.ts +182 -0
  174. package/cli/src/commands/process-diagnostics.ts +120 -0
  175. package/cli/src/commands/prompt-builders.ts +140 -0
  176. package/cli/src/commands/publish.ts +261 -0
  177. package/cli/src/commands/rewind.ts +130 -0
  178. package/cli/src/commands/router-utils.ts +80 -0
  179. package/cli/src/commands/router.ts +589 -0
  180. package/cli/src/commands/telemetry.ts +68 -0
  181. package/cli/src/commands/usage.ts +26 -0
  182. package/cli/src/components/__tests__/ad-banner.test.tsx +84 -0
  183. package/cli/src/components/__tests__/block-helpers.test.tsx +139 -0
  184. package/cli/src/components/__tests__/clickable.test.tsx +39 -0
  185. package/cli/src/components/__tests__/grid-layout.integration.test.tsx +365 -0
  186. package/cli/src/components/__tests__/grid-layout.test.tsx +1033 -0
  187. package/cli/src/components/__tests__/markdown-content.test.tsx +163 -0
  188. package/cli/src/components/__tests__/message-block.completion.test.tsx +104 -0
  189. package/cli/src/components/__tests__/message-block.streaming.test.tsx +78 -0
  190. package/cli/src/components/__tests__/message-with-agents.test.tsx +571 -0
  191. package/cli/src/components/__tests__/multiline-input.test.tsx +1129 -0
  192. package/cli/src/components/__tests__/selectable-list.test.ts +232 -0
  193. package/cli/src/components/__tests__/shimmer-text.test.tsx +32 -0
  194. package/cli/src/components/__tests__/status-indicator.test.tsx +184 -0
  195. package/cli/src/components/__tests__/user-error-banner.test.tsx +100 -0
  196. package/cli/src/components/ad-banner.tsx +351 -0
  197. package/cli/src/components/agent-checklist.tsx +385 -0
  198. package/cli/src/components/agent-mode-toggle.tsx +294 -0
  199. package/cli/src/components/ask-user/__tests__/multiple-choice-form.test.ts +432 -0
  200. package/cli/src/components/ask-user/__tests__/validation.test.ts +213 -0
  201. package/cli/src/components/ask-user/components/accordion-question.tsx +153 -0
  202. package/cli/src/components/ask-user/components/custom-answer-input.tsx +66 -0
  203. package/cli/src/components/ask-user/components/options-list.tsx +139 -0
  204. package/cli/src/components/ask-user/components/question-header.tsx +80 -0
  205. package/cli/src/components/ask-user/components/question-option.tsx +94 -0
  206. package/cli/src/components/ask-user/constants.ts +35 -0
  207. package/cli/src/components/ask-user/index.tsx +660 -0
  208. package/cli/src/components/ask-user/utils/validation.ts +85 -0
  209. package/cli/src/components/attachment-card.tsx +67 -0
  210. package/cli/src/components/blocks/agent-block-grid.tsx +58 -0
  211. package/cli/src/components/blocks/agent-branch-item.tsx +230 -0
  212. package/cli/src/components/blocks/agent-branch-wrapper.tsx +524 -0
  213. package/cli/src/components/blocks/agent-list-branch.tsx +77 -0
  214. package/cli/src/components/blocks/ask-user-branch.tsx +98 -0
  215. package/cli/src/components/blocks/block-helpers.tsx +257 -0
  216. package/cli/src/components/blocks/blocks-renderer.tsx +296 -0
  217. package/cli/src/components/blocks/content-with-markdown.tsx +34 -0
  218. package/cli/src/components/blocks/copy-button.tsx +106 -0
  219. package/cli/src/components/blocks/copyable-block.tsx +47 -0
  220. package/cli/src/components/blocks/image-block.tsx +128 -0
  221. package/cli/src/components/blocks/implementor-row.tsx +453 -0
  222. package/cli/src/components/blocks/markdown-content.tsx +360 -0
  223. package/cli/src/components/blocks/markdown-renderables.tsx +347 -0
  224. package/cli/src/components/blocks/single-block.tsx +210 -0
  225. package/cli/src/components/blocks/thinking-block.tsx +77 -0
  226. package/cli/src/components/blocks/tool-block-group.tsx +72 -0
  227. package/cli/src/components/blocks/tool-branch.tsx +196 -0
  228. package/cli/src/components/blocks/user-content-copy.tsx +171 -0
  229. package/cli/src/components/bottom-banner.tsx +145 -0
  230. package/cli/src/components/build-mode-buttons.tsx +110 -0
  231. package/cli/src/components/button.tsx +75 -0
  232. package/cli/src/components/chat-header.tsx +11 -0
  233. package/cli/src/components/chat-history-screen.tsx +417 -0
  234. package/cli/src/components/chat-input-bar.tsx +535 -0
  235. package/cli/src/components/chatgpt-connect-banner.tsx +234 -0
  236. package/cli/src/components/clickable.tsx +149 -0
  237. package/cli/src/components/collapse-button.tsx +36 -0
  238. package/cli/src/components/command-palette.tsx +166 -0
  239. package/cli/src/components/copy-button.tsx +219 -0
  240. package/cli/src/components/dialog.tsx +111 -0
  241. package/cli/src/components/elapsed-timer.tsx +56 -0
  242. package/cli/src/components/error-boundary.tsx +63 -0
  243. package/cli/src/components/feedback-container.tsx +206 -0
  244. package/cli/src/components/feedback-icon-button.tsx +89 -0
  245. package/cli/src/components/feedback-input-mode.tsx +352 -0
  246. package/cli/src/components/file-attachment-card.tsx +89 -0
  247. package/cli/src/components/grid-layout.tsx +83 -0
  248. package/cli/src/components/help-banner.tsx +136 -0
  249. package/cli/src/components/highlighted-text.tsx +52 -0
  250. package/cli/src/components/image-card.tsx +167 -0
  251. package/cli/src/components/image-thumbnail.tsx +112 -0
  252. package/cli/src/components/input-cursor.tsx +77 -0
  253. package/cli/src/components/input-mode-banner.tsx +70 -0
  254. package/cli/src/components/load-previous-button.tsx +48 -0
  255. package/cli/src/components/login-modal.tsx +450 -0
  256. package/cli/src/components/message-block.tsx +337 -0
  257. package/cli/src/components/message-footer.tsx +269 -0
  258. package/cli/src/components/message-with-agents.tsx +594 -0
  259. package/cli/src/components/mode-divider.tsx +43 -0
  260. package/cli/src/components/model-picker.tsx +371 -0
  261. package/cli/src/components/multiline-input.tsx +1276 -0
  262. package/cli/src/components/out-of-credits-banner.tsx +155 -0
  263. package/cli/src/components/pending-attachments-banner.tsx +125 -0
  264. package/cli/src/components/pending-bash-message.tsx +57 -0
  265. package/cli/src/components/progress-bar.tsx +81 -0
  266. package/cli/src/components/project-picker-screen.tsx +469 -0
  267. package/cli/src/components/provider-picker.tsx +139 -0
  268. package/cli/src/components/publish-confirmation.tsx +514 -0
  269. package/cli/src/components/publish-container.tsx +737 -0
  270. package/cli/src/components/raised-pill.tsx +89 -0
  271. package/cli/src/components/renderers/plan-box.tsx +70 -0
  272. package/cli/src/components/review-screen.tsx +114 -0
  273. package/cli/src/components/rewind-picker.tsx +276 -0
  274. package/cli/src/components/right-sidebar.tsx +296 -0
  275. package/cli/src/components/savant-free-active-session-summary.tsx +63 -0
  276. package/cli/src/components/savant-free-landing-screen.tsx +756 -0
  277. package/cli/src/components/savant-free-model-selector.tsx +815 -0
  278. package/cli/src/components/savant-free-referral-banner.tsx +423 -0
  279. package/cli/src/components/savant-free-superseded-screen.tsx +62 -0
  280. package/cli/src/components/savant-ui/animation/pulse.tsx +26 -0
  281. package/cli/src/components/savant-ui/animation/typewriter.tsx +40 -0
  282. package/cli/src/components/savant-ui/branding.tsx +59 -0
  283. package/cli/src/components/savant-ui/data-display/badge.tsx +52 -0
  284. package/cli/src/components/savant-ui/data-display/code-block.tsx +55 -0
  285. package/cli/src/components/savant-ui/data-display/key-value.tsx +34 -0
  286. package/cli/src/components/savant-ui/data-display/sparkline.tsx +42 -0
  287. package/cli/src/components/savant-ui/data-display/timeline.tsx +44 -0
  288. package/cli/src/components/savant-ui/data-display/tree-view.tsx +55 -0
  289. package/cli/src/components/savant-ui/echo/__tests__/sidebar-collapse.test.tsx +90 -0
  290. package/cli/src/components/savant-ui/echo/agent-stack.tsx +72 -0
  291. package/cli/src/components/savant-ui/echo/agent-status.tsx +66 -0
  292. package/cli/src/components/savant-ui/echo/fid-card.tsx +89 -0
  293. package/cli/src/components/savant-ui/echo/fid-list.tsx +68 -0
  294. package/cli/src/components/savant-ui/echo/loop-status-panel.tsx +64 -0
  295. package/cli/src/components/savant-ui/echo/perfection-loop.tsx +118 -0
  296. package/cli/src/components/savant-ui/echo/phase-indicator.tsx +68 -0
  297. package/cli/src/components/savant-ui/echo/phase-info.ts +72 -0
  298. package/cli/src/components/savant-ui/echo/token-meter.tsx +39 -0
  299. package/cli/src/components/savant-ui/feedback/alert.tsx +45 -0
  300. package/cli/src/components/savant-ui/feedback/cost-tracker.tsx +54 -0
  301. package/cli/src/components/savant-ui/feedback/progress-bar.tsx +71 -0
  302. package/cli/src/components/savant-ui/feedback/spinner.tsx +40 -0
  303. package/cli/src/components/savant-ui/icon-theme-keys.ts +67 -0
  304. package/cli/src/components/savant-ui/icon.tsx +53 -0
  305. package/cli/src/components/savant-ui/index.ts +75 -0
  306. package/cli/src/components/savant-ui/input/select.tsx +26 -0
  307. package/cli/src/components/savant-ui/input/toggle.tsx +28 -0
  308. package/cli/src/components/savant-ui/layout/grid.tsx +52 -0
  309. package/cli/src/components/savant-ui/layout/header.tsx +28 -0
  310. package/cli/src/components/savant-ui/navigation/stepper.tsx +41 -0
  311. package/cli/src/components/savant-ui/primitives/key-hint.tsx +45 -0
  312. package/cli/src/components/savant-ui/primitives/key-value-row.tsx +41 -0
  313. package/cli/src/components/savant-ui/primitives/panel.tsx +42 -0
  314. package/cli/src/components/savant-ui/primitives/separator.tsx +34 -0
  315. package/cli/src/components/savant-ui/primitives/sidebar-section.tsx +64 -0
  316. package/cli/src/components/savant-ui/primitives/spacer.tsx +13 -0
  317. package/cli/src/components/savant-ui/primitives/stack.tsx +35 -0
  318. package/cli/src/components/savant-ui/theme.ts +45 -0
  319. package/cli/src/components/scroll-to-bottom-button.tsx +34 -0
  320. package/cli/src/components/segmented-control.tsx +199 -0
  321. package/cli/src/components/selectable-list.tsx +249 -0
  322. package/cli/src/components/selected-chips.tsx +86 -0
  323. package/cli/src/components/separator.tsx +40 -0
  324. package/cli/src/components/session-ended-banner.tsx +183 -0
  325. package/cli/src/components/shimmer-text.tsx +254 -0
  326. package/cli/src/components/status-bar.tsx +279 -0
  327. package/cli/src/components/subscription-limit-banner.tsx +269 -0
  328. package/cli/src/components/suggested-prompts.tsx +184 -0
  329. package/cli/src/components/suggestion-menu.tsx +219 -0
  330. package/cli/src/components/terminal-command-display.tsx +152 -0
  331. package/cli/src/components/terminal-link.tsx +97 -0
  332. package/cli/src/components/text-attachment-card.tsx +77 -0
  333. package/cli/src/components/thinking.tsx +108 -0
  334. package/cli/src/components/toast.tsx +109 -0
  335. package/cli/src/components/tools/__tests__/apply-patch.test.tsx +97 -0
  336. package/cli/src/components/tools/__tests__/code-search.test.tsx +45 -0
  337. package/cli/src/components/tools/__tests__/gravity-index.test.ts +76 -0
  338. package/cli/src/components/tools/__tests__/render-ui.test.tsx +556 -0
  339. package/cli/src/components/tools/__tests__/run-terminal-command.test.ts +274 -0
  340. package/cli/src/components/tools/__tests__/tool-call-item.test.tsx +73 -0
  341. package/cli/src/components/tools/apply-patch.tsx +101 -0
  342. package/cli/src/components/tools/code-search.tsx +50 -0
  343. package/cli/src/components/tools/composio.tsx +140 -0
  344. package/cli/src/components/tools/diff-viewer.tsx +21 -0
  345. package/cli/src/components/tools/glob.tsx +66 -0
  346. package/cli/src/components/tools/gravity-index.tsx +80 -0
  347. package/cli/src/components/tools/list-directory.tsx +66 -0
  348. package/cli/src/components/tools/read-docs.tsx +36 -0
  349. package/cli/src/components/tools/read-files.tsx +97 -0
  350. package/cli/src/components/tools/read-subtree.tsx +40 -0
  351. package/cli/src/components/tools/read-url.tsx +32 -0
  352. package/cli/src/components/tools/registry.ts +131 -0
  353. package/cli/src/components/tools/render-ui.tsx +466 -0
  354. package/cli/src/components/tools/run-terminal-command.tsx +86 -0
  355. package/cli/src/components/tools/skill.tsx +26 -0
  356. package/cli/src/components/tools/str-replace.tsx +77 -0
  357. package/cli/src/components/tools/suggest-followups.tsx +373 -0
  358. package/cli/src/components/tools/task-completed.tsx +16 -0
  359. package/cli/src/components/tools/tool-call-item.tsx +163 -0
  360. package/cli/src/components/tools/types.ts +100 -0
  361. package/cli/src/components/tools/web-search.tsx +32 -0
  362. package/cli/src/components/tools/write-file.tsx +20 -0
  363. package/cli/src/components/tools/write-todos.tsx +105 -0
  364. package/cli/src/components/top-banner.tsx +187 -0
  365. package/cli/src/components/usage-banner.tsx +296 -0
  366. package/cli/src/components/user-error-banner.tsx +54 -0
  367. package/cli/src/components/validation-error-popover.tsx +191 -0
  368. package/cli/src/data/slash-commands.ts +306 -0
  369. package/cli/src/hooks/__tests__/holds-live-savant-free-slot.test.ts +49 -0
  370. package/cli/src/hooks/__tests__/run-outcome.test.ts +178 -0
  371. package/cli/src/hooks/__tests__/session-fetch-signal.test.ts +45 -0
  372. package/cli/src/hooks/__tests__/use-activity-query.test.ts +810 -0
  373. package/cli/src/hooks/__tests__/use-ask-user-bridge.test.ts +175 -0
  374. package/cli/src/hooks/__tests__/use-auth-query.test.ts +21 -0
  375. package/cli/src/hooks/__tests__/use-chat-messages-collapse.test.ts +96 -0
  376. package/cli/src/hooks/__tests__/use-connection-status.test.ts +112 -0
  377. package/cli/src/hooks/__tests__/use-directory-browser.test.ts +215 -0
  378. package/cli/src/hooks/__tests__/use-gravity-ad.test.ts +73 -0
  379. package/cli/src/hooks/__tests__/use-grid-layout.test.ts +346 -0
  380. package/cli/src/hooks/__tests__/use-input-history.test.ts +704 -0
  381. package/cli/src/hooks/__tests__/use-loop-scheduler.test.ts +247 -0
  382. package/cli/src/hooks/__tests__/use-path-tab-completion.test.ts +324 -0
  383. package/cli/src/hooks/__tests__/use-queue-controls.test.ts +68 -0
  384. package/cli/src/hooks/__tests__/use-searchable-list.test.ts +364 -0
  385. package/cli/src/hooks/__tests__/use-send-message-timer.test.ts +146 -0
  386. package/cli/src/hooks/__tests__/use-suggestion-engine-mention.test.ts +364 -0
  387. package/cli/src/hooks/__tests__/use-suggestion-engine.test.ts +485 -0
  388. package/cli/src/hooks/__tests__/use-terminal-focus.test.ts +66 -0
  389. package/cli/src/hooks/__tests__/use-terminal-layout.test.ts +675 -0
  390. package/cli/src/hooks/__tests__/use-timeout.test.ts +330 -0
  391. package/cli/src/hooks/__tests__/use-usage-query.test.ts +526 -0
  392. package/cli/src/hooks/__tests__/use-user-details-query.test.ts +225 -0
  393. package/cli/src/hooks/helpers/__tests__/send-message.test.ts +1851 -0
  394. package/cli/src/hooks/helpers/send-message.ts +553 -0
  395. package/cli/src/hooks/run-outcome.ts +64 -0
  396. package/cli/src/hooks/stream-state.ts +106 -0
  397. package/cli/src/hooks/use-activity-query.ts +696 -0
  398. package/cli/src/hooks/use-agent-validation.ts +80 -0
  399. package/cli/src/hooks/use-ask-user-bridge.ts +102 -0
  400. package/cli/src/hooks/use-auth-query.ts +261 -0
  401. package/cli/src/hooks/use-auth-state.ts +155 -0
  402. package/cli/src/hooks/use-chat-input.ts +87 -0
  403. package/cli/src/hooks/use-chat-keyboard.ts +325 -0
  404. package/cli/src/hooks/use-chat-messages.ts +273 -0
  405. package/cli/src/hooks/use-chat-state.ts +219 -0
  406. package/cli/src/hooks/use-chat-streaming.ts +270 -0
  407. package/cli/src/hooks/use-chat-ui.ts +136 -0
  408. package/cli/src/hooks/use-clipboard.ts +154 -0
  409. package/cli/src/hooks/use-connection-status.ts +156 -0
  410. package/cli/src/hooks/use-directory-browser.ts +88 -0
  411. package/cli/src/hooks/use-elapsed-time.ts +116 -0
  412. package/cli/src/hooks/use-event.ts +36 -0
  413. package/cli/src/hooks/use-exit-handler.ts +108 -0
  414. package/cli/src/hooks/use-fetch-login-url.ts +65 -0
  415. package/cli/src/hooks/use-fids.ts +48 -0
  416. package/cli/src/hooks/use-fingerprint.ts +64 -0
  417. package/cli/src/hooks/use-gravity-ad.ts +688 -0
  418. package/cli/src/hooks/use-grid-layout.ts +78 -0
  419. package/cli/src/hooks/use-input-history.ts +173 -0
  420. package/cli/src/hooks/use-login-keyboard-handlers.ts +74 -0
  421. package/cli/src/hooks/use-login-polling.ts +120 -0
  422. package/cli/src/hooks/use-logo.tsx +178 -0
  423. package/cli/src/hooks/use-loop-scheduler.ts +481 -0
  424. package/cli/src/hooks/use-message-queue.ts +301 -0
  425. package/cli/src/hooks/use-now.ts +20 -0
  426. package/cli/src/hooks/use-path-tab-completion.ts +88 -0
  427. package/cli/src/hooks/use-publish-mutation.ts +60 -0
  428. package/cli/src/hooks/use-queue-controls.ts +70 -0
  429. package/cli/src/hooks/use-queue-ui.ts +55 -0
  430. package/cli/src/hooks/use-savant-free-ctrl-c-exit.ts +23 -0
  431. package/cli/src/hooks/use-savant-free-session-progress.ts +34 -0
  432. package/cli/src/hooks/use-savant-free-session.ts +679 -0
  433. package/cli/src/hooks/use-savant-free-streak-query.ts +72 -0
  434. package/cli/src/hooks/use-scaffold-confirm.ts +62 -0
  435. package/cli/src/hooks/use-scaffold-revert-subscriber.ts +66 -0
  436. package/cli/src/hooks/use-scroll-management.ts +182 -0
  437. package/cli/src/hooks/use-searchable-list.ts +99 -0
  438. package/cli/src/hooks/use-send-message.ts +1038 -0
  439. package/cli/src/hooks/use-sheen-animation.tsx +88 -0
  440. package/cli/src/hooks/use-subscription-query.ts +106 -0
  441. package/cli/src/hooks/use-suggestion-engine.ts +793 -0
  442. package/cli/src/hooks/use-terminal-breakpoints.ts +77 -0
  443. package/cli/src/hooks/use-terminal-dimensions.ts +50 -0
  444. package/cli/src/hooks/use-terminal-focus.ts +146 -0
  445. package/cli/src/hooks/use-terminal-layout.ts +189 -0
  446. package/cli/src/hooks/use-theme.tsx +140 -0
  447. package/cli/src/hooks/use-timeout.ts +88 -0
  448. package/cli/src/hooks/use-toast.ts +114 -0
  449. package/cli/src/hooks/use-update-preference.ts +77 -0
  450. package/cli/src/hooks/use-usage-monitor.ts +59 -0
  451. package/cli/src/hooks/use-usage-query.ts +138 -0
  452. package/cli/src/hooks/use-user-details-query.ts +104 -0
  453. package/cli/src/hooks/use-why-did-you-update.ts +178 -0
  454. package/cli/src/index.tsx +484 -0
  455. package/cli/src/init/__tests__/init-direnv.test.ts +597 -0
  456. package/cli/src/init/init-app.ts +54 -0
  457. package/cli/src/init/init-direnv.ts +133 -0
  458. package/cli/src/login/constants.ts +71 -0
  459. package/cli/src/login/login-flow.ts +224 -0
  460. package/cli/src/login/plain-login.ts +107 -0
  461. package/cli/src/login/utils.ts +183 -0
  462. package/cli/src/native/ripgrep.ts +82 -0
  463. package/cli/src/polyfills/bun-strip-ansi.ts +12 -0
  464. package/cli/src/pre-init/load-dev-env.ts +98 -0
  465. package/cli/src/pre-init/tree-sitter-wasm.ts +98 -0
  466. package/cli/src/project-files.ts +102 -0
  467. package/cli/src/state/__tests__/chat-store-focus.test.ts +22 -0
  468. package/cli/src/state/__tests__/feedback-store.test.ts +260 -0
  469. package/cli/src/state/chat-history-store.ts +27 -0
  470. package/cli/src/state/chat-store.ts +791 -0
  471. package/cli/src/state/feedback-store.ts +162 -0
  472. package/cli/src/state/gateway-catalog-store.ts +45 -0
  473. package/cli/src/state/login-store.ts +150 -0
  474. package/cli/src/state/message-block-store.ts +143 -0
  475. package/cli/src/state/model-picker-store.ts +67 -0
  476. package/cli/src/state/provider-picker-store.ts +53 -0
  477. package/cli/src/state/publish-store.ts +141 -0
  478. package/cli/src/state/review-store.ts +24 -0
  479. package/cli/src/state/rewind-picker-store.ts +74 -0
  480. package/cli/src/state/savant-free-model-store.ts +59 -0
  481. package/cli/src/state/savant-free-session-store.ts +32 -0
  482. package/cli/src/test-setup.ts +20 -0
  483. package/cli/src/testing/env.ts +46 -0
  484. package/cli/src/types/chat-state.ts +15 -0
  485. package/cli/src/types/chat.ts +242 -0
  486. package/cli/src/types/contracts/send-message.ts +16 -0
  487. package/cli/src/types/env.ts +107 -0
  488. package/cli/src/types/function-params.ts +35 -0
  489. package/cli/src/types/opentui-augmentation.d.ts +11 -0
  490. package/cli/src/types/react19-compat.d.ts +19 -0
  491. package/cli/src/types/savant-free-session.ts +17 -0
  492. package/cli/src/types/store.ts +112 -0
  493. package/cli/src/types/theme-system.ts +194 -0
  494. package/cli/src/types/utils.ts +3 -0
  495. package/cli/src/utils/__tests__/activity-tracker.test.ts +440 -0
  496. package/cli/src/utils/__tests__/agent-display.test.ts +139 -0
  497. package/cli/src/utils/__tests__/analytics-client.test.ts +311 -0
  498. package/cli/src/utils/__tests__/anonymous-id.test.ts +74 -0
  499. package/cli/src/utils/__tests__/arrays.test.ts +264 -0
  500. package/cli/src/utils/__tests__/bash-context-processor.test.ts +38 -0
  501. package/cli/src/utils/__tests__/block-processor.test.ts +690 -0
  502. package/cli/src/utils/__tests__/chat-history.test.ts +247 -0
  503. package/cli/src/utils/__tests__/chat-input-key-intercept.test.ts +40 -0
  504. package/cli/src/utils/__tests__/chat-layout.test.ts +32 -0
  505. package/cli/src/utils/__tests__/chat-meta.test.ts +160 -0
  506. package/cli/src/utils/__tests__/chatgpt-oauth.test.ts +50 -0
  507. package/cli/src/utils/__tests__/clipboard.test.ts +998 -0
  508. package/cli/src/utils/__tests__/code-search-summary.test.ts +84 -0
  509. package/cli/src/utils/__tests__/collapse-helpers.test.ts +1272 -0
  510. package/cli/src/utils/__tests__/error-handling.test.ts +611 -0
  511. package/cli/src/utils/__tests__/feedback-helpers.test.ts +452 -0
  512. package/cli/src/utils/__tests__/feedback-submission.test.ts +26 -0
  513. package/cli/src/utils/__tests__/fetch-usage.test.ts +355 -0
  514. package/cli/src/utils/__tests__/fingerprint.test.ts +147 -0
  515. package/cli/src/utils/__tests__/format-elapsed-time.test.ts +103 -0
  516. package/cli/src/utils/__tests__/format-timeout.test.ts +87 -0
  517. package/cli/src/utils/__tests__/image-dimensions.test.ts +243 -0
  518. package/cli/src/utils/__tests__/image-processor.test.ts +250 -0
  519. package/cli/src/utils/__tests__/implementor-helpers.test.ts +1457 -0
  520. package/cli/src/utils/__tests__/keyboard-actions.test.ts +686 -0
  521. package/cli/src/utils/__tests__/layout-helpers.test.ts +36 -0
  522. package/cli/src/utils/__tests__/lazy-response-ads.test.ts +167 -0
  523. package/cli/src/utils/__tests__/logger-sanitize-secrets.test.ts +80 -0
  524. package/cli/src/utils/__tests__/markdown-renderer.test.tsx +518 -0
  525. package/cli/src/utils/__tests__/markdown-streaming.test.ts +64 -0
  526. package/cli/src/utils/__tests__/message-block-helpers.test.ts +1197 -0
  527. package/cli/src/utils/__tests__/message-updater.test.ts +659 -0
  528. package/cli/src/utils/__tests__/ollama-onboarding.test.ts +239 -0
  529. package/cli/src/utils/__tests__/openrouter-models.test.ts +295 -0
  530. package/cli/src/utils/__tests__/osc-timeout-scenarios.test.ts +172 -0
  531. package/cli/src/utils/__tests__/pending-attachments.test.ts +278 -0
  532. package/cli/src/utils/__tests__/provider-setup.test.ts +183 -0
  533. package/cli/src/utils/__tests__/run-state-storage.test.ts +741 -0
  534. package/cli/src/utils/__tests__/savant-code-api.test.ts +634 -0
  535. package/cli/src/utils/__tests__/savant-free-instance-owner.test.ts +69 -0
  536. package/cli/src/utils/__tests__/savant-free-model-navigation.test.ts +104 -0
  537. package/cli/src/utils/__tests__/savant-free-premium-reset.test.ts +81 -0
  538. package/cli/src/utils/__tests__/savant-free-referral-cache.test.ts +67 -0
  539. package/cli/src/utils/__tests__/savant-free-session-display.test.ts +23 -0
  540. package/cli/src/utils/__tests__/savant-free-streak-line.test.ts +76 -0
  541. package/cli/src/utils/__tests__/sdk-event-handlers.test.ts +615 -0
  542. package/cli/src/utils/__tests__/send-message-helpers.test.ts +1875 -0
  543. package/cli/src/utils/__tests__/send-message-timer.test.ts +68 -0
  544. package/cli/src/utils/__tests__/settings.test.ts +138 -0
  545. package/cli/src/utils/__tests__/strings.test.ts +210 -0
  546. package/cli/src/utils/__tests__/syntax-theme.test.ts +91 -0
  547. package/cli/src/utils/__tests__/terminal-color-detection.test.ts +425 -0
  548. package/cli/src/utils/__tests__/terminal-enter-detection.test.ts +77 -0
  549. package/cli/src/utils/__tests__/text-layout.test.ts +82 -0
  550. package/cli/src/utils/__tests__/think-tag-parser.test.ts +159 -0
  551. package/cli/src/utils/__tests__/trace-writer.test.ts +193 -0
  552. package/cli/src/utils/__tests__/trim-chat-logs.test.ts +79 -0
  553. package/cli/src/utils/__tests__/usage-banner-state.test.ts +298 -0
  554. package/cli/src/utils/__tests__/validation-error-formatting.test.ts +126 -0
  555. package/cli/src/utils/__tests__/write-file-atomic.test.ts +130 -0
  556. package/cli/src/utils/active-run.ts +22 -0
  557. package/cli/src/utils/activity-tracker.ts +66 -0
  558. package/cli/src/utils/agent-display.ts +87 -0
  559. package/cli/src/utils/agent-helpers.ts +47 -0
  560. package/cli/src/utils/ai-message-id.ts +12 -0
  561. package/cli/src/utils/analytics.ts +407 -0
  562. package/cli/src/utils/anonymous-id.ts +87 -0
  563. package/cli/src/utils/arrays.ts +117 -0
  564. package/cli/src/utils/auth.ts +258 -0
  565. package/cli/src/utils/bash-context-processor.ts +47 -0
  566. package/cli/src/utils/bash-messages.ts +108 -0
  567. package/cli/src/utils/block-margins.ts +35 -0
  568. package/cli/src/utils/block-operations.ts +548 -0
  569. package/cli/src/utils/block-processor.ts +212 -0
  570. package/cli/src/utils/chat-history.ts +265 -0
  571. package/cli/src/utils/chat-input-key-intercept.ts +52 -0
  572. package/cli/src/utils/chat-layout.ts +44 -0
  573. package/cli/src/utils/chat-meta.ts +101 -0
  574. package/cli/src/utils/chat-scroll-accel.ts +151 -0
  575. package/cli/src/utils/chatgpt-oauth.ts +350 -0
  576. package/cli/src/utils/clipboard-image.ts +610 -0
  577. package/cli/src/utils/clipboard.ts +307 -0
  578. package/cli/src/utils/code-search-summary.ts +69 -0
  579. package/cli/src/utils/collapse-helpers.ts +265 -0
  580. package/cli/src/utils/config-dir.ts +30 -0
  581. package/cli/src/utils/constants.ts +159 -0
  582. package/cli/src/utils/create-event-handler-state.ts +79 -0
  583. package/cli/src/utils/create-run-config.ts +160 -0
  584. package/cli/src/utils/db-storage.ts +254 -0
  585. package/cli/src/utils/detect-shell.ts +112 -0
  586. package/cli/src/utils/directory-browser.ts +74 -0
  587. package/cli/src/utils/engagement.ts +55 -0
  588. package/cli/src/utils/env.ts +109 -0
  589. package/cli/src/utils/error-handling.ts +246 -0
  590. package/cli/src/utils/error-messages.ts +84 -0
  591. package/cli/src/utils/feedback-helpers.ts +115 -0
  592. package/cli/src/utils/feedback-submission.ts +24 -0
  593. package/cli/src/utils/fetch-usage.ts +75 -0
  594. package/cli/src/utils/fid-loader.ts +135 -0
  595. package/cli/src/utils/fingerprint.ts +263 -0
  596. package/cli/src/utils/finish-logic.ts +154 -0
  597. package/cli/src/utils/format-elapsed-time.ts +33 -0
  598. package/cli/src/utils/format-session-units.ts +6 -0
  599. package/cli/src/utils/format-timeout.ts +28 -0
  600. package/cli/src/utils/format-validation-errors-for-message.ts +85 -0
  601. package/cli/src/utils/git.ts +17 -0
  602. package/cli/src/utils/glyphs.ts +188 -0
  603. package/cli/src/utils/helpers.ts +47 -0
  604. package/cli/src/utils/image-display.ts +73 -0
  605. package/cli/src/utils/image-handler.ts +336 -0
  606. package/cli/src/utils/image-processor.ts +133 -0
  607. package/cli/src/utils/image-thumbnail.ts +83 -0
  608. package/cli/src/utils/implementor-helpers.ts +817 -0
  609. package/cli/src/utils/input-modes.ts +196 -0
  610. package/cli/src/utils/keyboard-actions.ts +394 -0
  611. package/cli/src/utils/keypad-keys.ts +47 -0
  612. package/cli/src/utils/layout-helpers.ts +36 -0
  613. package/cli/src/utils/lazy-response-ads.ts +1 -0
  614. package/cli/src/utils/loading-phrases.ts +68 -0
  615. package/cli/src/utils/local-agent-registry.ts +611 -0
  616. package/cli/src/utils/log-shipper.ts +116 -0
  617. package/cli/src/utils/logger.ts +435 -0
  618. package/cli/src/utils/markdown-renderer.tsx +1315 -0
  619. package/cli/src/utils/math.ts +3 -0
  620. package/cli/src/utils/message-block-helpers.ts +667 -0
  621. package/cli/src/utils/message-history.ts +153 -0
  622. package/cli/src/utils/message-tree-utils.ts +67 -0
  623. package/cli/src/utils/message-updater.ts +279 -0
  624. package/cli/src/utils/ollama-onboarding.ts +215 -0
  625. package/cli/src/utils/open-file.ts +144 -0
  626. package/cli/src/utils/open-url.ts +63 -0
  627. package/cli/src/utils/openrouter-models.ts +945 -0
  628. package/cli/src/utils/path-completion.ts +111 -0
  629. package/cli/src/utils/path-helpers.ts +38 -0
  630. package/cli/src/utils/pending-attachments.ts +363 -0
  631. package/cli/src/utils/post-processing.ts +99 -0
  632. package/cli/src/utils/project-picker.ts +12 -0
  633. package/cli/src/utils/provider-setup.ts +259 -0
  634. package/cli/src/utils/recent-projects.ts +156 -0
  635. package/cli/src/utils/renderer-cleanup.ts +142 -0
  636. package/cli/src/utils/response-ad-positions.ts +1 -0
  637. package/cli/src/utils/rewind.ts +175 -0
  638. package/cli/src/utils/run-state-storage.ts +480 -0
  639. package/cli/src/utils/savant-code-api.ts +686 -0
  640. package/cli/src/utils/savant-code-client.ts +217 -0
  641. package/cli/src/utils/savant-free-agent-selection.ts +12 -0
  642. package/cli/src/utils/savant-free-exit.ts +24 -0
  643. package/cli/src/utils/savant-free-instance-owner.ts +66 -0
  644. package/cli/src/utils/savant-free-model-navigation.ts +46 -0
  645. package/cli/src/utils/savant-free-premium-reset.ts +52 -0
  646. package/cli/src/utils/savant-free-referral-cache.ts +35 -0
  647. package/cli/src/utils/savant-free-session-display.ts +21 -0
  648. package/cli/src/utils/savant-free-streak-line.ts +67 -0
  649. package/cli/src/utils/sdk-event-handlers.ts +587 -0
  650. package/cli/src/utils/send-message-helpers.ts +199 -0
  651. package/cli/src/utils/send-message-timer.ts +110 -0
  652. package/cli/src/utils/settings.ts +388 -0
  653. package/cli/src/utils/skill-registry.ts +100 -0
  654. package/cli/src/utils/spawn-agent-matcher.ts +56 -0
  655. package/cli/src/utils/status-indicator-state.ts +100 -0
  656. package/cli/src/utils/stream-chunk-processor.ts +65 -0
  657. package/cli/src/utils/strings.ts +272 -0
  658. package/cli/src/utils/subscription.ts +31 -0
  659. package/cli/src/utils/syntax-highlighter.tsx +19 -0
  660. package/cli/src/utils/syntax-theme.ts +131 -0
  661. package/cli/src/utils/terminal-color-detection.ts +472 -0
  662. package/cli/src/utils/terminal-enter-detection.ts +63 -0
  663. package/cli/src/utils/terminal-images.ts +223 -0
  664. package/cli/src/utils/terminal-reset-sequences.ts +33 -0
  665. package/cli/src/utils/terminal-title.ts +113 -0
  666. package/cli/src/utils/terminal-watchdog.ts +246 -0
  667. package/cli/src/utils/text-layout.ts +153 -0
  668. package/cli/src/utils/theme-config.ts +143 -0
  669. package/cli/src/utils/theme-system.ts +1265 -0
  670. package/cli/src/utils/think-tag-parser.ts +105 -0
  671. package/cli/src/utils/trace-writer.ts +147 -0
  672. package/cli/src/utils/ui-constants.ts +69 -0
  673. package/cli/src/utils/usage-banner-state.ts +146 -0
  674. package/cli/src/utils/validation-error-formatting.ts +92 -0
  675. package/cli/src/utils/validation-error-helpers.ts +19 -0
  676. package/cli/src/utils/version.ts +23 -0
  677. package/cli/src/utils/word-wrap-utils.ts +53 -0
  678. package/cli/src/utils/write-file-atomic.ts +82 -0
  679. package/cli/src/utils/yield-to-event-loop.ts +9 -0
  680. package/cli/tsconfig.json +26 -0
  681. package/coding-standards/csharp.md +77 -0
  682. package/coding-standards/go.md +71 -0
  683. package/coding-standards/java.md +74 -0
  684. package/coding-standards/python.md +82 -0
  685. package/coding-standards/rust.md +78 -0
  686. package/coding-standards/typescript.md +85 -0
  687. package/coding-standards/x402.md +227 -0
  688. package/common/README.md +41 -0
  689. package/common/common_exit +1 -0
  690. package/common/package.json +45 -0
  691. package/common/src/__tests__/agent-validation.test.ts +861 -0
  692. package/common/src/__tests__/agents.test.ts +16 -0
  693. package/common/src/__tests__/dynamic-agent-template-schema.test.ts +420 -0
  694. package/common/src/__tests__/env-ci.test.ts +167 -0
  695. package/common/src/__tests__/env-process.test.ts +145 -0
  696. package/common/src/__tests__/free-agents.test.ts +269 -0
  697. package/common/src/__tests__/handlesteps-parsing.test.ts +247 -0
  698. package/common/src/__tests__/model-config.test.ts +41 -0
  699. package/common/src/__tests__/project-file-tree.test.ts +82 -0
  700. package/common/src/__tests__/response-ad-positions.test.ts +78 -0
  701. package/common/src/__tests__/savant-free-models.test.ts +460 -0
  702. package/common/src/__tests__/savant-free-referral-tiers.test.ts +122 -0
  703. package/common/src/__tests__/user-state.test.ts +30 -0
  704. package/common/src/actions.ts +215 -0
  705. package/common/src/analytics-core.ts +73 -0
  706. package/common/src/analytics.ts +96 -0
  707. package/common/src/api-keys/constants.ts +26 -0
  708. package/common/src/browser-actions.ts +414 -0
  709. package/common/src/constants/agents.ts +250 -0
  710. package/common/src/constants/analytics-events.ts +318 -0
  711. package/common/src/constants/anthropic.ts +72 -0
  712. package/common/src/constants/byok.ts +2 -0
  713. package/common/src/constants/chatgpt-oauth.ts +85 -0
  714. package/common/src/constants/composio.ts +34 -0
  715. package/common/src/constants/feedback.ts +18 -0
  716. package/common/src/constants/free-agents.ts +347 -0
  717. package/common/src/constants/gemini.ts +6 -0
  718. package/common/src/constants/grant-priorities.ts +13 -0
  719. package/common/src/constants/hosts.ts +6 -0
  720. package/common/src/constants/images.ts +53 -0
  721. package/common/src/constants/index.ts +8 -0
  722. package/common/src/constants/knowledge.ts +46 -0
  723. package/common/src/constants/limits.ts +23 -0
  724. package/common/src/constants/model-config.ts +469 -0
  725. package/common/src/constants/paths.ts +69 -0
  726. package/common/src/constants/savant-code-config.ts +12 -0
  727. package/common/src/constants/savant-free-gemini-thinker.ts +30 -0
  728. package/common/src/constants/savant-free-models.ts +855 -0
  729. package/common/src/constants/savant-free-referral-tiers.ts +169 -0
  730. package/common/src/constants/skills.ts +60 -0
  731. package/common/src/constants/subscription-plans.ts +54 -0
  732. package/common/src/constants/ui.ts +25 -0
  733. package/common/src/env-ci.ts +36 -0
  734. package/common/src/env-process.ts +95 -0
  735. package/common/src/env-schema.ts +42 -0
  736. package/common/src/env.ts +69 -0
  737. package/common/src/mcp/client.ts +308 -0
  738. package/common/src/old-constants.ts +10 -0
  739. package/common/src/project-file-tree.ts +361 -0
  740. package/common/src/reddit-capi.ts +175 -0
  741. package/common/src/schemas/feedback.ts +57 -0
  742. package/common/src/schemas/logs.ts +66 -0
  743. package/common/src/templates/agent-validation.ts +436 -0
  744. package/common/src/templates/initial-agents-dir/LICENSE +202 -0
  745. package/common/src/templates/initial-agents-dir/README.md +314 -0
  746. package/common/src/templates/initial-agents-dir/examples/01-basic-diff-reviewer.ts +17 -0
  747. package/common/src/templates/initial-agents-dir/examples/02-intermediate-git-committer.ts +78 -0
  748. package/common/src/templates/initial-agents-dir/examples/03-advanced-file-explorer.ts +76 -0
  749. package/common/src/templates/initial-agents-dir/my-custom-agent.ts +40 -0
  750. package/common/src/templates/initial-agents-dir/package.json +6 -0
  751. package/common/src/templates/initial-agents-dir/skills/README.md +66 -0
  752. package/common/src/templates/initial-agents-dir/skills/example-skill/SKILL.md +29 -0
  753. package/common/src/templates/initial-agents-dir/types/agent-definition.ts +484 -0
  754. package/common/src/templates/initial-agents-dir/types/tools.ts +452 -0
  755. package/common/src/templates/initial-agents-dir/types/util-types.ts +167 -0
  756. package/common/src/testing/TESTING_PATTERNS.md +353 -0
  757. package/common/src/testing/errors.ts +33 -0
  758. package/common/src/testing/fixtures/agent-runtime.ts +325 -0
  759. package/common/src/testing/impl/agent-runtime.ts +6 -0
  760. package/common/src/testing/index.ts +84 -0
  761. package/common/src/testing/mock-modules.ts +54 -0
  762. package/common/src/testing/mock-types.ts +123 -0
  763. package/common/src/testing/mocks/analytics.ts +262 -0
  764. package/common/src/testing/mocks/child-process.ts +93 -0
  765. package/common/src/testing/mocks/crypto.ts +218 -0
  766. package/common/src/testing/mocks/database.ts +337 -0
  767. package/common/src/testing/mocks/filesystem.ts +166 -0
  768. package/common/src/testing/mocks/index.ts +83 -0
  769. package/common/src/testing/mocks/logger.ts +136 -0
  770. package/common/src/testing/mocks/stream.ts +314 -0
  771. package/common/src/testing/mocks/timers.ts +132 -0
  772. package/common/src/testing/mocks/tree-sitter.ts +127 -0
  773. package/common/src/testing/setup.ts +282 -0
  774. package/common/src/testing-env-ci.ts +15 -0
  775. package/common/src/testing-env-process.ts +78 -0
  776. package/common/src/tools/__tests__/compile-tool-definitions.test.ts +34 -0
  777. package/common/src/tools/__tests__/thought-session.test.ts +256 -0
  778. package/common/src/tools/compile-tool-definitions.ts +194 -0
  779. package/common/src/tools/constants.ts +132 -0
  780. package/common/src/tools/list.ts +193 -0
  781. package/common/src/tools/params/__tests__/coerce-to-array.test.ts +237 -0
  782. package/common/src/tools/params/__tests__/sequential-thinking-coercion.test.ts +98 -0
  783. package/common/src/tools/params/tool/add-message.ts +36 -0
  784. package/common/src/tools/params/tool/add-subgoal.ts +57 -0
  785. package/common/src/tools/params/tool/apply-patch.ts +110 -0
  786. package/common/src/tools/params/tool/ask-user.ts +181 -0
  787. package/common/src/tools/params/tool/browser-logs.ts +85 -0
  788. package/common/src/tools/params/tool/code-search.ts +144 -0
  789. package/common/src/tools/params/tool/composio.ts +131 -0
  790. package/common/src/tools/params/tool/create-plan.ts +80 -0
  791. package/common/src/tools/params/tool/end-turn.ts +54 -0
  792. package/common/src/tools/params/tool/find-files.ts +60 -0
  793. package/common/src/tools/params/tool/glob.ts +74 -0
  794. package/common/src/tools/params/tool/gravity-index.ts +92 -0
  795. package/common/src/tools/params/tool/list-directory.ts +58 -0
  796. package/common/src/tools/params/tool/lookup-agent-info.ts +37 -0
  797. package/common/src/tools/params/tool/propose-str-replace.ts +103 -0
  798. package/common/src/tools/params/tool/propose-write-file.ts +71 -0
  799. package/common/src/tools/params/tool/read-docs.ts +85 -0
  800. package/common/src/tools/params/tool/read-files.ts +61 -0
  801. package/common/src/tools/params/tool/read-subtree.ts +83 -0
  802. package/common/src/tools/params/tool/read-url.ts +81 -0
  803. package/common/src/tools/params/tool/render-ui.ts +203 -0
  804. package/common/src/tools/params/tool/run-file-change-hooks.ts +57 -0
  805. package/common/src/tools/params/tool/run-readonly-command.ts +76 -0
  806. package/common/src/tools/params/tool/run-terminal-command.ts +185 -0
  807. package/common/src/tools/params/tool/sequential-thinking.ts +110 -0
  808. package/common/src/tools/params/tool/set-messages.ts +42 -0
  809. package/common/src/tools/params/tool/set-output.ts +62 -0
  810. package/common/src/tools/params/tool/set-scaffold-complete.ts +51 -0
  811. package/common/src/tools/params/tool/skill.ts +56 -0
  812. package/common/src/tools/params/tool/spawn-agent-inline.ts +57 -0
  813. package/common/src/tools/params/tool/spawn-agents.ts +154 -0
  814. package/common/src/tools/params/tool/str-replace.ts +107 -0
  815. package/common/src/tools/params/tool/suggest-followups.ts +94 -0
  816. package/common/src/tools/params/tool/task-completed.ts +58 -0
  817. package/common/src/tools/params/tool/think-deeply.ts +53 -0
  818. package/common/src/tools/params/tool/transition-phase.ts +57 -0
  819. package/common/src/tools/params/tool/update-subgoal.ts +89 -0
  820. package/common/src/tools/params/tool/web-search.ts +73 -0
  821. package/common/src/tools/params/tool/write-file.ts +71 -0
  822. package/common/src/tools/params/tool/write-todos.ts +67 -0
  823. package/common/src/tools/params/utils.ts +152 -0
  824. package/common/src/tools/safety-registry.ts +274 -0
  825. package/common/src/tools/safety.ts +42 -0
  826. package/common/src/tools/sequential-thinking.ts +340 -0
  827. package/common/src/tools/utils.ts +25 -0
  828. package/common/src/types/__tests__/dynamic-agent-template.test.ts +20 -0
  829. package/common/src/types/agent-template.ts +223 -0
  830. package/common/src/types/api/agents/publish.ts +63 -0
  831. package/common/src/types/contracts/agent-runtime.ts +84 -0
  832. package/common/src/types/contracts/analytics.ts +12 -0
  833. package/common/src/types/contracts/bigquery.ts +55 -0
  834. package/common/src/types/contracts/billing.ts +46 -0
  835. package/common/src/types/contracts/client.ts +52 -0
  836. package/common/src/types/contracts/database.ts +104 -0
  837. package/common/src/types/contracts/env.ts +203 -0
  838. package/common/src/types/contracts/llm.ts +183 -0
  839. package/common/src/types/contracts/logger.ts +29 -0
  840. package/common/src/types/contracts/logs.ts +34 -0
  841. package/common/src/types/contracts/trace.ts +21 -0
  842. package/common/src/types/dynamic-agent-template.ts +290 -0
  843. package/common/src/types/filesystem.ts +10 -0
  844. package/common/src/types/function-params.ts +35 -0
  845. package/common/src/types/grant.ts +20 -0
  846. package/common/src/types/gravity-index.ts +170 -0
  847. package/common/src/types/json.ts +26 -0
  848. package/common/src/types/mcp.ts +26 -0
  849. package/common/src/types/messages/content-part.ts +59 -0
  850. package/common/src/types/messages/data-content.ts +14 -0
  851. package/common/src/types/messages/provider-metadata.ts +10 -0
  852. package/common/src/types/messages/savant-code-message.ts +55 -0
  853. package/common/src/types/organization.ts +118 -0
  854. package/common/src/types/print-mode.ts +167 -0
  855. package/common/src/types/publisher.ts +67 -0
  856. package/common/src/types/savant-free-session.ts +295 -0
  857. package/common/src/types/savant-free-streak.ts +6 -0
  858. package/common/src/types/session-state.ts +237 -0
  859. package/common/src/types/skill.ts +56 -0
  860. package/common/src/types/source.ts +11 -0
  861. package/common/src/types/spawn.ts +13 -0
  862. package/common/src/types/subscription.ts +68 -0
  863. package/common/src/types/usage.ts +16 -0
  864. package/common/src/types/util.ts +3 -0
  865. package/common/src/util/__tests__/analytics-dispatcher.test.ts +145 -0
  866. package/common/src/util/__tests__/analytics-log.test.ts +110 -0
  867. package/common/src/util/__tests__/analytics-sampling.test.ts +131 -0
  868. package/common/src/util/__tests__/axiom-only-log.test.ts +64 -0
  869. package/common/src/util/__tests__/engagement-tracker.test.ts +115 -0
  870. package/common/src/util/__tests__/error-abort.test.ts +822 -0
  871. package/common/src/util/__tests__/error-api-details.test.ts +190 -0
  872. package/common/src/util/__tests__/format-code-search.test.ts +60 -0
  873. package/common/src/util/__tests__/log-mirror.test.ts +31 -0
  874. package/common/src/util/__tests__/messages.test.ts +1118 -0
  875. package/common/src/util/__tests__/partial-json-delta.test.ts +505 -0
  876. package/common/src/util/__tests__/paths.test.ts +289 -0
  877. package/common/src/util/__tests__/promise.test.ts +334 -0
  878. package/common/src/util/__tests__/protocol-config.test.ts +119 -0
  879. package/common/src/util/__tests__/rate-limit.test.ts +28 -0
  880. package/common/src/util/__tests__/reddit-savant-free-retention.test.ts +120 -0
  881. package/common/src/util/__tests__/savant-free-streak.test.ts +142 -0
  882. package/common/src/util/__tests__/saxy.test.ts +1008 -0
  883. package/common/src/util/__tests__/string.test.ts +238 -0
  884. package/common/src/util/__tests__/zoned-time.test.ts +88 -0
  885. package/common/src/util/agent-file-utils.ts +110 -0
  886. package/common/src/util/agent-id-parsing.ts +147 -0
  887. package/common/src/util/agent-name-normalization.ts +39 -0
  888. package/common/src/util/analytics-dispatcher.ts +81 -0
  889. package/common/src/util/analytics-log.ts +84 -0
  890. package/common/src/util/analytics-sampling.ts +225 -0
  891. package/common/src/util/array.ts +63 -0
  892. package/common/src/util/axiom-only-log.ts +79 -0
  893. package/common/src/util/cache-debug.ts +191 -0
  894. package/common/src/util/credentials.ts +12 -0
  895. package/common/src/util/currency.ts +25 -0
  896. package/common/src/util/dates.ts +81 -0
  897. package/common/src/util/engagement-tracker.ts +133 -0
  898. package/common/src/util/error.ts +580 -0
  899. package/common/src/util/file.ts +363 -0
  900. package/common/src/util/format-code-search.ts +115 -0
  901. package/common/src/util/lazy-response-ads.ts +93 -0
  902. package/common/src/util/log-data.ts +57 -0
  903. package/common/src/util/log-mirror.ts +34 -0
  904. package/common/src/util/lru-cache.ts +67 -0
  905. package/common/src/util/messages.ts +600 -0
  906. package/common/src/util/model-utils.ts +25 -0
  907. package/common/src/util/object.ts +137 -0
  908. package/common/src/util/param-helpers.ts +49 -0
  909. package/common/src/util/partial-json-delta.ts +100 -0
  910. package/common/src/util/paths.ts +194 -0
  911. package/common/src/util/promise.ts +87 -0
  912. package/common/src/util/protocol-config.ts +141 -0
  913. package/common/src/util/random.ts +15 -0
  914. package/common/src/util/rate-limit.ts +56 -0
  915. package/common/src/util/reddit-capi-events.ts +40 -0
  916. package/common/src/util/reddit-savant-free-retention.ts +69 -0
  917. package/common/src/util/response-ad-positions.ts +54 -0
  918. package/common/src/util/savant-free-privacy.ts +78 -0
  919. package/common/src/util/savant-free-streak.ts +153 -0
  920. package/common/src/util/saxy.ts +739 -0
  921. package/common/src/util/skills.ts +32 -0
  922. package/common/src/util/stop-sequence.ts +60 -0
  923. package/common/src/util/string.ts +419 -0
  924. package/common/src/util/system-info.ts +51 -0
  925. package/common/src/util/type-narrowing.ts +125 -0
  926. package/common/src/util/xml.ts +17 -0
  927. package/common/src/util/zod-schema.ts +80 -0
  928. package/common/src/util/zoned-time.ts +136 -0
  929. package/common/src/utils/ask-user-bridge.ts +47 -0
  930. package/common/tsconfig.json +8 -0
  931. package/database.db +0 -0
  932. package/dev/LEARNINGS.md +309 -0
  933. package/dev/fids/.gitkeep +0 -0
  934. package/dev/fids/archive/.gitkeep +0 -0
  935. package/dev/fids/archive/FID-2026-0802-008-sdk-package-audit-client-run-run-state.md +238 -0
  936. package/dev/fids/archive/FID-2026-0803-001-echo-enforcement-layer-drift.md +404 -0
  937. package/dev/fids/archive/FID-2026-0803-002-llm-providers-database-audit.md +348 -0
  938. package/dev/fids/archive/FID-2026-0803-003-sdk-impl-common-util-audit.md +277 -0
  939. package/dev/fids/archive/FID-2026-0803-004-checkpoint-rewind.md +181 -0
  940. package/dev/fids/archive/FID-2026-0803-005-quality-scan-hygiene-fixes.md +265 -0
  941. package/dev/fids/archive/FID-2026-0803-006-code-map-audit-hygiene.md +243 -0
  942. package/dev/fids/archive/FID-2026-0803-007-evals-benchmark-audit-hygiene.md +296 -0
  943. package/dev/fids/archive/FID-2026-0803-009-echo-enforcement-doc-drift.md +112 -0
  944. package/dev/fids/archive/FID-2026-0803-010-database-llm-providers-low-fixes.md +255 -0
  945. package/dev/fids/archive/FID-2026-0803-011-build-artifact-hygiene.md +169 -0
  946. package/dev/fids/archive/FID-2026-0803-012-release-readiness-audit.md +162 -0
  947. package/dev/fids/archive/FID-2026-0803-013-agent-roster-over-reporting.md +146 -0
  948. package/dev/fids/archive/FID-2026-0803-014-freebuff-to-savant-rebrand-sweep.md +185 -0
  949. package/dev/nova/reports/2026-08-02-top-25-ai-inference-providers-competitive-intel.md +213 -0
  950. package/dev/nova/specs/echo-v0.1.2-freebuff.md +391 -0
  951. package/dev/nova/specs/goal-loop-feature-spec.md +245 -0
  952. package/dev/nova/specs/launch-strategy-research-prompt.md +88 -0
  953. package/dev/releases/README.md +50 -0
  954. package/dev/scratchpad/.gitkeep +0 -0
  955. package/dev/session-summaries/.gitkeep +0 -0
  956. package/dev/session-summaries/2026-07-16-1255.md +128 -0
  957. package/dev/session-summaries/2026-07-17-1000.md +64 -0
  958. package/dev/session-summaries/2026-07-19-eslint-zero-tolerance-cleanup.md +145 -0
  959. package/dev/session-summaries/2026-07-19-fid-026-debugging-and-rename.md +79 -0
  960. package/dev/session-summaries/2026-07-19-fid-026-phase-b-rebrand.md +76 -0
  961. package/dev/session-summaries/2026-07-19-fid-027-clean-break.md +47 -0
  962. package/dev/session-summaries/2026-07-19-pre-push-house-cleaning.md +100 -0
  963. package/dev/session-summaries/2026-07-19-v0.0.2-release-session.md +229 -0
  964. package/dev/session-summaries/2026-07-20-1805-fid-loop-closure.md +95 -0
  965. package/dev/session-summaries/2026-07-22-1800.md +52 -0
  966. package/dev/session-summaries/2026-07-23-fsm-optimization.md +88 -0
  967. package/dev/session-summaries/2026-07-25-0000.md +80 -0
  968. package/dev/session-summaries/2026-07-25-1200-context-compaction.md +154 -0
  969. package/dev/session-summaries/2026-07-25-1600-layer4-reactive-compact.md +96 -0
  970. package/dev/session-summaries/2026-07-25-1700-dev-folder-audit.md +161 -0
  971. package/dev/session-summaries/2026-07-25-2000-benchmark-v2-filters.md +147 -0
  972. package/dev/session-summaries/2026-07-25-2000.md +77 -0
  973. package/dev/session-summaries/2026-07-27-0000.md +63 -0
  974. package/dev/session-summaries/2026-07-28-history-capture-handoff.md +206 -0
  975. package/dev/session-summaries/2026-07-31-freebuff-echo-compliance-remediation.md +156 -0
  976. package/dev/session-summaries/2026-07-31-pre-launch-optimization-execution.md +46 -0
  977. package/dev/session-summaries/2026-0721-1800.md +44 -0
  978. package/dev/session-summaries/2026-08-01-sidebar-folded-startup.md +159 -0
  979. package/dev/session-summaries/2026-08-02-0.0.15-release-closeout.md +32 -0
  980. package/dev/session-summaries/2026-08-02-repository-hygiene.md +51 -0
  981. package/dev/session-summaries/2026-08-03-agent-roster-fix-and-ready-check-closeout.md +73 -0
  982. package/dev/session-summaries/2026-08-03-build-artifact-hygiene-closeout.md +40 -0
  983. package/dev/session-summaries/2026-08-03-code-map-audit-closeout.md +44 -0
  984. package/dev/session-summaries/2026-08-03-database-llm-providers-low-fixes-closeout.md +47 -0
  985. package/dev/session-summaries/2026-08-03-echo-enforcement-doc-drift-closeout.md +43 -0
  986. package/dev/session-summaries/2026-08-03-evals-benchmark-audit-closeout.md +50 -0
  987. package/dev/session-summaries/2026-08-03-quality-scan-hygiene-fixes-closeout.md +57 -0
  988. package/dev/session-summaries/2026-08-03-quality-session-checkpoint-rewind-closeout.md +56 -0
  989. package/dev/session-summaries/2026-08-03-release-readiness-audit-closeout.md +60 -0
  990. package/dev/test-prompts/archive/0.0.2-final-pass.md +209 -0
  991. package/dev/test-prompts/archive/agent-capabilities-full-test.md +361 -0
  992. package/dev/test-prompts/archive/agent-capabilities-test.md +471 -0
  993. package/dev/test-prompts/archive/comprehensive-az-system-test-v1.md +441 -0
  994. package/dev/test-prompts/archive/comprehensive-az-system-test-v2-report.md +377 -0
  995. package/dev/test-prompts/archive/comprehensive-az-system-test-v2.md +544 -0
  996. package/dev/test-prompts/archive/comprehensive-az-system-test.md +396 -0
  997. package/dev/test-prompts/archive/comprehensive-az-test-final.md +900 -0
  998. package/dev/test-prompts/archive/comprehensive-az-test-v11.md +141 -0
  999. package/dev/test-prompts/archive/comprehensive-az-test-v12.md +29 -0
  1000. package/dev/test-prompts/archive/comprehensive-az-test-v6.md +631 -0
  1001. package/dev/test-prompts/archive/comprehensive-az-test-v7.md +625 -0
  1002. package/dev/test-prompts/archive/fid-007-ability-confirmation.md +248 -0
  1003. package/dev/test-prompts/archive/fid-2026-0801-006-thinker-tool-call-boundary.md +86 -0
  1004. package/dev/test-prompts/archive/fid-2026-0801-007-child-tool-set-fallback-cli.md +101 -0
  1005. package/dev/test-prompts/archive/fid-2026-0801-008-provider-tool-call-accumulation-cli.md +111 -0
  1006. package/dev/test-prompts/archive/fid-2026-0801-012-thinker-state-output-cli.md +134 -0
  1007. package/dev/test-prompts/archive/gemini-deep-research-sidebar-highlight.md +598 -0
  1008. package/dev/test-prompts/archive/goal-loop-cli-test.md +142 -0
  1009. package/dev/test-prompts/archive/rebrand-qa.md +258 -0
  1010. package/dev/test-prompts/archive/release-az-test-fid-085.md +306 -0
  1011. package/dev/test-prompts/archive/release-az-test-fid-087.md +219 -0
  1012. package/dev/test-prompts/archive/release-az-test-fid-2026-0726-001.md +270 -0
  1013. package/dev/test-prompts/archive/release-az-test-fid-2026-0728-008.md +213 -0
  1014. package/dev/test-prompts/archive/release-az-test-fid-2026-0728-launch-tracks.md +253 -0
  1015. package/dev/test-prompts/archive/release-az-test-fid-2026-0731-pre-launch.md +102 -0
  1016. package/docs/AI Coding Agents Market Research.md +516 -0
  1017. package/docs/Agent Harness Feature Pairing Research.md +166 -0
  1018. package/docs/CLI Agent Inference Backend Research.md +446 -0
  1019. package/docs/Codebuff Rebranding And Migration Plan.md +418 -0
  1020. package/docs/ECHO-EVOLUTION-ARCH.md +77 -0
  1021. package/docs/Harness Engineering for Coding Agents Research.md +196 -0
  1022. package/docs/Launch Plan Review and Optimization.md +178 -0
  1023. package/docs/OpenTUI Sidebar Bug Fix.md +245 -0
  1024. package/docs/SAVANT-VERSIONING.md +31 -0
  1025. package/docs/Savant Code Launch Strategy.md +270 -0
  1026. package/docs/Savant-Code Business And Backend Research.md +222 -0
  1027. package/docs/agents-and-tools.md +217 -0
  1028. package/docs/cloudflare-llms-full.md +9623 -0
  1029. package/docs/design/OpenTUI Terminal Visualization Guide.md +471 -0
  1030. package/docs/design/database-architecture.md +217 -0
  1031. package/docs/design/deep-research-report.md +295 -0
  1032. package/docs/design/thinker-sequentialthinking-regression-diagnostic.md +366 -0
  1033. package/docs/discord-server-design.md +167 -0
  1034. package/docs/gravity-integration-starter.md +202 -0
  1035. package/docs/launch/hn-first-comment.md +44 -0
  1036. package/docs/launch/hn-post.md +35 -0
  1037. package/docs/launch/incident-response.md +88 -0
  1038. package/docs/launch/landing/index.html +233 -0
  1039. package/docs/launch/mastodon-thread.md +52 -0
  1040. package/docs/launch/newsletter-pitch.md +49 -0
  1041. package/docs/launch/twitter-thread.md +62 -0
  1042. package/docs/privacy.md +186 -0
  1043. package/docs/reports/Savant-Code Benchmark Specification.md +206 -0
  1044. package/docs/reports/Thinker Agent Architecture Research.md +284 -0
  1045. package/docs/reports/adoptable-features-2026-07-25.md +604 -0
  1046. package/docs/reports/adoptable-features-master.md +480 -0
  1047. package/docs/reports/codebuff-discord-feedback.md +43 -0
  1048. package/docs/reports/feature-parity-report.md +810 -0
  1049. package/docs/reports/repos/AionUi.md +75 -0
  1050. package/docs/reports/repos/OpenHands.md +76 -0
  1051. package/docs/reports/repos/SWE-agent.md +82 -0
  1052. package/docs/reports/repos/agno.md +89 -0
  1053. package/docs/reports/repos/aider.md +74 -0
  1054. package/docs/reports/repos/cline.md +83 -0
  1055. package/docs/reports/repos/codex.md +83 -0
  1056. package/docs/reports/repos/gemini-cli.md +92 -0
  1057. package/docs/reports/repos/goose.md +65 -0
  1058. package/docs/reports/repos/gpt-pilot.md +52 -0
  1059. package/docs/reports/repos/hermes-agent.md +101 -0
  1060. package/docs/reports/repos/kilocode.md +79 -0
  1061. package/docs/reports/repos/openclaude.md +99 -0
  1062. package/docs/reports/repos/openclaw.md +100 -0
  1063. package/docs/reports/repos/opencode-dev.md +78 -0
  1064. package/docs/reports/repos/zero.md +123 -0
  1065. package/docs/reports/savant-code-benchmark-v2-2026-08-03.md +76 -0
  1066. package/docs/savant-code-modes.md +338 -0
  1067. package/docs/testing.md +51 -0
  1068. package/docs/visual-mockup-neon-slate.txt +41 -0
  1069. package/eslint.config.js +211 -0
  1070. package/evals/README.md +45 -0
  1071. package/evals/benchmark/README.md +449 -0
  1072. package/evals/benchmark/agent-runner.ts +217 -0
  1073. package/evals/benchmark/analyze-task-scores.ts +496 -0
  1074. package/evals/benchmark/eval-codebuff-hard.json +3343 -0
  1075. package/evals/benchmark/eval-codebuff.json +3193 -0
  1076. package/evals/benchmark/eval-codebuff2.json +2494 -0
  1077. package/evals/benchmark/eval-manifold-hard.json +2525 -0
  1078. package/evals/benchmark/eval-manifold.json +1675 -0
  1079. package/evals/benchmark/eval-manifold2.json +1945 -0
  1080. package/evals/benchmark/eval-plane-hard.json +4372 -0
  1081. package/evals/benchmark/eval-plane.json +2028 -0
  1082. package/evals/benchmark/eval-plane2.json +3517 -0
  1083. package/evals/benchmark/eval-saleor-hard.json +6081 -0
  1084. package/evals/benchmark/eval-saleor.json +1829 -0
  1085. package/evals/benchmark/eval-saleor2.json +3273 -0
  1086. package/evals/benchmark/eval-task-generator.ts +158 -0
  1087. package/evals/benchmark/filter-supplemental-files.ts +225 -0
  1088. package/evals/benchmark/format-output.ts +215 -0
  1089. package/evals/benchmark/gen-evals.ts +294 -0
  1090. package/evals/benchmark/gen-repo-eval.ts +71 -0
  1091. package/evals/benchmark/judge.ts +308 -0
  1092. package/evals/benchmark/lessons-extractor.ts +247 -0
  1093. package/evals/benchmark/main-hard-tasks.ts +49 -0
  1094. package/evals/benchmark/main-single-eval.ts +23 -0
  1095. package/evals/benchmark/main.ts +29 -0
  1096. package/evals/benchmark/meta-analyzer.ts +329 -0
  1097. package/evals/benchmark/pick-commits.ts +627 -0
  1098. package/evals/benchmark/run-benchmark.ts +657 -0
  1099. package/evals/benchmark/runners/claude.ts +176 -0
  1100. package/evals/benchmark/runners/codex.ts +143 -0
  1101. package/evals/benchmark/runners/index.ts +4 -0
  1102. package/evals/benchmark/runners/opencode.ts +253 -0
  1103. package/evals/benchmark/runners/runner.ts +13 -0
  1104. package/evals/benchmark/runners/savant.ts +148 -0
  1105. package/evals/benchmark/setup-test-repo.ts +314 -0
  1106. package/evals/benchmark/trace-analyzer.ts +257 -0
  1107. package/evals/benchmark/trace-utils.ts +80 -0
  1108. package/evals/benchmark/types.ts +83 -0
  1109. package/evals/bunfig.toml +4 -0
  1110. package/evals/logger.ts +87 -0
  1111. package/evals/package.json +31 -0
  1112. package/evals/subagents/test-repo-utils.ts +131 -0
  1113. package/evals/tsconfig.json +13 -0
  1114. package/evals/v2/README.md +149 -0
  1115. package/evals/v2/reports/report.json +261 -0
  1116. package/evals/v2/reports/report.md +15 -0
  1117. package/evals/v2/schema/task.schema.json +172 -0
  1118. package/evals/v2/src/cli.ts +216 -0
  1119. package/evals/v2/src/golden.ts +73 -0
  1120. package/evals/v2/src/harness.ts +293 -0
  1121. package/evals/v2/src/metrics.ts +326 -0
  1122. package/evals/v2/src/registry.ts +179 -0
  1123. package/evals/v2/src/reports.ts +126 -0
  1124. package/evals/v2/src/runner.ts +143 -0
  1125. package/evals/v2/src/runners/savant.ts +105 -0
  1126. package/evals/v2/src/sandbox.ts +42 -0
  1127. package/evals/v2/src/sandboxes/docker.ts +49 -0
  1128. package/evals/v2/src/sandboxes/tempdir.ts +120 -0
  1129. package/evals/v2/src/schema.ts +83 -0
  1130. package/evals/v2/src/trace.ts +186 -0
  1131. package/evals/v2/src/verify.ts +199 -0
  1132. package/evals/v2/tasks/error_recovery/env-fault/calculator.js +11 -0
  1133. package/evals/v2/tasks/error_recovery/env-fault/calculator.test.js +15 -0
  1134. package/evals/v2/tasks/error_recovery/env-fault/golden.patch +15 -0
  1135. package/evals/v2/tasks/error_recovery/env-fault/task.yaml +20 -0
  1136. package/evals/v2/tasks/multi_agent_orchestration/options-contract/app.js +5 -0
  1137. package/evals/v2/tasks/multi_agent_orchestration/options-contract/app.test.js +7 -0
  1138. package/evals/v2/tasks/multi_agent_orchestration/options-contract/golden.patch +19 -0
  1139. package/evals/v2/tasks/multi_agent_orchestration/options-contract/greet.js +3 -0
  1140. package/evals/v2/tasks/multi_agent_orchestration/options-contract/orchestration.test.js +30 -0
  1141. package/evals/v2/tasks/multi_agent_orchestration/options-contract/task.yaml +29 -0
  1142. package/evals/v2/tasks/pure_coding/add-fix/add.js +3 -0
  1143. package/evals/v2/tasks/pure_coding/add-fix/add.test.js +11 -0
  1144. package/evals/v2/tasks/pure_coding/add-fix/golden.patch +7 -0
  1145. package/evals/v2/tasks/pure_coding/add-fix/task.yaml +20 -0
  1146. package/evals/v2/tasks/pure_coding/rename-greet/app.js +5 -0
  1147. package/evals/v2/tasks/pure_coding/rename-greet/app.test.js +32 -0
  1148. package/evals/v2/tasks/pure_coding/rename-greet/golden.patch +19 -0
  1149. package/evals/v2/tasks/pure_coding/rename-greet/greet.js +5 -0
  1150. package/evals/v2/tasks/pure_coding/rename-greet/task.yaml +21 -0
  1151. package/evals/v2/tests/golden.test.ts +104 -0
  1152. package/evals/v2/tests/harness.test.ts +204 -0
  1153. package/evals/v2/tests/metrics.test.ts +353 -0
  1154. package/evals/v2/tests/registry.test.ts +210 -0
  1155. package/evals/v2/tests/reports.test.ts +218 -0
  1156. package/evals/v2/tests/savant-runner.test.ts +218 -0
  1157. package/evals/v2/tests/schema.test.ts +127 -0
  1158. package/evals/v2/tests/tempdir-sandbox.test.ts +49 -0
  1159. package/evals/v2/tests/trace.test.ts +76 -0
  1160. package/evals/v2/tests/verify.test.ts +224 -0
  1161. package/license +202 -0
  1162. package/package.json +71 -44
  1163. package/packages/agent-runtime/README.md +46 -0
  1164. package/packages/agent-runtime/agent_exit +1 -0
  1165. package/packages/agent-runtime/bunfig.toml +2 -0
  1166. package/packages/agent-runtime/package.json +34 -0
  1167. package/packages/agent-runtime/src/__tests__/apply-patch-tool.test.ts +202 -0
  1168. package/packages/agent-runtime/src/__tests__/cost-aggregation.test.ts +397 -0
  1169. package/packages/agent-runtime/src/__tests__/generate-diffs-prompt.test.ts +107 -0
  1170. package/packages/agent-runtime/src/__tests__/get-file-reading-updates.test.ts +59 -0
  1171. package/packages/agent-runtime/src/__tests__/gravity-index-tool.test.ts +501 -0
  1172. package/packages/agent-runtime/src/__tests__/loop-agent-steps.test.ts +1512 -0
  1173. package/packages/agent-runtime/src/__tests__/main-prompt.test.ts +452 -0
  1174. package/packages/agent-runtime/src/__tests__/n-parameter.test.ts +984 -0
  1175. package/packages/agent-runtime/src/__tests__/process-file-block.test.ts +196 -0
  1176. package/packages/agent-runtime/src/__tests__/process-str-replace.test.ts +512 -0
  1177. package/packages/agent-runtime/src/__tests__/programmatic-tool-authorization.test.ts +219 -0
  1178. package/packages/agent-runtime/src/__tests__/prompt-caching-subagents.test.ts +749 -0
  1179. package/packages/agent-runtime/src/__tests__/prompts-schema-handling.test.ts +454 -0
  1180. package/packages/agent-runtime/src/__tests__/propose-tools.test.ts +824 -0
  1181. package/packages/agent-runtime/src/__tests__/read-docs-tool.test.ts +394 -0
  1182. package/packages/agent-runtime/src/__tests__/run-agent-step-prefill.test.ts +161 -0
  1183. package/packages/agent-runtime/src/__tests__/run-agent-step-tools.test.ts +612 -0
  1184. package/packages/agent-runtime/src/__tests__/run-programmatic-step.test.ts +1743 -0
  1185. package/packages/agent-runtime/src/__tests__/sandbox-generator.test.ts +154 -0
  1186. package/packages/agent-runtime/src/__tests__/spawn-agents-image-content.test.ts +354 -0
  1187. package/packages/agent-runtime/src/__tests__/spawn-agents-message-history.test.ts +280 -0
  1188. package/packages/agent-runtime/src/__tests__/spawn-agents-permissions.test.ts +664 -0
  1189. package/packages/agent-runtime/src/__tests__/stream-parser-abort.test.ts +250 -0
  1190. package/packages/agent-runtime/src/__tests__/stream-parser-reasoning.test.ts +194 -0
  1191. package/packages/agent-runtime/src/__tests__/subagent-streaming.test.ts +230 -0
  1192. package/packages/agent-runtime/src/__tests__/test-utils.ts +96 -0
  1193. package/packages/agent-runtime/src/__tests__/thinker-convergence-gate.test.ts +242 -0
  1194. package/packages/agent-runtime/src/__tests__/to-token-count-input-schema.test.ts +81 -0
  1195. package/packages/agent-runtime/src/__tests__/tool-executor-sandbox.test.ts +167 -0
  1196. package/packages/agent-runtime/src/__tests__/tool-stream-parser.test.ts +682 -0
  1197. package/packages/agent-runtime/src/__tests__/tool-validation-error.test.ts +1380 -0
  1198. package/packages/agent-runtime/src/__tests__/web-search-tool.test.ts +402 -0
  1199. package/packages/agent-runtime/src/__tests__/xml-tool-result-ordering.test.ts +264 -0
  1200. package/packages/agent-runtime/src/constants.ts +12 -0
  1201. package/packages/agent-runtime/src/context-compactor.ts +425 -0
  1202. package/packages/agent-runtime/src/find-files/__tests__/request-files-prompt.test.ts +190 -0
  1203. package/packages/agent-runtime/src/find-files/custom-file-picker-config.ts +61 -0
  1204. package/packages/agent-runtime/src/find-files/request-files-prompt.ts +462 -0
  1205. package/packages/agent-runtime/src/generate-diffs-prompt.ts +38 -0
  1206. package/packages/agent-runtime/src/get-file-reading-updates.ts +27 -0
  1207. package/packages/agent-runtime/src/llm-api/__tests__/gemini-with-fallbacks.test.ts +267 -0
  1208. package/packages/agent-runtime/src/llm-api/__tests__/serper-api.test.ts +297 -0
  1209. package/packages/agent-runtime/src/llm-api/claude.ts +7 -0
  1210. package/packages/agent-runtime/src/llm-api/context7-api.ts +290 -0
  1211. package/packages/agent-runtime/src/llm-api/gemini-with-fallbacks.ts +104 -0
  1212. package/packages/agent-runtime/src/llm-api/savant-code-web-api.ts +370 -0
  1213. package/packages/agent-runtime/src/llm-api/serper-api.ts +193 -0
  1214. package/packages/agent-runtime/src/main-prompt.ts +251 -0
  1215. package/packages/agent-runtime/src/mcp-constants.ts +12 -0
  1216. package/packages/agent-runtime/src/mcp.ts +83 -0
  1217. package/packages/agent-runtime/src/process-file-block.ts +118 -0
  1218. package/packages/agent-runtime/src/process-str-replace.ts +213 -0
  1219. package/packages/agent-runtime/src/prompt-agent-stream.ts +119 -0
  1220. package/packages/agent-runtime/src/run-agent-step.ts +1632 -0
  1221. package/packages/agent-runtime/src/run-programmatic-step.ts +633 -0
  1222. package/packages/agent-runtime/src/system-prompt/prompts.ts +215 -0
  1223. package/packages/agent-runtime/src/system-prompt/search-system-prompt.ts +89 -0
  1224. package/packages/agent-runtime/src/system-prompt/truncate-file-tree.ts +414 -0
  1225. package/packages/agent-runtime/src/templates/README.md +160 -0
  1226. package/packages/agent-runtime/src/templates/__tests__/agent-registry.test.ts +489 -0
  1227. package/packages/agent-runtime/src/templates/__tests__/strings.test.ts +465 -0
  1228. package/packages/agent-runtime/src/templates/agent-registry.ts +122 -0
  1229. package/packages/agent-runtime/src/templates/prompts.ts +189 -0
  1230. package/packages/agent-runtime/src/templates/strings.ts +292 -0
  1231. package/packages/agent-runtime/src/templates/types.ts +61 -0
  1232. package/packages/agent-runtime/src/tool-stream-parser.ts +260 -0
  1233. package/packages/agent-runtime/src/tools/filter-tool-set.ts +18 -0
  1234. package/packages/agent-runtime/src/tools/handlers/__tests__/glob.test.ts +331 -0
  1235. package/packages/agent-runtime/src/tools/handlers/__tests__/read-subtree.test.ts +346 -0
  1236. package/packages/agent-runtime/src/tools/handlers/__tests__/run-readonly-command.test.ts +284 -0
  1237. package/packages/agent-runtime/src/tools/handlers/handler-function-type.ts +77 -0
  1238. package/packages/agent-runtime/src/tools/handlers/list.ts +105 -0
  1239. package/packages/agent-runtime/src/tools/handlers/tool/__tests__/checkpoint-store.test.ts +394 -0
  1240. package/packages/agent-runtime/src/tools/handlers/tool/__tests__/skill.test.ts +98 -0
  1241. package/packages/agent-runtime/src/tools/handlers/tool/__tests__/write-file.test.ts +24 -0
  1242. package/packages/agent-runtime/src/tools/handlers/tool/add-message.ts +37 -0
  1243. package/packages/agent-runtime/src/tools/handlers/tool/add-subgoal.ts +30 -0
  1244. package/packages/agent-runtime/src/tools/handlers/tool/apply-patch.ts +120 -0
  1245. package/packages/agent-runtime/src/tools/handlers/tool/ask-user.ts +25 -0
  1246. package/packages/agent-runtime/src/tools/handlers/tool/browser-logs.ts +21 -0
  1247. package/packages/agent-runtime/src/tools/handlers/tool/checkpoint-store.ts +378 -0
  1248. package/packages/agent-runtime/src/tools/handlers/tool/code-search.ts +21 -0
  1249. package/packages/agent-runtime/src/tools/handlers/tool/composio.ts +52 -0
  1250. package/packages/agent-runtime/src/tools/handlers/tool/create-plan.ts +63 -0
  1251. package/packages/agent-runtime/src/tools/handlers/tool/end-turn.ts +15 -0
  1252. package/packages/agent-runtime/src/tools/handlers/tool/find-files.ts +161 -0
  1253. package/packages/agent-runtime/src/tools/handlers/tool/glob.ts +22 -0
  1254. package/packages/agent-runtime/src/tools/handlers/tool/gravity-index.ts +230 -0
  1255. package/packages/agent-runtime/src/tools/handlers/tool/list-directory.ts +22 -0
  1256. package/packages/agent-runtime/src/tools/handlers/tool/lookup-agent-info.ts +105 -0
  1257. package/packages/agent-runtime/src/tools/handlers/tool/propose-str-replace.ts +111 -0
  1258. package/packages/agent-runtime/src/tools/handlers/tool/propose-write-file.ts +89 -0
  1259. package/packages/agent-runtime/src/tools/handlers/tool/proposed-content-store.ts +64 -0
  1260. package/packages/agent-runtime/src/tools/handlers/tool/read-docs.ts +160 -0
  1261. package/packages/agent-runtime/src/tools/handlers/tool/read-files.ts +43 -0
  1262. package/packages/agent-runtime/src/tools/handlers/tool/read-subtree.ts +198 -0
  1263. package/packages/agent-runtime/src/tools/handlers/tool/read-url.ts +21 -0
  1264. package/packages/agent-runtime/src/tools/handlers/tool/render-ui.ts +15 -0
  1265. package/packages/agent-runtime/src/tools/handlers/tool/run-file-change-hooks.ts +20 -0
  1266. package/packages/agent-runtime/src/tools/handlers/tool/run-readonly-command.ts +215 -0
  1267. package/packages/agent-runtime/src/tools/handlers/tool/run-terminal-command.ts +33 -0
  1268. package/packages/agent-runtime/src/tools/handlers/tool/sequential-thinking.ts +53 -0
  1269. package/packages/agent-runtime/src/tools/handlers/tool/set-messages.ts +19 -0
  1270. package/packages/agent-runtime/src/tools/handlers/tool/set-output.ts +104 -0
  1271. package/packages/agent-runtime/src/tools/handlers/tool/set-scaffold-complete.ts +32 -0
  1272. package/packages/agent-runtime/src/tools/handlers/tool/skill.ts +146 -0
  1273. package/packages/agent-runtime/src/tools/handlers/tool/spawn-agent-inline.ts +149 -0
  1274. package/packages/agent-runtime/src/tools/handlers/tool/spawn-agent-utils.ts +436 -0
  1275. package/packages/agent-runtime/src/tools/handlers/tool/spawn-agents.ts +286 -0
  1276. package/packages/agent-runtime/src/tools/handlers/tool/str-replace.ts +135 -0
  1277. package/packages/agent-runtime/src/tools/handlers/tool/suggest-followups.ts +20 -0
  1278. package/packages/agent-runtime/src/tools/handlers/tool/task-completed.ts +15 -0
  1279. package/packages/agent-runtime/src/tools/handlers/tool/think-deeply.ts +25 -0
  1280. package/packages/agent-runtime/src/tools/handlers/tool/transition-phase.ts +160 -0
  1281. package/packages/agent-runtime/src/tools/handlers/tool/update-subgoal.ts +48 -0
  1282. package/packages/agent-runtime/src/tools/handlers/tool/web-search.ts +151 -0
  1283. package/packages/agent-runtime/src/tools/handlers/tool/write-file.ts +281 -0
  1284. package/packages/agent-runtime/src/tools/handlers/tool/write-todos.ts +19 -0
  1285. package/packages/agent-runtime/src/tools/prompts.ts +233 -0
  1286. package/packages/agent-runtime/src/tools/sandbox/__tests__/engine.test.ts +169 -0
  1287. package/packages/agent-runtime/src/tools/sandbox/__tests__/shell-denylist.test.ts +104 -0
  1288. package/packages/agent-runtime/src/tools/sandbox/engine.ts +109 -0
  1289. package/packages/agent-runtime/src/tools/sandbox/index.ts +14 -0
  1290. package/packages/agent-runtime/src/tools/sandbox/shell-denylist.ts +119 -0
  1291. package/packages/agent-runtime/src/tools/stream-parser.ts +407 -0
  1292. package/packages/agent-runtime/src/tools/thinker-convergence-gate.ts +162 -0
  1293. package/packages/agent-runtime/src/tools/thought-session-store.ts +43 -0
  1294. package/packages/agent-runtime/src/tools/tool-executor.ts +1098 -0
  1295. package/packages/agent-runtime/src/util/__tests__/messages.test.ts +995 -0
  1296. package/packages/agent-runtime/src/util/__tests__/parse-tool-calls-from-text.test.ts +363 -0
  1297. package/packages/agent-runtime/src/util/__tests__/simplify-tool-results.test.ts +382 -0
  1298. package/packages/agent-runtime/src/util/__tests__/stream-xml-parser.test.ts +285 -0
  1299. package/packages/agent-runtime/src/util/__tests__/think-tags.test.ts +49 -0
  1300. package/packages/agent-runtime/src/util/__tests__/token-counter.test.ts +121 -0
  1301. package/packages/agent-runtime/src/util/activity-tracking.ts +252 -0
  1302. package/packages/agent-runtime/src/util/agent-output.ts +102 -0
  1303. package/packages/agent-runtime/src/util/cache-debug.ts +330 -0
  1304. package/packages/agent-runtime/src/util/format-value.ts +16 -0
  1305. package/packages/agent-runtime/src/util/messages.ts +461 -0
  1306. package/packages/agent-runtime/src/util/parse-tool-calls-from-text.ts +122 -0
  1307. package/packages/agent-runtime/src/util/render-read-files-result.ts +18 -0
  1308. package/packages/agent-runtime/src/util/simplify-tool-results.ts +61 -0
  1309. package/packages/agent-runtime/src/util/stream-xml-parser.ts +259 -0
  1310. package/packages/agent-runtime/src/util/think-tags.ts +33 -0
  1311. package/packages/agent-runtime/src/util/token-counter.ts +136 -0
  1312. package/packages/agent-runtime/tsconfig.json +8 -0
  1313. package/packages/code-map/README.md +43 -0
  1314. package/packages/code-map/__tests__/integration.test.ts +278 -0
  1315. package/packages/code-map/__tests__/languages.test.ts +240 -0
  1316. package/packages/code-map/__tests__/parse.test.ts +640 -0
  1317. package/packages/code-map/__tests__/test-langs/test.c +42 -0
  1318. package/packages/code-map/__tests__/test-langs/test.cpp +34 -0
  1319. package/packages/code-map/__tests__/test-langs/test.cs +34 -0
  1320. package/packages/code-map/__tests__/test-langs/test.go +27 -0
  1321. package/packages/code-map/__tests__/test-langs/test.java +31 -0
  1322. package/packages/code-map/__tests__/test-langs/test.js +50 -0
  1323. package/packages/code-map/__tests__/test-langs/test.php +34 -0
  1324. package/packages/code-map/__tests__/test-langs/test.py +25 -0
  1325. package/packages/code-map/__tests__/test-langs/test.rb +28 -0
  1326. package/packages/code-map/__tests__/test-langs/test.rs +28 -0
  1327. package/packages/code-map/__tests__/test-langs/test.ts +31 -0
  1328. package/packages/code-map/package.json +33 -0
  1329. package/packages/code-map/src/index.ts +4 -0
  1330. package/packages/code-map/src/init-node.ts +185 -0
  1331. package/packages/code-map/src/languages.ts +344 -0
  1332. package/packages/code-map/src/parse.ts +410 -0
  1333. package/packages/code-map/src/tree-sitter-queries/readme.md +24 -0
  1334. package/packages/code-map/src/tree-sitter-queries/tree-sitter-c-tags.scm +16 -0
  1335. package/packages/code-map/src/tree-sitter-queries/tree-sitter-c_sharp-tags.scm +23 -0
  1336. package/packages/code-map/src/tree-sitter-queries/tree-sitter-cpp-tags.scm +29 -0
  1337. package/packages/code-map/src/tree-sitter-queries/tree-sitter-go-tags.scm +26 -0
  1338. package/packages/code-map/src/tree-sitter-queries/tree-sitter-java-tags.scm +19 -0
  1339. package/packages/code-map/src/tree-sitter-queries/tree-sitter-javascript-tags.scm +16 -0
  1340. package/packages/code-map/src/tree-sitter-queries/tree-sitter-php-tags.scm +23 -0
  1341. package/packages/code-map/src/tree-sitter-queries/tree-sitter-python-tags.scm +12 -0
  1342. package/packages/code-map/src/tree-sitter-queries/tree-sitter-ruby-tags.scm +58 -0
  1343. package/packages/code-map/src/tree-sitter-queries/tree-sitter-rust-tags.scm +26 -0
  1344. package/packages/code-map/src/tree-sitter-queries/tree-sitter-typescript-tags.scm +22 -0
  1345. package/packages/code-map/src/types.ts +11 -0
  1346. package/packages/code-map/src/utils.ts +12 -0
  1347. package/packages/code-map/tsconfig.json +10 -0
  1348. package/packages/database/README.md +43 -0
  1349. package/packages/database/package.json +28 -0
  1350. package/packages/database/src/__tests__/service.test.ts +167 -0
  1351. package/packages/database/src/index.ts +146 -0
  1352. package/packages/database/src/service.ts +342 -0
  1353. package/packages/database/tsconfig.json +9 -0
  1354. package/packages/llm-providers/README.md +42 -0
  1355. package/packages/llm-providers/package.json +42 -0
  1356. package/packages/llm-providers/src/ollama/__tests__/detect.test.ts +59 -0
  1357. package/packages/llm-providers/src/ollama/detect.ts +113 -0
  1358. package/packages/llm-providers/src/ollama/index.ts +2 -0
  1359. package/packages/llm-providers/src/openai-compatible/chat/convert-to-openai-compatible-chat-messages.test.ts +855 -0
  1360. package/packages/llm-providers/src/openai-compatible/chat/convert-to-openai-compatible-chat-messages.ts +177 -0
  1361. package/packages/llm-providers/src/openai-compatible/chat/get-response-metadata.ts +15 -0
  1362. package/packages/llm-providers/src/openai-compatible/chat/map-openai-compatible-finish-reason.ts +19 -0
  1363. package/packages/llm-providers/src/openai-compatible/chat/openai-compatible-api-types.ts +60 -0
  1364. package/packages/llm-providers/src/openai-compatible/chat/openai-compatible-chat-language-model.test.ts +549 -0
  1365. package/packages/llm-providers/src/openai-compatible/chat/openai-compatible-chat-language-model.ts +474 -0
  1366. package/packages/llm-providers/src/openai-compatible/chat/openai-compatible-chat-options.ts +25 -0
  1367. package/packages/llm-providers/src/openai-compatible/chat/openai-compatible-metadata-extractor.ts +49 -0
  1368. package/packages/llm-providers/src/openai-compatible/chat/openai-compatible-prepare-tools.ts +162 -0
  1369. package/packages/llm-providers/src/openai-compatible/chat/stream-transform.test.ts +106 -0
  1370. package/packages/llm-providers/src/openai-compatible/chat/stream-transform.ts +585 -0
  1371. package/packages/llm-providers/src/openai-compatible/completion/convert-to-openai-compatible-completion-prompt.ts +98 -0
  1372. package/packages/llm-providers/src/openai-compatible/completion/openai-compatible-completion-language-model.test.ts +173 -0
  1373. package/packages/llm-providers/src/openai-compatible/completion/openai-compatible-completion-language-model.ts +414 -0
  1374. package/packages/llm-providers/src/openai-compatible/completion/openai-compatible-completion-options.ts +33 -0
  1375. package/packages/llm-providers/src/openai-compatible/embedding/openai-compatible-embedding-model.ts +143 -0
  1376. package/packages/llm-providers/src/openai-compatible/embedding/openai-compatible-embedding-options.ts +21 -0
  1377. package/packages/llm-providers/src/openai-compatible/image/openai-compatible-image-model.ts +129 -0
  1378. package/packages/llm-providers/src/openai-compatible/image/openai-compatible-image-settings.ts +1 -0
  1379. package/packages/llm-providers/src/openai-compatible/index.ts +27 -0
  1380. package/packages/llm-providers/src/openai-compatible/openai-compatible-error.ts +34 -0
  1381. package/packages/llm-providers/src/openai-compatible/openai-compatible-provider.ts +174 -0
  1382. package/packages/llm-providers/src/openai-compatible/version.ts +5 -0
  1383. package/packages/llm-providers/tsconfig.json +9 -0
  1384. package/protocol.config.yaml +113 -0
  1385. package/savant-free/README.md +73 -0
  1386. package/savant-free/SPEC.md +385 -0
  1387. package/savant-free/cli/build.ts +49 -0
  1388. package/savant-free/cli/release/README.md +55 -0
  1389. package/savant-free/cli/release/index.js +37 -0
  1390. package/savant-free/cli/release/package.json +43 -0
  1391. package/savant-free/cli/release.ts +128 -0
  1392. package/savant-free/cli/smoke-test.test.ts +257 -0
  1393. package/savant-free/e2e/README.md +173 -0
  1394. package/savant-free/e2e/agent/savant-free-tester.ts +52 -0
  1395. package/savant-free/e2e/tests/ads-behavior.e2e.test.ts +51 -0
  1396. package/savant-free/e2e/tests/agent-startup.e2e.test.ts +61 -0
  1397. package/savant-free/e2e/tests/code-edit.e2e.test.ts +78 -0
  1398. package/savant-free/e2e/tests/help-command.e2e.test.ts +97 -0
  1399. package/savant-free/e2e/tests/knowledge-file.e2e.test.ts +66 -0
  1400. package/savant-free/e2e/tests/slash-commands.e2e.test.ts +119 -0
  1401. package/savant-free/e2e/tests/startup.e2e.test.ts +56 -0
  1402. package/savant-free/e2e/tests/terminal-command.e2e.test.ts +71 -0
  1403. package/savant-free/e2e/tests/version.e2e.test.ts +50 -0
  1404. package/savant-free/e2e/utils/binary-helpers.ts +24 -0
  1405. package/savant-free/e2e/utils/index.ts +17 -0
  1406. package/savant-free/e2e/utils/savant-free-session.ts +229 -0
  1407. package/savant-free/e2e/utils/tmux-custom-tools.ts +156 -0
  1408. package/savant-free/e2e/utils/tmux-helpers.ts +79 -0
  1409. package/savant-free/package.json +20 -0
  1410. package/scripts/eslint-rules/__fixtures__/debug-ast.mjs +20 -0
  1411. package/scripts/eslint-rules/__fixtures__/probe.mjs +41 -0
  1412. package/scripts/eslint-rules/__fixtures__/probe2.mjs +43 -0
  1413. package/scripts/eslint-rules/__fixtures__/rule-test.mjs +44 -0
  1414. package/scripts/eslint-rules/__fixtures__/rule-test2.mjs +27 -0
  1415. package/scripts/eslint-rules/__fixtures__/unknown-bad.ts +21 -0
  1416. package/scripts/eslint-rules/__fixtures__/unknown-good.ts +35 -0
  1417. package/scripts/eslint-rules/no-unknown-in-signatures.js +141 -0
  1418. package/scripts/release.py +360 -0
  1419. package/scripts/run-az-test.sh +1150 -0
  1420. package/scripts/sync-agents.py +337 -0
  1421. package/scripts/tmux/README.md +359 -0
  1422. package/scripts/tmux/package.json +9 -0
  1423. package/scripts/tmux/tmux-capture.sh +231 -0
  1424. package/scripts/tmux/tmux-cli.sh +160 -0
  1425. package/scripts/tmux/tmux-env.sh +34 -0
  1426. package/scripts/tmux/tmux-send.sh +339 -0
  1427. package/scripts/tmux/tmux-start.sh +264 -0
  1428. package/scripts/tmux/tmux-stop.sh +157 -0
  1429. package/scripts/tmux/tmux-viewer/README.md +254 -0
  1430. package/scripts/tmux/tmux-viewer/components/session-viewer.tsx +556 -0
  1431. package/scripts/tmux/tmux-viewer/components/theme.ts +54 -0
  1432. package/scripts/tmux/tmux-viewer/gif-encoder-2.d.ts +28 -0
  1433. package/scripts/tmux/tmux-viewer/gif-exporter.ts +278 -0
  1434. package/scripts/tmux/tmux-viewer/index.tsx +237 -0
  1435. package/scripts/tmux/tmux-viewer/package.json +9 -0
  1436. package/scripts/tmux/tmux-viewer/session-loader.ts +234 -0
  1437. package/scripts/tmux/tmux-viewer/tsconfig.json +9 -0
  1438. package/scripts/tmux/tmux-viewer/types.ts +76 -0
  1439. package/sdk/CHANGELOG.md +126 -0
  1440. package/sdk/PUBLISHING.md +55 -0
  1441. package/sdk/README.md +334 -0
  1442. package/sdk/bunfig.toml +6 -0
  1443. package/sdk/e2e/README.md +158 -0
  1444. package/sdk/e2e/custom-agents/api-integration-agent.e2e.test.ts +145 -0
  1445. package/sdk/e2e/custom-agents/apply-patch-tool.e2e.test.ts +62 -0
  1446. package/sdk/e2e/custom-agents/database-query-agent.e2e.test.ts +135 -0
  1447. package/sdk/e2e/custom-agents/weather-agent.e2e.test.ts +120 -0
  1448. package/sdk/e2e/examples/code-explainer.example.ts +62 -0
  1449. package/sdk/e2e/examples/code-reviewer.example.ts +52 -0
  1450. package/sdk/e2e/examples/commit-message-generator.example.ts +61 -0
  1451. package/sdk/e2e/examples/sdk-lint.example.ts +65 -0
  1452. package/sdk/e2e/examples/sdk-refactor.example.ts +63 -0
  1453. package/sdk/e2e/examples/sdk-test-gen.example.ts +62 -0
  1454. package/sdk/e2e/features/knowledge-files.e2e.test.ts +82 -0
  1455. package/sdk/e2e/features/max-agent-steps.e2e.test.ts +65 -0
  1456. package/sdk/e2e/features/project-files.e2e.test.ts +80 -0
  1457. package/sdk/e2e/integration/connection-check.integration.test.ts +33 -0
  1458. package/sdk/e2e/integration/event-ordering.integration.test.ts +186 -0
  1459. package/sdk/e2e/integration/event-types.integration.test.ts +183 -0
  1460. package/sdk/e2e/integration/stream-chunks.integration.test.ts +191 -0
  1461. package/sdk/e2e/streaming/concurrent-streams.e2e.test.ts +164 -0
  1462. package/sdk/e2e/streaming/subagent-streaming.e2e.test.ts +158 -0
  1463. package/sdk/e2e/utils/__tests__/event-collector.test.ts +297 -0
  1464. package/sdk/e2e/utils/e2e-mocks.ts +458 -0
  1465. package/sdk/e2e/utils/event-collector.ts +145 -0
  1466. package/sdk/e2e/utils/get-api-key.ts +76 -0
  1467. package/sdk/e2e/utils/index.ts +3 -0
  1468. package/sdk/e2e/utils/test-fixtures.ts +196 -0
  1469. package/sdk/e2e/workflows/error-recovery.e2e.test.ts +112 -0
  1470. package/sdk/e2e/workflows/multi-turn-conversation.e2e.test.ts +132 -0
  1471. package/sdk/examples/readme-example-1.ts +34 -0
  1472. package/sdk/examples/readme-example-2.ts +76 -0
  1473. package/sdk/package.json +82 -0
  1474. package/sdk/scripts/build.ts +349 -0
  1475. package/sdk/scripts/fetch-ripgrep.ts +172 -0
  1476. package/sdk/scripts/publish.ts +51 -0
  1477. package/sdk/scripts/release.js +100 -0
  1478. package/sdk/scripts/verify.ts +204 -0
  1479. package/sdk/sdk_exit +1 -0
  1480. package/sdk/smoke-test-dist.ts +248 -0
  1481. package/sdk/src/__tests__/apply-overrides-resume.test.ts +83 -0
  1482. package/sdk/src/__tests__/apply-patch.test.ts +438 -0
  1483. package/sdk/src/__tests__/build-file-tree.test.ts +31 -0
  1484. package/sdk/src/__tests__/change-file.test.ts +212 -0
  1485. package/sdk/src/__tests__/client.test.ts +142 -0
  1486. package/sdk/src/__tests__/clone-session-state.test.ts +158 -0
  1487. package/sdk/src/__tests__/code-search.test.ts +896 -0
  1488. package/sdk/src/__tests__/composio.test.ts +86 -0
  1489. package/sdk/src/__tests__/credentials.test.ts +344 -0
  1490. package/sdk/src/__tests__/database.test.ts +153 -0
  1491. package/sdk/src/__tests__/env.test.ts +137 -0
  1492. package/sdk/src/__tests__/error-utils.test.ts +253 -0
  1493. package/sdk/src/__tests__/fixtures/windows-stubborn-grandchild.ts +26 -0
  1494. package/sdk/src/__tests__/initial-session-state.test.ts +447 -0
  1495. package/sdk/src/__tests__/knowledge-file-selection.test.ts +335 -0
  1496. package/sdk/src/__tests__/load-agents.test.ts +935 -0
  1497. package/sdk/src/__tests__/load-mcp-config.test.ts +285 -0
  1498. package/sdk/src/__tests__/load-skills.test.ts +325 -0
  1499. package/sdk/src/__tests__/model-provider.test.ts +44 -0
  1500. package/sdk/src/__tests__/path-utils.test.ts +66 -0
  1501. package/sdk/src/__tests__/read-files.test.ts +573 -0
  1502. package/sdk/src/__tests__/read-url.test.ts +371 -0
  1503. package/sdk/src/__tests__/researcher-web.integration.test.ts +130 -0
  1504. package/sdk/src/__tests__/run-cancellation.test.ts +1321 -0
  1505. package/sdk/src/__tests__/run-error-preserves-history.test.ts +335 -0
  1506. package/sdk/src/__tests__/run-event-dispatch.test.ts +80 -0
  1507. package/sdk/src/__tests__/run-file-filter.test.ts +530 -0
  1508. package/sdk/src/__tests__/run-handle-event.test.ts +142 -0
  1509. package/sdk/src/__tests__/run-mcp-tool-filter.test.ts +124 -0
  1510. package/sdk/src/__tests__/run-state-child-process.test.ts +72 -0
  1511. package/sdk/src/__tests__/run-terminal-command.test.ts +236 -0
  1512. package/sdk/src/__tests__/run.integration.test.ts +170 -0
  1513. package/sdk/src/__tests__/user-knowledge-files.test.ts +361 -0
  1514. package/sdk/src/__tests__/validate-agents.test.ts +943 -0
  1515. package/sdk/src/agents/load-agents.ts +339 -0
  1516. package/sdk/src/agents/load-mcp-config.ts +275 -0
  1517. package/sdk/src/client.ts +87 -0
  1518. package/sdk/src/composio.ts +78 -0
  1519. package/sdk/src/constants.ts +29 -0
  1520. package/sdk/src/credentials.ts +303 -0
  1521. package/sdk/src/custom-tool.ts +66 -0
  1522. package/sdk/src/env.ts +116 -0
  1523. package/sdk/src/error-utils.ts +127 -0
  1524. package/sdk/src/impl/__tests__/llm-chatgpt-oauth-policy.test.ts +67 -0
  1525. package/sdk/src/impl/__tests__/llm-native-tool-call.test.ts +38 -0
  1526. package/sdk/src/impl/__tests__/llm-stream-yielded-content.test.ts +118 -0
  1527. package/sdk/src/impl/__tests__/model-provider-free-mode.test.ts +166 -0
  1528. package/sdk/src/impl/__tests__/prompt-result.test.ts +210 -0
  1529. package/sdk/src/impl/__tests__/provider-options-metadata.test.ts +67 -0
  1530. package/sdk/src/impl/agent-runtime.ts +159 -0
  1531. package/sdk/src/impl/chatgpt-backend-fetch.ts +588 -0
  1532. package/sdk/src/impl/database.ts +516 -0
  1533. package/sdk/src/impl/llm.ts +852 -0
  1534. package/sdk/src/impl/model-provider.ts +638 -0
  1535. package/sdk/src/impl/openrouter-key-resolver.ts +78 -0
  1536. package/sdk/src/index.ts +133 -0
  1537. package/sdk/src/native/ripgrep.ts +141 -0
  1538. package/sdk/src/retry-config.ts +51 -0
  1539. package/sdk/src/run-state.ts +897 -0
  1540. package/sdk/src/run.ts +1222 -0
  1541. package/sdk/src/skills/load-skills.ts +253 -0
  1542. package/sdk/src/testing/env.ts +19 -0
  1543. package/sdk/src/tools/apply-patch.ts +690 -0
  1544. package/sdk/src/tools/change-file.ts +155 -0
  1545. package/sdk/src/tools/code-search.ts +547 -0
  1546. package/sdk/src/tools/glob.ts +58 -0
  1547. package/sdk/src/tools/index.ts +19 -0
  1548. package/sdk/src/tools/list-directory.ts +52 -0
  1549. package/sdk/src/tools/path-utils.ts +101 -0
  1550. package/sdk/src/tools/read-files.ts +110 -0
  1551. package/sdk/src/tools/read-url.ts +469 -0
  1552. package/sdk/src/tools/run-file-change-hooks.ts +22 -0
  1553. package/sdk/src/tools/run-terminal-command.ts +483 -0
  1554. package/sdk/src/tools/ssrf.ts +120 -0
  1555. package/sdk/src/types/env.ts +40 -0
  1556. package/sdk/src/utils/logger.ts +15 -0
  1557. package/sdk/src/validate-agents.ts +157 -0
  1558. package/sdk/test/cjs-compatibility/package-lock.json +423 -0
  1559. package/sdk/test/cjs-compatibility/package.json +21 -0
  1560. package/sdk/test/cjs-compatibility/test-imports.js +77 -0
  1561. package/sdk/test/cjs-compatibility/test-types.ts +54 -0
  1562. package/sdk/test/cjs-compatibility/tsconfig.json +17 -0
  1563. package/sdk/test/esm-compatibility/package-lock.json +423 -0
  1564. package/sdk/test/esm-compatibility/package.json +21 -0
  1565. package/sdk/test/esm-compatibility/test-imports.js +83 -0
  1566. package/sdk/test/esm-compatibility/test-types.ts +59 -0
  1567. package/sdk/test/esm-compatibility/tsconfig.json +17 -0
  1568. package/sdk/test/ripgrep-bundling/package-lock.json +423 -0
  1569. package/sdk/test/ripgrep-bundling/package.json +21 -0
  1570. package/sdk/test/ripgrep-bundling/test-ripgrep-types.ts +132 -0
  1571. package/sdk/test/ripgrep-bundling/test-ripgrep.js +257 -0
  1572. package/sdk/test/ripgrep-bundling/tsconfig.json +15 -0
  1573. package/sdk/test/setup-env.ts +54 -0
  1574. package/sdk/test/test-sdk.ts +25 -0
  1575. package/sdk/test/tree-sitter-queries/package-lock.json +47 -0
  1576. package/sdk/test/tree-sitter-queries/package.json +12 -0
  1577. package/sdk/test/tree-sitter-queries/test-query-files.js +256 -0
  1578. package/sdk/tsconfig.build.json +32 -0
  1579. package/sdk/tsconfig.json +27 -0
  1580. package/sdk/vendor/ripgrep/arm64-darwin/rg +0 -0
  1581. package/sdk/vendor/ripgrep/arm64-linux/rg +0 -0
  1582. package/sdk/vendor/ripgrep/x64-darwin/rg +0 -0
  1583. package/sdk/vendor/ripgrep/x64-linux/rg +0 -0
  1584. package/sdk/vendor/ripgrep/x64-win32/rg.exe +0 -0
  1585. package/templates/FID-TEMPLATE.md +125 -0
  1586. package/templates/README-TEMPLATE.md +87 -0
  1587. package/templates/SESSION-SUMMARY.md +135 -0
  1588. package/tsconfig.base.json +18 -0
  1589. package/tsconfig.json +27 -0
  1590. /package/{http.js → cli/release-core/http.js} +0 -0
  1591. /package/{launcher.js → cli/release-core/launcher.js} +0 -0
@@ -0,0 +1,1150 @@
1
+ #!/usr/bin/env bash
2
+ # =============================================================================
3
+ # Savant-Code — Automated A-Z System Test Runner (v11)
4
+ # =============================================================================
5
+ # Automates all code-level (non-interactive) tests from the A-Z test prompt.
6
+ # Interactive-only tests (slash commands, TUI, /dev, agent spawning) are marked
7
+ # SKIP with instructions for manual verification.
8
+ #
9
+ # USAGE:
10
+ # bash scripts/run-az-test.sh # Run all automatable tests
11
+ # bash scripts/run-az-test.sh --phase 15 # Run only typecheck phase
12
+ # bash scripts/run-az-test.sh --summary # Print summary only (from last run)
13
+ # bash scripts/run-az-test.sh --help # Show usage
14
+ #
15
+ # REQUIREMENTS:
16
+ # - bash 4+
17
+ # - bun (for typechecks)
18
+ # - ripgrep (rg) or grep -r (for pattern checks)
19
+ # - jq (optional, for JSON output)
20
+ #
21
+ # OUTPUT:
22
+ # dev/scratchpad/az-test-results.json — Machine-readable results
23
+ # dev/scratchpad/az-test-results.md — Human-readable report
24
+ # =============================================================================
25
+
26
+ set -euo pipefail
27
+
28
+ # ── Configuration ─────────────────────────────────────────────────────────────
29
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
30
+ REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
31
+ RESULTS_DIR="$REPO_ROOT/dev/scratchpad"
32
+ RESULTS_JSON="$RESULTS_DIR/az-test-results.json"
33
+ RESULTS_MD="$RESULTS_DIR/az-test-results.md"
34
+ FILTER_PHASE=""
35
+
36
+ # Colors (no-op if not a terminal)
37
+ if [ -t 1 ]; then
38
+ RED='\033[0;31m'
39
+ GREEN='\033[0;32m'
40
+ YELLOW='\033[1;33m'
41
+ CYAN='\033[0;36m'
42
+ BOLD='\033[1m'
43
+ RESET='\033[0m'
44
+ else
45
+ RED='' GREEN='' YELLOW='' CYAN='' BOLD='' RESET=''
46
+ fi
47
+
48
+ # ── Counters ──────────────────────────────────────────────────────────────────
49
+ PASS_COUNT=0
50
+ FAIL_COUNT=0
51
+ SKIP_COUNT=0
52
+ TOTAL_COUNT=0
53
+ RESULTS=()
54
+
55
+ # ── Helpers ───────────────────────────────────────────────────────────────────
56
+ pass() {
57
+ local id="$1" desc="$2"
58
+ TOTAL_COUNT=$((TOTAL_COUNT + 1))
59
+ PASS_COUNT=$((PASS_COUNT + 1))
60
+ RESULTS+=("{\"id\":\"$id\",\"status\":\"PASS\",\"description\":\"$desc\"}")
61
+ echo -e " ${GREEN}✅ PASS${RESET} $id — $desc"
62
+ }
63
+
64
+ fail() {
65
+ local id="$1" desc="$2" detail="${3:-}"
66
+ TOTAL_COUNT=$((TOTAL_COUNT + 1))
67
+ FAIL_COUNT=$((FAIL_COUNT + 1))
68
+ RESULTS+=("{\"id\":\"$id\",\"status\":\"FAIL\",\"description\":\"$desc\",\"detail\":\"$detail\"}")
69
+ echo -e " ${RED}❌ FAIL${RESET} $id — $desc"
70
+ if [ -n "$detail" ]; then
71
+ echo -e " ${RED}↳ $detail${RESET}"
72
+ fi
73
+ }
74
+
75
+ skip() {
76
+ local id="$1" desc="$2" reason="${3:-interactive-only}"
77
+ TOTAL_COUNT=$((TOTAL_COUNT + 1))
78
+ SKIP_COUNT=$((SKIP_COUNT + 1))
79
+ RESULTS+=("{\"id\":\"$id\",\"status\":\"SKIP\",\"description\":\"$desc\",\"reason\":\"$reason\"}")
80
+ echo -e " ${YELLOW}⏭ SKIP${RESET} $id — $desc ($reason)"
81
+ }
82
+
83
+ header() {
84
+ echo ""
85
+ echo -e "${BOLD}━━━ $1 ━━━${RESET}"
86
+ }
87
+
88
+ # Check if a file contains a pattern (case-insensitive)
89
+ grep_q() {
90
+ local pattern="$1" file="$2"
91
+ grep -qiE "$pattern" "$file" 2>/dev/null
92
+ }
93
+
94
+ # Check if a file does NOT contain a pattern
95
+ grep_not() {
96
+ local pattern="$1" file="$2"
97
+ ! grep -qiE "$pattern" "$file" 2>/dev/null
98
+ }
99
+
100
+ # Check if rg/grep finds matches in a file or directory (recursive).
101
+ # Uses grep -rE for portability (Windows Git Bash compatible).
102
+ rg_check() {
103
+ local pattern="$1" path="$2"
104
+ if [ -d "$path" ]; then
105
+ grep -rqE "$pattern" "$path" 2>/dev/null
106
+ else
107
+ grep -qE "$pattern" "$path" 2>/dev/null
108
+ fi
109
+ }
110
+
111
+ # Check if rg/grep does NOT find matches in a file or directory
112
+ rg_not() {
113
+ local pattern="$1" path="$2"
114
+ if [ -d "$path" ]; then
115
+ ! grep -rqE "$pattern" "$path" 2>/dev/null
116
+ else
117
+ ! grep -qE "$pattern" "$path" 2>/dev/null
118
+ fi
119
+ }
120
+
121
+ # Count rg/grep matches in a file or directory
122
+ rg_count() {
123
+ local pattern="$1" path="$2"
124
+ if [ -d "$path" ]; then
125
+ grep -rcE "$pattern" "$path" 2>/dev/null | awk -F: '{s+=$NF} END {print s+0}' || true
126
+ else
127
+ grep -cE "$pattern" "$path" 2>/dev/null || echo "0"
128
+ fi
129
+ }
130
+
131
+ # Count rg/grep matches in production source only (exclude test files and __tests__ dirs)
132
+ rg_count_prod() {
133
+ local pattern="$1" path="$2"
134
+ find "$path" -type f \( -name '*.ts' -o -name '*.tsx' \) ! -name '*.test.ts' ! -name '*.test.tsx' ! -name '*.spec.ts' ! -name '*.spec.tsx' ! -path '*/__tests__/*' -print0 2>/dev/null | \
135
+ xargs -0 grep -cE "$pattern" 2>/dev/null | awk -F: '{s+=$NF} END {print s+0}' || true
136
+ }
137
+
138
+ # ── Argument Parsing ──────────────────────────────────────────────────────────
139
+ while [[ $# -gt 0 ]]; do
140
+ case "$1" in
141
+ --phase)
142
+ FILTER_PHASE="$2"
143
+ shift 2
144
+ ;;
145
+ --summary)
146
+ if [ -f "$RESULTS_MD" ]; then
147
+ cat "$RESULTS_MD"
148
+ else
149
+ echo "No previous results found. Run the test first."
150
+ fi
151
+ exit 0
152
+ ;;
153
+ --help|-h)
154
+ head -30 "$0" | tail -20
155
+ exit 0
156
+ ;;
157
+ *)
158
+ echo "Unknown option: $1"
159
+ exit 1
160
+ ;;
161
+ esac
162
+ done
163
+
164
+ run_phase() {
165
+ local phase_num="$1"
166
+ if [ -n "$FILTER_PHASE" ] && [ "$FILTER_PHASE" != "$phase_num" ]; then
167
+ return 1
168
+ fi
169
+ return 0
170
+ }
171
+
172
+ # ── Ensure results directory exists ──────────────────────────────────────────
173
+ mkdir -p "$RESULTS_DIR"
174
+
175
+ echo -e "${BOLD}Savant-Code — Automated A-Z System Test v11${RESET}"
176
+ echo "Date: $(date '+%Y-%m-%d %H:%M:%S')"
177
+ echo "Platform: $(uname -s)"
178
+ echo ""
179
+
180
+ # =============================================================================
181
+ # Phase 1: Boot & Identity
182
+ # =============================================================================
183
+ if run_phase 1; then
184
+ header "Phase 1: Boot & Identity"
185
+
186
+ # T1: ECHO Protocol bootstrap
187
+ if [ -f "$REPO_ROOT/ECHO.md" ]; then
188
+ if grep_q "Protocol" "$REPO_ROOT/ECHO.md" && grep_q "Law" "$REPO_ROOT/ECHO.md"; then
189
+ pass "T1" "ECHO.md exists with Protocol and Laws"
190
+ else
191
+ fail "T1" "ECHO.md exists but missing expected content" "Protocol or Law not found"
192
+ fi
193
+ else
194
+ fail "T1" "ECHO.md does not exist"
195
+ fi
196
+
197
+ # T2: Open FIDs scan
198
+ if [ -d "$REPO_ROOT/dev/fids" ] && [ -d "$REPO_ROOT/dev/fids/archive" ]; then
199
+ pass "T2" "dev/fids/ and dev/fids/archive/ both exist"
200
+ else
201
+ fail "T2" "FID directories missing" "dev/fids or dev/fids/archive not found"
202
+ fi
203
+
204
+ # T3-T5: Interactive-only
205
+ skip "T3" "Phase display in sidebar" "interactive-only"
206
+ skip "T4" "Model metadata awareness" "interactive-only"
207
+ skip "T5" "Direct-provider mode boot" "interactive-only"
208
+ fi
209
+
210
+ # =============================================================================
211
+ # Phase 2: Direct Tools (read tools + detective pattern checks)
212
+ # =============================================================================
213
+ if run_phase 2; then
214
+ header "Phase 2: Direct Tools"
215
+
216
+ # T6-T9: Read tools (file existence)
217
+ for tid in T6 T7 T8 T9; do
218
+ case "$tid" in
219
+ T6) f="ECHO.md" ;;
220
+ T7) f="protocol.config.yaml" ;;
221
+ T8) f="package.json" ;;
222
+ T9) f="ARCHITECTURE.md" ;;
223
+ esac
224
+ if [ -f "$REPO_ROOT/$f" ]; then
225
+ pass "$tid" "read_files: $f exists"
226
+ else
227
+ fail "$tid" "read_files: $f missing"
228
+ fi
229
+ done
230
+
231
+ # T10: glob cli/src/**/*.ts
232
+ count=$(find "$REPO_ROOT/cli/src" -name "*.ts" -o -name "*.tsx" 2>/dev/null | wc -l)
233
+ if [ "$count" -gt 0 ]; then
234
+ pass "T10" "glob cli/src/**/*.ts — $count files found"
235
+ else
236
+ fail "T10" "glob cli/src/**/*.ts — no files found"
237
+ fi
238
+
239
+ # T11-T12: list_directory
240
+ if [ -d "$REPO_ROOT/dev/fids" ]; then
241
+ pass "T11" "list_directory dev/fids — directory exists"
242
+ else
243
+ fail "T11" "list_directory dev/fids — directory missing"
244
+ fi
245
+
246
+ agent_dirs=$(find "$REPO_ROOT/agents" -maxdepth 1 -type d 2>/dev/null | wc -l)
247
+ if [ "$agent_dirs" -gt 5 ]; then
248
+ pass "T12" "list_directory agents — $((agent_dirs - 1)) subdirectories"
249
+ else
250
+ fail "T12" "list_directory agents — too few subdirectories ($agent_dirs)"
251
+ fi
252
+
253
+ # T13: glob agents/**/*.ts
254
+ agent_ts=$(find "$REPO_ROOT/agents" -name "*.ts" 2>/dev/null | wc -l)
255
+ if [ "$agent_ts" -gt 10 ]; then
256
+ pass "T13" "glob agents/**/*.ts — $agent_ts files"
257
+ else
258
+ fail "T13" "glob agents/**/*.ts — too few files ($agent_ts)"
259
+ fi
260
+
261
+ # T14: resolveAndContain in paths.ts
262
+ if rg_check "resolveAndContain" "$REPO_ROOT/common/src/util/paths.ts" 2>/dev/null; then
263
+ pass "T14" "resolveAndContain exported in common/src/util/paths.ts"
264
+ else
265
+ fail "T14" "resolveAndContain NOT found in common/src/util/paths.ts"
266
+ fi
267
+
268
+ # T15: fsmPhase in agent-runtime
269
+ if rg_check "fsmPhase" "$REPO_ROOT/packages/agent-runtime/src" 2>/dev/null; then
270
+ pass "T15" "fsmPhase referenced in packages/agent-runtime/src"
271
+ else
272
+ fail "T15" "fsmPhase NOT found in packages/agent-runtime/src"
273
+ fi
274
+
275
+ # T15a: run_readonly_command (verify tool definition exists)
276
+ if [ -f "$REPO_ROOT/packages/agent-runtime/src/tools/handlers/tool/run-readonly-command.ts" ]; then
277
+ pass "T15a" "run_readonly_command handler file exists"
278
+ elif rg_check "run_readonly_command" "$REPO_ROOT/packages/agent-runtime/src/tools/handlers/list.ts" 2>/dev/null; then
279
+ pass "T15a" "run_readonly_command registered in handler list"
280
+ else
281
+ fail "T15a" "run_readonly_command tool handler NOT found"
282
+ fi
283
+
284
+ # T16: cwd parameter documented
285
+ if rg_check "cwd" "$REPO_ROOT/common/src/tools/params/tool/run-readonly-command.ts" 2>/dev/null; then
286
+ pass "T16" "cwd parameter in run_readonly_command params"
287
+ else
288
+ fail "T16" "cwd parameter NOT in run_readonly_command params"
289
+ fi
290
+
291
+ # T17-T29: Interactive-only (FSM transitions, write tools)
292
+ skip "T17-21" "Write tools in GREEN phase" "interactive-only"
293
+ skip "T22-26" "Valid FSM transitions" "interactive-only"
294
+ skip "T27-29" "Illegal FSM transitions" "interactive-only"
295
+ fi
296
+
297
+ # =============================================================================
298
+ # Phase 3: Dev Override
299
+ # =============================================================================
300
+ if run_phase 3; then
301
+ header "Phase 3: Dev Override"
302
+ skip "T29-32" "Dev mode activation" "interactive-only"
303
+ skip "T33" "Unknown /dev subcommand" "interactive-only"
304
+ fi
305
+
306
+ # =============================================================================
307
+ # Phase 4: Slash Commands
308
+ # =============================================================================
309
+ if run_phase 4; then
310
+ header "Phase 4: Slash Commands"
311
+ skip "T34-43" "Available slash commands" "interactive-only"
312
+ skip "T44" "/model free-text selection" "interactive-only"
313
+ skip "T45" "/verify variants" "interactive-only"
314
+ fi
315
+
316
+ # =============================================================================
317
+ # Phase 5: Agent Roster
318
+ # =============================================================================
319
+ if run_phase 5; then
320
+ header "Phase 5: Agent Roster"
321
+
322
+ # Agent roster: name -> file path (parallel arrays for bash 3 compat)
323
+ AGENT_NAMES=("Orchestrator (Savant)" "Detective" "Forge" "Verifier" "Recorder" "Thinker" "Scout" "Researcher (Web)" "Researcher (Docs)" "Scribe")
324
+ AGENT_FILES=("agents/savant/savant.ts" "agents/detective/detective.ts" "agents/forge/forge.ts" "agents/verifier/verifier.ts" "agents/recorder/recorder.ts" "agents/thinker/thinker.ts" "agents/scout/scout.ts" "agents/researcher/researcher-web.ts" "agents/researcher/researcher-docs.ts" "agents/scribe/scribe.ts")
325
+
326
+ tid=46
327
+ for i in "${!AGENT_NAMES[@]}"; do
328
+ agent="${AGENT_NAMES[$i]}"
329
+ file="${AGENT_FILES[$i]}"
330
+ if [ -f "$REPO_ROOT/$file" ]; then
331
+ pass "T$tid" "Agent '$agent' exists at $file"
332
+ else
333
+ fail "T$tid" "Agent '$agent' MISSING at $file"
334
+ fi
335
+ tid=$((tid + 1))
336
+ done
337
+
338
+ # Verify tool sets
339
+ if rg_check "spawn_agents" "$REPO_ROOT/agents/savant/savant.ts" 2>/dev/null; then
340
+ pass "T56" "Savant has spawn_agents tool"
341
+ else
342
+ fail "T56" "Savant missing spawn_agents tool"
343
+ fi
344
+
345
+ if rg_check "code_search" "$REPO_ROOT/agents/detective/detective.ts" 2>/dev/null; then
346
+ pass "T57" "Detective has code_search tool"
347
+ else
348
+ fail "T57" "Detective missing code_search tool"
349
+ fi
350
+
351
+ if rg_check "sequentialthinking" "$REPO_ROOT/agents/thinker/thinker.ts" 2>/dev/null; then
352
+ pass "T58" "Thinker has sequentialthinking tool"
353
+ else
354
+ fail "T58" "Thinker missing sequentialthinking tool"
355
+ fi
356
+
357
+ # Verify code-reviewer-kimi is fully retired (only in blacklists/comments)
358
+ kimi_in_spawn=$(rg -c "code-reviewer-kimi" "$REPO_ROOT/agents/savant/savant.ts" 2>/dev/null || echo "0")
359
+ if [ "$kimi_in_spawn" = "0" ]; then
360
+ pass "T59" "code-reviewer-kimi NOT in savant.ts spawn logic (retired)"
361
+ else
362
+ fail "T59" "code-reviewer-kimi still referenced in savant.ts" "$kimi_in_spawn matches found"
363
+ fi
364
+ fi
365
+
366
+ # =============================================================================
367
+ # Phase 6: Scout File-Finding
368
+ # =============================================================================
369
+ if run_phase 6; then
370
+ header "Phase 6: Scout File-Finding"
371
+ skip "T47-49" "Scout file-finding" "interactive-only"
372
+ fi
373
+
374
+ # =============================================================================
375
+ # Phase 7: MCP Proxy Timeout
376
+ # =============================================================================
377
+ if run_phase 7; then
378
+ header "Phase 7: MCP Proxy Timeout"
379
+ if rg_check "withTimeout" "$REPO_ROOT/common/src/mcp/client.ts" 2>/dev/null; then
380
+ pass "T50" "withTimeout in common/src/mcp/client.ts"
381
+ else
382
+ fail "T50" "withTimeout NOT in common/src/mcp/client.ts"
383
+ fi
384
+ fi
385
+
386
+ # =============================================================================
387
+ # Phase 8: FSM Phase Inheritance
388
+ # =============================================================================
389
+ if run_phase 8; then
390
+ header "Phase 8: FSM Phase Inheritance"
391
+ if rg_check "fsmPhase" "$REPO_ROOT/packages/agent-runtime/src/tools/handlers/tool/spawn-agent-utils.ts" 2>/dev/null; then
392
+ pass "T53" "fsmPhase inherited in spawn-agent-utils.ts"
393
+ else
394
+ fail "T53" "fsmPhase NOT in spawn-agent-utils.ts"
395
+ fi
396
+
397
+ if rg_check "createAgentState" "$REPO_ROOT/packages/agent-runtime/src/tools/handlers/tool/spawn-agent-utils.ts" 2>/dev/null; then
398
+ pass "T54" "createAgentState in spawn-agent-utils.ts"
399
+ else
400
+ fail "T54" "createAgentState NOT in spawn-agent-utils.ts"
401
+ fi
402
+ fi
403
+
404
+ # =============================================================================
405
+ # Phase 9: Perfection Loop
406
+ # =============================================================================
407
+ if run_phase 9; then
408
+ header "Phase 9: Perfection Loop"
409
+ skip "T56-59" "Perfection Loop circuit breaker" "interactive-only"
410
+ fi
411
+
412
+ # =============================================================================
413
+ # Phase 10: FID-013 v3 Path Safety
414
+ # =============================================================================
415
+ if run_phase 10; then
416
+ header "Phase 10: FID-013 v3 Path Safety"
417
+
418
+ if rg_check "resolveAndContain" "$REPO_ROOT/packages/agent-runtime/src/tools/handlers/tool/write-file.ts" 2>/dev/null; then
419
+ pass "T61" "resolveAndContain in write-file.ts"
420
+ else
421
+ fail "T61" "resolveAndContain NOT in write-file.ts"
422
+ fi
423
+
424
+ if rg_check "resolveAndContain" "$REPO_ROOT/packages/agent-runtime/src/tools/handlers/tool/str-replace.ts" 2>/dev/null; then
425
+ pass "T62" "resolveAndContain in str-replace.ts"
426
+ else
427
+ fail "T62" "resolveAndContain NOT in str-replace.ts"
428
+ fi
429
+
430
+ if rg_check "resolveAndContain" "$REPO_ROOT/packages/agent-runtime/src/tools/handlers/tool/apply-patch.ts" 2>/dev/null; then
431
+ pass "T63" "resolveAndContain in apply-patch.ts"
432
+ else
433
+ fail "T63" "resolveAndContain NOT in apply-patch.ts"
434
+ fi
435
+
436
+ if rg_check "resolveAndContain" "$REPO_ROOT/packages/agent-runtime/src/tools/tool-executor.ts" 2>/dev/null; then
437
+ pass "T64" "resolveAndContain in tool-executor.ts"
438
+ else
439
+ fail "T64" "resolveAndContain NOT in tool-executor.ts"
440
+ fi
441
+ fi
442
+
443
+ # =============================================================================
444
+ # Phase 11: FID-014 v2 SDK-side Realpath
445
+ # =============================================================================
446
+ if run_phase 11; then
447
+ header "Phase 11: FID-014 v2 SDK-side Realpath"
448
+
449
+ # T65-T66: resolveAndContain in SDK files
450
+ if rg_check "resolveAndContain" "$REPO_ROOT/sdk/src/tools/change-file.ts" 2>/dev/null; then
451
+ pass "T65" "resolveAndContain in change-file.ts"
452
+ else
453
+ fail "T65" "resolveAndContain NOT in change-file.ts"
454
+ fi
455
+
456
+ if rg_check "resolveAndContain" "$REPO_ROOT/sdk/src/tools/apply-patch.ts" 2>/dev/null; then
457
+ pass "T66" "resolveAndContain in apply-patch.ts"
458
+ else
459
+ fail "T66" "resolveAndContain NOT in apply-patch.ts"
460
+ fi
461
+
462
+ # T67: realpathFn in paths.ts
463
+ if rg_check "realpathFn" "$REPO_ROOT/common/src/util/paths.ts" 2>/dev/null; then
464
+ pass "T67" "realpathFn in common/src/util/paths.ts"
465
+ else
466
+ fail "T67" "realpathFn NOT in common/src/util/paths.ts"
467
+ fi
468
+
469
+ # T68-T69: realpathFn in SDK files
470
+ if rg_check "realpathFn" "$REPO_ROOT/sdk/src/tools/change-file.ts" 2>/dev/null; then
471
+ pass "T68" "realpathFn in change-file.ts"
472
+ else
473
+ fail "T68" "realpathFn NOT in change-file.ts"
474
+ fi
475
+
476
+ if rg_check "realpathFn" "$REPO_ROOT/sdk/src/tools/apply-patch.ts" 2>/dev/null; then
477
+ pass "T69" "realpathFn in apply-patch.ts"
478
+ else
479
+ fail "T69" "realpathFn NOT in apply-patch.ts"
480
+ fi
481
+
482
+ fi
483
+
484
+ # =============================================================================
485
+ # Phase 12: Skills System
486
+ # =============================================================================
487
+ if run_phase 12; then
488
+ header "Phase 12: Skills System"
489
+
490
+ skills_dir="$REPO_ROOT/.agents/skills"
491
+ if [ -d "$skills_dir" ]; then
492
+ skill_count=$(find "$skills_dir" -maxdepth 1 -type d | wc -l)
493
+ skill_count=$((skill_count - 1)) # subtract the skills dir itself
494
+ if [ "$skill_count" -ge 7 ]; then
495
+ pass "T73" "Skills system — $skill_count skills present in .agents/skills/"
496
+ else
497
+ fail "T73" "Skills system — only $skill_count skills (expected 7+)"
498
+ fi
499
+ else
500
+ fail "T73" ".agents/skills/ directory missing"
501
+ fi
502
+ fi
503
+
504
+ # =============================================================================
505
+ # Phase 14: Knowledge Files
506
+ # =============================================================================
507
+ if run_phase 14; then
508
+ header "Phase 14: Knowledge Files"
509
+
510
+ if [ -f "$REPO_ROOT/dev/LEARNINGS.md" ]; then
511
+ pass "T91" "dev/LEARNINGS.md exists"
512
+ else
513
+ fail "T91" "dev/LEARNINGS.md missing"
514
+ fi
515
+
516
+ if rg_check "LEARNINGS" "$REPO_ROOT/agents/scribe/scribe.ts" 2>/dev/null; then
517
+ pass "T92" "LEARNINGS referenced in scribe.ts"
518
+ else
519
+ fail "T92" "LEARNINGS NOT in scribe.ts"
520
+ fi
521
+ fi
522
+
523
+ # =============================================================================
524
+ # Phase 15: Typecheck
525
+ # =============================================================================
526
+ if run_phase 15; then
527
+ header "Phase 15: Typecheck"
528
+
529
+ echo -ne " Running typecheck in sdk... "
530
+ if (cd "$REPO_ROOT/sdk" && bun run typecheck 2>&1) >/dev/null 2>&1; then
531
+ pass "T96" "Typecheck sdk — exit 0"
532
+ else
533
+ fail "T96" "Typecheck sdk — ERRORS"
534
+ fi
535
+
536
+ echo -ne " Running typecheck in common... "
537
+ if (cd "$REPO_ROOT/common" && bun run typecheck 2>&1) >/dev/null 2>&1; then
538
+ pass "T97" "Typecheck common — exit 0"
539
+ else
540
+ fail "T97" "Typecheck common — ERRORS"
541
+ fi
542
+
543
+ echo -ne " Running typecheck in packages/agent-runtime... "
544
+ if (cd "$REPO_ROOT/packages/agent-runtime" && bun run typecheck 2>&1) >/dev/null 2>&1; then
545
+ pass "T98" "Typecheck packages/agent-runtime — exit 0"
546
+ else
547
+ fail "T98" "Typecheck packages/agent-runtime — ERRORS"
548
+ fi
549
+
550
+ echo -ne " Running typecheck in cli... "
551
+ if (cd "$REPO_ROOT/cli" && bun run typecheck 2>&1) >/dev/null 2>&1; then
552
+ pass "T99" "Typecheck cli — exit 0"
553
+ else
554
+ fail "T99" "Typecheck cli — ERRORS"
555
+ fi
556
+ fi
557
+
558
+ # =============================================================================
559
+ # Phase 16: Rebrand Readiness
560
+ # =============================================================================
561
+ if run_phase 16; then
562
+ header "Phase 16: Rebrand Readiness"
563
+
564
+ # Check for "Savant" branding in CLI
565
+ savant_count=$(rg_count "Savant|savant" "$REPO_ROOT/cli/src")
566
+ if [ "$savant_count" -gt 50 ]; then
567
+ pass "T101" "Savant branding in cli/src — $savant_count matches"
568
+ else
569
+ fail "T101" "Savant branding in cli/src — only $savant_count matches (expected 50+)"
570
+ fi
571
+
572
+ # Check CHANGELOG uses "Savant"
573
+ if grep_q "Savant" "$REPO_ROOT/CHANGELOG.md" 2>/dev/null; then
574
+ pass "T104" "CHANGELOG.md uses Savant branding"
575
+ else
576
+ fail "T104" "CHANGELOG.md does not use Savant branding"
577
+ fi
578
+
579
+ # code-reviewer-kimi fully retired
580
+ kimi_agents=$(rg_count "code-reviewer-kimi" "$REPO_ROOT/agents")
581
+ kimi_cli=$(rg_count "code-reviewer-kimi" "$REPO_ROOT/cli/src")
582
+ kimi_ar=$(rg_count "code-reviewer-kimi" "$REPO_ROOT/packages/agent-runtime/src")
583
+ kimi_total=$((kimi_agents + kimi_cli + kimi_ar))
584
+ if [ "$kimi_total" -le 5 ]; then
585
+ pass "T105" "code-reviewer-kimi — $kimi_total references (blacklists/comments only)"
586
+ else
587
+ fail "T105" "code-reviewer-kimi — $kimi_total references (expected ≤5)"
588
+ fi
589
+ fi
590
+
591
+ # =============================================================================
592
+ # Phase 17: Verifier Spawn Frequency
593
+ # =============================================================================
594
+ if run_phase 17; then
595
+ header "Phase 17: Verifier Spawn Frequency"
596
+
597
+ if rg_check "verifier" "$REPO_ROOT/agents/savant/savant.ts" 2>/dev/null; then
598
+ pass "T106" "verifier referenced in savant.ts"
599
+ else
600
+ fail "T106" "verifier NOT in savant.ts"
601
+ fi
602
+ fi
603
+
604
+ # =============================================================================
605
+ # Phase 18: Provider Integration
606
+ # =============================================================================
607
+ if run_phase 18; then
608
+ header "Phase 18: Provider Integration"
609
+
610
+ if rg_check "fetchGatewayModels|subscribeGatewayCatalog|useGatewayCatalogStore" "$REPO_ROOT/cli/src" 2>/dev/null; then
611
+ pass "T109" "Gateway catalog hooks wired in cli/src"
612
+ else
613
+ fail "T109" "Gateway catalog hooks NOT in cli/src"
614
+ fi
615
+ fi
616
+
617
+ # =============================================================================
618
+ # Phase 19: Hybrid Mode
619
+ # =============================================================================
620
+ if run_phase 19; then
621
+ header "Phase 19: Hybrid Mode"
622
+
623
+ if rg_check "primary coder|write.*directly" "$REPO_ROOT/agents/savant/savant.ts" 2>/dev/null; then
624
+ pass "T113" "Hybrid Mode — 'primary coder' in savant.ts"
625
+ else
626
+ fail "T113" "Hybrid Mode — 'primary coder' NOT in savant.ts"
627
+ fi
628
+
629
+ if rg_check "Spawn Forge only|> 3 files" "$REPO_ROOT/agents/savant/savant.ts" 2>/dev/null; then
630
+ pass "T115" "Forge spawn threshold documented"
631
+ else
632
+ fail "T115" "Forge spawn threshold NOT documented"
633
+ fi
634
+ fi
635
+
636
+ # =============================================================================
637
+ # Phase 20: Verifier Trigger Criteria
638
+ # =============================================================================
639
+ if run_phase 20; then
640
+ header "Phase 20: Verifier Trigger Criteria"
641
+
642
+ if rg_check "Verifier trigger|objective criteria|Skip Verifier" "$REPO_ROOT/agents/savant/savant.ts" 2>/dev/null; then
643
+ pass "T117" "Verifier trigger criteria in savant.ts"
644
+ else
645
+ fail "T117" "Verifier trigger criteria NOT in savant.ts"
646
+ fi
647
+
648
+ if rg_check "noReview" "$REPO_ROOT/agents/savant/savant.ts" 2>/dev/null; then
649
+ pass "T119" "noReview flag gating in savant.ts"
650
+ else
651
+ fail "T119" "noReview flag NOT in savant.ts"
652
+ fi
653
+ fi
654
+
655
+ # =============================================================================
656
+ # Phase 21: Audit Checklist in Verifier
657
+ # =============================================================================
658
+ if run_phase 21; then
659
+ header "Phase 21: Audit Checklist in Verifier"
660
+
661
+ if rg_check "ECHO Audit Checklist|Audit Checklist" "$REPO_ROOT/agents/verifier/verifier.ts" 2>/dev/null; then
662
+ pass "T122" "ECHO Audit Checklist in verifier.ts"
663
+ else
664
+ fail "T122" "ECHO Audit Checklist NOT in verifier.ts"
665
+ fi
666
+
667
+ if rg_check "Law 14|Law 6|Law 5|No magic numbers" "$REPO_ROOT/agents/verifier/verifier.ts" 2>/dev/null; then
668
+ pass "T122b" "Audit Checklist items (Law 14/6/5, no magic numbers)"
669
+ else
670
+ fail "T122b" "Audit Checklist items missing"
671
+ fi
672
+ fi
673
+
674
+ # =============================================================================
675
+ # Phase 22: Batch Operations
676
+ # =============================================================================
677
+ if run_phase 22; then
678
+ header "Phase 22: Batch Operations"
679
+
680
+ if rg_check "Batch operations|write ALL files first|run typecheck.*ONCE" "$REPO_ROOT/agents/savant/savant.ts" 2>/dev/null; then
681
+ pass "T124" "Batch operations instruction in savant.ts"
682
+ else
683
+ fail "T124" "Batch operations instruction NOT in savant.ts"
684
+ fi
685
+ fi
686
+
687
+ # =============================================================================
688
+ # Phase 23: Smart Phase Transitions
689
+ # =============================================================================
690
+ if run_phase 23; then
691
+ header "Phase 23: Smart Phase Transitions"
692
+
693
+ if rg_check "Smart Phase Transitions|Skip When" "$REPO_ROOT/agents/savant/savant.ts" 2>/dev/null; then
694
+ pass "T126" "Smart Phase Transitions section in savant.ts"
695
+ else
696
+ fail "T126" "Smart Phase Transitions NOT in savant.ts"
697
+ fi
698
+
699
+ if rg_check "Law 3 is NEVER skipped" "$REPO_ROOT/agents/savant/savant.ts" 2>/dev/null; then
700
+ pass "T127" "Law 3 never skipped documented"
701
+ else
702
+ fail "T127" "Law 3 never skipped NOT documented"
703
+ fi
704
+ fi
705
+
706
+ # =============================================================================
707
+ # Phase 24: Parallel Agent Batching
708
+ # =============================================================================
709
+ if run_phase 24; then
710
+ header "Phase 24: Parallel Agent Batching"
711
+
712
+ if rg_check "Parallel agent batching|Promise.allSettled" "$REPO_ROOT/agents/savant/savant.ts" 2>/dev/null; then
713
+ pass "T131" "Parallel agent batching instruction in savant.ts"
714
+ else
715
+ fail "T131" "Parallel agent batching NOT in savant.ts"
716
+ fi
717
+ fi
718
+
719
+ # =============================================================================
720
+ # Phase 25: Double Audit Enforcement
721
+ # =============================================================================
722
+ if run_phase 25; then
723
+ header "Phase 25: Double Audit Enforcement"
724
+
725
+ if rg_check "Double Audit" "$REPO_ROOT/ECHO.md" 2>/dev/null; then
726
+ pass "T134" "Double Audit documented in ECHO.md"
727
+ else
728
+ fail "T134" "Double Audit NOT in ECHO.md"
729
+ fi
730
+
731
+ if rg_check "Self-reporting is prohibited" "$REPO_ROOT/ECHO.md" 2>/dev/null; then
732
+ pass "T135" "Self-reporting prohibition in ECHO.md"
733
+ else
734
+ fail "T135" "Self-reporting prohibition NOT in ECHO.md"
735
+ fi
736
+ fi
737
+
738
+ # =============================================================================
739
+ # Phase 27: FID-066 Legacy Template Type Cleanup
740
+ # =============================================================================
741
+ if run_phase 27; then
742
+ header "Phase 27: Legacy Template Type Cleanup (FID-066)"
743
+
744
+ # T139: Dead template types removed from both files
745
+ for typefile in "common/src/types/session-state.ts" "agents/types/secret-agent-definition.ts"; do
746
+ full="$REPO_ROOT/$typefile"
747
+ basename_f=$(basename "$typefile")
748
+ dead_types=("base_free" "base_max" "base_lite" "base_experimental" "claude4_gemini_thinking" "superagent" "base_agent_builder" "file_picker" "reviewer" "example_programmatic")
749
+ found_dead=0
750
+ for dt in "${dead_types[@]}"; do
751
+ if rg_check "$dt" "$full" 2>/dev/null; then
752
+ found_dead=$((found_dead + 1))
753
+ fi
754
+ done
755
+ if [ "$found_dead" -eq 0 ]; then
756
+ pass "T139" "No dead template types in $basename_f"
757
+ else
758
+ fail "T139" "$found_dead dead template types still in $basename_f"
759
+ fi
760
+ done
761
+
762
+ # T140: baseAgentSubagents updated
763
+ if rg_check "scout|thinker|verifier" "$REPO_ROOT/packages/agent-runtime/src/templates/types.ts" 2>/dev/null; then
764
+ if rg_not "file_picker|reviewer|researcher" "$REPO_ROOT/packages/agent-runtime/src/templates/types.ts" 2>/dev/null; then
765
+ pass "T140" "baseAgentSubagents uses scout/thinker/verifier (no dead IDs)"
766
+ else
767
+ fail "T140" "baseAgentSubagents still references dead IDs"
768
+ fi
769
+ else
770
+ fail "T140" "baseAgentSubagents missing expected agent IDs"
771
+ fi
772
+
773
+ # T141: ORCHESTRATOR_IDS replaces startsWith('base')
774
+ if rg_check "ORCHESTRATOR_IDS" "$REPO_ROOT/cli/src/utils/local-agent-registry.ts" 2>/dev/null; then
775
+ if rg_not "startsWith.*base" "$REPO_ROOT/cli/src/utils/local-agent-registry.ts" 2>/dev/null; then
776
+ pass "T141" "ORCHESTRATOR_IDS replaces startsWith('base')"
777
+ else
778
+ fail "T141" "startsWith('base') still present alongside ORCHESTRATOR_IDS"
779
+ fi
780
+ else
781
+ fail "T141" "ORCHESTRATOR_IDS NOT in local-agent-registry.ts"
782
+ fi
783
+
784
+ # T142: Dead personas removed
785
+ if rg_not "'base'" "$REPO_ROOT/common/src/constants/agents.ts" 2>/dev/null; then
786
+ if rg_not "agent-builder" "$REPO_ROOT/common/src/constants/agents.ts" 2>/dev/null; then
787
+ pass "T142" "Dead personas (base, agent-builder) removed from AGENT_PERSONAS"
788
+ else
789
+ fail "T142" "agent-builder persona still in AGENT_PERSONAS"
790
+ fi
791
+ else
792
+ fail "T142" "base persona still in AGENT_PERSONAS"
793
+ fi
794
+ fi
795
+
796
+ # =============================================================================
797
+ # Phase 28: FID-067 Rename Legacy Aliases
798
+ # =============================================================================
799
+ if run_phase 28; then
800
+ header "Phase 28: Rename Legacy Aliases (FID-067)"
801
+
802
+ # T143: No file_picker in type definitions
803
+ for typefile in "common/src/types/session-state.ts" "agents/types/secret-agent-definition.ts"; do
804
+ full="$REPO_ROOT/$typefile"
805
+ basename_f=$(basename "$typefile")
806
+ if rg_not "file_picker|file-picker" "$full" 2>/dev/null; then
807
+ pass "T143" "No file_picker in $basename_f"
808
+ else
809
+ fail "T143" "file_picker still in $basename_f"
810
+ fi
811
+ done
812
+
813
+ # T144: No reviewer in type definitions
814
+ for typefile in "common/src/types/session-state.ts" "agents/types/secret-agent-definition.ts"; do
815
+ full="$REPO_ROOT/$typefile"
816
+ basename_f=$(basename "$typefile")
817
+ if rg_not "reviewer" "$full" 2>/dev/null; then
818
+ pass "T144" "No reviewer in $basename_f"
819
+ else
820
+ fail "T144" "reviewer still in $basename_f"
821
+ fi
822
+ done
823
+
824
+ # T145: free-agents.ts preserved correctly
825
+ if rg_check "file-picker-max|file-lister" "$REPO_ROOT/common/src/constants/free-agents.ts" 2>/dev/null; then
826
+ if rg_check "scout" "$REPO_ROOT/common/src/constants/free-agents.ts" 2>/dev/null; then
827
+ pass "T145" "free-agents.ts: file-picker-max/file-lister preserved, scout present"
828
+ else
829
+ fail "T145" "free-agents.ts: scout NOT found"
830
+ fi
831
+ else
832
+ fail "T145" "free-agents.ts: file-picker-max/file-lister NOT found"
833
+ fi
834
+
835
+ # T146: spawn-agents.ts description updated
836
+ if rg_check "scout" "$REPO_ROOT/common/src/tools/params/tool/spawn-agents.ts" 2>/dev/null; then
837
+ pass "T146" "spawn-agents.ts description references scout"
838
+ else
839
+ fail "T146" "spawn-agents.ts description does NOT reference scout"
840
+ fi
841
+
842
+ # T147: No stale file_picker in production code (test files excluded)
843
+ stale_fp_ar=$(rg_count_prod "file_picker|file-picker" "$REPO_ROOT/packages/agent-runtime/src")
844
+ stale_fp_cli=$(rg_count_prod "file_picker|file-picker" "$REPO_ROOT/cli/src")
845
+ stale_fp=$((stale_fp_ar + stale_fp_cli))
846
+ if [ "$stale_fp" -eq 0 ]; then
847
+ pass "T147" "No stale file_picker in production code"
848
+ else
849
+ fail "T147" "$stale_fp stale file_picker references in production code"
850
+ fi
851
+
852
+ # T148: No stale reviewer in production code (test files excluded)
853
+ stale_rev_ar=$(rg_count_prod "reviewer" "$REPO_ROOT/packages/agent-runtime/src")
854
+ stale_rev_cli=$(rg_count_prod "reviewer" "$REPO_ROOT/cli/src")
855
+ stale_rev=$((stale_rev_ar + stale_rev_cli))
856
+ if [ "$stale_rev" -eq 0 ]; then
857
+ pass "T148" "No stale reviewer in production code"
858
+ else
859
+ fail "T148" "$stale_rev stale reviewer references in production code"
860
+ fi
861
+ fi
862
+
863
+ # =============================================================================
864
+ # Phase 29: ECHO Law 6 / 13 / 15 Compliance (v0.0.6)
865
+ # =============================================================================
866
+ if run_phase 29; then
867
+ header "Phase 29: ECHO Compliance (FID-068/069/070/071)"
868
+
869
+ # JSONValue domain type exists
870
+ if [ -f "$REPO_ROOT/common/src/types/json.ts" ] && rg_check "export type JSONValue" "$REPO_ROOT/common/src/types/json.ts"; then
871
+ pass "T149" "JSONValue type defined in common/src/types/json.ts"
872
+ else
873
+ fail "T149" "JSONValue type NOT defined in common/src/types/json.ts"
874
+ fi
875
+
876
+ # safeParseJSONObject helper exists
877
+ if [ -f "$REPO_ROOT/common/src/util/type-narrowing.ts" ] && rg_check "safeParseJSONObject" "$REPO_ROOT/common/src/util/type-narrowing.ts"; then
878
+ pass "T150" "safeParseJSONObject helper exists"
879
+ else
880
+ fail "T150" "safeParseJSONObject helper missing"
881
+ fi
882
+
883
+ # No Record<string, unknown> shortcuts in production source (test files excluded)
884
+ cli_unknown=$(rg_count_prod "Record[[:space:]]*<[[:space:]]*string[[:space:]]*,[[:space:]]*unknown[[:space:]]*>" "$REPO_ROOT/cli/src" || echo "0")
885
+ sdk_unknown=$(rg_count_prod "Record[[:space:]]*<[[:space:]]*string[[:space:]]*,[[:space:]]*unknown[[:space:]]*>" "$REPO_ROOT/sdk/src" || echo "0")
886
+ ar_unknown=$(rg_count_prod "Record[[:space:]]*<[[:space:]]*string[[:space:]]*,[[:space:]]*unknown[[:space:]]*>" "$REPO_ROOT/packages/agent-runtime/src" || echo "0")
887
+ common_unknown=$(rg_count_prod "Record[[:space:]]*<[[:space:]]*string[[:space:]]*,[[:space:]]*unknown[[:space:]]*>" "$REPO_ROOT/common/src" || echo "0")
888
+ total_unknown=$((cli_unknown + sdk_unknown + ar_unknown + common_unknown))
889
+ if [ "$total_unknown" -eq 0 ]; then
890
+ pass "T151" "No Record<string, unknown> shortcuts in production source"
891
+ else
892
+ fail "T151" "$total_unknown Record<string, unknown> shortcuts remaining in production source"
893
+ fi
894
+
895
+ # Dead utility files removed
896
+ if [ ! -f "$REPO_ROOT/common/src/util/agent-name-resolver.ts" ] && [ ! -f "$REPO_ROOT/cli/src/utils/agent-id-utils.ts" ] && [ ! -f "$REPO_ROOT/cli/src/utils/time-format.ts" ]; then
897
+ pass "T152" "Dead utility files removed (agent-name-resolver, agent-id-utils, time-format)"
898
+ else
899
+ fail "T152" "One or more dead utility files still present"
900
+ fi
901
+
902
+ # Canonical utility exports preserved
903
+ if rg_check "export function getSimpleAgentId" "$REPO_ROOT/common/src/util/agent-id-parsing.ts" 2>/dev/null; then
904
+ pass "T153" "getSimpleAgentId in agent-id-parsing.ts"
905
+ else
906
+ fail "T153" "getSimpleAgentId missing from agent-id-parsing.ts"
907
+ fi
908
+
909
+ if rg_check "export (const|function) pluralize" "$REPO_ROOT/common/src/util/string.ts" 2>/dev/null; then
910
+ pass "T154" "pluralize in string.ts"
911
+ else
912
+ fail "T154" "pluralize missing from string.ts"
913
+ fi
914
+
915
+ if rg_check "export (const|function) formatTimeUntil" "$REPO_ROOT/common/src/util/dates.ts" 2>/dev/null; then
916
+ pass "T155" "formatTimeUntil in dates.ts"
917
+ else
918
+ fail "T155" "formatTimeUntil missing from dates.ts"
919
+ fi
920
+
921
+ # ESLint zero warnings across four core workspaces
922
+ echo -ne " Running ESLint --max-warnings 0 on four workspaces... "
923
+ if (cd "$REPO_ROOT" && bun x eslint common/src cli/src sdk/src packages/agent-runtime/src --max-warnings 0 2>&1) >/dev/null 2>&1; then
924
+ pass "T156" "ESLint --max-warnings 0 passes (common/cli/sdk/agent-runtime)"
925
+ else
926
+ fail "T156" "ESLint --max-warnings 0 FAILED"
927
+ fi
928
+ fi
929
+
930
+ # =============================================================================
931
+ # Phase 30: Cloudflare Workers AI Provider (v0.0.6)
932
+ # =============================================================================
933
+ if run_phase 30; then
934
+ header "Phase 30: Cloudflare Workers AI Provider (FID-072)"
935
+
936
+ if rg_check "cloudflare" "$REPO_ROOT/common/src/constants/model-config.ts" 2>/dev/null; then
937
+ pass "T171" "cloudflare references in model-config.ts"
938
+ else
939
+ fail "T171" "cloudflare NOT in model-config.ts"
940
+ fi
941
+
942
+ if rg_check "isCloudflareModel|createCloudflareModel" "$REPO_ROOT/sdk/src/impl/model-provider.ts" 2>/dev/null; then
943
+ pass "T172" "Cloudflare model functions in sdk/src/impl/model-provider.ts"
944
+ else
945
+ fail "T172" "Cloudflare model functions missing"
946
+ fi
947
+
948
+ if rg_check "getCloudflareApiTokenFromEnv|getCloudflareAccountIdFromEnv" "$REPO_ROOT/sdk/src/env.ts" 2>/dev/null; then
949
+ pass "T173" "Cloudflare env getters in sdk/src/env.ts"
950
+ else
951
+ fail "T173" "Cloudflare env getters missing"
952
+ fi
953
+
954
+ if rg_check "isCloudflareModel" "$REPO_ROOT/sdk/src/index.ts" 2>/dev/null; then
955
+ pass "T174" "isCloudflareModel re-exported from sdk/src/index.ts"
956
+ else
957
+ fail "T174" "isCloudflareModel NOT re-exported"
958
+ fi
959
+
960
+ # T175/T176: CLI wiring is intentionally deferred; FID-072 only added SDK/common support.
961
+ skip "T175" "cloudflare in cli/src/utils/openrouter-models.ts" "deferred: no CLI wiring in FID-072"
962
+ skip "T176" "cloudflare in cli/src/components/model-picker.tsx" "deferred: no CLI wiring in FID-072"
963
+ fi
964
+
965
+ # =============================================================================
966
+ # Phase 31: Release metadata (v0.0.6)
967
+ # =============================================================================
968
+ if run_phase 31; then
969
+ header "Phase 31: Release metadata"
970
+
971
+ version_from_file=$(cat "$REPO_ROOT/VERSION" 2>/dev/null | tr -d '[:space:]')
972
+ version_from_root=$(grep -m1 '"version"' "$REPO_ROOT/package.json" | sed -E 's/.*"version"[[:space:]]*:[[:space:]]*"([^"]+)".*/\1/')
973
+ version_from_cli=$(grep -m1 '"version"' "$REPO_ROOT/cli/package.json" | sed -E 's/.*"version"[[:space:]]*:[[:space:]]*"([^"]+)".*/\1/')
974
+
975
+ if [ "$version_from_file" = "0.0.9" ]; then
976
+ pass "T179" "VERSION file is 0.0.9"
977
+ else
978
+ fail "T179" "VERSION file is '$version_from_file' (expected 0.0.9)"
979
+ fi
980
+
981
+ if [ "$version_from_root" = "0.0.9" ]; then
982
+ pass "T180" "Root package.json is 0.0.9"
983
+ else
984
+ fail "T180" "Root package.json is '$version_from_root' (expected 0.0.9)"
985
+ fi
986
+
987
+ if [ "$version_from_cli" = "0.0.9" ]; then
988
+ pass "T181" "cli/package.json is 0.0.9"
989
+ else
990
+ fail "T181" "cli/package.json is '$version_from_cli' (expected 0.0.9)"
991
+ fi
992
+ fi
993
+
994
+ # =============================================================================
995
+ # Phase 32: Goal/Loop End-to-End Wiring (FID-2026-0726-001)
996
+ # =============================================================================
997
+ if run_phase 32; then
998
+ header "Phase 32: Goal/Loop End-to-End Wiring (FID-2026-0726-001)"
999
+
1000
+ # T200: useLoopScheduler mounted in chat.tsx so /loop cadence actually recurs
1001
+ if rg_check "useLoopScheduler" "$REPO_ROOT/cli/src/chat.tsx" 2>/dev/null; then
1002
+ pass "T200" "useLoopScheduler mounted in chat.tsx"
1003
+ else
1004
+ fail "T200" "useLoopScheduler NOT mounted in chat.tsx"
1005
+ fi
1006
+
1007
+ # T201: LoopStatusPanel subscribes to schedule changes for reactive UI
1008
+ if rg_check "useLoopSchedule" "$REPO_ROOT/cli/src/components/savant-ui/echo/loop-status-panel.tsx" 2>/dev/null; then
1009
+ pass "T201" "LoopStatusPanel uses useLoopSchedule"
1010
+ else
1011
+ fail "T201" "LoopStatusPanel does NOT use useLoopSchedule"
1012
+ fi
1013
+
1014
+ # T202: /goal persists the condition for cross-run evaluation
1015
+ if rg_check "setLoopGoal" "$REPO_ROOT/cli/src/commands/goal.ts" 2>/dev/null; then
1016
+ pass "T202" "goal.ts calls setLoopGoal"
1017
+ else
1018
+ fail "T202" "goal.ts does NOT call setLoopGoal"
1019
+ fi
1020
+
1021
+ # T203: /loop no longer redundantly activates state (startLoop handles it)
1022
+ if rg_check "setLoopActiveState\(true\)" "$REPO_ROOT/cli/src/commands/loop.ts" 2>/dev/null; then
1023
+ fail "T203" "loop.ts still calls setLoopActiveState(true)"
1024
+ else
1025
+ pass "T203" "loop.ts no longer redundantly calls setLoopActiveState(true)"
1026
+ fi
1027
+
1028
+ # T204: scheduler exposes a subscription primitive for reactive UI
1029
+ if rg_check "export function subscribeToSchedule" "$REPO_ROOT/cli/src/hooks/use-loop-scheduler.ts" 2>/dev/null; then
1030
+ pass "T204" "subscribeToSchedule exported from use-loop-scheduler.ts"
1031
+ else
1032
+ fail "T204" "subscribeToSchedule NOT exported from use-loop-scheduler.ts"
1033
+ fi
1034
+
1035
+ # T205: scheduler interval invokes the registered onLoopDue callback
1036
+ if rg_check "schedulerState\.onLoopDue" "$REPO_ROOT/cli/src/hooks/use-loop-scheduler.ts" 2>/dev/null; then
1037
+ pass "T205" "scheduler interval invokes onLoopDue callback"
1038
+ else
1039
+ fail "T205" "scheduler interval does NOT invoke onLoopDue callback"
1040
+ fi
1041
+
1042
+ # T206: /loop actually schedules recurring execution via startLoop
1043
+ if rg_check "startLoop[(]" "$REPO_ROOT/cli/src/commands/loop.ts" 2>/dev/null; then
1044
+ pass "T206" "loop.ts calls startLoop"
1045
+ else
1046
+ fail "T206" "loop.ts does NOT call startLoop"
1047
+ fi
1048
+
1049
+ # T207: goal/loop static typecheck already covered in Phase 15; live CLI
1050
+ # validation prompt is at dev/test-prompts/goal-loop-cli-test.md
1051
+ if [ -f "$REPO_ROOT/dev/test-prompts/goal-loop-cli-test.md" ]; then
1052
+ pass "T207" "goal-loop-cli-test.md live prompt exists"
1053
+ else
1054
+ fail "T207" "goal-loop-cli-test.md live prompt missing"
1055
+ fi
1056
+ fi
1057
+
1058
+ # =============================================================================
1059
+ # Summary
1060
+ # =============================================================================
1061
+ header "Summary"
1062
+
1063
+ echo ""
1064
+ echo -e " Total: ${BOLD}$TOTAL_COUNT${RESET}"
1065
+ echo -e " Pass: ${GREEN}$PASS_COUNT${RESET}"
1066
+ echo -e " Fail: ${RED}$FAIL_COUNT${RESET}"
1067
+ echo -e " Skip: ${YELLOW}$SKIP_COUNT${RESET}"
1068
+ echo ""
1069
+
1070
+ # Build JSON results
1071
+ JSON_RESULTS="["
1072
+ for i in "${!RESULTS[@]}"; do
1073
+ if [ "$i" -gt 0 ]; then
1074
+ JSON_RESULTS+=","
1075
+ fi
1076
+ JSON_RESULTS+="${RESULTS[$i]}"
1077
+ done
1078
+ JSON_RESULTS+="]"
1079
+
1080
+ # Write JSON
1081
+ cat > "$RESULTS_JSON" << ENDJSON
1082
+ {
1083
+ "version": "v11",
1084
+ "date": "$(date -u '+%Y-%m-%dT%H:%M:%SZ')",
1085
+ "platform": "$(uname -s)",
1086
+ "summary": {
1087
+ "total": $TOTAL_COUNT,
1088
+ "pass": $PASS_COUNT,
1089
+ "fail": $FAIL_COUNT,
1090
+ "skip": $SKIP_COUNT
1091
+ },
1092
+ "tests": $JSON_RESULTS
1093
+ }
1094
+ ENDJSON
1095
+
1096
+ # Write Markdown
1097
+ cat > "$RESULTS_MD" << ENDMD
1098
+ # Savant-Code — Automated A-Z Test Results v11
1099
+
1100
+ **Date:** $(date '+%Y-%m-%d %H:%M:%S')
1101
+ **Platform:** $(uname -s)
1102
+
1103
+ ## Summary
1104
+
1105
+ | Metric | Count |
1106
+ |--------|-------|
1107
+ | **Total** | $TOTAL_COUNT |
1108
+ | **PASS** | $PASS_COUNT |
1109
+ | **FAIL** | $FAIL_COUNT |
1110
+ | **SKIP** | $SKIP_COUNT |
1111
+
1112
+ ## Test Results
1113
+
1114
+ | ID | Status | Description |
1115
+ |----|--------|-------------|
1116
+ ENDMD
1117
+
1118
+ for r in "${RESULTS[@]}"; do
1119
+ id=$(echo "$r" | grep -o '"id":"[^"]*"' | cut -d'"' -f4)
1120
+ status=$(echo "$r" | grep -o '"status":"[^"]*"' | cut -d'"' -f4)
1121
+ desc=$(echo "$r" | grep -o '"description":"[^"]*"' | cut -d'"' -f4)
1122
+ case "$status" in
1123
+ PASS) emoji="✅" ;;
1124
+ FAIL) emoji="❌" ;;
1125
+ SKIP) emoji="⏭️" ;;
1126
+ *) emoji="❓" ;;
1127
+ esac
1128
+ echo "| $id | $emoji $status | $desc |" >> "$RESULTS_MD"
1129
+ done
1130
+
1131
+ echo "" >> "$RESULTS_MD"
1132
+ echo "---" >> "$RESULTS_MD"
1133
+ echo "" >> "$RESULTS_MD"
1134
+ echo "Results saved to: $RESULTS_JSON" >> "$RESULTS_MD"
1135
+
1136
+ echo -e "Results saved to:"
1137
+ echo -e " JSON: $RESULTS_JSON"
1138
+ echo -e " MD: $RESULTS_MD"
1139
+ echo ""
1140
+
1141
+ if [ "$FAIL_COUNT" -gt 0 ]; then
1142
+ echo -e "${RED}${BOLD}⚠️ $FAIL_COUNT test(s) FAILED. Review results above.${RESET}"
1143
+ exit 1
1144
+ else
1145
+ echo -e "${GREEN}${BOLD}✅ All automatable tests passed.${RESET}"
1146
+ if [ "$SKIP_COUNT" -gt 0 ]; then
1147
+ echo -e "${YELLOW} $SKIP_COUNT test(s) skipped (interactive-only). Run those manually in the CLI.${RESET}"
1148
+ fi
1149
+ exit 0
1150
+ fi