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,232 @@
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 personal_sync_service_exports = {};
29
+ __export(personal_sync_service_exports, {
30
+ exportSync: () => exportSync,
31
+ getSyncStatus: () => getSyncStatus,
32
+ importSync: () => importSync,
33
+ peekImport: () => peekImport
34
+ });
35
+ module.exports = __toCommonJS(personal_sync_service_exports);
36
+ var _lazy___settings_service = __toESM(require("./settings-service"));
37
+ var import_node_fs = __toESM(require("node:fs"));
38
+ var import_node_path = __toESM(require("node:path"));
39
+ var import_node_os = __toESM(require("node:os"));
40
+ var import_settings_service = require("./settings-service");
41
+ const SYNC_DIR_NAME = "codetrellis-sync";
42
+ function getMachineId() {
43
+ const crypto = require("node:crypto");
44
+ return crypto.createHash("sha256").update(`${import_node_os.default.hostname()}:${import_node_os.default.homedir()}`).digest("hex").slice(0, 12);
45
+ }
46
+ function getSyncDir() {
47
+ const settings = (0, import_settings_service.getSettings)();
48
+ const syncPath = settings.data.personalSyncPath;
49
+ if (!syncPath || !syncPath.trim()) return null;
50
+ return import_node_path.default.join(syncPath, SYNC_DIR_NAME);
51
+ }
52
+ function ensureSyncDir() {
53
+ const dir = getSyncDir();
54
+ if (!dir) return null;
55
+ if (!import_node_fs.default.existsSync(dir)) {
56
+ try {
57
+ import_node_fs.default.mkdirSync(dir, { recursive: true });
58
+ } catch (err) {
59
+ console.warn("[PersonalSync] Cannot create sync directory:", err);
60
+ return null;
61
+ }
62
+ }
63
+ return dir;
64
+ }
65
+ function exportSync(recentProjects = []) {
66
+ const dir = ensureSyncDir();
67
+ if (!dir) return { exported: false, syncDir: null, error: "No sync path configured" };
68
+ const settings = (0, import_settings_service.getSettings)();
69
+ if (settings.data.personalSyncMode === "none") {
70
+ return { exported: false, syncDir: dir, error: 'Sync mode is "none"' };
71
+ }
72
+ try {
73
+ const settingsSnapshot = { ...settings };
74
+ const exportSettings = {
75
+ ...settingsSnapshot,
76
+ data: {
77
+ ...settingsSnapshot.data,
78
+ dataDirOverride: "",
79
+ // machine-local
80
+ personalSyncPath: ""
81
+ // machine-local
82
+ }
83
+ };
84
+ atomicWrite(import_node_path.default.join(dir, "settings.json"), JSON.stringify(exportSettings, null, 2));
85
+ atomicWrite(import_node_path.default.join(dir, "recent-projects.json"), JSON.stringify(recentProjects, null, 2));
86
+ const meta = {
87
+ machineId: getMachineId(),
88
+ hostname: import_node_os.default.hostname(),
89
+ lastExportAt: (/* @__PURE__ */ new Date()).toISOString()
90
+ };
91
+ atomicWrite(import_node_path.default.join(dir, ".sync-meta.json"), JSON.stringify(meta, null, 2));
92
+ return { exported: true, syncDir: dir };
93
+ } catch (err) {
94
+ const msg = err instanceof Error ? err.message : String(err);
95
+ console.error("[PersonalSync] Export failed:", msg);
96
+ return { exported: false, syncDir: dir, error: msg };
97
+ }
98
+ }
99
+ function peekImport() {
100
+ const dir = getSyncDir();
101
+ if (!dir || !import_node_fs.default.existsSync(dir)) {
102
+ return {
103
+ available: false,
104
+ syncDir: dir,
105
+ remoteMachine: null,
106
+ lastExportAt: null,
107
+ hasSettings: false,
108
+ hasRecentProjects: false,
109
+ recentProjectCount: 0
110
+ };
111
+ }
112
+ const hasSettings = import_node_fs.default.existsSync(import_node_path.default.join(dir, "settings.json"));
113
+ const hasRecentProjects = import_node_fs.default.existsSync(import_node_path.default.join(dir, "recent-projects.json"));
114
+ let remoteMachine = null;
115
+ let lastExportAt = null;
116
+ let recentProjectCount = 0;
117
+ try {
118
+ const metaPath = import_node_path.default.join(dir, ".sync-meta.json");
119
+ if (import_node_fs.default.existsSync(metaPath)) {
120
+ const meta = JSON.parse(import_node_fs.default.readFileSync(metaPath, "utf-8"));
121
+ remoteMachine = meta.hostname || null;
122
+ lastExportAt = meta.lastExportAt || null;
123
+ }
124
+ } catch {
125
+ }
126
+ try {
127
+ if (hasRecentProjects) {
128
+ const projects = JSON.parse(
129
+ import_node_fs.default.readFileSync(import_node_path.default.join(dir, "recent-projects.json"), "utf-8")
130
+ );
131
+ recentProjectCount = Array.isArray(projects) ? projects.length : 0;
132
+ }
133
+ } catch {
134
+ }
135
+ return {
136
+ available: hasSettings || hasRecentProjects,
137
+ syncDir: dir,
138
+ remoteMachine,
139
+ lastExportAt,
140
+ hasSettings,
141
+ hasRecentProjects,
142
+ recentProjectCount
143
+ };
144
+ }
145
+ function importSync() {
146
+ const dir = getSyncDir();
147
+ if (!dir || !import_node_fs.default.existsSync(dir)) {
148
+ return { imported: false, error: "Sync directory does not exist", settingsImported: false, recentProjects: [] };
149
+ }
150
+ let settingsImported = false;
151
+ const recentProjects = [];
152
+ try {
153
+ const settingsPath = import_node_path.default.join(dir, "settings.json");
154
+ if (import_node_fs.default.existsSync(settingsPath)) {
155
+ const imported = JSON.parse(import_node_fs.default.readFileSync(settingsPath, "utf-8"));
156
+ const { updateSettings } = _lazy___settings_service;
157
+ updateSettings({
158
+ identity: imported.identity,
159
+ plans: imported.plans,
160
+ firstRunComplete: imported.firstRunComplete
161
+ });
162
+ settingsImported = true;
163
+ }
164
+ const projectsPath = import_node_path.default.join(dir, "recent-projects.json");
165
+ if (import_node_fs.default.existsSync(projectsPath)) {
166
+ const projects = JSON.parse(import_node_fs.default.readFileSync(projectsPath, "utf-8"));
167
+ if (Array.isArray(projects)) {
168
+ recentProjects.push(...projects);
169
+ }
170
+ }
171
+ return { imported: true, settingsImported, recentProjects };
172
+ } catch (err) {
173
+ const msg = err instanceof Error ? err.message : String(err);
174
+ console.error("[PersonalSync] Import failed:", msg);
175
+ return { imported: false, error: msg, settingsImported: false, recentProjects: [] };
176
+ }
177
+ }
178
+ function getSyncStatus() {
179
+ const settings = (0, import_settings_service.getSettings)();
180
+ const syncPath = settings.data.personalSyncPath;
181
+ const dir = getSyncDir();
182
+ if (!syncPath || !dir) {
183
+ return {
184
+ configured: false,
185
+ mode: settings.data.personalSyncMode,
186
+ syncPath: "",
187
+ syncDirExists: false,
188
+ lastExportAt: null,
189
+ lastImportAvailable: false,
190
+ remoteMachine: null
191
+ };
192
+ }
193
+ const syncDirExists = import_node_fs.default.existsSync(dir);
194
+ let lastExportAt = null;
195
+ let remoteMachine = null;
196
+ let lastImportAvailable = false;
197
+ if (syncDirExists) {
198
+ try {
199
+ const metaPath = import_node_path.default.join(dir, ".sync-meta.json");
200
+ if (import_node_fs.default.existsSync(metaPath)) {
201
+ const meta = JSON.parse(import_node_fs.default.readFileSync(metaPath, "utf-8"));
202
+ lastExportAt = meta.lastExportAt;
203
+ if (meta.machineId !== getMachineId()) {
204
+ remoteMachine = meta.hostname;
205
+ lastImportAvailable = true;
206
+ }
207
+ }
208
+ } catch {
209
+ }
210
+ }
211
+ return {
212
+ configured: true,
213
+ mode: settings.data.personalSyncMode,
214
+ syncPath,
215
+ syncDirExists,
216
+ lastExportAt,
217
+ lastImportAvailable,
218
+ remoteMachine
219
+ };
220
+ }
221
+ function atomicWrite(filePath, content) {
222
+ const tmpPath = `${filePath}.tmp`;
223
+ import_node_fs.default.writeFileSync(tmpPath, content);
224
+ import_node_fs.default.renameSync(tmpPath, filePath);
225
+ }
226
+ // Annotate the CommonJS export names for ESM import in node:
227
+ 0 && (module.exports = {
228
+ exportSync,
229
+ getSyncStatus,
230
+ importSync,
231
+ peekImport
232
+ });
@@ -0,0 +1,72 @@
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 pipeline_approvals_exports = {};
19
+ __export(pipeline_approvals_exports, {
20
+ approvePipeline: () => approvePipeline,
21
+ pipelineView: () => pipelineView
22
+ });
23
+ module.exports = __toCommonJS(pipeline_approvals_exports);
24
+ var import_node_child_process = require("node:child_process");
25
+ var import_rule_approvals = require("./rule-approvals");
26
+ var import_pipeline = require("./pipeline");
27
+ function headOf(projectRoot) {
28
+ try {
29
+ return (0, import_node_child_process.execFileSync)("git", ["-C", projectRoot, "rev-parse", "--verify", "--quiet", "HEAD^{commit}"], { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim() || null;
30
+ } catch {
31
+ return null;
32
+ }
33
+ }
34
+ async function pendingChanges(projectRoot) {
35
+ const head = headOf(projectRoot);
36
+ if (!head) return [];
37
+ const was = await (0, import_pipeline.pipelineAt)(projectRoot, head);
38
+ const now = (0, import_pipeline.readPipeline)(projectRoot);
39
+ const loosens = (0, import_pipeline.diffPipeline)(was?.pipeline ?? null, now?.pipeline ?? null).filter((c) => c.effect === "loosens");
40
+ if (!loosens.length) return [];
41
+ const approvals = (0, import_rule_approvals.approvalsHere)(projectRoot);
42
+ const keys = (0, import_rule_approvals.keysAt)(projectRoot, head);
43
+ try {
44
+ return loosens.filter((c) => (0, import_rule_approvals.approvalFor)(projectRoot, c, approvals, keys, head) === null);
45
+ } finally {
46
+ keys.done();
47
+ }
48
+ }
49
+ async function pipelineView(projectRoot) {
50
+ const got = (0, import_pipeline.readPipeline)(projectRoot);
51
+ const pending = await pendingChanges(projectRoot);
52
+ return {
53
+ where: import_pipeline.PIPELINE_FILE,
54
+ pipeline: got?.pipeline ?? null,
55
+ problems: got?.problems ?? [],
56
+ words: got?.pipeline?.stages.map(import_pipeline.stageWords) ?? [],
57
+ pending: pending.map((c) => ({ stage: c.rule.slice("pipeline.".length), words: c.words }))
58
+ };
59
+ }
60
+ async function approvePipeline(projectRoot, me) {
61
+ const signed = [];
62
+ for (const c of await pendingChanges(projectRoot)) {
63
+ const s = (0, import_rule_approvals.signRuleChange)(projectRoot, { rule: c.rule, before: c.before, after: c.after }, me);
64
+ signed.push({ stage: c.rule.slice("pipeline.".length), file: s.file, how: s.how });
65
+ }
66
+ return { signed, view: await pipelineView(projectRoot) };
67
+ }
68
+ // Annotate the CommonJS export names for ESM import in node:
69
+ 0 && (module.exports = {
70
+ approvePipeline,
71
+ pipelineView
72
+ });
@@ -0,0 +1,232 @@
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 pipeline_exports = {};
29
+ __export(pipeline_exports, {
30
+ PIPELINE_FILE: () => PIPELINE_FILE,
31
+ diffPipeline: () => diffPipeline,
32
+ parsePipeline: () => parsePipeline,
33
+ pipelineAt: () => pipelineAt,
34
+ readPipeline: () => readPipeline,
35
+ stageRule: () => stageRule,
36
+ stageScope: () => stageScope,
37
+ stageWords: () => stageWords,
38
+ waves: () => waves
39
+ });
40
+ module.exports = __toCommonJS(pipeline_exports);
41
+ var import_node_fs = __toESM(require("node:fs"));
42
+ var import_node_path = __toESM(require("node:path"));
43
+ var import_yaml = require("yaml");
44
+ var import_architecture_rules = require("../../shared/types/architecture-rules");
45
+ var import_confined_fs = require("./confined-fs");
46
+ var import_git_env = require("./git-env");
47
+ var import_rule_changes = require("./rule-changes");
48
+ const PIPELINE_FILE = ".codetrellis/pipeline.yaml";
49
+ const ID_RE = /^[a-z0-9][a-z0-9-]{0,62}$/;
50
+ const MAX_STAGES = 20;
51
+ const MAX_BYTES = 64 * 1024;
52
+ const SELECTORS = ["suite", "engine", "strength", "id", "tag"];
53
+ const list = (v) => v === void 0 ? [] : typeof v === "string" ? [v] : Array.isArray(v) && v.every((x) => typeof x === "string") ? v.map((x) => x.trim()).filter(Boolean) : null;
54
+ function parsePipeline(text) {
55
+ if (Buffer.byteLength(text, "utf8") > MAX_BYTES) return { pipeline: null, problems: [`${PIPELINE_FILE} is larger than a pipeline can be`] };
56
+ const doc = (0, import_yaml.parseDocument)(text);
57
+ if (doc.errors.length) return { pipeline: null, problems: [`${PIPELINE_FILE} is not YAML: ${doc.errors[0].message.split("\n")[0]}`] };
58
+ let raw;
59
+ try {
60
+ raw = doc.toJS({ maxAliasCount: 0 });
61
+ } catch {
62
+ return { pipeline: null, problems: [`${PIPELINE_FILE} may not use YAML aliases`] };
63
+ }
64
+ const items = raw && typeof raw === "object" && !Array.isArray(raw) ? raw.stages : null;
65
+ if (!Array.isArray(items) || items.length === 0) return { pipeline: null, problems: [`${PIPELINE_FILE} holds stages: a list of at least one`] };
66
+ if (items.length > MAX_STAGES) return { pipeline: null, problems: [`a pipeline has at most ${MAX_STAGES} stages`] };
67
+ const problems = [];
68
+ const stages = [];
69
+ const before = [];
70
+ let wave = [];
71
+ for (const [i, item] of items.entries()) {
72
+ const r = item && typeof item === "object" ? item : {};
73
+ const why = [];
74
+ const id = typeof r.id === "string" && ID_RE.test(r.id) ? r.id : null;
75
+ if (!id) why.push("id must be a short slug, like fast");
76
+ else if (stages.some((s) => s.id === id)) why.push(`${id} is already a stage`);
77
+ const rules = {};
78
+ if (r.rules !== void 0 && r.rules !== "all") {
79
+ if (!r.rules || typeof r.rules !== "object" || Array.isArray(r.rules)) why.push("rules selects by suite, engine, strength, id or tag, like { engine: deterministic }, or is all");
80
+ else {
81
+ for (const [k, v] of Object.entries(r.rules)) {
82
+ const values = list(v);
83
+ if (!SELECTORS.includes(k)) {
84
+ why.push(`rules selects by suite, engine, strength, id or tag, not ${k}`);
85
+ continue;
86
+ }
87
+ if (!values || values.length === 0) {
88
+ why.push(`rules.${k} is a name or a list of them`);
89
+ continue;
90
+ }
91
+ if (k === "engine" && values.some((x) => !import_architecture_rules.RULE_ENGINES.includes(x))) why.push("rules.engine is deterministic, fuzzy or agent");
92
+ if (k === "strength" && values.some((x) => !import_architecture_rules.RULE_STRENGTHS.includes(x))) why.push("rules.strength is block, warn or guide");
93
+ rules[k] = values;
94
+ }
95
+ }
96
+ }
97
+ const parallel = r.parallel === true;
98
+ if (r.parallel !== void 0 && typeof r.parallel !== "boolean") why.push("parallel is true or false");
99
+ if (parallel && i === 0) why.push("the first stage has no stage to run beside");
100
+ const earlier = parallel ? before : [...before, ...wave];
101
+ const refs = (name, v) => {
102
+ const xs = list(v);
103
+ if (xs === null) {
104
+ why.push(`${name} is a list of stages`);
105
+ return null;
106
+ }
107
+ for (const x of xs) if (!earlier.includes(x)) why.push(`${name} names ${x}, which is not a stage that finishes before this one`);
108
+ return xs;
109
+ };
110
+ const needs = refs("needs", r.needs);
111
+ const grounding = refs("grounding", r.grounding);
112
+ let when;
113
+ if (r.when !== void 0) {
114
+ if (!r.when || typeof r.when !== "object" || Array.isArray(r.when)) why.push("when says which stages must have passed or failed, like { fast: passed }");
115
+ else {
116
+ when = {};
117
+ for (const [k, v] of Object.entries(r.when)) {
118
+ if (v !== "passed" && v !== "failed") {
119
+ why.push(`when.${k} is passed or failed`);
120
+ continue;
121
+ }
122
+ if (!earlier.includes(k)) {
123
+ why.push(`when names ${k}, which is not a stage that finishes before this one`);
124
+ continue;
125
+ }
126
+ when[k] = v;
127
+ }
128
+ }
129
+ }
130
+ if (r.advisory !== void 0 && typeof r.advisory !== "boolean") why.push("advisory is true or false");
131
+ if (why.length) {
132
+ problems.push(`stage ${id ?? i + 1}: ${why.join("; ")}`);
133
+ continue;
134
+ }
135
+ if (!parallel) {
136
+ before.push(...wave);
137
+ wave = [];
138
+ }
139
+ wave.push(id);
140
+ stages.push({
141
+ id,
142
+ rules,
143
+ ...parallel ? { parallel: true } : {},
144
+ ...needs && needs.length ? { needs } : {},
145
+ ...when && Object.keys(when).length ? { when } : {},
146
+ ...grounding && grounding.length ? { grounding } : {},
147
+ ...r.advisory === true ? { advisory: true } : {}
148
+ });
149
+ }
150
+ return problems.length ? { pipeline: null, problems } : { pipeline: { stages }, problems: [] };
151
+ }
152
+ function readPipeline(projectRoot) {
153
+ if (!import_node_fs.default.existsSync(import_node_path.default.join(projectRoot, PIPELINE_FILE))) return null;
154
+ try {
155
+ return parsePipeline((0, import_confined_fs.readTextWithin)(projectRoot, PIPELINE_FILE, "pipeline"));
156
+ } catch (err) {
157
+ return { pipeline: null, problems: [`${PIPELINE_FILE} could not be read: ${err.message}`] };
158
+ }
159
+ }
160
+ async function pipelineAt(projectRoot, commit) {
161
+ if (!/^[0-9a-f]{40}$/.test(commit)) return null;
162
+ try {
163
+ const text = await (0, import_git_env.gitAsync)(projectRoot, ["show", `${commit}:./${PIPELINE_FILE}`]);
164
+ return parsePipeline(String(text));
165
+ } catch {
166
+ return null;
167
+ }
168
+ }
169
+ function stageScope(s) {
170
+ return {
171
+ ...s.rules.suite ? { suite: s.rules.suite.join(",") } : {},
172
+ ...s.rules.id ? { rule: s.rules.id.join(",") } : {},
173
+ ...s.rules.engine ? { engine: s.rules.engine.join(",") } : {},
174
+ ...s.rules.strength ? { strength: s.rules.strength.join(",") } : {},
175
+ ...s.rules.tag ? { tag: s.rules.tag.join(",") } : {}
176
+ };
177
+ }
178
+ function waves(p) {
179
+ const out = [];
180
+ for (const s of p.stages) {
181
+ if (s.parallel && out.length) out[out.length - 1].push(s);
182
+ else out.push([s]);
183
+ }
184
+ return out;
185
+ }
186
+ function stageWords(s) {
187
+ const and = (xs) => xs.length < 2 ? xs.join("") : `${xs.slice(0, -1).join(", ")} and ${xs[xs.length - 1]}`;
188
+ const sel = [];
189
+ if (s.rules.engine) sel.push(`${and(s.rules.engine)}`);
190
+ if (s.rules.strength) sel.push(`${and(s.rules.strength)}-strength`);
191
+ const what = `${sel.length ? `${sel.join(" ")} ` : ""}rules${s.rules.tag ? ` tagged ${s.rules.tag.join(" or ")}` : ""}${s.rules.suite ? ` in ${and(s.rules.suite)}` : ""}${s.rules.id ? ` ${and(s.rules.id)}` : ""}`;
192
+ const parts = [s.rules.engine || s.rules.strength || s.rules.suite || s.rules.id || s.rules.tag ? what : "every rule"];
193
+ if (s.parallel) parts.push("beside the stage before");
194
+ if (s.needs) parts.push(`after ${and(s.needs)}`);
195
+ if (s.when) parts.push(`when ${and(Object.entries(s.when).map(([k, v]) => `${k} ${v}`))}`);
196
+ if (s.grounding) parts.push(`grounded by ${and(s.grounding)}`);
197
+ return `${s.id}: ${parts.join(", ")}${s.advisory ? " (advisory)" : ""}`;
198
+ }
199
+ const sorted = (xs) => [...xs ?? []].sort();
200
+ function stageRule(s) {
201
+ const terms = {
202
+ rules: Object.fromEntries(Object.entries(s.rules).sort().map(([k, v]) => [k, sorted(v)])),
203
+ needs: sorted(s.needs),
204
+ grounding: sorted(s.grounding),
205
+ when: Object.fromEntries(Object.entries(s.when ?? {}).sort())
206
+ };
207
+ return { id: `pipeline.${s.id}`, from: "pipeline", mayNotImport: JSON.stringify(terms), except: [], because: "", since: "", by: "", strength: s.advisory ? "warn" : "block" };
208
+ }
209
+ function diffPipeline(base, head) {
210
+ const b = new Map((base?.stages ?? []).map((s) => [s.id, s]));
211
+ const h = new Map((head?.stages ?? []).map((s) => [s.id, s]));
212
+ return (0, import_rule_changes.diffRules)([...b.values()].map(stageRule), [...h.values()].map(stageRule), []).map((c) => {
213
+ const id = c.rule.slice("pipeline.".length);
214
+ const was = b.get(id);
215
+ const now = h.get(id);
216
+ const said = (s) => s ? `\u201C${stageWords(s)}\u201D` : "";
217
+ const words = c.change === "removed" ? `\u2717 This change removes the stage ${id} from the pipeline (${said(was)}).${import_rule_changes.NEEDS}` : c.change === "added" ? `\u26A0 This change adds the stage ${id} to the pipeline (${said(now)}). It runs once it is on the base branch.` : c.effect === "loosens" ? `\u2717 This change loosens the pipeline's stage ${id}, from ${said(was)} to ${said(now)}.${import_rule_changes.NEEDS}` : `\u26A0 This change tightens the pipeline's stage ${id}, from ${said(was)} to ${said(now)}.`;
218
+ return { ...c, words };
219
+ });
220
+ }
221
+ // Annotate the CommonJS export names for ESM import in node:
222
+ 0 && (module.exports = {
223
+ PIPELINE_FILE,
224
+ diffPipeline,
225
+ parsePipeline,
226
+ pipelineAt,
227
+ readPipeline,
228
+ stageRule,
229
+ stageScope,
230
+ stageWords,
231
+ waves
232
+ });
@@ -0,0 +1,68 @@
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_arrivals_exports = {};
19
+ __export(plan_arrivals_exports, {
20
+ allPlanArrivals: () => allPlanArrivals,
21
+ arrivalWords: () => arrivalWords,
22
+ completePlanArrival: () => completePlanArrival,
23
+ getPlanArrival: () => getPlanArrival,
24
+ recordPlanArrival: () => recordPlanArrival
25
+ });
26
+ module.exports = __toCommonJS(plan_arrivals_exports);
27
+ var import_database = require("./database");
28
+ var import_persistence = require("./persistence");
29
+ var import_skill_arrival_service = require("./skill-arrival-service");
30
+ function recordPlanArrival(planUid, planFile, now = Date.now()) {
31
+ const { addedBy, commit } = (0, import_skill_arrival_service.lastCommitOf)(planFile);
32
+ (0, import_database.getDb)().run(
33
+ `INSERT OR IGNORE INTO plan_arrivals (plan_uid, added_by, commit_sha, arrived_at) VALUES (?, ?, ?, ?)`,
34
+ [planUid, addedBy, commit, now]
35
+ );
36
+ (0, import_persistence.markDirty)();
37
+ return getPlanArrival(planUid) ?? { addedBy, commit, arrivedAt: now };
38
+ }
39
+ function completePlanArrival(planUid, planFile) {
40
+ const known = getPlanArrival(planUid);
41
+ if (!known || known.commit) return;
42
+ const { addedBy, commit } = (0, import_skill_arrival_service.lastCommitOf)(planFile);
43
+ if (!commit) return;
44
+ (0, import_database.getDb)().run(`UPDATE plan_arrivals SET added_by = ?, commit_sha = ? WHERE plan_uid = ? AND commit_sha IS NULL`, [addedBy, commit, planUid]);
45
+ (0, import_persistence.markDirty)();
46
+ }
47
+ function getPlanArrival(planUid) {
48
+ const r = (0, import_database.getDb)().exec(`SELECT added_by, commit_sha, arrived_at FROM plan_arrivals WHERE plan_uid = ?`, [planUid])[0]?.values[0];
49
+ return r ? { addedBy: r[0] ?? null, commit: r[1] ?? null, arrivedAt: r[2] } : null;
50
+ }
51
+ function allPlanArrivals() {
52
+ const out = /* @__PURE__ */ new Map();
53
+ for (const r of (0, import_database.getDb)().exec(`SELECT plan_uid, added_by, commit_sha, arrived_at FROM plan_arrivals`)[0]?.values ?? []) {
54
+ out.set(r[0], { addedBy: r[1] ?? null, commit: r[2] ?? null, arrivedAt: r[3] });
55
+ }
56
+ return out;
57
+ }
58
+ function arrivalWords(a) {
59
+ return a.addedBy && a.commit ? `from ${a.addedBy}, in ${a.commit}` : "arrived in its files, not committed yet";
60
+ }
61
+ // Annotate the CommonJS export names for ESM import in node:
62
+ 0 && (module.exports = {
63
+ allPlanArrivals,
64
+ arrivalWords,
65
+ completePlanArrival,
66
+ getPlanArrival,
67
+ recordPlanArrival
68
+ });