@mnemom/mnemom 0.9.1 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/advisories.d.ts +32 -0
- package/dist/commands/advisories.js +158 -0
- package/dist/commands/org.d.ts +23 -0
- package/dist/commands/org.js +122 -0
- package/dist/commands/posture.d.ts +71 -0
- package/dist/commands/posture.js +440 -0
- package/dist/commands/team.d.ts +56 -0
- package/dist/commands/team.js +507 -0
- package/dist/commands/validate.d.ts +23 -0
- package/dist/commands/validate.js +150 -0
- package/dist/index.js +442 -14
- package/dist/lib/api.d.ts +393 -0
- package/dist/lib/api.js +676 -5
- package/package.json +1 -1
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `mnemom advisories ...` commands — Piece 6 of T1-3.1 (ADR-040, ADR-045, ADR-047).
|
|
3
|
+
*
|
|
4
|
+
* mnemom advisories list --agent <agent_id> [--source <source>] [--limit <n>] [--since <ISO>] [--json]
|
|
5
|
+
* mnemom advisories list --team <team_id> [--source <source>] [--limit <n>] [--since <ISO>] [--json]
|
|
6
|
+
* mnemom advisories show <advisory_id> [--agent <agent_id> | --team <team_id>] [--json]
|
|
7
|
+
*
|
|
8
|
+
* Surfaces the customer-facing read paths over `pending_advisories` rows
|
|
9
|
+
* with `source LIKE 'sideband.%'`. Detector firings — coherence,
|
|
10
|
+
* fault-line, fleet, drift — land here as the cross-turn carryover the
|
|
11
|
+
* gateway injects on the agent's next request.
|
|
12
|
+
*
|
|
13
|
+
* Either --agent or --team is required. Source filter accepts the closed
|
|
14
|
+
* enum values from ADR-047 §6 (sideband.coherence, sideband.fault_line,
|
|
15
|
+
* sideband.fleet, sideband.drift, manual.admin) — unknown values are
|
|
16
|
+
* accepted and applied verbatim (forward-compat for ADR-047 amendments).
|
|
17
|
+
*/
|
|
18
|
+
interface ListOpts {
|
|
19
|
+
agent?: string;
|
|
20
|
+
team?: string;
|
|
21
|
+
source?: string;
|
|
22
|
+
limit?: string;
|
|
23
|
+
since?: string;
|
|
24
|
+
json?: boolean;
|
|
25
|
+
}
|
|
26
|
+
export declare function advisoriesListCommand(opts: ListOpts): Promise<void>;
|
|
27
|
+
export declare function advisoriesShowCommand(advisoryId: string, opts: {
|
|
28
|
+
agent?: string;
|
|
29
|
+
team?: string;
|
|
30
|
+
json?: boolean;
|
|
31
|
+
}): Promise<void>;
|
|
32
|
+
export {};
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `mnemom advisories ...` commands — Piece 6 of T1-3.1 (ADR-040, ADR-045, ADR-047).
|
|
3
|
+
*
|
|
4
|
+
* mnemom advisories list --agent <agent_id> [--source <source>] [--limit <n>] [--since <ISO>] [--json]
|
|
5
|
+
* mnemom advisories list --team <team_id> [--source <source>] [--limit <n>] [--since <ISO>] [--json]
|
|
6
|
+
* mnemom advisories show <advisory_id> [--agent <agent_id> | --team <team_id>] [--json]
|
|
7
|
+
*
|
|
8
|
+
* Surfaces the customer-facing read paths over `pending_advisories` rows
|
|
9
|
+
* with `source LIKE 'sideband.%'`. Detector firings — coherence,
|
|
10
|
+
* fault-line, fleet, drift — land here as the cross-turn carryover the
|
|
11
|
+
* gateway injects on the agent's next request.
|
|
12
|
+
*
|
|
13
|
+
* Either --agent or --team is required. Source filter accepts the closed
|
|
14
|
+
* enum values from ADR-047 §6 (sideband.coherence, sideband.fault_line,
|
|
15
|
+
* sideband.fleet, sideband.drift, manual.admin) — unknown values are
|
|
16
|
+
* accepted and applied verbatim (forward-compat for ADR-047 amendments).
|
|
17
|
+
*/
|
|
18
|
+
import chalk from "chalk";
|
|
19
|
+
import { listSidebandAdvisoriesForAgent, listSidebandAdvisoriesForTeam, } from "../lib/api.js";
|
|
20
|
+
import { requireAuth } from "../lib/auth.js";
|
|
21
|
+
import { fmt } from "../lib/format.js";
|
|
22
|
+
function statusBadge(s) {
|
|
23
|
+
switch (s) {
|
|
24
|
+
case "pending":
|
|
25
|
+
return fmt.badge("PENDING", "yellow");
|
|
26
|
+
case "consumed":
|
|
27
|
+
return chalk.dim("consumed");
|
|
28
|
+
case "expired":
|
|
29
|
+
return chalk.dim("expired");
|
|
30
|
+
default:
|
|
31
|
+
return chalk.dim(s.toUpperCase());
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function shortId(id) {
|
|
35
|
+
return id.length <= 16 ? id : id.slice(0, 13) + "...";
|
|
36
|
+
}
|
|
37
|
+
function formatRow(a) {
|
|
38
|
+
return [
|
|
39
|
+
chalk.dim(shortId(a.id).padEnd(16)),
|
|
40
|
+
chalk.cyan(a.source.padEnd(22)),
|
|
41
|
+
statusBadge(a.status).padEnd(20),
|
|
42
|
+
chalk.dim(a.created_at.replace("T", " ").replace(/\.\d+Z$/, "Z")),
|
|
43
|
+
a.concerns_summary,
|
|
44
|
+
].join(" ");
|
|
45
|
+
}
|
|
46
|
+
// ─── mnemom advisories list ──────────────────────────────────────────────
|
|
47
|
+
export async function advisoriesListCommand(opts) {
|
|
48
|
+
if (!opts.agent && !opts.team) {
|
|
49
|
+
console.error(fmt.error("--agent <id> or --team <id> is required") + "\n");
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
if (opts.agent && opts.team) {
|
|
53
|
+
console.error(fmt.error("--agent and --team are mutually exclusive") + "\n");
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
await requireAuth();
|
|
57
|
+
const limit = opts.limit ? parseInt(opts.limit, 10) : undefined;
|
|
58
|
+
if (opts.limit && (Number.isNaN(limit) || (limit ?? 0) <= 0)) {
|
|
59
|
+
console.error(fmt.error(`--limit must be a positive integer (got '${opts.limit}')`) + "\n");
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
let result;
|
|
63
|
+
let scopeLabel;
|
|
64
|
+
try {
|
|
65
|
+
if (opts.agent) {
|
|
66
|
+
result = await listSidebandAdvisoriesForAgent(opts.agent, {
|
|
67
|
+
limit,
|
|
68
|
+
since: opts.since,
|
|
69
|
+
});
|
|
70
|
+
scopeLabel = `agent ${opts.agent}`;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
result = await listSidebandAdvisoriesForTeam(opts.team, {
|
|
74
|
+
limit,
|
|
75
|
+
since: opts.since,
|
|
76
|
+
});
|
|
77
|
+
scopeLabel = `team ${opts.team}`;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
console.error(fmt.error(err instanceof Error ? err.message : String(err)) + "\n");
|
|
82
|
+
process.exit(1);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
let advisories = result.advisories;
|
|
86
|
+
if (opts.source) {
|
|
87
|
+
advisories = advisories.filter((a) => a.source === opts.source);
|
|
88
|
+
}
|
|
89
|
+
if (opts.json) {
|
|
90
|
+
console.log(fmt.json({ ...result, advisories }));
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
if (advisories.length === 0) {
|
|
94
|
+
console.log(chalk.dim(`No sideband advisories for ${scopeLabel}.`));
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
console.log(chalk.bold(`Sideband advisories — ${scopeLabel}`));
|
|
98
|
+
console.log(chalk.dim(`(${advisories.length} row(s))`));
|
|
99
|
+
console.log();
|
|
100
|
+
console.log(chalk.dim("ID SOURCE STATUS CREATED SUMMARY"));
|
|
101
|
+
for (const a of advisories) {
|
|
102
|
+
console.log(formatRow(a));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// ─── mnemom advisories show ──────────────────────────────────────────────
|
|
106
|
+
export async function advisoriesShowCommand(advisoryId, opts) {
|
|
107
|
+
if (!opts.agent && !opts.team) {
|
|
108
|
+
console.error(fmt.error("--agent <id> or --team <id> is required (the listing endpoint scopes results)") +
|
|
109
|
+
"\n");
|
|
110
|
+
process.exit(1);
|
|
111
|
+
}
|
|
112
|
+
await requireAuth();
|
|
113
|
+
let advisories;
|
|
114
|
+
try {
|
|
115
|
+
if (opts.agent) {
|
|
116
|
+
advisories = (await listSidebandAdvisoriesForAgent(opts.agent, { limit: 200 })).advisories;
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
advisories = (await listSidebandAdvisoriesForTeam(opts.team, { limit: 500 })).advisories;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
console.error(fmt.error(err instanceof Error ? err.message : String(err)) + "\n");
|
|
124
|
+
process.exit(1);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const match = advisories.find((a) => a.id === advisoryId);
|
|
128
|
+
if (!match) {
|
|
129
|
+
console.error(fmt.error(`Advisory '${advisoryId}' not found in scope.`) + "\n");
|
|
130
|
+
process.exit(1);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
if (opts.json) {
|
|
134
|
+
console.log(fmt.json(match));
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
console.log(chalk.bold(match.id));
|
|
138
|
+
console.log();
|
|
139
|
+
console.log(fmt.label("source ", match.source));
|
|
140
|
+
console.log(fmt.label("status ", match.status));
|
|
141
|
+
console.log(fmt.label("agent_id ", match.agent_id));
|
|
142
|
+
console.log(fmt.label("created_at ", match.created_at));
|
|
143
|
+
console.log(fmt.label("expires_at ", match.expires_at));
|
|
144
|
+
if (match.consumed_at) {
|
|
145
|
+
console.log(fmt.label("consumed_at ", match.consumed_at));
|
|
146
|
+
}
|
|
147
|
+
console.log();
|
|
148
|
+
console.log(chalk.bold("Concerns summary"));
|
|
149
|
+
console.log(` ${match.concerns_summary}`);
|
|
150
|
+
console.log();
|
|
151
|
+
console.log(chalk.bold("Nudge content (injected to agent)"));
|
|
152
|
+
console.log(` ${match.nudge_content}`);
|
|
153
|
+
if (match.source_ref) {
|
|
154
|
+
console.log();
|
|
155
|
+
console.log(chalk.bold("source_ref"));
|
|
156
|
+
console.log(fmt.json(match.source_ref));
|
|
157
|
+
}
|
|
158
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `mnemom org list`
|
|
3
|
+
*
|
|
4
|
+
* Lists every org the user is a member of, including their personal-org-of-one
|
|
5
|
+
* (per ADR-044 Option A — GitHub model). Personal orgs are tagged `(personal)`
|
|
6
|
+
* in the Name column. Output is a human-readable table; pass `--json` for
|
|
7
|
+
* machine-readable output.
|
|
8
|
+
*/
|
|
9
|
+
export declare function orgListCommand(opts: {
|
|
10
|
+
json?: boolean;
|
|
11
|
+
}): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* `mnemom org show [<org_id>]` or `mnemom org show --personal`
|
|
14
|
+
*
|
|
15
|
+
* Print details for one organization. With `--personal`, fetches the user's
|
|
16
|
+
* personal org via `/v1/auth/me/personal-org`. Otherwise, the membership
|
|
17
|
+
* matching `<org_id>` is printed (or, if no id is given and the user has
|
|
18
|
+
* exactly one membership, that one).
|
|
19
|
+
*/
|
|
20
|
+
export declare function orgShowCommand(orgIdArg: string | undefined, opts: {
|
|
21
|
+
personal?: boolean;
|
|
22
|
+
json?: boolean;
|
|
23
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { listMyOrgs, getMyPersonalOrg } from "../lib/api.js";
|
|
2
|
+
import { requireAuth } from "../lib/auth.js";
|
|
3
|
+
import { fmt } from "../lib/format.js";
|
|
4
|
+
/**
|
|
5
|
+
* `mnemom org list`
|
|
6
|
+
*
|
|
7
|
+
* Lists every org the user is a member of, including their personal-org-of-one
|
|
8
|
+
* (per ADR-044 Option A — GitHub model). Personal orgs are tagged `(personal)`
|
|
9
|
+
* in the Name column. Output is a human-readable table; pass `--json` for
|
|
10
|
+
* machine-readable output.
|
|
11
|
+
*/
|
|
12
|
+
export async function orgListCommand(opts) {
|
|
13
|
+
await requireAuth();
|
|
14
|
+
let orgs;
|
|
15
|
+
try {
|
|
16
|
+
orgs = await listMyOrgs();
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
20
|
+
console.log(fmt.error(`Failed to list orgs: ${msg}`) + "\n");
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
if (opts.json) {
|
|
24
|
+
console.log(JSON.stringify(orgs, null, 2));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
console.log(fmt.header("Organizations"));
|
|
28
|
+
console.log();
|
|
29
|
+
if (orgs.length === 0) {
|
|
30
|
+
console.log(" No organizations found.\n");
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const nameW = 32;
|
|
34
|
+
const idW = 24;
|
|
35
|
+
const roleW = 10;
|
|
36
|
+
const ownerW = 8;
|
|
37
|
+
const header = "Name".padEnd(nameW) +
|
|
38
|
+
"ID".padEnd(idW) +
|
|
39
|
+
"Role".padEnd(roleW) +
|
|
40
|
+
"Owner".padEnd(ownerW);
|
|
41
|
+
console.log(` ${header}`);
|
|
42
|
+
console.log(` ${"─".repeat(nameW + idW + roleW + ownerW)}`);
|
|
43
|
+
for (const org of orgs) {
|
|
44
|
+
const tag = org.is_personal ? " (personal)" : "";
|
|
45
|
+
const name = `${org.name}${tag}`.slice(0, nameW - 2).padEnd(nameW);
|
|
46
|
+
const id = org.org_id.slice(0, idW - 2).padEnd(idW);
|
|
47
|
+
const role = (org.role ?? "-").padEnd(roleW);
|
|
48
|
+
const owner = (org.is_owner ? "yes" : "no").padEnd(ownerW);
|
|
49
|
+
console.log(` ${name}${id}${role}${owner}`);
|
|
50
|
+
}
|
|
51
|
+
console.log(`\n Total: ${orgs.length} organization(s)\n`);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* `mnemom org show [<org_id>]` or `mnemom org show --personal`
|
|
55
|
+
*
|
|
56
|
+
* Print details for one organization. With `--personal`, fetches the user's
|
|
57
|
+
* personal org via `/v1/auth/me/personal-org`. Otherwise, the membership
|
|
58
|
+
* matching `<org_id>` is printed (or, if no id is given and the user has
|
|
59
|
+
* exactly one membership, that one).
|
|
60
|
+
*/
|
|
61
|
+
export async function orgShowCommand(orgIdArg, opts) {
|
|
62
|
+
await requireAuth();
|
|
63
|
+
let target = null;
|
|
64
|
+
try {
|
|
65
|
+
if (opts.personal) {
|
|
66
|
+
const ref = await getMyPersonalOrg();
|
|
67
|
+
// Re-resolve to the full org row so we can print every field.
|
|
68
|
+
const orgs = await listMyOrgs();
|
|
69
|
+
target = orgs.find((o) => o.org_id === ref.org_id) ?? null;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
const orgs = await listMyOrgs();
|
|
73
|
+
if (orgIdArg) {
|
|
74
|
+
target = orgs.find((o) => o.org_id === orgIdArg) ?? null;
|
|
75
|
+
if (!target) {
|
|
76
|
+
console.log(fmt.error(`Org '${orgIdArg}' not found in your memberships.`) + "\n");
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
else if (orgs.length === 1) {
|
|
81
|
+
target = orgs[0];
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
console.log(fmt.warn(`You have ${orgs.length} memberships. Specify an org_id or pass --personal.`) + "\n");
|
|
85
|
+
process.exit(1);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
92
|
+
console.log(fmt.error(`Failed to fetch org: ${msg}`) + "\n");
|
|
93
|
+
process.exit(1);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (!target) {
|
|
97
|
+
console.log(fmt.error("Org not found.") + "\n");
|
|
98
|
+
process.exit(1);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
if (opts.json) {
|
|
102
|
+
console.log(JSON.stringify(target, null, 2));
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
console.log(fmt.header(target.name));
|
|
106
|
+
console.log();
|
|
107
|
+
console.log(` ID: ${target.org_id}`);
|
|
108
|
+
console.log(` Slug: ${target.slug}`);
|
|
109
|
+
console.log(` Personal: ${target.is_personal ? "yes" : "no"}`);
|
|
110
|
+
console.log(` Role: ${target.role ?? "-"}`);
|
|
111
|
+
console.log(` Owner: ${target.is_owner ? "yes (you)" : "no"}`);
|
|
112
|
+
if (target.billing_email) {
|
|
113
|
+
console.log(` Billing: ${target.billing_email}`);
|
|
114
|
+
}
|
|
115
|
+
if (target.company_name) {
|
|
116
|
+
console.log(` Company: ${target.company_name}`);
|
|
117
|
+
}
|
|
118
|
+
if (target.accepted_at) {
|
|
119
|
+
console.log(` Accepted at: ${new Date(target.accepted_at).toLocaleDateString()}`);
|
|
120
|
+
}
|
|
121
|
+
console.log();
|
|
122
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `mnemom posture ...` commands — Piece 3 of T1-3.1 (ADR-045).
|
|
3
|
+
*
|
|
4
|
+
* mnemom posture list [--org <id>] [--include-platform=false] [--json]
|
|
5
|
+
* mnemom posture show <posture_id> [--json]
|
|
6
|
+
* mnemom posture create --org <id> --slug <slug> --name <name>
|
|
7
|
+
* --from <file> [--description <text>]
|
|
8
|
+
* mnemom posture update <posture_id> --from <file> [--summary <text>]
|
|
9
|
+
* mnemom posture clone <posture_id> --org <id> [--slug <slug>] [--name <name>]
|
|
10
|
+
* mnemom posture revisions <posture_id> [--json]
|
|
11
|
+
* mnemom posture diff <posture_id> --from <N> --to <M> [--json]
|
|
12
|
+
* mnemom posture assign <posture_id> --team <team_id> [--pin-revision <N>]
|
|
13
|
+
* mnemom posture unassign <posture_id> --team <team_id>
|
|
14
|
+
* mnemom posture preview-compose <posture_id> --team <team_id> [--json]
|
|
15
|
+
* mnemom posture delete <posture_id>
|
|
16
|
+
*
|
|
17
|
+
* Per ADR-045: postures are team-scoped policy input; cards remain
|
|
18
|
+
* agent-scoped runtime output. The CLI authenticates the user the same
|
|
19
|
+
* way `mnemom team` and `mnemom org` do — login token or MNEMOM_API_KEY.
|
|
20
|
+
*/
|
|
21
|
+
export declare function postureListCommand(opts: {
|
|
22
|
+
org?: string;
|
|
23
|
+
includePlatform?: boolean;
|
|
24
|
+
json?: boolean;
|
|
25
|
+
}): Promise<void>;
|
|
26
|
+
export declare function postureShowCommand(postureId: string | undefined, opts: {
|
|
27
|
+
json?: boolean;
|
|
28
|
+
}): Promise<void>;
|
|
29
|
+
export declare function postureCreateCommand(opts: {
|
|
30
|
+
org?: string;
|
|
31
|
+
slug?: string;
|
|
32
|
+
name?: string;
|
|
33
|
+
from?: string;
|
|
34
|
+
description?: string;
|
|
35
|
+
summary?: string;
|
|
36
|
+
json?: boolean;
|
|
37
|
+
}): Promise<void>;
|
|
38
|
+
export declare function postureUpdateCommand(postureId: string | undefined, opts: {
|
|
39
|
+
from?: string;
|
|
40
|
+
summary?: string;
|
|
41
|
+
name?: string;
|
|
42
|
+
description?: string;
|
|
43
|
+
json?: boolean;
|
|
44
|
+
}): Promise<void>;
|
|
45
|
+
export declare function postureCloneCommand(postureId: string | undefined, opts: {
|
|
46
|
+
org?: string;
|
|
47
|
+
slug?: string;
|
|
48
|
+
name?: string;
|
|
49
|
+
description?: string;
|
|
50
|
+
json?: boolean;
|
|
51
|
+
}): Promise<void>;
|
|
52
|
+
export declare function postureRevisionsCommand(postureId: string | undefined, opts: {
|
|
53
|
+
json?: boolean;
|
|
54
|
+
}): Promise<void>;
|
|
55
|
+
export declare function postureDiffCommand(postureId: string | undefined, opts: {
|
|
56
|
+
from?: string;
|
|
57
|
+
to?: string;
|
|
58
|
+
json?: boolean;
|
|
59
|
+
}): Promise<void>;
|
|
60
|
+
export declare function postureAssignCommand(postureId: string | undefined, opts: {
|
|
61
|
+
team?: string;
|
|
62
|
+
pinRevision?: string;
|
|
63
|
+
}): Promise<void>;
|
|
64
|
+
export declare function postureUnassignCommand(postureId: string | undefined, opts: {
|
|
65
|
+
team?: string;
|
|
66
|
+
}): Promise<void>;
|
|
67
|
+
export declare function posturePreviewComposeCommand(postureId: string | undefined, opts: {
|
|
68
|
+
team?: string;
|
|
69
|
+
json?: boolean;
|
|
70
|
+
}): Promise<void>;
|
|
71
|
+
export declare function postureDeleteCommand(postureId: string | undefined): Promise<void>;
|