@bussolabs/closeyourit-cli 0.22.0 → 0.24.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +44 -3
- package/dist/base.d.ts +23 -0
- package/dist/base.js +64 -4
- package/dist/commands/assistant/ask.d.ts +24 -0
- package/dist/commands/assistant/ask.js +112 -0
- package/dist/commands/assistant/conversations/create.d.ts +9 -0
- package/dist/commands/assistant/conversations/create.js +25 -0
- package/dist/commands/assistant/conversations/delete.d.ts +12 -0
- package/dist/commands/assistant/conversations/delete.js +25 -0
- package/dist/commands/assistant/conversations/list.d.ts +10 -0
- package/dist/commands/assistant/conversations/list.js +30 -0
- package/dist/commands/assistant/conversations/show.d.ts +9 -0
- package/dist/commands/assistant/conversations/show.js +25 -0
- package/dist/commands/coverage/show.d.ts +10 -0
- package/dist/commands/coverage/show.js +39 -0
- package/dist/commands/errors/assign.d.ts +14 -0
- package/dist/commands/errors/assign.js +52 -0
- package/dist/commands/errors/bulk-triage.d.ts +11 -0
- package/dist/commands/errors/bulk-triage.js +41 -0
- package/dist/commands/errors/delete.d.ts +13 -0
- package/dist/commands/errors/delete.js +28 -0
- package/dist/commands/errors/grouping-rules/create.d.ts +15 -0
- package/dist/commands/errors/grouping-rules/create.js +44 -0
- package/dist/commands/errors/grouping-rules/delete.d.ts +13 -0
- package/dist/commands/errors/grouping-rules/delete.js +27 -0
- package/dist/commands/errors/grouping-rules/list.d.ts +10 -0
- package/dist/commands/errors/grouping-rules/list.js +28 -0
- package/dist/commands/errors/grouping-rules/update.d.ts +18 -0
- package/dist/commands/errors/grouping-rules/update.js +43 -0
- package/dist/commands/errors/merge.d.ts +14 -0
- package/dist/commands/errors/merge.js +39 -0
- package/dist/commands/errors/split.d.ts +13 -0
- package/dist/commands/errors/split.js +34 -0
- package/dist/commands/invitations/create.js +9 -2
- package/dist/commands/invitations/resend.js +8 -2
- package/dist/commands/kb/attach.d.ts +12 -0
- package/dist/commands/kb/attach.js +49 -0
- package/dist/commands/kb/attachment-download.d.ts +14 -0
- package/dist/commands/kb/attachment-download.js +38 -0
- package/dist/commands/kb/attachments.d.ts +9 -0
- package/dist/commands/kb/attachments.js +36 -0
- package/dist/commands/kb/create.d.ts +4 -1
- package/dist/commands/kb/create.js +41 -5
- package/dist/commands/kb/detach.d.ts +13 -0
- package/dist/commands/kb/detach.js +26 -0
- package/dist/commands/kb/show.js +3 -0
- package/dist/commands/kb/update.d.ts +4 -0
- package/dist/commands/kb/update.js +69 -21
- package/dist/commands/metrics/bulk-triage.d.ts +11 -0
- package/dist/commands/metrics/bulk-triage.js +44 -0
- package/dist/commands/service-accounts/show.d.ts +9 -0
- package/dist/commands/service-accounts/show.js +26 -0
- package/dist/commands/service-accounts/tokens/list.d.ts +12 -0
- package/dist/commands/service-accounts/tokens/list.js +40 -0
- package/dist/commands/service-accounts/update.d.ts +31 -0
- package/dist/commands/service-accounts/update.js +105 -0
- package/dist/commands/shared/delete.d.ts +12 -0
- package/dist/commands/shared/delete.js +30 -0
- package/dist/commands/shared/list.d.ts +6 -0
- package/dist/commands/shared/list.js +45 -0
- package/dist/commands/shared/set.d.ts +14 -0
- package/dist/commands/shared/set.js +41 -0
- package/dist/commands/tickets/ask.d.ts +13 -0
- package/dist/commands/tickets/ask.js +81 -0
- package/dist/commands/tickets/clarifications.d.ts +21 -0
- package/dist/commands/tickets/clarifications.js +36 -0
- package/dist/commands/tickets/dependencies/add.d.ts +15 -0
- package/dist/commands/tickets/dependencies/add.js +62 -0
- package/dist/commands/tickets/dependencies/list.d.ts +12 -0
- package/dist/commands/tickets/dependencies/list.js +37 -0
- package/dist/commands/tickets/dependencies/remove.d.ts +14 -0
- package/dist/commands/tickets/dependencies/remove.js +59 -0
- package/dist/commands/tickets/work-context.d.ts +15 -0
- package/dist/commands/tickets/work-context.js +130 -0
- package/dist/commands/usage/list.d.ts +12 -0
- package/dist/commands/usage/list.js +43 -0
- package/dist/commands/usage/reporters.d.ts +10 -0
- package/dist/commands/usage/reporters.js +37 -0
- package/dist/commands/vault/requests/approve.d.ts +9 -0
- package/dist/commands/vault/requests/approve.js +40 -0
- package/dist/commands/vault/requests/list.d.ts +6 -0
- package/dist/commands/vault/requests/list.js +29 -0
- package/dist/commands/vault/requests/reject.d.ts +12 -0
- package/dist/commands/vault/requests/reject.js +52 -0
- package/dist/commands/workload/create.d.ts +15 -0
- package/dist/commands/workload/create.js +45 -0
- package/dist/commands/workload/delete.d.ts +12 -0
- package/dist/commands/workload/delete.js +26 -0
- package/dist/commands/workload/list.d.ts +9 -0
- package/dist/commands/workload/list.js +29 -0
- package/dist/commands/workload/participant/add.d.ts +10 -0
- package/dist/commands/workload/participant/add.js +27 -0
- package/dist/commands/workload/participant/remove.d.ts +10 -0
- package/dist/commands/workload/participant/remove.js +23 -0
- package/dist/commands/workload/promote.d.ts +17 -0
- package/dist/commands/workload/promote.js +58 -0
- package/dist/commands/workload/show.d.ts +9 -0
- package/dist/commands/workload/show.js +24 -0
- package/dist/commands/workload/update.d.ts +17 -0
- package/dist/commands/workload/update.js +45 -0
- package/dist/errors/error-codes.d.ts +17 -0
- package/dist/errors/error-codes.js +36 -0
- package/dist/lib/api.d.ts +7 -1
- package/dist/lib/api.js +8 -0
- package/dist/lib/assistant.d.ts +29 -0
- package/dist/lib/assistant.js +76 -0
- package/dist/lib/bulk-triage.d.ts +35 -0
- package/dist/lib/bulk-triage.js +55 -0
- package/dist/lib/grouping-rules.d.ts +28 -0
- package/dist/lib/grouping-rules.js +39 -0
- package/dist/lib/knowledge.d.ts +15 -0
- package/dist/lib/knowledge.js +36 -0
- package/dist/lib/output.js +10 -0
- package/dist/lib/poll.d.ts +51 -0
- package/dist/lib/poll.js +59 -0
- package/dist/lib/service-accounts.d.ts +65 -0
- package/dist/lib/service-accounts.js +132 -0
- package/dist/lib/ticket-clarifications.d.ts +13 -0
- package/dist/lib/ticket-clarifications.js +31 -0
- package/dist/lib/vault-requests.d.ts +38 -0
- package/dist/lib/vault-requests.js +125 -0
- package/dist/lib/workload.d.ts +37 -0
- package/dist/lib/workload.js +64 -0
- package/oclif.manifest.json +7495 -4994
- package/opencli.json +7424 -5644
- package/package.json +27 -3
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const core_1 = require("@oclif/core");
|
|
4
|
+
const base_1 = require("../../base");
|
|
5
|
+
const api_1 = require("../../lib/api");
|
|
6
|
+
const guidance_1 = require("../../lib/guidance");
|
|
7
|
+
const output_1 = require("../../lib/output");
|
|
8
|
+
class TicketsWorkContext extends base_1.BaseCommand {
|
|
9
|
+
static args = {
|
|
10
|
+
id: core_1.Args.string({ description: 'Ticket id or code (e.g. DRFL-3)', required: true }),
|
|
11
|
+
};
|
|
12
|
+
static description = "Show the work context frozen when an automation host claimed the ticket: the references and procedures actually delivered back then, never the project's current guidance";
|
|
13
|
+
static examples = [
|
|
14
|
+
'<%= config.bin %> tickets work-context <ticket-id> --project acme-api',
|
|
15
|
+
'<%= config.bin %> tickets work-context DRFL-3 -p driverone-flutter',
|
|
16
|
+
'<%= config.bin %> tickets work-context DRFL-3 -p driverone-flutter --full',
|
|
17
|
+
'<%= config.bin %> tickets work-context DRFL-3 -p driverone-flutter --json',
|
|
18
|
+
];
|
|
19
|
+
static flags = {
|
|
20
|
+
...base_1.projectFlag,
|
|
21
|
+
full: core_1.Flags.boolean({
|
|
22
|
+
description: 'Also print the frozen text of every reference and procedure, not just the table',
|
|
23
|
+
}),
|
|
24
|
+
};
|
|
25
|
+
async run() {
|
|
26
|
+
const { args, flags } = await this.parse(TicketsWorkContext);
|
|
27
|
+
const projectId = await this.resolveProjectId(flags.project);
|
|
28
|
+
const path = `/cli/v1/projects/${encodeURIComponent(projectId)}/tickets/${encodeURIComponent(args.id)}/work_context`;
|
|
29
|
+
// Una sola lettura, e sull'endpoint dello snapshot: mai un ripiego su /guidance. La guidance del
|
|
30
|
+
// progetto può essere cambiata dopo la presa in carico, e mostrarla al posto della fotografia
|
|
31
|
+
// significherebbe rispondere a un audit con la configurazione di oggi (CYCL-47, scenario 1).
|
|
32
|
+
let res;
|
|
33
|
+
try {
|
|
34
|
+
res = await this.api.get(path);
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
throw describeWorkContextError(error, args.id);
|
|
38
|
+
}
|
|
39
|
+
if (!this.jsonEnabled()) {
|
|
40
|
+
const snapshot = res.data ?? {};
|
|
41
|
+
this.log(`Work context frozen when ${(0, output_1.sanitize)(args.id)} was claimed from the agent queue — not the project's current guidance (that is \`guidance show\`).`);
|
|
42
|
+
this.log((0, output_1.renderRecord)(snapshotSummary(snapshot)));
|
|
43
|
+
this.renderPayload(snapshot.payload, flags.full);
|
|
44
|
+
}
|
|
45
|
+
return res;
|
|
46
|
+
}
|
|
47
|
+
/** Le due liste congelate: stessa tabella di `guidance show`, così il confronto con l'oggi è immediato. */
|
|
48
|
+
renderPayload(payload, full) {
|
|
49
|
+
const rendered = (0, guidance_1.renderGuidance)(payload);
|
|
50
|
+
if (!rendered) {
|
|
51
|
+
this.log('\nThis snapshot froze no references and no procedures.');
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
this.log(rendered);
|
|
55
|
+
if (!full) {
|
|
56
|
+
this.log('\nPass --full to read the frozen text of each reference and procedure.');
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
// Il testo integrale è il cuore dell'audit (le istruzioni consegnate, non solo le loro chiavi),
|
|
60
|
+
// ma su una guidance ricca sono migliaia di caratteri: sta dietro --full per non trasformare
|
|
61
|
+
// ogni lettura rapida in un muro di testo. In --json c'è sempre tutto, comunque.
|
|
62
|
+
const body = renderFrozenText(payload);
|
|
63
|
+
if (body)
|
|
64
|
+
this.log(body);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
exports.default = TicketsWorkContext;
|
|
68
|
+
/** Intestazione della fotografia: chi l'ha ricevuta, quando, con quale versione di schema e digest. */
|
|
69
|
+
function snapshotSummary(snapshot) {
|
|
70
|
+
return {
|
|
71
|
+
snapshot_id: snapshot.id ?? null,
|
|
72
|
+
captured_at: snapshot.generated_at ?? null,
|
|
73
|
+
captured_by: snapshot.actor_name ?? null,
|
|
74
|
+
payload_version: snapshot.payload_version ?? null,
|
|
75
|
+
digest: snapshot.digest ?? null,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/** Le entry di una lista del payload, o [] se il backend non l'ha mandata. */
|
|
79
|
+
function entries(value) {
|
|
80
|
+
return Array.isArray(value) ? value : [];
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Il testo congelato di ogni entry che ne ha uno: le `instructions` di una reference, il `content`
|
|
84
|
+
* di una procedure. Ritorna '' quando nessuna entry porta testo, così `--full` su uno snapshot di
|
|
85
|
+
* sole chiavi non stampa un titolo su una sezione vuota.
|
|
86
|
+
*/
|
|
87
|
+
function renderFrozenText(payload) {
|
|
88
|
+
if (!payload || typeof payload !== 'object')
|
|
89
|
+
return '';
|
|
90
|
+
const value = payload;
|
|
91
|
+
const blocks = [
|
|
92
|
+
...entries(value.references).map((entry) => frozenBlock(entry, entry.instructions)),
|
|
93
|
+
...entries(value.procedures).map((entry) => frozenBlock(entry, entry.content)),
|
|
94
|
+
].filter((block) => block.length > 0);
|
|
95
|
+
if (blocks.length === 0)
|
|
96
|
+
return '';
|
|
97
|
+
return `${(0, output_1.section)('Frozen text', '🧊')}\n${blocks.join('\n')}`;
|
|
98
|
+
}
|
|
99
|
+
/** Una entry col suo testo: riga di intestazione (chiave · livello · posizione) e testo per intero. */
|
|
100
|
+
function frozenBlock(entry, text) {
|
|
101
|
+
const body = String(text ?? '');
|
|
102
|
+
if (body.trim() === '')
|
|
103
|
+
return '';
|
|
104
|
+
const head = [entry.key, entry.level, entry.location].filter((part) => part !== undefined && part !== null && part !== '');
|
|
105
|
+
return `\n── ${head.map((part) => (0, output_1.sanitize)(part)).join(' · ')}\n${(0, output_1.sanitizeMultiline)(body)}`;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Riscrive i due rifiuti che un lettore fraintenderebbe, lasciando intatto tutto il resto (codice
|
|
109
|
+
* del server compreso, così uno script continua a distinguerli):
|
|
110
|
+
*
|
|
111
|
+
* - `R404-TICKET-004` non è «ticket non trovato»: il ticket c'è, è la fotografia a mancare. Dire
|
|
112
|
+
* «mai preso in carico» sarebbe però una bugia comoda: lo snapshot lo scatta SOLO la presa in
|
|
113
|
+
* carico dalla coda degli host automatici (Agents::TicketQueues::Claim), quindi un ticket preso a
|
|
114
|
+
* mano — con `tickets lease claim` o assegnandolo — non ne ha uno, e nemmeno i ticket presi in
|
|
115
|
+
* carico prima che la fotografia esistesse. Il messaggio dice cosa manca e perché può mancare,
|
|
116
|
+
* così chi legge non conclude che nessuno ci abbia mai lavorato.
|
|
117
|
+
* - il 403 arriva come «Permesso negato» e basta: qui la chiave che manca è `tickets.audit.view`,
|
|
118
|
+
* che è dedicata al materiale d'audit — vedere il ticket, o la sua guidance, non basta.
|
|
119
|
+
*/
|
|
120
|
+
function describeWorkContextError(error, ticketRef) {
|
|
121
|
+
if (!(error instanceof api_1.ApiRequestError))
|
|
122
|
+
return error;
|
|
123
|
+
if (error.status === 404 && error.code === 'R404-TICKET-004') {
|
|
124
|
+
return new api_1.ApiRequestError(error.status, error.code, `No work context was captured for ticket ${ticketRef}: the snapshot is taken only when an automation host claims the ticket from the queue, so a manual claim — or one older than the snapshot itself — leaves none behind.`, error.details);
|
|
125
|
+
}
|
|
126
|
+
if (error.status === 403) {
|
|
127
|
+
return new api_1.ApiRequestError(error.status, error.code, `${error.message}. Reading a work context needs the tickets.audit.view permission: it is audit material, seeing the ticket is not enough.`, error.details);
|
|
128
|
+
}
|
|
129
|
+
return error;
|
|
130
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { BaseCommand } from '../../base';
|
|
2
|
+
export default class UsageList extends BaseCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
kind: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
7
|
+
environment: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
8
|
+
page: import("@oclif/core/lib/interfaces").OptionFlag<number, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
9
|
+
project: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
10
|
+
};
|
|
11
|
+
run(): Promise<unknown>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const base_1 = require("../../base");
|
|
4
|
+
const core_1 = require("@oclif/core");
|
|
5
|
+
// CYSK-29 — i simboli VISTI in esecuzione (l'insieme positivo). Il verdetto «inutilizzato» lo
|
|
6
|
+
// calcola lo scanner con l'inventario statico del repo, mai questo comando.
|
|
7
|
+
class UsageList extends base_1.BaseCommand {
|
|
8
|
+
static description = 'List the usage symbols the product reported as actually executed (routes as Controller#action, jobs, custom keys)';
|
|
9
|
+
static examples = [
|
|
10
|
+
'<%= config.bin %> usage list --project CYRA',
|
|
11
|
+
'<%= config.bin %> usage list -p CYRA --kind route --environment production',
|
|
12
|
+
'<%= config.bin %> usage list -p CYRA --json',
|
|
13
|
+
];
|
|
14
|
+
static flags = {
|
|
15
|
+
...base_1.projectFlag,
|
|
16
|
+
kind: core_1.Flags.string({ description: 'Only this kind (route, job, custom)' }),
|
|
17
|
+
environment: core_1.Flags.string({ description: 'Only this environment' }),
|
|
18
|
+
page: core_1.Flags.integer({ description: 'Page number', default: 1 }),
|
|
19
|
+
};
|
|
20
|
+
async run() {
|
|
21
|
+
const { flags } = await this.parse(UsageList);
|
|
22
|
+
const projectId = await this.resolveProjectId(flags.project);
|
|
23
|
+
const query = new URLSearchParams({ page: String(flags.page) });
|
|
24
|
+
if (flags.kind)
|
|
25
|
+
query.set('kind', flags.kind);
|
|
26
|
+
if (flags.environment)
|
|
27
|
+
query.set('environment', flags.environment);
|
|
28
|
+
const res = await this.api.get(`/cli/v1/projects/${projectId}/usage?${query.toString()}`);
|
|
29
|
+
if (!this.jsonEnabled()) {
|
|
30
|
+
const rows = res.data ?? [];
|
|
31
|
+
if (rows.length === 0) {
|
|
32
|
+
this.log('No usage reported yet: the SDK flushes every ~5 minutes once deployed.');
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
for (const row of rows) {
|
|
36
|
+
this.log(`${row.kind ?? '?'} ${row.symbol ?? '?'} last_seen ${row.last_seen_at ?? '-'} hits ~${row.hits_count ?? '-'} (${row.environment ?? '-'})`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return res;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.default = UsageList;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { BaseCommand } from '../../base';
|
|
2
|
+
export default class UsageReporters extends BaseCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
kind: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
7
|
+
project: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
8
|
+
};
|
|
9
|
+
run(): Promise<unknown>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const base_1 = require("../../base");
|
|
4
|
+
const core_1 = require("@oclif/core");
|
|
5
|
+
// CYSK-29 — chi sta mandando usage e da quando: la risposta a «rotta mai chiamata o SDK mai
|
|
6
|
+
// deployato?». Lo scanner la legge PRIMA di giudicare qualunque kind; `truncated_last_window`
|
|
7
|
+
// squalifica il kind.
|
|
8
|
+
class UsageReporters extends base_1.BaseCommand {
|
|
9
|
+
static description = 'List the usage reporters: which SDK is sending usage of each kind, and since when';
|
|
10
|
+
static examples = [
|
|
11
|
+
'<%= config.bin %> usage reporters --project CYRA',
|
|
12
|
+
'<%= config.bin %> usage reporters -p CYRA --kind route',
|
|
13
|
+
];
|
|
14
|
+
static flags = {
|
|
15
|
+
...base_1.projectFlag,
|
|
16
|
+
kind: core_1.Flags.string({ description: 'Only this kind (route, job, custom)' }),
|
|
17
|
+
};
|
|
18
|
+
async run() {
|
|
19
|
+
const { flags } = await this.parse(UsageReporters);
|
|
20
|
+
const projectId = await this.resolveProjectId(flags.project);
|
|
21
|
+
const query = flags.kind ? `?kind=${encodeURIComponent(flags.kind)}` : '';
|
|
22
|
+
const res = await this.api.get(`/cli/v1/projects/${projectId}/usage/reporters${query}`);
|
|
23
|
+
if (!this.jsonEnabled()) {
|
|
24
|
+
const rows = res.data ?? [];
|
|
25
|
+
if (rows.length === 0) {
|
|
26
|
+
this.log('No usage reporter yet: without one, "never seen" only means "SDK not deployed".');
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
for (const row of rows) {
|
|
30
|
+
this.log(`${row.kind ?? '?'} ${row.sdk_name ?? '?'}@${row.sdk_version ?? '-'} since ${row.first_reported_at ?? '-'} last ${row.last_reported_at ?? '-'} truncated ${row.truncated_last_window ? 'YES' : 'no'} (${row.environment ?? '-'})`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return res;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
exports.default = UsageReporters;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { BaseCommand } from '../../../base';
|
|
2
|
+
export default class VaultRequestsApprove extends BaseCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
id: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
run(): Promise<unknown>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const core_1 = require("@oclif/core");
|
|
4
|
+
const base_1 = require("../../../base");
|
|
5
|
+
const output_1 = require("../../../lib/output");
|
|
6
|
+
const vault_requests_1 = require("../../../lib/vault-requests");
|
|
7
|
+
class VaultRequestsApprove extends base_1.BaseCommand {
|
|
8
|
+
// No --confirm here, unlike the destructive deletions of this CLI: "approve" IS the confirmation —
|
|
9
|
+
// the command exists to say yes, and asking twice would only push the reviewer back to the website
|
|
10
|
+
// this command replaces. The success line names what was applied and where, so an approval on the
|
|
11
|
+
// wrong id is visible at once.
|
|
12
|
+
static description = 'Approve a pending secret change request: the change it carries is applied to the vault. Whoever asked for it cannot approve it (four-eyes), and a service account never can.';
|
|
13
|
+
static examples = [
|
|
14
|
+
'<%= config.bin %> vault requests approve <id>',
|
|
15
|
+
'<%= config.bin %> vault requests approve <id> --json',
|
|
16
|
+
];
|
|
17
|
+
static args = {
|
|
18
|
+
id: core_1.Args.string({ description: 'Change request id (from "vault requests list")', required: true }),
|
|
19
|
+
};
|
|
20
|
+
async run() {
|
|
21
|
+
const { args } = await this.parse(VaultRequestsApprove);
|
|
22
|
+
let res;
|
|
23
|
+
try {
|
|
24
|
+
res = await this.api.post(`${vault_requests_1.CHANGE_REQUESTS_PATH}/${encodeURIComponent(args.id)}/approve`);
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
throw (0, vault_requests_1.describeDecisionError)(error);
|
|
28
|
+
}
|
|
29
|
+
const decided = (0, vault_requests_1.withoutValue)(res.data ?? {});
|
|
30
|
+
if (!this.jsonEnabled()) {
|
|
31
|
+
const label = (0, vault_requests_1.changeRequestLabel)(decided);
|
|
32
|
+
this.log(label ? `Change request approved: ${label} is applied.` : 'Change request approved.');
|
|
33
|
+
const summary = (0, vault_requests_1.changeRequestSummary)(decided);
|
|
34
|
+
if (Object.keys(summary).length > 0)
|
|
35
|
+
this.log((0, output_1.renderRecord)(summary));
|
|
36
|
+
}
|
|
37
|
+
return { ...res, data: decided };
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.default = VaultRequestsApprove;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const base_1 = require("../../../base");
|
|
4
|
+
const output_1 = require("../../../lib/output");
|
|
5
|
+
const paginate_1 = require("../../../lib/paginate");
|
|
6
|
+
const vault_requests_1 = require("../../../lib/vault-requests");
|
|
7
|
+
class VaultRequestsList extends base_1.BaseCommand {
|
|
8
|
+
// No --project on purpose: the queue is org-level, exactly like the web vault page — the backend
|
|
9
|
+
// collects the pending requests across every visible project, and asking for one project would
|
|
10
|
+
// hide the review you were about to do on another.
|
|
11
|
+
static description = 'List the secret changes waiting for a second approval, across every visible project. Shows the name and the intent, never the proposed value.';
|
|
12
|
+
static examples = ['<%= config.bin %> vault requests list', '<%= config.bin %> vault requests list --json'];
|
|
13
|
+
async run() {
|
|
14
|
+
await this.parse(VaultRequestsList);
|
|
15
|
+
const data = (await (0, paginate_1.fetchAllPages)(this.api, vault_requests_1.CHANGE_REQUESTS_PATH)).map((row) => (0, vault_requests_1.withoutValue)(row));
|
|
16
|
+
if (!this.jsonEnabled()) {
|
|
17
|
+
// An empty queue is good news, not an empty result set: renderTable's "(no results)" under a
|
|
18
|
+
// header row reads like a failed search, and the reviewer needs the opposite reading.
|
|
19
|
+
if (data.length === 0) {
|
|
20
|
+
this.log('No secret change request is waiting for a decision.');
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
this.log((0, output_1.renderTable)(vault_requests_1.CHANGE_REQUEST_HEADERS, data.map((row) => (0, vault_requests_1.changeRequestRow)(row))));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return { data, meta: (0, paginate_1.aggregatedMeta)(data.length) };
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports.default = VaultRequestsList;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { BaseCommand } from '../../../base';
|
|
2
|
+
export default class VaultRequestsReject extends BaseCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
id: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
reason: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
10
|
+
};
|
|
11
|
+
run(): Promise<unknown>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const core_1 = require("@oclif/core");
|
|
4
|
+
const base_1 = require("../../../base");
|
|
5
|
+
const output_1 = require("../../../lib/output");
|
|
6
|
+
const vault_requests_1 = require("../../../lib/vault-requests");
|
|
7
|
+
class VaultRequestsReject extends base_1.BaseCommand {
|
|
8
|
+
static description = 'Reject a pending secret change request with a reason. Nothing changes in the vault: the request freezes as rejected and the reason reaches whoever asked.';
|
|
9
|
+
static examples = [
|
|
10
|
+
'<%= config.bin %> vault requests reject <id> --reason "rotate it on staging first"',
|
|
11
|
+
'<%= config.bin %> vault requests reject <id> -r "wrong key" --json',
|
|
12
|
+
];
|
|
13
|
+
static args = {
|
|
14
|
+
id: core_1.Args.string({ description: 'Change request id (from "vault requests list")', required: true }),
|
|
15
|
+
};
|
|
16
|
+
static flags = {
|
|
17
|
+
reason: core_1.Flags.string({
|
|
18
|
+
char: 'r',
|
|
19
|
+
description: 'Why the change is refused — recorded for the audit and sent to whoever asked',
|
|
20
|
+
required: true,
|
|
21
|
+
}),
|
|
22
|
+
};
|
|
23
|
+
async run() {
|
|
24
|
+
const { args, flags } = await this.parse(VaultRequestsReject);
|
|
25
|
+
// A rejection freezes the request for good: it cannot be decided again, and the only thing left
|
|
26
|
+
// to the person who asked is the reason. Whitespace would satisfy the required flag and be
|
|
27
|
+
// refused by the server anyway (R422-CHANGEREQUEST-001), so it is refused here, before the call.
|
|
28
|
+
const reason = flags.reason.trim();
|
|
29
|
+
if (reason === '') {
|
|
30
|
+
this.error('Refusing to reject with an empty --reason: say why, so whoever asked can fix it and ask again.', {
|
|
31
|
+
exit: 2,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
let res;
|
|
35
|
+
try {
|
|
36
|
+
res = await this.api.post(`${vault_requests_1.CHANGE_REQUESTS_PATH}/${encodeURIComponent(args.id)}/reject`, { reason });
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
throw (0, vault_requests_1.describeDecisionError)(error);
|
|
40
|
+
}
|
|
41
|
+
const decided = (0, vault_requests_1.withoutValue)(res.data ?? {});
|
|
42
|
+
if (!this.jsonEnabled()) {
|
|
43
|
+
const label = (0, vault_requests_1.changeRequestLabel)(decided);
|
|
44
|
+
this.log(label ? `Change request rejected: ${label} is unchanged.` : 'Change request rejected: nothing changed.');
|
|
45
|
+
const summary = (0, vault_requests_1.changeRequestSummary)(decided);
|
|
46
|
+
if (Object.keys(summary).length > 0)
|
|
47
|
+
this.log((0, output_1.renderRecord)(summary));
|
|
48
|
+
}
|
|
49
|
+
return { ...res, data: decided };
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.default = VaultRequestsReject;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { BaseCommand } from '../../base';
|
|
2
|
+
export default class WorkloadCreate extends BaseCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
description: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
7
|
+
status: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
8
|
+
'scheduled-at': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
9
|
+
'due-at': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
10
|
+
ticket: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
11
|
+
team: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
12
|
+
title: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
13
|
+
};
|
|
14
|
+
run(): Promise<unknown>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const core_1 = require("@oclif/core");
|
|
4
|
+
const base_1 = require("../../base");
|
|
5
|
+
const output_1 = require("../../lib/output");
|
|
6
|
+
const workload_1 = require("../../lib/workload");
|
|
7
|
+
class WorkloadCreate extends base_1.BaseCommand {
|
|
8
|
+
static description = 'Create a workload action (non-dev activity: fair, meeting, call…) on one of your teams. Add the people with `workload participant add`.';
|
|
9
|
+
static examples = [
|
|
10
|
+
'<%= config.bin %> workload create --team Marketing --title "Fiera di Rimini"',
|
|
11
|
+
'<%= config.bin %> workload create --team Marketing --title "Riunione firma accordo" --scheduled-at 2026-09-01T09:00:00Z --due-at 2026-09-10T18:00:00Z',
|
|
12
|
+
'<%= config.bin %> workload create --team Marketing --title "Materiale stand" --status in_progress --ticket DRFL-3',
|
|
13
|
+
];
|
|
14
|
+
static flags = {
|
|
15
|
+
team: core_1.Flags.string({
|
|
16
|
+
description: 'Team id (UUID) or name — the action belongs to it and cannot be moved later',
|
|
17
|
+
required: true,
|
|
18
|
+
}),
|
|
19
|
+
title: core_1.Flags.string({ description: 'What the activity is', required: true }),
|
|
20
|
+
...workload_1.actionFieldFlags,
|
|
21
|
+
};
|
|
22
|
+
async run() {
|
|
23
|
+
const { flags } = await this.parse(WorkloadCreate);
|
|
24
|
+
const teamId = await this.resolveTeamId(flags.team);
|
|
25
|
+
const body = { team_id: teamId, title: flags.title };
|
|
26
|
+
(0, workload_1.applyActionBody)(body, flags);
|
|
27
|
+
// Il code umano ("DRFL-3") si risolve qui: il server accetta solo l'id, e uno che non può
|
|
28
|
+
// vedere lo scarta in silenzio invece di rifiutarlo.
|
|
29
|
+
const ticketId = flags.ticket ? await this.resolveTicketId(flags.ticket) : undefined;
|
|
30
|
+
if (flags.ticket !== undefined)
|
|
31
|
+
body.ticket_id = ticketId ?? null;
|
|
32
|
+
const res = await this.api.post(workload_1.WORKLOAD_ACTIONS_PATH, body);
|
|
33
|
+
const data = res.data ?? {};
|
|
34
|
+
if ((0, workload_1.ticketLinkMissing)(flags.ticket, ticketId, data)) {
|
|
35
|
+
this.warn(`Ticket ${flags.ticket} is not visible to you: the action was created without it.`);
|
|
36
|
+
}
|
|
37
|
+
if (!this.jsonEnabled()) {
|
|
38
|
+
this.log('Workload action created:');
|
|
39
|
+
this.log((0, output_1.renderRecord)(data));
|
|
40
|
+
this.log((0, workload_1.participantsLine)(data));
|
|
41
|
+
}
|
|
42
|
+
return res;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
exports.default = WorkloadCreate;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { BaseCommand } from '../../base';
|
|
2
|
+
export default class WorkloadDelete extends BaseCommand {
|
|
3
|
+
static args: {
|
|
4
|
+
id: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
5
|
+
};
|
|
6
|
+
static description: string;
|
|
7
|
+
static examples: string[];
|
|
8
|
+
static flags: {
|
|
9
|
+
confirm: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
};
|
|
11
|
+
run(): Promise<unknown>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const core_1 = require("@oclif/core");
|
|
4
|
+
const base_1 = require("../../base");
|
|
5
|
+
const workload_1 = require("../../lib/workload");
|
|
6
|
+
class WorkloadDelete extends base_1.BaseCommand {
|
|
7
|
+
static args = {
|
|
8
|
+
id: core_1.Args.string({ description: 'Workload action id', required: true }),
|
|
9
|
+
};
|
|
10
|
+
static description = 'Delete a workload action (irreversible; a linked ticket survives and only loses the link)';
|
|
11
|
+
static examples = ['<%= config.bin %> workload delete <action-id> --confirm'];
|
|
12
|
+
static flags = {
|
|
13
|
+
confirm: core_1.Flags.boolean({ description: 'Required: confirm the irreversible deletion' }),
|
|
14
|
+
};
|
|
15
|
+
async run() {
|
|
16
|
+
const { args, flags } = await this.parse(WorkloadDelete);
|
|
17
|
+
if (!flags.confirm) {
|
|
18
|
+
this.error('Refusing to delete without --confirm (the action is irreversible).', { exit: 2 });
|
|
19
|
+
}
|
|
20
|
+
await this.api.delete(`${workload_1.WORKLOAD_ACTIONS_PATH}/${encodeURIComponent(args.id)}`);
|
|
21
|
+
if (!this.jsonEnabled())
|
|
22
|
+
this.log(`Deleted workload action ${args.id}`);
|
|
23
|
+
return { deleted: args.id };
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
exports.default = WorkloadDelete;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { BaseCommand } from '../../base';
|
|
2
|
+
export default class WorkloadList extends BaseCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
page: import("@oclif/core/lib/interfaces").OptionFlag<number, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
7
|
+
};
|
|
8
|
+
run(): Promise<unknown>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const base_1 = require("../../base");
|
|
4
|
+
const output_1 = require("../../lib/output");
|
|
5
|
+
const workload_1 = require("../../lib/workload");
|
|
6
|
+
class WorkloadList extends base_1.BaseCommand {
|
|
7
|
+
static description = 'List the workload actions of the teams you belong to (newest first)';
|
|
8
|
+
static examples = ['<%= config.bin %> workload list', '<%= config.bin %> workload list --page 2 --json'];
|
|
9
|
+
static flags = { ...base_1.pageFlag };
|
|
10
|
+
async run() {
|
|
11
|
+
const { flags } = await this.parse(WorkloadList);
|
|
12
|
+
const res = await this.api.get(`${workload_1.WORKLOAD_ACTIONS_PATH}?page=${flags.page}`);
|
|
13
|
+
const actions = res.data ?? [];
|
|
14
|
+
if (!this.jsonEnabled()) {
|
|
15
|
+
this.log((0, output_1.renderTable)(['TITLE', 'STATUS', 'TEAM', 'PEOPLE', 'SCHEDULED', 'DUE', 'TICKET', 'ID'], actions.map((action) => [
|
|
16
|
+
String(action.title ?? ''),
|
|
17
|
+
(0, output_1.statusCell)(action.status),
|
|
18
|
+
String(action.team ?? ''),
|
|
19
|
+
String((Array.isArray(action.participants) ? action.participants : []).length),
|
|
20
|
+
String(action.scheduled_at ?? '-'),
|
|
21
|
+
String(action.due_at ?? '-'),
|
|
22
|
+
String(action.ticket_code ?? '-'),
|
|
23
|
+
String(action.id ?? ''),
|
|
24
|
+
])));
|
|
25
|
+
}
|
|
26
|
+
return res;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports.default = WorkloadList;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { BaseCommand } from '../../../base';
|
|
2
|
+
export default class WorkloadParticipantAdd extends BaseCommand {
|
|
3
|
+
static args: {
|
|
4
|
+
action: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
5
|
+
member: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
6
|
+
};
|
|
7
|
+
static description: string;
|
|
8
|
+
static examples: string[];
|
|
9
|
+
run(): Promise<unknown>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const core_1 = require("@oclif/core");
|
|
4
|
+
const base_1 = require("../../../base");
|
|
5
|
+
const output_1 = require("../../../lib/output");
|
|
6
|
+
const workload_1 = require("../../../lib/workload");
|
|
7
|
+
class WorkloadParticipantAdd extends base_1.BaseCommand {
|
|
8
|
+
static args = {
|
|
9
|
+
action: core_1.Args.string({ description: 'Workload action id', required: true }),
|
|
10
|
+
member: core_1.Args.string({ description: 'Participant account id or email (must be on the action team)', required: true }),
|
|
11
|
+
};
|
|
12
|
+
static description = 'Add someone to a workload action (they must belong to the team that owns it)';
|
|
13
|
+
static examples = ['<%= config.bin %> workload participant add <action-id> ada@acme.com'];
|
|
14
|
+
async run() {
|
|
15
|
+
const { args } = await this.parse(WorkloadParticipantAdd);
|
|
16
|
+
const accountId = await this.resolveMemberId(args.member);
|
|
17
|
+
const res = await this.api.post(`${workload_1.WORKLOAD_ACTIONS_PATH}/${encodeURIComponent(args.action)}/participants`, { account_id: accountId });
|
|
18
|
+
const data = res.data ?? {};
|
|
19
|
+
if (!this.jsonEnabled()) {
|
|
20
|
+
this.log(`Added ${args.member} to workload action ${args.action}:`);
|
|
21
|
+
this.log((0, output_1.renderRecord)(data));
|
|
22
|
+
this.log((0, workload_1.participantsLine)(data));
|
|
23
|
+
}
|
|
24
|
+
return res;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.default = WorkloadParticipantAdd;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { BaseCommand } from '../../../base';
|
|
2
|
+
export default class WorkloadParticipantRemove extends BaseCommand {
|
|
3
|
+
static args: {
|
|
4
|
+
action: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
5
|
+
member: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
6
|
+
};
|
|
7
|
+
static description: string;
|
|
8
|
+
static examples: string[];
|
|
9
|
+
run(): Promise<unknown>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const core_1 = require("@oclif/core");
|
|
4
|
+
const base_1 = require("../../../base");
|
|
5
|
+
const workload_1 = require("../../../lib/workload");
|
|
6
|
+
class WorkloadParticipantRemove extends base_1.BaseCommand {
|
|
7
|
+
static args = {
|
|
8
|
+
action: core_1.Args.string({ description: 'Workload action id', required: true }),
|
|
9
|
+
member: core_1.Args.string({ description: 'Participant account id or email', required: true }),
|
|
10
|
+
};
|
|
11
|
+
static description = 'Remove someone from a workload action (idempotent: removing who is not there succeeds)';
|
|
12
|
+
static examples = ['<%= config.bin %> workload participant remove <action-id> ada@acme.com'];
|
|
13
|
+
async run() {
|
|
14
|
+
const { args } = await this.parse(WorkloadParticipantRemove);
|
|
15
|
+
const accountId = await this.resolveMemberId(args.member);
|
|
16
|
+
await this.api.delete(`${workload_1.WORKLOAD_ACTIONS_PATH}/${encodeURIComponent(args.action)}/participants/${encodeURIComponent(accountId)}`);
|
|
17
|
+
if (!this.jsonEnabled()) {
|
|
18
|
+
this.log(`Removed ${args.member} from workload action ${args.action}`);
|
|
19
|
+
}
|
|
20
|
+
return { removed: accountId };
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
exports.default = WorkloadParticipantRemove;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { BaseCommand } from '../../base';
|
|
2
|
+
export default class WorkloadPromote extends BaseCommand {
|
|
3
|
+
static args: {
|
|
4
|
+
action: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
5
|
+
};
|
|
6
|
+
static description: string;
|
|
7
|
+
static examples: string[];
|
|
8
|
+
static flags: {
|
|
9
|
+
status: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
10
|
+
priority: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
11
|
+
title: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
12
|
+
description: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
13
|
+
kind: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
14
|
+
project: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
15
|
+
};
|
|
16
|
+
run(): Promise<unknown>;
|
|
17
|
+
}
|