@unbrained/pm-cli 2026.5.1 → 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 +73 -4
- package/CONTRIBUTING.md +11 -5
- package/PRD.md +17 -1
- package/README.md +55 -1099
- package/SECURITY.md +6 -11
- 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.d.ts +10 -0
- package/dist/cli/commands/activity.js +14 -10
- package/dist/cli/commands/activity.js.map +1 -1
- package/dist/cli/commands/aggregate.js.map +1 -1
- package/dist/cli/commands/append.js.map +1 -1
- package/dist/cli/commands/calendar.js +19 -34
- package/dist/cli/commands/calendar.js.map +1 -1
- package/dist/cli/commands/claim.js.map +1 -1
- package/dist/cli/commands/close.js.map +1 -1
- package/dist/cli/commands/comments-audit.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/completion.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 +496 -12
- package/dist/cli/commands/context.js.map +1 -1
- package/dist/cli/commands/contracts.js.map +1 -1
- package/dist/cli/commands/create.js +2 -2
- package/dist/cli/commands/create.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/delete.js.map +1 -1
- package/dist/cli/commands/deps.js.map +1 -1
- package/dist/cli/commands/docs.js.map +1 -1
- package/dist/cli/commands/extension.js.map +1 -1
- package/dist/cli/commands/files.js +14 -2
- package/dist/cli/commands/files.js.map +1 -1
- package/dist/cli/commands/gc.js.map +1 -1
- package/dist/cli/commands/get.js.map +1 -1
- package/dist/cli/commands/health.js +16 -12
- package/dist/cli/commands/health.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/index.js.map +1 -1
- package/dist/cli/commands/init.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.d.ts +1 -0
- package/dist/cli/commands/list.js +13 -31
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/normalize.js +14 -23
- 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/restore.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/stats.js.map +1 -1
- package/dist/cli/commands/templates.js.map +1 -1
- package/dist/cli/commands/test-all.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/commands/test.js.map +1 -1
- package/dist/cli/commands/update-many.js +1 -6
- package/dist/cli/commands/update-many.js.map +1 -1
- package/dist/cli/commands/update.js +2 -2
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/commands/validate.js +23 -18
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/error-guidance.d.ts +13 -0
- package/dist/cli/error-guidance.js +56 -6
- 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/extension-command-options.js.map +1 -1
- 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 +1000 -4456
- 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/cli.d.ts +1 -1
- package/dist/cli.js +3 -1
- package/dist/cli.js.map +1 -1
- package/dist/core/extensions/extension-types.d.ts +605 -0
- package/dist/core/extensions/extension-types.js +22 -0
- package/dist/core/extensions/extension-types.js.map +1 -0
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/item-fields.js.map +1 -1
- package/dist/core/extensions/loader.d.ts +2 -586
- package/dist/core/extensions/loader.js +3 -21
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runtime-registrations.js.map +1 -1
- package/dist/core/fs/fs-utils.js.map +1 -1
- package/dist/core/fs/index.js.map +1 -1
- package/dist/core/history/history-stream-policy.js.map +1 -1
- package/dist/core/history/history.js.map +1 -1
- package/dist/core/history/index.js.map +1 -1
- package/dist/core/item/id.js.map +1 -1
- package/dist/core/item/index.js.map +1 -1
- package/dist/core/item/item-format.js.map +1 -1
- package/dist/core/item/parent-reference-policy.js.map +1 -1
- package/dist/core/item/parse.js +6 -0
- package/dist/core/item/parse.js.map +1 -1
- package/dist/core/item/sprint-release-format.js.map +1 -1
- package/dist/core/item/status.js.map +1 -1
- package/dist/core/item/type-registry.js.map +1 -1
- package/dist/core/lock/index.js.map +1 -1
- package/dist/core/lock/lock.js +1 -6
- package/dist/core/lock/lock.js.map +1 -1
- package/dist/core/output/command-aware.js.map +1 -1
- package/dist/core/output/output.js.map +1 -1
- package/dist/core/schema/runtime-field-filters.js.map +1 -1
- package/dist/core/schema/runtime-field-values.js.map +1 -1
- package/dist/core/schema/runtime-schema.js.map +1 -1
- package/dist/core/search/cache.js +1 -7
- package/dist/core/search/cache.js.map +1 -1
- package/dist/core/search/embedding-batches.js +4 -0
- package/dist/core/search/embedding-batches.js.map +1 -1
- 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 -88
- 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 +4 -13
- package/dist/core/search/vector-stores.js +40 -93
- package/dist/core/search/vector-stores.js.map +1 -1
- package/dist/core/sentry/helpers.d.ts +27 -0
- package/dist/core/sentry/helpers.js +171 -0
- package/dist/core/sentry/helpers.js.map +1 -0
- package/dist/core/sentry/instrument.d.ts +25 -0
- package/dist/core/sentry/instrument.js +204 -0
- package/dist/core/sentry/instrument.js.map +1 -0
- package/dist/core/shared/command-types.js.map +1 -1
- package/dist/core/shared/conflict-markers.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/shared/errors.js.map +1 -1
- package/dist/core/shared/index.d.ts +1 -0
- package/dist/core/shared/index.js +1 -0
- package/dist/core/shared/index.js.map +1 -1
- package/dist/core/shared/primitives.d.ts +13 -0
- package/dist/core/shared/primitives.js +33 -0
- package/dist/core/shared/primitives.js.map +1 -0
- package/dist/core/shared/serialization.js.map +1 -1
- package/dist/core/shared/text-normalization.js.map +1 -1
- package/dist/core/shared/time.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/index.js.map +1 -1
- package/dist/core/store/item-format-migration.js.map +1 -1
- package/dist/core/store/item-store.js +46 -36
- package/dist/core/store/item-store.js.map +1 -1
- package/dist/core/store/paths.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/consent.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 +29 -3
- package/dist/core/telemetry/runtime.js +337 -25
- package/dist/core/telemetry/runtime.js.map +1 -1
- package/dist/core/test/background-runs.js.map +1 -1
- package/dist/core/test/item-test-run-tracking.js.map +1 -1
- package/dist/sdk/cli-contracts.js +28 -0
- package/dist/sdk/cli-contracts.js.map +1 -1
- package/dist/sdk/index.d.ts +1 -1
- package/dist/sdk/index.js.map +1 -1
- package/dist/types/index.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/AGENT_GUIDE.md +125 -0
- package/docs/ARCHITECTURE.md +201 -478
- package/docs/COMMANDS.md +209 -0
- package/docs/CONFIGURATION.md +146 -0
- package/docs/EXTENSIONS.md +146 -645
- package/docs/QUICKSTART.md +108 -0
- package/docs/README.md +70 -0
- package/docs/RELEASING.md +92 -50
- package/docs/SDK.md +127 -68
- package/docs/TESTING.md +125 -0
- package/docs/examples/starter-extension/README.md +39 -25
- package/package.json +24 -11
- package/dist/command-types.d.ts +0 -1
- package/dist/command-types.js +0 -2
- package/dist/command-types.js.map +0 -1
- package/dist/constants.d.ts +0 -1
- package/dist/constants.js +0 -2
- package/dist/constants.js.map +0 -1
- package/dist/errors.d.ts +0 -1
- package/dist/errors.js +0 -2
- package/dist/errors.js.map +0 -1
- package/dist/fs-utils.d.ts +0 -1
- package/dist/fs-utils.js +0 -2
- package/dist/fs-utils.js.map +0 -1
- package/dist/history.d.ts +0 -1
- package/dist/history.js +0 -2
- package/dist/history.js.map +0 -1
- package/dist/id.d.ts +0 -1
- package/dist/id.js +0 -2
- package/dist/id.js.map +0 -1
- package/dist/item-format.d.ts +0 -1
- package/dist/item-format.js +0 -2
- package/dist/item-format.js.map +0 -1
- package/dist/item-store.d.ts +0 -1
- package/dist/item-store.js +0 -2
- package/dist/item-store.js.map +0 -1
- package/dist/lock.d.ts +0 -1
- package/dist/lock.js +0 -2
- package/dist/lock.js.map +0 -1
- package/dist/output.d.ts +0 -1
- package/dist/output.js +0 -2
- package/dist/output.js.map +0 -1
- package/dist/parse.d.ts +0 -1
- package/dist/parse.js +0 -2
- package/dist/parse.js.map +0 -1
- package/dist/paths.d.ts +0 -1
- package/dist/paths.js +0 -2
- package/dist/paths.js.map +0 -1
- package/dist/serialization.d.ts +0 -1
- package/dist/serialization.js +0 -2
- package/dist/serialization.js.map +0 -1
- package/dist/settings.d.ts +0 -1
- package/dist/settings.js +0 -2
- package/dist/settings.js.map +0 -1
- package/dist/time.d.ts +0 -1
- package/dist/time.js +0 -2
- package/dist/time.js.map +0 -1
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { getSentry } from "./instrument.js";
|
|
2
|
+
import { PmCliError } from "../shared/errors.js";
|
|
3
|
+
import { deriveTelemetryCommandResolution, deriveTelemetryCommandTaxonomy, } from "../telemetry/observability.js";
|
|
4
|
+
let activeCommandSpan;
|
|
5
|
+
function setSpanAttribute(span, key, value) {
|
|
6
|
+
if (value === undefined) {
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
const attributeTarget = span;
|
|
10
|
+
if (typeof attributeTarget.setAttribute === "function") {
|
|
11
|
+
attributeTarget.setAttribute(key, value);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function sentrySetCommandContext(command, args, options, metadata) {
|
|
15
|
+
const Sentry = getSentry();
|
|
16
|
+
if (!Sentry)
|
|
17
|
+
return;
|
|
18
|
+
const taxonomy = deriveTelemetryCommandTaxonomy(command);
|
|
19
|
+
Sentry.setTag("pm.command", command);
|
|
20
|
+
Sentry.setTag("pm.command_root", taxonomy.command_root);
|
|
21
|
+
Sentry.setTag("pm.command_family", taxonomy.command_family);
|
|
22
|
+
if (typeof metadata?.source_context === "string" && metadata.source_context.trim().length > 0) {
|
|
23
|
+
Sentry.setTag("pm.source_context", metadata.source_context);
|
|
24
|
+
}
|
|
25
|
+
const safeArgs = args.map((arg) => arg.startsWith("--") ? arg.split("=")[0] : arg);
|
|
26
|
+
Sentry.setContext("pm.command", {
|
|
27
|
+
name: command,
|
|
28
|
+
root: taxonomy.command_root,
|
|
29
|
+
leaf: taxonomy.command_leaf,
|
|
30
|
+
family: taxonomy.command_family,
|
|
31
|
+
args: safeArgs,
|
|
32
|
+
option_keys: Object.keys(options).sort(),
|
|
33
|
+
source_context: metadata?.source_context,
|
|
34
|
+
source_context_source: metadata?.source_context_source,
|
|
35
|
+
});
|
|
36
|
+
Sentry.addBreadcrumb({
|
|
37
|
+
category: "pm.command",
|
|
38
|
+
message: `pm ${command}`,
|
|
39
|
+
level: "info",
|
|
40
|
+
data: {
|
|
41
|
+
args: safeArgs,
|
|
42
|
+
command_root: taxonomy.command_root,
|
|
43
|
+
command_family: taxonomy.command_family,
|
|
44
|
+
source_context: metadata?.source_context,
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
export function sentryStartCommandSpan(command) {
|
|
49
|
+
const Sentry = getSentry();
|
|
50
|
+
if (!Sentry)
|
|
51
|
+
return;
|
|
52
|
+
activeCommandSpan = Sentry.startInactiveSpan({
|
|
53
|
+
op: "pm.command",
|
|
54
|
+
name: `pm ${command}`,
|
|
55
|
+
forceTransaction: true,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
export function sentryFinishCommandSpan(ok, error, metadata) {
|
|
59
|
+
if (!activeCommandSpan)
|
|
60
|
+
return;
|
|
61
|
+
const normalizedOk = ok ? "true" : "false";
|
|
62
|
+
const normalizedExitCode = typeof metadata?.exit_code === "number" ? String(metadata.exit_code) : undefined;
|
|
63
|
+
const Sentry = getSentry();
|
|
64
|
+
if (Sentry) {
|
|
65
|
+
Sentry.setTag("pm.ok", normalizedOk);
|
|
66
|
+
Sentry.setTag("pm.command_ok", normalizedOk);
|
|
67
|
+
if (typeof metadata?.exit_code === "number") {
|
|
68
|
+
Sentry.setTag("pm.exit_code", String(metadata.exit_code));
|
|
69
|
+
Sentry.setTag("pm.command_exit_code", String(metadata.exit_code));
|
|
70
|
+
}
|
|
71
|
+
if (typeof metadata?.error_code === "string" && metadata.error_code.trim().length > 0) {
|
|
72
|
+
Sentry.setTag("pm.error_code", metadata.error_code);
|
|
73
|
+
}
|
|
74
|
+
if (typeof metadata?.error_category === "string" && metadata.error_category.trim().length > 0) {
|
|
75
|
+
Sentry.setTag("pm.error_category", metadata.error_category);
|
|
76
|
+
}
|
|
77
|
+
if (typeof metadata?.command_resolution === "string" && metadata.command_resolution.trim().length > 0) {
|
|
78
|
+
Sentry.setTag("pm.command_resolution", metadata.command_resolution);
|
|
79
|
+
}
|
|
80
|
+
if (typeof metadata?.resolution_stage === "string" && metadata.resolution_stage.trim().length > 0) {
|
|
81
|
+
Sentry.setTag("pm.resolution_stage", metadata.resolution_stage);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
setSpanAttribute(activeCommandSpan, "pm.ok", normalizedOk);
|
|
85
|
+
setSpanAttribute(activeCommandSpan, "pm.command_ok", normalizedOk);
|
|
86
|
+
setSpanAttribute(activeCommandSpan, "pm.exit_code", normalizedExitCode);
|
|
87
|
+
setSpanAttribute(activeCommandSpan, "pm.command_exit_code", normalizedExitCode);
|
|
88
|
+
setSpanAttribute(activeCommandSpan, "pm.error_code", metadata?.error_code);
|
|
89
|
+
setSpanAttribute(activeCommandSpan, "pm.error_category", metadata?.error_category);
|
|
90
|
+
setSpanAttribute(activeCommandSpan, "pm.command_resolution", metadata?.command_resolution);
|
|
91
|
+
setSpanAttribute(activeCommandSpan, "pm.resolution_stage", metadata?.resolution_stage);
|
|
92
|
+
activeCommandSpan.setStatus(ok ? { code: 1 } : { code: 2, message: error ?? "command_failed" });
|
|
93
|
+
activeCommandSpan.end();
|
|
94
|
+
activeCommandSpan = undefined;
|
|
95
|
+
}
|
|
96
|
+
export function sentryCaptureCliError(error) {
|
|
97
|
+
if (!shouldCaptureCliError(error))
|
|
98
|
+
return;
|
|
99
|
+
const Sentry = getSentry();
|
|
100
|
+
if (!Sentry)
|
|
101
|
+
return;
|
|
102
|
+
if (error instanceof Error) {
|
|
103
|
+
const extras = {};
|
|
104
|
+
if ("exitCode" in error && typeof error.exitCode === "number") {
|
|
105
|
+
extras.exit_code = error.exitCode;
|
|
106
|
+
}
|
|
107
|
+
if ("context" in error && typeof error.context === "object") {
|
|
108
|
+
extras.error_context = error.context;
|
|
109
|
+
}
|
|
110
|
+
Sentry.captureException(error, { extra: extras });
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
Sentry.captureException(new Error(String(error)));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
export function sentryLogCliUsageError(params) {
|
|
117
|
+
const Sentry = getSentry();
|
|
118
|
+
if (!Sentry)
|
|
119
|
+
return;
|
|
120
|
+
const resolvedCommandResolution = params.command_resolution ??
|
|
121
|
+
deriveTelemetryCommandResolution({
|
|
122
|
+
ok: false,
|
|
123
|
+
errorCode: params.error_code,
|
|
124
|
+
errorCategory: params.error_category,
|
|
125
|
+
});
|
|
126
|
+
const resolvedResolutionStage = params.resolution_stage ?? "unknown";
|
|
127
|
+
const payload = {
|
|
128
|
+
"pm.command": params.command,
|
|
129
|
+
"pm.error_code": params.error_code,
|
|
130
|
+
"pm.error_category": params.error_category,
|
|
131
|
+
"pm.exit_code": params.exit_code,
|
|
132
|
+
"pm.error_message": params.error_message,
|
|
133
|
+
"pm.command_resolution": resolvedCommandResolution,
|
|
134
|
+
"pm.resolution_stage": resolvedResolutionStage,
|
|
135
|
+
"pm.source_context": params.source_context ?? "",
|
|
136
|
+
};
|
|
137
|
+
const loggerCandidate = Sentry
|
|
138
|
+
.logger;
|
|
139
|
+
if (loggerCandidate && typeof loggerCandidate.warn === "function") {
|
|
140
|
+
loggerCandidate.warn("pm_cli_usage_error", payload);
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
Sentry.captureMessage(`pm_cli_usage_error:${params.error_code}`, {
|
|
144
|
+
level: "warning",
|
|
145
|
+
tags: {
|
|
146
|
+
"pm.command": params.command,
|
|
147
|
+
"pm.error_code": params.error_code,
|
|
148
|
+
"pm.error_category": params.error_category,
|
|
149
|
+
"pm.exit_code": String(params.exit_code),
|
|
150
|
+
"pm.command_resolution": resolvedCommandResolution,
|
|
151
|
+
"pm.resolution_stage": resolvedResolutionStage,
|
|
152
|
+
"pm.source_context": params.source_context ?? "unknown",
|
|
153
|
+
},
|
|
154
|
+
extra: payload,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
export function shouldCaptureCliError(error) {
|
|
158
|
+
return !(error instanceof PmCliError);
|
|
159
|
+
}
|
|
160
|
+
export async function sentryFlush() {
|
|
161
|
+
const Sentry = getSentry();
|
|
162
|
+
if (!Sentry)
|
|
163
|
+
return;
|
|
164
|
+
try {
|
|
165
|
+
await Sentry.flush(3000);
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
// Sentry flush must never block CLI exit.
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"/","sources":["core/sentry/helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import { getSentry } from \"./instrument.js\";\nimport { PmCliError } from \"../shared/errors.js\";\nimport type { TelemetryErrorCategory } from \"../shared/constants.js\";\nimport {\n deriveTelemetryCommandResolution,\n deriveTelemetryCommandTaxonomy,\n type TelemetryCommandResolution,\n type TelemetryResolutionStage,\n} from \"../telemetry/observability.js\";\nimport type { Span } from \"@sentry/node\";\n\nlet activeCommandSpan: Span | undefined;\n\nfunction setSpanAttribute(\n span: Span,\n key: string,\n value: string | number | boolean | undefined,\n): void {\n if (value === undefined) {\n return;\n }\n const attributeTarget = span as unknown as { setAttribute?: (attrKey: string, attrValue: string | number | boolean) => void };\n if (typeof attributeTarget.setAttribute === \"function\") {\n attributeTarget.setAttribute(key, value);\n }\n}\n\nexport function sentrySetCommandContext(\n command: string,\n args: string[],\n options: Record<string, unknown>,\n metadata?: {\n source_context?: string;\n source_context_source?: string;\n },\n): void {\n const Sentry = getSentry();\n if (!Sentry) return;\n const taxonomy = deriveTelemetryCommandTaxonomy(command);\n\n Sentry.setTag(\"pm.command\", command);\n Sentry.setTag(\"pm.command_root\", taxonomy.command_root);\n Sentry.setTag(\"pm.command_family\", taxonomy.command_family);\n if (typeof metadata?.source_context === \"string\" && metadata.source_context.trim().length > 0) {\n Sentry.setTag(\"pm.source_context\", metadata.source_context);\n }\n\n const safeArgs = args.map((arg) =>\n arg.startsWith(\"--\") ? arg.split(\"=\")[0] : arg,\n );\n\n Sentry.setContext(\"pm.command\", {\n name: command,\n root: taxonomy.command_root,\n leaf: taxonomy.command_leaf,\n family: taxonomy.command_family,\n args: safeArgs,\n option_keys: Object.keys(options).sort(),\n source_context: metadata?.source_context,\n source_context_source: metadata?.source_context_source,\n });\n\n Sentry.addBreadcrumb({\n category: \"pm.command\",\n message: `pm ${command}`,\n level: \"info\",\n data: {\n args: safeArgs,\n command_root: taxonomy.command_root,\n command_family: taxonomy.command_family,\n source_context: metadata?.source_context,\n },\n });\n}\n\nexport function sentryStartCommandSpan(command: string): void {\n const Sentry = getSentry();\n if (!Sentry) return;\n\n activeCommandSpan = Sentry.startInactiveSpan({\n op: \"pm.command\",\n name: `pm ${command}`,\n forceTransaction: true,\n });\n}\n\nexport function sentryFinishCommandSpan(\n ok: boolean,\n error?: string,\n metadata?: {\n error_code?: string;\n error_category?: TelemetryErrorCategory;\n exit_code?: number;\n command_resolution?: TelemetryCommandResolution;\n resolution_stage?: TelemetryResolutionStage;\n },\n): void {\n if (!activeCommandSpan) return;\n const normalizedOk = ok ? \"true\" : \"false\";\n const normalizedExitCode = typeof metadata?.exit_code === \"number\" ? String(metadata.exit_code) : undefined;\n const Sentry = getSentry();\n if (Sentry) {\n Sentry.setTag(\"pm.ok\", normalizedOk);\n Sentry.setTag(\"pm.command_ok\", normalizedOk);\n if (typeof metadata?.exit_code === \"number\") {\n Sentry.setTag(\"pm.exit_code\", String(metadata.exit_code));\n Sentry.setTag(\"pm.command_exit_code\", String(metadata.exit_code));\n }\n if (typeof metadata?.error_code === \"string\" && metadata.error_code.trim().length > 0) {\n Sentry.setTag(\"pm.error_code\", metadata.error_code);\n }\n if (typeof metadata?.error_category === \"string\" && metadata.error_category.trim().length > 0) {\n Sentry.setTag(\"pm.error_category\", metadata.error_category);\n }\n if (typeof metadata?.command_resolution === \"string\" && metadata.command_resolution.trim().length > 0) {\n Sentry.setTag(\"pm.command_resolution\", metadata.command_resolution);\n }\n if (typeof metadata?.resolution_stage === \"string\" && metadata.resolution_stage.trim().length > 0) {\n Sentry.setTag(\"pm.resolution_stage\", metadata.resolution_stage);\n }\n }\n setSpanAttribute(activeCommandSpan, \"pm.ok\", normalizedOk);\n setSpanAttribute(activeCommandSpan, \"pm.command_ok\", normalizedOk);\n setSpanAttribute(activeCommandSpan, \"pm.exit_code\", normalizedExitCode);\n setSpanAttribute(activeCommandSpan, \"pm.command_exit_code\", normalizedExitCode);\n setSpanAttribute(activeCommandSpan, \"pm.error_code\", metadata?.error_code);\n setSpanAttribute(activeCommandSpan, \"pm.error_category\", metadata?.error_category);\n setSpanAttribute(activeCommandSpan, \"pm.command_resolution\", metadata?.command_resolution);\n setSpanAttribute(activeCommandSpan, \"pm.resolution_stage\", metadata?.resolution_stage);\n activeCommandSpan.setStatus(ok ? { code: 1 } : { code: 2, message: error ?? \"command_failed\" });\n activeCommandSpan.end();\n activeCommandSpan = undefined;\n}\n\nexport function sentryCaptureCliError(error: unknown): void {\n if (!shouldCaptureCliError(error)) return;\n\n const Sentry = getSentry();\n if (!Sentry) return;\n\n if (error instanceof Error) {\n const extras: Record<string, unknown> = {};\n if (\"exitCode\" in error && typeof (error as { exitCode: unknown }).exitCode === \"number\") {\n extras.exit_code = (error as { exitCode: number }).exitCode;\n }\n if (\"context\" in error && typeof (error as { context: unknown }).context === \"object\") {\n extras.error_context = (error as { context: unknown }).context;\n }\n Sentry.captureException(error, { extra: extras });\n } else {\n Sentry.captureException(new Error(String(error)));\n }\n}\n\nexport function sentryLogCliUsageError(params: {\n command: string;\n error_code: string;\n error_category: TelemetryErrorCategory;\n exit_code: number;\n error_message: string;\n command_resolution?: TelemetryCommandResolution;\n resolution_stage?: TelemetryResolutionStage;\n source_context?: string;\n}): void {\n const Sentry = getSentry();\n if (!Sentry) return;\n const resolvedCommandResolution =\n params.command_resolution ??\n deriveTelemetryCommandResolution({\n ok: false,\n errorCode: params.error_code,\n errorCategory: params.error_category,\n });\n const resolvedResolutionStage = params.resolution_stage ?? \"unknown\";\n\n const payload = {\n \"pm.command\": params.command,\n \"pm.error_code\": params.error_code,\n \"pm.error_category\": params.error_category,\n \"pm.exit_code\": params.exit_code,\n \"pm.error_message\": params.error_message,\n \"pm.command_resolution\": resolvedCommandResolution,\n \"pm.resolution_stage\": resolvedResolutionStage,\n \"pm.source_context\": params.source_context ?? \"\",\n };\n const loggerCandidate = (Sentry as unknown as { logger?: { warn?: (message: string, attributes?: Record<string, unknown>) => void } })\n .logger;\n if (loggerCandidate && typeof loggerCandidate.warn === \"function\") {\n loggerCandidate.warn(\"pm_cli_usage_error\", payload);\n return;\n }\n\n Sentry.captureMessage(`pm_cli_usage_error:${params.error_code}`, {\n level: \"warning\",\n tags: {\n \"pm.command\": params.command,\n \"pm.error_code\": params.error_code,\n \"pm.error_category\": params.error_category,\n \"pm.exit_code\": String(params.exit_code),\n \"pm.command_resolution\": resolvedCommandResolution,\n \"pm.resolution_stage\": resolvedResolutionStage,\n \"pm.source_context\": params.source_context ?? \"unknown\",\n },\n extra: payload,\n });\n}\n\nexport function shouldCaptureCliError(error: unknown): boolean {\n return !(error instanceof PmCliError);\n}\n\nexport async function sentryFlush(): Promise<void> {\n const Sentry = getSentry();\n if (!Sentry) return;\n\n try {\n await Sentry.flush(3000);\n } catch {\n // Sentry flush must never block CLI exit.\n }\n}\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
declare function scrubString(value: string): string;
|
|
2
|
+
type SentryLike = typeof import("@sentry/node");
|
|
3
|
+
declare function isExpectedCliErrorEvent(event: {
|
|
4
|
+
exception?: {
|
|
5
|
+
values?: Array<{
|
|
6
|
+
type?: string;
|
|
7
|
+
value?: string;
|
|
8
|
+
}>;
|
|
9
|
+
};
|
|
10
|
+
message?: string;
|
|
11
|
+
extra?: Record<string, unknown>;
|
|
12
|
+
logger?: string;
|
|
13
|
+
}): boolean;
|
|
14
|
+
declare function isPmCliErrorBreadcrumb(breadcrumb: {
|
|
15
|
+
category?: string;
|
|
16
|
+
message?: string;
|
|
17
|
+
}): boolean;
|
|
18
|
+
export declare function ensureSentryInit(): Promise<SentryLike | undefined>;
|
|
19
|
+
export declare function getSentry(): SentryLike | undefined;
|
|
20
|
+
export declare const _testOnly: {
|
|
21
|
+
isExpectedCliErrorEvent: typeof isExpectedCliErrorEvent;
|
|
22
|
+
isPmCliErrorBreadcrumb: typeof isPmCliErrorBreadcrumb;
|
|
23
|
+
scrubString: typeof scrubString;
|
|
24
|
+
};
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
const OPT_OUT_VALUES = new Set(["1", "true", "yes", "on"]);
|
|
5
|
+
function isSentryDisabled() {
|
|
6
|
+
if (OPT_OUT_VALUES.has((process.env.PM_SENTRY_DISABLED ?? "").trim().toLowerCase()))
|
|
7
|
+
return true;
|
|
8
|
+
if (OPT_OUT_VALUES.has((process.env.PM_TELEMETRY_DISABLED ?? "").trim().toLowerCase()))
|
|
9
|
+
return true;
|
|
10
|
+
if (process.env.VITEST || process.env.VITEST_WORKER_ID)
|
|
11
|
+
return true;
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
const SENSITIVE_KEY_PATTERN = /(?:token|secret|password|passwd|api[_-]?key|apikey|authorization|cookie|credentials|bearer|dsn)/i;
|
|
15
|
+
const INLINE_SENSITIVE_ASSIGNMENT_RE = new RegExp(`\\b(${SENSITIVE_KEY_PATTERN.source})\\s*[:=]\\s*([^\\s,;]+)`, "giu");
|
|
16
|
+
const ABSOLUTE_PATH_TOKEN_RE = /(^|[\s"'`(=])\/(?:[^\s"'`),;]+)/g;
|
|
17
|
+
const PRIVATE_IP_RE = /\b(?:10\.(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.(?:25[0-5]|2[0-4]\d|[01]?\d?\d)|172\.(?:1[6-9]|2\d|3[01])\.(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.(?:25[0-5]|2[0-4]\d|[01]?\d?\d)|192\.168\.(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.(?:25[0-5]|2[0-4]\d|[01]?\d?\d))\b/g;
|
|
18
|
+
function scrubString(value) {
|
|
19
|
+
const scrubbed = value
|
|
20
|
+
.replaceAll(INLINE_SENSITIVE_ASSIGNMENT_RE, (_m, key) => `${key}=[scrubbed]`)
|
|
21
|
+
.replaceAll(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/giu, "[scrubbed_email]")
|
|
22
|
+
.replaceAll(/bearer\s+[a-z0-9._=-]+/giu, "bearer [scrubbed]")
|
|
23
|
+
.replaceAll(/sntr[ysu]_[A-Za-z0-9_-]+/g, "[scrubbed_sentry_token]")
|
|
24
|
+
.replaceAll(PRIVATE_IP_RE, "[scrubbed_ip]")
|
|
25
|
+
.replaceAll(ABSOLUTE_PATH_TOKEN_RE, (_match, prefix) => `${prefix}[scrubbed_path]`);
|
|
26
|
+
if (scrubbed.trim().startsWith("/") && scrubbed.trim().length > 1) {
|
|
27
|
+
return "[scrubbed_path]";
|
|
28
|
+
}
|
|
29
|
+
return scrubbed;
|
|
30
|
+
}
|
|
31
|
+
function scrubEventData(obj) {
|
|
32
|
+
const result = {};
|
|
33
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
34
|
+
if (SENSITIVE_KEY_PATTERN.test(key)) {
|
|
35
|
+
result[key] = "[scrubbed]";
|
|
36
|
+
}
|
|
37
|
+
else if (typeof value === "string") {
|
|
38
|
+
result[key] = scrubString(value);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
result[key] = value;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
let _sentry;
|
|
47
|
+
let _initDone = false;
|
|
48
|
+
const PM_CLI_SENTRY_DSN = "https://bf7ad2ec76c0051c2ee94e48e8bd6868@o4510603477712896.ingest.de.sentry.io/4511316775338064";
|
|
49
|
+
function hasPmCliErrorPrefix(value) {
|
|
50
|
+
return /^\s*PmCliError:/.test(value);
|
|
51
|
+
}
|
|
52
|
+
function isExpectedCliErrorEvent(event) {
|
|
53
|
+
if (event.exception?.values?.some((ex) => ex.type === "PmCliError"))
|
|
54
|
+
return true;
|
|
55
|
+
if (event.exception?.values?.some((ex) => typeof ex.value === "string" && hasPmCliErrorPrefix(ex.value)))
|
|
56
|
+
return true;
|
|
57
|
+
if (event.logger === "console" && typeof event.message === "string" && hasPmCliErrorPrefix(event.message))
|
|
58
|
+
return true;
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
function isPmCliErrorBreadcrumb(breadcrumb) {
|
|
62
|
+
return (breadcrumb.category === "console" &&
|
|
63
|
+
typeof breadcrumb.message === "string" &&
|
|
64
|
+
hasPmCliErrorPrefix(breadcrumb.message));
|
|
65
|
+
}
|
|
66
|
+
function resolveCliVersion() {
|
|
67
|
+
try {
|
|
68
|
+
const thisFile = fileURLToPath(import.meta.url);
|
|
69
|
+
const candidates = [
|
|
70
|
+
path.resolve(thisFile, "../../../../package.json"),
|
|
71
|
+
path.resolve(thisFile, "../../../package.json"),
|
|
72
|
+
];
|
|
73
|
+
for (const candidate of candidates) {
|
|
74
|
+
if (fs.existsSync(candidate)) {
|
|
75
|
+
const parsed = JSON.parse(fs.readFileSync(candidate, "utf8"));
|
|
76
|
+
if (typeof parsed.version === "string")
|
|
77
|
+
return parsed.version;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// Version resolution must never block startup.
|
|
83
|
+
}
|
|
84
|
+
return "0.0.0";
|
|
85
|
+
}
|
|
86
|
+
function resolveEnvironment() {
|
|
87
|
+
const explicit = process.env.SENTRY_ENVIRONMENT?.trim();
|
|
88
|
+
if (explicit && explicit.length > 0)
|
|
89
|
+
return explicit;
|
|
90
|
+
if (process.env.VITEST || process.env.VITEST_WORKER_ID || process.env.NODE_ENV === "test")
|
|
91
|
+
return "test";
|
|
92
|
+
if (process.env.CI)
|
|
93
|
+
return "ci";
|
|
94
|
+
return "production";
|
|
95
|
+
}
|
|
96
|
+
export async function ensureSentryInit() {
|
|
97
|
+
if (_initDone)
|
|
98
|
+
return _sentry;
|
|
99
|
+
_initDone = true;
|
|
100
|
+
if (isSentryDisabled())
|
|
101
|
+
return undefined;
|
|
102
|
+
const SentryModule = await import("@sentry/node");
|
|
103
|
+
_sentry = SentryModule;
|
|
104
|
+
const dsn = process.env.SENTRY_DSN?.trim() || PM_CLI_SENTRY_DSN;
|
|
105
|
+
const release = resolveCliVersion();
|
|
106
|
+
SentryModule.init({
|
|
107
|
+
dsn,
|
|
108
|
+
release: `pm-cli@${release}`,
|
|
109
|
+
environment: resolveEnvironment(),
|
|
110
|
+
tracesSampleRate: 0.2,
|
|
111
|
+
enableLogs: true,
|
|
112
|
+
attachStacktrace: true,
|
|
113
|
+
normalizeDepth: 6,
|
|
114
|
+
shutdownTimeout: 3000,
|
|
115
|
+
sendDefaultPii: false,
|
|
116
|
+
serverName: undefined,
|
|
117
|
+
integrations: [
|
|
118
|
+
SentryModule.extraErrorDataIntegration({ depth: 4 }),
|
|
119
|
+
SentryModule.captureConsoleIntegration({ levels: ["warn", "error"] }),
|
|
120
|
+
],
|
|
121
|
+
initialScope: {
|
|
122
|
+
tags: {
|
|
123
|
+
"cli.name": "pm-cli",
|
|
124
|
+
"cli.version": release,
|
|
125
|
+
"runtime.node": process.version,
|
|
126
|
+
"runtime.platform": process.platform,
|
|
127
|
+
"runtime.arch": process.arch,
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
beforeSend(event) {
|
|
131
|
+
if (isExpectedCliErrorEvent(event)) {
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
if (event.exception?.values) {
|
|
135
|
+
for (const exception of event.exception.values) {
|
|
136
|
+
if (exception.value) {
|
|
137
|
+
exception.value = scrubString(exception.value);
|
|
138
|
+
}
|
|
139
|
+
if (exception.stacktrace?.frames) {
|
|
140
|
+
for (const frame of exception.stacktrace.frames) {
|
|
141
|
+
if (frame.vars) {
|
|
142
|
+
frame.vars = scrubEventData(frame.vars);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (event.breadcrumbs) {
|
|
149
|
+
for (const breadcrumb of event.breadcrumbs) {
|
|
150
|
+
if (breadcrumb.message) {
|
|
151
|
+
breadcrumb.message = scrubString(breadcrumb.message);
|
|
152
|
+
}
|
|
153
|
+
if (breadcrumb.data && typeof breadcrumb.data === "object") {
|
|
154
|
+
breadcrumb.data = scrubEventData(breadcrumb.data);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (event.extra && typeof event.extra === "object") {
|
|
159
|
+
event.extra = scrubEventData(event.extra);
|
|
160
|
+
}
|
|
161
|
+
if (event.contexts) {
|
|
162
|
+
for (const [ctxKey, ctx] of Object.entries(event.contexts)) {
|
|
163
|
+
if (ctx && typeof ctx === "object") {
|
|
164
|
+
event.contexts[ctxKey] = scrubEventData(ctx);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return event;
|
|
169
|
+
},
|
|
170
|
+
beforeSendTransaction(event) {
|
|
171
|
+
if (event.breadcrumbs) {
|
|
172
|
+
event.breadcrumbs = event.breadcrumbs.filter((bc) => !isPmCliErrorBreadcrumb(bc));
|
|
173
|
+
for (const breadcrumb of event.breadcrumbs) {
|
|
174
|
+
if (breadcrumb.message) {
|
|
175
|
+
breadcrumb.message = scrubString(breadcrumb.message);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return event;
|
|
180
|
+
},
|
|
181
|
+
beforeBreadcrumb(breadcrumb) {
|
|
182
|
+
if (isPmCliErrorBreadcrumb(breadcrumb)) {
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
if (breadcrumb.message) {
|
|
186
|
+
breadcrumb.message = scrubString(breadcrumb.message);
|
|
187
|
+
}
|
|
188
|
+
if (breadcrumb.data && typeof breadcrumb.data === "object") {
|
|
189
|
+
breadcrumb.data = scrubEventData(breadcrumb.data);
|
|
190
|
+
}
|
|
191
|
+
return breadcrumb;
|
|
192
|
+
},
|
|
193
|
+
});
|
|
194
|
+
return SentryModule;
|
|
195
|
+
}
|
|
196
|
+
export function getSentry() {
|
|
197
|
+
return _sentry;
|
|
198
|
+
}
|
|
199
|
+
export const _testOnly = {
|
|
200
|
+
isExpectedCliErrorEvent,
|
|
201
|
+
isPmCliErrorBreadcrumb,
|
|
202
|
+
scrubString,
|
|
203
|
+
};
|
|
204
|
+
//# sourceMappingURL=instrument.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instrument.js","sourceRoot":"/","sources":["core/sentry/instrument.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst OPT_OUT_VALUES = new Set([\"1\", \"true\", \"yes\", \"on\"]);\n\nfunction isSentryDisabled(): boolean {\n if (OPT_OUT_VALUES.has((process.env.PM_SENTRY_DISABLED ?? \"\").trim().toLowerCase())) return true;\n if (OPT_OUT_VALUES.has((process.env.PM_TELEMETRY_DISABLED ?? \"\").trim().toLowerCase())) return true;\n if (process.env.VITEST || process.env.VITEST_WORKER_ID) return true;\n return false;\n}\n\nconst SENSITIVE_KEY_PATTERN =\n /(?:token|secret|password|passwd|api[_-]?key|apikey|authorization|cookie|credentials|bearer|dsn)/i;\n\nconst INLINE_SENSITIVE_ASSIGNMENT_RE = new RegExp(\n `\\\\b(${SENSITIVE_KEY_PATTERN.source})\\\\s*[:=]\\\\s*([^\\\\s,;]+)`,\n \"giu\",\n);\nconst ABSOLUTE_PATH_TOKEN_RE = /(^|[\\s\"'`(=])\\/(?:[^\\s\"'`),;]+)/g;\nconst PRIVATE_IP_RE =\n /\\b(?:10\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)|172\\.(?:1[6-9]|2\\d|3[01])\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)|192\\.168\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))\\b/g;\n\nfunction scrubString(value: string): string {\n const scrubbed = value\n .replaceAll(INLINE_SENSITIVE_ASSIGNMENT_RE, (_m, key: string) => `${key}=[scrubbed]`)\n .replaceAll(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}/giu, \"[scrubbed_email]\")\n .replaceAll(/bearer\\s+[a-z0-9._=-]+/giu, \"bearer [scrubbed]\")\n .replaceAll(/sntr[ysu]_[A-Za-z0-9_-]+/g, \"[scrubbed_sentry_token]\")\n .replaceAll(PRIVATE_IP_RE, \"[scrubbed_ip]\")\n .replaceAll(ABSOLUTE_PATH_TOKEN_RE, (_match: string, prefix: string) => `${prefix}[scrubbed_path]`);\n if (scrubbed.trim().startsWith(\"/\") && scrubbed.trim().length > 1) {\n return \"[scrubbed_path]\";\n }\n return scrubbed;\n}\n\nfunction scrubEventData(obj: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (SENSITIVE_KEY_PATTERN.test(key)) {\n result[key] = \"[scrubbed]\";\n } else if (typeof value === \"string\") {\n result[key] = scrubString(value);\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\ntype SentryLike = typeof import(\"@sentry/node\");\n\nlet _sentry: SentryLike | undefined;\nlet _initDone = false;\n\nconst PM_CLI_SENTRY_DSN =\n \"https://bf7ad2ec76c0051c2ee94e48e8bd6868@o4510603477712896.ingest.de.sentry.io/4511316775338064\";\n\nfunction hasPmCliErrorPrefix(value: string): boolean {\n return /^\\s*PmCliError:/.test(value);\n}\n\nfunction isExpectedCliErrorEvent(event: {\n exception?: { values?: Array<{ type?: string; value?: string }> };\n message?: string;\n extra?: Record<string, unknown>;\n logger?: string;\n}): boolean {\n if (event.exception?.values?.some((ex) => ex.type === \"PmCliError\")) return true;\n\n if (event.exception?.values?.some((ex) => typeof ex.value === \"string\" && hasPmCliErrorPrefix(ex.value)))\n return true;\n\n if (event.logger === \"console\" && typeof event.message === \"string\" && hasPmCliErrorPrefix(event.message))\n return true;\n\n return false;\n}\n\nfunction isPmCliErrorBreadcrumb(breadcrumb: { category?: string; message?: string }): boolean {\n return (\n breadcrumb.category === \"console\" &&\n typeof breadcrumb.message === \"string\" &&\n hasPmCliErrorPrefix(breadcrumb.message)\n );\n}\n\nfunction resolveCliVersion(): string {\n try {\n const thisFile = fileURLToPath(import.meta.url);\n const candidates = [\n path.resolve(thisFile, \"../../../../package.json\"),\n path.resolve(thisFile, \"../../../package.json\"),\n ];\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n const parsed = JSON.parse(fs.readFileSync(candidate, \"utf8\")) as { version?: string };\n if (typeof parsed.version === \"string\") return parsed.version;\n }\n }\n } catch {\n // Version resolution must never block startup.\n }\n return \"0.0.0\";\n}\n\nfunction resolveEnvironment(): string {\n const explicit = process.env.SENTRY_ENVIRONMENT?.trim();\n if (explicit && explicit.length > 0) return explicit;\n if (process.env.VITEST || process.env.VITEST_WORKER_ID || process.env.NODE_ENV === \"test\") return \"test\";\n if (process.env.CI) return \"ci\";\n return \"production\";\n}\n\nexport async function ensureSentryInit(): Promise<SentryLike | undefined> {\n if (_initDone) return _sentry;\n _initDone = true;\n\n if (isSentryDisabled()) return undefined;\n\n const SentryModule = await import(\"@sentry/node\");\n _sentry = SentryModule;\n\n const dsn = process.env.SENTRY_DSN?.trim() || PM_CLI_SENTRY_DSN;\n const release = resolveCliVersion();\n\n SentryModule.init({\n dsn,\n release: `pm-cli@${release}`,\n environment: resolveEnvironment(),\n\n tracesSampleRate: 0.2,\n enableLogs: true,\n attachStacktrace: true,\n normalizeDepth: 6,\n shutdownTimeout: 3000,\n sendDefaultPii: false,\n serverName: undefined,\n\n integrations: [\n SentryModule.extraErrorDataIntegration({ depth: 4 }),\n SentryModule.captureConsoleIntegration({ levels: [\"warn\", \"error\"] }),\n ],\n\n initialScope: {\n tags: {\n \"cli.name\": \"pm-cli\",\n \"cli.version\": release,\n \"runtime.node\": process.version,\n \"runtime.platform\": process.platform,\n \"runtime.arch\": process.arch,\n },\n },\n\n beforeSend(event) {\n if (isExpectedCliErrorEvent(event)) {\n return null;\n }\n\n if (event.exception?.values) {\n for (const exception of event.exception.values) {\n if (exception.value) {\n exception.value = scrubString(exception.value);\n }\n if (exception.stacktrace?.frames) {\n for (const frame of exception.stacktrace.frames) {\n if (frame.vars) {\n frame.vars = scrubEventData(frame.vars as Record<string, unknown>);\n }\n }\n }\n }\n }\n\n if (event.breadcrumbs) {\n for (const breadcrumb of event.breadcrumbs) {\n if (breadcrumb.message) {\n breadcrumb.message = scrubString(breadcrumb.message);\n }\n if (breadcrumb.data && typeof breadcrumb.data === \"object\") {\n breadcrumb.data = scrubEventData(breadcrumb.data as Record<string, unknown>);\n }\n }\n }\n\n if (event.extra && typeof event.extra === \"object\") {\n event.extra = scrubEventData(event.extra as Record<string, unknown>);\n }\n\n if (event.contexts) {\n for (const [ctxKey, ctx] of Object.entries(event.contexts)) {\n if (ctx && typeof ctx === \"object\") {\n event.contexts![ctxKey] = scrubEventData(ctx as Record<string, unknown>);\n }\n }\n }\n\n return event;\n },\n\n beforeSendTransaction(event) {\n if (event.breadcrumbs) {\n event.breadcrumbs = event.breadcrumbs.filter((bc) => !isPmCliErrorBreadcrumb(bc));\n for (const breadcrumb of event.breadcrumbs) {\n if (breadcrumb.message) {\n breadcrumb.message = scrubString(breadcrumb.message);\n }\n }\n }\n return event;\n },\n\n beforeBreadcrumb(breadcrumb) {\n if (isPmCliErrorBreadcrumb(breadcrumb)) {\n return null;\n }\n if (breadcrumb.message) {\n breadcrumb.message = scrubString(breadcrumb.message);\n }\n if (breadcrumb.data && typeof breadcrumb.data === \"object\") {\n breadcrumb.data = scrubEventData(breadcrumb.data as Record<string, unknown>);\n }\n return breadcrumb;\n },\n });\n\n return SentryModule;\n}\n\nexport function getSentry(): SentryLike | undefined {\n return _sentry;\n}\n\nexport const _testOnly = {\n isExpectedCliErrorEvent,\n isPmCliErrorBreadcrumb,\n scrubString,\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-types.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"command-types.js","sourceRoot":"/","sources":["core/shared/command-types.ts"],"names":[],"mappings":"","sourcesContent":["export interface GlobalOptions {\n json?: boolean;\n quiet?: boolean;\n path?: string;\n noExtensions?: boolean;\n noPager?: boolean;\n profile?: boolean;\n defaultOutputFormat?: \"toon\" | \"json\";\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conflict-markers.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"conflict-markers.js","sourceRoot":"/","sources":["core/shared/conflict-markers.ts"],"names":[],"mappings":"AAMA,MAAM,uBAAuB,GAAG,yCAAyC,CAAC;AAE1E,MAAM,UAAU,wBAAwB,CAAC,OAAe;IACtD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,OAAO,GAA0B,EAAE,CAAC;IAC1C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACxD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAkC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,KAAK,GAAG,CAAC;YACf,MAAM;YACN,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;IACL,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,OAAe;IAC1D,MAAM,OAAO,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAClD,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC","sourcesContent":["export interface ConflictMarkerMatch {\n line: number;\n marker: \"<<<<<<<\" | \"=======\" | \">>>>>>>\";\n text: string;\n}\n\nconst CONFLICT_MARKER_PATTERN = /^\\s*(<<<<<<<|=======|>>>>>>>)(?:\\s.*)?$/;\n\nexport function findMergeConflictMarkers(content: string): ConflictMarkerMatch[] {\n if (content.length === 0) {\n return [];\n }\n const lines = content.split(/\\r?\\n/);\n const matches: ConflictMarkerMatch[] = [];\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index] ?? \"\";\n const markerMatch = line.match(CONFLICT_MARKER_PATTERN);\n if (!markerMatch) {\n continue;\n }\n const marker = markerMatch[1] as ConflictMarkerMatch[\"marker\"];\n matches.push({\n line: index + 1,\n marker,\n text: line,\n });\n }\n return matches;\n}\n\nexport function findFirstMergeConflictMarker(content: string): ConflictMarkerMatch | undefined {\n const matches = findMergeConflictMarkers(content);\n return matches[0];\n}\n"]}
|
|
@@ -27,4 +27,7 @@ export declare const EXIT_CODE: {
|
|
|
27
27
|
readonly CONFLICT: 4;
|
|
28
28
|
readonly DEPENDENCY_FAILED: 5;
|
|
29
29
|
};
|
|
30
|
+
export type TelemetryErrorCategory = "usage" | "validation" | "conflict" | "runtime" | "unknown";
|
|
31
|
+
export declare const TELEMETRY_ERROR_CATEGORY_BY_CODE: Readonly<Record<string, TelemetryErrorCategory>>;
|
|
32
|
+
export declare function resolveTelemetryErrorCategory(errorCode: string | undefined): TelemetryErrorCategory;
|
|
30
33
|
export {};
|
|
@@ -174,7 +174,7 @@ export const SETTINGS_DEFAULTS = {
|
|
|
174
174
|
telemetry: {
|
|
175
175
|
enabled: true,
|
|
176
176
|
first_run_prompt_completed: false,
|
|
177
|
-
capture_level: "
|
|
177
|
+
capture_level: "redacted",
|
|
178
178
|
endpoint: "https://pm-cli.unbrained.dev/v1/events",
|
|
179
179
|
installation_id: "",
|
|
180
180
|
retention_days: 365,
|
|
@@ -253,6 +253,21 @@ export const SETTINGS_DEFAULTS = {
|
|
|
253
253
|
model: "",
|
|
254
254
|
},
|
|
255
255
|
},
|
|
256
|
+
context: {
|
|
257
|
+
default_depth: "brief",
|
|
258
|
+
activity_limit: 10,
|
|
259
|
+
stale_threshold_days: 7,
|
|
260
|
+
sections: {
|
|
261
|
+
hierarchy: true,
|
|
262
|
+
activity: true,
|
|
263
|
+
progress: true,
|
|
264
|
+
blockers: true,
|
|
265
|
+
files: true,
|
|
266
|
+
workload: true,
|
|
267
|
+
staleness: true,
|
|
268
|
+
tests: true,
|
|
269
|
+
},
|
|
270
|
+
},
|
|
256
271
|
vector_store: {
|
|
257
272
|
adapter: "",
|
|
258
273
|
qdrant: {
|
|
@@ -276,4 +291,46 @@ export const EXIT_CODE = {
|
|
|
276
291
|
CONFLICT: 4,
|
|
277
292
|
DEPENDENCY_FAILED: 5,
|
|
278
293
|
};
|
|
294
|
+
export const TELEMETRY_ERROR_CATEGORY_BY_CODE = Object.freeze({
|
|
295
|
+
unknown_command: "usage",
|
|
296
|
+
unknown_option: "usage",
|
|
297
|
+
missing_required_option: "usage",
|
|
298
|
+
missing_required_argument: "usage",
|
|
299
|
+
invalid_command_usage: "usage",
|
|
300
|
+
invalid_argument_value: "validation",
|
|
301
|
+
close_through_update: "validation",
|
|
302
|
+
no_update_fields: "validation",
|
|
303
|
+
unsupported_update_option: "validation",
|
|
304
|
+
tracker_not_initialized: "validation",
|
|
305
|
+
item_not_found: "validation",
|
|
306
|
+
ownership_conflict: "conflict",
|
|
307
|
+
lock_conflict: "conflict",
|
|
308
|
+
terminal_state_conflict: "conflict",
|
|
309
|
+
dependency_failed: "runtime",
|
|
310
|
+
command_failed: "runtime",
|
|
311
|
+
unknown_error: "runtime",
|
|
312
|
+
});
|
|
313
|
+
export function resolveTelemetryErrorCategory(errorCode) {
|
|
314
|
+
const normalized = (errorCode ?? "").trim().toLowerCase();
|
|
315
|
+
if (normalized.length === 0) {
|
|
316
|
+
return "unknown";
|
|
317
|
+
}
|
|
318
|
+
const explicit = TELEMETRY_ERROR_CATEGORY_BY_CODE[normalized];
|
|
319
|
+
if (typeof explicit === "string") {
|
|
320
|
+
return explicit;
|
|
321
|
+
}
|
|
322
|
+
if (normalized.includes("conflict") || normalized.includes("locked")) {
|
|
323
|
+
return "conflict";
|
|
324
|
+
}
|
|
325
|
+
if (normalized.startsWith("unknown_") || normalized.startsWith("missing_required_")) {
|
|
326
|
+
return "usage";
|
|
327
|
+
}
|
|
328
|
+
if (normalized.startsWith("invalid_") || normalized.endsWith("_not_found") || normalized.includes("validation")) {
|
|
329
|
+
return "validation";
|
|
330
|
+
}
|
|
331
|
+
if (normalized.endsWith("_error") || normalized.endsWith("_failed")) {
|
|
332
|
+
return "runtime";
|
|
333
|
+
}
|
|
334
|
+
return "unknown";
|
|
335
|
+
}
|
|
279
336
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/core/shared/constants.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"/","sources":["core/shared/constants.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BuiltinItemType, GovernancePreset, GovernanceSettings, ItemFrontMatter, PmSettings } from \"../../types/index.js\";\n\nexport const PM_DIRNAME = \".agents/pm\";\nexport const SETTINGS_FILENAME = \"settings.json\";\n\nexport const PM_CORE_REQUIRED_SUBDIRS = [\n \"\",\n \"epics\",\n \"features\",\n \"tasks\",\n \"chores\",\n \"issues\",\n \"schema\",\n \"history\",\n \"index\",\n \"search\",\n \"extensions\",\n \"locks\",\n] as const;\n\nexport const PM_OPTIONAL_TYPE_SUBDIRS = [\n \"decisions\",\n \"events\",\n \"reminders\",\n \"milestones\",\n \"meetings\",\n] as const;\n\nexport const PM_REQUIRED_SUBDIRS = [...PM_CORE_REQUIRED_SUBDIRS, ...PM_OPTIONAL_TYPE_SUBDIRS] as const;\n\nexport const TYPE_TO_FOLDER: Record<BuiltinItemType, string> = {\n Epic: \"epics\",\n Feature: \"features\",\n Task: \"tasks\",\n Chore: \"chores\",\n Issue: \"issues\",\n Decision: \"decisions\",\n Event: \"events\",\n Reminder: \"reminders\",\n Milestone: \"milestones\",\n Meeting: \"meetings\",\n};\n\nexport const FRONT_MATTER_KEY_ORDER: ReadonlyArray<string> = [\n \"id\",\n \"title\",\n \"description\",\n \"type\",\n \"source_type\",\n \"type_options\",\n \"status\",\n \"priority\",\n \"tags\",\n \"created_at\",\n \"updated_at\",\n \"deadline\",\n \"reminders\",\n \"events\",\n \"closed_at\",\n \"assignee\",\n \"source_owner\",\n \"author\",\n \"estimated_minutes\",\n \"acceptance_criteria\",\n \"design\",\n \"external_ref\",\n \"definition_of_ready\",\n \"order\",\n \"goal\",\n \"objective\",\n \"value\",\n \"impact\",\n \"outcome\",\n \"why_now\",\n \"parent\",\n \"reviewer\",\n \"risk\",\n \"confidence\",\n \"sprint\",\n \"release\",\n \"blocked_by\",\n \"blocked_reason\",\n \"unblock_note\",\n \"reporter\",\n \"severity\",\n \"environment\",\n \"repro_steps\",\n \"resolution\",\n \"expected_result\",\n \"actual_result\",\n \"affected_version\",\n \"fixed_version\",\n \"component\",\n \"regression\",\n \"customer_impact\",\n \"dependencies\",\n \"comments\",\n \"notes\",\n \"learnings\",\n \"files\",\n \"tests\",\n \"test_runs\",\n \"docs\",\n \"close_reason\",\n];\n\ntype BuiltinGovernancePreset = Exclude<GovernancePreset, \"custom\">;\n\nexport const GOVERNANCE_PRESET_DEFAULTS: Record<BuiltinGovernancePreset, Omit<GovernanceSettings, \"preset\">> = {\n minimal: {\n ownership_enforcement: \"none\",\n create_mode_default: \"progressive\",\n close_validation_default: \"off\",\n parent_reference: \"warn\",\n metadata_profile: \"core\",\n force_required_for_stale_lock: false,\n },\n default: {\n ownership_enforcement: \"warn\",\n create_mode_default: \"progressive\",\n close_validation_default: \"warn\",\n parent_reference: \"warn\",\n metadata_profile: \"core\",\n force_required_for_stale_lock: true,\n },\n strict: {\n ownership_enforcement: \"strict\",\n create_mode_default: \"strict\",\n close_validation_default: \"strict\",\n parent_reference: \"strict_error\",\n metadata_profile: \"strict\",\n force_required_for_stale_lock: true,\n },\n};\n\nexport const DEFAULT_VALIDATE_STALE_BLOCKER_REASON_PATTERNS = [\n \"no active blocker\",\n \"ready for planned execution sequencing\",\n \"work completed\",\n \"work is closed\",\n] as const;\n\nexport const DEFAULT_VALIDATE_CLOSURE_LIKE_METADATA_FIELD_PATTERNS = {\n blocked_reason: [\"no active blocker because work is closed\", \"work is closed\"],\n resolution: [\"closed with implementation evidence\", \"closed with verification evidence\", \"work completed and recorded\", \"work is closed\"],\n actual_result: [\"closed and recorded\", \"work completed\", \"work completed and recorded\"],\n} as const;\n\nexport const SETTINGS_DEFAULTS: PmSettings = {\n version: 1,\n id_prefix: \"pm-\",\n author_default: \"\",\n item_format: \"toon\",\n locks: {\n ttl_seconds: 1800,\n },\n output: {\n default_format: \"toon\",\n },\n history: {\n missing_stream: \"auto_create\",\n },\n validation: {\n sprint_release_format: \"warn\",\n parent_reference: \"warn\",\n metadata_profile: \"core\",\n metadata_required_fields: [],\n lifecycle_stale_blocker_reason_patterns: [...DEFAULT_VALIDATE_STALE_BLOCKER_REASON_PATTERNS],\n lifecycle_closure_like_blocked_reason_patterns: [\n ...DEFAULT_VALIDATE_CLOSURE_LIKE_METADATA_FIELD_PATTERNS.blocked_reason,\n ],\n lifecycle_closure_like_resolution_patterns: [...DEFAULT_VALIDATE_CLOSURE_LIKE_METADATA_FIELD_PATTERNS.resolution],\n lifecycle_closure_like_actual_result_patterns: [\n ...DEFAULT_VALIDATE_CLOSURE_LIKE_METADATA_FIELD_PATTERNS.actual_result,\n ],\n },\n governance: {\n preset: \"minimal\",\n ...GOVERNANCE_PRESET_DEFAULTS.minimal,\n },\n workflow: {\n definition_of_done: [],\n },\n testing: {\n record_results_to_items: false,\n },\n telemetry: {\n enabled: true,\n first_run_prompt_completed: false,\n capture_level: \"redacted\",\n endpoint: \"https://pm-cli.unbrained.dev/v1/events\",\n installation_id: \"\",\n retention_days: 365,\n },\n item_types: {\n definitions: [],\n },\n schema: {\n version: 1,\n files: {\n types: \"schema/types.json\",\n statuses: \"schema/statuses.json\",\n fields: \"schema/fields.json\",\n workflows: \"schema/workflows.json\",\n },\n statuses: [\n {\n id: \"draft\",\n roles: [\"draft\"],\n },\n {\n id: \"open\",\n roles: [\"active\", \"default_open\"],\n },\n {\n id: \"in_progress\",\n aliases: [\"in-progress\"],\n roles: [\"active\"],\n },\n {\n id: \"blocked\",\n roles: [\"blocked\"],\n },\n {\n id: \"closed\",\n roles: [\"terminal\", \"terminal_done\", \"default_close\"],\n },\n {\n id: \"canceled\",\n aliases: [\"cancelled\"],\n roles: [\"terminal\", \"terminal_canceled\", \"default_cancel\"],\n },\n ],\n fields: [],\n workflow: {\n draft_status: \"draft\",\n open_status: \"open\",\n in_progress_status: \"in_progress\",\n blocked_status: \"blocked\",\n close_status: \"closed\",\n canceled_status: \"canceled\",\n },\n unknown_field_policy: \"allow\",\n },\n extensions: {\n enabled: [],\n disabled: [],\n },\n search: {\n score_threshold: 0,\n hybrid_semantic_weight: 0.7,\n max_results: 50,\n embedding_model: \"\",\n embedding_batch_size: 32,\n scanner_max_batch_retries: 3,\n provider: \"\",\n },\n providers: {\n openai: {\n base_url: \"\",\n api_key: \"\",\n model: \"\",\n },\n ollama: {\n base_url: \"\",\n model: \"\",\n },\n },\n context: {\n default_depth: \"brief\",\n activity_limit: 10,\n stale_threshold_days: 7,\n sections: {\n hierarchy: true,\n activity: true,\n progress: true,\n blockers: true,\n files: true,\n workload: true,\n staleness: true,\n tests: true,\n },\n },\n vector_store: {\n adapter: \"\",\n qdrant: {\n url: \"\",\n api_key: \"\",\n },\n lancedb: {\n path: \"\",\n },\n },\n};\n\nexport const EMPTY_CANONICAL_DOCUMENT = {\n front_matter: {},\n body: \"\",\n};\n\nexport const EXIT_CODE = {\n SUCCESS: 0,\n GENERIC_FAILURE: 1,\n USAGE: 2,\n NOT_FOUND: 3,\n CONFLICT: 4,\n DEPENDENCY_FAILED: 5,\n} as const;\n\nexport type TelemetryErrorCategory = \"usage\" | \"validation\" | \"conflict\" | \"runtime\" | \"unknown\";\n\nexport const TELEMETRY_ERROR_CATEGORY_BY_CODE: Readonly<Record<string, TelemetryErrorCategory>> = Object.freeze({\n unknown_command: \"usage\",\n unknown_option: \"usage\",\n missing_required_option: \"usage\",\n missing_required_argument: \"usage\",\n invalid_command_usage: \"usage\",\n invalid_argument_value: \"validation\",\n close_through_update: \"validation\",\n no_update_fields: \"validation\",\n unsupported_update_option: \"validation\",\n tracker_not_initialized: \"validation\",\n item_not_found: \"validation\",\n ownership_conflict: \"conflict\",\n lock_conflict: \"conflict\",\n terminal_state_conflict: \"conflict\",\n dependency_failed: \"runtime\",\n command_failed: \"runtime\",\n unknown_error: \"runtime\",\n});\n\nexport function resolveTelemetryErrorCategory(errorCode: string | undefined): TelemetryErrorCategory {\n const normalized = (errorCode ?? \"\").trim().toLowerCase();\n if (normalized.length === 0) {\n return \"unknown\";\n }\n const explicit = TELEMETRY_ERROR_CATEGORY_BY_CODE[normalized];\n if (typeof explicit === \"string\") {\n return explicit;\n }\n if (normalized.includes(\"conflict\") || normalized.includes(\"locked\")) {\n return \"conflict\";\n }\n if (normalized.startsWith(\"unknown_\") || normalized.startsWith(\"missing_required_\")) {\n return \"usage\";\n }\n if (normalized.startsWith(\"invalid_\") || normalized.endsWith(\"_not_found\") || normalized.includes(\"validation\")) {\n return \"validation\";\n }\n if (normalized.endsWith(\"_error\") || normalized.endsWith(\"_failed\")) {\n return \"runtime\";\n }\n return \"unknown\";\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"/","sources":["core/shared/errors.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnB,QAAQ,CAAS;IACjB,OAAO,CAAoB;IAE3C,YAAY,OAAe,EAAE,QAAgB,EAAE,UAA6B,EAAE;QAC5E,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF","sourcesContent":["export interface PmCliErrorContext {\n code?: string;\n type?: string;\n required?: string;\n why?: string;\n examples?: string[];\n nextSteps?: string[];\n}\n\nexport class PmCliError extends Error {\n public readonly exitCode: number;\n public readonly context: PmCliErrorContext;\n\n constructor(message: string, exitCode: number, context: PmCliErrorContext = {}) {\n super(message);\n this.name = \"PmCliError\";\n this.exitCode = exitCode;\n this.context = context;\n }\n}\n"]}
|