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,682 @@
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_service_exports = {};
29
+ __export(plan_service_exports, {
30
+ addPlanScope: () => addPlanScope,
31
+ appendTaskCodeReference: () => appendTaskCodeReference,
32
+ appendTaskToPlan: () => appendTaskToPlan,
33
+ claimTask: () => claimTask,
34
+ createPlan: () => createPlan,
35
+ deletePlan: () => deletePlan,
36
+ getNextTask: () => getNextTask,
37
+ getPlan: () => getPlan,
38
+ getPlanVersions: () => getPlanVersions,
39
+ getSubtasks: () => getSubtasks,
40
+ getTaskByUid: () => getTaskByUid,
41
+ getTasksByPlan: () => getTasksByPlan,
42
+ listPlans: () => listPlans,
43
+ listPlansByRepoUrl: () => listPlansByRepoUrl,
44
+ removePlanScope: () => removePlanScope,
45
+ setPlanHomeRepo: () => setPlanHomeRepo,
46
+ updatePlan: () => updatePlan,
47
+ updateTask: () => updateTask
48
+ });
49
+ module.exports = __toCommonJS(plan_service_exports);
50
+ var _lazy___plan_file_service = __toESM(require("./plan-file-service"));
51
+ var _lazy___git_identity = __toESM(require("./git-identity"));
52
+ var import_node_crypto = require("node:crypto");
53
+ var import_database = require("./database");
54
+ var import_persistence = require("./persistence");
55
+ var planItemService = __toESM(require("./plan-item-service"));
56
+ function deriveAffectedFiles(fileSpecs, existing) {
57
+ if (!fileSpecs || fileSpecs.length === 0) return existing ?? [];
58
+ const set = /* @__PURE__ */ new Set();
59
+ for (const fs of fileSpecs) {
60
+ if (fs.path) set.add(fs.path);
61
+ if (fs.moveTo) set.add(fs.moveTo);
62
+ }
63
+ const ordered = Array.from(set);
64
+ if (existing) {
65
+ for (const p of existing) {
66
+ if (!set.has(p)) {
67
+ ordered.push(p);
68
+ set.add(p);
69
+ }
70
+ }
71
+ }
72
+ return ordered;
73
+ }
74
+ function notifyMutation(planUid) {
75
+ try {
76
+ const { scheduleWriteThrough } = _lazy___plan_file_service;
77
+ scheduleWriteThrough(planUid);
78
+ } catch {
79
+ }
80
+ }
81
+ function normalizePath(p) {
82
+ return p.replace(/\/+$/, "") || p;
83
+ }
84
+ function createPlan(input, author, authorType, projectPath) {
85
+ const db = (0, import_database.getDb)();
86
+ const uid = input.uid ?? (0, import_node_crypto.randomUUID)();
87
+ const now = Date.now();
88
+ const normalizedPath = normalizePath(projectPath);
89
+ const { getNormalisedOriginUrl } = _lazy___git_identity;
90
+ const homeRepo = normalizedPath ? getNormalisedOriginUrl(normalizedPath) ?? null : null;
91
+ db.run(
92
+ `INSERT INTO plans (uid, title, description, status, author, author_type, project_path, created_at, updated_at, home_repo, scope)
93
+ VALUES (?, ?, ?, 'draft', ?, ?, ?, ?, ?, ?, '[]')`,
94
+ [uid, input.title, input.description || "", author, authorType, normalizedPath, now, now, homeRepo]
95
+ );
96
+ const tasks = [];
97
+ for (let i = 0; i < input.tasks.length; i++) {
98
+ const t = input.tasks[i];
99
+ const taskUid = (0, import_node_crypto.randomUUID)();
100
+ const fileSpecs = t.fileSpecs ?? [];
101
+ const affectedFiles = deriveAffectedFiles(fileSpecs, t.affectedFiles);
102
+ db.run(
103
+ `INSERT INTO tasks (uid, plan_uid, sort_order, description, status, affected_files, affected_symbols, new_connections, removed_connections, dependencies, file_spec, symbol_specs, parent_task_uid, body, prompt, scope_path, file_specs, created_at, updated_at)
104
+ VALUES (?, ?, ?, ?, 'pending', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
105
+ [
106
+ taskUid,
107
+ uid,
108
+ i,
109
+ t.description,
110
+ JSON.stringify(affectedFiles),
111
+ JSON.stringify(t.affectedSymbols || []),
112
+ JSON.stringify(t.newConnections || []),
113
+ JSON.stringify(t.removedConnections || []),
114
+ JSON.stringify(t.dependencies || []),
115
+ t.fileSpec ?? null,
116
+ JSON.stringify(t.symbolSpecs || []),
117
+ t.parentTaskUid ?? null,
118
+ t.body ?? null,
119
+ t.prompt ?? null,
120
+ t.scopePath ?? null,
121
+ JSON.stringify(fileSpecs),
122
+ now,
123
+ now
124
+ ]
125
+ );
126
+ tasks.push({
127
+ uid: taskUid,
128
+ planUid: uid,
129
+ sortOrder: i,
130
+ description: t.description,
131
+ status: "pending",
132
+ assignee: null,
133
+ assigneeType: null,
134
+ assigneeModel: null,
135
+ affectedFiles,
136
+ affectedSymbols: t.affectedSymbols || [],
137
+ newConnections: t.newConnections || [],
138
+ removedConnections: t.removedConnections || [],
139
+ dependencies: t.dependencies || [],
140
+ fileSpec: t.fileSpec,
141
+ symbolSpecs: t.symbolSpecs || [],
142
+ phaseUid: null,
143
+ parentTaskUid: t.parentTaskUid ?? null,
144
+ body: t.body,
145
+ prompt: t.prompt,
146
+ scopePath: t.scopePath ?? null,
147
+ fileSpecs,
148
+ progressPercent: null,
149
+ blockedReason: null,
150
+ createdAt: now,
151
+ updatedAt: now
152
+ });
153
+ }
154
+ const plan = {
155
+ uid,
156
+ title: input.title,
157
+ description: input.description || "",
158
+ status: "draft",
159
+ author,
160
+ authorType,
161
+ projectPath,
162
+ createdAt: now,
163
+ updatedAt: now,
164
+ taskCount: tasks.length,
165
+ completedTaskCount: 0,
166
+ homeRepo,
167
+ scope: []
168
+ };
169
+ db.run(
170
+ `INSERT INTO plan_versions (plan_uid, version, snapshot, change_summary, author, author_type, created_at)
171
+ VALUES (?, 1, ?, 'Plan created', ?, ?, ?)`,
172
+ [uid, JSON.stringify(plan), author, authorType, now]
173
+ );
174
+ (0, import_persistence.markDirty)();
175
+ notifyMutation(plan.uid);
176
+ return plan;
177
+ }
178
+ const PLAN_COLUMNS = `uid, title, description, status, author, author_type, project_path, created_at, updated_at,
179
+ base_ref, target_branch, target_worktree, auto_create_branch,
180
+ home_repo, scope`;
181
+ function rowToPlanCore(r) {
182
+ let scope = [];
183
+ try {
184
+ const parsed = JSON.parse(r[14] ?? "[]");
185
+ if (Array.isArray(parsed)) scope = parsed.filter((s) => typeof s === "string");
186
+ } catch {
187
+ }
188
+ return {
189
+ uid: r[0],
190
+ title: r[1],
191
+ description: r[2],
192
+ status: r[3],
193
+ author: r[4],
194
+ authorType: r[5],
195
+ projectPath: r[6],
196
+ createdAt: r[7],
197
+ updatedAt: r[8],
198
+ baseRef: r[9] ?? null,
199
+ targetBranch: r[10] ?? null,
200
+ targetWorktree: r[11] ?? null,
201
+ autoCreateBranch: !!r[12],
202
+ // Phase 3.3 — cross-repo scope
203
+ homeRepo: r[13] ?? null,
204
+ scope
205
+ };
206
+ }
207
+ function getPlan(planUid) {
208
+ const db = (0, import_database.getDb)();
209
+ const result = db.exec(
210
+ `SELECT ${PLAN_COLUMNS} FROM plans WHERE uid = ?`,
211
+ [planUid]
212
+ );
213
+ if (!result[0]?.values[0]) return null;
214
+ const r = result[0].values[0];
215
+ const tasks = getTasksByPlan(planUid);
216
+ const core = rowToPlanCore(r);
217
+ return {
218
+ ...core,
219
+ // Same source as the list — see `countPlanActions`. Counting the
220
+ // legacy `tasks` array here meant the plan DETAIL disagreed with
221
+ // itself too: 0 actions beside an item tree that plainly had some.
222
+ ...countPlanActions(db, planUid),
223
+ tasks
224
+ };
225
+ }
226
+ function countPlanActions(db, planUid) {
227
+ const items = db.exec(
228
+ `SELECT COUNT(*), SUM(CASE WHEN status = 'done' THEN 1 ELSE 0 END)
229
+ FROM plan_items WHERE plan_uid = ? AND kind = 'action'`,
230
+ [planUid]
231
+ );
232
+ const itemTotal = items[0]?.values[0]?.[0] || 0;
233
+ if (itemTotal > 0) {
234
+ return { taskCount: itemTotal, completedTaskCount: items[0]?.values[0]?.[1] || 0 };
235
+ }
236
+ const legacy = db.exec(
237
+ `SELECT COUNT(*), SUM(CASE WHEN status = 'done' THEN 1 ELSE 0 END) FROM tasks WHERE plan_uid = ?`,
238
+ [planUid]
239
+ );
240
+ return {
241
+ taskCount: legacy[0]?.values[0]?.[0] || 0,
242
+ completedTaskCount: legacy[0]?.values[0]?.[1] || 0
243
+ };
244
+ }
245
+ function listPlans(projectPath, statusFilter) {
246
+ const db = (0, import_database.getDb)();
247
+ let query = `SELECT ${PLAN_COLUMNS} FROM plans WHERE status != 'archived'`;
248
+ const params = [];
249
+ if (projectPath) {
250
+ query += ` AND project_path = ?`;
251
+ params.push(normalizePath(projectPath));
252
+ }
253
+ if (statusFilter) {
254
+ query += ` AND status = ?`;
255
+ params.push(statusFilter);
256
+ }
257
+ query += ` ORDER BY updated_at DESC`;
258
+ const result = db.exec(query, params);
259
+ if (!result[0]) return [];
260
+ return result[0].values.map((r) => {
261
+ const core = rowToPlanCore(r);
262
+ return { ...core, ...countPlanActions(db, r[0]) };
263
+ });
264
+ }
265
+ function updatePlan(planUid, changes, author, authorType) {
266
+ const db = (0, import_database.getDb)();
267
+ const now = Date.now();
268
+ const sets = ["updated_at = ?"];
269
+ const params = [now];
270
+ if (changes.title !== void 0) {
271
+ sets.push("title = ?");
272
+ params.push(changes.title);
273
+ }
274
+ if (changes.description !== void 0) {
275
+ sets.push("description = ?");
276
+ params.push(changes.description);
277
+ }
278
+ if (changes.status !== void 0) {
279
+ sets.push("status = ?");
280
+ params.push(changes.status);
281
+ }
282
+ if (changes.baseRef !== void 0) {
283
+ sets.push("base_ref = ?");
284
+ params.push(changes.baseRef);
285
+ }
286
+ if (changes.targetBranch !== void 0) {
287
+ sets.push("target_branch = ?");
288
+ params.push(changes.targetBranch);
289
+ }
290
+ if (changes.targetWorktree !== void 0) {
291
+ sets.push("target_worktree = ?");
292
+ params.push(changes.targetWorktree);
293
+ }
294
+ if (changes.autoCreateBranch !== void 0) {
295
+ sets.push("auto_create_branch = ?");
296
+ params.push(changes.autoCreateBranch ? 1 : 0);
297
+ }
298
+ params.push(planUid);
299
+ db.run(`UPDATE plans SET ${sets.join(", ")} WHERE uid = ?`, params);
300
+ const plan = getPlan(planUid);
301
+ if (plan) {
302
+ const vr = db.exec(`SELECT MAX(version) FROM plan_versions WHERE plan_uid = ?`, [planUid]);
303
+ const nextVersion = (vr[0]?.values[0]?.[0] || 0) + 1;
304
+ db.run(
305
+ `INSERT INTO plan_versions (plan_uid, version, snapshot, change_summary, author, author_type, created_at)
306
+ VALUES (?, ?, ?, ?, ?, ?, ?)`,
307
+ [planUid, nextVersion, JSON.stringify(plan), Object.keys(changes).join(", ") + " updated", author, authorType, now]
308
+ );
309
+ }
310
+ (0, import_persistence.markDirty)();
311
+ notifyMutation(planUid);
312
+ }
313
+ function deletePlan(planUid) {
314
+ (0, import_database.getDb)().run(`UPDATE plans SET status = 'archived', updated_at = ? WHERE uid = ?`, [Date.now(), planUid]);
315
+ (0, import_persistence.markDirty)();
316
+ notifyMutation(planUid);
317
+ }
318
+ function setPlanHomeRepo(planUid, homeRepoUrl) {
319
+ const { normaliseRepoUrl } = _lazy___git_identity;
320
+ const normalised = homeRepoUrl ? normaliseRepoUrl(homeRepoUrl) : null;
321
+ const now = Date.now();
322
+ (0, import_database.getDb)().run(
323
+ `UPDATE plans SET home_repo = ?, updated_at = ? WHERE uid = ?`,
324
+ [normalised, now, planUid]
325
+ );
326
+ (0, import_persistence.markDirty)();
327
+ notifyMutation(planUid);
328
+ }
329
+ function addPlanScope(planUid, repoUrl) {
330
+ const { normaliseRepoUrl } = _lazy___git_identity;
331
+ const normalised = normaliseRepoUrl(repoUrl);
332
+ if (!normalised) throw new Error("addPlanScope: repoUrl must be a non-empty URL");
333
+ const plan = getPlan(planUid);
334
+ if (!plan) throw new Error(`Plan ${planUid} not found`);
335
+ if (plan.homeRepo && normalised === plan.homeRepo) {
336
+ return plan.scope ?? [];
337
+ }
338
+ const current = plan.scope ?? [];
339
+ if (current.includes(normalised)) return current;
340
+ const next = [...current, normalised];
341
+ const now = Date.now();
342
+ (0, import_database.getDb)().run(
343
+ `UPDATE plans SET scope = ?, updated_at = ? WHERE uid = ?`,
344
+ [JSON.stringify(next), now, planUid]
345
+ );
346
+ (0, import_persistence.markDirty)();
347
+ notifyMutation(planUid);
348
+ return next;
349
+ }
350
+ function removePlanScope(planUid, repoUrl) {
351
+ const { normaliseRepoUrl } = _lazy___git_identity;
352
+ const normalised = normaliseRepoUrl(repoUrl);
353
+ if (!normalised) throw new Error("removePlanScope: repoUrl must be a non-empty URL");
354
+ const plan = getPlan(planUid);
355
+ if (!plan) throw new Error(`Plan ${planUid} not found`);
356
+ const current = plan.scope ?? [];
357
+ if (!current.includes(normalised)) return current;
358
+ const next = current.filter((r) => r !== normalised);
359
+ const now = Date.now();
360
+ (0, import_database.getDb)().run(
361
+ `UPDATE plans SET scope = ?, updated_at = ? WHERE uid = ?`,
362
+ [JSON.stringify(next), now, planUid]
363
+ );
364
+ (0, import_persistence.markDirty)();
365
+ notifyMutation(planUid);
366
+ return next;
367
+ }
368
+ function listPlansByRepoUrl(repoUrl) {
369
+ const { normaliseRepoUrl } = _lazy___git_identity;
370
+ const normalised = normaliseRepoUrl(repoUrl);
371
+ if (!normalised) return [];
372
+ const db = (0, import_database.getDb)();
373
+ const result = db.exec(
374
+ `SELECT ${PLAN_COLUMNS} FROM plans
375
+ WHERE status != 'archived'
376
+ AND (home_repo = ? OR scope LIKE ?)
377
+ ORDER BY updated_at DESC`,
378
+ [normalised, `%"${normalised}"%`]
379
+ );
380
+ if (!result[0]) return [];
381
+ return result[0].values.map((r) => {
382
+ const core = rowToPlanCore(r);
383
+ return { ...core, ...countPlanActions(db, r[0]) };
384
+ });
385
+ }
386
+ const TASK_COLUMNS = `uid, plan_uid, sort_order, description, status, assignee, assignee_type, assignee_model,
387
+ affected_files, affected_symbols, new_connections, removed_connections, dependencies,
388
+ file_spec, symbol_specs, phase_uid,
389
+ parent_task_uid, body, prompt, scope_path, file_specs,
390
+ progress_percent, blocked_reason,
391
+ created_at, updated_at`;
392
+ function rowToTask(r) {
393
+ return {
394
+ uid: r[0],
395
+ planUid: r[1],
396
+ sortOrder: r[2],
397
+ description: r[3],
398
+ status: r[4],
399
+ assignee: r[5],
400
+ assigneeType: r[6],
401
+ assigneeModel: r[7],
402
+ affectedFiles: JSON.parse(r[8] || "[]"),
403
+ affectedSymbols: JSON.parse(r[9] || "[]"),
404
+ newConnections: JSON.parse(r[10] || "[]"),
405
+ removedConnections: JSON.parse(r[11] || "[]"),
406
+ dependencies: JSON.parse(r[12] || "[]"),
407
+ fileSpec: r[13] ?? void 0,
408
+ symbolSpecs: JSON.parse(r[14] || "[]"),
409
+ phaseUid: r[15] ?? null,
410
+ parentTaskUid: r[16] ?? null,
411
+ body: r[17] ?? void 0,
412
+ prompt: r[18] ?? void 0,
413
+ scopePath: r[19] ?? null,
414
+ fileSpecs: JSON.parse(r[20] || "[]"),
415
+ progressPercent: r[21] ?? null,
416
+ blockedReason: r[22] ?? null,
417
+ createdAt: r[23],
418
+ updatedAt: r[24]
419
+ };
420
+ }
421
+ function getTasksByPlan(planUid) {
422
+ const result = (0, import_database.getDb)().exec(
423
+ `SELECT ${TASK_COLUMNS} FROM tasks WHERE plan_uid = ? ORDER BY sort_order`,
424
+ [planUid]
425
+ );
426
+ if (!result[0]) return [];
427
+ return result[0].values.map(rowToTask);
428
+ }
429
+ function getSubtasks(parentTaskUid) {
430
+ const result = (0, import_database.getDb)().exec(
431
+ `SELECT ${TASK_COLUMNS} FROM tasks WHERE parent_task_uid = ? ORDER BY sort_order`,
432
+ [parentTaskUid]
433
+ );
434
+ if (!result[0]) return [];
435
+ return result[0].values.map(rowToTask);
436
+ }
437
+ function updateTask(taskUid, updates) {
438
+ const now = Date.now();
439
+ const sets = ["updated_at = ?"];
440
+ const params = [now];
441
+ if (updates.status !== void 0) {
442
+ sets.push("status = ?");
443
+ params.push(updates.status);
444
+ }
445
+ if (updates.assignee !== void 0) {
446
+ sets.push("assignee = ?");
447
+ params.push(updates.assignee);
448
+ }
449
+ if (updates.assigneeType !== void 0) {
450
+ sets.push("assignee_type = ?");
451
+ params.push(updates.assigneeType);
452
+ }
453
+ if (updates.assigneeModel !== void 0) {
454
+ sets.push("assignee_model = ?");
455
+ params.push(updates.assigneeModel);
456
+ }
457
+ if (updates.description !== void 0) {
458
+ sets.push("description = ?");
459
+ params.push(updates.description);
460
+ }
461
+ if (updates.affectedSymbols !== void 0) {
462
+ sets.push("affected_symbols = ?");
463
+ params.push(JSON.stringify(updates.affectedSymbols));
464
+ }
465
+ if (updates.newConnections !== void 0) {
466
+ sets.push("new_connections = ?");
467
+ params.push(JSON.stringify(updates.newConnections));
468
+ }
469
+ if (updates.removedConnections !== void 0) {
470
+ sets.push("removed_connections = ?");
471
+ params.push(JSON.stringify(updates.removedConnections));
472
+ }
473
+ if (updates.dependencies !== void 0) {
474
+ sets.push("dependencies = ?");
475
+ params.push(JSON.stringify(updates.dependencies));
476
+ }
477
+ if (updates.fileSpec !== void 0) {
478
+ sets.push("file_spec = ?");
479
+ params.push(updates.fileSpec);
480
+ }
481
+ if (updates.symbolSpecs !== void 0) {
482
+ sets.push("symbol_specs = ?");
483
+ params.push(JSON.stringify(updates.symbolSpecs));
484
+ }
485
+ if (updates.phaseUid !== void 0) {
486
+ sets.push("phase_uid = ?");
487
+ params.push(updates.phaseUid);
488
+ }
489
+ if (updates.parentTaskUid !== void 0) {
490
+ sets.push("parent_task_uid = ?");
491
+ params.push(updates.parentTaskUid);
492
+ }
493
+ if (updates.body !== void 0) {
494
+ sets.push("body = ?");
495
+ params.push(updates.body);
496
+ }
497
+ if (updates.prompt !== void 0) {
498
+ sets.push("prompt = ?");
499
+ params.push(updates.prompt);
500
+ }
501
+ if (updates.scopePath !== void 0) {
502
+ sets.push("scope_path = ?");
503
+ params.push(updates.scopePath);
504
+ }
505
+ if (updates.progressPercent !== void 0) {
506
+ sets.push("progress_percent = ?");
507
+ params.push(updates.progressPercent);
508
+ }
509
+ if (updates.blockedReason !== void 0) {
510
+ sets.push("blocked_reason = ?");
511
+ params.push(updates.blockedReason);
512
+ }
513
+ if (updates.fileSpecs !== void 0) {
514
+ const merged = deriveAffectedFiles(updates.fileSpecs, updates.affectedFiles);
515
+ sets.push("file_specs = ?");
516
+ params.push(JSON.stringify(updates.fileSpecs));
517
+ sets.push("affected_files = ?");
518
+ params.push(JSON.stringify(merged));
519
+ } else if (updates.affectedFiles !== void 0) {
520
+ sets.push("affected_files = ?");
521
+ params.push(JSON.stringify(updates.affectedFiles));
522
+ }
523
+ params.push(taskUid);
524
+ (0, import_database.getDb)().run(`UPDATE tasks SET ${sets.join(", ")} WHERE uid = ?`, params);
525
+ (0, import_persistence.markDirty)();
526
+ const parent = (0, import_database.getDb)().exec(`SELECT plan_uid FROM tasks WHERE uid = ?`, [taskUid]);
527
+ const planUid = parent[0]?.values[0]?.[0];
528
+ if (planUid) notifyMutation(planUid);
529
+ }
530
+ function appendTaskCodeReference(taskUid, ref) {
531
+ const db = (0, import_database.getDb)();
532
+ const result = db.exec(
533
+ `SELECT affected_files, file_spec FROM tasks WHERE uid = ?`,
534
+ [taskUid]
535
+ );
536
+ if (!result[0]?.values[0]) return null;
537
+ const [filesJson, currentSpec] = result[0].values[0];
538
+ const existingFiles = JSON.parse(filesJson || "[]");
539
+ const nextFiles = existingFiles.includes(ref.filePath) ? existingFiles : [...existingFiles, ref.filePath];
540
+ const range = ref.startLine != null && ref.endLine != null ? `${ref.filePath}:${ref.startLine}-${ref.endLine}` : ref.filePath;
541
+ const lines = [];
542
+ lines.push("");
543
+ lines.push(`### Reference: \`${range}\``);
544
+ if (ref.note?.trim()) {
545
+ lines.push("");
546
+ lines.push(ref.note.trim());
547
+ }
548
+ if (ref.codeSnippet?.trim()) {
549
+ lines.push("");
550
+ lines.push("```");
551
+ lines.push(ref.codeSnippet.replace(/```/g, "`\u200B``"));
552
+ lines.push("```");
553
+ }
554
+ const appended = (currentSpec || "") + lines.join("\n");
555
+ updateTask(taskUid, { affectedFiles: nextFiles, fileSpec: appended });
556
+ return getTaskByUid(taskUid);
557
+ }
558
+ function getTaskByUid(taskUid) {
559
+ const result = (0, import_database.getDb)().exec(
560
+ `SELECT ${TASK_COLUMNS} FROM tasks WHERE uid = ?`,
561
+ [taskUid]
562
+ );
563
+ if (!result[0]?.values[0]) return null;
564
+ return rowToTask(result[0].values[0]);
565
+ }
566
+ function appendTaskToPlan(planUid, input) {
567
+ const db = (0, import_database.getDb)();
568
+ const planExists = db.exec(`SELECT uid FROM plans WHERE uid = ?`, [planUid]);
569
+ if (!planExists[0]?.values[0]) return null;
570
+ const orderResult = db.exec(`SELECT COALESCE(MAX(sort_order), -1) FROM tasks WHERE plan_uid = ?`, [planUid]);
571
+ const nextOrder = (orderResult[0]?.values[0]?.[0] ?? -1) + 1;
572
+ const taskUid = (0, import_node_crypto.randomUUID)();
573
+ const now = Date.now();
574
+ const fileSpecs = input.fileSpecs ?? [];
575
+ const affectedFiles = deriveAffectedFiles(fileSpecs, input.affectedFiles);
576
+ db.run(
577
+ `INSERT INTO tasks (uid, plan_uid, sort_order, description, status, affected_files, affected_symbols, new_connections, removed_connections, dependencies, file_spec, symbol_specs, parent_task_uid, body, prompt, scope_path, file_specs, created_at, updated_at)
578
+ VALUES (?, ?, ?, ?, 'pending', ?, ?, '[]', '[]', '[]', ?, '[]', ?, ?, ?, ?, ?, ?, ?)`,
579
+ [
580
+ taskUid,
581
+ planUid,
582
+ nextOrder,
583
+ input.description,
584
+ JSON.stringify(affectedFiles),
585
+ JSON.stringify(input.affectedSymbols || []),
586
+ input.fileSpec ?? null,
587
+ input.parentTaskUid ?? null,
588
+ input.body ?? null,
589
+ input.prompt ?? null,
590
+ input.scopePath ?? null,
591
+ JSON.stringify(fileSpecs),
592
+ now,
593
+ now
594
+ ]
595
+ );
596
+ (0, import_persistence.markDirty)();
597
+ notifyMutation(planUid);
598
+ return getTaskByUid(taskUid);
599
+ }
600
+ function claimTask(taskUid, agentId, agentType, model) {
601
+ const result = (0, import_database.getDb)().exec(`SELECT status, assignee, plan_uid, affected_files FROM tasks WHERE uid = ?`, [taskUid]);
602
+ if (!result[0]?.values[0]) return { ok: false };
603
+ const [status, assignee, planUid, affectedFilesJson] = result[0].values[0];
604
+ if (assignee || status !== "pending") return { ok: false };
605
+ const affectedFiles = JSON.parse(affectedFilesJson || "[]");
606
+ const conflicts = [];
607
+ if (affectedFiles.length > 0) {
608
+ const otherTasks = getTasksByPlan(planUid);
609
+ for (const other of otherTasks) {
610
+ if (other.uid === taskUid) continue;
611
+ if (other.status !== "in_progress" && other.status !== "assigned") continue;
612
+ if (other.assignee === agentId) continue;
613
+ const overlap = other.affectedFiles.filter((f) => affectedFiles.includes(f));
614
+ if (overlap.length > 0) {
615
+ conflicts.push(`Task "${other.description}" (${other.assignee}) also affects: ${overlap.join(", ")}`);
616
+ }
617
+ }
618
+ }
619
+ updateTask(taskUid, { status: "assigned", assignee: agentId, assigneeType: agentType, assigneeModel: model || null });
620
+ return { ok: true, conflicts: conflicts.length > 0 ? conflicts : void 0 };
621
+ }
622
+ function getNextTask(planUid, phaseUid) {
623
+ const items = planItemService.listAllItems(planUid);
624
+ if (items.length > 0) return nextPlanItem(items, phaseUid);
625
+ const tasks = getTasksByPlan(planUid);
626
+ const done = new Set(tasks.filter((t) => t.status === "done").map((t) => t.uid));
627
+ for (const task of tasks) {
628
+ if (task.status !== "pending") continue;
629
+ if (phaseUid !== void 0 && task.phaseUid !== phaseUid) continue;
630
+ if (task.dependencies.every((d) => done.has(d))) return task;
631
+ }
632
+ return null;
633
+ }
634
+ function nextPlanItem(items, parentUid) {
635
+ const local = new Map(items.map((i) => [i.uid, i]));
636
+ for (const item of items) {
637
+ if (item.kind !== "action") continue;
638
+ if (item.status !== "pending") continue;
639
+ if (parentUid !== void 0 && item.parentUid !== parentUid) continue;
640
+ if (planItemService.dependencyStateOf(item, local).met) return item;
641
+ }
642
+ return null;
643
+ }
644
+ function getPlanVersions(planUid) {
645
+ const result = (0, import_database.getDb)().exec(
646
+ `SELECT id, plan_uid, version, snapshot, change_summary, author, created_at, author_type
647
+ FROM plan_versions WHERE plan_uid = ? ORDER BY version DESC`,
648
+ [planUid]
649
+ );
650
+ if (!result[0]) return [];
651
+ return result[0].values.map((r) => ({
652
+ id: r[0],
653
+ planUid: r[1],
654
+ version: r[2],
655
+ snapshot: r[3],
656
+ changeSummary: r[4],
657
+ author: r[5],
658
+ createdAt: r[6],
659
+ authorType: r[7] ?? null
660
+ }));
661
+ }
662
+ // Annotate the CommonJS export names for ESM import in node:
663
+ 0 && (module.exports = {
664
+ addPlanScope,
665
+ appendTaskCodeReference,
666
+ appendTaskToPlan,
667
+ claimTask,
668
+ createPlan,
669
+ deletePlan,
670
+ getNextTask,
671
+ getPlan,
672
+ getPlanVersions,
673
+ getSubtasks,
674
+ getTaskByUid,
675
+ getTasksByPlan,
676
+ listPlans,
677
+ listPlansByRepoUrl,
678
+ removePlanScope,
679
+ setPlanHomeRepo,
680
+ updatePlan,
681
+ updateTask
682
+ });