@skrr-ai/cli 0.1.128 → 0.1.130
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/dist/base-command.d.ts +12 -0
- package/dist/base-command.js +65 -0
- package/dist/commands/agenda/trigger/create.js +9 -1
- package/dist/commands/agenda/trigger/list.d.ts +2 -1
- package/dist/commands/agenda/trigger/list.js +55 -6
- package/dist/commands/agents/create.js +3 -1
- package/dist/commands/agents/reflect.d.ts +6 -0
- package/dist/commands/agents/reflect.js +45 -6
- package/dist/commands/agents/schedule-overview.d.ts +17 -0
- package/dist/commands/agents/schedule-overview.js +33 -9
- package/dist/commands/agents/triggers/policy.js +3 -1
- package/dist/commands/browser/persistent-profile.d.ts +22 -0
- package/dist/commands/browser/persistent-profile.js +46 -0
- package/dist/commands/commitments/create.js +3 -1
- package/dist/commands/commitments/effective-policy.js +6 -0
- package/dist/commands/commitments/explain.js +10 -1
- package/dist/commands/commitments/plan.d.ts +14 -0
- package/dist/commands/commitments/plan.js +32 -0
- package/dist/commands/commitments/preflight.d.ts +1 -1
- package/dist/commands/commitments/preflight.js +12 -4
- package/dist/commands/commitments/show.d.ts +9 -0
- package/dist/commands/commitments/show.js +14 -1
- package/dist/commands/compass/revisions.d.ts +6 -2
- package/dist/commands/compass/revisions.js +13 -5
- package/dist/commands/compass/tactic.d.ts +5 -0
- package/dist/commands/compass/tactic.js +14 -0
- package/dist/commands/followups/plans/create.js +1 -1
- package/dist/commands/harnesses/list.js +1 -1
- package/dist/commands/northstars/create.js +6 -1
- package/dist/commands/northstars/governance/configure.js +1 -1
- package/dist/commands/northstars/intents/decide.js +2 -3
- package/dist/commands/northstars/list.js +1 -1
- package/dist/commands/northstars/review-now.js +5 -0
- package/dist/commands/northstars/reviews.js +15 -3
- package/dist/commands/northstars/show.js +1 -1
- package/dist/commands/spaces/auto-executor/runs.d.ts +9 -1
- package/dist/commands/spaces/auto-executor/runs.js +18 -1
- package/dist/commands/spaces/heartbeats/create.js +7 -5
- package/dist/commands/spaces/heartbeats/status.js +10 -0
- package/dist/commands/spaces/heartbeats/update.js +5 -3
- package/dist/commands/store/artifacts/releases.d.ts +20 -0
- package/dist/commands/store/artifacts/releases.js +85 -0
- package/dist/commands/store/library.d.ts +14 -0
- package/dist/commands/store/library.js +71 -0
- package/dist/commands/tasks/archive.js +6 -0
- package/dist/commands/tasks/list.d.ts +48 -0
- package/dist/commands/tasks/list.js +141 -9
- package/dist/commands/tasks/pause-schedule.js +1 -1
- package/dist/commands/tasks/remind.js +23 -11
- package/dist/commands/tasks/resume-schedule.js +4 -1
- package/dist/commands/tasks/retry-schedule.js +6 -3
- package/dist/commands/tasks/schedule.js +35 -8
- package/dist/commands/tasks/self-schedule.d.ts +56 -0
- package/dist/commands/tasks/self-schedule.js +179 -21
- package/dist/commands/tasks/show.js +4 -0
- package/dist/lib/agent-trigger-listing.d.ts +26 -0
- package/dist/lib/agent-trigger-listing.js +63 -0
- package/dist/lib/agentic-stream.js +138 -41
- package/dist/lib/commitment-ledgers.js +3 -1
- package/dist/lib/commitments.d.ts +24 -0
- package/dist/lib/commitments.js +64 -4
- package/dist/lib/compasses.d.ts +2 -0
- package/dist/lib/iso-instant.d.ts +52 -0
- package/dist/lib/iso-instant.js +162 -0
- package/dist/lib/northstars.d.ts +87 -4
- package/dist/lib/northstars.js +226 -94
- package/dist/lib/proposals.js +6 -2
- package/dist/lib/reflection.d.ts +58 -0
- package/dist/lib/reflection.js +115 -6
- package/dist/lib/store-artifact-releases.d.ts +39 -0
- package/dist/lib/store-artifact-releases.js +12 -0
- package/dist/lib/store-library.d.ts +37 -0
- package/dist/lib/store-library.js +12 -0
- package/dist/lib/task-calendar.d.ts +19 -0
- package/dist/lib/task-calendar.js +72 -0
- package/dist/lib/task-operations.js +2 -0
- package/dist/lib/task-recurrence-outcome.js +3 -1
- package/dist/lib/task-recurrence-summary.d.ts +15 -0
- package/dist/lib/task-recurrence-summary.js +228 -0
- package/dist/lib/task-reminder.d.ts +28 -0
- package/dist/lib/task-reminder.js +50 -0
- package/dist/lib/task-schedule-notes.d.ts +46 -0
- package/dist/lib/task-schedule-notes.js +71 -0
- package/dist/lib/triggers.d.ts +31 -2
- package/dist/lib/triggers.js +38 -18
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/daemonWire.js +11 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/deviceIdentityBridge.d.ts +9 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/deviceIdentityBridge.js +22 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/executorStopReceipt.d.ts +123 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/executorStopReceipt.js +160 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/index.d.ts +2 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/index.js +19 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/daemonWire.js +11 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/deviceIdentityBridge.d.ts +9 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/deviceIdentityBridge.js +28 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/executorStopReceipt.d.ts +123 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/executorStopReceipt.js +173 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/index.d.ts +2 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/index.js +3 -1
- package/dist/node_modules/@skrr-ai/auth-core/package.json +1 -1
- package/dist/node_modules/@skrr-ai/data-provider/index.js +6772 -6675
- package/oclif.manifest.json +282 -40
- package/package.json +1 -1
|
@@ -18,6 +18,20 @@ import { BaseCommand } from '../../base-command';
|
|
|
18
18
|
* the command body so it can be unit-tested without the oclif harness.
|
|
19
19
|
*/
|
|
20
20
|
export declare function formatDroppedFields(droppedFields: string[] | undefined): string[];
|
|
21
|
+
/**
|
|
22
|
+
* The zone a proposal's daily times will be read in, said before the person applies it (OSK-21336).
|
|
23
|
+
* The planner is not told a timezone unless `--timezone` is passed, and the proposal is printed as raw JSON,
|
|
24
|
+
* so "every day at 9am" came back as `times: ["09:00"]` with no zone; applied as it is, a daily cadence with
|
|
25
|
+
* no zone is read in UTC, while the web wizard writes the browser's zone for the same proposal and says so.
|
|
26
|
+
* Nothing for a proposal with no daily times.
|
|
27
|
+
*/
|
|
28
|
+
export declare function planTimezoneLines(proposal: {
|
|
29
|
+
cadence?: {
|
|
30
|
+
mode?: unknown;
|
|
31
|
+
times?: unknown;
|
|
32
|
+
timezone?: unknown;
|
|
33
|
+
};
|
|
34
|
+
} | null | undefined, requestedTimezone?: string): string[];
|
|
21
35
|
export default class CommitmentsPlan extends BaseCommand {
|
|
22
36
|
static description: string;
|
|
23
37
|
static examples: string[];
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.formatDroppedFields = formatDroppedFields;
|
|
4
|
+
exports.planTimezoneLines = planTimezoneLines;
|
|
4
5
|
const core_1 = require("@oclif/core");
|
|
5
6
|
const base_command_1 = require("../../base-command");
|
|
6
7
|
const commitments_1 = require("../../lib/commitments");
|
|
@@ -36,6 +37,35 @@ function formatDroppedFields(droppedFields) {
|
|
|
36
37
|
lines.push(` - ${field}`);
|
|
37
38
|
return lines;
|
|
38
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* The zone a proposal's daily times will be read in, said before the person applies it (OSK-21336).
|
|
42
|
+
* The planner is not told a timezone unless `--timezone` is passed, and the proposal is printed as raw JSON,
|
|
43
|
+
* so "every day at 9am" came back as `times: ["09:00"]` with no zone; applied as it is, a daily cadence with
|
|
44
|
+
* no zone is read in UTC, while the web wizard writes the browser's zone for the same proposal and says so.
|
|
45
|
+
* Nothing for a proposal with no daily times.
|
|
46
|
+
*/
|
|
47
|
+
function planTimezoneLines(proposal, requestedTimezone) {
|
|
48
|
+
const cadence = proposal?.cadence;
|
|
49
|
+
if (!cadence || cadence.mode !== 'daily' || !Array.isArray(cadence.times) || !cadence.times.length) {
|
|
50
|
+
return [];
|
|
51
|
+
}
|
|
52
|
+
const times = cadence.times.filter((time) => typeof time === 'string');
|
|
53
|
+
if (!times.length)
|
|
54
|
+
return [];
|
|
55
|
+
const label = `daily time${times.length === 1 ? '' : 's'} ${times.join(', ')}`;
|
|
56
|
+
if (typeof cadence.timezone === 'string' && cadence.timezone) {
|
|
57
|
+
return ['', `The ${label} ${times.length === 1 ? 'is' : 'are'} read in ${cadence.timezone}.`];
|
|
58
|
+
}
|
|
59
|
+
return [
|
|
60
|
+
'',
|
|
61
|
+
`Note: the ${label} ${times.length === 1 ? 'carries' : 'carry'} no timezone, so applying this as it is reads ` +
|
|
62
|
+
`${times.length === 1 ? 'it' : 'them'} in UTC (the web wizard would use your browser's zone). ` +
|
|
63
|
+
(requestedTimezone
|
|
64
|
+
? `You planned with --timezone ${requestedTimezone}, but the proposal did not keep it: add "timezone": ` +
|
|
65
|
+
`"${requestedTimezone}" to its cadence.`
|
|
66
|
+
: 'Add "timezone": "<IANA zone>" to its cadence, or plan again with --timezone <IANA zone>.'),
|
|
67
|
+
];
|
|
68
|
+
}
|
|
39
69
|
class CommitmentsPlan extends base_command_1.BaseCommand {
|
|
40
70
|
static description = 'Draft a commitment contract from a sentence (read-only proposal — nothing is created)';
|
|
41
71
|
static examples = [
|
|
@@ -115,6 +145,8 @@ class CommitmentsPlan extends base_command_1.BaseCommand {
|
|
|
115
145
|
this.log('No proposal produced.');
|
|
116
146
|
return;
|
|
117
147
|
}
|
|
148
|
+
for (const line of planTimezoneLines(response.proposal, flags.timezone))
|
|
149
|
+
this.log(line);
|
|
118
150
|
this.log('');
|
|
119
151
|
this.log('Proposed contract:');
|
|
120
152
|
this.log(JSON.stringify(response.proposal, null, 2));
|
|
@@ -43,7 +43,7 @@ export declare function nextRunsLines(report: {
|
|
|
43
43
|
* observes. The headline carries the caveat instead of contradicting the gate below it.
|
|
44
44
|
*/
|
|
45
45
|
export declare function preflightHeadline(report: Pick<CommitmentPreflightReport, 'verdict' | 'gates'>, persisted: boolean): string;
|
|
46
|
-
export declare function preflightGateLines(gate: PreflightGate, verbose?: boolean): string[];
|
|
46
|
+
export declare function preflightGateLines(gate: PreflightGate, verbose?: boolean, refusesActivation?: boolean): string[];
|
|
47
47
|
/**
|
|
48
48
|
* The `Attention:` footer, and under it the settings behind the verdict (OSK-21120).
|
|
49
49
|
*
|
|
@@ -63,7 +63,7 @@ function preflightHeadline(report, persisted) {
|
|
|
63
63
|
? `${label}: Ready to run, but its daily Run budget is 0, so no agent turn will start`
|
|
64
64
|
: `${label}: Ready to run`;
|
|
65
65
|
}
|
|
66
|
-
function preflightGateLines(gate, verbose = false) {
|
|
66
|
+
function preflightGateLines(gate, verbose = false, refusesActivation = false) {
|
|
67
67
|
// "Could it contact you now?" is not a Run gate. It answers whether a message
|
|
68
68
|
// would reach the owner, and a limit the owner set themselves (zero nudges a day,
|
|
69
69
|
// quiet hours) is a chosen quiet, not a defect. It carried the same BLOCK tag, a
|
|
@@ -94,7 +94,13 @@ function preflightGateLines(gate, verbose = false) {
|
|
|
94
94
|
// A `block` the report itself marks advisory stops nothing: it is not a Run-admission gate, so it
|
|
95
95
|
// never feeds the verdict or `pack activate`. Printed BLOCK, `pack preflight` read "ready" above
|
|
96
96
|
// two BLOCK lines (dogfooded on a goal_advance draft); the tag has to mean what the report means.
|
|
97
|
-
|
|
97
|
+
//
|
|
98
|
+
// An advisory gate the SERVER says refuses activation is a different case (OSK-21258): `resume`
|
|
99
|
+
// answers 409 for it, so it is tagged BLOCK and says what it stops. `info (advisory: does not stop a
|
|
100
|
+
// run)` beside an "Activation: would be refused" section naming the same gate was two answers to one
|
|
101
|
+
// question.
|
|
102
|
+
const advisoryBlock = gate.verdict === 'block' && gate.admission === 'advisory' && !refusesActivation;
|
|
103
|
+
const stopsActivationOnly = gate.verdict === 'block' && gate.admission === 'advisory' && refusesActivation;
|
|
98
104
|
const mark = advisoryBlock
|
|
99
105
|
? 'info'
|
|
100
106
|
: gate.verdict === 'pass'
|
|
@@ -119,7 +125,8 @@ function preflightGateLines(gate, verbose = false) {
|
|
|
119
125
|
const showReason = verbose || (gate.verdict === 'block' && !hasNote);
|
|
120
126
|
const lines = [
|
|
121
127
|
` ${mark.padEnd(5)} ${gate.label}${showReason && gate.reason ? ` — ${gate.reason}` : ''}` +
|
|
122
|
-
(advisoryBlock ? ' (advisory: does not stop a run)' : '')
|
|
128
|
+
(advisoryBlock ? ' (advisory: does not stop a run)' : '') +
|
|
129
|
+
(stopsActivationOnly ? ' (stops activation, not a run that is already live)' : ''),
|
|
123
130
|
];
|
|
124
131
|
if (hasNote) {
|
|
125
132
|
lines.push(` ${String(note).trim()}`);
|
|
@@ -280,7 +287,8 @@ class CommitmentsPreflight extends base_command_1.BaseCommand {
|
|
|
280
287
|
}
|
|
281
288
|
this.log('\nGates:');
|
|
282
289
|
for (const gate of report.gates || []) {
|
|
283
|
-
|
|
290
|
+
const refusesActivation = (0, commitments_1.gateRefusesActivation)(report.activation, gate);
|
|
291
|
+
for (const line of preflightGateLines(gate, flags.verbose, refusesActivation))
|
|
284
292
|
this.log(line);
|
|
285
293
|
}
|
|
286
294
|
if (report.capabilities?.length) {
|
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
import { BaseCommand } from '../../base-command';
|
|
2
|
+
/**
|
|
3
|
+
* What `show --json` prints, said where the flag is read (OSK-21334, from OSK-21205): the server's
|
|
4
|
+
* read envelope, with the commitment UNDER `.commitment`. `create --json` and `update --json` print
|
|
5
|
+
* the commitment itself, so a script written against one raised `KeyError: 'priority'` on the other.
|
|
6
|
+
* The shape is kept (moving the commitment up a level would break every reader of `show --json`) and
|
|
7
|
+
* no top-level copy is added; `docs/cli/SKRR_COMMITMENTS.md` says why, and
|
|
8
|
+
* `__tests__/json-shapes.spec.ts` runs both commands against this sentence.
|
|
9
|
+
*/
|
|
10
|
+
export declare const SHOW_JSON_DESCRIPTION: string;
|
|
2
11
|
/**
|
|
3
12
|
* `skrr commitments show <id>` — the commitment's contract + live control-loop
|
|
4
13
|
* state (health, last check, next check, unresolved-check streak), plus the most
|
|
@@ -1,10 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SHOW_JSON_DESCRIPTION = void 0;
|
|
3
4
|
const core_1 = require("@oclif/core");
|
|
4
5
|
const base_command_1 = require("../../base-command");
|
|
5
6
|
const commitments_1 = require("../../lib/commitments");
|
|
6
7
|
const web_url_1 = require("../../lib/web-url");
|
|
7
8
|
const commitment_product_1 = require("../../lib/commitment-product");
|
|
9
|
+
/**
|
|
10
|
+
* What `show --json` prints, said where the flag is read (OSK-21334, from OSK-21205): the server's
|
|
11
|
+
* read envelope, with the commitment UNDER `.commitment`. `create --json` and `update --json` print
|
|
12
|
+
* the commitment itself, so a script written against one raised `KeyError: 'priority'` on the other.
|
|
13
|
+
* The shape is kept (moving the commitment up a level would break every reader of `show --json`) and
|
|
14
|
+
* no top-level copy is added; `docs/cli/SKRR_COMMITMENTS.md` says why, and
|
|
15
|
+
* `__tests__/json-shapes.spec.ts` runs both commands against this sentence.
|
|
16
|
+
*/
|
|
17
|
+
exports.SHOW_JSON_DESCRIPTION = 'Output the read envelope as JSON: { commitment, latestCheck, operatingState, abilities, url }. ' +
|
|
18
|
+
'The commitment itself is under .commitment (so the priority is .commitment.priority); ' +
|
|
19
|
+
'create --json and update --json print the commitment unwrapped.';
|
|
8
20
|
/**
|
|
9
21
|
* `skrr commitments show <id>` — the commitment's contract + live control-loop
|
|
10
22
|
* state (health, last check, next check, unresolved-check streak), plus the most
|
|
@@ -18,12 +30,13 @@ class CommitmentsShow extends base_command_1.BaseCommand {
|
|
|
18
30
|
static examples = [
|
|
19
31
|
'<%= config.bin %> commitments show <commitment-id>',
|
|
20
32
|
'<%= config.bin %> commitments show <commitment-id> --json',
|
|
33
|
+
"<%= config.bin %> commitments show <commitment-id> --json | jq '.commitment.priority'",
|
|
21
34
|
];
|
|
22
35
|
static args = {
|
|
23
36
|
id: core_1.Args.string({ description: 'Commitment ID', required: true, ignoreStdin: true }),
|
|
24
37
|
};
|
|
25
38
|
static flags = {
|
|
26
|
-
json: core_1.Flags.boolean({ description:
|
|
39
|
+
json: core_1.Flags.boolean({ description: exports.SHOW_JSON_DESCRIPTION }),
|
|
27
40
|
verbose: core_1.Flags.boolean({
|
|
28
41
|
description: 'Include raw compatibility policy and check diagnostics',
|
|
29
42
|
}),
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { BaseCommand } from '../../base-command';
|
|
2
|
-
/**
|
|
3
|
-
|
|
2
|
+
/**
|
|
3
|
+
* What to say under a list the ledger had more rows for. `total` is the API's own count of the
|
|
4
|
+
* ledger; with it the footer is exact (`Showing 20 of 25`). A server that does not send it, or one
|
|
5
|
+
* whose count is not above what was shown, still gets the lookahead's true "at least" wording.
|
|
6
|
+
*/
|
|
7
|
+
export declare function revisionsFooter(shown: number, total?: number): string;
|
|
4
8
|
/**
|
|
5
9
|
* `skrr compass revisions <compass-id> --agent <id>` — the append-only ledger.
|
|
6
10
|
*
|
|
@@ -4,11 +4,18 @@ exports.revisionsFooter = revisionsFooter;
|
|
|
4
4
|
const core_1 = require("@oclif/core");
|
|
5
5
|
const base_command_1 = require("../../base-command");
|
|
6
6
|
const compasses_1 = require("../../lib/compasses");
|
|
7
|
-
/**
|
|
8
|
-
|
|
7
|
+
/**
|
|
8
|
+
* What to say under a list the ledger had more rows for. `total` is the API's own count of the
|
|
9
|
+
* ledger; with it the footer is exact (`Showing 20 of 25`). A server that does not send it, or one
|
|
10
|
+
* whose count is not above what was shown, still gets the lookahead's true "at least" wording.
|
|
11
|
+
*/
|
|
12
|
+
function revisionsFooter(shown, total) {
|
|
13
|
+
const of = typeof total === 'number' && Number.isInteger(total) && total > shown
|
|
14
|
+
? `${total}`
|
|
15
|
+
: `at least ${shown + 1}`;
|
|
9
16
|
return shown >= 100
|
|
10
|
-
? `Showing ${shown} of
|
|
11
|
-
: `Showing ${shown} of
|
|
17
|
+
? `Showing ${shown} of ${of} revisions. --limit is capped at 100, so older ones cannot be listed yet.`
|
|
18
|
+
: `Showing ${shown} of ${of} revisions — use --limit (up to 100) to see more.`;
|
|
12
19
|
}
|
|
13
20
|
/**
|
|
14
21
|
* `skrr compass revisions <compass-id> --agent <id>` — the append-only ledger.
|
|
@@ -55,8 +62,9 @@ class CompassRevisions extends base_command_1.BaseCommand {
|
|
|
55
62
|
(0, compasses_1.renderRevisionList)(rows, (line) => this.log(line));
|
|
56
63
|
// The API reads one row past the page, so `has_more` is true only when older rows exist. A
|
|
57
64
|
// 22-revision ledger used to list 20 rows and stop, with v1 (the create) silently missing.
|
|
65
|
+
// `total` (the ledger's own count) makes the footer exact when the server sends it.
|
|
58
66
|
if (response.has_more)
|
|
59
|
-
this.log(revisionsFooter(rows.length));
|
|
67
|
+
this.log(revisionsFooter(rows.length, response.total));
|
|
60
68
|
}
|
|
61
69
|
}
|
|
62
70
|
exports.default = CompassRevisions;
|
|
@@ -7,6 +7,10 @@ import { BaseCommand } from '../../base-command';
|
|
|
7
7
|
* purpose: expressing an append as a full-object write would let two concurrent
|
|
8
8
|
* learners clobber each other's entry. It says which of appended / updated /
|
|
9
9
|
* unchanged happened, and names any tactic that rolled off the end.
|
|
10
|
+
*
|
|
11
|
+
* `--invariant <target-id>` chooses the invariant target the tactic is filed under. Without it
|
|
12
|
+
* the API files it under the general target (the one with no domain), else the first, and the
|
|
13
|
+
* output says which; a Compass whose targets all carry a domain used to leave no way to choose.
|
|
10
14
|
*/
|
|
11
15
|
export default class CompassTactic extends BaseCommand {
|
|
12
16
|
static description: string;
|
|
@@ -19,6 +23,7 @@ export default class CompassTactic extends BaseCommand {
|
|
|
19
23
|
agent: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
20
24
|
description: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
21
25
|
id: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
26
|
+
invariant: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
22
27
|
reason: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
23
28
|
};
|
|
24
29
|
run(): Promise<void>;
|
|
@@ -11,11 +11,16 @@ const compasses_1 = require("../../lib/compasses");
|
|
|
11
11
|
* purpose: expressing an append as a full-object write would let two concurrent
|
|
12
12
|
* learners clobber each other's entry. It says which of appended / updated /
|
|
13
13
|
* unchanged happened, and names any tactic that rolled off the end.
|
|
14
|
+
*
|
|
15
|
+
* `--invariant <target-id>` chooses the invariant target the tactic is filed under. Without it
|
|
16
|
+
* the API files it under the general target (the one with no domain), else the first, and the
|
|
17
|
+
* output says which; a Compass whose targets all carry a domain used to leave no way to choose.
|
|
14
18
|
*/
|
|
15
19
|
class CompassTactic extends base_command_1.BaseCommand {
|
|
16
20
|
static description = 'Record a learned tactic on a compass (appends, or updates the tactic with the same --id)';
|
|
17
21
|
static examples = [
|
|
18
22
|
'<%= config.bin %> compass tactic agch_abc --agent agent_xyz --description "Roll back before paging on a deploy regression"',
|
|
23
|
+
'<%= config.bin %> compass tactic agch_abc --agent agent_xyz --invariant invariant_2 --description "Page the owner before restarting"',
|
|
19
24
|
];
|
|
20
25
|
static args = {
|
|
21
26
|
compassId: core_1.Args.string({ ignoreStdin: true, description: 'Compass ID', required: true }),
|
|
@@ -27,17 +32,26 @@ class CompassTactic extends base_command_1.BaseCommand {
|
|
|
27
32
|
id: core_1.Flags.string({
|
|
28
33
|
description: 'Stable tactic ID. A known ID with a different description updates that entry; with the same description nothing is written.',
|
|
29
34
|
}),
|
|
35
|
+
invariant: core_1.Flags.string({
|
|
36
|
+
description: 'Invariant target ID to file the tactic under (the `id` that `compass show` prints for each target). ' +
|
|
37
|
+
'Default: the general target (the one with no domain), else the first. An unknown ID is refused with the IDs the compass has; ' +
|
|
38
|
+
'a tactic --id that already lives on another target is refused too, so name that target to update it.',
|
|
39
|
+
}),
|
|
30
40
|
reason: core_1.Flags.string({ description: 'Why — recorded on the revision ledger' }),
|
|
31
41
|
};
|
|
32
42
|
async run() {
|
|
33
43
|
this.requireAuth();
|
|
34
44
|
const { args, flags } = await this.parse(CompassTactic);
|
|
45
|
+
if (flags.invariant !== undefined && !flags.invariant.trim()) {
|
|
46
|
+
this.error('--invariant needs an invariant target ID. `compass show` prints each target as `id <id>`; leave --invariant off to use the default target.');
|
|
47
|
+
}
|
|
35
48
|
let compass;
|
|
36
49
|
try {
|
|
37
50
|
compass = await compasses_1.compassApi.appendTactic(args.compassId, {
|
|
38
51
|
agentId: flags.agent,
|
|
39
52
|
description: flags.description,
|
|
40
53
|
...(flags.id ? { id: flags.id } : {}),
|
|
54
|
+
...(flags.invariant ? { invariantTargetId: flags.invariant.trim() } : {}),
|
|
41
55
|
...(flags.reason ? { reason: flags.reason } : {}),
|
|
42
56
|
});
|
|
43
57
|
}
|
|
@@ -29,7 +29,7 @@ class LookbackPlansCreate extends base_command_1.BaseCommand {
|
|
|
29
29
|
try {
|
|
30
30
|
const result = await lookbackPlans_1.lookbackPlansApi.create(body);
|
|
31
31
|
if (flags.json) {
|
|
32
|
-
this.
|
|
32
|
+
this.printJsonResult(result);
|
|
33
33
|
return;
|
|
34
34
|
}
|
|
35
35
|
// The four create commands say when the server recorded weaker provenance than the CLI
|
|
@@ -96,7 +96,7 @@ function emptyListMessage(input) {
|
|
|
96
96
|
exports.ALIAS_MARKER = '*';
|
|
97
97
|
function harnessNameCell(row) {
|
|
98
98
|
// The same rule the web sidebar renders (OSK-9290): a name stored under an
|
|
99
|
-
// older spelling or
|
|
99
|
+
// older spelling or retired-brand name is not a second product.
|
|
100
100
|
const name = row.name ? (0, data_provider_1.canonicalizeHarnessLabel)(row.name) : (0, format_1.formatCell)(row.name);
|
|
101
101
|
return (0, harness_labels_1.isAliasCoveringSharedName)(row) ? `${exports.ALIAS_MARKER} ${name}` : name;
|
|
102
102
|
}
|
|
@@ -15,10 +15,11 @@ const HOUR_MS = 60 * 60 * 1000;
|
|
|
15
15
|
* `skrr northstars governance configure`.
|
|
16
16
|
*/
|
|
17
17
|
class NorthstarsCreate extends base_command_1.BaseCommand {
|
|
18
|
-
static description =
|
|
18
|
+
static description = `Create a northstar (the portfolio layer above commitments)\n\n${northstars_1.NORTHSTAR_WORKSPACE_CREATE_HELP}`;
|
|
19
19
|
static examples = [
|
|
20
20
|
'<%= config.bin %> northstars create --title "Reach $10M ARR"',
|
|
21
21
|
'<%= config.bin %> northstars create --title "Reliability" --tier critical --max-active 5 --review-interval-hours 24',
|
|
22
|
+
'<%= config.bin %> northstars create --title "Reliability" --workspace <workspace-id>',
|
|
22
23
|
];
|
|
23
24
|
static flags = {
|
|
24
25
|
json: core_1.Flags.boolean({ description: 'Output as JSON' }),
|
|
@@ -98,6 +99,10 @@ class NorthstarsCreate extends base_command_1.BaseCommand {
|
|
|
98
99
|
}
|
|
99
100
|
this.log(`Created ${created.id} — ${created.title} (${created.status})`);
|
|
100
101
|
this.log(`URL: ${created.url ?? '-'}`);
|
|
102
|
+
this.log((0, northstars_1.northstarWorkspaceLine)(created));
|
|
103
|
+
const workspaceNote = (0, northstars_1.createdNorthstarNote)(created);
|
|
104
|
+
if (workspaceNote)
|
|
105
|
+
this.log(workspaceNote);
|
|
101
106
|
if (flags['max-active'] === 0)
|
|
102
107
|
this.log('Attention max active 0 (no cap)');
|
|
103
108
|
this.log(flags['review-interval-hours'] !== undefined
|
|
@@ -45,7 +45,7 @@ class NorthstarsGovernanceConfigure extends base_command_1.BaseCommand {
|
|
|
45
45
|
multiple: true,
|
|
46
46
|
}),
|
|
47
47
|
'require-approval-for': core_1.Flags.string({
|
|
48
|
-
description:
|
|
48
|
+
description: `Change class that always needs a human (repeatable; replaces the current list). ${northstars_1.CRITICAL_COMMITMENT_APPROVAL_NOTE}. With critical_commitment removed, a bounded_auto review may apply a one-tier-step promotion to critical without asking`,
|
|
49
49
|
options: [...northstars_1.NORTHSTAR_APPROVAL_TRIGGERS],
|
|
50
50
|
multiple: true,
|
|
51
51
|
}),
|
|
@@ -74,14 +74,13 @@ class NorthstarsIntentsDecide extends base_command_1.BaseCommand {
|
|
|
74
74
|
(ctx.decision === 'reject' && verdict === 'rejected'));
|
|
75
75
|
if (alreadyHolds) {
|
|
76
76
|
if (flags.json) {
|
|
77
|
-
this.
|
|
78
|
-
ok: true,
|
|
77
|
+
this.printJsonResult({
|
|
79
78
|
verdict,
|
|
80
79
|
replayed: true,
|
|
81
80
|
...(body.decidedAt ? { decidedAt: body.decidedAt } : {}),
|
|
82
81
|
...(body.decidedByYou !== undefined ? { decidedByYou: body.decidedByYou } : {}),
|
|
83
82
|
reasonText: text,
|
|
84
|
-
}
|
|
83
|
+
});
|
|
85
84
|
}
|
|
86
85
|
else {
|
|
87
86
|
this.log(`${args.intentId} → ${verdict}`);
|
|
@@ -12,7 +12,7 @@ const northstars_1 = require("../../lib/northstars");
|
|
|
12
12
|
* their health on a cadence.
|
|
13
13
|
*/
|
|
14
14
|
class NorthstarsList extends base_command_1.BaseCommand {
|
|
15
|
-
static description =
|
|
15
|
+
static description = `List northstars (the portfolio layer above commitments)\n\nThe WORKSPACE column is a shortened workspace id (--json has the full workspaceId) or "personal". ${northstars_1.NORTHSTAR_WORKSPACE_READ_HELP}`;
|
|
16
16
|
static examples = [
|
|
17
17
|
'<%= config.bin %> northstars list',
|
|
18
18
|
'<%= config.bin %> northstars list --status active',
|
|
@@ -46,6 +46,11 @@ class NorthstarsReviewNow extends base_command_1.BaseCommand {
|
|
|
46
46
|
this.log(`Review ${String(review.id)} (${String(review.status)})`);
|
|
47
47
|
}
|
|
48
48
|
this.log((0, northstars_1.describeReviewAllocations)(result));
|
|
49
|
+
// The allocation above gives each commitment at least 1/day; when the budget is smaller than
|
|
50
|
+
// the number of active commitments that adds up to more than the budget (OSK-21334).
|
|
51
|
+
const floorNote = (0, northstars_1.runBudgetFloorNote)(result.runBudgetFloor);
|
|
52
|
+
if (floorNote)
|
|
53
|
+
this.log(` ! ${floorNote}`);
|
|
49
54
|
this.log(`Applied ${String(result.appliedIntents ?? 0)} intent(s)`);
|
|
50
55
|
if (governanceRun) {
|
|
51
56
|
this.log(governanceRun.reserved
|
|
@@ -28,20 +28,32 @@ class NorthstarsReviews extends base_command_1.BaseCommand {
|
|
|
28
28
|
description: 'Filter by review status',
|
|
29
29
|
options: [...northstars_1.NORTHSTAR_REVIEW_STATUSES],
|
|
30
30
|
}),
|
|
31
|
-
review: core_1.Flags.string({
|
|
31
|
+
review: core_1.Flags.string({
|
|
32
|
+
description: 'Show ONE review in full, including its intents. Takes the full id or the short form `intents list` prints in REVIEW',
|
|
33
|
+
}),
|
|
32
34
|
wide: northstars_1.northstarWideFlag,
|
|
33
35
|
};
|
|
34
36
|
async run() {
|
|
35
37
|
this.requireAuth();
|
|
36
38
|
const { args, flags } = await this.parse(NorthstarsReviews);
|
|
37
39
|
if (flags.review) {
|
|
38
|
-
let
|
|
40
|
+
let looked;
|
|
39
41
|
try {
|
|
40
|
-
|
|
42
|
+
// The full id, or the short form `northstars intents list` prints in REVIEW.
|
|
43
|
+
looked = await (0, northstars_1.lookupReview)(args.northstarId, flags.review);
|
|
41
44
|
}
|
|
42
45
|
catch (err) {
|
|
43
46
|
this.handleApiError(err);
|
|
44
47
|
}
|
|
48
|
+
if ('ambiguous' in looked) {
|
|
49
|
+
this.failWithCliError({
|
|
50
|
+
message: `\`${flags.review}\` is the start of ${looked.ambiguous.length} reviews of this northstar (${looked.ambiguous.join(', ')}). Pass more of the id.`,
|
|
51
|
+
code: 'REVIEW_REF_AMBIGUOUS',
|
|
52
|
+
exit: 2,
|
|
53
|
+
retryable: false,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
const review = looked.review;
|
|
45
57
|
if (flags.json) {
|
|
46
58
|
this.log(JSON.stringify(review, null, 2));
|
|
47
59
|
return;
|
|
@@ -27,7 +27,7 @@ function normalizeNorthstarShowResponse(status) {
|
|
|
27
27
|
* asking of a portfolio, which is what is actually in it.
|
|
28
28
|
*/
|
|
29
29
|
class NorthstarsShow extends base_command_1.BaseCommand {
|
|
30
|
-
static description =
|
|
30
|
+
static description = `Show a northstar, its linked commitments, and open recommendations\n\nThe Workspace line is the full workspace id, or "personal". ${northstars_1.NORTHSTAR_WORKSPACE_READ_HELP}`;
|
|
31
31
|
static examples = [
|
|
32
32
|
'<%= config.bin %> northstars show nst_abc123',
|
|
33
33
|
'<%= config.bin %> northstars show nst_abc123 --json',
|
|
@@ -1,7 +1,15 @@
|
|
|
1
|
-
import { type SpaceJudgmentTurnRecord } from '@skrr-ai/data-provider';
|
|
1
|
+
import { type SpaceJudgmentTurnRecord, type SpaceOrchestrationRunsResponse } from '@skrr-ai/data-provider';
|
|
2
2
|
import { BaseCommand } from '../../../base-command';
|
|
3
3
|
/** Who held the Space's judgment turn at this tick (OSK-18003). */
|
|
4
4
|
export declare function judgmentTurnLabel(turn?: SpaceJudgmentTurnRecord): string;
|
|
5
|
+
/**
|
|
6
|
+
* The first line of `runs`. The server's `enabled` is "the routine is active", which is false for a
|
|
7
|
+
* board the SYSTEM put to sleep as well as for one its owner turned off, so `runs` printed
|
|
8
|
+
* "Orchestration: disabled" for a sleeping board while `preview` said "enabled (sleeping: …)".
|
|
9
|
+
* Those are different states with different remedies (a task event wakes one; only the owner
|
|
10
|
+
* re-enables the other).
|
|
11
|
+
*/
|
|
12
|
+
export declare function orchestrationLine(result: Pick<SpaceOrchestrationRunsResponse, 'enabled' | 'autoExecuteEnabled' | 'lifecycleState' | 'suspensionReason'>): string;
|
|
5
13
|
export default class SpacesAutoExecutorRuns extends BaseCommand {
|
|
6
14
|
static description: string;
|
|
7
15
|
static examples: string[];
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.judgmentTurnLabel = judgmentTurnLabel;
|
|
4
|
+
exports.orchestrationLine = orchestrationLine;
|
|
4
5
|
const core_1 = require("@oclif/core");
|
|
5
6
|
const data_provider_1 = require("@skrr-ai/data-provider");
|
|
6
7
|
const base_command_1 = require("../../../base-command");
|
|
@@ -16,6 +17,22 @@ function judgmentTurnLabel(turn) {
|
|
|
16
17
|
}
|
|
17
18
|
return ' turn: unreadable, Leader stood down';
|
|
18
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* The first line of `runs`. The server's `enabled` is "the routine is active", which is false for a
|
|
22
|
+
* board the SYSTEM put to sleep as well as for one its owner turned off, so `runs` printed
|
|
23
|
+
* "Orchestration: disabled" for a sleeping board while `preview` said "enabled (sleeping: …)".
|
|
24
|
+
* Those are different states with different remedies (a task event wakes one; only the owner
|
|
25
|
+
* re-enables the other).
|
|
26
|
+
*/
|
|
27
|
+
function orchestrationLine(result) {
|
|
28
|
+
if (result.autoExecuteEnabled === false)
|
|
29
|
+
return 'Orchestration: disabled (turned off by the owner)';
|
|
30
|
+
if (result.autoExecuteEnabled === true && result.lifecycleState === 'sleeping') {
|
|
31
|
+
const why = result.suspensionReason ? `: ${result.suspensionReason.replace(/_/g, ' ')}` : '';
|
|
32
|
+
return `Orchestration: sleeping${why} — enabled; a task that can start, or \`run\`, wakes it`;
|
|
33
|
+
}
|
|
34
|
+
return `Orchestration: ${result.enabled ? 'enabled' : 'disabled'}`;
|
|
35
|
+
}
|
|
19
36
|
class SpacesAutoExecutorRuns extends base_command_1.BaseCommand {
|
|
20
37
|
static description = "List a space's recent auto-orchestration runs and its Lead health";
|
|
21
38
|
static examples = [
|
|
@@ -46,7 +63,7 @@ class SpacesAutoExecutorRuns extends base_command_1.BaseCommand {
|
|
|
46
63
|
this.log(JSON.stringify((0, space_output_1.withSpacePerspectiveUrl)(this.cliConfig.baseURL, spaceRef, 'execution', { result }), null, 2));
|
|
47
64
|
return;
|
|
48
65
|
}
|
|
49
|
-
this.log(
|
|
66
|
+
this.log(orchestrationLine(result));
|
|
50
67
|
this.log(`Lead health: ${result.leadHealth}`);
|
|
51
68
|
if (result.consecutiveFailures > 0) {
|
|
52
69
|
this.log(`Failures: ${result.consecutiveFailures} consecutive`);
|
|
@@ -8,8 +8,8 @@ const space_output_1 = require("../../../lib/space-output");
|
|
|
8
8
|
class SpacesHeartbeatsCreate extends base_command_1.BaseCommand {
|
|
9
9
|
static description = 'Create a heartbeat for an agent in a space';
|
|
10
10
|
static examples = [
|
|
11
|
-
'<%= config.bin %> spaces heartbeats create <space-id> --agent <agent-id> --frequency
|
|
12
|
-
'<%= config.bin %> spaces heartbeats create <space-id> --agent <agent-id> --frequency
|
|
11
|
+
'<%= config.bin %> spaces heartbeats create <space-id> --agent <agent-id> --frequency daily --prompt "Good morning"',
|
|
12
|
+
'<%= config.bin %> spaces heartbeats create <space-id> --agent <agent-id> --frequency 4h --prompt "Brief" --timezone America/New_York',
|
|
13
13
|
'<%= config.bin %> spaces heartbeats create <space-id> --from-json heartbeat.json',
|
|
14
14
|
];
|
|
15
15
|
static args = {
|
|
@@ -21,10 +21,12 @@ class SpacesHeartbeatsCreate extends base_command_1.BaseCommand {
|
|
|
21
21
|
description: 'Path to a JSON file (or "-" for stdin) to use as the request body',
|
|
22
22
|
}),
|
|
23
23
|
agent: core_1.Flags.string({ description: 'Agent ID (required unless set via --from-json)' }),
|
|
24
|
-
frequency: core_1.Flags.string({
|
|
24
|
+
frequency: core_1.Flags.string({
|
|
25
|
+
description: 'How often it runs, as a ladder key: 1m, 2m, 5m, 10m, 15m, 30m, hourly, 2h, 4h, 8h, daily, 2d, 4d, weekly, 2w. Not a cron expression. The time of day is fixed by the key (daily is 09:00 in --timezone).',
|
|
26
|
+
}),
|
|
25
27
|
prompt: core_1.Flags.string({ description: 'Prompt sent to the agent on each heartbeat' }),
|
|
26
28
|
timezone: core_1.Flags.string({
|
|
27
|
-
description: 'Timezone
|
|
29
|
+
description: 'Timezone the schedule runs in (e.g. America/New_York)',
|
|
28
30
|
}),
|
|
29
31
|
'max-unread-before-extend': core_1.Flags.integer({
|
|
30
32
|
description: 'Max unread messages before extending the schedule (1-10)',
|
|
@@ -63,7 +65,7 @@ class SpacesHeartbeatsCreate extends base_command_1.BaseCommand {
|
|
|
63
65
|
});
|
|
64
66
|
}
|
|
65
67
|
if (!payload.frequency || typeof payload.frequency !== 'string') {
|
|
66
|
-
this.error('A frequency is required. Pass --frequency <
|
|
68
|
+
this.error('A frequency is required. Pass --frequency <key> (for example daily, or 4h) or include it in --from-json.', {
|
|
67
69
|
exit: 1,
|
|
68
70
|
});
|
|
69
71
|
}
|
|
@@ -49,6 +49,16 @@ class SpacesHeartbeatsStatus extends base_command_1.BaseCommand {
|
|
|
49
49
|
this.log(`Running: ${s.isRunning === true ? 'yes' : 'no'}`);
|
|
50
50
|
this.log(`Next Run: ${s.nextRunAt ? (0, format_1.localTime)(s.nextRunAt) : '-'}`);
|
|
51
51
|
this.log(`BullMQ Job Key: ${s.bullmqJobKey ?? '-'}`);
|
|
52
|
+
// The newest fire and what became of it. `Next Run` moves whether or not a fire does anything,
|
|
53
|
+
// so a heartbeat the agent's policy skips on every fire would otherwise read as healthy.
|
|
54
|
+
const fire = s.lastFire;
|
|
55
|
+
if (fire && typeof fire === 'object') {
|
|
56
|
+
const what = [fire.outcome, fire.reason].filter(Boolean).join(': ');
|
|
57
|
+
this.log(`Last Fire: ${fire.firedAt ? (0, format_1.localTime)(fire.firedAt) : '-'} ${what || '-'}`);
|
|
58
|
+
if (fire.outcome === 'skipped') {
|
|
59
|
+
this.log('The last fire did nothing: the heartbeat was skipped, not run. `skrr triggers audit` lists every fire.');
|
|
60
|
+
}
|
|
61
|
+
}
|
|
52
62
|
}
|
|
53
63
|
}
|
|
54
64
|
exports.default = SpacesHeartbeatsStatus;
|
|
@@ -8,7 +8,7 @@ const space_output_1 = require("../../../lib/space-output");
|
|
|
8
8
|
class SpacesHeartbeatsUpdate extends base_command_1.BaseCommand {
|
|
9
9
|
static description = 'Update a heartbeat for an agent in a space';
|
|
10
10
|
static examples = [
|
|
11
|
-
'<%= config.bin %> spaces heartbeats update <space-id> <agent-id> --frequency
|
|
11
|
+
'<%= config.bin %> spaces heartbeats update <space-id> <agent-id> --frequency weekly',
|
|
12
12
|
'<%= config.bin %> spaces heartbeats update <space-id> <agent-id> --enabled false',
|
|
13
13
|
'<%= config.bin %> spaces heartbeats update <space-id> <agent-id> --from-json patch.json',
|
|
14
14
|
];
|
|
@@ -21,9 +21,11 @@ class SpacesHeartbeatsUpdate extends base_command_1.BaseCommand {
|
|
|
21
21
|
'from-json': core_1.Flags.string({
|
|
22
22
|
description: 'Path to a JSON file (or "-" for stdin) to use as the patch body',
|
|
23
23
|
}),
|
|
24
|
-
frequency: core_1.Flags.string({
|
|
24
|
+
frequency: core_1.Flags.string({
|
|
25
|
+
description: 'How often it runs, as a ladder key: 1m, 2m, 5m, 10m, 15m, 30m, hourly, 2h, 4h, 8h, daily, 2d, 4d, weekly, 2w. Not a cron expression. The time of day is fixed by the key (daily is 09:00 in --timezone).',
|
|
26
|
+
}),
|
|
25
27
|
prompt: core_1.Flags.string({ description: 'Prompt sent to the agent on each heartbeat' }),
|
|
26
|
-
timezone: core_1.Flags.string({ description: 'Timezone
|
|
28
|
+
timezone: core_1.Flags.string({ description: 'Timezone the schedule runs in' }),
|
|
27
29
|
enabled: core_1.Flags.boolean({ description: 'Enable or disable the heartbeat', allowNo: true }),
|
|
28
30
|
'max-unread-before-extend': core_1.Flags.integer({
|
|
29
31
|
description: 'Max unread messages before extending (1-10)',
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { BaseCommand } from '../../../base-command';
|
|
2
|
+
/**
|
|
3
|
+
* Your own publication history for one skill, newest first, with the admission
|
|
4
|
+
* state a curator left on each release. `store artifacts receipt` reads one
|
|
5
|
+
* release in full.
|
|
6
|
+
*/
|
|
7
|
+
export default class StoreArtifactsReleases extends BaseCommand {
|
|
8
|
+
static description: string;
|
|
9
|
+
static examples: string[];
|
|
10
|
+
static args: {
|
|
11
|
+
entityType: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
12
|
+
entityId: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
13
|
+
};
|
|
14
|
+
static flags: {
|
|
15
|
+
limit: import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
16
|
+
before: import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
17
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
18
|
+
};
|
|
19
|
+
run(): Promise<void>;
|
|
20
|
+
}
|