codetrellis 0.0.0-stage → 0.2.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 (449) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +27 -2
  3. package/bin/codetrellis.mjs +4 -0
  4. package/package.json +43 -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/clock.js +57 -0
  102. package/src/backend/services/cloud-files.js +191 -0
  103. package/src/backend/services/coalesce.js +50 -0
  104. package/src/backend/services/code-breakpoints.js +291 -0
  105. package/src/backend/services/comment-service.js +168 -0
  106. package/src/backend/services/commit-attribution.js +134 -0
  107. package/src/backend/services/commit-edges.js +99 -0
  108. package/src/backend/services/confined-fs.js +241 -0
  109. package/src/backend/services/conformity-gate.js +132 -0
  110. package/src/backend/services/contribution-service.js +409 -0
  111. package/src/backend/services/coverage-service.js +173 -0
  112. package/src/backend/services/criteria-service.js +721 -0
  113. package/src/backend/services/criterion-checks.js +387 -0
  114. package/src/backend/services/criterion-loop-service.js +411 -0
  115. package/src/backend/services/cross-system-service.js +231 -0
  116. package/src/backend/services/database.js +916 -0
  117. package/src/backend/services/db-schema.js +1358 -0
  118. package/src/backend/services/deviation-service.js +344 -0
  119. package/src/backend/services/diff-engine.js +168 -0
  120. package/src/backend/services/evidence.js +363 -0
  121. package/src/backend/services/external-intake-service.js +269 -0
  122. package/src/backend/services/external-pointer-service.js +195 -0
  123. package/src/backend/services/external-refs-service.js +214 -0
  124. package/src/backend/services/file-history.js +158 -0
  125. package/src/backend/services/file-watcher.js +193 -0
  126. package/src/backend/services/folder-requests.js +118 -0
  127. package/src/backend/services/freeze-service.js +189 -0
  128. package/src/backend/services/gemini-cli-hook.js +172 -0
  129. package/src/backend/services/git-activity-service.js +325 -0
  130. package/src/backend/services/git-blobs.js +70 -0
  131. package/src/backend/services/git-branches.js +357 -0
  132. package/src/backend/services/git-checkout.js +153 -0
  133. package/src/backend/services/git-commit-service.js +91 -0
  134. package/src/backend/services/git-env.js +121 -0
  135. package/src/backend/services/git-identity.js +84 -0
  136. package/src/backend/services/git-refs.js +386 -0
  137. package/src/backend/services/git-safety.js +58 -0
  138. package/src/backend/services/grant-guard.js +67 -0
  139. package/src/backend/services/html-view-policy.js +135 -0
  140. package/src/backend/services/human-decision.js +55 -0
  141. package/src/backend/services/importers.js +159 -0
  142. package/src/backend/services/intent-service.js +105 -0
  143. package/src/backend/services/ipc-dispatcher.js +164 -0
  144. package/src/backend/services/item-git-state.js +208 -0
  145. package/src/backend/services/line-changes.js +232 -0
  146. package/src/backend/services/line-history.js +174 -0
  147. package/src/backend/services/local-api-changes.js +40 -0
  148. package/src/backend/services/logger.js +217 -0
  149. package/src/backend/services/material-footprints.js +203 -0
  150. package/src/backend/services/material-place.js +82 -0
  151. package/src/backend/services/material-reader/child.js +4 -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/read.js +430 -0
  156. package/src/backend/services/material-reader/reader-host.js +202 -0
  157. package/src/backend/services/material-signals.js +141 -0
  158. package/src/backend/services/mcp-capabilities.js +390 -0
  159. package/src/backend/services/mdns-service.js +304 -0
  160. package/src/backend/services/mobile-api-server.js +281 -0
  161. package/src/backend/services/mobile-approvals.js +306 -0
  162. package/src/backend/services/mobile-awareness.js +180 -0
  163. package/src/backend/services/mobile-breakpoints.js +115 -0
  164. package/src/backend/services/mobile-budget.js +98 -0
  165. package/src/backend/services/mobile-freeze.js +106 -0
  166. package/src/backend/services/mobile-proposals.js +100 -0
  167. package/src/backend/services/mobile-rpc-service.js +1289 -0
  168. package/src/backend/services/mobile-workstreams.js +160 -0
  169. package/src/backend/services/monorepo-detector.js +131 -0
  170. package/src/backend/services/other-work.js +45 -0
  171. package/src/backend/services/pack-seal.js +129 -0
  172. package/src/backend/services/paired-device-service.js +192 -0
  173. package/src/backend/services/pairing-server.js +323 -0
  174. package/src/backend/services/pairing-service.js +200 -0
  175. package/src/backend/services/pantry-resolution-service.js +166 -0
  176. package/src/backend/services/parsers/base.js +124 -0
  177. package/src/backend/services/parsers/csharp.js +224 -0
  178. package/src/backend/services/parsers/go.js +180 -0
  179. package/src/backend/services/parsers/index.js +101 -0
  180. package/src/backend/services/parsers/java.js +103 -0
  181. package/src/backend/services/parsers/kotlin.js +252 -0
  182. package/src/backend/services/parsers/php.js +113 -0
  183. package/src/backend/services/parsers/python.js +189 -0
  184. package/src/backend/services/parsers/ruby.js +212 -0
  185. package/src/backend/services/parsers/rust.js +97 -0
  186. package/src/backend/services/parsers/swift.js +221 -0
  187. package/src/backend/services/parsers/typescript.js +235 -0
  188. package/src/backend/services/pattern-scan.js +65 -0
  189. package/src/backend/services/patterns.js +281 -0
  190. package/src/backend/services/peer-audit-service.js +123 -0
  191. package/src/backend/services/peer-auth.js +153 -0
  192. package/src/backend/services/peer-capabilities.js +209 -0
  193. package/src/backend/services/peer-connection-service.js +450 -0
  194. package/src/backend/services/peer-grants.js +33 -0
  195. package/src/backend/services/persistence.js +116 -0
  196. package/src/backend/services/personal-sync-service.js +232 -0
  197. package/src/backend/services/pipeline-approvals.js +72 -0
  198. package/src/backend/services/pipeline.js +232 -0
  199. package/src/backend/services/plan-arrivals.js +68 -0
  200. package/src/backend/services/plan-changes-service.js +273 -0
  201. package/src/backend/services/plan-conflict-service.js +288 -0
  202. package/src/backend/services/plan-dependencies.js +91 -0
  203. package/src/backend/services/plan-doc-guard.js +90 -0
  204. package/src/backend/services/plan-documents-service.js +275 -0
  205. package/src/backend/services/plan-event-service.js +154 -0
  206. package/src/backend/services/plan-file-refs.js +106 -0
  207. package/src/backend/services/plan-file-service.js +1564 -0
  208. package/src/backend/services/plan-history-service.js +156 -0
  209. package/src/backend/services/plan-import-service.js +261 -0
  210. package/src/backend/services/plan-item-service.js +1223 -0
  211. package/src/backend/services/plan-migrate-service.js +395 -0
  212. package/src/backend/services/plan-overlay-service.js +173 -0
  213. package/src/backend/services/plan-phases-service.js +182 -0
  214. package/src/backend/services/plan-progress-service.js +134 -0
  215. package/src/backend/services/plan-review-service.js +262 -0
  216. package/src/backend/services/plan-service.js +682 -0
  217. package/src/backend/services/plan-status.js +113 -0
  218. package/src/backend/services/plan-template-publish-service.js +217 -0
  219. package/src/backend/services/plan-templates-service.js +242 -0
  220. package/src/backend/services/plan-templates.js +1164 -0
  221. package/src/backend/services/planned-overlap-actions.js +200 -0
  222. package/src/backend/services/plans-home.js +224 -0
  223. package/src/backend/services/play-forward.js +256 -0
  224. package/src/backend/services/playback-service.js +117 -0
  225. package/src/backend/services/power-service.js +167 -0
  226. package/src/backend/services/power-signals.js +81 -0
  227. package/src/backend/services/pr-draft-service.js +142 -0
  228. package/src/backend/services/presence-service.js +122 -0
  229. package/src/backend/services/pricing.js +60 -0
  230. package/src/backend/services/project-config-service.js +474 -0
  231. package/src/backend/services/project-scanner.js +184 -0
  232. package/src/backend/services/projection-service.js +69 -0
  233. package/src/backend/services/push-notification-service.js +288 -0
  234. package/src/backend/services/recent-projects-service.js +204 -0
  235. package/src/backend/services/record-chain.js +162 -0
  236. package/src/backend/services/recurrence-rule.js +63 -0
  237. package/src/backend/services/recurring-agent.js +89 -0
  238. package/src/backend/services/recurring-scheduler.js +77 -0
  239. package/src/backend/services/recurring-service.js +276 -0
  240. package/src/backend/services/reference-service.js +169 -0
  241. package/src/backend/services/release-public-key.js +30 -0
  242. package/src/backend/services/release-signature.js +64 -0
  243. package/src/backend/services/remote-audio-service.js +224 -0
  244. package/src/backend/services/remote-interaction-service.js +275 -0
  245. package/src/backend/services/remote-terminal-service.js +324 -0
  246. package/src/backend/services/rendition/child/main.js +76 -0
  247. package/src/backend/services/rendition/engine-host.js +249 -0
  248. package/src/backend/services/rendition/engine-lock.js +39 -0
  249. package/src/backend/services/rendition/engine-lock.json +14 -0
  250. package/src/backend/services/rendition/engine-manifest.js +97 -0
  251. package/src/backend/services/rendition/network-proof.js +73 -0
  252. package/src/backend/services/rendition/rendition-service.js +175 -0
  253. package/src/backend/services/replay-frames.js +387 -0
  254. package/src/backend/services/replay-state.js +201 -0
  255. package/src/backend/services/resolvers/base.js +108 -0
  256. package/src/backend/services/resolvers/csharp.js +109 -0
  257. package/src/backend/services/resolvers/go.js +105 -0
  258. package/src/backend/services/resolvers/index.js +60 -0
  259. package/src/backend/services/resolvers/java.js +63 -0
  260. package/src/backend/services/resolvers/kotlin.js +109 -0
  261. package/src/backend/services/resolvers/php.js +89 -0
  262. package/src/backend/services/resolvers/python.js +154 -0
  263. package/src/backend/services/resolvers/ruby.js +103 -0
  264. package/src/backend/services/resolvers/rust.js +77 -0
  265. package/src/backend/services/resolvers/swift.js +98 -0
  266. package/src/backend/services/resolvers/typescript.js +71 -0
  267. package/src/backend/services/retention.js +54 -0
  268. package/src/backend/services/review-architecture.js +236 -0
  269. package/src/backend/services/review-attest.js +68 -0
  270. package/src/backend/services/review-bundle.js +226 -0
  271. package/src/backend/services/review-graduation.js +93 -0
  272. package/src/backend/services/review-host/bitbucket.js +79 -0
  273. package/src/backend/services/review-host/detect.js +80 -0
  274. package/src/backend/services/review-host/github.js +97 -0
  275. package/src/backend/services/review-host/gitlab.js +77 -0
  276. package/src/backend/services/review-host/host-state.js +103 -0
  277. package/src/backend/services/review-host/http.js +58 -0
  278. package/src/backend/services/review-host/switch.js +120 -0
  279. package/src/backend/services/review-marks.js +72 -0
  280. package/src/backend/services/review-notes.js +169 -0
  281. package/src/backend/services/review-other-work.js +90 -0
  282. package/src/backend/services/review-queue-service.js +147 -0
  283. package/src/backend/services/review-risk.js +127 -0
  284. package/src/backend/services/review-task.js +121 -0
  285. package/src/backend/services/rule-approvals.js +268 -0
  286. package/src/backend/services/rule-baseline.js +134 -0
  287. package/src/backend/services/rule-changes.js +162 -0
  288. package/src/backend/services/rule-preview.js +47 -0
  289. package/src/backend/services/rule-proposals.js +104 -0
  290. package/src/backend/services/rule-scope.js +76 -0
  291. package/src/backend/services/rulebook.js +286 -0
  292. package/src/backend/services/rules-at.js +56 -0
  293. package/src/backend/services/rules-overview.js +88 -0
  294. package/src/backend/services/schema-reconciler.js +250 -0
  295. package/src/backend/services/secret-store.js +119 -0
  296. package/src/backend/services/section-workstreams.js +95 -0
  297. package/src/backend/services/self-write-tracker.js +75 -0
  298. package/src/backend/services/sensor-bridge-service.js +285 -0
  299. package/src/backend/services/session-service.js +192 -0
  300. package/src/backend/services/settings-service.js +324 -0
  301. package/src/backend/services/signal-breakpoints.js +172 -0
  302. package/src/backend/services/signed-approval-record.js +86 -0
  303. package/src/backend/services/signed-approvals.js +244 -0
  304. package/src/backend/services/signoff-pack.js +328 -0
  305. package/src/backend/services/signoff-rows.js +114 -0
  306. package/src/backend/services/skill-arrival-service.js +138 -0
  307. package/src/backend/services/skill-model.js +193 -0
  308. package/src/backend/services/skill-use-service.js +140 -0
  309. package/src/backend/services/skills-service.js +150 -0
  310. package/src/backend/services/snapshot-compare-service.js +397 -0
  311. package/src/backend/services/source-control.js +189 -0
  312. package/src/backend/services/spec-links-service.js +123 -0
  313. package/src/backend/services/spec-proposal-withdraw.js +50 -0
  314. package/src/backend/services/spec-proposals-service.js +470 -0
  315. package/src/backend/services/sql/embedded.js +95 -0
  316. package/src/backend/services/sql/index.js +63 -0
  317. package/src/backend/services/sql/refs.js +357 -0
  318. package/src/backend/services/sql/schema.js +312 -0
  319. package/src/backend/services/sql/tokenizer.js +195 -0
  320. package/src/backend/services/stack-overlaps.js +117 -0
  321. package/src/backend/services/stack-service.js +225 -0
  322. package/src/backend/services/state-sync-service.js +384 -0
  323. package/src/backend/services/stuck-sensor-service.js +200 -0
  324. package/src/backend/services/system-discovery.js +481 -0
  325. package/src/backend/services/system-docs-service.js +701 -0
  326. package/src/backend/services/task-attachments-service.js +340 -0
  327. package/src/backend/services/task-grounding.js +60 -0
  328. package/src/backend/services/task-records/check-run-record.js +146 -0
  329. package/src/backend/services/task-records/check-runs.js +115 -0
  330. package/src/backend/services/task-records/heads.js +88 -0
  331. package/src/backend/services/task-records/material-reads.js +225 -0
  332. package/src/backend/services/task-records/read-record.js +100 -0
  333. package/src/backend/services/task-records/record.js +173 -0
  334. package/src/backend/services/task-records/run-record.js +136 -0
  335. package/src/backend/services/task-records/shared-state.js +548 -0
  336. package/src/backend/services/task-records/signing.js +140 -0
  337. package/src/backend/services/task-records/split-signals.js +52 -0
  338. package/src/backend/services/task-records/test-runs.js +164 -0
  339. package/src/backend/services/task-records/trust.js +243 -0
  340. package/src/backend/services/task-rules.js +81 -0
  341. package/src/backend/services/task-workstreams.js +90 -0
  342. package/src/backend/services/terminal-history-service.js +266 -0
  343. package/src/backend/services/terminal-service.js +267 -0
  344. package/src/backend/services/test-clock.js +53 -0
  345. package/src/backend/services/tests/grounding.js +266 -0
  346. package/src/backend/services/tests/junit.js +104 -0
  347. package/src/backend/services/tests/teammate-runs.js +134 -0
  348. package/src/backend/services/tests/test-results.js +234 -0
  349. package/src/backend/services/tree-watcher.js +204 -0
  350. package/src/backend/services/trellis-service.js +204 -0
  351. package/src/backend/services/trusted-roots.js +186 -0
  352. package/src/backend/services/update-download-service.js +342 -0
  353. package/src/backend/services/update-service.js +266 -0
  354. package/src/backend/services/watch-ignore.js +76 -0
  355. package/src/backend/services/webhook-egress.js +206 -0
  356. package/src/backend/services/webrtc-service.js +413 -0
  357. package/src/backend/services/work-changes.js +59 -0
  358. package/src/backend/services/workstream-binding.js +82 -0
  359. package/src/backend/services/workstream-commits.js +116 -0
  360. package/src/backend/services/workstream-imports.js +177 -0
  361. package/src/backend/services/workstream-service.js +335 -0
  362. package/src/backend/services/workstream-symbols.js +223 -0
  363. package/src/backend/services/workstream-watch-service.js +391 -0
  364. package/src/backend/services/worktree-service.js +235 -0
  365. package/src/cli/agent.js +100 -0
  366. package/src/cli/args.js +201 -0
  367. package/src/cli/conformity.js +106 -0
  368. package/src/cli/desktop.js +91 -0
  369. package/src/cli/main.js +409 -0
  370. package/src/cli/pipeline.js +109 -0
  371. package/src/cli/plan-verbs.js +259 -0
  372. package/src/cli/review-adapters.js +218 -0
  373. package/src/cli/review-output.js +93 -0
  374. package/src/cli/review-post.js +89 -0
  375. package/src/cli/review-sink.js +183 -0
  376. package/src/cli/review-skill.js +44 -0
  377. package/src/cli/review-verify.js +104 -0
  378. package/src/cli/review.js +386 -0
  379. package/src/cli/sarif.js +148 -0
  380. package/src/cli/verbs.js +359 -0
  381. package/src/shared/build-info.js +39 -0
  382. package/src/shared/lib/agent-review.js +199 -0
  383. package/src/shared/lib/agent-turns.js +140 -0
  384. package/src/shared/lib/awareness-digest.js +120 -0
  385. package/src/shared/lib/branch-name.js +45 -0
  386. package/src/shared/lib/breakpoint-words.js +118 -0
  387. package/src/shared/lib/budget-words.js +56 -0
  388. package/src/shared/lib/burst.js +69 -0
  389. package/src/shared/lib/call-entry.js +105 -0
  390. package/src/shared/lib/check-compare.js +42 -0
  391. package/src/shared/lib/check-words.js +216 -0
  392. package/src/shared/lib/csv.js +62 -0
  393. package/src/shared/lib/folder-entry.js +87 -0
  394. package/src/shared/lib/freeze-words.js +60 -0
  395. package/src/shared/lib/fuzzy.js +84 -0
  396. package/src/shared/lib/git-state-words.js +80 -0
  397. package/src/shared/lib/grep-entry.js +86 -0
  398. package/src/shared/lib/grounding-line.js +61 -0
  399. package/src/shared/lib/import-line.js +71 -0
  400. package/src/shared/lib/item-status.js +249 -0
  401. package/src/shared/lib/line-changes.js +53 -0
  402. package/src/shared/lib/locator.js +71 -0
  403. package/src/shared/lib/matcher.js +120 -0
  404. package/src/shared/lib/merge-order.js +65 -0
  405. package/src/shared/lib/open-findings.js +68 -0
  406. package/src/shared/lib/other-work.js +108 -0
  407. package/src/shared/lib/package-entry.js +142 -0
  408. package/src/shared/lib/plan-vocab.js +40 -0
  409. package/src/shared/lib/pptx-xml.js +86 -0
  410. package/src/shared/lib/proposal-words.js +61 -0
  411. package/src/shared/lib/recurrence.js +183 -0
  412. package/src/shared/lib/references.js +72 -0
  413. package/src/shared/lib/rule-pattern.js +56 -0
  414. package/src/shared/lib/sdp-fingerprint.js +115 -0
  415. package/src/shared/lib/sdp-minimal.js +123 -0
  416. package/src/shared/lib/secret-paths.js +34 -0
  417. package/src/shared/lib/signal-words.js +172 -0
  418. package/src/shared/lib/signoff.js +56 -0
  419. package/src/shared/lib/skills-note.js +60 -0
  420. package/src/shared/lib/spec-sections.js +78 -0
  421. package/src/shared/lib/symbol-entry.js +60 -0
  422. package/src/shared/lib/tool-phrasing.js +338 -0
  423. package/src/shared/lib/turn-gap.js +27 -0
  424. package/src/shared/lib/workstream-words.js +38 -0
  425. package/src/shared/lib/xlsx-xml.js +144 -0
  426. package/src/shared/lib/zip-reader.js +99 -0
  427. package/src/shared/types/agent.js +27 -0
  428. package/src/shared/types/architecture-rules.js +30 -0
  429. package/src/shared/types/ast.js +15 -0
  430. package/src/shared/types/breakpoint.js +33 -0
  431. package/src/shared/types/channel.js +41 -0
  432. package/src/shared/types/criteria.js +15 -0
  433. package/src/shared/types/graph.js +15 -0
  434. package/src/shared/types/index.js +53 -0
  435. package/src/shared/types/peer.js +36 -0
  436. package/src/shared/types/pipeline.js +15 -0
  437. package/src/shared/types/plan.js +15 -0
  438. package/src/shared/types/play-forward.js +15 -0
  439. package/src/shared/types/power.js +15 -0
  440. package/src/shared/types/presence.js +15 -0
  441. package/src/shared/types/project-config.js +35 -0
  442. package/src/shared/types/project.js +15 -0
  443. package/src/shared/types/record.js +15 -0
  444. package/src/shared/types/recurring.js +15 -0
  445. package/src/shared/types/review.js +15 -0
  446. package/src/shared/types/settings.js +114 -0
  447. package/src/shared/types/stack.js +15 -0
  448. package/src/shared/types/system-doc.js +15 -0
  449. 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,201 @@
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
+ });
37
+ module.exports = __toCommonJS(args_exports);
38
+ var import_node_path = __toESM(require("node:path"));
39
+ var import_node_crypto = __toESM(require("node:crypto"));
40
+ 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"]);
41
+ function parseArgs(argv) {
42
+ const flags = {};
43
+ const rest = [];
44
+ let command = null;
45
+ for (let i = 0; i < argv.length; i++) {
46
+ const a = argv[i];
47
+ if (a === "--") {
48
+ rest.push(...argv.slice(i + 1));
49
+ break;
50
+ }
51
+ if (a.startsWith("--")) {
52
+ const eq = a.indexOf("=");
53
+ const name = eq > 0 ? a.slice(2, eq) : a.slice(2);
54
+ if (eq > 0) flags[name] = a.slice(eq + 1);
55
+ else if (!SWITCHES.has(name) && i + 1 < argv.length && !argv[i + 1].startsWith("--")) flags[name] = argv[++i];
56
+ else flags[name] = true;
57
+ continue;
58
+ }
59
+ if (a === "-h") {
60
+ flags.help = true;
61
+ continue;
62
+ }
63
+ if (a === "-m" && i + 1 < argv.length) {
64
+ flags.m = argv[++i];
65
+ continue;
66
+ }
67
+ if (command === null) command = a;
68
+ else rest.push(a);
69
+ }
70
+ return { command, flags, rest };
71
+ }
72
+ function flag(p, name) {
73
+ const v = p.flags[name];
74
+ return typeof v === "string" ? v : void 0;
75
+ }
76
+ function headlessDataDir(projectRoot, env, home, platform = process.platform) {
77
+ const fromEnv = env.CODETRELLIS_DATA_DIR;
78
+ if (fromEnv && fromEnv.trim()) return fromEnv;
79
+ const resolved = import_node_path.default.resolve(projectRoot);
80
+ const id = import_node_crypto.default.createHash("sha256").update(resolved).digest("hex").slice(0, 10);
81
+ const name = import_node_path.default.basename(resolved).replace(/[^A-Za-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 40) || "project";
82
+ return import_node_path.default.join(headlessCacheRoot(env, home, platform), `${name}-${id}`);
83
+ }
84
+ function headlessCacheRoot(env, home, platform = process.platform) {
85
+ 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");
86
+ return import_node_path.default.join(cache, "codetrellis");
87
+ }
88
+ const quote = (s) => /^[A-Za-z0-9_./:=@-]+$/.test(s) ? s : `'${s.replace(/'/g, `'\\''`)}'`;
89
+ function connectorLine(nodePath, binPath, dataDir) {
90
+ const args = [binPath, "mcp", "--data-dir", dataDir];
91
+ return {
92
+ command: nodePath,
93
+ args,
94
+ claude: `claude mcp add codetrellis -- ${[nodePath, ...args].map(quote).join(" ")}`,
95
+ json: JSON.stringify({ mcpServers: { codetrellis: { command: nodePath, args } } })
96
+ };
97
+ }
98
+ const USAGE = `codetrellis \u2014 CodeTrellis for agents, without the desktop app
99
+
100
+ codetrellis serve [--project <dir>] [--data-dir <dir>] [--port <n>] [--mcp-port <n>] [--share-task-state] [--json]
101
+ Run the backend headless for a project: loopback only, the capability
102
+ token on every transport, no discovery, peers or update check. Prints
103
+ the line an agent's MCP config needs. --share-task-state writes task
104
+ state and test runs to the project's files and reads teammates', as the
105
+ app's Settings switch does.
106
+
107
+ codetrellis scan [--project <dir>] [--data-dir <dir>] [--json]
108
+ Scan a project once and print what was found, then exit.
109
+
110
+ codetrellis start [--project <dir>] [--data-dir <dir>] [--timeout <s>] [--share-task-state] [--quiet | --json]
111
+ serve in the background, unless it already runs for this folder; for a
112
+ session-start hook or a CI step. Its log is serve.log in the data dir.
113
+
114
+ codetrellis stop [--project <dir>] [--data-dir <dir>]
115
+
116
+ codetrellis mcp [--data-dir <dir>]
117
+ The stdio MCP connector an agent's config launches. Finds the headless
118
+ backend for the folder it is started in, else the desktop app's.
119
+
120
+ Keeping on track, as the agent running the command (--as <name> to say
121
+ which; text, or --json):
122
+
123
+ codetrellis next [--plan <uid>] the task to pick up
124
+ codetrellis claim <task> take it
125
+ codetrellis update <task> --progress N [--note <text>]
126
+ codetrellis stuck <task> <why\u2026> blocked, and why
127
+ codetrellis done <task> refused while a criterion's check fails
128
+ codetrellis request <question\u2026> [--options a,b] [--item <task>] [--no-wait] [--timeout <s>]
129
+ ask the person; waits for their answer
130
+ codetrellis brief <task> what the task needs
131
+ codetrellis awareness what overlaps your work
132
+ codetrellis check <path> before an edit: overlaps, and whether a breakpoint holds it
133
+ codetrellis check [--base <ref>] [--strict] does this work conform? exit 3 when a breakpoint holds a
134
+ changed file, its tests fail or are older than the code, a
135
+ done task fails its checks, a doc describing it is stale,
136
+ it adds an import a rule at block forbids, or it loosens a
137
+ rule; a rule at warn is said and passes (--strict: it fails)
138
+ codetrellis check --format sarif the same, as SARIF 2.1.0 for any CI host (or text, json, markdown)
139
+ codetrellis check --no-color plain text in a terminal too (NO_COLOR does the same)
140
+ codetrellis check --suite <s> | --rule <id> | --path <p> | --tag <t>
141
+ only those rules (comma-separated): one suite's, named
142
+ rules, the rules about a path, or those with a tag
143
+ codetrellis check --pipeline [--stage <id>] the base's .codetrellis/pipeline.yaml, stage by stage; agent
144
+ stages too with --agent and the review's flags
145
+ codetrellis rules baseline record each rule's breaches now; the check then fails on
146
+ any it does not list, and the file may only shrink
147
+ codetrellis report-tests <junit.xml> tell CodeTrellis how the tests went
148
+ codetrellis review [--agent claude-code] [--model <m>] [--endpoint <url>] [--auth env:<VAR>]
149
+ [--skills <dir>] [--suite <s> | --rule <id> | --path <p> | --tag <t>] [--base <ref>] [--task <uid>]
150
+ [--max-turns <n>] [--timeout <s>] [--max-tool-calls <n>] [--fail-on block,error] [--verify]
151
+ [--format text|markdown|sarif|json] [--sarif-out <f>] [--markdown-out <f>] [--post [--pr <n>]]
152
+ your own agent reviews the change, headless, with no shell,
153
+ files or web; each finding must cite the diff, and each pass
154
+ is kept as a check run. --verify: a second pass tries to refute
155
+ each finding. --auth oidc:bedrock|vertex|foundry signs in through
156
+ your cloud. --post comments on the pull request. Advisory: exit 3
157
+ only with --fail-on. A review of a commit is signed with this
158
+ device's key, as a git note on it
159
+ codetrellis review publish [--remote <r>] push the signed reviews, for CI to read
160
+ codetrellis review verify --base <ref> [--head <ref>] [--require] [--format text|markdown|sarif|json]
161
+ the head's signed review, checked against the keys on the base:
162
+ verified, stale (of an earlier commit), refused, or none; no
163
+ app, no secret, no AI. --require: exit 3 unless verified
164
+
165
+ The desktop app:
166
+
167
+ codetrellis desktop install [--version <v>] [--platform <p>] [--dir <d>] [--no-open] [--json]
168
+ download the app for this computer (or --platform:
169
+ darwin-arm64, darwin-x64, win32-x64, win32-arm64, linux-x64,
170
+ linux-arm64), check it against the release's signed
171
+ checksums, save it to --dir (default ~/Downloads) and open it
172
+ codetrellis desktop url [--version <v>] [--platform <p>] [--json]
173
+ the installer's download link, without downloading
174
+
175
+ codetrellis --version this CLI's version
176
+
177
+ Changing and committing the plan:
178
+
179
+ codetrellis plan show [--plan <uid>]
180
+ codetrellis plan add <title\u2026> [--under <task>] [--page] [--body <text>]
181
+ codetrellis plan edit <task> [--title <text>] [--body <text>]
182
+ codetrellis plan move <task> (--under <task> | --top) [--position N]
183
+ codetrellis commit [-m <subject>] commits only CodeTrellis's own files (.codetrellis/)
184
+ codetrellis status [--base <ref>] [--strict] plans, what is under way, blocked, and waiting on you,
185
+ and whether this work conforms (exit 3 when not)
186
+
187
+ <task> is a uid, or its first characters ("6cb8cf43", "task 6cb8cf43").
188
+ Exit codes: 0 done, 1 refused, 2 usage, 3 held, not answered yet, or not conforming.
189
+ This work is the branch since its base (--base, else the pull request's
190
+ base in GitHub Actions, else origin's default branch) and what is not
191
+ committed yet.
192
+ `;
193
+ // Annotate the CommonJS export names for ESM import in node:
194
+ 0 && (module.exports = {
195
+ USAGE,
196
+ connectorLine,
197
+ flag,
198
+ headlessCacheRoot,
199
+ headlessDataDir,
200
+ parseArgs
201
+ });
@@ -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
+ });