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,182 @@
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 plan_phases_service_exports = {};
29
+ __export(plan_phases_service_exports, {
30
+ createPhase: () => createPhase,
31
+ deletePhase: () => deletePhase,
32
+ getPhase: () => getPhase,
33
+ listPhases: () => listPhases,
34
+ updatePhase: () => updatePhase
35
+ });
36
+ module.exports = __toCommonJS(plan_phases_service_exports);
37
+ var _lazy___plan_file_service = __toESM(require("./plan-file-service"));
38
+ var import_node_crypto = require("node:crypto");
39
+ var import_database = require("./database");
40
+ var import_persistence = require("./persistence");
41
+ function notifyMutation(planUid) {
42
+ try {
43
+ const { scheduleWriteThrough } = _lazy___plan_file_service;
44
+ scheduleWriteThrough(planUid);
45
+ } catch {
46
+ }
47
+ }
48
+ function createPhase(input) {
49
+ const db = (0, import_database.getDb)();
50
+ const uid = (0, import_node_crypto.randomUUID)();
51
+ const now = Date.now();
52
+ let phaseNumber = input.phaseNumber;
53
+ if (phaseNumber == null) {
54
+ const r = db.exec(
55
+ `SELECT COALESCE(MAX(phase_number), 0) + 1 FROM plan_phases WHERE plan_uid = ?`,
56
+ [input.planUid]
57
+ );
58
+ phaseNumber = r[0]?.values[0]?.[0] ?? 1;
59
+ }
60
+ const status = input.status ?? "pending";
61
+ db.run(
62
+ `INSERT INTO plan_phases (uid, plan_uid, phase_number, title, scope, prerequisites, git_checkpoint, acceptance_criteria, status, created_at, updated_at)
63
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
64
+ [
65
+ uid,
66
+ input.planUid,
67
+ phaseNumber,
68
+ input.title,
69
+ input.scope ?? "",
70
+ input.prerequisites ?? "",
71
+ input.gitCheckpoint ?? null,
72
+ input.acceptanceCriteria ?? "",
73
+ status,
74
+ now,
75
+ now
76
+ ]
77
+ );
78
+ (0, import_persistence.markDirty)();
79
+ notifyMutation(input.planUid);
80
+ return {
81
+ uid,
82
+ planUid: input.planUid,
83
+ phaseNumber,
84
+ title: input.title,
85
+ scope: input.scope ?? "",
86
+ prerequisites: input.prerequisites ?? "",
87
+ gitCheckpoint: input.gitCheckpoint ?? null,
88
+ acceptanceCriteria: input.acceptanceCriteria ?? "",
89
+ status,
90
+ createdAt: now,
91
+ updatedAt: now
92
+ };
93
+ }
94
+ function getPhase(uid) {
95
+ const r = (0, import_database.getDb)().exec(
96
+ `SELECT uid, plan_uid, phase_number, title, scope, prerequisites, git_checkpoint, acceptance_criteria, status, created_at, updated_at
97
+ FROM plan_phases WHERE uid = ?`,
98
+ [uid]
99
+ );
100
+ if (!r[0]?.values[0]) return null;
101
+ return rowToPhase(r[0].values[0]);
102
+ }
103
+ function listPhases(planUid) {
104
+ const r = (0, import_database.getDb)().exec(
105
+ `SELECT uid, plan_uid, phase_number, title, scope, prerequisites, git_checkpoint, acceptance_criteria, status, created_at, updated_at
106
+ FROM plan_phases WHERE plan_uid = ? ORDER BY phase_number ASC, created_at ASC`,
107
+ [planUid]
108
+ );
109
+ if (!r[0]) return [];
110
+ return r[0].values.map(rowToPhase);
111
+ }
112
+ function updatePhase(uid, updates) {
113
+ const existing = getPhase(uid);
114
+ if (!existing) return null;
115
+ const now = Date.now();
116
+ const sets = ["updated_at = ?"];
117
+ const params = [now];
118
+ if (updates.phaseNumber !== void 0) {
119
+ sets.push("phase_number = ?");
120
+ params.push(updates.phaseNumber);
121
+ }
122
+ if (updates.title !== void 0) {
123
+ sets.push("title = ?");
124
+ params.push(updates.title);
125
+ }
126
+ if (updates.scope !== void 0) {
127
+ sets.push("scope = ?");
128
+ params.push(updates.scope);
129
+ }
130
+ if (updates.prerequisites !== void 0) {
131
+ sets.push("prerequisites = ?");
132
+ params.push(updates.prerequisites);
133
+ }
134
+ if (updates.gitCheckpoint !== void 0) {
135
+ sets.push("git_checkpoint = ?");
136
+ params.push(updates.gitCheckpoint);
137
+ }
138
+ if (updates.acceptanceCriteria !== void 0) {
139
+ sets.push("acceptance_criteria = ?");
140
+ params.push(updates.acceptanceCriteria);
141
+ }
142
+ if (updates.status !== void 0) {
143
+ sets.push("status = ?");
144
+ params.push(updates.status);
145
+ }
146
+ params.push(uid);
147
+ (0, import_database.getDb)().run(`UPDATE plan_phases SET ${sets.join(", ")} WHERE uid = ?`, params);
148
+ (0, import_persistence.markDirty)();
149
+ if (existing) notifyMutation(existing.planUid);
150
+ return getPhase(uid);
151
+ }
152
+ function deletePhase(uid) {
153
+ const db = (0, import_database.getDb)();
154
+ const before = getPhase(uid);
155
+ db.run(`UPDATE tasks SET phase_uid = NULL WHERE phase_uid = ?`, [uid]);
156
+ db.run(`DELETE FROM plan_phases WHERE uid = ?`, [uid]);
157
+ (0, import_persistence.markDirty)();
158
+ if (before) notifyMutation(before.planUid);
159
+ }
160
+ function rowToPhase(r) {
161
+ return {
162
+ uid: r[0],
163
+ planUid: r[1],
164
+ phaseNumber: r[2],
165
+ title: r[3],
166
+ scope: r[4],
167
+ prerequisites: r[5],
168
+ gitCheckpoint: r[6] ?? null,
169
+ acceptanceCriteria: r[7],
170
+ status: r[8],
171
+ createdAt: r[9],
172
+ updatedAt: r[10]
173
+ };
174
+ }
175
+ // Annotate the CommonJS export names for ESM import in node:
176
+ 0 && (module.exports = {
177
+ createPhase,
178
+ deletePhase,
179
+ getPhase,
180
+ listPhases,
181
+ updatePhase
182
+ });
@@ -0,0 +1,134 @@
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 plan_progress_service_exports = {};
29
+ __export(plan_progress_service_exports, {
30
+ _setListPlansProviderForTest: () => _setListPlansProviderForTest,
31
+ clearSuggestionMemory: () => clearSuggestionMemory,
32
+ recordFileChange: () => recordFileChange
33
+ });
34
+ module.exports = __toCommonJS(plan_progress_service_exports);
35
+ var planService = __toESM(require("./plan-service"));
36
+ var planItemService = __toESM(require("./plan-item-service"));
37
+ var planChangesService = __toESM(require("./plan-changes-service"));
38
+ var import_server = require("../server");
39
+ const suggestedDone = /* @__PURE__ */ new Set();
40
+ let listPlansProvider = () => planService.listPlans();
41
+ function _setListPlansProviderForTest(fn) {
42
+ listPlansProvider = fn;
43
+ }
44
+ function recordFileChange(relativePath) {
45
+ if (!relativePath) return;
46
+ const plans = listPlansProvider().filter(
47
+ (p) => p.status === "approved" || p.status === "in_progress" || p.status === "draft" || p.status === "review"
48
+ );
49
+ if (plans.length === 0) return;
50
+ for (const plan of plans) {
51
+ const planWithTasks = planService.getPlan(plan.uid);
52
+ if (!planWithTasks) continue;
53
+ const tasks = planWithTasks.tasks;
54
+ let advanced = false;
55
+ for (const task of tasks) {
56
+ if (task.status === "done" || task.status === "skipped" || task.status === "blocked") continue;
57
+ if (!touchesTask(task.affectedFiles, relativePath)) continue;
58
+ if (task.status === "pending" || task.status === "assigned") {
59
+ planService.updateTask(task.uid, { status: "in_progress" });
60
+ (0, import_server.broadcast)("task-updated", {
61
+ planUid: plan.uid,
62
+ taskUid: task.uid,
63
+ status: "in_progress",
64
+ source: "auto-progress"
65
+ });
66
+ advanced = true;
67
+ suggestedDone.delete(`${plan.uid}:${task.uid}`);
68
+ }
69
+ }
70
+ for (const item of planItemService.listAllItems(plan.uid)) {
71
+ if (item.kind !== "action") continue;
72
+ if (item.status !== "pending" && item.status !== "assigned") continue;
73
+ const paths = (item.fileSpecs ?? []).flatMap((spec) => [spec.path, spec.moveTo].filter((p) => !!p));
74
+ if (!touchesTask(paths, relativePath)) continue;
75
+ if (!planItemService.updateItem(item.uid, { status: "in_progress", author: "auto-progress", authorType: "system" })) continue;
76
+ (0, import_server.broadcast)("plan-item-updated", {
77
+ planUid: plan.uid,
78
+ itemUid: item.uid,
79
+ kind: "action",
80
+ changes: { status: "in_progress" },
81
+ source: "auto-progress"
82
+ });
83
+ }
84
+ if (advanced || tasks.some((t) => t.status === "in_progress")) {
85
+ maybeSuggestCompletions(plan.uid);
86
+ }
87
+ }
88
+ }
89
+ function maybeSuggestCompletions(planUid) {
90
+ const allChanges = planChangesService.listProposedChanges(planUid);
91
+ if (allChanges.length === 0) return;
92
+ const byTask = /* @__PURE__ */ new Map();
93
+ for (const c of allChanges) {
94
+ const bucket = byTask.get(c.taskUid) ?? [];
95
+ bucket.push(c);
96
+ byTask.set(c.taskUid, bucket);
97
+ }
98
+ for (const [taskUid, taskChanges] of byTask) {
99
+ const key = `${planUid}:${taskUid}`;
100
+ if (suggestedDone.has(key)) continue;
101
+ if (taskChanges.some((c) => c.taskStatus !== "in_progress")) continue;
102
+ const allSatisfied = taskChanges.every((c) => c.driftStatus === "satisfied");
103
+ if (!allSatisfied) continue;
104
+ suggestedDone.add(key);
105
+ (0, import_server.broadcast)("task-completion-suggested", {
106
+ planUid,
107
+ taskUid,
108
+ changeCount: taskChanges.length
109
+ });
110
+ }
111
+ }
112
+ function touchesTask(affectedFiles, changedRelative) {
113
+ if (!affectedFiles.length) return false;
114
+ for (const f of affectedFiles) {
115
+ if (f === changedRelative) return true;
116
+ if (changedRelative.endsWith(f) || f.endsWith(changedRelative)) return true;
117
+ }
118
+ return false;
119
+ }
120
+ function clearSuggestionMemory(planUid) {
121
+ if (!planUid) {
122
+ suggestedDone.clear();
123
+ return;
124
+ }
125
+ for (const key of suggestedDone) {
126
+ if (key.startsWith(`${planUid}:`)) suggestedDone.delete(key);
127
+ }
128
+ }
129
+ // Annotate the CommonJS export names for ESM import in node:
130
+ 0 && (module.exports = {
131
+ _setListPlansProviderForTest,
132
+ clearSuggestionMemory,
133
+ recordFileChange
134
+ });
@@ -0,0 +1,262 @@
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 plan_review_service_exports = {};
29
+ __export(plan_review_service_exports, {
30
+ covers: () => covers,
31
+ renderReviewMarkdown: () => renderReviewMarkdown,
32
+ reviewPlan: () => reviewPlan,
33
+ withArchitecture: () => withArchitecture
34
+ });
35
+ module.exports = __toCommonJS(plan_review_service_exports);
36
+ var import_review_architecture = require("./review-architecture");
37
+ var import_plan_item_service = require("./plan-item-service");
38
+ var import_trusted_roots = require("./trusted-roots");
39
+ var import_node_path = __toESM(require("node:path"));
40
+ var import_snapshot_compare_service = require("./snapshot-compare-service");
41
+ var import_pricing = require("./pricing");
42
+ var import_budget_service = require("./budget-service");
43
+ var import_criteria_service = require("./criteria-service");
44
+ var import_signoff_rows = require("./signoff-rows");
45
+ var import_review_other_work = require("./review-other-work");
46
+ var import_other_work = require("../../shared/lib/other-work");
47
+ function criteriaOf(item) {
48
+ const all = (0, import_criteria_service.listCriteria)(item.uid);
49
+ return {
50
+ criteria: {
51
+ total: all.length,
52
+ met: all.filter((c) => c.state === "met").length,
53
+ waiting: all.filter((c) => c.state === "submitted").length,
54
+ sentBack: all.filter((c) => c.state === "sent_back").length
55
+ },
56
+ signoffs: all.map((c) => (0, import_signoff_rows.rowsForCriterion)(item, c))
57
+ };
58
+ }
59
+ function normalise(p) {
60
+ return p.replace(/^\.\//, "").replace(/^\/+/, "").toLowerCase();
61
+ }
62
+ function covers(target, changed) {
63
+ const t = normalise(target);
64
+ const c = normalise(changed);
65
+ if (!t) return false;
66
+ if (t === c) return true;
67
+ return c.startsWith(t.endsWith("/") ? t : `${t}/`);
68
+ }
69
+ function targetsOf(item, projectPath) {
70
+ return (item.fileSpecs ?? []).map((f) => f.path).filter(Boolean).map((t) => import_node_path.default.isAbsolute(t) ? (0, import_trusted_roots.projectRelative)(projectPath, t) || t : t);
71
+ }
72
+ function edgeKey(source, target) {
73
+ return `${normalise(source)}->${normalise(target)}`;
74
+ }
75
+ function defaultComparand(projectPath) {
76
+ try {
77
+ const newestCommit = (0, import_snapshot_compare_service.listComparands)(projectPath, 1).find((c) => c.kind === "commit");
78
+ if (newestCommit) return newestCommit.spec;
79
+ } catch {
80
+ }
81
+ return "baseline";
82
+ }
83
+ function reviewPlan(params) {
84
+ const compared = (0, import_snapshot_compare_service.compareSnapshots)(
85
+ params.before ?? defaultComparand(params.projectPath),
86
+ params.after ?? "live",
87
+ params.projectPath
88
+ );
89
+ if (!compared.ok) return compared;
90
+ const comparison = compared.result;
91
+ const changedFiles = [
92
+ ...comparison.diff.addedFiles,
93
+ ...comparison.diff.modifiedFiles,
94
+ ...comparison.diff.removedFiles
95
+ ];
96
+ const items = (0, import_plan_item_service.listAllItems)(params.planUid);
97
+ const reviewed = items.map((item) => {
98
+ const targets = targetsOf(item, params.projectPath);
99
+ if (targets.length === 0) {
100
+ return {
101
+ uid: item.uid,
102
+ title: item.title,
103
+ status: item.status ?? null,
104
+ landed: [],
105
+ missing: [],
106
+ verdict: "no-targets",
107
+ ...criteriaOf(item)
108
+ };
109
+ }
110
+ const landed = [];
111
+ const missing = [];
112
+ for (const target of targets) {
113
+ if (changedFiles.some((f) => covers(target, f))) landed.push(target);
114
+ else missing.push(target);
115
+ }
116
+ const verdict = landed.length === 0 ? "untouched" : missing.length === 0 ? "landed" : "partial";
117
+ return {
118
+ uid: item.uid,
119
+ title: item.title,
120
+ status: item.status ?? null,
121
+ landed,
122
+ missing,
123
+ verdict,
124
+ ...criteriaOf(item)
125
+ };
126
+ });
127
+ const allTargets = items.flatMap((i) => targetsOf(i, params.projectPath));
128
+ const unclaimedChanges = changedFiles.filter((f) => !allTargets.some((t) => covers(t, f)));
129
+ const plannedAdds = /* @__PURE__ */ new Set();
130
+ const plannedRemovals = /* @__PURE__ */ new Set();
131
+ for (const item of items) {
132
+ for (const c of item.newConnections ?? []) plannedAdds.add(edgeKey(c.from, c.to));
133
+ for (const c of item.removedConnections ?? []) plannedRemovals.add(edgeKey(c.from, c.to));
134
+ }
135
+ const unplannedEdges = comparison.edgesComparable ? comparison.diff.addedEdges.filter((e) => !plannedAdds.has(edgeKey(e.source, e.target))) : [];
136
+ const unremovedEdges = comparison.edgesComparable ? [...plannedRemovals].filter((key) => !comparison.diff.removedEdges.some((e) => edgeKey(e.source, e.target) === key)).map((key) => {
137
+ const [source, target] = key.split("->");
138
+ return { source, target };
139
+ }) : [];
140
+ return {
141
+ ok: true,
142
+ review: {
143
+ planUid: params.planUid,
144
+ comparison,
145
+ items: reviewed,
146
+ unclaimedChanges,
147
+ unplannedEdges,
148
+ unremovedEdges,
149
+ otherWork: (0, import_review_other_work.otherWorkFor)(params.projectPath, { after: params.after, itemWorkstreams: items.map((i) => i.workstream) }),
150
+ summary: {
151
+ itemsLanded: reviewed.filter((i) => i.verdict === "landed").length,
152
+ itemsPartial: reviewed.filter((i) => i.verdict === "partial").length,
153
+ itemsUntouched: reviewed.filter((i) => i.verdict === "untouched").length,
154
+ filesChanged: changedFiles.length,
155
+ unclaimedCount: unclaimedChanges.length,
156
+ unplannedEdgeCount: unplannedEdges.length
157
+ }
158
+ }
159
+ };
160
+ }
161
+ function commitOfSpec(spec) {
162
+ return spec.startsWith("commit:") ? spec.slice("commit:".length) : null;
163
+ }
164
+ async function withArchitecture(review, projectPath) {
165
+ const base = commitOfSpec(review.comparison.before.spec);
166
+ const head = commitOfSpec(review.comparison.after.spec);
167
+ if (!base || !head) return review;
168
+ const a = await (0, import_review_architecture.architectureOf)(projectPath, base, head);
169
+ return "error" in a ? review : { ...review, architecture: a };
170
+ }
171
+ function renderReviewMarkdown(review, planTitle) {
172
+ const lines = [];
173
+ const s = review.summary;
174
+ lines.push(`## Plan review${planTitle ? `: ${planTitle}` : ""}`);
175
+ lines.push("");
176
+ lines.push(
177
+ `Comparing **${review.comparison.before.label}** \u2192 **${review.comparison.after.label}** \xB7 ${s.filesChanged} file${s.filesChanged === 1 ? "" : "s"} changed`
178
+ );
179
+ lines.push("");
180
+ if (review.architecture) lines.push((0, import_review_architecture.architectureMarkdown)(review.architecture), "");
181
+ lines.push(
182
+ `| Landed | Partial | Untouched | Unclaimed files | Unplanned edges |`,
183
+ `|---|---|---|---|---|`,
184
+ `| ${s.itemsLanded} | ${s.itemsPartial} | ${s.itemsUntouched} | ${s.unclaimedCount} | ${s.unplannedEdgeCount} |`,
185
+ ""
186
+ );
187
+ const partial = review.items.filter((i) => i.verdict === "partial");
188
+ if (partial.length > 0) {
189
+ lines.push("### Partially landed");
190
+ lines.push("");
191
+ for (const item of partial) {
192
+ lines.push(`- **${item.title}** \u2014 still missing: ${item.missing.map((m) => `\`${m}\``).join(", ")}`);
193
+ }
194
+ lines.push("");
195
+ }
196
+ const unsigned = review.items.filter((i) => i.criteria.total > 0 && i.criteria.met < i.criteria.total);
197
+ if (unsigned.length > 0) {
198
+ lines.push("### Criteria not yet met");
199
+ lines.push("");
200
+ for (const item of unsigned) {
201
+ const c = item.criteria;
202
+ const parts = [`${c.met}/${c.total} met`];
203
+ if (c.waiting) parts.push(`${c.waiting} waiting for sign-off`);
204
+ if (c.sentBack) parts.push(`${c.sentBack} sent back`);
205
+ lines.push(`- **${item.title}** \u2014 ${parts.join(", ")}`);
206
+ }
207
+ lines.push("");
208
+ }
209
+ if (review.unclaimedChanges.length > 0) {
210
+ lines.push("### Changed, but no item claimed them");
211
+ lines.push("");
212
+ lines.push("The finding a diff cannot show you: these files changed without any plan item asking for it.");
213
+ lines.push("");
214
+ for (const file of review.unclaimedChanges.slice(0, 25)) lines.push(`- \`${file}\``);
215
+ if (review.unclaimedChanges.length > 25) {
216
+ lines.push(`- \u2026and ${review.unclaimedChanges.length - 25} more`);
217
+ }
218
+ lines.push("");
219
+ }
220
+ if (review.unplannedEdges.length > 0) {
221
+ lines.push("### New dependencies nobody planned");
222
+ lines.push("");
223
+ lines.push("Each of these is one import line in the diff, and a new coupling in the architecture.");
224
+ lines.push("");
225
+ for (const edge of review.unplannedEdges.slice(0, 25)) {
226
+ lines.push(`- \`${edge.source}\` \u2192 \`${edge.target}\``);
227
+ }
228
+ if (review.unplannedEdges.length > 25) {
229
+ lines.push(`- \u2026and ${review.unplannedEdges.length - 25} more`);
230
+ }
231
+ lines.push("");
232
+ }
233
+ if (review.otherWork) lines.push((0, import_other_work.otherWorkMarkdown)(review.otherWork));
234
+ if (review.unremovedEdges.length > 0) {
235
+ lines.push("### Dependencies the plan said to remove, still present");
236
+ lines.push("");
237
+ for (const edge of review.unremovedEdges.slice(0, 25)) {
238
+ lines.push(`- \`${edge.source}\` \u2192 \`${edge.target}\``);
239
+ }
240
+ lines.push("");
241
+ }
242
+ if (!review.comparison.edgesComparable) {
243
+ lines.push("> Edges were not compared for this range \u2014 see the note below.");
244
+ lines.push("");
245
+ }
246
+ for (const note of review.comparison.notes) lines.push(`> ${note}`);
247
+ const budget = (0, import_budget_service.getBudgetReport)(review.planUid);
248
+ if (budget.spentMinutes > 0) {
249
+ lines.push("");
250
+ lines.push(
251
+ `_Spent on this plan: ${budget.spentMinutes.toFixed(0)} minutes` + (budget.spentCostUsd === null ? "" : `, ${(0, import_pricing.formatCost)(budget.spentCostUsd)}`) + "._"
252
+ );
253
+ }
254
+ return lines.join("\n");
255
+ }
256
+ // Annotate the CommonJS export names for ESM import in node:
257
+ 0 && (module.exports = {
258
+ covers,
259
+ renderReviewMarkdown,
260
+ reviewPlan,
261
+ withArchitecture
262
+ });