codetrellis 0.0.0-stage → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (448) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +27 -2
  3. package/bin/codetrellis.mjs +4 -0
  4. package/package.json +41 -4
  5. package/reader/material-reader.mjs +130346 -0
  6. package/resources/tree-sitter/README.md +150 -0
  7. package/resources/tree-sitter/tree-sitter-c-sharp.wasm +0 -0
  8. package/resources/tree-sitter/tree-sitter-go.wasm +0 -0
  9. package/resources/tree-sitter/tree-sitter-java.wasm +0 -0
  10. package/resources/tree-sitter/tree-sitter-javascript.wasm +0 -0
  11. package/resources/tree-sitter/tree-sitter-kotlin.wasm +0 -0
  12. package/resources/tree-sitter/tree-sitter-php.wasm +0 -0
  13. package/resources/tree-sitter/tree-sitter-python.wasm +0 -0
  14. package/resources/tree-sitter/tree-sitter-ruby.wasm +0 -0
  15. package/resources/tree-sitter/tree-sitter-rust.wasm +0 -0
  16. package/resources/tree-sitter/tree-sitter-swift.wasm +0 -0
  17. package/resources/tree-sitter/tree-sitter-tsx.wasm +0 -0
  18. package/resources/tree-sitter/tree-sitter-typescript.wasm +0 -0
  19. package/resources/tree-sitter/tree-sitter.wasm +0 -0
  20. package/src/backend/agent/claude-code-watcher.js +270 -0
  21. package/src/backend/index.js +8 -0
  22. package/src/backend/lib/sha256-file.js +39 -0
  23. package/src/backend/lib/zip-entries.js +98 -0
  24. package/src/backend/lifecycle.js +102 -0
  25. package/src/backend/mcp/binding-headers.js +54 -0
  26. package/src/backend/mcp/client-identity.js +44 -0
  27. package/src/backend/mcp/connector/command.js +110 -0
  28. package/src/backend/mcp/connector/core.js +278 -0
  29. package/src/backend/mcp/connector/files.js +121 -0
  30. package/src/backend/mcp/connector/hook.js +284 -0
  31. package/src/backend/mcp/connector/main.js +126 -0
  32. package/src/backend/mcp/connector/sse-upstream.js +152 -0
  33. package/src/backend/mcp/helpers.js +43 -0
  34. package/src/backend/mcp/prompt-builders.js +104 -0
  35. package/src/backend/mcp/resources.js +197 -0
  36. package/src/backend/mcp/server.js +813 -0
  37. package/src/backend/mcp/skill-guide.js +1528 -0
  38. package/src/backend/mcp/tools/architecture-tools.js +273 -0
  39. package/src/backend/mcp/tools/audio-tools.js +117 -0
  40. package/src/backend/mcp/tools/awareness-tools.js +623 -0
  41. package/src/backend/mcp/tools/budget-tools.js +185 -0
  42. package/src/backend/mcp/tools/channel-tools.js +205 -0
  43. package/src/backend/mcp/tools/contribution-tools.js +181 -0
  44. package/src/backend/mcp/tools/drift-tools.js +252 -0
  45. package/src/backend/mcp/tools/git-tools.js +316 -0
  46. package/src/backend/mcp/tools/governance-tools.js +175 -0
  47. package/src/backend/mcp/tools/graph-tools.js +181 -0
  48. package/src/backend/mcp/tools/intake-tools.js +244 -0
  49. package/src/backend/mcp/tools/mobile-tools.js +118 -0
  50. package/src/backend/mcp/tools/peer-tools.js +330 -0
  51. package/src/backend/mcp/tools/plan-item-tools.js +1601 -0
  52. package/src/backend/mcp/tools/plan-tools.js +680 -0
  53. package/src/backend/mcp/tools/presence-tools.js +185 -0
  54. package/src/backend/mcp/tools/project-config-tools.js +150 -0
  55. package/src/backend/mcp/tools/review-tools.js +172 -0
  56. package/src/backend/mcp/tools/session-tools.js +554 -0
  57. package/src/backend/mcp/tools/system-docs-tools.js +168 -0
  58. package/src/backend/mcp/tools/terminal-tools.js +186 -0
  59. package/src/backend/mcp/tools/test-tools.js +117 -0
  60. package/src/backend/mcp/tools/ui-tools.js +356 -0
  61. package/src/backend/mcp/types.js +15 -0
  62. package/src/backend/middleware/local-auth.js +116 -0
  63. package/src/backend/server.js +5951 -0
  64. package/src/backend/services/agent-event-log.js +350 -0
  65. package/src/backend/services/architecture-rule.js +584 -0
  66. package/src/backend/services/architecture-rules.js +275 -0
  67. package/src/backend/services/artefact-content-service.js +181 -0
  68. package/src/backend/services/artefact-service.js +305 -0
  69. package/src/backend/services/artefact-watcher.js +167 -0
  70. package/src/backend/services/ast-parser.js +327 -0
  71. package/src/backend/services/audio-buffer-service.js +152 -0
  72. package/src/backend/services/awareness-notices.js +139 -0
  73. package/src/backend/services/awareness-replies.js +194 -0
  74. package/src/backend/services/awareness-service.js +344 -0
  75. package/src/backend/services/awareness-signals.js +267 -0
  76. package/src/backend/services/baseline-store.js +83 -0
  77. package/src/backend/services/branch-workstreams.js +341 -0
  78. package/src/backend/services/breakpoint-service.js +584 -0
  79. package/src/backend/services/brief-service.js +299 -0
  80. package/src/backend/services/budget-service.js +528 -0
  81. package/src/backend/services/callsites/base.js +15 -0
  82. package/src/backend/services/callsites/csharp.js +148 -0
  83. package/src/backend/services/callsites/go.js +163 -0
  84. package/src/backend/services/callsites/index.js +53 -0
  85. package/src/backend/services/callsites/kotlin.js +123 -0
  86. package/src/backend/services/callsites/process-env.js +125 -0
  87. package/src/backend/services/callsites/python.js +91 -0
  88. package/src/backend/services/callsites/ruby.js +164 -0
  89. package/src/backend/services/callsites/shared.js +198 -0
  90. package/src/backend/services/callsites/swift.js +115 -0
  91. package/src/backend/services/callsites/typescript.js +87 -0
  92. package/src/backend/services/capability-token.js +108 -0
  93. package/src/backend/services/change-check.js +156 -0
  94. package/src/backend/services/channel-dispatcher-service.js +235 -0
  95. package/src/backend/services/channel-event-file-service.js +125 -0
  96. package/src/backend/services/channel-event-service.js +297 -0
  97. package/src/backend/services/check-runs.js +177 -0
  98. package/src/backend/services/checkout-identity.js +73 -0
  99. package/src/backend/services/claude-code-parallel.js +221 -0
  100. package/src/backend/services/claude-desktop-config.js +186 -0
  101. package/src/backend/services/cli-install.js +249 -0
  102. package/src/backend/services/clock.js +57 -0
  103. package/src/backend/services/cloud-files.js +191 -0
  104. package/src/backend/services/coalesce.js +50 -0
  105. package/src/backend/services/code-breakpoints.js +291 -0
  106. package/src/backend/services/comment-service.js +168 -0
  107. package/src/backend/services/commit-attribution.js +134 -0
  108. package/src/backend/services/commit-edges.js +99 -0
  109. package/src/backend/services/confined-fs.js +241 -0
  110. package/src/backend/services/conformity-gate.js +132 -0
  111. package/src/backend/services/contribution-service.js +409 -0
  112. package/src/backend/services/coverage-service.js +173 -0
  113. package/src/backend/services/criteria-service.js +721 -0
  114. package/src/backend/services/criterion-checks.js +387 -0
  115. package/src/backend/services/criterion-loop-service.js +411 -0
  116. package/src/backend/services/cross-system-service.js +231 -0
  117. package/src/backend/services/database.js +916 -0
  118. package/src/backend/services/db-schema.js +1358 -0
  119. package/src/backend/services/deviation-service.js +344 -0
  120. package/src/backend/services/diff-engine.js +168 -0
  121. package/src/backend/services/evidence.js +363 -0
  122. package/src/backend/services/external-intake-service.js +269 -0
  123. package/src/backend/services/external-pointer-service.js +195 -0
  124. package/src/backend/services/external-refs-service.js +214 -0
  125. package/src/backend/services/file-history.js +158 -0
  126. package/src/backend/services/file-watcher.js +193 -0
  127. package/src/backend/services/folder-requests.js +118 -0
  128. package/src/backend/services/freeze-service.js +189 -0
  129. package/src/backend/services/gemini-cli-hook.js +172 -0
  130. package/src/backend/services/git-activity-service.js +325 -0
  131. package/src/backend/services/git-blobs.js +70 -0
  132. package/src/backend/services/git-branches.js +357 -0
  133. package/src/backend/services/git-checkout.js +153 -0
  134. package/src/backend/services/git-commit-service.js +91 -0
  135. package/src/backend/services/git-env.js +121 -0
  136. package/src/backend/services/git-identity.js +84 -0
  137. package/src/backend/services/git-refs.js +386 -0
  138. package/src/backend/services/git-safety.js +58 -0
  139. package/src/backend/services/grant-guard.js +67 -0
  140. package/src/backend/services/html-view-policy.js +135 -0
  141. package/src/backend/services/human-decision.js +55 -0
  142. package/src/backend/services/importers.js +159 -0
  143. package/src/backend/services/intent-service.js +105 -0
  144. package/src/backend/services/ipc-dispatcher.js +164 -0
  145. package/src/backend/services/item-git-state.js +208 -0
  146. package/src/backend/services/line-changes.js +232 -0
  147. package/src/backend/services/line-history.js +174 -0
  148. package/src/backend/services/local-api-changes.js +40 -0
  149. package/src/backend/services/logger.js +217 -0
  150. package/src/backend/services/material-footprints.js +203 -0
  151. package/src/backend/services/material-place.js +82 -0
  152. package/src/backend/services/material-reader/docx-markdown.js +198 -0
  153. package/src/backend/services/material-reader/fixtures.test-helper.js +169 -0
  154. package/src/backend/services/material-reader/quote.js +44 -0
  155. package/src/backend/services/material-reader/reader-host.js +202 -0
  156. package/src/backend/services/material-signals.js +141 -0
  157. package/src/backend/services/mcp-capabilities.js +390 -0
  158. package/src/backend/services/mdns-service.js +304 -0
  159. package/src/backend/services/mobile-api-server.js +281 -0
  160. package/src/backend/services/mobile-approvals.js +306 -0
  161. package/src/backend/services/mobile-awareness.js +180 -0
  162. package/src/backend/services/mobile-breakpoints.js +115 -0
  163. package/src/backend/services/mobile-budget.js +98 -0
  164. package/src/backend/services/mobile-freeze.js +106 -0
  165. package/src/backend/services/mobile-proposals.js +100 -0
  166. package/src/backend/services/mobile-rpc-service.js +1289 -0
  167. package/src/backend/services/mobile-workstreams.js +160 -0
  168. package/src/backend/services/monorepo-detector.js +131 -0
  169. package/src/backend/services/other-work.js +45 -0
  170. package/src/backend/services/pack-seal.js +129 -0
  171. package/src/backend/services/paired-device-service.js +192 -0
  172. package/src/backend/services/pairing-server.js +323 -0
  173. package/src/backend/services/pairing-service.js +200 -0
  174. package/src/backend/services/pantry-resolution-service.js +166 -0
  175. package/src/backend/services/parsers/base.js +124 -0
  176. package/src/backend/services/parsers/csharp.js +224 -0
  177. package/src/backend/services/parsers/go.js +180 -0
  178. package/src/backend/services/parsers/index.js +101 -0
  179. package/src/backend/services/parsers/java.js +103 -0
  180. package/src/backend/services/parsers/kotlin.js +252 -0
  181. package/src/backend/services/parsers/php.js +113 -0
  182. package/src/backend/services/parsers/python.js +189 -0
  183. package/src/backend/services/parsers/ruby.js +212 -0
  184. package/src/backend/services/parsers/rust.js +97 -0
  185. package/src/backend/services/parsers/swift.js +221 -0
  186. package/src/backend/services/parsers/typescript.js +235 -0
  187. package/src/backend/services/pattern-scan.js +65 -0
  188. package/src/backend/services/patterns.js +281 -0
  189. package/src/backend/services/peer-audit-service.js +123 -0
  190. package/src/backend/services/peer-auth.js +153 -0
  191. package/src/backend/services/peer-capabilities.js +209 -0
  192. package/src/backend/services/peer-connection-service.js +450 -0
  193. package/src/backend/services/peer-grants.js +33 -0
  194. package/src/backend/services/persistence.js +116 -0
  195. package/src/backend/services/personal-sync-service.js +232 -0
  196. package/src/backend/services/pipeline-approvals.js +72 -0
  197. package/src/backend/services/pipeline.js +232 -0
  198. package/src/backend/services/plan-arrivals.js +68 -0
  199. package/src/backend/services/plan-changes-service.js +273 -0
  200. package/src/backend/services/plan-conflict-service.js +288 -0
  201. package/src/backend/services/plan-dependencies.js +91 -0
  202. package/src/backend/services/plan-doc-guard.js +90 -0
  203. package/src/backend/services/plan-documents-service.js +275 -0
  204. package/src/backend/services/plan-event-service.js +154 -0
  205. package/src/backend/services/plan-file-refs.js +106 -0
  206. package/src/backend/services/plan-file-service.js +1564 -0
  207. package/src/backend/services/plan-history-service.js +156 -0
  208. package/src/backend/services/plan-import-service.js +261 -0
  209. package/src/backend/services/plan-item-service.js +1223 -0
  210. package/src/backend/services/plan-migrate-service.js +395 -0
  211. package/src/backend/services/plan-overlay-service.js +173 -0
  212. package/src/backend/services/plan-phases-service.js +182 -0
  213. package/src/backend/services/plan-progress-service.js +134 -0
  214. package/src/backend/services/plan-review-service.js +262 -0
  215. package/src/backend/services/plan-service.js +682 -0
  216. package/src/backend/services/plan-status.js +113 -0
  217. package/src/backend/services/plan-template-publish-service.js +217 -0
  218. package/src/backend/services/plan-templates-service.js +242 -0
  219. package/src/backend/services/plan-templates.js +1164 -0
  220. package/src/backend/services/planned-overlap-actions.js +200 -0
  221. package/src/backend/services/plans-home.js +224 -0
  222. package/src/backend/services/play-forward.js +256 -0
  223. package/src/backend/services/playback-service.js +117 -0
  224. package/src/backend/services/power-service.js +167 -0
  225. package/src/backend/services/power-signals.js +81 -0
  226. package/src/backend/services/pr-draft-service.js +142 -0
  227. package/src/backend/services/presence-service.js +122 -0
  228. package/src/backend/services/pricing.js +60 -0
  229. package/src/backend/services/project-config-service.js +474 -0
  230. package/src/backend/services/project-scanner.js +184 -0
  231. package/src/backend/services/projection-service.js +69 -0
  232. package/src/backend/services/push-notification-service.js +288 -0
  233. package/src/backend/services/recent-projects-service.js +204 -0
  234. package/src/backend/services/record-chain.js +162 -0
  235. package/src/backend/services/recurrence-rule.js +63 -0
  236. package/src/backend/services/recurring-agent.js +89 -0
  237. package/src/backend/services/recurring-scheduler.js +77 -0
  238. package/src/backend/services/recurring-service.js +276 -0
  239. package/src/backend/services/reference-service.js +169 -0
  240. package/src/backend/services/release-public-key.js +30 -0
  241. package/src/backend/services/release-signature.js +64 -0
  242. package/src/backend/services/remote-audio-service.js +224 -0
  243. package/src/backend/services/remote-interaction-service.js +275 -0
  244. package/src/backend/services/remote-terminal-service.js +324 -0
  245. package/src/backend/services/rendition/child/main.js +76 -0
  246. package/src/backend/services/rendition/engine-host.js +249 -0
  247. package/src/backend/services/rendition/engine-lock.js +39 -0
  248. package/src/backend/services/rendition/engine-lock.json +14 -0
  249. package/src/backend/services/rendition/engine-manifest.js +97 -0
  250. package/src/backend/services/rendition/network-proof.js +73 -0
  251. package/src/backend/services/rendition/rendition-service.js +175 -0
  252. package/src/backend/services/replay-frames.js +387 -0
  253. package/src/backend/services/replay-state.js +201 -0
  254. package/src/backend/services/resolvers/base.js +108 -0
  255. package/src/backend/services/resolvers/csharp.js +109 -0
  256. package/src/backend/services/resolvers/go.js +105 -0
  257. package/src/backend/services/resolvers/index.js +60 -0
  258. package/src/backend/services/resolvers/java.js +63 -0
  259. package/src/backend/services/resolvers/kotlin.js +109 -0
  260. package/src/backend/services/resolvers/php.js +89 -0
  261. package/src/backend/services/resolvers/python.js +154 -0
  262. package/src/backend/services/resolvers/ruby.js +103 -0
  263. package/src/backend/services/resolvers/rust.js +77 -0
  264. package/src/backend/services/resolvers/swift.js +98 -0
  265. package/src/backend/services/resolvers/typescript.js +71 -0
  266. package/src/backend/services/retention.js +54 -0
  267. package/src/backend/services/review-architecture.js +236 -0
  268. package/src/backend/services/review-attest.js +68 -0
  269. package/src/backend/services/review-bundle.js +226 -0
  270. package/src/backend/services/review-graduation.js +93 -0
  271. package/src/backend/services/review-host/bitbucket.js +79 -0
  272. package/src/backend/services/review-host/detect.js +80 -0
  273. package/src/backend/services/review-host/github.js +97 -0
  274. package/src/backend/services/review-host/gitlab.js +77 -0
  275. package/src/backend/services/review-host/host-state.js +103 -0
  276. package/src/backend/services/review-host/http.js +58 -0
  277. package/src/backend/services/review-host/switch.js +120 -0
  278. package/src/backend/services/review-marks.js +72 -0
  279. package/src/backend/services/review-notes.js +169 -0
  280. package/src/backend/services/review-other-work.js +90 -0
  281. package/src/backend/services/review-queue-service.js +147 -0
  282. package/src/backend/services/review-risk.js +127 -0
  283. package/src/backend/services/review-task.js +121 -0
  284. package/src/backend/services/rule-approvals.js +275 -0
  285. package/src/backend/services/rule-baseline.js +134 -0
  286. package/src/backend/services/rule-changes.js +162 -0
  287. package/src/backend/services/rule-preview.js +47 -0
  288. package/src/backend/services/rule-proposals.js +104 -0
  289. package/src/backend/services/rule-scope.js +76 -0
  290. package/src/backend/services/rulebook.js +286 -0
  291. package/src/backend/services/rules-at.js +56 -0
  292. package/src/backend/services/rules-overview.js +88 -0
  293. package/src/backend/services/schema-reconciler.js +250 -0
  294. package/src/backend/services/secret-store.js +119 -0
  295. package/src/backend/services/section-workstreams.js +95 -0
  296. package/src/backend/services/self-write-tracker.js +75 -0
  297. package/src/backend/services/sensor-bridge-service.js +285 -0
  298. package/src/backend/services/session-service.js +192 -0
  299. package/src/backend/services/settings-service.js +324 -0
  300. package/src/backend/services/signal-breakpoints.js +172 -0
  301. package/src/backend/services/signed-approval-record.js +86 -0
  302. package/src/backend/services/signed-approvals.js +244 -0
  303. package/src/backend/services/signoff-pack.js +328 -0
  304. package/src/backend/services/signoff-rows.js +114 -0
  305. package/src/backend/services/skill-arrival-service.js +138 -0
  306. package/src/backend/services/skill-model.js +193 -0
  307. package/src/backend/services/skill-use-service.js +140 -0
  308. package/src/backend/services/skills-service.js +150 -0
  309. package/src/backend/services/snapshot-compare-service.js +397 -0
  310. package/src/backend/services/source-control.js +189 -0
  311. package/src/backend/services/spec-links-service.js +123 -0
  312. package/src/backend/services/spec-proposal-withdraw.js +50 -0
  313. package/src/backend/services/spec-proposals-service.js +470 -0
  314. package/src/backend/services/sql/embedded.js +95 -0
  315. package/src/backend/services/sql/index.js +63 -0
  316. package/src/backend/services/sql/refs.js +357 -0
  317. package/src/backend/services/sql/schema.js +312 -0
  318. package/src/backend/services/sql/tokenizer.js +195 -0
  319. package/src/backend/services/stack-overlaps.js +117 -0
  320. package/src/backend/services/stack-service.js +225 -0
  321. package/src/backend/services/state-sync-service.js +384 -0
  322. package/src/backend/services/stuck-sensor-service.js +200 -0
  323. package/src/backend/services/system-discovery.js +481 -0
  324. package/src/backend/services/system-docs-service.js +701 -0
  325. package/src/backend/services/task-attachments-service.js +340 -0
  326. package/src/backend/services/task-grounding.js +60 -0
  327. package/src/backend/services/task-records/check-run-record.js +146 -0
  328. package/src/backend/services/task-records/check-runs.js +115 -0
  329. package/src/backend/services/task-records/heads.js +88 -0
  330. package/src/backend/services/task-records/material-reads.js +225 -0
  331. package/src/backend/services/task-records/read-record.js +100 -0
  332. package/src/backend/services/task-records/record.js +173 -0
  333. package/src/backend/services/task-records/run-record.js +136 -0
  334. package/src/backend/services/task-records/shared-state.js +548 -0
  335. package/src/backend/services/task-records/signing.js +140 -0
  336. package/src/backend/services/task-records/split-signals.js +52 -0
  337. package/src/backend/services/task-records/test-runs.js +164 -0
  338. package/src/backend/services/task-records/trust.js +243 -0
  339. package/src/backend/services/task-rules.js +81 -0
  340. package/src/backend/services/task-workstreams.js +90 -0
  341. package/src/backend/services/terminal-history-service.js +266 -0
  342. package/src/backend/services/terminal-service.js +267 -0
  343. package/src/backend/services/test-clock.js +53 -0
  344. package/src/backend/services/tests/grounding.js +266 -0
  345. package/src/backend/services/tests/junit.js +104 -0
  346. package/src/backend/services/tests/teammate-runs.js +134 -0
  347. package/src/backend/services/tests/test-results.js +234 -0
  348. package/src/backend/services/tree-watcher.js +204 -0
  349. package/src/backend/services/trellis-service.js +204 -0
  350. package/src/backend/services/trusted-roots.js +186 -0
  351. package/src/backend/services/update-download-service.js +342 -0
  352. package/src/backend/services/update-service.js +266 -0
  353. package/src/backend/services/watch-ignore.js +76 -0
  354. package/src/backend/services/webhook-egress.js +206 -0
  355. package/src/backend/services/webrtc-service.js +413 -0
  356. package/src/backend/services/work-changes.js +59 -0
  357. package/src/backend/services/workstream-binding.js +82 -0
  358. package/src/backend/services/workstream-commits.js +116 -0
  359. package/src/backend/services/workstream-imports.js +177 -0
  360. package/src/backend/services/workstream-service.js +335 -0
  361. package/src/backend/services/workstream-symbols.js +223 -0
  362. package/src/backend/services/workstream-watch-service.js +391 -0
  363. package/src/backend/services/worktree-service.js +235 -0
  364. package/src/cli/agent.js +100 -0
  365. package/src/cli/args.js +209 -0
  366. package/src/cli/conformity.js +106 -0
  367. package/src/cli/desktop.js +91 -0
  368. package/src/cli/main.js +411 -0
  369. package/src/cli/pipeline.js +109 -0
  370. package/src/cli/plan-verbs.js +259 -0
  371. package/src/cli/review-adapters.js +220 -0
  372. package/src/cli/review-output.js +93 -0
  373. package/src/cli/review-post.js +89 -0
  374. package/src/cli/review-sink.js +183 -0
  375. package/src/cli/review-skill.js +44 -0
  376. package/src/cli/review-verify.js +104 -0
  377. package/src/cli/review.js +386 -0
  378. package/src/cli/sarif.js +148 -0
  379. package/src/cli/verbs.js +360 -0
  380. package/src/shared/build-info.js +39 -0
  381. package/src/shared/lib/agent-review.js +199 -0
  382. package/src/shared/lib/agent-turns.js +140 -0
  383. package/src/shared/lib/awareness-digest.js +120 -0
  384. package/src/shared/lib/branch-name.js +45 -0
  385. package/src/shared/lib/breakpoint-words.js +118 -0
  386. package/src/shared/lib/budget-words.js +56 -0
  387. package/src/shared/lib/burst.js +69 -0
  388. package/src/shared/lib/call-entry.js +105 -0
  389. package/src/shared/lib/check-compare.js +42 -0
  390. package/src/shared/lib/check-words.js +216 -0
  391. package/src/shared/lib/csv.js +62 -0
  392. package/src/shared/lib/folder-entry.js +87 -0
  393. package/src/shared/lib/freeze-words.js +60 -0
  394. package/src/shared/lib/fuzzy.js +84 -0
  395. package/src/shared/lib/git-state-words.js +80 -0
  396. package/src/shared/lib/grep-entry.js +86 -0
  397. package/src/shared/lib/grounding-line.js +61 -0
  398. package/src/shared/lib/import-line.js +71 -0
  399. package/src/shared/lib/item-status.js +249 -0
  400. package/src/shared/lib/line-changes.js +53 -0
  401. package/src/shared/lib/locator.js +71 -0
  402. package/src/shared/lib/matcher.js +120 -0
  403. package/src/shared/lib/merge-order.js +65 -0
  404. package/src/shared/lib/open-findings.js +68 -0
  405. package/src/shared/lib/other-work.js +108 -0
  406. package/src/shared/lib/package-entry.js +142 -0
  407. package/src/shared/lib/plan-vocab.js +40 -0
  408. package/src/shared/lib/pptx-xml.js +86 -0
  409. package/src/shared/lib/proposal-words.js +61 -0
  410. package/src/shared/lib/recurrence.js +183 -0
  411. package/src/shared/lib/references.js +72 -0
  412. package/src/shared/lib/rule-pattern.js +56 -0
  413. package/src/shared/lib/sdp-fingerprint.js +115 -0
  414. package/src/shared/lib/sdp-minimal.js +123 -0
  415. package/src/shared/lib/secret-paths.js +34 -0
  416. package/src/shared/lib/signal-words.js +172 -0
  417. package/src/shared/lib/signoff.js +56 -0
  418. package/src/shared/lib/skills-note.js +60 -0
  419. package/src/shared/lib/spec-sections.js +78 -0
  420. package/src/shared/lib/symbol-entry.js +60 -0
  421. package/src/shared/lib/tool-phrasing.js +338 -0
  422. package/src/shared/lib/turn-gap.js +27 -0
  423. package/src/shared/lib/workstream-words.js +38 -0
  424. package/src/shared/lib/xlsx-xml.js +144 -0
  425. package/src/shared/lib/zip-reader.js +99 -0
  426. package/src/shared/types/agent.js +27 -0
  427. package/src/shared/types/architecture-rules.js +30 -0
  428. package/src/shared/types/ast.js +15 -0
  429. package/src/shared/types/breakpoint.js +33 -0
  430. package/src/shared/types/channel.js +41 -0
  431. package/src/shared/types/criteria.js +15 -0
  432. package/src/shared/types/graph.js +15 -0
  433. package/src/shared/types/index.js +53 -0
  434. package/src/shared/types/peer.js +36 -0
  435. package/src/shared/types/pipeline.js +15 -0
  436. package/src/shared/types/plan.js +15 -0
  437. package/src/shared/types/play-forward.js +15 -0
  438. package/src/shared/types/power.js +15 -0
  439. package/src/shared/types/presence.js +15 -0
  440. package/src/shared/types/project-config.js +35 -0
  441. package/src/shared/types/project.js +15 -0
  442. package/src/shared/types/record.js +15 -0
  443. package/src/shared/types/recurring.js +15 -0
  444. package/src/shared/types/review.js +15 -0
  445. package/src/shared/types/settings.js +114 -0
  446. package/src/shared/types/stack.js +15 -0
  447. package/src/shared/types/system-doc.js +15 -0
  448. package/src/shared/types/system.js +15 -0
@@ -0,0 +1,86 @@
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 grep_entry_exports = {};
19
+ __export(grep_entry_exports, {
20
+ grepEntries: () => grepEntries,
21
+ grepKey: () => grepKey,
22
+ grepLine: () => grepLine,
23
+ grepPatternWords: () => grepPatternWords,
24
+ grepWords: () => grepWords,
25
+ isGrepEntry: () => isGrepEntry,
26
+ splitGrep: () => splitGrep
27
+ });
28
+ module.exports = __toCommonJS(grep_entry_exports);
29
+ var import_matcher = require("./matcher");
30
+ var import_fuzzy = require("./fuzzy");
31
+ const MAX_TEXT = 200;
32
+ const BINARY_PROBE = 8e3;
33
+ function fnv(s) {
34
+ let h = 2166136261;
35
+ for (let i = 0; i < s.length; i++) {
36
+ h ^= s.charCodeAt(i);
37
+ h = Math.imul(h, 16777619);
38
+ }
39
+ return (h >>> 0).toString(16).padStart(8, "0");
40
+ }
41
+ function grepKey(t) {
42
+ return fnv(JSON.stringify([t.must ? "must" : "mustNot", t.match ?? "exact", t.ignoreCase ? "i" : "", t.mayNotImport, ...t.match === "fuzzy" ? [t.threshold ?? import_fuzzy.DEFAULT_THRESHOLD] : []]));
43
+ }
44
+ const isGrepEntry = (e) => /^grep:[0-9a-f]{8}:[+-]/.test(e);
45
+ function splitGrep(e) {
46
+ if (!isGrepEntry(e)) return null;
47
+ return { key: e.slice(5, 13), found: e[14] === "+", text: e.slice(15) };
48
+ }
49
+ function grepEntries(t, text) {
50
+ if (text.slice(0, BINARY_PROBE).includes("\0")) return [];
51
+ const key = grepKey(t);
52
+ const hits = [];
53
+ for (const line of text.split("\n")) {
54
+ if (!(0, import_matcher.lineMatches)(t.match ?? null, t.mayNotImport, line, t.ignoreCase, t.threshold)) continue;
55
+ if (t.must) return [];
56
+ hits.push(`grep:${key}:+${line.trim().slice(0, MAX_TEXT)}`);
57
+ }
58
+ return t.must ? [`grep:${key}:-${t.mayNotImport}`] : [...new Set(hits)];
59
+ }
60
+ function grepPatternWords(t) {
61
+ const said = t.match === "regex" ? `a line matching /${t.mayNotImport}/` : t.match === "glob" ? `a line like \u201C${t.mayNotImport}\u201D` : t.match === "fuzzy" ? `a word like \u201C${t.mayNotImport}\u201D (${(t.threshold ?? import_fuzzy.DEFAULT_THRESHOLD).toFixed(2)} or closer) but not it` : `\u201C${t.mayNotImport}\u201D`;
62
+ return `${said}${t.ignoreCase ? " (in any case)" : ""}`;
63
+ }
64
+ function grepWords(e) {
65
+ const g = splitGrep(e);
66
+ if (!g) return e;
67
+ return g.found ? `contains \u201C${g.text}\u201D` : `never contains \u201C${g.text}\u201D`;
68
+ }
69
+ function grepLine(text, e) {
70
+ const g = splitGrep(e);
71
+ if (!g) return null;
72
+ if (!g.found) return text.length ? 1 : null;
73
+ const lines = text.split("\n");
74
+ for (let i = 0; i < lines.length; i++) if (lines[i].trim().slice(0, MAX_TEXT) === g.text) return i + 1;
75
+ return null;
76
+ }
77
+ // Annotate the CommonJS export names for ESM import in node:
78
+ 0 && (module.exports = {
79
+ grepEntries,
80
+ grepKey,
81
+ grepLine,
82
+ grepPatternWords,
83
+ grepWords,
84
+ isGrepEntry,
85
+ splitGrep
86
+ });
@@ -0,0 +1,61 @@
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 grounding_line_exports = {};
19
+ __export(grounding_line_exports, {
20
+ GRADE_GLYPH: () => GRADE_GLYPH,
21
+ GRADE_ORDER: () => GRADE_ORDER,
22
+ GRADE_WORDS: () => GRADE_WORDS,
23
+ groundingLine: () => groundingLine
24
+ });
25
+ module.exports = __toCommonJS(grounding_line_exports);
26
+ const GRADE_ORDER = ["grounded", "waiting", "sent_back", "changed", "tests_older", "failing", "no_evidence"];
27
+ const GRADE_WORDS = {
28
+ grounded: "grounded",
29
+ waiting: "waiting on a person",
30
+ sent_back: "sent back",
31
+ changed: "changed since",
32
+ tests_older: "with tests older than the code",
33
+ failing: "failing",
34
+ no_evidence: "no evidence yet"
35
+ };
36
+ const GRADE_GLYPH = {
37
+ grounded: "\u2713",
38
+ waiting: "\u25D0",
39
+ sent_back: "\u21A9",
40
+ changed: "\u26A0",
41
+ tests_older: "\u26A0",
42
+ failing: "\u2717",
43
+ no_evidence: "\u25CB"
44
+ };
45
+ function groundingLine(grades) {
46
+ const counts = Object.fromEntries(GRADE_ORDER.map((g) => [g, 0]));
47
+ for (const g of grades) counts[g]++;
48
+ const total = grades.length;
49
+ if (total === 0) return { words: null, total, counts, grounded: false };
50
+ const parts = [`${total} criteri${total === 1 ? "on" : "a"}`];
51
+ if (counts.grounded === total) parts.push(total === 1 ? "grounded" : "all grounded");
52
+ else for (const g of GRADE_ORDER) if (counts[g]) parts.push(`${counts[g]} ${GRADE_WORDS[g]}`);
53
+ return { words: parts.join(" \xB7 "), total, counts, grounded: counts.grounded === total };
54
+ }
55
+ // Annotate the CommonJS export names for ESM import in node:
56
+ 0 && (module.exports = {
57
+ GRADE_GLYPH,
58
+ GRADE_ORDER,
59
+ GRADE_WORDS,
60
+ groundingLine
61
+ });
@@ -0,0 +1,71 @@
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 import_line_exports = {};
19
+ __export(import_line_exports, {
20
+ findingAt: () => findingAt,
21
+ importLine: () => importLine
22
+ });
23
+ module.exports = __toCommonJS(import_line_exports);
24
+ var import_grep_entry = require("./grep-entry");
25
+ const PACKAGE = /^(npm|pypi|go|cargo|maven|nuget|gem|composer|swift):(.+)$/;
26
+ const CALL = /^(http|sql):(.+)$/;
27
+ const SYMBOL = /^([^#\s:]+)#([^#\s/]+)$/;
28
+ const IMPORTISH = /^\s*(import\b|from\b|export\b.*\bfrom\b|use\b|using\b|require\b|#include\b|package\b)|\brequire\s*\(|\bimport\s*\(/;
29
+ const basename = (p) => p.slice(p.lastIndexOf("/") + 1);
30
+ function importLine(text, target) {
31
+ if ((0, import_grep_entry.isGrepEntry)(target)) return (0, import_grep_entry.grepLine)(text, target);
32
+ const call = CALL.exec(target);
33
+ if (call) return callLine(text, call[1], call[2]);
34
+ if (target.startsWith("folder:")) return text.length ? 1 : null;
35
+ const pkg = PACKAGE.exec(target);
36
+ const sym = SYMBOL.exec(target);
37
+ const base = pkg ? pkg[1] === "go" ? basename(pkg[2]) : pkg[2] : sym ? sym[2] === "*" || sym[2] === "default" ? basename(sym[1]).replace(/\.[^.]+$/, "") : sym[2] : basename(target).replace(/\.[^.]+$/, "");
38
+ if (!base) return null;
39
+ const word = new RegExp(`(^|[^A-Za-z0-9_])${base.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}([^A-Za-z0-9_]|$)`);
40
+ const lines = text.split("\n");
41
+ for (let i = 0; i < lines.length; i++) {
42
+ if (IMPORTISH.test(lines[i]) && word.test(lines[i])) return i + 1;
43
+ }
44
+ return null;
45
+ }
46
+ function findingAt(text, target, found) {
47
+ if (found && Number.isInteger(found) && found >= 1 && found <= text.split("\n").length) return found;
48
+ return importLine(text, target);
49
+ }
50
+ function callLine(text, protocol, rest) {
51
+ const lines = text.split("\n");
52
+ let test;
53
+ if (protocol === "sql") {
54
+ const table = rest.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
55
+ const re = new RegExp(`\\b(from|into|update|join|table)\\s+[\`"']?${table}\\b`, "i");
56
+ test = (l) => re.test(l);
57
+ } else {
58
+ const slash = rest.indexOf("/");
59
+ const host = slash < 0 ? rest : rest.slice(0, slash);
60
+ const word = host || rest.split("/").find((x) => x && !x.startsWith(":")) || "";
61
+ if (!word) return null;
62
+ test = (l) => l.toLowerCase().includes(word.toLowerCase());
63
+ }
64
+ for (let i = 0; i < lines.length; i++) if (test(lines[i])) return i + 1;
65
+ return null;
66
+ }
67
+ // Annotate the CommonJS export names for ESM import in node:
68
+ 0 && (module.exports = {
69
+ findingAt,
70
+ importLine
71
+ });
@@ -0,0 +1,249 @@
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 item_status_exports = {};
19
+ __export(item_status_exports, {
20
+ ITEM_STATE_FIELDS: () => ITEM_STATE_FIELDS,
21
+ atOnceWords: () => atOnceWords,
22
+ branchLineageWords: () => branchLineageWords,
23
+ isFinished: () => isFinished,
24
+ isStateOnly: () => isStateOnly,
25
+ itemStatuses: () => itemStatuses,
26
+ planStatusView: () => planStatusView,
27
+ recordCheckWords: () => recordCheckWords,
28
+ recordedWords: () => recordedWords,
29
+ sectionStateWords: () => sectionStateWords,
30
+ stateFromWords: () => stateFromWords,
31
+ statusLine: () => statusLine,
32
+ taskStateWords: () => taskStateWords
33
+ });
34
+ module.exports = __toCommonJS(item_status_exports);
35
+ var import_git_state_words = require("./git-state-words");
36
+ const TASK_STATUS = {
37
+ pending: "not-started",
38
+ assigned: "assigned",
39
+ in_progress: "in-progress",
40
+ blocked: "blocked",
41
+ done: "done",
42
+ skipped: "skipped"
43
+ };
44
+ function criteriaWords(c, state) {
45
+ if (!c || c.total === 0) return null;
46
+ if (state === "done" && c.met === c.total && c.signedOffBy) return `signed off by ${c.signedOffBy}`;
47
+ const parts = [`${c.met} of ${c.total} criteria met`];
48
+ if (c.awaiting) parts.push(`${c.awaiting} waiting for sign-off`);
49
+ return parts.join(", ");
50
+ }
51
+ function taskStateWords(f) {
52
+ const state = TASK_STATUS[f.status ?? "pending"] ?? "not-started";
53
+ let words;
54
+ switch (state) {
55
+ case "assigned":
56
+ words = f.assignee ? `assigned to ${f.assignee}` : "assigned";
57
+ break;
58
+ case "in-progress":
59
+ words = `in progress${f.progressPercent ? `, ${f.progressPercent}%` : ""}`;
60
+ break;
61
+ case "blocked":
62
+ words = f.blockedReason ? `blocked: ${f.blockedReason}` : "blocked";
63
+ break;
64
+ case "not-started":
65
+ words = "not started";
66
+ break;
67
+ default:
68
+ words = state;
69
+ }
70
+ const crit = criteriaWords(f.criteria, state);
71
+ if (crit) words += state === "done" && crit.startsWith("signed off") ? `, ${crit}` : `; ${crit}`;
72
+ return { state, words };
73
+ }
74
+ function sectionStateWords(under) {
75
+ const counted = under.filter((t) => t.state !== "skipped");
76
+ const total = counted.length;
77
+ if (total === 0) return { state: "context", words: "no tasks under it" };
78
+ const done = counted.filter((t) => isFinished(t.state)).length;
79
+ const blocked = counted.filter((t) => t.state === "blocked").length;
80
+ const started = counted.filter((t) => t.state !== "not-started" && t.state !== "none").length;
81
+ const tail = blocked ? `; ${blocked} blocked` : "";
82
+ if (done === total) return { state: "done", words: `all ${total} task${total === 1 ? "" : "s"} done` };
83
+ if (started === 0) return { state: "not-started", words: `none of ${total} task${total === 1 ? "" : "s"} started` };
84
+ return { state: blocked ? "blocked" : "in-progress", words: `${done} of ${total} task${total === 1 ? "" : "s"} done${tail}` };
85
+ }
86
+ function isFinished(state) {
87
+ return state === "done" || state === "merged";
88
+ }
89
+ function atOnceWords(claims) {
90
+ const forged = claims.filter((c) => c.forged);
91
+ if (forged.length) {
92
+ const who = [...new Set(forged.map((c) => c.name))].join(" and ");
93
+ return `two different records claim to be the same change by ${who}; neither is taken`;
94
+ }
95
+ const said = claims.map((c) => `${c.name} says ${taskStateWords({ status: c.status }).words}`);
96
+ return `set two ways at once: ${said.join(", ")}`;
97
+ }
98
+ function stateFromWords(source) {
99
+ return source === "plan" ? "from the plan" : (0, import_git_state_words.sourceWords)({ source });
100
+ }
101
+ function recordedWords(r) {
102
+ if (!r) return null;
103
+ const when = (0, import_git_state_words.shortDate)(Math.floor(r.at / 1e3));
104
+ if (r.byType !== "record") return `recorded by ${r.by}, ${when}`;
105
+ return r.check?.verified ? `recorded by ${r.by} in their signed record, ${when}` : `recorded by ${r.by} in their record, unverified, ${when}`;
106
+ }
107
+ function recordCheckWords(r) {
108
+ if (!r || r.byType !== "record") return null;
109
+ const c = r.check;
110
+ if (c?.verified) {
111
+ return c.how === "git" ? `Signed with ${c.who}'s git SSH key, checked against git's allowed signers, as signed commits are.` : `Signed with ${c.who}'s device key, which you trusted in Settings \u2192 Shared task state.`;
112
+ }
113
+ const why = c?.why ? `Not proven: ${c.why}. ` : "";
114
+ return `Read from a record in the project's files, which git or a synced folder brought here. ${why}Anyone who can write to those files could write one in another person's name, so it is shown as unverified.`;
115
+ }
116
+ function statusLine(s) {
117
+ const from = [stateFromWords(s.source), s.source === "plan" ? recordedWords(s.recorded) : null].filter(Boolean).join(", ");
118
+ return `${s.words} \u2014 ${from}${s.gitNote ? `; ${s.gitNote}` : ""}${s.atOnce ? `; ${s.atOnce.words}` : ""}`;
119
+ }
120
+ function itemStatuses(items, git) {
121
+ const children = /* @__PURE__ */ new Map();
122
+ for (const i of items) {
123
+ const list = children.get(i.parentUid) ?? [];
124
+ list.push(i);
125
+ children.set(i.parentUid, list);
126
+ }
127
+ const out = /* @__PURE__ */ new Map();
128
+ const visit = (f) => {
129
+ const done = out.get(f.uid);
130
+ if (done) return done;
131
+ const kids = (children.get(f.uid) ?? []).map(visit);
132
+ const g = git.get(f.uid);
133
+ let s;
134
+ if (g && g.state !== "none") {
135
+ s = {
136
+ itemUid: f.uid,
137
+ title: f.title,
138
+ kind: f.kind,
139
+ state: g.state,
140
+ source: g.source,
141
+ words: g.words,
142
+ from: (0, import_git_state_words.sourceWords)(g),
143
+ recorded: null,
144
+ branch: g.branch,
145
+ git: g
146
+ };
147
+ } else {
148
+ const fromPlan = f.kind === "action" && (f.status || kids.every((k) => k.kind !== "action")) ? taskStateWords(f) : sectionStateWords(tasksUnder(f.uid, children, out));
149
+ s = {
150
+ itemUid: f.uid,
151
+ title: f.title,
152
+ kind: f.kind,
153
+ state: fromPlan.state,
154
+ source: "plan",
155
+ words: fromPlan.words,
156
+ from: "from the plan",
157
+ recorded: f.kind === "action" ? f.recorded ?? null : null,
158
+ branch: g?.branch ?? null,
159
+ ...g ? { gitNote: (0, import_git_state_words.gitStateWords)(g) } : {}
160
+ };
161
+ }
162
+ if (f.kind === "action" && f.atOnce?.length) s.atOnce = { words: atOnceWords(f.atOnce), claims: f.atOnce };
163
+ out.set(f.uid, s);
164
+ return s;
165
+ };
166
+ for (const f of items) visit(f);
167
+ return items.map((f) => out.get(f.uid));
168
+ }
169
+ function tasksUnder(uid, children, done) {
170
+ const out = [];
171
+ const walk = (u) => {
172
+ for (const c of children.get(u) ?? []) {
173
+ const s = done.get(c.uid);
174
+ if (s && c.kind === "action") out.push(s);
175
+ walk(c.uid);
176
+ }
177
+ };
178
+ walk(uid);
179
+ return out;
180
+ }
181
+ const ITEM_STATE_FIELDS = /* @__PURE__ */ new Set([
182
+ "status",
183
+ "assignee",
184
+ "assigneeType",
185
+ "assigneeModel",
186
+ "assigneeSession",
187
+ "progressPercent",
188
+ "blockedReason"
189
+ ]);
190
+ function isStateOnly(updates) {
191
+ const keys = Object.entries(updates).filter(([k, v]) => v !== void 0 && k !== "author" && k !== "authorType").map(([k]) => k);
192
+ return keys.length > 0 && keys.every((k) => ITEM_STATE_FIELDS.has(k));
193
+ }
194
+ const UNDER_WAY = /* @__PURE__ */ new Set(["assigned", "in-progress", "building", "pushed", "in-review"]);
195
+ function lineOf(s) {
196
+ return { itemUid: s.itemUid, title: s.title, words: s.atOnce ? `${s.words}; ${s.atOnce.words}` : s.words, source: s.source, from: s.from };
197
+ }
198
+ function branchLineageWords(g) {
199
+ if (g.review && g.source !== "git") {
200
+ const what = g.source === "gitlab" ? `MR ${g.review.ref ?? `!${g.review.number}`}` : `PR ${g.review.ref ?? `#${g.review.number}`}`;
201
+ const state = g.state === "in-review" ? "open" : g.state === "merged" ? "merged" : g.state === "closed" ? "closed" : "open";
202
+ return `${what} (${state})`;
203
+ }
204
+ switch (g.state) {
205
+ case "merged":
206
+ return `${g.branch} merged${g.base ? ` into ${g.base}` : ""}`;
207
+ case "pushed":
208
+ return `${g.branch} pushed`;
209
+ case "building":
210
+ return `${g.branch} not pushed yet`;
211
+ default:
212
+ return `no ${g.branch} branch yet`;
213
+ }
214
+ }
215
+ function planStatusView(statuses, tickets, updatedAt) {
216
+ const tasks = statuses.filter((s) => s.kind === "action" && s.state !== "skipped");
217
+ const done = tasks.filter((s) => isFinished(s.state)).length;
218
+ const waiting = statuses.filter((s) => s.kind === "action" && (s.state === "blocked" || !!s.atOnce || /waiting for sign-off/.test(s.words))).map(lineOf);
219
+ const inProgress = statuses.filter((s) => s.kind === "action" && UNDER_WAY.has(s.state) && !waiting.some((w) => w.itemUid === s.itemUid)).map(lineOf);
220
+ const head = [tickets.join(", "), "this plan"].filter(Boolean).join(" \u2192 ");
221
+ const byBranch = /* @__PURE__ */ new Map();
222
+ for (const s of statuses) {
223
+ if (s.git && !byBranch.has(s.git.branch)) byBranch.set(s.git.branch, s.git);
224
+ }
225
+ const lineage = byBranch.size ? [...byBranch.values()].map((g) => `${head} \u2192 ${branchLineageWords(g)}`) : [head];
226
+ return {
227
+ progress: { done, total: tasks.length, words: `${done} of ${tasks.length} task${tasks.length === 1 ? "" : "s"} done` },
228
+ waiting,
229
+ inProgress,
230
+ lineage,
231
+ updatedAt
232
+ };
233
+ }
234
+ // Annotate the CommonJS export names for ESM import in node:
235
+ 0 && (module.exports = {
236
+ ITEM_STATE_FIELDS,
237
+ atOnceWords,
238
+ branchLineageWords,
239
+ isFinished,
240
+ isStateOnly,
241
+ itemStatuses,
242
+ planStatusView,
243
+ recordCheckWords,
244
+ recordedWords,
245
+ sectionStateWords,
246
+ stateFromWords,
247
+ statusLine,
248
+ taskStateWords
249
+ });
@@ -0,0 +1,53 @@
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 line_changes_exports = {};
19
+ __export(line_changes_exports, {
20
+ functionList: () => functionList,
21
+ hunkSentence: () => hunkSentence,
22
+ hunkWords: () => hunkWords,
23
+ lineCounts: () => lineCounts
24
+ });
25
+ module.exports = __toCommonJS(line_changes_exports);
26
+ const plural = (n, one, many = `${one}s`) => `${n} ${n === 1 ? one : many}`;
27
+ function span(start, lines) {
28
+ return lines <= 1 ? `line ${start}` : `${start}\u2013${start + lines - 1}`;
29
+ }
30
+ function functionList(names) {
31
+ if (names.length <= 2) return names.join(" and ");
32
+ return `${names[0]}, ${names[1]} and ${names.length - 2} more`;
33
+ }
34
+ function hunkWords(h) {
35
+ const what = h.kind === "added" ? `added ${span(h.new.start, h.new.lines)}` : h.kind === "changed" ? `changed ${span(h.new.start, h.new.lines)}` : `removed ${plural(h.old.lines, "line")} ${h.new.start === 0 ? "at the top" : `after line ${h.new.start}`}`;
36
+ const where = h.functions.length ? `, in ${functionList(h.functions)}` : "";
37
+ return `${what}${where}${h.committed ? "" : ", not committed"}`;
38
+ }
39
+ function hunkSentence(who, h) {
40
+ return `${who} ${hunkWords(h)}`;
41
+ }
42
+ function lineCounts(added, removed) {
43
+ const short = [added ? `\uFF0B${added}` : "", removed ? `\u2212${removed}` : ""].filter(Boolean).join(" ") || "\xB10";
44
+ const words = added && removed ? `${plural(added, "line")} added, ${removed} removed` : added ? `${plural(added, "line")} added` : removed ? `${plural(removed, "line")} removed` : "no lines changed";
45
+ return { short, words };
46
+ }
47
+ // Annotate the CommonJS export names for ESM import in node:
48
+ 0 && (module.exports = {
49
+ functionList,
50
+ hunkSentence,
51
+ hunkWords,
52
+ lineCounts
53
+ });
@@ -0,0 +1,71 @@
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 locator_exports = {};
19
+ __export(locator_exports, {
20
+ TEXT_EXTS: () => TEXT_EXTS,
21
+ describeLocator: () => describeLocator,
22
+ parseCell: () => parseCell,
23
+ parseRange: () => parseRange,
24
+ toSpan: () => toSpan
25
+ });
26
+ module.exports = __toCommonJS(locator_exports);
27
+ var import_xlsx_xml = require("./xlsx-xml");
28
+ function parseCell(ref) {
29
+ const m = ref.replace(/\$/g, "").match(/^([A-Za-z]{1,3})(\d+)$/);
30
+ return m ? { col: (0, import_xlsx_xml.colNumber)(m[1]), row: Number(m[2]) } : null;
31
+ }
32
+ function parseRange(ref) {
33
+ const [a, b] = ref.split(":");
34
+ const from = parseCell(a ?? "");
35
+ const to = b === void 0 ? from : parseCell(b);
36
+ return from && to ? { from, to } : null;
37
+ }
38
+ function toSpan(value) {
39
+ if (typeof value === "number" && Number.isInteger(value)) return { start: value, end: value };
40
+ if (Array.isArray(value) && value.length === 2 && value.every((n) => Number.isInteger(n))) {
41
+ return { start: value[0], end: value[1] };
42
+ }
43
+ if (typeof value === "string") {
44
+ const m = value.trim().match(/^(\d+)(?:\s*[-–]\s*(\d+))?$/);
45
+ if (m) return { start: Number(m[1]), end: Number(m[2] ?? m[1]) };
46
+ }
47
+ return null;
48
+ }
49
+ const TEXT_EXTS = /* @__PURE__ */ new Set(["md", "txt", "json", "log", "csv", "html", "htm", "xml", "svg"]);
50
+ function describeLocator(locator) {
51
+ if (!locator || typeof locator !== "object") return "";
52
+ const l = locator;
53
+ if (typeof l.range === "string") return typeof l.sheet === "string" ? `${l.sheet}!${l.range}` : String(l.range);
54
+ if (typeof l.sheet === "string") return l.sheet;
55
+ if (typeof l.page === "number") return `page ${l.page}`;
56
+ if (l.lines !== void 0) {
57
+ const v = Array.isArray(l.lines) ? `${l.lines[0]}\u2013${l.lines[1]}` : String(l.lines).replace("-", "\u2013");
58
+ return /[–]/.test(v) ? `lines ${v}` : `line ${v}`;
59
+ }
60
+ if (l.t !== void 0) return `at ${l.t}`;
61
+ if (typeof l.text === "string") return `\u201C${l.text.slice(0, 40)}${l.text.length > 40 ? "\u2026" : ""}\u201D`;
62
+ return "";
63
+ }
64
+ // Annotate the CommonJS export names for ESM import in node:
65
+ 0 && (module.exports = {
66
+ TEXT_EXTS,
67
+ describeLocator,
68
+ parseCell,
69
+ parseRange,
70
+ toSpan
71
+ });