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,208 @@
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 item_git_state_exports = {};
19
+ __export(item_git_state_exports, {
20
+ branchGitState: () => branchGitState,
21
+ planGitStates: () => planGitStates,
22
+ planGitStatesFresh: () => planGitStatesFresh,
23
+ refreshPlanHostStates: () => refreshPlanHostStates
24
+ });
25
+ module.exports = __toCommonJS(item_git_state_exports);
26
+ var import_node_child_process = require("node:child_process");
27
+ var import_git_safety = require("./git-safety");
28
+ var import_branch_workstreams = require("./branch-workstreams");
29
+ var import_plan_service = require("./plan-service");
30
+ var import_plan_item_service = require("./plan-item-service");
31
+ var import_worktree_service = require("./worktree-service");
32
+ var import_trusted_roots = require("./trusted-roots");
33
+ var import_section_workstreams = require("./section-workstreams");
34
+ var import_git_state_words = require("../../shared/lib/git-state-words");
35
+ var import_host_state = require("./review-host/host-state");
36
+ const SHA = /^[0-9a-f]{40}$/;
37
+ const KEY_WINDOW_DAYS = 90;
38
+ function git(repo, args) {
39
+ return (0, import_node_child_process.execFileSync)("git", ["-C", repo, ...args], {
40
+ encoding: "utf-8",
41
+ stdio: ["ignore", "pipe", "ignore"],
42
+ timeout: 5e3,
43
+ maxBuffer: 16 * 1024 * 1024
44
+ });
45
+ }
46
+ function tryGit(repo, args) {
47
+ try {
48
+ return git(repo, args);
49
+ } catch {
50
+ return null;
51
+ }
52
+ }
53
+ const commitTime = (repo, sha) => Number(tryGit(repo, ["show", "-s", "--format=%ct", sha])?.trim()) || null;
54
+ const isAncestor = (repo, a, b) => tryGit(repo, ["merge-base", "--is-ancestor", a, b]) !== null;
55
+ function createdAt(repo, branch) {
56
+ const out = tryGit(repo, ["reflog", "show", "--format=%H", `refs/heads/${branch}`]);
57
+ const lines = out?.trim().split("\n").filter((l) => SHA.test(l)) ?? [];
58
+ return lines.length ? lines[lines.length - 1] : null;
59
+ }
60
+ function mergeCommitOf(repo, head, baseHead) {
61
+ const out = tryGit(repo, ["rev-list", "--merges", "--ancestry-path", "--parents", "--reverse", `${head}..${baseHead}`]);
62
+ for (const line of out?.trim().split("\n") ?? []) {
63
+ const [commit, , ...others] = line.split(" ");
64
+ if (others.includes(head)) return commit;
65
+ }
66
+ return null;
67
+ }
68
+ function lastTouch(repo, baseHead, path, sinceSec) {
69
+ const out = tryGit(repo, ["log", baseHead, `--since=@${Math.max(0, sinceSec)}`, "-1", "--format=%H", "--", path]);
70
+ const sha = out?.trim() ?? "";
71
+ return SHA.test(sha) ? sha : null;
72
+ }
73
+ function commitNaming(repo, baseHead, keys, sinceSec) {
74
+ const clean = keys.filter((k) => /^[A-Za-z0-9][A-Za-z0-9_.#-]{3,63}$/.test(k));
75
+ if (clean.length === 0) return null;
76
+ const args = ["log", baseHead, `--since=@${Math.max(0, sinceSec)}`, "--max-count=50", "--format=%H%x00%B%x1e", "-i", "-F"];
77
+ for (const k of clean) args.push(`--grep=${k}`);
78
+ const words = clean.map((k) => new RegExp(`(^|[^A-Za-z0-9_])${k.replace(/[.#-]/g, (c) => `\\${c}`)}($|[^A-Za-z0-9_])`, "i"));
79
+ for (const entry of (tryGit(repo, args) ?? "").split("")) {
80
+ const [sha, message = ""] = entry.replace(/^\s+/, "").split("\0");
81
+ if (SHA.test(sha) && words.some((w) => w.test(message))) return sha;
82
+ }
83
+ return null;
84
+ }
85
+ function refsOf(all, branch) {
86
+ const local = all.find((r) => r.ref === `refs/heads/${branch}`) ?? null;
87
+ const remote = all.find((r) => r.ref.startsWith("refs/remotes/") && !r.ref.endsWith("/HEAD") && r.short.split("/").slice(1).join("/") === branch) ?? null;
88
+ return { local, remote };
89
+ }
90
+ function baseHeads(all, base) {
91
+ const { local, remote } = refsOf(all, base);
92
+ return [...new Set([local?.head, remote?.head].filter((h) => !!h && SHA.test(h)))];
93
+ }
94
+ function mergedInto(repo, branch, head, headTime, bases) {
95
+ for (const baseHead of bases) {
96
+ if (isAncestor(repo, head, baseHead)) {
97
+ const merge = head !== baseHead ? mergeCommitOf(repo, head, baseHead) : null;
98
+ if (merge) return { commit: merge, how: "merge" };
99
+ const made = createdAt(repo, branch);
100
+ if (made ? made !== head : head !== baseHead) return { commit: head, how: "fast-forward" };
101
+ continue;
102
+ }
103
+ const since = headTime - 86400;
104
+ const versions = (0, import_branch_workstreams.branchVersions)(repo, baseHead, head);
105
+ if ((0, import_branch_workstreams.isMergedInto)(versions, (0, import_branch_workstreams.mainVersionsSince)(repo, baseHead, since))) {
106
+ return { commit: lastTouch(repo, baseHead, versions[0].path, since) ?? baseHead, how: "squash-or-rebase" };
107
+ }
108
+ }
109
+ return null;
110
+ }
111
+ function branchGitState(repo, branch, base, keys, opts = {}) {
112
+ const out = { state: "none", source: "git", branch, base, commit: null, at: null };
113
+ if (!(0, import_git_safety.isSafeGitRef)(branch)) return out;
114
+ const all = opts.refs ?? (0, import_branch_workstreams.listBranchRefs)(repo);
115
+ const { local, remote } = refsOf(all, branch);
116
+ const bases = base && (0, import_git_safety.isSafeGitRef)(base) ? baseHeads(all, base) : [];
117
+ const head = local?.head ?? remote?.head ?? null;
118
+ if (!head) {
119
+ const since = (opts.nowSec ?? Math.floor(Date.now() / 1e3)) - KEY_WINDOW_DAYS * 86400;
120
+ for (const baseHead of bases) {
121
+ const named = commitNaming(repo, baseHead, keys, since);
122
+ if (named) return { ...out, state: "merged", commit: named, at: commitTime(repo, named), how: "names-key" };
123
+ }
124
+ return out;
125
+ }
126
+ const headTime = (local ?? remote).committedAt || commitTime(repo, head) || 0;
127
+ const merged = bases.length ? mergedInto(repo, branch, head, headTime, bases) : null;
128
+ if (merged) return { ...out, state: "merged", commit: merged.commit, at: commitTime(repo, merged.commit), how: merged.how };
129
+ if (remote) {
130
+ const unpushed = local && local.head !== remote.head ? Number(tryGit(repo, ["rev-list", "--count", `${remote.head}..${local.head}`])?.trim()) || 0 : 0;
131
+ return {
132
+ ...out,
133
+ state: "pushed",
134
+ commit: remote.head,
135
+ at: remote.committedAt || null,
136
+ remote: remote.short.split("/")[0],
137
+ ...unpushed ? { unpushed } : {}
138
+ };
139
+ }
140
+ return { ...out, state: "building", commit: head, at: headTime || null };
141
+ }
142
+ function planGitStates(planUid, opts = {}) {
143
+ const plan = (0, import_plan_service.getPlan)(planUid);
144
+ if (!plan) return null;
145
+ let root;
146
+ try {
147
+ root = (0, import_trusted_roots.resolveTrustedProjectRoot)(plan.projectPath, "plan git state");
148
+ } catch {
149
+ return { base: null, items: [] };
150
+ }
151
+ let repo = root;
152
+ let mainBranch = null;
153
+ try {
154
+ const main = (0, import_worktree_service.listWorktrees)(root).find((w) => w.isMain);
155
+ if (main) {
156
+ repo = main.path;
157
+ mainBranch = main.branch;
158
+ }
159
+ } catch {
160
+ }
161
+ const base = (0, import_section_workstreams.usableBase)(plan.baseRef) ?? mainBranch;
162
+ const refs = (0, import_branch_workstreams.listBranchRefs)(repo);
163
+ const seen = /* @__PURE__ */ new Map();
164
+ const items = [];
165
+ for (const item of (0, import_plan_item_service.listAllItems)(planUid)) {
166
+ const section = (0, import_section_workstreams.resolveSection)(item, import_plan_item_service.getItem);
167
+ if (!section) continue;
168
+ const keys = [.../* @__PURE__ */ new Set([item.uid.slice(0, 8), section.fromUid.slice(0, 8)])];
169
+ const k = `${section.branch}\0${keys.join("\0")}`;
170
+ const git2 = seen.get(k) ?? branchGitState(repo, section.branch, base, keys, { refs, nowSec: opts.nowSec });
171
+ seen.set(k, git2);
172
+ const state = (0, import_host_state.overlayHost)(git2, (0, import_host_state.cachedHostRead)(root, section.branch));
173
+ items.push({ ...state, itemUid: item.uid, fromUid: section.fromUid, words: (0, import_git_state_words.gitStateWords)(state) });
174
+ }
175
+ return { base, items };
176
+ }
177
+ function planBranches(planUid) {
178
+ const plan = (0, import_plan_service.getPlan)(planUid);
179
+ if (!plan) return null;
180
+ let root;
181
+ try {
182
+ root = (0, import_trusted_roots.resolveTrustedProjectRoot)(plan.projectPath, "plan git state");
183
+ } catch {
184
+ return null;
185
+ }
186
+ const branches = /* @__PURE__ */ new Set();
187
+ for (const item of (0, import_plan_item_service.listAllItems)(planUid)) {
188
+ const section = (0, import_section_workstreams.resolveSection)(item, import_plan_item_service.getItem);
189
+ if (section && (0, import_git_safety.isSafeGitRef)(section.branch)) branches.add(section.branch);
190
+ }
191
+ return { root, branches: [...branches] };
192
+ }
193
+ async function planGitStatesFresh(planUid, opts = {}) {
194
+ const b = planBranches(planUid);
195
+ if (b && b.branches.length) await (0, import_host_state.refreshHostReads)(b.root, b.branches);
196
+ return planGitStates(planUid, opts);
197
+ }
198
+ function refreshPlanHostStates(planUid) {
199
+ const b = planBranches(planUid);
200
+ if (b && b.branches.length) void (0, import_host_state.refreshHostReads)(b.root, b.branches);
201
+ }
202
+ // Annotate the CommonJS export names for ESM import in node:
203
+ 0 && (module.exports = {
204
+ branchGitState,
205
+ planGitStates,
206
+ planGitStatesFresh,
207
+ refreshPlanHostStates
208
+ });
@@ -0,0 +1,232 @@
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 line_changes_exports = {};
29
+ __export(line_changes_exports, {
30
+ MAX_DIFF_CHARS: () => MAX_DIFF_CHARS,
31
+ MAX_FILE_BYTES: () => MAX_FILE_BYTES,
32
+ cleanRelPath: () => cleanRelPath,
33
+ countLines: () => countLines,
34
+ functionsIn: () => functionsIn,
35
+ isBinaryDiff: () => isBinaryDiff,
36
+ lineChangesFor: () => lineChangesFor,
37
+ lineChangesOf: () => lineChangesOf,
38
+ parseHunkHeaders: () => parseHunkHeaders,
39
+ readWorkstreamCopy: () => readWorkstreamCopy,
40
+ symbolRanges: () => symbolRanges,
41
+ toHunks: () => toHunks
42
+ });
43
+ module.exports = __toCommonJS(line_changes_exports);
44
+ var import_node_child_process = require("node:child_process");
45
+ var import_node_fs = __toESM(require("node:fs"));
46
+ var import_node_path = __toESM(require("node:path"));
47
+ var import_confined_fs = require("./confined-fs");
48
+ var import_git_safety = require("./git-safety");
49
+ var import_branch_workstreams = require("./branch-workstreams");
50
+ const MAX_FILE_BYTES = 1e6;
51
+ const MAX_DIFF_CHARS = 2e4;
52
+ const SHA = /^[0-9a-f]{40}$/;
53
+ const EMPTY_TREE = "4b825dc642cb6eb9a060e54bf8d69288fbee4904";
54
+ function parseHunkHeaders(diff) {
55
+ const out = [];
56
+ for (const m of diff.matchAll(/^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/gm)) {
57
+ out.push({
58
+ oldStart: Number(m[1]),
59
+ oldLines: m[2] === void 0 ? 1 : Number(m[2]),
60
+ newStart: Number(m[3]),
61
+ newLines: m[4] === void 0 ? 1 : Number(m[4])
62
+ });
63
+ }
64
+ return out;
65
+ }
66
+ function isBinaryDiff(diff) {
67
+ return /^Binary files .* differ$/m.test(diff) || /^GIT binary patch$/m.test(diff);
68
+ }
69
+ const QUALIFIED = /[.#)]/;
70
+ function symbolRanges(symbols) {
71
+ const out = [];
72
+ const visit = (list, parent) => {
73
+ for (const s of list) {
74
+ const name = parent && !QUALIFIED.test(s.name) ? `${parent}.${s.name}` : s.name;
75
+ out.push({ name, start: s.startLine, end: s.endLine });
76
+ if (s.children.length) visit(s.children, name);
77
+ }
78
+ };
79
+ visit(symbols, null);
80
+ return out;
81
+ }
82
+ function functionsIn(ranges, start, end) {
83
+ const hit = ranges.filter((r) => r.start <= end && r.end >= start);
84
+ const inner = hit.filter((r) => !hit.some((o) => o !== r && o.start >= r.start && o.end <= r.end && (o.start > r.start || o.end < r.end)));
85
+ return [...new Set(inner.sort((a, b) => a.start - b.start).map((r) => r.name))];
86
+ }
87
+ function newSpan(h) {
88
+ return h.newLines > 0 ? [h.newStart, h.newStart + h.newLines - 1] : [h.newStart, h.newStart + 1];
89
+ }
90
+ function toHunks(whole, uncommitted, placeNew, placeOld) {
91
+ return whole.map((h) => {
92
+ const kind = h.oldLines === 0 ? "added" : h.newLines === 0 ? "removed" : "changed";
93
+ const [a, b] = newSpan(h);
94
+ const committed = uncommitted === "all" ? false : uncommitted === "none" ? true : !uncommitted.some((u) => {
95
+ const [c, d] = newSpan(u);
96
+ return c <= b && d >= a;
97
+ });
98
+ const functions = kind === "removed" ? placeOld(h.oldStart, h.oldStart + h.oldLines - 1) : placeNew(h.newStart, h.newStart + h.newLines - 1);
99
+ return { kind, old: { start: h.oldStart, lines: h.oldLines }, new: { start: h.newStart, lines: h.newLines }, functions, committed };
100
+ });
101
+ }
102
+ function countLines(hunks) {
103
+ return hunks.reduce((n, h) => ({ added: n.added + h.new.lines, removed: n.removed + h.old.lines }), { added: 0, removed: 0 });
104
+ }
105
+ function cleanRelPath(raw) {
106
+ if (typeof raw !== "string") return null;
107
+ const p = raw.trim().replace(/\\/g, "/").replace(/^(\.\/)+/, "");
108
+ if (!p || p.length > 300 || p.includes("\0") || p.startsWith("/") || p.startsWith("-") || /^[A-Za-z]:/.test(p)) return null;
109
+ if (p.split("/").some((seg) => seg === ".." || seg === "")) return null;
110
+ return p;
111
+ }
112
+ function git(folder, args) {
113
+ try {
114
+ return (0, import_node_child_process.execFileSync)("git", ["-C", folder, ...args], {
115
+ encoding: "utf-8",
116
+ stdio: ["ignore", "pipe", "ignore"],
117
+ timeout: 5e3,
118
+ maxBuffer: 8 * 1024 * 1024
119
+ });
120
+ } catch {
121
+ return null;
122
+ }
123
+ }
124
+ const DIFF = ["diff", "--no-color", "--no-ext-diff", "--no-renames"];
125
+ function placer(parse, file, text) {
126
+ if (!parse || text === null) return () => [];
127
+ let ranges = [];
128
+ try {
129
+ ranges = symbolRanges(parse(file, text) ?? []);
130
+ } catch {
131
+ }
132
+ return (s, e) => functionsIn(ranges, s, e);
133
+ }
134
+ const lineCount = (text) => text === "" ? 0 : text.split("\n").length - (text.endsWith("\n") ? 1 : 0);
135
+ function lineChangesOf(w, repo, rel, parse, opts = {}) {
136
+ (0, import_git_safety.assertSafeGitPathArg)(rel, "line changes");
137
+ const out = { workstream: w.root, branch: w.branch, path: rel, status: "unchanged", hunks: [], added: 0, removed: 0 };
138
+ const base = w.changes?.base && SHA.test(w.changes.base) ? w.changes.base : EMPTY_TREE;
139
+ const isBranch = w.root.startsWith("branch:");
140
+ const folder = isBranch ? repo : w.root;
141
+ let current;
142
+ let range;
143
+ let uncommitted = "none";
144
+ if (isBranch) {
145
+ const head = w.head && SHA.test(w.head) ? w.head : null;
146
+ if (!head) return out;
147
+ current = (0, import_branch_workstreams.showAt)(repo, head, rel);
148
+ range = [base, head];
149
+ } else {
150
+ let size = -1;
151
+ try {
152
+ const abs = (0, import_confined_fs.resolveWithin)(folder, rel, "line changes");
153
+ size = import_node_fs.default.existsSync(abs) ? import_node_fs.default.statSync(abs).size : -1;
154
+ } catch {
155
+ return { ...out, status: "unreadable" };
156
+ }
157
+ if (size > MAX_FILE_BYTES) return { ...out, status: "too-large" };
158
+ try {
159
+ const buf = size < 0 ? null : (0, import_confined_fs.readFileWithin)(folder, rel, "line changes");
160
+ if (buf && buf.includes(0)) return { ...out, status: "binary" };
161
+ current = buf ? buf.toString("utf-8") : null;
162
+ } catch {
163
+ return { ...out, status: "unreadable" };
164
+ }
165
+ range = [base];
166
+ }
167
+ const baseText = base === EMPTY_TREE ? null : (0, import_branch_workstreams.showAt)(folder, base, rel);
168
+ if ((baseText?.length ?? 0) > MAX_FILE_BYTES) return { ...out, status: "too-large" };
169
+ let whole = git(folder, [...DIFF, "-U0", ...range, "--", rel]) ?? "";
170
+ if (isBinaryDiff(whole)) return { ...out, status: "binary" };
171
+ let hunks = parseHunkHeaders(whole);
172
+ if (!isBranch) {
173
+ const tracked = git(folder, ["ls-files", "--error-unmatch", "--", rel]) !== null;
174
+ if (!tracked && current !== null) {
175
+ const n = lineCount(current);
176
+ hunks = baseText === null && n > 0 ? [{ oldStart: 0, oldLines: 0, newStart: 1, newLines: n }] : hunks;
177
+ uncommitted = "all";
178
+ whole = "";
179
+ } else {
180
+ uncommitted = parseHunkHeaders(git(folder, [...DIFF, "-U0", "HEAD", "--", rel]) ?? "");
181
+ }
182
+ }
183
+ if (!hunks.length) return out;
184
+ const file = import_node_path.default.join(folder, rel);
185
+ const lineHunks = toHunks(hunks, uncommitted, placer(parse, file, current), placer(parse, file, baseText));
186
+ const counts = countLines(lineHunks);
187
+ const result = { ...out, status: "changed", hunks: lineHunks, ...counts };
188
+ if (opts.diff) {
189
+ const text = uncommitted === "all" && current !== null ? `new file, not tracked by git yet
190
+ ${current.split("\n").map((l) => `+${l}`).join("\n")}` : git(folder, [...DIFF, "-U3", ...range, "--", rel]) ?? "";
191
+ result.diff = text.slice(0, MAX_DIFF_CHARS);
192
+ if (text.length > MAX_DIFF_CHARS) result.diffTruncated = true;
193
+ }
194
+ return result;
195
+ }
196
+ function lineChangesFor(workstreams, rel, parse, opts = {}) {
197
+ const main = workstreams.find((w) => w.main);
198
+ const repo = main?.root ?? workstreams.find((w) => !w.root.startsWith("branch:"))?.root;
199
+ if (!repo) return [];
200
+ const chosen = opts.workstream ? workstreams.filter((w) => w.root === opts.workstream || w.branch === opts.workstream).slice(0, 1) : workstreams.filter((w) => w.changes.files.some((f) => f.path === rel) && !opts.exclude?.(w));
201
+ return chosen.map((w) => lineChangesOf(w, repo, rel, parse, { diff: opts.diff }));
202
+ }
203
+ function readWorkstreamCopy(workstreams, id, rel) {
204
+ const w = workstreams.find((x) => x.root === id) ?? workstreams.find((x) => x.branch === id);
205
+ if (!w) return null;
206
+ const label = w.branch ?? import_node_path.default.basename(w.root);
207
+ if (w.root.startsWith("branch:")) {
208
+ const repo = workstreams.find((x) => x.main)?.root;
209
+ const head = w.head && SHA.test(w.head) ? w.head : null;
210
+ (0, import_git_safety.assertSafeGitPathArg)(rel, "workstream copy");
211
+ return { content: repo && head ? (0, import_branch_workstreams.showAt)(repo, head, rel) : null, label };
212
+ }
213
+ const abs = (0, import_confined_fs.resolveWithin)(w.root, rel, "workstream copy");
214
+ if (!import_node_fs.default.existsSync(abs)) return { content: null, label };
215
+ if (import_node_fs.default.statSync(abs).size > MAX_FILE_BYTES) throw new Error(`${label}'s copy of ${rel} is too large to compare`);
216
+ return { content: (0, import_confined_fs.readFileWithin)(w.root, rel, "workstream copy").toString("utf-8"), label };
217
+ }
218
+ // Annotate the CommonJS export names for ESM import in node:
219
+ 0 && (module.exports = {
220
+ MAX_DIFF_CHARS,
221
+ MAX_FILE_BYTES,
222
+ cleanRelPath,
223
+ countLines,
224
+ functionsIn,
225
+ isBinaryDiff,
226
+ lineChangesFor,
227
+ lineChangesOf,
228
+ parseHunkHeaders,
229
+ readWorkstreamCopy,
230
+ symbolRanges,
231
+ toHunks
232
+ });
@@ -0,0 +1,174 @@
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 line_history_exports = {};
19
+ __export(line_history_exports, {
20
+ LineHistoryError: () => LineHistoryError,
21
+ hunksOf: () => hunksOf,
22
+ lineHistory: () => lineHistory,
23
+ lineWords: () => lineWords,
24
+ parseBlame: () => parseBlame
25
+ });
26
+ module.exports = __toCommonJS(line_history_exports);
27
+ var import_node_child_process = require("node:child_process");
28
+ var import_git_safety = require("./git-safety");
29
+ var import_git_refs = require("./git-refs");
30
+ var import_source_control = require("./source-control");
31
+ var import_commit_attribution = require("./commit-attribution");
32
+ const SHA = /^[0-9a-f]{40,64}$/;
33
+ const UNCOMMITTED = /^0+$/;
34
+ const MAX_LINES = 2e4;
35
+ class LineHistoryError extends Error {
36
+ }
37
+ function parseBlame(out) {
38
+ const lines = [];
39
+ const info = /* @__PURE__ */ new Map();
40
+ let current = null;
41
+ for (const raw of out.split("\n")) {
42
+ if (raw.startsWith(" ")) {
43
+ if (current) lines.push(current);
44
+ continue;
45
+ }
46
+ const head = raw.match(/^([0-9a-f]{40,64}) \d+ (\d+)/);
47
+ if (head) {
48
+ current = head[1];
49
+ if (!info.has(current)) info.set(current, { author: "", email: "", at: 0, summary: "" });
50
+ continue;
51
+ }
52
+ if (!current) continue;
53
+ const entry = info.get(current);
54
+ const sp = raw.indexOf(" ");
55
+ const key = sp < 0 ? raw : raw.slice(0, sp);
56
+ const value = sp < 0 ? "" : raw.slice(sp + 1);
57
+ if (key === "author") entry.author = value;
58
+ else if (key === "author-mail") entry.email = value.replace(/^<|>$/g, "");
59
+ else if (key === "author-time") entry.at = Number(value) * 1e3;
60
+ else if (key === "summary") entry.summary = value;
61
+ }
62
+ return { lines, info };
63
+ }
64
+ function hunksOf(lines) {
65
+ const hunks = [];
66
+ lines.forEach((sha, i) => {
67
+ const s = UNCOMMITTED.test(sha) ? null : sha;
68
+ const last = hunks[hunks.length - 1];
69
+ if (last && last.sha === s) last.end = i + 1;
70
+ else hunks.push({ start: i + 1, end: i + 1, sha: s });
71
+ });
72
+ return hunks;
73
+ }
74
+ function blameTarget(projectRoot, spec, relativePath, workstreams) {
75
+ if (spec === "live") return { cwd: projectRoot, rev: null, file: relativePath, checkout: projectRoot, name: "" };
76
+ if (spec.startsWith("commit:")) {
77
+ const ref = spec.slice("commit:".length);
78
+ if (!(0, import_git_safety.isSafeGitRef)(ref)) throw new LineHistoryError(`\u201C${ref}\u201D is not a ref this app passes to git.`);
79
+ return { cwd: projectRoot, rev: ref, file: relativePath, checkout: null, name: (0, import_git_refs.shortRefName)(ref) };
80
+ }
81
+ const mb = (0, import_git_refs.parseMergeBase)(spec);
82
+ if (mb) {
83
+ const sha = (0, import_git_refs.mergeBase)(projectRoot, mb.a, mb.b);
84
+ if (!sha) throw new LineHistoryError(`${(0, import_git_refs.shortRefName)(mb.a)} and ${(0, import_git_refs.shortRefName)(mb.b)} share no history here.`);
85
+ return { cwd: projectRoot, rev: sha, file: relativePath, checkout: null, name: sha.slice(0, 7) };
86
+ }
87
+ if (spec.startsWith("workstream:")) {
88
+ const w = (0, import_git_refs.findWorkstream)(workstreams, spec.slice("workstream:".length));
89
+ if (!w) throw new LineHistoryError("No such worktree in this project.");
90
+ if (w.root.startsWith("branch:")) {
91
+ if (!w.head || !SHA.test(w.head)) throw new LineHistoryError("That branch has no commit here.");
92
+ return { cwd: projectRoot, rev: w.head, file: relativePath, checkout: null, name: w.branch ?? w.head.slice(0, 7) };
93
+ }
94
+ return { cwd: w.root, rev: null, file: `${(0, import_source_control.projectPrefix)(projectRoot)}${relativePath}`, checkout: w.root, name: "" };
95
+ }
96
+ throw new LineHistoryError("Line history reads a commit, a branch, a tag or a working copy.");
97
+ }
98
+ function bodiesOf(cwd, shas) {
99
+ const out = /* @__PURE__ */ new Map();
100
+ for (let i = 0; i < shas.length; i += 200) {
101
+ const batch = shas.slice(i, i + 200);
102
+ try {
103
+ const raw = (0, import_node_child_process.execFileSync)("git", ["show", "-s", "--format=%x1e%H%x1f%B", ...batch], { cwd, encoding: "utf-8", maxBuffer: 32 * 1024 * 1024, stdio: ["ignore", "pipe", "ignore"] });
104
+ for (const chunk of raw.split("")) {
105
+ const [sha, body = ""] = chunk.split("");
106
+ if (sha && SHA.test(sha.trim())) out.set(sha.trim(), body);
107
+ }
108
+ } catch {
109
+ }
110
+ }
111
+ return out;
112
+ }
113
+ function lineHistory(projectRoot, spec, relativePath, workstreams, know = import_commit_attribution.NO_KNOWLEDGE) {
114
+ const t = blameTarget(projectRoot, spec, relativePath, workstreams);
115
+ let out;
116
+ try {
117
+ out = (0, import_node_child_process.execFileSync)("git", ["blame", "--porcelain", ...t.rev ? [t.rev] : [], "--", t.file], {
118
+ cwd: t.cwd,
119
+ encoding: "utf-8",
120
+ maxBuffer: 64 * 1024 * 1024,
121
+ stdio: ["ignore", "pipe", "ignore"]
122
+ });
123
+ } catch {
124
+ throw new LineHistoryError(`git has no history for ${relativePath} here: it is new, or not in this repository.`);
125
+ }
126
+ const { lines, info } = parseBlame(out);
127
+ if (lines.length > MAX_LINES) throw new LineHistoryError(`${relativePath} has ${lines.length} lines; line history reads up to ${MAX_LINES}.`);
128
+ const shas = [...info.keys()].filter((s) => !UNCOMMITTED.test(s));
129
+ const bodies = bodiesOf(t.cwd, shas);
130
+ const attributed = (0, import_commit_attribution.attributeCommits)(shas.map((sha) => ({ sha, at: info.get(sha).at, body: bodies.get(sha) ?? "" })), t.checkout, know);
131
+ const commits = {};
132
+ for (const sha of shas) {
133
+ const i = info.get(sha);
134
+ commits[sha] = { sha, short: sha.slice(0, 7), author: i.author, email: i.email, at: i.at, subject: i.summary, attribution: attributed.get(sha) ?? null };
135
+ }
136
+ return {
137
+ at: spec,
138
+ path: relativePath,
139
+ lineCount: lines.length,
140
+ hunks: hunksOf(lines),
141
+ commits,
142
+ uncommitted: lines.filter((s) => UNCOMMITTED.test(s)).length,
143
+ command: t.cwd === projectRoot ? `git blame ${t.rev ? `${t.name} ` : ""}-- ${relativePath}` : `git -C ${t.cwd} blame -- ${t.file}`
144
+ };
145
+ }
146
+ const ago = (ms, now) => {
147
+ const days = Math.round((now - ms) / 864e5);
148
+ if (days < 1) {
149
+ const hours = Math.round((now - ms) / 36e5);
150
+ return hours < 1 ? "just now" : `${hours} h ago`;
151
+ }
152
+ return days === 1 ? "yesterday" : `${days} days ago`;
153
+ };
154
+ function lineWords(h, line, now = Date.now()) {
155
+ const hunk = h.hunks.find((x) => line >= x.start && line <= x.end);
156
+ if (!hunk) return `Line ${line} is not in ${h.path} (it has ${h.lineCount} lines).`;
157
+ if (!hunk.sha) return `Line ${line} is changed in the working copy and not yet committed.`;
158
+ const c = h.commits[hunk.sha];
159
+ const parts = [`Line ${line}: ${c.author} \xB7 ${ago(c.at, now)} \xB7 \u201C${c.subject}\u201D (${c.short})`];
160
+ if (c.attribution) {
161
+ parts.push(c.attribution.words);
162
+ if (c.attribution.sessionId) parts.push(`session ${c.attribution.sessionId}`);
163
+ if (c.attribution.task) parts.push(`task \u201C${c.attribution.task.title}\u201D${c.attribution.plan ? ` in the plan \u201C${c.attribution.plan.title}\u201D` : ""}`);
164
+ }
165
+ return `${parts.join("; ")}.`;
166
+ }
167
+ // Annotate the CommonJS export names for ESM import in node:
168
+ 0 && (module.exports = {
169
+ LineHistoryError,
170
+ hunksOf,
171
+ lineHistory,
172
+ lineWords,
173
+ parseBlame
174
+ });
@@ -0,0 +1,40 @@
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 local_api_changes_exports = {};
19
+ __export(local_api_changes_exports, {
20
+ LOCAL_API_CHANGES_REFUSAL: () => LOCAL_API_CHANGES_REFUSAL,
21
+ LOCAL_API_CHANGES_WHERE: () => LOCAL_API_CHANGES_WHERE,
22
+ refusesLocalApiChange: () => refusesLocalApiChange
23
+ });
24
+ module.exports = __toCommonJS(local_api_changes_exports);
25
+ const READS = /* @__PURE__ */ new Set(["GET", "HEAD", "OPTIONS"]);
26
+ const LOCAL_API_CHANGES_WHERE = "Settings \u2192 MCP Server \u2192 Local API";
27
+ const LOCAL_API_CHANGES_REFUSAL = `Changes over the local API are turned off. Turn them back on in the CodeTrellis app, ${LOCAL_API_CHANGES_WHERE}.`;
28
+ function refusesLocalApiChange(req, accept, testSettingsPath = false) {
29
+ if (accept !== false) return false;
30
+ if (req.fromAppWindow || READS.has(req.method.toUpperCase())) return false;
31
+ if (!req.path.startsWith("/api/")) return false;
32
+ if (testSettingsPath && req.path === "/api/settings") return false;
33
+ return true;
34
+ }
35
+ // Annotate the CommonJS export names for ESM import in node:
36
+ 0 && (module.exports = {
37
+ LOCAL_API_CHANGES_REFUSAL,
38
+ LOCAL_API_CHANGES_WHERE,
39
+ refusesLocalApiChange
40
+ });