@skrr-ai/cli 0.1.36 → 0.1.37
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/README.md +17 -4
- package/dist/commands/agents/actions/create.d.ts +5 -0
- package/dist/commands/agents/actions/create.js +26 -0
- package/dist/commands/agents/actions/update.d.ts +5 -0
- package/dist/commands/agents/actions/update.js +24 -0
- package/dist/commands/agents/api-actions/add.d.ts +41 -0
- package/dist/commands/agents/api-actions/add.js +202 -0
- package/dist/commands/agents/api-actions/index.d.ts +28 -0
- package/dist/commands/agents/api-actions/index.js +77 -0
- package/dist/commands/agents/api-actions/remove.d.ts +14 -0
- package/dist/commands/agents/api-actions/remove.js +36 -0
- package/dist/commands/agents/avatar/default/apply.d.ts +25 -0
- package/dist/commands/agents/avatar/default/apply.js +56 -0
- package/dist/commands/agents/avatar/default/index.d.ts +18 -0
- package/dist/commands/agents/avatar/default/index.js +44 -0
- package/dist/commands/agents/avatar/default/set.d.ts +23 -0
- package/dist/commands/agents/avatar/default/set.js +95 -0
- package/dist/commands/agents/avatar/library/delete.d.ts +20 -0
- package/dist/commands/agents/avatar/library/delete.js +47 -0
- package/dist/commands/agents/avatar/library/index.d.ts +16 -0
- package/dist/commands/agents/avatar/library/index.js +56 -0
- package/dist/commands/agents/avatar/presets.d.ts +19 -0
- package/dist/commands/agents/avatar/presets.js +56 -0
- package/dist/commands/agents/categories/create.d.ts +14 -0
- package/dist/commands/agents/categories/create.js +46 -0
- package/dist/commands/agents/categories/delete.d.ts +13 -0
- package/dist/commands/agents/categories/delete.js +33 -0
- package/dist/commands/agents/categories/index.d.ts +20 -0
- package/dist/commands/agents/categories/index.js +82 -0
- package/dist/commands/agents/categories/update.d.ts +22 -0
- package/dist/commands/agents/categories/update.js +59 -0
- package/dist/commands/agents/create.d.ts +10 -0
- package/dist/commands/agents/create.js +57 -3
- package/dist/commands/agents/ensure-default.d.ts +27 -0
- package/dist/commands/agents/ensure-default.js +65 -0
- package/dist/commands/agents/mute.d.ts +16 -0
- package/dist/commands/agents/mute.js +38 -0
- package/dist/commands/agents/pin.d.ts +16 -0
- package/dist/commands/agents/pin.js +38 -0
- package/dist/commands/agents/tools/auth.d.ts +19 -0
- package/dist/commands/agents/tools/auth.js +41 -0
- package/dist/commands/agents/tools/calls.d.ts +18 -0
- package/dist/commands/agents/tools/calls.js +54 -0
- package/dist/commands/agents/tools/index.d.ts +20 -0
- package/dist/commands/agents/tools/index.js +77 -0
- package/dist/commands/agents/unmute.d.ts +16 -0
- package/dist/commands/agents/unmute.js +38 -0
- package/dist/commands/agents/unpin.d.ts +16 -0
- package/dist/commands/agents/unpin.js +38 -0
- package/dist/commands/agents/update.d.ts +12 -0
- package/dist/commands/agents/update.js +64 -3
- package/dist/commands/followups/act.d.ts +22 -0
- package/dist/commands/followups/act.js +102 -0
- package/dist/commands/followups/cancel.d.ts +17 -0
- package/dist/commands/followups/cancel.js +40 -0
- package/dist/commands/followups/checkin.d.ts +27 -0
- package/dist/commands/followups/checkin.js +107 -0
- package/dist/commands/followups/list.d.ts +24 -0
- package/dist/commands/followups/list.js +90 -0
- package/dist/commands/followups/remind.d.ts +26 -0
- package/dist/commands/followups/remind.js +106 -0
- package/dist/commands/followups/reschedule.d.ts +15 -0
- package/dist/commands/followups/reschedule.js +48 -0
- package/dist/commands/followups/resolve.d.ts +23 -0
- package/dist/commands/followups/resolve.js +54 -0
- package/dist/commands/followups/show.d.ts +12 -0
- package/dist/commands/followups/show.js +45 -0
- package/dist/commands/followups/watch.d.ts +51 -0
- package/dist/commands/followups/watch.js +207 -0
- package/dist/commands/goals/labels/add.js +19 -2
- package/dist/commands/goals/labels/remove.js +22 -2
- package/dist/commands/labels/list.d.ts +24 -1
- package/dist/commands/labels/list.js +62 -19
- package/dist/commands/memory/governance/index.d.ts +21 -0
- package/dist/commands/memory/governance/index.js +64 -0
- package/dist/commands/memory/governance/set.d.ts +24 -0
- package/dist/commands/memory/governance/set.js +95 -0
- package/dist/commands/memory/provenance.d.ts +18 -0
- package/dist/commands/memory/provenance.js +66 -0
- package/dist/commands/spaces/create.d.ts +3 -0
- package/dist/commands/spaces/create.js +32 -2
- package/dist/commands/spaces/labels/add.js +19 -2
- package/dist/commands/spaces/labels/remove.js +22 -2
- package/dist/commands/spaces/show.js +2 -0
- package/dist/commands/spaces/update.d.ts +5 -0
- package/dist/commands/spaces/update.js +41 -4
- package/dist/commands/spaces/workflows/lifecycle-diagnostics.d.ts +11 -0
- package/dist/commands/spaces/workflows/lifecycle-diagnostics.js +45 -0
- package/dist/commands/tasks/complete.d.ts +1 -0
- package/dist/commands/tasks/complete.js +8 -1
- package/dist/commands/tasks/create.d.ts +3 -0
- package/dist/commands/tasks/create.js +34 -2
- package/dist/commands/tasks/expectations/assess.d.ts +11 -0
- package/dist/commands/tasks/expectations/assess.js +85 -14
- package/dist/commands/tasks/expectations.js +19 -2
- package/dist/commands/tasks/labels/attach.js +20 -3
- package/dist/commands/tasks/labels/detach.js +21 -3
- package/dist/commands/tasks/lifecycle/attach.d.ts +14 -0
- package/dist/commands/tasks/lifecycle/attach.js +47 -0
- package/dist/commands/tasks/lifecycle/definitions.d.ts +11 -0
- package/dist/commands/tasks/lifecycle/definitions.js +40 -0
- package/dist/commands/tasks/lifecycle/detach.d.ts +12 -0
- package/dist/commands/tasks/lifecycle/detach.js +32 -0
- package/dist/commands/tasks/lifecycle/history.d.ts +13 -0
- package/dist/commands/tasks/lifecycle/history.js +38 -0
- package/dist/commands/tasks/lifecycle/migrate.d.ts +12 -0
- package/dist/commands/tasks/lifecycle/migrate.js +29 -0
- package/dist/commands/tasks/lifecycle/reconcile.d.ts +11 -0
- package/dist/commands/tasks/lifecycle/reconcile.js +27 -0
- package/dist/commands/tasks/lifecycle/reopen.d.ts +13 -0
- package/dist/commands/tasks/lifecycle/reopen.js +34 -0
- package/dist/commands/tasks/lifecycle/show.d.ts +11 -0
- package/dist/commands/tasks/lifecycle/show.js +27 -0
- package/dist/commands/tasks/lifecycle/start.d.ts +12 -0
- package/dist/commands/tasks/lifecycle/start.js +30 -0
- package/dist/commands/tasks/lifecycle/transition.d.ts +15 -0
- package/dist/commands/tasks/lifecycle/transition.js +78 -0
- package/dist/commands/tasks/move.d.ts +1 -0
- package/dist/commands/tasks/move.js +31 -0
- package/dist/commands/tasks/result/submit.js +11 -1
- package/dist/commands/tasks/review-queue.d.ts +29 -0
- package/dist/commands/tasks/review-queue.js +165 -0
- package/dist/commands/tasks/show.js +42 -0
- package/dist/commands/tasks/update.d.ts +1 -0
- package/dist/commands/tasks/update.js +47 -0
- package/dist/lib/agent-actions.d.ts +36 -10
- package/dist/lib/agent-actions.js +63 -9
- package/dist/lib/agent-config.d.ts +11 -0
- package/dist/lib/agent-config.js +85 -3
- package/dist/lib/agent-pin-mute.d.ts +24 -0
- package/dist/lib/agent-pin-mute.js +17 -0
- package/dist/lib/agent-visual-refs.d.ts +6 -0
- package/dist/lib/agent-visual-refs.js +142 -0
- package/dist/lib/first-party-harness-agent.js +7 -0
- package/dist/lib/followups.d.ts +107 -0
- package/dist/lib/followups.js +102 -0
- package/dist/lib/label-ref.d.ts +95 -0
- package/dist/lib/label-ref.js +163 -0
- package/dist/lib/label-scope.d.ts +2 -2
- package/dist/lib/label-scope.js +3 -3
- package/dist/lib/task-closure.d.ts +32 -0
- package/dist/lib/task-closure.js +106 -0
- package/dist/lib/task-lifecycle-output.d.ts +14 -0
- package/dist/lib/task-lifecycle-output.js +101 -0
- package/dist/lib/tasks.d.ts +3 -0
- package/dist/lib/tasks.js +31 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/harnessTrust.js +4 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/harnessTrust.js +4 -0
- package/dist/node_modules/@skrr-ai/auth-core/package.json +1 -1
- package/dist/node_modules/@skrr-ai/data-provider/index.js +5079 -4546
- package/oclif.manifest.json +20216 -16002
- package/package.json +16 -4
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const core_1 = require("@oclif/core");
|
|
4
|
+
const data_provider_1 = require("@skrr-ai/data-provider");
|
|
5
|
+
const base_command_1 = require("../../../base-command");
|
|
6
|
+
const task_lifecycle_output_1 = require("../../../lib/task-lifecycle-output");
|
|
7
|
+
class TasksLifecycleAttach extends base_command_1.BaseCommand {
|
|
8
|
+
static description = 'Attach a lifecycle protocol to a Task — a built-in pack or a Space definition';
|
|
9
|
+
static args = { id: core_1.Args.string({ required: true, ignoreStdin: true }) };
|
|
10
|
+
static flags = {
|
|
11
|
+
pack: core_1.Flags.string({ description: "Built-in pack id, e.g. 'finding' or 'doc_to_task'" }),
|
|
12
|
+
definition: core_1.Flags.string({ description: 'WorkflowDefinition id (kind task_lifecycle)' }),
|
|
13
|
+
version: core_1.Flags.string({ description: 'Pin a specific published version id' }),
|
|
14
|
+
json: core_1.Flags.boolean({ description: 'Output JSON' }),
|
|
15
|
+
};
|
|
16
|
+
async run() {
|
|
17
|
+
this.requireAuth();
|
|
18
|
+
const { args, flags } = await this.parse(TasksLifecycleAttach);
|
|
19
|
+
const taskId = await this.resolveTaskReference(args.id);
|
|
20
|
+
if (flags.pack && flags.definition) {
|
|
21
|
+
this.error('Pass either --pack or --definition, not both.', { exit: 2 });
|
|
22
|
+
}
|
|
23
|
+
if (!flags.pack && !flags.definition) {
|
|
24
|
+
this.error('Pass --pack <id> or --definition <id>. See: tasks lifecycle definitions', {
|
|
25
|
+
exit: 2,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
let response;
|
|
29
|
+
try {
|
|
30
|
+
response = await data_provider_1.dataService.attachTaskLifecycle({
|
|
31
|
+
taskId,
|
|
32
|
+
...(flags.pack ? { packId: flags.pack } : {}),
|
|
33
|
+
...(flags.definition ? { definitionId: flags.definition } : {}),
|
|
34
|
+
...(flags.version ? { versionId: flags.version } : {}),
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
this.handleApiError(error);
|
|
39
|
+
}
|
|
40
|
+
if (flags.json)
|
|
41
|
+
return this.log(JSON.stringify(response, null, 2));
|
|
42
|
+
this.log(`Attached lifecycle${flags.pack ? ` pack '${flags.pack}'` : ` definition ${flags.definition}`}.`);
|
|
43
|
+
(0, task_lifecycle_output_1.renderTaskLifecycleSummary)(response, (line) => this.log(line));
|
|
44
|
+
this.log(`Start it: skrr tasks lifecycle start ${taskId}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
exports.default = TasksLifecycleAttach;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { BaseCommand } from '../../../base-command';
|
|
2
|
+
export default class TasksLifecycleDefinitions extends BaseCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static args: {
|
|
5
|
+
id: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
6
|
+
};
|
|
7
|
+
static flags: {
|
|
8
|
+
json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
9
|
+
};
|
|
10
|
+
run(): Promise<void>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const core_1 = require("@oclif/core");
|
|
4
|
+
const data_provider_1 = require("@skrr-ai/data-provider");
|
|
5
|
+
const base_command_1 = require("../../../base-command");
|
|
6
|
+
class TasksLifecycleDefinitions extends base_command_1.BaseCommand {
|
|
7
|
+
static description = 'List the lifecycle definitions and built-in packs a Task can attach';
|
|
8
|
+
static args = { id: core_1.Args.string({ required: true, ignoreStdin: true }) };
|
|
9
|
+
static flags = { json: core_1.Flags.boolean({ description: 'Output JSON' }) };
|
|
10
|
+
async run() {
|
|
11
|
+
this.requireAuth();
|
|
12
|
+
const { args, flags } = await this.parse(TasksLifecycleDefinitions);
|
|
13
|
+
const taskId = await this.resolveTaskReference(args.id);
|
|
14
|
+
let response;
|
|
15
|
+
try {
|
|
16
|
+
response = await data_provider_1.dataService.listTaskLifecycleDefinitions(taskId);
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
this.handleApiError(error);
|
|
20
|
+
}
|
|
21
|
+
if (flags.json)
|
|
22
|
+
return this.log(JSON.stringify(response, null, 2));
|
|
23
|
+
if (response.packs.length) {
|
|
24
|
+
this.log('Built-in packs:');
|
|
25
|
+
for (const pack of response.packs) {
|
|
26
|
+
this.log(` ${pack.id} v${pack.packVersion} — ${pack.title}${pack.description ? ` — ${pack.description}` : ''}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (response.definitions.length) {
|
|
30
|
+
this.log('Space definitions:');
|
|
31
|
+
for (const definition of response.definitions) {
|
|
32
|
+
this.log(` ${definition.id} v${definition.version} — ${definition.title}${definition.packId ? ` (pack ${definition.packId})` : ''}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (!response.packs.length && !response.definitions.length) {
|
|
36
|
+
this.log('No lifecycle definitions are available to this Task.');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.default = TasksLifecycleDefinitions;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { BaseCommand } from '../../../base-command';
|
|
2
|
+
export default class TasksLifecycleDetach extends BaseCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static args: {
|
|
5
|
+
id: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
6
|
+
};
|
|
7
|
+
static flags: {
|
|
8
|
+
reason: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
9
|
+
json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
};
|
|
11
|
+
run(): Promise<void>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const core_1 = require("@oclif/core");
|
|
4
|
+
const data_provider_1 = require("@skrr-ai/data-provider");
|
|
5
|
+
const base_command_1 = require("../../../base-command");
|
|
6
|
+
class TasksLifecycleDetach extends base_command_1.BaseCommand {
|
|
7
|
+
static description = 'Detach the lifecycle from a Task — fences the generation, leaves the run as history';
|
|
8
|
+
static args = { id: core_1.Args.string({ required: true, ignoreStdin: true }) };
|
|
9
|
+
static flags = {
|
|
10
|
+
reason: core_1.Flags.string({ description: 'Why the lifecycle is detaching' }),
|
|
11
|
+
json: core_1.Flags.boolean({ description: 'Output JSON' }),
|
|
12
|
+
};
|
|
13
|
+
async run() {
|
|
14
|
+
this.requireAuth();
|
|
15
|
+
const { args, flags } = await this.parse(TasksLifecycleDetach);
|
|
16
|
+
const taskId = await this.resolveTaskReference(args.id);
|
|
17
|
+
let response;
|
|
18
|
+
try {
|
|
19
|
+
response = await data_provider_1.dataService.detachTaskLifecycle({
|
|
20
|
+
taskId,
|
|
21
|
+
...(flags.reason ? { reason: flags.reason } : {}),
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
this.handleApiError(error);
|
|
26
|
+
}
|
|
27
|
+
if (flags.json)
|
|
28
|
+
return this.log(JSON.stringify(response, null, 2));
|
|
29
|
+
this.log('Detached lifecycle from the Task.');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.default = TasksLifecycleDetach;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { BaseCommand } from '../../../base-command';
|
|
2
|
+
export default class TasksLifecycleHistory extends BaseCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static args: {
|
|
5
|
+
id: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
6
|
+
};
|
|
7
|
+
static flags: {
|
|
8
|
+
limit: import("@oclif/core/lib/interfaces").OptionFlag<number | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
9
|
+
before: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
10
|
+
json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
11
|
+
};
|
|
12
|
+
run(): Promise<void>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const core_1 = require("@oclif/core");
|
|
4
|
+
const data_provider_1 = require("@skrr-ai/data-provider");
|
|
5
|
+
const base_command_1 = require("../../../base-command");
|
|
6
|
+
const task_lifecycle_output_1 = require("../../../lib/task-lifecycle-output");
|
|
7
|
+
class TasksLifecycleHistory extends base_command_1.BaseCommand {
|
|
8
|
+
static description = 'Show the durable lifecycle event stream for a Task — every generation, newest first';
|
|
9
|
+
static args = {
|
|
10
|
+
id: core_1.Args.string({ required: true, ignoreStdin: true, description: 'Task ID' }),
|
|
11
|
+
};
|
|
12
|
+
static flags = {
|
|
13
|
+
limit: core_1.Flags.integer({ min: 1, max: 200, description: 'Maximum events to return (1-200)' }),
|
|
14
|
+
before: core_1.Flags.string({
|
|
15
|
+
description: 'ISO timestamp — only events recorded before it (pagination)',
|
|
16
|
+
}),
|
|
17
|
+
json: core_1.Flags.boolean({ description: 'Output JSON' }),
|
|
18
|
+
};
|
|
19
|
+
async run() {
|
|
20
|
+
this.requireAuth();
|
|
21
|
+
const { args, flags } = await this.parse(TasksLifecycleHistory);
|
|
22
|
+
const taskId = await this.resolveTaskReference(args.id);
|
|
23
|
+
let response;
|
|
24
|
+
try {
|
|
25
|
+
response = await data_provider_1.dataService.getTaskLifecycleHistory(taskId, {
|
|
26
|
+
limit: flags.limit,
|
|
27
|
+
before: flags.before,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
this.handleApiError(error);
|
|
32
|
+
}
|
|
33
|
+
if (flags.json)
|
|
34
|
+
return this.log(JSON.stringify(response, null, 2));
|
|
35
|
+
(0, task_lifecycle_output_1.renderLifecycleHistory)(response, (line) => this.log(line));
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.default = TasksLifecycleHistory;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { BaseCommand } from '../../../base-command';
|
|
2
|
+
export default class TasksLifecycleMigrate extends BaseCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static args: {
|
|
5
|
+
id: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
6
|
+
};
|
|
7
|
+
static flags: {
|
|
8
|
+
version: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
9
|
+
json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
};
|
|
11
|
+
run(): Promise<void>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const core_1 = require("@oclif/core");
|
|
4
|
+
const data_provider_1 = require("@skrr-ai/data-provider");
|
|
5
|
+
const base_command_1 = require("../../../base-command");
|
|
6
|
+
class TasksLifecycleMigrate extends base_command_1.BaseCommand {
|
|
7
|
+
static description = 'Migrate a bound lifecycle to a newer published version, fencing the old generation';
|
|
8
|
+
static args = { id: core_1.Args.string({ required: true, ignoreStdin: true }) };
|
|
9
|
+
static flags = {
|
|
10
|
+
version: core_1.Flags.string({ required: true, description: 'Target WorkflowDefinition version id' }),
|
|
11
|
+
json: core_1.Flags.boolean({ description: 'Output JSON' }),
|
|
12
|
+
};
|
|
13
|
+
async run() {
|
|
14
|
+
this.requireAuth();
|
|
15
|
+
const { args, flags } = await this.parse(TasksLifecycleMigrate);
|
|
16
|
+
const taskId = await this.resolveTaskReference(args.id);
|
|
17
|
+
let result;
|
|
18
|
+
try {
|
|
19
|
+
result = await data_provider_1.dataService.migrateTaskLifecycle({ taskId, versionId: flags.version });
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
this.handleApiError(error);
|
|
23
|
+
}
|
|
24
|
+
if (flags.json)
|
|
25
|
+
return this.log(JSON.stringify(result, null, 2));
|
|
26
|
+
this.log(`Migrated lifecycle — run ${result.run.id} (${result.run.status}).`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports.default = TasksLifecycleMigrate;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { BaseCommand } from '../../../base-command';
|
|
2
|
+
export default class TasksLifecycleReconcile extends BaseCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static args: {
|
|
5
|
+
id: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
6
|
+
};
|
|
7
|
+
static flags: {
|
|
8
|
+
json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
9
|
+
};
|
|
10
|
+
run(): Promise<void>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const core_1 = require("@oclif/core");
|
|
4
|
+
const data_provider_1 = require("@skrr-ai/data-provider");
|
|
5
|
+
const base_command_1 = require("../../../base-command");
|
|
6
|
+
const task_lifecycle_output_1 = require("../../../lib/task-lifecycle-output");
|
|
7
|
+
class TasksLifecycleReconcile extends base_command_1.BaseCommand {
|
|
8
|
+
static description = 'Re-sync the Task lifecycle projection with the authoritative Workflow run';
|
|
9
|
+
static args = { id: core_1.Args.string({ required: true, ignoreStdin: true }) };
|
|
10
|
+
static flags = { json: core_1.Flags.boolean({ description: 'Output JSON' }) };
|
|
11
|
+
async run() {
|
|
12
|
+
this.requireAuth();
|
|
13
|
+
const { args, flags } = await this.parse(TasksLifecycleReconcile);
|
|
14
|
+
const taskId = await this.resolveTaskReference(args.id);
|
|
15
|
+
let response;
|
|
16
|
+
try {
|
|
17
|
+
response = await data_provider_1.dataService.reconcileTaskLifecycle(taskId);
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
this.handleApiError(error);
|
|
21
|
+
}
|
|
22
|
+
if (flags.json)
|
|
23
|
+
return this.log(JSON.stringify(response, null, 2));
|
|
24
|
+
(0, task_lifecycle_output_1.renderTaskLifecycleSummary)(response, (line) => this.log(line));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.default = TasksLifecycleReconcile;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { BaseCommand } from '../../../base-command';
|
|
2
|
+
export default class TasksLifecycleReopen extends BaseCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static args: {
|
|
5
|
+
id: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
6
|
+
};
|
|
7
|
+
static flags: {
|
|
8
|
+
stage: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
9
|
+
reason: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
10
|
+
json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
11
|
+
};
|
|
12
|
+
run(): Promise<void>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const core_1 = require("@oclif/core");
|
|
4
|
+
const data_provider_1 = require("@skrr-ai/data-provider");
|
|
5
|
+
const base_command_1 = require("../../../base-command");
|
|
6
|
+
class TasksLifecycleReopen extends base_command_1.BaseCommand {
|
|
7
|
+
static description = 'Fence the current lifecycle generation and reopen at an earlier stage';
|
|
8
|
+
static args = { id: core_1.Args.string({ required: true, ignoreStdin: true }) };
|
|
9
|
+
static flags = {
|
|
10
|
+
stage: core_1.Flags.string({ description: 'Stage key to re-enter at; defaults to the entry stage' }),
|
|
11
|
+
reason: core_1.Flags.string({ description: 'Why the lifecycle is reopening' }),
|
|
12
|
+
json: core_1.Flags.boolean({ description: 'Output JSON' }),
|
|
13
|
+
};
|
|
14
|
+
async run() {
|
|
15
|
+
this.requireAuth();
|
|
16
|
+
const { args, flags } = await this.parse(TasksLifecycleReopen);
|
|
17
|
+
const taskId = await this.resolveTaskReference(args.id);
|
|
18
|
+
let result;
|
|
19
|
+
try {
|
|
20
|
+
result = await data_provider_1.dataService.reopenTaskLifecycle({
|
|
21
|
+
taskId,
|
|
22
|
+
...(flags.stage ? { stageKey: flags.stage } : {}),
|
|
23
|
+
...(flags.reason ? { reason: flags.reason } : {}),
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
this.handleApiError(error);
|
|
28
|
+
}
|
|
29
|
+
if (flags.json)
|
|
30
|
+
return this.log(JSON.stringify(result, null, 2));
|
|
31
|
+
this.log(`Reopened lifecycle — run ${result.run.id} (${result.run.status}).`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.default = TasksLifecycleReopen;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { BaseCommand } from '../../../base-command';
|
|
2
|
+
export default class TasksLifecycleShow extends BaseCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static args: {
|
|
5
|
+
id: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
6
|
+
};
|
|
7
|
+
static flags: {
|
|
8
|
+
json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
9
|
+
};
|
|
10
|
+
run(): Promise<void>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const core_1 = require("@oclif/core");
|
|
4
|
+
const data_provider_1 = require("@skrr-ai/data-provider");
|
|
5
|
+
const base_command_1 = require("../../../base-command");
|
|
6
|
+
const task_lifecycle_output_1 = require("../../../lib/task-lifecycle-output");
|
|
7
|
+
class TasksLifecycleShow extends base_command_1.BaseCommand {
|
|
8
|
+
static description = 'Show the Task Lifecycle bound to a Task — stages, position, and legal transitions';
|
|
9
|
+
static args = { id: core_1.Args.string({ required: true, ignoreStdin: true }) };
|
|
10
|
+
static flags = { json: core_1.Flags.boolean({ description: 'Output JSON' }) };
|
|
11
|
+
async run() {
|
|
12
|
+
this.requireAuth();
|
|
13
|
+
const { args, flags } = await this.parse(TasksLifecycleShow);
|
|
14
|
+
const taskId = await this.resolveTaskReference(args.id);
|
|
15
|
+
let response;
|
|
16
|
+
try {
|
|
17
|
+
response = await data_provider_1.dataService.getTaskLifecycle(taskId);
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
this.handleApiError(error);
|
|
21
|
+
}
|
|
22
|
+
if (flags.json)
|
|
23
|
+
return this.log(JSON.stringify(response, null, 2));
|
|
24
|
+
(0, task_lifecycle_output_1.renderTaskLifecycleSummary)(response, (line) => this.log(line));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.default = TasksLifecycleShow;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { BaseCommand } from '../../../base-command';
|
|
2
|
+
export default class TasksLifecycleStart extends BaseCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static args: {
|
|
5
|
+
id: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
6
|
+
};
|
|
7
|
+
static flags: {
|
|
8
|
+
'start-identity': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
9
|
+
json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
};
|
|
11
|
+
run(): Promise<void>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const core_1 = require("@oclif/core");
|
|
4
|
+
const data_provider_1 = require("@skrr-ai/data-provider");
|
|
5
|
+
const base_command_1 = require("../../../base-command");
|
|
6
|
+
class TasksLifecycleStart extends base_command_1.BaseCommand {
|
|
7
|
+
static description = 'Start the lifecycle run bound to a Task';
|
|
8
|
+
static args = { id: core_1.Args.string({ required: true, ignoreStdin: true }) };
|
|
9
|
+
static flags = {
|
|
10
|
+
'start-identity': core_1.Flags.string({ description: 'Idempotency identity for this logical start' }),
|
|
11
|
+
json: core_1.Flags.boolean({ description: 'Output JSON' }),
|
|
12
|
+
};
|
|
13
|
+
async run() {
|
|
14
|
+
this.requireAuth();
|
|
15
|
+
const { args, flags } = await this.parse(TasksLifecycleStart);
|
|
16
|
+
const taskId = await this.resolveTaskReference(args.id);
|
|
17
|
+
let result;
|
|
18
|
+
try {
|
|
19
|
+
result = await data_provider_1.dataService.startTaskLifecycle(taskId, flags['start-identity']);
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
this.handleApiError(error);
|
|
23
|
+
}
|
|
24
|
+
if (flags.json)
|
|
25
|
+
return this.log(JSON.stringify(result, null, 2));
|
|
26
|
+
this.log(`${result.reused ? 'Opened' : 'Started'} lifecycle run ${result.run.id} (${result.run.status}).`);
|
|
27
|
+
this.log(`Inspect: skrr tasks lifecycle show ${taskId}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.default = TasksLifecycleStart;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { BaseCommand } from '../../../base-command';
|
|
2
|
+
export default class TasksLifecycleTransition extends BaseCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static args: {
|
|
5
|
+
id: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
6
|
+
transition: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
payload: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
10
|
+
'idempotency-key': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
11
|
+
'expected-revision': import("@oclif/core/lib/interfaces").OptionFlag<number | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
12
|
+
json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
13
|
+
};
|
|
14
|
+
run(): Promise<void>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const core_1 = require("@oclif/core");
|
|
4
|
+
const data_provider_1 = require("@skrr-ai/data-provider");
|
|
5
|
+
const base_command_1 = require("../../../base-command");
|
|
6
|
+
const task_lifecycle_output_1 = require("../../../lib/task-lifecycle-output");
|
|
7
|
+
class TasksLifecycleTransition extends base_command_1.BaseCommand {
|
|
8
|
+
static description = 'Apply a declared lifecycle transition — records effects and advances the stage';
|
|
9
|
+
static args = {
|
|
10
|
+
id: core_1.Args.string({ required: true, ignoreStdin: true, description: 'Task ID' }),
|
|
11
|
+
transition: core_1.Args.string({
|
|
12
|
+
required: true,
|
|
13
|
+
ignoreStdin: true,
|
|
14
|
+
description: 'Transition id declared by the waiting stage',
|
|
15
|
+
}),
|
|
16
|
+
};
|
|
17
|
+
static flags = {
|
|
18
|
+
payload: core_1.Flags.string({
|
|
19
|
+
description: 'JSON payload the transition requires (fields, evidence, refs)',
|
|
20
|
+
}),
|
|
21
|
+
'idempotency-key': core_1.Flags.string({
|
|
22
|
+
description: 'Stable key for safe retries; defaults to a per-revision key derived from the Task and transition',
|
|
23
|
+
}),
|
|
24
|
+
'expected-revision': core_1.Flags.integer({
|
|
25
|
+
description: 'Optimistic CAS fence; defaults to the current lifecycle revision',
|
|
26
|
+
}),
|
|
27
|
+
json: core_1.Flags.boolean({ description: 'Output JSON' }),
|
|
28
|
+
};
|
|
29
|
+
async run() {
|
|
30
|
+
this.requireAuth();
|
|
31
|
+
const { args, flags } = await this.parse(TasksLifecycleTransition);
|
|
32
|
+
const taskId = await this.resolveTaskReference(args.id);
|
|
33
|
+
let payload;
|
|
34
|
+
if (flags.payload) {
|
|
35
|
+
try {
|
|
36
|
+
payload = JSON.parse(flags.payload);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
this.error('--payload must be valid JSON.', { exit: 2 });
|
|
40
|
+
}
|
|
41
|
+
if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {
|
|
42
|
+
this.error('--payload must be a JSON object.', { exit: 2 });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
let expectedRevision = flags['expected-revision'];
|
|
46
|
+
if (expectedRevision === undefined) {
|
|
47
|
+
let current;
|
|
48
|
+
try {
|
|
49
|
+
current = await data_provider_1.dataService.getTaskLifecycle(taskId);
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
this.handleApiError(error);
|
|
53
|
+
}
|
|
54
|
+
if (!current.lifecycle) {
|
|
55
|
+
this.error('No lifecycle is attached to this Task.', { exit: 2 });
|
|
56
|
+
}
|
|
57
|
+
expectedRevision = current.lifecycle.revision;
|
|
58
|
+
}
|
|
59
|
+
const idempotencyKey = flags['idempotency-key'] ?? `cli-lifecycle:${taskId}:${args.transition}:r${expectedRevision}`;
|
|
60
|
+
let response;
|
|
61
|
+
try {
|
|
62
|
+
response = await data_provider_1.dataService.transitionTaskLifecycle({
|
|
63
|
+
taskId,
|
|
64
|
+
transitionId: args.transition,
|
|
65
|
+
idempotencyKey,
|
|
66
|
+
expectedRevision,
|
|
67
|
+
...(payload ? { payload } : {}),
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
this.handleApiError(error);
|
|
72
|
+
}
|
|
73
|
+
if (flags.json)
|
|
74
|
+
return this.log(JSON.stringify(response, null, 2));
|
|
75
|
+
(0, task_lifecycle_output_1.renderLifecycleTransitionResult)(response, (line) => this.log(line));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
exports.default = TasksLifecycleTransition;
|
|
@@ -21,6 +21,7 @@ export default class TasksMove extends BaseCommand {
|
|
|
21
21
|
json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
22
22
|
reason: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
23
23
|
'resolution-actor': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
24
|
+
force: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
24
25
|
};
|
|
25
26
|
run(): Promise<void>;
|
|
26
27
|
/**
|
|
@@ -52,6 +52,9 @@ class TasksMove extends base_command_1.BaseCommand {
|
|
|
52
52
|
description: 'Who can resolve the exceptional hold',
|
|
53
53
|
options: ['human', 'agent', 'system', 'external'],
|
|
54
54
|
}),
|
|
55
|
+
force: core_1.Flags.boolean({
|
|
56
|
+
description: "Close past an owner-declared required Review as a non-owner; the override is recorded on the task's resolution",
|
|
57
|
+
}),
|
|
55
58
|
};
|
|
56
59
|
async run() {
|
|
57
60
|
this.requireAuth();
|
|
@@ -100,6 +103,7 @@ class TasksMove extends base_command_1.BaseCommand {
|
|
|
100
103
|
status: flags.status,
|
|
101
104
|
...(flags.reason ? { reason: flags.reason } : {}),
|
|
102
105
|
...(flags['resolution-actor'] ? { resolutionActor: flags['resolution-actor'] } : {}),
|
|
106
|
+
...(flags.force ? { force: true } : {}),
|
|
103
107
|
},
|
|
104
108
|
}));
|
|
105
109
|
updated = res.task;
|
|
@@ -110,6 +114,7 @@ class TasksMove extends base_command_1.BaseCommand {
|
|
|
110
114
|
status: flags.status,
|
|
111
115
|
reason: flags.reason,
|
|
112
116
|
resolutionActor: flags['resolution-actor'],
|
|
117
|
+
force: flags.force === true ? true : undefined,
|
|
113
118
|
});
|
|
114
119
|
}
|
|
115
120
|
}
|
|
@@ -138,6 +143,32 @@ class TasksMove extends base_command_1.BaseCommand {
|
|
|
138
143
|
destinations.push(await this.describeProjectDestination(projectId, t));
|
|
139
144
|
}
|
|
140
145
|
this.log(`Moved task ${t.id ?? t._id ?? taskIdentity.id}${ref ? ` (${ref})` : ''} → ${destinations.join(', ')}`);
|
|
146
|
+
/*
|
|
147
|
+
* Closing is the actor's call — the server does not refuse outstanding
|
|
148
|
+
* work, it records it on `resolution.closure`. If the close just written
|
|
149
|
+
* left things unsettled, say so here so the output and the durable record
|
|
150
|
+
* tell the same story rather than letting "done" launder open items.
|
|
151
|
+
*/
|
|
152
|
+
// Read through the SHARED vocabulary. This carried a local structural cast
|
|
153
|
+
// while `overrode` was missing from `Task['resolution']['closure']` — which
|
|
154
|
+
// is exactly how one surface comes to know a field the type does not. `t` is
|
|
155
|
+
// the loosely-typed receipt, so the narrowing cast stays; what matters is
|
|
156
|
+
// that the shape it names is the one data-provider owns.
|
|
157
|
+
const resolutionClosure = t.resolution?.closure;
|
|
158
|
+
if (resolutionClosure?.overrode?.includes('TASK_RESULT_REVIEW_REQUIRED')) {
|
|
159
|
+
this.log(' Closed past the owner-declared required Review — the override is recorded (resolution.closure.overrode).');
|
|
160
|
+
}
|
|
161
|
+
if (resolutionClosure?.closable === false) {
|
|
162
|
+
const parts = [];
|
|
163
|
+
const unmet = resolutionClosure.expectations?.unmet?.length ?? 0;
|
|
164
|
+
if (unmet > 0) {
|
|
165
|
+
parts.push(`${unmet} Expectation${unmet === 1 ? '' : 's'} still unmet`);
|
|
166
|
+
}
|
|
167
|
+
parts.push(...(resolutionClosure.blockers || []).filter((code) => code !== 'TASK_EXPECTATIONS_NOT_MET' && code !== 'TASK_RESULT_REVIEW_REQUIRED'));
|
|
168
|
+
if (parts.length) {
|
|
169
|
+
this.log(` Closed over ${parts.join('; ')} (resolution.closure).`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
141
172
|
}
|
|
142
173
|
/**
|
|
143
174
|
* Name the project the receipt lands in, resolving its title from the task's
|
|
@@ -7,6 +7,7 @@ const outbox_1 = require("../../../lib/outbox");
|
|
|
7
7
|
const task_resolver_1 = require("../../../lib/task-resolver");
|
|
8
8
|
const web_url_1 = require("../../../lib/web-url");
|
|
9
9
|
const api_fetch_1 = require("../../../lib/api-fetch");
|
|
10
|
+
const task_closure_1 = require("../../../lib/task-closure");
|
|
10
11
|
const session_task_endpoints_1 = require("../../../lib/session-task-endpoints");
|
|
11
12
|
function parseJson(value, label) {
|
|
12
13
|
if (!value)
|
|
@@ -126,7 +127,16 @@ class TasksResultSubmit extends base_command_1.BaseCommand {
|
|
|
126
127
|
const url = (0, web_url_1.taskUrlFrom)(this.cliConfig.baseURL, { id: task.id });
|
|
127
128
|
if (flags.json)
|
|
128
129
|
return this.log(JSON.stringify({ ...result, url }, null, 2));
|
|
129
|
-
|
|
130
|
+
// Say what came back, never what we hope came back.
|
|
131
|
+
//
|
|
132
|
+
// This line used to read "...; it is ready for review." unconditionally,
|
|
133
|
+
// which was false for every Task with an unassessed Expectation — and the
|
|
134
|
+
// managed instructions told the agent to read the status the call returns,
|
|
135
|
+
// which the call did not carry. Submitting a Result is not closing a Task;
|
|
136
|
+
// the response now reports where it stands and this prints exactly that.
|
|
137
|
+
this.log(`Submitted Result v${result.result.version} for ${task.id}.`);
|
|
138
|
+
for (const line of (0, task_closure_1.closureReport)(result.closure))
|
|
139
|
+
this.log(line);
|
|
130
140
|
if (url)
|
|
131
141
|
this.log(`Task: ${url}`);
|
|
132
142
|
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { BaseCommand } from '../../base-command';
|
|
2
|
+
/**
|
|
3
|
+
* Everything in one Space that is waiting on a judgement, in one pass.
|
|
4
|
+
*
|
|
5
|
+
* WHY THIS EXISTS
|
|
6
|
+
* ---------------
|
|
7
|
+
* An agent fans out. One session routinely produces nine Tasks carrying twenty
|
|
8
|
+
* or more Expectations, and every surface for settling them was built for one
|
|
9
|
+
* Task at a time — so the cost of CLOSING the work grew linearly with how well
|
|
10
|
+
* the work was DECOMPOSED, which punishes exactly the decomposition the product
|
|
11
|
+
* wants. Finding what was owed meant knowing that `tasks expectations` exists
|
|
12
|
+
* and running it per Task, having first worked out which Tasks to run it on.
|
|
13
|
+
*
|
|
14
|
+
* This is a read. It changes nothing, it names every outstanding judgement in
|
|
15
|
+
* the Space with the evidence already bound to it, and it prints the exact
|
|
16
|
+
* command that settles each one — so a reviewer can work down a list instead of
|
|
17
|
+
* reconstructing it.
|
|
18
|
+
*/
|
|
19
|
+
export default class TasksReviewQueue extends BaseCommand {
|
|
20
|
+
static description: string;
|
|
21
|
+
static examples: string[];
|
|
22
|
+
static flags: {
|
|
23
|
+
space: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
24
|
+
actionable: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
25
|
+
limit: import("@oclif/core/lib/interfaces").OptionFlag<number, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
26
|
+
json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
27
|
+
};
|
|
28
|
+
run(): Promise<void>;
|
|
29
|
+
}
|