@stoneforge/quarry 0.1.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 (330) hide show
  1. package/LICENSE +13 -0
  2. package/README.md +160 -0
  3. package/dist/api/index.d.ts +8 -0
  4. package/dist/api/index.d.ts.map +1 -0
  5. package/dist/api/index.js +8 -0
  6. package/dist/api/index.js.map +1 -0
  7. package/dist/api/quarry-api.d.ts +268 -0
  8. package/dist/api/quarry-api.d.ts.map +1 -0
  9. package/dist/api/quarry-api.js +3905 -0
  10. package/dist/api/quarry-api.js.map +1 -0
  11. package/dist/api/types.d.ts +1359 -0
  12. package/dist/api/types.d.ts.map +1 -0
  13. package/dist/api/types.js +204 -0
  14. package/dist/api/types.js.map +1 -0
  15. package/dist/bin/sf.d.ts +3 -0
  16. package/dist/bin/sf.d.ts.map +1 -0
  17. package/dist/bin/sf.js +9 -0
  18. package/dist/bin/sf.js.map +1 -0
  19. package/dist/cli/commands/admin.d.ts +11 -0
  20. package/dist/cli/commands/admin.d.ts.map +1 -0
  21. package/dist/cli/commands/admin.js +465 -0
  22. package/dist/cli/commands/admin.js.map +1 -0
  23. package/dist/cli/commands/alias.d.ts +8 -0
  24. package/dist/cli/commands/alias.d.ts.map +1 -0
  25. package/dist/cli/commands/alias.js +70 -0
  26. package/dist/cli/commands/alias.js.map +1 -0
  27. package/dist/cli/commands/channel.d.ts +13 -0
  28. package/dist/cli/commands/channel.d.ts.map +1 -0
  29. package/dist/cli/commands/channel.js +680 -0
  30. package/dist/cli/commands/channel.js.map +1 -0
  31. package/dist/cli/commands/completion.d.ts +8 -0
  32. package/dist/cli/commands/completion.d.ts.map +1 -0
  33. package/dist/cli/commands/completion.js +87 -0
  34. package/dist/cli/commands/completion.js.map +1 -0
  35. package/dist/cli/commands/config.d.ts +12 -0
  36. package/dist/cli/commands/config.d.ts.map +1 -0
  37. package/dist/cli/commands/config.js +242 -0
  38. package/dist/cli/commands/config.js.map +1 -0
  39. package/dist/cli/commands/crud.d.ts +64 -0
  40. package/dist/cli/commands/crud.d.ts.map +1 -0
  41. package/dist/cli/commands/crud.js +805 -0
  42. package/dist/cli/commands/crud.js.map +1 -0
  43. package/dist/cli/commands/dep.d.ts +16 -0
  44. package/dist/cli/commands/dep.d.ts.map +1 -0
  45. package/dist/cli/commands/dep.js +499 -0
  46. package/dist/cli/commands/dep.js.map +1 -0
  47. package/dist/cli/commands/document.d.ts +12 -0
  48. package/dist/cli/commands/document.d.ts.map +1 -0
  49. package/dist/cli/commands/document.js +1039 -0
  50. package/dist/cli/commands/document.js.map +1 -0
  51. package/dist/cli/commands/embeddings.d.ts +12 -0
  52. package/dist/cli/commands/embeddings.d.ts.map +1 -0
  53. package/dist/cli/commands/embeddings.js +273 -0
  54. package/dist/cli/commands/embeddings.js.map +1 -0
  55. package/dist/cli/commands/entity.d.ts +16 -0
  56. package/dist/cli/commands/entity.d.ts.map +1 -0
  57. package/dist/cli/commands/entity.js +522 -0
  58. package/dist/cli/commands/entity.js.map +1 -0
  59. package/dist/cli/commands/gc.d.ts +10 -0
  60. package/dist/cli/commands/gc.d.ts.map +1 -0
  61. package/dist/cli/commands/gc.js +257 -0
  62. package/dist/cli/commands/gc.js.map +1 -0
  63. package/dist/cli/commands/help.d.ts +11 -0
  64. package/dist/cli/commands/help.d.ts.map +1 -0
  65. package/dist/cli/commands/help.js +169 -0
  66. package/dist/cli/commands/help.js.map +1 -0
  67. package/dist/cli/commands/history.d.ts +9 -0
  68. package/dist/cli/commands/history.d.ts.map +1 -0
  69. package/dist/cli/commands/history.js +160 -0
  70. package/dist/cli/commands/history.js.map +1 -0
  71. package/dist/cli/commands/identity.d.ts +18 -0
  72. package/dist/cli/commands/identity.d.ts.map +1 -0
  73. package/dist/cli/commands/identity.js +698 -0
  74. package/dist/cli/commands/identity.js.map +1 -0
  75. package/dist/cli/commands/inbox.d.ts +20 -0
  76. package/dist/cli/commands/inbox.d.ts.map +1 -0
  77. package/dist/cli/commands/inbox.js +493 -0
  78. package/dist/cli/commands/inbox.js.map +1 -0
  79. package/dist/cli/commands/init.d.ts +20 -0
  80. package/dist/cli/commands/init.d.ts.map +1 -0
  81. package/dist/cli/commands/init.js +144 -0
  82. package/dist/cli/commands/init.js.map +1 -0
  83. package/dist/cli/commands/install.d.ts +9 -0
  84. package/dist/cli/commands/install.d.ts.map +1 -0
  85. package/dist/cli/commands/install.js +200 -0
  86. package/dist/cli/commands/install.js.map +1 -0
  87. package/dist/cli/commands/library.d.ts +12 -0
  88. package/dist/cli/commands/library.d.ts.map +1 -0
  89. package/dist/cli/commands/library.js +665 -0
  90. package/dist/cli/commands/library.js.map +1 -0
  91. package/dist/cli/commands/message.d.ts +11 -0
  92. package/dist/cli/commands/message.d.ts.map +1 -0
  93. package/dist/cli/commands/message.js +608 -0
  94. package/dist/cli/commands/message.js.map +1 -0
  95. package/dist/cli/commands/plan.d.ts +17 -0
  96. package/dist/cli/commands/plan.d.ts.map +1 -0
  97. package/dist/cli/commands/plan.js +698 -0
  98. package/dist/cli/commands/plan.js.map +1 -0
  99. package/dist/cli/commands/playbook.d.ts +12 -0
  100. package/dist/cli/commands/playbook.d.ts.map +1 -0
  101. package/dist/cli/commands/playbook.js +730 -0
  102. package/dist/cli/commands/playbook.js.map +1 -0
  103. package/dist/cli/commands/reset.d.ts +12 -0
  104. package/dist/cli/commands/reset.d.ts.map +1 -0
  105. package/dist/cli/commands/reset.js +306 -0
  106. package/dist/cli/commands/reset.js.map +1 -0
  107. package/dist/cli/commands/serve.d.ts +11 -0
  108. package/dist/cli/commands/serve.d.ts.map +1 -0
  109. package/dist/cli/commands/serve.js +106 -0
  110. package/dist/cli/commands/serve.js.map +1 -0
  111. package/dist/cli/commands/stats.d.ts +8 -0
  112. package/dist/cli/commands/stats.d.ts.map +1 -0
  113. package/dist/cli/commands/stats.js +82 -0
  114. package/dist/cli/commands/stats.js.map +1 -0
  115. package/dist/cli/commands/sync.d.ts +14 -0
  116. package/dist/cli/commands/sync.d.ts.map +1 -0
  117. package/dist/cli/commands/sync.js +370 -0
  118. package/dist/cli/commands/sync.js.map +1 -0
  119. package/dist/cli/commands/task.d.ts +25 -0
  120. package/dist/cli/commands/task.d.ts.map +1 -0
  121. package/dist/cli/commands/task.js +1153 -0
  122. package/dist/cli/commands/task.js.map +1 -0
  123. package/dist/cli/commands/team.d.ts +13 -0
  124. package/dist/cli/commands/team.d.ts.map +1 -0
  125. package/dist/cli/commands/team.js +471 -0
  126. package/dist/cli/commands/team.js.map +1 -0
  127. package/dist/cli/commands/workflow.d.ts +16 -0
  128. package/dist/cli/commands/workflow.d.ts.map +1 -0
  129. package/dist/cli/commands/workflow.js +753 -0
  130. package/dist/cli/commands/workflow.js.map +1 -0
  131. package/dist/cli/completion.d.ts +28 -0
  132. package/dist/cli/completion.d.ts.map +1 -0
  133. package/dist/cli/completion.js +295 -0
  134. package/dist/cli/completion.js.map +1 -0
  135. package/dist/cli/db.d.ts +38 -0
  136. package/dist/cli/db.d.ts.map +1 -0
  137. package/dist/cli/db.js +90 -0
  138. package/dist/cli/db.js.map +1 -0
  139. package/dist/cli/formatter.d.ts +87 -0
  140. package/dist/cli/formatter.d.ts.map +1 -0
  141. package/dist/cli/formatter.js +464 -0
  142. package/dist/cli/formatter.js.map +1 -0
  143. package/dist/cli/index.d.ts +33 -0
  144. package/dist/cli/index.d.ts.map +1 -0
  145. package/dist/cli/index.js +38 -0
  146. package/dist/cli/index.js.map +1 -0
  147. package/dist/cli/parser.d.ts +45 -0
  148. package/dist/cli/parser.d.ts.map +1 -0
  149. package/dist/cli/parser.js +256 -0
  150. package/dist/cli/parser.js.map +1 -0
  151. package/dist/cli/plugin-loader.d.ts +39 -0
  152. package/dist/cli/plugin-loader.d.ts.map +1 -0
  153. package/dist/cli/plugin-loader.js +165 -0
  154. package/dist/cli/plugin-loader.js.map +1 -0
  155. package/dist/cli/plugin-registry.d.ts +50 -0
  156. package/dist/cli/plugin-registry.d.ts.map +1 -0
  157. package/dist/cli/plugin-registry.js +206 -0
  158. package/dist/cli/plugin-registry.js.map +1 -0
  159. package/dist/cli/plugin-types.d.ts +106 -0
  160. package/dist/cli/plugin-types.d.ts.map +1 -0
  161. package/dist/cli/plugin-types.js +103 -0
  162. package/dist/cli/plugin-types.js.map +1 -0
  163. package/dist/cli/runner.d.ts +35 -0
  164. package/dist/cli/runner.d.ts.map +1 -0
  165. package/dist/cli/runner.js +340 -0
  166. package/dist/cli/runner.js.map +1 -0
  167. package/dist/cli/suggest.d.ts +15 -0
  168. package/dist/cli/suggest.d.ts.map +1 -0
  169. package/dist/cli/suggest.js +49 -0
  170. package/dist/cli/suggest.js.map +1 -0
  171. package/dist/cli/types.d.ts +138 -0
  172. package/dist/cli/types.d.ts.map +1 -0
  173. package/dist/cli/types.js +63 -0
  174. package/dist/cli/types.js.map +1 -0
  175. package/dist/config/config.d.ts +86 -0
  176. package/dist/config/config.d.ts.map +1 -0
  177. package/dist/config/config.js +348 -0
  178. package/dist/config/config.js.map +1 -0
  179. package/dist/config/defaults.d.ts +66 -0
  180. package/dist/config/defaults.d.ts.map +1 -0
  181. package/dist/config/defaults.js +114 -0
  182. package/dist/config/defaults.js.map +1 -0
  183. package/dist/config/duration.d.ts +75 -0
  184. package/dist/config/duration.d.ts.map +1 -0
  185. package/dist/config/duration.js +190 -0
  186. package/dist/config/duration.js.map +1 -0
  187. package/dist/config/env.d.ts +67 -0
  188. package/dist/config/env.d.ts.map +1 -0
  189. package/dist/config/env.js +207 -0
  190. package/dist/config/env.js.map +1 -0
  191. package/dist/config/file.d.ts +97 -0
  192. package/dist/config/file.d.ts.map +1 -0
  193. package/dist/config/file.js +365 -0
  194. package/dist/config/file.js.map +1 -0
  195. package/dist/config/index.d.ts +35 -0
  196. package/dist/config/index.d.ts.map +1 -0
  197. package/dist/config/index.js +41 -0
  198. package/dist/config/index.js.map +1 -0
  199. package/dist/config/merge.d.ts +53 -0
  200. package/dist/config/merge.d.ts.map +1 -0
  201. package/dist/config/merge.js +226 -0
  202. package/dist/config/merge.js.map +1 -0
  203. package/dist/config/types.d.ts +257 -0
  204. package/dist/config/types.d.ts.map +1 -0
  205. package/dist/config/types.js +72 -0
  206. package/dist/config/types.js.map +1 -0
  207. package/dist/config/validation.d.ts +55 -0
  208. package/dist/config/validation.d.ts.map +1 -0
  209. package/dist/config/validation.js +251 -0
  210. package/dist/config/validation.js.map +1 -0
  211. package/dist/http/index.d.ts +8 -0
  212. package/dist/http/index.d.ts.map +1 -0
  213. package/dist/http/index.js +12 -0
  214. package/dist/http/index.js.map +1 -0
  215. package/dist/http/sync-handlers.d.ts +162 -0
  216. package/dist/http/sync-handlers.d.ts.map +1 -0
  217. package/dist/http/sync-handlers.js +271 -0
  218. package/dist/http/sync-handlers.js.map +1 -0
  219. package/dist/index.d.ts +25 -0
  220. package/dist/index.d.ts.map +1 -0
  221. package/dist/index.js +69 -0
  222. package/dist/index.js.map +1 -0
  223. package/dist/server/index.d.ts +34 -0
  224. package/dist/server/index.d.ts.map +1 -0
  225. package/dist/server/index.js +3329 -0
  226. package/dist/server/index.js.map +1 -0
  227. package/dist/server/static.d.ts +18 -0
  228. package/dist/server/static.d.ts.map +1 -0
  229. package/dist/server/static.js +71 -0
  230. package/dist/server/static.js.map +1 -0
  231. package/dist/server/ws/broadcaster.d.ts +8 -0
  232. package/dist/server/ws/broadcaster.d.ts.map +1 -0
  233. package/dist/server/ws/broadcaster.js +7 -0
  234. package/dist/server/ws/broadcaster.js.map +1 -0
  235. package/dist/server/ws/handler.d.ts +55 -0
  236. package/dist/server/ws/handler.d.ts.map +1 -0
  237. package/dist/server/ws/handler.js +160 -0
  238. package/dist/server/ws/handler.js.map +1 -0
  239. package/dist/services/blocked-cache.d.ts +297 -0
  240. package/dist/services/blocked-cache.d.ts.map +1 -0
  241. package/dist/services/blocked-cache.js +755 -0
  242. package/dist/services/blocked-cache.js.map +1 -0
  243. package/dist/services/dependency.d.ts +205 -0
  244. package/dist/services/dependency.d.ts.map +1 -0
  245. package/dist/services/dependency.js +566 -0
  246. package/dist/services/dependency.js.map +1 -0
  247. package/dist/services/embeddings/fusion.d.ts +33 -0
  248. package/dist/services/embeddings/fusion.d.ts.map +1 -0
  249. package/dist/services/embeddings/fusion.js +34 -0
  250. package/dist/services/embeddings/fusion.js.map +1 -0
  251. package/dist/services/embeddings/index.d.ts +12 -0
  252. package/dist/services/embeddings/index.d.ts.map +1 -0
  253. package/dist/services/embeddings/index.js +10 -0
  254. package/dist/services/embeddings/index.js.map +1 -0
  255. package/dist/services/embeddings/local-provider.d.ts +31 -0
  256. package/dist/services/embeddings/local-provider.d.ts.map +1 -0
  257. package/dist/services/embeddings/local-provider.js +80 -0
  258. package/dist/services/embeddings/local-provider.js.map +1 -0
  259. package/dist/services/embeddings/service.d.ts +76 -0
  260. package/dist/services/embeddings/service.d.ts.map +1 -0
  261. package/dist/services/embeddings/service.js +153 -0
  262. package/dist/services/embeddings/service.js.map +1 -0
  263. package/dist/services/embeddings/types.d.ts +70 -0
  264. package/dist/services/embeddings/types.d.ts.map +1 -0
  265. package/dist/services/embeddings/types.js +8 -0
  266. package/dist/services/embeddings/types.js.map +1 -0
  267. package/dist/services/id-length-cache.d.ts +156 -0
  268. package/dist/services/id-length-cache.d.ts.map +1 -0
  269. package/dist/services/id-length-cache.js +197 -0
  270. package/dist/services/id-length-cache.js.map +1 -0
  271. package/dist/services/inbox.d.ts +147 -0
  272. package/dist/services/inbox.d.ts.map +1 -0
  273. package/dist/services/inbox.js +428 -0
  274. package/dist/services/inbox.js.map +1 -0
  275. package/dist/services/index.d.ts +10 -0
  276. package/dist/services/index.d.ts.map +1 -0
  277. package/dist/services/index.js +10 -0
  278. package/dist/services/index.js.map +1 -0
  279. package/dist/services/priority-service.d.ts +145 -0
  280. package/dist/services/priority-service.d.ts.map +1 -0
  281. package/dist/services/priority-service.js +272 -0
  282. package/dist/services/priority-service.js.map +1 -0
  283. package/dist/services/search-utils.d.ts +47 -0
  284. package/dist/services/search-utils.d.ts.map +1 -0
  285. package/dist/services/search-utils.js +83 -0
  286. package/dist/services/search-utils.js.map +1 -0
  287. package/dist/sync/hash.d.ts +48 -0
  288. package/dist/sync/hash.d.ts.map +1 -0
  289. package/dist/sync/hash.js +136 -0
  290. package/dist/sync/hash.js.map +1 -0
  291. package/dist/sync/index.d.ts +11 -0
  292. package/dist/sync/index.d.ts.map +1 -0
  293. package/dist/sync/index.js +16 -0
  294. package/dist/sync/index.js.map +1 -0
  295. package/dist/sync/merge.d.ts +80 -0
  296. package/dist/sync/merge.d.ts.map +1 -0
  297. package/dist/sync/merge.js +310 -0
  298. package/dist/sync/merge.js.map +1 -0
  299. package/dist/sync/serialization.d.ts +132 -0
  300. package/dist/sync/serialization.d.ts.map +1 -0
  301. package/dist/sync/serialization.js +306 -0
  302. package/dist/sync/serialization.js.map +1 -0
  303. package/dist/sync/service.d.ts +102 -0
  304. package/dist/sync/service.d.ts.map +1 -0
  305. package/dist/sync/service.js +493 -0
  306. package/dist/sync/service.js.map +1 -0
  307. package/dist/sync/types.d.ts +275 -0
  308. package/dist/sync/types.d.ts.map +1 -0
  309. package/dist/sync/types.js +76 -0
  310. package/dist/sync/types.js.map +1 -0
  311. package/dist/systems/identity.d.ts +479 -0
  312. package/dist/systems/identity.d.ts.map +1 -0
  313. package/dist/systems/identity.js +817 -0
  314. package/dist/systems/identity.js.map +1 -0
  315. package/dist/systems/index.d.ts +8 -0
  316. package/dist/systems/index.d.ts.map +1 -0
  317. package/dist/systems/index.js +29 -0
  318. package/dist/systems/index.js.map +1 -0
  319. package/package.json +121 -0
  320. package/web/assets/charts-vendor-D1YcbGux.js +55 -0
  321. package/web/assets/dnd-vendor-DmxE-_ZH.js +5 -0
  322. package/web/assets/editor-vendor-BxraAWts.js +279 -0
  323. package/web/assets/index-B77vv208.js +341 -0
  324. package/web/assets/index-CF_XnVLh.css +1 -0
  325. package/web/assets/router-vendor-BCKpRBrB.js +41 -0
  326. package/web/assets/ui-vendor-DUahGnbT.js +45 -0
  327. package/web/assets/utils-vendor-CfYKiENT.js +813 -0
  328. package/web/favicon.ico +0 -0
  329. package/web/index.html +23 -0
  330. package/web/logo.png +0 -0
@@ -0,0 +1,257 @@
1
+ /**
2
+ * Garbage Collection Commands - Clean up ephemeral data
3
+ *
4
+ * Provides commands for:
5
+ * - gc tasks: Garbage collect old ephemeral tasks
6
+ * - gc workflows: Garbage collect old ephemeral workflows
7
+ */
8
+ import { success, failure, ExitCode } from '../types.js';
9
+ import { getFormatter, getOutputMode } from '../formatter.js';
10
+ import { suggestCommands } from '../suggest.js';
11
+ import { createAPI } from '../db.js';
12
+ // ============================================================================
13
+ // Constants
14
+ // ============================================================================
15
+ const DEFAULT_GC_AGE_DAYS = 1; // 24 hours
16
+ const MS_PER_DAY = 24 * 60 * 60 * 1000;
17
+ const gcTasksOptions = [
18
+ {
19
+ name: 'age',
20
+ short: 'a',
21
+ description: `Maximum age in days (default: ${DEFAULT_GC_AGE_DAYS})`,
22
+ hasValue: true,
23
+ },
24
+ {
25
+ name: 'dry-run',
26
+ description: 'Show what would be deleted without deleting',
27
+ hasValue: false,
28
+ },
29
+ {
30
+ name: 'limit',
31
+ short: 'l',
32
+ description: 'Maximum number of tasks to delete',
33
+ hasValue: true,
34
+ },
35
+ ];
36
+ async function gcTasksHandler(_args, options) {
37
+ const { api, error } = createAPI(options);
38
+ if (error) {
39
+ return failure(error, ExitCode.GENERAL_ERROR);
40
+ }
41
+ try {
42
+ // Parse age option (in days)
43
+ const ageDays = options.age ? parseFloat(options.age) : DEFAULT_GC_AGE_DAYS;
44
+ if (isNaN(ageDays) || ageDays < 0) {
45
+ return failure('Invalid age value. Must be a positive number.', ExitCode.INVALID_ARGUMENTS);
46
+ }
47
+ const maxAgeMs = ageDays * MS_PER_DAY;
48
+ // Parse limit option
49
+ const limit = options.limit ? parseInt(options.limit, 10) : undefined;
50
+ if (options.limit && (isNaN(limit) || limit < 1)) {
51
+ return failure('Invalid limit value. Must be a positive integer.', ExitCode.INVALID_ARGUMENTS);
52
+ }
53
+ const dryRun = !!options['dry-run'];
54
+ // Task GC is now a no-op - tasks no longer have an ephemeral property.
55
+ // Only workflows can be ephemeral, and their tasks are GC'd via garbageCollectWorkflows().
56
+ const gcResult = await api.garbageCollectTasks({
57
+ maxAgeMs,
58
+ dryRun,
59
+ limit,
60
+ });
61
+ if (gcResult.tasksDeleted === 0) {
62
+ return success({ deleted: 0 }, 'No tasks eligible for garbage collection (tasks are now GC\'d via their parent workflows)');
63
+ }
64
+ return success(gcResult, `Garbage collected ${gcResult.tasksDeleted} task(s), ${gcResult.dependenciesDeleted} dependency(ies)`);
65
+ }
66
+ catch (err) {
67
+ const message = err instanceof Error ? err.message : String(err);
68
+ return failure(`Failed to garbage collect tasks: ${message}`, ExitCode.GENERAL_ERROR);
69
+ }
70
+ }
71
+ const gcTasksCommand = {
72
+ name: 'tasks',
73
+ description: 'Garbage collect old tasks (deprecated - use "sf gc workflows" instead)',
74
+ usage: 'sf gc tasks [options]',
75
+ help: `Garbage collect old tasks.
76
+
77
+ NOTE: This command is now a no-op. Tasks no longer have an ephemeral property.
78
+ Only workflows can be ephemeral, and their child tasks are garbage collected
79
+ automatically when you run 'sf gc workflows'.
80
+
81
+ Use 'sf gc workflows' to garbage collect ephemeral workflows and their tasks.
82
+
83
+ Options:
84
+ -a, --age <days> Maximum age in days (default: ${DEFAULT_GC_AGE_DAYS})
85
+ -l, --limit <n> Maximum number of tasks to delete
86
+ --dry-run Show what would be deleted without deleting
87
+
88
+ Examples:
89
+ sf gc workflows # Recommended: GC workflows and their tasks
90
+ sf gc tasks # No-op, kept for backwards compatibility`,
91
+ options: gcTasksOptions,
92
+ handler: gcTasksHandler,
93
+ };
94
+ const gcWorkflowsOptions = [
95
+ {
96
+ name: 'age',
97
+ short: 'a',
98
+ description: `Maximum age in days (default: ${DEFAULT_GC_AGE_DAYS})`,
99
+ hasValue: true,
100
+ },
101
+ {
102
+ name: 'dry-run',
103
+ description: 'Show what would be deleted without deleting',
104
+ hasValue: false,
105
+ },
106
+ {
107
+ name: 'limit',
108
+ short: 'l',
109
+ description: 'Maximum number of workflows to delete',
110
+ hasValue: true,
111
+ },
112
+ ];
113
+ async function gcWorkflowsHandler(_args, options) {
114
+ const { api, error } = createAPI(options);
115
+ if (error) {
116
+ return failure(error, ExitCode.GENERAL_ERROR);
117
+ }
118
+ try {
119
+ const mode = getOutputMode(options);
120
+ const formatter = getFormatter(mode);
121
+ // Parse age option (in days)
122
+ const ageDays = options.age ? parseFloat(options.age) : DEFAULT_GC_AGE_DAYS;
123
+ if (isNaN(ageDays) || ageDays < 0) {
124
+ return failure('Invalid age value. Must be a positive number.', ExitCode.INVALID_ARGUMENTS);
125
+ }
126
+ const maxAgeMs = ageDays * MS_PER_DAY;
127
+ // Parse limit option
128
+ const limit = options.limit ? parseInt(options.limit, 10) : undefined;
129
+ if (options.limit && (isNaN(limit) || limit < 1)) {
130
+ return failure('Invalid limit value. Must be a positive integer.', ExitCode.INVALID_ARGUMENTS);
131
+ }
132
+ const dryRun = !!options['dry-run'];
133
+ // If dry run, show what would be deleted first
134
+ if (dryRun) {
135
+ // Get eligible workflows without deleting
136
+ const allWorkflows = await api.list({ type: 'workflow' });
137
+ const terminalStatuses = ['completed', 'failed', 'cancelled'];
138
+ const now = Date.now();
139
+ const eligibleWorkflows = allWorkflows.filter(workflow => {
140
+ if (!workflow.ephemeral)
141
+ return false;
142
+ if (!terminalStatuses.includes(workflow.status))
143
+ return false;
144
+ if (!workflow.finishedAt)
145
+ return false;
146
+ const finishedTime = new Date(workflow.finishedAt).getTime();
147
+ return now - finishedTime >= maxAgeMs;
148
+ });
149
+ // Apply limit for display
150
+ const toShow = limit ? eligibleWorkflows.slice(0, limit) : eligibleWorkflows;
151
+ if (toShow.length === 0) {
152
+ return success({ wouldDelete: [], count: 0 }, 'No workflows eligible for garbage collection');
153
+ }
154
+ if (mode === 'json') {
155
+ return success({
156
+ wouldDelete: toShow.map(w => w.id),
157
+ count: toShow.length,
158
+ });
159
+ }
160
+ if (mode === 'quiet') {
161
+ return success(toShow.map(w => w.id).join('\n'));
162
+ }
163
+ const headers = ['ID', 'TITLE', 'STATUS', 'FINISHED'];
164
+ const rows = toShow.map(w => [
165
+ w.id,
166
+ w.title.length > 40 ? w.title.substring(0, 37) + '...' : w.title,
167
+ w.status,
168
+ w.finishedAt ? w.finishedAt.split('T')[0] : '-',
169
+ ]);
170
+ const table = formatter.table(headers, rows);
171
+ return success({ wouldDelete: toShow.map(w => w.id), count: toShow.length }, `Would delete ${toShow.length} workflow(s):\n${table}`);
172
+ }
173
+ // Actually run garbage collection
174
+ const gcResult = await api.garbageCollectWorkflows({
175
+ maxAgeMs,
176
+ dryRun: false,
177
+ limit,
178
+ });
179
+ if (gcResult.workflowsDeleted === 0) {
180
+ return success({ deleted: 0 }, 'No workflows eligible for garbage collection');
181
+ }
182
+ return success(gcResult, `Garbage collected ${gcResult.workflowsDeleted} workflow(s), ${gcResult.tasksDeleted} task(s), ${gcResult.dependenciesDeleted} dependency(ies)`);
183
+ }
184
+ catch (err) {
185
+ const message = err instanceof Error ? err.message : String(err);
186
+ return failure(`Failed to garbage collect workflows: ${message}`, ExitCode.GENERAL_ERROR);
187
+ }
188
+ }
189
+ const gcWorkflowsCommand = {
190
+ name: 'workflows',
191
+ description: 'Garbage collect old ephemeral workflows',
192
+ usage: 'sf gc workflows [options]',
193
+ help: `Delete old ephemeral workflows that have reached a terminal state.
194
+
195
+ Workflows are eligible for garbage collection if they are:
196
+ - Ephemeral (not durable)
197
+ - In a terminal state (completed, failed, or cancelled)
198
+ - Older than the specified age
199
+
200
+ Note: Deleting a workflow also deletes all tasks that belong to it.
201
+
202
+ Options:
203
+ -a, --age <days> Maximum age in days (default: ${DEFAULT_GC_AGE_DAYS})
204
+ -l, --limit <n> Maximum number of workflows to delete
205
+ --dry-run Show what would be deleted without deleting
206
+
207
+ Examples:
208
+ sf gc workflows
209
+ sf gc workflows --age 7
210
+ sf gc workflows --dry-run`,
211
+ options: gcWorkflowsOptions,
212
+ handler: gcWorkflowsHandler,
213
+ };
214
+ // ============================================================================
215
+ // GC Root Command
216
+ // ============================================================================
217
+ export const gcCommand = {
218
+ name: 'gc',
219
+ description: 'Garbage collect old ephemeral data',
220
+ usage: 'sf gc <subcommand> [options]',
221
+ help: `Garbage collect old ephemeral data.
222
+
223
+ Stoneforge supports ephemeral tasks and workflows that are not synced to permanent
224
+ storage. These can accumulate over time and should be periodically cleaned up.
225
+
226
+ Subcommands:
227
+ tasks Garbage collect old ephemeral tasks
228
+ workflows Garbage collect old ephemeral workflows
229
+
230
+ By default, items must be at least ${DEFAULT_GC_AGE_DAYS} day(s) old to be eligible for garbage collection.
231
+ Use --age to change this threshold.
232
+
233
+ Examples:
234
+ sf gc tasks Delete old ephemeral tasks
235
+ sf gc tasks --dry-run Preview what would be deleted
236
+ sf gc workflows Delete old ephemeral workflows
237
+ sf gc workflows --age 7 Delete workflows older than 7 days`,
238
+ subcommands: {
239
+ tasks: gcTasksCommand,
240
+ workflows: gcWorkflowsCommand,
241
+ },
242
+ handler: async (args, options) => {
243
+ if (args.length === 0) {
244
+ return failure(`Missing subcommand. Use 'sf gc tasks' or 'sf gc workflows'. Run 'sf gc --help' for more information.`, ExitCode.INVALID_ARGUMENTS);
245
+ }
246
+ // Show "did you mean?" for unknown subcommands
247
+ const subNames = Object.keys(gcCommand.subcommands);
248
+ const suggestions = suggestCommands(args[0], subNames);
249
+ let msg = `Unknown subcommand: ${args[0]}`;
250
+ if (suggestions.length > 0) {
251
+ msg += `\n\nDid you mean?\n${suggestions.map(s => ` ${s}`).join('\n')}`;
252
+ }
253
+ msg += '\n\nRun "sf gc --help" to see available subcommands.';
254
+ return failure(msg, ExitCode.INVALID_ARGUMENTS);
255
+ },
256
+ };
257
+ //# sourceMappingURL=gc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gc.js","sourceRoot":"","sources":["../../../src/cli/commands/gc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * help command - Display help information
3
+ */
4
+ import type { Command } from '../types.js';
5
+ export declare const helpCommand: Command;
6
+ export declare const versionCommand: Command;
7
+ /**
8
+ * Gets help text for a specific command
9
+ */
10
+ export declare function getCommandHelp(command: Command): string;
11
+ //# sourceMappingURL=help.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/help.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAiB,MAAM,aAAa,CAAC;AA+I1D,eAAO,MAAM,WAAW,EAAE,OAKzB,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,OAK5B,CAAC;AAEF;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAmCvD"}
@@ -0,0 +1,169 @@
1
+ /**
2
+ * help command - Display help information
3
+ */
4
+ import { success } from '../types.js';
5
+ import { getGlobalOptionsHelp } from '../parser.js';
6
+ import { getAllCommands } from '../runner.js';
7
+ // ============================================================================
8
+ // Version Info
9
+ // ============================================================================
10
+ const VERSION = '0.1.0';
11
+ // ============================================================================
12
+ // Help Text
13
+ // ============================================================================
14
+ // Subcommand hints for resource commands
15
+ const SUBCOMMAND_HINTS = {
16
+ task: 'create, list, ready, close, ...',
17
+ plan: 'create, activate, tasks, ...',
18
+ dependency: 'add, remove, list, tree',
19
+ message: 'send, reply, list, thread',
20
+ document: 'create, list, search, ...',
21
+ channel: 'create, list, join, ...',
22
+ workflow: 'create, list, promote, ...',
23
+ entity: 'register, list, reports, ...',
24
+ team: 'create, list, ...',
25
+ library: 'create, list, ...',
26
+ inbox: 'read, read-all, archive, ...',
27
+ };
28
+ // Built-in command categories for display
29
+ const COMMAND_CATEGORIES = {
30
+ 'Elements': ['show', 'update', 'delete', 'history'],
31
+ 'Tasks': ['task'],
32
+ 'Planning': ['plan', 'workflow', 'playbook'],
33
+ 'Dependencies': ['dependency'],
34
+ 'Communication': ['message', 'inbox', 'channel'],
35
+ 'Knowledge': ['document', 'library', 'embeddings'],
36
+ 'Organization': ['entity', 'team'],
37
+ 'Sync': ['sync', 'export', 'import', 'status'],
38
+ 'System': ['init', 'reset', 'config', 'identity', 'whoami', 'stats'],
39
+ 'Admin': ['doctor', 'migrate', 'gc'],
40
+ 'Shell': ['completion', 'alias', 'install', 'help', 'version'],
41
+ };
42
+ // All categorized commands for distinguishing plugins
43
+ const BUILTIN_COMMANDS = new Set(Object.values(COMMAND_CATEGORIES).flat());
44
+ // Top-level task convenience commands (not shown in categories but listed separately)
45
+ const TASK_CONVENIENCE_COMMANDS = [
46
+ 'ready', 'blocked', 'backlog', 'close', 'reopen', 'assign', 'defer', 'undefer',
47
+ ];
48
+ // Add task convenience commands to built-in set so they don't appear as plugins
49
+ for (const cmd of TASK_CONVENIENCE_COMMANDS) {
50
+ BUILTIN_COMMANDS.add(cmd);
51
+ }
52
+ /**
53
+ * Generates the main help text dynamically
54
+ */
55
+ function generateMainHelp() {
56
+ const lines = [
57
+ 'Stoneforge - Agent coordination system',
58
+ '',
59
+ 'Usage: stoneforge <command> [options]',
60
+ ' sf <command> [options]',
61
+ '',
62
+ 'Commands:',
63
+ ];
64
+ const allCommands = getAllCommands();
65
+ const commandMap = new Map(allCommands.map(cmd => [cmd.name, cmd]));
66
+ // Add categorized built-in commands
67
+ for (const [category, commands] of Object.entries(COMMAND_CATEGORIES)) {
68
+ const availableCommands = commands.filter(cmd => commandMap.has(cmd));
69
+ if (availableCommands.length === 0)
70
+ continue;
71
+ lines.push(` ${category}:`);
72
+ for (const cmdName of availableCommands) {
73
+ const cmd = commandMap.get(cmdName);
74
+ if (cmd) {
75
+ const hint = SUBCOMMAND_HINTS[cmdName];
76
+ const desc = hint ? `${cmd.description} (${hint})` : cmd.description;
77
+ lines.push(` ${cmdName.padEnd(16)} ${desc}`);
78
+ }
79
+ }
80
+ lines.push('');
81
+ }
82
+ // Add plugin commands (commands not in built-in set)
83
+ const pluginCommands = allCommands
84
+ .filter(cmd => !BUILTIN_COMMANDS.has(cmd.name))
85
+ .sort((a, b) => a.name.localeCompare(b.name));
86
+ if (pluginCommands.length > 0) {
87
+ lines.push(' Plugin Commands:');
88
+ for (const cmd of pluginCommands) {
89
+ lines.push(` ${cmd.name.padEnd(16)} ${cmd.description}`);
90
+ }
91
+ lines.push('');
92
+ }
93
+ // Add aliases section
94
+ lines.push(' Aliases:');
95
+ lines.push(' dep dependency');
96
+ lines.push(' msg message');
97
+ lines.push(' doc document');
98
+ lines.push(' rm, remove delete');
99
+ lines.push(' s, get show');
100
+ lines.push(' st status');
101
+ lines.push(' todo, tasks ready (also: sf task ready)');
102
+ lines.push(' done close (also: sf task close)');
103
+ lines.push(' ready, blocked, close, ... also available as sf task <verb>');
104
+ lines.push('');
105
+ lines.push(getGlobalOptionsHelp());
106
+ lines.push('');
107
+ lines.push('Use "sf <command> --help" for more information about a command.');
108
+ return lines.join('\n');
109
+ }
110
+ // ============================================================================
111
+ // Handler
112
+ // ============================================================================
113
+ function helpHandler() {
114
+ return success(undefined, generateMainHelp());
115
+ }
116
+ function versionHandler() {
117
+ return success({ version: VERSION }, `stoneforge v${VERSION}`);
118
+ }
119
+ // ============================================================================
120
+ // Command Definitions
121
+ // ============================================================================
122
+ export const helpCommand = {
123
+ name: 'help',
124
+ description: 'Show help information',
125
+ usage: 'sf help [command]',
126
+ handler: helpHandler,
127
+ };
128
+ export const versionCommand = {
129
+ name: 'version',
130
+ description: 'Show version',
131
+ usage: 'sf version',
132
+ handler: versionHandler,
133
+ };
134
+ /**
135
+ * Gets help text for a specific command
136
+ */
137
+ export function getCommandHelp(command) {
138
+ const lines = [
139
+ command.description,
140
+ '',
141
+ `Usage: ${command.usage}`,
142
+ ];
143
+ if (command.help) {
144
+ lines.push('', command.help);
145
+ }
146
+ if (command.options && command.options.length > 0) {
147
+ lines.push('', 'Options:');
148
+ for (const opt of command.options) {
149
+ const shortPart = opt.short ? `-${opt.short}, ` : ' ';
150
+ const valuePart = opt.hasValue ? ` <${opt.name}>` : '';
151
+ const requiredPart = opt.required ? ' (required)' : '';
152
+ lines.push(` ${shortPart}--${opt.name}${valuePart}${requiredPart}`);
153
+ lines.push(` ${opt.description}`);
154
+ }
155
+ }
156
+ if (command.subcommands) {
157
+ lines.push('', 'Subcommands:');
158
+ const seen = new Set();
159
+ for (const [name, sub] of Object.entries(command.subcommands)) {
160
+ if (seen.has(sub))
161
+ continue; // skip aliases
162
+ seen.add(sub);
163
+ lines.push(` ${name.padEnd(20)} ${sub.description}`);
164
+ }
165
+ }
166
+ lines.push('', getGlobalOptionsHelp());
167
+ return lines.join('\n');
168
+ }
169
+ //# sourceMappingURL=help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../../src/cli/commands/help.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * History Command - Show event history/timeline for elements
3
+ *
4
+ * Provides CLI commands for viewing element history:
5
+ * - history: Show event timeline for an element
6
+ */
7
+ import type { Command } from '../types.js';
8
+ export declare const historyCommand: Command;
9
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/history.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAA+C,MAAM,aAAa,CAAC;AA6JxF,eAAO,MAAM,cAAc,EAAE,OAkC5B,CAAC"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * History Command - Show event history/timeline for elements
3
+ *
4
+ * Provides CLI commands for viewing element history:
5
+ * - history: Show event timeline for an element
6
+ */
7
+ import { success, failure, ExitCode } from '../types.js';
8
+ import { getOutputMode, formatEventsTable, formatTimeline } from '../formatter.js';
9
+ import { createAPI } from '../db.js';
10
+ const historyOptions = [
11
+ {
12
+ name: 'limit',
13
+ short: 'l',
14
+ description: 'Maximum number of events to show (default: 50)',
15
+ hasValue: true,
16
+ },
17
+ {
18
+ name: 'type',
19
+ short: 't',
20
+ description: 'Filter by event type (created, updated, closed, reopened, deleted, dependency_added, dependency_removed)',
21
+ hasValue: true,
22
+ },
23
+ {
24
+ name: 'actor',
25
+ short: 'a',
26
+ description: 'Filter by actor',
27
+ hasValue: true,
28
+ },
29
+ {
30
+ name: 'after',
31
+ description: 'Show events after this timestamp (ISO 8601)',
32
+ hasValue: true,
33
+ },
34
+ {
35
+ name: 'before',
36
+ description: 'Show events before this timestamp (ISO 8601)',
37
+ hasValue: true,
38
+ },
39
+ {
40
+ name: 'format',
41
+ short: 'f',
42
+ description: 'Output format: timeline or table (default: timeline)',
43
+ hasValue: true,
44
+ },
45
+ ];
46
+ async function historyHandler(args, options) {
47
+ const [id] = args;
48
+ if (!id) {
49
+ return failure('Usage: sf history <id>', ExitCode.INVALID_ARGUMENTS);
50
+ }
51
+ const { api, error } = createAPI(options);
52
+ if (error) {
53
+ return failure(error, ExitCode.GENERAL_ERROR);
54
+ }
55
+ try {
56
+ // Build event filter
57
+ const filter = {};
58
+ if (options.limit) {
59
+ const limit = parseInt(options.limit, 10);
60
+ if (isNaN(limit) || limit < 1) {
61
+ return failure('Limit must be a positive number', ExitCode.VALIDATION);
62
+ }
63
+ filter.limit = limit;
64
+ }
65
+ else {
66
+ filter.limit = 50; // Default limit
67
+ }
68
+ if (options.type) {
69
+ // Validate event type
70
+ const validTypes = [
71
+ 'created', 'updated', 'closed', 'reopened', 'deleted',
72
+ 'dependency_added', 'dependency_removed',
73
+ 'tag_added', 'tag_removed',
74
+ 'member_added', 'member_removed',
75
+ ];
76
+ if (!validTypes.includes(options.type)) {
77
+ return failure(`Invalid event type: ${options.type}. Must be one of: ${validTypes.join(', ')}`, ExitCode.VALIDATION);
78
+ }
79
+ filter.eventType = options.type;
80
+ }
81
+ if (options.actor) {
82
+ filter.actor = options.actor;
83
+ }
84
+ if (options.after) {
85
+ filter.after = options.after;
86
+ }
87
+ if (options.before) {
88
+ filter.before = options.before;
89
+ }
90
+ // Get events - api is guaranteed to be defined since we checked for error above
91
+ const events = await api.getEvents(id, filter);
92
+ // Format output based on mode
93
+ const mode = getOutputMode(options);
94
+ if (mode === 'json') {
95
+ return success(events);
96
+ }
97
+ if (mode === 'quiet') {
98
+ // Just return count in quiet mode
99
+ return success(events.length.toString());
100
+ }
101
+ // Determine format (timeline or table)
102
+ const format = options.format || 'timeline';
103
+ if (format !== 'timeline' && format !== 'table') {
104
+ return failure('Format must be "timeline" or "table"', ExitCode.VALIDATION);
105
+ }
106
+ // Human-readable output
107
+ if (events.length === 0) {
108
+ return success([], 'No events found');
109
+ }
110
+ let output;
111
+ if (format === 'table') {
112
+ output = formatEventsTable(events);
113
+ }
114
+ else {
115
+ output = formatTimeline(events);
116
+ }
117
+ const header = `History for ${id} (${events.length} events):\n\n`;
118
+ return success(events, header + output);
119
+ }
120
+ catch (err) {
121
+ const message = err instanceof Error ? err.message : String(err);
122
+ return failure(`Failed to get history: ${message}`, ExitCode.GENERAL_ERROR);
123
+ }
124
+ }
125
+ export const historyCommand = {
126
+ name: 'history',
127
+ description: 'Show event history for an element',
128
+ usage: 'sf history <id> [options]',
129
+ help: `Display the event history/timeline for an element.
130
+
131
+ Shows all recorded events including creates, updates, status changes,
132
+ dependency changes, and more.
133
+
134
+ Arguments:
135
+ id Element identifier (e.g., el-abc123)
136
+
137
+ Options:
138
+ -n, --limit <n> Maximum events to show (default: 50)
139
+ -t, --type <type> Filter by event type
140
+ -a, --actor <actor> Filter by actor
141
+ --after <time> Show events after this time (ISO 8601)
142
+ --before <time> Show events before this time (ISO 8601)
143
+ -f, --format <fmt> Output format: timeline or table (default: timeline)
144
+
145
+ Event types:
146
+ created, updated, closed, reopened, deleted,
147
+ dependency_added, dependency_removed
148
+
149
+ Examples:
150
+ sf history el-abc123
151
+ sf history el-abc123 --limit 10
152
+ sf history el-abc123 --type updated
153
+ sf history el-abc123 --actor user:alice
154
+ sf history el-abc123 --format table
155
+ sf history el-abc123 --after 2024-01-01
156
+ sf history el-abc123 --json`,
157
+ options: historyOptions,
158
+ handler: historyHandler,
159
+ };
160
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../../src/cli/commands/history.ts"],"names":[],"mappings":"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"}