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,701 @@
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 system_docs_service_exports = {};
29
+ __export(system_docs_service_exports, {
30
+ checkAllDocsFreshness: () => checkAllDocsFreshness,
31
+ createSystemDoc: () => createSystemDoc,
32
+ deleteSystemDoc: () => deleteSystemDoc,
33
+ findDocsByReferencedFile: () => findDocsByReferencedFile,
34
+ getFreshness: () => getFreshness,
35
+ getSystemDoc: () => getSystemDoc,
36
+ getSystemDocBySlug: () => getSystemDocBySlug,
37
+ indexProjectDocs: () => indexProjectDocs,
38
+ listSystemDocs: () => listSystemDocs,
39
+ searchSystemDocs: () => searchSystemDocs,
40
+ startSystemDocsWatcher: () => startSystemDocsWatcher,
41
+ stopSystemDocsWatcher: () => stopSystemDocsWatcher,
42
+ updateSystemDoc: () => updateSystemDoc,
43
+ verifySystemDoc: () => verifySystemDoc
44
+ });
45
+ module.exports = __toCommonJS(system_docs_service_exports);
46
+ var _lazy____server = __toESM(require("../server"));
47
+ var import_confined_fs = require("./confined-fs");
48
+ var import_node_fs = __toESM(require("node:fs"));
49
+ var import_node_path = __toESM(require("node:path"));
50
+ var import_node_crypto = require("node:crypto");
51
+ var import_node_child_process = require("node:child_process");
52
+ var import_chokidar = __toESM(require("chokidar"));
53
+ var import_yaml = require("yaml");
54
+ var import_database = require("./database");
55
+ var import_persistence = require("./persistence");
56
+ var import_self_write_tracker = require("./self-write-tracker");
57
+ var import_checkout_identity = require("./checkout-identity");
58
+ const SAFE_SLUG = /^[a-z0-9][a-z0-9-]{0,127}$/i;
59
+ function assertSafeSlug(slug) {
60
+ if (typeof slug !== "string" || !SAFE_SLUG.test(slug)) {
61
+ throw new import_confined_fs.ConfinementError(
62
+ `Invalid system-doc slug "${String(slug).slice(0, 64)}" \u2014 slugs may contain only letters, digits and hyphens.`
63
+ );
64
+ }
65
+ return slug;
66
+ }
67
+ const SYSTEM_DOCS_DIR_SEGMENT = ".codetrellis/docs";
68
+ function listSystemDocs(projectPath) {
69
+ const db = (0, import_database.getDb)();
70
+ const result = db.exec(
71
+ `SELECT uid, slug, title, owner, tags, updated_at, last_verified_at, captured_against_commit
72
+ FROM system_docs WHERE project_path = ? ORDER BY updated_at DESC`,
73
+ [normalisePath(projectPath)]
74
+ );
75
+ if (!result[0]) return [];
76
+ return result[0].values.map((r) => ({
77
+ uid: r[0],
78
+ slug: r[1],
79
+ title: r[2],
80
+ owner: r[3] ?? null,
81
+ tags: safeParseJsonArray(r[4]),
82
+ updatedAt: r[5],
83
+ lastVerifiedAt: r[6] ?? null,
84
+ capturedAgainstCommit: r[7] ?? null
85
+ }));
86
+ }
87
+ function searchSystemDocs(projectPath, query) {
88
+ if (!query.trim()) return listSystemDocs(projectPath);
89
+ const db = (0, import_database.getDb)();
90
+ const like = `%${query.toLowerCase()}%`;
91
+ const result = db.exec(
92
+ `SELECT uid, slug, title, owner, tags, updated_at, last_verified_at, captured_against_commit
93
+ FROM system_docs
94
+ WHERE project_path = ?
95
+ AND (LOWER(title) LIKE ? OR LOWER(body) LIKE ?)
96
+ ORDER BY updated_at DESC`,
97
+ [normalisePath(projectPath), like, like]
98
+ );
99
+ if (!result[0]) return [];
100
+ return result[0].values.map((r) => ({
101
+ uid: r[0],
102
+ slug: r[1],
103
+ title: r[2],
104
+ owner: r[3] ?? null,
105
+ tags: safeParseJsonArray(r[4]),
106
+ updatedAt: r[5],
107
+ lastVerifiedAt: r[6] ?? null,
108
+ capturedAgainstCommit: r[7] ?? null
109
+ }));
110
+ }
111
+ function getSystemDoc(uid) {
112
+ const db = (0, import_database.getDb)();
113
+ const result = db.exec(`SELECT ${ALL_COLUMNS} FROM system_docs WHERE uid = ?`, [uid]);
114
+ if (!result[0]?.values[0]) return null;
115
+ return rowToDoc(result[0].values[0]);
116
+ }
117
+ function getSystemDocBySlug(projectPath, slug) {
118
+ const db = (0, import_database.getDb)();
119
+ const result = db.exec(
120
+ `SELECT ${ALL_COLUMNS} FROM system_docs WHERE project_path = ? AND slug = ?`,
121
+ [normalisePath(projectPath), slug]
122
+ );
123
+ if (!result[0]?.values[0]) return null;
124
+ return rowToDoc(result[0].values[0]);
125
+ }
126
+ function createSystemDoc(input) {
127
+ const projectPath = normalisePath(input.projectPath);
128
+ const uid = (0, import_node_crypto.randomUUID)();
129
+ const now = Date.now();
130
+ const author = input.author ?? "human";
131
+ const authorType = input.authorType ?? "human";
132
+ const body = input.body ?? "";
133
+ const tags = input.tags ?? [];
134
+ const references = input.references ?? {};
135
+ const owner = input.owner ?? null;
136
+ let slug = assertSafeSlug((input.slug ?? slugify(input.title)) || "doc");
137
+ if (getSystemDocBySlug(projectPath, slug)) {
138
+ slug = `${slug}-${uid.split("-")[0]}`;
139
+ }
140
+ const db = (0, import_database.getDb)();
141
+ db.run(
142
+ `INSERT INTO system_docs (uid, project_path, slug, title, body, owner, tags, "references",
143
+ captured_against_commit, last_verified_at,
144
+ author, author_type, created_at, updated_at)
145
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, NULL, NULL, ?, ?, ?, ?)`,
146
+ [
147
+ uid,
148
+ projectPath,
149
+ slug,
150
+ input.title,
151
+ body,
152
+ owner,
153
+ JSON.stringify(tags),
154
+ JSON.stringify(references),
155
+ author,
156
+ authorType,
157
+ now,
158
+ now
159
+ ]
160
+ );
161
+ const doc = {
162
+ uid,
163
+ projectPath,
164
+ slug,
165
+ title: input.title,
166
+ body,
167
+ owner,
168
+ tags,
169
+ references,
170
+ capturedAgainstCommit: null,
171
+ lastVerifiedAt: null,
172
+ author,
173
+ authorType,
174
+ createdAt: now,
175
+ updatedAt: now
176
+ };
177
+ writeDocFile(doc);
178
+ (0, import_persistence.markDirty)();
179
+ return doc;
180
+ }
181
+ function updateSystemDoc(uid, updates) {
182
+ const existing = getSystemDoc(uid);
183
+ if (!existing) return null;
184
+ const now = Date.now();
185
+ const title = updates.title ?? existing.title;
186
+ const body = updates.body ?? existing.body;
187
+ const owner = updates.owner !== void 0 ? updates.owner : existing.owner;
188
+ const tags = updates.tags ?? existing.tags;
189
+ const references = updates.references ?? existing.references;
190
+ const author = updates.author ?? existing.author;
191
+ const authorType = updates.authorType ?? existing.authorType;
192
+ let slug = existing.slug;
193
+ if (updates.title && updates.title !== existing.title) {
194
+ const candidate = slugify(updates.title) || "doc";
195
+ if (candidate !== slug) {
196
+ const clash = getSystemDocBySlug(existing.projectPath, candidate);
197
+ slug = clash && clash.uid !== uid ? `${candidate}-${uid.split("-")[0]}` : candidate;
198
+ }
199
+ }
200
+ const db = (0, import_database.getDb)();
201
+ db.run(
202
+ `UPDATE system_docs SET slug = ?, title = ?, body = ?, owner = ?, tags = ?, "references" = ?,
203
+ author = ?, author_type = ?, updated_at = ?
204
+ WHERE uid = ?`,
205
+ [
206
+ slug,
207
+ title,
208
+ body,
209
+ owner,
210
+ JSON.stringify(tags),
211
+ JSON.stringify(references),
212
+ author,
213
+ authorType,
214
+ now,
215
+ uid
216
+ ]
217
+ );
218
+ if (slug !== existing.slug) {
219
+ const oldPath = import_node_path.default.join(existing.projectPath, SYSTEM_DOCS_DIR_SEGMENT, `${existing.slug}.md`);
220
+ try {
221
+ if (import_node_fs.default.existsSync(oldPath)) {
222
+ (0, import_self_write_tracker.stampSelfWrite)(oldPath);
223
+ import_node_fs.default.unlinkSync(oldPath);
224
+ }
225
+ } catch {
226
+ }
227
+ }
228
+ const updated = {
229
+ ...existing,
230
+ slug,
231
+ title,
232
+ body,
233
+ owner,
234
+ tags,
235
+ references,
236
+ author,
237
+ authorType,
238
+ updatedAt: now
239
+ };
240
+ writeDocFile(updated);
241
+ (0, import_persistence.markDirty)();
242
+ return updated;
243
+ }
244
+ function deleteSystemDoc(uid) {
245
+ const existing = getSystemDoc(uid);
246
+ if (!existing) return false;
247
+ const db = (0, import_database.getDb)();
248
+ db.run(`DELETE FROM system_docs WHERE uid = ?`, [uid]);
249
+ const filePath = import_node_path.default.join(existing.projectPath, SYSTEM_DOCS_DIR_SEGMENT, `${existing.slug}.md`);
250
+ try {
251
+ if (import_node_fs.default.existsSync(filePath)) {
252
+ (0, import_self_write_tracker.stampSelfWrite)(filePath);
253
+ import_node_fs.default.unlinkSync(filePath);
254
+ }
255
+ } catch {
256
+ }
257
+ (0, import_persistence.markDirty)();
258
+ return true;
259
+ }
260
+ function verifySystemDoc(uid) {
261
+ const existing = getSystemDoc(uid);
262
+ if (!existing) return null;
263
+ const head = gitHeadSha(existing.projectPath);
264
+ if (!head) {
265
+ return existing;
266
+ }
267
+ const now = Date.now();
268
+ const db = (0, import_database.getDb)();
269
+ db.run(
270
+ `UPDATE system_docs SET captured_against_commit = ?, last_verified_at = ?, updated_at = ?
271
+ WHERE uid = ?`,
272
+ [head, now, now, uid]
273
+ );
274
+ const updated = {
275
+ ...existing,
276
+ capturedAgainstCommit: head,
277
+ lastVerifiedAt: now,
278
+ updatedAt: now
279
+ };
280
+ writeDocFile(updated);
281
+ (0, import_persistence.markDirty)();
282
+ return updated;
283
+ }
284
+ function getFreshness(uid) {
285
+ const doc = getSystemDoc(uid);
286
+ if (!doc) return null;
287
+ const currentCommit = gitHeadSha(doc.projectPath);
288
+ const capturedCommit = doc.capturedAgainstCommit;
289
+ if (!capturedCommit) {
290
+ return {
291
+ uid,
292
+ status: "current",
293
+ currentCommit,
294
+ capturedCommit: null,
295
+ changedReferencedFiles: []
296
+ };
297
+ }
298
+ if (!currentCommit || currentCommit === capturedCommit) {
299
+ return {
300
+ uid,
301
+ status: "current",
302
+ currentCommit,
303
+ capturedCommit,
304
+ changedReferencedFiles: []
305
+ };
306
+ }
307
+ const refFiles = doc.references.files ?? [];
308
+ if (refFiles.length === 0) {
309
+ return {
310
+ uid,
311
+ status: "moved",
312
+ currentCommit,
313
+ capturedCommit,
314
+ changedReferencedFiles: []
315
+ };
316
+ }
317
+ const changed = gitChangedFiles(doc.projectPath, capturedCommit, currentCommit);
318
+ const changedSet = new Set(changed);
319
+ const intersect = refFiles.filter((f) => changedSet.has(normaliseRelPath(f)));
320
+ const status = intersect.length > 0 ? "stale" : "moved";
321
+ return {
322
+ uid,
323
+ status,
324
+ currentCommit,
325
+ capturedCommit,
326
+ changedReferencedFiles: intersect
327
+ };
328
+ }
329
+ function findDocsByReferencedFile(projectPath, relativePath) {
330
+ const db = (0, import_database.getDb)();
331
+ const normalised = normalisePath(projectPath);
332
+ const jsonPath = JSON.stringify(relativePath);
333
+ const likePattern = `%${jsonPath}%`;
334
+ const result = db.exec(
335
+ `SELECT uid, slug, title, "references"
336
+ FROM system_docs
337
+ WHERE project_path = ? AND "references" LIKE ?`,
338
+ [normalised, likePattern]
339
+ );
340
+ if (!result[0]) return [];
341
+ return result[0].values.map((r) => {
342
+ const refs = safeParseJsonObject(r[3]);
343
+ return {
344
+ uid: r[0],
345
+ slug: r[1],
346
+ title: r[2],
347
+ plans: refs.plans ?? []
348
+ };
349
+ });
350
+ }
351
+ function checkAllDocsFreshness(projectPath) {
352
+ const docs = listSystemDocs(projectPath);
353
+ const stale = [];
354
+ for (const doc of docs) {
355
+ const report = getFreshness(doc.uid);
356
+ if (report && report.status === "stale") {
357
+ stale.push(report);
358
+ }
359
+ }
360
+ return stale;
361
+ }
362
+ function indexProjectDocs(projectPath) {
363
+ const dir = import_node_path.default.join(normalisePath(projectPath), SYSTEM_DOCS_DIR_SEGMENT);
364
+ if (!import_node_fs.default.existsSync(dir)) return { imported: 0, skipped: 0, errors: [] };
365
+ const result = { imported: 0, skipped: 0, errors: [] };
366
+ for (const entry of import_node_fs.default.readdirSync(dir)) {
367
+ if (!entry.endsWith(".md")) continue;
368
+ const fullPath = import_node_path.default.join(dir, entry);
369
+ try {
370
+ const ok = importDocFile(fullPath, projectPath);
371
+ if (ok) result.imported++;
372
+ else result.skipped++;
373
+ } catch (err) {
374
+ result.errors.push(`${entry}: ${err instanceof Error ? err.message : err}`);
375
+ }
376
+ }
377
+ return result;
378
+ }
379
+ const watchersByProject = /* @__PURE__ */ new Map();
380
+ function startSystemDocsWatcher(projectRoot) {
381
+ const key = normalisePath(projectRoot);
382
+ if (watchersByProject.has(key)) return;
383
+ const dir = import_node_path.default.join(key, SYSTEM_DOCS_DIR_SEGMENT);
384
+ try {
385
+ import_node_fs.default.mkdirSync(dir, { recursive: true });
386
+ } catch {
387
+ }
388
+ const watcher = import_chokidar.default.watch(dir, {
389
+ ignoreInitial: true,
390
+ persistent: true,
391
+ depth: 0,
392
+ awaitWriteFinish: { stabilityThreshold: 100, pollInterval: 50 }
393
+ });
394
+ watcher.on("all", (event, filePath) => {
395
+ if (!filePath || !filePath.endsWith(".md")) return;
396
+ if (event !== "add" && event !== "change" && event !== "unlink") return;
397
+ if ((0, import_self_write_tracker.wasJustWrittenByUs)(filePath)) return;
398
+ try {
399
+ if (event === "unlink") {
400
+ const slug = import_node_path.default.basename(filePath, ".md");
401
+ const existing = getSystemDocBySlug(key, slug);
402
+ if (existing) {
403
+ (0, import_database.getDb)().run(`DELETE FROM system_docs WHERE uid = ?`, [existing.uid]);
404
+ (0, import_persistence.markDirty)();
405
+ tryBroadcast("system-doc-removed", { uid: existing.uid, slug, projectPath: key });
406
+ }
407
+ return;
408
+ }
409
+ const ok = importDocFile(filePath, key);
410
+ if (ok) {
411
+ tryBroadcast("system-doc-changed", { filePath, projectPath: key, event });
412
+ }
413
+ } catch (err) {
414
+ console.warn("[SystemDocs] Watcher handler failed:", err);
415
+ }
416
+ });
417
+ watcher.on("error", (err) => {
418
+ console.warn("[SystemDocs] Watcher error:", err);
419
+ });
420
+ watchersByProject.set(key, watcher);
421
+ }
422
+ async function stopSystemDocsWatcher(projectRoot) {
423
+ const key = normalisePath(projectRoot);
424
+ const watcher = watchersByProject.get(key);
425
+ if (!watcher) return;
426
+ watchersByProject.delete(key);
427
+ try {
428
+ await watcher.close();
429
+ } catch {
430
+ }
431
+ }
432
+ const ALL_COLUMNS = `uid, project_path, slug, title, body, owner, tags, "references",
433
+ captured_against_commit, last_verified_at,
434
+ author, author_type, created_at, updated_at`;
435
+ function rowToDoc(r) {
436
+ return {
437
+ uid: r[0],
438
+ projectPath: r[1],
439
+ slug: r[2],
440
+ title: r[3],
441
+ body: r[4],
442
+ owner: r[5] ?? null,
443
+ tags: safeParseJsonArray(r[6]),
444
+ references: safeParseJsonObject(r[7]),
445
+ capturedAgainstCommit: r[8] ?? null,
446
+ lastVerifiedAt: r[9] ?? null,
447
+ author: r[10],
448
+ authorType: r[11],
449
+ createdAt: r[12],
450
+ updatedAt: r[13]
451
+ };
452
+ }
453
+ function writeDocFile(doc) {
454
+ const dir = import_node_path.default.join(doc.projectPath, SYSTEM_DOCS_DIR_SEGMENT);
455
+ if (!import_node_fs.default.existsSync(dir)) import_node_fs.default.mkdirSync(dir, { recursive: true });
456
+ const filePath = import_node_path.default.join(dir, `${doc.slug}.md`);
457
+ const frontmatter = {
458
+ uid: doc.uid,
459
+ title: doc.title,
460
+ owner: doc.owner ?? null,
461
+ tags: doc.tags,
462
+ references: doc.references,
463
+ capturedAgainstCommit: doc.capturedAgainstCommit ?? null,
464
+ lastVerifiedAt: doc.lastVerifiedAt ? new Date(doc.lastVerifiedAt).toISOString() : null,
465
+ author: doc.author,
466
+ authorType: doc.authorType,
467
+ createdAt: new Date(doc.createdAt).toISOString(),
468
+ updatedAt: new Date(doc.updatedAt).toISOString()
469
+ };
470
+ const out = `---
471
+ ${(0, import_yaml.stringify)(frontmatter)}---
472
+
473
+ ${doc.body}`;
474
+ const tmp = `${filePath}.tmp`;
475
+ import_node_fs.default.writeFileSync(tmp, out, "utf-8");
476
+ import_node_fs.default.renameSync(tmp, filePath);
477
+ (0, import_self_write_tracker.stampSelfWrite)(filePath);
478
+ }
479
+ function importDocFile(filePath, projectPath) {
480
+ if (!import_node_fs.default.existsSync(filePath)) return false;
481
+ const raw = import_node_fs.default.readFileSync(filePath, "utf-8");
482
+ const { meta, body, hasFrontmatter, parseError } = parseFrontMatter(raw);
483
+ if (hasFrontmatter && parseError) {
484
+ console.warn(
485
+ `[SystemDocs] Skipping ${filePath} \u2014 malformed YAML frontmatter (${parseError}). Fix the syntax and save again; no changes were applied to the index.`
486
+ );
487
+ return false;
488
+ }
489
+ let uid = typeof meta.uid === "string" ? meta.uid : null;
490
+ const title = typeof meta.title === "string" && meta.title.trim() ? meta.title.trim() : import_node_path.default.basename(filePath, ".md").replace(/[-_]+/g, " ");
491
+ const projPath = normalisePath(projectPath);
492
+ const slug = import_node_path.default.basename(filePath, ".md");
493
+ const now = Date.now();
494
+ const stamped = !!uid;
495
+ if (!uid) uid = (0, import_node_crypto.randomUUID)();
496
+ const owner = typeof meta.owner === "string" ? meta.owner : null;
497
+ const tags = Array.isArray(meta.tags) ? meta.tags.filter((t) => typeof t === "string") : [];
498
+ const references = isReferencesObject(meta.references) ? sanitiseReferences(meta.references) : {};
499
+ const capturedAgainstCommit = typeof meta.capturedAgainstCommit === "string" ? meta.capturedAgainstCommit : null;
500
+ const lastVerifiedAt = parseEpoch(meta.lastVerifiedAt);
501
+ const author = typeof meta.author === "string" ? meta.author : "human";
502
+ const authorType = typeof meta.authorType === "string" ? meta.authorType : "human";
503
+ const createdAt = parseEpoch(meta.createdAt) ?? now;
504
+ const db = (0, import_database.getDb)();
505
+ const exists = db.exec(`SELECT uid, project_path FROM system_docs WHERE uid = ?`, [uid]);
506
+ if (exists[0]?.values[0] && (0, import_checkout_identity.heldByAnotherCheckout)(exists[0].values[0][1], projPath)) {
507
+ return false;
508
+ }
509
+ if (exists[0]?.values[0]) {
510
+ db.run(
511
+ `UPDATE system_docs SET project_path = ?, slug = ?, title = ?, body = ?, owner = ?,
512
+ tags = ?, "references" = ?, captured_against_commit = ?,
513
+ last_verified_at = ?, author = ?, author_type = ?, updated_at = ?
514
+ WHERE uid = ?`,
515
+ [
516
+ projPath,
517
+ slug,
518
+ title,
519
+ body,
520
+ owner,
521
+ JSON.stringify(tags),
522
+ JSON.stringify(references),
523
+ capturedAgainstCommit,
524
+ lastVerifiedAt,
525
+ author,
526
+ authorType,
527
+ now,
528
+ uid
529
+ ]
530
+ );
531
+ } else {
532
+ db.run(
533
+ `INSERT INTO system_docs (uid, project_path, slug, title, body, owner, tags, "references",
534
+ captured_against_commit, last_verified_at,
535
+ author, author_type, created_at, updated_at)
536
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
537
+ [
538
+ uid,
539
+ projPath,
540
+ slug,
541
+ title,
542
+ body,
543
+ owner,
544
+ JSON.stringify(tags),
545
+ JSON.stringify(references),
546
+ capturedAgainstCommit,
547
+ lastVerifiedAt,
548
+ author,
549
+ authorType,
550
+ createdAt,
551
+ now
552
+ ]
553
+ );
554
+ }
555
+ if (!stamped) {
556
+ const doc = {
557
+ uid,
558
+ projectPath: projPath,
559
+ slug,
560
+ title,
561
+ body,
562
+ owner,
563
+ tags,
564
+ references,
565
+ capturedAgainstCommit,
566
+ lastVerifiedAt,
567
+ author,
568
+ authorType,
569
+ createdAt,
570
+ updatedAt: now
571
+ };
572
+ writeDocFile(doc);
573
+ }
574
+ (0, import_persistence.markDirty)();
575
+ return true;
576
+ }
577
+ function parseFrontMatter(source) {
578
+ if (!source.startsWith("---")) {
579
+ return { meta: {}, body: source, hasFrontmatter: false, parseError: null };
580
+ }
581
+ const end = source.indexOf("\n---", 3);
582
+ if (end < 0) {
583
+ return { meta: {}, body: source, hasFrontmatter: true, parseError: "missing closing ---" };
584
+ }
585
+ const yamlBlock = source.slice(3, end).replace(/^\n/, "");
586
+ const body = source.slice(end + 4).replace(/^\n+/, "");
587
+ let meta = {};
588
+ let parseError = null;
589
+ try {
590
+ meta = (0, import_yaml.parse)(yamlBlock) ?? {};
591
+ } catch (err) {
592
+ parseError = err instanceof Error ? err.message : String(err);
593
+ meta = {};
594
+ }
595
+ return { meta, body, hasFrontmatter: true, parseError };
596
+ }
597
+ function isReferencesObject(v) {
598
+ return !!v && typeof v === "object" && !Array.isArray(v);
599
+ }
600
+ function sanitiseReferences(r) {
601
+ const out = {};
602
+ const stringArray = (v) => {
603
+ if (!Array.isArray(v)) return void 0;
604
+ const arr = v.filter((x) => typeof x === "string");
605
+ return arr.length ? arr : void 0;
606
+ };
607
+ const files = stringArray(r.files);
608
+ if (files) out.files = files;
609
+ const symbols = stringArray(r.symbols);
610
+ if (symbols) out.symbols = symbols;
611
+ const items = stringArray(r.items);
612
+ if (items) out.items = items;
613
+ const plans = stringArray(r.plans);
614
+ if (plans) out.plans = plans;
615
+ const urls = stringArray(r.urls);
616
+ if (urls) out.urls = urls;
617
+ return out;
618
+ }
619
+ function parseEpoch(v) {
620
+ if (typeof v === "number") return v;
621
+ if (typeof v === "string") {
622
+ const t = Date.parse(v);
623
+ return Number.isFinite(t) ? t : null;
624
+ }
625
+ return null;
626
+ }
627
+ function safeParseJsonArray(s) {
628
+ if (!s) return [];
629
+ try {
630
+ const v = JSON.parse(s);
631
+ return Array.isArray(v) ? v.filter((x) => typeof x === "string") : [];
632
+ } catch {
633
+ return [];
634
+ }
635
+ }
636
+ function safeParseJsonObject(s) {
637
+ if (!s) return {};
638
+ try {
639
+ const v = JSON.parse(s);
640
+ return isReferencesObject(v) ? sanitiseReferences(v) : {};
641
+ } catch {
642
+ return {};
643
+ }
644
+ }
645
+ function normalisePath(p) {
646
+ return import_node_path.default.resolve(p).replace(/[/\\]+$/, "");
647
+ }
648
+ function normaliseRelPath(p) {
649
+ return p.replace(/\\/g, "/").replace(/^\.\/+/, "");
650
+ }
651
+ function slugify(s) {
652
+ return s.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 60);
653
+ }
654
+ function gitHeadSha(projectPath) {
655
+ try {
656
+ if (!import_node_fs.default.existsSync(import_node_path.default.join(projectPath, ".git"))) return null;
657
+ return (0, import_node_child_process.execFileSync)("git", ["rev-parse", "HEAD"], {
658
+ cwd: projectPath,
659
+ encoding: "utf-8",
660
+ stdio: ["ignore", "pipe", "ignore"]
661
+ }).trim() || null;
662
+ } catch {
663
+ return null;
664
+ }
665
+ }
666
+ function gitChangedFiles(projectPath, fromSha, toSha) {
667
+ try {
668
+ const out = (0, import_node_child_process.execFileSync)("git", ["diff", "--name-only", `${fromSha}..${toSha}`], {
669
+ cwd: projectPath,
670
+ encoding: "utf-8",
671
+ stdio: ["ignore", "pipe", "ignore"]
672
+ });
673
+ return out.split("\n").map((s) => s.trim()).filter(Boolean).map(normaliseRelPath);
674
+ } catch {
675
+ return [];
676
+ }
677
+ }
678
+ function tryBroadcast(type, payload) {
679
+ try {
680
+ const { broadcast } = _lazy____server;
681
+ broadcast(type, payload);
682
+ } catch {
683
+ }
684
+ }
685
+ // Annotate the CommonJS export names for ESM import in node:
686
+ 0 && (module.exports = {
687
+ checkAllDocsFreshness,
688
+ createSystemDoc,
689
+ deleteSystemDoc,
690
+ findDocsByReferencedFile,
691
+ getFreshness,
692
+ getSystemDoc,
693
+ getSystemDocBySlug,
694
+ indexProjectDocs,
695
+ listSystemDocs,
696
+ searchSystemDocs,
697
+ startSystemDocsWatcher,
698
+ stopSystemDocsWatcher,
699
+ updateSystemDoc,
700
+ verifySystemDoc
701
+ });