@they-juanreina/compost-cli 0.1.0-rc.1

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 (362) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +5 -0
  3. package/bin/compost.js +7 -0
  4. package/dist/commands/_stub.d.ts +9 -0
  5. package/dist/commands/_stub.d.ts.map +1 -0
  6. package/dist/commands/_stub.js +27 -0
  7. package/dist/commands/_stub.js.map +1 -0
  8. package/dist/commands/blame.d.ts +3 -0
  9. package/dist/commands/blame.d.ts.map +1 -0
  10. package/dist/commands/blame.js +31 -0
  11. package/dist/commands/blame.js.map +1 -0
  12. package/dist/commands/chat.d.ts +8 -0
  13. package/dist/commands/chat.d.ts.map +1 -0
  14. package/dist/commands/chat.js +99 -0
  15. package/dist/commands/chat.js.map +1 -0
  16. package/dist/commands/code.d.ts +3 -0
  17. package/dist/commands/code.d.ts.map +1 -0
  18. package/dist/commands/code.js +70 -0
  19. package/dist/commands/code.js.map +1 -0
  20. package/dist/commands/config.d.ts +3 -0
  21. package/dist/commands/config.d.ts.map +1 -0
  22. package/dist/commands/config.js +76 -0
  23. package/dist/commands/config.js.map +1 -0
  24. package/dist/commands/create.d.ts +20 -0
  25. package/dist/commands/create.d.ts.map +1 -0
  26. package/dist/commands/create.js +148 -0
  27. package/dist/commands/create.js.map +1 -0
  28. package/dist/commands/endorse.d.ts +3 -0
  29. package/dist/commands/endorse.d.ts.map +1 -0
  30. package/dist/commands/endorse.js +31 -0
  31. package/dist/commands/endorse.js.map +1 -0
  32. package/dist/commands/evals.d.ts +3 -0
  33. package/dist/commands/evals.d.ts.map +1 -0
  34. package/dist/commands/evals.js +54 -0
  35. package/dist/commands/evals.js.map +1 -0
  36. package/dist/commands/export.d.ts +3 -0
  37. package/dist/commands/export.d.ts.map +1 -0
  38. package/dist/commands/export.js +54 -0
  39. package/dist/commands/export.js.map +1 -0
  40. package/dist/commands/ingest.d.ts +3 -0
  41. package/dist/commands/ingest.d.ts.map +1 -0
  42. package/dist/commands/ingest.js +26 -0
  43. package/dist/commands/ingest.js.map +1 -0
  44. package/dist/commands/init.d.ts +3 -0
  45. package/dist/commands/init.d.ts.map +1 -0
  46. package/dist/commands/init.js +51 -0
  47. package/dist/commands/init.js.map +1 -0
  48. package/dist/commands/migrate.d.ts +3 -0
  49. package/dist/commands/migrate.d.ts.map +1 -0
  50. package/dist/commands/migrate.js +28 -0
  51. package/dist/commands/migrate.js.map +1 -0
  52. package/dist/commands/models.d.ts +3 -0
  53. package/dist/commands/models.d.ts.map +1 -0
  54. package/dist/commands/models.js +32 -0
  55. package/dist/commands/models.js.map +1 -0
  56. package/dist/commands/query.d.ts +3 -0
  57. package/dist/commands/query.d.ts.map +1 -0
  58. package/dist/commands/query.js +13 -0
  59. package/dist/commands/query.js.map +1 -0
  60. package/dist/commands/reindex.d.ts +3 -0
  61. package/dist/commands/reindex.d.ts.map +1 -0
  62. package/dist/commands/reindex.js +53 -0
  63. package/dist/commands/reindex.js.map +1 -0
  64. package/dist/commands/rescan.d.ts +3 -0
  65. package/dist/commands/rescan.d.ts.map +1 -0
  66. package/dist/commands/rescan.js +60 -0
  67. package/dist/commands/rescan.js.map +1 -0
  68. package/dist/commands/saturate.d.ts +3 -0
  69. package/dist/commands/saturate.d.ts.map +1 -0
  70. package/dist/commands/saturate.js +35 -0
  71. package/dist/commands/saturate.js.map +1 -0
  72. package/dist/commands/search.d.ts +3 -0
  73. package/dist/commands/search.d.ts.map +1 -0
  74. package/dist/commands/search.js +52 -0
  75. package/dist/commands/search.js.map +1 -0
  76. package/dist/commands/serve.d.ts +3 -0
  77. package/dist/commands/serve.d.ts.map +1 -0
  78. package/dist/commands/serve.js +9 -0
  79. package/dist/commands/serve.js.map +1 -0
  80. package/dist/commands/session.d.ts +3 -0
  81. package/dist/commands/session.d.ts.map +1 -0
  82. package/dist/commands/session.js +25 -0
  83. package/dist/commands/session.js.map +1 -0
  84. package/dist/commands/setup.d.ts +3 -0
  85. package/dist/commands/setup.d.ts.map +1 -0
  86. package/dist/commands/setup.js +38 -0
  87. package/dist/commands/setup.js.map +1 -0
  88. package/dist/commands/snap.d.ts +3 -0
  89. package/dist/commands/snap.d.ts.map +1 -0
  90. package/dist/commands/snap.js +27 -0
  91. package/dist/commands/snap.js.map +1 -0
  92. package/dist/commands/status.d.ts +3 -0
  93. package/dist/commands/status.d.ts.map +1 -0
  94. package/dist/commands/status.js +26 -0
  95. package/dist/commands/status.js.map +1 -0
  96. package/dist/commands/synthesize.d.ts +3 -0
  97. package/dist/commands/synthesize.d.ts.map +1 -0
  98. package/dist/commands/synthesize.js +13 -0
  99. package/dist/commands/synthesize.js.map +1 -0
  100. package/dist/commands/tag.d.ts +3 -0
  101. package/dist/commands/tag.d.ts.map +1 -0
  102. package/dist/commands/tag.js +46 -0
  103. package/dist/commands/tag.js.map +1 -0
  104. package/dist/commands/transcribe.d.ts +3 -0
  105. package/dist/commands/transcribe.d.ts.map +1 -0
  106. package/dist/commands/transcribe.js +110 -0
  107. package/dist/commands/transcribe.js.map +1 -0
  108. package/dist/commands/validate.d.ts +3 -0
  109. package/dist/commands/validate.d.ts.map +1 -0
  110. package/dist/commands/validate.js +81 -0
  111. package/dist/commands/validate.js.map +1 -0
  112. package/dist/commands/watch.d.ts +3 -0
  113. package/dist/commands/watch.d.ts.map +1 -0
  114. package/dist/commands/watch.js +50 -0
  115. package/dist/commands/watch.js.map +1 -0
  116. package/dist/errors.d.ts +9 -0
  117. package/dist/errors.d.ts.map +1 -0
  118. package/dist/errors.js +12 -0
  119. package/dist/errors.js.map +1 -0
  120. package/dist/exporters/csv.d.ts +8 -0
  121. package/dist/exporters/csv.d.ts.map +1 -0
  122. package/dist/exporters/csv.js +44 -0
  123. package/dist/exporters/csv.js.map +1 -0
  124. package/dist/exporters/eaf.d.ts +3 -0
  125. package/dist/exporters/eaf.d.ts.map +1 -0
  126. package/dist/exporters/eaf.js +91 -0
  127. package/dist/exporters/eaf.js.map +1 -0
  128. package/dist/exporters/html.d.ts +8 -0
  129. package/dist/exporters/html.d.ts.map +1 -0
  130. package/dist/exporters/html.js +47 -0
  131. package/dist/exporters/html.js.map +1 -0
  132. package/dist/exporters/md.d.ts +3 -0
  133. package/dist/exporters/md.d.ts.map +1 -0
  134. package/dist/exporters/md.js +43 -0
  135. package/dist/exporters/md.js.map +1 -0
  136. package/dist/exporters/pdf.d.ts +9 -0
  137. package/dist/exporters/pdf.d.ts.map +1 -0
  138. package/dist/exporters/pdf.js +40 -0
  139. package/dist/exporters/pdf.js.map +1 -0
  140. package/dist/exporters/report.d.ts +43 -0
  141. package/dist/exporters/report.d.ts.map +1 -0
  142. package/dist/exporters/report.js +49 -0
  143. package/dist/exporters/report.js.map +1 -0
  144. package/dist/index.d.ts +2 -0
  145. package/dist/index.d.ts.map +1 -0
  146. package/dist/index.js +6 -0
  147. package/dist/index.js.map +1 -0
  148. package/dist/legacy_client.d.ts +38 -0
  149. package/dist/legacy_client.d.ts.map +1 -0
  150. package/dist/legacy_client.js +44 -0
  151. package/dist/legacy_client.js.map +1 -0
  152. package/dist/lib/answerSchema.d.ts +2 -0
  153. package/dist/lib/answerSchema.d.ts.map +1 -0
  154. package/dist/lib/answerSchema.js +27 -0
  155. package/dist/lib/answerSchema.js.map +1 -0
  156. package/dist/lib/artifacts.d.ts +64 -0
  157. package/dist/lib/artifacts.d.ts.map +1 -0
  158. package/dist/lib/artifacts.js +254 -0
  159. package/dist/lib/artifacts.js.map +1 -0
  160. package/dist/lib/blame.d.ts +30 -0
  161. package/dist/lib/blame.d.ts.map +1 -0
  162. package/dist/lib/blame.js +164 -0
  163. package/dist/lib/blame.js.map +1 -0
  164. package/dist/lib/canonicalSessions.d.ts +24 -0
  165. package/dist/lib/canonicalSessions.d.ts.map +1 -0
  166. package/dist/lib/canonicalSessions.js +48 -0
  167. package/dist/lib/canonicalSessions.js.map +1 -0
  168. package/dist/lib/chat.d.ts +24 -0
  169. package/dist/lib/chat.d.ts.map +1 -0
  170. package/dist/lib/chat.js +50 -0
  171. package/dist/lib/chat.js.map +1 -0
  172. package/dist/lib/config.d.ts +45 -0
  173. package/dist/lib/config.d.ts.map +1 -0
  174. package/dist/lib/config.js +143 -0
  175. package/dist/lib/config.js.map +1 -0
  176. package/dist/lib/dispatch.d.ts +10 -0
  177. package/dist/lib/dispatch.d.ts.map +1 -0
  178. package/dist/lib/dispatch.js +31 -0
  179. package/dist/lib/dispatch.js.map +1 -0
  180. package/dist/lib/doctor.d.ts +19 -0
  181. package/dist/lib/doctor.d.ts.map +1 -0
  182. package/dist/lib/doctor.js +43 -0
  183. package/dist/lib/doctor.js.map +1 -0
  184. package/dist/lib/events.d.ts +42 -0
  185. package/dist/lib/events.d.ts.map +1 -0
  186. package/dist/lib/events.js +57 -0
  187. package/dist/lib/events.js.map +1 -0
  188. package/dist/lib/export.d.ts +14 -0
  189. package/dist/lib/export.d.ts.map +1 -0
  190. package/dist/lib/export.js +36 -0
  191. package/dist/lib/export.js.map +1 -0
  192. package/dist/lib/ingest.d.ts +21 -0
  193. package/dist/lib/ingest.d.ts.map +1 -0
  194. package/dist/lib/ingest.js +68 -0
  195. package/dist/lib/ingest.js.map +1 -0
  196. package/dist/lib/journal.d.ts +23 -0
  197. package/dist/lib/journal.d.ts.map +1 -0
  198. package/dist/lib/journal.js +95 -0
  199. package/dist/lib/journal.js.map +1 -0
  200. package/dist/lib/migrate.d.ts +29 -0
  201. package/dist/lib/migrate.d.ts.map +1 -0
  202. package/dist/lib/migrate.js +117 -0
  203. package/dist/lib/migrate.js.map +1 -0
  204. package/dist/lib/nativeRuntime.d.ts +46 -0
  205. package/dist/lib/nativeRuntime.d.ts.map +1 -0
  206. package/dist/lib/nativeRuntime.js +61 -0
  207. package/dist/lib/nativeRuntime.js.map +1 -0
  208. package/dist/lib/provisionNative.d.ts +46 -0
  209. package/dist/lib/provisionNative.d.ts.map +1 -0
  210. package/dist/lib/provisionNative.js +105 -0
  211. package/dist/lib/provisionNative.js.map +1 -0
  212. package/dist/lib/queue.d.ts +36 -0
  213. package/dist/lib/queue.d.ts.map +1 -0
  214. package/dist/lib/queue.js +102 -0
  215. package/dist/lib/queue.js.map +1 -0
  216. package/dist/lib/retrieve.d.ts +51 -0
  217. package/dist/lib/retrieve.d.ts.map +1 -0
  218. package/dist/lib/retrieve.js +92 -0
  219. package/dist/lib/retrieve.js.map +1 -0
  220. package/dist/lib/saturate.d.ts +21 -0
  221. package/dist/lib/saturate.d.ts.map +1 -0
  222. package/dist/lib/saturate.js +132 -0
  223. package/dist/lib/saturate.js.map +1 -0
  224. package/dist/lib/schemas.generated.d.ts +15 -0
  225. package/dist/lib/schemas.generated.d.ts.map +1 -0
  226. package/dist/lib/schemas.generated.js +975 -0
  227. package/dist/lib/schemas.generated.js.map +1 -0
  228. package/dist/lib/seed.d.ts +16 -0
  229. package/dist/lib/seed.d.ts.map +1 -0
  230. package/dist/lib/seed.js +64 -0
  231. package/dist/lib/seed.js.map +1 -0
  232. package/dist/lib/seedResolve.d.ts +6 -0
  233. package/dist/lib/seedResolve.d.ts.map +1 -0
  234. package/dist/lib/seedResolve.js +27 -0
  235. package/dist/lib/seedResolve.js.map +1 -0
  236. package/dist/lib/session.d.ts +19 -0
  237. package/dist/lib/session.d.ts.map +1 -0
  238. package/dist/lib/session.js +61 -0
  239. package/dist/lib/session.js.map +1 -0
  240. package/dist/lib/setup.d.ts +44 -0
  241. package/dist/lib/setup.d.ts.map +1 -0
  242. package/dist/lib/setup.js +249 -0
  243. package/dist/lib/setup.js.map +1 -0
  244. package/dist/lib/snap.d.ts +15 -0
  245. package/dist/lib/snap.d.ts.map +1 -0
  246. package/dist/lib/snap.js +115 -0
  247. package/dist/lib/snap.js.map +1 -0
  248. package/dist/lib/status.d.ts +39 -0
  249. package/dist/lib/status.d.ts.map +1 -0
  250. package/dist/lib/status.js +174 -0
  251. package/dist/lib/status.js.map +1 -0
  252. package/dist/lib/tagcode.d.ts +26 -0
  253. package/dist/lib/tagcode.d.ts.map +1 -0
  254. package/dist/lib/tagcode.js +231 -0
  255. package/dist/lib/tagcode.js.map +1 -0
  256. package/dist/lib/templates.d.ts +3 -0
  257. package/dist/lib/templates.d.ts.map +1 -0
  258. package/dist/lib/templates.js +21 -0
  259. package/dist/lib/templates.js.map +1 -0
  260. package/dist/lib/transcribeNative.d.ts +44 -0
  261. package/dist/lib/transcribeNative.d.ts.map +1 -0
  262. package/dist/lib/transcribeNative.js +53 -0
  263. package/dist/lib/transcribeNative.js.map +1 -0
  264. package/dist/lib/transcript.d.ts +68 -0
  265. package/dist/lib/transcript.d.ts.map +1 -0
  266. package/dist/lib/transcript.js +10 -0
  267. package/dist/lib/transcript.js.map +1 -0
  268. package/dist/lib/validate.d.ts +16 -0
  269. package/dist/lib/validate.d.ts.map +1 -0
  270. package/dist/lib/validate.js +155 -0
  271. package/dist/lib/validate.js.map +1 -0
  272. package/dist/llm/adapter.d.ts +33 -0
  273. package/dist/llm/adapter.d.ts.map +1 -0
  274. package/dist/llm/adapter.js +106 -0
  275. package/dist/llm/adapter.js.map +1 -0
  276. package/dist/llm/http.d.ts +9 -0
  277. package/dist/llm/http.d.ts.map +1 -0
  278. package/dist/llm/http.js +56 -0
  279. package/dist/llm/http.js.map +1 -0
  280. package/dist/llm/providers/anthropic.d.ts +14 -0
  281. package/dist/llm/providers/anthropic.d.ts.map +1 -0
  282. package/dist/llm/providers/anthropic.js +66 -0
  283. package/dist/llm/providers/anthropic.js.map +1 -0
  284. package/dist/llm/providers/lmstudio.d.ts +7 -0
  285. package/dist/llm/providers/lmstudio.d.ts.map +1 -0
  286. package/dist/llm/providers/lmstudio.js +8 -0
  287. package/dist/llm/providers/lmstudio.js.map +1 -0
  288. package/dist/llm/providers/ollama.d.ts +12 -0
  289. package/dist/llm/providers/ollama.d.ts.map +1 -0
  290. package/dist/llm/providers/ollama.js +87 -0
  291. package/dist/llm/providers/ollama.js.map +1 -0
  292. package/dist/llm/providers/openai.d.ts +7 -0
  293. package/dist/llm/providers/openai.d.ts.map +1 -0
  294. package/dist/llm/providers/openai.js +8 -0
  295. package/dist/llm/providers/openai.js.map +1 -0
  296. package/dist/llm/providers/openai_compatible.d.ts +18 -0
  297. package/dist/llm/providers/openai_compatible.d.ts.map +1 -0
  298. package/dist/llm/providers/openai_compatible.js +70 -0
  299. package/dist/llm/providers/openai_compatible.js.map +1 -0
  300. package/dist/llm/types.d.ts +60 -0
  301. package/dist/llm/types.d.ts.map +1 -0
  302. package/dist/llm/types.js +2 -0
  303. package/dist/llm/types.js.map +1 -0
  304. package/dist/logging.d.ts +22 -0
  305. package/dist/logging.d.ts.map +1 -0
  306. package/dist/logging.js +58 -0
  307. package/dist/logging.js.map +1 -0
  308. package/dist/loops/embed_worker.d.ts +44 -0
  309. package/dist/loops/embed_worker.d.ts.map +1 -0
  310. package/dist/loops/embed_worker.js +144 -0
  311. package/dist/loops/embed_worker.js.map +1 -0
  312. package/dist/loops/eval_grader.d.ts +19 -0
  313. package/dist/loops/eval_grader.d.ts.map +1 -0
  314. package/dist/loops/eval_grader.js +22 -0
  315. package/dist/loops/eval_grader.js.map +1 -0
  316. package/dist/loops/ingest_watcher.d.ts +17 -0
  317. package/dist/loops/ingest_watcher.d.ts.map +1 -0
  318. package/dist/loops/ingest_watcher.js +66 -0
  319. package/dist/loops/ingest_watcher.js.map +1 -0
  320. package/dist/loops/legacy_worker.d.ts +26 -0
  321. package/dist/loops/legacy_worker.d.ts.map +1 -0
  322. package/dist/loops/legacy_worker.js +102 -0
  323. package/dist/loops/legacy_worker.js.map +1 -0
  324. package/dist/loops/supervisor.d.ts +71 -0
  325. package/dist/loops/supervisor.d.ts.map +1 -0
  326. package/dist/loops/supervisor.js +122 -0
  327. package/dist/loops/supervisor.js.map +1 -0
  328. package/dist/loops/synthesis.d.ts +31 -0
  329. package/dist/loops/synthesis.d.ts.map +1 -0
  330. package/dist/loops/synthesis.js +71 -0
  331. package/dist/loops/synthesis.js.map +1 -0
  332. package/dist/loops/transcribe_worker.d.ts +22 -0
  333. package/dist/loops/transcribe_worker.d.ts.map +1 -0
  334. package/dist/loops/transcribe_worker.js +77 -0
  335. package/dist/loops/transcribe_worker.js.map +1 -0
  336. package/dist/output.d.ts +8 -0
  337. package/dist/output.d.ts.map +1 -0
  338. package/dist/output.js +26 -0
  339. package/dist/output.js.map +1 -0
  340. package/dist/render/transcript_md.d.ts +5 -0
  341. package/dist/render/transcript_md.d.ts.map +1 -0
  342. package/dist/render/transcript_md.js +14 -0
  343. package/dist/render/transcript_md.js.map +1 -0
  344. package/dist/router.d.ts +3 -0
  345. package/dist/router.d.ts.map +1 -0
  346. package/dist/router.js +68 -0
  347. package/dist/router.js.map +1 -0
  348. package/dist/transcriber_client.d.ts +42 -0
  349. package/dist/transcriber_client.d.ts.map +1 -0
  350. package/dist/transcriber_client.js +72 -0
  351. package/dist/transcriber_client.js.map +1 -0
  352. package/package.json +45 -0
  353. package/templates/AGENTS.md +25 -0
  354. package/templates/config.toml +56 -0
  355. package/templates/sample-seed/codebook/desire-for-manual-override.md +8 -0
  356. package/templates/sample-seed/codebook/distrust-of-automation.md +8 -0
  357. package/templates/sample-seed/highlights/H-001.md +9 -0
  358. package/templates/sample-seed/highlights/H-002.md +9 -0
  359. package/templates/sample-seed/seed.md +17 -0
  360. package/templates/sample-seed/sessions/S001/transcript.json +74 -0
  361. package/templates/sample-seed/synthesis/themes/control-earns-trust.md +13 -0
  362. package/templates/seed.md +21 -0
@@ -0,0 +1,115 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { CompostError } from '../errors.js';
5
+ const FRAME_WIDTH = 640;
6
+ const FRAME_HEIGHT = 360;
7
+ /** Parse mm:ss, hh:mm:ss, or raw ms (integer) into milliseconds. */
8
+ export function parseTimestamp(input) {
9
+ const raw = input.trim();
10
+ if (/^\d+$/.test(raw))
11
+ return Number(raw);
12
+ const parts = raw.split(':');
13
+ if (parts.length === 2 || parts.length === 3) {
14
+ const nums = parts.map((p) => {
15
+ if (!/^\d+(\.\d+)?$/.test(p))
16
+ throw new CompostError('INVALID_INPUT', `Bad time component "${p}"`);
17
+ return Number(p);
18
+ });
19
+ let seconds = 0;
20
+ if (nums.length === 3)
21
+ seconds = nums[0] * 3600 + nums[1] * 60 + nums[2];
22
+ else
23
+ seconds = nums[0] * 60 + nums[1];
24
+ return Math.round(seconds * 1000);
25
+ }
26
+ throw new CompostError('INVALID_INPUT', `Unrecognized timestamp "${input}" (use ms, mm:ss, or hh:mm:ss)`);
27
+ }
28
+ function padMs(ms) {
29
+ return String(ms).padStart(9, '0');
30
+ }
31
+ function findSource(sessionDir) {
32
+ if (!existsSync(sessionDir))
33
+ return null;
34
+ const match = readdirSync(sessionDir).find((f) => f.startsWith('source.'));
35
+ return match !== undefined ? join(sessionDir, match) : null;
36
+ }
37
+ function hasVideoStream(path, runner) {
38
+ try {
39
+ const out = runner('ffprobe', [
40
+ '-v',
41
+ 'error',
42
+ '-select_streams',
43
+ 'v:0',
44
+ '-show_entries',
45
+ 'stream=codec_type',
46
+ '-of',
47
+ 'csv=p=0',
48
+ path,
49
+ ]);
50
+ return out.trim().includes('video');
51
+ }
52
+ catch {
53
+ return false;
54
+ }
55
+ }
56
+ const defaultRunner = (cmd, args) => execFileSync(cmd, args, { encoding: 'utf8' });
57
+ export function snap(seedPath, sessionId, at, opts = {}) {
58
+ const runner = opts.runner ?? defaultRunner;
59
+ const atMs = parseTimestamp(at);
60
+ const sessionDir = join(seedPath, 'sessions', sessionId);
61
+ const source = findSource(sessionDir);
62
+ if (source === null) {
63
+ throw new CompostError('FILE_NOT_FOUND', `No source media in ${sessionDir}`);
64
+ }
65
+ if (!hasVideoStream(source, runner)) {
66
+ throw new CompostError('INVALID_INPUT', `${source} has no video stream; cannot snap a frame`);
67
+ }
68
+ const rel = `sessions/${sessionId}/frames/${padMs(atMs)}.jpg`;
69
+ const absPath = join(seedPath, rel);
70
+ const frameId = `FR-${padMs(atMs)}`;
71
+ if (existsSync(absPath)) {
72
+ return { session_id: sessionId, frame_id: frameId, at_ms: atMs, path: rel, existed: true };
73
+ }
74
+ mkdirSync(join(sessionDir, 'frames'), { recursive: true });
75
+ runner('ffmpeg', [
76
+ '-y',
77
+ '-ss',
78
+ (atMs / 1000).toFixed(3),
79
+ '-i',
80
+ source,
81
+ '-frames:v',
82
+ '1',
83
+ '-vf',
84
+ `scale=${FRAME_WIDTH}:${FRAME_HEIGHT}`,
85
+ '-q:v',
86
+ '4',
87
+ absPath,
88
+ ]);
89
+ if (!existsSync(absPath)) {
90
+ throw new CompostError('IO_ERROR', `ffmpeg did not produce a frame at ${atMs}ms`);
91
+ }
92
+ indexFrame(sessionDir, { id: frameId, at_ms: atMs, path: rel, trigger: 'manual' });
93
+ return { session_id: sessionId, frame_id: frameId, at_ms: atMs, path: rel, existed: false };
94
+ }
95
+ /** Append a frame entry to transcript.json frames[] when present, otherwise to
96
+ * a frames.json sidecar that the transcriber merges on the next run. */
97
+ function indexFrame(sessionDir, entry) {
98
+ const transcriptPath = join(sessionDir, 'transcript.json');
99
+ if (existsSync(transcriptPath)) {
100
+ const t = JSON.parse(readFileSync(transcriptPath, 'utf8'));
101
+ t.frames = t.frames ?? [];
102
+ if (!t.frames.some((f) => f.id === entry.id))
103
+ t.frames.push(entry);
104
+ writeFileSync(transcriptPath, `${JSON.stringify(t, null, 2)}\n`, 'utf8');
105
+ return;
106
+ }
107
+ const sidecar = join(sessionDir, 'frames.json');
108
+ const frames = existsSync(sidecar)
109
+ ? JSON.parse(readFileSync(sidecar, 'utf8'))
110
+ : [];
111
+ if (!frames.some((f) => f.id === entry.id))
112
+ frames.push(entry);
113
+ writeFileSync(sidecar, `${JSON.stringify(frames, null, 2)}\n`, 'utf8');
114
+ }
115
+ //# sourceMappingURL=snap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snap.js","sourceRoot":"","sources":["../../src/lib/snap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ export interface SessionCounts {
2
+ total: number;
3
+ transcribed: number;
4
+ queued: number;
5
+ inbox: number;
6
+ }
7
+ export interface SeedCounts {
8
+ sessions: SessionCounts;
9
+ highlights: number;
10
+ codes: number;
11
+ themes: number;
12
+ frames: number;
13
+ insights: number;
14
+ legacy_assets: number;
15
+ }
16
+ export interface SeedStatus {
17
+ name: string;
18
+ path: string;
19
+ status: string | null;
20
+ owners: string[];
21
+ created_at: string | null;
22
+ counts: SeedCounts;
23
+ /** Non-canonical content found under the seed (e.g. legacy folders that
24
+ * survived migration). Empty when the seed is clean. */
25
+ warnings: string[];
26
+ }
27
+ export interface StatusSnapshot {
28
+ schema_version: '1.0';
29
+ generated_at: string;
30
+ root: string;
31
+ seeds: SeedStatus[];
32
+ }
33
+ export interface StatusOptions {
34
+ cwd?: string;
35
+ seed?: string;
36
+ now?: () => Date;
37
+ }
38
+ export declare function gatherStatus(opts?: StatusOptions): StatusSnapshot;
39
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/lib/status.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,aAAa,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,MAAM,EAAE,UAAU,CAAA;IAClB;4DACwD;IACxD,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,KAAK,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,UAAU,EAAE,CAAA;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;CACjB;AAED,wBAAgB,YAAY,CAAC,IAAI,GAAE,aAAkB,GAAG,cAAc,CAgCrE"}
@@ -0,0 +1,174 @@
1
+ import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
2
+ import { join, resolve } from 'node:path';
3
+ import { CompostError } from '../errors.js';
4
+ import { isCanonicalSession } from './canonicalSessions.js';
5
+ export function gatherStatus(opts = {}) {
6
+ const cwd = opts.cwd ?? process.cwd();
7
+ const now = (opts.now ?? (() => new Date()))();
8
+ const root = resolve(cwd, 'Seeds');
9
+ if (!existsSync(root)) {
10
+ throw new CompostError('NOT_IN_SEED', `No Seeds/ directory at ${root}. Run \`compost init <name>\` first.`);
11
+ }
12
+ const seedNames = readdirSync(root).filter((entry) => {
13
+ if (entry.startsWith('.'))
14
+ return false;
15
+ return statSync(join(root, entry)).isDirectory();
16
+ });
17
+ const filtered = opts.seed !== undefined ? seedNames.filter((n) => n === opts.seed) : seedNames;
18
+ if (opts.seed !== undefined && filtered.length === 0) {
19
+ throw new CompostError('NOT_IN_SEED', `Seed "${opts.seed}" not found under ${root}`);
20
+ }
21
+ filtered.sort();
22
+ const seeds = filtered.map((name) => readSeed(name, join(root, name)));
23
+ return {
24
+ schema_version: '1.0',
25
+ generated_at: now.toISOString(),
26
+ root,
27
+ seeds,
28
+ };
29
+ }
30
+ function readSeed(name, path) {
31
+ const frontmatter = readFrontmatter(join(path, 'seed.md'));
32
+ const warnings = [];
33
+ return {
34
+ name,
35
+ path,
36
+ status: frontmatter.status ?? null,
37
+ owners: frontmatter.owners ?? [],
38
+ created_at: frontmatter.created_at ?? null,
39
+ counts: {
40
+ sessions: countSessions(join(path, 'sessions'), warnings),
41
+ highlights: countMarkdown(join(path, 'highlights')),
42
+ codes: countMarkdown(join(path, 'codebook')),
43
+ themes: countMarkdown(join(path, 'synthesis', 'themes')),
44
+ insights: countMarkdown(join(path, 'synthesis', 'insights')),
45
+ frames: countFrames(join(path, 'sessions')),
46
+ legacy_assets: countFiles(join(path, 'legacy')),
47
+ },
48
+ warnings,
49
+ };
50
+ }
51
+ function countSessions(sessionsDir, warnings) {
52
+ const counts = { total: 0, transcribed: 0, queued: 0, inbox: 0 };
53
+ if (!existsSync(sessionsDir))
54
+ return counts;
55
+ for (const entry of readdirSync(sessionsDir)) {
56
+ const abs = join(sessionsDir, entry);
57
+ if (!statSync(abs).isDirectory())
58
+ continue;
59
+ if (entry === '_inbox') {
60
+ counts.inbox = readdirSync(abs).filter((f) => !f.startsWith('.')).length;
61
+ continue;
62
+ }
63
+ if (!isCanonicalSession(abs, entry)) {
64
+ warnings.push(`sessions/${entry}: not a canonical session shape (skipped)`);
65
+ continue;
66
+ }
67
+ counts.total += 1;
68
+ if (existsSync(join(abs, 'transcript.json')))
69
+ counts.transcribed += 1;
70
+ else
71
+ counts.queued += 1;
72
+ }
73
+ return counts;
74
+ }
75
+ function countMarkdown(dir) {
76
+ if (!existsSync(dir))
77
+ return 0;
78
+ let total = 0;
79
+ for (const entry of readdirSync(dir)) {
80
+ if (entry.startsWith('.'))
81
+ continue;
82
+ const abs = join(dir, entry);
83
+ const s = statSync(abs);
84
+ if (s.isFile() && entry.endsWith('.md') && entry.toLowerCase() !== 'readme.md')
85
+ total += 1;
86
+ else if (s.isDirectory())
87
+ total += countMarkdown(abs);
88
+ }
89
+ return total;
90
+ }
91
+ function countFiles(dir) {
92
+ if (!existsSync(dir))
93
+ return 0;
94
+ let total = 0;
95
+ for (const entry of readdirSync(dir)) {
96
+ if (entry.startsWith('.'))
97
+ continue;
98
+ const abs = join(dir, entry);
99
+ const s = statSync(abs);
100
+ if (s.isFile())
101
+ total += 1;
102
+ else if (s.isDirectory())
103
+ total += countFiles(abs);
104
+ }
105
+ return total;
106
+ }
107
+ function countFrames(sessionsDir) {
108
+ if (!existsSync(sessionsDir))
109
+ return 0;
110
+ let total = 0;
111
+ for (const entry of readdirSync(sessionsDir)) {
112
+ if (entry === '_inbox')
113
+ continue;
114
+ const framesDir = join(sessionsDir, entry, 'frames');
115
+ if (!existsSync(framesDir))
116
+ continue;
117
+ total += readdirSync(framesDir).filter((f) => /\.(jpg|jpeg|png)$/i.test(f)).length;
118
+ }
119
+ return total;
120
+ }
121
+ function readFrontmatter(path) {
122
+ if (!existsSync(path))
123
+ return {};
124
+ const content = readFileSync(path, 'utf8');
125
+ const match = content.match(/^---\n([\s\S]*?)\n---/);
126
+ if (match === null)
127
+ return {};
128
+ return parseSimpleYaml(match[1] ?? '');
129
+ }
130
+ function parseSimpleYaml(yaml) {
131
+ const out = {};
132
+ const lines = yaml.split('\n');
133
+ for (const line of lines) {
134
+ const m = line.match(/^([A-Za-z_][A-Za-z0-9_-]*):\s*(.*)$/);
135
+ if (m === null)
136
+ continue;
137
+ const key = m[1];
138
+ const value = (m[2] ?? '').trim();
139
+ if (key === undefined)
140
+ continue;
141
+ if (key === 'status' && value.length > 0) {
142
+ out.status = stripQuotes(value);
143
+ }
144
+ else if (key === 'created_at' && value.length > 0) {
145
+ out.created_at = stripQuotes(value);
146
+ }
147
+ else if (key === 'owners') {
148
+ out.owners = parseOwners(value);
149
+ }
150
+ }
151
+ return out;
152
+ }
153
+ function stripQuotes(s) {
154
+ if ((s.startsWith('"') && s.endsWith('"')) || (s.startsWith("'") && s.endsWith("'"))) {
155
+ return s.slice(1, -1);
156
+ }
157
+ return s;
158
+ }
159
+ function parseOwners(value) {
160
+ const trimmed = value.trim();
161
+ if (trimmed.length === 0 || trimmed === '[]')
162
+ return [];
163
+ const inline = trimmed.match(/^\[(.*)\]$/);
164
+ const body = inline?.[1];
165
+ if (body !== undefined) {
166
+ return body
167
+ .split(',')
168
+ .map((part) => stripQuotes(part.trim()))
169
+ .filter((s) => s.length > 0);
170
+ }
171
+ // Flow-style only for v1 — block-style "- name" lists not yet supported.
172
+ return [];
173
+ }
174
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/lib/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export interface TermSuggestion {
2
+ term_id: string;
3
+ phrase: string;
4
+ count: number;
5
+ }
6
+ /** Extract candidate glossary terms: multiword phrases (2-3 tokens) that recur
7
+ * >= minCount times across utterances. Phrases are dropped when ANY token is
8
+ * a stopword (grammatical glue / filler) OR contains a digit (timestamp noise). */
9
+ export declare function suggestTerms(utterances: Array<{
10
+ text: string;
11
+ }>, opts?: {
12
+ minCount?: number;
13
+ }): TermSuggestion[];
14
+ export interface TagResult {
15
+ suggested: TermSuggestion[];
16
+ applied: boolean;
17
+ }
18
+ /** Suggest terms; with apply=true, write them to glossary/glossary.md and emit
19
+ * agent create events. */
20
+ export declare function tagSeed(seedPath: string, utterances: Array<{
21
+ text: string;
22
+ }>, opts?: {
23
+ apply?: boolean;
24
+ minCount?: number;
25
+ }): TagResult;
26
+ //# sourceMappingURL=tagcode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tagcode.d.ts","sourceRoot":"","sources":["../../src/lib/tagcode.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd;AAsKD;;mFAEmF;AACnF,wBAAgB,YAAY,CAC1B,UAAU,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EACnC,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/B,cAAc,EAAE,CA0BlB;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,cAAc,EAAE,CAAA;IAC3B,OAAO,EAAE,OAAO,CAAA;CACjB;AAED;0BAC0B;AAC1B,wBAAgB,OAAO,CACrB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EACnC,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAChD,SAAS,CA8BX"}
@@ -0,0 +1,231 @@
1
+ import { appendFileSync, existsSync, mkdirSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { emitAgentCreate, openSeedEvents } from './events.js';
4
+ // `compost tag` / `compost code` (#49): suggest (default) or --apply glossary
5
+ // terms and codes. Term suggestion is a deterministic recurring-noun-phrase
6
+ // extractor; code suggestion reuses the similarity scanner. Suggestions are
7
+ // AI/agent [draft] events until applied/endorsed.
8
+ const AGENT = 'tagger';
9
+ const VERSION = '0.1.0';
10
+ // Function words, modals, pronouns, common conversational fillers (EN + ES) —
11
+ // any phrase touching one of these is dropped. Scoped to grammatical glue and
12
+ // filler; content nouns/verbs/adjectives don't appear here, so legitimate noun
13
+ // phrases ("manual override", "alerta automática") survive (#171). The pre-fix
14
+ // list was 24 tokens and only dropped *all-stopword* phrases, so "you know"
15
+ // (64), "and like" (40), "right like" (38) leaked into glossary suggestions.
16
+ const STOPWORDS = new Set([
17
+ // EN — fillers, modals, pronouns, common helpers
18
+ 'the',
19
+ 'and',
20
+ 'but',
21
+ 'for',
22
+ 'with',
23
+ 'that',
24
+ 'this',
25
+ 'these',
26
+ 'those',
27
+ 'you',
28
+ 'your',
29
+ 'yours',
30
+ 'his',
31
+ 'her',
32
+ 'hers',
33
+ 'its',
34
+ 'our',
35
+ 'ours',
36
+ 'they',
37
+ 'their',
38
+ 'them',
39
+ 'theirs',
40
+ 'mine',
41
+ 'ours',
42
+ 'are',
43
+ 'was',
44
+ 'were',
45
+ 'been',
46
+ 'being',
47
+ 'have',
48
+ 'has',
49
+ 'had',
50
+ 'having',
51
+ 'will',
52
+ 'would',
53
+ 'could',
54
+ 'should',
55
+ 'can',
56
+ 'may',
57
+ 'might',
58
+ 'must',
59
+ 'into',
60
+ 'onto',
61
+ 'about',
62
+ 'from',
63
+ 'over',
64
+ 'under',
65
+ 'after',
66
+ 'before',
67
+ 'like',
68
+ 'just',
69
+ 'kind',
70
+ 'sort',
71
+ 'know',
72
+ 'mean',
73
+ 'think',
74
+ 'say',
75
+ 'said',
76
+ 'got',
77
+ 'get',
78
+ 'going',
79
+ 'gone',
80
+ 'want',
81
+ 'need',
82
+ 'see',
83
+ 'look',
84
+ 'take',
85
+ 'make',
86
+ 'made',
87
+ 'come',
88
+ 'came',
89
+ 'well',
90
+ 'okay',
91
+ 'right',
92
+ 'yeah',
93
+ 'really',
94
+ 'actually',
95
+ 'maybe',
96
+ // ES — equivalents
97
+ 'una',
98
+ 'unos',
99
+ 'unas',
100
+ 'los',
101
+ 'las',
102
+ 'del',
103
+ 'por',
104
+ 'con',
105
+ 'sin',
106
+ 'que',
107
+ 'qué',
108
+ 'para',
109
+ 'pero',
110
+ 'sino',
111
+ 'como',
112
+ 'más',
113
+ 'muy',
114
+ 'sus',
115
+ 'les',
116
+ 'nos',
117
+ 'mis',
118
+ 'tus',
119
+ 'este',
120
+ 'esta',
121
+ 'estos',
122
+ 'estas',
123
+ 'eso',
124
+ 'esa',
125
+ 'esos',
126
+ 'esas',
127
+ 'ese',
128
+ 'todo',
129
+ 'todos',
130
+ 'toda',
131
+ 'todas',
132
+ 'ser',
133
+ 'estar',
134
+ 'son',
135
+ 'soy',
136
+ 'eres',
137
+ 'era',
138
+ 'eran',
139
+ 'fue',
140
+ 'fueron',
141
+ 'está',
142
+ 'están',
143
+ 'estaba',
144
+ 'estaban',
145
+ 'hay',
146
+ 'había',
147
+ 'hubo',
148
+ 'haya',
149
+ 'voy',
150
+ 'vas',
151
+ 'vamos',
152
+ 'van',
153
+ 'sea',
154
+ 'sean',
155
+ 'pues',
156
+ 'bueno',
157
+ 'vale',
158
+ 'claro',
159
+ 'entonces',
160
+ 'así',
161
+ 'bien',
162
+ 'también',
163
+ 'tampoco',
164
+ 'cuando',
165
+ 'donde',
166
+ 'cómo',
167
+ ]);
168
+ // Pre-fix, "hour minutes seconds1"(78) topped the list — utterance text leaked
169
+ // raw `.srt`-style timecodes. Any candidate token containing a digit is
170
+ // suppressed: that's never a content noun phrase.
171
+ const TOKEN_HAS_DIGIT_RE = /\d/;
172
+ /** Extract candidate glossary terms: multiword phrases (2-3 tokens) that recur
173
+ * >= minCount times across utterances. Phrases are dropped when ANY token is
174
+ * a stopword (grammatical glue / filler) OR contains a digit (timestamp noise). */
175
+ export function suggestTerms(utterances, opts = {}) {
176
+ const minCount = opts.minCount ?? 2;
177
+ const counts = new Map();
178
+ for (const u of utterances) {
179
+ const tokens = u.text
180
+ .toLowerCase()
181
+ .replace(/[^\p{L}\p{N}\s]/gu, ' ')
182
+ .split(/\s+/)
183
+ .filter((t) => t.length > 2);
184
+ for (let n = 2; n <= 3; n++) {
185
+ for (let i = 0; i + n <= tokens.length; i++) {
186
+ const gram = tokens.slice(i, i + n);
187
+ // Drop the candidate when ANY token is a stopword or has a digit —
188
+ // pre-fix this was `every` (drop only when ALL tokens were stopwords),
189
+ // which let "you know" / "and like" through because of the non-stopword
190
+ // partner. Content noun phrases never contain function words or digits.
191
+ if (gram.some((t) => STOPWORDS.has(t) || TOKEN_HAS_DIGIT_RE.test(t)))
192
+ continue;
193
+ const phrase = gram.join(' ');
194
+ counts.set(phrase, (counts.get(phrase) ?? 0) + 1);
195
+ }
196
+ }
197
+ }
198
+ return [...counts.entries()]
199
+ .filter(([, c]) => c >= minCount)
200
+ .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))
201
+ .map(([phrase, count]) => ({ term_id: `T-${phrase.replace(/\s+/g, '-')}`, phrase, count }));
202
+ }
203
+ /** Suggest terms; with apply=true, write them to glossary/glossary.md and emit
204
+ * agent create events. */
205
+ export function tagSeed(seedPath, utterances, opts = {}) {
206
+ const suggested = suggestTerms(utterances, opts.minCount !== undefined ? { minCount: opts.minCount } : {});
207
+ if (opts.apply !== true)
208
+ return { suggested, applied: false };
209
+ const glossaryDir = join(seedPath, 'glossary');
210
+ mkdirSync(glossaryDir, { recursive: true });
211
+ const glossary = join(glossaryDir, 'glossary.md');
212
+ if (!existsSync(glossary))
213
+ writeFileSync(glossary, '# Glossary\n\n', 'utf8');
214
+ const events = openSeedEvents(seedPath);
215
+ try {
216
+ for (const t of suggested) {
217
+ appendFileSync(glossary, `- **${t.phrase}** (\`${t.term_id}\`) — _${t.count} mentions; define me_\n`, 'utf8');
218
+ emitAgentCreate(events, {
219
+ artifactKind: 'term',
220
+ initialState: { term_id: t.term_id, phrase: t.phrase, count: t.count, status: 'draft' },
221
+ agentName: AGENT,
222
+ agentVersion: VERSION,
223
+ });
224
+ }
225
+ }
226
+ finally {
227
+ events.close();
228
+ }
229
+ return { suggested, applied: true };
230
+ }
231
+ //# sourceMappingURL=tagcode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tagcode.js","sourceRoot":"","sources":["../../src/lib/tagcode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function loadTemplate(name: string): string;
2
+ export declare function render(template: string, vars: Record<string, string>): string;
3
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/lib/templates.ts"],"names":[],"mappings":"AAWA,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAQ7E"}
@@ -0,0 +1,21 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ const __dirname = dirname(fileURLToPath(import.meta.url));
5
+ // From cli/src/lib/templates.ts the templates live at ../../templates.
6
+ // From cli/dist/lib/templates.js the same relative path resolves to
7
+ // cli/templates (templates/ is a sibling of both src/ and dist/).
8
+ const TEMPLATES_ROOT = join(__dirname, '..', '..', 'templates');
9
+ export function loadTemplate(name) {
10
+ return readFileSync(join(TEMPLATES_ROOT, name), 'utf8');
11
+ }
12
+ export function render(template, vars) {
13
+ return template.replace(/\{\{(\w+)\}\}/g, (_, key) => {
14
+ const value = vars[key];
15
+ if (value === undefined) {
16
+ throw new Error(`render: template references unknown variable "${key}"`);
17
+ }
18
+ return value;
19
+ });
20
+ }
21
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/lib/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAEzD,uEAAuE;AACvE,oEAAoE;AACpE,kEAAkE;AAClE,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,CAAA;AAE/D,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAA;AACzD,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,QAAgB,EAAE,IAA4B;IACnE,OAAO,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,GAAW,EAAE,EAAE;QAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA;QACvB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,iDAAiD,GAAG,GAAG,CAAC,CAAA;QAC1E,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC,CAAC,CAAA;AACJ,CAAC"}