@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.
- package/LICENSE +13 -0
- package/README.md +160 -0
- package/dist/api/index.d.ts +8 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +8 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/quarry-api.d.ts +268 -0
- package/dist/api/quarry-api.d.ts.map +1 -0
- package/dist/api/quarry-api.js +3905 -0
- package/dist/api/quarry-api.js.map +1 -0
- package/dist/api/types.d.ts +1359 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +204 -0
- package/dist/api/types.js.map +1 -0
- package/dist/bin/sf.d.ts +3 -0
- package/dist/bin/sf.d.ts.map +1 -0
- package/dist/bin/sf.js +9 -0
- package/dist/bin/sf.js.map +1 -0
- package/dist/cli/commands/admin.d.ts +11 -0
- package/dist/cli/commands/admin.d.ts.map +1 -0
- package/dist/cli/commands/admin.js +465 -0
- package/dist/cli/commands/admin.js.map +1 -0
- package/dist/cli/commands/alias.d.ts +8 -0
- package/dist/cli/commands/alias.d.ts.map +1 -0
- package/dist/cli/commands/alias.js +70 -0
- package/dist/cli/commands/alias.js.map +1 -0
- package/dist/cli/commands/channel.d.ts +13 -0
- package/dist/cli/commands/channel.d.ts.map +1 -0
- package/dist/cli/commands/channel.js +680 -0
- package/dist/cli/commands/channel.js.map +1 -0
- package/dist/cli/commands/completion.d.ts +8 -0
- package/dist/cli/commands/completion.d.ts.map +1 -0
- package/dist/cli/commands/completion.js +87 -0
- package/dist/cli/commands/completion.js.map +1 -0
- package/dist/cli/commands/config.d.ts +12 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +242 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/crud.d.ts +64 -0
- package/dist/cli/commands/crud.d.ts.map +1 -0
- package/dist/cli/commands/crud.js +805 -0
- package/dist/cli/commands/crud.js.map +1 -0
- package/dist/cli/commands/dep.d.ts +16 -0
- package/dist/cli/commands/dep.d.ts.map +1 -0
- package/dist/cli/commands/dep.js +499 -0
- package/dist/cli/commands/dep.js.map +1 -0
- package/dist/cli/commands/document.d.ts +12 -0
- package/dist/cli/commands/document.d.ts.map +1 -0
- package/dist/cli/commands/document.js +1039 -0
- package/dist/cli/commands/document.js.map +1 -0
- package/dist/cli/commands/embeddings.d.ts +12 -0
- package/dist/cli/commands/embeddings.d.ts.map +1 -0
- package/dist/cli/commands/embeddings.js +273 -0
- package/dist/cli/commands/embeddings.js.map +1 -0
- package/dist/cli/commands/entity.d.ts +16 -0
- package/dist/cli/commands/entity.d.ts.map +1 -0
- package/dist/cli/commands/entity.js +522 -0
- package/dist/cli/commands/entity.js.map +1 -0
- package/dist/cli/commands/gc.d.ts +10 -0
- package/dist/cli/commands/gc.d.ts.map +1 -0
- package/dist/cli/commands/gc.js +257 -0
- package/dist/cli/commands/gc.js.map +1 -0
- package/dist/cli/commands/help.d.ts +11 -0
- package/dist/cli/commands/help.d.ts.map +1 -0
- package/dist/cli/commands/help.js +169 -0
- package/dist/cli/commands/help.js.map +1 -0
- package/dist/cli/commands/history.d.ts +9 -0
- package/dist/cli/commands/history.d.ts.map +1 -0
- package/dist/cli/commands/history.js +160 -0
- package/dist/cli/commands/history.js.map +1 -0
- package/dist/cli/commands/identity.d.ts +18 -0
- package/dist/cli/commands/identity.d.ts.map +1 -0
- package/dist/cli/commands/identity.js +698 -0
- package/dist/cli/commands/identity.js.map +1 -0
- package/dist/cli/commands/inbox.d.ts +20 -0
- package/dist/cli/commands/inbox.d.ts.map +1 -0
- package/dist/cli/commands/inbox.js +493 -0
- package/dist/cli/commands/inbox.js.map +1 -0
- package/dist/cli/commands/init.d.ts +20 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +144 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/install.d.ts +9 -0
- package/dist/cli/commands/install.d.ts.map +1 -0
- package/dist/cli/commands/install.js +200 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/library.d.ts +12 -0
- package/dist/cli/commands/library.d.ts.map +1 -0
- package/dist/cli/commands/library.js +665 -0
- package/dist/cli/commands/library.js.map +1 -0
- package/dist/cli/commands/message.d.ts +11 -0
- package/dist/cli/commands/message.d.ts.map +1 -0
- package/dist/cli/commands/message.js +608 -0
- package/dist/cli/commands/message.js.map +1 -0
- package/dist/cli/commands/plan.d.ts +17 -0
- package/dist/cli/commands/plan.d.ts.map +1 -0
- package/dist/cli/commands/plan.js +698 -0
- package/dist/cli/commands/plan.js.map +1 -0
- package/dist/cli/commands/playbook.d.ts +12 -0
- package/dist/cli/commands/playbook.d.ts.map +1 -0
- package/dist/cli/commands/playbook.js +730 -0
- package/dist/cli/commands/playbook.js.map +1 -0
- package/dist/cli/commands/reset.d.ts +12 -0
- package/dist/cli/commands/reset.d.ts.map +1 -0
- package/dist/cli/commands/reset.js +306 -0
- package/dist/cli/commands/reset.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +11 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +106 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/stats.d.ts +8 -0
- package/dist/cli/commands/stats.d.ts.map +1 -0
- package/dist/cli/commands/stats.js +82 -0
- package/dist/cli/commands/stats.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +14 -0
- package/dist/cli/commands/sync.d.ts.map +1 -0
- package/dist/cli/commands/sync.js +370 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/commands/task.d.ts +25 -0
- package/dist/cli/commands/task.d.ts.map +1 -0
- package/dist/cli/commands/task.js +1153 -0
- package/dist/cli/commands/task.js.map +1 -0
- package/dist/cli/commands/team.d.ts +13 -0
- package/dist/cli/commands/team.d.ts.map +1 -0
- package/dist/cli/commands/team.js +471 -0
- package/dist/cli/commands/team.js.map +1 -0
- package/dist/cli/commands/workflow.d.ts +16 -0
- package/dist/cli/commands/workflow.d.ts.map +1 -0
- package/dist/cli/commands/workflow.js +753 -0
- package/dist/cli/commands/workflow.js.map +1 -0
- package/dist/cli/completion.d.ts +28 -0
- package/dist/cli/completion.d.ts.map +1 -0
- package/dist/cli/completion.js +295 -0
- package/dist/cli/completion.js.map +1 -0
- package/dist/cli/db.d.ts +38 -0
- package/dist/cli/db.d.ts.map +1 -0
- package/dist/cli/db.js +90 -0
- package/dist/cli/db.js.map +1 -0
- package/dist/cli/formatter.d.ts +87 -0
- package/dist/cli/formatter.d.ts.map +1 -0
- package/dist/cli/formatter.js +464 -0
- package/dist/cli/formatter.js.map +1 -0
- package/dist/cli/index.d.ts +33 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +38 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/parser.d.ts +45 -0
- package/dist/cli/parser.d.ts.map +1 -0
- package/dist/cli/parser.js +256 -0
- package/dist/cli/parser.js.map +1 -0
- package/dist/cli/plugin-loader.d.ts +39 -0
- package/dist/cli/plugin-loader.d.ts.map +1 -0
- package/dist/cli/plugin-loader.js +165 -0
- package/dist/cli/plugin-loader.js.map +1 -0
- package/dist/cli/plugin-registry.d.ts +50 -0
- package/dist/cli/plugin-registry.d.ts.map +1 -0
- package/dist/cli/plugin-registry.js +206 -0
- package/dist/cli/plugin-registry.js.map +1 -0
- package/dist/cli/plugin-types.d.ts +106 -0
- package/dist/cli/plugin-types.d.ts.map +1 -0
- package/dist/cli/plugin-types.js +103 -0
- package/dist/cli/plugin-types.js.map +1 -0
- package/dist/cli/runner.d.ts +35 -0
- package/dist/cli/runner.d.ts.map +1 -0
- package/dist/cli/runner.js +340 -0
- package/dist/cli/runner.js.map +1 -0
- package/dist/cli/suggest.d.ts +15 -0
- package/dist/cli/suggest.d.ts.map +1 -0
- package/dist/cli/suggest.js +49 -0
- package/dist/cli/suggest.js.map +1 -0
- package/dist/cli/types.d.ts +138 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +63 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/config/config.d.ts +86 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +348 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/defaults.d.ts +66 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +114 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/duration.d.ts +75 -0
- package/dist/config/duration.d.ts.map +1 -0
- package/dist/config/duration.js +190 -0
- package/dist/config/duration.js.map +1 -0
- package/dist/config/env.d.ts +67 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/env.js +207 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/file.d.ts +97 -0
- package/dist/config/file.d.ts.map +1 -0
- package/dist/config/file.js +365 -0
- package/dist/config/file.js.map +1 -0
- package/dist/config/index.d.ts +35 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +41 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/merge.d.ts +53 -0
- package/dist/config/merge.d.ts.map +1 -0
- package/dist/config/merge.js +226 -0
- package/dist/config/merge.js.map +1 -0
- package/dist/config/types.d.ts +257 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +72 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config/validation.d.ts +55 -0
- package/dist/config/validation.d.ts.map +1 -0
- package/dist/config/validation.js +251 -0
- package/dist/config/validation.js.map +1 -0
- package/dist/http/index.d.ts +8 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +12 -0
- package/dist/http/index.js.map +1 -0
- package/dist/http/sync-handlers.d.ts +162 -0
- package/dist/http/sync-handlers.d.ts.map +1 -0
- package/dist/http/sync-handlers.js +271 -0
- package/dist/http/sync-handlers.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +69 -0
- package/dist/index.js.map +1 -0
- package/dist/server/index.d.ts +34 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +3329 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/static.d.ts +18 -0
- package/dist/server/static.d.ts.map +1 -0
- package/dist/server/static.js +71 -0
- package/dist/server/static.js.map +1 -0
- package/dist/server/ws/broadcaster.d.ts +8 -0
- package/dist/server/ws/broadcaster.d.ts.map +1 -0
- package/dist/server/ws/broadcaster.js +7 -0
- package/dist/server/ws/broadcaster.js.map +1 -0
- package/dist/server/ws/handler.d.ts +55 -0
- package/dist/server/ws/handler.d.ts.map +1 -0
- package/dist/server/ws/handler.js +160 -0
- package/dist/server/ws/handler.js.map +1 -0
- package/dist/services/blocked-cache.d.ts +297 -0
- package/dist/services/blocked-cache.d.ts.map +1 -0
- package/dist/services/blocked-cache.js +755 -0
- package/dist/services/blocked-cache.js.map +1 -0
- package/dist/services/dependency.d.ts +205 -0
- package/dist/services/dependency.d.ts.map +1 -0
- package/dist/services/dependency.js +566 -0
- package/dist/services/dependency.js.map +1 -0
- package/dist/services/embeddings/fusion.d.ts +33 -0
- package/dist/services/embeddings/fusion.d.ts.map +1 -0
- package/dist/services/embeddings/fusion.js +34 -0
- package/dist/services/embeddings/fusion.js.map +1 -0
- package/dist/services/embeddings/index.d.ts +12 -0
- package/dist/services/embeddings/index.d.ts.map +1 -0
- package/dist/services/embeddings/index.js +10 -0
- package/dist/services/embeddings/index.js.map +1 -0
- package/dist/services/embeddings/local-provider.d.ts +31 -0
- package/dist/services/embeddings/local-provider.d.ts.map +1 -0
- package/dist/services/embeddings/local-provider.js +80 -0
- package/dist/services/embeddings/local-provider.js.map +1 -0
- package/dist/services/embeddings/service.d.ts +76 -0
- package/dist/services/embeddings/service.d.ts.map +1 -0
- package/dist/services/embeddings/service.js +153 -0
- package/dist/services/embeddings/service.js.map +1 -0
- package/dist/services/embeddings/types.d.ts +70 -0
- package/dist/services/embeddings/types.d.ts.map +1 -0
- package/dist/services/embeddings/types.js +8 -0
- package/dist/services/embeddings/types.js.map +1 -0
- package/dist/services/id-length-cache.d.ts +156 -0
- package/dist/services/id-length-cache.d.ts.map +1 -0
- package/dist/services/id-length-cache.js +197 -0
- package/dist/services/id-length-cache.js.map +1 -0
- package/dist/services/inbox.d.ts +147 -0
- package/dist/services/inbox.d.ts.map +1 -0
- package/dist/services/inbox.js +428 -0
- package/dist/services/inbox.js.map +1 -0
- package/dist/services/index.d.ts +10 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +10 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/priority-service.d.ts +145 -0
- package/dist/services/priority-service.d.ts.map +1 -0
- package/dist/services/priority-service.js +272 -0
- package/dist/services/priority-service.js.map +1 -0
- package/dist/services/search-utils.d.ts +47 -0
- package/dist/services/search-utils.d.ts.map +1 -0
- package/dist/services/search-utils.js +83 -0
- package/dist/services/search-utils.js.map +1 -0
- package/dist/sync/hash.d.ts +48 -0
- package/dist/sync/hash.d.ts.map +1 -0
- package/dist/sync/hash.js +136 -0
- package/dist/sync/hash.js.map +1 -0
- package/dist/sync/index.d.ts +11 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +16 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/merge.d.ts +80 -0
- package/dist/sync/merge.d.ts.map +1 -0
- package/dist/sync/merge.js +310 -0
- package/dist/sync/merge.js.map +1 -0
- package/dist/sync/serialization.d.ts +132 -0
- package/dist/sync/serialization.d.ts.map +1 -0
- package/dist/sync/serialization.js +306 -0
- package/dist/sync/serialization.js.map +1 -0
- package/dist/sync/service.d.ts +102 -0
- package/dist/sync/service.d.ts.map +1 -0
- package/dist/sync/service.js +493 -0
- package/dist/sync/service.js.map +1 -0
- package/dist/sync/types.d.ts +275 -0
- package/dist/sync/types.d.ts.map +1 -0
- package/dist/sync/types.js +76 -0
- package/dist/sync/types.js.map +1 -0
- package/dist/systems/identity.d.ts +479 -0
- package/dist/systems/identity.d.ts.map +1 -0
- package/dist/systems/identity.js +817 -0
- package/dist/systems/identity.js.map +1 -0
- package/dist/systems/index.d.ts +8 -0
- package/dist/systems/index.d.ts.map +1 -0
- package/dist/systems/index.js +29 -0
- package/dist/systems/index.js.map +1 -0
- package/package.json +121 -0
- package/web/assets/charts-vendor-D1YcbGux.js +55 -0
- package/web/assets/dnd-vendor-DmxE-_ZH.js +5 -0
- package/web/assets/editor-vendor-BxraAWts.js +279 -0
- package/web/assets/index-B77vv208.js +341 -0
- package/web/assets/index-CF_XnVLh.css +1 -0
- package/web/assets/router-vendor-BCKpRBrB.js +41 -0
- package/web/assets/ui-vendor-DUahGnbT.js +45 -0
- package/web/assets/utils-vendor-CfYKiENT.js +813 -0
- package/web/favicon.ico +0 -0
- package/web/index.html +23 -0
- 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":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,cAAc,EAAkB,MAAM,iBAAiB,CAAC;AAInG,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAerC,MAAM,cAAc,GAAoB;IACtC;QACE,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,gDAAgD;QAC7D,QAAQ,EAAE,IAAI;KACf;IACD;QACE,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,0GAA0G;QACvH,QAAQ,EAAE,IAAI;KACf;IACD;QACE,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,iBAAiB;QAC9B,QAAQ,EAAE,IAAI;KACf;IACD;QACE,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,6CAA6C;QAC1D,QAAQ,EAAE,IAAI;KACf;IACD;QACE,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,8CAA8C;QAC3D,QAAQ,EAAE,IAAI;KACf;IACD;QACE,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,sDAAsD;QACnE,QAAQ,EAAE,IAAI;KACf;CACF,CAAC;AAEF,KAAK,UAAU,cAAc,CAC3B,IAAc,EACd,OAAuC;IAEvC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;IAElB,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO,OAAO,CAAC,wBAAwB,EAAE,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,CAAC;QACH,qBAAqB;QACrB,MAAM,MAAM,GAAgB,EAAE,CAAC;QAE/B,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC1C,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBAC9B,OAAO,OAAO,CAAC,iCAAiC,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;YACzE,CAAC;YACD,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,gBAAgB;QACrC,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,sBAAsB;YACtB,MAAM,UAAU,GAAG;gBACjB,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS;gBACrD,kBAAkB,EAAE,oBAAoB;gBACxC,WAAW,EAAE,aAAa;gBAC1B,cAAc,EAAE,gBAAgB;aACjC,CAAC;YACF,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvC,OAAO,OAAO,CACZ,uBAAuB,OAAO,CAAC,IAAI,qBAAqB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAC/E,QAAQ,CAAC,UAAU,CACpB,CAAC;YACJ,CAAC;YACD,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC,IAAiB,CAAC;QAC/C,CAAC;QAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,KAAiB,CAAC;QAC3C,CAAC;QAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC/B,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QACjC,CAAC;QAED,gFAAgF;QAChF,MAAM,MAAM,GAAG,MAAM,GAAI,CAAC,SAAS,CAAC,EAAe,EAAE,MAAM,CAAC,CAAC;QAE7D,8BAA8B;QAC9B,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QAEpC,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;QAED,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,kCAAkC;YAClC,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3C,CAAC;QAED,uCAAuC;QACvC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,UAAU,CAAC;QAC5C,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YAChD,OAAO,OAAO,CAAC,sCAAsC,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC9E,CAAC;QAED,wBAAwB;QACxB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,OAAO,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,MAAc,CAAC;QACnB,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACvB,MAAM,GAAG,iBAAiB,CAAC,MAAqB,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,cAAc,CAAC,MAAqB,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,MAAM,GAAG,eAAe,EAAE,KAAK,MAAM,CAAC,MAAM,eAAe,CAAC;QAClE,OAAO,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,OAAO,CAAC,0BAA0B,OAAO,EAAE,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAY;IACrC,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,mCAAmC;IAChD,KAAK,EAAE,2BAA2B;IAClC,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;8BA2BsB;IAC5B,OAAO,EAAE,cAAc;IACvB,OAAO,EAAE,cAAoC;CAC9C,CAAC"}
|