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,185 @@
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 presence_tools_exports = {};
19
+ __export(presence_tools_exports, {
20
+ register: () => register
21
+ });
22
+ module.exports = __toCommonJS(presence_tools_exports);
23
+ var import_zod = require("zod");
24
+ var import_helpers = require("../helpers");
25
+ var import_breakpoint_service = require("../../services/breakpoint-service");
26
+ function register(server, deps) {
27
+ server.registerTool(
28
+ "present",
29
+ {
30
+ description: `Post a narration card to the Agent Presence Pane \u2014 a floating overlay in the CodeTrellis UI. Use this to explain what you're doing, narrate a walkthrough, or ask the user a question. Cards support basic markdown (bold, inline code, links). Set speak=true to have the card read aloud via text-to-speech. Set require_ack=true to make the card show a "Got it" button \u2014 pair with await_ack to pace a walkthrough.`,
31
+ inputSchema: {
32
+ text: import_zod.z.string().describe("Card body \u2014 supports **bold**, `code`, and [links](url)"),
33
+ speak: import_zod.z.boolean().optional().default(false).describe("Speak the card aloud via built-in TTS"),
34
+ require_ack: import_zod.z.boolean().optional().default(false).describe('Show a "Got it" button the user must click before you advance'),
35
+ tone: import_zod.z.enum(["neutral", "success", "warning", "question"]).optional().default("neutral").describe("Visual tone \u2014 controls the card's accent color"),
36
+ link_to: import_zod.z.string().optional().describe("Node ID or plan item UID to visually anchor the card to")
37
+ }
38
+ },
39
+ async ({ text, speak, require_ack, tone, link_to }, extra) => {
40
+ const { author } = (0, import_helpers.authorFromExtra)(deps, extra);
41
+ const card = deps.presenceService.postCard({
42
+ text,
43
+ speak,
44
+ requireAck: require_ack,
45
+ tone,
46
+ linkTo: link_to ?? null,
47
+ agentId: author
48
+ });
49
+ const n = deps.broadcast("presence-card", { card });
50
+ return (0, import_helpers.resultWithMeta)({ card_id: card.id }, n);
51
+ }
52
+ );
53
+ server.registerTool(
54
+ "await_ack",
55
+ {
56
+ description: 'Block until the user acknowledges a presence card (clicks "Got it" or speech finishes). Returns { acked: true, via: "click"|"speech-end" } on success, { acked: false, via: "timeout" } on timeout, or { acked: false, via: "dismissed" } if the pane was dismissed first. An unknown card_id is an error. Use this after present(require_ack=true) to pace a walkthrough \u2014 the agent waits for the human before advancing.',
57
+ inputSchema: {
58
+ card_id: import_zod.z.string().describe("ID of the card to wait for (returned by present)"),
59
+ timeout_ms: import_zod.z.number().optional().default(3e4).describe("Max wait in ms (default 30s, max 120s)")
60
+ }
61
+ },
62
+ async ({ card_id, timeout_ms }) => {
63
+ const clampedTimeout = Math.min(timeout_ms ?? 3e4, 12e4);
64
+ const existing = deps.presenceService.getCard(card_id);
65
+ if (!existing) {
66
+ return { content: [{ type: "text", text: `No presence card ${card_id}. Use the card_id that present returned; cards are cleared when the pane is dismissed and when CodeTrellis restarts.` }], isError: true };
67
+ }
68
+ if (existing.acked) {
69
+ return { content: [{ type: "text", text: JSON.stringify({
70
+ acked: true,
71
+ via: existing.ackedVia,
72
+ card_id
73
+ }, null, 2) }] };
74
+ }
75
+ const nonce = `ack-${card_id}`;
76
+ const p = new Promise((resolve, reject) => {
77
+ const timer = setTimeout(() => {
78
+ deps.pendingResponses.delete(nonce);
79
+ resolve(JSON.stringify({ acked: false, via: "timeout", card_id }));
80
+ }, clampedTimeout);
81
+ deps.pendingResponses.set(nonce, { resolve, reject, timer });
82
+ });
83
+ const resultStr = await p;
84
+ return { content: [{ type: "text", text: resultStr }] };
85
+ }
86
+ );
87
+ server.registerTool(
88
+ "dismiss_presence",
89
+ {
90
+ description: "Close the Agent Presence Pane and clear all cards. Use when a walkthrough or narration session is complete.",
91
+ inputSchema: {}
92
+ },
93
+ async () => {
94
+ for (const card of deps.presenceService.getCards()) {
95
+ const nonce = `ack-${card.id}`;
96
+ const pending = deps.pendingResponses.get(nonce);
97
+ if (!pending) continue;
98
+ clearTimeout(pending.timer);
99
+ deps.pendingResponses.delete(nonce);
100
+ pending.resolve(JSON.stringify({ acked: false, via: "dismissed", card_id: card.id }));
101
+ }
102
+ deps.presenceService.clearCards();
103
+ const n = deps.broadcast("presence-dismissed", {});
104
+ return (0, import_helpers.resultWithMeta)({ ok: true }, n);
105
+ }
106
+ );
107
+ server.registerTool(
108
+ "await_user_input",
109
+ {
110
+ description: "Block until the user types a reply in the Presence Pane, or timeout. Returns { text, at } with the user's message, { text: null, timed_out: true } on timeout, or { text: null, superseded: true } if another question replaced yours before the person answered. Use after presenting a question to let the user respond without leaving the app.",
111
+ inputSchema: {
112
+ prompt: import_zod.z.string().optional().describe("Hint text shown in the reply box"),
113
+ timeout_ms: import_zod.z.number().optional().default(6e4).describe("Max wait in ms (default 60s, max 300s)")
114
+ }
115
+ },
116
+ async ({ prompt, timeout_ms }) => {
117
+ const clampedTimeout = Math.min(timeout_ms ?? 6e4, 3e5);
118
+ const startedAt = Date.now();
119
+ if (prompt) {
120
+ deps.broadcast("presence-input-prompt", { prompt });
121
+ }
122
+ const immediate = deps.presenceService.consumeReply(startedAt);
123
+ if (immediate) {
124
+ return { content: [{ type: "text", text: JSON.stringify({
125
+ text: immediate.text,
126
+ at: immediate.createdAt
127
+ }, null, 2) }] };
128
+ }
129
+ const nonce = `reply-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
130
+ const p = new Promise((resolve) => {
131
+ const timer = setTimeout(() => {
132
+ deps.pendingResponses.delete(nonce);
133
+ deps.presenceService.clearReplyWaiter(nonce);
134
+ resolve(JSON.stringify({ text: null, timed_out: true }));
135
+ }, clampedTimeout);
136
+ deps.pendingResponses.set(nonce, {
137
+ resolve,
138
+ reject: () => {
139
+ },
140
+ // never rejects — timeout resolves
141
+ timer
142
+ });
143
+ });
144
+ const replaced = deps.presenceService.setReplyWaiter(nonce);
145
+ const previous = replaced ? deps.pendingResponses.get(replaced) : void 0;
146
+ if (replaced && previous) {
147
+ clearTimeout(previous.timer);
148
+ deps.pendingResponses.delete(replaced);
149
+ previous.resolve(JSON.stringify({
150
+ text: null,
151
+ superseded: true,
152
+ note: "Another question replaced yours in the reply box before the person answered. Ask again if you still need it."
153
+ }));
154
+ }
155
+ const resultStr = await p;
156
+ return { content: [{ type: "text", text: resultStr }] };
157
+ }
158
+ );
159
+ server.registerTool(
160
+ "await_decision",
161
+ {
162
+ description: 'Wait for a person to answer a breakpoint. When a call returns "paused: waiting for a decision" with a ref, call this with that ref. Returns { status: "answered", decision: "continue" | "steer" | "stop", note } once they answer, or { status: "waiting" } after wait_seconds; then call it again with the same ref. The wait is kept by CodeTrellis, not by this call, so it survives timeouts, reconnects and restarts: an answer can take hours. On continue or steer, make the paused call again (a steer is a note to follow); on stop, do not.',
163
+ inputSchema: {
164
+ ref: import_zod.z.string().describe("The ref from the paused result"),
165
+ wait_seconds: import_zod.z.number().min(0).max(55).optional().describe("How long to wait in this call (default 25, max 55)")
166
+ }
167
+ },
168
+ async ({ ref, wait_seconds }, extra) => {
169
+ let hit = (0, import_breakpoint_service.getHit)(ref);
170
+ if (!hit) {
171
+ return { content: [{ type: "text", text: `No breakpoint is waiting with ref ${ref}.` }], isError: true };
172
+ }
173
+ const deadline = Date.now() + Math.min(wait_seconds ?? 25, 55) * 1e3;
174
+ while (hit.answeredAt === null && Date.now() < deadline && !extra?.signal?.aborted) {
175
+ await new Promise((r) => setTimeout(r, 250));
176
+ hit = (0, import_breakpoint_service.getHit)(ref) ?? hit;
177
+ }
178
+ return { content: [{ type: "text", text: JSON.stringify((0, import_breakpoint_service.decisionView)(hit), null, 2) }] };
179
+ }
180
+ );
181
+ }
182
+ // Annotate the CommonJS export names for ESM import in node:
183
+ 0 && (module.exports = {
184
+ register
185
+ });
@@ -0,0 +1,150 @@
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 project_config_tools_exports = {};
19
+ __export(project_config_tools_exports, {
20
+ register: () => register
21
+ });
22
+ module.exports = __toCommonJS(project_config_tools_exports);
23
+ var import_zod = require("zod");
24
+ function register(server, deps) {
25
+ server.registerTool(
26
+ "get_project_config",
27
+ {
28
+ description: "Read the per-project config at <projectRoot>/.codetrellis/config.json. Returns the raw projectConfig and the effective values after resolving precedence per-project > per-user. The effective surface only covers settings with a per-user counterpart (today: plans.{defaultVisibility,attachmentLocation}). channels.routing has no per-user layer to merge against and is therefore project-only \u2014 read it from projectConfig.channels.routing directly. Use this to see what conventions the team has agreed on for the project, and how they differ from your per-user defaults.",
29
+ inputSchema: {
30
+ project_root: import_zod.z.string().describe(
31
+ "Absolute path to the project root. The config is read from <project_root>/.codetrellis/config.json."
32
+ )
33
+ }
34
+ },
35
+ async ({ project_root }) => {
36
+ const config = deps.projectConfigService.getProjectConfig(project_root);
37
+ const effective = {
38
+ plans: {
39
+ defaultVisibility: deps.projectConfigService.getEffectiveDefaultVisibility(project_root),
40
+ attachmentLocation: deps.projectConfigService.getEffectiveAttachmentLocation(project_root)
41
+ },
42
+ sensors: deps.projectConfigService.getEffectiveSensorConfig(project_root)
43
+ };
44
+ return {
45
+ content: [
46
+ {
47
+ type: "text",
48
+ text: JSON.stringify({ projectConfig: config, effective }, null, 2)
49
+ }
50
+ ]
51
+ };
52
+ }
53
+ );
54
+ const channelRouteWhenSchema = import_zod.z.object({
55
+ eventType: import_zod.z.enum(["stuck", "need-decision", "need-context", "handing-off", "steer", "weigh-in"]).optional(),
56
+ status: import_zod.z.enum(["open", "resolved", "dismissed"]).optional(),
57
+ planUid: import_zod.z.string().optional(),
58
+ itemUid: import_zod.z.string().optional(),
59
+ minAgeMs: import_zod.z.number().optional()
60
+ });
61
+ const channelRouteToastSchema = import_zod.z.object({
62
+ target: import_zod.z.literal("in-app-toast"),
63
+ tone: import_zod.z.enum(["info", "warning", "error"]).optional(),
64
+ sticky: import_zod.z.boolean().optional()
65
+ });
66
+ const channelRouteWebhookSchema = import_zod.z.object({
67
+ target: import_zod.z.literal("webhook"),
68
+ url: import_zod.z.string(),
69
+ headers: import_zod.z.record(import_zod.z.string(), import_zod.z.string()).optional()
70
+ });
71
+ const channelRoutingRuleSchema = import_zod.z.object({
72
+ id: import_zod.z.string().optional(),
73
+ description: import_zod.z.string().optional(),
74
+ enabled: import_zod.z.boolean().optional(),
75
+ when: channelRouteWhenSchema,
76
+ notify: import_zod.z.union([channelRouteToastSchema, channelRouteWebhookSchema])
77
+ });
78
+ server.registerTool(
79
+ "update_project_config",
80
+ {
81
+ description: "Update the per-project config at <projectRoot>/.codetrellis/config.json. Pass only the fields you want to change \u2014 unmentioned top-level sections are preserved. `channels.routing` is replaced wholesale when present (no array merge), so callers wanting to add a rule should read the current list first and write it back with the new rule appended. Project-level overrides win over the per-user defaults. The config file is committed to the manifest like any other plan content; teams can review changes through normal PR flow.",
82
+ inputSchema: {
83
+ project_root: import_zod.z.string().describe(
84
+ "Absolute path to the project root. The config is written to <project_root>/.codetrellis/config.json."
85
+ ),
86
+ plans: import_zod.z.object({
87
+ defaultVisibility: import_zod.z.enum(["shared", "local"]).optional().describe('Override the default visibility of new plans. "shared" = export to .codetrellis/plans/, "local" = DB-only.'),
88
+ attachmentLocation: import_zod.z.enum(["project", "user"]).optional().describe('Override where binary attachments live. "project" = in the repo, "user" = in the user data dir.')
89
+ }).optional().describe("Plan-related project-level overrides."),
90
+ channels: import_zod.z.object({
91
+ routing: import_zod.z.array(channelRoutingRuleSchema).optional().describe(
92
+ "Channel routing rules \u2014 list of {when, notify} rules evaluated when a channel event is posted. Each rule has a `when` clause (filters by eventType / status / planUid / itemUid / minAgeMs) and a `notify` target (`in-app-toast` for elevated toasts, or `webhook` for an HTTP POST to a user-controlled URL). Set `enabled: false` to keep a rule parsed but inactive. Replacement is wholesale; pass the full intended array."
93
+ )
94
+ }).optional().describe("Channel-related project-level overrides."),
95
+ sensors: import_zod.z.object({
96
+ drift: import_zod.z.object({
97
+ enabled: import_zod.z.boolean().optional().describe("Enable drift detection + channel bridging (default: true)."),
98
+ channelEvents: import_zod.z.boolean().optional().describe("Auto-post need-decision channel events on new deviations (default: true)."),
99
+ debounceMs: import_zod.z.number().optional().describe("Batch deviations arriving within this window in ms (default: 2000).")
100
+ }).optional().describe("Drift sensor \u2014 auto-fires when files change outside the plan."),
101
+ docs: import_zod.z.object({
102
+ enabled: import_zod.z.boolean().optional().describe("Enable doc-staleness detection + channel bridging (default: true)."),
103
+ channelEvents: import_zod.z.boolean().optional().describe("Auto-post need-decision channel events when a doc goes stale (default: true).")
104
+ }).optional().describe("Documentation sensor \u2014 auto-fires when referenced files change."),
105
+ stuck: import_zod.z.object({
106
+ enabled: import_zod.z.boolean().optional().describe("Enable stuck detection (default: false \u2014 needs calibration)."),
107
+ repetitionThreshold: import_zod.z.number().optional().describe("Same tool called N+ times consecutively with low arg variation (default: 8)."),
108
+ errorLoopThreshold: import_zod.z.number().optional().describe("Same tool errors N+ times in last 10 calls (default: 5)."),
109
+ idleMinutes: import_zod.z.number().optional().describe("No file change in M minutes while tools are active (default: 15).")
110
+ }).optional().describe("Stuck sensor \u2014 detects agents looping without progress. Default off."),
111
+ awareness: import_zod.z.object({
112
+ branchWindowDays: import_zod.z.number().optional().describe("A branch with no checkout here counts as a line of work when its last commit is this recent, in days (default: 7)."),
113
+ inlineNotices: import_zod.z.boolean().optional().describe("Tell an agent about an overlap on its next tool call (default: true)."),
114
+ holdSignOffOnHighSignals: import_zod.z.boolean().optional().describe("A code criterion fails while the plan's line of work has an open high overlap with other work, so sign-off waits (default: false).")
115
+ }).optional().describe("Awareness of parallel work (Phase 32).")
116
+ }).optional().describe(
117
+ "CDev Phase 4 \u2014 per-project sensor configuration. Controls when drift, documentation-staleness, and stuck-agent sensors fire and whether they post channel events. All settings have sensible defaults; override only when calibrating for this project. Pass individual sub-keys to override; absent keys preserve current values."
118
+ ),
119
+ repoRole: import_zod.z.enum(["planning", "code", "mixed"]).optional().describe(
120
+ `CDev Phase 3.6 \u2014 declare this repo's role in a multi-repo setup. "planning" = this is the canonical home for plans (code may be minimal). "code" = this repo ships product code; plans live elsewhere (cross-repo pointers carry the link). "mixed" / absent = the historical default; plans and code coexist here. The UI uses this to soften "no plans here yet" nudges in code repos that delegate planning elsewhere.`
121
+ ),
122
+ defaultSurface: import_zod.z.enum(["graph", "code", "brief"]).optional().describe(
123
+ `Phase 31 \u2014 where opening this folder lands. "brief" for a folder of documents (an analyst's work: tasks, materials, what good looks like), "code" for the code reader, "graph" (the default) for the dependency graph.`
124
+ )
125
+ }
126
+ },
127
+ async ({ project_root, plans, channels, sensors, repoRole, defaultSurface }) => {
128
+ const patch = {};
129
+ if (plans) patch.plans = plans;
130
+ if (channels) patch.channels = channels;
131
+ if (sensors) patch.sensors = sensors;
132
+ if (repoRole !== void 0) patch.repoRole = repoRole;
133
+ if (defaultSurface !== void 0) patch.defaultSurface = defaultSurface;
134
+ const updated = deps.projectConfigService.updateProjectConfig(project_root, patch);
135
+ deps.broadcast("project-config-changed", { projectRoot: project_root, config: updated });
136
+ return {
137
+ content: [
138
+ {
139
+ type: "text",
140
+ text: JSON.stringify({ projectConfig: updated }, null, 2)
141
+ }
142
+ ]
143
+ };
144
+ }
145
+ );
146
+ }
147
+ // Annotate the CommonJS export names for ESM import in node:
148
+ 0 && (module.exports = {
149
+ register
150
+ });
@@ -0,0 +1,172 @@
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 review_tools_exports = {};
19
+ __export(review_tools_exports, {
20
+ register: () => register
21
+ });
22
+ module.exports = __toCommonJS(review_tools_exports);
23
+ var import_review_architecture = require("../../services/review-architecture");
24
+ var import_review_marks = require("../../services/review-marks");
25
+ var import_review_task = require("../../services/review-task");
26
+ var import_helpers = require("../helpers");
27
+ var import_git_safety = require("../../services/git-safety");
28
+ var import_zod = require("zod");
29
+ var import_snapshot_compare_service = require("../../services/snapshot-compare-service");
30
+ var import_plan_review_service = require("../../services/plan-review-service");
31
+ var import_pr_draft_service = require("../../services/pr-draft-service");
32
+ var import_review_queue_service = require("../../services/review-queue-service");
33
+ const COMPARAND_HELP = `One of: "live" (working tree), "baseline" (the pinned baseline), "checkpoint:<id>", or "commit:<ref>" (a sha or a branch; list_comparands offers each line of work's branch). A commit carries its dependency edges, so dependencies nobody planned are found for branch reviews too.`;
34
+ function register(server, deps) {
35
+ server.registerTool(
36
+ "list_comparands",
37
+ {
38
+ description: "Every point you can compare against: the live working tree, the pinned baseline, stored checkpoints, and recent commits. Use these values with compare_snapshots or review_plan.",
39
+ inputSchema: {
40
+ project_path: import_zod.z.string().describe("Absolute path to the project root.")
41
+ }
42
+ },
43
+ async ({ project_path }) => ({
44
+ content: [{ type: "text", text: JSON.stringify((0, import_snapshot_compare_service.listComparands)(project_path, void 0, await (0, import_snapshot_compare_service.comparandBranches)(project_path)), null, 2) }]
45
+ })
46
+ );
47
+ server.registerTool(
48
+ "compare_snapshots",
49
+ {
50
+ description: "Architectural delta between any two points: files added / removed / modified, edges added and removed, and the blast radius of what changed. " + COMPARAND_HELP,
51
+ inputSchema: {
52
+ project_path: import_zod.z.string(),
53
+ before: import_zod.z.string().describe(COMPARAND_HELP),
54
+ after: import_zod.z.string().describe(COMPARAND_HELP)
55
+ }
56
+ },
57
+ async ({ project_path, before, after }) => {
58
+ const result = (0, import_snapshot_compare_service.compareSnapshots)(before, after, project_path);
59
+ if (!result.ok) {
60
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }], isError: true };
61
+ }
62
+ return { content: [{ type: "text", text: JSON.stringify(result.result, null, 2) }] };
63
+ }
64
+ );
65
+ server.registerTool(
66
+ "review_plan",
67
+ {
68
+ description: 'Does this change do what the plan said? Reports items fully landed, partially landed and untouched \u2014 plus the two things a textual diff cannot show: files that changed with NO item claiming them, and dependencies that appeared with no item planning them. A new cross-module dependency is one import line in a diff and a new coupling in the architecture; this is where it becomes visible. Set format="markdown" to get a block you can post as a PR comment with your own GitHub credentials \u2014 CodeTrellis holds none.',
69
+ inputSchema: {
70
+ plan_uid: import_zod.z.string(),
71
+ project_path: import_zod.z.string(),
72
+ before: import_zod.z.string().optional().describe(`Defaults to the newest commit (so the review covers what changed since it); "baseline" when the project has no commits. ${COMPARAND_HELP}`),
73
+ after: import_zod.z.string().optional().describe(`Defaults to "live". ${COMPARAND_HELP}`),
74
+ format: import_zod.z.enum(["json", "markdown"]).optional().describe("Defaults to json.")
75
+ }
76
+ },
77
+ async ({ plan_uid, project_path, before, after, format }) => {
78
+ const reviewed = (0, import_plan_review_service.reviewPlan)({ planUid: plan_uid, projectPath: project_path, before, after });
79
+ if (!reviewed.ok) {
80
+ return { content: [{ type: "text", text: JSON.stringify(reviewed, null, 2) }], isError: true };
81
+ }
82
+ const result = { ok: true, review: await (0, import_plan_review_service.withArchitecture)(reviewed.review, project_path) };
83
+ if (format === "markdown") {
84
+ const plan = deps.planService.getPlan(plan_uid);
85
+ return {
86
+ content: [{
87
+ type: "text",
88
+ text: (0, import_plan_review_service.renderReviewMarkdown)(result.review, plan?.title)
89
+ }]
90
+ };
91
+ }
92
+ return { content: [{ type: "text", text: JSON.stringify(result.review, null, 2) }] };
93
+ }
94
+ );
95
+ server.registerTool(
96
+ "get_pr_draft",
97
+ {
98
+ description: "The title and body for a pull request describing this plan: what it set out to do, the tickets it came from, and the review \u2014 what landed, what did not, and what changed that nobody asked for. YOU do the git and open the PR with your own credentials; this supplies the part you cannot write, because the plan, its ticket lineage and the architectural delta exist nowhere else. Nothing here touches the repository. Check `warnings` before opening: they are the things a reviewer will ask about.",
99
+ inputSchema: {
100
+ plan_uid: import_zod.z.string(),
101
+ project_path: import_zod.z.string(),
102
+ before: import_zod.z.string().optional().describe(`Defaults to the newest commit (so the review covers what changed since it); "baseline" when the project has no commits. ${COMPARAND_HELP}`),
103
+ after: import_zod.z.string().optional().describe(`Defaults to "live". ${COMPARAND_HELP}`)
104
+ }
105
+ },
106
+ async ({ plan_uid, project_path, before, after }) => {
107
+ const result = (0, import_pr_draft_service.buildPrDraft)({ planUid: plan_uid, projectPath: project_path, before, after, architecture: await (0, import_pr_draft_service.draftArchitecture)(project_path, before, after) });
108
+ if (!result.ok) {
109
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }], isError: true };
110
+ }
111
+ return { content: [{ type: "text", text: JSON.stringify(result.draft, null, 2) }] };
112
+ }
113
+ );
114
+ server.registerTool(
115
+ "get_review_queue",
116
+ {
117
+ description: `The review queue: every line of work (a branch) that has plan items, reviewed against the main checkout's branch, with where its criteria stand, its blast radius, dependencies nobody planned, open overlaps with other work, whether it is ready, and a suggested merge order with the reason for each place. A line that changes something another imports goes first, so the other updates to it rather than breaking. The order is a suggestion, never enforced. Use it to answer "what should merge next, and why".`,
118
+ inputSchema: {
119
+ project_path: import_zod.z.string()
120
+ }
121
+ },
122
+ async ({ project_path }) => {
123
+ const queue = (0, import_review_queue_service.reviewQueue)(project_path);
124
+ return { content: [{ type: "text", text: JSON.stringify(queue, null, 2) }] };
125
+ }
126
+ );
127
+ server.registerTool(
128
+ "review_change",
129
+ {
130
+ description: `What a change does to the architecture, with no plan needed: between two commits (a branch and its base), the imports added and removed between folders, outside packages added or dropped (package.json, requirements.txt, go.mod), HTTP calls, routes and SQL added or dropped, imports across the team's rules, and what it does to the rulebook. Read it before the text diff. When head is a branch a plan item names, it also says whether the change did what the task said (task): each criterion with where it stands, the planned files touched and not, and the changed files nobody planned. Without a linked task there is no task section. format="markdown" gives the section for a pull request comment.`,
131
+ inputSchema: {
132
+ base: import_zod.z.string().max(200).describe("The commit or branch the change started from, e.g. origin/main."),
133
+ head: import_zod.z.string().max(200).optional().describe("The change: a commit or branch. Defaults to HEAD."),
134
+ project_path: import_zod.z.string().optional().describe("An opened project. Omit for the one open in the app."),
135
+ format: import_zod.z.enum(["json", "markdown"]).optional().describe("Defaults to json."),
136
+ mark_reviewed: import_zod.z.boolean().optional().describe(
137
+ "Remember that you reviewed it at its head now. Your next review_change of the same head says what moved since, and which of these findings the pushes addressed."
138
+ )
139
+ }
140
+ },
141
+ async ({ base, head, project_path, format, mark_reviewed }, extra) => {
142
+ const root = project_path ?? deps.getActiveProjectPath();
143
+ if (!root) return { isError: true, content: [{ type: "text", text: "No project is open." }] };
144
+ if (!(0, import_git_safety.isSafeGitRef)(base) || head !== void 0 && !(0, import_git_safety.isSafeGitRef)(head)) {
145
+ return { isError: true, content: [{ type: "text", text: "base and head must be commits or branch names." }] };
146
+ }
147
+ const a = await (0, import_review_architecture.architectureOf)(root, base, head ?? "HEAD");
148
+ if ("error" in a) return { isError: true, content: [{ type: "text", text: a.error }] };
149
+ const who = (0, import_helpers.authorFromExtra)(deps, extra);
150
+ const target = head ?? "HEAD";
151
+ const mark = (0, import_review_marks.lastMark)(root, target, who.author);
152
+ const since = mark ? (0, import_review_marks.sinceLastLook)(root, mark, a.head, a.words) : null;
153
+ if (mark_reviewed) (0, import_review_marks.markReviewed)(root, { target, reviewer: who.author, reviewerType: who.authorType, base: a.base, commit: a.head, findings: a.words });
154
+ const task = (0, import_review_task.taskOutcome)(root, base, target);
155
+ if (format === "markdown") {
156
+ return { content: [{ type: "text", text: `${since ? `${since.words}
157
+
158
+ ` : ""}${(0, import_review_architecture.architectureMarkdown)(a)}${task ? `
159
+
160
+ ${(0, import_review_task.taskMarkdown)(task)}` : ""}` }] };
161
+ }
162
+ return {
163
+ _meta: { summary: `${a.words.length} architecture finding${a.words.length === 1 ? "" : "s"} between ${base} and ${head ?? "HEAD"}` },
164
+ content: [{ type: "text", text: JSON.stringify({ ...a, ...since ? { since } : {}, ...task ? { task } : {} }, null, 2) }]
165
+ };
166
+ }
167
+ );
168
+ }
169
+ // Annotate the CommonJS export names for ESM import in node:
170
+ 0 && (module.exports = {
171
+ register
172
+ });