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,99 @@
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 commit_edges_exports = {};
29
+ __export(commit_edges_exports, {
30
+ MAX_PARSED: () => MAX_PARSED,
31
+ clearCommitEdgeCache: () => clearCommitEdgeCache,
32
+ commitEdges: () => commitEdges
33
+ });
34
+ module.exports = __toCommonJS(commit_edges_exports);
35
+ var import_node_path = __toESM(require("node:path"));
36
+ const MAX_PARSED = 400;
37
+ const IMPORT_CACHE_MAX = 2e4;
38
+ const importCache = /* @__PURE__ */ new Map();
39
+ function clearCommitEdgeCache() {
40
+ importCache.clear();
41
+ }
42
+ function commitEdges(input, deps) {
43
+ const { projectPath, files, oids, live } = input;
44
+ const liveOut = /* @__PURE__ */ new Map();
45
+ for (const e of live.edges) {
46
+ const i = e.indexOf("->");
47
+ if (i === -1) continue;
48
+ const src = e.slice(0, i);
49
+ const list = liveOut.get(src);
50
+ if (list) list.push(e.slice(i + 2));
51
+ else liveOut.set(src, [e.slice(i + 2)]);
52
+ }
53
+ const edges = /* @__PURE__ */ new Set();
54
+ const toParse = [];
55
+ for (const [rel, { hash }] of files) {
56
+ const same = live.files.get(rel)?.hash === hash;
57
+ const targets = liveOut.get(rel) ?? [];
58
+ if (same && targets.every((t) => files.has(t))) {
59
+ for (const t of targets) edges.add(`${rel}->${t}`);
60
+ } else {
61
+ toParse.push(rel);
62
+ }
63
+ }
64
+ if (toParse.length > MAX_PARSED) {
65
+ return {
66
+ ok: false,
67
+ reason: `${toParse.length} files differ from the working tree at this commit, more than the ${MAX_PARSED} parsed to find its dependencies.`
68
+ };
69
+ }
70
+ const uncached = [...new Set(toParse.map((rel) => oids.get(rel)).filter((o) => !!o && !importCache.has(o)))];
71
+ const blobs = uncached.length ? deps.readBlobs(uncached) : /* @__PURE__ */ new Map();
72
+ const knownFiles = new Set([...files.keys()].map((rel) => import_node_path.default.join(projectPath, rel)));
73
+ for (const rel of toParse) {
74
+ const oid = oids.get(rel);
75
+ if (!oid) continue;
76
+ const abs = import_node_path.default.join(projectPath, rel);
77
+ if (!importCache.has(oid)) {
78
+ const content = blobs.get(oid);
79
+ if (content === void 0) continue;
80
+ if (importCache.size >= IMPORT_CACHE_MAX) importCache.clear();
81
+ importCache.set(oid, deps.parseImports(abs, content));
82
+ }
83
+ const parsed = importCache.get(oid);
84
+ if (!parsed) continue;
85
+ for (const imp of parsed.imports) {
86
+ const target = deps.resolve(parsed.language, imp.source, abs, knownFiles, imp.isRelative);
87
+ if (!target || target === abs) continue;
88
+ const targetRel = deps.relative(target);
89
+ if (files.has(targetRel)) edges.add(`${rel}->${targetRel}`);
90
+ }
91
+ }
92
+ return { ok: true, edges, parsed: toParse.length };
93
+ }
94
+ // Annotate the CommonJS export names for ESM import in node:
95
+ 0 && (module.exports = {
96
+ MAX_PARSED,
97
+ clearCommitEdgeCache,
98
+ commitEdges
99
+ });
@@ -0,0 +1,241 @@
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 confined_fs_exports = {};
29
+ __export(confined_fs_exports, {
30
+ ConfinementError: () => ConfinementError,
31
+ canonicalRoot: () => canonicalRoot,
32
+ isInside: () => isInside,
33
+ isWithin: () => isWithin,
34
+ openReadStreamWithin: () => openReadStreamWithin,
35
+ readFileWithin: () => readFileWithin,
36
+ readTextWithin: () => readTextWithin,
37
+ removeWithin: () => removeWithin,
38
+ resolveWithin: () => resolveWithin,
39
+ writeFileWithin: () => writeFileWithin
40
+ });
41
+ module.exports = __toCommonJS(confined_fs_exports);
42
+ var fs = __toESM(require("node:fs"));
43
+ var path = __toESM(require("node:path"));
44
+ const HAS_NOFOLLOW = typeof fs.constants.O_NOFOLLOW === "number" && process.platform !== "win32";
45
+ class ConfinementError extends Error {
46
+ code = "EOUTSIDE_ROOT";
47
+ constructor(message) {
48
+ super(message);
49
+ this.name = "ConfinementError";
50
+ }
51
+ }
52
+ function canonicalRoot(root) {
53
+ if (!root || typeof root !== "string") {
54
+ throw new ConfinementError("A containment root is required");
55
+ }
56
+ try {
57
+ return fs.realpathSync.native(path.resolve(root));
58
+ } catch (err) {
59
+ throw new ConfinementError(
60
+ `Cannot canonicalise the containment root "${root}": ${err.message}`
61
+ );
62
+ }
63
+ }
64
+ function resolveWithin(root, candidate, label = "path") {
65
+ if (typeof candidate !== "string" || candidate.length === 0) {
66
+ throw new ConfinementError(`${label}: a path is required`);
67
+ }
68
+ if (candidate.includes("\0")) {
69
+ throw new ConfinementError(`${label}: path contains a NUL byte`);
70
+ }
71
+ const canonRoot = canonicalRoot(root);
72
+ const joined = path.resolve(canonRoot, candidate);
73
+ let existing = joined;
74
+ const missing = [];
75
+ while (!fs.existsSync(existing)) {
76
+ const parent = path.dirname(existing);
77
+ if (parent === existing) break;
78
+ missing.unshift(path.basename(existing));
79
+ existing = parent;
80
+ }
81
+ assertNoSymlinkOnPath(canonRoot, existing, label);
82
+ let canonExisting;
83
+ try {
84
+ canonExisting = fs.realpathSync.native(existing);
85
+ } catch (err) {
86
+ throw new ConfinementError(`${label}: cannot resolve "${candidate}": ${err.message}`);
87
+ }
88
+ if (!isInside(canonRoot, canonExisting)) {
89
+ throw new ConfinementError(
90
+ `${label}: resolves outside the permitted directory (resolved to ${canonExisting}, which is not inside ${canonRoot})`
91
+ );
92
+ }
93
+ return missing.length ? path.join(canonExisting, ...missing) : canonExisting;
94
+ }
95
+ function isInside(root, target) {
96
+ if (target === root) return true;
97
+ const rel = path.relative(root, target);
98
+ return rel.length > 0 && !rel.startsWith("..") && !path.isAbsolute(rel);
99
+ }
100
+ function assertNoSymlinkOnPath(root, target, label) {
101
+ let current = target;
102
+ while (current !== root && current.length > root.length) {
103
+ let st;
104
+ try {
105
+ st = fs.lstatSync(current);
106
+ } catch {
107
+ return;
108
+ }
109
+ if (st.isSymbolicLink()) {
110
+ throw new ConfinementError(
111
+ `${label}: "${current}" is a symbolic link. Links are not followed at this boundary.`
112
+ );
113
+ }
114
+ const parent = path.dirname(current);
115
+ if (parent === current) break;
116
+ current = parent;
117
+ }
118
+ }
119
+ function readFileWithin(root, candidate, label = "path") {
120
+ const target = resolveWithin(root, candidate, label);
121
+ const flags = HAS_NOFOLLOW ? fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW : fs.constants.O_RDONLY;
122
+ let fd = null;
123
+ try {
124
+ fd = fs.openSync(target, flags);
125
+ const st = fs.fstatSync(fd);
126
+ if (!st.isFile()) {
127
+ throw new ConfinementError(`${label}: not a regular file`);
128
+ }
129
+ return fs.readFileSync(fd);
130
+ } catch (err) {
131
+ if (err instanceof ConfinementError) throw err;
132
+ const e = err;
133
+ if (e.code === "ELOOP") {
134
+ throw new ConfinementError(`${label}: refused to follow a symbolic link`);
135
+ }
136
+ throw err;
137
+ } finally {
138
+ if (fd !== null) {
139
+ try {
140
+ fs.closeSync(fd);
141
+ } catch {
142
+ }
143
+ }
144
+ }
145
+ }
146
+ function openReadStreamWithin(root, candidate, opts = {}, label = "path") {
147
+ const target = resolveWithin(root, candidate, label);
148
+ const flags = HAS_NOFOLLOW ? fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW : fs.constants.O_RDONLY;
149
+ let fd = null;
150
+ try {
151
+ fd = fs.openSync(target, flags);
152
+ const st = fs.fstatSync(fd);
153
+ if (!st.isFile()) {
154
+ throw new ConfinementError(`${label}: not a regular file`);
155
+ }
156
+ const stream = fs.createReadStream("", { fd, start: opts.start, end: opts.end, autoClose: true });
157
+ fd = null;
158
+ return { stream, size: st.size, mtimeMs: st.mtimeMs };
159
+ } catch (err) {
160
+ if (err instanceof ConfinementError) throw err;
161
+ const e = err;
162
+ if (e.code === "ELOOP") {
163
+ throw new ConfinementError(`${label}: refused to follow a symbolic link`);
164
+ }
165
+ throw err;
166
+ } finally {
167
+ if (fd !== null) {
168
+ try {
169
+ fs.closeSync(fd);
170
+ } catch {
171
+ }
172
+ }
173
+ }
174
+ }
175
+ function readTextWithin(root, candidate, label = "path") {
176
+ return readFileWithin(root, candidate, label).toString("utf-8");
177
+ }
178
+ function writeFileWithin(root, candidate, data, label = "path") {
179
+ const target = resolveWithin(root, candidate, label);
180
+ const dir = path.dirname(target);
181
+ fs.mkdirSync(dir, { recursive: true });
182
+ const canonDir = resolveWithin(root, dir, `${label} (directory)`);
183
+ const tmp = path.join(canonDir, `.tmp-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`);
184
+ let fd = null;
185
+ try {
186
+ fd = fs.openSync(tmp, fs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_EXCL, 384);
187
+ fs.writeFileSync(fd, data);
188
+ fs.fsyncSync(fd);
189
+ fs.closeSync(fd);
190
+ fd = null;
191
+ try {
192
+ const st = fs.lstatSync(target);
193
+ if (st.isSymbolicLink()) {
194
+ throw new ConfinementError(`${label}: destination is a symbolic link; refusing to write through it`);
195
+ }
196
+ } catch (err) {
197
+ if (err instanceof ConfinementError) throw err;
198
+ }
199
+ fs.renameSync(tmp, target);
200
+ return target;
201
+ } finally {
202
+ if (fd !== null) {
203
+ try {
204
+ fs.closeSync(fd);
205
+ } catch {
206
+ }
207
+ }
208
+ try {
209
+ if (fs.existsSync(tmp)) fs.unlinkSync(tmp);
210
+ } catch {
211
+ }
212
+ }
213
+ }
214
+ function removeWithin(root, candidate, opts = {}, label = "path") {
215
+ const target = resolveWithin(root, candidate, label);
216
+ if (target === canonicalRoot(root)) {
217
+ throw new ConfinementError(`${label}: refusing to delete the containment root itself`);
218
+ }
219
+ fs.rmSync(target, { recursive: opts.recursive === true, force: false });
220
+ }
221
+ function isWithin(root, candidate) {
222
+ try {
223
+ resolveWithin(root, candidate);
224
+ return true;
225
+ } catch {
226
+ return false;
227
+ }
228
+ }
229
+ // Annotate the CommonJS export names for ESM import in node:
230
+ 0 && (module.exports = {
231
+ ConfinementError,
232
+ canonicalRoot,
233
+ isInside,
234
+ isWithin,
235
+ openReadStreamWithin,
236
+ readFileWithin,
237
+ readTextWithin,
238
+ removeWithin,
239
+ resolveWithin,
240
+ writeFileWithin
241
+ });
@@ -0,0 +1,132 @@
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 conformity_gate_exports = {};
19
+ __export(conformity_gate_exports, {
20
+ checkChanges: () => checkChanges,
21
+ cleanChanged: () => cleanChanged
22
+ });
23
+ module.exports = __toCommonJS(conformity_gate_exports);
24
+ var import_node_child_process = require("node:child_process");
25
+ var import_breakpoint_service = require("./breakpoint-service");
26
+ var import_grounding = require("./tests/grounding");
27
+ var import_plan_service = require("./plan-service");
28
+ var import_plan_item_service = require("./plan-item-service");
29
+ var import_criteria_service = require("./criteria-service");
30
+ var import_system_docs_service = require("./system-docs-service");
31
+ var import_rule_changes = require("./rule-changes");
32
+ var import_check_words = require("../../shared/lib/check-words");
33
+ const MAX_FILES = 500;
34
+ function cleanChanged(paths) {
35
+ const out = /* @__PURE__ */ new Set();
36
+ for (const raw of paths) {
37
+ const p = raw.trim().replace(/\\/g, "/").replace(/^\.\/+/, "");
38
+ if (!p || p.startsWith("/") || p.split("/").includes("..")) continue;
39
+ out.add(p);
40
+ }
41
+ return [...out].slice(0, MAX_FILES);
42
+ }
43
+ function changedSince(root, commit) {
44
+ try {
45
+ const out = (0, import_node_child_process.execFileSync)("git", ["-C", root, "diff", "--name-only", commit, "--"], { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] });
46
+ return new Set(out.split("\n").map((s) => s.trim()).filter(Boolean));
47
+ } catch {
48
+ return null;
49
+ }
50
+ }
51
+ async function checkChanges(root, changed, checkCriterion, checkRules, rulebook = [], notes = [], strict = false, scoped = false, ratchet = []) {
52
+ const files = cleanChanged(changed);
53
+ const says = [];
54
+ const said = [...notes];
55
+ for (const c of rulebook) (c.effect === "loosens" && !c.approval?.ok ? says : said).push((0, import_rule_changes.changeWords)(c));
56
+ const breakpoints = [];
57
+ const code = scoped ? [] : (0, import_breakpoint_service.listBreakpoints)().filter((b) => b.kind === "code" && b.projectRoot === root);
58
+ for (const f of files) {
59
+ for (const b of code) {
60
+ if (!(0, import_breakpoint_service.codeCovers)(b.target, f)) continue;
61
+ breakpoints.push({ path: f, breakpoint: b.id, note: b.note, by: b.createdBy });
62
+ says.push(`\u25A0 ${f}: ${b.createdBy} set a breakpoint on ${b.target === f ? "it" : b.target}${b.note ? ` (\u201C${b.note}\u201D)` : ""}; ask them before changing it`);
63
+ }
64
+ }
65
+ const found = files.length && checkRules ? await checkRules(files) : [];
66
+ const rules = found ?? [];
67
+ for (const r of rules) {
68
+ const line = (0, import_check_words.findingLine)(r);
69
+ if (r.strength === "block" || strict) says.push(`\u2717 ${line}`);
70
+ else said.push(`\u26A0 ${line} (the rule warns; it does not fail the check)`);
71
+ }
72
+ const said1 = new Set(rules.map((r) => `${r.path}>${r.imports}`));
73
+ for (const f of ratchet) {
74
+ if (f.kind === "breach" && said1.has(`${f.from}>${f.to}`)) continue;
75
+ if (f.kind === "fell" || f.kind === "breach" && f.strength === "warn" && !strict) said.push(f.words);
76
+ else says.push(f.words);
77
+ }
78
+ const tests = [];
79
+ for (const f of scoped ? [] : files) {
80
+ let g;
81
+ try {
82
+ g = (0, import_grounding.groundingOf)(root, f);
83
+ } catch {
84
+ continue;
85
+ }
86
+ if (g.state === "failing" || g.state === "stale") {
87
+ tests.push({ path: f, state: g.state, says: g.words });
88
+ says.push(`${f}: ${g.words}`);
89
+ }
90
+ }
91
+ const criteria = [];
92
+ for (const plan of scoped ? [] : (0, import_plan_service.listPlans)(root)) {
93
+ if (plan.status === "archived") continue;
94
+ for (const item of (0, import_plan_item_service.listItemSummaries)(plan.uid)) {
95
+ if (item.status !== "done") continue;
96
+ for (const c of (0, import_criteria_service.listCriteria)(item.uid)) {
97
+ const r = await checkCriterion(c.uid).catch(() => null);
98
+ if (!r || r.ok) continue;
99
+ const findings = r.findings.filter((x) => x.status === "fail").map((x) => x.message);
100
+ criteria.push({ itemUid: item.uid, task: item.title, criterion: c.text, findings });
101
+ says.push(`\u2717 "${item.title}" is marked done, but its criterion "${c.text}" fails${findings.length ? `: ${findings.join("; ")}` : ""}`);
102
+ }
103
+ }
104
+ }
105
+ const docs = [];
106
+ const seen = /* @__PURE__ */ new Map();
107
+ const diffs = /* @__PURE__ */ new Map();
108
+ for (const f of scoped ? [] : files) {
109
+ for (const ref of (0, import_system_docs_service.findDocsByReferencedFile)(root, f)) {
110
+ const doc = (0, import_system_docs_service.getSystemDoc)(ref.uid);
111
+ if (!doc?.capturedAgainstCommit || !(doc.references.files ?? []).some((x) => x.replace(/^\.\/+/, "") === f)) continue;
112
+ const stamp = doc.capturedAgainstCommit;
113
+ if (!diffs.has(stamp)) diffs.set(stamp, changedSince(root, stamp));
114
+ if (!diffs.get(stamp)?.has(f)) continue;
115
+ const at = seen.get(doc.uid);
116
+ if (at) {
117
+ at.files.push(f);
118
+ continue;
119
+ }
120
+ const entry = { uid: doc.uid, title: doc.title, slug: doc.slug, verifiedAt: stamp.slice(0, 7), files: [f] };
121
+ seen.set(doc.uid, entry);
122
+ docs.push(entry);
123
+ }
124
+ }
125
+ for (const d of docs) says.push(`\u26A0 The system doc "${d.title}" describes ${d.files.join(", ")}, which changed after it was verified at ${d.verifiedAt}`);
126
+ return { ok: says.length === 0, says, files, breakpoints, tests, criteria, docs, rules, rulesChecked: found !== null, rulebook: [...rulebook], notes: said, ratchet: ratchet.map(({ strength: _s, ...f }) => f) };
127
+ }
128
+ // Annotate the CommonJS export names for ESM import in node:
129
+ 0 && (module.exports = {
130
+ checkChanges,
131
+ cleanChanged
132
+ });