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,554 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
24
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
+ mod
26
+ ));
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+ var session_tools_exports = {};
29
+ __export(session_tools_exports, {
30
+ register: () => register
31
+ });
32
+ module.exports = __toCommonJS(session_tools_exports);
33
+ var import_zod = require("zod");
34
+ var import_node_path = __toESM(require("node:path"));
35
+ var import_helpers = require("../helpers");
36
+ var import_types = require("../../../shared/types");
37
+ var import_confined_fs = require("../../services/confined-fs");
38
+ function notInRecents(projectPath) {
39
+ return {
40
+ isError: true,
41
+ content: [{ type: "text", text: `Project not in recents: ${projectPath}` }]
42
+ };
43
+ }
44
+ function register(server, deps) {
45
+ const notFound = (what, uid) => ({
46
+ content: [{ type: "text", text: `${what} ${uid} not found.` }],
47
+ isError: true
48
+ });
49
+ const missingPlan = (uid) => uid && !deps.planService.getPlan(uid) ? notFound("Plan", uid) : null;
50
+ const missingItem = (uid) => uid && !deps.planItemService.getItem(uid) ? notFound("Item", uid) : null;
51
+ server.registerTool(
52
+ "register_session",
53
+ {
54
+ description: "Register this agent connection with CodeTrellis. Identifies who you are, what model you use, and what capabilities you have. Capabilities are used for skill-matching when claiming Actions \u2014 declare your MCP servers, language proficiencies, and skills so CodeTrellis can route the right work to you.\n\nIf you are running inside a CodeTrellis terminal, the environment variable CODETRELLIS_HOST_TERMINAL will be set to your host terminal's session ID. Pass it as host_terminal_id so CodeTrellis can prevent you from accidentally writing to your own terminal via terminal_write (which would create a feedback loop).",
55
+ inputSchema: {
56
+ agent_type: import_zod.z.string().describe("Agent type, e.g. claude-code, cursor, aider"),
57
+ model: import_zod.z.string().optional().describe("Model name, e.g. claude-opus-4, gpt-4o"),
58
+ capabilities: import_zod.z.array(import_zod.z.object({
59
+ name: import_zod.z.string().describe('Capability name, e.g. "playwright", "typescript", "@refactor"'),
60
+ source: import_zod.z.enum(["mcp", "skill", "lang", "plugin"]).describe("Where this capability comes from")
61
+ })).optional().describe("Capabilities this agent has \u2014 MCP servers, skills, languages, plugins"),
62
+ host_terminal_id: import_zod.z.string().optional().describe(
63
+ "If you are running inside a CodeTrellis terminal, pass the value of the CODETRELLIS_HOST_TERMINAL environment variable here. This enables self-write protection \u2014 terminal_write will reject writes to your own host terminal to prevent feedback loops."
64
+ )
65
+ }
66
+ },
67
+ async ({ agent_type, model, capabilities, host_terminal_id }) => {
68
+ const sessionId = deps.sessionId;
69
+ deps.sessionService.registerSession(sessionId, agent_type, model, capabilities, host_terminal_id);
70
+ deps.broadcast("session-registered", { sessionId, agentType: agent_type, model, capabilities });
71
+ deps.broadcast("mcp-session-changed", { reason: "register", sessionId });
72
+ deps.saveNow(() => deps.exportDatabase());
73
+ const parts = [
74
+ `Session registered: ${sessionId} (${agent_type}${model ? ` / ${model}` : ""}${capabilities?.length ? ` with ${capabilities.length} capabilities` : ""})`
75
+ ];
76
+ if (host_terminal_id) {
77
+ parts.push(`Self-write protection enabled: writes to terminal ${host_terminal_id} will be blocked from this session.`);
78
+ }
79
+ return { content: [{ type: "text", text: parts.join("\n") }] };
80
+ }
81
+ );
82
+ server.registerTool(
83
+ "set_active_plan",
84
+ {
85
+ description: "Associate this agent session with a plan and navigate the UI to show it. Other connected agents see your active plan in the Connected Agents widget.",
86
+ inputSchema: { plan_uid: import_zod.z.string() }
87
+ },
88
+ async ({ plan_uid }) => {
89
+ const refused = missingPlan(plan_uid);
90
+ if (refused) return refused;
91
+ const sessionId = deps.sessionId;
92
+ if (sessionId) {
93
+ deps.sessionService.setActivePlan(sessionId, plan_uid);
94
+ deps.broadcast("mcp-session-changed", { reason: "set_active_plan", sessionId, planUid: plan_uid });
95
+ } else {
96
+ const sessions = deps.sessionService.getActiveSessions();
97
+ if (sessions.length > 0) {
98
+ deps.sessionService.setActivePlan(sessions[sessions.length - 1].sessionId, plan_uid);
99
+ deps.broadcast("mcp-session-changed", { reason: "set_active_plan", planUid: plan_uid });
100
+ }
101
+ }
102
+ const n = deps.broadcast("ui-navigate", { target: "plan", planUid: plan_uid });
103
+ return (0, import_helpers.resultWithMeta)({ ok: true, planUid: plan_uid, navigated: true }, n);
104
+ }
105
+ );
106
+ server.registerTool(
107
+ "navigate_to",
108
+ {
109
+ description: "Navigate the CodeTrellis UI to a specific view. Use this to show the user what you are working on \u2014 open the plan workspace, switch to graph view, enable split view, open the Brief on a task, or open a file you cite at the place you cite.",
110
+ inputSchema: {
111
+ target: import_zod.z.enum(["plan", "graph", "split", "timeline", "code", "brief", "artefact", "awareness", "stack", "review", "replay", "play-forward", "live", "changes"]).describe('"plan" = plan workspace, "graph" = dependency graph, "split" = plan + graph side-by-side, "timeline" = plan workspace with the activity/event feed open, "code" = the code reader on a file, "brief" = the Brief (the plan as tasks, materials and what good looks like), "artefact" = a recorded file in the viewer, at a locator, "awareness" / "stack" / "review" = that tab of the side panel (overlaps and what needs the person; how the work stacks up; what to merge first), "replay" = the project as it was, from a moment (`from`), played at 4\xD7 with speed 4, "play-forward" = every active plan played forward to where they meet, "live" = back to now from replay or play-forward, "changes" = the sidebar\'s Changes view (source control, no plan needed). Showing only: nothing here decides anything for the person.'),
112
+ plan_uid: import_zod.z.string().optional().describe("If navigating to plan/split/timeline, which plan to show. If omitted, keeps the current active plan."),
113
+ // `code` was missing entirely, so an agent could show someone the
114
+ // graph, a plan, a split and a timeline — and never the code,
115
+ // which is where the per-line verdict lives. An agent that says
116
+ // "look at what changed" could not make that happen.
117
+ file_path: import_zod.z.string().optional().describe('For target "code": absolute path of the file to open.'),
118
+ line: import_zod.z.number().int().optional().describe('For target "code": line to scroll to and mark.'),
119
+ // "Whose line is this?" is a question an agent can answer in words
120
+ // (line_history) and could not put on screen: the reader opened at
121
+ // the line, with who wrote it nowhere in sight.
122
+ line_history: import_zod.z.boolean().optional().describe("For target \"code\": turn on the reader's Line history, so the person sees who wrote each run of lines; with `line`, that line's card opens: its commit, git author, the agent and how CodeTrellis knows."),
123
+ // Phase 31 §5 — an agent that says "look at the figure I cited" can
124
+ // put it on screen, and one working a brief can show the task.
125
+ item_uid: import_zod.z.string().optional().describe('For target "brief": the task to show.'),
126
+ from: import_zod.z.union([import_zod.z.number(), import_zod.z.string()]).optional().describe('For target "replay": where to start, as epoch milliseconds or an ISO date. Defaults to two hours ago.'),
127
+ to: import_zod.z.union([import_zod.z.number(), import_zod.z.string()]).optional().describe('For target "replay": where to end, for a window in the past. Defaults to now.'),
128
+ speed: import_zod.z.union([import_zod.z.literal(1), import_zod.z.literal(4)]).optional().describe('For target "replay": 4 plays it at once at 4\xD7 (catching up); 1, the default, leaves the person to scrub.'),
129
+ signal_id: import_zod.z.string().optional().describe('With target "awareness": the overlap to scroll to and mark (an id from get_awareness or a notice).'),
130
+ breakpoint_ref: import_zod.z.string().optional().describe('With target "awareness": the paused or breached breakpoint to scroll to and mark in Needs you (a ref from a paused result).'),
131
+ attachment_uid: import_zod.z.string().optional().describe('For target "artefact": the recorded file to open (from get_brief or record_artefact).'),
132
+ locator: import_zod.z.object({
133
+ sheet: import_zod.z.string().optional(),
134
+ range: import_zod.z.string().optional(),
135
+ page: import_zod.z.union([import_zod.z.number().int(), import_zod.z.string()]).optional(),
136
+ lines: import_zod.z.union([import_zod.z.number().int(), import_zod.z.string()]).optional(),
137
+ text: import_zod.z.string().optional(),
138
+ t: import_zod.z.union([import_zod.z.number(), import_zod.z.string()]).optional()
139
+ }).strict().optional().describe('For target "artefact": where in the file \u2014 {sheet, range}, {page}, {lines}, {text} or {t}.')
140
+ }
141
+ },
142
+ async ({ target, plan_uid, file_path, line, line_history, item_uid, attachment_uid, locator, from, to, speed, signal_id, breakpoint_ref }) => {
143
+ const when = (v, name) => {
144
+ if (v === void 0) return void 0;
145
+ const ms = typeof v === "number" ? v : Date.parse(v);
146
+ return Number.isFinite(ms) ? ms : { error: `${name} is not a time: ${String(v)}` };
147
+ };
148
+ const fromMs = when(from, "from");
149
+ const toMs = when(to, "to");
150
+ for (const t of [fromMs, toMs]) {
151
+ if (t && typeof t === "object") return { content: [{ type: "text", text: t.error }], isError: true };
152
+ }
153
+ if ((signal_id || breakpoint_ref) && target !== "awareness") {
154
+ return { content: [{ type: "text", text: 'signal_id and breakpoint_ref go with target "awareness"' }], isError: true };
155
+ }
156
+ if (line_history && target !== "code") {
157
+ return { content: [{ type: "text", text: 'line_history goes with target "code"' }], isError: true };
158
+ }
159
+ if (target === "artefact" && !attachment_uid) {
160
+ return { content: [{ type: "text", text: 'target "artefact" needs attachment_uid' }], isError: true };
161
+ }
162
+ const refused = missingPlan(plan_uid) ?? missingItem(item_uid) ?? (attachment_uid && !deps.artefactService.getArtefact(attachment_uid) ? notFound("Recorded file", attachment_uid) : null);
163
+ if (refused) return refused;
164
+ deps.broadcast("ui-navigate", {
165
+ target,
166
+ planUid: plan_uid,
167
+ filePath: file_path,
168
+ line,
169
+ lineHistory: line_history === true ? true : void 0,
170
+ itemUid: item_uid,
171
+ attachmentUid: attachment_uid,
172
+ locator: locator ?? null,
173
+ from: fromMs,
174
+ to: toMs,
175
+ speed,
176
+ signalId: signal_id,
177
+ breakpointRef: breakpoint_ref
178
+ });
179
+ return { content: [{ type: "text", text: `Navigated to ${target}${plan_uid ? ` (plan ${plan_uid})` : ""}` }] };
180
+ }
181
+ );
182
+ server.registerTool(
183
+ "open_plan",
184
+ {
185
+ description: "Open a specific plan in the CodeTrellis UI. Switches to plan workspace mode and loads the plan. The user will see the plan immediately.",
186
+ inputSchema: {
187
+ plan_uid: import_zod.z.string().describe("UID of the plan to open"),
188
+ split_view: import_zod.z.boolean().optional().describe("Also enable split view (plan + graph side-by-side)")
189
+ }
190
+ },
191
+ async ({ plan_uid, split_view }) => {
192
+ const refused = missingPlan(plan_uid);
193
+ if (refused) return refused;
194
+ deps.broadcast("ui-navigate", { target: split_view ? "split" : "plan", planUid: plan_uid });
195
+ return { content: [{ type: "text", text: `Opened plan ${plan_uid}${split_view ? " in split view" : ""}` }] };
196
+ }
197
+ );
198
+ server.registerTool(
199
+ "toggle_panel",
200
+ {
201
+ description: 'Toggle a UI panel on or off in the CodeTrellis interface. "channel", "activity" and "history" live inside the plan workspace and will switch to it if a plan is active.',
202
+ inputSchema: {
203
+ panel: import_zod.z.enum(["sidebar", "inspector", "terminal", "plans", "split", "channel", "activity", "history"]).describe(
204
+ 'Which panel to toggle. "terminal" = the terminal drawer, "plans" = the Plans / Timeline panel under the graph, "channel" = peer-to-peer coordination Channel panel, "activity" = plan activity/event feed, "history" = plan history (time-travel) rail.'
205
+ )
206
+ }
207
+ },
208
+ async ({ panel }) => {
209
+ deps.broadcast("ui-toggle", { panel });
210
+ return { content: [{ type: "text", text: `Toggled ${panel} panel` }] };
211
+ }
212
+ );
213
+ server.registerTool(
214
+ "refresh_ui",
215
+ {
216
+ description: "Force the CodeTrellis UI to refresh its plan list and active plan. Use this after making changes that the UI might not have picked up.",
217
+ inputSchema: {}
218
+ },
219
+ async () => {
220
+ deps.broadcast("ui-refresh", {});
221
+ return { content: [{ type: "text", text: "UI refresh triggered" }] };
222
+ }
223
+ );
224
+ server.registerTool(
225
+ "rescan_project",
226
+ {
227
+ description: 'Trigger a fresh AST re-parse of the currently open project. Use this after making changes to ensure the dependency graph and symbol index are up to date. Equivalent to hitting the "Rescan" button in the UI.',
228
+ inputSchema: {
229
+ project_path: import_zod.z.string().optional().describe(
230
+ "Absolute path of the project to scan. If omitted, rescans the currently open project."
231
+ )
232
+ }
233
+ },
234
+ async ({ project_path }) => {
235
+ const target = project_path ?? deps.getActiveProjectPath();
236
+ if (!target) {
237
+ return {
238
+ content: [{ type: "text", text: "Rescan failed: no project is open. Pass project_path, or open one with open_project." }],
239
+ isError: true
240
+ };
241
+ }
242
+ try {
243
+ const stats = await deps.scanProject(target);
244
+ return { content: [{ type: "text", text: `Rescan complete for ${target} \u2014 ${stats.fileCount} files, ${stats.symbolCount} symbols, ${stats.importCount} imports (${stats.resolvedImports} resolved)` }] };
245
+ } catch (err) {
246
+ return { content: [{ type: "text", text: `Rescan failed: ${err instanceof Error ? err.message : String(err)}` }], isError: true };
247
+ }
248
+ }
249
+ );
250
+ server.registerTool(
251
+ "set_baseline",
252
+ {
253
+ description: `Pin the baseline the graph's "diff" and "baseline" modes compare against to a commit's own contents (full or short hash, or a ref such as a branch name), in the open project. Uncommitted work then shows as changes against it. Pass null to clear the baseline; the next scan sets one again.`,
254
+ inputSchema: {
255
+ commit_hash: import_zod.z.string().nullable().describe("Commit hash or ref to pin to. Null to clear.")
256
+ }
257
+ },
258
+ async ({ commit_hash }) => {
259
+ if (commit_hash === null) {
260
+ deps.clearBaseline();
261
+ deps.broadcast("ui-set-baseline", { commitHash: null, by: "agent" });
262
+ return { content: [{ type: "text", text: "Cleared the baseline. The next scan sets one again." }] };
263
+ }
264
+ const projectPath = deps.getActiveProjectPath();
265
+ if (!projectPath) {
266
+ return { content: [{ type: "text", text: "No project is open to pin a baseline in." }], isError: true };
267
+ }
268
+ try {
269
+ const baseline = await deps.pinBaseline(projectPath, commit_hash);
270
+ const n = deps.broadcast("ui-set-baseline", { commitHash: baseline.commitHash ?? null, by: "agent" });
271
+ return (0, import_helpers.resultWithMeta)({
272
+ ok: true,
273
+ commitHash: baseline.commitHash,
274
+ shortCommitHash: baseline.shortCommitHash,
275
+ files: baseline.files.size
276
+ }, n);
277
+ } catch (err) {
278
+ if (err instanceof deps.BaselineError) {
279
+ return { content: [{ type: "text", text: err.message }], isError: true };
280
+ }
281
+ throw err;
282
+ }
283
+ }
284
+ );
285
+ server.registerTool(
286
+ "list_recent_projects",
287
+ {
288
+ description: "List recently opened projects with their paths, display names, branches, and pinned status. Useful for discovering available projects to open.",
289
+ inputSchema: {}
290
+ },
291
+ async () => {
292
+ const projects = deps.listRecentProjects();
293
+ if (projects.length === 0) {
294
+ return { content: [{ type: "text", text: "No recent projects found." }] };
295
+ }
296
+ const lines = projects.map(
297
+ (p) => `- ${p.pinned ? "\u{1F4CC} " : ""}**${p.displayName}** \u2014 \`${p.path}\`${p.branch ? ` (${p.branch})` : ""}`
298
+ );
299
+ return { content: [{ type: "text", text: lines.join("\n") }] };
300
+ }
301
+ );
302
+ server.registerTool(
303
+ "pin_project",
304
+ {
305
+ description: "Pin a project in the recent projects list so it stays at the top and is never pruned.",
306
+ inputSchema: {
307
+ project_path: import_zod.z.string().describe("Absolute path of the project to pin")
308
+ }
309
+ },
310
+ async ({ project_path }) => {
311
+ if (!deps.getRecentProject(project_path)) return notInRecents(project_path);
312
+ deps.setRecentProjectPinned(project_path, true);
313
+ deps.saveNow(() => deps.exportDatabase());
314
+ return { content: [{ type: "text", text: `Pinned project: ${project_path}` }] };
315
+ }
316
+ );
317
+ server.registerTool(
318
+ "unpin_project",
319
+ {
320
+ description: "Unpin a project from the recent projects list. It will still appear in recents but can be pruned when the list is full.",
321
+ inputSchema: {
322
+ project_path: import_zod.z.string().describe("Absolute path of the project to unpin")
323
+ }
324
+ },
325
+ async ({ project_path }) => {
326
+ if (!deps.getRecentProject(project_path)) return notInRecents(project_path);
327
+ deps.setRecentProjectPinned(project_path, false);
328
+ deps.saveNow(() => deps.exportDatabase());
329
+ return { content: [{ type: "text", text: `Unpinned project: ${project_path}` }] };
330
+ }
331
+ );
332
+ server.registerTool(
333
+ "remove_recent_project",
334
+ {
335
+ description: "Remove a project from the recent projects list entirely.",
336
+ inputSchema: {
337
+ project_path: import_zod.z.string().describe("Absolute path of the project to remove")
338
+ }
339
+ },
340
+ async ({ project_path }) => {
341
+ if (!deps.getRecentProject(project_path)) return notInRecents(project_path);
342
+ deps.removeRecentProject(project_path);
343
+ deps.saveNow(() => deps.exportDatabase());
344
+ return { content: [{ type: "text", text: `Removed from recents: ${project_path}` }] };
345
+ }
346
+ );
347
+ server.registerTool(
348
+ "close_project",
349
+ {
350
+ description: "Close a project tab in the CodeTrellis UI. The human will see the tab disappear. Use list_recent_projects to find paths, or open_project to open a new one.",
351
+ inputSchema: {
352
+ project_path: import_zod.z.string().describe("Absolute path of the project to close")
353
+ }
354
+ },
355
+ async ({ project_path }) => {
356
+ deps.broadcast("ui-close-project", { path: project_path });
357
+ return { content: [{ type: "text", text: `Closed project tab: ${project_path}` }] };
358
+ }
359
+ );
360
+ server.registerTool(
361
+ "get_repo_identity",
362
+ {
363
+ description: "Read CodeTrellis' identity record for the project at the given path: the local user-facing alias (display name), the normalised git origin URL (the cross-machine identifier used to match the same repo across teammates and devices), the current branch, and recency / pinned flags. Returns null if the project isn't in the recent list.",
364
+ inputSchema: {
365
+ project_path: import_zod.z.string().describe("Absolute path of the project")
366
+ }
367
+ },
368
+ async ({ project_path }) => {
369
+ const project = deps.getRecentProject(project_path);
370
+ if (!project) {
371
+ return { content: [{ type: "text", text: JSON.stringify(null) }] };
372
+ }
373
+ return { content: [{ type: "text", text: JSON.stringify(project, null, 2) }] };
374
+ }
375
+ );
376
+ server.registerTool(
377
+ "set_repo_alias",
378
+ {
379
+ description: "Set a per-device user-facing label for the project at `project_path`. The alias is local-only \u2014 it never travels in the manifest, so different teammates and even different machines of the same user can show different labels for the same repository. Pass an empty string to reset to the path's basename. The repo's canonical identity for cross-machine matching is its git origin URL, which is unaffected.",
380
+ inputSchema: {
381
+ project_path: import_zod.z.string().describe("Absolute path of the project"),
382
+ alias: import_zod.z.string().describe("New label to show in the UI. Empty string resets to the default.")
383
+ }
384
+ },
385
+ async ({ project_path, alias }) => {
386
+ const updated = deps.setProjectAlias(project_path, alias);
387
+ if (!updated) {
388
+ return {
389
+ isError: true,
390
+ content: [{ type: "text", text: `Project not in recents: ${project_path}` }]
391
+ };
392
+ }
393
+ deps.broadcast("project-alias-changed", { path: project_path, alias: updated.displayName });
394
+ deps.saveNow(() => deps.exportDatabase());
395
+ return { content: [{ type: "text", text: JSON.stringify(updated, null, 2) }] };
396
+ }
397
+ );
398
+ server.registerTool(
399
+ "refresh_repo_origin",
400
+ {
401
+ description: "Re-read the git origin URL for the project at `project_path` and update CodeTrellis' cached value. Useful when the user has just run `git remote set-url origin <new>` and wants cross-repo pointer resolution to pick up the change without re-opening the project.",
402
+ inputSchema: {
403
+ project_path: import_zod.z.string().describe("Absolute path of the project")
404
+ }
405
+ },
406
+ async ({ project_path }) => {
407
+ const updated = deps.refreshProjectOriginUrl(project_path);
408
+ if (!updated) {
409
+ return {
410
+ isError: true,
411
+ content: [{ type: "text", text: `Project not in recents: ${project_path}` }]
412
+ };
413
+ }
414
+ deps.broadcast("project-origin-changed", { path: project_path, originUrl: updated.originUrl });
415
+ deps.saveNow(() => deps.exportDatabase());
416
+ return { content: [{ type: "text", text: JSON.stringify(updated, null, 2) }] };
417
+ }
418
+ );
419
+ server.registerTool(
420
+ "navigate_item_back",
421
+ {
422
+ description: "Navigate backward in the item selection history (like Cmd+[). The history stack records every select_item call and every user click on a plan item. Switching plans (open_plan / set_active_plan) resets the stack. Back pops the last entry; the current item is pushed onto the forward stack. Deterministic: three back calls after select A \u2192 B \u2192 C \u2192 D will land on C, B, A in that order.",
423
+ inputSchema: {}
424
+ },
425
+ async () => {
426
+ deps.broadcast("ui-navigate-item-back", {});
427
+ return { content: [{ type: "text", text: "Navigated back in item history" }] };
428
+ }
429
+ );
430
+ server.registerTool(
431
+ "navigate_item_forward",
432
+ {
433
+ description: "Navigate forward in the item selection history (like Cmd+]). Pops the forward stack (populated by navigate_item_back) and pushes the current item onto the back stack. Any new select_item call clears the forward stack (same as browser navigation).",
434
+ inputSchema: {}
435
+ },
436
+ async () => {
437
+ deps.broadcast("ui-navigate-item-forward", {});
438
+ return { content: [{ type: "text", text: "Navigated forward in item history" }] };
439
+ }
440
+ );
441
+ server.registerTool(
442
+ "toggle_activity_drawer",
443
+ {
444
+ description: "Toggle the activity drawer in the plan workspace. Shows the activity/comment feed for the current plan.",
445
+ inputSchema: {}
446
+ },
447
+ async () => {
448
+ deps.broadcast("ui-toggle-activity-drawer", {});
449
+ return { content: [{ type: "text", text: "Toggled activity drawer" }] };
450
+ }
451
+ );
452
+ server.registerTool(
453
+ "open_history_drawer",
454
+ {
455
+ description: "Open the version history drawer for a specific item. Shows all prior versions with diffs.",
456
+ inputSchema: {
457
+ item_uid: import_zod.z.string().describe("UID of the item to show history for")
458
+ }
459
+ },
460
+ async ({ item_uid }) => {
461
+ const refused = missingItem(item_uid);
462
+ if (refused) return refused;
463
+ deps.broadcast("ui-open-history-drawer", { itemUid: item_uid });
464
+ return { content: [{ type: "text", text: `Opened history drawer for item ${item_uid}` }] };
465
+ }
466
+ );
467
+ server.registerTool(
468
+ "open_settings",
469
+ {
470
+ description: "Open the settings modal in the CodeTrellis UI, at a section when one is named. Showing only: settings that widen what the app can reach are changed by the person, in the window.",
471
+ inputSchema: {
472
+ section: import_zod.z.enum(import_types.SETTINGS_SECTIONS).optional().describe('The section to open at, e.g. "data" (the record), "git", "review-hosts", "mcp" (what agents may do).')
473
+ }
474
+ },
475
+ async ({ section }) => {
476
+ deps.broadcast("ui-open-settings", section ? { section } : {});
477
+ return { content: [{ type: "text", text: section ? `Opened settings at ${section}` : "Opened settings modal" }] };
478
+ }
479
+ );
480
+ server.registerTool(
481
+ "close_settings",
482
+ {
483
+ description: "Close the settings modal, as Escape does, so what is behind it can be seen again. Changes nothing in settings.",
484
+ inputSchema: {}
485
+ },
486
+ async () => {
487
+ deps.broadcast("ui-close-settings", {});
488
+ return { content: [{ type: "text", text: "Closed settings" }] };
489
+ }
490
+ );
491
+ server.registerTool(
492
+ "open_mcp_guide",
493
+ {
494
+ description: "Open the MCP connection guide modal. Shows how to connect agents to CodeTrellis.",
495
+ inputSchema: {}
496
+ },
497
+ async () => {
498
+ deps.broadcast("ui-open-mcp-guide", {});
499
+ return { content: [{ type: "text", text: "Opened MCP guide modal" }] };
500
+ }
501
+ );
502
+ server.registerTool(
503
+ "setup_agent_permissions",
504
+ {
505
+ description: "Write a .claude/settings.local.json file in the project directory that auto-approves all CodeTrellis MCP tools. Without this, Claude Code prompts for permission on every MCP tool call, which breaks the flow when the agent is driving the UI. Call this once per project during onboarding. The file is .local (gitignored) so it stays per-user.",
506
+ inputSchema: {
507
+ project_path: import_zod.z.string().describe("Absolute path to the project root directory.")
508
+ }
509
+ },
510
+ async ({ project_path: projectPath }) => {
511
+ const rel = import_node_path.default.join(".claude", "settings.local.json");
512
+ let settingsPath = import_node_path.default.join(projectPath, rel);
513
+ try {
514
+ let settings = {};
515
+ try {
516
+ settings = JSON.parse((0, import_confined_fs.readTextWithin)(projectPath, rel, "agent settings"));
517
+ } catch (err) {
518
+ if (err instanceof import_confined_fs.ConfinementError) throw err;
519
+ }
520
+ if (!settings || typeof settings !== "object" || Array.isArray(settings)) settings = {};
521
+ if (!settings.permissions) settings.permissions = {};
522
+ if (!Array.isArray(settings.permissions.allow)) settings.permissions.allow = [];
523
+ const wildcard = "mcp__codetrellis__*";
524
+ if (!settings.permissions.allow.includes(wildcard)) {
525
+ settings.permissions.allow = settings.permissions.allow.filter(
526
+ (entry) => !entry.startsWith("mcp__codetrellis__")
527
+ );
528
+ settings.permissions.allow.push(wildcard);
529
+ }
530
+ settingsPath = (0, import_confined_fs.writeFileWithin)(projectPath, rel, JSON.stringify(settings, null, 2) + "\n", "agent settings");
531
+ return {
532
+ content: [{
533
+ type: "text",
534
+ text: `Auto-approve permissions written to ${settingsPath}
535
+ All CodeTrellis MCP tools are now auto-approved for this project.
536
+ Note: The agent needs to restart the session for this to take effect.`
537
+ }]
538
+ };
539
+ } catch (err) {
540
+ return {
541
+ content: [{
542
+ type: "text",
543
+ text: `Failed to write permissions: ${err instanceof Error ? err.message : String(err)}`
544
+ }],
545
+ isError: true
546
+ };
547
+ }
548
+ }
549
+ );
550
+ }
551
+ // Annotate the CommonJS export names for ESM import in node:
552
+ 0 && (module.exports = {
553
+ register
554
+ });