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,273 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+ var plan_changes_service_exports = {};
19
+ __export(plan_changes_service_exports, {
20
+ getChange: () => getChange,
21
+ listProposedChanges: () => listProposedChanges,
22
+ summarizeChanges: () => summarizeChanges
23
+ });
24
+ module.exports = __toCommonJS(plan_changes_service_exports);
25
+ var import_node_child_process = require("node:child_process");
26
+ var import_database = require("./database");
27
+ var import_plan_service = require("./plan-service");
28
+ var import_plan_item_service = require("./plan-item-service");
29
+ function listProposedChanges(planUid) {
30
+ const live = loadLiveState((0, import_plan_service.getPlan)(planUid)?.projectPath);
31
+ const v2Items = (0, import_plan_item_service.listAllItems)(planUid).filter((it) => it.kind === "action");
32
+ const tasks = (0, import_plan_service.getTasksByPlan)(planUid);
33
+ const migratedTaskUids = /* @__PURE__ */ new Set();
34
+ for (const it of v2Items) {
35
+ if (it.migratedFrom?.startsWith("tasks:")) {
36
+ migratedTaskUids.add(it.migratedFrom.slice("tasks:".length));
37
+ }
38
+ }
39
+ const changes = [];
40
+ for (const item of v2Items) {
41
+ pushItemChanges(item, changes, live);
42
+ }
43
+ for (const task of tasks) {
44
+ if (migratedTaskUids.has(task.uid)) continue;
45
+ pushTaskChanges(task, changes, live);
46
+ }
47
+ return changes;
48
+ }
49
+ function pushItemChanges(item, out, live) {
50
+ const adapter = adaptItemToTaskShape(item);
51
+ for (const fs of item.fileSpecs ?? []) {
52
+ const target = fs.action === "move" && fs.moveTo ? `${fs.path} \u2192 ${fs.moveTo}` : fs.path;
53
+ const detail = fs.edits && fs.edits.length > 0 ? `${fs.edits.length} edit${fs.edits.length === 1 ? "" : "s"}${fs.description ? " \xB7 " + fs.description : ""}` : fs.description;
54
+ out.push(makeChange(adapter, "file", fileSpecToOperation(fs.action), target, detail, live));
55
+ }
56
+ for (const spec of item.symbolSpecs ?? []) {
57
+ out.push(makeChange(
58
+ adapter,
59
+ "symbol",
60
+ spec.action,
61
+ formatSymbolTarget(spec),
62
+ formatSymbolDetail(spec),
63
+ live
64
+ ));
65
+ }
66
+ for (const edge of item.newConnections ?? []) {
67
+ out.push(makeChange(adapter, "connection", "add", `${edge.from} \u2192 ${edge.to}`, void 0, live));
68
+ }
69
+ for (const edge of item.removedConnections ?? []) {
70
+ out.push(makeChange(adapter, "connection", "remove", `${edge.from} \u2192 ${edge.to}`, void 0, live));
71
+ }
72
+ }
73
+ function pushTaskChanges(task, out, live) {
74
+ for (const file of task.affectedFiles) {
75
+ out.push(makeChange(task, "file", "modify", file, void 0, live));
76
+ }
77
+ for (const spec of task.symbolSpecs ?? []) {
78
+ out.push(makeChange(
79
+ task,
80
+ "symbol",
81
+ spec.action,
82
+ formatSymbolTarget(spec),
83
+ formatSymbolDetail(spec),
84
+ live
85
+ ));
86
+ }
87
+ for (const edge of task.newConnections) {
88
+ out.push(makeChange(task, "connection", "add", `${edge.from} \u2192 ${edge.to}`, void 0, live));
89
+ }
90
+ for (const edge of task.removedConnections) {
91
+ out.push(makeChange(task, "connection", "remove", `${edge.from} \u2192 ${edge.to}`, void 0, live));
92
+ }
93
+ }
94
+ function adaptItemToTaskShape(item) {
95
+ return {
96
+ uid: item.uid,
97
+ planUid: item.planUid,
98
+ sortOrder: item.sortOrder,
99
+ description: item.title,
100
+ status: item.status ?? "pending",
101
+ assignee: item.assignee ?? null,
102
+ assigneeType: item.assigneeType ?? null,
103
+ assigneeModel: item.assigneeModel ?? null,
104
+ affectedFiles: (item.fileSpecs ?? []).map((f) => f.path),
105
+ affectedSymbols: (item.symbolSpecs ?? []).map((s) => s.name),
106
+ newConnections: item.newConnections ?? [],
107
+ removedConnections: item.removedConnections ?? [],
108
+ dependencies: item.dependencies ?? [],
109
+ fileSpec: void 0,
110
+ symbolSpecs: item.symbolSpecs ?? [],
111
+ phaseUid: null,
112
+ parentTaskUid: item.parentUid,
113
+ body: item.body,
114
+ prompt: void 0,
115
+ scopePath: item.scopePath ?? null,
116
+ fileSpecs: item.fileSpecs ?? [],
117
+ progressPercent: item.progressPercent ?? null,
118
+ blockedReason: item.blockedReason ?? null,
119
+ createdAt: item.createdAt,
120
+ updatedAt: item.updatedAt
121
+ };
122
+ }
123
+ function fileSpecToOperation(a) {
124
+ if (a === "create") return "add";
125
+ if (a === "delete") return "remove";
126
+ return a;
127
+ }
128
+ function getChange(planUid, changeId) {
129
+ return listProposedChanges(planUid).find((c) => c.id === changeId) ?? null;
130
+ }
131
+ function summarizeChanges(planUid) {
132
+ const changes = listProposedChanges(planUid);
133
+ const byStatus = {
134
+ planned: 0,
135
+ in_progress: 0,
136
+ satisfied: 0,
137
+ missing: 0,
138
+ unexpected: 0
139
+ };
140
+ const byKind = { file: 0, symbol: 0, connection: 0 };
141
+ const byOperation = { add: 0, modify: 0, remove: 0, move: 0 };
142
+ for (const c of changes) {
143
+ byStatus[c.driftStatus]++;
144
+ byKind[c.kind]++;
145
+ byOperation[c.operation]++;
146
+ }
147
+ return { total: changes.length, byStatus, byKind, byOperation };
148
+ }
149
+ function loadLiveState(projectPath) {
150
+ const db = (0, import_database.getDb)();
151
+ const filePaths = /* @__PURE__ */ new Set();
152
+ const symbolNames = /* @__PURE__ */ new Set();
153
+ const edges = /* @__PURE__ */ new Set();
154
+ try {
155
+ const fr = db.exec(`SELECT path, relative_path FROM files`);
156
+ if (fr[0]) {
157
+ for (const row of fr[0].values) {
158
+ filePaths.add(row[0]);
159
+ if (row[1]) filePaths.add(row[1]);
160
+ }
161
+ }
162
+ const sr = db.exec(`SELECT name FROM symbols`);
163
+ if (sr[0]) {
164
+ for (const row of sr[0].values) {
165
+ symbolNames.add(row[0]);
166
+ }
167
+ }
168
+ const er = db.exec(`
169
+ SELECT f.relative_path, i.resolved_path
170
+ FROM imports i JOIN files f ON i.file_id = f.id
171
+ WHERE i.resolved_path IS NOT NULL
172
+ `);
173
+ if (er[0]) {
174
+ for (const row of er[0].values) {
175
+ edges.add(`${row[0]}\0${row[1]}`);
176
+ }
177
+ }
178
+ } catch {
179
+ }
180
+ return { filePaths, symbolNames, edges, changedFiles: loadChangedFiles(projectPath) };
181
+ }
182
+ function loadChangedFiles(projectPath) {
183
+ const out = /* @__PURE__ */ new Set();
184
+ if (!projectPath) return out;
185
+ try {
186
+ const porcelain = (0, import_node_child_process.execFileSync)("git", ["status", "--porcelain", "--", "."], {
187
+ cwd: projectPath,
188
+ encoding: "utf-8",
189
+ stdio: ["ignore", "pipe", "ignore"],
190
+ timeout: 5e3
191
+ });
192
+ for (const line of porcelain.split("\n")) {
193
+ if (line.length < 4) continue;
194
+ const rel = line.slice(3).split(" -> ").pop().trim().replace(/^"|"$/g, "");
195
+ if (rel) out.add(rel);
196
+ }
197
+ } catch {
198
+ }
199
+ return out;
200
+ }
201
+ function makeChange(task, kind, operation, target, detail, live) {
202
+ const id = `${task.uid}:${kind}:${operation}:${target}`;
203
+ const driftStatus = computeDrift(kind, operation, target, task, live);
204
+ return {
205
+ id,
206
+ taskUid: task.uid,
207
+ taskDescription: task.description,
208
+ taskStatus: task.status,
209
+ phaseUid: task.phaseUid,
210
+ operation,
211
+ kind,
212
+ target,
213
+ detail,
214
+ driftStatus
215
+ };
216
+ }
217
+ function computeDrift(kind, operation, target, task, live) {
218
+ const taskInFlight = task.status === "assigned" || task.status === "in_progress";
219
+ let satisfied = false;
220
+ if (kind === "file") {
221
+ const present = isFilePresent(target, live);
222
+ if (operation === "remove") satisfied = !present;
223
+ else if (operation === "modify") {
224
+ satisfied = present && isFileChanged(target, live);
225
+ } else satisfied = present;
226
+ } else if (kind === "symbol") {
227
+ const symbolName = target.includes("#") ? target.split("#").pop() : target.split("::").pop() ?? target;
228
+ const present = live.symbolNames.has(symbolName);
229
+ if (operation === "remove") satisfied = !present;
230
+ else satisfied = present;
231
+ } else if (kind === "connection") {
232
+ const [from, to] = target.split(" \u2192 ");
233
+ const present = !!from && !!to && live.edges.has(`${from}\0${to}`);
234
+ if (operation === "remove") satisfied = !present;
235
+ else satisfied = present;
236
+ }
237
+ if (task.status === "done") {
238
+ return satisfied ? "satisfied" : "missing";
239
+ }
240
+ if (satisfied) return "satisfied";
241
+ if (taskInFlight) return "in_progress";
242
+ return "planned";
243
+ }
244
+ function isFileChanged(target, live) {
245
+ if (live.changedFiles.has(target)) return true;
246
+ for (const p of live.changedFiles) {
247
+ if (p.endsWith(target) || target.endsWith(p)) return true;
248
+ }
249
+ return false;
250
+ }
251
+ function isFilePresent(target, live) {
252
+ if (live.filePaths.has(target)) return true;
253
+ for (const p of live.filePaths) {
254
+ if (p.endsWith(target) || target.endsWith(p)) return true;
255
+ }
256
+ return false;
257
+ }
258
+ function formatSymbolTarget(spec) {
259
+ return spec.kind === "method" ? `${spec.kind}:${spec.name}` : spec.name;
260
+ }
261
+ function formatSymbolDetail(spec) {
262
+ const parts = [];
263
+ if (spec.signature) parts.push(spec.signature);
264
+ if (spec.moveTo) parts.push(`\u2192 ${spec.moveTo}`);
265
+ if (spec.description) parts.push(spec.description);
266
+ return parts.length ? parts.join(" \xB7 ") : void 0;
267
+ }
268
+ // Annotate the CommonJS export names for ESM import in node:
269
+ 0 && (module.exports = {
270
+ getChange,
271
+ listProposedChanges,
272
+ summarizeChanges
273
+ });
@@ -0,0 +1,288 @@
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_conflict_service_exports = {};
29
+ __export(plan_conflict_service_exports, {
30
+ detectManifestConflicts: () => detectManifestConflicts,
31
+ extractConflictSide: () => extractConflictSide,
32
+ resolveFileConflict: () => resolveFileConflict,
33
+ resolveFileConflictBySide: () => resolveFileConflictBySide
34
+ });
35
+ module.exports = __toCommonJS(plan_conflict_service_exports);
36
+ var import_node_child_process = require("node:child_process");
37
+ var import_confined_fs = require("./confined-fs");
38
+ var import_git_checkout = require("./git-checkout");
39
+ var import_node_fs = __toESM(require("node:fs"));
40
+ var import_node_path = __toESM(require("node:path"));
41
+ function detectManifestConflicts(projectRoot) {
42
+ const gitDir = (0, import_git_checkout.checkoutGitDir)(projectRoot);
43
+ if (!gitDir || !import_node_fs.default.existsSync(import_node_path.default.join(gitDir, "MERGE_HEAD"))) {
44
+ return { hasConflicts: false, files: [], totalConflicts: 0, autoResolvable: 0 };
45
+ }
46
+ let conflictedPaths;
47
+ try {
48
+ const raw = runGitArgs(["diff", "--name-only", "--diff-filter=U", "--", ".codetrellis/"], projectRoot);
49
+ conflictedPaths = raw.trim().split("\n").filter(Boolean);
50
+ } catch {
51
+ return { hasConflicts: false, files: [], totalConflicts: 0, autoResolvable: 0 };
52
+ }
53
+ if (conflictedPaths.length === 0) {
54
+ return { hasConflicts: false, files: [], totalConflicts: 0, autoResolvable: 0 };
55
+ }
56
+ const files = [];
57
+ let autoResolvable = 0;
58
+ for (const filePath of conflictedPaths) {
59
+ const fullPath = (0, import_confined_fs.resolveWithin)(projectRoot, filePath, "resolveFileConflict(filePath)");
60
+ if (!import_node_fs.default.existsSync(fullPath)) continue;
61
+ const rawContent = import_node_fs.default.readFileSync(fullPath, "utf-8");
62
+ const planSlug = extractPlanSlug(filePath);
63
+ const entityType = classifyConflictFile(filePath);
64
+ let fields = null;
65
+ if (filePath.endsWith(".yaml") || filePath.endsWith(".yml")) {
66
+ fields = parseYamlConflictFields(rawContent);
67
+ } else if (filePath.endsWith(".json")) {
68
+ fields = parseJsonConflictFields(rawContent);
69
+ }
70
+ if (fields) {
71
+ autoResolvable += fields.filter((f) => f.autoResolvable).length;
72
+ }
73
+ files.push({
74
+ filePath,
75
+ planSlug,
76
+ entityType,
77
+ fields,
78
+ rawContent,
79
+ resolved: false
80
+ });
81
+ }
82
+ return {
83
+ hasConflicts: true,
84
+ files,
85
+ totalConflicts: conflictedPaths.length,
86
+ autoResolvable
87
+ };
88
+ }
89
+ function resolveFileConflict(projectRoot, filePath, resolutions) {
90
+ const fullPath = (0, import_confined_fs.resolveWithin)(projectRoot, filePath, "resolveFileConflict(filePath)");
91
+ if (!import_node_fs.default.existsSync(fullPath)) {
92
+ return { resolved: false, error: `File not found: ${filePath}` };
93
+ }
94
+ const rawContent = import_node_fs.default.readFileSync(fullPath, "utf-8");
95
+ const ours = extractConflictSide(rawContent, "ours");
96
+ const theirs = extractConflictSide(rawContent, "theirs");
97
+ if (!ours || !theirs) {
98
+ return { resolved: false, error: "Could not parse conflict markers in file" };
99
+ }
100
+ let merged;
101
+ try {
102
+ const isJson = filePath.endsWith(".json");
103
+ if (isJson) {
104
+ merged = JSON.parse(ours);
105
+ } else {
106
+ const { parse } = require("yaml");
107
+ merged = parse(ours) ?? {};
108
+ }
109
+ } catch {
110
+ return { resolved: false, error: "Could not parse our side of the conflict" };
111
+ }
112
+ let theirsParsed;
113
+ try {
114
+ const isJson = filePath.endsWith(".json");
115
+ if (isJson) {
116
+ theirsParsed = JSON.parse(theirs);
117
+ } else {
118
+ const { parse } = require("yaml");
119
+ theirsParsed = parse(theirs) ?? {};
120
+ }
121
+ } catch {
122
+ return { resolved: false, error: "Could not parse their side of the conflict" };
123
+ }
124
+ for (const res of resolutions) {
125
+ if (res.pick === "theirs") {
126
+ merged[res.field] = theirsParsed[res.field];
127
+ } else if (res.pick === "custom" && res.customValue !== void 0) {
128
+ merged[res.field] = res.customValue;
129
+ }
130
+ }
131
+ try {
132
+ const isJson = filePath.endsWith(".json");
133
+ if (isJson) {
134
+ (0, import_confined_fs.writeFileWithin)(projectRoot, fullPath, JSON.stringify(merged, null, 2), "conflict resolve (json)");
135
+ } else {
136
+ const { stringify } = require("yaml");
137
+ (0, import_confined_fs.writeFileWithin)(projectRoot, fullPath, stringify(merged), "conflict resolve (yaml)");
138
+ }
139
+ } catch (err) {
140
+ return { resolved: false, error: `Failed to write resolved file: ${err}` };
141
+ }
142
+ try {
143
+ runGitArgs(["add", "--", filePath], projectRoot);
144
+ } catch (err) {
145
+ return { resolved: false, error: `Failed to stage resolved file: ${err}` };
146
+ }
147
+ return { resolved: true };
148
+ }
149
+ function resolveFileConflictBySide(projectRoot, filePath, side) {
150
+ (0, import_confined_fs.resolveWithin)(projectRoot, filePath, "resolveFileConflictBySide(filePath)");
151
+ if (side !== "ours" && side !== "theirs") {
152
+ return { resolved: false, error: `Invalid side: ${String(side)}` };
153
+ }
154
+ try {
155
+ const flag = side === "ours" ? "--ours" : "--theirs";
156
+ runGitArgs(["checkout", flag, "--", filePath], projectRoot);
157
+ runGitArgs(["add", "--", filePath], projectRoot);
158
+ return { resolved: true };
159
+ } catch (err) {
160
+ return { resolved: false, error: `Failed to resolve by side: ${err}` };
161
+ }
162
+ }
163
+ function runGitArgs(args, cwd) {
164
+ return (0, import_node_child_process.execFileSync)("git", args, {
165
+ cwd,
166
+ encoding: "utf-8",
167
+ stdio: ["ignore", "pipe", "pipe"],
168
+ timeout: 1e4
169
+ });
170
+ }
171
+ function extractPlanSlug(filePath) {
172
+ const match = filePath.match(/\.codetrellis\/plans\/([^/]+)\//);
173
+ return match ? match[1] : null;
174
+ }
175
+ function classifyConflictFile(filePath) {
176
+ if (filePath.includes("/plans/") && filePath.endsWith("/plan.yaml")) return "plan";
177
+ if (filePath.includes("/items/")) return "item";
178
+ if (filePath.includes("/channels/")) return "channel-event";
179
+ if (filePath.endsWith("config.json")) return "config";
180
+ return "unknown";
181
+ }
182
+ function extractConflictSide(content, side) {
183
+ const lines = content.split("\n");
184
+ const result = [];
185
+ let inConflict = false;
186
+ let inOurSide = false;
187
+ let inTheirSide = false;
188
+ for (const line of lines) {
189
+ if (line.startsWith("<<<<<<<")) {
190
+ inConflict = true;
191
+ inOurSide = true;
192
+ inTheirSide = false;
193
+ continue;
194
+ }
195
+ if (line.startsWith("|||||||") && inConflict) {
196
+ inOurSide = false;
197
+ inTheirSide = false;
198
+ continue;
199
+ }
200
+ if (line.startsWith("=======") && inConflict) {
201
+ inOurSide = false;
202
+ inTheirSide = true;
203
+ continue;
204
+ }
205
+ if (line.startsWith(">>>>>>>") && inConflict) {
206
+ inConflict = false;
207
+ inOurSide = false;
208
+ inTheirSide = false;
209
+ continue;
210
+ }
211
+ if (!inConflict) {
212
+ result.push(line);
213
+ } else if (side === "ours" && inOurSide) {
214
+ result.push(line);
215
+ } else if (side === "theirs" && inTheirSide) {
216
+ result.push(line);
217
+ }
218
+ }
219
+ return result.join("\n") || null;
220
+ }
221
+ function parseYamlConflictFields(rawContent) {
222
+ const ours = extractConflictSide(rawContent, "ours");
223
+ const theirs = extractConflictSide(rawContent, "theirs");
224
+ if (!ours || !theirs) return null;
225
+ try {
226
+ const { parse } = require("yaml");
227
+ const oursParsed = parse(ours);
228
+ const theirsParsed = parse(theirs);
229
+ if (!oursParsed || !theirsParsed) return null;
230
+ return diffFields(oursParsed, theirsParsed);
231
+ } catch {
232
+ return null;
233
+ }
234
+ }
235
+ function parseJsonConflictFields(rawContent) {
236
+ const ours = extractConflictSide(rawContent, "ours");
237
+ const theirs = extractConflictSide(rawContent, "theirs");
238
+ if (!ours || !theirs) return null;
239
+ try {
240
+ const oursParsed = JSON.parse(ours);
241
+ const theirsParsed = JSON.parse(theirs);
242
+ return diffFields(oursParsed, theirsParsed);
243
+ } catch {
244
+ return null;
245
+ }
246
+ }
247
+ const STRUCTURED_FIELDS = /* @__PURE__ */ new Set([
248
+ "status",
249
+ "assignee",
250
+ "assigneeType",
251
+ "assigneeModel",
252
+ "visibility",
253
+ "visibility_override",
254
+ "kind",
255
+ "sort_order",
256
+ "sortOrder",
257
+ "parentUid",
258
+ "parent_uid",
259
+ "requires_approval",
260
+ "defaultVisibility",
261
+ "attachmentLocation",
262
+ "repoRole"
263
+ ]);
264
+ function diffFields(ours, theirs) {
265
+ const allKeys = /* @__PURE__ */ new Set([...Object.keys(ours), ...Object.keys(theirs)]);
266
+ const fields = [];
267
+ for (const key of allKeys) {
268
+ const oVal = ours[key];
269
+ const tVal = theirs[key];
270
+ if (JSON.stringify(oVal) === JSON.stringify(tVal)) continue;
271
+ const isStructured = STRUCTURED_FIELDS.has(key);
272
+ fields.push({
273
+ field: key,
274
+ type: isStructured ? "structured" : "freetext",
275
+ ours: oVal,
276
+ theirs: tVal,
277
+ autoResolvable: isStructured
278
+ });
279
+ }
280
+ return fields;
281
+ }
282
+ // Annotate the CommonJS export names for ESM import in node:
283
+ 0 && (module.exports = {
284
+ detectManifestConflicts,
285
+ extractConflictSide,
286
+ resolveFileConflict,
287
+ resolveFileConflictBySide
288
+ });
@@ -0,0 +1,91 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+ var plan_dependencies_exports = {};
19
+ __export(plan_dependencies_exports, {
20
+ dependencyProblem: () => dependencyProblem,
21
+ dependencyState: () => dependencyState,
22
+ isSettled: () => isSettled,
23
+ waitSentence: () => waitSentence
24
+ });
25
+ module.exports = __toCommonJS(plan_dependencies_exports);
26
+ function isSettled(item) {
27
+ return item.status === "done" || item.status === "skipped";
28
+ }
29
+ function dependencyState(item, lookup, local) {
30
+ const waits = [];
31
+ for (const uid of item.dependencies ?? []) {
32
+ const dep = local?.get(uid) ?? lookup.getItem(uid);
33
+ if (!dep) {
34
+ waits.push({
35
+ uid,
36
+ problem: "missing",
37
+ title: null,
38
+ status: null,
39
+ planUid: null,
40
+ planTitle: null,
41
+ words: `waits on an item that no longer exists (${uid})`
42
+ });
43
+ continue;
44
+ }
45
+ const elsewhere = dep.planUid !== item.planUid;
46
+ const planTitle = elsewhere ? lookup.planTitle(dep.planUid) : null;
47
+ const where = elsewhere ? ` in plan "${planTitle ?? dep.planUid}"` : "";
48
+ if (dep.kind !== "action") {
49
+ waits.push({
50
+ uid,
51
+ problem: "page",
52
+ title: dep.title,
53
+ status: null,
54
+ planUid: dep.planUid,
55
+ planTitle,
56
+ words: `depends on the page "${dep.title}"${where}, which has no status to finish`
57
+ });
58
+ continue;
59
+ }
60
+ if (isSettled(dep)) continue;
61
+ waits.push({
62
+ uid,
63
+ problem: "unfinished",
64
+ title: dep.title,
65
+ status: dep.status ?? null,
66
+ planUid: dep.planUid,
67
+ planTitle,
68
+ words: `waits on "${dep.title}"${where}`
69
+ });
70
+ }
71
+ return { met: waits.length === 0, waits };
72
+ }
73
+ function waitSentence(title, state) {
74
+ return `"${title}" ${state.waits.map((w) => w.words).join(", and ")}.`;
75
+ }
76
+ function dependencyProblem(itemUid, dependencies, getItem) {
77
+ for (const uid of dependencies) {
78
+ if (itemUid && uid === itemUid) return "An item cannot depend on itself.";
79
+ const dep = getItem(uid);
80
+ if (!dep) return `No item has the uid ${uid}.`;
81
+ if (dep.kind !== "action") return `"${dep.title}" is a page, not a task: it has no status to finish, so nothing could ever start after it.`;
82
+ }
83
+ return null;
84
+ }
85
+ // Annotate the CommonJS export names for ESM import in node:
86
+ 0 && (module.exports = {
87
+ dependencyProblem,
88
+ dependencyState,
89
+ isSettled,
90
+ waitSentence
91
+ });