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,259 @@
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 plan_verbs_exports = {};
29
+ __export(plan_verbs_exports, {
30
+ PLAN_VERBS: () => PLAN_VERBS,
31
+ ownChanges: () => ownChanges,
32
+ runPlanVerb: () => runPlanVerb
33
+ });
34
+ module.exports = __toCommonJS(plan_verbs_exports);
35
+ var import_node_child_process = require("node:child_process");
36
+ var import_node_fs = __toESM(require("node:fs"));
37
+ var import_node_path = __toESM(require("node:path"));
38
+ var import_args = require("./args");
39
+ var import_conformity = require("./conformity");
40
+ var import_verbs = require("./verbs");
41
+ const PLAN_VERBS = /* @__PURE__ */ new Set(["plan", "commit", "status"]);
42
+ const asObj = (v) => v && typeof v === "object" && !Array.isArray(v) ? v : {};
43
+ const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
44
+ function answer(a, ctx, words) {
45
+ if (a.isError) return { out: a.text, code: 1 };
46
+ if (ctx.json) return { out: a.json !== null ? JSON.stringify(a.json) : JSON.stringify({ text: a.text }), code: 0 };
47
+ return { out: a.json !== null ? words(asObj(a.json)) : a.text, code: 0 };
48
+ }
49
+ async function plans(ctx) {
50
+ const a = await ctx.agent.call("list_plans", { project_path: ctx.root, limit: 100 });
51
+ return asObj(a.json).plans ?? [];
52
+ }
53
+ async function planOf(ctx) {
54
+ const named = (0, import_args.flag)(ctx.p, "plan");
55
+ if (named) return named;
56
+ const open = (await plans(ctx)).filter((pl) => pl.status !== "archived" && pl.status !== "done");
57
+ if (open.length === 1) return open[0].uid;
58
+ if (open.length === 0) throw new import_verbs.UsageError(`No plan in ${ctx.root}. Name one with --plan <uid>.`);
59
+ throw new import_verbs.UsageError(`Several plans in this project; name one with --plan:
60
+ ${open.map((pl) => ` ${pl.uid} ${pl.title}`).join("\n")}`);
61
+ }
62
+ async function taskOf(ctx, ref, what = "task") {
63
+ if (!ref) throw new import_verbs.UsageError(`Which ${what}? Give its uid, or the first characters of it.`);
64
+ const want = ref.replace(/^task\s+/i, "").trim().toLowerCase();
65
+ if (UUID.test(want)) return want;
66
+ if (!/^[0-9a-f-]{6,}$/.test(want)) throw new import_verbs.UsageError(`"${ref}" is not a uid or the start of one.`);
67
+ const found = [];
68
+ for (const pl of await plans(ctx)) {
69
+ const a = await ctx.agent.call("list_items", { plan_uid: pl.uid, limit: 500 });
70
+ for (const it of asObj(a.json).items ?? []) {
71
+ if (it.uid.toLowerCase().startsWith(want)) found.push(it);
72
+ }
73
+ }
74
+ if (found.length === 1) return found[0].uid;
75
+ if (found.length === 0) throw new import_verbs.UsageError(`No ${what} starting "${want}" in this project's plans.`);
76
+ throw new import_verbs.UsageError(`"${want}" names ${found.length} items; give more of the uid:
77
+ ${found.map((t) => ` ${t.uid} ${t.title}`).join("\n")}`);
78
+ }
79
+ async function planShow(ctx) {
80
+ const a = await ctx.agent.call("get_plan", { plan_uid: await planOf(ctx) });
81
+ return answer(a, ctx, (j) => {
82
+ const plan = asObj(j.plan ?? j);
83
+ const state = asObj(j.state);
84
+ const lines = [`${String(plan.title ?? "Plan")} (${String(plan.uid ?? "")})${state.progress ? ` \u2014 ${state.progress}` : ""}`];
85
+ for (const it of state.items ?? []) {
86
+ if (it.kind !== "action") continue;
87
+ const by = it.recorded_in ? `, recorded by ${it.recorded_by} in ${it.recorded_in}` : "";
88
+ lines.push(` ${it.item_uid.slice(0, 8)} ${it.title} \u2014 ${it.says}${by}${it.set_at_once ? ` \u26A0 ${it.set_at_once}` : ""}`);
89
+ }
90
+ return lines.join("\n");
91
+ });
92
+ }
93
+ async function planAdd(ctx, title) {
94
+ if (!title) throw new import_verbs.UsageError("Give the new task a title: codetrellis plan add <title\u2026>");
95
+ const under = (0, import_args.flag)(ctx.p, "under");
96
+ const body = (0, import_args.flag)(ctx.p, "body");
97
+ const a = await ctx.agent.call("add_item", {
98
+ plan_uid: await planOf(ctx),
99
+ kind: ctx.p.flags.page ? "object" : "action",
100
+ title,
101
+ ...under ? { parent_uid: await taskOf(ctx, under, "parent") } : {},
102
+ ...body ? { body } : {}
103
+ });
104
+ return answer(a, ctx, (j) => {
105
+ const it = asObj(j.item ?? j);
106
+ return `Added ${ctx.p.flags.page ? "page" : "task"} "${String(it.title ?? title)}" (${String(it.uid ?? "?")}).`;
107
+ });
108
+ }
109
+ async function planEdit(ctx, ref) {
110
+ const uid = await taskOf(ctx, ref);
111
+ const title = (0, import_args.flag)(ctx.p, "title");
112
+ const body = (0, import_args.flag)(ctx.p, "body");
113
+ if (title === void 0 && body === void 0) throw new import_verbs.UsageError("Say what to change: --title <text>, --body <text>, or both.");
114
+ const a = await ctx.agent.call("update_item", { uid, ...title !== void 0 ? { title } : {}, ...body !== void 0 ? { body } : {} });
115
+ return answer(a, ctx, (j) => `Changed "${String(asObj(j.item ?? j).title ?? title ?? uid)}".`);
116
+ }
117
+ async function planMove(ctx, ref) {
118
+ const uid = await taskOf(ctx, ref);
119
+ const under = (0, import_args.flag)(ctx.p, "under");
120
+ if (!under && !ctx.p.flags.top) throw new import_verbs.UsageError("Say where: --under <task>, or --top.");
121
+ const pos = (0, import_args.flag)(ctx.p, "position");
122
+ if (pos !== void 0 && !/^\d+$/.test(pos)) throw new import_verbs.UsageError("--position takes a whole number.");
123
+ const a = await ctx.agent.call("move_item", {
124
+ uid,
125
+ new_parent_uid: under ? await taskOf(ctx, under, "parent") : "",
126
+ ...pos !== void 0 ? { new_sort_order: Number(pos) } : {}
127
+ });
128
+ return answer(a, ctx, () => `Moved ${uid.slice(0, 8)} ${under ? `under ${under}` : "to the top level"}.`);
129
+ }
130
+ function ownChanges(root) {
131
+ const out = (0, import_node_child_process.execFileSync)("git", ["-C", root, "status", "--porcelain=v1", "-z", "--untracked-files=all", "--", ".codetrellis"], { encoding: "utf8" });
132
+ const paths = [];
133
+ const parts = out.split("\0").filter(Boolean);
134
+ for (let i = 0; i < parts.length; i++) {
135
+ const entry = parts[i];
136
+ const status2 = entry.slice(0, 2);
137
+ const file = entry.slice(3);
138
+ if (status2.startsWith("R") || status2.startsWith("C")) {
139
+ paths.push(file);
140
+ paths.push(parts[++i]);
141
+ continue;
142
+ }
143
+ paths.push(file);
144
+ }
145
+ return [...new Set(paths)].filter((p) => p === ".codetrellis" || p.startsWith(".codetrellis/"));
146
+ }
147
+ async function tasksTouched(ctx, files) {
148
+ const titles = /* @__PURE__ */ new Set();
149
+ const uids = /* @__PURE__ */ new Set();
150
+ for (const f of files) {
151
+ const rec = /^\.codetrellis\/(?:records|reads)\/[^/]+\/([0-9a-f-]{36})\//i.exec(f);
152
+ if (rec) {
153
+ uids.add(rec[1]);
154
+ continue;
155
+ }
156
+ if (/\/items\/.+\.ya?ml$/.test(f)) {
157
+ try {
158
+ const text = import_node_fs.default.readFileSync(import_node_path.default.join(ctx.root, f), "utf8");
159
+ const m = /^title:\s*(.+)$/m.exec(text);
160
+ if (m) titles.add(m[1].replace(/^['"]|['"]$/g, "").trim());
161
+ } catch {
162
+ }
163
+ }
164
+ }
165
+ for (const uid of uids) {
166
+ const a = await ctx.agent.call("get_item", { uid });
167
+ const t = asObj(asObj(a.json).item ?? a.json).title;
168
+ if (typeof t === "string") titles.add(t);
169
+ }
170
+ return [...titles].sort();
171
+ }
172
+ async function commit(ctx) {
173
+ const files = ownChanges(ctx.root);
174
+ if (files.length === 0) return { out: ctx.json ? JSON.stringify({ committed: false, files: [] }) : "Nothing of CodeTrellis's to commit.", code: 0 };
175
+ const tasks = await tasksTouched(ctx, files);
176
+ const listed = tasks.length <= 3 ? tasks.join(", ") : `${tasks.slice(0, 3).join(", ")} and ${tasks.length - 3} more`;
177
+ const subject = (0, import_args.flag)(ctx.p, "m") ?? (0, import_args.flag)(ctx.p, "message") ?? (tasks.length ? `Update the plan: ${listed}` : "Update the plan");
178
+ const body = tasks.length ? [`Tasks: ${tasks.join("; ")}.`, `CodeTrellis's own files only (${files.length}).`] : [`CodeTrellis's own files only (${files.length}).`];
179
+ const a = await ctx.agent.call("commit_manifest_changes", {
180
+ project_root: ctx.root,
181
+ subject: subject.slice(0, 72),
182
+ paths: files,
183
+ body,
184
+ agent: { agent_type: ctx.agent.name }
185
+ });
186
+ if (a.isError) return { out: a.text, code: 1 };
187
+ const sha = String(asObj(a.json).sha ?? "").slice(0, 7) || /([0-9a-f]{7,40})/.exec(a.text)?.[1]?.slice(0, 7) || "";
188
+ if (ctx.json) return { out: JSON.stringify({ committed: true, sha, subject, files, tasks }), code: 0 };
189
+ return { out: `Committed ${files.length} CodeTrellis file${files.length === 1 ? "" : "s"}${sha ? ` as ${sha}` : ""}: ${subject}`, code: 0 };
190
+ }
191
+ async function status(ctx) {
192
+ const named = (0, import_args.flag)(ctx.p, "plan");
193
+ const list = named ? [{ uid: named, title: "", status: "" }] : (await plans(ctx)).filter((pl) => pl.status !== "archived");
194
+ const out = [];
195
+ for (const pl of list) {
196
+ const g2 = await ctx.agent.call("get_plan", { plan_uid: pl.uid });
197
+ if (g2.isError) continue;
198
+ const j = asObj(g2.json);
199
+ const state = asObj(j.state);
200
+ const items = state.items ?? [];
201
+ const asks = await ctx.agent.call("list_channel_events", { plan_uid: pl.uid, event_types: ["need-decision", "need-context", "stuck"], status: ["open"] });
202
+ const events = Array.isArray(asks.json) ? asks.json : asObj(asks.json).events ?? [];
203
+ out.push({
204
+ uid: pl.uid,
205
+ title: String(asObj(j.plan ?? j).title ?? pl.title),
206
+ progress: state.progress ?? null,
207
+ inProgress: (state.in_progress ?? []).map((w) => ({ uid: w.item_uid, title: w.title, says: w.says })),
208
+ blocked: items.filter((i) => i.state === "blocked").map((i) => ({ uid: i.item_uid, title: i.title, says: i.says })),
209
+ waitingOnPerson: events.map((e) => ({
210
+ uid: String(e.uid),
211
+ question: String(asObj(e.payload).message ?? e.message ?? ""),
212
+ item: e.itemUid ?? e.item_uid ?? null
213
+ }))
214
+ });
215
+ }
216
+ let changed;
217
+ try {
218
+ changed = (0, import_conformity.changedFiles)(ctx.root, (0, import_args.flag)(ctx.p, "base"), process.env);
219
+ } catch (err) {
220
+ throw new import_verbs.UsageError(err.message);
221
+ }
222
+ const g = await (0, import_conformity.gate)(ctx.agent, ctx.root, changed, ctx.p.flags.strict === true, { suite: (0, import_args.flag)(ctx.p, "suite"), rule: (0, import_args.flag)(ctx.p, "rule"), path: (0, import_args.flag)(ctx.p, "path"), tag: (0, import_args.flag)(ctx.p, "tag") });
223
+ const code = "error" in g ? 1 : g.ok ? 0 : 3;
224
+ if (ctx.json) return { out: JSON.stringify({ project: ctx.root, plans: out, conformity: g }), code };
225
+ const lines = [];
226
+ if (out.length === 0) lines.push(`No plan in ${ctx.root}.`);
227
+ for (const s of out) {
228
+ lines.push(`${s.title}${s.progress ? ` \u2014 ${s.progress}` : ""}`);
229
+ for (const w of s.inProgress) lines.push(` \u25B6 ${w.title}: ${w.says}`);
230
+ for (const b of s.blocked) lines.push(` \u25A0 ${b.title}: ${b.says}`);
231
+ for (const q of s.waitingOnPerson) lines.push(` ? ${q.question}`);
232
+ }
233
+ lines.push("", "error" in g ? `Could not check conformity: ${g.error}` : (0, import_conformity.gateWords)(g));
234
+ return { out: lines.join("\n"), code };
235
+ }
236
+ async function runPlanVerb(verb, agent, p, cwd) {
237
+ const ctx = { agent, p, cwd, json: p.flags.json === true, root: (0, import_verbs.projectRoot)(cwd) };
238
+ if (verb === "commit") return commit(ctx);
239
+ if (verb === "status") return status(ctx);
240
+ const [sub, ...rest] = p.rest;
241
+ switch (sub) {
242
+ case "show":
243
+ return planShow(ctx);
244
+ case "add":
245
+ return planAdd(ctx, rest.join(" ").trim());
246
+ case "edit":
247
+ return planEdit(ctx, rest[0]);
248
+ case "move":
249
+ return planMove(ctx, rest[0]);
250
+ default:
251
+ throw new import_verbs.UsageError("codetrellis plan show | add <title\u2026> | edit <task> | move <task>");
252
+ }
253
+ }
254
+ // Annotate the CommonJS export names for ESM import in node:
255
+ 0 && (module.exports = {
256
+ PLAN_VERBS,
257
+ ownChanges,
258
+ runPlanVerb
259
+ });
@@ -0,0 +1,220 @@
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 review_adapters_exports = {};
29
+ __export(review_adapters_exports, {
30
+ ADAPTERS: () => ADAPTERS,
31
+ OIDC_ENV: () => OIDC_ENV,
32
+ OIDC_PROVIDERS: () => OIDC_PROVIDERS,
33
+ adapterFor: () => adapterFor
34
+ });
35
+ module.exports = __toCommonJS(review_adapters_exports);
36
+ var import_node_fs = __toESM(require("node:fs"));
37
+ var import_node_path = __toESM(require("node:path"));
38
+ const OIDC_PROVIDERS = ["bedrock", "vertex", "foundry"];
39
+ const OIDC_ENV = {
40
+ bedrock: ["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY", "AWS_SESSION_TOKEN", "AWS_REGION", "AWS_DEFAULT_REGION", "AWS_PROFILE", "ANTHROPIC_BEDROCK_BASE_URL"],
41
+ vertex: ["GOOGLE_APPLICATION_CREDENTIALS", "GOOGLE_CLOUD_PROJECT", "CLOUDSDK_CORE_PROJECT", "CLOUD_ML_REGION", "ANTHROPIC_VERTEX_PROJECT_ID", "ANTHROPIC_VERTEX_BASE_URL"],
42
+ foundry: ["ANTHROPIC_FOUNDRY_RESOURCE", "ANTHROPIC_FOUNDRY_BASE_URL", "AZURE_CLIENT_ID", "AZURE_TENANT_ID", "AZURE_FEDERATED_TOKEN_FILE", "AZURE_AUTHORITY_HOST", "AZURE_CONFIG_DIR"]
43
+ };
44
+ const SINK = "codetrellis_review";
45
+ const oauthToken = (a) => a.kind === "key" && (a.var === "CLAUDE_CODE_OAUTH_TOKEN" || a.value.startsWith("sk-ant-oat"));
46
+ const claudeCode = {
47
+ id: "claude-code",
48
+ label: "Claude Code",
49
+ bin: "claude",
50
+ binEnv: "CODETRELLIS_REVIEW_CLAUDE",
51
+ oidc: ["bedrock", "vertex", "foundry"],
52
+ passEnv: [],
53
+ env({ auth, endpoint }) {
54
+ const out = {
55
+ // No telemetry, error reports or update checks from a review.
56
+ CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: "1"
57
+ };
58
+ if (auth.kind === "key") out[oauthToken(auth) ? "CLAUDE_CODE_OAUTH_TOKEN" : "ANTHROPIC_API_KEY"] = auth.value;
59
+ if (auth.kind === "oidc") out[{ bedrock: "CLAUDE_CODE_USE_BEDROCK", vertex: "CLAUDE_CODE_USE_VERTEX", foundry: "CLAUDE_CODE_USE_FOUNDRY" }[auth.provider]] = "1";
60
+ if (endpoint) out.ANTHROPIC_BASE_URL = endpoint;
61
+ return out;
62
+ },
63
+ command({ instructions, message, sink, model, maxTurns, dir, auth, tools }) {
64
+ const withKey = auth.kind === "oidc" || auth.kind === "key" && !oauthToken(auth);
65
+ const mcp = import_node_path.default.join(dir, "mcp.json");
66
+ const env = sink.env && Object.keys(sink.env).length ? { env: sink.env } : {};
67
+ import_node_fs.default.writeFileSync(mcp, JSON.stringify({ mcpServers: { [SINK]: { type: "stdio", command: sink.command, args: sink.args, ...env } } }));
68
+ const system = import_node_path.default.join(dir, "system.md");
69
+ import_node_fs.default.writeFileSync(system, instructions);
70
+ return {
71
+ args: [
72
+ "-p",
73
+ ...withKey ? ["--bare"] : [],
74
+ "--output-format",
75
+ "json",
76
+ "--tools",
77
+ "",
78
+ "--strict-mcp-config",
79
+ "--mcp-config",
80
+ mcp,
81
+ "--allowedTools",
82
+ tools.map((t) => `mcp__${SINK}__${t}`).join(","),
83
+ "--permission-mode",
84
+ "dontAsk",
85
+ "--max-turns",
86
+ String(maxTurns),
87
+ "--system-prompt-file",
88
+ system,
89
+ ...model ? ["--model", model] : []
90
+ ],
91
+ // The message on stdin: the bundle can be larger than an argument may be.
92
+ stdin: message
93
+ };
94
+ },
95
+ parse(stdout, stderr, code) {
96
+ let r = null;
97
+ for (const line of stdout.trim().split("\n").reverse()) {
98
+ try {
99
+ const j = JSON.parse(line);
100
+ if (j && typeof j === "object") {
101
+ r = j;
102
+ break;
103
+ }
104
+ } catch {
105
+ }
106
+ }
107
+ if (!r) {
108
+ try {
109
+ r = JSON.parse(stdout);
110
+ } catch {
111
+ }
112
+ }
113
+ if (!r) return { finalText: null, refused: [], hitTurns: false, error: code === 0 ? null : (stderr.trim() || `it exited ${code}`).slice(-400), turns: null, tokens: null };
114
+ const denials = Array.isArray(r.permission_denials) ? r.permission_denials : [];
115
+ const usage = r.usage ?? {};
116
+ const subtype = typeof r.subtype === "string" ? r.subtype : "";
117
+ const hitTurns = subtype === "error_max_turns";
118
+ const failed = r.is_error === true && !hitTurns;
119
+ return {
120
+ finalText: typeof r.result === "string" ? r.result : null,
121
+ refused: denials.map((d) => `${String(d.tool_name ?? "a tool")}: denied by the CLI (not on the review's allowlist)`),
122
+ hitTurns,
123
+ error: failed ? String(r.result ?? r.error ?? subtype ?? "the agent failed").slice(0, 400) : null,
124
+ turns: typeof r.num_turns === "number" ? r.num_turns : null,
125
+ tokens: typeof usage.input_tokens === "number" ? (usage.input_tokens ?? 0) + (usage.output_tokens ?? 0) : null
126
+ };
127
+ }
128
+ };
129
+ const toml = (v) => JSON.stringify(v);
130
+ const codex = {
131
+ id: "codex",
132
+ label: "Codex",
133
+ bin: "codex",
134
+ binEnv: "CODETRELLIS_REVIEW_CODEX",
135
+ oidc: [],
136
+ passEnv: [],
137
+ needsAuth: true,
138
+ env({ auth }) {
139
+ const out = {};
140
+ if (auth.kind === "key") out.CODETRELLIS_REVIEW_KEY = auth.value;
141
+ return out;
142
+ },
143
+ command({ instructions, message, sink, model, endpoint, dir, tools }) {
144
+ const home = import_node_path.default.join(dir, "codex-home");
145
+ import_node_fs.default.mkdirSync(home, { recursive: true });
146
+ const server = `mcp_servers.${SINK}`;
147
+ const set = (k, v) => ["-c", `${k}=${v}`];
148
+ return {
149
+ args: [
150
+ "exec",
151
+ "--json",
152
+ "--skip-git-repo-check",
153
+ "--ephemeral",
154
+ "--sandbox",
155
+ "read-only",
156
+ ...set("features.shell_tool", "false"),
157
+ ...set("web_search", toml("disabled")),
158
+ ...set("features.view_image", "false"),
159
+ ...set("features.multi_agent", "false"),
160
+ ...set("project_doc_max_bytes", "0"),
161
+ ...set(`${server}.command`, toml(sink.command)),
162
+ ...set(`${server}.args`, `[${sink.args.map(toml).join(", ")}]`),
163
+ ...sink.env && Object.keys(sink.env).length ? set(`${server}.env`, `{ ${Object.entries(sink.env).map(([k, v]) => `${k} = ${toml(v)}`).join(", ")} }`) : [],
164
+ ...set(`${server}.enabled_tools`, `[${tools.map(toml).join(", ")}]`),
165
+ ...set(`${server}.default_tools_approval_mode`, toml("approve")),
166
+ ...set("model_providers.codetrellis_review.name", toml("codetrellis review")),
167
+ ...set("model_providers.codetrellis_review.base_url", toml(endpoint ?? "https://api.openai.com/v1")),
168
+ ...set("model_providers.codetrellis_review.env_key", toml("CODETRELLIS_REVIEW_KEY")),
169
+ ...set("model_provider", toml("codetrellis_review")),
170
+ ...set("developer_instructions", toml(instructions)),
171
+ ...model ? ["-m", model] : [],
172
+ "-"
173
+ ],
174
+ stdin: message,
175
+ env: { CODEX_HOME: home }
176
+ };
177
+ },
178
+ parse(stdout, stderr, code) {
179
+ let finalText = null;
180
+ let error = null;
181
+ let tokens = null;
182
+ let turns = 0;
183
+ const refused = [];
184
+ for (const line of stdout.split("\n")) {
185
+ let e;
186
+ try {
187
+ e = JSON.parse(line);
188
+ } catch {
189
+ continue;
190
+ }
191
+ if (e.type === "turn.completed") {
192
+ turns += 1;
193
+ const u = e.usage ?? {};
194
+ tokens = (u.input_tokens ?? 0) + (u.output_tokens ?? 0);
195
+ } else if (e.type === "turn.failed") error = String(e.error?.message ?? "the turn failed");
196
+ else if (e.type === "error") error = String(e.message ?? "an error");
197
+ else if (e.type === "item.completed" && e.item) {
198
+ const it = e.item;
199
+ if (it.type === "agent_message" && typeof it.text === "string") finalText = it.text;
200
+ else if (it.type === "mcp_tool_call" && it.status === "failed") refused.push(`${it.server}.${it.tool}: ${String(it.error?.message ?? "failed")}`);
201
+ else if (it.type === "command_execution") refused.push(`a shell command: ${String(it.command ?? "").slice(0, 200)}`);
202
+ else if (it.type === "file_change") refused.push("a file change: refused by the read-only sandbox");
203
+ else if (it.type === "web_search") refused.push("a web search");
204
+ }
205
+ }
206
+ if (!error && code !== 0 && turns === 0) error = (stderr.trim() || `it exited ${code}`).slice(-400);
207
+ return { finalText, refused, hitTurns: false, error, turns: turns || null, tokens };
208
+ }
209
+ };
210
+ const ADAPTERS = [claudeCode, codex];
211
+ function adapterFor(id) {
212
+ return ADAPTERS.find((a) => a.id === id) ?? null;
213
+ }
214
+ // Annotate the CommonJS export names for ESM import in node:
215
+ 0 && (module.exports = {
216
+ ADAPTERS,
217
+ OIDC_ENV,
218
+ OIDC_PROVIDERS,
219
+ adapterFor
220
+ });
@@ -0,0 +1,93 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+ var review_output_exports = {};
19
+ __export(review_output_exports, {
20
+ findingWords: () => findingWords,
21
+ reviewMarkdown: () => reviewMarkdown,
22
+ reviewSarif: () => reviewSarif,
23
+ reviewText: () => reviewText
24
+ });
25
+ module.exports = __toCommonJS(review_output_exports);
26
+ const GLYPH = { rule: "\u2717", bug: "\u2717", risk: "\u26A0", question: "?", suspicious: "\u2691" };
27
+ const where = (f) => f.path ? `${f.path}${f.start ? `:${f.start}${f.end && f.end !== f.start ? `\u2013${f.end}` : ""}` : ""}` : "the change";
28
+ function findingWords(f) {
29
+ return `${GLYPH[f.kind] ?? "\u2022"} ${f.kind}${f.rule ? ` (${f.rule})` : ""} \xB7 ${where(f)}: ${f.says}${f.fix ? ` \u2192 ${f.fix}` : ""}`;
30
+ }
31
+ function reviewText(passes, agent, code) {
32
+ const lines = [];
33
+ for (const p of passes) {
34
+ lines.push(`${p.pass}: ${agent}'s review: ${p.says}`);
35
+ for (const f of p.kept) lines.push(` ${findingWords(f)}`);
36
+ if (p.verify) lines.push(` ${p.verify}`);
37
+ }
38
+ lines.push("", `Kept as check runs; the Checks view opens each.${code ? " Exit 3: --fail-on." : ""}`);
39
+ return lines.join("\n");
40
+ }
41
+ const md = (s) => s.replace(/([\\`*_[\]<>|])/g, "\\$1");
42
+ function reviewMarkdown(passes, agent) {
43
+ const out = ["### CodeTrellis review", "", `${md(agent)} reviewed the change on its own model, held to the review's contract; each finding cites the diff and was checked. Advisory.`, ""];
44
+ for (const p of passes) {
45
+ out.push(`**${md(p.pass)}**: ${md(p.says)}`, "");
46
+ for (const f of p.kept) out.push(`- ${GLYPH[f.kind] ?? "\u2022"} **${f.kind}**${f.rule ? ` (\`${f.rule}\`)` : ""} \xB7 \`${where(f)}\`: ${md(f.says)}${f.fix ? ` \u2192 ${md(f.fix)}` : ""}`);
47
+ if (p.kept.length) out.push("");
48
+ if (p.verify) out.push(`_${md(p.verify)}_`, "");
49
+ }
50
+ return out.join("\n").trimEnd() + "\n";
51
+ }
52
+ function reviewSarif(passes, opts) {
53
+ const rules = /* @__PURE__ */ new Map();
54
+ const results = [];
55
+ for (const p of passes) {
56
+ for (const f of p.kept) {
57
+ if (!f.path) continue;
58
+ const level = f.kind === "rule" ? p.strengths[f.rule ?? ""] === "block" ? "error" : "warning" : f.kind === "bug" ? "warning" : "note";
59
+ const id = f.kind === "rule" && f.rule ? f.rule : `review/${f.kind}`;
60
+ if (!rules.has(id)) {
61
+ rules.set(id, {
62
+ id,
63
+ name: id.replace(/[^A-Za-z0-9]+(.)?/g, (_, c) => c ? c.toUpperCase() : ""),
64
+ shortDescription: { text: f.kind === "rule" ? `The rule ${id}` : `An agent review's ${f.kind} finding` },
65
+ defaultConfiguration: { level }
66
+ });
67
+ }
68
+ results.push({
69
+ ruleId: id,
70
+ level,
71
+ message: { text: `${p.pass}: ${f.says}${f.fix ? ` \u2192 ${f.fix}` : ""}` },
72
+ locations: [{ physicalLocation: { artifactLocation: { uri: f.path, uriBaseId: "SRCROOT" }, ...f.start ? { region: { startLine: f.start, ...f.end && f.end >= f.start ? { endLine: f.end } : {} } } : {} } }],
73
+ partialFingerprints: { codetrellisReview: `${p.pass}|${f.kind}|${f.path}|${f.rule ?? ""}|${f.says}`.slice(0, 500) }
74
+ });
75
+ }
76
+ }
77
+ return {
78
+ $schema: "https://json.schemastore.org/sarif-2.1.0.json",
79
+ version: "2.1.0",
80
+ runs: [{
81
+ tool: { driver: { name: `CodeTrellis review (${opts.agent})`, informationUri: "https://codetrellis.dev", version: opts.version, rules: [...rules.values()] } },
82
+ originalUriBaseIds: { SRCROOT: { uri: `file://${opts.root.replace(/\\/g, "/").replace(/\/?$/, "/")}` } },
83
+ results
84
+ }]
85
+ };
86
+ }
87
+ // Annotate the CommonJS export names for ESM import in node:
88
+ 0 && (module.exports = {
89
+ findingWords,
90
+ reviewMarkdown,
91
+ reviewSarif,
92
+ reviewText
93
+ });
@@ -0,0 +1,89 @@
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 review_post_exports = {};
29
+ __export(review_post_exports, {
30
+ DEFAULT_TOKEN: () => DEFAULT_TOKEN,
31
+ commentRequest: () => commentRequest,
32
+ postComment: () => postComment,
33
+ pullNumber: () => pullNumber
34
+ });
35
+ module.exports = __toCommonJS(review_post_exports);
36
+ var import_node_fs = __toESM(require("node:fs"));
37
+ var import_github = require("../backend/services/review-host/github");
38
+ var import_gitlab = require("../backend/services/review-host/gitlab");
39
+ var import_bitbucket = require("../backend/services/review-host/bitbucket");
40
+ var import_http = require("../backend/services/review-host/http");
41
+ const DEFAULT_TOKEN = { github: "GITHUB_TOKEN", gitlab: "GITLAB_TOKEN", bitbucket: "BITBUCKET_TOKEN" };
42
+ function pullNumber(env) {
43
+ const n = (v) => typeof v === "number" && Number.isSafeInteger(v) && v > 0 ? v : typeof v === "string" && /^\d+$/.test(v) && Number(v) > 0 ? Number(v) : null;
44
+ if (env.GITHUB_EVENT_PATH) {
45
+ try {
46
+ const e = JSON.parse(import_node_fs.default.readFileSync(env.GITHUB_EVENT_PATH, "utf8"));
47
+ const got = n(e.pull_request?.number) ?? n(e.number);
48
+ if (got) return got;
49
+ } catch {
50
+ }
51
+ }
52
+ const ref = /^refs\/pull\/(\d+)\//.exec(env.GITHUB_REF ?? "");
53
+ return (ref ? Number(ref[1]) : null) ?? n(env.CI_MERGE_REQUEST_IID) ?? n(env.BITBUCKET_PR_ID) ?? n(env.SYSTEM_PULLREQUEST_PULLREQUESTNUMBER) ?? n(env.CHANGE_ID);
54
+ }
55
+ function commentRequest(host, pr, token, body) {
56
+ if (!host.kind) return { error: `${host.hostname} is not a host the review can post to (GitHub, GitLab or Bitbucket)` };
57
+ if (!import_http.PART.test(host.owner) && host.kind !== "gitlab") return { error: "the repository's owner is not one the review can name" };
58
+ if (!import_http.PART.test(host.repo)) return { error: "the repository's name is not one the review can name" };
59
+ const text = body.slice(0, 6e4);
60
+ const json = { "Content-Type": "application/json", Accept: "application/json", "User-Agent": "CodeTrellis" };
61
+ if (host.kind === "github") {
62
+ return { url: `${(0, import_github.githubApiBase)()}/repos/${encodeURIComponent(host.owner)}/${encodeURIComponent(host.repo)}/issues/${pr}/comments`, headers: { ...json, Authorization: `Bearer ${token}`, "X-GitHub-Api-Version": "2022-11-28" }, body: JSON.stringify({ body: text }) };
63
+ }
64
+ if (host.kind === "gitlab") {
65
+ if (!host.slug.split("/").every((p) => import_http.PART.test(p))) return { error: "the project's path is not one the review can name" };
66
+ return { url: `${(0, import_gitlab.gitlabApiBase)()}/projects/${encodeURIComponent(host.slug)}/merge_requests/${pr}/notes`, headers: { ...json, Authorization: `Bearer ${token}` }, body: JSON.stringify({ body: text }) };
67
+ }
68
+ return { url: `${(0, import_bitbucket.bitbucketApiBase)()}/repositories/${encodeURIComponent(host.owner)}/${encodeURIComponent(host.repo)}/pullrequests/${pr}/comments`, headers: { ...json, Authorization: `Bearer ${token}` }, body: JSON.stringify({ content: { raw: text } }) };
69
+ }
70
+ async function postComment(host, pr, token, body) {
71
+ const req = commentRequest(host, pr, token, body);
72
+ if ("error" in req) return { ok: false, says: req.error };
73
+ const name = { github: "GitHub", gitlab: "GitLab", bitbucket: "Bitbucket" }[host.kind];
74
+ try {
75
+ const res = await fetch(req.url, { method: "POST", redirect: "error", signal: AbortSignal.timeout(1e4), headers: req.headers, body: req.body });
76
+ if (res.ok) return { ok: true, says: `Posted the review on ${name}, on #${pr}.` };
77
+ if (res.status === 401 || res.status === 403) return { ok: false, says: `${name} refused the token (${res.status}): it needs to write comments on pull requests.` };
78
+ return { ok: false, says: `${name} answered ${res.status}; the review was not posted.` };
79
+ } catch (err) {
80
+ return { ok: false, says: err?.name === "TimeoutError" ? `${name} did not answer in time; the review was not posted.` : `${name} could not be reached; the review was not posted.` };
81
+ }
82
+ }
83
+ // Annotate the CommonJS export names for ESM import in node:
84
+ 0 && (module.exports = {
85
+ DEFAULT_TOKEN,
86
+ commentRequest,
87
+ postComment,
88
+ pullNumber
89
+ });