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 budget_tools_exports = {};
19
+ __export(budget_tools_exports, {
20
+ register: () => register
21
+ });
22
+ module.exports = __toCommonJS(budget_tools_exports);
23
+ var import_zod = require("zod");
24
+ var import_helpers = require("../helpers");
25
+ var import_budget_service = require("../../services/budget-service");
26
+ var import_pricing = require("../../services/pricing");
27
+ var import_push_notification_service = require("../../services/push-notification-service");
28
+ function round(n, places = 1) {
29
+ if (n === null) return null;
30
+ const f = 10 ** places;
31
+ return Math.round(n * f) / f;
32
+ }
33
+ function summarise(planUid) {
34
+ const report = (0, import_budget_service.getBudgetReport)(planUid);
35
+ return {
36
+ plan_uid: planUid,
37
+ budget: report.budget ? {
38
+ minutes: report.budget.minutes,
39
+ cost_usd: report.budget.costUsd,
40
+ exempt: report.budget.exempt
41
+ } : null,
42
+ spent: {
43
+ minutes: round(report.spentMinutes),
44
+ cost_usd: round(report.spentCostUsd, 4),
45
+ cost_display: (0, import_pricing.formatCost)(report.spentCostUsd)
46
+ },
47
+ estimate: {
48
+ minutes: report.estimateMinutes,
49
+ cost_usd: report.estimateCostUsd
50
+ },
51
+ forecast: {
52
+ minutes: round(report.forecastMinutes),
53
+ cost_usd: round(report.forecastCostUsd, 4),
54
+ // Stated so a caller knows what the projection is based on rather
55
+ // than treating it as a measurement.
56
+ based_on_completion: report.completionRatio
57
+ },
58
+ by_agent: report.byAgent.map((a) => ({
59
+ agent_type: a.agentType,
60
+ minutes: round(a.minutes),
61
+ cost_usd: round(a.costUsd, 4)
62
+ })),
63
+ overruns: report.overruns.map((o) => ({
64
+ item_uid: o.itemUid,
65
+ estimate_minutes: o.estimateMinutes,
66
+ spent_minutes: round(o.spentMinutes)
67
+ })),
68
+ // Cost figures are only as current as the price table that produced
69
+ // them; saying which one avoids a stale number reading as fresh.
70
+ // This is the table the TOTAL was priced under — `mixed` when it
71
+ // spans a price change — not whichever table happens to be loaded
72
+ // now, which is what it used to report and is the exact claim the
73
+ // field exists to prevent.
74
+ pricing_version: report.pricingVersion,
75
+ pricing_versions: report.pricingVersions,
76
+ // An agent's change to the ceiling stays flagged until a person has seen
77
+ // it (Phase 32 §0.4g): what it was, what it became, and who changed it.
78
+ flagged_changes: report.flaggedChanges.map((c) => ({
79
+ by: c.actor,
80
+ by_type: c.actorType,
81
+ at: new Date(c.at).toISOString(),
82
+ before: c.before ? { minutes: c.before.minutes, cost_usd: c.before.costUsd, exempt: c.before.exempt } : null,
83
+ after: { minutes: c.after.minutes, cost_usd: c.after.costUsd, exempt: c.after.exempt }
84
+ })),
85
+ note: [
86
+ report.spentCostUsd === null && (0, import_budget_service.getUnattributedTokenReports)() === 0 ? "No cost recorded: no agent on this plan reported a model we have prices for. Time is still measured." : null,
87
+ // Distinguishes 'nothing was spent' from 'spending was reported and we
88
+ // could not attribute it'. Those render identically as a zero, and only
89
+ // one of them means the plan was cheap.
90
+ (0, import_budget_service.getUnattributedTokenReports)() > 0 ? "Cost is incomplete: " + (0, import_budget_service.getUnattributedTokenReports)() + " token report(s) could not be matched to a turn, because the id they carry (the agent\u2019s own session) and the id turns are keyed by (the MCP transport session) are different identifiers. Time is still measured; treat cost as a floor, not a total." : null,
91
+ // `estimate_minutes` / `estimate_cost_usd` exist on plan_items and no
92
+ // authoring path writes them, so estimate and overruns are structurally
93
+ // empty on every install. Saying so is the difference between 'this plan
94
+ // is within its estimate' and 'nobody set one' — which read identically
95
+ // before, and only one of them is true.
96
+ report.estimateMinutes === null && report.estimateCostUsd === null ? "No estimate recorded: nothing sets per-item estimates yet, so estimate is empty and overruns cannot be computed. This is an absent input, not a plan that is on budget." : null
97
+ ].filter(Boolean).join(" ") || void 0
98
+ };
99
+ }
100
+ function missingPlan(deps, planUid) {
101
+ return deps.planService.getPlan(planUid) ? null : { content: [{ type: "text", text: `Plan ${planUid} not found.` }], isError: true };
102
+ }
103
+ function register(server, deps) {
104
+ server.registerTool(
105
+ "get_budget",
106
+ {
107
+ description: "Time and cost for a plan: what has actually been spent, a forecast to completion, and a per-agent split. Time is measured for every agent; cost only where the agent reports a model we have prices for \u2014 an unknown cost is reported as null, never as zero. Estimates and overruns are reported only when a plan carries estimates, and nothing records them yet, so today they are always absent \u2014 see the note on the response.",
108
+ inputSchema: {
109
+ plan_uid: import_zod.z.string().describe("UID of the plan.")
110
+ }
111
+ },
112
+ async ({ plan_uid }) => missingPlan(deps, plan_uid) ?? {
113
+ content: [{ type: "text", text: JSON.stringify(summarise(plan_uid), null, 2) }]
114
+ }
115
+ );
116
+ server.registerTool(
117
+ "set_budget",
118
+ {
119
+ description: "Set or clear a plan budget. Either dimension may be set independently; pass null to clear one. Crossing 80% raises a need-decision channel event (once), and past 100% check_budget returns allowed=false. The ceiling is advisory \u2014 it cannot stop an agent, it tells one to stop. A change you make is recorded in your name with the values before it, and flagged to the person until they acknowledge it; say why in your reply to them.",
120
+ inputSchema: {
121
+ plan_uid: import_zod.z.string(),
122
+ minutes: import_zod.z.number().int().positive().nullable().optional().describe("Wall-clock minutes across every agent. Null clears."),
123
+ cost_usd: import_zod.z.number().positive().nullable().optional().describe("USD ceiling. Null clears."),
124
+ exempt: import_zod.z.boolean().optional().describe("Exempt this plan from its ceiling without clearing it \u2014 mirrors freeze exemptions.")
125
+ }
126
+ },
127
+ async ({ plan_uid, minutes, cost_usd, exempt }, extra) => {
128
+ const refused = missingPlan(deps, plan_uid);
129
+ if (refused) return refused;
130
+ const id = (0, import_helpers.authorFromExtra)(deps, extra);
131
+ const flaggedBefore = (0, import_budget_service.getBudgetReport)(plan_uid).flaggedChanges.length;
132
+ const budget = (0, import_budget_service.setBudget)({
133
+ planUid: plan_uid,
134
+ minutes,
135
+ costUsd: cost_usd,
136
+ exempt,
137
+ by: { actor: id.author, actorType: id.authorType, channel: "mcp" }
138
+ });
139
+ const n = deps.broadcast("plan-budget-changed", { planUid: plan_uid, budget, flagged: true });
140
+ if ((0, import_budget_service.getBudgetReport)(plan_uid).flaggedChanges.length > flaggedBefore) {
141
+ void (0, import_push_notification_service.pushForBudgetChange)(plan_uid, deps.planService.getPlan(plan_uid)?.title ?? plan_uid, id.author).catch(() => {
142
+ });
143
+ }
144
+ return {
145
+ content: [{
146
+ type: "text",
147
+ text: JSON.stringify({ ok: true, broadcastTo: n, ...summarise(plan_uid) }, null, 2)
148
+ }]
149
+ };
150
+ }
151
+ );
152
+ server.registerTool(
153
+ "check_budget",
154
+ {
155
+ description: "Whether more work should start on this plan. Call this before claiming an item, the same way check_freeze is called. Returns allowed=false once the plan is past its ceiling, with a reason to relay to the human. Advisory: nothing here can stop you, so respecting it is the point.",
156
+ inputSchema: {
157
+ plan_uid: import_zod.z.string()
158
+ }
159
+ },
160
+ async ({ plan_uid }) => {
161
+ const refused = missingPlan(deps, plan_uid);
162
+ if (refused) return refused;
163
+ const result = (0, import_budget_service.checkBudget)(plan_uid);
164
+ return {
165
+ content: [{
166
+ type: "text",
167
+ text: JSON.stringify(
168
+ {
169
+ allowed: result.allowed,
170
+ state: result.state,
171
+ reason: result.reason,
172
+ ...summarise(plan_uid)
173
+ },
174
+ null,
175
+ 2
176
+ )
177
+ }]
178
+ };
179
+ }
180
+ );
181
+ }
182
+ // Annotate the CommonJS export names for ESM import in node:
183
+ 0 && (module.exports = {
184
+ register
185
+ });
@@ -0,0 +1,205 @@
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 channel_tools_exports = {};
19
+ __export(channel_tools_exports, {
20
+ register: () => register
21
+ });
22
+ module.exports = __toCommonJS(channel_tools_exports);
23
+ var import_helpers = require("../helpers");
24
+ var import_zod = require("zod");
25
+ var import_channel_event_service = require("../../services/channel-event-service");
26
+ var import_channel_event_file_service = require("../../services/channel-event-file-service");
27
+ var import_channel_dispatcher_service = require("../../services/channel-dispatcher-service");
28
+ var import_plan_file_service = require("../../services/plan-file-service");
29
+ var import_plan_service = require("../../services/plan-service");
30
+ var import_types = require("../../../shared/types");
31
+ const eventTypeEnum = import_zod.z.enum([
32
+ "stuck",
33
+ "need-decision",
34
+ "need-context",
35
+ "handing-off",
36
+ "steer",
37
+ "weigh-in"
38
+ ]);
39
+ const statusEnum = import_zod.z.enum(["open", "resolved", "dismissed"]);
40
+ function register(server, deps) {
41
+ server.registerTool(
42
+ "post_channel_event",
43
+ {
44
+ description: "Post a channel event to a plan. Six event types in the peer-to-peer team-coordination vocabulary: stuck (failing repeatedly), need-decision (genuine choice can't make alone), need-context (missing knowledge), handing-off (another actor should take over; here's what was tried), steer (direction in response), weigh-in (here's my thinking \u2014 what do others see?). Both humans and agents can post any of these. Events are durable; when the plan is shared (linked to disk), the event is exported to .codetrellis/plans/<slug>/channels/<uid>.yaml and travels via git.",
45
+ inputSchema: {
46
+ plan_uid: import_zod.z.string().describe("UID of the plan to post the event on."),
47
+ item_uid: import_zod.z.string().nullable().optional().describe(
48
+ "Optional UID of the plan item this event anchors to. Useful when a stuck/need-decision is specific to one item."
49
+ ),
50
+ event_type: eventTypeEnum.describe("One of the six channel event types."),
51
+ message: import_zod.z.string().describe("Plain-English description of the event. Required. Used as the headline by readers."),
52
+ attempted: import_zod.z.array(import_zod.z.string()).optional().describe(
53
+ "For stuck / handing-off: short list of what was tried. One entry per attempt."
54
+ ),
55
+ options: import_zod.z.array(import_zod.z.string()).optional().describe(
56
+ "For need-decision: the alternatives the asker has identified."
57
+ ),
58
+ responds_to: import_zod.z.string().nullable().optional().describe(
59
+ "Optional. UID of the channel event this responds to (for threading). Posting a `steer` against a `stuck` does NOT auto-resolve the stuck \u2014 resolution is a separate `resolve_channel_event` call."
60
+ )
61
+ }
62
+ },
63
+ async ({ plan_uid, item_uid, event_type, message, attempted, options, responds_to }) => {
64
+ const { author, authorType, agentModel } = resolveAttribution(deps);
65
+ const payload = { message };
66
+ if (attempted && attempted.length > 0) payload.attempted = attempted;
67
+ if (options && options.length > 0) payload.options = options;
68
+ const created = (0, import_channel_event_service.postChannelEvent)({
69
+ planUid: plan_uid,
70
+ itemUid: item_uid ?? null,
71
+ eventType: event_type,
72
+ payload,
73
+ author,
74
+ authorType,
75
+ agentModel,
76
+ respondsTo: responds_to ?? null
77
+ });
78
+ maybeExportEvent(created);
79
+ deps.broadcast("channel-event-posted", {
80
+ uid: created.uid,
81
+ planUid: created.planUid,
82
+ itemUid: created.itemUid,
83
+ eventType: created.eventType,
84
+ respondsTo: created.respondsTo
85
+ });
86
+ (0, import_channel_dispatcher_service.dispatchChannelEvent)(created).catch((err) => console.warn("[Channels] dispatch failed:", err));
87
+ return { content: [{ type: "text", text: JSON.stringify(created, null, 2) }] };
88
+ }
89
+ );
90
+ server.registerTool(
91
+ "list_channel_events",
92
+ {
93
+ description: 'List channel events for a plan, newest-first. Filter by event type, status, or scoped item. Use this to see "what needs my attention" (status=open) or to review the team-coordination history.',
94
+ inputSchema: {
95
+ plan_uid: import_zod.z.string().describe("UID of the plan to list events for."),
96
+ event_types: import_zod.z.array(eventTypeEnum).optional().describe(
97
+ "Filter to these event types. Omit for all."
98
+ ),
99
+ status: import_zod.z.array(statusEnum).optional().describe(
100
+ 'Filter to these statuses. Omit for all. "open" surfaces "what needs response".'
101
+ ),
102
+ item_uid: import_zod.z.string().optional().describe(
103
+ "Scope to events anchored to this plan item."
104
+ ),
105
+ since_ms: import_zod.z.number().optional().describe(
106
+ "UNIX ms cutoff \u2014 only events with created_at >= since_ms. Useful for incremental polling."
107
+ ),
108
+ limit: import_zod.z.number().optional().describe("Cap. Default 200."),
109
+ offset: import_zod.z.number().optional().describe("Pagination offset. Default 0.")
110
+ }
111
+ },
112
+ async ({ plan_uid, event_types, status, item_uid, since_ms, limit, offset }) => {
113
+ const opts = {};
114
+ if (event_types && event_types.length > 0) opts.eventTypes = event_types;
115
+ if (status && status.length > 0) opts.status = status;
116
+ if (item_uid) opts.itemUid = item_uid;
117
+ if (since_ms !== void 0) opts.sinceMs = since_ms;
118
+ if (limit !== void 0) opts.limit = limit;
119
+ if (offset !== void 0) opts.offset = offset;
120
+ const events = (0, import_channel_event_service.listChannelEvents)(plan_uid, opts);
121
+ return { content: [{ type: "text", text: JSON.stringify(events, null, 2) }] };
122
+ }
123
+ );
124
+ server.registerTool(
125
+ "get_channel_thread",
126
+ {
127
+ description: "Return a channel event thread \u2014 the root event plus all descendant responses, ordered chronologically. Use this to read the full back-and-forth around a stuck / need-decision conversation.",
128
+ inputSchema: {
129
+ root_event_uid: import_zod.z.string().describe("UID of the thread root (typically a stuck or need-decision event).")
130
+ }
131
+ },
132
+ async ({ root_event_uid }) => {
133
+ const events = (0, import_channel_event_service.listThread)(root_event_uid);
134
+ return { content: [{ type: "text", text: JSON.stringify(events, null, 2) }] };
135
+ }
136
+ );
137
+ server.registerTool(
138
+ "resolve_channel_event",
139
+ {
140
+ description: 'Mark a channel event as resolved. Typically called after a stuck has been steered through, or a need-decision has been answered. Sets status to "resolved" and exports the change to disk.',
141
+ inputSchema: {
142
+ event_uid: import_zod.z.string().describe("UID of the channel event to resolve.")
143
+ }
144
+ },
145
+ async ({ event_uid }) => {
146
+ const updated = (0, import_channel_event_service.setChannelEventStatus)(event_uid, "resolved");
147
+ maybeExportEvent(updated);
148
+ deps.broadcast("channel-event-status-changed", {
149
+ uid: updated.uid,
150
+ planUid: updated.planUid,
151
+ status: updated.status
152
+ });
153
+ (0, import_channel_dispatcher_service.dispatchChannelEvent)(updated).catch((err) => console.warn("[Channels] dispatch failed:", err));
154
+ return { content: [{ type: "text", text: JSON.stringify(updated, null, 2) }] };
155
+ }
156
+ );
157
+ server.registerTool(
158
+ "dismiss_channel_event",
159
+ {
160
+ description: 'Mark a channel event as dismissed. Used when an event no longer needs a response (e.g., the underlying issue went away, or the asker abandoned the line of inquiry). The event stays in the history; it just stops appearing in "what needs my attention" lists.',
161
+ inputSchema: {
162
+ event_uid: import_zod.z.string().describe("UID of the channel event to dismiss.")
163
+ }
164
+ },
165
+ async ({ event_uid }) => {
166
+ const updated = (0, import_channel_event_service.setChannelEventStatus)(event_uid, "dismissed");
167
+ maybeExportEvent(updated);
168
+ deps.broadcast("channel-event-status-changed", {
169
+ uid: updated.uid,
170
+ planUid: updated.planUid,
171
+ status: updated.status
172
+ });
173
+ (0, import_channel_dispatcher_service.dispatchChannelEvent)(updated).catch((err) => console.warn("[Channels] dispatch failed:", err));
174
+ return { content: [{ type: "text", text: JSON.stringify(updated, null, 2) }] };
175
+ }
176
+ );
177
+ }
178
+ function resolveAttribution(deps) {
179
+ const settings = deps.getSettings();
180
+ const humanAuthor = settings.identity.email || "human";
181
+ const agentType = (0, import_helpers.authorFromExtra)(deps, void 0).author;
182
+ const match = deps.sessionService.getActiveSessions().find((s) => s.sessionId === deps.sessionId);
183
+ return {
184
+ author: humanAuthor,
185
+ authorType: agentType,
186
+ agentModel: match?.model ?? null
187
+ };
188
+ }
189
+ function maybeExportEvent(event) {
190
+ const plan = (0, import_plan_service.getPlan)(event.planUid);
191
+ if (!plan) return;
192
+ const linkedDir = (0, import_plan_file_service.getLinkedPlanDir)(event.planUid, plan.projectPath);
193
+ if (!linkedDir) return;
194
+ try {
195
+ (0, import_channel_event_file_service.exportChannelEvent)(event, plan.projectPath);
196
+ } catch (err) {
197
+ console.warn(`[ChannelTools] Failed to export event ${event.uid} to disk:`, err);
198
+ }
199
+ }
200
+ void import_types.CHANNEL_EVENT_TYPES;
201
+ void import_types.CHANNEL_EVENT_STATUSES;
202
+ // Annotate the CommonJS export names for ESM import in node:
203
+ 0 && (module.exports = {
204
+ register
205
+ });
@@ -0,0 +1,181 @@
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 contribution_tools_exports = {};
19
+ __export(contribution_tools_exports, {
20
+ registerContributionTools: () => registerContributionTools
21
+ });
22
+ module.exports = __toCommonJS(contribution_tools_exports);
23
+ var import_zod = require("zod");
24
+ var import_pantry_resolution_service = require("../../services/pantry-resolution-service");
25
+ var import_contribution_service = require("../../services/contribution-service");
26
+ function registerContributionTools(server) {
27
+ server.tool(
28
+ "resolve_pantry_references",
29
+ 'Check which attachment references can be resolved locally. Returns "resolved" or "external" for each, enabling placeholder display for team-only content that external contributors cannot access.',
30
+ {
31
+ project_path: import_zod.z.string().describe("Absolute path to project root"),
32
+ references: import_zod.z.array(import_zod.z.string()).optional().describe("Specific references to resolve. If omitted, scans the plan for all references."),
33
+ plan_slug: import_zod.z.string().optional().describe("Plan slug to scan for references (used when references is omitted)")
34
+ },
35
+ async ({ project_path, references, plan_slug }) => {
36
+ try {
37
+ if (references?.length) {
38
+ const results = (0, import_pantry_resolution_service.resolveReferences)(references, project_path);
39
+ const resolved = results.filter((r) => r.status === "resolved").length;
40
+ const external = results.filter((r) => r.status === "external").length;
41
+ return {
42
+ content: [{ type: "text", text: JSON.stringify({ total: results.length, resolved, external, results }) }]
43
+ };
44
+ }
45
+ if (plan_slug) {
46
+ const scan = (0, import_pantry_resolution_service.scanPlanReferences)(project_path, plan_slug);
47
+ return {
48
+ content: [{ type: "text", text: JSON.stringify(scan) }]
49
+ };
50
+ }
51
+ return {
52
+ content: [{ type: "text", text: JSON.stringify({ error: "Provide either references[] or plan_slug to scan" }) }],
53
+ isError: true
54
+ };
55
+ } catch (err) {
56
+ return {
57
+ content: [{ type: "text", text: `Error resolving references: ${err}` }],
58
+ isError: true
59
+ };
60
+ }
61
+ }
62
+ );
63
+ server.tool(
64
+ "promote_to_contribution",
65
+ "Promote a local item to the contributions staging area (`.codetrellis/contributions/<branch>/`). The staged content travels as part of the contributor's PR for team review.",
66
+ {
67
+ project_path: import_zod.z.string().describe("Absolute path to project root"),
68
+ item_uid: import_zod.z.string().describe("UID of the item to promote"),
69
+ title: import_zod.z.string().describe("Title of the item"),
70
+ kind: import_zod.z.string().describe("Item kind (action, object, etc.)"),
71
+ status: import_zod.z.string().optional().describe("Item status"),
72
+ body: import_zod.z.string().optional().describe("Item body/description content"),
73
+ description: import_zod.z.string().optional().describe("Brief description of the contribution for reviewers"),
74
+ attachments: import_zod.z.array(import_zod.z.object({
75
+ uid: import_zod.z.string(),
76
+ kind: import_zod.z.string(),
77
+ value: import_zod.z.string(),
78
+ label: import_zod.z.string().optional()
79
+ })).optional().describe("Attachments to include with the promoted item")
80
+ },
81
+ async ({ project_path, item_uid, title, kind, status, body, description, attachments }) => {
82
+ try {
83
+ const result = (0, import_contribution_service.promoteItemToContribution)(project_path, {
84
+ uid: item_uid,
85
+ title,
86
+ kind,
87
+ status,
88
+ body,
89
+ description,
90
+ attachments
91
+ });
92
+ return {
93
+ content: [{ type: "text", text: JSON.stringify({
94
+ message: `Promoted "${title}" to contributions staging area`,
95
+ contribution: result
96
+ }) }]
97
+ };
98
+ } catch (err) {
99
+ return {
100
+ content: [{ type: "text", text: `Error promoting to contribution: ${err}` }],
101
+ isError: true
102
+ };
103
+ }
104
+ }
105
+ );
106
+ server.tool(
107
+ "list_contributions",
108
+ "List items currently staged in the contributions area for the current branch. Shows what will be included in the next PR.",
109
+ {
110
+ project_path: import_zod.z.string().describe("Absolute path to project root")
111
+ },
112
+ async ({ project_path }) => {
113
+ try {
114
+ const summary = (0, import_contribution_service.listContributions)(project_path);
115
+ return {
116
+ content: [{ type: "text", text: JSON.stringify(summary) }]
117
+ };
118
+ } catch (err) {
119
+ return {
120
+ content: [{ type: "text", text: `Error listing contributions: ${err}` }],
121
+ isError: true
122
+ };
123
+ }
124
+ }
125
+ );
126
+ server.tool(
127
+ "accept_contributions",
128
+ "Accept contributed items from a branch's staging area into a plan's manifest. Moves items from contributions/ into the plan, cleans up the staging area. Called after reviewing a contributor's PR.",
129
+ {
130
+ project_path: import_zod.z.string().describe("Absolute path to project root"),
131
+ branch: import_zod.z.string().describe("Branch name whose contributions to accept"),
132
+ plan_slug: import_zod.z.string().describe("Plan slug to accept contributions into")
133
+ },
134
+ async ({ project_path, branch, plan_slug }) => {
135
+ try {
136
+ const result = (0, import_contribution_service.acceptContributions)(project_path, branch, plan_slug);
137
+ const msg = result.errors.length > 0 ? `Accepted ${result.accepted} contributions with ${result.errors.length} error(s)` : `Accepted ${result.accepted} contributions into plan "${plan_slug}"`;
138
+ return {
139
+ content: [{ type: "text", text: JSON.stringify({ message: msg, ...result }) }]
140
+ };
141
+ } catch (err) {
142
+ return {
143
+ content: [{ type: "text", text: `Error accepting contributions: ${err}` }],
144
+ isError: true
145
+ };
146
+ }
147
+ }
148
+ );
149
+ server.tool(
150
+ "prepare_contributor_branch",
151
+ "Create a filtered git branch containing only the plan content the team wants to share with an external contributor. Omits local items, team-only attachments, and private comments. The contributor can fork from this branch.",
152
+ {
153
+ project_path: import_zod.z.string().describe("Absolute path to project root"),
154
+ plan_slug: import_zod.z.string().describe("Plan slug to export"),
155
+ branch_name: import_zod.z.string().describe("Name for the new contributor branch"),
156
+ include_items: import_zod.z.array(import_zod.z.string()).optional().describe("Specific item UIDs to include (omit for all shared items)")
157
+ },
158
+ async ({ project_path, plan_slug, branch_name, include_items }) => {
159
+ try {
160
+ const result = (0, import_contribution_service.prepareContributorBranch)(project_path, plan_slug, branch_name, {
161
+ includeItems: include_items
162
+ });
163
+ return {
164
+ content: [{ type: "text", text: JSON.stringify({
165
+ message: `Created contributor branch "${branch_name}" with ${result.itemCount} shared items`,
166
+ ...result
167
+ }) }]
168
+ };
169
+ } catch (err) {
170
+ return {
171
+ content: [{ type: "text", text: `Error preparing contributor branch: ${err}` }],
172
+ isError: true
173
+ };
174
+ }
175
+ }
176
+ );
177
+ }
178
+ // Annotate the CommonJS export names for ESM import in node:
179
+ 0 && (module.exports = {
180
+ registerContributionTools
181
+ });