@jamesaphoenix/tx-core 0.4.2 → 0.4.3

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 (330) hide show
  1. package/README.md +480 -0
  2. package/dist/db.d.ts +28 -14
  3. package/dist/db.d.ts.map +1 -1
  4. package/dist/db.js +102 -14
  5. package/dist/db.js.map +1 -1
  6. package/dist/errors.d.ts +178 -34
  7. package/dist/errors.d.ts.map +1 -1
  8. package/dist/errors.js +119 -26
  9. package/dist/errors.js.map +1 -1
  10. package/dist/id.d.ts +10 -0
  11. package/dist/id.d.ts.map +1 -1
  12. package/dist/id.js +17 -1
  13. package/dist/id.js.map +1 -1
  14. package/dist/index.d.ts +15 -7
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +62 -8
  17. package/dist/index.js.map +1 -1
  18. package/dist/layer.d.ts +23 -14
  19. package/dist/layer.d.ts.map +1 -1
  20. package/dist/layer.js +75 -76
  21. package/dist/layer.js.map +1 -1
  22. package/dist/mappers/anchor.d.ts +15 -1
  23. package/dist/mappers/anchor.d.ts.map +1 -1
  24. package/dist/mappers/anchor.js +95 -28
  25. package/dist/mappers/anchor.js.map +1 -1
  26. package/dist/mappers/attempt.d.ts +3 -1
  27. package/dist/mappers/attempt.d.ts.map +1 -1
  28. package/dist/mappers/attempt.js +23 -9
  29. package/dist/mappers/attempt.js.map +1 -1
  30. package/dist/mappers/candidate.d.ts +3 -1
  31. package/dist/mappers/candidate.d.ts.map +1 -1
  32. package/dist/mappers/candidate.js +46 -16
  33. package/dist/mappers/candidate.js.map +1 -1
  34. package/dist/mappers/claim.d.ts +1 -1
  35. package/dist/mappers/claim.d.ts.map +1 -1
  36. package/dist/mappers/claim.js +11 -4
  37. package/dist/mappers/claim.js.map +1 -1
  38. package/dist/mappers/deduplication.d.ts +13 -1
  39. package/dist/mappers/deduplication.d.ts.map +1 -1
  40. package/dist/mappers/deduplication.js +22 -3
  41. package/dist/mappers/deduplication.js.map +1 -1
  42. package/dist/mappers/doc.d.ts +24 -0
  43. package/dist/mappers/doc.d.ts.map +1 -0
  44. package/dist/mappers/doc.js +161 -0
  45. package/dist/mappers/doc.js.map +1 -0
  46. package/dist/mappers/edge.d.ts +10 -1
  47. package/dist/mappers/edge.d.ts.map +1 -1
  48. package/dist/mappers/edge.js +74 -12
  49. package/dist/mappers/edge.js.map +1 -1
  50. package/dist/mappers/file-learning.d.ts.map +1 -1
  51. package/dist/mappers/file-learning.js +2 -1
  52. package/dist/mappers/file-learning.js.map +1 -1
  53. package/dist/mappers/index.d.ts +6 -7
  54. package/dist/mappers/index.d.ts.map +1 -1
  55. package/dist/mappers/index.js +10 -12
  56. package/dist/mappers/index.js.map +1 -1
  57. package/dist/mappers/learning.d.ts +9 -1
  58. package/dist/mappers/learning.d.ts.map +1 -1
  59. package/dist/mappers/learning.js +94 -14
  60. package/dist/mappers/learning.js.map +1 -1
  61. package/dist/mappers/orchestrator-state.d.ts +1 -1
  62. package/dist/mappers/orchestrator-state.d.ts.map +1 -1
  63. package/dist/mappers/orchestrator-state.js +31 -5
  64. package/dist/mappers/orchestrator-state.js.map +1 -1
  65. package/dist/mappers/parse-date.d.ts +11 -0
  66. package/dist/mappers/parse-date.d.ts.map +1 -0
  67. package/dist/mappers/parse-date.js +18 -0
  68. package/dist/mappers/parse-date.js.map +1 -0
  69. package/dist/mappers/run.d.ts +14 -4
  70. package/dist/mappers/run.d.ts.map +1 -1
  71. package/dist/mappers/run.js +49 -18
  72. package/dist/mappers/run.js.map +1 -1
  73. package/dist/mappers/task.d.ts +5 -1
  74. package/dist/mappers/task.d.ts.map +1 -1
  75. package/dist/mappers/task.js +66 -16
  76. package/dist/mappers/task.js.map +1 -1
  77. package/dist/mappers/tracked-project.d.ts +3 -1
  78. package/dist/mappers/tracked-project.d.ts.map +1 -1
  79. package/dist/mappers/tracked-project.js +23 -9
  80. package/dist/mappers/tracked-project.js.map +1 -1
  81. package/dist/mappers/worker.d.ts +1 -1
  82. package/dist/mappers/worker.d.ts.map +1 -1
  83. package/dist/mappers/worker.js +44 -6
  84. package/dist/mappers/worker.js.map +1 -1
  85. package/dist/repo/anchor-repo.d.ts +2 -2
  86. package/dist/repo/anchor-repo.d.ts.map +1 -1
  87. package/dist/repo/anchor-repo.js +46 -5
  88. package/dist/repo/anchor-repo.js.map +1 -1
  89. package/dist/repo/attempt-repo.d.ts +2 -2
  90. package/dist/repo/attempt-repo.d.ts.map +1 -1
  91. package/dist/repo/attempt-repo.js +16 -6
  92. package/dist/repo/attempt-repo.js.map +1 -1
  93. package/dist/repo/candidate-repo.d.ts.map +1 -1
  94. package/dist/repo/candidate-repo.js +22 -1
  95. package/dist/repo/candidate-repo.js.map +1 -1
  96. package/dist/repo/claim-repo.d.ts +46 -2
  97. package/dist/repo/claim-repo.d.ts.map +1 -1
  98. package/dist/repo/claim-repo.js +113 -6
  99. package/dist/repo/claim-repo.js.map +1 -1
  100. package/dist/repo/compaction-repo.d.ts +41 -0
  101. package/dist/repo/compaction-repo.d.ts.map +1 -0
  102. package/dist/repo/compaction-repo.js +84 -0
  103. package/dist/repo/compaction-repo.js.map +1 -0
  104. package/dist/repo/deduplication-repo.d.ts +9 -1
  105. package/dist/repo/deduplication-repo.d.ts.map +1 -1
  106. package/dist/repo/deduplication-repo.js +46 -9
  107. package/dist/repo/deduplication-repo.js.map +1 -1
  108. package/dist/repo/dep-repo.d.ts +27 -3
  109. package/dist/repo/dep-repo.d.ts.map +1 -1
  110. package/dist/repo/dep-repo.js +166 -39
  111. package/dist/repo/dep-repo.js.map +1 -1
  112. package/dist/repo/doc-repo.d.ts +59 -0
  113. package/dist/repo/doc-repo.d.ts.map +1 -0
  114. package/dist/repo/doc-repo.js +276 -0
  115. package/dist/repo/doc-repo.js.map +1 -0
  116. package/dist/repo/edge-repo.d.ts +1 -1
  117. package/dist/repo/edge-repo.d.ts.map +1 -1
  118. package/dist/repo/edge-repo.js +65 -34
  119. package/dist/repo/edge-repo.js.map +1 -1
  120. package/dist/repo/file-learning-repo.d.ts +3 -3
  121. package/dist/repo/file-learning-repo.d.ts.map +1 -1
  122. package/dist/repo/file-learning-repo.js +19 -8
  123. package/dist/repo/file-learning-repo.js.map +1 -1
  124. package/dist/repo/index.d.ts +4 -6
  125. package/dist/repo/index.d.ts.map +1 -1
  126. package/dist/repo/index.js +3 -5
  127. package/dist/repo/index.js.map +1 -1
  128. package/dist/repo/learning-repo.d.ts +10 -3
  129. package/dist/repo/learning-repo.d.ts.map +1 -1
  130. package/dist/repo/learning-repo.js +68 -11
  131. package/dist/repo/learning-repo.js.map +1 -1
  132. package/dist/repo/orchestrator-state-repo.d.ts.map +1 -1
  133. package/dist/repo/orchestrator-state-repo.js +8 -1
  134. package/dist/repo/orchestrator-state-repo.js.map +1 -1
  135. package/dist/repo/run-repo.d.ts +3 -3
  136. package/dist/repo/run-repo.d.ts.map +1 -1
  137. package/dist/repo/run-repo.js +40 -19
  138. package/dist/repo/run-repo.js.map +1 -1
  139. package/dist/repo/task-repo.d.ts +14 -3
  140. package/dist/repo/task-repo.d.ts.map +1 -1
  141. package/dist/repo/task-repo.js +194 -20
  142. package/dist/repo/task-repo.js.map +1 -1
  143. package/dist/repo/tracked-project-repo.d.ts.map +1 -1
  144. package/dist/repo/tracked-project-repo.js +15 -1
  145. package/dist/repo/tracked-project-repo.js.map +1 -1
  146. package/dist/repo/worker-repo.d.ts +3 -2
  147. package/dist/repo/worker-repo.d.ts.map +1 -1
  148. package/dist/repo/worker-repo.js +54 -8
  149. package/dist/repo/worker-repo.js.map +1 -1
  150. package/dist/schemas/sync.js +2 -2
  151. package/dist/schemas/sync.js.map +1 -1
  152. package/dist/schemas/worker.d.ts +1 -0
  153. package/dist/schemas/worker.d.ts.map +1 -1
  154. package/dist/schemas/worker.js +1 -0
  155. package/dist/schemas/worker.js.map +1 -1
  156. package/dist/services/agent-service.d.ts +57 -0
  157. package/dist/services/agent-service.d.ts.map +1 -0
  158. package/dist/services/agent-service.js +81 -0
  159. package/dist/services/agent-service.js.map +1 -0
  160. package/dist/services/anchor-service.js +1 -1
  161. package/dist/services/anchor-service.js.map +1 -1
  162. package/dist/services/anchor-verification.d.ts +8 -0
  163. package/dist/services/anchor-verification.d.ts.map +1 -1
  164. package/dist/services/anchor-verification.js +237 -37
  165. package/dist/services/anchor-verification.js.map +1 -1
  166. package/dist/services/ast-grep-service.d.ts.map +1 -1
  167. package/dist/services/ast-grep-service.js +93 -22
  168. package/dist/services/ast-grep-service.js.map +1 -1
  169. package/dist/services/attempt-service.d.ts.map +1 -1
  170. package/dist/services/attempt-service.js +1 -4
  171. package/dist/services/attempt-service.js.map +1 -1
  172. package/dist/services/auto-sync-service.d.ts +1 -1
  173. package/dist/services/auto-sync-service.d.ts.map +1 -1
  174. package/dist/services/auto-sync-service.js +18 -10
  175. package/dist/services/auto-sync-service.js.map +1 -1
  176. package/dist/services/claim-service.d.ts +8 -2
  177. package/dist/services/claim-service.d.ts.map +1 -1
  178. package/dist/services/claim-service.js +37 -23
  179. package/dist/services/claim-service.js.map +1 -1
  180. package/dist/services/compaction-service.d.ts +105 -0
  181. package/dist/services/compaction-service.d.ts.map +1 -0
  182. package/dist/services/compaction-service.js +369 -0
  183. package/dist/services/compaction-service.js.map +1 -0
  184. package/dist/services/cycle-scan-service.d.ts +32 -0
  185. package/dist/services/cycle-scan-service.d.ts.map +1 -0
  186. package/dist/services/cycle-scan-service.js +542 -0
  187. package/dist/services/cycle-scan-service.js.map +1 -0
  188. package/dist/services/daemon-service.d.ts +40 -2
  189. package/dist/services/daemon-service.d.ts.map +1 -1
  190. package/dist/services/daemon-service.js +199 -52
  191. package/dist/services/daemon-service.js.map +1 -1
  192. package/dist/services/deduplication-service.d.ts +8 -4
  193. package/dist/services/deduplication-service.d.ts.map +1 -1
  194. package/dist/services/deduplication-service.js +79 -25
  195. package/dist/services/deduplication-service.js.map +1 -1
  196. package/dist/services/dep-service.d.ts +2 -2
  197. package/dist/services/dep-service.d.ts.map +1 -1
  198. package/dist/services/dep-service.js +9 -5
  199. package/dist/services/dep-service.js.map +1 -1
  200. package/dist/services/diversifier-service.d.ts +2 -1
  201. package/dist/services/diversifier-service.d.ts.map +1 -1
  202. package/dist/services/diversifier-service.js +37 -43
  203. package/dist/services/diversifier-service.js.map +1 -1
  204. package/dist/services/doc-service.d.ts +49 -0
  205. package/dist/services/doc-service.d.ts.map +1 -0
  206. package/dist/services/doc-service.js +605 -0
  207. package/dist/services/doc-service.js.map +1 -0
  208. package/dist/services/edge-service.js +2 -2
  209. package/dist/services/edge-service.js.map +1 -1
  210. package/dist/services/embedding-service.d.ts +66 -2
  211. package/dist/services/embedding-service.d.ts.map +1 -1
  212. package/dist/services/embedding-service.js +138 -24
  213. package/dist/services/embedding-service.js.map +1 -1
  214. package/dist/services/file-learning-service.d.ts.map +1 -1
  215. package/dist/services/file-learning-service.js +8 -7
  216. package/dist/services/file-learning-service.js.map +1 -1
  217. package/dist/services/file-watcher-service.d.ts.map +1 -1
  218. package/dist/services/file-watcher-service.js +58 -11
  219. package/dist/services/file-watcher-service.js.map +1 -1
  220. package/dist/services/graph-expansion.d.ts +3 -0
  221. package/dist/services/graph-expansion.d.ts.map +1 -1
  222. package/dist/services/graph-expansion.js +28 -7
  223. package/dist/services/graph-expansion.js.map +1 -1
  224. package/dist/services/hierarchy-service.d.ts +1 -1
  225. package/dist/services/hierarchy-service.d.ts.map +1 -1
  226. package/dist/services/hierarchy-service.js +50 -32
  227. package/dist/services/hierarchy-service.js.map +1 -1
  228. package/dist/services/index.d.ts +13 -15
  229. package/dist/services/index.d.ts.map +1 -1
  230. package/dist/services/index.js +13 -15
  231. package/dist/services/index.js.map +1 -1
  232. package/dist/services/learning-service.d.ts +4 -4
  233. package/dist/services/learning-service.d.ts.map +1 -1
  234. package/dist/services/learning-service.js +75 -42
  235. package/dist/services/learning-service.js.map +1 -1
  236. package/dist/services/llm-service.d.ts +62 -0
  237. package/dist/services/llm-service.d.ts.map +1 -0
  238. package/dist/services/llm-service.js +172 -0
  239. package/dist/services/llm-service.js.map +1 -0
  240. package/dist/services/migration-service.d.ts +1 -1
  241. package/dist/services/migration-service.d.ts.map +1 -1
  242. package/dist/services/migration-service.js +18 -7
  243. package/dist/services/migration-service.js.map +1 -1
  244. package/dist/services/orchestrator-service.d.ts +4 -3
  245. package/dist/services/orchestrator-service.d.ts.map +1 -1
  246. package/dist/services/orchestrator-service.js +67 -29
  247. package/dist/services/orchestrator-service.js.map +1 -1
  248. package/dist/services/promotion-service.d.ts +1 -1
  249. package/dist/services/promotion-service.js +1 -1
  250. package/dist/services/promotion-service.js.map +1 -1
  251. package/dist/services/query-expansion-service.d.ts +30 -9
  252. package/dist/services/query-expansion-service.d.ts.map +1 -1
  253. package/dist/services/query-expansion-service.js +54 -63
  254. package/dist/services/query-expansion-service.js.map +1 -1
  255. package/dist/services/ready-service.d.ts +21 -1
  256. package/dist/services/ready-service.d.ts.map +1 -1
  257. package/dist/services/ready-service.js +44 -21
  258. package/dist/services/ready-service.js.map +1 -1
  259. package/dist/services/retriever-service.d.ts +10 -10
  260. package/dist/services/retriever-service.d.ts.map +1 -1
  261. package/dist/services/retriever-service.js +53 -161
  262. package/dist/services/retriever-service.js.map +1 -1
  263. package/dist/services/swarm-verification.d.ts +2 -2
  264. package/dist/services/swarm-verification.d.ts.map +1 -1
  265. package/dist/services/swarm-verification.js +12 -6
  266. package/dist/services/swarm-verification.js.map +1 -1
  267. package/dist/services/sync-service.d.ts +17 -4
  268. package/dist/services/sync-service.d.ts.map +1 -1
  269. package/dist/services/sync-service.js +378 -114
  270. package/dist/services/sync-service.js.map +1 -1
  271. package/dist/services/task-service.d.ts +6 -4
  272. package/dist/services/task-service.d.ts.map +1 -1
  273. package/dist/services/task-service.js +162 -33
  274. package/dist/services/task-service.js.map +1 -1
  275. package/dist/services/tracing-service.d.ts +55 -0
  276. package/dist/services/tracing-service.d.ts.map +1 -0
  277. package/dist/services/tracing-service.js +99 -0
  278. package/dist/services/tracing-service.js.map +1 -0
  279. package/dist/services/transcript-adapter.d.ts +99 -0
  280. package/dist/services/transcript-adapter.d.ts.map +1 -0
  281. package/dist/services/transcript-adapter.js +283 -0
  282. package/dist/services/transcript-adapter.js.map +1 -0
  283. package/dist/services/validation-service.d.ts +85 -0
  284. package/dist/services/validation-service.d.ts.map +1 -0
  285. package/dist/services/validation-service.js +289 -0
  286. package/dist/services/validation-service.js.map +1 -0
  287. package/dist/services/worker-process.d.ts +23 -4
  288. package/dist/services/worker-process.d.ts.map +1 -1
  289. package/dist/services/worker-process.js +159 -70
  290. package/dist/services/worker-process.js.map +1 -1
  291. package/dist/services/worker-service.d.ts.map +1 -1
  292. package/dist/services/worker-service.js +7 -12
  293. package/dist/services/worker-service.js.map +1 -1
  294. package/dist/sync/claude-task-writer.d.ts +49 -0
  295. package/dist/sync/claude-task-writer.d.ts.map +1 -0
  296. package/dist/sync/claude-task-writer.js +135 -0
  297. package/dist/sync/claude-task-writer.js.map +1 -0
  298. package/dist/utils/doc-hash.d.ts +10 -0
  299. package/dist/utils/doc-hash.d.ts.map +1 -0
  300. package/dist/utils/doc-hash.js +14 -0
  301. package/dist/utils/doc-hash.js.map +1 -0
  302. package/dist/utils/doc-renderer.d.ts +44 -0
  303. package/dist/utils/doc-renderer.d.ts.map +1 -0
  304. package/dist/utils/doc-renderer.js +202 -0
  305. package/dist/utils/doc-renderer.js.map +1 -0
  306. package/dist/utils/math.d.ts +5 -1
  307. package/dist/utils/math.d.ts.map +1 -1
  308. package/dist/utils/math.js +12 -4
  309. package/dist/utils/math.js.map +1 -1
  310. package/dist/utils/sql.d.ts +9 -0
  311. package/dist/utils/sql.d.ts.map +1 -0
  312. package/dist/utils/sql.js +9 -0
  313. package/dist/utils/sql.js.map +1 -0
  314. package/dist/utils/toml-config.d.ts +22 -0
  315. package/dist/utils/toml-config.d.ts.map +1 -0
  316. package/dist/utils/toml-config.js +75 -0
  317. package/dist/utils/toml-config.js.map +1 -0
  318. package/dist/worker/hooks.d.ts +102 -0
  319. package/dist/worker/hooks.d.ts.map +1 -0
  320. package/dist/worker/hooks.js +11 -0
  321. package/dist/worker/hooks.js.map +1 -0
  322. package/dist/worker/index.d.ts +9 -0
  323. package/dist/worker/index.d.ts.map +1 -0
  324. package/dist/worker/index.js +8 -0
  325. package/dist/worker/index.js.map +1 -0
  326. package/dist/worker/run-worker.d.ts +33 -0
  327. package/dist/worker/run-worker.d.ts.map +1 -0
  328. package/dist/worker/run-worker.js +265 -0
  329. package/dist/worker/run-worker.js.map +1 -0
  330. package/package.json +14 -12
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Claude Code task directory writer.
3
+ *
4
+ * Pure functions that transform TaskWithDeps[] into Claude Code's
5
+ * on-disk task format (individual JSON files per task).
6
+ *
7
+ * Claude Code stores team tasks at ~/.claude/tasks/{team-name}/
8
+ * with files: {id}.json, .highwatermark, .lock
9
+ */
10
+ import { Schema } from "effect";
11
+ // =============================================================================
12
+ // Types
13
+ // =============================================================================
14
+ const ClaudeTaskStatusSchema = Schema.Literal("pending", "in_progress", "completed");
15
+ /** A single Claude Code task file (written as {id}.json) */
16
+ export const ClaudeTaskFileSchema = Schema.Struct({
17
+ id: Schema.String,
18
+ subject: Schema.String,
19
+ description: Schema.String,
20
+ activeForm: Schema.String,
21
+ status: ClaudeTaskStatusSchema,
22
+ blocks: Schema.Array(Schema.String),
23
+ blockedBy: Schema.Array(Schema.String),
24
+ });
25
+ /** Result of building Claude task files from tx tasks */
26
+ export const ClaudeSyncResultSchema = Schema.Struct({
27
+ files: Schema.Array(ClaudeTaskFileSchema),
28
+ highwatermark: Schema.Number,
29
+ });
30
+ // =============================================================================
31
+ // Status Mapping
32
+ // =============================================================================
33
+ function mapStatus(txStatus) {
34
+ switch (txStatus) {
35
+ case "active":
36
+ case "review":
37
+ case "human_needs_to_review":
38
+ return "in_progress";
39
+ default:
40
+ return "pending";
41
+ }
42
+ }
43
+ // =============================================================================
44
+ // Description Builder
45
+ // =============================================================================
46
+ function buildClaudeDescription(task, txIdMap) {
47
+ const lines = [];
48
+ if (task.description) {
49
+ lines.push(task.description);
50
+ lines.push("");
51
+ }
52
+ lines.push("---");
53
+ lines.push(`**tx ID**: ${task.id} | **Priority**: ${task.score} | **Status**: ${task.status}`);
54
+ if (task.blockedBy.length > 0) {
55
+ const refs = task.blockedBy.map((id) => {
56
+ const numId = txIdMap.get(id);
57
+ return numId ? `#${numId} (${id})` : `${id}`;
58
+ });
59
+ lines.push(`**Blocked by**: ${refs.join(", ")}`);
60
+ }
61
+ if (task.blocks.length > 0) {
62
+ const refs = task.blocks.map((id) => {
63
+ const numId = txIdMap.get(id);
64
+ return numId ? `#${numId} (${id})` : `${id}`;
65
+ });
66
+ lines.push(`**Blocks**: ${refs.join(", ")}`);
67
+ }
68
+ if (task.parentId) {
69
+ lines.push(`**Parent**: ${task.parentId}`);
70
+ }
71
+ if (task.children.length > 0) {
72
+ lines.push(`**Children**: ${task.children.join(", ")}`);
73
+ }
74
+ lines.push("");
75
+ lines.push(`Run \`tx context ${task.id}\` for relevant learnings before starting.`);
76
+ lines.push(`Run \`tx done ${task.id}\` when complete.`);
77
+ return lines.join("\n");
78
+ }
79
+ // =============================================================================
80
+ // Main Builder
81
+ // =============================================================================
82
+ /**
83
+ * Transform tx tasks into Claude Code task files.
84
+ *
85
+ * - Filters out done tasks
86
+ * - Sorts: ready tasks first (highest score first), then non-ready by score
87
+ * - Assigns sequential numeric IDs
88
+ * - Maps blockedBy/blocks references to numeric IDs
89
+ */
90
+ export function buildClaudeTaskFiles(tasks) {
91
+ // Filter out done tasks
92
+ const nonDone = tasks.filter(t => t.status !== "done");
93
+ // Sort: ready first (highest score), then non-ready (highest score)
94
+ // Tie-break by tx ID for deterministic ordering across syncs
95
+ const sorted = [...nonDone].sort((a, b) => {
96
+ if (a.isReady !== b.isReady) {
97
+ return a.isReady ? -1 : 1;
98
+ }
99
+ if (a.score !== b.score) {
100
+ return b.score - a.score;
101
+ }
102
+ return a.id.localeCompare(b.id);
103
+ });
104
+ // Build tx ID -> numeric ID mapping
105
+ const txIdMap = new Map();
106
+ for (let i = 0; i < sorted.length; i++) {
107
+ txIdMap.set(sorted[i].id, String(i + 1));
108
+ }
109
+ // Build task files
110
+ const files = sorted.map((task, i) => {
111
+ const numericId = String(i + 1);
112
+ // Map blockedBy/blocks to numeric IDs, filtering out done tasks
113
+ const blockedBy = task.blockedBy
114
+ .map((id) => txIdMap.get(id))
115
+ .filter((id) => id !== undefined);
116
+ const blocks = task.blocks
117
+ .map((id) => txIdMap.get(id))
118
+ .filter((id) => id !== undefined);
119
+ return {
120
+ id: numericId,
121
+ subject: task.title,
122
+ description: buildClaudeDescription(task, txIdMap),
123
+ activeForm: `Working on ${task.id}: ${task.title}`,
124
+ status: mapStatus(task.status),
125
+ blocks,
126
+ blockedBy,
127
+ };
128
+ });
129
+ return {
130
+ files,
131
+ highwatermark: files.length + 1,
132
+ txIdMap,
133
+ };
134
+ }
135
+ //# sourceMappingURL=claude-task-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-task-writer.js","sourceRoot":"","sources":["../../src/sync/claude-task-writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Content-addressed hashing for docs.
3
+ * SHA256 hex digest of normalized content.
4
+ */
5
+ /**
6
+ * Compute SHA256 hash of document content.
7
+ * Normalizes content by trimming whitespace and normalizing line endings.
8
+ */
9
+ export declare const computeDocHash: (content: string) => string;
10
+ //# sourceMappingURL=doc-hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc-hash.d.ts","sourceRoot":"","sources":["../../src/utils/doc-hash.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,KAAG,MAGhD,CAAA"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Content-addressed hashing for docs.
3
+ * SHA256 hex digest of normalized content.
4
+ */
5
+ import { createHash } from "node:crypto";
6
+ /**
7
+ * Compute SHA256 hash of document content.
8
+ * Normalizes content by trimming whitespace and normalizing line endings.
9
+ */
10
+ export const computeDocHash = (content) => {
11
+ const normalized = content.trim().replace(/\r\n/g, "\n");
12
+ return createHash("sha256").update(normalized, "utf8").digest("hex");
13
+ };
14
+ //# sourceMappingURL=doc-hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc-hash.js","sourceRoot":"","sources":["../../src/utils/doc-hash.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAe,EAAU,EAAE;IACxD,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;IACxD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AACtE,CAAC,CAAA"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Pure YML → MD renderer for tx docs.
3
+ *
4
+ * Deterministic output with stable section ordering per doc kind.
5
+ * Free-text sections pass through as-is (already markdown).
6
+ * Structured sections (invariants, failure_modes, edge_cases) render as tables.
7
+ */
8
+ import type { DocKind } from "@jamesaphoenix/tx-types";
9
+ /** Parsed YAML doc content (loosely typed — sections may or may not exist). */
10
+ type ParsedYaml = Record<string, unknown>;
11
+ /**
12
+ * Render a parsed YAML doc to deterministic markdown.
13
+ * Section order is fixed per kind. Missing sections are skipped.
14
+ */
15
+ export declare const renderDocToMarkdown: (parsed: ParsedYaml, kind: DocKind) => string;
16
+ /**
17
+ * Render index data to markdown.
18
+ */
19
+ export declare const renderIndexToMarkdown: (indexData: {
20
+ overview?: string;
21
+ prds: Array<{
22
+ name: string;
23
+ title: string;
24
+ status: string;
25
+ }>;
26
+ design_docs: Array<{
27
+ name: string;
28
+ title: string;
29
+ status: string;
30
+ implements?: string;
31
+ }>;
32
+ links: Array<{
33
+ from: string;
34
+ to: string;
35
+ type: string;
36
+ }>;
37
+ invariant_summary?: {
38
+ total: number;
39
+ by_enforcement: Record<string, number>;
40
+ by_subsystem: Record<string, number>;
41
+ };
42
+ }) => string;
43
+ export {};
44
+ //# sourceMappingURL=doc-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc-renderer.d.ts","sourceRoot":"","sources":["../../src/utils/doc-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA;AA4BtD,+EAA+E;AAC/E,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAEzC;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,QAAQ,UAAU,EAAE,MAAM,OAAO,KAAG,MAwBvE,CAAA;AAgJD;;GAEG;AACH,eAAO,MAAM,qBAAqB,GAAI,WAAW;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC5D,WAAW,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACxF,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACxD,iBAAiB,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAA;CACpH,KAAG,MAgEH,CAAA"}
@@ -0,0 +1,202 @@
1
+ /**
2
+ * Pure YML → MD renderer for tx docs.
3
+ *
4
+ * Deterministic output with stable section ordering per doc kind.
5
+ * Free-text sections pass through as-is (already markdown).
6
+ * Structured sections (invariants, failure_modes, edge_cases) render as tables.
7
+ */
8
+ /**
9
+ * Render a parsed YAML doc to deterministic markdown.
10
+ * Section order is fixed per kind. Missing sections are skipped.
11
+ */
12
+ export const renderDocToMarkdown = (parsed, kind) => {
13
+ const title = parsed.title ?? parsed.name ?? "Untitled";
14
+ const lines = [`# ${title}`, ""];
15
+ // Metadata header
16
+ if (parsed.kind)
17
+ lines.push(`**Kind**: ${parsed.kind}`);
18
+ if (parsed.status)
19
+ lines.push(`**Status**: ${parsed.status}`);
20
+ if (parsed.version)
21
+ lines.push(`**Version**: ${parsed.version}`);
22
+ if (parsed.implements)
23
+ lines.push(`**Implements**: ${parsed.implements}`);
24
+ lines.push("");
25
+ switch (kind) {
26
+ case "overview":
27
+ renderOverview(parsed, lines);
28
+ break;
29
+ case "prd":
30
+ renderPrd(parsed, lines);
31
+ break;
32
+ case "design":
33
+ renderDesign(parsed, lines);
34
+ break;
35
+ }
36
+ return lines.join("\n");
37
+ };
38
+ // =============================================================================
39
+ // KIND-SPECIFIC RENDERERS
40
+ // =============================================================================
41
+ const renderOverview = (parsed, lines) => {
42
+ renderFreeTextSection(parsed, lines, "problem_definition", "Problem Definition");
43
+ renderFreeTextSection(parsed, lines, "subsystems", "Subsystems");
44
+ renderFreeTextSection(parsed, lines, "object_model", "Object Model");
45
+ renderFreeTextSection(parsed, lines, "storage_schema", "Storage Schema");
46
+ renderInvariantsTable(parsed.invariants, lines);
47
+ renderFailureModesTable(parsed.failure_modes, lines);
48
+ renderEdgeCasesTable(parsed.edge_cases, lines);
49
+ renderConstraintsList(parsed.constraints, lines);
50
+ renderFreeTextSection(parsed, lines, "cross_cutting", "Cross-Cutting Concerns");
51
+ renderFreeTextSection(parsed, lines, "data_retention", "Data Retention");
52
+ };
53
+ const renderPrd = (parsed, lines) => {
54
+ renderFreeTextSection(parsed, lines, "problem", "Problem");
55
+ renderFreeTextSection(parsed, lines, "solution", "Solution");
56
+ renderStringList(parsed.requirements, lines, "Requirements");
57
+ renderStringList(parsed.acceptance_criteria, lines, "Acceptance Criteria");
58
+ renderStringList(parsed.out_of_scope, lines, "Out of Scope");
59
+ };
60
+ const renderDesign = (parsed, lines) => {
61
+ renderFreeTextSection(parsed, lines, "problem_definition", "Problem Definition");
62
+ renderStringList(parsed.goals, lines, "Goals");
63
+ renderFreeTextSection(parsed, lines, "architecture", "Architecture");
64
+ renderFreeTextSection(parsed, lines, "interfaces", "Interfaces");
65
+ renderFreeTextSection(parsed, lines, "implementation", "Implementation");
66
+ renderFreeTextSection(parsed, lines, "data_model", "Data Model");
67
+ renderInvariantsTable(parsed.invariants, lines);
68
+ renderFailureModesTable(parsed.failure_modes, lines);
69
+ renderEdgeCasesTable(parsed.edge_cases, lines);
70
+ renderWorkBreakdown(parsed.work_breakdown, lines);
71
+ renderFreeTextSection(parsed, lines, "retention", "Retention");
72
+ renderFreeTextSection(parsed, lines, "testing_strategy", "Testing Strategy");
73
+ renderFreeTextSection(parsed, lines, "open_questions", "Open Questions");
74
+ };
75
+ // =============================================================================
76
+ // SECTION RENDERERS
77
+ // =============================================================================
78
+ const renderFreeTextSection = (parsed, lines, key, heading) => {
79
+ const content = parsed[key];
80
+ if (!content || (typeof content === "string" && !content.trim()))
81
+ return;
82
+ lines.push(`## ${heading}`, "");
83
+ lines.push(String(content).trim(), "");
84
+ };
85
+ const renderStringList = (items, lines, heading) => {
86
+ if (!Array.isArray(items) || items.length === 0)
87
+ return;
88
+ lines.push(`## ${heading}`, "");
89
+ for (const item of items) {
90
+ lines.push(`- ${String(item)}`);
91
+ }
92
+ lines.push("");
93
+ };
94
+ const renderConstraintsList = (constraints, lines) => {
95
+ renderStringList(constraints, lines, "Constraints");
96
+ };
97
+ const renderInvariantsTable = (invariants, lines) => {
98
+ if (!Array.isArray(invariants) || invariants.length === 0)
99
+ return;
100
+ lines.push("## Invariants", "");
101
+ lines.push("| ID | Rule | Enforcement | Reference |");
102
+ lines.push("|-----|------|-------------|-----------|");
103
+ for (const inv of invariants) {
104
+ const ref = inv.test_ref ?? inv.lint_rule ?? inv.prompt_ref ?? "-";
105
+ const subsystem = inv.subsystem ? ` (${inv.subsystem})` : "";
106
+ lines.push(`| ${inv.id} | ${inv.rule}${subsystem} | ${inv.enforcement} | ${ref} |`);
107
+ }
108
+ lines.push("");
109
+ };
110
+ const renderFailureModesTable = (failureModes, lines) => {
111
+ if (!Array.isArray(failureModes) || failureModes.length === 0)
112
+ return;
113
+ lines.push("## Failure Modes", "");
114
+ lines.push("| ID | Description | Mitigation |");
115
+ lines.push("|-----|-------------|------------|");
116
+ for (const fm of failureModes) {
117
+ lines.push(`| ${fm.id} | ${fm.description} | ${fm.mitigation ?? "-"} |`);
118
+ }
119
+ lines.push("");
120
+ };
121
+ const renderEdgeCasesTable = (edgeCases, lines) => {
122
+ if (!Array.isArray(edgeCases) || edgeCases.length === 0)
123
+ return;
124
+ lines.push("## Edge Cases", "");
125
+ lines.push("| ID | Description |");
126
+ lines.push("|-----|-------------|");
127
+ for (const ec of edgeCases) {
128
+ lines.push(`| ${ec.id} | ${ec.description} |`);
129
+ }
130
+ lines.push("");
131
+ };
132
+ const renderWorkBreakdown = (items, lines) => {
133
+ if (!Array.isArray(items) || items.length === 0)
134
+ return;
135
+ lines.push("## Work Breakdown", "");
136
+ for (const item of items) {
137
+ const taskRef = item.task_id ? `\`${item.task_id}\` — ` : "";
138
+ lines.push(`- ${taskRef}${item.description}`);
139
+ }
140
+ lines.push("");
141
+ };
142
+ /**
143
+ * Render index data to markdown.
144
+ */
145
+ export const renderIndexToMarkdown = (indexData) => {
146
+ const lines = ["# Documentation Index", ""];
147
+ if (indexData.overview) {
148
+ lines.push(`**System Overview**: [${indexData.overview}](${indexData.overview}.md)`, "");
149
+ }
150
+ // PRDs table
151
+ if (indexData.prds.length > 0) {
152
+ lines.push("## Product Requirements Documents", "");
153
+ lines.push("| Name | Title | Status |");
154
+ lines.push("|------|-------|--------|");
155
+ for (const prd of indexData.prds) {
156
+ lines.push(`| [${prd.name}](prd/${prd.name}.md) | ${prd.title} | ${prd.status} |`);
157
+ }
158
+ lines.push("");
159
+ }
160
+ // Design docs table
161
+ if (indexData.design_docs.length > 0) {
162
+ lines.push("## Design Documents", "");
163
+ lines.push("| Name | Title | Implements | Status |");
164
+ lines.push("|------|-------|------------|--------|");
165
+ for (const dd of indexData.design_docs) {
166
+ lines.push(`| [${dd.name}](design/${dd.name}.md) | ${dd.title} | ${dd.implements ?? "-"} | ${dd.status} |`);
167
+ }
168
+ lines.push("");
169
+ }
170
+ // Invariant summary
171
+ if (indexData.invariant_summary && indexData.invariant_summary.total > 0) {
172
+ const s = indexData.invariant_summary;
173
+ lines.push("## Invariant Summary", "");
174
+ lines.push(`**Total invariants**: ${s.total}`, "");
175
+ if (Object.keys(s.by_enforcement).length > 0) {
176
+ lines.push("**By enforcement type**:", "");
177
+ for (const [type, count] of Object.entries(s.by_enforcement)) {
178
+ lines.push(`- ${type}: ${count}`);
179
+ }
180
+ lines.push("");
181
+ }
182
+ if (Object.keys(s.by_subsystem).length > 0) {
183
+ lines.push("**By subsystem**:", "");
184
+ for (const [subsystem, count] of Object.entries(s.by_subsystem)) {
185
+ lines.push(`- ${subsystem}: ${count}`);
186
+ }
187
+ lines.push("");
188
+ }
189
+ }
190
+ // Links
191
+ if (indexData.links.length > 0) {
192
+ lines.push("## Document Links", "");
193
+ lines.push("| From | To | Type |");
194
+ lines.push("|------|-----|------|");
195
+ for (const link of indexData.links) {
196
+ lines.push(`| ${link.from} | ${link.to} | ${link.type} |`);
197
+ }
198
+ lines.push("");
199
+ }
200
+ return lines.join("\n");
201
+ };
202
+ //# sourceMappingURL=doc-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc-renderer.js","sourceRoot":"","sources":["../../src/utils/doc-renderer.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,10 @@
1
+ import { Effect } from "effect";
2
+ import { EmbeddingDimensionMismatchError } from "../errors.js";
1
3
  /**
2
4
  * Calculate cosine similarity between two vectors.
3
5
  * Returns a value between -1 and 1, where 1 means identical direction.
6
+ *
7
+ * @returns Effect that fails with EmbeddingDimensionMismatchError if vectors have different dimensions
4
8
  */
5
- export declare const cosineSimilarity: (a: Float32Array, b: Float32Array) => number;
9
+ export declare const cosineSimilarity: (a: Float32Array, b: Float32Array) => Effect.Effect<number, EmbeddingDimensionMismatchError>;
6
10
  //# sourceMappingURL=math.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../../src/utils/math.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAAI,GAAG,YAAY,EAAE,GAAG,YAAY,KAAG,MAiBnE,CAAA"}
1
+ {"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../../src/utils/math.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAA;AAE9D;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAC3B,GAAG,YAAY,EACf,GAAG,YAAY,KACd,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,+BAA+B,CAwBvD,CAAA"}
@@ -1,10 +1,18 @@
1
+ import { Effect } from "effect";
2
+ import { EmbeddingDimensionMismatchError } from "../errors.js";
1
3
  /**
2
4
  * Calculate cosine similarity between two vectors.
3
5
  * Returns a value between -1 and 1, where 1 means identical direction.
6
+ *
7
+ * @returns Effect that fails with EmbeddingDimensionMismatchError if vectors have different dimensions
4
8
  */
5
9
  export const cosineSimilarity = (a, b) => {
6
- if (a.length !== b.length)
7
- return 0;
10
+ if (a.length !== b.length) {
11
+ return Effect.fail(new EmbeddingDimensionMismatchError({
12
+ queryDimensions: a.length,
13
+ documentDimensions: b.length
14
+ }));
15
+ }
8
16
  let dotProduct = 0;
9
17
  let normA = 0;
10
18
  let normB = 0;
@@ -15,7 +23,7 @@ export const cosineSimilarity = (a, b) => {
15
23
  }
16
24
  const magnitude = Math.sqrt(normA) * Math.sqrt(normB);
17
25
  if (magnitude === 0)
18
- return 0;
19
- return dotProduct / magnitude;
26
+ return Effect.succeed(0);
27
+ return Effect.succeed(dotProduct / magnitude);
20
28
  };
21
29
  //# sourceMappingURL=math.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"math.js","sourceRoot":"","sources":["../../src/utils/math.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAe,EAAE,CAAe,EAAU,EAAE;IAC3E,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,CAAC,CAAA;IAEnC,IAAI,UAAU,GAAG,CAAC,CAAA;IAClB,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,IAAI,KAAK,GAAG,CAAC,CAAA;IAEb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAA;QAC3B,KAAK,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAA;QACtB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAA;IACxB,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACrD,IAAI,SAAS,KAAK,CAAC;QAAE,OAAO,CAAC,CAAA;IAE7B,OAAO,UAAU,GAAG,SAAS,CAAA;AAC/B,CAAC,CAAA"}
1
+ {"version":3,"file":"math.js","sourceRoot":"","sources":["../../src/utils/math.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAA;AAE9D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,CAAe,EACf,CAAe,EACyC,EAAE;IAC1D,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC,IAAI,CAChB,IAAI,+BAA+B,CAAC;YAClC,eAAe,EAAE,CAAC,CAAC,MAAM;YACzB,kBAAkB,EAAE,CAAC,CAAC,MAAM;SAC7B,CAAC,CACH,CAAA;IACH,CAAC;IAED,IAAI,UAAU,GAAG,CAAC,CAAA;IAClB,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,IAAI,KAAK,GAAG,CAAC,CAAA;IAEb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAA;QAC3B,KAAK,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAA;QACtB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAA;IACxB,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACrD,IAAI,SAAS,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IAE7C,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAAA;AAC/C,CAAC,CAAA"}
@@ -0,0 +1,9 @@
1
+ /** Escape LIKE special characters so user input is treated as literal text. */
2
+ export declare const escapeLikePattern: (input: string) => string;
3
+ /**
4
+ * Default row limit for unbounded SELECT queries (findAll / getAll).
5
+ * Prevents accidental memory blowup when tables grow large.
6
+ * Callers that genuinely need more rows should pass an explicit limit.
7
+ */
8
+ export declare const DEFAULT_QUERY_LIMIT = 1000;
9
+ //# sourceMappingURL=sql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../src/utils/sql.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,eAAO,MAAM,iBAAiB,GAAI,OAAO,MAAM,KAAG,MACsB,CAAA;AAExE;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,OAAO,CAAA"}
@@ -0,0 +1,9 @@
1
+ /** Escape LIKE special characters so user input is treated as literal text. */
2
+ export const escapeLikePattern = (input) => input.replace(/\\/g, "\\\\").replace(/%/g, "\\%").replace(/_/g, "\\_");
3
+ /**
4
+ * Default row limit for unbounded SELECT queries (findAll / getAll).
5
+ * Prevents accidental memory blowup when tables grow large.
6
+ * Callers that genuinely need more rows should pass an explicit limit.
7
+ */
8
+ export const DEFAULT_QUERY_LIMIT = 1000;
9
+ //# sourceMappingURL=sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.js","sourceRoot":"","sources":["../../src/utils/sql.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAa,EAAU,EAAE,CACzD,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;AAExE;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAA"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Read tx configuration from .tx/config.toml.
3
+ * Returns defaults if file doesn't exist.
4
+ */
5
+ export type TxDocsConfig = {
6
+ readonly path: string;
7
+ };
8
+ export type TxCyclesConfig = {
9
+ readonly scanPrompt: string | null;
10
+ readonly agents: number;
11
+ readonly model: string;
12
+ };
13
+ export type TxConfig = {
14
+ readonly docs: TxDocsConfig;
15
+ readonly cycles: TxCyclesConfig;
16
+ };
17
+ /**
18
+ * Read .tx/config.toml and return parsed config.
19
+ * Falls back to defaults if file doesn't exist or is invalid.
20
+ */
21
+ export declare const readTxConfig: (cwd?: string) => TxConfig;
22
+ //# sourceMappingURL=toml-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toml-config.d.ts","sourceRoot":"","sources":["../../src/utils/toml-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;IAC3B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;CAChC,CAAA;AAOD;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,MAAK,MAAsB,KAAG,QA8B1D,CAAA"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Read tx configuration from .tx/config.toml.
3
+ * Returns defaults if file doesn't exist.
4
+ */
5
+ import { existsSync, readFileSync } from "node:fs";
6
+ import { resolve } from "node:path";
7
+ const DEFAULT_CONFIG = {
8
+ docs: { path: ".tx/docs" },
9
+ cycles: { scanPrompt: null, agents: 3, model: "claude-opus-4-6" },
10
+ };
11
+ /**
12
+ * Read .tx/config.toml and return parsed config.
13
+ * Falls back to defaults if file doesn't exist or is invalid.
14
+ */
15
+ export const readTxConfig = (cwd = process.cwd()) => {
16
+ const configPath = resolve(cwd, ".tx", "config.toml");
17
+ if (!existsSync(configPath)) {
18
+ return DEFAULT_CONFIG;
19
+ }
20
+ try {
21
+ const raw = readFileSync(configPath, "utf8");
22
+ // Lightweight TOML parsing for our simple config structure.
23
+ // We only support [docs] section with path key.
24
+ const docsPath = extractTomlValue(raw, "docs", "path");
25
+ const cyclesScanPrompt = extractTomlValue(raw, "cycles", "scan_prompt");
26
+ const cyclesAgents = extractTomlValue(raw, "cycles", "agents");
27
+ const cyclesModel = extractTomlValue(raw, "cycles", "model");
28
+ return {
29
+ docs: {
30
+ path: docsPath ?? DEFAULT_CONFIG.docs.path,
31
+ },
32
+ cycles: {
33
+ scanPrompt: cyclesScanPrompt ?? DEFAULT_CONFIG.cycles.scanPrompt,
34
+ agents: cyclesAgents ? parseInt(cyclesAgents, 10) : DEFAULT_CONFIG.cycles.agents,
35
+ model: cyclesModel ?? DEFAULT_CONFIG.cycles.model,
36
+ },
37
+ };
38
+ }
39
+ catch {
40
+ return DEFAULT_CONFIG;
41
+ }
42
+ };
43
+ /**
44
+ * Extract a value from a simple TOML file.
45
+ * Handles [section] + key = "value" patterns.
46
+ */
47
+ const extractTomlValue = (toml, section, key) => {
48
+ const lines = toml.split("\n");
49
+ let inSection = false;
50
+ for (const line of lines) {
51
+ const trimmed = line.trim();
52
+ // Check for section header
53
+ if (trimmed === `[${section}]`) {
54
+ inSection = true;
55
+ continue;
56
+ }
57
+ // New section starts — stop looking
58
+ if (trimmed.startsWith("[") && inSection) {
59
+ break;
60
+ }
61
+ // Look for key = "value", key = 'value', or key = unquoted
62
+ if (inSection) {
63
+ const quoted = trimmed.match(new RegExp(`^${key}\\s*=\\s*["'](.+?)["']$`));
64
+ if (quoted) {
65
+ return quoted[1];
66
+ }
67
+ const unquoted = trimmed.match(new RegExp(`^${key}\\s*=\\s*([^#\\s]+)`));
68
+ if (unquoted) {
69
+ return unquoted[1];
70
+ }
71
+ }
72
+ }
73
+ return null;
74
+ };
75
+ //# sourceMappingURL=toml-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toml-config.js","sourceRoot":"","sources":["../../src/utils/toml-config.ts"],"names":[],"mappings":"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"}