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,53 @@
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 test_clock_exports = {};
19
+ __export(test_clock_exports, {
20
+ clockOffsetMs: () => clockOffsetMs,
21
+ moveClock: () => moveClock
22
+ });
23
+ module.exports = __toCommonJS(test_clock_exports);
24
+ function clockOffsetMs(env = process.env) {
25
+ const raw = env.CODETRELLIS_CLOCK_OFFSET_MS;
26
+ if (!raw || !/^-?\d+$/.test(raw)) return 0;
27
+ return Number(raw);
28
+ }
29
+ function moveClock(offset) {
30
+ if (!offset) return () => {
31
+ };
32
+ const RealDate = Date;
33
+ const realNow = RealDate.now.bind(RealDate);
34
+ class MovedDate extends RealDate {
35
+ constructor(...args) {
36
+ if (args.length === 0) super(realNow() + offset);
37
+ else super(...args);
38
+ }
39
+ static now() {
40
+ return realNow() + offset;
41
+ }
42
+ }
43
+ globalThis.Date = MovedDate;
44
+ return () => {
45
+ globalThis.Date = RealDate;
46
+ };
47
+ }
48
+ moveClock(clockOffsetMs());
49
+ // Annotate the CommonJS export names for ESM import in node:
50
+ 0 && (module.exports = {
51
+ clockOffsetMs,
52
+ moveClock
53
+ });
@@ -0,0 +1,266 @@
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 grounding_exports = {};
29
+ __export(grounding_exports, {
30
+ NotAFileError: () => NotAFileError,
31
+ groundingMap: () => groundingMap,
32
+ groundingMapAt: () => groundingMapAt,
33
+ groundingOf: () => groundingOf,
34
+ groundingWords: () => groundingWords,
35
+ testFileOf: () => testFileOf,
36
+ wordsOf: () => wordsOf
37
+ });
38
+ module.exports = __toCommonJS(grounding_exports);
39
+ var import_node_fs = __toESM(require("node:fs"));
40
+ var import_node_path = __toESM(require("node:path"));
41
+ var import_importers = require("../importers");
42
+ var import_database = require("../database");
43
+ var import_confined_fs = require("../confined-fs");
44
+ var import_trusted_roots = require("../trusted-roots");
45
+ var import_test_results = require("./test-results");
46
+ var import_replay_frames = require("../replay-frames");
47
+ var import_trellis_service = require("../trellis-service");
48
+ var import_teammate_runs = require("./teammate-runs");
49
+ class NotAFileError extends Error {
50
+ }
51
+ const SLACK_MS = 2e3;
52
+ const looksLikeFile = (s) => !!s && (/[\\/]/.test(s) || /\.[a-z]{1,5}$/i.test(s));
53
+ function testFileOf(root, t) {
54
+ const raw = [t.file, t.classname, t.suite].find(looksLikeFile);
55
+ if (!raw) return null;
56
+ const abs = import_node_path.default.isAbsolute(raw) ? raw : import_node_path.default.join(root, raw);
57
+ const rel = (0, import_trusted_roots.projectRelative)(root, abs);
58
+ return rel.startsWith("..") || import_node_path.default.isAbsolute(rel) ? null : rel.split(import_node_path.default.sep).join("/");
59
+ }
60
+ const plural = (n, word) => `${n} ${word}${n === 1 ? "" : "s"}`;
61
+ function groundingWords(tests, lastRunAt, changedAt) {
62
+ return wordsOf(tests, changedAt !== null && lastRunAt !== null && changedAt > lastRunAt + SLACK_MS);
63
+ }
64
+ function wordsOf(tests, stale) {
65
+ const n = (t) => t.count ?? 1;
66
+ const total = tests.reduce((a, t) => a + n(t), 0);
67
+ if (total === 0) return { state: "untested", words: "\u25CB no tests: no test with a reported result imports it" };
68
+ const failing = tests.filter((t) => t.result === "failed" || t.result === "error").reduce((a, t) => a + n(t), 0);
69
+ const ran = tests.filter((t) => t.result !== "skipped").reduce((a, t) => a + n(t), 0);
70
+ if (failing) return { state: "failing", words: `\u2717 ${failing} of ${plural(total, "test")} failing${stale ? ", and it changed after they ran" : ""}` };
71
+ if (stale) return { state: "stale", words: `\u26A0 tests older than the code: it changed after its ${plural(total, "test")} last ran` };
72
+ if (ran === 0) return { state: "untested", words: `\u25CB ${plural(total, "test")}, all skipped` };
73
+ return { state: "passing", words: `\u2713 ${plural(ran, "test")} passing` };
74
+ }
75
+ function runEntries(run, f) {
76
+ const out = f.failing.map((x) => ({ label: x.name, result: x.result, message: x.why, ranAt: run.at, testFile: f.file }));
77
+ if (f.failed > f.failing.length) out.push({ label: `${f.failed - f.failing.length} more failing`, result: "failed", message: null, ranAt: run.at, testFile: f.file, count: f.failed - f.failing.length });
78
+ if (f.passed) out.push({ label: `${plural(f.passed, "test")} passing`, result: "passed", message: null, ranAt: run.at, testFile: f.file, count: f.passed });
79
+ if (f.skipped) out.push({ label: `${plural(f.skipped, "test")} skipped`, result: "skipped", message: null, ranAt: run.at, testFile: f.file, count: f.skipped });
80
+ return out;
81
+ }
82
+ function groundingOf(projectRoot, candidate, known, knownRuns) {
83
+ const abs = (0, import_confined_fs.resolveWithin)(projectRoot, import_node_path.default.isAbsolute(candidate) ? candidate : import_node_path.default.join(projectRoot, candidate), "file");
84
+ const rel = (0, import_trusted_roots.projectRelative)(projectRoot, abs).split(import_node_path.default.sep).join("/");
85
+ try {
86
+ if (import_node_fs.default.lstatSync(abs).isDirectory()) throw new NotAFileError(`${rel || "."} is a folder, not a file.`);
87
+ } catch (err) {
88
+ if (err instanceof NotAFileError) throw err;
89
+ }
90
+ const results = known ?? (0, import_test_results.listTestResults)(projectRoot, { limit: 1e5 });
91
+ const runs = knownRuns ?? (0, import_teammate_runs.listTeammateRuns)(projectRoot);
92
+ const withFile = results.map((t) => ({ t, testFile: testFileOf(projectRoot, t) }));
93
+ const isOwn = withFile.some((x) => x.testFile === rel) || runs.some((r) => r.files.some((f) => f.file === rel));
94
+ let testFiles;
95
+ if (isOwn) {
96
+ testFiles = [rel];
97
+ } else {
98
+ const importers = new Set((0, import_importers.importersOf)(import_node_path.default.join(projectRoot, rel)).map((i) => i.relativePath.split(import_node_path.default.sep).join("/")));
99
+ const known2 = /* @__PURE__ */ new Set([...withFile.map((x) => x.testFile).filter((f) => !!f), ...runs.flatMap((r) => r.files.map((f) => f.file))]);
100
+ testFiles = [...known2].filter((f) => importers.has(f)).sort();
101
+ }
102
+ let changedAt = null;
103
+ try {
104
+ changedAt = Math.round(import_node_fs.default.lstatSync(abs).mtimeMs);
105
+ } catch {
106
+ }
107
+ const tests = [];
108
+ let stale = false;
109
+ let lastRunAt = null;
110
+ let newestRun = null;
111
+ for (const tf of testFiles) {
112
+ const local = withFile.filter((x) => x.testFile === tf);
113
+ const localAt = local.length ? Math.max(...local.map((x) => x.t.ranAt)) : -Infinity;
114
+ let best = null;
115
+ for (const run of runs) {
116
+ const f = run.files.find((x) => x.file === tf);
117
+ if (f && run.at > localAt && (!best || run.at > best.run.at)) best = { run, file: f };
118
+ }
119
+ if (best) {
120
+ tests.push(...runEntries(best.run, best.file));
121
+ const since = best.run.commit ? (0, import_teammate_runs.changedSinceCommit)(projectRoot, best.run.commit) : null;
122
+ if (!since || since.has(rel) || since.has(tf) || best.run.dirty.includes(rel) || best.run.dirty.includes(tf)) stale = true;
123
+ if (!newestRun || best.run.at > newestRun.at) newestRun = best.run;
124
+ lastRunAt = Math.max(lastRunAt ?? 0, best.run.at);
125
+ } else if (local.length) {
126
+ tests.push(...local.map((x) => ({ label: x.t.label, result: x.t.result, message: x.t.message, ranAt: x.t.ranAt, testFile: tf })));
127
+ if (changedAt !== null && changedAt > localAt + SLACK_MS) stale = true;
128
+ lastRunAt = Math.max(lastRunAt ?? 0, localAt);
129
+ }
130
+ }
131
+ const words = wordsOf(tests, stale);
132
+ if (newestRun && tests.length) words.words += `, in ${newestRun.who}'s run at ${newestRun.commit ? newestRun.commit.slice(0, 7) : "an unknown commit"}${newestRun.verified ? "" : ", unverified"}`;
133
+ return {
134
+ path: rel,
135
+ state: words.state,
136
+ words: words.words,
137
+ testFiles: testFiles.filter((tf) => tests.some((t) => t.testFile === tf)),
138
+ tests,
139
+ lastRunAt,
140
+ changedAt,
141
+ isTest: isOwn,
142
+ from: newestRun ? { who: newestRun.who, verified: newestRun.verified, commit: newestRun.commit, at: newestRun.at } : null
143
+ };
144
+ }
145
+ const MAX_BARRELS = 5;
146
+ function groundingMap(projectRoot) {
147
+ const results = (0, import_test_results.listTestResults)(projectRoot, { limit: 1e5 });
148
+ const runs = (0, import_teammate_runs.listTeammateRuns)(projectRoot);
149
+ const counts = { failing: 0, stale: 0, passing: 0, untested: 0 };
150
+ const files = {};
151
+ if (results.length === 0 && runs.length === 0) return { files, hasResults: false, counts };
152
+ const testFiles = /* @__PURE__ */ new Set([
153
+ ...results.map((t) => testFileOf(projectRoot, t)).filter((f) => !!f),
154
+ ...runs.flatMap((r) => r.files.map((f) => f.file))
155
+ ]);
156
+ const importsOf = (absFile) => ((0, import_database.getDb)().exec(
157
+ `SELECT i.resolved_path, i.is_reexport FROM imports i JOIN files f ON i.file_id = f.id
158
+ WHERE f.path = ? AND i.resolved_path IS NOT NULL`,
159
+ [absFile]
160
+ )[0]?.values ?? []).map((r) => ({ path: String(r[0]), reexport: r[1] === 1 }));
161
+ const candidates = new Set(testFiles);
162
+ for (const tf of testFiles) {
163
+ const start = import_node_path.default.join(projectRoot, tf);
164
+ const seen = /* @__PURE__ */ new Set([start]);
165
+ let frontier = importsOf(start).map((i) => i.path);
166
+ for (let depth = 0; depth <= MAX_BARRELS && frontier.length; depth++) {
167
+ const next = [];
168
+ for (const abs of frontier) {
169
+ if (seen.has(abs)) continue;
170
+ seen.add(abs);
171
+ const rel = (0, import_trusted_roots.projectRelative)(projectRoot, abs);
172
+ if (rel.startsWith("..") || import_node_path.default.isAbsolute(rel)) continue;
173
+ candidates.add(rel.split(import_node_path.default.sep).join("/"));
174
+ next.push(...importsOf(abs).filter((i) => i.reexport).map((i) => i.path));
175
+ }
176
+ frontier = next;
177
+ }
178
+ }
179
+ for (const rel of candidates) {
180
+ let g;
181
+ try {
182
+ g = groundingOf(projectRoot, rel, results, runs);
183
+ } catch {
184
+ continue;
185
+ }
186
+ if (g.state === "untested" && g.tests.length === 0) continue;
187
+ files[rel] = { state: g.state, words: g.words };
188
+ counts[g.state]++;
189
+ }
190
+ return { files, hasResults: true, counts };
191
+ }
192
+ function groundingMapAt(projectRoot, at) {
193
+ const counts = { failing: 0, stale: 0, passing: 0, untested: 0 };
194
+ const files = {};
195
+ const note = (0, import_teammate_runs.listTeammateRuns)(projectRoot).length > 0 ? "Teammates' runs are shown live only: only their latest is kept, so a past moment counts the runs reported here." : null;
196
+ const frameBy = (t) => (0, import_replay_frames.listFrames)(projectRoot, { to: t, limit: 1, newestFirst: true })[0] ?? null;
197
+ const frame = frameBy(at);
198
+ const results = (0, import_test_results.testResultsAt)(projectRoot, at);
199
+ if (results.length === 0) return { files, hasResults: false, counts, at, frameAt: frame?.at ?? null, note };
200
+ if (!frame) return { files, hasResults: true, counts, at, frameAt: null, note };
201
+ const graphs = /* @__PURE__ */ new Map();
202
+ const graphOf = (id) => {
203
+ if (!graphs.has(id)) graphs.set(id, (0, import_trellis_service.getSnapshot)(id)?.data ?? null);
204
+ return graphs.get(id);
205
+ };
206
+ const then = graphOf(frame.id);
207
+ if (!then) return { files, hasResults: true, counts, at, frameAt: frame.at, note };
208
+ const hashThen = new Map(then.files.map((f) => [f.path, f.contentHash]));
209
+ const importsOf = /* @__PURE__ */ new Map();
210
+ for (const e of then.edges) importsOf.set(e.source, [...importsOf.get(e.source) ?? [], e.target]);
211
+ const reexports = new Set(((0, import_database.getDb)().exec(
212
+ `SELECT f.relative_path, t.relative_path FROM imports i JOIN files f ON i.file_id = f.id JOIN files t ON t.path = i.resolved_path
213
+ WHERE i.is_reexport = 1`
214
+ )[0]?.values ?? []).map((r) => `${String(r[0]).split(import_node_path.default.sep).join("/")}\0${String(r[1]).split(import_node_path.default.sep).join("/")}`));
215
+ const byTestFile = /* @__PURE__ */ new Map();
216
+ for (const t of results) {
217
+ const tf = testFileOf(projectRoot, t);
218
+ if (tf) byTestFile.set(tf, [...byTestFile.get(tf) ?? [], t]);
219
+ }
220
+ const reachedBy = /* @__PURE__ */ new Map();
221
+ const reach = (file, tf) => reachedBy.set(file, (reachedBy.get(file) ?? /* @__PURE__ */ new Set()).add(tf));
222
+ for (const tf of byTestFile.keys()) {
223
+ reach(tf, tf);
224
+ const seen = /* @__PURE__ */ new Set([tf]);
225
+ let frontier = (importsOf.get(tf) ?? []).map((target) => ({ from: tf, target }));
226
+ for (let depth = 0; depth <= MAX_BARRELS && frontier.length; depth++) {
227
+ const next = [];
228
+ for (const { target } of frontier) {
229
+ if (seen.has(target)) continue;
230
+ seen.add(target);
231
+ reach(target, tf);
232
+ next.push(...(importsOf.get(target) ?? []).filter((t) => reexports.has(`${target}\0${t}`)).map((t) => ({ from: target, target: t })));
233
+ }
234
+ frontier = next;
235
+ }
236
+ }
237
+ for (const [file, testFiles] of reachedBy) {
238
+ if (!hashThen.has(file)) continue;
239
+ const own = byTestFile.has(file) ? [file] : [...testFiles].filter((tf) => tf !== file);
240
+ const tests = [];
241
+ let stale = false;
242
+ for (const tf of own) {
243
+ const rows = byTestFile.get(tf) ?? [];
244
+ tests.push(...rows);
245
+ const ranAt = Math.max(...rows.map((r) => r.ranAt));
246
+ const atRun = (0, import_replay_frames.listFrames)(projectRoot, { from: ranAt, to: frame.at, limit: 1 })[0] ?? null;
247
+ const hashAtRun = atRun ? graphOf(atRun.id)?.files.find((f) => f.path === file)?.contentHash : void 0;
248
+ if (hashAtRun !== void 0 && hashAtRun !== hashThen.get(file)) stale = true;
249
+ }
250
+ const g = wordsOf(tests, stale);
251
+ if (g.state === "untested" && tests.length === 0) continue;
252
+ files[file] = g;
253
+ counts[g.state]++;
254
+ }
255
+ return { files, hasResults: true, counts, at, frameAt: frame.at, note };
256
+ }
257
+ // Annotate the CommonJS export names for ESM import in node:
258
+ 0 && (module.exports = {
259
+ NotAFileError,
260
+ groundingMap,
261
+ groundingMapAt,
262
+ groundingOf,
263
+ groundingWords,
264
+ testFileOf,
265
+ wordsOf
266
+ });
@@ -0,0 +1,104 @@
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 junit_exports = {};
19
+ __export(junit_exports, {
20
+ MAX_CASES: () => MAX_CASES,
21
+ parseJUnit: () => parseJUnit,
22
+ testLabel: () => testLabel
23
+ });
24
+ module.exports = __toCommonJS(junit_exports);
25
+ const MAX_CASES = 2e4;
26
+ const MAX_TEXT = 300;
27
+ const ENTITIES = { amp: "&", lt: "<", gt: ">", quot: '"', apos: "'" };
28
+ function decode(s) {
29
+ return s.replace(/&(#x[0-9a-f]+|#\d+|[a-z]+);/gi, (m, e) => {
30
+ if (e[0] === "#") {
31
+ const code = e[1] === "x" || e[1] === "X" ? parseInt(e.slice(2), 16) : parseInt(e.slice(1), 10);
32
+ return Number.isFinite(code) && code > 0 && code < 1114112 ? String.fromCodePoint(code) : m;
33
+ }
34
+ return ENTITIES[e.toLowerCase()] ?? m;
35
+ });
36
+ }
37
+ function attr(tag, name) {
38
+ const m = new RegExp(`\\s${name}\\s*=\\s*("([^"]*)"|'([^']*)')`).exec(tag);
39
+ if (!m) return null;
40
+ const v = decode(m[2] ?? m[3] ?? "").trim();
41
+ return v ? v.slice(0, MAX_TEXT) : null;
42
+ }
43
+ function firstLine(tag, body) {
44
+ const fromAttr = attr(tag, "message");
45
+ const text = fromAttr ?? decode(body.replace(/<!\[CDATA\[([\s\S]*?)\]\]>/g, "$1").replace(/<[^>]*>/g, "")).trim();
46
+ const line = text.split(/\r?\n/).map((l) => l.trim()).find(Boolean);
47
+ return line ? line.slice(0, MAX_TEXT) : null;
48
+ }
49
+ function parseJUnit(xml) {
50
+ if (!/<testsuites?\b/.test(xml) && !/<testcase\b/.test(xml)) return null;
51
+ const cases = [];
52
+ let truncated = false;
53
+ const suites = [];
54
+ const re = /<testsuite\b([^>]*?)(\/?)>|<\/testsuite>|<testcase\b([^>]*?)(?:\/>|>([\s\S]*?)<\/testcase>)/g;
55
+ for (let m = re.exec(xml); m; m = re.exec(xml)) {
56
+ if (m[0].startsWith("</testsuite")) {
57
+ suites.pop();
58
+ continue;
59
+ }
60
+ if (m[0].startsWith("<testsuite")) {
61
+ if (m[2] !== "/") suites.push(attr(`<s${m[1]}`, "name"));
62
+ continue;
63
+ }
64
+ if (cases.length >= MAX_CASES) {
65
+ truncated = true;
66
+ break;
67
+ }
68
+ const tag = `<c${m[3] ?? ""}`;
69
+ const body = m[4] ?? "";
70
+ const name = attr(tag, "name");
71
+ if (!name) continue;
72
+ const failure = /<failure\b([^>]*?)(?:\/>|>([\s\S]*?)<\/failure>)/.exec(body);
73
+ const error = /<error\b([^>]*?)(?:\/>|>([\s\S]*?)<\/error>)/.exec(body);
74
+ const skipped = /<skipped\b/.test(body);
75
+ const result = failure ? "failed" : error ? "error" : skipped ? "skipped" : "passed";
76
+ const why = failure ?? error;
77
+ const seconds = Number(attr(tag, "time"));
78
+ cases.push({
79
+ suite: suites.length ? suites[suites.length - 1] : null,
80
+ classname: attr(tag, "classname"),
81
+ name,
82
+ file: attr(tag, "file"),
83
+ result,
84
+ durationMs: Number.isFinite(seconds) && seconds >= 0 ? Math.round(seconds * 1e3) : null,
85
+ message: why ? firstLine(`<x${why[1] ?? ""}`, why[2] ?? "") : null
86
+ });
87
+ }
88
+ if (cases.length === 0 && !/<testsuites?\b/.test(xml)) return null;
89
+ const count = (r) => cases.filter((c) => c.result === r).length;
90
+ return {
91
+ cases,
92
+ totals: { tests: cases.length, passed: count("passed"), failed: count("failed"), errors: count("error"), skipped: count("skipped") },
93
+ truncated
94
+ };
95
+ }
96
+ function testLabel(c) {
97
+ return c.classname ? `${c.classname} \u203A ${c.name}` : c.name;
98
+ }
99
+ // Annotate the CommonJS export names for ESM import in node:
100
+ 0 && (module.exports = {
101
+ MAX_CASES,
102
+ parseJUnit,
103
+ testLabel
104
+ });
@@ -0,0 +1,134 @@
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 teammate_runs_exports = {};
19
+ __export(teammate_runs_exports, {
20
+ changedSinceCommit: () => changedSinceCommit,
21
+ forgetTeammateRuns: () => forgetTeammateRuns,
22
+ knownRunCounters: () => knownRunCounters,
23
+ listTeammateRuns: () => listTeammateRuns,
24
+ putTeammateRun: () => putTeammateRun,
25
+ teammateRunSummaries: () => teammateRunSummaries
26
+ });
27
+ module.exports = __toCommonJS(teammate_runs_exports);
28
+ var import_node_child_process = require("node:child_process");
29
+ var import_database = require("../database");
30
+ var import_persistence = require("../persistence");
31
+ const parse = (s, fallback) => {
32
+ try {
33
+ return JSON.parse(String(s));
34
+ } catch {
35
+ return fallback;
36
+ }
37
+ };
38
+ function listTeammateRuns(projectRoot) {
39
+ const rows = (0, import_database.getDb)().exec(
40
+ `SELECT writer, counter, name, by_author, by_type, commit_sha, dirty, at, report, totals, files, verdict
41
+ FROM teammate_test_runs WHERE project_root = ? ORDER BY at DESC`,
42
+ [projectRoot]
43
+ )[0]?.values ?? [];
44
+ return rows.map((r) => {
45
+ const verdict = parse(r[11], {});
46
+ const name = verdict.verified && verdict.who ? verdict.who : String(r[2]);
47
+ const person = r[4] === "human" || r[4] === "unverified" || r[3] === r[2];
48
+ return {
49
+ writer: String(r[0]),
50
+ counter: Number(r[1]),
51
+ who: person ? name : `${String(r[3])} for ${name}`,
52
+ verified: verdict.verified === true,
53
+ why: verdict.verified ? null : verdict.why ?? null,
54
+ commit: r[5] ?? null,
55
+ dirty: parse(r[6], []),
56
+ at: Number(r[7]),
57
+ report: String(r[8]),
58
+ totals: parse(r[9], { tests: 0, passed: 0, failed: 0, errors: 0, skipped: 0 }),
59
+ files: parse(r[10], [])
60
+ };
61
+ });
62
+ }
63
+ function teammateRunSummaries(projectRoot) {
64
+ return listTeammateRuns(projectRoot).map(({ files: _files, dirty: _dirty, ...r }) => {
65
+ const failing = r.totals.failed + r.totals.errors;
66
+ const how = failing ? `${failing} of ${r.totals.tests} failing` : `${r.totals.tests - r.totals.skipped} passing`;
67
+ return { ...r, says: `${r.who}'s run at ${r.commit ? r.commit.slice(0, 7) : "an unknown commit"}: ${how}${r.verified ? "" : ` (unverified: ${r.why ?? "not signed"})`}` };
68
+ });
69
+ }
70
+ function knownRunCounters(projectRoot) {
71
+ const rows = (0, import_database.getDb)().exec("SELECT writer, counter FROM teammate_test_runs WHERE project_root = ?", [projectRoot])[0]?.values ?? [];
72
+ return new Map(rows.map((r) => [String(r[0]), Number(r[1])]));
73
+ }
74
+ function putTeammateRun(projectRoot, run) {
75
+ (0, import_database.getDb)().run(
76
+ `INSERT INTO teammate_test_runs (project_root, writer, counter, name, by_author, by_type, commit_sha, dirty, at, report, totals, files, verdict)
77
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
78
+ ON CONFLICT(project_root, writer) DO UPDATE SET counter = excluded.counter, name = excluded.name, by_author = excluded.by_author,
79
+ by_type = excluded.by_type, commit_sha = excluded.commit_sha, dirty = excluded.dirty, at = excluded.at, report = excluded.report,
80
+ totals = excluded.totals, files = excluded.files, verdict = excluded.verdict
81
+ WHERE excluded.counter > teammate_test_runs.counter`,
82
+ [
83
+ projectRoot,
84
+ run.writer,
85
+ run.counter,
86
+ run.name,
87
+ run.by.author,
88
+ run.by.authorType,
89
+ run.commit,
90
+ JSON.stringify(run.dirty),
91
+ run.at,
92
+ run.report,
93
+ JSON.stringify(run.totals),
94
+ JSON.stringify(run.files),
95
+ JSON.stringify(run.verdict)
96
+ ]
97
+ );
98
+ (0, import_persistence.markDirty)();
99
+ }
100
+ function forgetTeammateRuns(q) {
101
+ const where = q.projectRoot ? "project_root = ?" : "writer = ?";
102
+ const arg = q.projectRoot ?? q.writer ?? "";
103
+ const n = Number((0, import_database.getDb)().exec(`SELECT COUNT(*) FROM teammate_test_runs WHERE ${where}`, [arg])[0]?.values[0]?.[0] ?? 0);
104
+ if (n) {
105
+ (0, import_database.getDb)().run(`DELETE FROM teammate_test_runs WHERE ${where}`, [arg]);
106
+ (0, import_persistence.markDirty)();
107
+ }
108
+ return n;
109
+ }
110
+ const diffCache = /* @__PURE__ */ new Map();
111
+ const DIFF_TTL_MS = 2e3;
112
+ function changedSinceCommit(projectRoot, commit, now = Date.now()) {
113
+ const key = `${projectRoot}\0${commit}`;
114
+ const hit = diffCache.get(key);
115
+ if (hit && now - hit.at < DIFF_TTL_MS) return hit.files;
116
+ let files;
117
+ try {
118
+ const out = (0, import_node_child_process.execFileSync)("git", ["-C", projectRoot, "diff", "--name-only", commit, "--"], { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"], maxBuffer: 32 * 1024 * 1024 });
119
+ files = new Set(out.split("\n").map((s) => s.trim()).filter(Boolean));
120
+ } catch {
121
+ files = null;
122
+ }
123
+ diffCache.set(key, { at: now, files });
124
+ return files;
125
+ }
126
+ // Annotate the CommonJS export names for ESM import in node:
127
+ 0 && (module.exports = {
128
+ changedSinceCommit,
129
+ forgetTeammateRuns,
130
+ knownRunCounters,
131
+ listTeammateRuns,
132
+ putTeammateRun,
133
+ teammateRunSummaries
134
+ });