@unbrained/pm-cli 2026.5.2 → 2026.5.3-5
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/AGENTS.md +8 -1
- package/CHANGELOG.md +53 -0
- package/README.md +9 -1
- package/dist/cli/bootstrap-args.d.ts +18 -0
- package/dist/cli/bootstrap-args.js +242 -0
- package/dist/cli/bootstrap-args.js.map +1 -0
- package/dist/cli/commander-usage.d.ts +17 -0
- package/dist/cli/commander-usage.js +178 -0
- package/dist/cli/commander-usage.js.map +1 -0
- package/dist/cli/commands/activity.js +1 -9
- package/dist/cli/commands/activity.js.map +1 -1
- package/dist/cli/commands/calendar.js +3 -29
- package/dist/cli/commands/calendar.js.map +1 -1
- package/dist/cli/commands/comments.js +1 -9
- package/dist/cli/commands/comments.js.map +1 -1
- package/dist/cli/commands/config.d.ts +21 -3
- package/dist/cli/commands/config.js +118 -2
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/context.d.ts +90 -1
- package/dist/cli/commands/context.js +485 -23
- package/dist/cli/commands/context.js.map +1 -1
- package/dist/cli/commands/dedupe-audit.js +2 -11
- package/dist/cli/commands/dedupe-audit.js.map +1 -1
- package/dist/cli/commands/history.js +1 -9
- package/dist/cli/commands/history.js.map +1 -1
- package/dist/cli/commands/learnings.js +1 -9
- package/dist/cli/commands/learnings.js.map +1 -1
- package/dist/cli/commands/list.js +3 -29
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/normalize.js +9 -6
- package/dist/cli/commands/normalize.js.map +1 -1
- package/dist/cli/commands/notes.js +1 -9
- package/dist/cli/commands/notes.js.map +1 -1
- package/dist/cli/commands/reindex.js +2 -7
- package/dist/cli/commands/reindex.js.map +1 -1
- package/dist/cli/commands/search.js +4 -35
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/test-runs.js +1 -11
- package/dist/cli/commands/test-runs.js.map +1 -1
- package/dist/cli/error-guidance.d.ts +13 -0
- package/dist/cli/error-guidance.js +43 -4
- package/dist/cli/error-guidance.js.map +1 -1
- package/dist/cli/extension-command-help.d.ts +48 -0
- package/dist/cli/extension-command-help.js +389 -0
- package/dist/cli/extension-command-help.js.map +1 -0
- package/dist/cli/help-content.js +9 -3
- package/dist/cli/help-content.js.map +1 -1
- package/dist/cli/help-json-payload.d.ts +25 -0
- package/dist/cli/help-json-payload.js +265 -0
- package/dist/cli/help-json-payload.js.map +1 -0
- package/dist/cli/main.js +996 -4468
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/migration-gates.d.ts +22 -0
- package/dist/cli/migration-gates.js +146 -0
- package/dist/cli/migration-gates.js.map +1 -0
- package/dist/cli/register-list-query.d.ts +2 -0
- package/dist/cli/register-list-query.js +317 -0
- package/dist/cli/register-list-query.js.map +1 -0
- package/dist/cli/register-mutation.d.ts +2 -0
- package/dist/cli/register-mutation.js +795 -0
- package/dist/cli/register-mutation.js.map +1 -0
- package/dist/cli/register-operations.d.ts +2 -0
- package/dist/cli/register-operations.js +610 -0
- package/dist/cli/register-operations.js.map +1 -0
- package/dist/cli/register-setup.d.ts +2 -0
- package/dist/cli/register-setup.js +334 -0
- package/dist/cli/register-setup.js.map +1 -0
- package/dist/cli/registration-helpers.d.ts +53 -0
- package/dist/cli/registration-helpers.js +669 -0
- package/dist/cli/registration-helpers.js.map +1 -0
- package/dist/cli/shared-parsers.d.ts +6 -0
- package/dist/cli/shared-parsers.js +40 -0
- package/dist/cli/shared-parsers.js.map +1 -0
- package/dist/core/search/http-client.d.ts +29 -0
- package/dist/core/search/http-client.js +64 -0
- package/dist/core/search/http-client.js.map +1 -0
- package/dist/core/search/providers.d.ts +3 -13
- package/dist/core/search/providers.js +19 -69
- package/dist/core/search/providers.js.map +1 -1
- package/dist/core/search/semantic-defaults.js +2 -7
- package/dist/core/search/semantic-defaults.js.map +1 -1
- package/dist/core/search/vector-stores.d.ts +3 -13
- package/dist/core/search/vector-stores.js +17 -66
- package/dist/core/search/vector-stores.js.map +1 -1
- package/dist/core/sentry/helpers.d.ts +23 -2
- package/dist/core/sentry/helpers.js +101 -3
- package/dist/core/sentry/helpers.js.map +1 -1
- package/dist/core/sentry/instrument.d.ts +21 -0
- package/dist/core/sentry/instrument.js +34 -3
- package/dist/core/sentry/instrument.js.map +1 -1
- package/dist/core/shared/constants.d.ts +3 -0
- package/dist/core/shared/constants.js +58 -1
- package/dist/core/shared/constants.js.map +1 -1
- package/dist/core/store/front-matter-cache.d.ts +6 -0
- package/dist/core/store/front-matter-cache.js +150 -0
- package/dist/core/store/front-matter-cache.js.map +1 -0
- package/dist/core/store/item-store.js +2 -1
- package/dist/core/store/item-store.js.map +1 -1
- package/dist/core/store/settings.js +36 -0
- package/dist/core/store/settings.js.map +1 -1
- package/dist/core/telemetry/observability.d.ts +24 -0
- package/dist/core/telemetry/observability.js +185 -0
- package/dist/core/telemetry/observability.js.map +1 -0
- package/dist/core/telemetry/runtime.d.ts +27 -3
- package/dist/core/telemetry/runtime.js +298 -13
- package/dist/core/telemetry/runtime.js.map +1 -1
- package/dist/sdk/cli-contracts.js +28 -0
- package/dist/sdk/cli-contracts.js.map +1 -1
- package/dist/types.d.ts +21 -0
- package/dist/types.js +11 -0
- package/dist/types.js.map +1 -1
- package/docs/ARCHITECTURE.md +7 -1
- package/docs/COMMANDS.md +11 -1
- package/docs/RELEASING.md +56 -29
- package/package.json +8 -3
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { EXIT_CODE } from "../shared/constants.js";
|
|
2
|
+
const SETUP_ROOT_COMMANDS = new Set(["init", "config", "completion", "completion-tags"]);
|
|
3
|
+
const QUERY_ROOT_COMMANDS = new Set([
|
|
4
|
+
"list",
|
|
5
|
+
"list-all",
|
|
6
|
+
"list-open",
|
|
7
|
+
"list-in-progress",
|
|
8
|
+
"list-blocked",
|
|
9
|
+
"list-closed",
|
|
10
|
+
"list-canceled",
|
|
11
|
+
"list-draft",
|
|
12
|
+
"search",
|
|
13
|
+
"get",
|
|
14
|
+
"context",
|
|
15
|
+
"calendar",
|
|
16
|
+
"history",
|
|
17
|
+
"activity",
|
|
18
|
+
"aggregate",
|
|
19
|
+
"deps",
|
|
20
|
+
"contracts",
|
|
21
|
+
"stats",
|
|
22
|
+
"dedupe-audit",
|
|
23
|
+
]);
|
|
24
|
+
const MUTATION_ROOT_COMMANDS = new Set([
|
|
25
|
+
"create",
|
|
26
|
+
"update",
|
|
27
|
+
"update-many",
|
|
28
|
+
"append",
|
|
29
|
+
"close",
|
|
30
|
+
"delete",
|
|
31
|
+
"restore",
|
|
32
|
+
"claim",
|
|
33
|
+
"release",
|
|
34
|
+
"comments",
|
|
35
|
+
"notes",
|
|
36
|
+
"learnings",
|
|
37
|
+
"files",
|
|
38
|
+
"docs",
|
|
39
|
+
"start-task",
|
|
40
|
+
"pause-task",
|
|
41
|
+
"close-task",
|
|
42
|
+
]);
|
|
43
|
+
const TESTING_ROOT_COMMANDS = new Set(["test", "test-all", "test-runs", "test-verify", "trace-test", "test-ping"]);
|
|
44
|
+
const DIAGNOSTICS_ROOT_COMMANDS = new Set(["health", "validate", "normalize", "reindex", "gc", "extension-doctor"]);
|
|
45
|
+
function normalizeCommandPath(commandPath) {
|
|
46
|
+
return commandPath
|
|
47
|
+
.trim()
|
|
48
|
+
.replaceAll(/\s+/g, " ")
|
|
49
|
+
.toLowerCase();
|
|
50
|
+
}
|
|
51
|
+
function normalizeErrorCode(errorCode) {
|
|
52
|
+
const normalized = errorCode?.trim().toLowerCase();
|
|
53
|
+
return normalized && normalized.length > 0 ? normalized : undefined;
|
|
54
|
+
}
|
|
55
|
+
export function deriveTelemetryCommandTaxonomy(commandPath) {
|
|
56
|
+
const normalizedPath = normalizeCommandPath(commandPath);
|
|
57
|
+
const tokens = normalizedPath.length > 0 ? normalizedPath.split(" ") : ["<unknown>"];
|
|
58
|
+
const root = tokens[0] ?? "<unknown>";
|
|
59
|
+
const leaf = tokens[tokens.length - 1] ?? root;
|
|
60
|
+
let family = "other";
|
|
61
|
+
if (SETUP_ROOT_COMMANDS.has(root)) {
|
|
62
|
+
family = "setup";
|
|
63
|
+
}
|
|
64
|
+
else if (QUERY_ROOT_COMMANDS.has(root)) {
|
|
65
|
+
family = "query";
|
|
66
|
+
}
|
|
67
|
+
else if (MUTATION_ROOT_COMMANDS.has(root)) {
|
|
68
|
+
family = "mutation";
|
|
69
|
+
}
|
|
70
|
+
else if (TESTING_ROOT_COMMANDS.has(root)) {
|
|
71
|
+
family = "testing";
|
|
72
|
+
}
|
|
73
|
+
else if (root === "extension") {
|
|
74
|
+
family = "extension";
|
|
75
|
+
}
|
|
76
|
+
else if (DIAGNOSTICS_ROOT_COMMANDS.has(root)) {
|
|
77
|
+
family = "diagnostics";
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
command_path: normalizedPath.length > 0 ? normalizedPath : "<unknown>",
|
|
81
|
+
command_root: root,
|
|
82
|
+
command_leaf: leaf,
|
|
83
|
+
command_depth: tokens.length,
|
|
84
|
+
command_family: family,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
export function inferTelemetryErrorCode(params) {
|
|
88
|
+
if (params.ok) {
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
const explicit = normalizeErrorCode(params.errorCode);
|
|
92
|
+
if (explicit) {
|
|
93
|
+
return explicit;
|
|
94
|
+
}
|
|
95
|
+
const message = (params.errorMessage ?? "").trim().toLowerCase();
|
|
96
|
+
if (message.includes("unknown command")) {
|
|
97
|
+
return "unknown_command";
|
|
98
|
+
}
|
|
99
|
+
if (message.includes("unknown option")) {
|
|
100
|
+
return "unknown_option";
|
|
101
|
+
}
|
|
102
|
+
if (message.includes("missing required options") || message.includes("missing required option")) {
|
|
103
|
+
return "missing_required_option";
|
|
104
|
+
}
|
|
105
|
+
if (message.includes("missing required argument")) {
|
|
106
|
+
return "missing_required_argument";
|
|
107
|
+
}
|
|
108
|
+
if (message.includes("no update flags provided")) {
|
|
109
|
+
return "no_update_fields";
|
|
110
|
+
}
|
|
111
|
+
if (message.includes("is assigned to") && message.includes("use --force")) {
|
|
112
|
+
return "ownership_conflict";
|
|
113
|
+
}
|
|
114
|
+
if (message.includes("is locked")) {
|
|
115
|
+
return "lock_conflict";
|
|
116
|
+
}
|
|
117
|
+
if (message.includes("already terminal") && message.includes("use --force")) {
|
|
118
|
+
return "terminal_state_conflict";
|
|
119
|
+
}
|
|
120
|
+
if (message.includes("tracker is not initialized")) {
|
|
121
|
+
return "tracker_not_initialized";
|
|
122
|
+
}
|
|
123
|
+
if (message.includes(" not found")) {
|
|
124
|
+
return "item_not_found";
|
|
125
|
+
}
|
|
126
|
+
if (message.includes("use \"pm close <id> <text>\" to close an item") ||
|
|
127
|
+
(message.includes("invalid --status value") && message.includes("\"closed\""))) {
|
|
128
|
+
return "close_through_update";
|
|
129
|
+
}
|
|
130
|
+
if (message.startsWith("invalid ") || message.includes(" must be ")) {
|
|
131
|
+
return "invalid_argument_value";
|
|
132
|
+
}
|
|
133
|
+
if (message.includes("strict create mode requires concrete values for --")) {
|
|
134
|
+
return "missing_required_option";
|
|
135
|
+
}
|
|
136
|
+
if (message.includes("either as positional") && message.includes("not both")) {
|
|
137
|
+
return "invalid_command_usage";
|
|
138
|
+
}
|
|
139
|
+
const exitCode = Number.isFinite(params.exitCode) ? Math.max(0, Math.trunc(params.exitCode ?? 0)) : undefined;
|
|
140
|
+
if (exitCode === EXIT_CODE.USAGE) {
|
|
141
|
+
return "invalid_command_usage";
|
|
142
|
+
}
|
|
143
|
+
if (exitCode === EXIT_CODE.NOT_FOUND) {
|
|
144
|
+
return "item_not_found";
|
|
145
|
+
}
|
|
146
|
+
if (exitCode === EXIT_CODE.CONFLICT) {
|
|
147
|
+
return "lock_conflict";
|
|
148
|
+
}
|
|
149
|
+
if (exitCode === EXIT_CODE.DEPENDENCY_FAILED) {
|
|
150
|
+
return "dependency_failed";
|
|
151
|
+
}
|
|
152
|
+
return "command_failed";
|
|
153
|
+
}
|
|
154
|
+
export function deriveTelemetryCommandResolution(params) {
|
|
155
|
+
if (params.ok) {
|
|
156
|
+
return "success";
|
|
157
|
+
}
|
|
158
|
+
const normalizedCode = normalizeErrorCode(params.errorCode);
|
|
159
|
+
if (normalizedCode === "unknown_command") {
|
|
160
|
+
return "nonexistent_command";
|
|
161
|
+
}
|
|
162
|
+
if (normalizedCode === "unknown_option") {
|
|
163
|
+
return "invalid_option";
|
|
164
|
+
}
|
|
165
|
+
if (normalizedCode === "missing_required_option") {
|
|
166
|
+
return "missing_required_option";
|
|
167
|
+
}
|
|
168
|
+
if (normalizedCode === "missing_required_argument") {
|
|
169
|
+
return "missing_required_argument";
|
|
170
|
+
}
|
|
171
|
+
if (params.errorCategory === "usage") {
|
|
172
|
+
return "invalid_usage";
|
|
173
|
+
}
|
|
174
|
+
if (params.errorCategory === "validation") {
|
|
175
|
+
return "validation_failed";
|
|
176
|
+
}
|
|
177
|
+
if (params.errorCategory === "conflict") {
|
|
178
|
+
return "conflict";
|
|
179
|
+
}
|
|
180
|
+
if (params.errorCategory === "runtime") {
|
|
181
|
+
return "runtime_failed";
|
|
182
|
+
}
|
|
183
|
+
return "unknown_failed";
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=observability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observability.js","sourceRoot":"/","sources":["core/telemetry/observability.ts"],"names":[],"mappings":"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","sourcesContent":["import { EXIT_CODE, type TelemetryErrorCategory } from \"../shared/constants.js\";\n\nexport type TelemetryResolutionStage = \"parse\" | \"preflight\" | \"execute\" | \"unknown\";\n\nexport type TelemetryCommandResolution =\n | \"success\"\n | \"nonexistent_command\"\n | \"invalid_option\"\n | \"missing_required_option\"\n | \"missing_required_argument\"\n | \"invalid_usage\"\n | \"validation_failed\"\n | \"conflict\"\n | \"runtime_failed\"\n | \"unknown_failed\";\n\nexport interface TelemetryCommandTaxonomy {\n command_path: string;\n command_root: string;\n command_leaf: string;\n command_depth: number;\n command_family: \"setup\" | \"query\" | \"mutation\" | \"testing\" | \"extension\" | \"diagnostics\" | \"other\";\n}\n\ninterface InferTelemetryErrorCodeParams {\n ok: boolean;\n errorCode?: string;\n errorMessage?: string;\n exitCode?: number;\n}\n\nconst SETUP_ROOT_COMMANDS = new Set([\"init\", \"config\", \"completion\", \"completion-tags\"]);\nconst QUERY_ROOT_COMMANDS = new Set([\n \"list\",\n \"list-all\",\n \"list-open\",\n \"list-in-progress\",\n \"list-blocked\",\n \"list-closed\",\n \"list-canceled\",\n \"list-draft\",\n \"search\",\n \"get\",\n \"context\",\n \"calendar\",\n \"history\",\n \"activity\",\n \"aggregate\",\n \"deps\",\n \"contracts\",\n \"stats\",\n \"dedupe-audit\",\n]);\nconst MUTATION_ROOT_COMMANDS = new Set([\n \"create\",\n \"update\",\n \"update-many\",\n \"append\",\n \"close\",\n \"delete\",\n \"restore\",\n \"claim\",\n \"release\",\n \"comments\",\n \"notes\",\n \"learnings\",\n \"files\",\n \"docs\",\n \"start-task\",\n \"pause-task\",\n \"close-task\",\n]);\nconst TESTING_ROOT_COMMANDS = new Set([\"test\", \"test-all\", \"test-runs\", \"test-verify\", \"trace-test\", \"test-ping\"]);\nconst DIAGNOSTICS_ROOT_COMMANDS = new Set([\"health\", \"validate\", \"normalize\", \"reindex\", \"gc\", \"extension-doctor\"]);\n\nfunction normalizeCommandPath(commandPath: string): string {\n return commandPath\n .trim()\n .replaceAll(/\\s+/g, \" \")\n .toLowerCase();\n}\n\nfunction normalizeErrorCode(errorCode: string | undefined): string | undefined {\n const normalized = errorCode?.trim().toLowerCase();\n return normalized && normalized.length > 0 ? normalized : undefined;\n}\n\nexport function deriveTelemetryCommandTaxonomy(commandPath: string): TelemetryCommandTaxonomy {\n const normalizedPath = normalizeCommandPath(commandPath);\n const tokens = normalizedPath.length > 0 ? normalizedPath.split(\" \") : [\"<unknown>\"];\n const root = tokens[0] ?? \"<unknown>\";\n const leaf = tokens[tokens.length - 1] ?? root;\n\n let family: TelemetryCommandTaxonomy[\"command_family\"] = \"other\";\n if (SETUP_ROOT_COMMANDS.has(root)) {\n family = \"setup\";\n } else if (QUERY_ROOT_COMMANDS.has(root)) {\n family = \"query\";\n } else if (MUTATION_ROOT_COMMANDS.has(root)) {\n family = \"mutation\";\n } else if (TESTING_ROOT_COMMANDS.has(root)) {\n family = \"testing\";\n } else if (root === \"extension\") {\n family = \"extension\";\n } else if (DIAGNOSTICS_ROOT_COMMANDS.has(root)) {\n family = \"diagnostics\";\n }\n\n return {\n command_path: normalizedPath.length > 0 ? normalizedPath : \"<unknown>\",\n command_root: root,\n command_leaf: leaf,\n command_depth: tokens.length,\n command_family: family,\n };\n}\n\nexport function inferTelemetryErrorCode(params: InferTelemetryErrorCodeParams): string | undefined {\n if (params.ok) {\n return undefined;\n }\n\n const explicit = normalizeErrorCode(params.errorCode);\n if (explicit) {\n return explicit;\n }\n\n const message = (params.errorMessage ?? \"\").trim().toLowerCase();\n if (message.includes(\"unknown command\")) {\n return \"unknown_command\";\n }\n if (message.includes(\"unknown option\")) {\n return \"unknown_option\";\n }\n if (message.includes(\"missing required options\") || message.includes(\"missing required option\")) {\n return \"missing_required_option\";\n }\n if (message.includes(\"missing required argument\")) {\n return \"missing_required_argument\";\n }\n if (message.includes(\"no update flags provided\")) {\n return \"no_update_fields\";\n }\n if (message.includes(\"is assigned to\") && message.includes(\"use --force\")) {\n return \"ownership_conflict\";\n }\n if (message.includes(\"is locked\")) {\n return \"lock_conflict\";\n }\n if (message.includes(\"already terminal\") && message.includes(\"use --force\")) {\n return \"terminal_state_conflict\";\n }\n if (message.includes(\"tracker is not initialized\")) {\n return \"tracker_not_initialized\";\n }\n if (message.includes(\" not found\")) {\n return \"item_not_found\";\n }\n if (\n message.includes(\"use \\\"pm close <id> <text>\\\" to close an item\") ||\n (message.includes(\"invalid --status value\") && message.includes(\"\\\"closed\\\"\"))\n ) {\n return \"close_through_update\";\n }\n if (message.startsWith(\"invalid \") || message.includes(\" must be \")) {\n return \"invalid_argument_value\";\n }\n if (message.includes(\"strict create mode requires concrete values for --\")) {\n return \"missing_required_option\";\n }\n if (message.includes(\"either as positional\") && message.includes(\"not both\")) {\n return \"invalid_command_usage\";\n }\n\n const exitCode = Number.isFinite(params.exitCode) ? Math.max(0, Math.trunc(params.exitCode ?? 0)) : undefined;\n if (exitCode === EXIT_CODE.USAGE) {\n return \"invalid_command_usage\";\n }\n if (exitCode === EXIT_CODE.NOT_FOUND) {\n return \"item_not_found\";\n }\n if (exitCode === EXIT_CODE.CONFLICT) {\n return \"lock_conflict\";\n }\n if (exitCode === EXIT_CODE.DEPENDENCY_FAILED) {\n return \"dependency_failed\";\n }\n return \"command_failed\";\n}\n\nexport function deriveTelemetryCommandResolution(params: {\n ok: boolean;\n errorCode?: string;\n errorCategory?: TelemetryErrorCategory;\n}): TelemetryCommandResolution {\n if (params.ok) {\n return \"success\";\n }\n\n const normalizedCode = normalizeErrorCode(params.errorCode);\n if (normalizedCode === \"unknown_command\") {\n return \"nonexistent_command\";\n }\n if (normalizedCode === \"unknown_option\") {\n return \"invalid_option\";\n }\n if (normalizedCode === \"missing_required_option\") {\n return \"missing_required_option\";\n }\n if (normalizedCode === \"missing_required_argument\") {\n return \"missing_required_argument\";\n }\n\n if (params.errorCategory === \"usage\") {\n return \"invalid_usage\";\n }\n if (params.errorCategory === \"validation\") {\n return \"validation_failed\";\n }\n if (params.errorCategory === \"conflict\") {\n return \"conflict\";\n }\n if (params.errorCategory === \"runtime\") {\n return \"runtime_failed\";\n }\n return \"unknown_failed\";\n}\n"]}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { GlobalOptions } from "../shared/command-types.js";
|
|
2
|
+
import { type TelemetryErrorCategory } from "../shared/constants.js";
|
|
3
|
+
import { type TelemetryCommandResolution, type TelemetryCommandTaxonomy, type TelemetryResolutionStage } from "./observability.js";
|
|
2
4
|
declare const PM_TELEMETRY_SOURCE_CONTEXT_VALUES: readonly ["user", "automation", "test", "dogfood", "audit_smoke"];
|
|
3
5
|
/** Wait for the most recent background flush to settle. Test-only helper. */
|
|
4
6
|
export declare function waitForPendingFlush(): Promise<void>;
|
|
@@ -9,6 +11,7 @@ export interface ActiveTelemetryCommand {
|
|
|
9
11
|
started_at: string;
|
|
10
12
|
started_at_ms: number;
|
|
11
13
|
command: string;
|
|
14
|
+
command_taxonomy: TelemetryCommandTaxonomy;
|
|
12
15
|
pm_version: string;
|
|
13
16
|
source_context: TelemetrySourceContext;
|
|
14
17
|
source_context_source: TelemetrySourceContextSource;
|
|
@@ -31,10 +34,31 @@ export interface TelemetryCommandContext {
|
|
|
31
34
|
global: GlobalOptions;
|
|
32
35
|
pm_root: string;
|
|
33
36
|
}
|
|
34
|
-
export
|
|
35
|
-
export declare function finishTelemetryCommand(activeCommand: ActiveTelemetryCommand | null, outcome: {
|
|
37
|
+
export interface TelemetryCommandOutcome {
|
|
36
38
|
ok: boolean;
|
|
37
39
|
error?: string;
|
|
38
40
|
result?: unknown;
|
|
39
|
-
|
|
41
|
+
exit_code?: number;
|
|
42
|
+
error_code?: string;
|
|
43
|
+
error_category?: TelemetryErrorCategory;
|
|
44
|
+
command_resolution?: TelemetryCommandResolution;
|
|
45
|
+
resolution_stage?: TelemetryResolutionStage;
|
|
46
|
+
}
|
|
47
|
+
export interface TelemetryErrorEventContext {
|
|
48
|
+
command: string;
|
|
49
|
+
args: string[];
|
|
50
|
+
options: Record<string, unknown>;
|
|
51
|
+
global: GlobalOptions;
|
|
52
|
+
pm_version: string;
|
|
53
|
+
pm_root: string;
|
|
54
|
+
error_code: string;
|
|
55
|
+
error_message: string;
|
|
56
|
+
exit_code: number;
|
|
57
|
+
error_category?: TelemetryErrorCategory;
|
|
58
|
+
command_resolution?: TelemetryCommandResolution;
|
|
59
|
+
resolution_stage?: TelemetryResolutionStage;
|
|
60
|
+
}
|
|
61
|
+
export declare function startTelemetryCommand(context: TelemetryCommandContext): Promise<ActiveTelemetryCommand | null>;
|
|
62
|
+
export declare function finishTelemetryCommand(activeCommand: ActiveTelemetryCommand | null, outcome: TelemetryCommandOutcome): Promise<void>;
|
|
63
|
+
export declare function emitTelemetryErrorEvent(context: TelemetryErrorEventContext): Promise<void>;
|
|
40
64
|
export {};
|