@unbrained/pm-cli 2026.5.18 → 2026.5.27
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 +953 -472
- package/README.md +4 -11
- package/dist/cli/bootstrap-args.d.ts +18 -1
- package/dist/cli/bootstrap-args.js +143 -3
- package/dist/cli/bootstrap-args.js.map +1 -1
- package/dist/cli/commander-usage.js +147 -10
- 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 +5 -8
- 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 +15 -24
- package/dist/cli/commands/claim.js.map +1 -1
- package/dist/cli/commands/close.js +63 -10
- 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.d.ts +2 -2
- package/dist/cli/commands/completion.js +203 -63
- package/dist/cli/commands/completion.js.map +1 -1
- package/dist/cli/commands/config.d.ts +1 -1
- package/dist/cli/commands/config.js +82 -4
- package/dist/cli/commands/config.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 +53 -313
- 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 +11 -9
- package/dist/cli/commands/delete.js.map +1 -1
- package/dist/cli/commands/docs.d.ts +2 -12
- package/dist/cli/commands/docs.js +8 -316
- 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/bundled-catalog.d.ts +14 -0
- package/dist/cli/commands/extension/bundled-catalog.js +268 -0
- package/dist/cli/commands/extension/bundled-catalog.js.map +1 -0
- package/dist/cli/commands/extension/doctor.d.ts +31 -0
- package/dist/cli/commands/extension/doctor.js +345 -0
- package/dist/cli/commands/extension/doctor.js.map +1 -0
- package/dist/cli/commands/extension/install-sources.d.ts +37 -0
- package/dist/cli/commands/extension/install-sources.js +384 -0
- package/dist/cli/commands/extension/install-sources.js.map +1 -0
- package/dist/cli/commands/extension/managed-state.d.ts +48 -0
- package/dist/cli/commands/extension/managed-state.js +172 -0
- package/dist/cli/commands/extension/managed-state.js.map +1 -0
- package/dist/cli/commands/extension/scaffold.d.ts +14 -0
- package/dist/cli/commands/extension/scaffold.js +169 -0
- package/dist/cli/commands/extension/scaffold.js.map +1 -0
- package/dist/cli/commands/extension/shared.d.ts +14 -0
- package/dist/cli/commands/extension/shared.js +106 -0
- package/dist/cli/commands/extension/shared.js.map +1 -0
- package/dist/cli/commands/extension.d.ts +37 -68
- package/dist/cli/commands/extension.js +157 -1319
- package/dist/cli/commands/extension.js.map +1 -1
- package/dist/cli/commands/files.d.ts +1 -12
- package/dist/cli/commands/files.js +14 -318
- 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 +52 -9
- package/dist/cli/commands/get.js.map +1 -1
- package/dist/cli/commands/health.d.ts +10 -0
- package/dist/cli/commands/health.js +269 -76
- 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 +35 -113
- 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 +172 -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/legacy-none-tokens.d.ts +3 -0
- package/dist/cli/commands/legacy-none-tokens.js +39 -0
- package/dist/cli/commands/legacy-none-tokens.js.map +1 -0
- package/dist/cli/commands/linked-artifacts.d.ts +96 -0
- package/dist/cli/commands/linked-artifacts.js +335 -0
- package/dist/cli/commands/linked-artifacts.js.map +1 -0
- 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/linked-test-parsers.d.ts +28 -0
- package/dist/cli/commands/linked-test-parsers.js +192 -0
- package/dist/cli/commands/linked-test-parsers.js.map +1 -0
- package/dist/cli/commands/list.js +49 -24
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/normalize.js +4 -3
- package/dist/cli/commands/normalize.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/recurrence-parsers.d.ts +26 -0
- package/dist/cli/commands/recurrence-parsers.js +98 -0
- package/dist/cli/commands/recurrence-parsers.js.map +1 -0
- package/dist/cli/commands/restore.js +24 -56
- 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 +154 -42
- 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/linked-command-detection.d.ts +37 -0
- package/dist/cli/commands/test/linked-command-detection.js +200 -0
- package/dist/cli/commands/test/linked-command-detection.js.map +1 -0
- 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 +2 -2
- package/dist/cli/commands/test.js +12 -357
- package/dist/cli/commands/test.js.map +1 -1
- package/dist/cli/commands/update-many.js +6 -9
- package/dist/cli/commands/update-many.js.map +1 -1
- package/dist/cli/commands/update.js +167 -401
- 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.d.ts +1 -0
- package/dist/cli/error-guidance.js +100 -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.d.ts +11 -0
- package/dist/cli/main.js +109 -55
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/register-list-query.d.ts +5 -2
- package/dist/cli/register-list-query.js +254 -192
- 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 +247 -64
- package/dist/cli/register-mutation.js.map +1 -1
- package/dist/cli/register-operations.js +17 -12
- package/dist/cli/register-operations.js.map +1 -1
- package/dist/cli/register-setup.js +33 -16
- package/dist/cli/register-setup.js.map +1 -1
- package/dist/cli/registration-helpers.d.ts +0 -2
- package/dist/cli/registration-helpers.js +14 -40
- package/dist/cli/registration-helpers.js.map +1 -1
- package/dist/cli.js +25 -4
- package/dist/cli.js.map +1 -1
- package/dist/core/config/positional-value.d.ts +44 -0
- package/dist/core/config/positional-value.js +109 -0
- package/dist/core/config/positional-value.js.map +1 -0
- package/dist/core/extensions/extension-capability-aliases.d.ts +14 -0
- package/dist/core/extensions/extension-capability-aliases.js +159 -0
- package/dist/core/extensions/extension-capability-aliases.js.map +1 -0
- package/dist/core/extensions/extension-hook-runtime.d.ts +13 -0
- package/dist/core/extensions/extension-hook-runtime.js +414 -0
- package/dist/core/extensions/extension-hook-runtime.js.map +1 -0
- package/dist/core/extensions/extension-policy.d.ts +69 -0
- package/dist/core/extensions/extension-policy.js +481 -0
- package/dist/core/extensions/extension-policy.js.map +1 -0
- package/dist/core/extensions/extension-registries.d.ts +8 -0
- package/dist/core/extensions/extension-registries.js +52 -0
- package/dist/core/extensions/extension-registries.js.map +1 -0
- package/dist/core/extensions/extension-runtime-helpers.d.ts +6 -0
- package/dist/core/extensions/extension-runtime-helpers.js +29 -0
- package/dist/core/extensions/extension-runtime-helpers.js.map +1 -0
- package/dist/core/extensions/extension-types.d.ts +13 -39
- package/dist/core/extensions/extension-types.js +34 -2
- package/dist/core/extensions/extension-types.js.map +1 -1
- package/dist/core/extensions/index.d.ts +7 -1
- package/dist/core/extensions/index.js +11 -14
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts +4 -22
- package/dist/core/extensions/loader.js +23 -1146
- 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 +22 -0
- package/dist/core/history/drift-scan.js +149 -0
- package/dist/core/history/drift-scan.js.map +1 -0
- package/dist/core/history/history-rewrite.d.ts +43 -0
- package/dist/core/history/history-rewrite.js +48 -0
- package/dist/core/history/history-rewrite.js.map +1 -0
- package/dist/core/history/history.js +5 -4
- package/dist/core/history/history.js.map +1 -1
- package/dist/core/history/replay.d.ts +82 -0
- package/dist/core/history/replay.js +250 -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-record.d.ts +19 -0
- package/dist/core/item/item-record.js +24 -0
- package/dist/core/item/item-record.js.map +1 -0
- 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/output/mutation-projection.d.ts +31 -0
- package/dist/core/output/mutation-projection.js +103 -0
- package/dist/core/output/mutation-projection.js.map +1 -0
- package/dist/core/output/output.d.ts +2 -0
- package/dist/core/output/output.js +5 -3
- package/dist/core/output/output.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 +17 -45
- 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/search/vector-stores.js +46 -9
- package/dist/core/search/vector-stores.js.map +1 -1
- package/dist/core/sentry/helpers.d.ts +1 -1
- package/dist/core/sentry/helpers.js +20 -3
- package/dist/core/sentry/helpers.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/command-types.d.ts +1 -0
- package/dist/core/shared/command-types.js +2 -2
- package/dist/core/shared/command-types.js.map +1 -1
- package/dist/core/shared/constants.d.ts +10 -1
- package/dist/core/shared/constants.js +56 -58
- package/dist/core/shared/constants.js.map +1 -1
- 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/primitives.d.ts +23 -0
- package/dist/core/shared/primitives.js +39 -2
- package/dist/core/shared/primitives.js.map +1 -1
- 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/front-matter-cache.d.ts +16 -2
- package/dist/core/store/front-matter-cache.js +99 -33
- package/dist/core/store/front-matter-cache.js.map +1 -1
- package/dist/core/store/item-store.d.ts +2 -0
- package/dist/core/store/item-store.js +76 -110
- 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 +138 -39
- package/dist/mcp/server.js.map +1 -1
- package/dist/sdk/cli-contracts/enum-contracts.d.ts +20 -0
- package/dist/sdk/cli-contracts/enum-contracts.js +156 -0
- package/dist/sdk/cli-contracts/enum-contracts.js.map +1 -0
- package/dist/sdk/cli-contracts/tool-option-contracts.d.ts +14 -0
- package/dist/sdk/cli-contracts/tool-option-contracts.js +243 -0
- package/dist/sdk/cli-contracts/tool-option-contracts.js.map +1 -0
- package/dist/sdk/cli-contracts/tool-parameter-tables.d.ts +11 -0
- package/dist/sdk/cli-contracts/tool-parameter-tables.js +901 -0
- package/dist/sdk/cli-contracts/tool-parameter-tables.js.map +1 -0
- package/dist/sdk/cli-contracts.d.ts +18 -33
- package/dist/sdk/cli-contracts.js +96 -1238
- package/dist/sdk/cli-contracts.js.map +1 -1
- package/dist/sdk/package-import-adapters.d.ts +74 -0
- package/dist/sdk/package-import-adapters.js +186 -0
- package/dist/sdk/package-import-adapters.js.map +1 -0
- package/dist/sdk/package-runtime-options.d.ts +26 -0
- package/dist/sdk/package-runtime-options.js +71 -0
- package/dist/sdk/package-runtime-options.js.map +1 -0
- package/dist/sdk/runtime.d.ts +27 -1
- package/dist/sdk/runtime.js +48 -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 +13 -11
- package/docs/ARCHITECTURE.md +1 -1
- package/docs/CLAUDE_CODE_PLUGIN.md +5 -28
- package/docs/CODEX_PLUGIN.md +5 -5
- package/docs/COMMANDS.md +58 -9
- package/docs/CONFIGURATION.md +16 -1
- package/docs/EXTENSIONS.md +4 -63
- package/docs/RELEASING.md +12 -8
- package/docs/SDK.md +11 -2
- package/marketplace.json +7 -3
- package/package.json +18 -14
- package/packages/pm-beads/extensions/beads/index.js +2 -49
- package/packages/pm-beads/extensions/beads/index.ts +2 -54
- package/packages/pm-beads/extensions/beads/runtime-loader.js +86 -0
- package/packages/pm-beads/extensions/beads/runtime-loader.ts +88 -0
- package/packages/pm-beads/extensions/beads/runtime.js +26 -115
- package/packages/pm-beads/extensions/beads/runtime.ts +33 -132
- package/packages/pm-calendar/README.md +3 -1
- package/packages/pm-calendar/extensions/calendar/index.js +66 -2
- package/packages/pm-calendar/extensions/calendar/index.ts +71 -2
- package/packages/pm-calendar/extensions/calendar/runtime.js +1 -0
- package/packages/pm-calendar/extensions/calendar/runtime.ts +1 -0
- package/packages/pm-governance-audit/extensions/governance-audit/runtime.js +14 -41
- package/packages/pm-governance-audit/extensions/governance-audit/runtime.ts +25 -41
- package/packages/pm-guide-shell/extensions/guide-shell/runtime.js +10 -50
- package/packages/pm-guide-shell/extensions/guide-shell/runtime.ts +17 -50
- package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/runtime.js +8 -40
- package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/runtime.ts +10 -40
- package/packages/pm-search-advanced/README.md +8 -0
- package/packages/pm-search-advanced/extensions/search-advanced/index.js +75 -1
- package/packages/pm-search-advanced/extensions/search-advanced/index.ts +74 -0
- package/packages/pm-search-advanced/extensions/search-advanced/runtime.js +58 -33
- package/packages/pm-search-advanced/extensions/search-advanced/runtime.ts +60 -33
- package/packages/pm-templates/extensions/templates/runtime.js +11 -202
- package/packages/pm-templates/extensions/templates/runtime.ts +38 -230
- package/packages/pm-todos/extensions/todos/index.js +3 -50
- package/packages/pm-todos/extensions/todos/index.ts +3 -55
- package/packages/pm-todos/extensions/todos/runtime-loader.js +86 -0
- package/packages/pm-todos/extensions/todos/runtime-loader.ts +88 -0
- package/packages/pm-todos/extensions/todos/runtime.js +24 -117
- package/packages/pm-todos/extensions/todos/runtime.ts +32 -129
- package/plugins/pm-claude/README.md +2 -2
- package/plugins/pm-claude/commands/pm-planner.md +1 -15
- package/plugins/pm-claude/scripts/pm-mcp-server.mjs +5 -2
- package/plugins/pm-claude/skills/pm-planner/SKILL.md +3 -21
- package/plugins/pm-codex/scripts/pm-mcp-server.mjs +15 -6
- package/plugins/pm-codex/skills/pm-native/SKILL.md +1 -13
- package/PRD.md +0 -1734
- 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,11 +1,14 @@
|
|
|
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]="94e19c77-3288-5a43-a8b2-6b9f15d4f234")}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 { toItemRecord } from "../../core/item/item-record.js";
|
|
7
|
+
import { buildInvalidTypeError } from "../../core/schema/item-types-file.js";
|
|
6
8
|
import { normalizeParentReferenceValue, validateMissingParentReference, } from "../../core/item/parent-reference-policy.js";
|
|
7
9
|
import { validateSprintOrReleaseValue } from "../../core/item/sprint-release-format.js";
|
|
8
10
|
import { createStdinTokenResolver, parseCsvKv, parseOptionalNumber, parseTags } from "../../core/item/parse.js";
|
|
11
|
+
import { resolvePriority } from "../../core/item/priority.js";
|
|
9
12
|
import { normalizeStatusInput } from "../../core/item/status.js";
|
|
10
13
|
import { collectRuntimeUpdateFieldValues } from "../../core/schema/runtime-field-values.js";
|
|
11
14
|
import { resolveRuntimeFieldRegistry, resolveRuntimeStatusRegistry, } from "../../core/schema/runtime-schema.js";
|
|
@@ -19,9 +22,11 @@ import { getSettingsPath, resolvePmRoot } from "../../core/store/paths.js";
|
|
|
19
22
|
import { readSettings } from "../../core/store/settings.js";
|
|
20
23
|
import { runClose } from "./close.js";
|
|
21
24
|
import { normalizeRiskInput, normalizeSeverityInput, parseConfidenceInput, parseRegressionInput, } from "./metadata-normalizers.js";
|
|
22
|
-
import {
|
|
25
|
+
import { resolveEventEndAt } from "./event-validation-messages.js";
|
|
26
|
+
import { assertNoLegacyNoneToken, assertNoLegacyNoneTokens, isLegacyNoneToken } from "./legacy-none-tokens.js";
|
|
27
|
+
import { ensureEnumValue as ensureEnum, parseEventBoolean, parseRecurrenceRule } from "./recurrence-parsers.js";
|
|
28
|
+
import { DEPENDENCY_KIND_VALUES, ISSUE_SEVERITY_VALUES, RISK_VALUES, } from "../../types/index.js";
|
|
23
29
|
import { parseDocs, parseFiles, parseLogSeed, parseTests } from "./create.js";
|
|
24
|
-
const LEGACY_NONE_TOKENS = new Set(["none", "null"]);
|
|
25
30
|
const UPDATE_UNSET_FIELD_DEFINITIONS = [
|
|
26
31
|
{ canonical: "tags", aliases: ["tags"], optionKey: "tags", frontMatterKey: "tags" },
|
|
27
32
|
{ canonical: "close-reason", aliases: ["close_reason", "close-reason"], optionKey: "closeReason", frontMatterKey: "close_reason" },
|
|
@@ -167,30 +172,6 @@ function toAuthor(candidate, defaultAuthor) {
|
|
|
167
172
|
const trimmed = resolved.trim();
|
|
168
173
|
return trimmed || "unknown";
|
|
169
174
|
}
|
|
170
|
-
function isLegacyNoneToken(value) {
|
|
171
|
-
if (value === undefined) {
|
|
172
|
-
return false;
|
|
173
|
-
}
|
|
174
|
-
return LEGACY_NONE_TOKENS.has(value.trim().toLowerCase());
|
|
175
|
-
}
|
|
176
|
-
function assertNoLegacyNoneToken(value, flag, replacementHint) {
|
|
177
|
-
if (!isLegacyNoneToken(value)) {
|
|
178
|
-
return;
|
|
179
|
-
}
|
|
180
|
-
const suffix = replacementHint ? ` ${replacementHint}` : "";
|
|
181
|
-
throw new PmCliError(`${flag} no longer accepts "none" or "null".${suffix}`.trim(), EXIT_CODE.USAGE);
|
|
182
|
-
}
|
|
183
|
-
function assertNoLegacyNoneTokens(values, flag, replacementHint) {
|
|
184
|
-
if (!values || values.length === 0) {
|
|
185
|
-
return;
|
|
186
|
-
}
|
|
187
|
-
const hasLegacyToken = values.some((value) => isLegacyNoneToken(value));
|
|
188
|
-
if (!hasLegacyToken) {
|
|
189
|
-
return;
|
|
190
|
-
}
|
|
191
|
-
const suffix = replacementHint ? ` ${replacementHint}` : "";
|
|
192
|
-
throw new PmCliError(`${flag} no longer accepts "none" or "null".${suffix}`.trim(), EXIT_CODE.USAGE);
|
|
193
|
-
}
|
|
194
175
|
const UPDATE_LEGACY_NONE_COLLECTION_NORMALIZERS = [
|
|
195
176
|
{ optionKey: "dep", clearFlagKey: "clearDeps", valueFlag: "--dep", clearFlag: "--clear-deps", disableReplaceFlagKey: "replaceDeps" },
|
|
196
177
|
{ optionKey: "comment", clearFlagKey: "clearComments", valueFlag: "--comment", clearFlag: "--clear-comments" },
|
|
@@ -478,12 +459,6 @@ function enforceAllowAuditUpdateScope(options, clearFrontMatterKeys) {
|
|
|
478
459
|
throw new PmCliError(`--allow-audit-update only supports non-lifecycle metadata fields. Remove restricted options: ${disallowedFlags.join(", ")}`, EXIT_CODE.USAGE);
|
|
479
460
|
}
|
|
480
461
|
}
|
|
481
|
-
function ensureEnum(value, allowed, label) {
|
|
482
|
-
if (!allowed.includes(value)) {
|
|
483
|
-
throw new PmCliError(`Invalid ${label} value "${value}"`, EXIT_CODE.USAGE);
|
|
484
|
-
}
|
|
485
|
-
return value;
|
|
486
|
-
}
|
|
487
462
|
function parseStatus(value, statusRegistry) {
|
|
488
463
|
const normalized = normalizeStatusInput(value, statusRegistry);
|
|
489
464
|
if (!normalized) {
|
|
@@ -492,16 +467,13 @@ function parseStatus(value, statusRegistry) {
|
|
|
492
467
|
}
|
|
493
468
|
return normalized;
|
|
494
469
|
}
|
|
495
|
-
function weekdayOrderIndex(value) {
|
|
496
|
-
return RECURRENCE_WEEKDAY_VALUES.indexOf(value);
|
|
497
|
-
}
|
|
498
470
|
function parseReminderEntries(raw, nowValue) {
|
|
499
471
|
return raw.map((entry) => {
|
|
500
472
|
const kv = parseCsvKv(entry, "--reminder");
|
|
501
|
-
const atRaw = kv.at?.trim();
|
|
502
|
-
const textRaw = kv.text?.trim();
|
|
473
|
+
const atRaw = (kv.at ?? kv.date)?.trim();
|
|
474
|
+
const textRaw = (kv.text ?? kv.title)?.trim();
|
|
503
475
|
if (!atRaw || !textRaw) {
|
|
504
|
-
throw new PmCliError("--reminder requires at=<iso|relative>
|
|
476
|
+
throw new PmCliError("--reminder requires at=<iso|relative> or date=<iso|relative>, plus text=<value> or title=<value>", EXIT_CODE.USAGE);
|
|
505
477
|
}
|
|
506
478
|
return {
|
|
507
479
|
at: resolveIsoOrRelative(atRaw, nowValue, "reminder.at"),
|
|
@@ -509,75 +481,6 @@ function parseReminderEntries(raw, nowValue) {
|
|
|
509
481
|
};
|
|
510
482
|
});
|
|
511
483
|
}
|
|
512
|
-
function parseEventBoolean(value, flag) {
|
|
513
|
-
const normalized = value.trim().toLowerCase();
|
|
514
|
-
if (normalized === "true" || normalized === "1" || normalized === "yes") {
|
|
515
|
-
return true;
|
|
516
|
-
}
|
|
517
|
-
if (normalized === "false" || normalized === "0" || normalized === "no") {
|
|
518
|
-
return false;
|
|
519
|
-
}
|
|
520
|
-
throw new PmCliError(`${flag} must be one of true|false|1|0|yes|no`, EXIT_CODE.USAGE);
|
|
521
|
-
}
|
|
522
|
-
function parseDelimitedList(raw) {
|
|
523
|
-
if (!raw) {
|
|
524
|
-
return [];
|
|
525
|
-
}
|
|
526
|
-
return raw
|
|
527
|
-
.split("|")
|
|
528
|
-
.map((value) => value.trim())
|
|
529
|
-
.filter((value) => value.length > 0);
|
|
530
|
-
}
|
|
531
|
-
function parseRecurrenceRule(kv, startAt, nowValue) {
|
|
532
|
-
const freqRaw = kv.recur_freq?.trim();
|
|
533
|
-
const intervalRaw = kv.recur_interval?.trim();
|
|
534
|
-
const countRaw = kv.recur_count?.trim();
|
|
535
|
-
const untilRaw = kv.recur_until?.trim();
|
|
536
|
-
const byWeekdayRaw = kv.recur_by_weekday?.trim();
|
|
537
|
-
const byMonthDayRaw = kv.recur_by_month_day?.trim();
|
|
538
|
-
const exdatesRaw = kv.recur_exdates?.trim();
|
|
539
|
-
const recurrenceInputsProvided = [freqRaw, intervalRaw, countRaw, untilRaw, byWeekdayRaw, byMonthDayRaw, exdatesRaw].some((value) => value !== undefined);
|
|
540
|
-
if (!recurrenceInputsProvided) {
|
|
541
|
-
return undefined;
|
|
542
|
-
}
|
|
543
|
-
if (!freqRaw) {
|
|
544
|
-
throw new PmCliError("--event recurrence fields require recur_freq=<daily|weekly|monthly|yearly>", EXIT_CODE.USAGE);
|
|
545
|
-
}
|
|
546
|
-
const freq = ensureEnum(freqRaw.toLowerCase(), RECURRENCE_FREQUENCY_VALUES, "event recurrence frequency");
|
|
547
|
-
const interval = intervalRaw ? parseOptionalNumber(intervalRaw, "event recur_interval") : undefined;
|
|
548
|
-
if (interval !== undefined && (!Number.isInteger(interval) || interval < 1)) {
|
|
549
|
-
throw new PmCliError("--event recur_interval must be an integer >= 1", EXIT_CODE.USAGE);
|
|
550
|
-
}
|
|
551
|
-
const count = countRaw ? parseOptionalNumber(countRaw, "event recur_count") : undefined;
|
|
552
|
-
if (count !== undefined && (!Number.isInteger(count) || count < 1)) {
|
|
553
|
-
throw new PmCliError("--event recur_count must be an integer >= 1", EXIT_CODE.USAGE);
|
|
554
|
-
}
|
|
555
|
-
const until = untilRaw ? resolveIsoOrRelative(untilRaw, nowValue, "event.recur_until") : undefined;
|
|
556
|
-
if (until && until < startAt) {
|
|
557
|
-
throw new PmCliError("--event recur_until must be at or after start", EXIT_CODE.USAGE);
|
|
558
|
-
}
|
|
559
|
-
const byWeekday = Array.from(new Set(parseDelimitedList(byWeekdayRaw)
|
|
560
|
-
.map((value) => ensureEnum(value.toLowerCase(), RECURRENCE_WEEKDAY_VALUES, "event weekday")))).sort((left, right) => weekdayOrderIndex(left) -
|
|
561
|
-
weekdayOrderIndex(right));
|
|
562
|
-
const byMonthDay = Array.from(new Set(parseDelimitedList(byMonthDayRaw)
|
|
563
|
-
.map((value) => {
|
|
564
|
-
const day = parseOptionalNumber(value, "event recur_by_month_day");
|
|
565
|
-
if (!Number.isInteger(day) || day < 1 || day > 31) {
|
|
566
|
-
throw new PmCliError("--event recur_by_month_day values must be integers 1..31", EXIT_CODE.USAGE);
|
|
567
|
-
}
|
|
568
|
-
return day;
|
|
569
|
-
}))).sort((left, right) => left - right);
|
|
570
|
-
const exdates = Array.from(new Set(parseDelimitedList(exdatesRaw).map((value) => resolveIsoOrRelative(value, nowValue, "event.recur_exdates")))).sort((left, right) => left.localeCompare(right));
|
|
571
|
-
return {
|
|
572
|
-
freq,
|
|
573
|
-
interval,
|
|
574
|
-
count,
|
|
575
|
-
until,
|
|
576
|
-
by_weekday: byWeekday.length > 0 ? byWeekday : undefined,
|
|
577
|
-
by_month_day: byMonthDay.length > 0 ? byMonthDay : undefined,
|
|
578
|
-
exdates: exdates.length > 0 ? exdates : undefined,
|
|
579
|
-
};
|
|
580
|
-
}
|
|
581
484
|
function parseEventEntries(raw, nowValue) {
|
|
582
485
|
return raw.map((entry) => {
|
|
583
486
|
const kv = parseCsvKv(entry, "--event");
|
|
@@ -587,10 +490,8 @@ function parseEventEntries(raw, nowValue) {
|
|
|
587
490
|
}
|
|
588
491
|
const startAt = resolveIsoOrRelative(startRaw, nowValue, "event.start");
|
|
589
492
|
const endRaw = kv.end?.trim();
|
|
590
|
-
const
|
|
591
|
-
|
|
592
|
-
throw new PmCliError("--event end must be after start", EXIT_CODE.USAGE);
|
|
593
|
-
}
|
|
493
|
+
const durationRaw = kv.duration?.trim();
|
|
494
|
+
const endAt = resolveEventEndAt(startAt, endRaw, durationRaw, nowValue);
|
|
594
495
|
const titleRaw = kv.title;
|
|
595
496
|
const descriptionRaw = kv.description;
|
|
596
497
|
const locationRaw = kv.location;
|
|
@@ -612,7 +513,7 @@ function parseEventEntries(raw, nowValue) {
|
|
|
612
513
|
throw new PmCliError("--event timezone must not be empty", EXIT_CODE.USAGE);
|
|
613
514
|
}
|
|
614
515
|
const allDayRaw = kv.all_day?.trim();
|
|
615
|
-
const recurrence = parseRecurrenceRule(kv, startAt, nowValue);
|
|
516
|
+
const recurrence = parseRecurrenceRule(kv, startAt, nowValue, "truthy");
|
|
616
517
|
return {
|
|
617
518
|
start_at: startAt,
|
|
618
519
|
end_at: endAt,
|
|
@@ -750,6 +651,63 @@ function parseDependencyRemovals(raw, prefix) {
|
|
|
750
651
|
function dependencyKey(value) {
|
|
751
652
|
return `${value.id}::${value.kind}::${value.source_kind ?? ""}`;
|
|
752
653
|
}
|
|
654
|
+
// pm-kyd6: `--blocked-by` writes the `blocked_by` scalar, but the dependency
|
|
655
|
+
// graph (`pm deps`) is built only from the `dependencies` array. Mirror the
|
|
656
|
+
// behaviour create.ts already has so the metadata and the graph agree: a
|
|
657
|
+
// resolvable blocker also gets a `blocked_by` dependency edge, clearing the
|
|
658
|
+
// scalar removes that edge, and re-pointing it replaces the prior edge.
|
|
659
|
+
function reconcileBlockedByDependency(current, nextBlockedById, nowIsoValue, author) {
|
|
660
|
+
let next = [...(current ?? [])];
|
|
661
|
+
let changed = false;
|
|
662
|
+
const filtered = next.filter((dep) => dep.kind !== "blocked_by" || dep.id === nextBlockedById);
|
|
663
|
+
if (filtered.length !== next.length) {
|
|
664
|
+
next = filtered;
|
|
665
|
+
changed = true;
|
|
666
|
+
}
|
|
667
|
+
if (nextBlockedById && !next.some((dep) => dep.kind === "blocked_by" && dep.id === nextBlockedById)) {
|
|
668
|
+
next.push({ id: nextBlockedById, kind: "blocked_by", created_at: nowIsoValue, author });
|
|
669
|
+
changed = true;
|
|
670
|
+
}
|
|
671
|
+
if (!changed) {
|
|
672
|
+
return { dependencies: current, changed: false };
|
|
673
|
+
}
|
|
674
|
+
return { dependencies: next.length > 0 ? next : undefined, changed: true };
|
|
675
|
+
}
|
|
676
|
+
// pm-kyd6: resolve the --blocked-by target before the synchronous mutate
|
|
677
|
+
// callback so a real blocker can also become a `blocked_by` dependency edge.
|
|
678
|
+
// `id` is set when the target resolves; `unresolved` carries the raw value when
|
|
679
|
+
// --blocked-by points at an item that does not exist (the scalar is still set,
|
|
680
|
+
// mirroring create.ts and the never-block missing-parent behaviour, but the
|
|
681
|
+
// caller surfaces a warning so the metadata/graph mismatch is visible).
|
|
682
|
+
async function resolveBlockedByDependencyTarget(blockedByOption, blockedByCleared, pmRoot, idPrefix, itemFormat, typeToFolder) {
|
|
683
|
+
if (blockedByOption === undefined || blockedByCleared) {
|
|
684
|
+
return {};
|
|
685
|
+
}
|
|
686
|
+
const blockedByValue = blockedByOption.trim();
|
|
687
|
+
if (blockedByValue.length === 0) {
|
|
688
|
+
return {};
|
|
689
|
+
}
|
|
690
|
+
const located = await locateItem(pmRoot, normalizeItemId(blockedByValue, idPrefix), idPrefix, itemFormat, typeToFolder);
|
|
691
|
+
return located ? { id: located.id } : { unresolved: blockedByValue };
|
|
692
|
+
}
|
|
693
|
+
// pm-kyd6: apply the reconciled blocked_by dependency edge to the item metadata
|
|
694
|
+
// and record the `dependencies` change. Kept out of the mutate callback so the
|
|
695
|
+
// large runUpdate function stays under the static-quality complexity budget.
|
|
696
|
+
function applyBlockedByDependencyEdge(metadata, resolvedBlockedById, nowIsoValue, author, changedFields) {
|
|
697
|
+
const reconciled = reconcileBlockedByDependency(metadata.dependencies, resolvedBlockedById, nowIsoValue, author);
|
|
698
|
+
if (!reconciled.changed) {
|
|
699
|
+
return;
|
|
700
|
+
}
|
|
701
|
+
if (reconciled.dependencies === undefined) {
|
|
702
|
+
delete metadata.dependencies;
|
|
703
|
+
}
|
|
704
|
+
else {
|
|
705
|
+
metadata.dependencies = reconciled.dependencies;
|
|
706
|
+
}
|
|
707
|
+
if (!changedFields.includes("dependencies")) {
|
|
708
|
+
changedFields.push("dependencies");
|
|
709
|
+
}
|
|
710
|
+
}
|
|
753
711
|
function fileKey(value) {
|
|
754
712
|
return `${value.path}::${value.scope}`;
|
|
755
713
|
}
|
|
@@ -772,11 +730,7 @@ function matchesDependencySelector(value, selector) {
|
|
|
772
730
|
return true;
|
|
773
731
|
}
|
|
774
732
|
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;
|
|
733
|
+
return resolvePriority(raw);
|
|
780
734
|
}
|
|
781
735
|
function normalizeUpdatePolicyOptionKey(raw, typeName) {
|
|
782
736
|
const canonical = canonicalizeCommandOptionKey("update", raw);
|
|
@@ -1134,6 +1088,13 @@ export async function runUpdate(id, options, global) {
|
|
|
1134
1088
|
parentReferenceWarnings.push(...validateMissingParentReference(normalizedParentId, parentReferencePolicy).warnings);
|
|
1135
1089
|
}
|
|
1136
1090
|
}
|
|
1091
|
+
// pm-kyd6: resolve the --blocked-by target up front (async) so the sync
|
|
1092
|
+
// mutate callback can mirror create.ts and add a `blocked_by` dependency edge.
|
|
1093
|
+
const blockedByResolution = await resolveBlockedByDependencyTarget(options.blockedBy, clearFrontMatterKeys.has("blocked_by"), pmRoot, settings.id_prefix, settings.item_format, typeRegistry.type_to_folder);
|
|
1094
|
+
const resolvedBlockedByDependencyId = blockedByResolution.id;
|
|
1095
|
+
if (blockedByResolution.unresolved !== undefined) {
|
|
1096
|
+
parentReferenceWarnings.push(`blocked_by_unresolved:${blockedByResolution.unresolved}`);
|
|
1097
|
+
}
|
|
1137
1098
|
const fieldFlags = {
|
|
1138
1099
|
title: options.title !== undefined,
|
|
1139
1100
|
description: options.description !== undefined,
|
|
@@ -1210,37 +1171,47 @@ export async function runUpdate(id, options, global) {
|
|
|
1210
1171
|
}
|
|
1211
1172
|
const { document } = await readLocatedItem(located, { schema: settings.schema });
|
|
1212
1173
|
return {
|
|
1213
|
-
item: document.metadata,
|
|
1174
|
+
item: toItemRecord(document.metadata),
|
|
1214
1175
|
changed_fields: [],
|
|
1215
1176
|
warnings: ["noop_no_update_fields"],
|
|
1216
1177
|
};
|
|
1217
1178
|
}
|
|
1218
|
-
|
|
1179
|
+
// `pm update --status <close_status>` always routes to the auditable close
|
|
1180
|
+
// workflow so agents are never blocked by close-through-update errors. Any
|
|
1181
|
+
// other field updates in the same call are applied first, then the item is
|
|
1182
|
+
// closed with the supplied --close-reason (or a derived default when omitted).
|
|
1183
|
+
if (fieldFlags.status) {
|
|
1219
1184
|
const targetStatus = normalizeStatusInput(options.status, statusRegistry);
|
|
1220
1185
|
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
|
-
});
|
|
1186
|
+
const otherFieldKeys = Object.entries(fieldFlags)
|
|
1187
|
+
.filter(([key, value]) => value && key !== "status" && key !== "closeReason")
|
|
1188
|
+
.map(([key]) => key);
|
|
1189
|
+
const routeWarnings = [];
|
|
1190
|
+
let preChangedFields = [];
|
|
1191
|
+
if (otherFieldKeys.length > 0) {
|
|
1192
|
+
const preUpdate = await runUpdate(id, { ...options, status: undefined, closeReason: undefined, message: undefined }, global);
|
|
1193
|
+
preChangedFields = preUpdate.changed_fields;
|
|
1194
|
+
routeWarnings.push(...preUpdate.warnings);
|
|
1234
1195
|
}
|
|
1235
|
-
const
|
|
1196
|
+
const explicitReason = typeof options.closeReason === "string" ? options.closeReason.trim() : "";
|
|
1197
|
+
const fallbackMessage = typeof options.message === "string" ? options.message.trim() : "";
|
|
1198
|
+
const closeReason = explicitReason || fallbackMessage || "Closed via pm update";
|
|
1199
|
+
// Only flag a defaulted reason when neither --close-reason nor --message
|
|
1200
|
+
// supplied any text and we had to invent the generic placeholder.
|
|
1201
|
+
const reasonDefaulted = explicitReason.length === 0 && fallbackMessage.length === 0;
|
|
1202
|
+
const closeResult = await runClose(id, closeReason, {
|
|
1236
1203
|
author: options.author,
|
|
1237
1204
|
message: options.message,
|
|
1238
1205
|
force: options.force,
|
|
1239
1206
|
}, global);
|
|
1207
|
+
const warnings = [...routeWarnings, ...closeResult.warnings, "auto_routed_from_update_to_close"];
|
|
1208
|
+
if (reasonDefaulted) {
|
|
1209
|
+
warnings.push("close_reason_defaulted");
|
|
1210
|
+
}
|
|
1240
1211
|
return {
|
|
1241
1212
|
item: closeResult.item,
|
|
1242
|
-
changed_fields: closeResult.changed_fields,
|
|
1243
|
-
warnings
|
|
1213
|
+
changed_fields: [...preChangedFields, ...closeResult.changed_fields],
|
|
1214
|
+
warnings,
|
|
1244
1215
|
};
|
|
1245
1216
|
}
|
|
1246
1217
|
}
|
|
@@ -1261,6 +1232,27 @@ export async function runUpdate(id, options, global) {
|
|
|
1261
1232
|
const changedFields = [];
|
|
1262
1233
|
const warnings = [];
|
|
1263
1234
|
let activeTypeName = resolveTypeName(document.metadata.type, typeRegistry) ?? document.metadata.type;
|
|
1235
|
+
// Declarative set-or-clear helpers for the many string scalar fields that
|
|
1236
|
+
// share an identical shape: set from `--flag` (optionally transformed) or
|
|
1237
|
+
// delete when `--unset <field>` was requested, then record the change.
|
|
1238
|
+
// Each call is placed in the same position the inline block occupied so
|
|
1239
|
+
// the order of `changedFields` is preserved exactly (pm-why9).
|
|
1240
|
+
const metadataRecord = toItemRecord(document.metadata);
|
|
1241
|
+
const setOrClearScalar = (optionValue, metadataKey, transform) => {
|
|
1242
|
+
if (optionValue === undefined && !clearFrontMatterKeys.has(metadataKey)) {
|
|
1243
|
+
return;
|
|
1244
|
+
}
|
|
1245
|
+
if (clearFrontMatterKeys.has(metadataKey)) {
|
|
1246
|
+
delete metadataRecord[metadataKey];
|
|
1247
|
+
}
|
|
1248
|
+
else {
|
|
1249
|
+
metadataRecord[metadataKey] = transform(optionValue);
|
|
1250
|
+
}
|
|
1251
|
+
changedFields.push(metadataKey);
|
|
1252
|
+
};
|
|
1253
|
+
const setOrClearTrimScalar = (optionValue, metadataKey) => {
|
|
1254
|
+
setOrClearScalar(optionValue, metadataKey, (value) => value.trim());
|
|
1255
|
+
};
|
|
1264
1256
|
if (options.title !== undefined) {
|
|
1265
1257
|
document.metadata.title = options.title;
|
|
1266
1258
|
changedFields.push("title");
|
|
@@ -1276,21 +1268,9 @@ export async function runUpdate(id, options, global) {
|
|
|
1276
1268
|
const previousStatus = document.metadata.status;
|
|
1277
1269
|
const previousStatusNormalized = normalizeStatusInput(previousStatus, statusRegistry) ?? previousStatus;
|
|
1278
1270
|
if (options.status !== undefined) {
|
|
1271
|
+
// Close-status routing (with reason + audit) is handled before mutateItem
|
|
1272
|
+
// by the close gate above, so only non-close transitions reach this path.
|
|
1279
1273
|
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
1274
|
document.metadata.status = status;
|
|
1295
1275
|
if (status === statusRegistry.canceled_status) {
|
|
1296
1276
|
delete document.metadata.assignee;
|
|
@@ -1324,7 +1304,7 @@ export async function runUpdate(id, options, global) {
|
|
|
1324
1304
|
if (options.type !== undefined) {
|
|
1325
1305
|
const resolvedTypeName = resolveTypeName(options.type, typeRegistry);
|
|
1326
1306
|
if (!resolvedTypeName) {
|
|
1327
|
-
throw new PmCliError(
|
|
1307
|
+
throw new PmCliError(buildInvalidTypeError(options.type, typeRegistry.types), EXIT_CODE.USAGE);
|
|
1328
1308
|
}
|
|
1329
1309
|
document.metadata.type = resolvedTypeName;
|
|
1330
1310
|
activeTypeName = resolvedTypeName;
|
|
@@ -1482,42 +1462,10 @@ export async function runUpdate(id, options, global) {
|
|
|
1482
1462
|
document.metadata.tags = clearFrontMatterKeys.has("tags") ? [] : parseTags(options.tags);
|
|
1483
1463
|
changedFields.push("tags");
|
|
1484
1464
|
}
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
else {
|
|
1490
|
-
document.metadata.deadline = resolveIsoOrRelative(options.deadline, new Date(), "deadline");
|
|
1491
|
-
}
|
|
1492
|
-
changedFields.push("deadline");
|
|
1493
|
-
}
|
|
1494
|
-
if (options.estimatedMinutes !== undefined || clearFrontMatterKeys.has("estimated_minutes")) {
|
|
1495
|
-
if (clearFrontMatterKeys.has("estimated_minutes")) {
|
|
1496
|
-
delete document.metadata.estimated_minutes;
|
|
1497
|
-
}
|
|
1498
|
-
else {
|
|
1499
|
-
document.metadata.estimated_minutes = parseOptionalNumber(options.estimatedMinutes, "estimated-minutes");
|
|
1500
|
-
}
|
|
1501
|
-
changedFields.push("estimated_minutes");
|
|
1502
|
-
}
|
|
1503
|
-
if (options.acceptanceCriteria !== undefined || clearFrontMatterKeys.has("acceptance_criteria")) {
|
|
1504
|
-
if (clearFrontMatterKeys.has("acceptance_criteria")) {
|
|
1505
|
-
delete document.metadata.acceptance_criteria;
|
|
1506
|
-
}
|
|
1507
|
-
else {
|
|
1508
|
-
document.metadata.acceptance_criteria = options.acceptanceCriteria;
|
|
1509
|
-
}
|
|
1510
|
-
changedFields.push("acceptance_criteria");
|
|
1511
|
-
}
|
|
1512
|
-
if (options.definitionOfReady !== undefined || clearFrontMatterKeys.has("definition_of_ready")) {
|
|
1513
|
-
if (clearFrontMatterKeys.has("definition_of_ready")) {
|
|
1514
|
-
delete document.metadata.definition_of_ready;
|
|
1515
|
-
}
|
|
1516
|
-
else {
|
|
1517
|
-
document.metadata.definition_of_ready = options.definitionOfReady.trim();
|
|
1518
|
-
}
|
|
1519
|
-
changedFields.push("definition_of_ready");
|
|
1520
|
-
}
|
|
1465
|
+
setOrClearScalar(options.deadline, "deadline", (value) => resolveIsoOrRelative(value, nowValue, "deadline"));
|
|
1466
|
+
setOrClearScalar(options.estimatedMinutes, "estimated_minutes", (value) => parseOptionalNumber(value, "estimated-minutes"));
|
|
1467
|
+
setOrClearScalar(options.acceptanceCriteria, "acceptance_criteria", (value) => value);
|
|
1468
|
+
setOrClearTrimScalar(options.definitionOfReady, "definition_of_ready");
|
|
1521
1469
|
const orderRaw = options.order ?? options.rank;
|
|
1522
1470
|
if (orderRaw !== undefined || clearFrontMatterKeys.has("order")) {
|
|
1523
1471
|
if (clearFrontMatterKeys.has("order")) {
|
|
@@ -1532,60 +1480,12 @@ export async function runUpdate(id, options, global) {
|
|
|
1532
1480
|
}
|
|
1533
1481
|
changedFields.push("order");
|
|
1534
1482
|
}
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
}
|
|
1542
|
-
changedFields.push("goal");
|
|
1543
|
-
}
|
|
1544
|
-
if (options.objective !== undefined || clearFrontMatterKeys.has("objective")) {
|
|
1545
|
-
if (clearFrontMatterKeys.has("objective")) {
|
|
1546
|
-
delete document.metadata.objective;
|
|
1547
|
-
}
|
|
1548
|
-
else {
|
|
1549
|
-
document.metadata.objective = options.objective.trim();
|
|
1550
|
-
}
|
|
1551
|
-
changedFields.push("objective");
|
|
1552
|
-
}
|
|
1553
|
-
if (options.value !== undefined || clearFrontMatterKeys.has("value")) {
|
|
1554
|
-
if (clearFrontMatterKeys.has("value")) {
|
|
1555
|
-
delete document.metadata.value;
|
|
1556
|
-
}
|
|
1557
|
-
else {
|
|
1558
|
-
document.metadata.value = options.value.trim();
|
|
1559
|
-
}
|
|
1560
|
-
changedFields.push("value");
|
|
1561
|
-
}
|
|
1562
|
-
if (options.impact !== undefined || clearFrontMatterKeys.has("impact")) {
|
|
1563
|
-
if (clearFrontMatterKeys.has("impact")) {
|
|
1564
|
-
delete document.metadata.impact;
|
|
1565
|
-
}
|
|
1566
|
-
else {
|
|
1567
|
-
document.metadata.impact = options.impact.trim();
|
|
1568
|
-
}
|
|
1569
|
-
changedFields.push("impact");
|
|
1570
|
-
}
|
|
1571
|
-
if (options.outcome !== undefined || clearFrontMatterKeys.has("outcome")) {
|
|
1572
|
-
if (clearFrontMatterKeys.has("outcome")) {
|
|
1573
|
-
delete document.metadata.outcome;
|
|
1574
|
-
}
|
|
1575
|
-
else {
|
|
1576
|
-
document.metadata.outcome = options.outcome.trim();
|
|
1577
|
-
}
|
|
1578
|
-
changedFields.push("outcome");
|
|
1579
|
-
}
|
|
1580
|
-
if (options.whyNow !== undefined || clearFrontMatterKeys.has("why_now")) {
|
|
1581
|
-
if (clearFrontMatterKeys.has("why_now")) {
|
|
1582
|
-
delete document.metadata.why_now;
|
|
1583
|
-
}
|
|
1584
|
-
else {
|
|
1585
|
-
document.metadata.why_now = options.whyNow.trim();
|
|
1586
|
-
}
|
|
1587
|
-
changedFields.push("why_now");
|
|
1588
|
-
}
|
|
1483
|
+
setOrClearTrimScalar(options.goal, "goal");
|
|
1484
|
+
setOrClearTrimScalar(options.objective, "objective");
|
|
1485
|
+
setOrClearTrimScalar(options.value, "value");
|
|
1486
|
+
setOrClearTrimScalar(options.impact, "impact");
|
|
1487
|
+
setOrClearTrimScalar(options.outcome, "outcome");
|
|
1488
|
+
setOrClearTrimScalar(options.whyNow, "why_now");
|
|
1589
1489
|
if (options.assignee !== undefined || clearFrontMatterKeys.has("assignee")) {
|
|
1590
1490
|
if (clearFrontMatterKeys.has("assignee")) {
|
|
1591
1491
|
delete document.metadata.assignee;
|
|
@@ -1607,33 +1507,9 @@ export async function runUpdate(id, options, global) {
|
|
|
1607
1507
|
}
|
|
1608
1508
|
changedFields.push("parent");
|
|
1609
1509
|
}
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
}
|
|
1614
|
-
else {
|
|
1615
|
-
document.metadata.reviewer = options.reviewer.trim();
|
|
1616
|
-
}
|
|
1617
|
-
changedFields.push("reviewer");
|
|
1618
|
-
}
|
|
1619
|
-
if (options.risk !== undefined || clearFrontMatterKeys.has("risk")) {
|
|
1620
|
-
if (clearFrontMatterKeys.has("risk")) {
|
|
1621
|
-
delete document.metadata.risk;
|
|
1622
|
-
}
|
|
1623
|
-
else {
|
|
1624
|
-
document.metadata.risk = ensureEnum(normalizeRiskInput(options.risk), RISK_VALUES, "risk");
|
|
1625
|
-
}
|
|
1626
|
-
changedFields.push("risk");
|
|
1627
|
-
}
|
|
1628
|
-
if (options.confidence !== undefined || clearFrontMatterKeys.has("confidence")) {
|
|
1629
|
-
if (clearFrontMatterKeys.has("confidence")) {
|
|
1630
|
-
delete document.metadata.confidence;
|
|
1631
|
-
}
|
|
1632
|
-
else {
|
|
1633
|
-
document.metadata.confidence = parseConfidenceInput(options.confidence);
|
|
1634
|
-
}
|
|
1635
|
-
changedFields.push("confidence");
|
|
1636
|
-
}
|
|
1510
|
+
setOrClearTrimScalar(options.reviewer, "reviewer");
|
|
1511
|
+
setOrClearScalar(options.risk, "risk", (value) => ensureEnum(normalizeRiskInput(value), RISK_VALUES, "risk"));
|
|
1512
|
+
setOrClearScalar(options.confidence, "confidence", (value) => parseConfidenceInput(value));
|
|
1637
1513
|
if (options.sprint !== undefined || clearFrontMatterKeys.has("sprint")) {
|
|
1638
1514
|
if (clearFrontMatterKeys.has("sprint")) {
|
|
1639
1515
|
delete document.metadata.sprint;
|
|
@@ -1664,133 +1540,23 @@ export async function runUpdate(id, options, global) {
|
|
|
1664
1540
|
document.metadata.blocked_by = options.blockedBy.trim();
|
|
1665
1541
|
}
|
|
1666
1542
|
changedFields.push("blocked_by");
|
|
1543
|
+
// pm-kyd6: keep the dependency graph in sync with the blocked_by scalar.
|
|
1544
|
+
applyBlockedByDependencyEdge(document.metadata, resolvedBlockedByDependencyId, nowIso, author, changedFields);
|
|
1667
1545
|
}
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
document.metadata.unblock_note = options.unblockNote.trim();
|
|
1683
|
-
}
|
|
1684
|
-
changedFields.push("unblock_note");
|
|
1685
|
-
}
|
|
1686
|
-
if (options.reporter !== undefined || clearFrontMatterKeys.has("reporter")) {
|
|
1687
|
-
if (clearFrontMatterKeys.has("reporter")) {
|
|
1688
|
-
delete document.metadata.reporter;
|
|
1689
|
-
}
|
|
1690
|
-
else {
|
|
1691
|
-
document.metadata.reporter = options.reporter.trim();
|
|
1692
|
-
}
|
|
1693
|
-
changedFields.push("reporter");
|
|
1694
|
-
}
|
|
1695
|
-
if (options.severity !== undefined || clearFrontMatterKeys.has("severity")) {
|
|
1696
|
-
if (clearFrontMatterKeys.has("severity")) {
|
|
1697
|
-
delete document.metadata.severity;
|
|
1698
|
-
}
|
|
1699
|
-
else {
|
|
1700
|
-
document.metadata.severity = ensureEnum(normalizeSeverityInput(options.severity), ISSUE_SEVERITY_VALUES, "severity");
|
|
1701
|
-
}
|
|
1702
|
-
changedFields.push("severity");
|
|
1703
|
-
}
|
|
1704
|
-
if (options.environment !== undefined || clearFrontMatterKeys.has("environment")) {
|
|
1705
|
-
if (clearFrontMatterKeys.has("environment")) {
|
|
1706
|
-
delete document.metadata.environment;
|
|
1707
|
-
}
|
|
1708
|
-
else {
|
|
1709
|
-
document.metadata.environment = options.environment.trim();
|
|
1710
|
-
}
|
|
1711
|
-
changedFields.push("environment");
|
|
1712
|
-
}
|
|
1713
|
-
if (options.reproSteps !== undefined || clearFrontMatterKeys.has("repro_steps")) {
|
|
1714
|
-
if (clearFrontMatterKeys.has("repro_steps")) {
|
|
1715
|
-
delete document.metadata.repro_steps;
|
|
1716
|
-
}
|
|
1717
|
-
else {
|
|
1718
|
-
document.metadata.repro_steps = options.reproSteps.trim();
|
|
1719
|
-
}
|
|
1720
|
-
changedFields.push("repro_steps");
|
|
1721
|
-
}
|
|
1722
|
-
if (options.resolution !== undefined || clearFrontMatterKeys.has("resolution")) {
|
|
1723
|
-
if (clearFrontMatterKeys.has("resolution")) {
|
|
1724
|
-
delete document.metadata.resolution;
|
|
1725
|
-
}
|
|
1726
|
-
else {
|
|
1727
|
-
document.metadata.resolution = options.resolution.trim();
|
|
1728
|
-
}
|
|
1729
|
-
changedFields.push("resolution");
|
|
1730
|
-
}
|
|
1731
|
-
if (options.expectedResult !== undefined || clearFrontMatterKeys.has("expected_result")) {
|
|
1732
|
-
if (clearFrontMatterKeys.has("expected_result")) {
|
|
1733
|
-
delete document.metadata.expected_result;
|
|
1734
|
-
}
|
|
1735
|
-
else {
|
|
1736
|
-
document.metadata.expected_result = options.expectedResult.trim();
|
|
1737
|
-
}
|
|
1738
|
-
changedFields.push("expected_result");
|
|
1739
|
-
}
|
|
1740
|
-
if (options.actualResult !== undefined || clearFrontMatterKeys.has("actual_result")) {
|
|
1741
|
-
if (clearFrontMatterKeys.has("actual_result")) {
|
|
1742
|
-
delete document.metadata.actual_result;
|
|
1743
|
-
}
|
|
1744
|
-
else {
|
|
1745
|
-
document.metadata.actual_result = options.actualResult.trim();
|
|
1746
|
-
}
|
|
1747
|
-
changedFields.push("actual_result");
|
|
1748
|
-
}
|
|
1749
|
-
if (options.affectedVersion !== undefined || clearFrontMatterKeys.has("affected_version")) {
|
|
1750
|
-
if (clearFrontMatterKeys.has("affected_version")) {
|
|
1751
|
-
delete document.metadata.affected_version;
|
|
1752
|
-
}
|
|
1753
|
-
else {
|
|
1754
|
-
document.metadata.affected_version = options.affectedVersion.trim();
|
|
1755
|
-
}
|
|
1756
|
-
changedFields.push("affected_version");
|
|
1757
|
-
}
|
|
1758
|
-
if (options.fixedVersion !== undefined || clearFrontMatterKeys.has("fixed_version")) {
|
|
1759
|
-
if (clearFrontMatterKeys.has("fixed_version")) {
|
|
1760
|
-
delete document.metadata.fixed_version;
|
|
1761
|
-
}
|
|
1762
|
-
else {
|
|
1763
|
-
document.metadata.fixed_version = options.fixedVersion.trim();
|
|
1764
|
-
}
|
|
1765
|
-
changedFields.push("fixed_version");
|
|
1766
|
-
}
|
|
1767
|
-
if (options.component !== undefined || clearFrontMatterKeys.has("component")) {
|
|
1768
|
-
if (clearFrontMatterKeys.has("component")) {
|
|
1769
|
-
delete document.metadata.component;
|
|
1770
|
-
}
|
|
1771
|
-
else {
|
|
1772
|
-
document.metadata.component = options.component.trim();
|
|
1773
|
-
}
|
|
1774
|
-
changedFields.push("component");
|
|
1775
|
-
}
|
|
1776
|
-
if (options.regression !== undefined || clearFrontMatterKeys.has("regression")) {
|
|
1777
|
-
if (clearFrontMatterKeys.has("regression")) {
|
|
1778
|
-
delete document.metadata.regression;
|
|
1779
|
-
}
|
|
1780
|
-
else {
|
|
1781
|
-
document.metadata.regression = parseRegressionInput(options.regression);
|
|
1782
|
-
}
|
|
1783
|
-
changedFields.push("regression");
|
|
1784
|
-
}
|
|
1785
|
-
if (options.customerImpact !== undefined || clearFrontMatterKeys.has("customer_impact")) {
|
|
1786
|
-
if (clearFrontMatterKeys.has("customer_impact")) {
|
|
1787
|
-
delete document.metadata.customer_impact;
|
|
1788
|
-
}
|
|
1789
|
-
else {
|
|
1790
|
-
document.metadata.customer_impact = options.customerImpact.trim();
|
|
1791
|
-
}
|
|
1792
|
-
changedFields.push("customer_impact");
|
|
1793
|
-
}
|
|
1546
|
+
setOrClearTrimScalar(options.blockedReason, "blocked_reason");
|
|
1547
|
+
setOrClearTrimScalar(options.unblockNote, "unblock_note");
|
|
1548
|
+
setOrClearTrimScalar(options.reporter, "reporter");
|
|
1549
|
+
setOrClearScalar(options.severity, "severity", (value) => ensureEnum(normalizeSeverityInput(value), ISSUE_SEVERITY_VALUES, "severity"));
|
|
1550
|
+
setOrClearTrimScalar(options.environment, "environment");
|
|
1551
|
+
setOrClearTrimScalar(options.reproSteps, "repro_steps");
|
|
1552
|
+
setOrClearTrimScalar(options.resolution, "resolution");
|
|
1553
|
+
setOrClearTrimScalar(options.expectedResult, "expected_result");
|
|
1554
|
+
setOrClearTrimScalar(options.actualResult, "actual_result");
|
|
1555
|
+
setOrClearTrimScalar(options.affectedVersion, "affected_version");
|
|
1556
|
+
setOrClearTrimScalar(options.fixedVersion, "fixed_version");
|
|
1557
|
+
setOrClearTrimScalar(options.component, "component");
|
|
1558
|
+
setOrClearScalar(options.regression, "regression", (value) => parseRegressionInput(value));
|
|
1559
|
+
setOrClearTrimScalar(options.customerImpact, "customer_impact");
|
|
1794
1560
|
if (options.reminder !== undefined || clearFrontMatterKeys.has("reminders")) {
|
|
1795
1561
|
if (clearFrontMatterKeys.has("reminders")) {
|
|
1796
1562
|
delete document.metadata.reminders;
|
|
@@ -1813,10 +1579,10 @@ export async function runUpdate(id, options, global) {
|
|
|
1813
1579
|
if (!clearFrontMatterKeys.has(definition.metadata_key)) {
|
|
1814
1580
|
continue;
|
|
1815
1581
|
}
|
|
1816
|
-
if (
|
|
1582
|
+
if (metadataRecord[definition.metadata_key] === undefined) {
|
|
1817
1583
|
continue;
|
|
1818
1584
|
}
|
|
1819
|
-
delete
|
|
1585
|
+
delete metadataRecord[definition.metadata_key];
|
|
1820
1586
|
changedFields.push(definition.metadata_key);
|
|
1821
1587
|
}
|
|
1822
1588
|
const runtimeFieldUpdates = collectRuntimeUpdateFieldValues(options, runtimeFieldRegistry);
|
|
@@ -1824,14 +1590,14 @@ export async function runUpdate(id, options, global) {
|
|
|
1824
1590
|
if (clearFrontMatterKeys.has(fieldKey)) {
|
|
1825
1591
|
continue;
|
|
1826
1592
|
}
|
|
1827
|
-
if (JSON.stringify(
|
|
1593
|
+
if (JSON.stringify(metadataRecord[fieldKey]) === JSON.stringify(fieldValue)) {
|
|
1828
1594
|
continue;
|
|
1829
1595
|
}
|
|
1830
|
-
|
|
1596
|
+
metadataRecord[fieldKey] = fieldValue;
|
|
1831
1597
|
changedFields.push(fieldKey);
|
|
1832
1598
|
}
|
|
1833
1599
|
try {
|
|
1834
|
-
applyRegisteredItemFieldDefaultsAndValidation(
|
|
1600
|
+
applyRegisteredItemFieldDefaultsAndValidation(metadataRecord, getActiveExtensionRegistrations());
|
|
1835
1601
|
}
|
|
1836
1602
|
catch (error) {
|
|
1837
1603
|
throw new PmCliError(error instanceof Error ? error.message : "Invalid extension item field values", EXIT_CODE.USAGE);
|
|
@@ -1840,11 +1606,11 @@ export async function runUpdate(id, options, global) {
|
|
|
1840
1606
|
},
|
|
1841
1607
|
});
|
|
1842
1608
|
return {
|
|
1843
|
-
item: result.item,
|
|
1609
|
+
item: toItemRecord(result.item),
|
|
1844
1610
|
changed_fields: result.changedFields,
|
|
1845
1611
|
warnings: [...parentReferenceWarnings, ...result.warnings],
|
|
1846
1612
|
...(options.allowAuditUpdate === true || options.allowAuditDepUpdate === true ? { audit_update: true } : {}),
|
|
1847
1613
|
};
|
|
1848
1614
|
}
|
|
1849
1615
|
//# sourceMappingURL=update.js.map
|
|
1850
|
-
//# debugId=
|
|
1616
|
+
//# debugId=94e19c77-3288-5a43-a8b2-6b9f15d4f234
|