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,235 @@
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 worktree_service_exports = {};
29
+ __export(worktree_service_exports, {
30
+ WorktreeError: () => WorktreeError,
31
+ belongsToRepo: () => belongsToRepo,
32
+ createWorktree: () => createWorktree,
33
+ describeWorktrees: () => describeWorktrees,
34
+ listWorktrees: () => listWorktrees,
35
+ listWorktreesAsync: () => listWorktreesAsync,
36
+ listWorktreesWithPlans: () => listWorktreesWithPlans,
37
+ parseWorktreePorcelain: () => parseWorktreePorcelain,
38
+ readWorktreePlans: () => readWorktreePlans,
39
+ worktreeWhere: () => worktreeWhere
40
+ });
41
+ module.exports = __toCommonJS(worktree_service_exports);
42
+ var import_node_child_process = require("node:child_process");
43
+ var fs = __toESM(require("node:fs"));
44
+ var path = __toESM(require("node:path"));
45
+ var import_yaml = require("yaml");
46
+ var import_confined_fs = require("./confined-fs");
47
+ var import_git_env = require("./git-env");
48
+ function parseWorktreePorcelain(out, currentRoot) {
49
+ const current = safeCanonical(currentRoot);
50
+ const result = [];
51
+ for (const block of out.split(/\n\s*\n/)) {
52
+ const lines = block.split("\n").map((l) => l.trim()).filter(Boolean);
53
+ const first = lines.find((l) => l.startsWith("worktree "));
54
+ if (!first) continue;
55
+ const wtPath = first.slice("worktree ".length);
56
+ const branchLine = lines.find((l) => l.startsWith("branch "));
57
+ const headLine = lines.find((l) => l.startsWith("HEAD "));
58
+ result.push({
59
+ path: wtPath,
60
+ branch: branchLine ? branchLine.slice("branch ".length).replace(/^refs\/heads\//, "") : null,
61
+ head: headLine ? headLine.slice("HEAD ".length) : null,
62
+ isMain: result.length === 0,
63
+ isCurrent: safeCanonical(wtPath) === current,
64
+ bare: lines.includes("bare"),
65
+ prunable: lines.some((l) => l === "prunable" || l.startsWith("prunable "))
66
+ });
67
+ }
68
+ return result;
69
+ }
70
+ function safeCanonical(p) {
71
+ try {
72
+ return (0, import_confined_fs.canonicalRoot)(p);
73
+ } catch {
74
+ return path.resolve(p);
75
+ }
76
+ }
77
+ function git(projectRoot, args) {
78
+ return (0, import_node_child_process.execFileSync)("git", ["-C", projectRoot, ...args], {
79
+ encoding: "utf-8",
80
+ stdio: ["ignore", "pipe", "ignore"],
81
+ timeout: 5e3
82
+ });
83
+ }
84
+ function belongsToRepo(wt, commonDir) {
85
+ try {
86
+ const wtRoot = fs.realpathSync.native(wt.path);
87
+ const dotGit = path.join(wtRoot, ".git");
88
+ const st = fs.lstatSync(dotGit);
89
+ if (wt.isMain) {
90
+ return st.isDirectory() && fs.realpathSync.native(dotGit) === commonDir;
91
+ }
92
+ if (!st.isFile()) return false;
93
+ const m = /^gitdir:\s*(.+)\s*$/m.exec(fs.readFileSync(dotGit, "utf-8"));
94
+ if (!m) return false;
95
+ const target = fs.realpathSync.native(path.resolve(wtRoot, m[1].trim()));
96
+ return path.dirname(target) === path.join(commonDir, "worktrees");
97
+ } catch {
98
+ return false;
99
+ }
100
+ }
101
+ const WHERE_ORDER = { main: 0, inside: 1, beside: 2, home: 3, elsewhere: 4 };
102
+ function under(child, parent) {
103
+ const rel = path.relative(parent, child);
104
+ if (!rel || rel.startsWith("..") || path.isAbsolute(rel)) return null;
105
+ return rel.split(path.sep).join("/");
106
+ }
107
+ function worktreeWhere(wtPath, isMain, mainRoot, home) {
108
+ const homeLabel = (p) => {
109
+ const rel = under(p, home);
110
+ return rel ? `~/${rel}` : p.split(path.sep).join("/");
111
+ };
112
+ if (isMain) return { where: "main", label: homeLabel(wtPath) };
113
+ const inside = under(wtPath, mainRoot);
114
+ if (inside) return { where: "inside", label: inside };
115
+ const beside = under(wtPath, path.dirname(mainRoot));
116
+ if (beside) return { where: "beside", label: `../${beside}` };
117
+ const label = homeLabel(wtPath);
118
+ return { where: label.startsWith("~/") ? "home" : "elsewhere", label };
119
+ }
120
+ function describeWorktrees(list, projectRoot, home) {
121
+ const main = list.find((w) => w.isMain && !w.bare);
122
+ const mainRoot = safeCanonical(main?.path ?? projectRoot);
123
+ const homeRoot = safeCanonical(home);
124
+ return list.filter((w) => !w.isCurrent && !w.bare).map((w) => ({
125
+ path: w.path,
126
+ branch: w.branch,
127
+ isMain: w.isMain,
128
+ prunable: w.prunable,
129
+ ...worktreeWhere(w.prunable ? path.resolve(w.path) : safeCanonical(w.path), w.isMain, mainRoot, homeRoot)
130
+ })).sort((a, b) => Number(a.prunable) - Number(b.prunable) || WHERE_ORDER[a.where] - WHERE_ORDER[b.where] || a.label.localeCompare(b.label));
131
+ }
132
+ function listWorktrees(projectRoot) {
133
+ let out;
134
+ let commonDir;
135
+ try {
136
+ out = git(projectRoot, ["worktree", "list", "--porcelain"]);
137
+ commonDir = fs.realpathSync.native(
138
+ path.resolve(projectRoot, git(projectRoot, ["rev-parse", "--git-common-dir"]).trim())
139
+ );
140
+ } catch {
141
+ return [];
142
+ }
143
+ return parseWorktreePorcelain(out, projectRoot).filter((w) => w.bare || w.prunable || belongsToRepo(w, commonDir));
144
+ }
145
+ async function listWorktreesAsync(projectRoot) {
146
+ let out;
147
+ let commonDir;
148
+ try {
149
+ out = await (0, import_git_env.gitAsync)(projectRoot, ["worktree", "list", "--porcelain"]);
150
+ commonDir = fs.realpathSync.native(
151
+ path.resolve(projectRoot, (await (0, import_git_env.gitAsync)(projectRoot, ["rev-parse", "--git-common-dir"])).trim())
152
+ );
153
+ } catch {
154
+ return [];
155
+ }
156
+ return parseWorktreePorcelain(out, projectRoot).filter((w) => w.bare || w.prunable || belongsToRepo(w, commonDir));
157
+ }
158
+ function readWorktreePlans(worktreeRoot) {
159
+ let plansDir;
160
+ try {
161
+ plansDir = (0, import_confined_fs.resolveWithin)(worktreeRoot, path.join(".codetrellis", "plans"), "plans dir");
162
+ } catch {
163
+ return [];
164
+ }
165
+ if (!fs.existsSync(plansDir)) return [];
166
+ const plans = [];
167
+ let entries = [];
168
+ try {
169
+ entries = fs.readdirSync(plansDir, { withFileTypes: true });
170
+ } catch {
171
+ return [];
172
+ }
173
+ for (const entry of entries) {
174
+ if (!entry.isDirectory()) continue;
175
+ try {
176
+ const text = (0, import_confined_fs.readTextWithin)(worktreeRoot, path.join(".codetrellis", "plans", entry.name, "plan.yaml"), "plan.yaml");
177
+ const doc = (0, import_yaml.parse)(text);
178
+ if (!doc || typeof doc.uid !== "string") continue;
179
+ plans.push({
180
+ uid: doc.uid,
181
+ title: typeof doc.title === "string" ? doc.title : entry.name,
182
+ status: typeof doc.status === "string" ? doc.status : "draft"
183
+ });
184
+ } catch {
185
+ }
186
+ }
187
+ return plans;
188
+ }
189
+ function listWorktreesWithPlans(projectRoot) {
190
+ return listWorktrees(projectRoot).filter((w) => !w.bare && !w.prunable && fs.existsSync(w.path)).map((w) => ({ ...w, plans: readWorktreePlans(w.path) }));
191
+ }
192
+ class WorktreeError extends Error {
193
+ constructor(message, status = 400) {
194
+ super(message);
195
+ this.status = status;
196
+ }
197
+ status;
198
+ }
199
+ function createWorktree(projectRoot, opts) {
200
+ if (fs.existsSync(opts.dir)) throw new WorktreeError(`${opts.dir} already exists; choose another branch name`, 409);
201
+ let branchExists = true;
202
+ try {
203
+ git(projectRoot, ["rev-parse", "--verify", "--quiet", `refs/heads/${opts.branch}`]);
204
+ } catch {
205
+ branchExists = false;
206
+ }
207
+ if (branchExists) throw new WorktreeError(`A branch named ${opts.branch} already exists; choose another name`, 409);
208
+ if (opts.base) {
209
+ try {
210
+ git(projectRoot, ["rev-parse", "--verify", "--quiet", `${opts.base}^{commit}`]);
211
+ } catch {
212
+ throw new WorktreeError(`The plan's base, ${opts.base}, is not a branch or commit in this repository`, 400);
213
+ }
214
+ }
215
+ const args = ["-C", projectRoot, "worktree", "add", "-b", opts.branch, opts.dir, ...opts.base ? [opts.base] : []];
216
+ try {
217
+ (0, import_node_child_process.execFileSync)("git", args, { encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"], timeout: 3e4 });
218
+ } catch (err) {
219
+ const stderr = String(err.stderr ?? "").split("\n").find((l) => l.trim()) ?? "unknown error";
220
+ throw new WorktreeError(`git could not make the worktree: ${stderr.replace(/^fatal:\s*/, "")}`, 400);
221
+ }
222
+ }
223
+ // Annotate the CommonJS export names for ESM import in node:
224
+ 0 && (module.exports = {
225
+ WorktreeError,
226
+ belongsToRepo,
227
+ createWorktree,
228
+ describeWorktrees,
229
+ listWorktrees,
230
+ listWorktreesAsync,
231
+ listWorktreesWithPlans,
232
+ parseWorktreePorcelain,
233
+ readWorktreePlans,
234
+ worktreeWhere
235
+ });
@@ -0,0 +1,100 @@
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 agent_exports = {};
29
+ __export(agent_exports, {
30
+ NotRunningError: () => NotRunningError,
31
+ agentName: () => agentName,
32
+ connectAgent: () => connectAgent,
33
+ dataDirFor: () => dataDirFor
34
+ });
35
+ module.exports = __toCommonJS(agent_exports);
36
+ var import_node_fs = __toESM(require("node:fs"));
37
+ var import_node_os = __toESM(require("node:os"));
38
+ var import_node_path = __toESM(require("node:path"));
39
+ var import_client = require("@modelcontextprotocol/sdk/client/index.js");
40
+ var import_sse = require("@modelcontextprotocol/sdk/client/sse.js");
41
+ var import_binding_headers = require("../backend/mcp/binding-headers");
42
+ var import_files = require("../backend/mcp/connector/files");
43
+ var import_args = require("./args");
44
+ function agentName(asFlag, env) {
45
+ if (asFlag && asFlag.trim()) return asFlag.trim();
46
+ if (env.CODETRELLIS_AGENT && env.CODETRELLIS_AGENT.trim()) return env.CODETRELLIS_AGENT.trim();
47
+ if (env.CLAUDECODE === "1") return "claude-code";
48
+ return "codetrellis-cli";
49
+ }
50
+ function dataDirFor(given, cwd, env) {
51
+ if (given) return import_node_path.default.resolve(given);
52
+ const here = (0, import_args.headlessDataDir)(cwd, env, import_node_os.default.homedir());
53
+ if (import_node_fs.default.existsSync(import_node_path.default.join(here, "mcp-endpoint.json"))) return here;
54
+ return (0, import_files.defaultDataDir)(env);
55
+ }
56
+ class NotRunningError extends Error {
57
+ }
58
+ async function connectAgent(opts) {
59
+ const target = (0, import_files.readConnectTarget)(opts.dataDir);
60
+ if (!target.ok) {
61
+ throw new NotRunningError(`CodeTrellis is not running for this folder (${target.reason}). Start it with \`codetrellis serve\`, or open the app.`);
62
+ }
63
+ const url = new URL(target.url);
64
+ url.searchParams.set("ct_token", target.token);
65
+ const headers = (0, import_binding_headers.bindingHeaders)({ cwd: opts.cwd });
66
+ const transport = new import_sse.SSEClientTransport(url, {
67
+ eventSourceInit: {
68
+ fetch: (u, init) => fetch(u, { ...init, headers: { ...init?.headers, ...headers } })
69
+ },
70
+ requestInit: { headers }
71
+ });
72
+ const client = new import_client.Client({ name: opts.name, version: "cli" }, { capabilities: {} });
73
+ await client.connect(transport);
74
+ return {
75
+ name: opts.name,
76
+ async call(name, args) {
77
+ const res = await client.callTool({ name, arguments: args });
78
+ const text = (res.content ?? []).find((c) => c.type === "text" && typeof c.text === "string")?.text ?? "";
79
+ let json = null;
80
+ try {
81
+ json = JSON.parse(text);
82
+ } catch {
83
+ }
84
+ return { text, json, isError: res.isError === true };
85
+ },
86
+ async close() {
87
+ try {
88
+ await client.close();
89
+ } catch {
90
+ }
91
+ }
92
+ };
93
+ }
94
+ // Annotate the CommonJS export names for ESM import in node:
95
+ 0 && (module.exports = {
96
+ NotRunningError,
97
+ agentName,
98
+ connectAgent,
99
+ dataDirFor
100
+ });
@@ -0,0 +1,209 @@
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 args_exports = {};
29
+ __export(args_exports, {
30
+ USAGE: () => USAGE,
31
+ connectorLine: () => connectorLine,
32
+ flag: () => flag,
33
+ headlessCacheRoot: () => headlessCacheRoot,
34
+ headlessDataDir: () => headlessDataDir,
35
+ parseArgs: () => parseArgs,
36
+ selfCommand: () => selfCommand
37
+ });
38
+ module.exports = __toCommonJS(args_exports);
39
+ var import_node_path = __toESM(require("node:path"));
40
+ var import_node_crypto = __toESM(require("node:crypto"));
41
+ const SWITCHES = /* @__PURE__ */ new Set(["json", "help", "no-wait", "quiet", "share-task-state", "top", "page", "strict", "no-color", "verify", "post", "pipeline", "require", "no-fetch", "no-open"]);
42
+ function parseArgs(argv) {
43
+ const flags = {};
44
+ const rest = [];
45
+ let command = null;
46
+ for (let i = 0; i < argv.length; i++) {
47
+ const a = argv[i];
48
+ if (a === "--") {
49
+ rest.push(...argv.slice(i + 1));
50
+ break;
51
+ }
52
+ if (a.startsWith("--")) {
53
+ const eq = a.indexOf("=");
54
+ const name = eq > 0 ? a.slice(2, eq) : a.slice(2);
55
+ if (eq > 0) flags[name] = a.slice(eq + 1);
56
+ else if (!SWITCHES.has(name) && i + 1 < argv.length && !argv[i + 1].startsWith("--")) flags[name] = argv[++i];
57
+ else flags[name] = true;
58
+ continue;
59
+ }
60
+ if (a === "-h") {
61
+ flags.help = true;
62
+ continue;
63
+ }
64
+ if (a === "-m" && i + 1 < argv.length) {
65
+ flags.m = argv[++i];
66
+ continue;
67
+ }
68
+ if (command === null) command = a;
69
+ else rest.push(a);
70
+ }
71
+ return { command, flags, rest };
72
+ }
73
+ function flag(p, name) {
74
+ const v = p.flags[name];
75
+ return typeof v === "string" ? v : void 0;
76
+ }
77
+ function headlessDataDir(projectRoot, env, home, platform = process.platform) {
78
+ const fromEnv = env.CODETRELLIS_DATA_DIR;
79
+ if (fromEnv && fromEnv.trim()) return fromEnv;
80
+ const resolved = import_node_path.default.resolve(projectRoot);
81
+ const id = import_node_crypto.default.createHash("sha256").update(resolved).digest("hex").slice(0, 10);
82
+ const name = import_node_path.default.basename(resolved).replace(/[^A-Za-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 40) || "project";
83
+ return import_node_path.default.join(headlessCacheRoot(env, home, platform), `${name}-${id}`);
84
+ }
85
+ function headlessCacheRoot(env, home, platform = process.platform) {
86
+ const cache = platform === "darwin" ? import_node_path.default.join(home, "Library", "Caches") : platform === "win32" ? env.LOCALAPPDATA || import_node_path.default.join(home, "AppData", "Local") : env.XDG_CACHE_HOME && import_node_path.default.isAbsolute(env.XDG_CACHE_HOME) ? env.XDG_CACHE_HOME : import_node_path.default.join(home, ".cache");
87
+ return import_node_path.default.join(cache, "codetrellis");
88
+ }
89
+ const quote = (s) => /^[A-Za-z0-9_./:=@-]+$/.test(s) ? s : `'${s.replace(/'/g, `'\\''`)}'`;
90
+ function selfCommand(binDir, proc) {
91
+ if (proc.electron) return { command: proc.execPath, args: [import_node_path.default.join(binDir, "app.cjs")], env: { ELECTRON_RUN_AS_NODE: "1" } };
92
+ return { command: proc.execPath, args: [import_node_path.default.join(binDir, "codetrellis.mjs")], env: {} };
93
+ }
94
+ function connectorLine(self, dataDir) {
95
+ const args = [...self.args, "mcp", "--data-dir", dataDir];
96
+ const env = Object.keys(self.env).length ? self.env : void 0;
97
+ const envFlags = Object.entries(self.env).map(([k, v]) => `-e ${quote(`${k}=${v}`)} `).join("");
98
+ return {
99
+ command: self.command,
100
+ args,
101
+ claude: `claude mcp add codetrellis ${envFlags}-- ${[self.command, ...args].map(quote).join(" ")}`,
102
+ json: JSON.stringify({ mcpServers: { codetrellis: { command: self.command, args, ...env ? { env } : {} } } })
103
+ };
104
+ }
105
+ const USAGE = `codetrellis \u2014 CodeTrellis for agents, without the desktop app
106
+
107
+ codetrellis serve [--project <dir>] [--data-dir <dir>] [--port <n>] [--mcp-port <n>] [--share-task-state] [--json]
108
+ Run the backend headless for a project: loopback only, the capability
109
+ token on every transport, no discovery, peers or update check. Prints
110
+ the line an agent's MCP config needs. --share-task-state writes task
111
+ state and test runs to the project's files and reads teammates', as the
112
+ app's Settings switch does.
113
+
114
+ codetrellis scan [--project <dir>] [--data-dir <dir>] [--json]
115
+ Scan a project once and print what was found, then exit.
116
+
117
+ codetrellis start [--project <dir>] [--data-dir <dir>] [--timeout <s>] [--share-task-state] [--quiet | --json]
118
+ serve in the background, unless it already runs for this folder; for a
119
+ session-start hook or a CI step. Its log is serve.log in the data dir.
120
+
121
+ codetrellis stop [--project <dir>] [--data-dir <dir>]
122
+
123
+ codetrellis mcp [--data-dir <dir>]
124
+ The stdio MCP connector an agent's config launches. Finds the headless
125
+ backend for the folder it is started in, else the desktop app's.
126
+
127
+ Keeping on track, as the agent running the command (--as <name> to say
128
+ which; text, or --json):
129
+
130
+ codetrellis next [--plan <uid>] the task to pick up
131
+ codetrellis claim <task> take it
132
+ codetrellis update <task> --progress N [--note <text>]
133
+ codetrellis stuck <task> <why\u2026> blocked, and why
134
+ codetrellis done <task> refused while a criterion's check fails
135
+ codetrellis request <question\u2026> [--options a,b] [--item <task>] [--no-wait] [--timeout <s>]
136
+ ask the person; waits for their answer
137
+ codetrellis brief <task> what the task needs
138
+ codetrellis awareness what overlaps your work
139
+ codetrellis check <path> before an edit: overlaps, and whether a breakpoint holds it
140
+ codetrellis check [--base <ref>] [--strict] does this work conform? exit 3 when a breakpoint holds a
141
+ changed file, its tests fail or are older than the code, a
142
+ done task fails its checks, a doc describing it is stale,
143
+ it adds an import a rule at block forbids, or it loosens a
144
+ rule; a rule at warn is said and passes (--strict: it fails)
145
+ codetrellis check --format sarif the same, as SARIF 2.1.0 for any CI host (or text, json, markdown)
146
+ codetrellis check --no-color plain text in a terminal too (NO_COLOR does the same)
147
+ codetrellis check --suite <s> | --rule <id> | --path <p> | --tag <t>
148
+ only those rules (comma-separated): one suite's, named
149
+ rules, the rules about a path, or those with a tag
150
+ codetrellis check --pipeline [--stage <id>] the base's .codetrellis/pipeline.yaml, stage by stage; agent
151
+ stages too with --agent and the review's flags
152
+ codetrellis rules baseline record each rule's breaches now; the check then fails on
153
+ any it does not list, and the file may only shrink
154
+ codetrellis report-tests <junit.xml> tell CodeTrellis how the tests went
155
+ codetrellis review [--agent claude-code] [--model <m>] [--endpoint <url>] [--auth env:<VAR>]
156
+ [--skills <dir>] [--suite <s> | --rule <id> | --path <p> | --tag <t>] [--base <ref>] [--task <uid>]
157
+ [--max-turns <n>] [--timeout <s>] [--max-tool-calls <n>] [--fail-on block,error] [--verify]
158
+ [--format text|markdown|sarif|json] [--sarif-out <f>] [--markdown-out <f>] [--post [--pr <n>]]
159
+ your own agent reviews the change, headless, with no shell,
160
+ files or web; each finding must cite the diff, and each pass
161
+ is kept as a check run. --verify: a second pass tries to refute
162
+ each finding. --auth oidc:bedrock|vertex|foundry signs in through
163
+ your cloud. --post comments on the pull request. Advisory: exit 3
164
+ only with --fail-on. A review of a commit is signed with this
165
+ device's key, as a git note on it
166
+ codetrellis review publish [--remote <r>] push the signed reviews, for CI to read
167
+ codetrellis review verify --base <ref> [--head <ref>] [--require] [--format text|markdown|sarif|json]
168
+ the head's signed review, checked against the keys on the base:
169
+ verified, stale (of an earlier commit), refused, or none; no
170
+ app, no secret, no AI. --require: exit 3 unless verified
171
+
172
+ The desktop app:
173
+
174
+ codetrellis desktop install [--version <v>] [--platform <p>] [--dir <d>] [--no-open] [--json]
175
+ download the app for this computer (or --platform:
176
+ darwin-arm64, darwin-x64, win32-x64, win32-arm64, linux-x64,
177
+ linux-arm64), check it against the release's signed
178
+ checksums, save it to --dir (default ~/Downloads) and open it
179
+ codetrellis desktop url [--version <v>] [--platform <p>] [--json]
180
+ the installer's download link, without downloading
181
+
182
+ codetrellis --version this CLI's version
183
+
184
+ Changing and committing the plan:
185
+
186
+ codetrellis plan show [--plan <uid>]
187
+ codetrellis plan add <title\u2026> [--under <task>] [--page] [--body <text>]
188
+ codetrellis plan edit <task> [--title <text>] [--body <text>]
189
+ codetrellis plan move <task> (--under <task> | --top) [--position N]
190
+ codetrellis commit [-m <subject>] commits only CodeTrellis's own files (.codetrellis/)
191
+ codetrellis status [--base <ref>] [--strict] plans, what is under way, blocked, and waiting on you,
192
+ and whether this work conforms (exit 3 when not)
193
+
194
+ <task> is a uid, or its first characters ("6cb8cf43", "task 6cb8cf43").
195
+ Exit codes: 0 done, 1 refused, 2 usage, 3 held, not answered yet, or not conforming.
196
+ This work is the branch since its base (--base, else the pull request's
197
+ base in GitHub Actions, else origin's default branch) and what is not
198
+ committed yet.
199
+ `;
200
+ // Annotate the CommonJS export names for ESM import in node:
201
+ 0 && (module.exports = {
202
+ USAGE,
203
+ connectorLine,
204
+ flag,
205
+ headlessCacheRoot,
206
+ headlessDataDir,
207
+ parseArgs,
208
+ selfCommand
209
+ });
@@ -0,0 +1,106 @@
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 conformity_exports = {};
19
+ __export(conformity_exports, {
20
+ baseRef: () => import_work_changes.baseRef,
21
+ changedFiles: () => import_work_changes.changedFiles,
22
+ gate: () => gate,
23
+ gateMarkdown: () => gateMarkdown,
24
+ gateWords: () => gateWords,
25
+ ranIn: () => ranIn,
26
+ wantsColor: () => wantsColor,
27
+ withPlaces: () => withPlaces
28
+ });
29
+ module.exports = __toCommonJS(conformity_exports);
30
+ var import_check_words = require("../shared/lib/check-words");
31
+ var import_import_line = require("../shared/lib/import-line");
32
+ var import_work_changes = require("../backend/services/work-changes");
33
+ function ranIn(env) {
34
+ const on = (k) => env[k] !== void 0 && env[k] !== "" && env[k] !== "false" && env[k] !== "0";
35
+ if (on("GITHUB_ACTIONS")) return "GitHub Actions";
36
+ if (on("GITLAB_CI")) return "GitLab CI";
37
+ if (on("BITBUCKET_BUILD_NUMBER")) return "Bitbucket Pipelines";
38
+ if (on("TF_BUILD")) return "Azure Pipelines";
39
+ if (on("JENKINS_URL")) return "Jenkins";
40
+ if (on("CIRCLECI")) return "CircleCI";
41
+ if (on("BUILDKITE")) return "Buildkite";
42
+ if (on("CI")) return "CI";
43
+ return "a terminal";
44
+ }
45
+ async function gate(agent, root, changed, strict = false, scope = {}) {
46
+ if (changed.files.length === 0 && !changed.rulebook) return { ok: true, says: [], files: 0, base: changed.base, breakpoints: [], tests: [], criteria: [], docs: [], rules: [], rulebook: [], notes: [] };
47
+ const { stage, ...selects } = scope;
48
+ const a = await agent.call("check_changes", {
49
+ paths: changed.files.slice(0, 500),
50
+ project_path: root,
51
+ ...changed.since ? { base: changed.since } : {},
52
+ ...strict ? { strict: true } : {},
53
+ ...selects,
54
+ // C7: the run is kept saying where it ran; B6: and which stage of the pipeline it was.
55
+ ran_in: stage ? `${ranIn(process.env)}, stage ${stage}` : ranIn(process.env)
56
+ });
57
+ if (a.isError) return { error: a.text };
58
+ const j = a.json ?? {};
59
+ const list = (k) => Array.isArray(j[k]) ? j[k] : [];
60
+ return {
61
+ ok: j.ok === true,
62
+ says: list("says"),
63
+ files: changed.files.length,
64
+ base: changed.base,
65
+ breakpoints: list("breakpoints"),
66
+ tests: list("tests"),
67
+ criteria: list("criteria"),
68
+ docs: list("docs"),
69
+ rules: list("rules"),
70
+ rulebook: list("rulebook"),
71
+ notes: list("notes").filter((n) => typeof n === "string"),
72
+ ...typeof j.rules_note === "string" ? { rulesNote: j.rules_note } : {},
73
+ ...typeof j.scope === "string" ? { scope: j.scope } : {},
74
+ ...Array.isArray(j.checked) ? { checked: j.checked } : {}
75
+ };
76
+ }
77
+ function gateWords(g, opts = {}) {
78
+ return (0, import_check_words.renderText)(withPlaces(g, opts.read), { color: opts.color });
79
+ }
80
+ function gateMarkdown(g, read) {
81
+ return (0, import_check_words.renderMarkdown)(withPlaces(g, read));
82
+ }
83
+ function withPlaces(g, read) {
84
+ const rules = g.rules.map((r) => {
85
+ const text = read ? read(r.path) : null;
86
+ const line = text === null ? null : (0, import_import_line.findingAt)(text, r.imports, r.line_found);
87
+ return { ...r, line, text: line ? text.split("\n")[line - 1] : null };
88
+ });
89
+ return { ...g, rules, rulebook: g.rulebook };
90
+ }
91
+ function wantsColor(stream, env, noColorFlag = false) {
92
+ if (noColorFlag || env.NO_COLOR !== void 0 && env.NO_COLOR !== "") return false;
93
+ if (env.FORCE_COLOR !== void 0 && env.FORCE_COLOR !== "" && env.FORCE_COLOR !== "0") return true;
94
+ return stream.isTTY === true && env.TERM !== "dumb";
95
+ }
96
+ // Annotate the CommonJS export names for ESM import in node:
97
+ 0 && (module.exports = {
98
+ baseRef,
99
+ changedFiles,
100
+ gate,
101
+ gateMarkdown,
102
+ gateWords,
103
+ ranIn,
104
+ wantsColor,
105
+ withPlaces
106
+ });