codetrellis 0.0.0-stage → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (448) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +27 -2
  3. package/bin/codetrellis.mjs +4 -0
  4. package/package.json +41 -4
  5. package/reader/material-reader.mjs +130346 -0
  6. package/resources/tree-sitter/README.md +150 -0
  7. package/resources/tree-sitter/tree-sitter-c-sharp.wasm +0 -0
  8. package/resources/tree-sitter/tree-sitter-go.wasm +0 -0
  9. package/resources/tree-sitter/tree-sitter-java.wasm +0 -0
  10. package/resources/tree-sitter/tree-sitter-javascript.wasm +0 -0
  11. package/resources/tree-sitter/tree-sitter-kotlin.wasm +0 -0
  12. package/resources/tree-sitter/tree-sitter-php.wasm +0 -0
  13. package/resources/tree-sitter/tree-sitter-python.wasm +0 -0
  14. package/resources/tree-sitter/tree-sitter-ruby.wasm +0 -0
  15. package/resources/tree-sitter/tree-sitter-rust.wasm +0 -0
  16. package/resources/tree-sitter/tree-sitter-swift.wasm +0 -0
  17. package/resources/tree-sitter/tree-sitter-tsx.wasm +0 -0
  18. package/resources/tree-sitter/tree-sitter-typescript.wasm +0 -0
  19. package/resources/tree-sitter/tree-sitter.wasm +0 -0
  20. package/src/backend/agent/claude-code-watcher.js +270 -0
  21. package/src/backend/index.js +8 -0
  22. package/src/backend/lib/sha256-file.js +39 -0
  23. package/src/backend/lib/zip-entries.js +98 -0
  24. package/src/backend/lifecycle.js +102 -0
  25. package/src/backend/mcp/binding-headers.js +54 -0
  26. package/src/backend/mcp/client-identity.js +44 -0
  27. package/src/backend/mcp/connector/command.js +110 -0
  28. package/src/backend/mcp/connector/core.js +278 -0
  29. package/src/backend/mcp/connector/files.js +121 -0
  30. package/src/backend/mcp/connector/hook.js +284 -0
  31. package/src/backend/mcp/connector/main.js +126 -0
  32. package/src/backend/mcp/connector/sse-upstream.js +152 -0
  33. package/src/backend/mcp/helpers.js +43 -0
  34. package/src/backend/mcp/prompt-builders.js +104 -0
  35. package/src/backend/mcp/resources.js +197 -0
  36. package/src/backend/mcp/server.js +813 -0
  37. package/src/backend/mcp/skill-guide.js +1528 -0
  38. package/src/backend/mcp/tools/architecture-tools.js +273 -0
  39. package/src/backend/mcp/tools/audio-tools.js +117 -0
  40. package/src/backend/mcp/tools/awareness-tools.js +623 -0
  41. package/src/backend/mcp/tools/budget-tools.js +185 -0
  42. package/src/backend/mcp/tools/channel-tools.js +205 -0
  43. package/src/backend/mcp/tools/contribution-tools.js +181 -0
  44. package/src/backend/mcp/tools/drift-tools.js +252 -0
  45. package/src/backend/mcp/tools/git-tools.js +316 -0
  46. package/src/backend/mcp/tools/governance-tools.js +175 -0
  47. package/src/backend/mcp/tools/graph-tools.js +181 -0
  48. package/src/backend/mcp/tools/intake-tools.js +244 -0
  49. package/src/backend/mcp/tools/mobile-tools.js +118 -0
  50. package/src/backend/mcp/tools/peer-tools.js +330 -0
  51. package/src/backend/mcp/tools/plan-item-tools.js +1601 -0
  52. package/src/backend/mcp/tools/plan-tools.js +680 -0
  53. package/src/backend/mcp/tools/presence-tools.js +185 -0
  54. package/src/backend/mcp/tools/project-config-tools.js +150 -0
  55. package/src/backend/mcp/tools/review-tools.js +172 -0
  56. package/src/backend/mcp/tools/session-tools.js +554 -0
  57. package/src/backend/mcp/tools/system-docs-tools.js +168 -0
  58. package/src/backend/mcp/tools/terminal-tools.js +186 -0
  59. package/src/backend/mcp/tools/test-tools.js +117 -0
  60. package/src/backend/mcp/tools/ui-tools.js +356 -0
  61. package/src/backend/mcp/types.js +15 -0
  62. package/src/backend/middleware/local-auth.js +116 -0
  63. package/src/backend/server.js +5951 -0
  64. package/src/backend/services/agent-event-log.js +350 -0
  65. package/src/backend/services/architecture-rule.js +584 -0
  66. package/src/backend/services/architecture-rules.js +275 -0
  67. package/src/backend/services/artefact-content-service.js +181 -0
  68. package/src/backend/services/artefact-service.js +305 -0
  69. package/src/backend/services/artefact-watcher.js +167 -0
  70. package/src/backend/services/ast-parser.js +327 -0
  71. package/src/backend/services/audio-buffer-service.js +152 -0
  72. package/src/backend/services/awareness-notices.js +139 -0
  73. package/src/backend/services/awareness-replies.js +194 -0
  74. package/src/backend/services/awareness-service.js +344 -0
  75. package/src/backend/services/awareness-signals.js +267 -0
  76. package/src/backend/services/baseline-store.js +83 -0
  77. package/src/backend/services/branch-workstreams.js +341 -0
  78. package/src/backend/services/breakpoint-service.js +584 -0
  79. package/src/backend/services/brief-service.js +299 -0
  80. package/src/backend/services/budget-service.js +528 -0
  81. package/src/backend/services/callsites/base.js +15 -0
  82. package/src/backend/services/callsites/csharp.js +148 -0
  83. package/src/backend/services/callsites/go.js +163 -0
  84. package/src/backend/services/callsites/index.js +53 -0
  85. package/src/backend/services/callsites/kotlin.js +123 -0
  86. package/src/backend/services/callsites/process-env.js +125 -0
  87. package/src/backend/services/callsites/python.js +91 -0
  88. package/src/backend/services/callsites/ruby.js +164 -0
  89. package/src/backend/services/callsites/shared.js +198 -0
  90. package/src/backend/services/callsites/swift.js +115 -0
  91. package/src/backend/services/callsites/typescript.js +87 -0
  92. package/src/backend/services/capability-token.js +108 -0
  93. package/src/backend/services/change-check.js +156 -0
  94. package/src/backend/services/channel-dispatcher-service.js +235 -0
  95. package/src/backend/services/channel-event-file-service.js +125 -0
  96. package/src/backend/services/channel-event-service.js +297 -0
  97. package/src/backend/services/check-runs.js +177 -0
  98. package/src/backend/services/checkout-identity.js +73 -0
  99. package/src/backend/services/claude-code-parallel.js +221 -0
  100. package/src/backend/services/claude-desktop-config.js +186 -0
  101. package/src/backend/services/cli-install.js +249 -0
  102. package/src/backend/services/clock.js +57 -0
  103. package/src/backend/services/cloud-files.js +191 -0
  104. package/src/backend/services/coalesce.js +50 -0
  105. package/src/backend/services/code-breakpoints.js +291 -0
  106. package/src/backend/services/comment-service.js +168 -0
  107. package/src/backend/services/commit-attribution.js +134 -0
  108. package/src/backend/services/commit-edges.js +99 -0
  109. package/src/backend/services/confined-fs.js +241 -0
  110. package/src/backend/services/conformity-gate.js +132 -0
  111. package/src/backend/services/contribution-service.js +409 -0
  112. package/src/backend/services/coverage-service.js +173 -0
  113. package/src/backend/services/criteria-service.js +721 -0
  114. package/src/backend/services/criterion-checks.js +387 -0
  115. package/src/backend/services/criterion-loop-service.js +411 -0
  116. package/src/backend/services/cross-system-service.js +231 -0
  117. package/src/backend/services/database.js +916 -0
  118. package/src/backend/services/db-schema.js +1358 -0
  119. package/src/backend/services/deviation-service.js +344 -0
  120. package/src/backend/services/diff-engine.js +168 -0
  121. package/src/backend/services/evidence.js +363 -0
  122. package/src/backend/services/external-intake-service.js +269 -0
  123. package/src/backend/services/external-pointer-service.js +195 -0
  124. package/src/backend/services/external-refs-service.js +214 -0
  125. package/src/backend/services/file-history.js +158 -0
  126. package/src/backend/services/file-watcher.js +193 -0
  127. package/src/backend/services/folder-requests.js +118 -0
  128. package/src/backend/services/freeze-service.js +189 -0
  129. package/src/backend/services/gemini-cli-hook.js +172 -0
  130. package/src/backend/services/git-activity-service.js +325 -0
  131. package/src/backend/services/git-blobs.js +70 -0
  132. package/src/backend/services/git-branches.js +357 -0
  133. package/src/backend/services/git-checkout.js +153 -0
  134. package/src/backend/services/git-commit-service.js +91 -0
  135. package/src/backend/services/git-env.js +121 -0
  136. package/src/backend/services/git-identity.js +84 -0
  137. package/src/backend/services/git-refs.js +386 -0
  138. package/src/backend/services/git-safety.js +58 -0
  139. package/src/backend/services/grant-guard.js +67 -0
  140. package/src/backend/services/html-view-policy.js +135 -0
  141. package/src/backend/services/human-decision.js +55 -0
  142. package/src/backend/services/importers.js +159 -0
  143. package/src/backend/services/intent-service.js +105 -0
  144. package/src/backend/services/ipc-dispatcher.js +164 -0
  145. package/src/backend/services/item-git-state.js +208 -0
  146. package/src/backend/services/line-changes.js +232 -0
  147. package/src/backend/services/line-history.js +174 -0
  148. package/src/backend/services/local-api-changes.js +40 -0
  149. package/src/backend/services/logger.js +217 -0
  150. package/src/backend/services/material-footprints.js +203 -0
  151. package/src/backend/services/material-place.js +82 -0
  152. package/src/backend/services/material-reader/docx-markdown.js +198 -0
  153. package/src/backend/services/material-reader/fixtures.test-helper.js +169 -0
  154. package/src/backend/services/material-reader/quote.js +44 -0
  155. package/src/backend/services/material-reader/reader-host.js +202 -0
  156. package/src/backend/services/material-signals.js +141 -0
  157. package/src/backend/services/mcp-capabilities.js +390 -0
  158. package/src/backend/services/mdns-service.js +304 -0
  159. package/src/backend/services/mobile-api-server.js +281 -0
  160. package/src/backend/services/mobile-approvals.js +306 -0
  161. package/src/backend/services/mobile-awareness.js +180 -0
  162. package/src/backend/services/mobile-breakpoints.js +115 -0
  163. package/src/backend/services/mobile-budget.js +98 -0
  164. package/src/backend/services/mobile-freeze.js +106 -0
  165. package/src/backend/services/mobile-proposals.js +100 -0
  166. package/src/backend/services/mobile-rpc-service.js +1289 -0
  167. package/src/backend/services/mobile-workstreams.js +160 -0
  168. package/src/backend/services/monorepo-detector.js +131 -0
  169. package/src/backend/services/other-work.js +45 -0
  170. package/src/backend/services/pack-seal.js +129 -0
  171. package/src/backend/services/paired-device-service.js +192 -0
  172. package/src/backend/services/pairing-server.js +323 -0
  173. package/src/backend/services/pairing-service.js +200 -0
  174. package/src/backend/services/pantry-resolution-service.js +166 -0
  175. package/src/backend/services/parsers/base.js +124 -0
  176. package/src/backend/services/parsers/csharp.js +224 -0
  177. package/src/backend/services/parsers/go.js +180 -0
  178. package/src/backend/services/parsers/index.js +101 -0
  179. package/src/backend/services/parsers/java.js +103 -0
  180. package/src/backend/services/parsers/kotlin.js +252 -0
  181. package/src/backend/services/parsers/php.js +113 -0
  182. package/src/backend/services/parsers/python.js +189 -0
  183. package/src/backend/services/parsers/ruby.js +212 -0
  184. package/src/backend/services/parsers/rust.js +97 -0
  185. package/src/backend/services/parsers/swift.js +221 -0
  186. package/src/backend/services/parsers/typescript.js +235 -0
  187. package/src/backend/services/pattern-scan.js +65 -0
  188. package/src/backend/services/patterns.js +281 -0
  189. package/src/backend/services/peer-audit-service.js +123 -0
  190. package/src/backend/services/peer-auth.js +153 -0
  191. package/src/backend/services/peer-capabilities.js +209 -0
  192. package/src/backend/services/peer-connection-service.js +450 -0
  193. package/src/backend/services/peer-grants.js +33 -0
  194. package/src/backend/services/persistence.js +116 -0
  195. package/src/backend/services/personal-sync-service.js +232 -0
  196. package/src/backend/services/pipeline-approvals.js +72 -0
  197. package/src/backend/services/pipeline.js +232 -0
  198. package/src/backend/services/plan-arrivals.js +68 -0
  199. package/src/backend/services/plan-changes-service.js +273 -0
  200. package/src/backend/services/plan-conflict-service.js +288 -0
  201. package/src/backend/services/plan-dependencies.js +91 -0
  202. package/src/backend/services/plan-doc-guard.js +90 -0
  203. package/src/backend/services/plan-documents-service.js +275 -0
  204. package/src/backend/services/plan-event-service.js +154 -0
  205. package/src/backend/services/plan-file-refs.js +106 -0
  206. package/src/backend/services/plan-file-service.js +1564 -0
  207. package/src/backend/services/plan-history-service.js +156 -0
  208. package/src/backend/services/plan-import-service.js +261 -0
  209. package/src/backend/services/plan-item-service.js +1223 -0
  210. package/src/backend/services/plan-migrate-service.js +395 -0
  211. package/src/backend/services/plan-overlay-service.js +173 -0
  212. package/src/backend/services/plan-phases-service.js +182 -0
  213. package/src/backend/services/plan-progress-service.js +134 -0
  214. package/src/backend/services/plan-review-service.js +262 -0
  215. package/src/backend/services/plan-service.js +682 -0
  216. package/src/backend/services/plan-status.js +113 -0
  217. package/src/backend/services/plan-template-publish-service.js +217 -0
  218. package/src/backend/services/plan-templates-service.js +242 -0
  219. package/src/backend/services/plan-templates.js +1164 -0
  220. package/src/backend/services/planned-overlap-actions.js +200 -0
  221. package/src/backend/services/plans-home.js +224 -0
  222. package/src/backend/services/play-forward.js +256 -0
  223. package/src/backend/services/playback-service.js +117 -0
  224. package/src/backend/services/power-service.js +167 -0
  225. package/src/backend/services/power-signals.js +81 -0
  226. package/src/backend/services/pr-draft-service.js +142 -0
  227. package/src/backend/services/presence-service.js +122 -0
  228. package/src/backend/services/pricing.js +60 -0
  229. package/src/backend/services/project-config-service.js +474 -0
  230. package/src/backend/services/project-scanner.js +184 -0
  231. package/src/backend/services/projection-service.js +69 -0
  232. package/src/backend/services/push-notification-service.js +288 -0
  233. package/src/backend/services/recent-projects-service.js +204 -0
  234. package/src/backend/services/record-chain.js +162 -0
  235. package/src/backend/services/recurrence-rule.js +63 -0
  236. package/src/backend/services/recurring-agent.js +89 -0
  237. package/src/backend/services/recurring-scheduler.js +77 -0
  238. package/src/backend/services/recurring-service.js +276 -0
  239. package/src/backend/services/reference-service.js +169 -0
  240. package/src/backend/services/release-public-key.js +30 -0
  241. package/src/backend/services/release-signature.js +64 -0
  242. package/src/backend/services/remote-audio-service.js +224 -0
  243. package/src/backend/services/remote-interaction-service.js +275 -0
  244. package/src/backend/services/remote-terminal-service.js +324 -0
  245. package/src/backend/services/rendition/child/main.js +76 -0
  246. package/src/backend/services/rendition/engine-host.js +249 -0
  247. package/src/backend/services/rendition/engine-lock.js +39 -0
  248. package/src/backend/services/rendition/engine-lock.json +14 -0
  249. package/src/backend/services/rendition/engine-manifest.js +97 -0
  250. package/src/backend/services/rendition/network-proof.js +73 -0
  251. package/src/backend/services/rendition/rendition-service.js +175 -0
  252. package/src/backend/services/replay-frames.js +387 -0
  253. package/src/backend/services/replay-state.js +201 -0
  254. package/src/backend/services/resolvers/base.js +108 -0
  255. package/src/backend/services/resolvers/csharp.js +109 -0
  256. package/src/backend/services/resolvers/go.js +105 -0
  257. package/src/backend/services/resolvers/index.js +60 -0
  258. package/src/backend/services/resolvers/java.js +63 -0
  259. package/src/backend/services/resolvers/kotlin.js +109 -0
  260. package/src/backend/services/resolvers/php.js +89 -0
  261. package/src/backend/services/resolvers/python.js +154 -0
  262. package/src/backend/services/resolvers/ruby.js +103 -0
  263. package/src/backend/services/resolvers/rust.js +77 -0
  264. package/src/backend/services/resolvers/swift.js +98 -0
  265. package/src/backend/services/resolvers/typescript.js +71 -0
  266. package/src/backend/services/retention.js +54 -0
  267. package/src/backend/services/review-architecture.js +236 -0
  268. package/src/backend/services/review-attest.js +68 -0
  269. package/src/backend/services/review-bundle.js +226 -0
  270. package/src/backend/services/review-graduation.js +93 -0
  271. package/src/backend/services/review-host/bitbucket.js +79 -0
  272. package/src/backend/services/review-host/detect.js +80 -0
  273. package/src/backend/services/review-host/github.js +97 -0
  274. package/src/backend/services/review-host/gitlab.js +77 -0
  275. package/src/backend/services/review-host/host-state.js +103 -0
  276. package/src/backend/services/review-host/http.js +58 -0
  277. package/src/backend/services/review-host/switch.js +120 -0
  278. package/src/backend/services/review-marks.js +72 -0
  279. package/src/backend/services/review-notes.js +169 -0
  280. package/src/backend/services/review-other-work.js +90 -0
  281. package/src/backend/services/review-queue-service.js +147 -0
  282. package/src/backend/services/review-risk.js +127 -0
  283. package/src/backend/services/review-task.js +121 -0
  284. package/src/backend/services/rule-approvals.js +275 -0
  285. package/src/backend/services/rule-baseline.js +134 -0
  286. package/src/backend/services/rule-changes.js +162 -0
  287. package/src/backend/services/rule-preview.js +47 -0
  288. package/src/backend/services/rule-proposals.js +104 -0
  289. package/src/backend/services/rule-scope.js +76 -0
  290. package/src/backend/services/rulebook.js +286 -0
  291. package/src/backend/services/rules-at.js +56 -0
  292. package/src/backend/services/rules-overview.js +88 -0
  293. package/src/backend/services/schema-reconciler.js +250 -0
  294. package/src/backend/services/secret-store.js +119 -0
  295. package/src/backend/services/section-workstreams.js +95 -0
  296. package/src/backend/services/self-write-tracker.js +75 -0
  297. package/src/backend/services/sensor-bridge-service.js +285 -0
  298. package/src/backend/services/session-service.js +192 -0
  299. package/src/backend/services/settings-service.js +324 -0
  300. package/src/backend/services/signal-breakpoints.js +172 -0
  301. package/src/backend/services/signed-approval-record.js +86 -0
  302. package/src/backend/services/signed-approvals.js +244 -0
  303. package/src/backend/services/signoff-pack.js +328 -0
  304. package/src/backend/services/signoff-rows.js +114 -0
  305. package/src/backend/services/skill-arrival-service.js +138 -0
  306. package/src/backend/services/skill-model.js +193 -0
  307. package/src/backend/services/skill-use-service.js +140 -0
  308. package/src/backend/services/skills-service.js +150 -0
  309. package/src/backend/services/snapshot-compare-service.js +397 -0
  310. package/src/backend/services/source-control.js +189 -0
  311. package/src/backend/services/spec-links-service.js +123 -0
  312. package/src/backend/services/spec-proposal-withdraw.js +50 -0
  313. package/src/backend/services/spec-proposals-service.js +470 -0
  314. package/src/backend/services/sql/embedded.js +95 -0
  315. package/src/backend/services/sql/index.js +63 -0
  316. package/src/backend/services/sql/refs.js +357 -0
  317. package/src/backend/services/sql/schema.js +312 -0
  318. package/src/backend/services/sql/tokenizer.js +195 -0
  319. package/src/backend/services/stack-overlaps.js +117 -0
  320. package/src/backend/services/stack-service.js +225 -0
  321. package/src/backend/services/state-sync-service.js +384 -0
  322. package/src/backend/services/stuck-sensor-service.js +200 -0
  323. package/src/backend/services/system-discovery.js +481 -0
  324. package/src/backend/services/system-docs-service.js +701 -0
  325. package/src/backend/services/task-attachments-service.js +340 -0
  326. package/src/backend/services/task-grounding.js +60 -0
  327. package/src/backend/services/task-records/check-run-record.js +146 -0
  328. package/src/backend/services/task-records/check-runs.js +115 -0
  329. package/src/backend/services/task-records/heads.js +88 -0
  330. package/src/backend/services/task-records/material-reads.js +225 -0
  331. package/src/backend/services/task-records/read-record.js +100 -0
  332. package/src/backend/services/task-records/record.js +173 -0
  333. package/src/backend/services/task-records/run-record.js +136 -0
  334. package/src/backend/services/task-records/shared-state.js +548 -0
  335. package/src/backend/services/task-records/signing.js +140 -0
  336. package/src/backend/services/task-records/split-signals.js +52 -0
  337. package/src/backend/services/task-records/test-runs.js +164 -0
  338. package/src/backend/services/task-records/trust.js +243 -0
  339. package/src/backend/services/task-rules.js +81 -0
  340. package/src/backend/services/task-workstreams.js +90 -0
  341. package/src/backend/services/terminal-history-service.js +266 -0
  342. package/src/backend/services/terminal-service.js +267 -0
  343. package/src/backend/services/test-clock.js +53 -0
  344. package/src/backend/services/tests/grounding.js +266 -0
  345. package/src/backend/services/tests/junit.js +104 -0
  346. package/src/backend/services/tests/teammate-runs.js +134 -0
  347. package/src/backend/services/tests/test-results.js +234 -0
  348. package/src/backend/services/tree-watcher.js +204 -0
  349. package/src/backend/services/trellis-service.js +204 -0
  350. package/src/backend/services/trusted-roots.js +186 -0
  351. package/src/backend/services/update-download-service.js +342 -0
  352. package/src/backend/services/update-service.js +266 -0
  353. package/src/backend/services/watch-ignore.js +76 -0
  354. package/src/backend/services/webhook-egress.js +206 -0
  355. package/src/backend/services/webrtc-service.js +413 -0
  356. package/src/backend/services/work-changes.js +59 -0
  357. package/src/backend/services/workstream-binding.js +82 -0
  358. package/src/backend/services/workstream-commits.js +116 -0
  359. package/src/backend/services/workstream-imports.js +177 -0
  360. package/src/backend/services/workstream-service.js +335 -0
  361. package/src/backend/services/workstream-symbols.js +223 -0
  362. package/src/backend/services/workstream-watch-service.js +391 -0
  363. package/src/backend/services/worktree-service.js +235 -0
  364. package/src/cli/agent.js +100 -0
  365. package/src/cli/args.js +209 -0
  366. package/src/cli/conformity.js +106 -0
  367. package/src/cli/desktop.js +91 -0
  368. package/src/cli/main.js +411 -0
  369. package/src/cli/pipeline.js +109 -0
  370. package/src/cli/plan-verbs.js +259 -0
  371. package/src/cli/review-adapters.js +220 -0
  372. package/src/cli/review-output.js +93 -0
  373. package/src/cli/review-post.js +89 -0
  374. package/src/cli/review-sink.js +183 -0
  375. package/src/cli/review-skill.js +44 -0
  376. package/src/cli/review-verify.js +104 -0
  377. package/src/cli/review.js +386 -0
  378. package/src/cli/sarif.js +148 -0
  379. package/src/cli/verbs.js +360 -0
  380. package/src/shared/build-info.js +39 -0
  381. package/src/shared/lib/agent-review.js +199 -0
  382. package/src/shared/lib/agent-turns.js +140 -0
  383. package/src/shared/lib/awareness-digest.js +120 -0
  384. package/src/shared/lib/branch-name.js +45 -0
  385. package/src/shared/lib/breakpoint-words.js +118 -0
  386. package/src/shared/lib/budget-words.js +56 -0
  387. package/src/shared/lib/burst.js +69 -0
  388. package/src/shared/lib/call-entry.js +105 -0
  389. package/src/shared/lib/check-compare.js +42 -0
  390. package/src/shared/lib/check-words.js +216 -0
  391. package/src/shared/lib/csv.js +62 -0
  392. package/src/shared/lib/folder-entry.js +87 -0
  393. package/src/shared/lib/freeze-words.js +60 -0
  394. package/src/shared/lib/fuzzy.js +84 -0
  395. package/src/shared/lib/git-state-words.js +80 -0
  396. package/src/shared/lib/grep-entry.js +86 -0
  397. package/src/shared/lib/grounding-line.js +61 -0
  398. package/src/shared/lib/import-line.js +71 -0
  399. package/src/shared/lib/item-status.js +249 -0
  400. package/src/shared/lib/line-changes.js +53 -0
  401. package/src/shared/lib/locator.js +71 -0
  402. package/src/shared/lib/matcher.js +120 -0
  403. package/src/shared/lib/merge-order.js +65 -0
  404. package/src/shared/lib/open-findings.js +68 -0
  405. package/src/shared/lib/other-work.js +108 -0
  406. package/src/shared/lib/package-entry.js +142 -0
  407. package/src/shared/lib/plan-vocab.js +40 -0
  408. package/src/shared/lib/pptx-xml.js +86 -0
  409. package/src/shared/lib/proposal-words.js +61 -0
  410. package/src/shared/lib/recurrence.js +183 -0
  411. package/src/shared/lib/references.js +72 -0
  412. package/src/shared/lib/rule-pattern.js +56 -0
  413. package/src/shared/lib/sdp-fingerprint.js +115 -0
  414. package/src/shared/lib/sdp-minimal.js +123 -0
  415. package/src/shared/lib/secret-paths.js +34 -0
  416. package/src/shared/lib/signal-words.js +172 -0
  417. package/src/shared/lib/signoff.js +56 -0
  418. package/src/shared/lib/skills-note.js +60 -0
  419. package/src/shared/lib/spec-sections.js +78 -0
  420. package/src/shared/lib/symbol-entry.js +60 -0
  421. package/src/shared/lib/tool-phrasing.js +338 -0
  422. package/src/shared/lib/turn-gap.js +27 -0
  423. package/src/shared/lib/workstream-words.js +38 -0
  424. package/src/shared/lib/xlsx-xml.js +144 -0
  425. package/src/shared/lib/zip-reader.js +99 -0
  426. package/src/shared/types/agent.js +27 -0
  427. package/src/shared/types/architecture-rules.js +30 -0
  428. package/src/shared/types/ast.js +15 -0
  429. package/src/shared/types/breakpoint.js +33 -0
  430. package/src/shared/types/channel.js +41 -0
  431. package/src/shared/types/criteria.js +15 -0
  432. package/src/shared/types/graph.js +15 -0
  433. package/src/shared/types/index.js +53 -0
  434. package/src/shared/types/peer.js +36 -0
  435. package/src/shared/types/pipeline.js +15 -0
  436. package/src/shared/types/plan.js +15 -0
  437. package/src/shared/types/play-forward.js +15 -0
  438. package/src/shared/types/power.js +15 -0
  439. package/src/shared/types/presence.js +15 -0
  440. package/src/shared/types/project-config.js +35 -0
  441. package/src/shared/types/project.js +15 -0
  442. package/src/shared/types/record.js +15 -0
  443. package/src/shared/types/recurring.js +15 -0
  444. package/src/shared/types/review.js +15 -0
  445. package/src/shared/types/settings.js +114 -0
  446. package/src/shared/types/stack.js +15 -0
  447. package/src/shared/types/system-doc.js +15 -0
  448. package/src/shared/types/system.js +15 -0
@@ -0,0 +1,168 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+ var system_docs_tools_exports = {};
19
+ __export(system_docs_tools_exports, {
20
+ register: () => register
21
+ });
22
+ module.exports = __toCommonJS(system_docs_tools_exports);
23
+ var import_zod = require("zod");
24
+ var import_helpers = require("../helpers");
25
+ function register(server, deps) {
26
+ server.registerTool(
27
+ "list_system_docs",
28
+ {
29
+ description: "List every system documentation entry for a project. Returns summaries (no body) ordered by most-recently-updated. Each entry carries title / slug / owner / tags / lastVerifiedAt / capturedAgainstCommit so the UI (or agent) can decide which doc to open next without reading bodies. System docs describe the system as it currently is; for plan-scoped specs use list_items + kind=object.",
30
+ inputSchema: {
31
+ project_path: import_zod.z.string().describe("Absolute path to the project root"),
32
+ search: import_zod.z.string().optional().describe("Optional substring filter over title + body (case-insensitive)")
33
+ }
34
+ },
35
+ async ({ project_path, search }) => {
36
+ const docs = search ? deps.systemDocsService.searchSystemDocs(project_path, search) : deps.systemDocsService.listSystemDocs(project_path);
37
+ return { content: [{ type: "text", text: JSON.stringify({ projectPath: project_path, count: docs.length, docs }, null, 2) }] };
38
+ }
39
+ );
40
+ server.registerTool(
41
+ "read_system_doc",
42
+ {
43
+ description: 'Read a single system doc by UID (preferred \u2014 stable across renames) or by (project_path + slug). Returns the full doc including markdown body, references, ownership, and freshness stamps. Use this when you need to *read* a doc to ground a plan or answer "how does X work?".',
44
+ inputSchema: {
45
+ uid: import_zod.z.string().optional().describe("Doc UID \u2014 preferred lookup"),
46
+ project_path: import_zod.z.string().optional().describe("Required when looking up by slug"),
47
+ slug: import_zod.z.string().optional().describe("Filesystem slug under .codetrellis/docs/")
48
+ }
49
+ },
50
+ async ({ uid, project_path, slug }) => {
51
+ let doc = uid ? deps.systemDocsService.getSystemDoc(uid) : null;
52
+ if (!doc && project_path && slug) {
53
+ doc = deps.systemDocsService.getSystemDocBySlug(project_path, slug);
54
+ }
55
+ if (!doc) {
56
+ return { content: [{ type: "text", text: `System doc not found (uid=${uid ?? ""}, slug=${slug ?? ""})` }], isError: true };
57
+ }
58
+ return { content: [{ type: "text", text: JSON.stringify(doc, null, 2) }] };
59
+ }
60
+ );
61
+ server.registerTool(
62
+ "write_system_doc",
63
+ {
64
+ description: "Create or update a system doc. When `uid` is supplied the existing doc is updated (absent fields are preserved). When omitted, a new doc is created and assigned a fresh UID. The on-disk file at .codetrellis/docs/<slug>.md is written atomically. `references` may carry { files, symbols, items, plans, urls } \u2014 used by the freshness sensor and the inline links in the doc viewer. **Updating the body does NOT touch the captured commit stamp** \u2014 call verify_system_doc after meaningful edits to re-stamp.",
65
+ inputSchema: {
66
+ uid: import_zod.z.string().optional().describe("UID of an existing doc to update; omit to create a new one"),
67
+ project_path: import_zod.z.string().describe("Absolute path to the project root"),
68
+ title: import_zod.z.string().optional(),
69
+ body: import_zod.z.string().optional().describe("Markdown body \u2014 no frontmatter (added on serialise)"),
70
+ owner: import_zod.z.string().nullable().optional().describe("Free-form ownership label; null clears"),
71
+ tags: import_zod.z.array(import_zod.z.string()).optional(),
72
+ references: import_zod.z.object({
73
+ files: import_zod.z.array(import_zod.z.string()).optional(),
74
+ symbols: import_zod.z.array(import_zod.z.string()).optional(),
75
+ items: import_zod.z.array(import_zod.z.string()).optional(),
76
+ plans: import_zod.z.array(import_zod.z.string()).optional(),
77
+ urls: import_zod.z.array(import_zod.z.string()).optional()
78
+ }).optional(),
79
+ slug: import_zod.z.string().optional().describe("Override the auto-derived filesystem slug (rare)")
80
+ }
81
+ },
82
+ async (args, extra) => {
83
+ const { author, authorType } = (0, import_helpers.authorFromExtra)(deps, extra);
84
+ if (args.uid) {
85
+ const updated = deps.systemDocsService.updateSystemDoc(args.uid, {
86
+ author,
87
+ authorType,
88
+ title: args.title,
89
+ body: args.body,
90
+ owner: args.owner === void 0 ? void 0 : args.owner,
91
+ tags: args.tags,
92
+ references: args.references
93
+ });
94
+ if (!updated) {
95
+ return { content: [{ type: "text", text: `System doc ${args.uid} not found` }], isError: true };
96
+ }
97
+ const n2 = deps.broadcast("system-doc-updated", { uid: updated.uid, projectPath: updated.projectPath });
98
+ deps.saveNow(() => deps.exportDatabase());
99
+ return (0, import_helpers.resultWithMeta)(updated, n2);
100
+ }
101
+ if (!args.title) {
102
+ return { content: [{ type: "text", text: "title is required for new docs" }], isError: true };
103
+ }
104
+ const created = deps.systemDocsService.createSystemDoc({
105
+ projectPath: args.project_path,
106
+ title: args.title,
107
+ body: args.body,
108
+ owner: args.owner,
109
+ tags: args.tags,
110
+ references: args.references,
111
+ slug: args.slug,
112
+ author,
113
+ authorType
114
+ });
115
+ const n = deps.broadcast("system-doc-created", { uid: created.uid, projectPath: created.projectPath });
116
+ deps.saveNow(() => deps.exportDatabase());
117
+ return (0, import_helpers.resultWithMeta)(created, n);
118
+ }
119
+ );
120
+ server.registerTool(
121
+ "delete_system_doc",
122
+ {
123
+ description: "Delete a system doc and its on-disk file. An unknown uid is an error.",
124
+ inputSchema: { uid: import_zod.z.string() }
125
+ },
126
+ async ({ uid }) => {
127
+ const ok = deps.systemDocsService.deleteSystemDoc(uid);
128
+ if (!ok) return { content: [{ type: "text", text: `System doc ${uid} not found` }], isError: true };
129
+ const n = deps.broadcast("system-doc-removed", { uid });
130
+ deps.saveNow(() => deps.exportDatabase());
131
+ return (0, import_helpers.resultWithMeta)({ ok, uid }, n);
132
+ }
133
+ );
134
+ server.registerTool(
135
+ "verify_system_doc",
136
+ {
137
+ description: 'Mark a system doc as "accurate against current HEAD" \u2014 re-stamps captured_against_commit + last_verified_at to now. Use this after reading the doc end-to-end and confirming it still matches the code. The freshness sensor compares this stamp to the current HEAD to decide whether the doc badge should be green / yellow / red.',
138
+ inputSchema: { uid: import_zod.z.string() }
139
+ },
140
+ async ({ uid }) => {
141
+ const doc = deps.systemDocsService.verifySystemDoc(uid);
142
+ if (!doc) {
143
+ return { content: [{ type: "text", text: `System doc ${uid} not found` }], isError: true };
144
+ }
145
+ const n = deps.broadcast("system-doc-verified", { uid, capturedAgainstCommit: doc.capturedAgainstCommit });
146
+ deps.saveNow(() => deps.exportDatabase());
147
+ return (0, import_helpers.resultWithMeta)(doc, n);
148
+ }
149
+ );
150
+ server.registerTool(
151
+ "check_doc_freshness",
152
+ {
153
+ description: "Compute the freshness verdict for a system doc: current (green) / moved (yellow) / stale (red). Pure read \u2014 does not modify the doc. Useful for deciding when to re-verify, especially after a `git pull`.",
154
+ inputSchema: { uid: import_zod.z.string() }
155
+ },
156
+ async ({ uid }) => {
157
+ const report = deps.systemDocsService.getFreshness(uid);
158
+ if (!report) {
159
+ return { content: [{ type: "text", text: `System doc ${uid} not found` }], isError: true };
160
+ }
161
+ return { content: [{ type: "text", text: JSON.stringify(report, null, 2) }] };
162
+ }
163
+ );
164
+ }
165
+ // Annotate the CommonJS export names for ESM import in node:
166
+ 0 && (module.exports = {
167
+ register
168
+ });
@@ -0,0 +1,186 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+ var terminal_tools_exports = {};
19
+ __export(terminal_tools_exports, {
20
+ register: () => register
21
+ });
22
+ module.exports = __toCommonJS(terminal_tools_exports);
23
+ var import_zod = require("zod");
24
+ const agentPresetEnum = import_zod.z.enum(["shell", "claude", "codex", "aider"]);
25
+ function register(server, deps) {
26
+ function withSessionId(session) {
27
+ return { session_id: session.id, ...session };
28
+ }
29
+ server.registerTool(
30
+ "terminal_create",
31
+ {
32
+ description: 'Create a new terminal session in CodeTrellis. Returns `session_id`, which is what terminal_write / terminal_read / terminal_kill take. Preset "shell" opens a plain shell; "claude", "codex", "aider" open a shell and launch that agent after 500ms. Multiple terminals can run concurrently (up to 20). By default the new terminal is focused in the UI \u2014 set focus: false for background terminals that shouldn\'t steal the user\'s view.',
33
+ inputSchema: {
34
+ preset: agentPresetEnum.optional().describe('Agent preset or plain shell. Default: "shell".'),
35
+ cwd: import_zod.z.string().optional().describe("Working directory. Defaults to the active project root."),
36
+ title: import_zod.z.string().optional().describe("Tab title. Auto-generated if omitted."),
37
+ focus: import_zod.z.boolean().optional().describe("Focus the new terminal tab in the UI. Default true. Set false for background terminals.")
38
+ }
39
+ },
40
+ async ({ preset, cwd, title, focus }) => {
41
+ try {
42
+ const session = deps.terminalService.createTerminal({
43
+ preset: preset ?? "shell",
44
+ cwd,
45
+ title
46
+ });
47
+ deps.broadcast("terminal-created", { session, focus: focus !== false });
48
+ return {
49
+ content: [{ type: "text", text: JSON.stringify(withSessionId(session), null, 2) }]
50
+ };
51
+ } catch (err) {
52
+ return { content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }], isError: true };
53
+ }
54
+ }
55
+ );
56
+ server.registerTool(
57
+ "terminal_write",
58
+ {
59
+ description: 'Send input to a terminal session (keystrokes, commands). The text is written as-is \u2014 include "\\n" to press Enter. Use terminal_list to find active session IDs. Each terminal is independent \u2014 target the right one. Set focus: true to switch the UI to this terminal tab so the user sees the output live. IMPORTANT: Before writing, make sure you know what is running in the target terminal (use terminal_read first). Never write to your own host terminal \u2014 if you registered with host_terminal_id, writes to that terminal are blocked automatically.',
60
+ inputSchema: {
61
+ session_id: import_zod.z.string().describe("Terminal session ID (from terminal_create or terminal_list)."),
62
+ input: import_zod.z.string().describe('Text to write. Include "\\n" to execute a command.'),
63
+ focus: import_zod.z.boolean().optional().describe("Focus this terminal tab in the UI before writing. Default false.")
64
+ }
65
+ },
66
+ async ({ session_id, input, focus }, _extra) => {
67
+ const callerSessionId = deps.sessionId;
68
+ if (callerSessionId) {
69
+ const hostTerminalId = deps.sessionService.getHostTerminalId(callerSessionId);
70
+ if (hostTerminalId && hostTerminalId === session_id) {
71
+ return {
72
+ content: [{
73
+ type: "text",
74
+ text: `BLOCKED: Terminal ${session_id} is your own host terminal. Writing to it would create a feedback loop (you'd be typing into your own stdin). Use terminal_write only for OTHER terminals. If you need to run commands, execute them directly in your own shell \u2014 don't route them through terminal_write.`
75
+ }],
76
+ isError: true
77
+ };
78
+ }
79
+ }
80
+ const unescaped = input.replace(/\\n/g, "\n").replace(/\\r/g, "\r").replace(/\\t/g, " ");
81
+ if (focus) {
82
+ deps.broadcast("ui-terminal-focus", { sessionId: session_id });
83
+ }
84
+ const ok = deps.terminalService.writeTerminal(session_id, unescaped);
85
+ if (!ok) {
86
+ return { content: [{ type: "text", text: `Terminal ${session_id} not found or not alive.` }], isError: true };
87
+ }
88
+ return { content: [{ type: "text", text: `Wrote ${unescaped.length} chars to ${session_id}` }] };
89
+ }
90
+ );
91
+ server.registerTool(
92
+ "terminal_read",
93
+ {
94
+ description: "Read recent output from a terminal session. Returns the last N lines of terminal output with ANSI codes stripped (plain text). Useful for checking command results, build output, test results, or agent responses. The terminal keeps a 64KB scrollback buffer \u2014 older output is lost.",
95
+ inputSchema: {
96
+ session_id: import_zod.z.string().describe("Terminal session ID."),
97
+ lines: import_zod.z.number().int().min(1).max(500).optional().describe("Number of lines to return. Default 50.")
98
+ }
99
+ },
100
+ async ({ session_id, lines }) => {
101
+ const output = deps.terminalService.readTerminalOutput(session_id, lines);
102
+ if (output === null) {
103
+ return { content: [{ type: "text", text: `Terminal ${session_id} not found.` }], isError: true };
104
+ }
105
+ return { content: [{ type: "text", text: output }] };
106
+ }
107
+ );
108
+ server.registerTool(
109
+ "terminal_list",
110
+ {
111
+ description: "List all terminal sessions with their ID, preset, title, PID, and alive status. Use this to find the right session_id for terminal_write / terminal_read.",
112
+ inputSchema: {
113
+ alive_only: import_zod.z.boolean().optional().describe("Only show alive sessions. Default true.")
114
+ }
115
+ },
116
+ async ({ alive_only }) => {
117
+ let sessions = deps.terminalService.listTerminals();
118
+ if (alive_only !== false) {
119
+ sessions = sessions.filter((s) => s.alive);
120
+ }
121
+ return {
122
+ content: [{
123
+ type: "text",
124
+ text: JSON.stringify(sessions.map(withSessionId), null, 2)
125
+ }]
126
+ };
127
+ }
128
+ );
129
+ server.registerTool(
130
+ "terminal_kill",
131
+ {
132
+ description: "Kill a terminal session. The terminal tab is removed from the CodeTrellis UI.",
133
+ inputSchema: {
134
+ session_id: import_zod.z.string().describe("Terminal session ID to kill.")
135
+ }
136
+ },
137
+ async ({ session_id }) => {
138
+ const ok = deps.terminalService.killTerminal(session_id);
139
+ if (!ok) {
140
+ return { content: [{ type: "text", text: `Terminal ${session_id} not found.` }], isError: true };
141
+ }
142
+ deps.broadcast("terminal-killed", { id: session_id });
143
+ return { content: [{ type: "text", text: `Killed terminal ${session_id}` }] };
144
+ }
145
+ );
146
+ server.registerTool(
147
+ "terminal_resize",
148
+ {
149
+ description: "Resize a terminal session (cols x rows). Useful before reading output to ensure clean line wrapping.",
150
+ inputSchema: {
151
+ session_id: import_zod.z.string(),
152
+ cols: import_zod.z.number().int().min(40).max(400).describe("Column width."),
153
+ rows: import_zod.z.number().int().min(10).max(100).describe("Row height.")
154
+ }
155
+ },
156
+ async ({ session_id, cols, rows }) => {
157
+ const ok = deps.terminalService.resizeTerminal(session_id, cols, rows);
158
+ if (!ok) {
159
+ return { content: [{ type: "text", text: `Terminal ${session_id} not found or not alive.` }], isError: true };
160
+ }
161
+ return { content: [{ type: "text", text: `Resized ${session_id} to ${cols}x${rows}` }] };
162
+ }
163
+ );
164
+ server.registerTool(
165
+ "terminal_focus",
166
+ {
167
+ description: "Switch the terminal panel to show a specific terminal tab. Use this when you want the user to see a particular terminal's output \u2014 e.g. before writing commands the user should watch, or after a background terminal produces interesting results. Also opens the terminal panel if it's hidden.",
168
+ inputSchema: {
169
+ session_id: import_zod.z.string().describe("Terminal session ID to focus.")
170
+ }
171
+ },
172
+ async ({ session_id }) => {
173
+ const sessions = deps.terminalService.listTerminals();
174
+ const exists = sessions.some((s) => s.id === session_id);
175
+ if (!exists) {
176
+ return { content: [{ type: "text", text: `Terminal ${session_id} not found.` }], isError: true };
177
+ }
178
+ deps.broadcast("ui-terminal-focus", { sessionId: session_id });
179
+ return { content: [{ type: "text", text: `Focused terminal ${session_id}` }] };
180
+ }
181
+ );
182
+ }
183
+ // Annotate the CommonJS export names for ESM import in node:
184
+ 0 && (module.exports = {
185
+ register
186
+ });
@@ -0,0 +1,117 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+ var test_tools_exports = {};
19
+ __export(test_tools_exports, {
20
+ register: () => register
21
+ });
22
+ module.exports = __toCommonJS(test_tools_exports);
23
+ var import_zod = require("zod");
24
+ var import_helpers = require("../helpers");
25
+ var import_test_results = require("../../services/tests/test-results");
26
+ var import_grounding = require("../../services/tests/grounding");
27
+ var import_teammate_runs = require("../../services/tests/teammate-runs");
28
+ var import_confined_fs = require("../../services/confined-fs");
29
+ const noProject = { isError: true, content: [{ type: "text", text: "No project is open, and none was named." }] };
30
+ const text = (data) => ({ content: [{ type: "text", text: JSON.stringify(data, null, 2) }] });
31
+ function register(server, deps) {
32
+ server.registerTool(
33
+ "report_tests",
34
+ {
35
+ description: "Hand over a test run's JUnit report so CodeTrellis keeps each test's result: which passed, failed, errored or was skipped, and the first line of each failure. CodeTrellis never runs tests; run them yourself with a JUnit reporter (vitest --reporter=junit, jest-junit, pytest --junitxml, go-junit-report, Playwright's junit reporter) and pass the file it wrote. Reporting the same file twice changes nothing; an older run never replaces a newer result. Returns the totals and the failing tests by name.",
36
+ inputSchema: {
37
+ path: import_zod.z.string().min(1).max(500).describe("The JUnit report, relative to the project root (or absolute inside it)."),
38
+ project_path: import_zod.z.string().optional().describe("Absolute path of an opened project. Defaults to the active project.")
39
+ }
40
+ },
41
+ async ({ path: file, project_path }, extra) => {
42
+ const root = project_path ?? deps.getActiveProjectPath();
43
+ if (!root) return noProject;
44
+ try {
45
+ const out = (0, import_test_results.ingestTestReport)(root, file, (0, import_helpers.authorFromExtra)(deps, extra));
46
+ if (!out.already) deps.broadcast("tests-reported", { project: root });
47
+ const r = out.report;
48
+ const failing = r.failed + r.errors;
49
+ return text({
50
+ report: r.path,
51
+ ran_at: new Date(r.ranAt).toISOString(),
52
+ totals: { tests: r.tests, passed: r.passed, failing, skipped: r.skipped },
53
+ says: `${r.tests} test${r.tests === 1 ? "" : "s"}, ${failing ? `${failing} failing` : "none failing"}${r.skipped ? `, ${r.skipped} skipped` : ""}${out.already ? " (already reported; nothing changed)" : ""}.`,
54
+ failing: out.failing.map((f) => ({ test: f.label, result: f.result, why: f.message })),
55
+ ...out.truncated ? { note: "The report has more tests than are read; the rest are not counted." } : {}
56
+ });
57
+ } catch (err) {
58
+ if (err instanceof import_test_results.TestReportError) return { isError: true, content: [{ type: "text", text: err.message }] };
59
+ throw err;
60
+ }
61
+ }
62
+ );
63
+ server.registerTool(
64
+ "get_test_results",
65
+ {
66
+ description: 'What the last test runs said, from the reports handed over with report_tests or as a test criterion\'s evidence: each test\'s last result and when that run happened, failing first. Pass match to narrow to tests whose file, class or suite contains it (e.g. "billing/invoice"), or failing_only. Pass for_file to ask about a source file instead: its tests are those whose test file imports it (directly or through a barrel), and it reads passing, failing, "tests older than the code" (it changed after they last ran \u2014 run them again before claiming done) or no tests. A teammate\'s run read from the plans folder (shared task state) counts too, judged by the commit it ran on, and is named in `from` and `teammates`. CodeTrellis never runs tests itself.',
67
+ inputSchema: {
68
+ match: import_zod.z.string().max(300).optional(),
69
+ failing_only: import_zod.z.boolean().optional(),
70
+ for_file: import_zod.z.string().min(1).max(500).optional().describe("A source file, relative to the project root: its tests and whether they still hold."),
71
+ project_path: import_zod.z.string().optional().describe("Absolute path of an opened project. Defaults to the active project.")
72
+ }
73
+ },
74
+ async ({ match, failing_only, for_file, project_path }) => {
75
+ const root = project_path ?? deps.getActiveProjectPath();
76
+ if (!root) return noProject;
77
+ if (for_file) {
78
+ try {
79
+ const g = (0, import_grounding.groundingOf)(root, for_file);
80
+ return text({
81
+ file: g.path,
82
+ state: g.state,
83
+ says: g.words,
84
+ test_files: g.testFiles,
85
+ ...g.from ? { from: { who: g.from.who, verified: g.from.verified, commit: g.from.commit, ran_at: new Date(g.from.at).toISOString() } } : {},
86
+ ...g.lastRunAt ? { last_run_at: new Date(g.lastRunAt).toISOString() } : {},
87
+ ...g.changedAt ? { changed_at: new Date(g.changedAt).toISOString() } : {},
88
+ tests: g.tests.filter((t) => !failing_only || t.result === "failed" || t.result === "error").map((t) => ({ test: t.label, result: t.result, ...t.message ? { why: t.message } : {}, test_file: t.testFile }))
89
+ });
90
+ } catch (err) {
91
+ if (err instanceof import_confined_fs.ConfinementError) return { isError: true, content: [{ type: "text", text: `${for_file} is not a file inside this project.` }] };
92
+ if (err instanceof import_grounding.NotAFileError) return { isError: true, content: [{ type: "text", text: err.message }] };
93
+ throw err;
94
+ }
95
+ }
96
+ const tests = (0, import_test_results.listTestResults)(root, { match, limit: 200 }).filter((t) => !failing_only || t.result === "failed" || t.result === "error");
97
+ return text({
98
+ says: (0, import_test_results.testsSummary)(root).words,
99
+ tests: tests.map((t) => ({
100
+ test: t.label,
101
+ file: t.file,
102
+ result: t.result,
103
+ ...t.message ? { why: t.message } : {},
104
+ ran_at: new Date(t.ranAt).toISOString(),
105
+ report: t.reportPath
106
+ })),
107
+ reports: (0, import_test_results.listTestReports)(root, 5).map((r) => ({ report: r.path, ran_at: new Date(r.ranAt).toISOString(), tests: r.tests, failing: r.failed + r.errors, by: r.reportedBy })),
108
+ // D1.5a: teammates' latest runs, from the plans folder.
109
+ teammates: (0, import_teammate_runs.teammateRunSummaries)(root).map((r) => ({ who: r.who, verified: r.verified, commit: r.commit, ran_at: new Date(r.at).toISOString(), says: r.says }))
110
+ });
111
+ }
112
+ );
113
+ }
114
+ // Annotate the CommonJS export names for ESM import in node:
115
+ 0 && (module.exports = {
116
+ register
117
+ });