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,234 @@
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 test_results_exports = {};
29
+ __export(test_results_exports, {
30
+ MAX_REPORT_BYTES: () => MAX_REPORT_BYTES,
31
+ TestReportError: () => TestReportError,
32
+ ingestTestReport: () => ingestTestReport,
33
+ listTestReports: () => listTestReports,
34
+ listTestResults: () => listTestResults,
35
+ setReportListener: () => setReportListener,
36
+ testResultsAt: () => testResultsAt,
37
+ testsSummary: () => testsSummary
38
+ });
39
+ module.exports = __toCommonJS(test_results_exports);
40
+ var import_node_fs = __toESM(require("node:fs"));
41
+ var import_node_path = __toESM(require("node:path"));
42
+ var import_node_crypto = __toESM(require("node:crypto"));
43
+ var import_database = require("../database");
44
+ var import_persistence = require("../persistence");
45
+ var import_confined_fs = require("../confined-fs");
46
+ var import_junit = require("./junit");
47
+ var import_retention = require("../retention");
48
+ const MAX_REPORT_BYTES = 20 * 1024 * 1024;
49
+ class TestReportError extends Error {
50
+ constructor(status, message) {
51
+ super(message);
52
+ this.status = status;
53
+ }
54
+ status;
55
+ }
56
+ const keyOf = (c) => JSON.stringify([c.suite ?? "", c.classname ?? "", c.name]);
57
+ function reportRow(r) {
58
+ return {
59
+ id: Number(r[0]),
60
+ path: String(r[1]),
61
+ tests: Number(r[2]),
62
+ passed: Number(r[3]),
63
+ failed: Number(r[4]),
64
+ errors: Number(r[5]),
65
+ skipped: Number(r[6]),
66
+ ranAt: Number(r[7]),
67
+ reportedAt: Number(r[8]),
68
+ reportedBy: String(r[9]),
69
+ reportedByType: String(r[10])
70
+ };
71
+ }
72
+ const REPORT_COLS = "id, path, tests, passed, failed, errors, skipped, ran_at, reported_at, reported_by, reported_by_type";
73
+ function ingestTestReport(projectRoot, candidate, by, now = Date.now()) {
74
+ let target;
75
+ try {
76
+ target = (0, import_confined_fs.resolveWithin)(projectRoot, import_node_path.default.isAbsolute(candidate) ? candidate : import_node_path.default.join(projectRoot, candidate), "test report");
77
+ } catch (err) {
78
+ if (err instanceof import_confined_fs.ConfinementError) throw new TestReportError(400, `${candidate} is not a file inside this project.`);
79
+ throw err;
80
+ }
81
+ let st;
82
+ try {
83
+ st = import_node_fs.default.statSync(target);
84
+ } catch {
85
+ throw new TestReportError(404, `${candidate} does not exist.`);
86
+ }
87
+ if (!st.isFile()) throw new TestReportError(400, `${candidate} is not a file.`);
88
+ if (st.size > MAX_REPORT_BYTES) throw new TestReportError(413, `${candidate} is larger than a test report can be (20 MB).`);
89
+ let buf;
90
+ try {
91
+ buf = (0, import_confined_fs.readFileWithin)(projectRoot, target, "test report");
92
+ } catch (err) {
93
+ if (err instanceof import_confined_fs.ConfinementError) throw new TestReportError(400, `${candidate} could not be read: ${err.message}`);
94
+ throw err;
95
+ }
96
+ const parsed = (0, import_junit.parseJUnit)(buf.toString("utf8"));
97
+ if (!parsed) throw new TestReportError(422, `${candidate} is not a JUnit report. Most runners write one: vitest --reporter=junit, jest-junit, pytest --junitxml, go-junit-report, Playwright's junit reporter.`);
98
+ const rel = import_node_path.default.relative(projectRoot, target).split(import_node_path.default.sep).join("/");
99
+ const sha256 = import_node_crypto.default.createHash("sha256").update(buf).digest("hex");
100
+ const failing = parsed.cases.filter((c) => c.result === "failed" || c.result === "error").slice(0, 20).map((c) => ({ label: (0, import_junit.testLabel)(c), result: c.result, message: c.message }));
101
+ const db = (0, import_database.getDb)();
102
+ const ranAt = Math.round(st.mtimeMs);
103
+ const t = parsed.totals;
104
+ const known = db.exec(`SELECT ${REPORT_COLS} FROM test_reports WHERE project_root = ? AND sha256 = ?`, [projectRoot, sha256])[0]?.values[0];
105
+ if (known && ranAt <= reportRow(known).ranAt) return { report: reportRow(known), already: true, failing, truncated: parsed.truncated };
106
+ if (known) {
107
+ db.run(
108
+ "UPDATE test_reports SET path = ?, ran_at = ?, reported_at = ?, reported_by = ?, reported_by_type = ? WHERE id = ?",
109
+ [rel, ranAt, now, by.author, by.authorType, reportRow(known).id]
110
+ );
111
+ } else {
112
+ db.run(
113
+ `INSERT INTO test_reports (project_root, path, sha256, tests, passed, failed, errors, skipped, ran_at, reported_at, reported_by, reported_by_type)
114
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
115
+ [projectRoot, rel, sha256, t.tests, t.passed, t.failed, t.errors, t.skipped, ranAt, now, by.author, by.authorType]
116
+ );
117
+ }
118
+ const id = Number(db.exec("SELECT id FROM test_reports WHERE project_root = ? AND sha256 = ?", [projectRoot, sha256])[0].values[0][0]);
119
+ const cutoff = (0, import_retention.retentionCutoff)(now);
120
+ if (cutoff !== null) {
121
+ db.run(
122
+ "DELETE FROM test_report_cases WHERE report_id IN (SELECT id FROM test_reports WHERE project_root = ? AND reported_at < ?)",
123
+ [projectRoot, cutoff]
124
+ );
125
+ }
126
+ for (const c of parsed.cases) {
127
+ db.run(
128
+ `INSERT OR REPLACE INTO test_report_cases (report_id, test_key, suite, classname, name, file, result, duration_ms, message)
129
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,
130
+ [id, keyOf(c), c.suite, c.classname, c.name, c.file, c.result, c.durationMs, c.message]
131
+ );
132
+ }
133
+ for (const c of parsed.cases) {
134
+ db.run(
135
+ `INSERT INTO test_results (project_root, test_key, suite, classname, name, file, result, duration_ms, message, report_id, ran_at)
136
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
137
+ ON CONFLICT(project_root, test_key) DO UPDATE SET
138
+ suite = excluded.suite, classname = excluded.classname, name = excluded.name, file = excluded.file,
139
+ result = excluded.result, duration_ms = excluded.duration_ms, message = excluded.message,
140
+ report_id = excluded.report_id, ran_at = excluded.ran_at
141
+ WHERE excluded.ran_at >= test_results.ran_at`,
142
+ [projectRoot, keyOf(c), c.suite, c.classname, c.name, c.file, c.result, c.durationMs, c.message, id, ranAt]
143
+ );
144
+ }
145
+ (0, import_persistence.markDirty)();
146
+ const report = reportRow(db.exec(`SELECT ${REPORT_COLS} FROM test_reports WHERE id = ?`, [id])[0].values[0]);
147
+ try {
148
+ reportListener?.({ projectRoot, path: rel, ranAt, by, totals: t, cases: parsed.cases });
149
+ } catch (err) {
150
+ console.warn("[Tests] sharing the run failed:", err);
151
+ }
152
+ return { report, already: false, failing, truncated: parsed.truncated };
153
+ }
154
+ let reportListener;
155
+ function setReportListener(fn) {
156
+ reportListener = fn;
157
+ }
158
+ function listTestResults(projectRoot, opts = {}) {
159
+ const rows = (0, import_database.getDb)().exec(
160
+ `SELECT r.suite, r.classname, r.name, r.file, r.result, r.duration_ms, r.message, r.ran_at, p.path
161
+ FROM test_results r JOIN test_reports p ON p.id = r.report_id
162
+ WHERE r.project_root = ?`,
163
+ [projectRoot]
164
+ )[0]?.values ?? [];
165
+ const order = { error: 0, failed: 1, skipped: 2, passed: 3 };
166
+ const m = opts.match?.toLowerCase();
167
+ return rows.map((r) => {
168
+ const c = { suite: r[0], classname: r[1], name: String(r[2]), file: r[3] };
169
+ return {
170
+ ...c,
171
+ label: (0, import_junit.testLabel)(c),
172
+ result: r[4],
173
+ durationMs: r[5] ?? null,
174
+ message: r[6] ?? null,
175
+ ranAt: Number(r[7]),
176
+ reportPath: String(r[8])
177
+ };
178
+ }).filter((t) => !opts.result || t.result === opts.result).filter((t) => !m || [t.file, t.classname, t.suite].some((v) => v?.toLowerCase().includes(m))).sort((a, b) => order[a.result] - order[b.result] || a.label.localeCompare(b.label)).slice(0, opts.limit ?? 500);
179
+ }
180
+ function testResultsAt(projectRoot, at) {
181
+ const db = (0, import_database.getDb)();
182
+ const reports = db.exec(
183
+ "SELECT id, path, ran_at FROM test_reports WHERE project_root = ? AND reported_at <= ? ORDER BY ran_at, id",
184
+ [projectRoot, at]
185
+ )[0]?.values ?? [];
186
+ const byKey = /* @__PURE__ */ new Map();
187
+ for (const [id, reportPath, ranAt] of reports) {
188
+ let rows = db.exec(
189
+ "SELECT test_key, suite, classname, name, file, result, duration_ms, message FROM test_report_cases WHERE report_id = ?",
190
+ [id]
191
+ )[0]?.values ?? [];
192
+ if (rows.length === 0) {
193
+ rows = db.exec(
194
+ "SELECT test_key, suite, classname, name, file, result, duration_ms, message FROM test_results WHERE project_root = ? AND report_id = ?",
195
+ [projectRoot, id]
196
+ )[0]?.values ?? [];
197
+ }
198
+ for (const r of rows) {
199
+ const c = { suite: r[1], classname: r[2], name: String(r[3]), file: r[4] };
200
+ byKey.set(String(r[0]), {
201
+ ...c,
202
+ label: (0, import_junit.testLabel)(c),
203
+ result: r[5],
204
+ durationMs: r[6] ?? null,
205
+ message: r[7] ?? null,
206
+ ranAt: Number(ranAt),
207
+ reportPath: String(reportPath)
208
+ });
209
+ }
210
+ }
211
+ return [...byKey.values()];
212
+ }
213
+ function listTestReports(projectRoot, limit = 20) {
214
+ return ((0, import_database.getDb)().exec(`SELECT ${REPORT_COLS} FROM test_reports WHERE project_root = ? ORDER BY ran_at DESC, id DESC LIMIT ?`, [projectRoot, limit])[0]?.values ?? []).map(reportRow);
215
+ }
216
+ function testsSummary(projectRoot) {
217
+ const rows = (0, import_database.getDb)().exec("SELECT result, COUNT(*) FROM test_results WHERE project_root = ? GROUP BY result", [projectRoot])[0]?.values ?? [];
218
+ const n = (r) => Number(rows.find((x) => x[0] === r)?.[1] ?? 0);
219
+ const tests = rows.reduce((a, r) => a + Number(r[1]), 0);
220
+ const failing = n("failed") + n("error");
221
+ const words = tests === 0 ? "No test results yet: an agent hands over a JUnit report with report_tests." : `${tests} test${tests === 1 ? "" : "s"}, ${failing ? `${failing} failing` : "none failing"}${n("skipped") ? `, ${n("skipped")} skipped` : ""}`;
222
+ return { tests, passed: n("passed"), failing, skipped: n("skipped"), words };
223
+ }
224
+ // Annotate the CommonJS export names for ESM import in node:
225
+ 0 && (module.exports = {
226
+ MAX_REPORT_BYTES,
227
+ TestReportError,
228
+ ingestTestReport,
229
+ listTestReports,
230
+ listTestResults,
231
+ setReportListener,
232
+ testResultsAt,
233
+ testsSummary
234
+ });
@@ -0,0 +1,204 @@
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 tree_watcher_exports = {};
29
+ __export(tree_watcher_exports, {
30
+ usesNativeTreeWatcher: () => usesNativeTreeWatcher,
31
+ watchTree: () => watchTree
32
+ });
33
+ module.exports = __toCommonJS(tree_watcher_exports);
34
+ var import_node_events = require("node:events");
35
+ var import_node_fs = __toESM(require("node:fs"));
36
+ var import_node_path = __toESM(require("node:path"));
37
+ var import_chokidar = __toESM(require("chokidar"));
38
+ function usesNativeTreeWatcher(platform = process.platform) {
39
+ if (process.env.CODETRELLIS_TREE_WATCHER === "chokidar") return false;
40
+ return platform === "darwin";
41
+ }
42
+ function watchTree(root, opts = {}) {
43
+ if (!usesNativeTreeWatcher()) {
44
+ return import_chokidar.default.watch(root, { ignoreInitial: true, persistent: true, ...opts });
45
+ }
46
+ return new NativeTreeWatcher(root, opts);
47
+ }
48
+ const COALESCE_MS = 50;
49
+ class NativeTreeWatcher extends import_node_events.EventEmitter {
50
+ constructor(root, opts) {
51
+ super();
52
+ this.root = root;
53
+ this.opts = opts;
54
+ try {
55
+ this.fsw = import_node_fs.default.watch(root, { recursive: true, persistent: true }, (_type, name) => {
56
+ if (this.closed) return;
57
+ if (!name) {
58
+ void this.rescan();
59
+ return;
60
+ }
61
+ this.report(import_node_path.default.join(root, name.toString()));
62
+ });
63
+ this.fsw.on("error", (err) => this.emit("error", err));
64
+ } catch (err) {
65
+ setImmediate(() => this.emit("error", err));
66
+ }
67
+ void this.walk(root, true).then(() => {
68
+ if (!this.closed) this.emit("ready");
69
+ });
70
+ }
71
+ root;
72
+ opts;
73
+ seen = /* @__PURE__ */ new Map();
74
+ timers = /* @__PURE__ */ new Map();
75
+ fsw = null;
76
+ closed = false;
77
+ skip(p) {
78
+ if (p !== this.root && this.opts.ignored?.(p)) return true;
79
+ if (this.opts.depth === void 0) return false;
80
+ const rel = import_node_path.default.relative(this.root, p);
81
+ if (!rel || rel.startsWith("..")) return !!rel;
82
+ return rel.split(import_node_path.default.sep).length - 1 > this.opts.depth;
83
+ }
84
+ /** Record what is under `dir`; `quiet` for the first walk (ignoreInitial), else report what is new. */
85
+ async walk(dir, quiet) {
86
+ if (this.closed) return;
87
+ let entries;
88
+ try {
89
+ entries = await import_node_fs.default.promises.readdir(dir, { withFileTypes: true });
90
+ } catch {
91
+ return;
92
+ }
93
+ for (const e of entries) {
94
+ const p = import_node_path.default.join(dir, e.name);
95
+ if (this.skip(p)) continue;
96
+ if (e.isDirectory()) {
97
+ const isNew = !this.seen.has(p);
98
+ this.seen.set(p, { dir: true });
99
+ if (isNew && !quiet) this.fire("addDir", p);
100
+ await this.walk(p, quiet);
101
+ } else {
102
+ if (this.seen.has(p)) continue;
103
+ const st = this.stat(p);
104
+ if (!st) continue;
105
+ this.seen.set(p, { dir: false, size: st.size, mtimeMs: st.mtimeMs });
106
+ if (!quiet) this.fire("add", p);
107
+ }
108
+ }
109
+ }
110
+ stat(p) {
111
+ try {
112
+ return import_node_fs.default.lstatSync(p);
113
+ } catch {
114
+ return null;
115
+ }
116
+ }
117
+ report(p) {
118
+ if (p === this.root || this.skip(p)) return;
119
+ const wait = this.opts.awaitWriteFinish?.stabilityThreshold ?? COALESCE_MS;
120
+ const prev = this.timers.get(p);
121
+ if (prev) clearTimeout(prev);
122
+ this.timers.set(p, setTimeout(() => {
123
+ this.timers.delete(p);
124
+ void this.settle(p);
125
+ }, wait));
126
+ }
127
+ /** Look at `p` and say what changed there. */
128
+ async settle(p) {
129
+ if (this.closed) return;
130
+ const st = this.stat(p);
131
+ const was = this.seen.get(p);
132
+ if (!st) {
133
+ if (!was) return;
134
+ if (was.dir) this.forgetDir(p);
135
+ else {
136
+ this.seen.delete(p);
137
+ this.fire("unlink", p);
138
+ }
139
+ return;
140
+ }
141
+ if (st.isDirectory()) {
142
+ if (was && !was.dir) {
143
+ this.seen.delete(p);
144
+ this.fire("unlink", p);
145
+ }
146
+ if (!was || !was.dir) {
147
+ this.seen.set(p, { dir: true });
148
+ this.fire("addDir", p);
149
+ }
150
+ await this.walk(p, false);
151
+ return;
152
+ }
153
+ if (was?.dir) this.forgetDir(p);
154
+ const now = { dir: false, size: st.size, mtimeMs: st.mtimeMs };
155
+ this.seen.set(p, now);
156
+ if (!was || was.dir) this.fire("add", p);
157
+ else if (was.size !== now.size || was.mtimeMs !== now.mtimeMs) this.fire("change", p);
158
+ }
159
+ forgetDir(dir) {
160
+ const prefix = dir + import_node_path.default.sep;
161
+ for (const [p, s] of [...this.seen]) {
162
+ if (!p.startsWith(prefix)) continue;
163
+ this.seen.delete(p);
164
+ this.fire(s.dir ? "unlinkDir" : "unlink", p);
165
+ }
166
+ this.seen.delete(dir);
167
+ this.fire("unlinkDir", dir);
168
+ }
169
+ /** A flood dropped the names: compare everything recorded with what is there. */
170
+ async rescan() {
171
+ for (const p of [...this.seen.keys()]) {
172
+ if (!import_node_fs.default.existsSync(p)) await this.settle(p);
173
+ }
174
+ await this.walk(this.root, false);
175
+ }
176
+ fire(event, p) {
177
+ if (this.closed) return;
178
+ this.emit(event, p);
179
+ this.emit("all", event, p);
180
+ }
181
+ getWatched() {
182
+ const out = { [this.root]: [] };
183
+ for (const [p, s] of this.seen) {
184
+ if (s.dir) out[p] ??= [];
185
+ const parent = import_node_path.default.dirname(p);
186
+ (out[parent] ??= []).push(import_node_path.default.basename(p));
187
+ }
188
+ for (const k of Object.keys(out)) out[k].sort();
189
+ return out;
190
+ }
191
+ async close() {
192
+ this.closed = true;
193
+ this.fsw?.close();
194
+ this.fsw = null;
195
+ for (const t of this.timers.values()) clearTimeout(t);
196
+ this.timers.clear();
197
+ this.removeAllListeners();
198
+ }
199
+ }
200
+ // Annotate the CommonJS export names for ESM import in node:
201
+ 0 && (module.exports = {
202
+ usesNativeTreeWatcher,
203
+ watchTree
204
+ });
@@ -0,0 +1,204 @@
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 trellis_service_exports = {};
19
+ __export(trellis_service_exports, {
20
+ captureCurrentTrellis: () => captureCurrentTrellis,
21
+ computeTrellisDiff: () => computeTrellisDiff,
22
+ getSnapshot: () => getSnapshot,
23
+ listSnapshots: () => listSnapshots,
24
+ readLiveGraph: () => readLiveGraph
25
+ });
26
+ module.exports = __toCommonJS(trellis_service_exports);
27
+ var import_database = require("./database");
28
+ var import_persistence = require("./persistence");
29
+ var import_git_checkout = require("./git-checkout");
30
+ function readLiveGraph() {
31
+ const db = (0, import_database.getDb)();
32
+ let edges = [];
33
+ try {
34
+ edges = (0, import_database.getDependencyEdges)();
35
+ } catch {
36
+ }
37
+ const counts = /* @__PURE__ */ new Map();
38
+ const countRows = db.exec(
39
+ `SELECT f.relative_path, COUNT(s.id) FROM files f
40
+ LEFT JOIN symbols s ON s.file_id = f.id AND s.parent_symbol_id IS NULL
41
+ GROUP BY f.id`
42
+ );
43
+ for (const r of countRows[0]?.values ?? []) counts.set(r[0], Number(r[1]) || 0);
44
+ const filesResult = db.exec(`SELECT relative_path, content_hash, language FROM files`);
45
+ const files = (filesResult[0]?.values || []).map((r) => ({
46
+ path: r[0],
47
+ contentHash: r[1],
48
+ language: r[2],
49
+ symbolCount: counts.get(r[0]) ?? 0
50
+ }));
51
+ return {
52
+ files,
53
+ edges: edges.map((e) => ({ source: e.sourceRelative, target: e.targetRelative, specifiers: e.specifiers }))
54
+ };
55
+ }
56
+ function captureCurrentTrellis(projectPath, planUid, name) {
57
+ const db = (0, import_database.getDb)();
58
+ const { files, edges: edgesData } = readLiveGraph();
59
+ const gitBranch = (0, import_git_checkout.currentBranch)(projectPath);
60
+ const snapshotName = name || `Snapshot at ${(/* @__PURE__ */ new Date()).toLocaleString()}`;
61
+ const now = Date.now();
62
+ db.run(
63
+ `INSERT INTO trellis_snapshots (name, snapshot_type, plan_uid, git_branch, files_json, edges_json, created_at)
64
+ VALUES (?, ?, ?, ?, ?, ?, ?)`,
65
+ [
66
+ snapshotName,
67
+ planUid ? "current" : "checkpoint",
68
+ planUid || null,
69
+ gitBranch,
70
+ JSON.stringify(files),
71
+ JSON.stringify(edgesData),
72
+ now
73
+ ]
74
+ );
75
+ const idResult = db.exec(`SELECT last_insert_rowid()`);
76
+ const id = idResult[0]?.values[0]?.[0] || 0;
77
+ (0, import_persistence.markDirty)();
78
+ console.log(`[Trellis] Captured snapshot #${id}: "${snapshotName}" (${files.length} files, ${edgesData.length} edges)`);
79
+ return {
80
+ id,
81
+ name: snapshotName,
82
+ snapshotType: planUid ? "current" : "checkpoint",
83
+ planUid: planUid || null,
84
+ gitBranch,
85
+ filesJson: JSON.stringify(files),
86
+ edgesJson: JSON.stringify(edgesData),
87
+ createdAt: now
88
+ };
89
+ }
90
+ function getSnapshot(id) {
91
+ const result = (0, import_database.getDb)().exec(
92
+ `SELECT t.id, t.name, t.snapshot_type, t.plan_uid, t.git_branch,
93
+ COALESCE(o.files_json, t.files_json), COALESCE(o.edges_json, t.edges_json), t.created_at
94
+ FROM trellis_snapshots t LEFT JOIN trellis_snapshots o ON o.id = t.same_as
95
+ WHERE t.id = ?`,
96
+ [id]
97
+ );
98
+ if (!result[0]?.values[0]) return null;
99
+ const r = result[0].values[0];
100
+ return {
101
+ id: r[0],
102
+ name: r[1],
103
+ snapshotType: r[2],
104
+ planUid: r[3],
105
+ gitBranch: r[4],
106
+ filesJson: r[5],
107
+ edgesJson: r[6],
108
+ createdAt: r[7],
109
+ data: {
110
+ files: JSON.parse(r[5]),
111
+ edges: JSON.parse(r[6])
112
+ }
113
+ };
114
+ }
115
+ function listSnapshots(planUid) {
116
+ let query = `SELECT id, name, snapshot_type, plan_uid, git_branch, files_json, edges_json, created_at FROM trellis_snapshots
117
+ WHERE snapshot_type != 'frame'`;
118
+ const params = [];
119
+ if (planUid) {
120
+ query += ` AND plan_uid = ?`;
121
+ params.push(planUid);
122
+ }
123
+ query += ` ORDER BY created_at DESC`;
124
+ const result = (0, import_database.getDb)().exec(query, params);
125
+ if (!result[0]) return [];
126
+ return result[0].values.map((r) => ({
127
+ id: r[0],
128
+ name: r[1],
129
+ snapshotType: r[2],
130
+ planUid: r[3],
131
+ gitBranch: r[4],
132
+ createdAt: r[7],
133
+ fileCount: JSON.parse(r[5]).length,
134
+ edgeCount: JSON.parse(r[6]).length
135
+ }));
136
+ }
137
+ function computeTrellisDiff(snapshotId) {
138
+ const snapshot = getSnapshot(snapshotId);
139
+ if (!snapshot) return null;
140
+ const snapshotFiles = new Map(snapshot.data.files.map((f) => [f.path, f.contentHash]));
141
+ const snapshotEdges = new Set(snapshot.data.edges.map((e) => `${e.source}->${e.target}`));
142
+ let liveEdges = [];
143
+ try {
144
+ liveEdges = (0, import_database.getDependencyEdges)();
145
+ } catch {
146
+ }
147
+ const liveFiles = /* @__PURE__ */ new Map();
148
+ const filesResult = (0, import_database.getDb)().exec(`SELECT relative_path, content_hash FROM files`);
149
+ if (filesResult[0]) {
150
+ for (const r of filesResult[0].values) {
151
+ liveFiles.set(r[0], r[1]);
152
+ }
153
+ }
154
+ const liveEdgeSet = new Set(liveEdges.map((e) => `${e.sourceRelative}->${e.targetRelative}`));
155
+ const addedFiles = [];
156
+ const removedFiles = [];
157
+ const modifiedFiles = [];
158
+ for (const [path, hash] of liveFiles) {
159
+ const snapshotHash = snapshotFiles.get(path);
160
+ if (!snapshotHash) {
161
+ addedFiles.push(path);
162
+ } else if (snapshotHash !== hash) {
163
+ modifiedFiles.push(path);
164
+ }
165
+ }
166
+ for (const path of snapshotFiles.keys()) {
167
+ if (!liveFiles.has(path)) {
168
+ removedFiles.push(path);
169
+ }
170
+ }
171
+ const addedEdgesArr = [];
172
+ const removedEdgesArr = [];
173
+ for (const edge of liveEdgeSet) {
174
+ if (!snapshotEdges.has(edge)) {
175
+ const [source, target] = edge.split("->");
176
+ addedEdgesArr.push({ source, target });
177
+ }
178
+ }
179
+ for (const edge of snapshotEdges) {
180
+ if (!liveEdgeSet.has(edge)) {
181
+ const [source, target] = edge.split("->");
182
+ removedEdgesArr.push({ source, target });
183
+ }
184
+ }
185
+ const totalFiles = snapshotFiles.size;
186
+ const changedFiles = addedFiles.length + modifiedFiles.length;
187
+ const progress = totalFiles > 0 ? Math.round(changedFiles / Math.max(totalFiles, changedFiles) * 100) : 0;
188
+ return {
189
+ addedFiles,
190
+ removedFiles,
191
+ modifiedFiles,
192
+ addedEdges: addedEdgesArr,
193
+ removedEdges: removedEdgesArr,
194
+ progress
195
+ };
196
+ }
197
+ // Annotate the CommonJS export names for ESM import in node:
198
+ 0 && (module.exports = {
199
+ captureCurrentTrellis,
200
+ computeTrellisDiff,
201
+ getSnapshot,
202
+ listSnapshots,
203
+ readLiveGraph
204
+ });