codetrellis 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (449) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +27 -2
  3. package/bin/codetrellis.mjs +4 -0
  4. package/package.json +43 -4
  5. package/reader/material-reader.mjs +130346 -0
  6. package/resources/tree-sitter/README.md +150 -0
  7. package/resources/tree-sitter/tree-sitter-c-sharp.wasm +0 -0
  8. package/resources/tree-sitter/tree-sitter-go.wasm +0 -0
  9. package/resources/tree-sitter/tree-sitter-java.wasm +0 -0
  10. package/resources/tree-sitter/tree-sitter-javascript.wasm +0 -0
  11. package/resources/tree-sitter/tree-sitter-kotlin.wasm +0 -0
  12. package/resources/tree-sitter/tree-sitter-php.wasm +0 -0
  13. package/resources/tree-sitter/tree-sitter-python.wasm +0 -0
  14. package/resources/tree-sitter/tree-sitter-ruby.wasm +0 -0
  15. package/resources/tree-sitter/tree-sitter-rust.wasm +0 -0
  16. package/resources/tree-sitter/tree-sitter-swift.wasm +0 -0
  17. package/resources/tree-sitter/tree-sitter-tsx.wasm +0 -0
  18. package/resources/tree-sitter/tree-sitter-typescript.wasm +0 -0
  19. package/resources/tree-sitter/tree-sitter.wasm +0 -0
  20. package/src/backend/agent/claude-code-watcher.js +270 -0
  21. package/src/backend/index.js +8 -0
  22. package/src/backend/lib/sha256-file.js +39 -0
  23. package/src/backend/lib/zip-entries.js +98 -0
  24. package/src/backend/lifecycle.js +102 -0
  25. package/src/backend/mcp/binding-headers.js +54 -0
  26. package/src/backend/mcp/client-identity.js +44 -0
  27. package/src/backend/mcp/connector/command.js +110 -0
  28. package/src/backend/mcp/connector/core.js +278 -0
  29. package/src/backend/mcp/connector/files.js +121 -0
  30. package/src/backend/mcp/connector/hook.js +284 -0
  31. package/src/backend/mcp/connector/main.js +126 -0
  32. package/src/backend/mcp/connector/sse-upstream.js +152 -0
  33. package/src/backend/mcp/helpers.js +43 -0
  34. package/src/backend/mcp/prompt-builders.js +104 -0
  35. package/src/backend/mcp/resources.js +197 -0
  36. package/src/backend/mcp/server.js +813 -0
  37. package/src/backend/mcp/skill-guide.js +1528 -0
  38. package/src/backend/mcp/tools/architecture-tools.js +273 -0
  39. package/src/backend/mcp/tools/audio-tools.js +117 -0
  40. package/src/backend/mcp/tools/awareness-tools.js +623 -0
  41. package/src/backend/mcp/tools/budget-tools.js +185 -0
  42. package/src/backend/mcp/tools/channel-tools.js +205 -0
  43. package/src/backend/mcp/tools/contribution-tools.js +181 -0
  44. package/src/backend/mcp/tools/drift-tools.js +252 -0
  45. package/src/backend/mcp/tools/git-tools.js +316 -0
  46. package/src/backend/mcp/tools/governance-tools.js +175 -0
  47. package/src/backend/mcp/tools/graph-tools.js +181 -0
  48. package/src/backend/mcp/tools/intake-tools.js +244 -0
  49. package/src/backend/mcp/tools/mobile-tools.js +118 -0
  50. package/src/backend/mcp/tools/peer-tools.js +330 -0
  51. package/src/backend/mcp/tools/plan-item-tools.js +1601 -0
  52. package/src/backend/mcp/tools/plan-tools.js +680 -0
  53. package/src/backend/mcp/tools/presence-tools.js +185 -0
  54. package/src/backend/mcp/tools/project-config-tools.js +150 -0
  55. package/src/backend/mcp/tools/review-tools.js +172 -0
  56. package/src/backend/mcp/tools/session-tools.js +554 -0
  57. package/src/backend/mcp/tools/system-docs-tools.js +168 -0
  58. package/src/backend/mcp/tools/terminal-tools.js +186 -0
  59. package/src/backend/mcp/tools/test-tools.js +117 -0
  60. package/src/backend/mcp/tools/ui-tools.js +356 -0
  61. package/src/backend/mcp/types.js +15 -0
  62. package/src/backend/middleware/local-auth.js +116 -0
  63. package/src/backend/server.js +5951 -0
  64. package/src/backend/services/agent-event-log.js +350 -0
  65. package/src/backend/services/architecture-rule.js +584 -0
  66. package/src/backend/services/architecture-rules.js +275 -0
  67. package/src/backend/services/artefact-content-service.js +181 -0
  68. package/src/backend/services/artefact-service.js +305 -0
  69. package/src/backend/services/artefact-watcher.js +167 -0
  70. package/src/backend/services/ast-parser.js +327 -0
  71. package/src/backend/services/audio-buffer-service.js +152 -0
  72. package/src/backend/services/awareness-notices.js +139 -0
  73. package/src/backend/services/awareness-replies.js +194 -0
  74. package/src/backend/services/awareness-service.js +344 -0
  75. package/src/backend/services/awareness-signals.js +267 -0
  76. package/src/backend/services/baseline-store.js +83 -0
  77. package/src/backend/services/branch-workstreams.js +341 -0
  78. package/src/backend/services/breakpoint-service.js +584 -0
  79. package/src/backend/services/brief-service.js +299 -0
  80. package/src/backend/services/budget-service.js +528 -0
  81. package/src/backend/services/callsites/base.js +15 -0
  82. package/src/backend/services/callsites/csharp.js +148 -0
  83. package/src/backend/services/callsites/go.js +163 -0
  84. package/src/backend/services/callsites/index.js +53 -0
  85. package/src/backend/services/callsites/kotlin.js +123 -0
  86. package/src/backend/services/callsites/process-env.js +125 -0
  87. package/src/backend/services/callsites/python.js +91 -0
  88. package/src/backend/services/callsites/ruby.js +164 -0
  89. package/src/backend/services/callsites/shared.js +198 -0
  90. package/src/backend/services/callsites/swift.js +115 -0
  91. package/src/backend/services/callsites/typescript.js +87 -0
  92. package/src/backend/services/capability-token.js +108 -0
  93. package/src/backend/services/change-check.js +156 -0
  94. package/src/backend/services/channel-dispatcher-service.js +235 -0
  95. package/src/backend/services/channel-event-file-service.js +125 -0
  96. package/src/backend/services/channel-event-service.js +297 -0
  97. package/src/backend/services/check-runs.js +177 -0
  98. package/src/backend/services/checkout-identity.js +73 -0
  99. package/src/backend/services/claude-code-parallel.js +221 -0
  100. package/src/backend/services/claude-desktop-config.js +186 -0
  101. package/src/backend/services/clock.js +57 -0
  102. package/src/backend/services/cloud-files.js +191 -0
  103. package/src/backend/services/coalesce.js +50 -0
  104. package/src/backend/services/code-breakpoints.js +291 -0
  105. package/src/backend/services/comment-service.js +168 -0
  106. package/src/backend/services/commit-attribution.js +134 -0
  107. package/src/backend/services/commit-edges.js +99 -0
  108. package/src/backend/services/confined-fs.js +241 -0
  109. package/src/backend/services/conformity-gate.js +132 -0
  110. package/src/backend/services/contribution-service.js +409 -0
  111. package/src/backend/services/coverage-service.js +173 -0
  112. package/src/backend/services/criteria-service.js +721 -0
  113. package/src/backend/services/criterion-checks.js +387 -0
  114. package/src/backend/services/criterion-loop-service.js +411 -0
  115. package/src/backend/services/cross-system-service.js +231 -0
  116. package/src/backend/services/database.js +916 -0
  117. package/src/backend/services/db-schema.js +1358 -0
  118. package/src/backend/services/deviation-service.js +344 -0
  119. package/src/backend/services/diff-engine.js +168 -0
  120. package/src/backend/services/evidence.js +363 -0
  121. package/src/backend/services/external-intake-service.js +269 -0
  122. package/src/backend/services/external-pointer-service.js +195 -0
  123. package/src/backend/services/external-refs-service.js +214 -0
  124. package/src/backend/services/file-history.js +158 -0
  125. package/src/backend/services/file-watcher.js +193 -0
  126. package/src/backend/services/folder-requests.js +118 -0
  127. package/src/backend/services/freeze-service.js +189 -0
  128. package/src/backend/services/gemini-cli-hook.js +172 -0
  129. package/src/backend/services/git-activity-service.js +325 -0
  130. package/src/backend/services/git-blobs.js +70 -0
  131. package/src/backend/services/git-branches.js +357 -0
  132. package/src/backend/services/git-checkout.js +153 -0
  133. package/src/backend/services/git-commit-service.js +91 -0
  134. package/src/backend/services/git-env.js +121 -0
  135. package/src/backend/services/git-identity.js +84 -0
  136. package/src/backend/services/git-refs.js +386 -0
  137. package/src/backend/services/git-safety.js +58 -0
  138. package/src/backend/services/grant-guard.js +67 -0
  139. package/src/backend/services/html-view-policy.js +135 -0
  140. package/src/backend/services/human-decision.js +55 -0
  141. package/src/backend/services/importers.js +159 -0
  142. package/src/backend/services/intent-service.js +105 -0
  143. package/src/backend/services/ipc-dispatcher.js +164 -0
  144. package/src/backend/services/item-git-state.js +208 -0
  145. package/src/backend/services/line-changes.js +232 -0
  146. package/src/backend/services/line-history.js +174 -0
  147. package/src/backend/services/local-api-changes.js +40 -0
  148. package/src/backend/services/logger.js +217 -0
  149. package/src/backend/services/material-footprints.js +203 -0
  150. package/src/backend/services/material-place.js +82 -0
  151. package/src/backend/services/material-reader/child.js +4 -0
  152. package/src/backend/services/material-reader/docx-markdown.js +198 -0
  153. package/src/backend/services/material-reader/fixtures.test-helper.js +169 -0
  154. package/src/backend/services/material-reader/quote.js +44 -0
  155. package/src/backend/services/material-reader/read.js +430 -0
  156. package/src/backend/services/material-reader/reader-host.js +202 -0
  157. package/src/backend/services/material-signals.js +141 -0
  158. package/src/backend/services/mcp-capabilities.js +390 -0
  159. package/src/backend/services/mdns-service.js +304 -0
  160. package/src/backend/services/mobile-api-server.js +281 -0
  161. package/src/backend/services/mobile-approvals.js +306 -0
  162. package/src/backend/services/mobile-awareness.js +180 -0
  163. package/src/backend/services/mobile-breakpoints.js +115 -0
  164. package/src/backend/services/mobile-budget.js +98 -0
  165. package/src/backend/services/mobile-freeze.js +106 -0
  166. package/src/backend/services/mobile-proposals.js +100 -0
  167. package/src/backend/services/mobile-rpc-service.js +1289 -0
  168. package/src/backend/services/mobile-workstreams.js +160 -0
  169. package/src/backend/services/monorepo-detector.js +131 -0
  170. package/src/backend/services/other-work.js +45 -0
  171. package/src/backend/services/pack-seal.js +129 -0
  172. package/src/backend/services/paired-device-service.js +192 -0
  173. package/src/backend/services/pairing-server.js +323 -0
  174. package/src/backend/services/pairing-service.js +200 -0
  175. package/src/backend/services/pantry-resolution-service.js +166 -0
  176. package/src/backend/services/parsers/base.js +124 -0
  177. package/src/backend/services/parsers/csharp.js +224 -0
  178. package/src/backend/services/parsers/go.js +180 -0
  179. package/src/backend/services/parsers/index.js +101 -0
  180. package/src/backend/services/parsers/java.js +103 -0
  181. package/src/backend/services/parsers/kotlin.js +252 -0
  182. package/src/backend/services/parsers/php.js +113 -0
  183. package/src/backend/services/parsers/python.js +189 -0
  184. package/src/backend/services/parsers/ruby.js +212 -0
  185. package/src/backend/services/parsers/rust.js +97 -0
  186. package/src/backend/services/parsers/swift.js +221 -0
  187. package/src/backend/services/parsers/typescript.js +235 -0
  188. package/src/backend/services/pattern-scan.js +65 -0
  189. package/src/backend/services/patterns.js +281 -0
  190. package/src/backend/services/peer-audit-service.js +123 -0
  191. package/src/backend/services/peer-auth.js +153 -0
  192. package/src/backend/services/peer-capabilities.js +209 -0
  193. package/src/backend/services/peer-connection-service.js +450 -0
  194. package/src/backend/services/peer-grants.js +33 -0
  195. package/src/backend/services/persistence.js +116 -0
  196. package/src/backend/services/personal-sync-service.js +232 -0
  197. package/src/backend/services/pipeline-approvals.js +72 -0
  198. package/src/backend/services/pipeline.js +232 -0
  199. package/src/backend/services/plan-arrivals.js +68 -0
  200. package/src/backend/services/plan-changes-service.js +273 -0
  201. package/src/backend/services/plan-conflict-service.js +288 -0
  202. package/src/backend/services/plan-dependencies.js +91 -0
  203. package/src/backend/services/plan-doc-guard.js +90 -0
  204. package/src/backend/services/plan-documents-service.js +275 -0
  205. package/src/backend/services/plan-event-service.js +154 -0
  206. package/src/backend/services/plan-file-refs.js +106 -0
  207. package/src/backend/services/plan-file-service.js +1564 -0
  208. package/src/backend/services/plan-history-service.js +156 -0
  209. package/src/backend/services/plan-import-service.js +261 -0
  210. package/src/backend/services/plan-item-service.js +1223 -0
  211. package/src/backend/services/plan-migrate-service.js +395 -0
  212. package/src/backend/services/plan-overlay-service.js +173 -0
  213. package/src/backend/services/plan-phases-service.js +182 -0
  214. package/src/backend/services/plan-progress-service.js +134 -0
  215. package/src/backend/services/plan-review-service.js +262 -0
  216. package/src/backend/services/plan-service.js +682 -0
  217. package/src/backend/services/plan-status.js +113 -0
  218. package/src/backend/services/plan-template-publish-service.js +217 -0
  219. package/src/backend/services/plan-templates-service.js +242 -0
  220. package/src/backend/services/plan-templates.js +1164 -0
  221. package/src/backend/services/planned-overlap-actions.js +200 -0
  222. package/src/backend/services/plans-home.js +224 -0
  223. package/src/backend/services/play-forward.js +256 -0
  224. package/src/backend/services/playback-service.js +117 -0
  225. package/src/backend/services/power-service.js +167 -0
  226. package/src/backend/services/power-signals.js +81 -0
  227. package/src/backend/services/pr-draft-service.js +142 -0
  228. package/src/backend/services/presence-service.js +122 -0
  229. package/src/backend/services/pricing.js +60 -0
  230. package/src/backend/services/project-config-service.js +474 -0
  231. package/src/backend/services/project-scanner.js +184 -0
  232. package/src/backend/services/projection-service.js +69 -0
  233. package/src/backend/services/push-notification-service.js +288 -0
  234. package/src/backend/services/recent-projects-service.js +204 -0
  235. package/src/backend/services/record-chain.js +162 -0
  236. package/src/backend/services/recurrence-rule.js +63 -0
  237. package/src/backend/services/recurring-agent.js +89 -0
  238. package/src/backend/services/recurring-scheduler.js +77 -0
  239. package/src/backend/services/recurring-service.js +276 -0
  240. package/src/backend/services/reference-service.js +169 -0
  241. package/src/backend/services/release-public-key.js +30 -0
  242. package/src/backend/services/release-signature.js +64 -0
  243. package/src/backend/services/remote-audio-service.js +224 -0
  244. package/src/backend/services/remote-interaction-service.js +275 -0
  245. package/src/backend/services/remote-terminal-service.js +324 -0
  246. package/src/backend/services/rendition/child/main.js +76 -0
  247. package/src/backend/services/rendition/engine-host.js +249 -0
  248. package/src/backend/services/rendition/engine-lock.js +39 -0
  249. package/src/backend/services/rendition/engine-lock.json +14 -0
  250. package/src/backend/services/rendition/engine-manifest.js +97 -0
  251. package/src/backend/services/rendition/network-proof.js +73 -0
  252. package/src/backend/services/rendition/rendition-service.js +175 -0
  253. package/src/backend/services/replay-frames.js +387 -0
  254. package/src/backend/services/replay-state.js +201 -0
  255. package/src/backend/services/resolvers/base.js +108 -0
  256. package/src/backend/services/resolvers/csharp.js +109 -0
  257. package/src/backend/services/resolvers/go.js +105 -0
  258. package/src/backend/services/resolvers/index.js +60 -0
  259. package/src/backend/services/resolvers/java.js +63 -0
  260. package/src/backend/services/resolvers/kotlin.js +109 -0
  261. package/src/backend/services/resolvers/php.js +89 -0
  262. package/src/backend/services/resolvers/python.js +154 -0
  263. package/src/backend/services/resolvers/ruby.js +103 -0
  264. package/src/backend/services/resolvers/rust.js +77 -0
  265. package/src/backend/services/resolvers/swift.js +98 -0
  266. package/src/backend/services/resolvers/typescript.js +71 -0
  267. package/src/backend/services/retention.js +54 -0
  268. package/src/backend/services/review-architecture.js +236 -0
  269. package/src/backend/services/review-attest.js +68 -0
  270. package/src/backend/services/review-bundle.js +226 -0
  271. package/src/backend/services/review-graduation.js +93 -0
  272. package/src/backend/services/review-host/bitbucket.js +79 -0
  273. package/src/backend/services/review-host/detect.js +80 -0
  274. package/src/backend/services/review-host/github.js +97 -0
  275. package/src/backend/services/review-host/gitlab.js +77 -0
  276. package/src/backend/services/review-host/host-state.js +103 -0
  277. package/src/backend/services/review-host/http.js +58 -0
  278. package/src/backend/services/review-host/switch.js +120 -0
  279. package/src/backend/services/review-marks.js +72 -0
  280. package/src/backend/services/review-notes.js +169 -0
  281. package/src/backend/services/review-other-work.js +90 -0
  282. package/src/backend/services/review-queue-service.js +147 -0
  283. package/src/backend/services/review-risk.js +127 -0
  284. package/src/backend/services/review-task.js +121 -0
  285. package/src/backend/services/rule-approvals.js +268 -0
  286. package/src/backend/services/rule-baseline.js +134 -0
  287. package/src/backend/services/rule-changes.js +162 -0
  288. package/src/backend/services/rule-preview.js +47 -0
  289. package/src/backend/services/rule-proposals.js +104 -0
  290. package/src/backend/services/rule-scope.js +76 -0
  291. package/src/backend/services/rulebook.js +286 -0
  292. package/src/backend/services/rules-at.js +56 -0
  293. package/src/backend/services/rules-overview.js +88 -0
  294. package/src/backend/services/schema-reconciler.js +250 -0
  295. package/src/backend/services/secret-store.js +119 -0
  296. package/src/backend/services/section-workstreams.js +95 -0
  297. package/src/backend/services/self-write-tracker.js +75 -0
  298. package/src/backend/services/sensor-bridge-service.js +285 -0
  299. package/src/backend/services/session-service.js +192 -0
  300. package/src/backend/services/settings-service.js +324 -0
  301. package/src/backend/services/signal-breakpoints.js +172 -0
  302. package/src/backend/services/signed-approval-record.js +86 -0
  303. package/src/backend/services/signed-approvals.js +244 -0
  304. package/src/backend/services/signoff-pack.js +328 -0
  305. package/src/backend/services/signoff-rows.js +114 -0
  306. package/src/backend/services/skill-arrival-service.js +138 -0
  307. package/src/backend/services/skill-model.js +193 -0
  308. package/src/backend/services/skill-use-service.js +140 -0
  309. package/src/backend/services/skills-service.js +150 -0
  310. package/src/backend/services/snapshot-compare-service.js +397 -0
  311. package/src/backend/services/source-control.js +189 -0
  312. package/src/backend/services/spec-links-service.js +123 -0
  313. package/src/backend/services/spec-proposal-withdraw.js +50 -0
  314. package/src/backend/services/spec-proposals-service.js +470 -0
  315. package/src/backend/services/sql/embedded.js +95 -0
  316. package/src/backend/services/sql/index.js +63 -0
  317. package/src/backend/services/sql/refs.js +357 -0
  318. package/src/backend/services/sql/schema.js +312 -0
  319. package/src/backend/services/sql/tokenizer.js +195 -0
  320. package/src/backend/services/stack-overlaps.js +117 -0
  321. package/src/backend/services/stack-service.js +225 -0
  322. package/src/backend/services/state-sync-service.js +384 -0
  323. package/src/backend/services/stuck-sensor-service.js +200 -0
  324. package/src/backend/services/system-discovery.js +481 -0
  325. package/src/backend/services/system-docs-service.js +701 -0
  326. package/src/backend/services/task-attachments-service.js +340 -0
  327. package/src/backend/services/task-grounding.js +60 -0
  328. package/src/backend/services/task-records/check-run-record.js +146 -0
  329. package/src/backend/services/task-records/check-runs.js +115 -0
  330. package/src/backend/services/task-records/heads.js +88 -0
  331. package/src/backend/services/task-records/material-reads.js +225 -0
  332. package/src/backend/services/task-records/read-record.js +100 -0
  333. package/src/backend/services/task-records/record.js +173 -0
  334. package/src/backend/services/task-records/run-record.js +136 -0
  335. package/src/backend/services/task-records/shared-state.js +548 -0
  336. package/src/backend/services/task-records/signing.js +140 -0
  337. package/src/backend/services/task-records/split-signals.js +52 -0
  338. package/src/backend/services/task-records/test-runs.js +164 -0
  339. package/src/backend/services/task-records/trust.js +243 -0
  340. package/src/backend/services/task-rules.js +81 -0
  341. package/src/backend/services/task-workstreams.js +90 -0
  342. package/src/backend/services/terminal-history-service.js +266 -0
  343. package/src/backend/services/terminal-service.js +267 -0
  344. package/src/backend/services/test-clock.js +53 -0
  345. package/src/backend/services/tests/grounding.js +266 -0
  346. package/src/backend/services/tests/junit.js +104 -0
  347. package/src/backend/services/tests/teammate-runs.js +134 -0
  348. package/src/backend/services/tests/test-results.js +234 -0
  349. package/src/backend/services/tree-watcher.js +204 -0
  350. package/src/backend/services/trellis-service.js +204 -0
  351. package/src/backend/services/trusted-roots.js +186 -0
  352. package/src/backend/services/update-download-service.js +342 -0
  353. package/src/backend/services/update-service.js +266 -0
  354. package/src/backend/services/watch-ignore.js +76 -0
  355. package/src/backend/services/webhook-egress.js +206 -0
  356. package/src/backend/services/webrtc-service.js +413 -0
  357. package/src/backend/services/work-changes.js +59 -0
  358. package/src/backend/services/workstream-binding.js +82 -0
  359. package/src/backend/services/workstream-commits.js +116 -0
  360. package/src/backend/services/workstream-imports.js +177 -0
  361. package/src/backend/services/workstream-service.js +335 -0
  362. package/src/backend/services/workstream-symbols.js +223 -0
  363. package/src/backend/services/workstream-watch-service.js +391 -0
  364. package/src/backend/services/worktree-service.js +235 -0
  365. package/src/cli/agent.js +100 -0
  366. package/src/cli/args.js +201 -0
  367. package/src/cli/conformity.js +106 -0
  368. package/src/cli/desktop.js +91 -0
  369. package/src/cli/main.js +409 -0
  370. package/src/cli/pipeline.js +109 -0
  371. package/src/cli/plan-verbs.js +259 -0
  372. package/src/cli/review-adapters.js +218 -0
  373. package/src/cli/review-output.js +93 -0
  374. package/src/cli/review-post.js +89 -0
  375. package/src/cli/review-sink.js +183 -0
  376. package/src/cli/review-skill.js +44 -0
  377. package/src/cli/review-verify.js +104 -0
  378. package/src/cli/review.js +386 -0
  379. package/src/cli/sarif.js +148 -0
  380. package/src/cli/verbs.js +359 -0
  381. package/src/shared/build-info.js +39 -0
  382. package/src/shared/lib/agent-review.js +199 -0
  383. package/src/shared/lib/agent-turns.js +140 -0
  384. package/src/shared/lib/awareness-digest.js +120 -0
  385. package/src/shared/lib/branch-name.js +45 -0
  386. package/src/shared/lib/breakpoint-words.js +118 -0
  387. package/src/shared/lib/budget-words.js +56 -0
  388. package/src/shared/lib/burst.js +69 -0
  389. package/src/shared/lib/call-entry.js +105 -0
  390. package/src/shared/lib/check-compare.js +42 -0
  391. package/src/shared/lib/check-words.js +216 -0
  392. package/src/shared/lib/csv.js +62 -0
  393. package/src/shared/lib/folder-entry.js +87 -0
  394. package/src/shared/lib/freeze-words.js +60 -0
  395. package/src/shared/lib/fuzzy.js +84 -0
  396. package/src/shared/lib/git-state-words.js +80 -0
  397. package/src/shared/lib/grep-entry.js +86 -0
  398. package/src/shared/lib/grounding-line.js +61 -0
  399. package/src/shared/lib/import-line.js +71 -0
  400. package/src/shared/lib/item-status.js +249 -0
  401. package/src/shared/lib/line-changes.js +53 -0
  402. package/src/shared/lib/locator.js +71 -0
  403. package/src/shared/lib/matcher.js +120 -0
  404. package/src/shared/lib/merge-order.js +65 -0
  405. package/src/shared/lib/open-findings.js +68 -0
  406. package/src/shared/lib/other-work.js +108 -0
  407. package/src/shared/lib/package-entry.js +142 -0
  408. package/src/shared/lib/plan-vocab.js +40 -0
  409. package/src/shared/lib/pptx-xml.js +86 -0
  410. package/src/shared/lib/proposal-words.js +61 -0
  411. package/src/shared/lib/recurrence.js +183 -0
  412. package/src/shared/lib/references.js +72 -0
  413. package/src/shared/lib/rule-pattern.js +56 -0
  414. package/src/shared/lib/sdp-fingerprint.js +115 -0
  415. package/src/shared/lib/sdp-minimal.js +123 -0
  416. package/src/shared/lib/secret-paths.js +34 -0
  417. package/src/shared/lib/signal-words.js +172 -0
  418. package/src/shared/lib/signoff.js +56 -0
  419. package/src/shared/lib/skills-note.js +60 -0
  420. package/src/shared/lib/spec-sections.js +78 -0
  421. package/src/shared/lib/symbol-entry.js +60 -0
  422. package/src/shared/lib/tool-phrasing.js +338 -0
  423. package/src/shared/lib/turn-gap.js +27 -0
  424. package/src/shared/lib/workstream-words.js +38 -0
  425. package/src/shared/lib/xlsx-xml.js +144 -0
  426. package/src/shared/lib/zip-reader.js +99 -0
  427. package/src/shared/types/agent.js +27 -0
  428. package/src/shared/types/architecture-rules.js +30 -0
  429. package/src/shared/types/ast.js +15 -0
  430. package/src/shared/types/breakpoint.js +33 -0
  431. package/src/shared/types/channel.js +41 -0
  432. package/src/shared/types/criteria.js +15 -0
  433. package/src/shared/types/graph.js +15 -0
  434. package/src/shared/types/index.js +53 -0
  435. package/src/shared/types/peer.js +36 -0
  436. package/src/shared/types/pipeline.js +15 -0
  437. package/src/shared/types/plan.js +15 -0
  438. package/src/shared/types/play-forward.js +15 -0
  439. package/src/shared/types/power.js +15 -0
  440. package/src/shared/types/presence.js +15 -0
  441. package/src/shared/types/project-config.js +35 -0
  442. package/src/shared/types/project.js +15 -0
  443. package/src/shared/types/record.js +15 -0
  444. package/src/shared/types/recurring.js +15 -0
  445. package/src/shared/types/review.js +15 -0
  446. package/src/shared/types/settings.js +114 -0
  447. package/src/shared/types/stack.js +15 -0
  448. package/src/shared/types/system-doc.js +15 -0
  449. package/src/shared/types/system.js +15 -0
@@ -0,0 +1,409 @@
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 contribution_service_exports = {};
29
+ __export(contribution_service_exports, {
30
+ acceptContributions: () => acceptContributions,
31
+ listContributions: () => listContributions,
32
+ listContributionsForBranch: () => listContributionsForBranch,
33
+ prepareContributorBranch: () => prepareContributorBranch,
34
+ promoteAttachmentToContribution: () => promoteAttachmentToContribution,
35
+ promoteItemToContribution: () => promoteItemToContribution
36
+ });
37
+ module.exports = __toCommonJS(contribution_service_exports);
38
+ var import_node_child_process = require("node:child_process");
39
+ var import_confined_fs = require("./confined-fs");
40
+ var import_node_fs = __toESM(require("node:fs"));
41
+ var import_node_path = __toESM(require("node:path"));
42
+ var import_yaml = require("yaml");
43
+ var import_plans_home = require("./plans-home");
44
+ function assertSafeBranchSegment(branch) {
45
+ if (typeof branch !== "string" || branch.length === 0 || branch.length > 255) {
46
+ throw new import_confined_fs.ConfinementError("Invalid branch name for a contributions directory");
47
+ }
48
+ if (branch.split(/[\\/]/).some((seg) => seg === ".." || seg === "." || seg === "")) {
49
+ throw new import_confined_fs.ConfinementError(
50
+ `Branch name "${branch}" contains a path segment that cannot be used as a directory`
51
+ );
52
+ }
53
+ if (import_node_path.default.isAbsolute(branch)) {
54
+ throw new import_confined_fs.ConfinementError(`Branch name "${branch}" looks like an absolute path`);
55
+ }
56
+ return branch;
57
+ }
58
+ function promoteItemToContribution(projectRoot, itemData) {
59
+ const branch = getCurrentBranch(projectRoot);
60
+ const contribDir = import_node_path.default.join(projectRoot, ".codetrellis", "contributions", assertSafeBranchSegment(branch), "items");
61
+ import_node_fs.default.mkdirSync(contribDir, { recursive: true });
62
+ removeOldPromotionFile(contribDir, itemData.uid);
63
+ const slug = slugify(itemData.title);
64
+ const fileName = `${slug}.yaml`;
65
+ const filePath = import_node_path.default.join(contribDir, fileName);
66
+ const relPath = import_node_path.default.relative(projectRoot, filePath);
67
+ const yamlContent = (0, import_yaml.stringify)({
68
+ uid: itemData.uid,
69
+ title: itemData.title,
70
+ kind: itemData.kind,
71
+ status: itemData.status ?? "pending",
72
+ body: itemData.body ?? null,
73
+ promotedAt: (/* @__PURE__ */ new Date()).toISOString(),
74
+ ...itemData.attachments?.length ? { attachments: itemData.attachments } : {}
75
+ });
76
+ import_node_fs.default.writeFileSync(filePath, yamlContent, "utf-8");
77
+ updateContributionIndex(projectRoot, branch, {
78
+ uid: itemData.uid,
79
+ branch,
80
+ kind: "item",
81
+ title: itemData.title,
82
+ description: itemData.description,
83
+ filePath: relPath,
84
+ promotedAt: (/* @__PURE__ */ new Date()).toISOString()
85
+ });
86
+ return {
87
+ uid: itemData.uid,
88
+ branch,
89
+ kind: "item",
90
+ title: itemData.title,
91
+ description: itemData.description,
92
+ filePath: relPath,
93
+ promotedAt: (/* @__PURE__ */ new Date()).toISOString()
94
+ };
95
+ }
96
+ function promoteAttachmentToContribution(projectRoot, attachmentData) {
97
+ const branch = getCurrentBranch(projectRoot);
98
+ const contribDir = import_node_path.default.join(projectRoot, ".codetrellis", "contributions", assertSafeBranchSegment(branch), "attachments");
99
+ import_node_fs.default.mkdirSync(contribDir, { recursive: true });
100
+ const ext = import_node_path.default.extname(attachmentData.sourcePath) || ".bin";
101
+ const destName = `${attachmentData.uid}${ext}`;
102
+ const destPath = import_node_path.default.join(contribDir, destName);
103
+ const relPath = import_node_path.default.relative(projectRoot, destPath);
104
+ if (import_node_fs.default.existsSync(attachmentData.sourcePath)) {
105
+ import_node_fs.default.copyFileSync(attachmentData.sourcePath, destPath);
106
+ }
107
+ const metaPath = import_node_path.default.join(contribDir, `${attachmentData.uid}.meta.yaml`);
108
+ import_node_fs.default.writeFileSync(metaPath, (0, import_yaml.stringify)({
109
+ uid: attachmentData.uid,
110
+ label: attachmentData.label,
111
+ contentType: attachmentData.contentType ?? "application/octet-stream",
112
+ fileName: destName,
113
+ promotedAt: (/* @__PURE__ */ new Date()).toISOString()
114
+ }), "utf-8");
115
+ updateContributionIndex(projectRoot, branch, {
116
+ uid: attachmentData.uid,
117
+ branch,
118
+ kind: "attachment",
119
+ title: attachmentData.label,
120
+ description: attachmentData.description,
121
+ filePath: relPath,
122
+ promotedAt: (/* @__PURE__ */ new Date()).toISOString()
123
+ });
124
+ return {
125
+ uid: attachmentData.uid,
126
+ branch,
127
+ kind: "attachment",
128
+ title: attachmentData.label,
129
+ description: attachmentData.description,
130
+ filePath: relPath,
131
+ promotedAt: (/* @__PURE__ */ new Date()).toISOString()
132
+ };
133
+ }
134
+ function listContributions(projectRoot) {
135
+ const branch = getCurrentBranch(projectRoot);
136
+ return listContributionsForBranch(projectRoot, branch);
137
+ }
138
+ function listContributionsForBranch(projectRoot, branch) {
139
+ const indexPath = import_node_path.default.join(projectRoot, ".codetrellis", "contributions", branch, "index.json");
140
+ if (!import_node_fs.default.existsSync(indexPath)) {
141
+ return { branch, total: 0, items: [] };
142
+ }
143
+ try {
144
+ const raw = import_node_fs.default.readFileSync(indexPath, "utf-8");
145
+ const items = JSON.parse(raw);
146
+ return { branch, total: items.length, items };
147
+ } catch {
148
+ return { branch, total: 0, items: [] };
149
+ }
150
+ }
151
+ function acceptContributions(projectRoot, branch, planSlug) {
152
+ projectRoot = (0, import_plans_home.plansHome)(projectRoot) ?? projectRoot;
153
+ const contribDir = import_node_path.default.join(
154
+ projectRoot,
155
+ ".codetrellis",
156
+ "contributions",
157
+ assertSafeBranchSegment(branch)
158
+ );
159
+ const planItemsDir = import_node_path.default.join(projectRoot, ".codetrellis", "plans", planSlug, "items");
160
+ const errors = [];
161
+ let accepted = 0;
162
+ if (!import_node_fs.default.existsSync(contribDir)) {
163
+ return { accepted: 0, planSlug, errors: ["No contributions found for this branch"] };
164
+ }
165
+ import_node_fs.default.mkdirSync(planItemsDir, { recursive: true });
166
+ const itemsDir = import_node_path.default.join(contribDir, "items");
167
+ if (import_node_fs.default.existsSync(itemsDir)) {
168
+ const files = import_node_fs.default.readdirSync(itemsDir).filter((f) => f.endsWith(".yaml"));
169
+ const existingCount = import_node_fs.default.readdirSync(planItemsDir).filter((f) => f.endsWith(".yaml")).length;
170
+ for (let i = 0; i < files.length; i++) {
171
+ try {
172
+ const src = import_node_path.default.join(itemsDir, files[i]);
173
+ const content = import_node_fs.default.readFileSync(src, "utf-8");
174
+ const parsed = (0, import_yaml.parse)(content);
175
+ delete parsed.promotedAt;
176
+ const sortNum = String(existingCount + i + 1).padStart(3, "0");
177
+ const slug = slugify(parsed.title ?? files[i].replace(".yaml", ""));
178
+ const destName = `${sortNum}-${slug}.yaml`;
179
+ const destPath = import_node_path.default.join(planItemsDir, destName);
180
+ import_node_fs.default.writeFileSync(destPath, (0, import_yaml.stringify)(parsed), "utf-8");
181
+ accepted++;
182
+ } catch (err) {
183
+ errors.push(`Failed to accept ${files[i]}: ${err}`);
184
+ }
185
+ }
186
+ }
187
+ const attDir = import_node_path.default.join(contribDir, "attachments");
188
+ if (import_node_fs.default.existsSync(attDir)) {
189
+ const planAttDir = import_node_path.default.join(projectRoot, ".codetrellis", "attachments");
190
+ import_node_fs.default.mkdirSync(planAttDir, { recursive: true });
191
+ const files = import_node_fs.default.readdirSync(attDir).filter((f) => !f.endsWith(".meta.yaml"));
192
+ for (const file of files) {
193
+ try {
194
+ const src = import_node_path.default.join(attDir, file);
195
+ const dest = import_node_path.default.join(planAttDir, file);
196
+ import_node_fs.default.copyFileSync(src, dest);
197
+ accepted++;
198
+ } catch (err) {
199
+ errors.push(`Failed to accept attachment ${file}: ${err}`);
200
+ }
201
+ }
202
+ }
203
+ try {
204
+ (0, import_confined_fs.removeWithin)(
205
+ import_node_path.default.join(projectRoot, ".codetrellis", "contributions"),
206
+ contribDir,
207
+ { recursive: true },
208
+ "contributions cleanup"
209
+ );
210
+ } catch (err) {
211
+ if (!(err instanceof import_confined_fs.ConfinementError)) {
212
+ const e = err;
213
+ if (e.code !== "ENOENT") throw err;
214
+ } else {
215
+ throw err;
216
+ }
217
+ }
218
+ return { accepted, planSlug, errors };
219
+ }
220
+ function prepareContributorBranch(projectRoot, planSlug, branchName, options) {
221
+ projectRoot = (0, import_plans_home.plansHome)(projectRoot) ?? projectRoot;
222
+ const planDir = import_node_path.default.join(projectRoot, ".codetrellis", "plans", planSlug);
223
+ if (!import_node_fs.default.existsSync(planDir)) {
224
+ throw new Error(`Plan directory not found: ${planDir}`);
225
+ }
226
+ const planYamlPath = import_node_path.default.join(planDir, "plan.yaml");
227
+ if (!import_node_fs.default.existsSync(planYamlPath)) {
228
+ throw new Error(`plan.yaml not found for ${planSlug}`);
229
+ }
230
+ const dirty = runGitArgs(
231
+ ["status", "--porcelain", "--", ".codetrellis/"],
232
+ projectRoot
233
+ ).trim();
234
+ if (dirty) {
235
+ const files = dirty.split("\n").slice(0, 5).map((l) => l.slice(3)).join(", ");
236
+ throw new Error(
237
+ `Uncommitted changes under .codetrellis/ would be committed onto the contributor branch and disappear from this one. Commit or stash them first: ${files}` + (dirty.split("\n").length > 5 ? " \u2026" : "")
238
+ );
239
+ }
240
+ const planYaml = import_node_fs.default.readFileSync(planYamlPath, "utf-8");
241
+ const planMeta = (0, import_yaml.parse)(planYaml);
242
+ const itemsDir = import_node_path.default.join(planDir, "items");
243
+ const items = readItemsRecursive(itemsDir);
244
+ const filteredItems = items.filter((item) => {
245
+ if (options?.includeItems?.length) {
246
+ return options.includeItems.includes(item.uid);
247
+ }
248
+ return (item.visibility ?? "shared") === "shared";
249
+ });
250
+ const cleanedItems = filteredItems.map((item) => stripPrivateContent(item));
251
+ runGitArgs(["checkout", "-b", branchName], projectRoot);
252
+ try {
253
+ const branchPlanDir = import_node_path.default.join(projectRoot, ".codetrellis", "plans", planSlug);
254
+ const branchItemsDir = import_node_path.default.join(branchPlanDir, "items");
255
+ if (import_node_fs.default.existsSync(branchItemsDir)) {
256
+ import_node_fs.default.rmSync(branchItemsDir, { recursive: true, force: true });
257
+ }
258
+ import_node_fs.default.mkdirSync(branchItemsDir, { recursive: true });
259
+ const cleanPlan = { ...planMeta };
260
+ delete cleanPlan.internalNotes;
261
+ import_node_fs.default.writeFileSync(planYamlPath, (0, import_yaml.stringify)(cleanPlan), "utf-8");
262
+ for (let i = 0; i < cleanedItems.length; i++) {
263
+ const item = cleanedItems[i];
264
+ const sortNum = String(i + 1).padStart(3, "0");
265
+ const slug = slugify(item.title ?? "item");
266
+ const fileName = `${sortNum}-${slug}.yaml`;
267
+ import_node_fs.default.writeFileSync(
268
+ import_node_path.default.join(branchItemsDir, fileName),
269
+ (0, import_yaml.stringify)(item),
270
+ "utf-8"
271
+ );
272
+ }
273
+ const contribDir = import_node_path.default.join(projectRoot, ".codetrellis", "contributions");
274
+ if (import_node_fs.default.existsSync(contribDir)) {
275
+ import_node_fs.default.rmSync(contribDir, { recursive: true, force: true });
276
+ }
277
+ runGitArgs(["add", ".codetrellis/"], projectRoot);
278
+ const message = `[cdev] prepare contributor branch: ${planSlug}
279
+
280
+ Filtered to ${cleanedItems.length} shared items for external collaboration.`;
281
+ runGitArgs(["commit", "-m", message, "--allow-empty", "--", ".codetrellis/"], projectRoot);
282
+ const sha = runGitArgs(["rev-parse", "HEAD"], projectRoot).trim();
283
+ runGitArgs(["checkout", "-"], projectRoot);
284
+ return {
285
+ branch: branchName,
286
+ planSlug,
287
+ itemCount: cleanedItems.length,
288
+ commitHash: sha
289
+ };
290
+ } catch (err) {
291
+ try {
292
+ runGitArgs(["checkout", "-"], projectRoot);
293
+ runGitArgs(["branch", "-D", branchName], projectRoot);
294
+ } catch {
295
+ }
296
+ throw err;
297
+ }
298
+ }
299
+ function getCurrentBranch(projectRoot) {
300
+ try {
301
+ return runGitArgs(["rev-parse", "--abbrev-ref", "HEAD"], projectRoot).trim();
302
+ } catch {
303
+ return "detached";
304
+ }
305
+ }
306
+ function runGitArgs(args, cwd) {
307
+ return (0, import_node_child_process.execFileSync)("git", args, {
308
+ cwd,
309
+ encoding: "utf-8",
310
+ stdio: ["ignore", "pipe", "pipe"],
311
+ timeout: 15e3
312
+ });
313
+ }
314
+ function removeOldPromotionFile(contribDir, uid) {
315
+ if (!import_node_fs.default.existsSync(contribDir)) return;
316
+ const files = import_node_fs.default.readdirSync(contribDir).filter((f) => f.endsWith(".yaml"));
317
+ for (const file of files) {
318
+ try {
319
+ const content = import_node_fs.default.readFileSync(import_node_path.default.join(contribDir, file), "utf-8");
320
+ if (content.includes(`uid: ${uid}`) || content.includes(`uid: "${uid}"`)) {
321
+ import_node_fs.default.unlinkSync(import_node_path.default.join(contribDir, file));
322
+ return;
323
+ }
324
+ } catch {
325
+ }
326
+ }
327
+ }
328
+ function slugify(text) {
329
+ return text.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 60);
330
+ }
331
+ function updateContributionIndex(projectRoot, branch, contribution) {
332
+ const indexPath = import_node_path.default.join(projectRoot, ".codetrellis", "contributions", branch, "index.json");
333
+ let items = [];
334
+ if (import_node_fs.default.existsSync(indexPath)) {
335
+ try {
336
+ items = JSON.parse(import_node_fs.default.readFileSync(indexPath, "utf-8"));
337
+ } catch {
338
+ }
339
+ }
340
+ const idx = items.findIndex((i) => i.uid === contribution.uid);
341
+ if (idx >= 0) {
342
+ items[idx] = contribution;
343
+ } else {
344
+ items.push(contribution);
345
+ }
346
+ import_node_fs.default.mkdirSync(import_node_path.default.dirname(indexPath), { recursive: true });
347
+ import_node_fs.default.writeFileSync(indexPath, JSON.stringify(items, null, 2), "utf-8");
348
+ }
349
+ function readItemsRecursive(dir) {
350
+ const items = [];
351
+ if (!import_node_fs.default.existsSync(dir)) return items;
352
+ const entries = import_node_fs.default.readdirSync(dir, { withFileTypes: true });
353
+ for (const entry of entries) {
354
+ const fullPath = import_node_path.default.join(dir, entry.name);
355
+ if (entry.isDirectory()) {
356
+ const selfPath = import_node_path.default.join(fullPath, "_self.yaml");
357
+ if (import_node_fs.default.existsSync(selfPath)) {
358
+ try {
359
+ const parsed = (0, import_yaml.parse)(import_node_fs.default.readFileSync(selfPath, "utf-8"));
360
+ if (parsed) items.push(parsed);
361
+ } catch {
362
+ }
363
+ }
364
+ items.push(...readItemsRecursive(fullPath));
365
+ } else if (entry.name.endsWith(".yaml") && entry.name !== "_self.yaml") {
366
+ try {
367
+ const parsed = (0, import_yaml.parse)(import_node_fs.default.readFileSync(fullPath, "utf-8"));
368
+ if (parsed) items.push(parsed);
369
+ } catch {
370
+ }
371
+ }
372
+ }
373
+ return items;
374
+ }
375
+ function stripPrivateContent(item) {
376
+ const cleaned = { ...item };
377
+ delete cleaned.visibility;
378
+ delete cleaned.visibility_override;
379
+ delete cleaned.overrideParentVisibility;
380
+ if (Array.isArray(cleaned.attachments)) {
381
+ cleaned.attachments = cleaned.attachments.filter(
382
+ (att) => {
383
+ const value = att.value;
384
+ return !value?.startsWith("userdata://");
385
+ }
386
+ );
387
+ if (cleaned.attachments.length === 0) {
388
+ delete cleaned.attachments;
389
+ }
390
+ }
391
+ if (Array.isArray(cleaned.comments)) {
392
+ cleaned.comments = cleaned.comments.filter(
393
+ (c) => (c.visibility ?? "shared") === "shared"
394
+ );
395
+ if (cleaned.comments.length === 0) {
396
+ delete cleaned.comments;
397
+ }
398
+ }
399
+ return cleaned;
400
+ }
401
+ // Annotate the CommonJS export names for ESM import in node:
402
+ 0 && (module.exports = {
403
+ acceptContributions,
404
+ listContributions,
405
+ listContributionsForBranch,
406
+ prepareContributorBranch,
407
+ promoteAttachmentToContribution,
408
+ promoteItemToContribution
409
+ });
@@ -0,0 +1,173 @@
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 coverage_service_exports = {};
19
+ __export(coverage_service_exports, {
20
+ emptyCoverageReport: () => emptyCoverageReport,
21
+ findNearMisses: () => findNearMisses,
22
+ getCoverageReport: () => getCoverageReport
23
+ });
24
+ module.exports = __toCommonJS(coverage_service_exports);
25
+ var import_database = require("./database");
26
+ const EMPTY = {
27
+ imports: { total: 0, resolved: 0, byLanguage: [] },
28
+ http: { routes: 0, calls: 0, edges: 0, unservedRoutes: 0, unmatchedCalls: 0, nearMisses: [] }
29
+ };
30
+ const MAX_NEAR_MISSES = 25;
31
+ const LABEL_EXPR = `(c.method || ' ' || c.url_pattern)`;
32
+ function scalar(sql) {
33
+ try {
34
+ const rows = (0, import_database.getDb)().exec(sql);
35
+ return rows[0]?.values[0]?.[0] ?? 0;
36
+ } catch {
37
+ return 0;
38
+ }
39
+ }
40
+ function findNearMisses(calls, routes) {
41
+ const out = [];
42
+ const byShape = /* @__PURE__ */ new Map();
43
+ for (const route of routes) {
44
+ const segs = route.pattern.split("/");
45
+ const key = `${route.method} ${segs.length}`;
46
+ const bucket = byShape.get(key);
47
+ if (bucket) bucket.push({ route, segs });
48
+ else byShape.set(key, [{ route, segs }]);
49
+ }
50
+ for (const call of calls) {
51
+ const callSegs = call.pattern.split("/");
52
+ for (const { route, segs: routeSegs } of byShape.get(`${call.method} ${callSegs.length}`) ?? []) {
53
+ let differing = -1;
54
+ let ok = true;
55
+ for (let i = 0; i < callSegs.length; i++) {
56
+ if (callSegs[i] === routeSegs[i]) continue;
57
+ if (differing !== -1) {
58
+ ok = false;
59
+ break;
60
+ }
61
+ if (!routeSegs[i].startsWith(":") || callSegs[i] === "") {
62
+ ok = false;
63
+ break;
64
+ }
65
+ differing = i;
66
+ }
67
+ if (!ok || differing === -1) continue;
68
+ out.push({
69
+ method: call.method,
70
+ callPattern: call.pattern,
71
+ routePattern: route.pattern,
72
+ callFile: call.file,
73
+ routeFile: route.file,
74
+ callLine: call.line,
75
+ routeLine: route.line,
76
+ differingSegment: {
77
+ position: differing,
78
+ inCall: callSegs[differing],
79
+ inRoute: routeSegs[differing]
80
+ }
81
+ });
82
+ if (out.length >= MAX_NEAR_MISSES) return out;
83
+ }
84
+ }
85
+ return out;
86
+ }
87
+ function unpairedCallsites(kind) {
88
+ const side = kind === "http_call" ? "source_file_id" : "target_file_id";
89
+ try {
90
+ const rows = (0, import_database.getDb)().exec(`
91
+ SELECT c.method, c.url_pattern, f.relative_path, c.line
92
+ FROM callsites c
93
+ JOIN files f ON c.file_id = f.id
94
+ WHERE c.kind = '${kind}'
95
+ AND c.method IS NOT NULL AND c.url_pattern IS NOT NULL
96
+ AND NOT EXISTS (
97
+ SELECT 1 FROM cross_system_edges e
98
+ WHERE e.${side} = c.file_id AND e.label = ${LABEL_EXPR}
99
+ )
100
+ `);
101
+ return (rows[0]?.values ?? []).map((r) => ({
102
+ method: r[0],
103
+ pattern: r[1],
104
+ file: r[2] ?? "",
105
+ line: r[3] ?? null
106
+ }));
107
+ } catch {
108
+ return [];
109
+ }
110
+ }
111
+ function getCoverageReport() {
112
+ const db = (0, import_database.getDb)();
113
+ let byLanguage = [];
114
+ let total = 0;
115
+ let resolved = 0;
116
+ try {
117
+ const rows = db.exec(`
118
+ SELECT f.language,
119
+ COUNT(*) AS total,
120
+ SUM(CASE WHEN i.resolved_path IS NOT NULL THEN 1 ELSE 0 END) AS resolved
121
+ FROM imports i
122
+ JOIN files f ON i.file_id = f.id
123
+ GROUP BY f.language
124
+ ORDER BY total DESC
125
+ `);
126
+ byLanguage = (rows[0]?.values ?? []).map((r) => ({
127
+ language: r[0] || "unknown",
128
+ imports: r[1] || 0,
129
+ resolved: r[2] || 0
130
+ }));
131
+ for (const entry of byLanguage) {
132
+ total += entry.imports;
133
+ resolved += entry.resolved;
134
+ }
135
+ } catch {
136
+ byLanguage = [];
137
+ }
138
+ const routes = scalar(`SELECT COUNT(*) FROM callsites WHERE kind = 'http_route'`);
139
+ const calls = scalar(`SELECT COUNT(*) FROM callsites WHERE kind = 'http_call'`);
140
+ const edges = scalar(`SELECT COUNT(*) FROM cross_system_edges WHERE protocol = 'http'`);
141
+ const unservedRoutes = scalar(`
142
+ SELECT COUNT(*) FROM callsites c
143
+ WHERE c.kind = 'http_route'
144
+ AND c.method IS NOT NULL AND c.url_pattern IS NOT NULL
145
+ AND NOT EXISTS (
146
+ SELECT 1 FROM cross_system_edges e
147
+ WHERE e.target_file_id = c.file_id AND e.label = ${LABEL_EXPR}
148
+ )
149
+ `);
150
+ const unmatchedCalls = scalar(`
151
+ SELECT COUNT(*) FROM callsites c
152
+ WHERE c.kind = 'http_call'
153
+ AND c.method IS NOT NULL AND c.url_pattern IS NOT NULL
154
+ AND NOT EXISTS (
155
+ SELECT 1 FROM cross_system_edges e
156
+ WHERE e.source_file_id = c.file_id AND e.label = ${LABEL_EXPR}
157
+ )
158
+ `);
159
+ const nearMisses = unmatchedCalls > 0 && unservedRoutes > 0 ? findNearMisses(unpairedCallsites("http_call"), unpairedCallsites("http_route")) : [];
160
+ return {
161
+ imports: { total, resolved, byLanguage },
162
+ http: { routes, calls, edges, unservedRoutes, unmatchedCalls, nearMisses }
163
+ };
164
+ }
165
+ function emptyCoverageReport() {
166
+ return structuredClone(EMPTY);
167
+ }
168
+ // Annotate the CommonJS export names for ESM import in node:
169
+ 0 && (module.exports = {
170
+ emptyCoverageReport,
171
+ findNearMisses,
172
+ getCoverageReport
173
+ });