@unbrained/pm-cli 2026.5.6 → 2026.5.11
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/pm/extensions/.managed-extensions.json +2 -2
- package/.agents/pm/extensions/beads/runtime.js +4 -4
- package/.agents/pm/extensions/beads/runtime.ts +5 -5
- package/.agents/pm/extensions/todos/runtime.js +7 -7
- package/.agents/pm/extensions/todos/runtime.ts +10 -10
- package/.agents/skills/HARNESS_COMPATIBILITY.md +45 -0
- package/.agents/skills/README.md +21 -0
- package/.agents/skills/pm-developer/SKILL.md +73 -0
- package/.agents/skills/pm-developer/references/COMMAND_PLAYBOOK.md +48 -0
- package/.agents/skills/pm-developer/references/PROMPTS.md +17 -0
- package/.agents/skills/pm-extensions/SKILL.md +57 -0
- package/.agents/skills/pm-extensions/references/LIFECYCLE.md +40 -0
- package/.agents/skills/pm-extensions/references/TROUBLESHOOTING.md +25 -0
- package/.agents/skills/pm-sdk/SKILL.md +50 -0
- package/.agents/skills/pm-sdk/references/INTEGRATION_CHECKLIST.md +31 -0
- package/.agents/skills/pm-sdk/references/PROMPTS.md +13 -0
- package/.agents/skills/pm-user/SKILL.md +59 -0
- package/.agents/skills/pm-user/references/PROMPTS.md +17 -0
- package/.agents/skills/pm-user/references/WORKFLOWS.md +35 -0
- package/.claude-plugin/marketplace.json +38 -0
- package/.pi/README.md +35 -0
- package/.pi/agents/pm-triage-agent.md +19 -0
- package/.pi/agents/pm-verification-agent.md +21 -0
- package/.pi/chains/pm-native-delivery.chain.md +11 -0
- package/.pi/extensions/pm-cli/index.js +387 -0
- package/.pi/prompts/pm-workflow.md +5 -0
- package/.pi/skills/pm-native/SKILL.md +44 -0
- package/.pi/skills/pm-release/SKILL.md +35 -0
- package/AGENTS.md +1 -1
- package/CHANGELOG.md +13 -0
- package/PRD.md +16 -16
- package/README.md +30 -4
- package/dist/cli/argv-utils.d.ts +5 -0
- package/dist/cli/argv-utils.js +34 -0
- package/dist/cli/argv-utils.js.map +1 -0
- package/dist/cli/bootstrap-args.d.ts +15 -0
- package/dist/cli/bootstrap-args.js +211 -0
- package/dist/cli/bootstrap-args.js.map +1 -1
- package/dist/cli/commander-usage.js +109 -3
- package/dist/cli/commander-usage.js.map +1 -1
- package/dist/cli/commands/claim.js +6 -6
- package/dist/cli/commands/claim.js.map +1 -1
- package/dist/cli/commands/close.js +9 -9
- package/dist/cli/commands/close.js.map +1 -1
- package/dist/cli/commands/comments.d.ts +2 -0
- package/dist/cli/commands/comments.js +57 -8
- package/dist/cli/commands/comments.js.map +1 -1
- package/dist/cli/commands/completion.js +40 -7
- package/dist/cli/commands/completion.js.map +1 -1
- package/dist/cli/commands/config.js +6 -3
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/contracts.d.ts +19 -0
- package/dist/cli/commands/contracts.js +36 -1
- package/dist/cli/commands/contracts.js.map +1 -1
- package/dist/cli/commands/create.d.ts +2 -2
- package/dist/cli/commands/create.js +116 -55
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/docs.js +13 -6
- package/dist/cli/commands/docs.js.map +1 -1
- package/dist/cli/commands/extension.d.ts +3 -1
- package/dist/cli/commands/extension.js +174 -2
- package/dist/cli/commands/extension.js.map +1 -1
- package/dist/cli/commands/files.js +19 -12
- package/dist/cli/commands/files.js.map +1 -1
- package/dist/cli/commands/get.js +5 -5
- package/dist/cli/commands/get.js.map +1 -1
- package/dist/cli/commands/guide.d.ts +55 -0
- package/dist/cli/commands/guide.js +260 -0
- package/dist/cli/commands/guide.js.map +1 -0
- package/dist/cli/commands/health.js +1 -1
- package/dist/cli/commands/health.js.map +1 -1
- package/dist/cli/commands/history.js +30 -10
- package/dist/cli/commands/history.js.map +1 -1
- package/dist/cli/commands/index.d.ts +1 -0
- package/dist/cli/commands/index.js +1 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.js +21 -1
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/learnings.js +3 -3
- package/dist/cli/commands/learnings.js.map +1 -1
- package/dist/cli/commands/metadata-normalizers.d.ts +4 -0
- package/dist/cli/commands/metadata-normalizers.js +37 -0
- package/dist/cli/commands/metadata-normalizers.js.map +1 -0
- package/dist/cli/commands/notes.js +3 -3
- package/dist/cli/commands/notes.js.map +1 -1
- package/dist/cli/commands/reindex.js +180 -156
- package/dist/cli/commands/reindex.js.map +1 -1
- package/dist/cli/commands/restore.d.ts +2 -2
- package/dist/cli/commands/restore.js +44 -24
- package/dist/cli/commands/restore.js.map +1 -1
- package/dist/cli/commands/search.d.ts +2 -0
- package/dist/cli/commands/search.js +45 -26
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/test-all.d.ts +2 -0
- package/dist/cli/commands/test-all.js +2 -0
- package/dist/cli/commands/test-all.js.map +1 -1
- package/dist/cli/commands/test.d.ts +1 -0
- package/dist/cli/commands/test.js +13 -5
- package/dist/cli/commands/test.js.map +1 -1
- package/dist/cli/commands/update.js +188 -157
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/commands/validate.js +1 -1
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/error-guidance.d.ts +9 -1
- package/dist/cli/error-guidance.js +147 -6
- package/dist/cli/error-guidance.js.map +1 -1
- package/dist/cli/guide-topics.d.ts +25 -0
- package/dist/cli/guide-topics.js +283 -0
- package/dist/cli/guide-topics.js.map +1 -0
- package/dist/cli/help-content.js +25 -1
- package/dist/cli/help-content.js.map +1 -1
- package/dist/cli/help-json-payload.js +11 -1
- package/dist/cli/help-json-payload.js.map +1 -1
- package/dist/cli/main.js +69 -6
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/register-list-query.js +38 -1
- package/dist/cli/register-list-query.js.map +1 -1
- package/dist/cli/register-mutation.js +17 -4
- package/dist/cli/register-mutation.js.map +1 -1
- package/dist/cli/register-setup.js +15 -1
- package/dist/cli/register-setup.js.map +1 -1
- package/dist/cli/telemetry-flush.d.ts +2 -0
- package/dist/cli/telemetry-flush.js +4 -0
- package/dist/cli/telemetry-flush.js.map +1 -0
- package/dist/cli.js +1 -2
- package/dist/cli.js.map +1 -1
- package/dist/core/extensions/extension-types.d.ts +72 -0
- package/dist/core/extensions/extension-types.js +24 -0
- package/dist/core/extensions/extension-types.js.map +1 -1
- package/dist/core/extensions/loader.d.ts +1 -0
- package/dist/core/extensions/loader.js +766 -7
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/history/history.js +32 -11
- package/dist/core/history/history.js.map +1 -1
- package/dist/core/item/item-format.d.ts +2 -2
- package/dist/core/item/item-format.js +16 -16
- package/dist/core/item/item-format.js.map +1 -1
- package/dist/core/lock/lock.js +2 -0
- package/dist/core/lock/lock.js.map +1 -1
- package/dist/core/schema/runtime-field-filters.js +1 -1
- package/dist/core/schema/runtime-field-filters.js.map +1 -1
- package/dist/core/schema/runtime-field-values.js +2 -2
- package/dist/core/schema/runtime-field-values.js.map +1 -1
- package/dist/core/schema/runtime-schema.d.ts +1 -1
- package/dist/core/schema/runtime-schema.js +3 -3
- package/dist/core/schema/runtime-schema.js.map +1 -1
- package/dist/core/search/cache.js +7 -21
- package/dist/core/search/cache.js.map +1 -1
- package/dist/core/search/corpus.d.ts +13 -0
- package/dist/core/search/corpus.js +74 -0
- package/dist/core/search/corpus.js.map +1 -0
- package/dist/core/search/embedding-batches.js +90 -30
- package/dist/core/search/embedding-batches.js.map +1 -1
- package/dist/core/sentry/instrument.d.ts +18 -1
- package/dist/core/sentry/instrument.js +128 -12
- package/dist/core/sentry/instrument.js.map +1 -1
- package/dist/core/shared/constants.d.ts +1 -1
- package/dist/core/shared/constants.js +21 -1
- package/dist/core/shared/constants.js.map +1 -1
- package/dist/core/shared/errors.d.ts +8 -0
- package/dist/core/shared/errors.js.map +1 -1
- package/dist/core/shared/levenshtein.d.ts +1 -0
- package/dist/core/shared/levenshtein.js +37 -0
- package/dist/core/shared/levenshtein.js.map +1 -0
- package/dist/core/store/front-matter-cache.d.ts +1 -1
- package/dist/core/store/front-matter-cache.js +13 -13
- package/dist/core/store/front-matter-cache.js.map +1 -1
- package/dist/core/store/item-format-migration.js +5 -2
- package/dist/core/store/item-format-migration.js.map +1 -1
- package/dist/core/store/item-store.js +16 -15
- package/dist/core/store/item-store.js.map +1 -1
- package/dist/core/store/paths.js +35 -2
- package/dist/core/store/paths.js.map +1 -1
- package/dist/core/store/settings.js +216 -2
- package/dist/core/store/settings.js.map +1 -1
- package/dist/core/telemetry/runtime.d.ts +1 -0
- package/dist/core/telemetry/runtime.js +102 -3
- package/dist/core/telemetry/runtime.js.map +1 -1
- package/dist/core/test/item-test-run-tracking.js +2 -2
- package/dist/core/test/item-test-run-tracking.js.map +1 -1
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.js +407 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/pi/native.d.ts +5 -0
- package/dist/pi/native.js +236 -0
- package/dist/pi/native.js.map +1 -0
- package/dist/sdk/cli-contracts.d.ts +24 -2
- package/dist/sdk/cli-contracts.js +317 -2
- package/dist/sdk/cli-contracts.js.map +1 -1
- package/dist/sdk/index.d.ts +12 -1
- package/dist/sdk/index.js +8 -1
- package/dist/sdk/index.js.map +1 -1
- package/dist/types.d.ts +51 -2
- package/dist/types.js.map +1 -1
- package/docs/AGENT_GUIDE.md +15 -0
- package/docs/ARCHITECTURE.md +2 -2
- package/docs/CLAUDE_CODE_PLUGIN.md +225 -0
- package/docs/CODEX_PLUGIN.md +33 -0
- package/docs/COMMANDS.md +6 -2
- package/docs/CONFIGURATION.md +2 -8
- package/docs/EXTENSIONS.md +688 -0
- package/docs/MIGRATION_CLI_SIMPLIFICATION.md +64 -0
- package/docs/PI_PACKAGE.md +141 -0
- package/docs/QUICKSTART.md +1 -0
- package/docs/README.md +30 -1
- package/docs/RELEASING.md +4 -2
- package/docs/SDK.md +444 -2
- package/docs/examples/ci/github-actions-pm-extension-gate.yml +53 -0
- package/docs/examples/ci/gitlab-ci-pm-extension-gate.yml +41 -0
- package/docs/examples/ci/jenkins-pm-extension-gate.Jenkinsfile +45 -0
- package/docs/examples/policy-restricted-extension/README.md +74 -0
- package/docs/examples/policy-restricted-extension/index.js +21 -0
- package/docs/examples/policy-restricted-extension/manifest.json +21 -0
- package/docs/examples/policy-restricted-extension/package.json +8 -0
- package/docs/examples/sdk-app-embedding/README.md +39 -0
- package/docs/examples/sdk-app-embedding/package.json +9 -0
- package/docs/examples/sdk-app-embedding/run-embedded-pm.mjs +61 -0
- package/docs/examples/sdk-contract-consumer/README.md +57 -0
- package/docs/examples/sdk-contract-consumer/inspect-contracts.mjs +47 -0
- package/docs/examples/sdk-contract-consumer/package.json +10 -0
- package/docs/examples/starter-extension/README.md +57 -42
- package/docs/examples/starter-extension/manifest.json +15 -0
- package/marketplace.json +34 -0
- package/package.json +38 -4
- package/plugins/pm-cli-claude/.claude-plugin/plugin.json +23 -0
- package/plugins/pm-cli-claude/.mcp.json +12 -0
- package/plugins/pm-cli-claude/README.md +225 -0
- package/plugins/pm-cli-claude/agents/pm-coordinator.md +48 -0
- package/plugins/pm-cli-claude/agents/pm-delivery-chain.md +88 -0
- package/plugins/pm-cli-claude/agents/pm-triage-agent.md +83 -0
- package/plugins/pm-cli-claude/agents/pm-verification-agent.md +88 -0
- package/plugins/pm-cli-claude/commands/pm-audit.md +39 -0
- package/plugins/pm-cli-claude/commands/pm-calendar.md +41 -0
- package/plugins/pm-cli-claude/commands/pm-close-task.md +20 -0
- package/plugins/pm-cli-claude/commands/pm-developer.md +38 -0
- package/plugins/pm-cli-claude/commands/pm-init.md +44 -0
- package/plugins/pm-cli-claude/commands/pm-list.md +39 -0
- package/plugins/pm-cli-claude/commands/pm-new.md +36 -0
- package/plugins/pm-cli-claude/commands/pm-planner.md +51 -0
- package/plugins/pm-cli-claude/commands/pm-release.md +41 -0
- package/plugins/pm-cli-claude/commands/pm-search.md +21 -0
- package/plugins/pm-cli-claude/commands/pm-start-task.md +27 -0
- package/plugins/pm-cli-claude/commands/pm-status.md +15 -0
- package/plugins/pm-cli-claude/commands/pm-triage.md +35 -0
- package/plugins/pm-cli-claude/commands/pm-workflow.md +49 -0
- package/plugins/pm-cli-claude/hooks/hooks.json +17 -0
- package/plugins/pm-cli-claude/hooks/session-start.mjs +120 -0
- package/plugins/pm-cli-claude/scripts/pm-mcp-server.mjs +60 -0
- package/plugins/pm-cli-claude/skills/pm-audit/SKILL.md +88 -0
- package/plugins/pm-cli-claude/skills/pm-developer/SKILL.md +116 -0
- package/plugins/pm-cli-claude/skills/pm-planner/SKILL.md +118 -0
- package/plugins/pm-cli-claude/skills/pm-release/SKILL.md +83 -0
- package/plugins/pm-cli-claude/skills/pm-workflow/SKILL.md +148 -0
- package/plugins/pm-cli-codex/.codex-plugin/plugin.json +45 -0
- package/plugins/pm-cli-codex/.mcp.json +14 -0
- package/plugins/pm-cli-codex/README.md +30 -0
- package/plugins/pm-cli-codex/assets/pm-cli-small.svg +4 -0
- package/plugins/pm-cli-codex/commands/pm-audit.md +8 -0
- package/plugins/pm-cli-codex/commands/pm-close-task.md +9 -0
- package/plugins/pm-cli-codex/commands/pm-start-task.md +9 -0
- package/plugins/pm-cli-codex/scripts/pm-mcp-server.mjs +54 -0
- package/plugins/pm-cli-codex/skills/pm-auditor/SKILL.md +21 -0
- package/plugins/pm-cli-codex/skills/pm-auditor/agents/openai.yaml +6 -0
- package/plugins/pm-cli-codex/skills/pm-native/SKILL.md +57 -0
- package/plugins/pm-cli-codex/skills/pm-native/agents/openai.yaml +6 -0
- package/plugins/pm-cli-codex/skills/pm-release/SKILL.md +19 -0
- package/plugins/pm-cli-codex/skills/pm-release/agents/openai.yaml +6 -0
|
@@ -15,7 +15,8 @@ import { applyRegisteredItemFieldDefaultsAndValidation } from "../../core/extens
|
|
|
15
15
|
import { locateItem, mutateItem } from "../../core/store/item-store.js";
|
|
16
16
|
import { getSettingsPath, resolvePmRoot } from "../../core/store/paths.js";
|
|
17
17
|
import { readSettings } from "../../core/store/settings.js";
|
|
18
|
-
import {
|
|
18
|
+
import { normalizeRiskInput, normalizeSeverityInput, parseConfidenceInput, parseRegressionInput, } from "./metadata-normalizers.js";
|
|
19
|
+
import { DEPENDENCY_KIND_VALUES, ISSUE_SEVERITY_VALUES, RECURRENCE_FREQUENCY_VALUES, RECURRENCE_WEEKDAY_VALUES, RISK_VALUES, } from "../../types/index.js";
|
|
19
20
|
import { parseDocs, parseFiles, parseLogSeed, parseTests } from "./create.js";
|
|
20
21
|
const LEGACY_NONE_TOKENS = new Set(["none", "null"]);
|
|
21
22
|
const UPDATE_UNSET_FIELD_DEFINITIONS = [
|
|
@@ -187,6 +188,61 @@ function assertNoLegacyNoneTokens(values, flag, replacementHint) {
|
|
|
187
188
|
const suffix = replacementHint ? ` ${replacementHint}` : "";
|
|
188
189
|
throw new PmCliError(`${flag} no longer accepts "none" or "null".${suffix}`.trim(), EXIT_CODE.USAGE);
|
|
189
190
|
}
|
|
191
|
+
const UPDATE_LEGACY_NONE_COLLECTION_NORMALIZERS = [
|
|
192
|
+
{ optionKey: "dep", clearFlagKey: "clearDeps", valueFlag: "--dep", clearFlag: "--clear-deps", disableReplaceFlagKey: "replaceDeps" },
|
|
193
|
+
{ optionKey: "comment", clearFlagKey: "clearComments", valueFlag: "--comment", clearFlag: "--clear-comments" },
|
|
194
|
+
{ optionKey: "note", clearFlagKey: "clearNotes", valueFlag: "--note", clearFlag: "--clear-notes" },
|
|
195
|
+
{ optionKey: "learning", clearFlagKey: "clearLearnings", valueFlag: "--learning", clearFlag: "--clear-learnings" },
|
|
196
|
+
{ optionKey: "file", clearFlagKey: "clearFiles", valueFlag: "--file", clearFlag: "--clear-files" },
|
|
197
|
+
{ optionKey: "test", clearFlagKey: "clearTests", valueFlag: "--test", clearFlag: "--clear-tests", disableReplaceFlagKey: "replaceTests" },
|
|
198
|
+
{ optionKey: "doc", clearFlagKey: "clearDocs", valueFlag: "--doc", clearFlag: "--clear-docs" },
|
|
199
|
+
{ optionKey: "reminder", clearFlagKey: "clearReminders", valueFlag: "--reminder", clearFlag: "--clear-reminders" },
|
|
200
|
+
{ optionKey: "event", clearFlagKey: "clearEvents", valueFlag: "--event", clearFlag: "--clear-events" },
|
|
201
|
+
{ optionKey: "typeOption", clearFlagKey: "clearTypeOptions", valueFlag: "--type-option", clearFlag: "--clear-type-options" },
|
|
202
|
+
];
|
|
203
|
+
function normalizeLegacyNoneUpdateOptions(options) {
|
|
204
|
+
const normalized = {
|
|
205
|
+
...options,
|
|
206
|
+
unset: options.unset ? [...options.unset] : undefined,
|
|
207
|
+
};
|
|
208
|
+
const appendUnsetTarget = (value) => {
|
|
209
|
+
const current = normalized.unset ? [...normalized.unset] : [];
|
|
210
|
+
if (!current.includes(value)) {
|
|
211
|
+
current.push(value);
|
|
212
|
+
}
|
|
213
|
+
normalized.unset = current;
|
|
214
|
+
};
|
|
215
|
+
const scalarOptionKeys = new Set([...UPDATE_OPTION_KEY_TO_UNSET_CANONICAL.keys(), "rank"]);
|
|
216
|
+
for (const optionKey of scalarOptionKeys) {
|
|
217
|
+
const candidate = normalized[optionKey];
|
|
218
|
+
if (typeof candidate !== "string" || !isLegacyNoneToken(candidate)) {
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
const canonicalUnset = optionKey === "rank" ? "order" : (UPDATE_OPTION_KEY_TO_UNSET_CANONICAL.get(optionKey) ?? optionKey);
|
|
222
|
+
appendUnsetTarget(canonicalUnset);
|
|
223
|
+
normalized[optionKey] = undefined;
|
|
224
|
+
}
|
|
225
|
+
for (const definition of UPDATE_LEGACY_NONE_COLLECTION_NORMALIZERS) {
|
|
226
|
+
const entries = normalized[definition.optionKey];
|
|
227
|
+
if (!Array.isArray(entries) || entries.length === 0) {
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
const hasLegacy = entries.some((entry) => isLegacyNoneToken(entry));
|
|
231
|
+
if (!hasLegacy) {
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
const concreteEntries = entries.filter((entry) => !isLegacyNoneToken(entry));
|
|
235
|
+
if (concreteEntries.length > 0) {
|
|
236
|
+
throw new PmCliError(`Cannot mix legacy clear token "none"/"null" with concrete ${definition.valueFlag} entries. Use ${definition.clearFlag} to clear or provide explicit entries.`, EXIT_CODE.USAGE);
|
|
237
|
+
}
|
|
238
|
+
normalized[definition.optionKey] = undefined;
|
|
239
|
+
normalized[definition.clearFlagKey] = true;
|
|
240
|
+
if (definition.disableReplaceFlagKey) {
|
|
241
|
+
normalized[definition.disableReplaceFlagKey] = false;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return normalized;
|
|
245
|
+
}
|
|
190
246
|
function resolveRuntimeUnsetDefinition(token, runtimeFieldRegistry) {
|
|
191
247
|
if (!runtimeFieldRegistry) {
|
|
192
248
|
return undefined;
|
|
@@ -197,7 +253,7 @@ function resolveRuntimeUnsetDefinition(token, runtimeFieldRegistry) {
|
|
|
197
253
|
}
|
|
198
254
|
const candidates = new Set([
|
|
199
255
|
definition.key,
|
|
200
|
-
definition.
|
|
256
|
+
definition.metadata_key,
|
|
201
257
|
definition.cli_flag.replaceAll("-", "_"),
|
|
202
258
|
definition.cli_flag,
|
|
203
259
|
...definition.cli_aliases.map((alias) => alias.replaceAll("-", "_")),
|
|
@@ -208,7 +264,7 @@ function resolveRuntimeUnsetDefinition(token, runtimeFieldRegistry) {
|
|
|
208
264
|
}
|
|
209
265
|
return {
|
|
210
266
|
optionKey: definition.key,
|
|
211
|
-
frontMatterKey: definition.
|
|
267
|
+
frontMatterKey: definition.metadata_key,
|
|
212
268
|
};
|
|
213
269
|
}
|
|
214
270
|
return undefined;
|
|
@@ -433,38 +489,6 @@ function parseStatus(value, statusRegistry) {
|
|
|
433
489
|
}
|
|
434
490
|
return normalized;
|
|
435
491
|
}
|
|
436
|
-
function normalizeRiskInput(value) {
|
|
437
|
-
const trimmed = value.trim();
|
|
438
|
-
return trimmed.toLowerCase() === "med" ? "medium" : trimmed;
|
|
439
|
-
}
|
|
440
|
-
function normalizeSeverityInput(value) {
|
|
441
|
-
const trimmed = value.trim();
|
|
442
|
-
return trimmed.toLowerCase() === "med" ? "medium" : trimmed;
|
|
443
|
-
}
|
|
444
|
-
function parseConfidenceInput(value) {
|
|
445
|
-
const trimmed = value.trim().toLowerCase();
|
|
446
|
-
if (trimmed === "med") {
|
|
447
|
-
return "medium";
|
|
448
|
-
}
|
|
449
|
-
if (CONFIDENCE_TEXT_VALUES.includes(trimmed)) {
|
|
450
|
-
return trimmed;
|
|
451
|
-
}
|
|
452
|
-
const parsed = parseOptionalNumber(value, "confidence");
|
|
453
|
-
if (!Number.isInteger(parsed) || parsed < 0 || parsed > 100) {
|
|
454
|
-
throw new PmCliError("Confidence must be an integer 0..100 or one of low|med|medium|high", EXIT_CODE.USAGE);
|
|
455
|
-
}
|
|
456
|
-
return parsed;
|
|
457
|
-
}
|
|
458
|
-
function parseRegressionInput(value) {
|
|
459
|
-
const normalized = value.trim().toLowerCase();
|
|
460
|
-
if (normalized === "true" || normalized === "1") {
|
|
461
|
-
return true;
|
|
462
|
-
}
|
|
463
|
-
if (normalized === "false" || normalized === "0") {
|
|
464
|
-
return false;
|
|
465
|
-
}
|
|
466
|
-
throw new PmCliError("Regression must be one of true|false|1|0", EXIT_CODE.USAGE);
|
|
467
|
-
}
|
|
468
492
|
function weekdayOrderIndex(value) {
|
|
469
493
|
return RECURRENCE_WEEKDAY_VALUES.indexOf(value);
|
|
470
494
|
}
|
|
@@ -554,9 +578,9 @@ function parseRecurrenceRule(kv, startAt, nowValue) {
|
|
|
554
578
|
function parseEventEntries(raw, nowValue) {
|
|
555
579
|
return raw.map((entry) => {
|
|
556
580
|
const kv = parseCsvKv(entry, "--event");
|
|
557
|
-
const startRaw = kv.start?.trim();
|
|
581
|
+
const startRaw = (kv.start ?? kv.date)?.trim();
|
|
558
582
|
if (!startRaw) {
|
|
559
|
-
throw new PmCliError("--event requires start=<iso|relative>", EXIT_CODE.USAGE);
|
|
583
|
+
throw new PmCliError("--event requires start=<iso|relative> or date=<iso|relative>", EXIT_CODE.USAGE);
|
|
560
584
|
}
|
|
561
585
|
const startAt = resolveIsoOrRelative(startRaw, nowValue, "event.start");
|
|
562
586
|
const endRaw = kv.end?.trim();
|
|
@@ -652,17 +676,24 @@ function parseOptionalDependencyString(value) {
|
|
|
652
676
|
const trimmed = value.trim();
|
|
653
677
|
return trimmed.length > 0 ? trimmed : undefined;
|
|
654
678
|
}
|
|
679
|
+
function looksLikeStructuredDependencyEntry(raw) {
|
|
680
|
+
if (raw.startsWith("```") || raw.includes("\n")) {
|
|
681
|
+
return true;
|
|
682
|
+
}
|
|
683
|
+
return /^(?:[-*+]\s+)?(?:id|kind|author|created_at|source_kind)\s*[:=]/i.test(raw);
|
|
684
|
+
}
|
|
655
685
|
function parseDependencyAdditions(raw, prefix, nowIso) {
|
|
656
686
|
if (!raw) {
|
|
657
687
|
return { additions: [] };
|
|
658
688
|
}
|
|
659
689
|
assertNoLegacyNoneTokens(raw, "--dep", "Use --clear-deps to clear dependencies.");
|
|
660
690
|
const additions = raw.map((entry) => {
|
|
661
|
-
const
|
|
691
|
+
const trimmedEntry = entry.trim();
|
|
692
|
+
const kv = looksLikeStructuredDependencyEntry(trimmedEntry) ? parseCsvKv(entry, "--dep") : { id: trimmedEntry, kind: "related" };
|
|
662
693
|
const id = kv.id?.trim();
|
|
663
694
|
const kind = kv.kind?.trim();
|
|
664
695
|
if (!id || !kind) {
|
|
665
|
-
throw new PmCliError("--dep requires id and kind", EXIT_CODE.USAGE);
|
|
696
|
+
throw new PmCliError("--dep requires id and kind, or a bare item id to add a related dependency", EXIT_CODE.USAGE);
|
|
666
697
|
}
|
|
667
698
|
if (id.toLowerCase() === "undefined") {
|
|
668
699
|
throw new PmCliError(`--dep id must not use placeholder token "${id}". Use --clear-deps to clear dependencies.`, EXIT_CODE.USAGE);
|
|
@@ -857,7 +888,7 @@ function enforceUpdateOptionsByType(typeName, options, typeRegistry) {
|
|
|
857
888
|
}
|
|
858
889
|
export async function runUpdate(id, options, global) {
|
|
859
890
|
const stdinResolver = createStdinTokenResolver();
|
|
860
|
-
options = {
|
|
891
|
+
options = normalizeLegacyNoneUpdateOptions({
|
|
861
892
|
...options,
|
|
862
893
|
body: await stdinResolver.resolveValue(options.body, "--body"),
|
|
863
894
|
dep: await stdinResolver.resolveList(options.dep, "--dep"),
|
|
@@ -871,7 +902,7 @@ export async function runUpdate(id, options, global) {
|
|
|
871
902
|
reminder: await stdinResolver.resolveList(options.reminder, "--reminder"),
|
|
872
903
|
event: await stdinResolver.resolveList(options.event, "--event"),
|
|
873
904
|
typeOption: await stdinResolver.resolveList(options.typeOption, "--type-option"),
|
|
874
|
-
};
|
|
905
|
+
});
|
|
875
906
|
const pmRoot = resolvePmRoot(process.cwd(), global.path);
|
|
876
907
|
if (!(await pathExists(getSettingsPath(pmRoot)))) {
|
|
877
908
|
throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);
|
|
@@ -1187,20 +1218,20 @@ export async function runUpdate(id, options, global) {
|
|
|
1187
1218
|
mutate(document) {
|
|
1188
1219
|
const changedFields = [];
|
|
1189
1220
|
const warnings = [];
|
|
1190
|
-
let activeTypeName = resolveTypeName(document.
|
|
1221
|
+
let activeTypeName = resolveTypeName(document.metadata.type, typeRegistry) ?? document.metadata.type;
|
|
1191
1222
|
if (options.title !== undefined) {
|
|
1192
|
-
document.
|
|
1223
|
+
document.metadata.title = options.title;
|
|
1193
1224
|
changedFields.push("title");
|
|
1194
1225
|
}
|
|
1195
1226
|
if (options.description !== undefined) {
|
|
1196
|
-
document.
|
|
1227
|
+
document.metadata.description = options.description;
|
|
1197
1228
|
changedFields.push("description");
|
|
1198
1229
|
}
|
|
1199
1230
|
if (options.body !== undefined) {
|
|
1200
1231
|
document.body = options.body;
|
|
1201
1232
|
changedFields.push("body");
|
|
1202
1233
|
}
|
|
1203
|
-
const previousStatus = document.
|
|
1234
|
+
const previousStatus = document.metadata.status;
|
|
1204
1235
|
const previousStatusNormalized = normalizeStatusInput(previousStatus, statusRegistry) ?? previousStatus;
|
|
1205
1236
|
if (options.status !== undefined) {
|
|
1206
1237
|
const status = parseStatus(options.status, statusRegistry);
|
|
@@ -1218,34 +1249,34 @@ export async function runUpdate(id, options, global) {
|
|
|
1218
1249
|
],
|
|
1219
1250
|
});
|
|
1220
1251
|
}
|
|
1221
|
-
document.
|
|
1252
|
+
document.metadata.status = status;
|
|
1222
1253
|
if (status === statusRegistry.canceled_status) {
|
|
1223
|
-
delete document.
|
|
1254
|
+
delete document.metadata.assignee;
|
|
1224
1255
|
}
|
|
1225
1256
|
changedFields.push("status");
|
|
1226
1257
|
}
|
|
1227
1258
|
if (options.closeReason !== undefined || clearFrontMatterKeys.has("close_reason")) {
|
|
1228
1259
|
if (clearFrontMatterKeys.has("close_reason")) {
|
|
1229
|
-
delete document.
|
|
1260
|
+
delete document.metadata.close_reason;
|
|
1230
1261
|
}
|
|
1231
1262
|
else {
|
|
1232
1263
|
const closeReason = options.closeReason.trim();
|
|
1233
1264
|
if (closeReason.length === 0) {
|
|
1234
1265
|
throw new PmCliError("--close-reason must not be empty", EXIT_CODE.USAGE);
|
|
1235
1266
|
}
|
|
1236
|
-
document.
|
|
1267
|
+
document.metadata.close_reason = closeReason;
|
|
1237
1268
|
}
|
|
1238
1269
|
changedFields.push("close_reason");
|
|
1239
1270
|
}
|
|
1240
1271
|
else if (options.status !== undefined &&
|
|
1241
1272
|
previousStatusNormalized === statusRegistry.close_status &&
|
|
1242
|
-
document.
|
|
1243
|
-
document.
|
|
1244
|
-
delete document.
|
|
1273
|
+
document.metadata.status !== statusRegistry.canceled_status &&
|
|
1274
|
+
document.metadata.close_reason !== undefined) {
|
|
1275
|
+
delete document.metadata.close_reason;
|
|
1245
1276
|
changedFields.push("close_reason");
|
|
1246
1277
|
}
|
|
1247
1278
|
if (options.priority !== undefined) {
|
|
1248
|
-
document.
|
|
1279
|
+
document.metadata.priority = ensurePriority(options.priority);
|
|
1249
1280
|
changedFields.push("priority");
|
|
1250
1281
|
}
|
|
1251
1282
|
if (options.type !== undefined) {
|
|
@@ -1253,14 +1284,14 @@ export async function runUpdate(id, options, global) {
|
|
|
1253
1284
|
if (!resolvedTypeName) {
|
|
1254
1285
|
throw new PmCliError(`Invalid type value "${options.type}". Allowed: ${typeRegistry.types.join(", ")}`, EXIT_CODE.USAGE);
|
|
1255
1286
|
}
|
|
1256
|
-
document.
|
|
1287
|
+
document.metadata.type = resolvedTypeName;
|
|
1257
1288
|
activeTypeName = resolvedTypeName;
|
|
1258
1289
|
changedFields.push("type");
|
|
1259
1290
|
}
|
|
1260
1291
|
enforceUpdateOptionsByType(activeTypeName, options, typeRegistry);
|
|
1261
1292
|
if (options.typeOption !== undefined || clearFrontMatterKeys.has("type_options")) {
|
|
1262
1293
|
if (clearFrontMatterKeys.has("type_options")) {
|
|
1263
|
-
delete document.
|
|
1294
|
+
delete document.metadata.type_options;
|
|
1264
1295
|
}
|
|
1265
1296
|
else {
|
|
1266
1297
|
const parsedTypeOptions = parseTypeOptionEntries(options.typeOption);
|
|
@@ -1268,19 +1299,19 @@ export async function runUpdate(id, options, global) {
|
|
|
1268
1299
|
if (validation.errors.length > 0) {
|
|
1269
1300
|
throw new PmCliError(validation.errors.join("; "), EXIT_CODE.USAGE);
|
|
1270
1301
|
}
|
|
1271
|
-
document.
|
|
1302
|
+
document.metadata.type_options = validation.normalized;
|
|
1272
1303
|
}
|
|
1273
1304
|
changedFields.push("type_options");
|
|
1274
1305
|
}
|
|
1275
|
-
else if (options.type !== undefined && document.
|
|
1276
|
-
const validation = validateTypeOptions(activeTypeName, document.
|
|
1306
|
+
else if (options.type !== undefined && document.metadata.type_options !== undefined) {
|
|
1307
|
+
const validation = validateTypeOptions(activeTypeName, document.metadata.type_options, typeRegistry);
|
|
1277
1308
|
if (validation.errors.length > 0) {
|
|
1278
1309
|
throw new PmCliError(`Current type options are incompatible with type "${activeTypeName}". ${validation.errors.join("; ")}. Use --clear-type-options to clear them.`, EXIT_CODE.USAGE);
|
|
1279
1310
|
}
|
|
1280
|
-
document.
|
|
1311
|
+
document.metadata.type_options = validation.normalized;
|
|
1281
1312
|
}
|
|
1282
1313
|
if (options.dep !== undefined || options.depRemove !== undefined || clearFrontMatterKeys.has("dependencies")) {
|
|
1283
|
-
let nextDependencies = clearFrontMatterKeys.has("dependencies") ? [] : [...(document.
|
|
1314
|
+
let nextDependencies = clearFrontMatterKeys.has("dependencies") ? [] : [...(document.metadata.dependencies ?? [])];
|
|
1284
1315
|
if (dependencyUpdates.additions.length > 0) {
|
|
1285
1316
|
const seen = new Set(nextDependencies.map((entry) => dependencyKey(entry)));
|
|
1286
1317
|
for (const addition of dependencyUpdates.additions) {
|
|
@@ -1296,46 +1327,46 @@ export async function runUpdate(id, options, global) {
|
|
|
1296
1327
|
nextDependencies = nextDependencies.filter((entry) => !dependencyRemovals.some((selector) => matchesDependencySelector(entry, selector)));
|
|
1297
1328
|
}
|
|
1298
1329
|
if (nextDependencies.length === 0) {
|
|
1299
|
-
delete document.
|
|
1330
|
+
delete document.metadata.dependencies;
|
|
1300
1331
|
}
|
|
1301
1332
|
else {
|
|
1302
|
-
document.
|
|
1333
|
+
document.metadata.dependencies = nextDependencies;
|
|
1303
1334
|
}
|
|
1304
1335
|
changedFields.push("dependencies");
|
|
1305
1336
|
}
|
|
1306
1337
|
if (options.comment !== undefined || clearFrontMatterKeys.has("comments")) {
|
|
1307
1338
|
if (clearFrontMatterKeys.has("comments") || !commentUpdates.values || commentUpdates.values.length === 0) {
|
|
1308
|
-
delete document.
|
|
1339
|
+
delete document.metadata.comments;
|
|
1309
1340
|
}
|
|
1310
1341
|
else {
|
|
1311
|
-
document.
|
|
1342
|
+
document.metadata.comments = [...(document.metadata.comments ?? []), ...commentUpdates.values];
|
|
1312
1343
|
}
|
|
1313
1344
|
changedFields.push("comments");
|
|
1314
1345
|
}
|
|
1315
1346
|
if (options.note !== undefined || clearFrontMatterKeys.has("notes")) {
|
|
1316
1347
|
if (clearFrontMatterKeys.has("notes") || !noteUpdates.values || noteUpdates.values.length === 0) {
|
|
1317
|
-
delete document.
|
|
1348
|
+
delete document.metadata.notes;
|
|
1318
1349
|
}
|
|
1319
1350
|
else {
|
|
1320
|
-
document.
|
|
1351
|
+
document.metadata.notes = [...(document.metadata.notes ?? []), ...noteUpdates.values];
|
|
1321
1352
|
}
|
|
1322
1353
|
changedFields.push("notes");
|
|
1323
1354
|
}
|
|
1324
1355
|
if (options.learning !== undefined || clearFrontMatterKeys.has("learnings")) {
|
|
1325
1356
|
if (clearFrontMatterKeys.has("learnings") || !learningUpdates.values || learningUpdates.values.length === 0) {
|
|
1326
|
-
delete document.
|
|
1357
|
+
delete document.metadata.learnings;
|
|
1327
1358
|
}
|
|
1328
1359
|
else {
|
|
1329
|
-
document.
|
|
1360
|
+
document.metadata.learnings = [...(document.metadata.learnings ?? []), ...learningUpdates.values];
|
|
1330
1361
|
}
|
|
1331
1362
|
changedFields.push("learnings");
|
|
1332
1363
|
}
|
|
1333
1364
|
if (options.file !== undefined || clearFrontMatterKeys.has("files")) {
|
|
1334
1365
|
if (clearFrontMatterKeys.has("files") || !fileUpdates.values || fileUpdates.values.length === 0) {
|
|
1335
|
-
delete document.
|
|
1366
|
+
delete document.metadata.files;
|
|
1336
1367
|
}
|
|
1337
1368
|
else {
|
|
1338
|
-
const nextFiles = [...(document.
|
|
1369
|
+
const nextFiles = [...(document.metadata.files ?? [])];
|
|
1339
1370
|
const seen = new Set(nextFiles.map((entry) => fileKey(entry)));
|
|
1340
1371
|
for (const entry of fileUpdates.values) {
|
|
1341
1372
|
const key = fileKey(entry);
|
|
@@ -1345,14 +1376,14 @@ export async function runUpdate(id, options, global) {
|
|
|
1345
1376
|
nextFiles.push(entry);
|
|
1346
1377
|
seen.add(key);
|
|
1347
1378
|
}
|
|
1348
|
-
document.
|
|
1379
|
+
document.metadata.files = nextFiles;
|
|
1349
1380
|
}
|
|
1350
1381
|
changedFields.push("files");
|
|
1351
1382
|
}
|
|
1352
1383
|
if (options.test !== undefined || clearFrontMatterKeys.has("tests")) {
|
|
1353
1384
|
if (clearFrontMatterKeys.has("tests") && options.replaceTests === true) {
|
|
1354
1385
|
if (!testUpdates.values || testUpdates.values.length === 0) {
|
|
1355
|
-
delete document.
|
|
1386
|
+
delete document.metadata.tests;
|
|
1356
1387
|
}
|
|
1357
1388
|
else {
|
|
1358
1389
|
const replacementTests = [];
|
|
@@ -1365,14 +1396,14 @@ export async function runUpdate(id, options, global) {
|
|
|
1365
1396
|
replacementTests.push(entry);
|
|
1366
1397
|
seen.add(key);
|
|
1367
1398
|
}
|
|
1368
|
-
document.
|
|
1399
|
+
document.metadata.tests = replacementTests;
|
|
1369
1400
|
}
|
|
1370
1401
|
}
|
|
1371
1402
|
else if (clearFrontMatterKeys.has("tests") || !testUpdates.values || testUpdates.values.length === 0) {
|
|
1372
|
-
delete document.
|
|
1403
|
+
delete document.metadata.tests;
|
|
1373
1404
|
}
|
|
1374
1405
|
else {
|
|
1375
|
-
const nextTests = [...(document.
|
|
1406
|
+
const nextTests = [...(document.metadata.tests ?? [])];
|
|
1376
1407
|
const seen = new Set(nextTests.map((entry) => testKey(entry)));
|
|
1377
1408
|
for (const entry of testUpdates.values) {
|
|
1378
1409
|
const key = testKey(entry);
|
|
@@ -1382,16 +1413,16 @@ export async function runUpdate(id, options, global) {
|
|
|
1382
1413
|
nextTests.push(entry);
|
|
1383
1414
|
seen.add(key);
|
|
1384
1415
|
}
|
|
1385
|
-
document.
|
|
1416
|
+
document.metadata.tests = nextTests;
|
|
1386
1417
|
}
|
|
1387
1418
|
changedFields.push("tests");
|
|
1388
1419
|
}
|
|
1389
1420
|
if (options.doc !== undefined || clearFrontMatterKeys.has("docs")) {
|
|
1390
1421
|
if (clearFrontMatterKeys.has("docs") || !docUpdates.values || docUpdates.values.length === 0) {
|
|
1391
|
-
delete document.
|
|
1422
|
+
delete document.metadata.docs;
|
|
1392
1423
|
}
|
|
1393
1424
|
else {
|
|
1394
|
-
const nextDocs = [...(document.
|
|
1425
|
+
const nextDocs = [...(document.metadata.docs ?? [])];
|
|
1395
1426
|
const seen = new Set(nextDocs.map((entry) => docKey(entry)));
|
|
1396
1427
|
for (const entry of docUpdates.values) {
|
|
1397
1428
|
const key = docKey(entry);
|
|
@@ -1401,364 +1432,364 @@ export async function runUpdate(id, options, global) {
|
|
|
1401
1432
|
nextDocs.push(entry);
|
|
1402
1433
|
seen.add(key);
|
|
1403
1434
|
}
|
|
1404
|
-
document.
|
|
1435
|
+
document.metadata.docs = nextDocs;
|
|
1405
1436
|
}
|
|
1406
1437
|
changedFields.push("docs");
|
|
1407
1438
|
}
|
|
1408
1439
|
if (options.tags !== undefined || clearFrontMatterKeys.has("tags")) {
|
|
1409
|
-
document.
|
|
1440
|
+
document.metadata.tags = clearFrontMatterKeys.has("tags") ? [] : parseTags(options.tags);
|
|
1410
1441
|
changedFields.push("tags");
|
|
1411
1442
|
}
|
|
1412
1443
|
if (options.deadline !== undefined || clearFrontMatterKeys.has("deadline")) {
|
|
1413
1444
|
if (clearFrontMatterKeys.has("deadline")) {
|
|
1414
|
-
delete document.
|
|
1445
|
+
delete document.metadata.deadline;
|
|
1415
1446
|
}
|
|
1416
1447
|
else {
|
|
1417
|
-
document.
|
|
1448
|
+
document.metadata.deadline = resolveIsoOrRelative(options.deadline, new Date(), "deadline");
|
|
1418
1449
|
}
|
|
1419
1450
|
changedFields.push("deadline");
|
|
1420
1451
|
}
|
|
1421
1452
|
if (options.estimatedMinutes !== undefined || clearFrontMatterKeys.has("estimated_minutes")) {
|
|
1422
1453
|
if (clearFrontMatterKeys.has("estimated_minutes")) {
|
|
1423
|
-
delete document.
|
|
1454
|
+
delete document.metadata.estimated_minutes;
|
|
1424
1455
|
}
|
|
1425
1456
|
else {
|
|
1426
|
-
document.
|
|
1457
|
+
document.metadata.estimated_minutes = parseOptionalNumber(options.estimatedMinutes, "estimated-minutes");
|
|
1427
1458
|
}
|
|
1428
1459
|
changedFields.push("estimated_minutes");
|
|
1429
1460
|
}
|
|
1430
1461
|
if (options.acceptanceCriteria !== undefined || clearFrontMatterKeys.has("acceptance_criteria")) {
|
|
1431
1462
|
if (clearFrontMatterKeys.has("acceptance_criteria")) {
|
|
1432
|
-
delete document.
|
|
1463
|
+
delete document.metadata.acceptance_criteria;
|
|
1433
1464
|
}
|
|
1434
1465
|
else {
|
|
1435
|
-
document.
|
|
1466
|
+
document.metadata.acceptance_criteria = options.acceptanceCriteria;
|
|
1436
1467
|
}
|
|
1437
1468
|
changedFields.push("acceptance_criteria");
|
|
1438
1469
|
}
|
|
1439
1470
|
if (options.definitionOfReady !== undefined || clearFrontMatterKeys.has("definition_of_ready")) {
|
|
1440
1471
|
if (clearFrontMatterKeys.has("definition_of_ready")) {
|
|
1441
|
-
delete document.
|
|
1472
|
+
delete document.metadata.definition_of_ready;
|
|
1442
1473
|
}
|
|
1443
1474
|
else {
|
|
1444
|
-
document.
|
|
1475
|
+
document.metadata.definition_of_ready = options.definitionOfReady.trim();
|
|
1445
1476
|
}
|
|
1446
1477
|
changedFields.push("definition_of_ready");
|
|
1447
1478
|
}
|
|
1448
1479
|
const orderRaw = options.order ?? options.rank;
|
|
1449
1480
|
if (orderRaw !== undefined || clearFrontMatterKeys.has("order")) {
|
|
1450
1481
|
if (clearFrontMatterKeys.has("order")) {
|
|
1451
|
-
delete document.
|
|
1482
|
+
delete document.metadata.order;
|
|
1452
1483
|
}
|
|
1453
1484
|
else {
|
|
1454
1485
|
const parsedOrder = parseOptionalNumber(orderRaw, "order");
|
|
1455
1486
|
if (!Number.isInteger(parsedOrder)) {
|
|
1456
1487
|
throw new PmCliError("Order must be an integer", EXIT_CODE.USAGE);
|
|
1457
1488
|
}
|
|
1458
|
-
document.
|
|
1489
|
+
document.metadata.order = parsedOrder;
|
|
1459
1490
|
}
|
|
1460
1491
|
changedFields.push("order");
|
|
1461
1492
|
}
|
|
1462
1493
|
if (options.goal !== undefined || clearFrontMatterKeys.has("goal")) {
|
|
1463
1494
|
if (clearFrontMatterKeys.has("goal")) {
|
|
1464
|
-
delete document.
|
|
1495
|
+
delete document.metadata.goal;
|
|
1465
1496
|
}
|
|
1466
1497
|
else {
|
|
1467
|
-
document.
|
|
1498
|
+
document.metadata.goal = options.goal.trim();
|
|
1468
1499
|
}
|
|
1469
1500
|
changedFields.push("goal");
|
|
1470
1501
|
}
|
|
1471
1502
|
if (options.objective !== undefined || clearFrontMatterKeys.has("objective")) {
|
|
1472
1503
|
if (clearFrontMatterKeys.has("objective")) {
|
|
1473
|
-
delete document.
|
|
1504
|
+
delete document.metadata.objective;
|
|
1474
1505
|
}
|
|
1475
1506
|
else {
|
|
1476
|
-
document.
|
|
1507
|
+
document.metadata.objective = options.objective.trim();
|
|
1477
1508
|
}
|
|
1478
1509
|
changedFields.push("objective");
|
|
1479
1510
|
}
|
|
1480
1511
|
if (options.value !== undefined || clearFrontMatterKeys.has("value")) {
|
|
1481
1512
|
if (clearFrontMatterKeys.has("value")) {
|
|
1482
|
-
delete document.
|
|
1513
|
+
delete document.metadata.value;
|
|
1483
1514
|
}
|
|
1484
1515
|
else {
|
|
1485
|
-
document.
|
|
1516
|
+
document.metadata.value = options.value.trim();
|
|
1486
1517
|
}
|
|
1487
1518
|
changedFields.push("value");
|
|
1488
1519
|
}
|
|
1489
1520
|
if (options.impact !== undefined || clearFrontMatterKeys.has("impact")) {
|
|
1490
1521
|
if (clearFrontMatterKeys.has("impact")) {
|
|
1491
|
-
delete document.
|
|
1522
|
+
delete document.metadata.impact;
|
|
1492
1523
|
}
|
|
1493
1524
|
else {
|
|
1494
|
-
document.
|
|
1525
|
+
document.metadata.impact = options.impact.trim();
|
|
1495
1526
|
}
|
|
1496
1527
|
changedFields.push("impact");
|
|
1497
1528
|
}
|
|
1498
1529
|
if (options.outcome !== undefined || clearFrontMatterKeys.has("outcome")) {
|
|
1499
1530
|
if (clearFrontMatterKeys.has("outcome")) {
|
|
1500
|
-
delete document.
|
|
1531
|
+
delete document.metadata.outcome;
|
|
1501
1532
|
}
|
|
1502
1533
|
else {
|
|
1503
|
-
document.
|
|
1534
|
+
document.metadata.outcome = options.outcome.trim();
|
|
1504
1535
|
}
|
|
1505
1536
|
changedFields.push("outcome");
|
|
1506
1537
|
}
|
|
1507
1538
|
if (options.whyNow !== undefined || clearFrontMatterKeys.has("why_now")) {
|
|
1508
1539
|
if (clearFrontMatterKeys.has("why_now")) {
|
|
1509
|
-
delete document.
|
|
1540
|
+
delete document.metadata.why_now;
|
|
1510
1541
|
}
|
|
1511
1542
|
else {
|
|
1512
|
-
document.
|
|
1543
|
+
document.metadata.why_now = options.whyNow.trim();
|
|
1513
1544
|
}
|
|
1514
1545
|
changedFields.push("why_now");
|
|
1515
1546
|
}
|
|
1516
1547
|
if (options.assignee !== undefined || clearFrontMatterKeys.has("assignee")) {
|
|
1517
1548
|
if (clearFrontMatterKeys.has("assignee")) {
|
|
1518
|
-
delete document.
|
|
1549
|
+
delete document.metadata.assignee;
|
|
1519
1550
|
}
|
|
1520
1551
|
else {
|
|
1521
1552
|
if (options.assignee.trim() === "") {
|
|
1522
1553
|
throw new PmCliError("--assignee must not be empty. Use --unset assignee to clear it.", EXIT_CODE.USAGE);
|
|
1523
1554
|
}
|
|
1524
|
-
document.
|
|
1555
|
+
document.metadata.assignee = options.assignee.trim();
|
|
1525
1556
|
}
|
|
1526
1557
|
changedFields.push("assignee");
|
|
1527
1558
|
}
|
|
1528
1559
|
if (options.parent !== undefined || clearFrontMatterKeys.has("parent")) {
|
|
1529
1560
|
if (clearFrontMatterKeys.has("parent")) {
|
|
1530
|
-
delete document.
|
|
1561
|
+
delete document.metadata.parent;
|
|
1531
1562
|
}
|
|
1532
1563
|
else {
|
|
1533
|
-
document.
|
|
1564
|
+
document.metadata.parent = resolvedParentValue;
|
|
1534
1565
|
}
|
|
1535
1566
|
changedFields.push("parent");
|
|
1536
1567
|
}
|
|
1537
1568
|
if (options.reviewer !== undefined || clearFrontMatterKeys.has("reviewer")) {
|
|
1538
1569
|
if (clearFrontMatterKeys.has("reviewer")) {
|
|
1539
|
-
delete document.
|
|
1570
|
+
delete document.metadata.reviewer;
|
|
1540
1571
|
}
|
|
1541
1572
|
else {
|
|
1542
|
-
document.
|
|
1573
|
+
document.metadata.reviewer = options.reviewer.trim();
|
|
1543
1574
|
}
|
|
1544
1575
|
changedFields.push("reviewer");
|
|
1545
1576
|
}
|
|
1546
1577
|
if (options.risk !== undefined || clearFrontMatterKeys.has("risk")) {
|
|
1547
1578
|
if (clearFrontMatterKeys.has("risk")) {
|
|
1548
|
-
delete document.
|
|
1579
|
+
delete document.metadata.risk;
|
|
1549
1580
|
}
|
|
1550
1581
|
else {
|
|
1551
|
-
document.
|
|
1582
|
+
document.metadata.risk = ensureEnum(normalizeRiskInput(options.risk), RISK_VALUES, "risk");
|
|
1552
1583
|
}
|
|
1553
1584
|
changedFields.push("risk");
|
|
1554
1585
|
}
|
|
1555
1586
|
if (options.confidence !== undefined || clearFrontMatterKeys.has("confidence")) {
|
|
1556
1587
|
if (clearFrontMatterKeys.has("confidence")) {
|
|
1557
|
-
delete document.
|
|
1588
|
+
delete document.metadata.confidence;
|
|
1558
1589
|
}
|
|
1559
1590
|
else {
|
|
1560
|
-
document.
|
|
1591
|
+
document.metadata.confidence = parseConfidenceInput(options.confidence);
|
|
1561
1592
|
}
|
|
1562
1593
|
changedFields.push("confidence");
|
|
1563
1594
|
}
|
|
1564
1595
|
if (options.sprint !== undefined || clearFrontMatterKeys.has("sprint")) {
|
|
1565
1596
|
if (clearFrontMatterKeys.has("sprint")) {
|
|
1566
|
-
delete document.
|
|
1597
|
+
delete document.metadata.sprint;
|
|
1567
1598
|
}
|
|
1568
1599
|
else {
|
|
1569
1600
|
const sprintValidation = validateSprintOrReleaseValue("sprint", options.sprint, sprintReleasePolicy);
|
|
1570
|
-
document.
|
|
1601
|
+
document.metadata.sprint = sprintValidation.value;
|
|
1571
1602
|
warnings.push(...sprintValidation.warnings);
|
|
1572
1603
|
}
|
|
1573
1604
|
changedFields.push("sprint");
|
|
1574
1605
|
}
|
|
1575
1606
|
if (options.release !== undefined || clearFrontMatterKeys.has("release")) {
|
|
1576
1607
|
if (clearFrontMatterKeys.has("release")) {
|
|
1577
|
-
delete document.
|
|
1608
|
+
delete document.metadata.release;
|
|
1578
1609
|
}
|
|
1579
1610
|
else {
|
|
1580
1611
|
const releaseValidation = validateSprintOrReleaseValue("release", options.release, sprintReleasePolicy);
|
|
1581
|
-
document.
|
|
1612
|
+
document.metadata.release = releaseValidation.value;
|
|
1582
1613
|
warnings.push(...releaseValidation.warnings);
|
|
1583
1614
|
}
|
|
1584
1615
|
changedFields.push("release");
|
|
1585
1616
|
}
|
|
1586
1617
|
if (options.blockedBy !== undefined || clearFrontMatterKeys.has("blocked_by")) {
|
|
1587
1618
|
if (clearFrontMatterKeys.has("blocked_by")) {
|
|
1588
|
-
delete document.
|
|
1619
|
+
delete document.metadata.blocked_by;
|
|
1589
1620
|
}
|
|
1590
1621
|
else {
|
|
1591
|
-
document.
|
|
1622
|
+
document.metadata.blocked_by = options.blockedBy.trim();
|
|
1592
1623
|
}
|
|
1593
1624
|
changedFields.push("blocked_by");
|
|
1594
1625
|
}
|
|
1595
1626
|
if (options.blockedReason !== undefined || clearFrontMatterKeys.has("blocked_reason")) {
|
|
1596
1627
|
if (clearFrontMatterKeys.has("blocked_reason")) {
|
|
1597
|
-
delete document.
|
|
1628
|
+
delete document.metadata.blocked_reason;
|
|
1598
1629
|
}
|
|
1599
1630
|
else {
|
|
1600
|
-
document.
|
|
1631
|
+
document.metadata.blocked_reason = options.blockedReason.trim();
|
|
1601
1632
|
}
|
|
1602
1633
|
changedFields.push("blocked_reason");
|
|
1603
1634
|
}
|
|
1604
1635
|
if (options.unblockNote !== undefined || clearFrontMatterKeys.has("unblock_note")) {
|
|
1605
1636
|
if (clearFrontMatterKeys.has("unblock_note")) {
|
|
1606
|
-
delete document.
|
|
1637
|
+
delete document.metadata.unblock_note;
|
|
1607
1638
|
}
|
|
1608
1639
|
else {
|
|
1609
|
-
document.
|
|
1640
|
+
document.metadata.unblock_note = options.unblockNote.trim();
|
|
1610
1641
|
}
|
|
1611
1642
|
changedFields.push("unblock_note");
|
|
1612
1643
|
}
|
|
1613
1644
|
if (options.reporter !== undefined || clearFrontMatterKeys.has("reporter")) {
|
|
1614
1645
|
if (clearFrontMatterKeys.has("reporter")) {
|
|
1615
|
-
delete document.
|
|
1646
|
+
delete document.metadata.reporter;
|
|
1616
1647
|
}
|
|
1617
1648
|
else {
|
|
1618
|
-
document.
|
|
1649
|
+
document.metadata.reporter = options.reporter.trim();
|
|
1619
1650
|
}
|
|
1620
1651
|
changedFields.push("reporter");
|
|
1621
1652
|
}
|
|
1622
1653
|
if (options.severity !== undefined || clearFrontMatterKeys.has("severity")) {
|
|
1623
1654
|
if (clearFrontMatterKeys.has("severity")) {
|
|
1624
|
-
delete document.
|
|
1655
|
+
delete document.metadata.severity;
|
|
1625
1656
|
}
|
|
1626
1657
|
else {
|
|
1627
|
-
document.
|
|
1658
|
+
document.metadata.severity = ensureEnum(normalizeSeverityInput(options.severity), ISSUE_SEVERITY_VALUES, "severity");
|
|
1628
1659
|
}
|
|
1629
1660
|
changedFields.push("severity");
|
|
1630
1661
|
}
|
|
1631
1662
|
if (options.environment !== undefined || clearFrontMatterKeys.has("environment")) {
|
|
1632
1663
|
if (clearFrontMatterKeys.has("environment")) {
|
|
1633
|
-
delete document.
|
|
1664
|
+
delete document.metadata.environment;
|
|
1634
1665
|
}
|
|
1635
1666
|
else {
|
|
1636
|
-
document.
|
|
1667
|
+
document.metadata.environment = options.environment.trim();
|
|
1637
1668
|
}
|
|
1638
1669
|
changedFields.push("environment");
|
|
1639
1670
|
}
|
|
1640
1671
|
if (options.reproSteps !== undefined || clearFrontMatterKeys.has("repro_steps")) {
|
|
1641
1672
|
if (clearFrontMatterKeys.has("repro_steps")) {
|
|
1642
|
-
delete document.
|
|
1673
|
+
delete document.metadata.repro_steps;
|
|
1643
1674
|
}
|
|
1644
1675
|
else {
|
|
1645
|
-
document.
|
|
1676
|
+
document.metadata.repro_steps = options.reproSteps.trim();
|
|
1646
1677
|
}
|
|
1647
1678
|
changedFields.push("repro_steps");
|
|
1648
1679
|
}
|
|
1649
1680
|
if (options.resolution !== undefined || clearFrontMatterKeys.has("resolution")) {
|
|
1650
1681
|
if (clearFrontMatterKeys.has("resolution")) {
|
|
1651
|
-
delete document.
|
|
1682
|
+
delete document.metadata.resolution;
|
|
1652
1683
|
}
|
|
1653
1684
|
else {
|
|
1654
|
-
document.
|
|
1685
|
+
document.metadata.resolution = options.resolution.trim();
|
|
1655
1686
|
}
|
|
1656
1687
|
changedFields.push("resolution");
|
|
1657
1688
|
}
|
|
1658
1689
|
if (options.expectedResult !== undefined || clearFrontMatterKeys.has("expected_result")) {
|
|
1659
1690
|
if (clearFrontMatterKeys.has("expected_result")) {
|
|
1660
|
-
delete document.
|
|
1691
|
+
delete document.metadata.expected_result;
|
|
1661
1692
|
}
|
|
1662
1693
|
else {
|
|
1663
|
-
document.
|
|
1694
|
+
document.metadata.expected_result = options.expectedResult.trim();
|
|
1664
1695
|
}
|
|
1665
1696
|
changedFields.push("expected_result");
|
|
1666
1697
|
}
|
|
1667
1698
|
if (options.actualResult !== undefined || clearFrontMatterKeys.has("actual_result")) {
|
|
1668
1699
|
if (clearFrontMatterKeys.has("actual_result")) {
|
|
1669
|
-
delete document.
|
|
1700
|
+
delete document.metadata.actual_result;
|
|
1670
1701
|
}
|
|
1671
1702
|
else {
|
|
1672
|
-
document.
|
|
1703
|
+
document.metadata.actual_result = options.actualResult.trim();
|
|
1673
1704
|
}
|
|
1674
1705
|
changedFields.push("actual_result");
|
|
1675
1706
|
}
|
|
1676
1707
|
if (options.affectedVersion !== undefined || clearFrontMatterKeys.has("affected_version")) {
|
|
1677
1708
|
if (clearFrontMatterKeys.has("affected_version")) {
|
|
1678
|
-
delete document.
|
|
1709
|
+
delete document.metadata.affected_version;
|
|
1679
1710
|
}
|
|
1680
1711
|
else {
|
|
1681
|
-
document.
|
|
1712
|
+
document.metadata.affected_version = options.affectedVersion.trim();
|
|
1682
1713
|
}
|
|
1683
1714
|
changedFields.push("affected_version");
|
|
1684
1715
|
}
|
|
1685
1716
|
if (options.fixedVersion !== undefined || clearFrontMatterKeys.has("fixed_version")) {
|
|
1686
1717
|
if (clearFrontMatterKeys.has("fixed_version")) {
|
|
1687
|
-
delete document.
|
|
1718
|
+
delete document.metadata.fixed_version;
|
|
1688
1719
|
}
|
|
1689
1720
|
else {
|
|
1690
|
-
document.
|
|
1721
|
+
document.metadata.fixed_version = options.fixedVersion.trim();
|
|
1691
1722
|
}
|
|
1692
1723
|
changedFields.push("fixed_version");
|
|
1693
1724
|
}
|
|
1694
1725
|
if (options.component !== undefined || clearFrontMatterKeys.has("component")) {
|
|
1695
1726
|
if (clearFrontMatterKeys.has("component")) {
|
|
1696
|
-
delete document.
|
|
1727
|
+
delete document.metadata.component;
|
|
1697
1728
|
}
|
|
1698
1729
|
else {
|
|
1699
|
-
document.
|
|
1730
|
+
document.metadata.component = options.component.trim();
|
|
1700
1731
|
}
|
|
1701
1732
|
changedFields.push("component");
|
|
1702
1733
|
}
|
|
1703
1734
|
if (options.regression !== undefined || clearFrontMatterKeys.has("regression")) {
|
|
1704
1735
|
if (clearFrontMatterKeys.has("regression")) {
|
|
1705
|
-
delete document.
|
|
1736
|
+
delete document.metadata.regression;
|
|
1706
1737
|
}
|
|
1707
1738
|
else {
|
|
1708
|
-
document.
|
|
1739
|
+
document.metadata.regression = parseRegressionInput(options.regression);
|
|
1709
1740
|
}
|
|
1710
1741
|
changedFields.push("regression");
|
|
1711
1742
|
}
|
|
1712
1743
|
if (options.customerImpact !== undefined || clearFrontMatterKeys.has("customer_impact")) {
|
|
1713
1744
|
if (clearFrontMatterKeys.has("customer_impact")) {
|
|
1714
|
-
delete document.
|
|
1745
|
+
delete document.metadata.customer_impact;
|
|
1715
1746
|
}
|
|
1716
1747
|
else {
|
|
1717
|
-
document.
|
|
1748
|
+
document.metadata.customer_impact = options.customerImpact.trim();
|
|
1718
1749
|
}
|
|
1719
1750
|
changedFields.push("customer_impact");
|
|
1720
1751
|
}
|
|
1721
1752
|
if (options.reminder !== undefined || clearFrontMatterKeys.has("reminders")) {
|
|
1722
1753
|
if (clearFrontMatterKeys.has("reminders")) {
|
|
1723
|
-
delete document.
|
|
1754
|
+
delete document.metadata.reminders;
|
|
1724
1755
|
}
|
|
1725
1756
|
else {
|
|
1726
|
-
document.
|
|
1757
|
+
document.metadata.reminders = parseReminderEntries(options.reminder, nowValue);
|
|
1727
1758
|
}
|
|
1728
1759
|
changedFields.push("reminders");
|
|
1729
1760
|
}
|
|
1730
1761
|
if (options.event !== undefined || clearFrontMatterKeys.has("events")) {
|
|
1731
1762
|
if (clearFrontMatterKeys.has("events")) {
|
|
1732
|
-
delete document.
|
|
1763
|
+
delete document.metadata.events;
|
|
1733
1764
|
}
|
|
1734
1765
|
else {
|
|
1735
|
-
document.
|
|
1766
|
+
document.metadata.events = parseEventEntries(options.event, nowValue);
|
|
1736
1767
|
}
|
|
1737
1768
|
changedFields.push("events");
|
|
1738
1769
|
}
|
|
1739
1770
|
for (const definition of runtimeFieldRegistry.definitions) {
|
|
1740
|
-
if (!clearFrontMatterKeys.has(definition.
|
|
1771
|
+
if (!clearFrontMatterKeys.has(definition.metadata_key)) {
|
|
1741
1772
|
continue;
|
|
1742
1773
|
}
|
|
1743
|
-
if (document.
|
|
1774
|
+
if (document.metadata[definition.metadata_key] === undefined) {
|
|
1744
1775
|
continue;
|
|
1745
1776
|
}
|
|
1746
|
-
delete document.
|
|
1747
|
-
changedFields.push(definition.
|
|
1777
|
+
delete document.metadata[definition.metadata_key];
|
|
1778
|
+
changedFields.push(definition.metadata_key);
|
|
1748
1779
|
}
|
|
1749
1780
|
const runtimeFieldUpdates = collectRuntimeUpdateFieldValues(options, runtimeFieldRegistry);
|
|
1750
1781
|
for (const [fieldKey, fieldValue] of Object.entries(runtimeFieldUpdates)) {
|
|
1751
1782
|
if (clearFrontMatterKeys.has(fieldKey)) {
|
|
1752
1783
|
continue;
|
|
1753
1784
|
}
|
|
1754
|
-
if (JSON.stringify(document.
|
|
1785
|
+
if (JSON.stringify(document.metadata[fieldKey]) === JSON.stringify(fieldValue)) {
|
|
1755
1786
|
continue;
|
|
1756
1787
|
}
|
|
1757
|
-
document.
|
|
1788
|
+
document.metadata[fieldKey] = fieldValue;
|
|
1758
1789
|
changedFields.push(fieldKey);
|
|
1759
1790
|
}
|
|
1760
1791
|
try {
|
|
1761
|
-
applyRegisteredItemFieldDefaultsAndValidation(document.
|
|
1792
|
+
applyRegisteredItemFieldDefaultsAndValidation(document.metadata, getActiveExtensionRegistrations());
|
|
1762
1793
|
}
|
|
1763
1794
|
catch (error) {
|
|
1764
1795
|
throw new PmCliError(error instanceof Error ? error.message : "Invalid extension item field values", EXIT_CODE.USAGE);
|