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,221 @@
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 claude_code_parallel_exports = {};
29
+ __export(claude_code_parallel_exports, {
30
+ HOOK_TIMEOUT: () => HOOK_TIMEOUT,
31
+ SETTINGS_FILE: () => SETTINGS_FILE,
32
+ SKILL_FILE: () => SKILL_FILE,
33
+ SKILL_NAME: () => SKILL_NAME,
34
+ applyClaudeCode: () => applyClaudeCode,
35
+ claudeCodeDir: () => claudeCodeDir,
36
+ hookCommand: () => hookCommand,
37
+ planHook: () => planHook,
38
+ planSkill: () => planSkill,
39
+ previewClaudeCode: () => previewClaudeCode,
40
+ skillText: () => skillText,
41
+ thisMachine: () => thisMachine
42
+ });
43
+ module.exports = __toCommonJS(claude_code_parallel_exports);
44
+ var import_node_fs = __toESM(require("node:fs"));
45
+ var import_node_os = __toESM(require("node:os"));
46
+ var import_node_path = __toESM(require("node:path"));
47
+ var import_skill_guide = require("../mcp/skill-guide");
48
+ var import_command = require("../mcp/connector/command");
49
+ var import_hook = require("../mcp/connector/hook");
50
+ var import_claude_desktop_config = require("./claude-desktop-config");
51
+ var import_confined_fs = require("./confined-fs");
52
+ const SKILL_NAME = "codetrellis-parallel";
53
+ const SKILL_FILE = `skills/${SKILL_NAME}/SKILL.md`;
54
+ const SETTINGS_FILE = "settings.json";
55
+ const HOOK_TIMEOUT = 10;
56
+ function claudeCodeDir(w) {
57
+ const dir = w.env.CLAUDE_CONFIG_DIR?.trim() || import_node_path.default.join(w.home, ".claude");
58
+ return w.exists(dir) ? dir : null;
59
+ }
60
+ function skillText() {
61
+ const guide = (0, import_skill_guide.buildSkillGuide)("parallel").replace(/^# .*\n+/, "");
62
+ return [
63
+ "---",
64
+ `name: ${SKILL_NAME}`,
65
+ "description: Working alongside other AI agents in the same repository (other git worktrees, clones or branches), with CodeTrellis running. Use when starting work in a repository where other agents may be working, when planning changes to shared or exported code, or when CodeTrellis reports an overlap with other work.",
66
+ "---",
67
+ "",
68
+ "# Working in parallel, with CodeTrellis",
69
+ "",
70
+ "The tools below are the CodeTrellis MCP server's. In Claude Code they are named",
71
+ "`mcp__codetrellis__<tool>` (for example `mcp__codetrellis__get_awareness`). If they",
72
+ "are not available, CodeTrellis is not connected: say so rather than guessing.",
73
+ "",
74
+ "This skill is written by the CodeTrellis app (Settings \u2192 Connect an agent). The same",
75
+ "guide is served by the app as `codetrellis://skill/parallel`.",
76
+ "",
77
+ guide.trimEnd(),
78
+ ""
79
+ ].join("\n");
80
+ }
81
+ function hookCommand(connector) {
82
+ const env = Object.entries(connector.env).map(([k, v]) => `${k}=${(0, import_command.shellQuote)(v, "linux")}`);
83
+ return [...env, (0, import_command.shellQuote)(connector.command, "linux"), ...connector.args.map((a) => (0, import_command.shellQuote)(a, "linux")), import_hook.HOOK_FLAG, import_hook.HOOK_PRE_TOOL_USE].join(" ");
84
+ }
85
+ const isOurHook = (h) => !!h && typeof h === "object" && typeof h.command === "string" && /mcp-connector\.cjs/.test(h.command) && h.command.includes(`${import_hook.HOOK_FLAG} ${import_hook.HOOK_PRE_TOOL_USE}`);
86
+ const planned = (before, after, existed) => {
87
+ const status = before === after ? "unchanged" : existed ? "update" : "add";
88
+ return { ok: true, status, before, after, diff: status === "unchanged" ? [] : (0, import_claude_desktop_config.lineDiff)(before, after) };
89
+ };
90
+ function planSkill(current) {
91
+ return planned(current ?? "", skillText(), current !== null);
92
+ }
93
+ function planHook(current, command) {
94
+ let doc = {};
95
+ if (current !== null && current.trim() !== "") {
96
+ let parsed;
97
+ try {
98
+ parsed = JSON.parse(current);
99
+ } catch {
100
+ return { ok: false, reason: "Claude Code's settings.json is not valid JSON, so it was left alone. Fix it, then try again." };
101
+ }
102
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
103
+ return { ok: false, reason: "Claude Code's settings.json is not a JSON object, so it was left alone." };
104
+ }
105
+ doc = parsed;
106
+ }
107
+ const hooks = doc.hooks ?? {};
108
+ if (!hooks || typeof hooks !== "object" || Array.isArray(hooks)) {
109
+ return { ok: false, reason: `Claude Code's settings have a "hooks" that is not an object, so they were left alone.` };
110
+ }
111
+ const pre = hooks.PreToolUse ?? [];
112
+ if (!Array.isArray(pre)) {
113
+ return { ok: false, reason: `Claude Code's settings have a "PreToolUse" that is not a list, so they were left alone.` };
114
+ }
115
+ const ours = { type: "command", command, timeout: HOOK_TIMEOUT };
116
+ let placed = false;
117
+ const kept = pre.flatMap((group) => {
118
+ const g = group;
119
+ if (!g || typeof g !== "object" || !Array.isArray(g.hooks) || !g.hooks.some(isOurHook)) return [group];
120
+ const others = g.hooks.filter((h) => !isOurHook(h));
121
+ const mine = placed ? [] : [{ matcher: import_hook.HOOK_MATCHER, hooks: [ours] }];
122
+ placed = true;
123
+ return [...mine, ...others.length ? [{ ...g, hooks: others }] : []];
124
+ });
125
+ const next = placed ? kept : [...kept, { matcher: import_hook.HOOK_MATCHER, hooks: [ours] }];
126
+ const merged = { ...doc, hooks: { ...hooks, PreToolUse: next } };
127
+ const before = current ?? "";
128
+ const unchanged = current !== null && JSON.stringify(JSON.parse(current || "{}")) === JSON.stringify(merged);
129
+ return planned(before, unchanged ? before : `${JSON.stringify(merged, null, 2)}
130
+ `, current !== null);
131
+ }
132
+ function readCurrent(dir, rel, label) {
133
+ if (!import_node_fs.default.existsSync(import_node_path.default.join(dir, rel))) return { text: null };
134
+ try {
135
+ return { text: (0, import_confined_fs.readTextWithin)(dir, rel, label) };
136
+ } catch {
137
+ return { error: `Claude Code's ${label} could not be read (it may be a link, which is not followed), so it was left alone.` };
138
+ }
139
+ }
140
+ const NO_DIR = "Claude Code's settings folder (~/.claude) was not found on this computer. Install Claude Code and run it once, then try again.";
141
+ const NO_CONNECTOR = "The connector is not built in this checkout, so there is no hook to add yet (npm run build:connector).";
142
+ function previewItem(dir, rel, label, plan) {
143
+ const current = readCurrent(dir, rel, label);
144
+ if ("error" in current) return current;
145
+ const p = plan(current.text);
146
+ if (!p.ok) return { error: p.reason };
147
+ return { path: import_node_path.default.join(dir, rel), status: p.status, diff: p.diff, beforeHash: (0, import_claude_desktop_config.hashOf)(current.text), exists: current.text !== null };
148
+ }
149
+ function previewClaudeCode(where, connector) {
150
+ const dir = claudeCodeDir(where);
151
+ if (!dir) return { ok: false, reason: NO_DIR };
152
+ const skill = previewItem(dir, SKILL_FILE, "skill file", planSkill);
153
+ if ("error" in skill) return { ok: false, reason: skill.error };
154
+ let hook;
155
+ if (!connector) hook = { unavailable: NO_CONNECTOR };
156
+ else {
157
+ const h = previewItem(dir, SETTINGS_FILE, "settings.json", (t) => planHook(t, hookCommand(connector)));
158
+ hook = "error" in h ? { unavailable: h.error } : { ...h, ...connector.caveat ? { caveat: connector.caveat } : {} };
159
+ }
160
+ return { ok: true, dir, skill, hook };
161
+ }
162
+ const stampOf = (now) => now.toISOString().replace(/[:.]/g, "-");
163
+ function applyClaudeCode(where, connector, choice, now = /* @__PURE__ */ new Date()) {
164
+ const dir = claudeCodeDir(where);
165
+ if (!dir) return { ok: false, reason: NO_DIR };
166
+ if (!choice.skill && !choice.hook) return { ok: false, reason: "Choose the skill, the hook, or both." };
167
+ if (choice.hook && !connector) return { ok: false, reason: NO_CONNECTOR };
168
+ const items = [];
169
+ if (choice.skill) items.push({ key: "skill", rel: SKILL_FILE, label: "skill file", shown: choice.skill, plan: planSkill });
170
+ if (choice.hook) items.push({ key: "hook", rel: SETTINGS_FILE, label: "settings.json", shown: choice.hook, plan: (t) => planHook(t, hookCommand(connector)) });
171
+ const ready = [];
172
+ for (const it of items) {
173
+ const current = readCurrent(dir, it.rel, it.label);
174
+ if ("error" in current) return { ok: false, reason: current.error };
175
+ if ((0, import_claude_desktop_config.hashOf)(current.text) !== it.shown) {
176
+ return { ok: false, changed: true, reason: `Claude Code's ${it.label} changed after you looked at it. Here is the change again, against the file as it is now.` };
177
+ }
178
+ const plan = it.plan(current.text);
179
+ if (!plan.ok) return plan;
180
+ ready.push({ key: it.key, rel: it.rel, label: it.label, current: current.text, plan });
181
+ }
182
+ const out = {};
183
+ try {
184
+ for (const r of ready) {
185
+ const target = import_node_path.default.join(dir, r.rel);
186
+ if (r.plan.status === "unchanged") {
187
+ out[r.key] = { path: target, backupPath: null, status: "unchanged" };
188
+ continue;
189
+ }
190
+ let backupPath = null;
191
+ if (r.current !== null) {
192
+ const ext = import_node_path.default.extname(r.rel);
193
+ const backupRel = `${r.rel.slice(0, -ext.length)}.before-codetrellis-${stampOf(now)}${ext}`;
194
+ backupPath = (0, import_confined_fs.writeFileWithin)(dir, backupRel, r.current, `Claude Code ${r.label} backup`);
195
+ }
196
+ (0, import_confined_fs.writeFileWithin)(dir, r.rel, r.plan.after, `Claude Code ${r.label}`);
197
+ out[r.key] = { path: target, backupPath, status: r.plan.status };
198
+ }
199
+ } catch {
200
+ return { ok: false, reason: "Claude Code's files could not be written (a link at their place is not written through). Anything already written is listed by a fresh preview." };
201
+ }
202
+ return { ok: true, ...out };
203
+ }
204
+ function thisMachine() {
205
+ return { home: import_node_os.default.homedir(), env: process.env, exists: (p) => import_node_fs.default.existsSync(p) };
206
+ }
207
+ // Annotate the CommonJS export names for ESM import in node:
208
+ 0 && (module.exports = {
209
+ HOOK_TIMEOUT,
210
+ SETTINGS_FILE,
211
+ SKILL_FILE,
212
+ SKILL_NAME,
213
+ applyClaudeCode,
214
+ claudeCodeDir,
215
+ hookCommand,
216
+ planHook,
217
+ planSkill,
218
+ previewClaudeCode,
219
+ skillText,
220
+ thisMachine
221
+ });
@@ -0,0 +1,186 @@
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 claude_desktop_config_exports = {};
29
+ __export(claude_desktop_config_exports, {
30
+ CONFIG_NAME: () => CONFIG_NAME,
31
+ applyClaudeDesktop: () => applyClaudeDesktop,
32
+ claudeDesktopConfigDir: () => claudeDesktopConfigDir,
33
+ hashOf: () => hashOf,
34
+ lineDiff: () => lineDiff,
35
+ planMerge: () => planMerge,
36
+ previewClaudeDesktop: () => previewClaudeDesktop,
37
+ thisMachine: () => thisMachine
38
+ });
39
+ module.exports = __toCommonJS(claude_desktop_config_exports);
40
+ var import_node_fs = __toESM(require("node:fs"));
41
+ var import_node_os = __toESM(require("node:os"));
42
+ var import_node_path = __toESM(require("node:path"));
43
+ var import_node_crypto = require("node:crypto");
44
+ var import_confined_fs = require("./confined-fs");
45
+ const CONFIG_NAME = "claude_desktop_config.json";
46
+ function claudeDesktopConfigDir(w) {
47
+ const candidates = [];
48
+ if (w.platform === "darwin") {
49
+ candidates.push(import_node_path.default.join(w.home, "Library", "Application Support", "Claude"));
50
+ } else if (w.platform === "win32") {
51
+ const appData = w.env.APPDATA ?? import_node_path.default.join(w.home, "AppData", "Roaming");
52
+ candidates.push(import_node_path.default.join(appData, "Claude"));
53
+ const local = w.env.LOCALAPPDATA ?? import_node_path.default.join(w.home, "AppData", "Local");
54
+ const packages = import_node_path.default.join(local, "Packages");
55
+ if (w.exists(packages)) {
56
+ for (const name of w.list(packages).filter((n) => /^Claude_/i.test(n)).sort()) {
57
+ candidates.push(import_node_path.default.join(packages, name, "LocalCache", "Roaming", "Claude"));
58
+ }
59
+ }
60
+ } else {
61
+ candidates.push(import_node_path.default.join(w.env.XDG_CONFIG_HOME || import_node_path.default.join(w.home, ".config"), "Claude"));
62
+ }
63
+ return candidates.find((d) => w.exists(d)) ?? null;
64
+ }
65
+ function lineDiff(before, after) {
66
+ const a = before === "" ? [] : before.replace(/\n$/, "").split("\n");
67
+ const b = after.replace(/\n$/, "").split("\n");
68
+ const n = a.length;
69
+ const m = b.length;
70
+ const lcs = Array.from({ length: n + 1 }, () => new Array(m + 1).fill(0));
71
+ for (let i2 = n - 1; i2 >= 0; i2--) {
72
+ for (let j2 = m - 1; j2 >= 0; j2--) {
73
+ lcs[i2][j2] = a[i2] === b[j2] ? lcs[i2 + 1][j2 + 1] + 1 : Math.max(lcs[i2 + 1][j2], lcs[i2][j2 + 1]);
74
+ }
75
+ }
76
+ const out = [];
77
+ let i = 0;
78
+ let j = 0;
79
+ while (i < n && j < m) {
80
+ if (a[i] === b[j]) {
81
+ out.push({ op: " ", text: a[i] });
82
+ i++;
83
+ j++;
84
+ } else if (lcs[i + 1][j] >= lcs[i][j + 1]) out.push({ op: "-", text: a[i++] });
85
+ else out.push({ op: "+", text: b[j++] });
86
+ }
87
+ while (i < n) out.push({ op: "-", text: a[i++] });
88
+ while (j < m) out.push({ op: "+", text: b[j++] });
89
+ return out;
90
+ }
91
+ function planMerge(current, entry) {
92
+ let doc = {};
93
+ if (current !== null && current.trim() !== "") {
94
+ let parsed;
95
+ try {
96
+ parsed = JSON.parse(current);
97
+ } catch {
98
+ return { ok: false, reason: "Claude Desktop's config file is not valid JSON, so it was left alone. Fix or remove it, then try again." };
99
+ }
100
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
101
+ return { ok: false, reason: "Claude Desktop's config file is not a JSON object, so it was left alone." };
102
+ }
103
+ doc = parsed;
104
+ }
105
+ const servers = doc.mcpServers ?? {};
106
+ if (!servers || typeof servers !== "object" || Array.isArray(servers)) {
107
+ return { ok: false, reason: `Claude Desktop's config has an "mcpServers" that is not an object, so it was left alone.` };
108
+ }
109
+ const existing = servers.codetrellis;
110
+ const status = existing === void 0 ? "add" : JSON.stringify(existing) === JSON.stringify(entry) ? "unchanged" : "update";
111
+ const merged = { ...doc, mcpServers: { ...servers, codetrellis: entry } };
112
+ const before = current ?? "";
113
+ const after = status === "unchanged" ? before : `${JSON.stringify(merged, null, 2)}
114
+ `;
115
+ return { ok: true, status, before, after, diff: status === "unchanged" ? [] : lineDiff(before, after) };
116
+ }
117
+ const hashOf = (text) => (0, import_node_crypto.createHash)("sha256").update(text ?? "\0absent").digest("hex");
118
+ function readCurrent(dir) {
119
+ if (!import_node_fs.default.existsSync(import_node_path.default.join(dir, CONFIG_NAME))) return { text: null };
120
+ try {
121
+ return { text: (0, import_confined_fs.readTextWithin)(dir, CONFIG_NAME, "Claude Desktop config") };
122
+ } catch {
123
+ return { error: "Claude Desktop's config file could not be read (it may be a link, which is not followed), so it was left alone." };
124
+ }
125
+ }
126
+ function previewClaudeDesktop(where, entry) {
127
+ if (!entry) return { ok: false, reason: "The connector is not built in this checkout, so there is nothing to add yet (npm run build:connector)." };
128
+ const dir = claudeDesktopConfigDir(where);
129
+ if (!dir) return { ok: false, reason: "Claude Desktop's settings folder was not found on this computer. Install Claude Desktop and open it once, then try again." };
130
+ const current = readCurrent(dir);
131
+ if ("error" in current) return { ok: false, reason: current.error };
132
+ const plan = planMerge(current.text, entry);
133
+ if (!plan.ok) return plan;
134
+ return { ok: true, path: import_node_path.default.join(dir, CONFIG_NAME), status: plan.status, diff: plan.diff, beforeHash: hashOf(current.text), exists: current.text !== null };
135
+ }
136
+ function applyClaudeDesktop(where, entry, shownHash, now = /* @__PURE__ */ new Date()) {
137
+ if (!entry) return { ok: false, reason: "The connector is not built in this checkout." };
138
+ const dir = claudeDesktopConfigDir(where);
139
+ if (!dir) return { ok: false, reason: "Claude Desktop's settings folder was not found on this computer." };
140
+ const current = readCurrent(dir);
141
+ if ("error" in current) return { ok: false, reason: current.error };
142
+ if (hashOf(current.text) !== shownHash) {
143
+ return { ok: false, changed: true, reason: "Claude Desktop's config changed after you looked at it. Here is the change again, against the file as it is now." };
144
+ }
145
+ const plan = planMerge(current.text, entry);
146
+ if (!plan.ok) return plan;
147
+ const target = import_node_path.default.join(dir, CONFIG_NAME);
148
+ if (plan.status === "unchanged") return { ok: true, path: target, backupPath: null, status: "unchanged" };
149
+ try {
150
+ let backupPath = null;
151
+ if (current.text !== null) {
152
+ const stamp = now.toISOString().replace(/[:.]/g, "-");
153
+ backupPath = (0, import_confined_fs.writeFileWithin)(dir, `claude_desktop_config.before-codetrellis-${stamp}.json`, current.text, "Claude Desktop config backup");
154
+ }
155
+ (0, import_confined_fs.writeFileWithin)(dir, CONFIG_NAME, plan.after, "Claude Desktop config");
156
+ return { ok: true, path: target, backupPath, status: plan.status };
157
+ } catch {
158
+ return { ok: false, reason: "Claude Desktop's config could not be written (a link at its place is not written through). Nothing was changed." };
159
+ }
160
+ }
161
+ function thisMachine() {
162
+ return {
163
+ platform: process.platform,
164
+ env: process.env,
165
+ home: import_node_os.default.homedir(),
166
+ exists: (p) => import_node_fs.default.existsSync(p),
167
+ list: (d) => {
168
+ try {
169
+ return import_node_fs.default.readdirSync(d);
170
+ } catch {
171
+ return [];
172
+ }
173
+ }
174
+ };
175
+ }
176
+ // Annotate the CommonJS export names for ESM import in node:
177
+ 0 && (module.exports = {
178
+ CONFIG_NAME,
179
+ applyClaudeDesktop,
180
+ claudeDesktopConfigDir,
181
+ hashOf,
182
+ lineDiff,
183
+ planMerge,
184
+ previewClaudeDesktop,
185
+ thisMachine
186
+ });
@@ -0,0 +1,57 @@
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 clock_exports = {};
19
+ __export(clock_exports, {
20
+ _setClockForTesting: () => _setClockForTesting,
21
+ createControllableClock: () => createControllableClock,
22
+ now: () => now,
23
+ nowIso: () => nowIso
24
+ });
25
+ module.exports = __toCommonJS(clock_exports);
26
+ let _now = () => Date.now();
27
+ function now() {
28
+ return _now();
29
+ }
30
+ function nowIso() {
31
+ return new Date(_now()).toISOString();
32
+ }
33
+ function _setClockForTesting(fn) {
34
+ _now = fn ?? (() => Date.now());
35
+ }
36
+ function createControllableClock(start = Date.UTC(2026, 0, 1)) {
37
+ let value = start;
38
+ return {
39
+ tick(ms = 1e3) {
40
+ value += ms;
41
+ return value;
42
+ },
43
+ set(epochMs) {
44
+ value = epochMs;
45
+ },
46
+ read() {
47
+ return value;
48
+ }
49
+ };
50
+ }
51
+ // Annotate the CommonJS export names for ESM import in node:
52
+ 0 && (module.exports = {
53
+ _setClockForTesting,
54
+ createControllableClock,
55
+ now,
56
+ nowIso
57
+ });
@@ -0,0 +1,191 @@
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 cloud_files_exports = {};
29
+ __export(cloud_files_exports, {
30
+ NotOnDeviceError: () => NotOnDeviceError,
31
+ attribSaysOffline: () => attribSaysOffline,
32
+ cloudRoots: () => cloudRoots,
33
+ findPlace: () => findPlace,
34
+ forgetCloudRoots: () => forgetCloudRoots,
35
+ isPlaceholder: () => isPlaceholder,
36
+ isPosixPlaceholder: () => isPosixPlaceholder,
37
+ macRoots: () => macRoots,
38
+ underCloudRoot: () => underCloudRoot,
39
+ windowsRoots: () => windowsRoots
40
+ });
41
+ module.exports = __toCommonJS(cloud_files_exports);
42
+ var import_node_fs = __toESM(require("node:fs"));
43
+ var import_node_os = __toESM(require("node:os"));
44
+ var import_node_path = __toESM(require("node:path"));
45
+ var import_node_child_process = require("node:child_process");
46
+ class NotOnDeviceError extends Error {
47
+ constructor(what) {
48
+ super(`${what} is not on this device: it is still only in the cloud`);
49
+ }
50
+ }
51
+ const isDir = (p) => {
52
+ try {
53
+ return import_node_fs.default.statSync(p).isDirectory();
54
+ } catch {
55
+ return false;
56
+ }
57
+ };
58
+ function macRoots(home, list = safeList) {
59
+ const out = [];
60
+ const cloud = import_node_path.default.join(home, "Library", "CloudStorage");
61
+ for (const name of list(cloud)) {
62
+ const shared = /^OneDrive-SharedLibraries-(.+)$/.exec(name);
63
+ if (shared) {
64
+ out.push({ provider: "sharepoint", path: import_node_path.default.join(cloud, name), account: shared[1] });
65
+ continue;
66
+ }
67
+ const one = /^OneDrive-(.+)$/.exec(name);
68
+ if (one) out.push({ provider: "onedrive", path: import_node_path.default.join(cloud, name), account: one[1] });
69
+ }
70
+ for (const name of list(home)) {
71
+ const legacy = /^OneDrive(?: - (.+))?$/.exec(name);
72
+ if (legacy) out.push({ provider: "onedrive", path: import_node_path.default.join(home, name), account: legacy[1] ?? null });
73
+ }
74
+ return out;
75
+ }
76
+ function windowsRoots(env, regOutput) {
77
+ const out = [];
78
+ const accountOf = (p) => /OneDrive - (.+)$/.exec(import_node_path.default.win32.basename(p))?.[1] ?? null;
79
+ for (const key of ["OneDriveCommercial", "OneDriveConsumer", "OneDrive"]) {
80
+ const p = env[key];
81
+ if (p) out.push({ provider: "onedrive", path: p, account: key === "OneDriveConsumer" ? "Personal" : accountOf(p) });
82
+ }
83
+ for (const m of regOutput.matchAll(/^\s*MountPoint\s+REG_\w+\s+(.+?)\s*$/gm)) {
84
+ const p = m[1];
85
+ const isOneDrive = /[\\/]OneDrive(?: - [^\\/]+)?$/i.test(p);
86
+ out.push({ provider: isOneDrive ? "onedrive" : "sharepoint", path: p, account: isOneDrive ? accountOf(p) : import_node_path.default.win32.basename(import_node_path.default.win32.dirname(p)) || null });
87
+ }
88
+ return out;
89
+ }
90
+ function safeList(dir) {
91
+ try {
92
+ return import_node_fs.default.readdirSync(dir, { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => e.name);
93
+ } catch {
94
+ return [];
95
+ }
96
+ }
97
+ function cloudRoots() {
98
+ const forced = process.env.CODETRELLIS_CLOUD_ROOTS;
99
+ let roots;
100
+ if (forced !== void 0) {
101
+ try {
102
+ roots = JSON.parse(forced).filter((r) => r && (r.provider === "onedrive" || r.provider === "sharepoint") && typeof r.path === "string");
103
+ } catch {
104
+ roots = [];
105
+ }
106
+ } else if (process.platform === "darwin") {
107
+ roots = macRoots(import_node_os.default.homedir());
108
+ } else if (process.platform === "win32") {
109
+ let reg = "";
110
+ try {
111
+ reg = (0, import_node_child_process.execFileSync)("reg", ["query", "HKCU\\Software\\SyncEngines\\Providers\\OneDrive", "/s", "/v", "MountPoint"], {
112
+ encoding: "utf-8",
113
+ stdio: ["ignore", "pipe", "ignore"],
114
+ timeout: 5e3,
115
+ windowsHide: true
116
+ });
117
+ } catch {
118
+ }
119
+ roots = windowsRoots(process.env, reg);
120
+ } else {
121
+ const p = import_node_path.default.join(import_node_os.default.homedir(), "OneDrive");
122
+ roots = isDir(p) ? [{ provider: "onedrive", path: p, account: null }] : [];
123
+ }
124
+ const seen = /* @__PURE__ */ new Set();
125
+ return roots.filter((r) => isDir(r.path)).filter((r) => {
126
+ const k = import_node_path.default.resolve(r.path).toLowerCase();
127
+ if (seen.has(k)) return false;
128
+ seen.add(k);
129
+ return true;
130
+ }).sort((a, b) => a.provider === b.provider ? a.path.localeCompare(b.path) : a.provider === "onedrive" ? -1 : 1);
131
+ }
132
+ function findPlace(provider, place, roots = cloudRoots()) {
133
+ const parts = place.split("/").filter(Boolean);
134
+ for (const r of roots) {
135
+ if (r.provider !== provider) continue;
136
+ const candidate = import_node_path.default.join(r.path, ...parts);
137
+ if (isDir(candidate)) return candidate;
138
+ }
139
+ return null;
140
+ }
141
+ function isPosixPlaceholder(st) {
142
+ return st.isFile() && st.size > 0 && st.blocks === 0;
143
+ }
144
+ function attribSaysOffline(attribLine) {
145
+ const m = /^(.*?)\s+(?:[A-Za-z]:\\|\\\\)/.exec(attribLine);
146
+ return /\bO\b/.test(m?.[1] ?? "");
147
+ }
148
+ let rootsCache = null;
149
+ function cachedRoots() {
150
+ if (!rootsCache || Date.now() - rootsCache.at > 3e4) rootsCache = { at: Date.now(), roots: cloudRoots() };
151
+ return rootsCache.roots;
152
+ }
153
+ function forgetCloudRoots() {
154
+ rootsCache = null;
155
+ }
156
+ function underCloudRoot(file, roots = cachedRoots()) {
157
+ const f = import_node_path.default.resolve(file);
158
+ return roots.some((r) => {
159
+ const rel = import_node_path.default.relative(import_node_path.default.resolve(r.path), f);
160
+ return rel !== "" && !rel.startsWith("..") && !import_node_path.default.isAbsolute(rel);
161
+ });
162
+ }
163
+ function isPlaceholder(file) {
164
+ let st;
165
+ try {
166
+ st = import_node_fs.default.statSync(file);
167
+ } catch {
168
+ return false;
169
+ }
170
+ if (process.platform !== "win32") return isPosixPlaceholder(st) && underCloudRoot(file);
171
+ if (!st.isFile()) return false;
172
+ try {
173
+ const out = (0, import_node_child_process.execFileSync)("attrib", [file], { encoding: "utf-8", stdio: ["ignore", "pipe", "ignore"], timeout: 5e3, windowsHide: true });
174
+ return attribSaysOffline(out.split(/\r?\n/)[0] ?? "");
175
+ } catch {
176
+ return false;
177
+ }
178
+ }
179
+ // Annotate the CommonJS export names for ESM import in node:
180
+ 0 && (module.exports = {
181
+ NotOnDeviceError,
182
+ attribSaysOffline,
183
+ cloudRoots,
184
+ findPlace,
185
+ forgetCloudRoots,
186
+ isPlaceholder,
187
+ isPosixPlaceholder,
188
+ macRoots,
189
+ underCloudRoot,
190
+ windowsRoots
191
+ });