@unbrained/pm-cli 2026.5.18 → 2026.5.24
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/CHANGELOG.md +60 -0
- package/README.md +2 -1
- package/dist/cli/commander-usage.js +16 -2
- package/dist/cli/commander-usage.js.map +1 -1
- package/dist/cli/commands/annotation-command.d.ts +49 -0
- package/dist/cli/commands/annotation-command.js +135 -0
- package/dist/cli/commands/annotation-command.js.map +1 -0
- package/dist/cli/commands/append.js +3 -7
- package/dist/cli/commands/append.js.map +1 -1
- package/dist/cli/commands/calendar.js +3 -6
- package/dist/cli/commands/calendar.js.map +1 -1
- package/dist/cli/commands/claim.js +12 -22
- package/dist/cli/commands/claim.js.map +1 -1
- package/dist/cli/commands/close.js +61 -9
- package/dist/cli/commands/close.js.map +1 -1
- package/dist/cli/commands/comments.d.ts +5 -0
- package/dist/cli/commands/comments.js +27 -117
- package/dist/cli/commands/comments.js.map +1 -1
- package/dist/cli/commands/completion.js +102 -15
- package/dist/cli/commands/completion.js.map +1 -1
- package/dist/cli/commands/context.js +4 -10
- package/dist/cli/commands/context.js.map +1 -1
- package/dist/cli/commands/contracts.js +168 -36
- package/dist/cli/commands/contracts.js.map +1 -1
- package/dist/cli/commands/create.js +49 -44
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/dedupe-audit.js +7 -4
- package/dist/cli/commands/dedupe-audit.js.map +1 -1
- package/dist/cli/commands/delete.d.ts +3 -0
- package/dist/cli/commands/delete.js +9 -8
- package/dist/cli/commands/delete.js.map +1 -1
- package/dist/cli/commands/docs.d.ts +1 -0
- package/dist/cli/commands/docs.js +4 -8
- package/dist/cli/commands/docs.js.map +1 -1
- package/dist/cli/commands/event-validation-messages.d.ts +3 -0
- package/dist/cli/commands/event-validation-messages.js +44 -0
- package/dist/cli/commands/event-validation-messages.js.map +1 -0
- package/dist/cli/commands/extension.d.ts +1 -0
- package/dist/cli/commands/extension.js +138 -21
- package/dist/cli/commands/extension.js.map +1 -1
- package/dist/cli/commands/files.js +6 -13
- package/dist/cli/commands/files.js.map +1 -1
- package/dist/cli/commands/gc.js +17 -4
- package/dist/cli/commands/gc.js.map +1 -1
- package/dist/cli/commands/get.d.ts +3 -2
- package/dist/cli/commands/get.js +50 -8
- package/dist/cli/commands/get.js.map +1 -1
- package/dist/cli/commands/health.d.ts +10 -0
- package/dist/cli/commands/health.js +254 -75
- package/dist/cli/commands/health.js.map +1 -1
- package/dist/cli/commands/history-redact.d.ts +8 -0
- package/dist/cli/commands/history-redact.js +14 -97
- package/dist/cli/commands/history-redact.js.map +1 -1
- package/dist/cli/commands/history-repair.d.ts +33 -0
- package/dist/cli/commands/history-repair.js +166 -0
- package/dist/cli/commands/history-repair.js.map +1 -0
- package/dist/cli/commands/history.d.ts +4 -4
- package/dist/cli/commands/history.js +10 -88
- package/dist/cli/commands/history.js.map +1 -1
- package/dist/cli/commands/index.d.ts +3 -1
- package/dist/cli/commands/index.js +5 -3
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.d.ts +28 -0
- package/dist/cli/commands/init.js +23 -2
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/learnings.js +20 -119
- package/dist/cli/commands/learnings.js.map +1 -1
- package/dist/cli/commands/linked-test-entry.d.ts +3 -0
- package/dist/cli/commands/linked-test-entry.js +62 -0
- package/dist/cli/commands/linked-test-entry.js.map +1 -0
- package/dist/cli/commands/list.js +32 -22
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/notes.js +20 -119
- package/dist/cli/commands/notes.js.map +1 -1
- package/dist/cli/commands/plan.d.ts +3 -0
- package/dist/cli/commands/plan.js +184 -22
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/restore.js +7 -50
- package/dist/cli/commands/restore.js.map +1 -1
- package/dist/cli/commands/schema.d.ts +31 -0
- package/dist/cli/commands/schema.js +98 -0
- package/dist/cli/commands/schema.js.map +1 -0
- package/dist/cli/commands/search.js +151 -40
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/templates.d.ts +4 -0
- package/dist/cli/commands/templates.js +89 -17
- package/dist/cli/commands/templates.js.map +1 -1
- package/dist/cli/commands/test-all.js +4 -8
- 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 +7 -10
- package/dist/cli/commands/test.js.map +1 -1
- package/dist/cli/commands/update-many.js +4 -8
- package/dist/cli/commands/update-many.js.map +1 -1
- package/dist/cli/commands/update.js +109 -51
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/commands/validate.d.ts +3 -1
- package/dist/cli/commands/validate.js +23 -71
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/error-guidance.js +96 -6
- package/dist/cli/error-guidance.js.map +1 -1
- package/dist/cli/extension-command-help.d.ts +0 -1
- package/dist/cli/extension-command-help.js +2 -13
- package/dist/cli/extension-command-help.js.map +1 -1
- package/dist/cli/extension-command-options.d.ts +1 -0
- package/dist/cli/extension-command-options.js +106 -7
- package/dist/cli/extension-command-options.js.map +1 -1
- package/dist/cli/help-content.d.ts +0 -1
- package/dist/cli/help-content.js +13 -9
- package/dist/cli/help-content.js.map +1 -1
- package/dist/cli/help-json-payload.d.ts +1 -0
- package/dist/cli/help-json-payload.js +33 -3
- package/dist/cli/help-json-payload.js.map +1 -1
- package/dist/cli/main.js +35 -29
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/register-list-query.d.ts +1 -1
- package/dist/cli/register-list-query.js +40 -17
- package/dist/cli/register-list-query.js.map +1 -1
- package/dist/cli/register-mutation.d.ts +1 -1
- package/dist/cli/register-mutation.js +232 -64
- package/dist/cli/register-mutation.js.map +1 -1
- package/dist/cli/register-operations.js +16 -11
- package/dist/cli/register-operations.js.map +1 -1
- package/dist/cli/register-setup.js +26 -14
- package/dist/cli/register-setup.js.map +1 -1
- package/dist/cli/registration-helpers.d.ts +0 -2
- package/dist/cli/registration-helpers.js +13 -40
- package/dist/cli/registration-helpers.js.map +1 -1
- package/dist/cli.js +23 -3
- package/dist/cli.js.map +1 -1
- package/dist/core/extensions/index.d.ts +0 -1
- package/dist/core/extensions/index.js +2 -14
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.js +3 -9
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/fs/path-utils.d.ts +1 -0
- package/dist/core/fs/path-utils.js +12 -0
- package/dist/core/fs/path-utils.js.map +1 -0
- package/dist/core/history/drift-scan.d.ts +11 -0
- package/dist/core/history/drift-scan.js +67 -0
- package/dist/core/history/drift-scan.js.map +1 -0
- package/dist/core/history/replay.d.ts +82 -0
- package/dist/core/history/replay.js +249 -0
- package/dist/core/history/replay.js.map +1 -0
- package/dist/core/item/item-format.js +11 -8
- package/dist/core/item/item-format.js.map +1 -1
- package/dist/core/item/item-type-definition.d.ts +52 -0
- package/dist/core/item/item-type-definition.js +123 -0
- package/dist/core/item/item-type-definition.js.map +1 -0
- package/dist/core/item/parse.js +3 -2
- package/dist/core/item/parse.js.map +1 -1
- package/dist/core/item/priority.d.ts +23 -0
- package/dist/core/item/priority.js +55 -0
- package/dist/core/item/priority.js.map +1 -0
- package/dist/core/item/status.d.ts +14 -1
- package/dist/core/item/status.js +22 -2
- package/dist/core/item/status.js.map +1 -1
- package/dist/core/item/toon-decode.d.ts +19 -0
- package/dist/core/item/toon-decode.js +69 -0
- package/dist/core/item/toon-decode.js.map +1 -0
- package/dist/core/item/type-registry.js +13 -84
- package/dist/core/item/type-registry.js.map +1 -1
- package/dist/core/packages/manifest.js +3 -9
- package/dist/core/packages/manifest.js.map +1 -1
- package/dist/core/schema/item-types-file.d.ts +85 -0
- package/dist/core/schema/item-types-file.js +243 -0
- package/dist/core/schema/item-types-file.js.map +1 -0
- package/dist/core/schema/runtime-schema.d.ts +2 -1
- package/dist/core/schema/runtime-schema.js +11 -9
- package/dist/core/schema/runtime-schema.js.map +1 -1
- package/dist/core/search/semantic-defaults.js +3 -3
- package/dist/core/search/semantic-defaults.js.map +1 -1
- package/dist/core/shared/author.d.ts +1 -0
- package/dist/core/shared/author.js +9 -0
- package/dist/core/shared/author.js.map +1 -0
- package/dist/core/shared/lazy-module.d.ts +1 -0
- package/dist/core/shared/lazy-module.js +11 -0
- package/dist/core/shared/lazy-module.js.map +1 -0
- package/dist/core/shared/option-alias-visibility.d.ts +44 -0
- package/dist/core/shared/option-alias-visibility.js +76 -0
- package/dist/core/shared/option-alias-visibility.js.map +1 -0
- package/dist/core/shared/text-normalization.d.ts +0 -1
- package/dist/core/shared/text-normalization.js +2 -5
- package/dist/core/shared/text-normalization.js.map +1 -1
- package/dist/core/store/item-store.d.ts +2 -0
- package/dist/core/store/item-store.js +70 -39
- package/dist/core/store/item-store.js.map +1 -1
- package/dist/core/store/settings-validator.d.ts +106 -0
- package/dist/core/store/settings-validator.js +279 -0
- package/dist/core/store/settings-validator.js.map +1 -0
- package/dist/core/store/settings.js +6 -343
- package/dist/core/store/settings.js.map +1 -1
- package/dist/core/telemetry/runtime.js +5 -3
- package/dist/core/telemetry/runtime.js.map +1 -1
- package/dist/mcp/server.js +64 -13
- package/dist/mcp/server.js.map +1 -1
- package/dist/sdk/cli-contracts.d.ts +9 -2
- package/dist/sdk/cli-contracts.js +204 -13
- package/dist/sdk/cli-contracts.js.map +1 -1
- package/dist/sdk/runtime.d.ts +25 -1
- package/dist/sdk/runtime.js +46 -3
- package/dist/sdk/runtime.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.js +10 -2
- package/dist/types.js.map +1 -1
- package/docs/AGENT_GUIDE.md +7 -1
- package/docs/ARCHITECTURE.md +1 -1
- package/docs/COMMANDS.md +39 -6
- package/docs/CONFIGURATION.md +1 -1
- package/docs/RELEASING.md +11 -7
- package/docs/SDK.md +11 -2
- package/package.json +12 -11
- package/packages/pm-calendar/README.md +3 -1
- package/packages/pm-calendar/extensions/calendar/index.js +21 -2
- package/packages/pm-calendar/extensions/calendar/index.ts +21 -2
- package/packages/pm-search-advanced/README.md +8 -0
- package/packages/pm-search-advanced/extensions/search-advanced/index.js +74 -0
- package/packages/pm-search-advanced/extensions/search-advanced/index.ts +74 -0
- package/packages/pm-search-advanced/extensions/search-advanced/runtime.js +67 -9
- package/packages/pm-search-advanced/extensions/search-advanced/runtime.ts +67 -9
- package/packages/pm-templates/extensions/templates/runtime.js +11 -202
- package/packages/pm-templates/extensions/templates/runtime.ts +38 -230
- package/dist/core/output/command-aware.d.ts +0 -1
- package/dist/core/output/command-aware.js +0 -397
- package/dist/core/output/command-aware.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="8ea74fa3-b9ec-5721-b7f4-3c521108d000")}catch(e){}}();
|
|
3
3
|
import { mkdir, readFile } from "node:fs/promises";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import { pathExists, writeFileAtomic } from "../../core/fs/fs-utils.js";
|
|
@@ -11,6 +11,7 @@ import { toErrorMessage } from "../../core/shared/primitives.js";
|
|
|
11
11
|
import { nowIso } from "../../core/shared/time.js";
|
|
12
12
|
import { getSettingsPath, resolvePmRoot } from "../../core/store/paths.js";
|
|
13
13
|
import { readSettings } from "../../core/store/settings.js";
|
|
14
|
+
import { resolveAuthor } from "../../core/shared/author.js";
|
|
14
15
|
import { runList } from "./list.js";
|
|
15
16
|
import { runRestore } from "./restore.js";
|
|
16
17
|
import { runUpdate } from "./update.js";
|
|
@@ -386,11 +387,6 @@ function hasListFilters(list, status) {
|
|
|
386
387
|
list.limit !== undefined ||
|
|
387
388
|
list.offset !== undefined);
|
|
388
389
|
}
|
|
389
|
-
function resolveCheckpointAuthor(update) {
|
|
390
|
-
const candidate = update.author ?? process.env.PM_AUTHOR ?? "unknown";
|
|
391
|
-
const normalized = candidate.trim();
|
|
392
|
-
return normalized.length > 0 ? normalized : "unknown";
|
|
393
|
-
}
|
|
394
390
|
function ensureCheckpointShape(value, checkpointId) {
|
|
395
391
|
if (!value || typeof value !== "object") {
|
|
396
392
|
throw new PmCliError(`Checkpoint ${checkpointId} is invalid`, EXIT_CODE.GENERIC_FAILURE);
|
|
@@ -561,7 +557,7 @@ export async function runUpdateMany(options, global) {
|
|
|
561
557
|
schema_version: UPDATE_MANY_CHECKPOINT_SCHEMA_VERSION,
|
|
562
558
|
id: checkpointId,
|
|
563
559
|
created_at: nowValue,
|
|
564
|
-
author:
|
|
560
|
+
author: resolveAuthor(options.update.author, "unknown"),
|
|
565
561
|
status_filter: statusFilter ?? null,
|
|
566
562
|
list_filters: listed.filters,
|
|
567
563
|
update_options: updateSummary,
|
|
@@ -626,4 +622,4 @@ export async function runUpdateMany(options, global) {
|
|
|
626
622
|
};
|
|
627
623
|
}
|
|
628
624
|
//# sourceMappingURL=update-many.js.map
|
|
629
|
-
//# debugId=
|
|
625
|
+
//# debugId=8ea74fa3-b9ec-5721-b7f4-3c521108d000
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-many.js","sources":["cli/commands/update-many.ts"],"sourceRoot":"/","sourcesContent":["import { mkdir, readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { pathExists, writeFileAtomic } from \"../../core/fs/fs-utils.js\";\nimport { normalizeStatusInput } from \"../../core/item/status.js\";\nimport { resolveRuntimeStatusRegistry, type RuntimeStatusRegistry } from \"../../core/schema/runtime-schema.js\";\nimport { EXIT_CODE } from \"../../core/shared/constants.js\";\nimport type { GlobalOptions } from \"../../core/shared/command-types.js\";\nimport { PmCliError } from \"../../core/shared/errors.js\";\nimport { toErrorMessage } from \"../../core/shared/primitives.js\";\nimport { nowIso } from \"../../core/shared/time.js\";\nimport { getSettingsPath, resolvePmRoot } from \"../../core/store/paths.js\";\nimport { readSettings } from \"../../core/store/settings.js\";\nimport type { ItemStatus } from \"../../types/index.js\";\nimport { runList, type ListOptions, type ListedItem } from \"./list.js\";\nimport { runRestore } from \"./restore.js\";\nimport { runUpdate, type UpdateCommandOptions } from \"./update.js\";\n\nconst UPDATE_MANY_CHECKPOINT_SCHEMA_VERSION = 1;\nconst UPDATE_MANY_CHECKPOINT_DIRECTORY = [\"checkpoints\", \"update-many\"] as const;\n\nconst NON_MUTATION_UPDATE_OPTION_KEYS = new Set<keyof UpdateCommandOptions>([\n \"author\",\n \"message\",\n \"force\",\n \"allowAuditUpdate\",\n \"allowAuditDepUpdate\",\n]);\n\nconst UPDATE_MANY_MUTATION_FLAG_GUIDANCE = [\n \"--status\",\n \"--priority\",\n \"--type\",\n \"--tags\",\n \"--description\",\n \"--body\",\n \"--deadline\",\n \"--estimate\",\n \"--assignee\",\n \"--dep\",\n \"--dep-remove\",\n \"--comment\",\n \"--note\",\n \"--learning\",\n \"--file\",\n \"--test\",\n \"--doc\",\n \"--replace-deps\",\n \"--replace-tests\",\n \"--unset\",\n \"--clear-*\",\n].join(\", \");\n\nconst UPDATE_OPTION_TO_ITEM_KEY: Partial<Record<keyof UpdateCommandOptions, string>> = {\n title: \"title\",\n description: \"description\",\n body: \"body\",\n status: \"status\",\n closeReason: \"close_reason\",\n priority: \"priority\",\n type: \"type\",\n tags: \"tags\",\n deadline: \"deadline\",\n estimatedMinutes: \"estimated_minutes\",\n acceptanceCriteria: \"acceptance_criteria\",\n definitionOfReady: \"definition_of_ready\",\n order: \"order\",\n goal: \"goal\",\n objective: \"objective\",\n value: \"value\",\n impact: \"impact\",\n outcome: \"outcome\",\n whyNow: \"why_now\",\n assignee: \"assignee\",\n parent: \"parent\",\n reviewer: \"reviewer\",\n risk: \"risk\",\n confidence: \"confidence\",\n sprint: \"sprint\",\n release: \"release\",\n blockedBy: \"blocked_by\",\n blockedReason: \"blocked_reason\",\n unblockNote: \"unblock_note\",\n reporter: \"reporter\",\n severity: \"severity\",\n environment: \"environment\",\n reproSteps: \"repro_steps\",\n resolution: \"resolution\",\n expectedResult: \"expected_result\",\n actualResult: \"actual_result\",\n affectedVersion: \"affected_version\",\n fixedVersion: \"fixed_version\",\n component: \"component\",\n regression: \"regression\",\n customerImpact: \"customer_impact\",\n};\n\ninterface CollectionMutationPlanDefinition {\n field: string;\n addKey?: keyof UpdateCommandOptions;\n removeKey?: keyof UpdateCommandOptions;\n clearKey?: keyof UpdateCommandOptions;\n replaceKey?: keyof UpdateCommandOptions;\n}\n\nconst COLLECTION_MUTATION_PLAN_DEFINITIONS: CollectionMutationPlanDefinition[] = [\n {\n field: \"dependencies\",\n addKey: \"dep\",\n removeKey: \"depRemove\",\n clearKey: \"clearDeps\",\n replaceKey: \"replaceDeps\",\n },\n {\n field: \"comments\",\n addKey: \"comment\",\n clearKey: \"clearComments\",\n },\n {\n field: \"notes\",\n addKey: \"note\",\n clearKey: \"clearNotes\",\n },\n {\n field: \"learnings\",\n addKey: \"learning\",\n clearKey: \"clearLearnings\",\n },\n {\n field: \"files\",\n addKey: \"file\",\n clearKey: \"clearFiles\",\n },\n {\n field: \"tests\",\n addKey: \"test\",\n clearKey: \"clearTests\",\n replaceKey: \"replaceTests\",\n },\n {\n field: \"docs\",\n addKey: \"doc\",\n clearKey: \"clearDocs\",\n },\n {\n field: \"reminders\",\n addKey: \"reminder\",\n clearKey: \"clearReminders\",\n },\n {\n field: \"events\",\n addKey: \"event\",\n clearKey: \"clearEvents\",\n },\n {\n field: \"type_options\",\n addKey: \"typeOption\",\n clearKey: \"clearTypeOptions\",\n },\n];\n\nconst UNSET_FIELD_ALIASES: Record<string, string> = {\n close_reason: \"close_reason\",\n \"close-reason\": \"close_reason\",\n deadline: \"deadline\",\n estimate: \"estimated_minutes\",\n estimated_minutes: \"estimated_minutes\",\n \"estimated-minutes\": \"estimated_minutes\",\n acceptance_criteria: \"acceptance_criteria\",\n \"acceptance-criteria\": \"acceptance_criteria\",\n ac: \"acceptance_criteria\",\n definition_of_ready: \"definition_of_ready\",\n \"definition-of-ready\": \"definition_of_ready\",\n order: \"order\",\n rank: \"order\",\n goal: \"goal\",\n objective: \"objective\",\n value: \"value\",\n impact: \"impact\",\n outcome: \"outcome\",\n why_now: \"why_now\",\n \"why-now\": \"why_now\",\n assignee: \"assignee\",\n parent: \"parent\",\n reviewer: \"reviewer\",\n risk: \"risk\",\n confidence: \"confidence\",\n sprint: \"sprint\",\n release: \"release\",\n blocked_by: \"blocked_by\",\n \"blocked-by\": \"blocked_by\",\n blocked_reason: \"blocked_reason\",\n \"blocked-reason\": \"blocked_reason\",\n unblock_note: \"unblock_note\",\n \"unblock-note\": \"unblock_note\",\n reporter: \"reporter\",\n severity: \"severity\",\n environment: \"environment\",\n repro_steps: \"repro_steps\",\n \"repro-steps\": \"repro_steps\",\n resolution: \"resolution\",\n expected_result: \"expected_result\",\n \"expected-result\": \"expected_result\",\n actual_result: \"actual_result\",\n \"actual-result\": \"actual_result\",\n affected_version: \"affected_version\",\n \"affected-version\": \"affected_version\",\n fixed_version: \"fixed_version\",\n \"fixed-version\": \"fixed_version\",\n component: \"component\",\n regression: \"regression\",\n customer_impact: \"customer_impact\",\n \"customer-impact\": \"customer_impact\",\n type_options: \"type_options\",\n \"type-options\": \"type_options\",\n tags: \"tags\",\n};\n\ninterface UpdateManyCheckpointItem {\n id: string;\n target_updated_at: string;\n}\n\ninterface UpdateManyCheckpoint {\n schema_version: number;\n id: string;\n created_at: string;\n author: string;\n status_filter: string | null;\n list_filters: Record<string, unknown>;\n update_options: Record<string, unknown>;\n items: UpdateManyCheckpointItem[];\n}\n\nexport interface UpdateManyCommandOptions {\n status?: string;\n list: ListOptions;\n update: UpdateCommandOptions;\n dryRun?: boolean;\n rollback?: string;\n checkpoint?: boolean;\n}\n\ninterface PlannedChange {\n field: string;\n before: unknown;\n after: unknown;\n}\n\ninterface PlannedItemDiff {\n id: string;\n changes: PlannedChange[];\n}\n\ninterface UpdateManyApplyResultRow {\n id: string;\n status: \"updated\" | \"failed\" | \"skipped\";\n changed_fields?: string[];\n warnings?: string[];\n error?: string;\n}\n\ninterface UpdateManyRollbackResultRow {\n id: string;\n status: \"restored\" | \"failed\";\n changed_fields?: string[];\n warnings?: string[];\n error?: string;\n}\n\nexport interface UpdateManyResult {\n mode: \"dry_run\" | \"apply\" | \"rollback\";\n matched_count: number;\n dry_run: boolean;\n filters?: Record<string, unknown>;\n planned_update_options?: Record<string, unknown>;\n item_plans?: PlannedItemDiff[];\n checkpoint?: {\n id: string;\n created_at: string;\n path: string;\n rollback_command: string;\n };\n updated_count?: number;\n skipped_count?: number;\n failed_count?: number;\n restored_count?: number;\n rollback_checkpoint_id?: string;\n rows?: UpdateManyApplyResultRow[] | UpdateManyRollbackResultRow[];\n ids: string[];\n}\n\nfunction normalizeCheckpointId(raw: string): string {\n const trimmed = raw.trim();\n if (!trimmed) {\n throw new PmCliError(\"--rollback requires a non-empty checkpoint ID\", EXIT_CODE.USAGE);\n }\n if (!/^[a-zA-Z0-9._-]+$/.test(trimmed)) {\n throw new PmCliError(\"--rollback checkpoint ID must match [a-zA-Z0-9._-]+\", EXIT_CODE.USAGE);\n }\n return trimmed;\n}\n\nfunction sanitizeUpdateOptionsForSummary(options: UpdateCommandOptions): Record<string, unknown> {\n const summary: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(options) as Array<[keyof UpdateCommandOptions, unknown]>) {\n if (NON_MUTATION_UPDATE_OPTION_KEYS.has(key)) {\n continue;\n }\n if (value === undefined) {\n continue;\n }\n summary[key] = value;\n }\n return summary;\n}\n\nfunction hasAnyUpdateMutationInput(options: UpdateCommandOptions): boolean {\n return Object.keys(sanitizeUpdateOptionsForSummary(options)).length > 0;\n}\n\nfunction toComparablePreviewValue(optionKey: keyof UpdateCommandOptions, value: unknown): unknown {\n if (value === undefined) {\n return undefined;\n }\n if (optionKey === \"priority\") {\n const parsed = Number(String(value).trim());\n return Number.isInteger(parsed) ? parsed : String(value).trim();\n }\n if (optionKey === \"estimatedMinutes\" || optionKey === \"order\" || optionKey === \"rank\") {\n const parsed = Number(String(value).trim());\n return Number.isFinite(parsed) ? parsed : String(value).trim();\n }\n if (optionKey === \"tags\") {\n return [...new Set(String(value).split(\",\").map((entry) => entry.trim()).filter((entry) => entry.length > 0))].sort((a, b) =>\n a.localeCompare(b),\n );\n }\n if (optionKey === \"regression\") {\n const normalized = String(value).trim().toLowerCase();\n if (normalized === \"true\" || normalized === \"1\") {\n return true;\n }\n if (normalized === \"false\" || normalized === \"0\") {\n return false;\n }\n }\n if (typeof value === \"string\") {\n return value.trim();\n }\n return value;\n}\n\nfunction normalizeUnsetField(rawField: string): string {\n const normalized = rawField.trim().toLowerCase().replaceAll(\"-\", \"_\");\n return UNSET_FIELD_ALIASES[normalized] ?? normalized;\n}\n\nfunction areValuesEqual(left: unknown, right: unknown): boolean {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction normalizeCollectionBeforeValue(field: string, value: unknown): unknown {\n if (value !== undefined) {\n return value;\n }\n if (field === \"type_options\") {\n return {};\n }\n return [];\n}\n\nfunction collectionValueCount(field: string, value: unknown): number {\n if (Array.isArray(value)) {\n return value.length;\n }\n if (field === \"type_options\" && value && typeof value === \"object\") {\n return Object.keys(value as Record<string, unknown>).length;\n }\n return 0;\n}\n\nfunction buildCollectionMutationPlans(row: Record<string, unknown>, update: UpdateCommandOptions): PlannedChange[] {\n const changes: PlannedChange[] = [];\n for (const definition of COLLECTION_MUTATION_PLAN_DEFINITIONS) {\n const addValues = definition.addKey ? update[definition.addKey] : undefined;\n const removeValues = definition.removeKey ? update[definition.removeKey] : undefined;\n const addCount = Array.isArray(addValues) ? addValues.length : 0;\n const removeCount = Array.isArray(removeValues) ? removeValues.length : 0;\n const clear = definition.clearKey ? update[definition.clearKey] === true : false;\n const replace = definition.replaceKey ? update[definition.replaceKey] === true : false;\n if (!clear && !replace && addCount === 0 && removeCount === 0) {\n continue;\n }\n\n const before = normalizeCollectionBeforeValue(definition.field, row[definition.field]);\n const beforeCount = collectionValueCount(definition.field, before);\n const operation = replace ? \"replace\" : clear ? \"clear_or_reset\" : removeCount > 0 ? \"merge_remove\" : \"append\";\n changes.push({\n field: definition.field,\n before,\n after: {\n operation,\n clear,\n replace,\n add_count: addCount,\n remove_count: removeCount,\n before_count: beforeCount,\n },\n });\n }\n return changes;\n}\n\nfunction buildPlannedItemDiff(item: ListedItem, update: UpdateCommandOptions): PlannedItemDiff {\n const row = item as unknown as Record<string, unknown>;\n const changes: PlannedChange[] = [];\n for (const [optionKey, itemKey] of Object.entries(UPDATE_OPTION_TO_ITEM_KEY) as Array<[keyof UpdateCommandOptions, string]>) {\n const candidate = update[optionKey];\n if (candidate === undefined) {\n continue;\n }\n const before = row[itemKey];\n const after = toComparablePreviewValue(optionKey, candidate);\n if (areValuesEqual(before, after)) {\n continue;\n }\n changes.push({\n field: itemKey,\n before,\n after,\n });\n }\n changes.push(...buildCollectionMutationPlans(row, update));\n\n if (update.unset && update.unset.length > 0) {\n for (const rawUnsetField of update.unset) {\n const field = normalizeUnsetField(rawUnsetField);\n const before = row[field];\n if (before === undefined) {\n continue;\n }\n changes.push({\n field,\n before,\n after: null,\n });\n }\n }\n\n return {\n id: item.id,\n changes,\n };\n}\n\nfunction createCheckpointId(nowValue: string): string {\n const compactTimestamp = nowValue.replace(/[-:.TZ]/g, \"\").slice(0, 14);\n const randomSuffix = Math.random().toString(36).slice(2, 8);\n return `update-many-${compactTimestamp}-${randomSuffix}`;\n}\n\nfunction checkpointDirectoryPath(pmRoot: string): string {\n return path.join(pmRoot, ...UPDATE_MANY_CHECKPOINT_DIRECTORY);\n}\n\nfunction checkpointFilePath(pmRoot: string, checkpointId: string): string {\n return path.join(checkpointDirectoryPath(pmRoot), `${checkpointId}.json`);\n}\n\nfunction normalizeStatusFilter(value: string | undefined, statusRegistry: RuntimeStatusRegistry): ItemStatus | undefined {\n if (value === undefined) {\n return undefined;\n }\n const normalized = normalizeStatusInput(value, statusRegistry);\n if (!normalized) {\n const allowedStatuses = statusRegistry.definitions.map((definition) => definition.id);\n throw new PmCliError(\n `Invalid --filter-status value \"${value}\". Allowed: ${allowedStatuses.join(\", \")}`,\n EXIT_CODE.USAGE,\n );\n }\n return normalized;\n}\n\nfunction hasListFilters(list: ListOptions, status: string | undefined): boolean {\n return (\n status !== undefined ||\n list.type !== undefined ||\n list.tag !== undefined ||\n list.priority !== undefined ||\n list.deadlineBefore !== undefined ||\n list.deadlineAfter !== undefined ||\n list.assignee !== undefined ||\n list.assigneeFilter !== undefined ||\n list.parent !== undefined ||\n list.sprint !== undefined ||\n list.release !== undefined ||\n list.limit !== undefined ||\n list.offset !== undefined\n );\n}\n\n\nfunction resolveCheckpointAuthor(update: UpdateCommandOptions): string {\n const candidate = update.author ?? process.env.PM_AUTHOR ?? \"unknown\";\n const normalized = candidate.trim();\n return normalized.length > 0 ? normalized : \"unknown\";\n}\n\nfunction ensureCheckpointShape(value: unknown, checkpointId: string): UpdateManyCheckpoint {\n if (!value || typeof value !== \"object\") {\n throw new PmCliError(`Checkpoint ${checkpointId} is invalid`, EXIT_CODE.GENERIC_FAILURE);\n }\n const record = value as Record<string, unknown>;\n if (record.schema_version !== UPDATE_MANY_CHECKPOINT_SCHEMA_VERSION) {\n throw new PmCliError(`Checkpoint ${checkpointId} has unsupported schema version`, EXIT_CODE.GENERIC_FAILURE);\n }\n if (!Array.isArray(record.items)) {\n throw new PmCliError(`Checkpoint ${checkpointId} is missing items`, EXIT_CODE.GENERIC_FAILURE);\n }\n const items = record.items.map((entry) => {\n if (!entry || typeof entry !== \"object\") {\n throw new PmCliError(`Checkpoint ${checkpointId} contains an invalid item entry`, EXIT_CODE.GENERIC_FAILURE);\n }\n const row = entry as Record<string, unknown>;\n if (typeof row.id !== \"string\" || row.id.trim().length === 0) {\n throw new PmCliError(`Checkpoint ${checkpointId} contains an item entry without ID`, EXIT_CODE.GENERIC_FAILURE);\n }\n if (typeof row.target_updated_at !== \"string\" || row.target_updated_at.trim().length === 0) {\n throw new PmCliError(`Checkpoint ${checkpointId} contains an item entry without target_updated_at`, EXIT_CODE.GENERIC_FAILURE);\n }\n return {\n id: row.id.trim(),\n target_updated_at: row.target_updated_at.trim(),\n };\n });\n return {\n schema_version: UPDATE_MANY_CHECKPOINT_SCHEMA_VERSION,\n id: typeof record.id === \"string\" ? record.id : checkpointId,\n created_at: typeof record.created_at === \"string\" ? record.created_at : nowIso(),\n author: typeof record.author === \"string\" ? record.author : \"unknown\",\n status_filter: typeof record.status_filter === \"string\" ? record.status_filter : null,\n list_filters:\n record.list_filters && typeof record.list_filters === \"object\" && !Array.isArray(record.list_filters)\n ? (record.list_filters as Record<string, unknown>)\n : {},\n update_options:\n record.update_options && typeof record.update_options === \"object\" && !Array.isArray(record.update_options)\n ? (record.update_options as Record<string, unknown>)\n : {},\n items,\n };\n}\n\nasync function loadCheckpoint(pmRoot: string, checkpointId: string): Promise<{ checkpoint: UpdateManyCheckpoint; path: string }> {\n const normalizedId = normalizeCheckpointId(checkpointId);\n const filePath = checkpointFilePath(pmRoot, normalizedId);\n if (!(await pathExists(filePath))) {\n throw new PmCliError(`Checkpoint ${normalizedId} not found`, EXIT_CODE.NOT_FOUND);\n }\n const raw = await readFile(filePath, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n return {\n checkpoint: ensureCheckpointShape(parsed, normalizedId),\n path: filePath,\n };\n}\n\nexport async function runUpdateMany(options: UpdateManyCommandOptions, global: GlobalOptions): Promise<UpdateManyResult> {\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n if (!(await pathExists(getSettingsPath(pmRoot)))) {\n throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);\n }\n const settings = await readSettings(pmRoot);\n const statusRegistry = resolveRuntimeStatusRegistry(settings.schema);\n\n const dryRun = options.dryRun === true;\n const rollbackId = typeof options.rollback === \"string\" ? options.rollback : undefined;\n const updateSummary = sanitizeUpdateOptionsForSummary(options.update);\n\n if (rollbackId) {\n if (dryRun) {\n throw new PmCliError(\"--dry-run cannot be combined with --rollback\", EXIT_CODE.USAGE);\n }\n if (hasListFilters(options.list, options.status)) {\n throw new PmCliError(\"Rollback mode does not accept filter options\", EXIT_CODE.USAGE);\n }\n if (Object.keys(updateSummary).length > 0) {\n throw new PmCliError(\"Rollback mode does not accept update mutation flags\", EXIT_CODE.USAGE);\n }\n\n const { checkpoint, path: checkpointPath } = await loadCheckpoint(pmRoot, rollbackId);\n const rollbackRows: UpdateManyRollbackResultRow[] = [];\n const restoredIds: string[] = [];\n const restoreMessage = options.update.message ?? `Rollback update-many checkpoint ${checkpoint.id}`;\n for (const entry of checkpoint.items) {\n try {\n const restored = await runRestore(\n entry.id,\n entry.target_updated_at,\n {\n author: options.update.author,\n message: restoreMessage,\n force: options.update.force ?? true,\n },\n global,\n );\n rollbackRows.push({\n id: entry.id,\n status: \"restored\",\n changed_fields: restored.changed_fields,\n warnings: restored.warnings,\n });\n restoredIds.push(entry.id);\n } catch (error: unknown) {\n rollbackRows.push({\n id: entry.id,\n status: \"failed\",\n error: toErrorMessage(error),\n });\n }\n }\n const failedCount = rollbackRows.filter((row) => row.status === \"failed\").length;\n return {\n mode: \"rollback\",\n matched_count: checkpoint.items.length,\n dry_run: false,\n rollback_checkpoint_id: checkpoint.id,\n checkpoint: {\n id: checkpoint.id,\n created_at: checkpoint.created_at,\n path: checkpointPath,\n rollback_command: `pm update-many --rollback ${checkpoint.id}`,\n },\n restored_count: restoredIds.length,\n failed_count: failedCount,\n rows: rollbackRows,\n ids: restoredIds,\n };\n }\n\n if (!hasAnyUpdateMutationInput(options.update)) {\n throw new PmCliError(\n `No update-many mutation flags provided. Add at least one mutation flag (for example: ${UPDATE_MANY_MUTATION_FLAG_GUIDANCE}).`,\n EXIT_CODE.USAGE,\n );\n }\n\n const statusFilter = normalizeStatusFilter(options.status, statusRegistry);\n const listed = await runList(statusFilter, { ...options.list, includeBody: true }, global);\n const planned = listed.items.map((item) => buildPlannedItemDiff(item, options.update));\n const actionable = planned.filter((row) => row.changes.length > 0);\n if (dryRun) {\n return {\n mode: \"dry_run\",\n matched_count: listed.items.length,\n dry_run: true,\n filters: listed.filters,\n planned_update_options: updateSummary,\n item_plans: planned,\n ids: [],\n };\n }\n\n if (actionable.length === 0) {\n return {\n mode: \"apply\",\n matched_count: listed.items.length,\n dry_run: false,\n filters: listed.filters,\n planned_update_options: updateSummary,\n updated_count: 0,\n skipped_count: listed.items.length,\n failed_count: 0,\n rows: planned.map((row) => ({\n id: row.id,\n status: \"skipped\" as const,\n })),\n ids: [],\n };\n }\n\n const nowValue = nowIso();\n const checkpointId = createCheckpointId(nowValue);\n const checkpointEnabled = options.checkpoint !== false;\n const checkpointItems: UpdateManyCheckpointItem[] = listed.items\n .filter((item) => actionable.some((candidate) => candidate.id === item.id))\n .map((item) => ({\n id: item.id,\n target_updated_at: item.updated_at,\n }));\n\n let checkpointInfo: UpdateManyResult[\"checkpoint\"] | undefined;\n if (checkpointEnabled) {\n const checkpointPayload: UpdateManyCheckpoint = {\n schema_version: UPDATE_MANY_CHECKPOINT_SCHEMA_VERSION,\n id: checkpointId,\n created_at: nowValue,\n author: resolveCheckpointAuthor(options.update),\n status_filter: statusFilter ?? null,\n list_filters: listed.filters,\n update_options: updateSummary,\n items: checkpointItems,\n };\n const checkpointDir = checkpointDirectoryPath(pmRoot);\n await mkdir(checkpointDir, { recursive: true });\n const checkpointPath = checkpointFilePath(pmRoot, checkpointId);\n await writeFileAtomic(checkpointPath, `${JSON.stringify(checkpointPayload, null, 2)}\\n`);\n checkpointInfo = {\n id: checkpointId,\n created_at: nowValue,\n path: checkpointPath,\n rollback_command: `pm update-many --rollback ${checkpointId}`,\n };\n }\n\n const applyRows: UpdateManyApplyResultRow[] = [];\n const updatedIds: string[] = [];\n const updateMessage = options.update.message ?? `update-many apply ${checkpointId}`;\n const actionableById = new Set(actionable.map((row) => row.id));\n for (const item of listed.items) {\n if (!actionableById.has(item.id)) {\n applyRows.push({ id: item.id, status: \"skipped\" });\n continue;\n }\n try {\n const result = await runUpdate(\n item.id,\n {\n ...options.update,\n message: updateMessage,\n },\n global,\n );\n applyRows.push({\n id: item.id,\n status: \"updated\",\n changed_fields: result.changed_fields,\n warnings: result.warnings,\n });\n updatedIds.push(item.id);\n } catch (error: unknown) {\n applyRows.push({\n id: item.id,\n status: \"failed\",\n error: toErrorMessage(error),\n });\n }\n }\n\n const updatedCount = applyRows.filter((row) => row.status === \"updated\").length;\n const skippedCount = applyRows.filter((row) => row.status === \"skipped\").length;\n const failedCount = applyRows.filter((row) => row.status === \"failed\").length;\n\n return {\n mode: \"apply\",\n matched_count: listed.items.length,\n dry_run: false,\n filters: listed.filters,\n planned_update_options: updateSummary,\n ...(checkpointInfo ? { checkpoint: checkpointInfo } : {}),\n updated_count: updatedCount,\n skipped_count: skippedCount,\n failed_count: failedCount,\n rows: applyRows,\n ids: updatedIds,\n };\n}\n"],"names":[],"mappings":"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","debugId":"773e8c60-3305-5659-8909-57986feeb4e9"}
|
|
1
|
+
{"version":3,"file":"update-many.js","sources":["cli/commands/update-many.ts"],"sourceRoot":"/","sourcesContent":["import { mkdir, readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { pathExists, writeFileAtomic } from \"../../core/fs/fs-utils.js\";\nimport { normalizeStatusInput } from \"../../core/item/status.js\";\nimport { resolveRuntimeStatusRegistry, type RuntimeStatusRegistry } from \"../../core/schema/runtime-schema.js\";\nimport { EXIT_CODE } from \"../../core/shared/constants.js\";\nimport type { GlobalOptions } from \"../../core/shared/command-types.js\";\nimport { PmCliError } from \"../../core/shared/errors.js\";\nimport { toErrorMessage } from \"../../core/shared/primitives.js\";\nimport { nowIso } from \"../../core/shared/time.js\";\nimport { getSettingsPath, resolvePmRoot } from \"../../core/store/paths.js\";\nimport { readSettings } from \"../../core/store/settings.js\";\nimport { resolveAuthor } from \"../../core/shared/author.js\";\nimport type { ItemStatus } from \"../../types/index.js\";\nimport { runList, type ListOptions, type ListedItem } from \"./list.js\";\nimport { runRestore } from \"./restore.js\";\nimport { runUpdate, type UpdateCommandOptions } from \"./update.js\";\n\nconst UPDATE_MANY_CHECKPOINT_SCHEMA_VERSION = 1;\nconst UPDATE_MANY_CHECKPOINT_DIRECTORY = [\"checkpoints\", \"update-many\"] as const;\n\nconst NON_MUTATION_UPDATE_OPTION_KEYS = new Set<keyof UpdateCommandOptions>([\n \"author\",\n \"message\",\n \"force\",\n \"allowAuditUpdate\",\n \"allowAuditDepUpdate\",\n]);\n\nconst UPDATE_MANY_MUTATION_FLAG_GUIDANCE = [\n \"--status\",\n \"--priority\",\n \"--type\",\n \"--tags\",\n \"--description\",\n \"--body\",\n \"--deadline\",\n \"--estimate\",\n \"--assignee\",\n \"--dep\",\n \"--dep-remove\",\n \"--comment\",\n \"--note\",\n \"--learning\",\n \"--file\",\n \"--test\",\n \"--doc\",\n \"--replace-deps\",\n \"--replace-tests\",\n \"--unset\",\n \"--clear-*\",\n].join(\", \");\n\nconst UPDATE_OPTION_TO_ITEM_KEY: Partial<Record<keyof UpdateCommandOptions, string>> = {\n title: \"title\",\n description: \"description\",\n body: \"body\",\n status: \"status\",\n closeReason: \"close_reason\",\n priority: \"priority\",\n type: \"type\",\n tags: \"tags\",\n deadline: \"deadline\",\n estimatedMinutes: \"estimated_minutes\",\n acceptanceCriteria: \"acceptance_criteria\",\n definitionOfReady: \"definition_of_ready\",\n order: \"order\",\n goal: \"goal\",\n objective: \"objective\",\n value: \"value\",\n impact: \"impact\",\n outcome: \"outcome\",\n whyNow: \"why_now\",\n assignee: \"assignee\",\n parent: \"parent\",\n reviewer: \"reviewer\",\n risk: \"risk\",\n confidence: \"confidence\",\n sprint: \"sprint\",\n release: \"release\",\n blockedBy: \"blocked_by\",\n blockedReason: \"blocked_reason\",\n unblockNote: \"unblock_note\",\n reporter: \"reporter\",\n severity: \"severity\",\n environment: \"environment\",\n reproSteps: \"repro_steps\",\n resolution: \"resolution\",\n expectedResult: \"expected_result\",\n actualResult: \"actual_result\",\n affectedVersion: \"affected_version\",\n fixedVersion: \"fixed_version\",\n component: \"component\",\n regression: \"regression\",\n customerImpact: \"customer_impact\",\n};\n\ninterface CollectionMutationPlanDefinition {\n field: string;\n addKey?: keyof UpdateCommandOptions;\n removeKey?: keyof UpdateCommandOptions;\n clearKey?: keyof UpdateCommandOptions;\n replaceKey?: keyof UpdateCommandOptions;\n}\n\nconst COLLECTION_MUTATION_PLAN_DEFINITIONS: CollectionMutationPlanDefinition[] = [\n {\n field: \"dependencies\",\n addKey: \"dep\",\n removeKey: \"depRemove\",\n clearKey: \"clearDeps\",\n replaceKey: \"replaceDeps\",\n },\n {\n field: \"comments\",\n addKey: \"comment\",\n clearKey: \"clearComments\",\n },\n {\n field: \"notes\",\n addKey: \"note\",\n clearKey: \"clearNotes\",\n },\n {\n field: \"learnings\",\n addKey: \"learning\",\n clearKey: \"clearLearnings\",\n },\n {\n field: \"files\",\n addKey: \"file\",\n clearKey: \"clearFiles\",\n },\n {\n field: \"tests\",\n addKey: \"test\",\n clearKey: \"clearTests\",\n replaceKey: \"replaceTests\",\n },\n {\n field: \"docs\",\n addKey: \"doc\",\n clearKey: \"clearDocs\",\n },\n {\n field: \"reminders\",\n addKey: \"reminder\",\n clearKey: \"clearReminders\",\n },\n {\n field: \"events\",\n addKey: \"event\",\n clearKey: \"clearEvents\",\n },\n {\n field: \"type_options\",\n addKey: \"typeOption\",\n clearKey: \"clearTypeOptions\",\n },\n];\n\nconst UNSET_FIELD_ALIASES: Record<string, string> = {\n close_reason: \"close_reason\",\n \"close-reason\": \"close_reason\",\n deadline: \"deadline\",\n estimate: \"estimated_minutes\",\n estimated_minutes: \"estimated_minutes\",\n \"estimated-minutes\": \"estimated_minutes\",\n acceptance_criteria: \"acceptance_criteria\",\n \"acceptance-criteria\": \"acceptance_criteria\",\n ac: \"acceptance_criteria\",\n definition_of_ready: \"definition_of_ready\",\n \"definition-of-ready\": \"definition_of_ready\",\n order: \"order\",\n rank: \"order\",\n goal: \"goal\",\n objective: \"objective\",\n value: \"value\",\n impact: \"impact\",\n outcome: \"outcome\",\n why_now: \"why_now\",\n \"why-now\": \"why_now\",\n assignee: \"assignee\",\n parent: \"parent\",\n reviewer: \"reviewer\",\n risk: \"risk\",\n confidence: \"confidence\",\n sprint: \"sprint\",\n release: \"release\",\n blocked_by: \"blocked_by\",\n \"blocked-by\": \"blocked_by\",\n blocked_reason: \"blocked_reason\",\n \"blocked-reason\": \"blocked_reason\",\n unblock_note: \"unblock_note\",\n \"unblock-note\": \"unblock_note\",\n reporter: \"reporter\",\n severity: \"severity\",\n environment: \"environment\",\n repro_steps: \"repro_steps\",\n \"repro-steps\": \"repro_steps\",\n resolution: \"resolution\",\n expected_result: \"expected_result\",\n \"expected-result\": \"expected_result\",\n actual_result: \"actual_result\",\n \"actual-result\": \"actual_result\",\n affected_version: \"affected_version\",\n \"affected-version\": \"affected_version\",\n fixed_version: \"fixed_version\",\n \"fixed-version\": \"fixed_version\",\n component: \"component\",\n regression: \"regression\",\n customer_impact: \"customer_impact\",\n \"customer-impact\": \"customer_impact\",\n type_options: \"type_options\",\n \"type-options\": \"type_options\",\n tags: \"tags\",\n};\n\ninterface UpdateManyCheckpointItem {\n id: string;\n target_updated_at: string;\n}\n\ninterface UpdateManyCheckpoint {\n schema_version: number;\n id: string;\n created_at: string;\n author: string;\n status_filter: string | null;\n list_filters: Record<string, unknown>;\n update_options: Record<string, unknown>;\n items: UpdateManyCheckpointItem[];\n}\n\nexport interface UpdateManyCommandOptions {\n status?: string;\n list: ListOptions;\n update: UpdateCommandOptions;\n dryRun?: boolean;\n rollback?: string;\n checkpoint?: boolean;\n}\n\ninterface PlannedChange {\n field: string;\n before: unknown;\n after: unknown;\n}\n\ninterface PlannedItemDiff {\n id: string;\n changes: PlannedChange[];\n}\n\ninterface UpdateManyApplyResultRow {\n id: string;\n status: \"updated\" | \"failed\" | \"skipped\";\n changed_fields?: string[];\n warnings?: string[];\n error?: string;\n}\n\ninterface UpdateManyRollbackResultRow {\n id: string;\n status: \"restored\" | \"failed\";\n changed_fields?: string[];\n warnings?: string[];\n error?: string;\n}\n\nexport interface UpdateManyResult {\n mode: \"dry_run\" | \"apply\" | \"rollback\";\n matched_count: number;\n dry_run: boolean;\n filters?: Record<string, unknown>;\n planned_update_options?: Record<string, unknown>;\n item_plans?: PlannedItemDiff[];\n checkpoint?: {\n id: string;\n created_at: string;\n path: string;\n rollback_command: string;\n };\n updated_count?: number;\n skipped_count?: number;\n failed_count?: number;\n restored_count?: number;\n rollback_checkpoint_id?: string;\n rows?: UpdateManyApplyResultRow[] | UpdateManyRollbackResultRow[];\n ids: string[];\n}\n\nfunction normalizeCheckpointId(raw: string): string {\n const trimmed = raw.trim();\n if (!trimmed) {\n throw new PmCliError(\"--rollback requires a non-empty checkpoint ID\", EXIT_CODE.USAGE);\n }\n if (!/^[a-zA-Z0-9._-]+$/.test(trimmed)) {\n throw new PmCliError(\"--rollback checkpoint ID must match [a-zA-Z0-9._-]+\", EXIT_CODE.USAGE);\n }\n return trimmed;\n}\n\nfunction sanitizeUpdateOptionsForSummary(options: UpdateCommandOptions): Record<string, unknown> {\n const summary: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(options) as Array<[keyof UpdateCommandOptions, unknown]>) {\n if (NON_MUTATION_UPDATE_OPTION_KEYS.has(key)) {\n continue;\n }\n if (value === undefined) {\n continue;\n }\n summary[key] = value;\n }\n return summary;\n}\n\nfunction hasAnyUpdateMutationInput(options: UpdateCommandOptions): boolean {\n return Object.keys(sanitizeUpdateOptionsForSummary(options)).length > 0;\n}\n\nfunction toComparablePreviewValue(optionKey: keyof UpdateCommandOptions, value: unknown): unknown {\n if (value === undefined) {\n return undefined;\n }\n if (optionKey === \"priority\") {\n const parsed = Number(String(value).trim());\n return Number.isInteger(parsed) ? parsed : String(value).trim();\n }\n if (optionKey === \"estimatedMinutes\" || optionKey === \"order\" || optionKey === \"rank\") {\n const parsed = Number(String(value).trim());\n return Number.isFinite(parsed) ? parsed : String(value).trim();\n }\n if (optionKey === \"tags\") {\n return [...new Set(String(value).split(\",\").map((entry) => entry.trim()).filter((entry) => entry.length > 0))].sort((a, b) =>\n a.localeCompare(b),\n );\n }\n if (optionKey === \"regression\") {\n const normalized = String(value).trim().toLowerCase();\n if (normalized === \"true\" || normalized === \"1\") {\n return true;\n }\n if (normalized === \"false\" || normalized === \"0\") {\n return false;\n }\n }\n if (typeof value === \"string\") {\n return value.trim();\n }\n return value;\n}\n\nfunction normalizeUnsetField(rawField: string): string {\n const normalized = rawField.trim().toLowerCase().replaceAll(\"-\", \"_\");\n return UNSET_FIELD_ALIASES[normalized] ?? normalized;\n}\n\nfunction areValuesEqual(left: unknown, right: unknown): boolean {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction normalizeCollectionBeforeValue(field: string, value: unknown): unknown {\n if (value !== undefined) {\n return value;\n }\n if (field === \"type_options\") {\n return {};\n }\n return [];\n}\n\nfunction collectionValueCount(field: string, value: unknown): number {\n if (Array.isArray(value)) {\n return value.length;\n }\n if (field === \"type_options\" && value && typeof value === \"object\") {\n return Object.keys(value as Record<string, unknown>).length;\n }\n return 0;\n}\n\nfunction buildCollectionMutationPlans(row: Record<string, unknown>, update: UpdateCommandOptions): PlannedChange[] {\n const changes: PlannedChange[] = [];\n for (const definition of COLLECTION_MUTATION_PLAN_DEFINITIONS) {\n const addValues = definition.addKey ? update[definition.addKey] : undefined;\n const removeValues = definition.removeKey ? update[definition.removeKey] : undefined;\n const addCount = Array.isArray(addValues) ? addValues.length : 0;\n const removeCount = Array.isArray(removeValues) ? removeValues.length : 0;\n const clear = definition.clearKey ? update[definition.clearKey] === true : false;\n const replace = definition.replaceKey ? update[definition.replaceKey] === true : false;\n if (!clear && !replace && addCount === 0 && removeCount === 0) {\n continue;\n }\n\n const before = normalizeCollectionBeforeValue(definition.field, row[definition.field]);\n const beforeCount = collectionValueCount(definition.field, before);\n const operation = replace ? \"replace\" : clear ? \"clear_or_reset\" : removeCount > 0 ? \"merge_remove\" : \"append\";\n changes.push({\n field: definition.field,\n before,\n after: {\n operation,\n clear,\n replace,\n add_count: addCount,\n remove_count: removeCount,\n before_count: beforeCount,\n },\n });\n }\n return changes;\n}\n\nfunction buildPlannedItemDiff(item: ListedItem, update: UpdateCommandOptions): PlannedItemDiff {\n const row = item as unknown as Record<string, unknown>;\n const changes: PlannedChange[] = [];\n for (const [optionKey, itemKey] of Object.entries(UPDATE_OPTION_TO_ITEM_KEY) as Array<[keyof UpdateCommandOptions, string]>) {\n const candidate = update[optionKey];\n if (candidate === undefined) {\n continue;\n }\n const before = row[itemKey];\n const after = toComparablePreviewValue(optionKey, candidate);\n if (areValuesEqual(before, after)) {\n continue;\n }\n changes.push({\n field: itemKey,\n before,\n after,\n });\n }\n changes.push(...buildCollectionMutationPlans(row, update));\n\n if (update.unset && update.unset.length > 0) {\n for (const rawUnsetField of update.unset) {\n const field = normalizeUnsetField(rawUnsetField);\n const before = row[field];\n if (before === undefined) {\n continue;\n }\n changes.push({\n field,\n before,\n after: null,\n });\n }\n }\n\n return {\n id: item.id,\n changes,\n };\n}\n\nfunction createCheckpointId(nowValue: string): string {\n const compactTimestamp = nowValue.replace(/[-:.TZ]/g, \"\").slice(0, 14);\n const randomSuffix = Math.random().toString(36).slice(2, 8);\n return `update-many-${compactTimestamp}-${randomSuffix}`;\n}\n\nfunction checkpointDirectoryPath(pmRoot: string): string {\n return path.join(pmRoot, ...UPDATE_MANY_CHECKPOINT_DIRECTORY);\n}\n\nfunction checkpointFilePath(pmRoot: string, checkpointId: string): string {\n return path.join(checkpointDirectoryPath(pmRoot), `${checkpointId}.json`);\n}\n\nfunction normalizeStatusFilter(value: string | undefined, statusRegistry: RuntimeStatusRegistry): ItemStatus | undefined {\n if (value === undefined) {\n return undefined;\n }\n const normalized = normalizeStatusInput(value, statusRegistry);\n if (!normalized) {\n const allowedStatuses = statusRegistry.definitions.map((definition) => definition.id);\n throw new PmCliError(\n `Invalid --filter-status value \"${value}\". Allowed: ${allowedStatuses.join(\", \")}`,\n EXIT_CODE.USAGE,\n );\n }\n return normalized;\n}\n\nfunction hasListFilters(list: ListOptions, status: string | undefined): boolean {\n return (\n status !== undefined ||\n list.type !== undefined ||\n list.tag !== undefined ||\n list.priority !== undefined ||\n list.deadlineBefore !== undefined ||\n list.deadlineAfter !== undefined ||\n list.assignee !== undefined ||\n list.assigneeFilter !== undefined ||\n list.parent !== undefined ||\n list.sprint !== undefined ||\n list.release !== undefined ||\n list.limit !== undefined ||\n list.offset !== undefined\n );\n}\n\n\nfunction ensureCheckpointShape(value: unknown, checkpointId: string): UpdateManyCheckpoint {\n if (!value || typeof value !== \"object\") {\n throw new PmCliError(`Checkpoint ${checkpointId} is invalid`, EXIT_CODE.GENERIC_FAILURE);\n }\n const record = value as Record<string, unknown>;\n if (record.schema_version !== UPDATE_MANY_CHECKPOINT_SCHEMA_VERSION) {\n throw new PmCliError(`Checkpoint ${checkpointId} has unsupported schema version`, EXIT_CODE.GENERIC_FAILURE);\n }\n if (!Array.isArray(record.items)) {\n throw new PmCliError(`Checkpoint ${checkpointId} is missing items`, EXIT_CODE.GENERIC_FAILURE);\n }\n const items = record.items.map((entry) => {\n if (!entry || typeof entry !== \"object\") {\n throw new PmCliError(`Checkpoint ${checkpointId} contains an invalid item entry`, EXIT_CODE.GENERIC_FAILURE);\n }\n const row = entry as Record<string, unknown>;\n if (typeof row.id !== \"string\" || row.id.trim().length === 0) {\n throw new PmCliError(`Checkpoint ${checkpointId} contains an item entry without ID`, EXIT_CODE.GENERIC_FAILURE);\n }\n if (typeof row.target_updated_at !== \"string\" || row.target_updated_at.trim().length === 0) {\n throw new PmCliError(`Checkpoint ${checkpointId} contains an item entry without target_updated_at`, EXIT_CODE.GENERIC_FAILURE);\n }\n return {\n id: row.id.trim(),\n target_updated_at: row.target_updated_at.trim(),\n };\n });\n return {\n schema_version: UPDATE_MANY_CHECKPOINT_SCHEMA_VERSION,\n id: typeof record.id === \"string\" ? record.id : checkpointId,\n created_at: typeof record.created_at === \"string\" ? record.created_at : nowIso(),\n author: typeof record.author === \"string\" ? record.author : \"unknown\",\n status_filter: typeof record.status_filter === \"string\" ? record.status_filter : null,\n list_filters:\n record.list_filters && typeof record.list_filters === \"object\" && !Array.isArray(record.list_filters)\n ? (record.list_filters as Record<string, unknown>)\n : {},\n update_options:\n record.update_options && typeof record.update_options === \"object\" && !Array.isArray(record.update_options)\n ? (record.update_options as Record<string, unknown>)\n : {},\n items,\n };\n}\n\nasync function loadCheckpoint(pmRoot: string, checkpointId: string): Promise<{ checkpoint: UpdateManyCheckpoint; path: string }> {\n const normalizedId = normalizeCheckpointId(checkpointId);\n const filePath = checkpointFilePath(pmRoot, normalizedId);\n if (!(await pathExists(filePath))) {\n throw new PmCliError(`Checkpoint ${normalizedId} not found`, EXIT_CODE.NOT_FOUND);\n }\n const raw = await readFile(filePath, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n return {\n checkpoint: ensureCheckpointShape(parsed, normalizedId),\n path: filePath,\n };\n}\n\nexport async function runUpdateMany(options: UpdateManyCommandOptions, global: GlobalOptions): Promise<UpdateManyResult> {\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n if (!(await pathExists(getSettingsPath(pmRoot)))) {\n throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);\n }\n const settings = await readSettings(pmRoot);\n const statusRegistry = resolveRuntimeStatusRegistry(settings.schema);\n\n const dryRun = options.dryRun === true;\n const rollbackId = typeof options.rollback === \"string\" ? options.rollback : undefined;\n const updateSummary = sanitizeUpdateOptionsForSummary(options.update);\n\n if (rollbackId) {\n if (dryRun) {\n throw new PmCliError(\"--dry-run cannot be combined with --rollback\", EXIT_CODE.USAGE);\n }\n if (hasListFilters(options.list, options.status)) {\n throw new PmCliError(\"Rollback mode does not accept filter options\", EXIT_CODE.USAGE);\n }\n if (Object.keys(updateSummary).length > 0) {\n throw new PmCliError(\"Rollback mode does not accept update mutation flags\", EXIT_CODE.USAGE);\n }\n\n const { checkpoint, path: checkpointPath } = await loadCheckpoint(pmRoot, rollbackId);\n const rollbackRows: UpdateManyRollbackResultRow[] = [];\n const restoredIds: string[] = [];\n const restoreMessage = options.update.message ?? `Rollback update-many checkpoint ${checkpoint.id}`;\n for (const entry of checkpoint.items) {\n try {\n const restored = await runRestore(\n entry.id,\n entry.target_updated_at,\n {\n author: options.update.author,\n message: restoreMessage,\n force: options.update.force ?? true,\n },\n global,\n );\n rollbackRows.push({\n id: entry.id,\n status: \"restored\",\n changed_fields: restored.changed_fields,\n warnings: restored.warnings,\n });\n restoredIds.push(entry.id);\n } catch (error: unknown) {\n rollbackRows.push({\n id: entry.id,\n status: \"failed\",\n error: toErrorMessage(error),\n });\n }\n }\n const failedCount = rollbackRows.filter((row) => row.status === \"failed\").length;\n return {\n mode: \"rollback\",\n matched_count: checkpoint.items.length,\n dry_run: false,\n rollback_checkpoint_id: checkpoint.id,\n checkpoint: {\n id: checkpoint.id,\n created_at: checkpoint.created_at,\n path: checkpointPath,\n rollback_command: `pm update-many --rollback ${checkpoint.id}`,\n },\n restored_count: restoredIds.length,\n failed_count: failedCount,\n rows: rollbackRows,\n ids: restoredIds,\n };\n }\n\n if (!hasAnyUpdateMutationInput(options.update)) {\n throw new PmCliError(\n `No update-many mutation flags provided. Add at least one mutation flag (for example: ${UPDATE_MANY_MUTATION_FLAG_GUIDANCE}).`,\n EXIT_CODE.USAGE,\n );\n }\n\n const statusFilter = normalizeStatusFilter(options.status, statusRegistry);\n const listed = await runList(statusFilter, { ...options.list, includeBody: true }, global);\n const planned = listed.items.map((item) => buildPlannedItemDiff(item, options.update));\n const actionable = planned.filter((row) => row.changes.length > 0);\n if (dryRun) {\n return {\n mode: \"dry_run\",\n matched_count: listed.items.length,\n dry_run: true,\n filters: listed.filters,\n planned_update_options: updateSummary,\n item_plans: planned,\n ids: [],\n };\n }\n\n if (actionable.length === 0) {\n return {\n mode: \"apply\",\n matched_count: listed.items.length,\n dry_run: false,\n filters: listed.filters,\n planned_update_options: updateSummary,\n updated_count: 0,\n skipped_count: listed.items.length,\n failed_count: 0,\n rows: planned.map((row) => ({\n id: row.id,\n status: \"skipped\" as const,\n })),\n ids: [],\n };\n }\n\n const nowValue = nowIso();\n const checkpointId = createCheckpointId(nowValue);\n const checkpointEnabled = options.checkpoint !== false;\n const checkpointItems: UpdateManyCheckpointItem[] = listed.items\n .filter((item) => actionable.some((candidate) => candidate.id === item.id))\n .map((item) => ({\n id: item.id,\n target_updated_at: item.updated_at,\n }));\n\n let checkpointInfo: UpdateManyResult[\"checkpoint\"] | undefined;\n if (checkpointEnabled) {\n const checkpointPayload: UpdateManyCheckpoint = {\n schema_version: UPDATE_MANY_CHECKPOINT_SCHEMA_VERSION,\n id: checkpointId,\n created_at: nowValue,\n author: resolveAuthor(options.update.author, \"unknown\"),\n status_filter: statusFilter ?? null,\n list_filters: listed.filters,\n update_options: updateSummary,\n items: checkpointItems,\n };\n const checkpointDir = checkpointDirectoryPath(pmRoot);\n await mkdir(checkpointDir, { recursive: true });\n const checkpointPath = checkpointFilePath(pmRoot, checkpointId);\n await writeFileAtomic(checkpointPath, `${JSON.stringify(checkpointPayload, null, 2)}\\n`);\n checkpointInfo = {\n id: checkpointId,\n created_at: nowValue,\n path: checkpointPath,\n rollback_command: `pm update-many --rollback ${checkpointId}`,\n };\n }\n\n const applyRows: UpdateManyApplyResultRow[] = [];\n const updatedIds: string[] = [];\n const updateMessage = options.update.message ?? `update-many apply ${checkpointId}`;\n const actionableById = new Set(actionable.map((row) => row.id));\n for (const item of listed.items) {\n if (!actionableById.has(item.id)) {\n applyRows.push({ id: item.id, status: \"skipped\" });\n continue;\n }\n try {\n const result = await runUpdate(\n item.id,\n {\n ...options.update,\n message: updateMessage,\n },\n global,\n );\n applyRows.push({\n id: item.id,\n status: \"updated\",\n changed_fields: result.changed_fields,\n warnings: result.warnings,\n });\n updatedIds.push(item.id);\n } catch (error: unknown) {\n applyRows.push({\n id: item.id,\n status: \"failed\",\n error: toErrorMessage(error),\n });\n }\n }\n\n const updatedCount = applyRows.filter((row) => row.status === \"updated\").length;\n const skippedCount = applyRows.filter((row) => row.status === \"skipped\").length;\n const failedCount = applyRows.filter((row) => row.status === \"failed\").length;\n\n return {\n mode: \"apply\",\n matched_count: listed.items.length,\n dry_run: false,\n filters: listed.filters,\n planned_update_options: updateSummary,\n ...(checkpointInfo ? { checkpoint: checkpointInfo } : {}),\n updated_count: updatedCount,\n skipped_count: skippedCount,\n failed_count: failedCount,\n rows: applyRows,\n ids: updatedIds,\n };\n}\n"],"names":[],"mappings":"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","debugId":"8ea74fa3-b9ec-5721-b7f4-3c521108d000"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="689e9580-d7f6-5b07-be3d-28c381d20260")}catch(e){}}();
|
|
3
3
|
import { pathExists } from "../../core/fs/fs-utils.js";
|
|
4
4
|
import { canonicalizeCommandOptionKey, commandOptionFlagLabel, resolveItemTypeRegistry, resolveCommandOptionPolicyState, resolveTypeDefinition, resolveTypeName, validateTypeOptions, } from "../../core/item/type-registry.js";
|
|
5
5
|
import { normalizeItemId } from "../../core/item/id.js";
|
|
6
|
+
import { buildInvalidTypeError } from "../../core/schema/item-types-file.js";
|
|
6
7
|
import { normalizeParentReferenceValue, validateMissingParentReference, } from "../../core/item/parent-reference-policy.js";
|
|
7
8
|
import { validateSprintOrReleaseValue } from "../../core/item/sprint-release-format.js";
|
|
8
9
|
import { createStdinTokenResolver, parseCsvKv, parseOptionalNumber, parseTags } from "../../core/item/parse.js";
|
|
10
|
+
import { resolvePriority } from "../../core/item/priority.js";
|
|
9
11
|
import { normalizeStatusInput } from "../../core/item/status.js";
|
|
10
12
|
import { collectRuntimeUpdateFieldValues } from "../../core/schema/runtime-field-values.js";
|
|
11
13
|
import { resolveRuntimeFieldRegistry, resolveRuntimeStatusRegistry, } from "../../core/schema/runtime-schema.js";
|
|
@@ -19,7 +21,8 @@ import { getSettingsPath, resolvePmRoot } from "../../core/store/paths.js";
|
|
|
19
21
|
import { readSettings } from "../../core/store/settings.js";
|
|
20
22
|
import { runClose } from "./close.js";
|
|
21
23
|
import { normalizeRiskInput, normalizeSeverityInput, parseConfidenceInput, parseRegressionInput, } from "./metadata-normalizers.js";
|
|
22
|
-
import {
|
|
24
|
+
import { resolveEventEndAt } from "./event-validation-messages.js";
|
|
25
|
+
import { DEPENDENCY_KIND_VALUES, ISSUE_SEVERITY_VALUES, RECURRENCE_FREQUENCY_VALUES, RECURRENCE_WEEKDAY_VALUES, RISK_VALUES, weekdayOrderIndex, } from "../../types/index.js";
|
|
23
26
|
import { parseDocs, parseFiles, parseLogSeed, parseTests } from "./create.js";
|
|
24
27
|
const LEGACY_NONE_TOKENS = new Set(["none", "null"]);
|
|
25
28
|
const UPDATE_UNSET_FIELD_DEFINITIONS = [
|
|
@@ -480,7 +483,7 @@ function enforceAllowAuditUpdateScope(options, clearFrontMatterKeys) {
|
|
|
480
483
|
}
|
|
481
484
|
function ensureEnum(value, allowed, label) {
|
|
482
485
|
if (!allowed.includes(value)) {
|
|
483
|
-
throw new PmCliError(`Invalid ${label} value "${value}"`, EXIT_CODE.USAGE);
|
|
486
|
+
throw new PmCliError(`Invalid ${label} value "${value}". Allowed: ${allowed.join(", ")}`, EXIT_CODE.USAGE);
|
|
484
487
|
}
|
|
485
488
|
return value;
|
|
486
489
|
}
|
|
@@ -492,16 +495,13 @@ function parseStatus(value, statusRegistry) {
|
|
|
492
495
|
}
|
|
493
496
|
return normalized;
|
|
494
497
|
}
|
|
495
|
-
function weekdayOrderIndex(value) {
|
|
496
|
-
return RECURRENCE_WEEKDAY_VALUES.indexOf(value);
|
|
497
|
-
}
|
|
498
498
|
function parseReminderEntries(raw, nowValue) {
|
|
499
499
|
return raw.map((entry) => {
|
|
500
500
|
const kv = parseCsvKv(entry, "--reminder");
|
|
501
|
-
const atRaw = kv.at?.trim();
|
|
502
|
-
const textRaw = kv.text?.trim();
|
|
501
|
+
const atRaw = (kv.at ?? kv.date)?.trim();
|
|
502
|
+
const textRaw = (kv.text ?? kv.title)?.trim();
|
|
503
503
|
if (!atRaw || !textRaw) {
|
|
504
|
-
throw new PmCliError("--reminder requires at=<iso|relative>
|
|
504
|
+
throw new PmCliError("--reminder requires at=<iso|relative> or date=<iso|relative>, plus text=<value> or title=<value>", EXIT_CODE.USAGE);
|
|
505
505
|
}
|
|
506
506
|
return {
|
|
507
507
|
at: resolveIsoOrRelative(atRaw, nowValue, "reminder.at"),
|
|
@@ -587,10 +587,8 @@ function parseEventEntries(raw, nowValue) {
|
|
|
587
587
|
}
|
|
588
588
|
const startAt = resolveIsoOrRelative(startRaw, nowValue, "event.start");
|
|
589
589
|
const endRaw = kv.end?.trim();
|
|
590
|
-
const
|
|
591
|
-
|
|
592
|
-
throw new PmCliError("--event end must be after start", EXIT_CODE.USAGE);
|
|
593
|
-
}
|
|
590
|
+
const durationRaw = kv.duration?.trim();
|
|
591
|
+
const endAt = resolveEventEndAt(startAt, endRaw, durationRaw, nowValue);
|
|
594
592
|
const titleRaw = kv.title;
|
|
595
593
|
const descriptionRaw = kv.description;
|
|
596
594
|
const locationRaw = kv.location;
|
|
@@ -750,6 +748,63 @@ function parseDependencyRemovals(raw, prefix) {
|
|
|
750
748
|
function dependencyKey(value) {
|
|
751
749
|
return `${value.id}::${value.kind}::${value.source_kind ?? ""}`;
|
|
752
750
|
}
|
|
751
|
+
// pm-kyd6: `--blocked-by` writes the `blocked_by` scalar, but the dependency
|
|
752
|
+
// graph (`pm deps`) is built only from the `dependencies` array. Mirror the
|
|
753
|
+
// behaviour create.ts already has so the metadata and the graph agree: a
|
|
754
|
+
// resolvable blocker also gets a `blocked_by` dependency edge, clearing the
|
|
755
|
+
// scalar removes that edge, and re-pointing it replaces the prior edge.
|
|
756
|
+
function reconcileBlockedByDependency(current, nextBlockedById, nowIsoValue, author) {
|
|
757
|
+
let next = [...(current ?? [])];
|
|
758
|
+
let changed = false;
|
|
759
|
+
const filtered = next.filter((dep) => dep.kind !== "blocked_by" || dep.id === nextBlockedById);
|
|
760
|
+
if (filtered.length !== next.length) {
|
|
761
|
+
next = filtered;
|
|
762
|
+
changed = true;
|
|
763
|
+
}
|
|
764
|
+
if (nextBlockedById && !next.some((dep) => dep.kind === "blocked_by" && dep.id === nextBlockedById)) {
|
|
765
|
+
next.push({ id: nextBlockedById, kind: "blocked_by", created_at: nowIsoValue, author });
|
|
766
|
+
changed = true;
|
|
767
|
+
}
|
|
768
|
+
if (!changed) {
|
|
769
|
+
return { dependencies: current, changed: false };
|
|
770
|
+
}
|
|
771
|
+
return { dependencies: next.length > 0 ? next : undefined, changed: true };
|
|
772
|
+
}
|
|
773
|
+
// pm-kyd6: resolve the --blocked-by target before the synchronous mutate
|
|
774
|
+
// callback so a real blocker can also become a `blocked_by` dependency edge.
|
|
775
|
+
// `id` is set when the target resolves; `unresolved` carries the raw value when
|
|
776
|
+
// --blocked-by points at an item that does not exist (the scalar is still set,
|
|
777
|
+
// mirroring create.ts and the never-block missing-parent behaviour, but the
|
|
778
|
+
// caller surfaces a warning so the metadata/graph mismatch is visible).
|
|
779
|
+
async function resolveBlockedByDependencyTarget(blockedByOption, blockedByCleared, pmRoot, idPrefix, itemFormat, typeToFolder) {
|
|
780
|
+
if (blockedByOption === undefined || blockedByCleared) {
|
|
781
|
+
return {};
|
|
782
|
+
}
|
|
783
|
+
const blockedByValue = blockedByOption.trim();
|
|
784
|
+
if (blockedByValue.length === 0) {
|
|
785
|
+
return {};
|
|
786
|
+
}
|
|
787
|
+
const located = await locateItem(pmRoot, normalizeItemId(blockedByValue, idPrefix), idPrefix, itemFormat, typeToFolder);
|
|
788
|
+
return located ? { id: located.id } : { unresolved: blockedByValue };
|
|
789
|
+
}
|
|
790
|
+
// pm-kyd6: apply the reconciled blocked_by dependency edge to the item metadata
|
|
791
|
+
// and record the `dependencies` change. Kept out of the mutate callback so the
|
|
792
|
+
// large runUpdate function stays under the static-quality complexity budget.
|
|
793
|
+
function applyBlockedByDependencyEdge(metadata, resolvedBlockedById, nowIsoValue, author, changedFields) {
|
|
794
|
+
const reconciled = reconcileBlockedByDependency(metadata.dependencies, resolvedBlockedById, nowIsoValue, author);
|
|
795
|
+
if (!reconciled.changed) {
|
|
796
|
+
return;
|
|
797
|
+
}
|
|
798
|
+
if (reconciled.dependencies === undefined) {
|
|
799
|
+
delete metadata.dependencies;
|
|
800
|
+
}
|
|
801
|
+
else {
|
|
802
|
+
metadata.dependencies = reconciled.dependencies;
|
|
803
|
+
}
|
|
804
|
+
if (!changedFields.includes("dependencies")) {
|
|
805
|
+
changedFields.push("dependencies");
|
|
806
|
+
}
|
|
807
|
+
}
|
|
753
808
|
function fileKey(value) {
|
|
754
809
|
return `${value.path}::${value.scope}`;
|
|
755
810
|
}
|
|
@@ -772,11 +827,7 @@ function matchesDependencySelector(value, selector) {
|
|
|
772
827
|
return true;
|
|
773
828
|
}
|
|
774
829
|
function ensurePriority(raw) {
|
|
775
|
-
|
|
776
|
-
if (![0, 1, 2, 3, 4].includes(parsed)) {
|
|
777
|
-
throw new PmCliError("Priority must be 0..4 (0=critical, 1=high, 2=medium, 3=low, 4=minimal)", EXIT_CODE.USAGE);
|
|
778
|
-
}
|
|
779
|
-
return parsed;
|
|
830
|
+
return resolvePriority(raw);
|
|
780
831
|
}
|
|
781
832
|
function normalizeUpdatePolicyOptionKey(raw, typeName) {
|
|
782
833
|
const canonical = canonicalizeCommandOptionKey("update", raw);
|
|
@@ -1134,6 +1185,13 @@ export async function runUpdate(id, options, global) {
|
|
|
1134
1185
|
parentReferenceWarnings.push(...validateMissingParentReference(normalizedParentId, parentReferencePolicy).warnings);
|
|
1135
1186
|
}
|
|
1136
1187
|
}
|
|
1188
|
+
// pm-kyd6: resolve the --blocked-by target up front (async) so the sync
|
|
1189
|
+
// mutate callback can mirror create.ts and add a `blocked_by` dependency edge.
|
|
1190
|
+
const blockedByResolution = await resolveBlockedByDependencyTarget(options.blockedBy, clearFrontMatterKeys.has("blocked_by"), pmRoot, settings.id_prefix, settings.item_format, typeRegistry.type_to_folder);
|
|
1191
|
+
const resolvedBlockedByDependencyId = blockedByResolution.id;
|
|
1192
|
+
if (blockedByResolution.unresolved !== undefined) {
|
|
1193
|
+
parentReferenceWarnings.push(`blocked_by_unresolved:${blockedByResolution.unresolved}`);
|
|
1194
|
+
}
|
|
1137
1195
|
const fieldFlags = {
|
|
1138
1196
|
title: options.title !== undefined,
|
|
1139
1197
|
description: options.description !== undefined,
|
|
@@ -1215,32 +1273,42 @@ export async function runUpdate(id, options, global) {
|
|
|
1215
1273
|
warnings: ["noop_no_update_fields"],
|
|
1216
1274
|
};
|
|
1217
1275
|
}
|
|
1218
|
-
|
|
1276
|
+
// `pm update --status <close_status>` always routes to the auditable close
|
|
1277
|
+
// workflow so agents are never blocked by close-through-update errors. Any
|
|
1278
|
+
// other field updates in the same call are applied first, then the item is
|
|
1279
|
+
// closed with the supplied --close-reason (or a derived default when omitted).
|
|
1280
|
+
if (fieldFlags.status) {
|
|
1219
1281
|
const targetStatus = normalizeStatusInput(options.status, statusRegistry);
|
|
1220
1282
|
if (targetStatus === statusRegistry.close_status) {
|
|
1221
|
-
const
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
nextSteps: [
|
|
1231
|
-
"Split into two commands: pm update <id> --<field> <value>; pm close <id> \"<reason>\".",
|
|
1232
|
-
],
|
|
1233
|
-
});
|
|
1283
|
+
const otherFieldKeys = Object.entries(fieldFlags)
|
|
1284
|
+
.filter(([key, value]) => value && key !== "status" && key !== "closeReason")
|
|
1285
|
+
.map(([key]) => key);
|
|
1286
|
+
const routeWarnings = [];
|
|
1287
|
+
let preChangedFields = [];
|
|
1288
|
+
if (otherFieldKeys.length > 0) {
|
|
1289
|
+
const preUpdate = await runUpdate(id, { ...options, status: undefined, closeReason: undefined, message: undefined }, global);
|
|
1290
|
+
preChangedFields = preUpdate.changed_fields;
|
|
1291
|
+
routeWarnings.push(...preUpdate.warnings);
|
|
1234
1292
|
}
|
|
1235
|
-
const
|
|
1293
|
+
const explicitReason = typeof options.closeReason === "string" ? options.closeReason.trim() : "";
|
|
1294
|
+
const fallbackMessage = typeof options.message === "string" ? options.message.trim() : "";
|
|
1295
|
+
const closeReason = explicitReason || fallbackMessage || "Closed via pm update";
|
|
1296
|
+
// Only flag a defaulted reason when neither --close-reason nor --message
|
|
1297
|
+
// supplied any text and we had to invent the generic placeholder.
|
|
1298
|
+
const reasonDefaulted = explicitReason.length === 0 && fallbackMessage.length === 0;
|
|
1299
|
+
const closeResult = await runClose(id, closeReason, {
|
|
1236
1300
|
author: options.author,
|
|
1237
1301
|
message: options.message,
|
|
1238
1302
|
force: options.force,
|
|
1239
1303
|
}, global);
|
|
1304
|
+
const warnings = [...routeWarnings, ...closeResult.warnings, "auto_routed_from_update_to_close"];
|
|
1305
|
+
if (reasonDefaulted) {
|
|
1306
|
+
warnings.push("close_reason_defaulted");
|
|
1307
|
+
}
|
|
1240
1308
|
return {
|
|
1241
1309
|
item: closeResult.item,
|
|
1242
|
-
changed_fields: closeResult.changed_fields,
|
|
1243
|
-
warnings
|
|
1310
|
+
changed_fields: [...preChangedFields, ...closeResult.changed_fields],
|
|
1311
|
+
warnings,
|
|
1244
1312
|
};
|
|
1245
1313
|
}
|
|
1246
1314
|
}
|
|
@@ -1276,21 +1344,9 @@ export async function runUpdate(id, options, global) {
|
|
|
1276
1344
|
const previousStatus = document.metadata.status;
|
|
1277
1345
|
const previousStatusNormalized = normalizeStatusInput(previousStatus, statusRegistry) ?? previousStatus;
|
|
1278
1346
|
if (options.status !== undefined) {
|
|
1347
|
+
// Close-status routing (with reason + audit) is handled before mutateItem
|
|
1348
|
+
// by the close gate above, so only non-close transitions reach this path.
|
|
1279
1349
|
const status = parseStatus(options.status, statusRegistry);
|
|
1280
|
-
if (status === statusRegistry.close_status) {
|
|
1281
|
-
throw new PmCliError(`Invalid --status value "${statusRegistry.close_status}". Use "pm close <ID> <TEXT>" to close an item.`, EXIT_CODE.USAGE, {
|
|
1282
|
-
code: "close_through_update",
|
|
1283
|
-
why: "Closing requires a close reason and optional validation checks that pm update cannot enforce. Use pm close for auditable close workflows.",
|
|
1284
|
-
examples: [
|
|
1285
|
-
`pm close ${id} "All acceptance criteria met" --author "${author}" --message "Close: verified"`,
|
|
1286
|
-
`pm close ${id} "Resolved" --validate-close warn --author "${author}"`,
|
|
1287
|
-
],
|
|
1288
|
-
nextSteps: [
|
|
1289
|
-
'Use "pm close <ID> <reason>" to close with required close reason and optional --validate-close.',
|
|
1290
|
-
'To cancel instead, use "pm update <ID> --status canceled".',
|
|
1291
|
-
],
|
|
1292
|
-
});
|
|
1293
|
-
}
|
|
1294
1350
|
document.metadata.status = status;
|
|
1295
1351
|
if (status === statusRegistry.canceled_status) {
|
|
1296
1352
|
delete document.metadata.assignee;
|
|
@@ -1324,7 +1380,7 @@ export async function runUpdate(id, options, global) {
|
|
|
1324
1380
|
if (options.type !== undefined) {
|
|
1325
1381
|
const resolvedTypeName = resolveTypeName(options.type, typeRegistry);
|
|
1326
1382
|
if (!resolvedTypeName) {
|
|
1327
|
-
throw new PmCliError(
|
|
1383
|
+
throw new PmCliError(buildInvalidTypeError(options.type, typeRegistry.types), EXIT_CODE.USAGE);
|
|
1328
1384
|
}
|
|
1329
1385
|
document.metadata.type = resolvedTypeName;
|
|
1330
1386
|
activeTypeName = resolvedTypeName;
|
|
@@ -1664,6 +1720,8 @@ export async function runUpdate(id, options, global) {
|
|
|
1664
1720
|
document.metadata.blocked_by = options.blockedBy.trim();
|
|
1665
1721
|
}
|
|
1666
1722
|
changedFields.push("blocked_by");
|
|
1723
|
+
// pm-kyd6: keep the dependency graph in sync with the blocked_by scalar.
|
|
1724
|
+
applyBlockedByDependencyEdge(document.metadata, resolvedBlockedByDependencyId, nowIso, author, changedFields);
|
|
1667
1725
|
}
|
|
1668
1726
|
if (options.blockedReason !== undefined || clearFrontMatterKeys.has("blocked_reason")) {
|
|
1669
1727
|
if (clearFrontMatterKeys.has("blocked_reason")) {
|
|
@@ -1847,4 +1905,4 @@ export async function runUpdate(id, options, global) {
|
|
|
1847
1905
|
};
|
|
1848
1906
|
}
|
|
1849
1907
|
//# sourceMappingURL=update.js.map
|
|
1850
|
-
//# debugId=
|
|
1908
|
+
//# debugId=689e9580-d7f6-5b07-be3d-28c381d20260
|