@unbrained/pm-cli 2026.11.3 → 2026.11.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/HARNESS_COMPATIBILITY.md +1 -1
- package/.agents/skills/README.md +14 -14
- package/.agents/skills/pm-developer/SKILL.md +16 -16
- package/.agents/skills/pm-developer/references/GRAPH_AND_RELATIONSHIPS.md +14 -14
- package/.agents/skills/pm-developer/references/SCRIPTING_COMPOSITION.md +10 -10
- package/.agents/skills/pm-extensions/SKILL.md +13 -13
- package/.agents/skills/pm-extensions/references/AUTHORING.md +12 -12
- package/.agents/skills/pm-sdk/SKILL.md +27 -27
- package/.agents/skills/pm-sdk/references/SURFACE_MAP.md +32 -32
- package/.agents/skills/pm-test-audit/references/AUDIT.md +1 -1
- package/.agents/skills/pm-user/SKILL.md +35 -35
- package/.claude-plugin/marketplace.json +1 -1
- package/AGENTS.md +9 -9
- package/CHANGELOG.md +19 -0
- package/README.md +13 -13
- package/dist/cli/error-guidance.d.ts +14 -35
- package/dist/cli/error-guidance.js +2 -2
- package/dist/cli/expected-revisions.d.ts +55 -0
- package/dist/cli/expected-revisions.js +2 -0
- package/dist/cli/main.js +2 -2
- package/dist/cli/register-setup.js +1 -1
- package/dist/cli/runtime/invocation-options.js +1 -1
- package/dist/cli-bundle/bundle-manifest.json +1 -1
- package/dist/cli-bundle/chunks/chunk-2RPORE7M.js +31 -0
- package/dist/cli-bundle/chunks/{chunk-Y7H55PCY.js → chunk-335BZ75D.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-5GWEY4P6.js +122 -0
- package/dist/cli-bundle/chunks/chunk-6VRX2CM7.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-5JZMF4M5.js → chunk-7DEKAXVA.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-32BCU6HN.js → chunk-7ZRCYESH.js} +47 -46
- package/dist/cli-bundle/chunks/chunk-AUEKTX7V.js +6 -0
- package/dist/cli-bundle/chunks/chunk-D7KYPRK4.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-2CBHQXYJ.js → chunk-DAX3AOFI.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-JPKIUWLG.js → chunk-F6NDMKZ4.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-FRNMQM45.js +2 -0
- package/dist/cli-bundle/chunks/chunk-HNGLDMSZ.js +9 -0
- package/dist/cli-bundle/chunks/{chunk-DEJHTFEF.js → chunk-HRCMORE7.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-HRFGFIYU.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-5IPXDZKU.js → chunk-JI2GDE4I.js} +66 -66
- package/dist/cli-bundle/chunks/{chunk-MQJXZX3Q.js → chunk-LS3GI3H4.js} +53 -53
- package/dist/cli-bundle/chunks/chunk-OH6WQ7VT.js +3 -0
- package/dist/cli-bundle/chunks/{chunk-TZ3D3DPQ.js → chunk-OJDMJT7Y.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-S4LPZ4TN.js +20 -0
- package/dist/cli-bundle/chunks/chunk-UEGXWXUZ.js +2 -0
- package/dist/cli-bundle/chunks/chunk-XLSHFYXZ.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-UYNMKUGA.js → chunk-YKXATU2G.js} +2 -2
- package/dist/cli-bundle/chunks/item-revision-OJJVPQY7.js +2 -0
- package/dist/cli-bundle/chunks/item-transaction-QEPBUCMY.js +2 -0
- package/dist/cli-bundle/chunks/mutation-admission-INMM3HHG.js +2 -0
- package/dist/cli-bundle/chunks/{register-list-query-I6AZA3IX.js → register-list-query-5Y5JKWU5.js} +2 -2
- package/dist/cli-bundle/chunks/{register-mutation-3DAXCLXR.js → register-mutation-WC7OSQID.js} +2 -2
- package/dist/cli-bundle/chunks/register-operations-PO63DBZH.js +2 -0
- package/dist/cli-bundle/chunks/register-setup-RRFOS7IT.js +2 -0
- package/dist/cli-bundle/chunks/{stage-7H36OTDJ.js → stage-E3MMV4TV.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-5PMJOJCZ.js +44 -0
- package/dist/cli-bundle/focused-chunks/chunk-7KK66ISG.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-D4XQOMG4.js → chunk-AHWJPZSJ.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-C3O6JJPO.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-LKN2WGGB.js → chunk-C6P6HPCX.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-CPMSL4HS.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-CZM75DE3.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-TYHDZUL4.js → chunk-D2TBEBNW.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-E56OXRYH.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-I5FODKYB.js → chunk-F62XGAAY.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-G4QP365K.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-G5PJCR7R.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-GS3JC5UU.js +23 -0
- package/dist/cli-bundle/focused-chunks/chunk-I5LGPUWH.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-LW64TINU.js +3 -0
- package/dist/cli-bundle/focused-chunks/chunk-M6V7UMWL.js +26 -0
- package/dist/cli-bundle/focused-chunks/chunk-MC7IE7D7.js +8 -0
- package/dist/cli-bundle/focused-chunks/chunk-MG7C3JUY.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-F3X6UWMI.js → chunk-MK4HV4JO.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-ZQRCVRGS.js → chunk-NQ7GYFOX.js} +54 -54
- package/dist/cli-bundle/focused-chunks/chunk-O7EI33NP.js +91 -0
- package/dist/cli-bundle/focused-chunks/{chunk-RY4QEMAE.js → chunk-RFTJZ5VB.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-SNOXXRSJ.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-UPJUTP2V.js +12 -0
- package/dist/cli-bundle/focused-chunks/{chunk-HJ27QLZV.js → chunk-VWWTIX5L.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-HOXIIZEO.js → chunk-XHOBYCVE.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-YMGB2O4E.js +81 -0
- package/dist/cli-bundle/focused-chunks/item-revision-CTDO4H3I.js +2 -0
- package/dist/cli-bundle/focused-chunks/item-transaction-AEAYVVHA.js +2 -0
- package/dist/cli-bundle/focused-chunks/mutation-admission-4WM7TNHZ.js +2 -0
- package/dist/cli-bundle/focused-chunks/{stage-4SQHVI3O.js → stage-WV7QXR4C.js} +2 -2
- package/dist/cli-bundle/main.js +25 -25
- package/dist/cli-bundle/sdk-authoring.js +1 -1
- package/dist/cli-bundle/sdk-contracts.js +5 -5
- package/dist/cli-bundle/sdk-core.js +1 -1
- package/dist/cli-bundle/sdk-governance.js +1 -1
- package/dist/cli-bundle/sdk-graph.js +1 -1
- package/dist/cli-bundle/sdk-merge.js +57 -57
- package/dist/cli-bundle/sdk-query.js +1 -1
- package/dist/cli-bundle/sdk-runtime.js +1 -1
- package/dist/cli-bundle/sdk-testing.js +1 -1
- package/dist/cli-bundle/sdk.js +11 -11
- package/dist/core/config/positional-value.d.ts +7 -1
- package/dist/core/config/positional-value.js +1 -1
- package/dist/core/extensions/reserved-host-flags.js +1 -1
- package/dist/core/history/history-rewrite.js +1 -1
- package/dist/core/item/literal-mutation-input.d.ts +17 -0
- package/dist/core/item/literal-mutation-input.js +1 -1
- package/dist/core/item/parent-reference-policy.d.ts +8 -4
- package/dist/core/item/parent-reference-policy.js +1 -1
- package/dist/core/item/sprint-release-format.d.ts +2 -1
- package/dist/core/item/sprint-release-format.js +1 -1
- package/dist/core/output/mutation-projection.js +1 -1
- package/dist/core/shared/command-types.d.ts +7 -0
- package/dist/core/store/item-mutation-precondition.d.ts +72 -6
- package/dist/core/store/item-mutation-precondition.js +1 -1
- package/dist/core/store/item-store.js +1 -1
- package/dist/core/store/settings-validator.js +1 -1
- package/dist/core/store/settings.d.ts +14 -0
- package/dist/core/store/settings.js +5 -4
- package/dist/core/telemetry/policy.d.ts +27 -1
- package/dist/core/telemetry/policy.js +1 -1
- package/dist/core/telemetry/runtime.d.ts +18 -7
- package/dist/core/telemetry/runtime.js +4 -4
- package/dist/sdk/cli-contracts/bootstrap-command-scanner.js +1 -1
- package/dist/sdk/cli-contracts/completeness.js +1 -1
- package/dist/sdk/cli-contracts/enum-contracts.d.ts +11 -0
- package/dist/sdk/cli-contracts/enum-contracts.js +1 -1
- package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +1 -1
- package/dist/sdk/cli-contracts/registration-helpers.js +1 -1
- package/dist/sdk/cli-contracts/tool-parameter-tables.js +1 -1
- package/dist/sdk/cli-contracts/tool-schema.js +1 -1
- package/dist/sdk/cli-contracts/typed-action-inputs.d.ts +8 -5
- package/dist/sdk/cli-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts.js +1 -1
- package/dist/sdk/cli-program.js +1 -1
- package/dist/sdk/config.d.ts +3 -3
- package/dist/sdk/config.js +1 -1
- package/dist/sdk/environment/project-runtime-compatibility.js +1 -1
- package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -1
- package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -1
- package/dist/sdk/governance/health.d.ts +2 -2
- package/dist/sdk/governance/health.js +2 -2
- package/dist/sdk/governance/validate.js +1 -1
- package/dist/sdk/history/salvage.js +3 -3
- package/dist/sdk/history-compact.d.ts +7 -1
- package/dist/sdk/history-compact.js +1 -1
- package/dist/sdk/history-repair.d.ts +2 -1
- package/dist/sdk/history-repair.js +1 -1
- package/dist/sdk/index.d.ts +6 -1
- package/dist/sdk/index.js +1 -1
- package/dist/sdk/init.d.ts +4 -4
- package/dist/sdk/init.js +8 -8
- package/dist/sdk/lifecycle/checkpoint-rollback.d.ts +10 -2
- package/dist/sdk/lifecycle/checkpoint-rollback.js +1 -1
- package/dist/sdk/lifecycle/claim.d.ts +4 -0
- package/dist/sdk/lifecycle/claim.js +1 -1
- package/dist/sdk/lifecycle/close-many.d.ts +11 -2
- package/dist/sdk/lifecycle/close-many.js +1 -1
- package/dist/sdk/lifecycle/close.d.ts +25 -0
- package/dist/sdk/lifecycle/close.js +1 -1
- package/dist/sdk/lifecycle/create.d.ts +7 -5
- package/dist/sdk/lifecycle/create.js +1 -1
- package/dist/sdk/lifecycle/item-revision.d.ts +162 -0
- package/dist/sdk/lifecycle/item-revision.js +2 -0
- package/dist/sdk/lifecycle/restore.js +1 -1
- package/dist/sdk/lifecycle/shared-unset-fields.d.ts +628 -4
- package/dist/sdk/lifecycle/shared-unset-fields.js +1 -1
- package/dist/sdk/lifecycle/start-blockers.d.ts +52 -0
- package/dist/sdk/lifecycle/start-blockers.js +2 -0
- package/dist/sdk/lifecycle/task-composition.d.ts +11 -0
- package/dist/sdk/lifecycle/task-composition.js +1 -1
- package/dist/sdk/lifecycle/update-many.d.ts +11 -2
- package/dist/sdk/lifecycle/update-many.js +1 -1
- package/dist/sdk/lifecycle/update.d.ts +5 -4
- package/dist/sdk/lifecycle/update.js +2 -2
- package/dist/sdk/public-surface.json +1 -1
- package/dist/sdk/query/declared-blockers.d.ts +16 -0
- package/dist/sdk/query/declared-blockers.js +2 -0
- package/dist/sdk/query/get.d.ts +7 -0
- package/dist/sdk/query/get.js +1 -1
- package/dist/sdk/query/projection-contracts.js +1 -1
- package/dist/sdk/runtime/actions.js +1 -1
- package/dist/sdk/runtime/mutation-value-validation.js +1 -1
- package/dist/sdk/runtime-input.d.ts +12 -0
- package/dist/sdk/runtime-input.js +1 -1
- package/dist/sdk/runtime-primitives.d.ts +1 -0
- package/dist/sdk/runtime-primitives.js +1 -1
- package/dist/sdk/runtime.d.ts +10 -0
- package/dist/sdk/runtime.js +1 -1
- package/dist/sdk/structured-mutations.js +1 -1
- package/dist/sdk/telemetry.d.ts +1 -1
- package/dist/sdk/telemetry.js +2 -2
- package/dist/sdk/test/batch.js +2 -2
- package/dist/sdk/test/execution.js +2 -2
- package/dist/sdk/test/linked-command-detection.js +1 -1
- package/dist/sdk/workspace-transaction.d.ts +17 -6
- package/dist/sdk/workspace-transaction.js +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.js +1 -1
- package/docs/AGENT_GUIDE.md +48 -48
- package/docs/AGENT_OUTPUT_ENCODINGS.md +20 -20
- package/docs/ASSURANCE.md +10 -10
- package/docs/BOUNDED_CONTEXT_READS.md +3 -3
- package/docs/CLAUDE_CODE_PLUGIN.md +1 -1
- package/docs/CLI_GRAMMAR.md +2 -2
- package/docs/COMMANDS.md +144 -32
- package/docs/COMMAND_NAMESPACES.md +1 -1
- package/docs/CONFIGURATION.md +82 -70
- package/docs/CONTEXT_ALGORITHM_PORTFOLIO.md +2 -2
- package/docs/CONTEXT_INTEGRITY_CONTRACTS.md +5 -5
- package/docs/CORPUS_SHAPES.md +1 -1
- package/docs/DEPENDENCY_KIND_CONTRACT.md +6 -6
- package/docs/DIAGNOSTIC_OUTPUT_CONTRACTS.md +5 -5
- package/docs/ECOSYSTEM_PLANNING_REVIEW.md +3 -3
- package/docs/EXTENSION_AUTHOR_CONTRACTS.md +4 -4
- package/docs/HISTORY_ATTESTATION.md +1 -1
- package/docs/HISTORY_MAINTENANCE.md +1 -1
- package/docs/LIFECYCLE_COMMANDS.md +1 -1
- package/docs/MCP_2026_07_28.md +16 -16
- package/docs/MCP_2026_07_28_CONFORMANCE.md +19 -19
- package/docs/MCP_REMOTE_TRANSPORT_SECURITY.md +22 -22
- package/docs/MCP_SKILLS_AND_APPS.md +1 -1
- package/docs/MERGE_SAFETY.md +6 -6
- package/docs/MUTATION_INTEGRITY.md +5 -5
- package/docs/OUTPUT_PROJECTION_CONTRACTS.md +14 -14
- package/docs/PACKED_FIRST_RUN.md +1 -1
- package/docs/QUICKSTART.md +10 -10
- package/docs/README.md +21 -21
- package/docs/READ_OUTPUT_CONTRACTS.md +9 -9
- package/docs/RECURRENCE_RECOVERY_CONTRACTS.md +1 -1
- package/docs/RELEASING.md +19 -10
- package/docs/SCRIPTING.md +10 -10
- package/docs/SDK.md +183 -38
- package/docs/SDK_ARTIFACT_OUTPUT.md +1 -1
- package/docs/SDK_PRIMITIVE_INVENTORY.md +2 -2
- package/docs/SELF_DESCRIBING_CONTEXT_CONTRACTS.md +7 -7
- package/docs/TESTING.md +1 -1
- package/docs/WORKFLOW_POLICIES.md +2 -2
- package/docs/WORKSPACE_POSITION_AND_LIFECYCLE.md +8 -8
- package/docs/agent-task-token-baseline.json +1 -1
- package/docs/generated/AGENT_CAPABILITY_ROUTING.md +1 -1
- package/docs/generated/AGENT_COMMAND_SURFACE.md +1 -1
- package/docs/generated/FLAG_LEXICON_BUDGETS.md +112 -112
- package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +13 -4
- package/docs/performance/cli-transport-overhead.md +7 -7
- package/marketplace.json +1 -1
- package/package.json +1 -1
- package/packages/pm-beads/package.json +1 -1
- package/packages/pm-calendar/package.json +1 -1
- package/packages/pm-command-kit/README.md +5 -5
- package/packages/pm-command-kit/package.json +1 -1
- package/packages/pm-digital-twin/GAP_REPORT.md +16 -16
- package/packages/pm-digital-twin/package.json +1 -1
- package/packages/pm-governance-audit/package.json +1 -1
- package/packages/pm-guide-shell/package.json +1 -1
- package/packages/pm-kanban/README.md +1 -1
- package/packages/pm-kanban/package.json +1 -1
- package/packages/pm-lifecycle-hooks/package.json +1 -1
- package/packages/pm-linked-test-adapters/package.json +1 -1
- package/packages/pm-search-advanced/package.json +1 -1
- package/packages/pm-templates/package.json +1 -1
- package/packages/pm-todos/package.json +1 -1
- package/packages/pm-vcs/GAP_REPORT.md +1 -1
- package/packages/pm-vcs/package.json +1 -1
- package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/pm-claude/README.md +6 -6
- package/plugins/pm-claude/package.json +1 -1
- package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
- package/plugins/pm-codex/package.json +1 -1
- package/plugins/pm-codex/plugin.json +1 -1
- package/runtime-dependencies.json +1 -1
- package/dist/cli-bundle/chunks/chunk-7ZEFHFAU.js +0 -2
- package/dist/cli-bundle/chunks/chunk-B6UTLYLM.js +0 -3
- package/dist/cli-bundle/chunks/chunk-HBKD5HZB.js +0 -2
- package/dist/cli-bundle/chunks/chunk-L6LCLC37.js +0 -2
- package/dist/cli-bundle/chunks/chunk-NR4KABHC.js +0 -31
- package/dist/cli-bundle/chunks/chunk-PWD5RY2D.js +0 -2
- package/dist/cli-bundle/chunks/chunk-XRMYA4R7.js +0 -20
- package/dist/cli-bundle/chunks/chunk-YWS4XV4I.js +0 -6
- package/dist/cli-bundle/chunks/chunk-ZOAJNPBL.js +0 -129
- package/dist/cli-bundle/chunks/item-transaction-ZHLJTBD7.js +0 -2
- package/dist/cli-bundle/chunks/mutation-admission-ZQMRMGIB.js +0 -2
- package/dist/cli-bundle/chunks/register-operations-G3QGGQ5Z.js +0 -2
- package/dist/cli-bundle/chunks/register-setup-LDXHMNOT.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-3XGKBVJ3.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-4HY6EGPB.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-AK2CI2GI.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-HUXZCPWT.js +0 -26
- package/dist/cli-bundle/focused-chunks/chunk-IKXJ57XA.js +0 -8
- package/dist/cli-bundle/focused-chunks/chunk-MOY6KZGJ.js +0 -44
- package/dist/cli-bundle/focused-chunks/chunk-PWUTFKSI.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-PZRB7IXH.js +0 -91
- package/dist/cli-bundle/focused-chunks/chunk-WSYPVBKS.js +0 -80
- package/dist/cli-bundle/focused-chunks/chunk-WXLG7HZ5.js +0 -3
- package/dist/cli-bundle/focused-chunks/chunk-WZDFCVLX.js +0 -12
- package/dist/cli-bundle/focused-chunks/chunk-YGO3FWA2.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-YVLAP3BL.js +0 -23
- package/dist/cli-bundle/focused-chunks/chunk-ZYXQACPB.js +0 -2
- package/dist/cli-bundle/focused-chunks/item-transaction-PZ2FQ6B2.js +0 -2
- package/dist/cli-bundle/focused-chunks/mutation-admission-XOOK6XFH.js +0 -2
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="dfc60af7-26bb-552f-a517-ae0dd5442d4f")}catch{}})();import{assertInitializedTracker}from"../environment/tracker-preflight.js";import{createExtensionCommandError}from"../error-runtime.js";import{isLiteralMutationInput}from"../../core/item/literal-mutation-input.js";import{assertMutationStringOperand,prepareNativeMutationOptions}from"../runtime/mutation-value-validation.js";import{enforceWorkflowMutation}from"../../core/policy/workflow-policy-store.js";import{assertNoAmbiguousBareCommaEntry,looksLikeStructuredKeyValueEntry,resolveMutationStdinTokenFields}from"../../core/item/parse.js";import{removeFileIfExists,writeFileAtomic,appendHistoryEntry,createHistoryEntry,generateItemId,normalizeItemId,canonicalDocument,normalizeItemMetadata,serializeItemDocument,assertParentReferenceIsNotSelf,isPlaceholderReferenceToken,normalizeParentReferenceValue,validateMissingParentReference,validateSprintOrReleaseValue,assertNoUnknownCsvKeys,looksLikeGenericKeyValueEntry,mergeAdditiveTags,parseCsvKv,parseOptionalNonNegativeInteger,parseOptionalNumber,parseTags,shouldResolveMutationStdinTokens,transferMutationStdinTokenPolicy,resolvePriority,getFocusedItem,normalizeStatusInput,isTerminalStatus,canonicalizeCommandOptionKey,commandOptionFlagLabel,resolveItemTypeRegistry,resolveCommandOptionPolicyState,resolveTypeDefinition,resolveTypeName,validateTypeOptions,acquireLock,printError,buildInvalidTypeError,resolveTypeSynonym,collectRuntimeCreateFieldValues,resolveItemTypesFilePath,resolveRuntimeFieldRegistry,resolveRuntimeStatusRegistry,EXIT_CODE,ITEM_METADATA_KEY_ORDER,PmCliError,nowIso,resolveIsoOrRelative,getActiveExtensionRegistrations,projectAfterCommandItemSnapshot,recordAfterCommandAffectedItem,runActiveCommandHandler,runActiveBeforeMutationHooks,runActiveOnWriteHooks,collectRegisteredItemFieldNames,applyRegisteredItemFieldDefaultsAndValidation,parseRegisteredItemFieldAssignments,listAllItemMetadataLight,locateItem,createMutationGuardSdk,getHistoryPath,getItemPath,resolvePmRoot,readSettings,resolveAuthor}from"../runtime-primitives.js";import{requireTerminalReasonWithRecovery}from"../lifecycle-policy.js";import{evaluateSimilarityGovernance,similarityAdvisoryWarnings}from"../similarity.js";import{acquireItemMetadataDerivedIndexLock,refreshItemMetadataDerivedIndex}from"../item-metadata-index.js";import{collectNewOrderingCycleWarnings}from"../graph/mutation-advisory.js";import{assertHierarchyMutationAllowed}from"../graph/hierarchy-integrity.js";import{assertNonHierarchyCardinalityMutationAllowed,relationshipKindNeedsIntegrityLock}from"../graph/cardinality-integrity.js";import{resolveWorkspaceRelationshipKindRegistry}from"../graph/assembly.js";import{acquireHierarchyMutationLock}from"./hierarchy-mutation-lock.js";import{normalizeRiskInput,normalizeSeverityInput,parseConfidenceInput,parseRegressionInput}from"./metadata-normalizers.js";import{createSchemaFieldRecoveryResolver,resolveCoreFieldRecovery}from"./core-field-recovery.js";import{applyLegacyNoneCollectionNormalizers,createLegacyNoneCollectionNormalizers,assertNoLegacyNoneToken,assertNoLegacyNoneTokens,isLegacyNoneToken}from"./legacy-none-tokens.js";import{suggestNextLifecycleTransition}from"./lifecycle-transitions.js";import{parseLinkedTestAssertionEqualsMap,parseLinkedTestAssertionGteMap,parseLinkedTestBoolean,parseLinkedTestContextMode,parseLinkedTestEnvClear,parseLinkedTestEnvSet,parseLinkedTestMinLines,parseLinkedTestRegexList,parseLinkedTestStringList,parseLinkedTestWorkspaceContextMode}from"../test/parsers.js";import{STRUCTURED_LINKED_TEST_KEYS,normalizeStructuredLinkedTestEntry}from"../test/entry.js";import{attachLinkedTestMutationProvenance}from"../test/trust.js";import{COMMON_UNSET_FIELD_DEFINITIONS_AFTER_AUTHOR,COMMON_UNSET_FIELD_DEFINITIONS_BEFORE_AUTHOR,parseCommandUnsetTargets,resolveRuntimeUnsetFieldDefinition}from"./shared-unset-fields.js";import{ensureEnumValue}from"./recurrence-parsers.js";import{requireDependencyKind,assertDependencyEdgesAllowed,assertDependencyTargetsResolvable,assertValidBareDependencyFlagValue}from"../dependency-flag-validation.js";import{normalizeDependencySeedId,normalizeItemReference,isExternalDependencyReference,normalizeDependencySourceKind}from"../dependency-provenance.js";import{supportsCreateExplicitEmpty}from"../agent/create-option-policy.js";import{parseEventEntries,parseReminderEntries,parseTypeOptionEntries}from"./repeatable-metadata-parsers.js";import{ISSUE_SEVERITY_VALUES,RISK_VALUES,SCOPE_VALUES}from"../../types/index.js";const CREATE_MODE_VALUES=["strict","progressive"],SCHEDULE_CREATE_PRESET_VALUES=["lightweight"],SCHEDULE_CREATE_PRESET_TYPES=new Set(["Reminder","Meeting","Event"]),LOG_SEED_ALLOWED_KEYS=new Set(["author","created_at","text"]),CREATE_UNSET_FIELD_DEFINITIONS=[...COMMON_UNSET_FIELD_DEFINITIONS_BEFORE_AUTHOR,{canonical:"author",aliases:["author"],optionKey:"author",metadataKey:"author"},...COMMON_UNSET_FIELD_DEFINITIONS_AFTER_AUTHOR],CREATE_UNSET_ALIAS_MAP=(()=>{const map=new Map;for(const definition of CREATE_UNSET_FIELD_DEFINITIONS)for(const alias of definition.aliases)map.set(alias,{optionKey:definition.optionKey,metadataKey:definition.metadataKey});return map})(),CREATE_OPTION_KEY_TO_UNSET_CANONICAL=new Map(CREATE_UNSET_FIELD_DEFINITIONS.map(definition=>[definition.optionKey,definition.canonical])),CREATE_UNSET_SUPPORTED_CANONICAL_FIELDS=CREATE_UNSET_FIELD_DEFINITIONS.map(definition=>definition.canonical).sort((left,right)=>left.localeCompare(right)).join(", ");function buildInvalidLogSeedKeysMessage(optionName,unsupportedKeys){const sortedUnsupported=[...unsupportedKeys].sort((left,right)=>left.localeCompare(right)),keyLabel=sortedUnsupported.length===1?"key":"keys";return`${optionName} supports only author, created_at, and text seed fields. Found unsupported ${keyLabel}: ${sortedUnsupported.join(", ")}. If text contains comma-separated key:value-like fragments, wrap text in quotes (for example text="first,scope:project"), use markdown-style key/value input, or pass ${optionName} - with piped stdin.`}function parseStatusValue(value,statusRegistry){const normalized=normalizeStatusInput(value,statusRegistry);if(!normalized){const allowedStatuses=statusRegistry.definitions.map(definition=>definition.id);throw new PmCliError(`Invalid status value "${value}". Allowed: ${allowedStatuses.join(", ")}`,EXIT_CODE.USAGE,{code:"invalid_argument_value",field:"status",value,allowed:allowedStatuses})}return normalized}function resolveCreateDefaultStatus(typeDefinition,statusRegistry){const configured=typeDefinition.default_status;if(configured!==void 0){const normalized=normalizeStatusInput(configured,statusRegistry);if(normalized)return normalized}return statusRegistry.open_status}function parseCreatedAt(value,currentIso){if(!value||value.trim()===""||value.trim().toLowerCase()==="now")return currentIso;const parsed=Date.parse(value);if(!Number.isFinite(parsed))throw new PmCliError(`Invalid created_at timestamp "${value}"`,EXIT_CODE.USAGE);return new Date(parsed).toISOString()}const CREATE_LEGACY_NONE_COLLECTION_NORMALIZERS=createLegacyNoneCollectionNormalizers();function normalizeLegacyNoneCreateOptions(options){if(isLiteralMutationInput(options))return options;const normalized={...options,unset:options.unset?[...options.unset]:void 0},appendUnsetTarget=value=>{const current=normalized.unset?[...normalized.unset]:[];current.includes(value)||current.push(value),normalized.unset=current};isLegacyNoneToken(normalized.template)&&(normalized.template=void 0);const scalarOptionKeys=new Set([...CREATE_OPTION_KEY_TO_UNSET_CANONICAL.keys(),"rank"]);for(const optionKey of scalarOptionKeys){if(isLiteralMutationInput(options,optionKey))continue;const candidate=normalized[optionKey];if(typeof candidate!="string"||!isLegacyNoneToken(candidate))continue;const canonicalUnset=optionKey==="rank"?"order":CREATE_OPTION_KEY_TO_UNSET_CANONICAL.get(optionKey)??optionKey;appendUnsetTarget(canonicalUnset),normalized[optionKey]=void 0}return transferMutationStdinTokenPolicy(options,applyLegacyNoneCollectionNormalizers(normalized,CREATE_LEGACY_NONE_COLLECTION_NORMALIZERS))}function parseOptionalString(value){if(value!==void 0)return value}function parseCreateUnsetTargets(raw,runtimeFieldRegistry){return parseCommandUnsetTargets({raw,supportedFields:CREATE_UNSET_SUPPORTED_CANONICAL_FIELDS,resolveDefinition:trimmed=>CREATE_UNSET_ALIAS_MAP.get(trimmed)??resolveRuntimeUnsetFieldDefinition(trimmed,"create",runtimeFieldRegistry)})}const DEP_SEED_KEYS=["id","kind","type","author","created_at","source_kind"],LINKED_ARTIFACT_SEED_KEYS=["path","scope","note"];function parseDependencies(raw,nowValue,prefix,fallbackAuthor){return!raw||raw.length===0?{values:void 0,explicitEmpty:!1}:(assertNoLegacyNoneTokens(raw,"--dep","Use --clear-deps to clear dependencies."),{values:raw.map(entry=>{const trimmedEntry=entry.trim(),isStructured=looksLikeStructuredEntry(trimmedEntry,DEP_SEED_KEYS);assertValidBareDependencyFlagValue(trimmedEntry,isStructured);const kv=isStructured?parseCsvKv(entry,"--dep"):{id:trimmedEntry,kind:"related"};isStructured&&assertNoUnknownCsvKeys(kv,"--dep",DEP_SEED_KEYS);const id=parseOptionalString(kv.id),kind=normalizeDependencyKindInput(parseOptionalString(kv.kind??kv.type));if(!id||!kind)throw new PmCliError("--dep requires id and kind, or a bare item id to create a related dependency",EXIT_CODE.USAGE);if(id.trim().toLowerCase()==="undefined")throw new PmCliError(`--dep id must not use placeholder token "${id}". Use --clear-deps to clear dependencies.`,EXIT_CODE.USAGE);const sourceKind=normalizeDependencySourceKind(parseOptionalString(kv.source_kind)),explicitAuthor=parseOptionalString(kv.author);return{id:normalizeDependencySeedId(id,prefix,sourceKind),kind:requireDependencyKind(kind),created_at:parseCreatedAt(kv.created_at,nowValue),author:explicitAuthor??fallbackAuthor,source_kind:sourceKind??"cli:create:dep",author_source:explicitAuthor?"asserted":"detected"}}),explicitEmpty:!1})}function normalizeDependencyKindInput(raw){return typeof raw=="string"?resolveWorkspaceRelationshipKindRegistry().resolve(raw)?.kind??raw.trim():raw}function looksLikeStructuredEntry(raw,keys){return looksLikeStructuredKeyValueEntry(raw,keys)?!0:looksLikeGenericKeyValueEntry(raw)}function parseLogSeed(optionName,raw,nowValue,fallbackAuthor){return!raw||raw.length===0?{values:void 0,explicitEmpty:!1}:(assertNoLegacyNoneTokens(raw,optionName,optionName==="--comment"?"Use --clear-comments to clear comments.":optionName==="--note"?"Use --clear-notes to clear notes.":"Use --clear-learnings to clear learnings."),{values:raw.map(entry=>{const trimmedEntry=entry.trim(),buildPlainTextCommentSeed=()=>{if(trimmedEntry.length===0)throw new PmCliError(`${optionName} requires text=<value>`,EXIT_CODE.USAGE);return{created_at:nowValue,author:fallbackAuthor,text:trimmedEntry}};let kv;try{kv=parseCsvKv(entry,optionName)}catch(error){if(optionName==="--comment"||optionName==="--note"||optionName==="--learning")return buildPlainTextCommentSeed();throw error}if(Object.keys(kv).filter(key=>!LOG_SEED_ALLOWED_KEYS.has(key)).length>0)return{created_at:parseCreatedAt(kv.created_at,nowValue),author:parseOptionalString(kv.author)??fallbackAuthor,text:trimmedEntry};const text=kv.text??"";if(text==="")throw new PmCliError(`${optionName} requires text=<value>`,EXIT_CODE.USAGE);return{created_at:parseCreatedAt(kv.created_at,nowValue),author:parseOptionalString(kv.author)??fallbackAuthor,text}}),explicitEmpty:!1})}function parseFiles(raw){return!raw||raw.length===0?{values:void 0,explicitEmpty:!1}:(assertNoLegacyNoneTokens(raw,"--file","Use --clear-files to clear linked files."),{values:raw.map(entry=>{const trimmedEntry=entry.trim(),isStructured=looksLikeStructuredEntry(trimmedEntry,LINKED_ARTIFACT_SEED_KEYS);assertNoAmbiguousBareCommaEntry(trimmedEntry,"--file","file path",isStructured);const kv=isStructured?parseCsvKv(entry,"--file"):{path:trimmedEntry};if(isStructured&&assertNoUnknownCsvKeys(kv,"--file",LINKED_ARTIFACT_SEED_KEYS),!kv.path)throw new PmCliError("--file requires path=<value> or a bare file path",EXIT_CODE.USAGE);return{path:kv.path,scope:ensureEnumValue(kv.scope??"project",SCOPE_VALUES,"file scope"),note:parseOptionalString(kv.note)}}),explicitEmpty:!1})}function parseTests(raw){return!raw||raw.length===0?{values:void 0,explicitEmpty:!1}:(assertNoLegacyNoneTokens(raw,"--test","Use --clear-tests to clear linked tests."),{values:raw.map(entry=>{const trimmedEntry=entry.trim(),isStructured=looksLikeStructuredEntry(trimmedEntry,STRUCTURED_LINKED_TEST_KEYS);assertNoAmbiguousBareCommaEntry(trimmedEntry,"--test","test command",isStructured);const kv=isStructured?normalizeStructuredLinkedTestEntry(parseCsvKv(entry,"--test"),"--test"):{command:trimmedEntry},command=parseOptionalString(kv.command),filePath=parseOptionalString(kv.path);if(!command)throw new PmCliError("--test requires command=<value> or a bare command (path=<value> is optional metadata)",EXIT_CODE.USAGE);const timeoutSecondsRaw=parseOptionalString(kv.timeout_seconds),timeoutAliasRaw=parseOptionalString(kv.timeout);if(timeoutSecondsRaw&&timeoutAliasRaw&&timeoutSecondsRaw!==timeoutAliasRaw)throw new PmCliError("--test timeout and timeout_seconds must match when both are provided",EXIT_CODE.USAGE);const timeoutRaw=timeoutSecondsRaw??timeoutAliasRaw;return{command,path:filePath,scope:ensureEnumValue(kv.scope??"project",SCOPE_VALUES,"test scope"),timeout_seconds:timeoutRaw?parseOptionalNumber(timeoutRaw,"timeout_seconds"):void 0,pm_context_mode:parseLinkedTestContextMode(kv.pm_context_mode,"--test"),workspace_context_mode:parseLinkedTestWorkspaceContextMode(kv.workspace_context_mode,"--test"),env_set:parseLinkedTestEnvSet(kv.env_set,"--test"),env_clear:parseLinkedTestEnvClear(kv.env_clear,"--test"),shared_host_safe:parseLinkedTestBoolean(kv.shared_host_safe,"--test","shared_host_safe"),assert_stdout_contains:parseLinkedTestStringList(kv.assert_stdout_contains),assert_stdout_regex:parseLinkedTestRegexList(kv.assert_stdout_regex,"--test","assert_stdout_regex"),assert_stderr_contains:parseLinkedTestStringList(kv.assert_stderr_contains),assert_stderr_regex:parseLinkedTestRegexList(kv.assert_stderr_regex,"--test","assert_stderr_regex"),assert_stdout_min_lines:parseLinkedTestMinLines(kv.assert_stdout_min_lines,"--test"),assert_json_field_equals:parseLinkedTestAssertionEqualsMap(kv.assert_json_field_equals,"--test"),assert_json_field_gte:parseLinkedTestAssertionGteMap(kv.assert_json_field_gte,"--test"),note:parseOptionalString(kv.note)}}),explicitEmpty:!1})}function parseDocs(raw){return!raw||raw.length===0?{values:void 0,explicitEmpty:!1}:(assertNoLegacyNoneTokens(raw,"--doc","Use --clear-docs to clear linked docs."),{values:raw.map(entry=>{const trimmedEntry=entry.trim(),isStructured=looksLikeStructuredEntry(trimmedEntry,LINKED_ARTIFACT_SEED_KEYS),kv=isStructured?parseCsvKv(entry,"--doc"):{path:trimmedEntry};if(isStructured&&assertNoUnknownCsvKeys(kv,"--doc",LINKED_ARTIFACT_SEED_KEYS),!kv.path)throw new PmCliError("--doc requires path=<value> or a bare doc path",EXIT_CODE.USAGE);return{path:kv.path,scope:ensureEnumValue(kv.scope??"project",SCOPE_VALUES,"doc scope"),note:parseOptionalString(kv.note)}}),explicitEmpty:!1})}function parseReminders(raw,nowValue){return!raw||raw.length===0?{values:void 0,explicitEmpty:!1}:(assertNoLegacyNoneTokens(raw,"--reminder","Use --clear-reminders to clear reminders."),{values:parseReminderEntries(raw,new Date(nowValue),{valueMode:"raw"}),explicitEmpty:!1})}function parseEvents(raw,nowValue){return!raw||raw.length===0?{values:void 0,explicitEmpty:!1}:(assertNoLegacyNoneTokens(raw,"--event","Use --clear-events to clear linked events."),{values:parseEventEntries(raw,new Date(nowValue),{allDayEmptyGuard:"defined",recurrenceEmptyNumericGuard:"defined"}),explicitEmpty:!1})}function buildChangedFields(itemMetadata,body,explicitUnsets,additionalItemMetadataKeys=[]){const changed=[...ITEM_METADATA_KEY_ORDER.filter(key=>itemMetadata[key]!==void 0),...additionalItemMetadataKeys.filter(key=>itemMetadata[key]!==void 0),...body.length>0?["body"]:[],...explicitUnsets.map(key=>`unset:${key}`)];return Array.from(new Set(changed))}function buildHistoryMessage(baseMessage,explicitUnsets){const trimmed=baseMessage??"";if(explicitUnsets.length===0)return trimmed;const suffix=`explicit_unset=${explicitUnsets.join(",")}`;return trimmed?`${trimmed} | ${suffix}`:suffix}function normalizeCreatePolicyOptionKey(raw,typeName,sourceLabel){const canonical=canonicalizeCommandOptionKey("create",raw);if(!canonical)throw new PmCliError(`Unsupported ${sourceLabel} entry "${raw}" for type "${typeName}"`,EXIT_CODE.CONFLICT);return canonical}function buildCreateOptionValueLookup(options){return{scalarValues:{title:options.title,description:options.description,type:options.type,status:options.status,priority:options.priority,tags:options.tags,body:options.body,deadline:options.deadline,estimatedMinutes:options.estimatedMinutes,acceptanceCriteria:options.acceptanceCriteria,definitionOfReady:options.definitionOfReady,order:options.order??options.rank,goal:options.goal,objective:options.objective,value:options.value,impact:options.impact,outcome:options.outcome,whyNow:options.whyNow,author:options.author,message:options.message,assignee:options.assignee,parent:options.parent,reviewer:options.reviewer,risk:options.risk,confidence:options.confidence,sprint:options.sprint,release:options.release,blockedBy:options.blockedBy,blockedReason:options.blockedReason,unblockNote:options.unblockNote,reporter:options.reporter,severity:options.severity,environment:options.environment,reproSteps:options.reproSteps,resolution:options.resolution,expectedResult:options.expectedResult,actualResult:options.actualResult,affectedVersion:options.affectedVersion,fixedVersion:options.fixedVersion,component:options.component,regression:options.regression,customerImpact:options.customerImpact},repeatableValues:{dep:options.dep,comment:options.comment,note:options.note,learning:options.learning,file:options.file,test:options.test,doc:options.doc,reminder:options.reminder,event:options.event,typeOption:options.typeOption,field:options.field},addTags:options.addTags}}function hasCreateOptionValue(lookup,optionKey){if(optionKey==="tags")return lookup.scalarValues.tags!==void 0||Array.isArray(lookup.addTags)&&lookup.addTags.length>0;if(Object.prototype.hasOwnProperty.call(lookup.scalarValues,optionKey))return lookup.scalarValues[optionKey]!==void 0;if(Object.prototype.hasOwnProperty.call(lookup.repeatableValues,optionKey)){const value=lookup.repeatableValues[optionKey];return Array.isArray(value)&&value.length>0}return!1}function buildRequiredCreateOptions(typeDefinition,createMode){const requiredOptions=new Set(["title","type"]);if(createMode!=="strict")return requiredOptions;for(const field of typeDefinition.required_create_fields)requiredOptions.add(normalizeCreatePolicyOptionKey(field,typeDefinition.name,"required_create_fields"));for(const field of typeDefinition.required_create_repeatables)requiredOptions.add(normalizeCreatePolicyOptionKey(field,typeDefinition.name,"required_create_repeatables"));return requiredOptions}function assertNoDisabledCreateOptions(disabledOptions,lookup,clearOptionKeys,typeName){for(const option of disabledOptions)if(!(!hasCreateOptionValue(lookup,option)&&!clearOptionKeys.has(option)))throw new PmCliError(`Option ${commandOptionFlagLabel("create",option)} is disabled for type "${typeName}" by command_option_policies`,EXIT_CODE.USAGE)}function assertNoStrictRequiredOptionClears(requiredOptions,createMode,clearOptionKeys){if(createMode!=="strict")return;const strictRequiredClears=requiredOptions.filter(required=>clearOptionKeys.has(required)&&!supportsCreateExplicitEmpty(required));if(strictRequiredClears.length===0)return;const requiredFlags=[...new Set(strictRequiredClears.map(required=>commandOptionFlagLabel("create",required)))].sort((left,right)=>left.localeCompare(right));throw new PmCliError(`Strict create mode requires concrete values for ${requiredFlags.join(", ")}; --unset cannot satisfy a required scalar option (only repeatable options accept an explicit --clear-* empty set)`,EXIT_CODE.USAGE)}function parseTypeOptions(raw){return!raw||raw.length===0?{values:void 0,explicitEmpty:!1}:(assertNoLegacyNoneTokens(raw,"--type-option","Use --clear-type-options to clear existing type options."),{values:parseTypeOptionEntries(raw),explicitEmpty:!1})}async function resolveCreateStdinInputs(options){return await resolveMutationStdinTokenFields(options,[["body","--body"],["description","--description"]],[["dep","--dep"],["comment","--comment"],["note","--note"],["learning","--learning"],["file","--file"],["test","--test"],["doc","--doc"],["reminder","--reminder"],["event","--event"],["typeOption","--type-option"],["field","--field"]])}async function resolveCreateTransportInputs(options){return shouldResolveMutationStdinTokens(options)?await resolveCreateStdinInputs(options):options}function resolveCreateMode(createMode,defaultMode){if(createMode===void 0)return defaultMode;const normalized=createMode.trim().toLowerCase();if(normalized.length===0)return defaultMode;if(normalized==="strict"||normalized==="progressive")return normalized;throw new PmCliError(`Invalid --create-mode value "${createMode}". Allowed: ${CREATE_MODE_VALUES.join(", ")}`,EXIT_CODE.USAGE)}function resolveScheduleCreatePreset(raw){if(raw===void 0)return;const normalized=raw.trim().toLowerCase();if(normalized.length===0)throw new PmCliError("--schedule-preset must not be empty",EXIT_CODE.USAGE);if(normalized==="lightweight"||normalized==="lite"||normalized==="schedule-lite")return"lightweight";throw new PmCliError(`Invalid --schedule-preset value "${raw}". Allowed: ${SCHEDULE_CREATE_PRESET_VALUES.join(", ")}`,EXIT_CODE.USAGE)}function resolveEffectiveCreateMode(createMode,schedulePreset,defaultMode){const resolvedMode=resolveCreateMode(createMode,defaultMode);if(schedulePreset===void 0)return resolvedMode;if(typeof createMode=="string"&&createMode.trim().length>0&&resolvedMode==="strict")throw new PmCliError("--schedule-preset lightweight cannot be combined with --create-mode strict. Use --create-mode progressive or omit --create-mode.",EXIT_CODE.USAGE);return"progressive"}function requireCreateOptionByType(typeDefinition,options,createMode,clearOptionKeys,resolvedAuthor){const typeName=typeDefinition.name,optionLookup=buildCreateOptionValueLookup(options),baseRequiredOptions=buildRequiredCreateOptions(typeDefinition,createMode),policyState=resolveCommandOptionPolicyState(typeDefinition,"create",baseRequiredOptions);if(policyState.errors.length>0)throw new PmCliError(policyState.errors.join("; "),EXIT_CODE.CONFLICT);assertNoDisabledCreateOptions(policyState.disabled,optionLookup,clearOptionKeys,typeName),assertNoStrictRequiredOptionClears(policyState.required,createMode,clearOptionKeys);const satisfiesRequiredOption=optionKey=>optionKey==="author"&&resolvedAuthor!=="unknown"||optionKey==="status"&&typeDefinition.default_status!==void 0||clearOptionKeys.has(optionKey)&&supportsCreateExplicitEmpty(optionKey)?!0:hasCreateOptionValue(optionLookup,optionKey),missingRequiredOptions=policyState.required.filter(required=>!satisfiesRequiredOption(required));return[...new Set(missingRequiredOptions.map(required=>commandOptionFlagLabel("create",required)))].sort((left,right)=>left.localeCompare(right))}const MISSING_REQUIRED_TYPE_OPTION_PATTERN=/^Missing required type option "([^"]+)" for type "([^"]+)"$/;function collectMissingRequiredTypeOptionKeys(errors,typeName){const missingKeys=[];for(const error of errors){const match=error.match(MISSING_REQUIRED_TYPE_OPTION_PATTERN);match&&match[2]===typeName&&missingKeys.push(match[1])}return[...new Set(missingKeys)].sort((left,right)=>left.localeCompare(right))}function filterNonMissingTypeOptionErrors(errors,typeName){return errors.filter(error=>{const match=error.match(MISSING_REQUIRED_TYPE_OPTION_PATTERN);return!match||match[2]!==typeName})}function assertNoInvalidTypeOptions(errors,type,typeDefinition,statusRegistry){const nonMissingTypeOptionErrors=filterNonMissingTypeOptionErrors(errors,type);if(nonMissingTypeOptionErrors.length===0)return;const nextValidExample=buildTypeSpecificCreateExample(typeDefinition,[],[],statusRegistry.open_status);throw new PmCliError(nonMissingTypeOptionErrors.join("; "),EXIT_CODE.USAGE,{code:"invalid_argument_value",required:`Provide valid --type-option key/value pairs for type "${type}".`,examples:[nextValidExample],nextSteps:[`Run "pm create --help --type ${type}" to review allowed type-option keys and values.`]})}function typeOptionExampleValue(typeDefinition,key){const firstAllowed=typeDefinition.options.find(option=>option.key===key)?.values[0];return typeof firstAllowed=="string"&&firstAllowed.trim().length>0?firstAllowed:"<value>"}function createExampleTokensForFlag(flag,typeName,openStatus){const canonicalFlag=flag.split("/")[0];switch(canonicalFlag){case"--title":return["--title",`"${typeName} example title"`];case"--description":return["--description",`"${typeName} example description"`];case"--type":return["--type",typeName];case"--status":return["--status",openStatus];case"--priority":return["--priority","1"];case"--message":return["--message",`"Create ${typeName} item"`];case"--comment":return["--comment",'"author=maintainer,created_at=now,text=Implementation context"'];default:return[canonicalFlag,'"<value>"']}}function buildTypeSpecificCreateExample(typeDefinition,missingCreateFlags,missingTypeOptionKeys,openStatus){const tokens=["pm","create","--title",`"${typeDefinition.name} example title"`,"--description",`"${typeDefinition.name} example description"`,"--type",typeDefinition.name],optionalRecommendationFlags=["--status","--priority","--message"],orderedFlags=[...new Set([...optionalRecommendationFlags,...missingCreateFlags])],includedFlags=new Set(["--title","--description","--type"]);for(const flag of orderedFlags){if(includedFlags.has(flag))continue;const clearFlag=CLEAR_FLAG_BY_REQUIRED_CREATE_FLAG[flag];tokens.push(...clearFlag?[clearFlag]:createExampleTokensForFlag(flag,typeDefinition.name,openStatus)),includedFlags.add(flag)}for(const key of missingTypeOptionKeys){const value=typeOptionExampleValue(typeDefinition,key);tokens.push("--type-option",`${key}=${value}`)}return tokens.join(" ")}function requireStringOption(value,flag){const normalized=value?.trim();if(!normalized)throw flag==="--title"?value!==void 0?new PmCliError("Title cannot be empty or whitespace-only. Retry: pass a non-empty title with --title.",EXIT_CODE.USAGE):new PmCliError('Missing required option --title. Why required: every item needs a human-readable title for lookup, search, and reporting. Retry: pass the title as the first positional argument (example: pm create "Fix login bug" --type Issue) or with --title.',EXIT_CODE.USAGE):new PmCliError(`Missing required option ${flag}`,EXIT_CODE.USAGE);return normalized}function mergeCreateOptionsWithTemplate(templateOptions,explicitOptions){const merged={};for(const[key,value]of Object.entries(templateOptions))merged[key]=Array.isArray(value)?[...value]:value;for(const[key,value]of Object.entries(explicitOptions))value!==void 0&&(merged[key]=Array.isArray(value)?[...value]:value);return transferMutationStdinTokenPolicy(explicitOptions,merged)}function normalizeExtensionCommandPath(command){return command.trim().toLowerCase().split(/\s+/).filter(part=>part.length>0).join(" ")}function hasTemplatesShowHandler(){const registrations=getActiveExtensionRegistrations();return registrations?registrations.commands.some(entry=>entry.action==="templates-show"||normalizeExtensionCommandPath(entry.command)==="templates show"):!1}function readTemplateOptionsFromRuntimeResult(result,templateName){if(typeof result!="object"||result===null||!("options"in result))throw new PmCliError(`Templates package returned invalid payload for template "${templateName}". Expected an options object.`,EXIT_CODE.GENERIC_FAILURE);const options=result.options;if(typeof options!="object"||options===null||Array.isArray(options))throw new PmCliError(`Templates package returned invalid options for template "${templateName}".`,EXIT_CODE.GENERIC_FAILURE);const normalized={};for(const[key,value]of Object.entries(options)){if(typeof value=="string"||typeof value=="number"||typeof value=="boolean"){normalized[key]=value;continue}if(Array.isArray(value)&&value.every(entry=>typeof entry=="string")){normalized[key]=[...value];continue}throw new PmCliError(`Templates package returned unsupported option value for "${key}" in template "${templateName}".`,EXIT_CODE.GENERIC_FAILURE)}return normalized}async function loadCreateTemplateOptionsFromRuntime(templateName,global2,pmRoot){if(!hasTemplatesShowHandler())throw new PmCliError("--template requires the templates package. Install it first (for example: pm install templates --project).",EXIT_CODE.USAGE);const handlerResult=await runActiveCommandHandler({command:"templates show",args:[templateName],options:{},global:global2,pm_root:pmRoot});if(!handlerResult.handled)throw Object.hasOwn(handlerResult,"cause")?createExtensionCommandError("templates show",handlerResult):new PmCliError(`Unable to resolve template "${templateName}" via templates package. Run "pm templates show ${templateName}" for details.`,EXIT_CODE.USAGE);return readTemplateOptionsFromRuntimeResult(handlerResult.result,templateName)}function resolveUnsettableOptionalString(unsetKeys,metadataKey,raw){return unsetKeys.has(metadataKey)||raw===void 0?void 0:parseOptionalString(raw)}function resolveUnsettableTransformed(unsetKeys,metadataKey,raw,transform){return unsetKeys.has(metadataKey)||raw===void 0?void 0:transform(raw)}const CALENDAR_RELEVANT_CREATE_TYPES=new Set(["milestone","meeting","reminder","event"]);function createItemLacksSchedule(type,deadline,reminders,events){const hasDeadline=deadline!==void 0,hasReminders=reminders!==void 0&&reminders.length>0,hasEvents=events!==void 0&&events.length>0;return CALENDAR_RELEVANT_CREATE_TYPES.has(type.toLowerCase())&&!hasDeadline&&!hasReminders&&!hasEvents}function collectCreateScheduleWarnings(type,id,deadline,reminders,events){const warnings=[];return type.toLowerCase()==="event"&&(events===void 0||events.length===0)&&warnings.push(`event_without_schedule:${id}:no_time_set`),createItemLacksSchedule(type,deadline,reminders,events)&&warnings.push(`calendar_item_without_schedule:${id}:no_deadline_or_reminder_or_event (hint: set --deadline <ISO> or --reminder "<when>", or link an Event via --event "start=<ISO>,end=<ISO>"; otherwise this item never appears on pm calendar)`),warnings}async function inheritFocusedParent(parent,resolvedOptions,unsetKeys,pmRoot){if(resolvedOptions.inheritFocus!==!0||parent!==void 0||unsetKeys.has("parent")||resolvedOptions.parent!==void 0)return{parent,parentSource:void 0};const focused=await getFocusedItem(pmRoot);return focused===void 0?{parent,parentSource:void 0}:{parent:focused,parentSource:"focus"}}async function validateCreateParentReference(pmRoot,settings,typeRegistry,itemId,parent,policy){const normalized=normalizeItemReference(normalizeParentReferenceValue(parent),settings.id_prefix);if(isExternalDependencyReference(normalized))return{parent:normalized,warnings:[]};if(assertParentReferenceIsNotSelf(itemId,normalized,settings.id_prefix),await locateItem(pmRoot,normalized,settings.id_prefix,settings.item_format,typeRegistry.type_to_folder))return{parent:normalized,warnings:[]};const normalizedParentId=normalizeItemId(normalized,settings.id_prefix);return{parent:normalized,warnings:validateMissingParentReference(normalizedParentId,policy).warnings}}async function resolveCreateParentWithWarnings(params){return params.parent===void 0?{parent:void 0,warnings:[]}:await validateCreateParentReference(params.pmRoot,params.settings,params.typeRegistry,params.itemId,params.parent,params.policy)}async function resolveCreateItemId(params){if(params.explicitId===void 0)return generateItemId(params.pmRoot,params.settings.id_prefix,{tokenLength:params.settings.ids.token_length,typeToFolder:params.typeRegistry.type_to_folder,probeExisting:!1});assertMutationStringOperand(params.explicitId,"create","id");const trimmedId=params.explicitId.trim();if(trimmedId.length===0||isPlaceholderReferenceToken(trimmedId))throw new PmCliError("--id must not be empty or use a placeholder token",EXIT_CODE.USAGE);const normalizedId=normalizeItemId(trimmedId,params.settings.id_prefix);if(!/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/.test(normalizedId))throw new PmCliError("--id must contain only letters, numbers, and dashes after normalization",EXIT_CODE.USAGE);return normalizedId}function resolveCreateSprintOrRelease(unsetKeys,metadataKey,raw,field,policy){const resolved=resolveUnsettableOptionalString(unsetKeys,metadataKey,raw);if(resolved===void 0)return{value:void 0,warnings:[]};const validation=validateSprintOrReleaseValue(field,resolved,policy);return{value:validation.value,warnings:validation.warnings}}async function resolveCreateBlockedByDependency(params){const{pmRoot,settings,typeRegistry,statusRegistry,blockedBy,status,statusExplicit,nowValue,author}=params;let dependencyValues=params.dependencyValues;if(blockedBy===void 0)return{dependencyValues,status};const normalizedBlockedBy=normalizeItemId(blockedBy,settings.id_prefix),blockedByLocated=await locateItem(pmRoot,normalizedBlockedBy,settings.id_prefix,settings.item_format,typeRegistry.type_to_folder);if(!blockedByLocated)return{dependencyValues,status};if((dependencyValues??[]).some(dependency=>dependency.id===blockedByLocated.id&&dependency.kind==="blocked_by")||(dependencyValues=[...dependencyValues??[],{id:blockedByLocated.id,kind:"blocked_by",created_at:nowValue,author,source_kind:"cli:create:blocked_by",author_source:"detected"}]),statusExplicit)return{dependencyValues,status};const blockedStatus=statusRegistry.blocked_statuses.has("blocked")?"blocked":[...statusRegistry.blocked_statuses].sort((left,right)=>left.localeCompare(right))[0]??statusRegistry.open_status;return{dependencyValues,status:blockedStatus}}function applyCreateDefaultType(resolvedOptions,settings,typeRegistry){if(typeof resolvedOptions.createMode=="string"&&resolvedOptions.createMode.trim().toLowerCase()==="strict")return;const defaultType=settings.governance.create_default_type?.trim();if(defaultType&&defaultType.length>0&&resolveTypeName(defaultType,typeRegistry)){resolvedOptions.type=defaultType;return}resolveTypeName("Task",typeRegistry)&&(resolvedOptions.type="Task")}function collectTemplateCustomTypeOptions(typeDefinition,resolvedOptions){return typeDefinition.options.filter(option=>canonicalizeCommandOptionKey("create",option.key)===void 0).flatMap(option=>{const value=resolvedOptions[option.key];if(value===void 0)return[];if(typeof value=="string"||typeof value=="number"||typeof value=="boolean")return[option];throw new PmCliError(`Template custom type option "${option.key}" must be a string, number, or boolean value`,EXIT_CODE.USAGE)})}async function resolveCreateTypeSelection(options,global2,pmRoot,settings,typeRegistry){let resolvedOptions=options;const warnings=[];if(resolvedOptions.template!==void 0){const templateName=resolvedOptions.template.trim();if(templateName.length===0)throw new PmCliError("--template must not be empty. Omit --template to disable template usage.",EXIT_CODE.USAGE);const templateOptions=await loadCreateTemplateOptionsFromRuntime(templateName,global2,pmRoot);resolvedOptions=normalizeLegacyNoneCreateOptions(prepareNativeMutationOptions("create",mergeCreateOptionsWithTemplate(templateOptions,resolvedOptions)))}if(resolvedOptions.type===void 0&&applyCreateDefaultType(resolvedOptions,settings,typeRegistry),resolvedOptions.type===void 0)throw new PmCliError("Missing required option --type <value>",EXIT_CODE.USAGE);let resolvedTypeName=resolveTypeName(resolvedOptions.type,typeRegistry);if(!resolvedTypeName){const synonymCanonical=resolveTypeSynonym(resolvedOptions.type),synonymResolved=synonymCanonical?resolveTypeName(synonymCanonical,typeRegistry):void 0;if(synonymResolved)warnings.push(`type_coercion:${resolvedOptions.type.trim()}:${synonymResolved}`),resolvedOptions.type=synonymResolved,resolvedTypeName=synonymResolved;else throw new PmCliError(buildInvalidTypeError(resolvedOptions.type,typeRegistry.types,resolveItemTypesFilePath(pmRoot,settings.schema)),EXIT_CODE.USAGE)}const typeDefinition=resolveTypeDefinition(resolvedTypeName,typeRegistry);if(!typeDefinition)throw new PmCliError(`Invalid type value "${resolvedOptions.type}"`,EXIT_CODE.USAGE);const type=typeDefinition.name,matchedTemplateTypeOptions=collectTemplateCustomTypeOptions(typeDefinition,resolvedOptions),templateTypeOptions=matchedTemplateTypeOptions.map(option=>`${option.key}=${String(resolvedOptions[option.key])}`);if(templateTypeOptions.length>0){resolvedOptions.typeOption=[...templateTypeOptions,...resolvedOptions.typeOption??[]];for(const option of matchedTemplateTypeOptions)delete resolvedOptions[option.key]}const schedulePreset=resolveScheduleCreatePreset(resolvedOptions.schedulePreset);if(schedulePreset!==void 0&&!SCHEDULE_CREATE_PRESET_TYPES.has(type))throw new PmCliError(`--schedule-preset ${schedulePreset} is only supported for Reminder, Meeting, or Event types`,EXIT_CODE.USAGE);const createMode=resolveEffectiveCreateMode(resolvedOptions.createMode,schedulePreset,settings.governance.create_mode_default);return{resolvedOptions,typeDefinition,type,schedulePreset,createMode,warnings}}function collectCreateClearTargets(resolvedOptions,unsetTargets){const explicitUnsets=new Set(unsetTargets.metadataKeys),clearOptionKeys=new Set(unsetTargets.optionKeys),clearCollectionDefinitions=[{enabled:resolvedOptions.clearDeps,optionKey:"dep",clearFlag:"--clear-deps",valueFlag:"--dep",values:resolvedOptions.dep,metadataKey:"dependencies"},{enabled:resolvedOptions.clearComments,optionKey:"comment",clearFlag:"--clear-comments",valueFlag:"--comment",values:resolvedOptions.comment,metadataKey:"comments"},{enabled:resolvedOptions.clearNotes,optionKey:"note",clearFlag:"--clear-notes",valueFlag:"--note",values:resolvedOptions.note,metadataKey:"notes"},{enabled:resolvedOptions.clearLearnings,optionKey:"learning",clearFlag:"--clear-learnings",valueFlag:"--learning",values:resolvedOptions.learning,metadataKey:"learnings"},{enabled:resolvedOptions.clearFiles,optionKey:"file",clearFlag:"--clear-files",valueFlag:"--file",values:resolvedOptions.file,metadataKey:"files"},{enabled:resolvedOptions.clearTests,optionKey:"test",clearFlag:"--clear-tests",valueFlag:"--test",values:resolvedOptions.test,metadataKey:"tests"},{enabled:resolvedOptions.clearDocs,optionKey:"doc",clearFlag:"--clear-docs",valueFlag:"--doc",values:resolvedOptions.doc,metadataKey:"docs"},{enabled:resolvedOptions.clearReminders,optionKey:"reminder",clearFlag:"--clear-reminders",valueFlag:"--reminder",values:resolvedOptions.reminder,metadataKey:"reminders"},{enabled:resolvedOptions.clearEvents,optionKey:"event",clearFlag:"--clear-events",valueFlag:"--event",values:resolvedOptions.event,metadataKey:"events"},{enabled:resolvedOptions.clearTypeOptions,optionKey:"typeOption",clearFlag:"--clear-type-options",valueFlag:"--type-option",values:resolvedOptions.typeOption,metadataKey:"type_options"}];for(const definition of clearCollectionDefinitions)if(definition.enabled){if(definition.values&&definition.values.length>0)throw new PmCliError(`Cannot combine ${definition.clearFlag} with ${definition.valueFlag}`,EXIT_CODE.USAGE);explicitUnsets.add(definition.metadataKey),clearOptionKeys.add(definition.optionKey)}return{explicitUnsets,clearOptionKeys}}function assertNoCreateScalarUnsetConflicts(resolvedOptions,unsetTargets){const scalarOptionPresence={tags:resolvedOptions.tags!==void 0,deadline:resolvedOptions.deadline!==void 0,estimatedMinutes:resolvedOptions.estimatedMinutes!==void 0,acceptanceCriteria:resolvedOptions.acceptanceCriteria!==void 0,definitionOfReady:resolvedOptions.definitionOfReady!==void 0,order:resolvedOptions.order!==void 0||resolvedOptions.rank!==void 0,goal:resolvedOptions.goal!==void 0,objective:resolvedOptions.objective!==void 0,value:resolvedOptions.value!==void 0,impact:resolvedOptions.impact!==void 0,outcome:resolvedOptions.outcome!==void 0,whyNow:resolvedOptions.whyNow!==void 0,author:resolvedOptions.author!==void 0,assignee:resolvedOptions.assignee!==void 0,parent:resolvedOptions.parent!==void 0,reviewer:resolvedOptions.reviewer!==void 0,risk:resolvedOptions.risk!==void 0,confidence:resolvedOptions.confidence!==void 0,sprint:resolvedOptions.sprint!==void 0,release:resolvedOptions.release!==void 0,blockedBy:resolvedOptions.blockedBy!==void 0,blockedReason:resolvedOptions.blockedReason!==void 0,unblockNote:resolvedOptions.unblockNote!==void 0,reporter:resolvedOptions.reporter!==void 0,severity:resolvedOptions.severity!==void 0,environment:resolvedOptions.environment!==void 0,reproSteps:resolvedOptions.reproSteps!==void 0,resolution:resolvedOptions.resolution!==void 0,expectedResult:resolvedOptions.expectedResult!==void 0,actualResult:resolvedOptions.actualResult!==void 0,affectedVersion:resolvedOptions.affectedVersion!==void 0,fixedVersion:resolvedOptions.fixedVersion!==void 0,component:resolvedOptions.component!==void 0,regression:resolvedOptions.regression!==void 0,customerImpact:resolvedOptions.customerImpact!==void 0};for(const[optionKey,hasValue]of Object.entries(scalarOptionPresence)){if(!hasValue||!unsetTargets.optionKeys.has(optionKey))continue;const unsetField=CREATE_OPTION_KEY_TO_UNSET_CANONICAL.get(optionKey)??optionKey;throw new PmCliError(`Cannot combine --unset ${unsetField} with ${commandOptionFlagLabel("create",optionKey)}`,EXIT_CODE.USAGE)}}function assertNoLegacyCreateScalarTokens(resolvedOptions){if(isLiteralMutationInput(resolvedOptions))return;const assertNoLegacyScalarToken=(value,optionKey)=>{if(isLiteralMutationInput(resolvedOptions,optionKey))return;const unsetField=CREATE_OPTION_KEY_TO_UNSET_CANONICAL.get(optionKey),hint=unsetField?`Use --unset ${unsetField} to clear this field.`:void 0;assertNoLegacyNoneToken(value,commandOptionFlagLabel("create",optionKey),hint)};assertNoLegacyScalarToken(resolvedOptions.tags,"tags"),assertNoLegacyScalarToken(resolvedOptions.deadline,"deadline"),assertNoLegacyScalarToken(resolvedOptions.estimatedMinutes,"estimatedMinutes"),assertNoLegacyScalarToken(resolvedOptions.acceptanceCriteria,"acceptanceCriteria"),assertNoLegacyScalarToken(resolvedOptions.definitionOfReady,"definitionOfReady"),assertNoLegacyScalarToken(resolvedOptions.order??resolvedOptions.rank,"order"),assertNoLegacyScalarToken(resolvedOptions.goal,"goal"),assertNoLegacyScalarToken(resolvedOptions.objective,"objective"),assertNoLegacyScalarToken(resolvedOptions.value,"value"),assertNoLegacyScalarToken(resolvedOptions.impact,"impact"),assertNoLegacyScalarToken(resolvedOptions.outcome,"outcome"),assertNoLegacyScalarToken(resolvedOptions.whyNow,"whyNow"),assertNoLegacyScalarToken(resolvedOptions.author,"author"),assertNoLegacyScalarToken(resolvedOptions.assignee,"assignee"),assertNoLegacyScalarToken(resolvedOptions.parent,"parent"),assertNoLegacyScalarToken(resolvedOptions.reviewer,"reviewer"),assertNoLegacyScalarToken(resolvedOptions.risk,"risk"),assertNoLegacyScalarToken(resolvedOptions.confidence,"confidence"),assertNoLegacyScalarToken(resolvedOptions.sprint,"sprint"),assertNoLegacyScalarToken(resolvedOptions.release,"release"),assertNoLegacyScalarToken(resolvedOptions.blockedBy,"blockedBy"),assertNoLegacyScalarToken(resolvedOptions.blockedReason,"blockedReason"),assertNoLegacyScalarToken(resolvedOptions.unblockNote,"unblockNote"),assertNoLegacyScalarToken(resolvedOptions.reporter,"reporter"),assertNoLegacyScalarToken(resolvedOptions.severity,"severity"),assertNoLegacyScalarToken(resolvedOptions.environment,"environment"),assertNoLegacyScalarToken(resolvedOptions.reproSteps,"reproSteps"),assertNoLegacyScalarToken(resolvedOptions.resolution,"resolution"),assertNoLegacyScalarToken(resolvedOptions.expectedResult,"expectedResult"),assertNoLegacyScalarToken(resolvedOptions.actualResult,"actualResult"),assertNoLegacyScalarToken(resolvedOptions.affectedVersion,"affectedVersion"),assertNoLegacyScalarToken(resolvedOptions.fixedVersion,"fixedVersion"),assertNoLegacyScalarToken(resolvedOptions.component,"component"),assertNoLegacyScalarToken(resolvedOptions.regression,"regression"),assertNoLegacyScalarToken(resolvedOptions.customerImpact,"customerImpact")}function assertNoCreateFieldUnsetConflicts(registeredItemFieldValues,runtimeCreateFieldValues,unsetTargets){for(const fieldKey of Object.keys(registeredItemFieldValues))if(unsetTargets.metadataKeys.has(fieldKey))throw new PmCliError(`Cannot combine --unset ${fieldKey.replaceAll("_","-")} with --field ${fieldKey}=...`,EXIT_CODE.USAGE);for(const fieldKey of Object.keys(runtimeCreateFieldValues.values??{}))if(unsetTargets.metadataKeys.has(fieldKey))throw new PmCliError(`Cannot combine --unset ${fieldKey.replaceAll("_","-")} with its value flag`,EXIT_CODE.USAGE)}const CLEAR_FLAG_BY_REQUIRED_CREATE_FLAG={"--comment":"--clear-comments","--dep":"--clear-deps","--doc":"--clear-docs","--event":"--clear-events","--file":"--clear-files","--learning":"--clear-learnings","--note":"--clear-notes","--reminder":"--clear-reminders","--test":"--clear-tests","--type-option":"--clear-type-options"};function assertNoMissingRequiredCreateOptions(params){const{combinedMissingFlags,typeDefinition,missingRequiredCreateFlags,missingRequiredTypeOptionKeys,openStatus,type,createMode,missingRequiredRuntimeFields}=params;if(combinedMissingFlags.length===0)return;const runtimeFieldSyntax=missingRequiredRuntimeFields.map(field=>{const placeholder=field.type==="boolean"?"<true|false>":field.type==="array"?"<json-array>":field.type==="object"?"<json-object>":field.type==="number"?"<number>":field.type==="string_array"||field.repeatable?"<value>":"<string>";return{example:`--${field.cli_flag} ${placeholder}`,description:`--${field.cli_flag} maps to ${field.metadata_key} (${field.type}${field.repeatable?", repeatable":""})`}}),nextValidExample=[buildTypeSpecificCreateExample(typeDefinition,missingRequiredCreateFlags,missingRequiredTypeOptionKeys,openStatus),...runtimeFieldSyntax.map(field=>field.example)].join(" "),nextSteps=[`Run "pm create --help --type ${type}" for type-aware required option guidance.`,...combinedMissingFlags.filter(flag=>flag==="--title").map(()=>'Title can also be passed as the first positional argument (example: pm create "Your title" --type '+type+").")];createMode==="strict"&&(nextSteps.push('For staged onboarding, retry with "--create-mode progressive".'),SCHEDULE_CREATE_PRESET_TYPES.has(type)&&nextSteps.push('For minimal scheduling inputs, try "--schedule-preset lightweight".')),runtimeFieldSyntax.length>0&&nextSteps.push(`Required custom field formats: ${runtimeFieldSyntax.map(field=>field.description).join("; ")}.`);const collectionClearFlags=[...new Set(combinedMissingFlags.flatMap(flag=>{const normalizedFlag=flag.split(" ",1)[0],clearFlag=CLEAR_FLAG_BY_REQUIRED_CREATE_FLAG[normalizedFlag];return clearFlag?[clearFlag]:[]}))];collectionClearFlags.length>0&&nextSteps.push(`If the truthful value is an empty collection, use ${collectionClearFlags.join(", ")} instead of inventing metadata.`);const errorMessage=combinedMissingFlags.length===1?`Missing required option ${combinedMissingFlags[0]} for type "${type}"`:`Missing required options ${combinedMissingFlags.join(", ")} for type "${type}"`;throw new PmCliError(errorMessage,EXIT_CODE.USAGE,{code:"missing_required_option",required:`Provide all required create options and type options for type "${type}" in one invocation.`,examples:[...collectionClearFlags.map(flag=>`pm create --type ${type} ${flag} ...`),nextValidExample],nextSteps,recovery:createMode==="strict"?{recovery_mode:"compact",missing_required_fields:combinedMissingFlags,suggested_flags:[...collectionClearFlags,...combinedMissingFlags,"--create-mode progressive"]}:void 0})}function resolveCreateTags(unsetKeys,resolvedOptions){if(unsetKeys.has("tags")&&Array.isArray(resolvedOptions.addTags)&&resolvedOptions.addTags.length>0)throw new PmCliError("Cannot combine --unset tags with --add-tags",EXIT_CODE.USAGE);const baseTags=unsetKeys.has("tags")?[]:resolvedOptions.tags!==void 0?parseTags(resolvedOptions.tags):[];return mergeAdditiveTags(baseTags,resolvedOptions.addTags)}function resolveCreateOrder(unsetKeys,resolvedOptions){if(resolvedOptions.order!==void 0&&resolvedOptions.rank!==void 0&&resolvedOptions.order!==resolvedOptions.rank)throw new PmCliError("--order and --rank must match when both are provided",EXIT_CODE.USAGE);const orderRaw=resolvedOptions.order??resolvedOptions.rank,order=resolveUnsettableTransformed(unsetKeys,"order",orderRaw,raw=>parseOptionalNumber(raw,"order"));if(order!==void 0&&!Number.isInteger(order))throw new PmCliError("Order must be an integer",EXIT_CODE.USAGE);return order}function resolveCreateCloseReason(status,statusRegistry,settings,resolvedOptions,resolution,nowValue){if(resolvedOptions.completedAt!==void 0&&status!==statusRegistry.close_status)throw new PmCliError("--completed-at requires a terminal create status.",EXIT_CODE.USAGE);const completedAt=status!==statusRegistry.close_status?void 0:resolvedOptions.completedAt===void 0?nowValue:resolveIsoOrRelative(resolvedOptions.completedAt,new Date(nowValue),"completed-at");if(status!==statusRegistry.close_status)return{closeReason:void 0,completedAt,warnings:[]};const reasonInput=settings.governance.require_close_reason?{explicit:resolvedOptions.closeReason??resolvedOptions.message,resolution}:{explicit:resolvedOptions.closeReason};return{closeReason:requireTerminalReasonWithRecovery(reasonInput,settings.governance.require_close_reason,{operation:"create",status}).closeReason,completedAt,warnings:[]}}async function writeCreatedItem(params){const{pmRoot,type,id,settings,typeRegistry,author,extensionFieldNames,afterDocument,beforeDocument,historyMessage,changedFields,nowValue,similarityCandidate,allowDuplicate}=params,itemPath=getItemPath(pmRoot,type,id,settings.item_format,typeRegistry.type_to_folder),historyPath=getHistoryPath(pmRoot,id),relationshipRegistry=resolveWorkspaceRelationshipKindRegistry(),hierarchyMutationRequired=afterDocument.metadata.parent!==void 0||(afterDocument.metadata.dependencies??[]).some(dependency=>relationshipKindNeedsIntegrityLock(dependency.kind,relationshipRegistry)),hierarchyLockRelease=await acquireHierarchyMutationLock({pmRoot,author,ttlSeconds:settings.locks.ttl_seconds,waitMs:settings.locks.wait_ms,required:hierarchyMutationRequired});let hierarchyLockHeld=hierarchyMutationRequired,hookWarnings=[];try{const lockRelease=await acquireLock(pmRoot,id,settings.locks.ttl_seconds,author,!1,settings.governance.force_required_for_stale_lock,settings.locks.wait_ms);try{const graphBeforeCreate=afterDocument.metadata.parent!==void 0||afterDocument.metadata.dependencies!==void 0&&afterDocument.metadata.dependencies.length>0?await listAllItemMetadataLight(pmRoot,settings.item_format,typeRegistry.type_to_folder,void 0,settings.schema):void 0,existing=await locateItem(pmRoot,id,settings.id_prefix,settings.item_format,typeRegistry.type_to_folder);if(existing)throw new PmCliError(`Item "${id}" already exists`,EXIT_CODE.CONFLICT,{code:"item_already_exists",id:existing.id,path:existing.itemPath,required:"Read the existing item before deciding whether to update it or create a different ID.",nextSteps:[`Inspect the existing item with pm get ${existing.id}.`]});if(graphBeforeCreate){assertNonHierarchyCardinalityMutationAllowed(graphBeforeCreate,[...graphBeforeCreate,afterDocument.metadata],relationshipRegistry);const statusRegistry=resolveRuntimeStatusRegistry(settings.schema);assertHierarchyMutationAllowed(graphBeforeCreate,[...graphBeforeCreate,afterDocument.metadata],id,status=>isTerminalStatus(status,statusRegistry),relationshipRegistry)}const workflowPolicy=await enforceWorkflowMutation({pmRoot,settings,operation:"create",author,before:null,after:afterDocument});await runActiveBeforeMutationHooks({pm_root:pmRoot,operation:"create",before:null,after:afterDocument,changed_fields:changedFields,sdk:createMutationGuardSdk({pmRoot,settings,typeToFolder:typeRegistry.type_to_folder})});const releaseDerivedIndexLock=await acquireItemMetadataDerivedIndexLock(pmRoot,author,{required:settings.governance.duplicate_detection_mode==="strict"&&allowDuplicate!==!0});let derivedIndexWarnings=[];try{settings.governance.duplicate_detection_mode==="strict"&&allowDuplicate!==!0&&await evaluateSimilarityGovernance(similarityCandidate,{pmRoot,mode:"strict",threshold:settings.governance.duplicate_detection_threshold,limit:settings.governance.duplicate_detection_limit,allowDuplicate:!1}),await writeFileAtomic(itemPath,serializeItemDocument(afterDocument,{format:settings.item_format,schema:settings.schema,extensionFieldNames}));try{const entry=createHistoryEntry({nowIso:nowValue,author,op:"create",before:beforeDocument,after:afterDocument,message:historyMessage,context:workflowPolicy.decisions.length===0?void 0:{workflow_policies:workflowPolicy.decisions}});await appendHistoryEntry(historyPath,entry)}catch(error){throw await removeFileIfExists(itemPath),error}hierarchyLockHeld&&(await hierarchyLockRelease(),hierarchyLockHeld=!1),derivedIndexWarnings=await refreshItemMetadataDerivedIndex({pmRoot,preferredFormat:settings.item_format,typeToFolder:typeRegistry.type_to_folder,schema:settings.schema,itemPath,document:afterDocument})}finally{await releaseDerivedIndexLock()}hookWarnings=[...workflowPolicy.warnings,...graphBeforeCreate?collectNewOrderingCycleWarnings(graphBeforeCreate,[...graphBeforeCreate,afterDocument.metadata],id):[],...derivedIndexWarnings,...await runActiveOnWriteHooks({path:itemPath,scope:"project",op:"create",item_id:afterDocument.metadata.id,item_type:afterDocument.metadata.type,before:beforeDocument,after:afterDocument,changed_fields:changedFields}),...await runActiveOnWriteHooks({path:historyPath,scope:"project",op:"create:history",item_id:afterDocument.metadata.id,item_type:afterDocument.metadata.type,before:beforeDocument,after:afterDocument,changed_fields:changedFields})],recordAfterCommandAffectedItem({id:afterDocument.metadata.id,op:"create",item_type:afterDocument.metadata.type,status:afterDocument.metadata.status,current:projectAfterCommandItemSnapshot(afterDocument.metadata,changedFields),changed_fields:changedFields})}finally{await lockRelease()}}finally{hierarchyLockHeld&&await hierarchyLockRelease()}return hookWarnings}async function runCreate(options,global2){options=prepareNativeMutationOptions("create",options);let resolvedOptions=normalizeLegacyNoneCreateOptions(await resolveCreateTransportInputs(options));const pmRoot=resolvePmRoot(process.cwd(),global2.path);await assertInitializedTracker(pmRoot);const settings=await readSettings(pmRoot),statusRegistry=resolveRuntimeStatusRegistry(settings.schema),runtimeFieldRegistry=resolveRuntimeFieldRegistry(settings.schema),typeRegistry=resolveItemTypeRegistry(settings,getActiveExtensionRegistrations()),typeSelection=await resolveCreateTypeSelection(resolvedOptions,global2,pmRoot,settings,typeRegistry);resolvedOptions=typeSelection.resolvedOptions;const{typeDefinition,type,createMode}=typeSelection,unsetTargets=parseCreateUnsetTargets(resolvedOptions.unset,runtimeFieldRegistry),{explicitUnsets,clearOptionKeys}=collectCreateClearTargets(resolvedOptions,unsetTargets);assertNoCreateScalarUnsetConflicts(resolvedOptions,unsetTargets),assertNoLegacyCreateScalarTokens(resolvedOptions);const author=resolveAuthor(parseOptionalString(resolvedOptions.author),settings.author_default),missingRequiredCreateFlags=requireCreateOptionByType(typeDefinition,resolvedOptions,createMode,clearOptionKeys,author),nowValue=nowIso(),dependencies=parseDependencies(resolvedOptions.dep,nowValue,settings.id_prefix,author),comments=parseLogSeed("--comment",resolvedOptions.comment,nowValue,author),notes=parseLogSeed("--note",resolvedOptions.note,nowValue,author),learnings=parseLogSeed("--learning",resolvedOptions.learning,nowValue,author),files=parseFiles(resolvedOptions.file),tests=parseTests(resolvedOptions.test);tests.values=await attachLinkedTestMutationProvenance(tests.values,author,nowValue);const docs=parseDocs(resolvedOptions.doc),reminders=parseReminders(resolvedOptions.reminder,nowValue),events=parseEvents(resolvedOptions.event,nowValue),typeOptions=parseTypeOptions(resolvedOptions.typeOption),validatedTypeOptions=validateTypeOptions(type,typeOptions.values,typeRegistry),extensionRegistrations=getActiveExtensionRegistrations(),extensionFieldNames=collectRegisteredItemFieldNames(extensionRegistrations),registeredItemFieldValues=parseRegisteredItemFieldAssignments(resolvedOptions.field,extensionRegistrations,resolveCoreFieldRecovery,createSchemaFieldRecoveryResolver(runtimeFieldRegistry,"create",resolvedOptions)),runtimeCreateFieldValues=collectRuntimeCreateFieldValues(resolvedOptions,runtimeFieldRegistry,type),missingRequiredRuntimeFlagSet=new Set(runtimeCreateFieldValues.missing_required_flags),missingRequiredRuntimeFields=runtimeFieldRegistry.definitions.filter(field=>missingRequiredRuntimeFlagSet.has(`--${field.cli_flag}`));assertNoCreateFieldUnsetConflicts(registeredItemFieldValues,runtimeCreateFieldValues,unsetTargets);const missingRequiredTypeOptionKeys=collectMissingRequiredTypeOptionKeys(validatedTypeOptions.errors,type),missingRequiredTypeOptionFlags=missingRequiredTypeOptionKeys.map(key=>`--type-option ${key}=<value>`),combinedMissingFlags=[...new Set([...missingRequiredCreateFlags,...missingRequiredTypeOptionFlags,...runtimeCreateFieldValues.missing_required_flags])].sort((left,right)=>left.localeCompare(right));assertNoMissingRequiredCreateOptions({combinedMissingFlags,typeDefinition,missingRequiredCreateFlags,missingRequiredTypeOptionKeys,openStatus:statusRegistry.open_status,type,createMode,missingRequiredRuntimeFields}),assertNoInvalidTypeOptions(validatedTypeOptions.errors,type,typeDefinition,statusRegistry);const id=await resolveCreateItemId({pmRoot,settings,typeRegistry,explicitId:resolvedOptions.id});let status=resolvedOptions.status!==void 0?parseStatusValue(resolvedOptions.status,statusRegistry):resolveCreateDefaultStatus(typeDefinition,statusRegistry);const priority=resolvedOptions.priority!==void 0?resolvePriority(resolvedOptions.priority):2,unsetKeys=unsetTargets.metadataKeys,tags=resolveCreateTags(unsetKeys,resolvedOptions),deadline=resolveUnsettableTransformed(unsetKeys,"deadline",resolvedOptions.deadline,raw=>resolveIsoOrRelative(raw,new Date(nowValue),"deadline")),estimatedMinutes=resolveUnsettableTransformed(unsetKeys,"estimated_minutes",resolvedOptions.estimatedMinutes,raw=>parseOptionalNonNegativeInteger(raw,"estimated-minutes")),acceptanceCriteria=resolveUnsettableOptionalString(unsetKeys,"acceptance_criteria",resolvedOptions.acceptanceCriteria),definitionOfReady=resolveUnsettableOptionalString(unsetKeys,"definition_of_ready",resolvedOptions.definitionOfReady),order=resolveCreateOrder(unsetKeys,resolvedOptions),goal=resolveUnsettableOptionalString(unsetKeys,"goal",resolvedOptions.goal),objective=resolveUnsettableOptionalString(unsetKeys,"objective",resolvedOptions.objective),value=resolveUnsettableOptionalString(unsetKeys,"value",resolvedOptions.value),impact=resolveUnsettableOptionalString(unsetKeys,"impact",resolvedOptions.impact),outcome=resolveUnsettableOptionalString(unsetKeys,"outcome",resolvedOptions.outcome),whyNow=resolveUnsettableOptionalString(unsetKeys,"why_now",resolvedOptions.whyNow),assignee=resolveUnsettableOptionalString(unsetKeys,"assignee",resolvedOptions.assignee),authorValue=unsetKeys.has("author")?void 0:parseOptionalString(resolvedOptions.author)??author,initialParent=resolveUnsettableOptionalString(unsetKeys,"parent",resolvedOptions.parent),inheritedParent=await inheritFocusedParent(initialParent,resolvedOptions,unsetKeys,pmRoot);let parent=inheritedParent.parent;const parentSource=inheritedParent.parentSource,reviewer=resolveUnsettableOptionalString(unsetKeys,"reviewer",resolvedOptions.reviewer),risk=resolveUnsettableTransformed(unsetKeys,"risk",resolvedOptions.risk,raw=>ensureEnumValue(normalizeRiskInput(raw),RISK_VALUES,"risk")),confidence=resolveUnsettableTransformed(unsetKeys,"confidence",resolvedOptions.confidence,raw=>parseConfidenceInput(raw)),parentReferencePolicy=resolvedOptions.allowMissingParent===!0&&settings.validation.parent_reference==="strict_error"?"warn":settings.validation.parent_reference,sprintReleasePolicy=settings.validation.sprint_release_format,validationWarnings=[...typeSelection.warnings,...collectCreateScheduleWarnings(type,id,deadline,reminders.values,events.values)],parentValidation=await resolveCreateParentWithWarnings({itemId:id,parent,pmRoot,settings,typeRegistry,policy:parentReferencePolicy});parent=parentValidation.parent,validationWarnings.push(...parentValidation.warnings);const sprintResolved=resolveCreateSprintOrRelease(unsetKeys,"sprint",resolvedOptions.sprint,"sprint",sprintReleasePolicy),sprint=sprintResolved.value;validationWarnings.push(...sprintResolved.warnings);const releaseResolved=resolveCreateSprintOrRelease(unsetKeys,"release",resolvedOptions.release,"release",sprintReleasePolicy),release=releaseResolved.value;validationWarnings.push(...releaseResolved.warnings);const blockedBy=resolveUnsettableOptionalString(unsetKeys,"blocked_by",resolvedOptions.blockedBy),blockedByResolution=await resolveCreateBlockedByDependency({pmRoot,settings,typeRegistry,statusRegistry,blockedBy,dependencyValues:dependencies.values,status,statusExplicit:resolvedOptions.status!==void 0,nowValue,author}),dependencyValues=blockedByResolution.dependencyValues;assertDependencyEdgesAllowed(id,dependencyValues),validationWarnings.push(...await assertDependencyTargetsResolvable({pmRoot,dependencies:dependencyValues,idPrefix:settings.id_prefix,itemFormat:settings.item_format,typeToFolder:typeRegistry.type_to_folder,allowUnresolved:resolvedOptions.allowUnresolvedDeps,holders:[{id,createdAt:nowValue}],schema:settings.schema})),status=blockedByResolution.status;const blockedReason=resolveUnsettableOptionalString(unsetKeys,"blocked_reason",resolvedOptions.blockedReason),unblockNote=resolveUnsettableOptionalString(unsetKeys,"unblock_note",resolvedOptions.unblockNote),reporter=resolveUnsettableOptionalString(unsetKeys,"reporter",resolvedOptions.reporter),severity=resolveUnsettableTransformed(unsetKeys,"severity",resolvedOptions.severity,raw=>ensureEnumValue(normalizeSeverityInput(raw),ISSUE_SEVERITY_VALUES,"severity")),environment=resolveUnsettableOptionalString(unsetKeys,"environment",resolvedOptions.environment),reproSteps=resolveUnsettableOptionalString(unsetKeys,"repro_steps",resolvedOptions.reproSteps),resolution=resolveUnsettableOptionalString(unsetKeys,"resolution",resolvedOptions.resolution),expectedResult=resolveUnsettableOptionalString(unsetKeys,"expected_result",resolvedOptions.expectedResult),actualResult=resolveUnsettableOptionalString(unsetKeys,"actual_result",resolvedOptions.actualResult),affectedVersion=resolveUnsettableOptionalString(unsetKeys,"affected_version",resolvedOptions.affectedVersion),fixedVersion=resolveUnsettableOptionalString(unsetKeys,"fixed_version",resolvedOptions.fixedVersion),component=resolveUnsettableOptionalString(unsetKeys,"component",resolvedOptions.component),regression=resolveUnsettableTransformed(unsetKeys,"regression",resolvedOptions.regression,raw=>parseRegressionInput(raw)),customerImpact=resolveUnsettableOptionalString(unsetKeys,"customer_impact",resolvedOptions.customerImpact),title=requireStringOption(resolvedOptions.title,"--title"),description=resolvedOptions.description??"",body=resolvedOptions.body??"",similarityAdvisory=await evaluateSimilarityGovernance({title,description,body},{pmRoot,mode:settings.governance.duplicate_detection_mode,threshold:settings.governance.duplicate_detection_threshold,limit:settings.governance.duplicate_detection_limit,allowDuplicate:resolvedOptions.allowDuplicate});validationWarnings.push(...similarityAdvisoryWarnings(similarityAdvisory));const closeReasonResolution=resolveCreateCloseReason(status,statusRegistry,settings,resolvedOptions,resolution,nowValue),closeReason=closeReasonResolution.closeReason,closedAt=status===statusRegistry.close_status?nowValue:void 0,completedAt=closeReasonResolution.completedAt;validationWarnings.push(...closeReasonResolution.warnings);const itemMetadata=normalizeItemMetadata({id,title,description,type,type_options:validatedTypeOptions.normalized,status,closed_at:closedAt,completed_at:completedAt,close_reason:closeReason,priority,tags,created_at:nowValue,updated_at:nowValue,deadline,assignee,author:authorValue,estimated_minutes:estimatedMinutes,acceptance_criteria:acceptanceCriteria,definition_of_ready:definitionOfReady,order,goal,objective,value,impact,outcome,why_now:whyNow,parent,reviewer,risk,confidence,sprint,release,blocked_by:blockedBy,blocked_reason:blockedReason,unblock_note:unblockNote,reporter,severity,environment,repro_steps:reproSteps,resolution,expected_result:expectedResult,actual_result:actualResult,affected_version:affectedVersion,fixed_version:fixedVersion,component,regression,customer_impact:customerImpact,dependencies:dependencyValues,comments:comments.values,notes:notes.values,learnings:learnings.values,files:files.values,tests:tests.values,docs:docs.values,reminders:reminders.values,events:events.values,...registeredItemFieldValues,...runtimeCreateFieldValues.values});try{applyRegisteredItemFieldDefaultsAndValidation(itemMetadata,extensionRegistrations)}catch(error){throw new PmCliError(error instanceof Error?error.message:"Invalid extension item field values",EXIT_CODE.USAGE)}const afterDocument=canonicalDocument({metadata:itemMetadata,body},{schema:settings.schema,extensionFieldNames}),beforeDocument={metadata:{},body:""},explicitUnsetKeys=[...explicitUnsets].sort((left,right)=>left.localeCompare(right)),historyMessage=buildHistoryMessage(resolvedOptions.message,explicitUnsetKeys),changedFields=buildChangedFields(itemMetadata,body,explicitUnsetKeys,[...Object.keys(registeredItemFieldValues),...Object.keys(runtimeCreateFieldValues.values??{})]),hookWarnings=await writeCreatedItem({pmRoot,type,id,settings,typeRegistry,author,extensionFieldNames,afterDocument,beforeDocument,historyMessage,changedFields,nowValue,similarityCandidate:{title,description,body},allowDuplicate:resolvedOptions.allowDuplicate}),outputItem=structuredClone(itemMetadata);createMode==="strict"&&explicitUnsets.has("dependencies")&&(outputItem.dependencies=[]);const nextTransition=suggestNextLifecycleTransition(id,type,status,statusRegistry);return createItemLacksSchedule(type,deadline,reminders.values,events.values)&&printError(`[pm] warning: ${type} '${id}' has no deadline/reminder/event \u2014 it will not appear on the calendar. Add one via 'pm update ${id} --deadline <ISO>' or 'pm update ${id} --event "start=<ISO>,end=<ISO>"'.`),{item:outputItem,changed_fields:changedFields,warnings:[...validationWarnings,...hookWarnings],...Object.fromEntries([["parent_source",parentSource],["next_transition",nextTransition],["similarity_advisory",similarityAdvisory]].filter(entry=>entry[1]!==void 0))}}const _testOnlyCreateCommand={buildHistoryMessage,buildInvalidLogSeedKeysMessage,buildTypeSpecificCreateExample,collectMissingRequiredTypeOptionKeys,createExampleTokensForFlag,filterNonMissingTypeOptionErrors,hasTemplatesShowHandler,hasCreateOptionValue,loadCreateTemplateOptionsFromRuntime,looksLikeStructuredEntry,mergeCreateOptionsWithTemplate,normalizeCreatePolicyOptionKey,normalizeDependencyKindInput,parseDependencies,normalizeExtensionCommandPath,parseCreateUnsetTargets,requireStringOption,readTemplateOptionsFromRuntimeResult,resolveRuntimeCreateUnsetDefinition:(token,registry)=>resolveRuntimeUnsetFieldDefinition(token,"create",registry),typeOptionExampleValue};export{_testOnlyCreateCommand,parseDocs,parseFiles,parseLogSeed,parseTests,requireStringOption,runCreate};
|
|
1
|
+
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="c69f3810-8c78-58a5-8c08-cac0c54b4d53")}catch{}})();import{assertInitializedTracker}from"../environment/tracker-preflight.js";import{createExtensionCommandError}from"../error-runtime.js";import{isLiteralMutationInput,mutationInputAudience,mutationOptionLabel}from"../../core/item/literal-mutation-input.js";import{assertMutationStringOperand,prepareNativeMutationOptions}from"../runtime/mutation-value-validation.js";import{enforceWorkflowMutation}from"../../core/policy/workflow-policy-store.js";import{assertNoAmbiguousBareCommaEntry,looksLikeStructuredKeyValueEntry,resolveMutationStdinTokenFields}from"../../core/item/parse.js";import{removeFileIfExists,writeFileAtomic,appendHistoryEntry,createHistoryEntry,generateItemId,normalizeItemId,canonicalDocument,normalizeItemMetadata,serializeItemDocument,assertParentReferenceIsNotSelf,isPlaceholderReferenceToken,normalizeParentReferenceValue,validateMissingParentReference,validateSprintOrReleaseValue,assertNoUnknownCsvKeys,looksLikeGenericKeyValueEntry,mergeAdditiveTags,parseCsvKv,parseOptionalNonNegativeInteger,parseOptionalNumber,parseTags,shouldResolveMutationStdinTokens,transferMutationStdinTokenPolicy,resolvePriority,getFocusedItem,normalizeStatusInput,isTerminalStatus,canonicalizeCommandOptionKey,commandOptionFlagLabel,resolveItemTypeRegistry,resolveCommandOptionPolicyState,resolveTypeDefinition,resolveTypeName,validateTypeOptions,acquireLock,printError,buildInvalidTypeError,resolveTypeSynonym,collectRuntimeCreateFieldValues,resolveItemTypesFilePath,resolveRuntimeFieldRegistry,resolveRuntimeStatusRegistry,EXIT_CODE,ITEM_METADATA_KEY_ORDER,PmCliError,nowIso,resolveIsoOrRelative,getActiveExtensionRegistrations,projectAfterCommandItemSnapshot,recordAfterCommandAffectedItem,runActiveCommandHandler,runActiveBeforeMutationHooks,runActiveOnWriteHooks,collectRegisteredItemFieldNames,applyRegisteredItemFieldDefaultsAndValidation,parseRegisteredItemFieldAssignments,listAllItemMetadataLight,locateItem,createMutationGuardSdk,getHistoryPath,getItemPath,resolvePmRoot,readSettings,resolveAuthor}from"../runtime-primitives.js";import{requireTerminalReasonWithRecovery}from"../lifecycle-policy.js";import{evaluateSimilarityGovernance,similarityAdvisoryWarnings}from"../similarity.js";import{acquireItemMetadataDerivedIndexLock,refreshItemMetadataDerivedIndex}from"../item-metadata-index.js";import{collectNewOrderingCycleWarnings}from"../graph/mutation-advisory.js";import{assertHierarchyMutationAllowed}from"../graph/hierarchy-integrity.js";import{assertNonHierarchyCardinalityMutationAllowed,relationshipKindNeedsIntegrityLock}from"../graph/cardinality-integrity.js";import{resolveWorkspaceRelationshipKindRegistry}from"../graph/assembly.js";import{acquireHierarchyMutationLock}from"./hierarchy-mutation-lock.js";import{normalizeRiskInput,normalizeSeverityInput,parseConfidenceInput,parseRegressionInput}from"./metadata-normalizers.js";import{createSchemaFieldRecoveryResolver,resolveCoreFieldRecovery}from"./core-field-recovery.js";import{applyLegacyNoneCollectionNormalizers,createLegacyNoneCollectionNormalizers,assertNoLegacyNoneToken,assertNoLegacyNoneTokens,isLegacyNoneToken}from"./legacy-none-tokens.js";import{suggestNextLifecycleTransition}from"./lifecycle-transitions.js";import{parseLinkedTestAssertionEqualsMap,parseLinkedTestAssertionGteMap,parseLinkedTestBoolean,parseLinkedTestContextMode,parseLinkedTestEnvClear,parseLinkedTestEnvSet,parseLinkedTestMinLines,parseLinkedTestRegexList,parseLinkedTestStringList,parseLinkedTestWorkspaceContextMode}from"../test/parsers.js";import{STRUCTURED_LINKED_TEST_KEYS,normalizeStructuredLinkedTestEntry}from"../test/entry.js";import{attachLinkedTestMutationProvenance}from"../test/trust.js";import{CREATE_UNSET_FIELD_DEFINITIONS,literalSentinelAdvisories,parseCommandUnsetTargets,resolveRuntimeUnsetFieldDefinition}from"./shared-unset-fields.js";import{ensureEnumValue}from"./recurrence-parsers.js";import{requireDependencyKind,assertDependencyEdgesAllowed,assertDependencyTargetsResolvable,assertValidBareDependencyFlagValue}from"../dependency-flag-validation.js";import{normalizeDependencySeedId,normalizeItemReference,isExternalDependencyReference,normalizeDependencySourceKind}from"../dependency-provenance.js";import{supportsCreateExplicitEmpty}from"../agent/create-option-policy.js";import{parseEventEntries,parseReminderEntries,parseTypeOptionEntries}from"./repeatable-metadata-parsers.js";import{ISSUE_SEVERITY_VALUES,RISK_VALUES,SCOPE_VALUES}from"../../types/index.js";const CREATE_MODE_VALUES=["strict","progressive"],SCHEDULE_CREATE_PRESET_VALUES=["lightweight"],SCHEDULE_CREATE_PRESET_TYPES=new Set(["Reminder","Meeting","Event"]),LOG_SEED_ALLOWED_KEYS=new Set(["author","created_at","text"]),CREATE_UNSET_ALIAS_MAP=(()=>{const map=new Map;for(const definition of CREATE_UNSET_FIELD_DEFINITIONS)for(const alias of definition.aliases)map.set(alias,{optionKey:definition.optionKey,metadataKey:definition.metadataKey});return map})(),CREATE_OPTION_KEY_TO_UNSET_CANONICAL=new Map(CREATE_UNSET_FIELD_DEFINITIONS.map(definition=>[definition.optionKey,definition.canonical])),CREATE_UNSET_SUPPORTED_CANONICAL_FIELDS=CREATE_UNSET_FIELD_DEFINITIONS.map(definition=>definition.canonical).sort((left,right)=>left.localeCompare(right)).join(", ");function buildInvalidLogSeedKeysMessage(optionName,unsupportedKeys){const sortedUnsupported=[...unsupportedKeys].sort((left,right)=>left.localeCompare(right)),keyLabel=sortedUnsupported.length===1?"key":"keys";return`${optionName} supports only author, created_at, and text seed fields. Found unsupported ${keyLabel}: ${sortedUnsupported.join(", ")}. If text contains comma-separated key:value-like fragments, wrap text in quotes (for example text="first,scope:project"), use markdown-style key/value input, or pass ${optionName} - with piped stdin.`}function parseStatusValue(value,statusRegistry){const normalized=normalizeStatusInput(value,statusRegistry);if(!normalized){const allowedStatuses=statusRegistry.definitions.map(definition=>definition.id);throw new PmCliError(`Invalid status value "${value}". Allowed: ${allowedStatuses.join(", ")}`,EXIT_CODE.USAGE,{code:"invalid_argument_value",field:"status",value,allowed:allowedStatuses})}return normalized}function resolveCreateDefaultStatus(typeDefinition,statusRegistry){const configured=typeDefinition.default_status;if(configured!==void 0){const normalized=normalizeStatusInput(configured,statusRegistry);if(normalized)return normalized}return statusRegistry.open_status}function parseCreatedAt(value,currentIso){if(!value||value.trim()===""||value.trim().toLowerCase()==="now")return currentIso;const parsed=Date.parse(value);if(!Number.isFinite(parsed))throw new PmCliError(`Invalid created_at timestamp "${value}"`,EXIT_CODE.USAGE);return new Date(parsed).toISOString()}const CREATE_LEGACY_NONE_COLLECTION_NORMALIZERS=createLegacyNoneCollectionNormalizers();function normalizeLegacyNoneCreateOptions(options){if(isLiteralMutationInput(options))return options;const normalized={...options,unset:options.unset?[...options.unset]:void 0},appendUnsetTarget=value=>{const current=normalized.unset?[...normalized.unset]:[];current.includes(value)||current.push(value),normalized.unset=current};isLegacyNoneToken(normalized.template)&&(normalized.template=void 0);const scalarOptionKeys=new Set([...CREATE_OPTION_KEY_TO_UNSET_CANONICAL.keys(),"rank"]);for(const optionKey of scalarOptionKeys){if(isLiteralMutationInput(options,optionKey))continue;const candidate=normalized[optionKey];if(typeof candidate!="string"||!isLegacyNoneToken(candidate))continue;const canonicalUnset=optionKey==="rank"?"order":CREATE_OPTION_KEY_TO_UNSET_CANONICAL.get(optionKey)??optionKey;appendUnsetTarget(canonicalUnset),normalized[optionKey]=void 0}return transferMutationStdinTokenPolicy(options,applyLegacyNoneCollectionNormalizers(normalized,CREATE_LEGACY_NONE_COLLECTION_NORMALIZERS))}function parseOptionalString(value){if(value!==void 0)return value}function parseCreateUnsetTargets(raw,runtimeFieldRegistry){return parseCommandUnsetTargets({raw,supportedFields:CREATE_UNSET_SUPPORTED_CANONICAL_FIELDS,resolveDefinition:trimmed=>CREATE_UNSET_ALIAS_MAP.get(trimmed)??resolveRuntimeUnsetFieldDefinition(trimmed,"create",runtimeFieldRegistry)})}const DEP_SEED_KEYS=["id","kind","type","author","created_at","source_kind"],LINKED_ARTIFACT_SEED_KEYS=["path","scope","note"];function parseDependencies(raw,nowValue,prefix,fallbackAuthor){return!raw||raw.length===0?{values:void 0,explicitEmpty:!1}:(assertNoLegacyNoneTokens(raw,"--dep","Use --clear-deps to clear dependencies."),{values:raw.map(entry=>{const trimmedEntry=entry.trim(),isStructured=looksLikeStructuredEntry(trimmedEntry,DEP_SEED_KEYS);assertValidBareDependencyFlagValue(trimmedEntry,isStructured);const kv=isStructured?parseCsvKv(entry,"--dep"):{id:trimmedEntry,kind:"related"};isStructured&&assertNoUnknownCsvKeys(kv,"--dep",DEP_SEED_KEYS);const id=parseOptionalString(kv.id),kind=normalizeDependencyKindInput(parseOptionalString(kv.kind??kv.type));if(!id||!kind)throw new PmCliError("--dep requires id and kind, or a bare item id to create a related dependency",EXIT_CODE.USAGE);if(id.trim().toLowerCase()==="undefined")throw new PmCliError(`--dep id must not use placeholder token "${id}". Use --clear-deps to clear dependencies.`,EXIT_CODE.USAGE);const sourceKind=normalizeDependencySourceKind(parseOptionalString(kv.source_kind)),explicitAuthor=parseOptionalString(kv.author);return{id:normalizeDependencySeedId(id,prefix,sourceKind),kind:requireDependencyKind(kind),created_at:parseCreatedAt(kv.created_at,nowValue),author:explicitAuthor??fallbackAuthor,source_kind:sourceKind??"cli:create:dep",author_source:explicitAuthor?"asserted":"detected"}}),explicitEmpty:!1})}function normalizeDependencyKindInput(raw){return typeof raw=="string"?resolveWorkspaceRelationshipKindRegistry().resolve(raw)?.kind??raw.trim():raw}function looksLikeStructuredEntry(raw,keys){return looksLikeStructuredKeyValueEntry(raw,keys)?!0:looksLikeGenericKeyValueEntry(raw)}function parseLogSeed(optionName,raw,nowValue,fallbackAuthor){return!raw||raw.length===0?{values:void 0,explicitEmpty:!1}:(assertNoLegacyNoneTokens(raw,optionName,optionName==="--comment"?"Use --clear-comments to clear comments.":optionName==="--note"?"Use --clear-notes to clear notes.":"Use --clear-learnings to clear learnings."),{values:raw.map(entry=>{const trimmedEntry=entry.trim(),buildPlainTextCommentSeed=()=>{if(trimmedEntry.length===0)throw new PmCliError(`${optionName} requires text=<value>`,EXIT_CODE.USAGE);return{created_at:nowValue,author:fallbackAuthor,text:trimmedEntry}};let kv;try{kv=parseCsvKv(entry,optionName)}catch(error){if(optionName==="--comment"||optionName==="--note"||optionName==="--learning")return buildPlainTextCommentSeed();throw error}if(Object.keys(kv).filter(key=>!LOG_SEED_ALLOWED_KEYS.has(key)).length>0)return{created_at:parseCreatedAt(kv.created_at,nowValue),author:parseOptionalString(kv.author)??fallbackAuthor,text:trimmedEntry};const text=kv.text??"";if(text==="")throw new PmCliError(`${optionName} requires text=<value>`,EXIT_CODE.USAGE);return{created_at:parseCreatedAt(kv.created_at,nowValue),author:parseOptionalString(kv.author)??fallbackAuthor,text}}),explicitEmpty:!1})}function parseFiles(raw){return!raw||raw.length===0?{values:void 0,explicitEmpty:!1}:(assertNoLegacyNoneTokens(raw,"--file","Use --clear-files to clear linked files."),{values:raw.map(entry=>{const trimmedEntry=entry.trim(),isStructured=looksLikeStructuredEntry(trimmedEntry,LINKED_ARTIFACT_SEED_KEYS);assertNoAmbiguousBareCommaEntry(trimmedEntry,"--file","file path",isStructured);const kv=isStructured?parseCsvKv(entry,"--file"):{path:trimmedEntry};if(isStructured&&assertNoUnknownCsvKeys(kv,"--file",LINKED_ARTIFACT_SEED_KEYS),!kv.path)throw new PmCliError("--file requires path=<value> or a bare file path",EXIT_CODE.USAGE);return{path:kv.path,scope:ensureEnumValue(kv.scope??"project",SCOPE_VALUES,"file scope"),note:parseOptionalString(kv.note)}}),explicitEmpty:!1})}function parseTests(raw){return!raw||raw.length===0?{values:void 0,explicitEmpty:!1}:(assertNoLegacyNoneTokens(raw,"--test","Use --clear-tests to clear linked tests."),{values:raw.map(entry=>{const trimmedEntry=entry.trim(),isStructured=looksLikeStructuredEntry(trimmedEntry,STRUCTURED_LINKED_TEST_KEYS);assertNoAmbiguousBareCommaEntry(trimmedEntry,"--test","test command",isStructured);const kv=isStructured?normalizeStructuredLinkedTestEntry(parseCsvKv(entry,"--test"),"--test"):{command:trimmedEntry},command=parseOptionalString(kv.command),filePath=parseOptionalString(kv.path);if(!command)throw new PmCliError("--test requires command=<value> or a bare command (path=<value> is optional metadata)",EXIT_CODE.USAGE);const timeoutSecondsRaw=parseOptionalString(kv.timeout_seconds),timeoutAliasRaw=parseOptionalString(kv.timeout);if(timeoutSecondsRaw&&timeoutAliasRaw&&timeoutSecondsRaw!==timeoutAliasRaw)throw new PmCliError("--test timeout and timeout_seconds must match when both are provided",EXIT_CODE.USAGE);const timeoutRaw=timeoutSecondsRaw??timeoutAliasRaw;return{command,path:filePath,scope:ensureEnumValue(kv.scope??"project",SCOPE_VALUES,"test scope"),timeout_seconds:timeoutRaw?parseOptionalNumber(timeoutRaw,"timeout_seconds"):void 0,pm_context_mode:parseLinkedTestContextMode(kv.pm_context_mode,"--test"),workspace_context_mode:parseLinkedTestWorkspaceContextMode(kv.workspace_context_mode,"--test"),env_set:parseLinkedTestEnvSet(kv.env_set,"--test"),env_clear:parseLinkedTestEnvClear(kv.env_clear,"--test"),shared_host_safe:parseLinkedTestBoolean(kv.shared_host_safe,"--test","shared_host_safe"),assert_stdout_contains:parseLinkedTestStringList(kv.assert_stdout_contains),assert_stdout_regex:parseLinkedTestRegexList(kv.assert_stdout_regex,"--test","assert_stdout_regex"),assert_stderr_contains:parseLinkedTestStringList(kv.assert_stderr_contains),assert_stderr_regex:parseLinkedTestRegexList(kv.assert_stderr_regex,"--test","assert_stderr_regex"),assert_stdout_min_lines:parseLinkedTestMinLines(kv.assert_stdout_min_lines,"--test"),assert_json_field_equals:parseLinkedTestAssertionEqualsMap(kv.assert_json_field_equals,"--test"),assert_json_field_gte:parseLinkedTestAssertionGteMap(kv.assert_json_field_gte,"--test"),note:parseOptionalString(kv.note)}}),explicitEmpty:!1})}function parseDocs(raw){return!raw||raw.length===0?{values:void 0,explicitEmpty:!1}:(assertNoLegacyNoneTokens(raw,"--doc","Use --clear-docs to clear linked docs."),{values:raw.map(entry=>{const trimmedEntry=entry.trim(),isStructured=looksLikeStructuredEntry(trimmedEntry,LINKED_ARTIFACT_SEED_KEYS),kv=isStructured?parseCsvKv(entry,"--doc"):{path:trimmedEntry};if(isStructured&&assertNoUnknownCsvKeys(kv,"--doc",LINKED_ARTIFACT_SEED_KEYS),!kv.path)throw new PmCliError("--doc requires path=<value> or a bare doc path",EXIT_CODE.USAGE);return{path:kv.path,scope:ensureEnumValue(kv.scope??"project",SCOPE_VALUES,"doc scope"),note:parseOptionalString(kv.note)}}),explicitEmpty:!1})}function parseReminders(raw,nowValue){return!raw||raw.length===0?{values:void 0,explicitEmpty:!1}:(assertNoLegacyNoneTokens(raw,"--reminder","Use --clear-reminders to clear reminders."),{values:parseReminderEntries(raw,new Date(nowValue),{valueMode:"raw"}),explicitEmpty:!1})}function parseEvents(raw,nowValue){return!raw||raw.length===0?{values:void 0,explicitEmpty:!1}:(assertNoLegacyNoneTokens(raw,"--event","Use --clear-events to clear linked events."),{values:parseEventEntries(raw,new Date(nowValue),{allDayEmptyGuard:"defined",recurrenceEmptyNumericGuard:"defined"}),explicitEmpty:!1})}function buildChangedFields(itemMetadata,body,explicitUnsets,additionalItemMetadataKeys=[]){const changed=[...ITEM_METADATA_KEY_ORDER.filter(key=>itemMetadata[key]!==void 0),...additionalItemMetadataKeys.filter(key=>itemMetadata[key]!==void 0),...body.length>0?["body"]:[],...explicitUnsets.map(key=>`unset:${key}`)];return Array.from(new Set(changed))}function buildHistoryMessage(baseMessage,explicitUnsets){const trimmed=baseMessage??"";if(explicitUnsets.length===0)return trimmed;const suffix=`explicit_unset=${explicitUnsets.join(",")}`;return trimmed?`${trimmed} | ${suffix}`:suffix}function normalizeCreatePolicyOptionKey(raw,typeName,sourceLabel){const canonical=canonicalizeCommandOptionKey("create",raw);if(!canonical)throw new PmCliError(`Unsupported ${sourceLabel} entry "${raw}" for type "${typeName}"`,EXIT_CODE.CONFLICT);return canonical}function buildCreateOptionValueLookup(options){return{scalarValues:{title:options.title,description:options.description,type:options.type,status:options.status,priority:options.priority,tags:options.tags,body:options.body,deadline:options.deadline,estimatedMinutes:options.estimatedMinutes,acceptanceCriteria:options.acceptanceCriteria,definitionOfReady:options.definitionOfReady,order:options.order??options.rank,goal:options.goal,objective:options.objective,value:options.value,impact:options.impact,outcome:options.outcome,whyNow:options.whyNow,author:options.author,message:options.message,assignee:options.assignee,parent:options.parent,reviewer:options.reviewer,risk:options.risk,confidence:options.confidence,sprint:options.sprint,release:options.release,blockedBy:options.blockedBy,blockedReason:options.blockedReason,unblockNote:options.unblockNote,reporter:options.reporter,severity:options.severity,environment:options.environment,reproSteps:options.reproSteps,resolution:options.resolution,expectedResult:options.expectedResult,actualResult:options.actualResult,affectedVersion:options.affectedVersion,fixedVersion:options.fixedVersion,component:options.component,regression:options.regression,customerImpact:options.customerImpact},repeatableValues:{dep:options.dep,comment:options.comment,note:options.note,learning:options.learning,file:options.file,test:options.test,doc:options.doc,reminder:options.reminder,event:options.event,typeOption:options.typeOption,field:options.field},addTags:options.addTags}}function hasCreateOptionValue(lookup,optionKey){if(optionKey==="tags")return lookup.scalarValues.tags!==void 0||Array.isArray(lookup.addTags)&&lookup.addTags.length>0;if(Object.prototype.hasOwnProperty.call(lookup.scalarValues,optionKey))return lookup.scalarValues[optionKey]!==void 0;if(Object.prototype.hasOwnProperty.call(lookup.repeatableValues,optionKey)){const value=lookup.repeatableValues[optionKey];return Array.isArray(value)&&value.length>0}return!1}function buildRequiredCreateOptions(typeDefinition,createMode){const requiredOptions=new Set(["title","type"]);if(createMode!=="strict")return requiredOptions;for(const field of typeDefinition.required_create_fields)requiredOptions.add(normalizeCreatePolicyOptionKey(field,typeDefinition.name,"required_create_fields"));for(const field of typeDefinition.required_create_repeatables)requiredOptions.add(normalizeCreatePolicyOptionKey(field,typeDefinition.name,"required_create_repeatables"));return requiredOptions}function assertNoDisabledCreateOptions(disabledOptions,lookup,clearOptionKeys,typeName){for(const option of disabledOptions)if(!(!hasCreateOptionValue(lookup,option)&&!clearOptionKeys.has(option)))throw new PmCliError(`Option ${commandOptionFlagLabel("create",option)} is disabled for type "${typeName}" by command_option_policies`,EXIT_CODE.USAGE)}function assertNoStrictRequiredOptionClears(requiredOptions,createMode,clearOptionKeys){if(createMode!=="strict")return;const strictRequiredClears=requiredOptions.filter(required=>clearOptionKeys.has(required)&&!supportsCreateExplicitEmpty(required));if(strictRequiredClears.length===0)return;const requiredFlags=[...new Set(strictRequiredClears.map(required=>commandOptionFlagLabel("create",required)))].sort((left,right)=>left.localeCompare(right));throw new PmCliError(`Strict create mode requires concrete values for ${requiredFlags.join(", ")}; --unset cannot satisfy a required scalar option (only repeatable options accept an explicit --clear-* empty set)`,EXIT_CODE.USAGE)}function parseTypeOptions(raw){return!raw||raw.length===0?{values:void 0,explicitEmpty:!1}:(assertNoLegacyNoneTokens(raw,"--type-option","Use --clear-type-options to clear existing type options."),{values:parseTypeOptionEntries(raw),explicitEmpty:!1})}async function resolveCreateStdinInputs(options){return await resolveMutationStdinTokenFields(options,[["body","--body"],["description","--description"]],[["dep","--dep"],["comment","--comment"],["note","--note"],["learning","--learning"],["file","--file"],["test","--test"],["doc","--doc"],["reminder","--reminder"],["event","--event"],["typeOption","--type-option"],["field","--field"]])}async function resolveCreateTransportInputs(options){return shouldResolveMutationStdinTokens(options)?await resolveCreateStdinInputs(options):options}function resolveCreateMode(createMode,defaultMode){if(createMode===void 0)return defaultMode;const normalized=createMode.trim().toLowerCase();if(normalized.length===0)return defaultMode;if(normalized==="strict"||normalized==="progressive")return normalized;throw new PmCliError(`Invalid --create-mode value "${createMode}". Allowed: ${CREATE_MODE_VALUES.join(", ")}`,EXIT_CODE.USAGE)}function resolveScheduleCreatePreset(raw){if(raw===void 0)return;const normalized=raw.trim().toLowerCase();if(normalized.length===0)throw new PmCliError("--schedule-preset must not be empty",EXIT_CODE.USAGE);if(normalized==="lightweight"||normalized==="lite"||normalized==="schedule-lite")return"lightweight";throw new PmCliError(`Invalid --schedule-preset value "${raw}". Allowed: ${SCHEDULE_CREATE_PRESET_VALUES.join(", ")}`,EXIT_CODE.USAGE)}function resolveEffectiveCreateMode(createMode,schedulePreset,defaultMode){const resolvedMode=resolveCreateMode(createMode,defaultMode);if(schedulePreset===void 0)return resolvedMode;if(typeof createMode=="string"&&createMode.trim().length>0&&resolvedMode==="strict")throw new PmCliError("--schedule-preset lightweight cannot be combined with --create-mode strict. Use --create-mode progressive or omit --create-mode.",EXIT_CODE.USAGE);return"progressive"}function requireCreateOptionByType(typeDefinition,options,createMode,clearOptionKeys,resolvedAuthor){const typeName=typeDefinition.name,optionLookup=buildCreateOptionValueLookup(options),baseRequiredOptions=buildRequiredCreateOptions(typeDefinition,createMode),policyState=resolveCommandOptionPolicyState(typeDefinition,"create",baseRequiredOptions);if(policyState.errors.length>0)throw new PmCliError(policyState.errors.join("; "),EXIT_CODE.CONFLICT);assertNoDisabledCreateOptions(policyState.disabled,optionLookup,clearOptionKeys,typeName),assertNoStrictRequiredOptionClears(policyState.required,createMode,clearOptionKeys);const satisfiesRequiredOption=optionKey=>optionKey==="author"&&resolvedAuthor!=="unknown"||optionKey==="status"&&typeDefinition.default_status!==void 0||clearOptionKeys.has(optionKey)&&supportsCreateExplicitEmpty(optionKey)?!0:hasCreateOptionValue(optionLookup,optionKey),missingRequiredOptions=policyState.required.filter(required=>!satisfiesRequiredOption(required));return[...new Set(missingRequiredOptions.map(required=>commandOptionFlagLabel("create",required)))].sort((left,right)=>left.localeCompare(right))}const MISSING_REQUIRED_TYPE_OPTION_PATTERN=/^Missing required type option "([^"]+)" for type "([^"]+)"$/;function collectMissingRequiredTypeOptionKeys(errors,typeName){const missingKeys=[];for(const error of errors){const match=error.match(MISSING_REQUIRED_TYPE_OPTION_PATTERN);match&&match[2]===typeName&&missingKeys.push(match[1])}return[...new Set(missingKeys)].sort((left,right)=>left.localeCompare(right))}function filterNonMissingTypeOptionErrors(errors,typeName){return errors.filter(error=>{const match=error.match(MISSING_REQUIRED_TYPE_OPTION_PATTERN);return!match||match[2]!==typeName})}function assertNoInvalidTypeOptions(errors,type,typeDefinition,statusRegistry){const nonMissingTypeOptionErrors=filterNonMissingTypeOptionErrors(errors,type);if(nonMissingTypeOptionErrors.length===0)return;const nextValidExample=buildTypeSpecificCreateExample(typeDefinition,[],[],statusRegistry.open_status);throw new PmCliError(nonMissingTypeOptionErrors.join("; "),EXIT_CODE.USAGE,{code:"invalid_argument_value",required:`Provide valid --type-option key/value pairs for type "${type}".`,examples:[nextValidExample],nextSteps:[`Run "pm create --help --type ${type}" to review allowed type-option keys and values.`]})}function typeOptionExampleValue(typeDefinition,key){const firstAllowed=typeDefinition.options.find(option=>option.key===key)?.values[0];return typeof firstAllowed=="string"&&firstAllowed.trim().length>0?firstAllowed:"<value>"}function createExampleTokensForFlag(flag,typeName,openStatus){const canonicalFlag=flag.split("/")[0];switch(canonicalFlag){case"--title":return["--title",`"${typeName} example title"`];case"--description":return["--description",`"${typeName} example description"`];case"--type":return["--type",typeName];case"--status":return["--status",openStatus];case"--priority":return["--priority","1"];case"--message":return["--message",`"Create ${typeName} item"`];case"--comment":return["--comment",'"author=maintainer,created_at=now,text=Implementation context"'];default:return[canonicalFlag,'"<value>"']}}function buildTypeSpecificCreateExample(typeDefinition,missingCreateFlags,missingTypeOptionKeys,openStatus){const tokens=["pm","create","--title",`"${typeDefinition.name} example title"`,"--description",`"${typeDefinition.name} example description"`,"--type",typeDefinition.name],optionalRecommendationFlags=["--status","--priority","--message"],orderedFlags=[...new Set([...optionalRecommendationFlags,...missingCreateFlags])],includedFlags=new Set(["--title","--description","--type"]);for(const flag of orderedFlags){if(includedFlags.has(flag))continue;const clearFlag=CLEAR_FLAG_BY_REQUIRED_CREATE_FLAG[flag];tokens.push(...clearFlag?[clearFlag]:createExampleTokensForFlag(flag,typeDefinition.name,openStatus)),includedFlags.add(flag)}for(const key of missingTypeOptionKeys){const value=typeOptionExampleValue(typeDefinition,key);tokens.push("--type-option",`${key}=${value}`)}return tokens.join(" ")}function requireStringOption(value,flag,audience="cli"){const normalized=value?.trim();if(!normalized){const sdk=audience==="sdk";throw flag==="--title"?value!==void 0?new PmCliError(sdk?"Title cannot be empty or whitespace-only. Retry: pass a non-empty title.":"Title cannot be empty or whitespace-only. Retry: pass a non-empty title with --title.",EXIT_CODE.USAGE):new PmCliError(sdk?'Missing required option title. Why required: every item needs a human-readable title for lookup, search, and reporting. Retry: pass title (example: client.create({ type: "Issue", title: "Fix login bug" })).':'Missing required option --title. Why required: every item needs a human-readable title for lookup, search, and reporting. Retry: pass the title as the first positional argument (example: pm create "Fix login bug" --type Issue) or with --title.',EXIT_CODE.USAGE):new PmCliError(`Missing required option ${sdk?mutationOptionLabel("sdk",flag.replace(/^--/u,"")):flag}`,EXIT_CODE.USAGE)}return normalized}function mergeCreateOptionsWithTemplate(templateOptions,explicitOptions,runtimeFieldRegistry){const merged={};for(const[key,value]of Object.entries(templateOptions))merged[key]=Array.isArray(value)?[...value]:value;for(const[key,value]of Object.entries(explicitOptions))value!==void 0&&(merged[key]=Array.isArray(value)?[...value]:value);return dropTemplateDefaultsForExplicitUnsets(merged,explicitOptions,runtimeFieldRegistry),transferMutationStdinTokenPolicy(explicitOptions,merged)}function dropTemplateDefaultsForExplicitUnsets(merged,explicitOptions,runtimeFieldRegistry){const keys=[...parseCreateUnsetTargets(explicitOptions.unset,runtimeFieldRegistry).optionKeys].flatMap(key=>key==="order"?[key,"rank"]:key==="tags"?[key,"addTags"]:[key]);for(const key of keys)Reflect.get(explicitOptions,key)===void 0&&Reflect.deleteProperty(merged,key)}function normalizeExtensionCommandPath(command){return command.trim().toLowerCase().split(/\s+/).filter(part=>part.length>0).join(" ")}function hasTemplatesShowHandler(){const registrations=getActiveExtensionRegistrations();return registrations?registrations.commands.some(entry=>entry.action==="templates-show"||normalizeExtensionCommandPath(entry.command)==="templates show"):!1}function readTemplateOptionsFromRuntimeResult(result,templateName){if(typeof result!="object"||result===null||!("options"in result))throw new PmCliError(`Templates package returned invalid payload for template "${templateName}". Expected an options object.`,EXIT_CODE.GENERIC_FAILURE);const options=result.options;if(typeof options!="object"||options===null||Array.isArray(options))throw new PmCliError(`Templates package returned invalid options for template "${templateName}".`,EXIT_CODE.GENERIC_FAILURE);const normalized={};for(const[key,value]of Object.entries(options)){if(typeof value=="string"||typeof value=="number"||typeof value=="boolean"){normalized[key]=value;continue}if(Array.isArray(value)&&value.every(entry=>typeof entry=="string")){normalized[key]=[...value];continue}throw new PmCliError(`Templates package returned unsupported option value for "${key}" in template "${templateName}".`,EXIT_CODE.GENERIC_FAILURE)}return normalized}async function loadCreateTemplateOptionsFromRuntime(templateName,global2,pmRoot){if(!hasTemplatesShowHandler())throw new PmCliError("--template requires the templates package. Install it first (for example: pm install templates --project).",EXIT_CODE.USAGE);const handlerResult=await runActiveCommandHandler({command:"templates show",args:[templateName],options:{},global:global2,pm_root:pmRoot});if(!handlerResult.handled)throw Object.hasOwn(handlerResult,"cause")?createExtensionCommandError("templates show",handlerResult):new PmCliError(`Unable to resolve template "${templateName}" via templates package. Run "pm templates show ${templateName}" for details.`,EXIT_CODE.USAGE);return readTemplateOptionsFromRuntimeResult(handlerResult.result,templateName)}function resolveUnsettableOptionalString(unsetKeys,metadataKey,raw){return unsetKeys.has(metadataKey)||raw===void 0?void 0:parseOptionalString(raw)}function resolveUnsettableTransformed(unsetKeys,metadataKey,raw,transform){return unsetKeys.has(metadataKey)||raw===void 0?void 0:transform(raw)}const CALENDAR_RELEVANT_CREATE_TYPES=new Set(["milestone","meeting","reminder","event"]);function createItemLacksSchedule(type,deadline,reminders,events){const hasDeadline=deadline!==void 0,hasReminders=reminders!==void 0&&reminders.length>0,hasEvents=events!==void 0&&events.length>0;return CALENDAR_RELEVANT_CREATE_TYPES.has(type.toLowerCase())&&!hasDeadline&&!hasReminders&&!hasEvents}function collectCreateScheduleWarnings(type,id,deadline,reminders,events){const warnings=[];return type.toLowerCase()==="event"&&(events===void 0||events.length===0)&&warnings.push(`event_without_schedule:${id}:no_time_set`),createItemLacksSchedule(type,deadline,reminders,events)&&warnings.push(`calendar_item_without_schedule:${id}:no_deadline_or_reminder_or_event (hint: set --deadline <ISO> or --reminder "<when>", or link an Event via --event "start=<ISO>,end=<ISO>"; otherwise this item never appears on pm calendar)`),warnings}async function inheritFocusedParent(parent,resolvedOptions,unsetKeys,pmRoot){if(resolvedOptions.inheritFocus!==!0||parent!==void 0||unsetKeys.has("parent")||resolvedOptions.parent!==void 0)return{parent,parentSource:void 0};const focused=await getFocusedItem(pmRoot);return focused===void 0?{parent,parentSource:void 0}:{parent:focused,parentSource:"focus"}}async function validateCreateParentReference(pmRoot,settings,typeRegistry,itemId,parent,policy,audience){const normalized=normalizeItemReference(normalizeParentReferenceValue(parent,audience),settings.id_prefix);if(isExternalDependencyReference(normalized))return{parent:normalized,warnings:[]};if(assertParentReferenceIsNotSelf(itemId,normalized,settings.id_prefix,audience),await locateItem(pmRoot,normalized,settings.id_prefix,settings.item_format,typeRegistry.type_to_folder))return{parent:normalized,warnings:[]};const normalizedParentId=normalizeItemId(normalized,settings.id_prefix);return{parent:normalized,warnings:validateMissingParentReference(normalizedParentId,policy,audience).warnings}}async function resolveCreateParentWithWarnings(params){return params.parent===void 0?{parent:void 0,warnings:[]}:await validateCreateParentReference(params.pmRoot,params.settings,params.typeRegistry,params.itemId,params.parent,params.policy,params.audience)}async function resolveCreateItemId(params){if(params.explicitId===void 0)return generateItemId(params.pmRoot,params.settings.id_prefix,{tokenLength:params.settings.ids.token_length,typeToFolder:params.typeRegistry.type_to_folder,probeExisting:!1});assertMutationStringOperand(params.explicitId,"create","id");const trimmedId=params.explicitId.trim();if(trimmedId.length===0||isPlaceholderReferenceToken(trimmedId))throw new PmCliError("--id must not be empty or use a placeholder token",EXIT_CODE.USAGE);const normalizedId=normalizeItemId(trimmedId,params.settings.id_prefix);if(!/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/.test(normalizedId))throw new PmCliError("--id must contain only letters, numbers, and dashes after normalization",EXIT_CODE.USAGE);return normalizedId}function resolveCreateSprintOrRelease(unsetKeys,metadataKey,raw,field,policy,audience){const resolved=resolveUnsettableOptionalString(unsetKeys,metadataKey,raw);if(resolved===void 0)return{value:void 0,warnings:[]};const validation=validateSprintOrReleaseValue(field,resolved,policy,audience);return{value:validation.value,warnings:validation.warnings}}async function resolveCreateBlockedByDependency(params){const{pmRoot,settings,typeRegistry,statusRegistry,blockedBy,status,statusExplicit,nowValue,author}=params;let dependencyValues=params.dependencyValues;if(blockedBy===void 0)return{dependencyValues,status};const normalizedBlockedBy=normalizeItemId(blockedBy,settings.id_prefix),blockedByLocated=await locateItem(pmRoot,normalizedBlockedBy,settings.id_prefix,settings.item_format,typeRegistry.type_to_folder);if(!blockedByLocated)return{dependencyValues,status};if((dependencyValues??[]).some(dependency=>dependency.id===blockedByLocated.id&&dependency.kind==="blocked_by")||(dependencyValues=[...dependencyValues??[],{id:blockedByLocated.id,kind:"blocked_by",created_at:nowValue,author,source_kind:"cli:create:blocked_by",author_source:"detected"}]),statusExplicit)return{dependencyValues,status};const blockedStatus=statusRegistry.blocked_statuses.has("blocked")?"blocked":[...statusRegistry.blocked_statuses].sort((left,right)=>left.localeCompare(right))[0]??statusRegistry.open_status;return{dependencyValues,status:blockedStatus}}function applyCreateDefaultType(resolvedOptions,settings,typeRegistry){if(typeof resolvedOptions.createMode=="string"&&resolvedOptions.createMode.trim().toLowerCase()==="strict")return;const defaultType=settings.governance.create_default_type?.trim();if(defaultType&&defaultType.length>0&&resolveTypeName(defaultType,typeRegistry)){resolvedOptions.type=defaultType;return}resolveTypeName("Task",typeRegistry)&&(resolvedOptions.type="Task")}function collectTemplateCustomTypeOptions(typeDefinition,resolvedOptions){return typeDefinition.options.filter(option=>canonicalizeCommandOptionKey("create",option.key)===void 0).flatMap(option=>{const value=resolvedOptions[option.key];if(value===void 0)return[];if(typeof value=="string"||typeof value=="number"||typeof value=="boolean")return[option];throw new PmCliError(`Template custom type option "${option.key}" must be a string, number, or boolean value`,EXIT_CODE.USAGE)})}async function resolveCreateTypeSelection(options,global2,pmRoot,settings,typeRegistry){let resolvedOptions=options;const warnings=[];if(resolvedOptions.template!==void 0){const templateName=resolvedOptions.template.trim();if(templateName.length===0)throw new PmCliError("--template must not be empty. Omit --template to disable template usage.",EXIT_CODE.USAGE);const templateOptions=await loadCreateTemplateOptionsFromRuntime(templateName,global2,pmRoot);resolvedOptions=normalizeLegacyNoneCreateOptions(prepareNativeMutationOptions("create",mergeCreateOptionsWithTemplate(templateOptions,resolvedOptions,resolveRuntimeFieldRegistry(settings.schema))))}if(resolvedOptions.type===void 0&&applyCreateDefaultType(resolvedOptions,settings,typeRegistry),resolvedOptions.type===void 0)throw new PmCliError("Missing required option --type <value>",EXIT_CODE.USAGE);let resolvedTypeName=resolveTypeName(resolvedOptions.type,typeRegistry);if(!resolvedTypeName){const synonymCanonical=resolveTypeSynonym(resolvedOptions.type),synonymResolved=synonymCanonical?resolveTypeName(synonymCanonical,typeRegistry):void 0;if(synonymResolved)warnings.push(`type_coercion:${resolvedOptions.type.trim()}:${synonymResolved}`),resolvedOptions.type=synonymResolved,resolvedTypeName=synonymResolved;else throw new PmCliError(buildInvalidTypeError(resolvedOptions.type,typeRegistry.types,resolveItemTypesFilePath(pmRoot,settings.schema)),EXIT_CODE.USAGE)}const typeDefinition=resolveTypeDefinition(resolvedTypeName,typeRegistry);if(!typeDefinition)throw new PmCliError(`Invalid type value "${resolvedOptions.type}"`,EXIT_CODE.USAGE);const type=typeDefinition.name,matchedTemplateTypeOptions=collectTemplateCustomTypeOptions(typeDefinition,resolvedOptions),templateTypeOptions=matchedTemplateTypeOptions.map(option=>`${option.key}=${String(resolvedOptions[option.key])}`);if(templateTypeOptions.length>0){resolvedOptions.typeOption=[...templateTypeOptions,...resolvedOptions.typeOption??[]];for(const option of matchedTemplateTypeOptions)delete resolvedOptions[option.key]}const schedulePreset=resolveScheduleCreatePreset(resolvedOptions.schedulePreset);if(schedulePreset!==void 0&&!SCHEDULE_CREATE_PRESET_TYPES.has(type))throw new PmCliError(`--schedule-preset ${schedulePreset} is only supported for Reminder, Meeting, or Event types`,EXIT_CODE.USAGE);const createMode=resolveEffectiveCreateMode(resolvedOptions.createMode,schedulePreset,settings.governance.create_mode_default);return{resolvedOptions,typeDefinition,type,schedulePreset,createMode,warnings}}function collectCreateClearTargets(resolvedOptions,unsetTargets){const explicitUnsets=new Set(unsetTargets.metadataKeys),clearOptionKeys=new Set(unsetTargets.optionKeys),clearCollectionDefinitions=[{enabled:resolvedOptions.clearDeps,optionKey:"dep",clearFlag:"--clear-deps",valueFlag:"--dep",values:resolvedOptions.dep,metadataKey:"dependencies"},{enabled:resolvedOptions.clearComments,optionKey:"comment",clearFlag:"--clear-comments",valueFlag:"--comment",values:resolvedOptions.comment,metadataKey:"comments"},{enabled:resolvedOptions.clearNotes,optionKey:"note",clearFlag:"--clear-notes",valueFlag:"--note",values:resolvedOptions.note,metadataKey:"notes"},{enabled:resolvedOptions.clearLearnings,optionKey:"learning",clearFlag:"--clear-learnings",valueFlag:"--learning",values:resolvedOptions.learning,metadataKey:"learnings"},{enabled:resolvedOptions.clearFiles,optionKey:"file",clearFlag:"--clear-files",valueFlag:"--file",values:resolvedOptions.file,metadataKey:"files"},{enabled:resolvedOptions.clearTests,optionKey:"test",clearFlag:"--clear-tests",valueFlag:"--test",values:resolvedOptions.test,metadataKey:"tests"},{enabled:resolvedOptions.clearDocs,optionKey:"doc",clearFlag:"--clear-docs",valueFlag:"--doc",values:resolvedOptions.doc,metadataKey:"docs"},{enabled:resolvedOptions.clearReminders,optionKey:"reminder",clearFlag:"--clear-reminders",valueFlag:"--reminder",values:resolvedOptions.reminder,metadataKey:"reminders"},{enabled:resolvedOptions.clearEvents,optionKey:"event",clearFlag:"--clear-events",valueFlag:"--event",values:resolvedOptions.event,metadataKey:"events"},{enabled:resolvedOptions.clearTypeOptions,optionKey:"typeOption",clearFlag:"--clear-type-options",valueFlag:"--type-option",values:resolvedOptions.typeOption,metadataKey:"type_options"}];for(const definition of clearCollectionDefinitions)if(definition.enabled){if(definition.values&&definition.values.length>0)throw new PmCliError(`Cannot combine ${definition.clearFlag} with ${definition.valueFlag}`,EXIT_CODE.USAGE);explicitUnsets.add(definition.metadataKey),clearOptionKeys.add(definition.optionKey)}return{explicitUnsets,clearOptionKeys}}function assertNoCreateScalarUnsetConflicts(resolvedOptions,unsetTargets){const scalarOptionPresence={tags:resolvedOptions.tags!==void 0,deadline:resolvedOptions.deadline!==void 0,estimatedMinutes:resolvedOptions.estimatedMinutes!==void 0,acceptanceCriteria:resolvedOptions.acceptanceCriteria!==void 0,definitionOfReady:resolvedOptions.definitionOfReady!==void 0,order:resolvedOptions.order!==void 0||resolvedOptions.rank!==void 0,goal:resolvedOptions.goal!==void 0,objective:resolvedOptions.objective!==void 0,value:resolvedOptions.value!==void 0,impact:resolvedOptions.impact!==void 0,outcome:resolvedOptions.outcome!==void 0,whyNow:resolvedOptions.whyNow!==void 0,author:resolvedOptions.author!==void 0,assignee:resolvedOptions.assignee!==void 0,parent:resolvedOptions.parent!==void 0,reviewer:resolvedOptions.reviewer!==void 0,risk:resolvedOptions.risk!==void 0,confidence:resolvedOptions.confidence!==void 0,sprint:resolvedOptions.sprint!==void 0,release:resolvedOptions.release!==void 0,blockedBy:resolvedOptions.blockedBy!==void 0,blockedReason:resolvedOptions.blockedReason!==void 0,unblockNote:resolvedOptions.unblockNote!==void 0,reporter:resolvedOptions.reporter!==void 0,severity:resolvedOptions.severity!==void 0,environment:resolvedOptions.environment!==void 0,reproSteps:resolvedOptions.reproSteps!==void 0,resolution:resolvedOptions.resolution!==void 0,expectedResult:resolvedOptions.expectedResult!==void 0,actualResult:resolvedOptions.actualResult!==void 0,affectedVersion:resolvedOptions.affectedVersion!==void 0,fixedVersion:resolvedOptions.fixedVersion!==void 0,component:resolvedOptions.component!==void 0,regression:resolvedOptions.regression!==void 0,customerImpact:resolvedOptions.customerImpact!==void 0};for(const[optionKey,hasValue]of Object.entries(scalarOptionPresence)){if(!hasValue||!unsetTargets.optionKeys.has(optionKey))continue;const unsetField=CREATE_OPTION_KEY_TO_UNSET_CANONICAL.get(optionKey)??optionKey;throw new PmCliError(`Cannot combine --unset ${unsetField} with ${commandOptionFlagLabel("create",optionKey)}`,EXIT_CODE.USAGE)}}function assertNoLegacyCreateScalarTokens(resolvedOptions){if(isLiteralMutationInput(resolvedOptions))return;const assertNoLegacyScalarToken=(value,optionKey)=>{if(isLiteralMutationInput(resolvedOptions,optionKey))return;const unsetField=CREATE_OPTION_KEY_TO_UNSET_CANONICAL.get(optionKey),hint=unsetField?`Use --unset ${unsetField} to clear this field.`:void 0;assertNoLegacyNoneToken(value,commandOptionFlagLabel("create",optionKey),hint)};assertNoLegacyScalarToken(resolvedOptions.tags,"tags"),assertNoLegacyScalarToken(resolvedOptions.deadline,"deadline"),assertNoLegacyScalarToken(resolvedOptions.estimatedMinutes,"estimatedMinutes"),assertNoLegacyScalarToken(resolvedOptions.acceptanceCriteria,"acceptanceCriteria"),assertNoLegacyScalarToken(resolvedOptions.definitionOfReady,"definitionOfReady"),assertNoLegacyScalarToken(resolvedOptions.order??resolvedOptions.rank,"order"),assertNoLegacyScalarToken(resolvedOptions.goal,"goal"),assertNoLegacyScalarToken(resolvedOptions.objective,"objective"),assertNoLegacyScalarToken(resolvedOptions.value,"value"),assertNoLegacyScalarToken(resolvedOptions.impact,"impact"),assertNoLegacyScalarToken(resolvedOptions.outcome,"outcome"),assertNoLegacyScalarToken(resolvedOptions.whyNow,"whyNow"),assertNoLegacyScalarToken(resolvedOptions.author,"author"),assertNoLegacyScalarToken(resolvedOptions.assignee,"assignee"),assertNoLegacyScalarToken(resolvedOptions.parent,"parent"),assertNoLegacyScalarToken(resolvedOptions.reviewer,"reviewer"),assertNoLegacyScalarToken(resolvedOptions.risk,"risk"),assertNoLegacyScalarToken(resolvedOptions.confidence,"confidence"),assertNoLegacyScalarToken(resolvedOptions.sprint,"sprint"),assertNoLegacyScalarToken(resolvedOptions.release,"release"),assertNoLegacyScalarToken(resolvedOptions.blockedBy,"blockedBy"),assertNoLegacyScalarToken(resolvedOptions.blockedReason,"blockedReason"),assertNoLegacyScalarToken(resolvedOptions.unblockNote,"unblockNote"),assertNoLegacyScalarToken(resolvedOptions.reporter,"reporter"),assertNoLegacyScalarToken(resolvedOptions.severity,"severity"),assertNoLegacyScalarToken(resolvedOptions.environment,"environment"),assertNoLegacyScalarToken(resolvedOptions.reproSteps,"reproSteps"),assertNoLegacyScalarToken(resolvedOptions.resolution,"resolution"),assertNoLegacyScalarToken(resolvedOptions.expectedResult,"expectedResult"),assertNoLegacyScalarToken(resolvedOptions.actualResult,"actualResult"),assertNoLegacyScalarToken(resolvedOptions.affectedVersion,"affectedVersion"),assertNoLegacyScalarToken(resolvedOptions.fixedVersion,"fixedVersion"),assertNoLegacyScalarToken(resolvedOptions.component,"component"),assertNoLegacyScalarToken(resolvedOptions.regression,"regression"),assertNoLegacyScalarToken(resolvedOptions.customerImpact,"customerImpact")}function assertNoCreateFieldUnsetConflicts(registeredItemFieldValues,runtimeCreateFieldValues,unsetTargets){for(const fieldKey of Object.keys(registeredItemFieldValues))if(unsetTargets.metadataKeys.has(fieldKey))throw new PmCliError(`Cannot combine --unset ${fieldKey.replaceAll("_","-")} with --field ${fieldKey}=...`,EXIT_CODE.USAGE);for(const fieldKey of Object.keys(runtimeCreateFieldValues.values??{}))if(unsetTargets.metadataKeys.has(fieldKey))throw new PmCliError(`Cannot combine --unset ${fieldKey.replaceAll("_","-")} with its value flag`,EXIT_CODE.USAGE)}const CLEAR_FLAG_BY_REQUIRED_CREATE_FLAG={"--comment":"--clear-comments","--dep":"--clear-deps","--doc":"--clear-docs","--event":"--clear-events","--file":"--clear-files","--learning":"--clear-learnings","--note":"--clear-notes","--reminder":"--clear-reminders","--test":"--clear-tests","--type-option":"--clear-type-options"};function assertNoMissingRequiredCreateOptions(params){const{combinedMissingFlags,typeDefinition,missingRequiredCreateFlags,missingRequiredTypeOptionKeys,openStatus,type,createMode,missingRequiredRuntimeFields}=params;if(combinedMissingFlags.length===0)return;const runtimeFieldSyntax=missingRequiredRuntimeFields.map(field=>{const placeholder=field.type==="boolean"?"<true|false>":field.type==="array"?"<json-array>":field.type==="object"?"<json-object>":field.type==="number"?"<number>":field.type==="string_array"||field.repeatable?"<value>":"<string>";return{example:`--${field.cli_flag} ${placeholder}`,description:`--${field.cli_flag} maps to ${field.metadata_key} (${field.type}${field.repeatable?", repeatable":""})`}}),nextValidExample=[buildTypeSpecificCreateExample(typeDefinition,missingRequiredCreateFlags,missingRequiredTypeOptionKeys,openStatus),...runtimeFieldSyntax.map(field=>field.example)].join(" "),nextSteps=[`Run "pm create --help --type ${type}" for type-aware required option guidance.`,...combinedMissingFlags.filter(flag=>flag==="--title").map(()=>'Title can also be passed as the first positional argument (example: pm create "Your title" --type '+type+").")];createMode==="strict"&&(nextSteps.push('For staged onboarding, retry with "--create-mode progressive".'),SCHEDULE_CREATE_PRESET_TYPES.has(type)&&nextSteps.push('For minimal scheduling inputs, try "--schedule-preset lightweight".')),runtimeFieldSyntax.length>0&&nextSteps.push(`Required custom field formats: ${runtimeFieldSyntax.map(field=>field.description).join("; ")}.`);const collectionClearFlags=[...new Set(combinedMissingFlags.flatMap(flag=>{const normalizedFlag=flag.split(" ",1)[0],clearFlag=CLEAR_FLAG_BY_REQUIRED_CREATE_FLAG[normalizedFlag];return clearFlag?[clearFlag]:[]}))];collectionClearFlags.length>0&&nextSteps.push(`If the truthful value is an empty collection, use ${collectionClearFlags.join(", ")} instead of inventing metadata.`);const errorMessage=combinedMissingFlags.length===1?`Missing required option ${combinedMissingFlags[0]} for type "${type}"`:`Missing required options ${combinedMissingFlags.join(", ")} for type "${type}"`;throw new PmCliError(errorMessage,EXIT_CODE.USAGE,{code:"missing_required_option",required:`Provide all required create options and type options for type "${type}" in one invocation.`,examples:[...collectionClearFlags.map(flag=>`pm create --type ${type} ${flag} ...`),nextValidExample],nextSteps,recovery:createMode==="strict"?{recovery_mode:"compact",missing_required_fields:combinedMissingFlags,suggested_flags:[...collectionClearFlags,...combinedMissingFlags,"--create-mode progressive"]}:void 0})}function resolveCreateTags(unsetKeys,resolvedOptions){if(unsetKeys.has("tags")&&Array.isArray(resolvedOptions.addTags)&&resolvedOptions.addTags.length>0)throw new PmCliError("Cannot combine --unset tags with --add-tags",EXIT_CODE.USAGE);const baseTags=unsetKeys.has("tags")?[]:resolvedOptions.tags!==void 0?parseTags(resolvedOptions.tags):[];return mergeAdditiveTags(baseTags,resolvedOptions.addTags)}function resolveCreateOrder(unsetKeys,resolvedOptions){if(resolvedOptions.order!==void 0&&resolvedOptions.rank!==void 0&&resolvedOptions.order!==resolvedOptions.rank)throw new PmCliError("--order and --rank must match when both are provided",EXIT_CODE.USAGE);const orderRaw=resolvedOptions.order??resolvedOptions.rank,order=resolveUnsettableTransformed(unsetKeys,"order",orderRaw,raw=>parseOptionalNumber(raw,"order"));if(order!==void 0&&!Number.isInteger(order))throw new PmCliError("Order must be an integer",EXIT_CODE.USAGE);return order}function resolveCreateCloseReason(status,statusRegistry,settings,resolvedOptions,resolution,nowValue){if(resolvedOptions.completedAt!==void 0&&status!==statusRegistry.close_status)throw new PmCliError("--completed-at requires a terminal create status.",EXIT_CODE.USAGE);const completedAt=status!==statusRegistry.close_status?void 0:resolvedOptions.completedAt===void 0?nowValue:resolveIsoOrRelative(resolvedOptions.completedAt,new Date(nowValue),"completed-at");if(status!==statusRegistry.close_status)return{closeReason:void 0,completedAt,warnings:[]};const reasonInput=settings.governance.require_close_reason?{explicit:resolvedOptions.closeReason??resolvedOptions.message,resolution}:{explicit:resolvedOptions.closeReason};return{closeReason:requireTerminalReasonWithRecovery(reasonInput,settings.governance.require_close_reason,{operation:"create",status}).closeReason,completedAt,warnings:[]}}async function writeCreatedItem(params){const{pmRoot,type,id,settings,typeRegistry,author,extensionFieldNames,afterDocument,beforeDocument,historyMessage,changedFields,nowValue,similarityCandidate,allowDuplicate}=params,itemPath=getItemPath(pmRoot,type,id,settings.item_format,typeRegistry.type_to_folder),historyPath=getHistoryPath(pmRoot,id),relationshipRegistry=resolveWorkspaceRelationshipKindRegistry(),hierarchyMutationRequired=afterDocument.metadata.parent!==void 0||(afterDocument.metadata.dependencies??[]).some(dependency=>relationshipKindNeedsIntegrityLock(dependency.kind,relationshipRegistry)),hierarchyLockRelease=await acquireHierarchyMutationLock({pmRoot,author,ttlSeconds:settings.locks.ttl_seconds,waitMs:settings.locks.wait_ms,required:hierarchyMutationRequired});let hierarchyLockHeld=hierarchyMutationRequired,hookWarnings=[];try{const lockRelease=await acquireLock(pmRoot,id,settings.locks.ttl_seconds,author,!1,settings.governance.force_required_for_stale_lock,settings.locks.wait_ms);try{const graphBeforeCreate=afterDocument.metadata.parent!==void 0||afterDocument.metadata.dependencies!==void 0&&afterDocument.metadata.dependencies.length>0?await listAllItemMetadataLight(pmRoot,settings.item_format,typeRegistry.type_to_folder,void 0,settings.schema):void 0,existing=await locateItem(pmRoot,id,settings.id_prefix,settings.item_format,typeRegistry.type_to_folder);if(existing)throw new PmCliError(`Item "${id}" already exists`,EXIT_CODE.CONFLICT,{code:"item_already_exists",id:existing.id,path:existing.itemPath,required:"Read the existing item before deciding whether to update it or create a different ID.",nextSteps:[`Inspect the existing item with pm get ${existing.id}.`]});if(graphBeforeCreate){assertNonHierarchyCardinalityMutationAllowed(graphBeforeCreate,[...graphBeforeCreate,afterDocument.metadata],relationshipRegistry);const statusRegistry=resolveRuntimeStatusRegistry(settings.schema);assertHierarchyMutationAllowed(graphBeforeCreate,[...graphBeforeCreate,afterDocument.metadata],id,status=>isTerminalStatus(status,statusRegistry),relationshipRegistry)}const workflowPolicy=await enforceWorkflowMutation({pmRoot,settings,operation:"create",author,before:null,after:afterDocument});await runActiveBeforeMutationHooks({pm_root:pmRoot,operation:"create",before:null,after:afterDocument,changed_fields:changedFields,sdk:createMutationGuardSdk({pmRoot,settings,typeToFolder:typeRegistry.type_to_folder})});const releaseDerivedIndexLock=await acquireItemMetadataDerivedIndexLock(pmRoot,author,{required:settings.governance.duplicate_detection_mode==="strict"&&allowDuplicate!==!0});let derivedIndexWarnings=[];try{settings.governance.duplicate_detection_mode==="strict"&&allowDuplicate!==!0&&await evaluateSimilarityGovernance(similarityCandidate,{pmRoot,mode:"strict",threshold:settings.governance.duplicate_detection_threshold,limit:settings.governance.duplicate_detection_limit,allowDuplicate:!1}),await writeFileAtomic(itemPath,serializeItemDocument(afterDocument,{format:settings.item_format,schema:settings.schema,extensionFieldNames}));try{const entry=createHistoryEntry({nowIso:nowValue,author,op:"create",before:beforeDocument,after:afterDocument,message:historyMessage,context:workflowPolicy.decisions.length===0?void 0:{workflow_policies:workflowPolicy.decisions}});await appendHistoryEntry(historyPath,entry)}catch(error){throw await removeFileIfExists(itemPath),error}hierarchyLockHeld&&(await hierarchyLockRelease(),hierarchyLockHeld=!1),derivedIndexWarnings=await refreshItemMetadataDerivedIndex({pmRoot,preferredFormat:settings.item_format,typeToFolder:typeRegistry.type_to_folder,schema:settings.schema,itemPath,document:afterDocument})}finally{await releaseDerivedIndexLock()}hookWarnings=[...workflowPolicy.warnings,...graphBeforeCreate?collectNewOrderingCycleWarnings(graphBeforeCreate,[...graphBeforeCreate,afterDocument.metadata],id):[],...derivedIndexWarnings,...await runActiveOnWriteHooks({path:itemPath,scope:"project",op:"create",item_id:afterDocument.metadata.id,item_type:afterDocument.metadata.type,before:beforeDocument,after:afterDocument,changed_fields:changedFields}),...await runActiveOnWriteHooks({path:historyPath,scope:"project",op:"create:history",item_id:afterDocument.metadata.id,item_type:afterDocument.metadata.type,before:beforeDocument,after:afterDocument,changed_fields:changedFields})],recordAfterCommandAffectedItem({id:afterDocument.metadata.id,op:"create",item_type:afterDocument.metadata.type,status:afterDocument.metadata.status,current:projectAfterCommandItemSnapshot(afterDocument.metadata,changedFields),changed_fields:changedFields})}finally{await lockRelease()}}finally{hierarchyLockHeld&&await hierarchyLockRelease()}return hookWarnings}async function runCreate(input,global2){const options=prepareNativeMutationOptions("create",input),audience=mutationInputAudience(options);let resolvedOptions=normalizeLegacyNoneCreateOptions(await resolveCreateTransportInputs(options));const pmRoot=resolvePmRoot(process.cwd(),global2.path);await assertInitializedTracker(pmRoot);const settings=await readSettings(pmRoot),statusRegistry=resolveRuntimeStatusRegistry(settings.schema),runtimeFieldRegistry=resolveRuntimeFieldRegistry(settings.schema),typeRegistry=resolveItemTypeRegistry(settings,getActiveExtensionRegistrations()),typeSelection=await resolveCreateTypeSelection(resolvedOptions,global2,pmRoot,settings,typeRegistry);resolvedOptions=typeSelection.resolvedOptions;const{typeDefinition,type,createMode}=typeSelection,unsetTargets=parseCreateUnsetTargets(resolvedOptions.unset,runtimeFieldRegistry),{explicitUnsets,clearOptionKeys}=collectCreateClearTargets(resolvedOptions,unsetTargets);assertNoCreateScalarUnsetConflicts(resolvedOptions,unsetTargets),assertNoLegacyCreateScalarTokens(resolvedOptions);const author=resolveAuthor(parseOptionalString(resolvedOptions.author),settings.author_default),missingRequiredCreateFlags=requireCreateOptionByType(typeDefinition,resolvedOptions,createMode,clearOptionKeys,author),nowValue=nowIso(),dependencies=parseDependencies(resolvedOptions.dep,nowValue,settings.id_prefix,author),comments=parseLogSeed("--comment",resolvedOptions.comment,nowValue,author),notes=parseLogSeed("--note",resolvedOptions.note,nowValue,author),learnings=parseLogSeed("--learning",resolvedOptions.learning,nowValue,author),files=parseFiles(resolvedOptions.file),tests=parseTests(resolvedOptions.test);tests.values=await attachLinkedTestMutationProvenance(tests.values,author,nowValue);const docs=parseDocs(resolvedOptions.doc),reminders=parseReminders(resolvedOptions.reminder,nowValue),events=parseEvents(resolvedOptions.event,nowValue),typeOptions=parseTypeOptions(resolvedOptions.typeOption),validatedTypeOptions=validateTypeOptions(type,typeOptions.values,typeRegistry),extensionRegistrations=getActiveExtensionRegistrations(),extensionFieldNames=collectRegisteredItemFieldNames(extensionRegistrations),registeredItemFieldValues=parseRegisteredItemFieldAssignments(resolvedOptions.field,extensionRegistrations,resolveCoreFieldRecovery,createSchemaFieldRecoveryResolver(runtimeFieldRegistry,"create",resolvedOptions)),runtimeCreateFieldValues=collectRuntimeCreateFieldValues(resolvedOptions,runtimeFieldRegistry,type),missingRequiredRuntimeFlagSet=new Set(runtimeCreateFieldValues.missing_required_flags),missingRequiredRuntimeFields=runtimeFieldRegistry.definitions.filter(field=>missingRequiredRuntimeFlagSet.has(`--${field.cli_flag}`));assertNoCreateFieldUnsetConflicts(registeredItemFieldValues,runtimeCreateFieldValues,unsetTargets);const missingRequiredTypeOptionKeys=collectMissingRequiredTypeOptionKeys(validatedTypeOptions.errors,type),missingRequiredTypeOptionFlags=missingRequiredTypeOptionKeys.map(key=>`--type-option ${key}=<value>`),combinedMissingFlags=[...new Set([...missingRequiredCreateFlags,...missingRequiredTypeOptionFlags,...runtimeCreateFieldValues.missing_required_flags])].sort((left,right)=>left.localeCompare(right));assertNoMissingRequiredCreateOptions({combinedMissingFlags,typeDefinition,missingRequiredCreateFlags,missingRequiredTypeOptionKeys,openStatus:statusRegistry.open_status,type,createMode,missingRequiredRuntimeFields}),assertNoInvalidTypeOptions(validatedTypeOptions.errors,type,typeDefinition,statusRegistry);const id=await resolveCreateItemId({pmRoot,settings,typeRegistry,explicitId:resolvedOptions.id});let status=resolvedOptions.status!==void 0?parseStatusValue(resolvedOptions.status,statusRegistry):resolveCreateDefaultStatus(typeDefinition,statusRegistry);const priority=resolvedOptions.priority!==void 0?resolvePriority(resolvedOptions.priority):2,unsetKeys=unsetTargets.metadataKeys,tags=resolveCreateTags(unsetKeys,resolvedOptions),deadline=resolveUnsettableTransformed(unsetKeys,"deadline",resolvedOptions.deadline,raw=>resolveIsoOrRelative(raw,new Date(nowValue),"deadline")),estimatedMinutes=resolveUnsettableTransformed(unsetKeys,"estimated_minutes",resolvedOptions.estimatedMinutes,raw=>parseOptionalNonNegativeInteger(raw,"estimated-minutes")),acceptanceCriteria=resolveUnsettableOptionalString(unsetKeys,"acceptance_criteria",resolvedOptions.acceptanceCriteria),definitionOfReady=resolveUnsettableOptionalString(unsetKeys,"definition_of_ready",resolvedOptions.definitionOfReady),order=resolveCreateOrder(unsetKeys,resolvedOptions),goal=resolveUnsettableOptionalString(unsetKeys,"goal",resolvedOptions.goal),objective=resolveUnsettableOptionalString(unsetKeys,"objective",resolvedOptions.objective),value=resolveUnsettableOptionalString(unsetKeys,"value",resolvedOptions.value),impact=resolveUnsettableOptionalString(unsetKeys,"impact",resolvedOptions.impact),outcome=resolveUnsettableOptionalString(unsetKeys,"outcome",resolvedOptions.outcome),whyNow=resolveUnsettableOptionalString(unsetKeys,"why_now",resolvedOptions.whyNow),assignee=resolveUnsettableOptionalString(unsetKeys,"assignee",resolvedOptions.assignee),authorValue=unsetKeys.has("author")?void 0:parseOptionalString(resolvedOptions.author)??author,initialParent=resolveUnsettableOptionalString(unsetKeys,"parent",resolvedOptions.parent),inheritedParent=await inheritFocusedParent(initialParent,resolvedOptions,unsetKeys,pmRoot);let parent=inheritedParent.parent;const parentSource=inheritedParent.parentSource,reviewer=resolveUnsettableOptionalString(unsetKeys,"reviewer",resolvedOptions.reviewer),risk=resolveUnsettableTransformed(unsetKeys,"risk",resolvedOptions.risk,raw=>ensureEnumValue(normalizeRiskInput(raw),RISK_VALUES,"risk")),confidence=resolveUnsettableTransformed(unsetKeys,"confidence",resolvedOptions.confidence,raw=>parseConfidenceInput(raw)),parentReferencePolicy=resolvedOptions.allowMissingParent===!0&&settings.validation.parent_reference==="strict_error"?"warn":settings.validation.parent_reference,sprintReleasePolicy=settings.validation.sprint_release_format,validationWarnings=[...typeSelection.warnings,...collectCreateScheduleWarnings(type,id,deadline,reminders.values,events.values)],parentValidation=await resolveCreateParentWithWarnings({itemId:id,parent,pmRoot,settings,typeRegistry,policy:parentReferencePolicy,audience});parent=parentValidation.parent,validationWarnings.push(...parentValidation.warnings);const sprintResolved=resolveCreateSprintOrRelease(unsetKeys,"sprint",resolvedOptions.sprint,"sprint",sprintReleasePolicy,audience),sprint=sprintResolved.value;validationWarnings.push(...sprintResolved.warnings);const releaseResolved=resolveCreateSprintOrRelease(unsetKeys,"release",resolvedOptions.release,"release",sprintReleasePolicy,audience),release=releaseResolved.value;validationWarnings.push(...releaseResolved.warnings);const blockedBy=resolveUnsettableOptionalString(unsetKeys,"blocked_by",resolvedOptions.blockedBy),blockedByResolution=await resolveCreateBlockedByDependency({pmRoot,settings,typeRegistry,statusRegistry,blockedBy,dependencyValues:dependencies.values,status,statusExplicit:resolvedOptions.status!==void 0,nowValue,author}),dependencyValues=blockedByResolution.dependencyValues;assertDependencyEdgesAllowed(id,dependencyValues),validationWarnings.push(...await assertDependencyTargetsResolvable({pmRoot,dependencies:dependencyValues,idPrefix:settings.id_prefix,itemFormat:settings.item_format,typeToFolder:typeRegistry.type_to_folder,allowUnresolved:resolvedOptions.allowUnresolvedDeps,holders:[{id,createdAt:nowValue}],schema:settings.schema})),status=blockedByResolution.status;const blockedReason=resolveUnsettableOptionalString(unsetKeys,"blocked_reason",resolvedOptions.blockedReason),unblockNote=resolveUnsettableOptionalString(unsetKeys,"unblock_note",resolvedOptions.unblockNote),reporter=resolveUnsettableOptionalString(unsetKeys,"reporter",resolvedOptions.reporter),severity=resolveUnsettableTransformed(unsetKeys,"severity",resolvedOptions.severity,raw=>ensureEnumValue(normalizeSeverityInput(raw),ISSUE_SEVERITY_VALUES,"severity")),environment=resolveUnsettableOptionalString(unsetKeys,"environment",resolvedOptions.environment),reproSteps=resolveUnsettableOptionalString(unsetKeys,"repro_steps",resolvedOptions.reproSteps),resolution=resolveUnsettableOptionalString(unsetKeys,"resolution",resolvedOptions.resolution),expectedResult=resolveUnsettableOptionalString(unsetKeys,"expected_result",resolvedOptions.expectedResult),actualResult=resolveUnsettableOptionalString(unsetKeys,"actual_result",resolvedOptions.actualResult),affectedVersion=resolveUnsettableOptionalString(unsetKeys,"affected_version",resolvedOptions.affectedVersion),fixedVersion=resolveUnsettableOptionalString(unsetKeys,"fixed_version",resolvedOptions.fixedVersion),component=resolveUnsettableOptionalString(unsetKeys,"component",resolvedOptions.component),regression=resolveUnsettableTransformed(unsetKeys,"regression",resolvedOptions.regression,raw=>parseRegressionInput(raw)),customerImpact=resolveUnsettableOptionalString(unsetKeys,"customer_impact",resolvedOptions.customerImpact),title=requireStringOption(resolvedOptions.title,"--title",audience),description=resolvedOptions.description??"",body=resolvedOptions.body??"",similarityAdvisory=await evaluateSimilarityGovernance({title,description,body},{pmRoot,mode:settings.governance.duplicate_detection_mode,threshold:settings.governance.duplicate_detection_threshold,limit:settings.governance.duplicate_detection_limit,allowDuplicate:resolvedOptions.allowDuplicate});validationWarnings.push(...similarityAdvisoryWarnings(similarityAdvisory));const closeReasonResolution=resolveCreateCloseReason(status,statusRegistry,settings,resolvedOptions,resolution,nowValue),closeReason=closeReasonResolution.closeReason,closedAt=status===statusRegistry.close_status?nowValue:void 0,completedAt=closeReasonResolution.completedAt;validationWarnings.push(...closeReasonResolution.warnings);const itemMetadata=normalizeItemMetadata({id,title,description,type,type_options:validatedTypeOptions.normalized,status,closed_at:closedAt,completed_at:completedAt,close_reason:closeReason,priority,tags,created_at:nowValue,updated_at:nowValue,deadline,assignee,author:authorValue,estimated_minutes:estimatedMinutes,acceptance_criteria:acceptanceCriteria,definition_of_ready:definitionOfReady,order,goal,objective,value,impact,outcome,why_now:whyNow,parent,reviewer,risk,confidence,sprint,release,blocked_by:blockedBy,blocked_reason:blockedReason,unblock_note:unblockNote,reporter,severity,environment,repro_steps:reproSteps,resolution,expected_result:expectedResult,actual_result:actualResult,affected_version:affectedVersion,fixed_version:fixedVersion,component,regression,customer_impact:customerImpact,dependencies:dependencyValues,comments:comments.values,notes:notes.values,learnings:learnings.values,files:files.values,tests:tests.values,docs:docs.values,reminders:reminders.values,events:events.values,...registeredItemFieldValues,...runtimeCreateFieldValues.values});try{applyRegisteredItemFieldDefaultsAndValidation(itemMetadata,extensionRegistrations)}catch(error){throw new PmCliError(error instanceof Error?error.message:"Invalid extension item field values",EXIT_CODE.USAGE)}const afterDocument=canonicalDocument({metadata:itemMetadata,body},{schema:settings.schema,extensionFieldNames}),beforeDocument={metadata:{},body:""},explicitUnsetKeys=[...explicitUnsets].sort((left,right)=>left.localeCompare(right)),historyMessage=buildHistoryMessage(resolvedOptions.message,explicitUnsetKeys),changedFields=buildChangedFields(itemMetadata,body,explicitUnsetKeys,[...Object.keys(registeredItemFieldValues),...Object.keys(runtimeCreateFieldValues.values??{})]),hookWarnings=await writeCreatedItem({pmRoot,type,id,settings,typeRegistry,author,extensionFieldNames,afterDocument,beforeDocument,historyMessage,changedFields,nowValue,similarityCandidate:{title,description,body},allowDuplicate:resolvedOptions.allowDuplicate}),outputItem=structuredClone(itemMetadata);createMode==="strict"&&explicitUnsets.has("dependencies")&&(outputItem.dependencies=[]);const nextTransition=suggestNextLifecycleTransition(id,type,status,statusRegistry);return createItemLacksSchedule(type,deadline,reminders.values,events.values)&&printError(`[pm] warning: ${type} '${id}' has no deadline/reminder/event \u2014 it will not appear on the calendar. Add one via 'pm update ${id} --deadline <ISO>' or 'pm update ${id} --event "start=<ISO>,end=<ISO>"'.`),{item:outputItem,changed_fields:changedFields,warnings:[...literalSentinelAdvisories("create",resolvedOptions,audience==="sdk",outputItem),...validationWarnings,...hookWarnings],...Object.fromEntries([["parent_source",parentSource],["next_transition",nextTransition],["similarity_advisory",similarityAdvisory]].filter(entry=>entry[1]!==void 0))}}const _testOnlyCreateCommand={buildHistoryMessage,buildInvalidLogSeedKeysMessage,buildTypeSpecificCreateExample,collectMissingRequiredTypeOptionKeys,createExampleTokensForFlag,filterNonMissingTypeOptionErrors,hasTemplatesShowHandler,hasCreateOptionValue,loadCreateTemplateOptionsFromRuntime,looksLikeStructuredEntry,mergeCreateOptionsWithTemplate,normalizeCreatePolicyOptionKey,normalizeDependencyKindInput,parseDependencies,normalizeExtensionCommandPath,parseCreateUnsetTargets,requireStringOption,readTemplateOptionsFromRuntimeResult,resolveRuntimeCreateUnsetDefinition:(token,registry)=>resolveRuntimeUnsetFieldDefinition(token,"create",registry),typeOptionExampleValue};export{_testOnlyCreateCommand,parseDocs,parseFiles,parseLogSeed,parseTests,requireStringOption,runCreate};
|
|
2
2
|
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { bindItemRevisionScope,createItemRevisionScope,itemRevisionScopeReceipt,runWithItemRevisionScope,type ItemRevisionScope } from "../../core/store/item-mutation-precondition.js";
|
|
2
|
+
import { PmCliError,type PmCliErrorDetails } from "../../core/shared/errors.js";
|
|
3
|
+
export type { ItemRevisionScope } from "../../core/store/item-mutation-precondition.js";
|
|
4
|
+
/** Refusal code for a locked write that found a revision other than the declared one. */
|
|
5
|
+
export declare const ITEM_REVISION_CONFLICT_CODE = "item_revision_conflict";
|
|
6
|
+
/** Most recent history entries a conflict refusal describes. */
|
|
7
|
+
export declare const ITEM_REVISION_CONFLICT_CHANGE_LIMIT = 10;
|
|
8
|
+
/** One item revision a caller decided on. */
|
|
9
|
+
export interface ExpectedItemRevision {
|
|
10
|
+
/** Item id; unprefixed ids are normalized with the workspace id prefix. */
|
|
11
|
+
id:string;
|
|
12
|
+
/** The `item_hash` returned by `pm get` or {@link readItemRevision}. */
|
|
13
|
+
itemHash:string;
|
|
14
|
+
}
|
|
15
|
+
/** Current revision of one item. */
|
|
16
|
+
export interface ItemRevision {
|
|
17
|
+
/** Canonical item id. */
|
|
18
|
+
id:string;
|
|
19
|
+
/** SHA-256 of the canonical item document, equal to its latest history `after_hash`. */
|
|
20
|
+
item_hash:string;
|
|
21
|
+
}
|
|
22
|
+
/** Tracker selection for revision reads and guarded operations. */
|
|
23
|
+
export interface ItemRevisionContext {
|
|
24
|
+
/** Tracker root (the SDK equivalent of `--pm-path`). */
|
|
25
|
+
pmRoot?:string;
|
|
26
|
+
/** Working directory used when `pmRoot` is omitted. */
|
|
27
|
+
cwd?:string;
|
|
28
|
+
}
|
|
29
|
+
/** Result of an operation run under expected revisions. */
|
|
30
|
+
export interface ExpectedItemRevisionsOutcome<T> {
|
|
31
|
+
/** Value returned by the guarded operation. */
|
|
32
|
+
result:T;
|
|
33
|
+
/** Canonical ids whose expectation a locked write evaluated. */
|
|
34
|
+
checked:string[];
|
|
35
|
+
/** Canonical ids the operation never wrote, so their expectation was never evaluated. */
|
|
36
|
+
unchecked:string[];
|
|
37
|
+
}
|
|
38
|
+
/** One parsed `--expect-hash` / `expect_hash` token before id resolution. */
|
|
39
|
+
export interface ExpectHashSpec {
|
|
40
|
+
/** Explicit target id, or undefined when the token binds to the command's item. */
|
|
41
|
+
id?:string;
|
|
42
|
+
/** Normalized lowercase revision. */
|
|
43
|
+
itemHash:string;
|
|
44
|
+
}
|
|
45
|
+
/** One history entry summarized for a revision conflict. */
|
|
46
|
+
export interface ItemRevisionChange {
|
|
47
|
+
/** Entry timestamp. */
|
|
48
|
+
ts:string;
|
|
49
|
+
/** History operation. */
|
|
50
|
+
op:string;
|
|
51
|
+
/** Recorded author. */
|
|
52
|
+
author:string;
|
|
53
|
+
/** Top-level metadata fields (or `body`) the entry changed. */
|
|
54
|
+
fields:string[];
|
|
55
|
+
}
|
|
56
|
+
/** Normalize one declared revision, refusing anything that cannot be an item_hash. */
|
|
57
|
+
export declare function normalizeExpectedItemHash(value:unknown):string;
|
|
58
|
+
/**
|
|
59
|
+
* Parse expected-revision tokens. A bare hash binds to the command's item; the
|
|
60
|
+
* `<id>=<hash>` form names its target explicitly, which bulk commands require.
|
|
61
|
+
*/
|
|
62
|
+
export declare function parseExpectHashSpecs(values:string | readonly string[] | undefined):ExpectHashSpec[];
|
|
63
|
+
/** Read the current revision of one item (the tombstone revision for a deleted item) without writing anything. */
|
|
64
|
+
export declare function readItemRevision(id:string,context?:ItemRevisionContext):Promise<ItemRevision>;
|
|
65
|
+
/**
|
|
66
|
+
* Resolve parsed tokens to canonical ids. A bare token binds to `defaultId`;
|
|
67
|
+
* without one the caller must name the target explicitly.
|
|
68
|
+
*/
|
|
69
|
+
export declare function resolveExpectedItemRevisions(pmRoot:string,specs:readonly ExpectHashSpec[],defaultId?:string):Promise<ExpectedItemRevision[]>;
|
|
70
|
+
/**
|
|
71
|
+
* Describe what changed after the declared revision, from the item's immutable
|
|
72
|
+
* history. Returns undefined when the history cannot be read.
|
|
73
|
+
*/
|
|
74
|
+
export declare function describeItemRevisionChanges(pmRoot:string,id:string,expectedHash:string):Promise<{
|
|
75
|
+
expected_revision_recorded:boolean;
|
|
76
|
+
changes_since:ItemRevisionChange[];
|
|
77
|
+
changes_since_omitted:number;
|
|
78
|
+
} | undefined>;
|
|
79
|
+
/** Structured revision fields a bulk row keeps when its item refused an expected revision. */
|
|
80
|
+
export interface ItemRevisionConflictRowFields {
|
|
81
|
+
/** Always `item_revision_conflict`. */
|
|
82
|
+
error_code?:typeof ITEM_REVISION_CONFLICT_CODE;
|
|
83
|
+
/** Revision the row's locked write expected. */
|
|
84
|
+
expected_revision?:string;
|
|
85
|
+
/** Revision the row's locked write found. */
|
|
86
|
+
current_revision?:string;
|
|
87
|
+
/** Bounded history evidence of what changed since the expected revision, as single-item refusals report it. */
|
|
88
|
+
details?:PmCliErrorDetails;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Keep the typed refusal on a bulk row: partial-success commands report a
|
|
92
|
+
* stale row's code, both revisions and the same bounded change evidence a
|
|
93
|
+
* single-item refusal carries, not only its message.
|
|
94
|
+
*/
|
|
95
|
+
export declare function itemRevisionConflictRowFields(error:unknown,pmRoot:string):Promise<ItemRevisionConflictRowFields>;
|
|
96
|
+
/**
|
|
97
|
+
* Whether an error is the locked-write expected-revision refusal. Structural, not
|
|
98
|
+
* `instanceof`: a refusal raised through another published SDK entrypoint's bundle
|
|
99
|
+
* is a different PmCliError class with the same shape.
|
|
100
|
+
*/
|
|
101
|
+
export declare function isItemRevisionConflict(error:unknown):error is PmCliError;
|
|
102
|
+
/**
|
|
103
|
+
* Raise the first expected-revision refusal among errors collected by a
|
|
104
|
+
* best-effort batch (validate auto-fix), once every member was attempted.
|
|
105
|
+
*/
|
|
106
|
+
export declare function throwFirstItemRevisionConflict(errors:readonly unknown[]):void;
|
|
107
|
+
/** Refusal for a guard on an invocation an extension parser or preflight override rewrote. */
|
|
108
|
+
export declare function expectHashInvocationRewrittenError():PmCliError;
|
|
109
|
+
/**
|
|
110
|
+
* Attach bounded change evidence to a revision conflict. The evidence is read
|
|
111
|
+
* after the lock is released, so it describes the record as it was then; the
|
|
112
|
+
* refusal's `current_revision` remains the revision the locked write found.
|
|
113
|
+
*/
|
|
114
|
+
export declare function enrichItemRevisionConflict(error:unknown,pmRoot:string):Promise<unknown>;
|
|
115
|
+
/**
|
|
116
|
+
* Run an operation under an already-bound scope and return its receipt,
|
|
117
|
+
* enriching a revision refusal with bounded change evidence.
|
|
118
|
+
*/
|
|
119
|
+
export declare function runWithBoundItemRevisionScope<T>(scope:ItemRevisionScope,operation:() => Promise<T>):Promise<ExpectedItemRevisionsOutcome<T>>;
|
|
120
|
+
/**
|
|
121
|
+
* Run `operation` so every locked write to an expected item first proves the
|
|
122
|
+
* item is still at the declared revision. A mismatch refuses that write with
|
|
123
|
+
* `item_revision_conflict` (exit 4) and leaves the item unchanged. After the
|
|
124
|
+
* operation's own committed write, the expectation advances to that revision,
|
|
125
|
+
* so a multi-write operation does not refuse itself. The receipt lists items
|
|
126
|
+
* the operation never wrote, whose expectation therefore proved nothing.
|
|
127
|
+
*/
|
|
128
|
+
export declare function withExpectedItemRevisions<T>(expectations:readonly ExpectedItemRevision[],operation:() => Promise<T>,context?:ItemRevisionContext):Promise<ExpectedItemRevisionsOutcome<T>>;
|
|
129
|
+
/**
|
|
130
|
+
* Resolve expectations to canonical ids and bind them to a fresh scope, without
|
|
131
|
+
* running anything. Hosts that must resolve targets inside one extension
|
|
132
|
+
* context but run the guarded operation outside it bind first, then call
|
|
133
|
+
* {@link runWithBoundItemRevisionScope}.
|
|
134
|
+
*/
|
|
135
|
+
export declare function bindExpectedItemRevisions(expectations:readonly ExpectedItemRevision[],context?:ItemRevisionContext):Promise<ItemRevisionScope>;
|
|
136
|
+
export { bindItemRevisionScope,createItemRevisionScope,itemRevisionScopeReceipt,runWithItemRevisionScope };
|
|
137
|
+
/** Warning recorded when an expectation's item was never written by the action. */
|
|
138
|
+
export declare function itemRevisionUncheckedWarning(id:string):string;
|
|
139
|
+
/**
|
|
140
|
+
* Refuse an expected revision on a native action that never writes items.
|
|
141
|
+
* Extension and package actions stay admitted because only their handlers
|
|
142
|
+
* know whether they write; the receipt reports any expectation they never reach.
|
|
143
|
+
*/
|
|
144
|
+
export declare function assertExpectHashAdmissible(path:string,options?:Record<string,unknown>):void;
|
|
145
|
+
/** Refusal for a revision guard on a command or action that writes no items. */
|
|
146
|
+
export declare function expectHashRequiresMutationError(action:string):PmCliError;
|
|
147
|
+
/**
|
|
148
|
+
* Generic-dispatch entry for the `expectHash` action parameter used by MCP and
|
|
149
|
+
* `PmClient.run`. Tokens follow the CLI grammar: a bare hash binds to the
|
|
150
|
+
* action's `id`, and `<id>=<hash>` names the target explicitly.
|
|
151
|
+
*/
|
|
152
|
+
export declare function dispatchWithExpectedItemRevisions<T>(params:{
|
|
153
|
+
action:string;
|
|
154
|
+
expectHash:unknown;
|
|
155
|
+
defaultId?:string;
|
|
156
|
+
pmRoot:string;
|
|
157
|
+
run:() => Promise<T>;
|
|
158
|
+
/** Nested action options, consulted for modes the guard cannot cover (background test workers). */
|
|
159
|
+
options?:Record<string,unknown>;
|
|
160
|
+
/** Top-level background flag, consulted like `options.background`. */
|
|
161
|
+
background?:unknown;
|
|
162
|
+
}):Promise<T>;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="aca1dfc0-e0c9-5554-96e3-bb9b2cdeb7f9")}catch{}})();import{getActiveExtensionRegistrations}from"../../core/extensions/index.js";import{hashDocument}from"../../core/history/history.js";import{readHistoryEntries}from"../../core/history/read.js";import{resolveItemTypeRegistry}from"../../core/item/type-registry.js";import{bindItemRevisionScope,createItemRevisionScope,itemRevisionScopeReceipt,runWithItemRevisionScope}from"../../core/store/item-mutation-precondition.js";import{buildItemNotFoundError,locateItem,readLocatedItem}from"../../core/store/item-store.js";import{getHistoryPath,resolvePmRoot}from"../../core/store/paths.js";import{readSettings}from"../../core/store/settings.js";import{EXIT_CODE}from"../../core/shared/constants.js";import{PmCliError}from"../../core/shared/errors.js";import{PM_EXPECT_HASH_ACTIONS,PM_TOOL_ACTIONS}from"../cli-contracts/enum-contracts.js";import{resolveHistorySubject}from"../history/subject.js";import{resolvePhysicalItemId}from"../query/declared-blockers.js";import{EMPTY_CANONICAL_DOCUMENT}from"../../core/shared/constants.js";import{isMutationAction}from"../mutation-guard.js";import{isPmCliExpectedError}from"../errors.js";const ITEM_REVISION_CONFLICT_CODE="item_revision_conflict",ITEM_REVISION_CONFLICT_CHANGE_LIMIT=10,ITEM_HASH_PATTERN=/^[0-9a-f]{64}$/u;function invalidExpectHash(value,reason){return new PmCliError(`Invalid expected revision ${JSON.stringify(value)}: ${reason}.`,EXIT_CODE.USAGE,{code:"expect_hash_invalid",value,required:"Pass the 64-character item_hash from pm get <id> --json, optionally as <id>=<item_hash>.",examples:["--expect-hash <item_hash>","--expect-hash pm-a1b2=<item_hash>"]})}function normalizeExpectedItemHash(value){const normalized=typeof value=="string"?value.trim().toLowerCase():"";if(!ITEM_HASH_PATTERN.test(normalized))throw invalidExpectHash(String(value),"the revision is not a 64-character hexadecimal item_hash");return normalized}function parseExpectHashSpecs(values){return(values===void 0?[]:typeof values=="string"?[values]:values).flatMap(raw=>{if(typeof raw!="string")throw invalidExpectHash(String(raw),"expected a string");const parts=raw.split(",").map(token=>token.trim()).filter(token=>token.length>0);if(parts.length===0)throw invalidExpectHash(raw,"the value is empty");return parts.map(token=>{const separator=token.lastIndexOf("="),id=separator===-1?void 0:token.slice(0,separator).trim();if(id!==void 0&&id.length===0)throw invalidExpectHash(token,"the item id before = is empty");const itemHash=normalizeExpectedItemHash(separator===-1?token:token.slice(separator+1));return id===void 0?{itemHash}:{id,itemHash}})})}async function locateRevisionTarget(pmRoot,id){const settings=await readSettings(pmRoot),typeToFolder=resolveItemTypeRegistry(settings,getActiveExtensionRegistrations()).type_to_folder,located=await locateItem(pmRoot,id,settings.id_prefix,settings.item_format,typeToFolder);if(located){const{document}=await readLocatedItem(located,{schema:settings.schema});if(document.metadata.id!==await resolvePhysicalItemId(located.itemPath,located.id))throw new PmCliError(`Item file ${located.id} embeds the id ${document.metadata.id}; no revision can be bound to an item whose identity is in conflict.`,EXIT_CODE.CONFLICT,{code:"item_identity_conflict",item_id:located.id,required:`Repair ${located.id}'s identity first (pm validate reports it; pm restore ${located.id} <version> recovers a recorded state), then read its item_hash again.`});return{id:document.metadata.id,document}}try{return{id:(await resolveHistorySubject(pmRoot,id,settings,typeToFolder)).id,document:EMPTY_CANONICAL_DOCUMENT}}catch{throw await buildItemNotFoundError(pmRoot,id,settings.id_prefix,typeToFolder)}}function resolveRevisionRoot(context){return resolvePmRoot(context.cwd??process.cwd(),context.pmRoot)}async function readItemRevision(id,context={}){const target=await locateRevisionTarget(resolveRevisionRoot(context),id);return{id:target.id,item_hash:hashDocument(target.document)}}async function resolveExpectedItemRevisions(pmRoot,specs,defaultId){const resolved=[];for(const spec of specs){const target=spec.id??defaultId;if(target===void 0||target.trim().length===0)throw new PmCliError("A bare expected revision needs an item to bind to.",EXIT_CODE.USAGE,{code:"expect_hash_target_required",required:"This command has no single item argument; name each target as --expect-hash <id>=<item_hash>.",examples:["--expect-hash pm-a1b2=<item_hash>"]});resolved.push({id:(await locateRevisionTarget(pmRoot,target)).id,itemHash:spec.itemHash})}return resolved}function changedTopLevelFields(entry){return[...new Set(entry.patch.map(change=>{const segments=change.path.split("/");return String(segments[1]==="metadata"?segments[2]:segments[1])}))].sort()}async function describeItemRevisionChanges(pmRoot,id,expectedHash){let history;try{history=await readHistoryEntries(getHistoryPath(pmRoot,id),id)}catch{return}let start=-1;for(let index=history.length-1;index>=0;index-=1){const entry=history[index];if(entry.after_hash===expectedHash){start=index+1;break}if(entry.before_hash===expectedHash){start=index;break}}if(start===-1)return{expected_revision_recorded:!1,changes_since:[],changes_since_omitted:0};const later=history.slice(start),shown=later.slice(-ITEM_REVISION_CONFLICT_CHANGE_LIMIT);return{expected_revision_recorded:!0,changes_since:shown.map(entry=>({ts:entry.ts,op:entry.op,author:entry.author,fields:changedTopLevelFields(entry)})),changes_since_omitted:later.length-shown.length}}async function itemRevisionConflictRowFields(error,pmRoot){if(!isItemRevisionConflict(error))return{};const enriched=await enrichItemRevisionConflict(error,pmRoot);return{error_code:ITEM_REVISION_CONFLICT_CODE,expected_revision:String(enriched.context.expected_revision),current_revision:String(enriched.context.current_revision),details:enriched.context.details}}function isItemRevisionConflict(error){return isPmCliExpectedError(error)&&error.context.code===ITEM_REVISION_CONFLICT_CODE}function throwFirstItemRevisionConflict(errors){const conflict=errors.find(error=>isItemRevisionConflict(error));if(conflict!==void 0)throw conflict}function expectHashInvocationRewrittenError(){return new PmCliError("--expect-hash cannot guard an invocation an extension override rewrote: which item it writes is not provable.",EXIT_CODE.USAGE,{code:"expect_hash_invocation_rewritten",required:"Run the command without the rewriting extension (--no-extensions), or drop --expect-hash.",why:"An extension parser or preflight override changed this invocation's tracker or arguments, and final dispatch, the extension SDK client and the guard do not share one rewritten view."})}async function enrichItemRevisionConflict(error,pmRoot){if(!isItemRevisionConflict(error)||error.context.details!==void 0)return error;const id=error.context.item_id,expected=error.context.expected_revision;if(typeof id!="string"||typeof expected!="string")return error;let changes;try{changes=await describeItemRevisionChanges(pmRoot,id,expected)}catch{return error}if(changes===void 0)return error;const details={expected_revision_recorded:changes.expected_revision_recorded,changes_since:changes.changes_since.map(change=>({ts:change.ts,op:change.op,author:change.author,fields:[...change.fields]})),changes_since_omitted:changes.changes_since_omitted},enriched=new PmCliError(error.message,error.exitCode,{...error.context,details});return enriched.stack=error.stack,enriched}async function runWithBoundItemRevisionScope(scope,operation){try{return{result:await runWithItemRevisionScope(scope,operation),...itemRevisionScopeReceipt(scope)}}catch(error){throw scope.pmRoot===void 0?error:await enrichItemRevisionConflict(error,scope.pmRoot)}}async function withExpectedItemRevisions(expectations,operation,context={}){return runWithBoundItemRevisionScope(await bindExpectedItemRevisions(expectations,context),operation)}async function bindExpectedItemRevisions(expectations,context={}){const pmRoot=resolveRevisionRoot(context),specs=expectations.map(({id,itemHash})=>({id,itemHash:normalizeExpectedItemHash(itemHash)})),scope=createItemRevisionScope();return bindItemRevisionScope(scope,pmRoot,await resolveExpectedItemRevisions(pmRoot,specs)),scope}function itemRevisionUncheckedWarning(id){return`expect_hash_unchecked:${id}:no_locked_write_reached_this_item`}const NATIVE_ACTIONS=new Set(PM_TOOL_ACTIONS);function assertExpectHashAdmissible(path,options={}){const hyphenated=path.trim().replace(/\s+/gu,"-"),action=NATIVE_ACTIONS.has(hyphenated)?hyphenated:path;if(NATIVE_ACTIONS.has(action)&&(!isMutationAction(action)||action==="deps")&&!PM_EXPECT_HASH_ACTIONS.has(action))throw expectHashRequiresMutationError(action);if((action==="test"||action==="test-all")&&options.background===!0)throw new PmCliError(`--expect-hash cannot guard ${action} --background: the worker runs in another process.`,EXIT_CODE.USAGE,{code:"expect_hash_background_unsupported",required:`Run ${action} in the foreground to guard its result recording, or drop --expect-hash for a background run.`})}function expectHashRequiresMutationError(action){return new PmCliError(`--expect-hash guards item writes, and ${action} is not a mutation.`,EXIT_CODE.USAGE,{code:"expect_hash_requires_mutation",required:"Use --expect-hash (MCP/SDK expectHash) only on a command or action that writes items."})}function withUncheckedRevisionWarnings(result,unchecked){if(unchecked.length===0||typeof result!="object"||result===null||Array.isArray(result))return result;const record=result,warnings=Array.isArray(record.warnings)?record.warnings:[];return{...record,warnings:[...warnings,...unchecked.map(itemRevisionUncheckedWarning)]}}async function dispatchWithExpectedItemRevisions(params){const raw=params.expectHash;if(raw!==void 0&&typeof raw!="string"&&!(Array.isArray(raw)&&raw.every(entry=>typeof entry=="string")))throw invalidExpectHash(JSON.stringify(raw)??String(raw),"expected a string or an array of strings");const specs=parseExpectHashSpecs(raw);if(specs.length===0)return params.run();assertExpectHashAdmissible(params.action,{background:params.background===!0||params.options?.background===!0});const scope=createItemRevisionScope();bindItemRevisionScope(scope,params.pmRoot,await resolveExpectedItemRevisions(params.pmRoot,specs,params.defaultId));const outcome=await runWithBoundItemRevisionScope(scope,params.run);return withUncheckedRevisionWarnings(outcome.result,outcome.unchecked)}export{ITEM_REVISION_CONFLICT_CHANGE_LIMIT,ITEM_REVISION_CONFLICT_CODE,assertExpectHashAdmissible,bindExpectedItemRevisions,bindItemRevisionScope,createItemRevisionScope,describeItemRevisionChanges,dispatchWithExpectedItemRevisions,enrichItemRevisionConflict,expectHashInvocationRewrittenError,expectHashRequiresMutationError,isItemRevisionConflict,itemRevisionConflictRowFields,itemRevisionScopeReceipt,itemRevisionUncheckedWarning,normalizeExpectedItemHash,parseExpectHashSpecs,readItemRevision,resolveExpectedItemRevisions,runWithBoundItemRevisionScope,runWithItemRevisionScope,throwFirstItemRevisionConflict,withExpectedItemRevisions};
|
|
2
|
+
//# sourceMappingURL=item-revision.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="f3145f17-e911-571b-9da3-f014e6fdde1c")}catch{}})();import{assertInitializedTracker}from"../environment/tracker-preflight.js";import{normalizeItemFormatVersion,requiredItemFormatVersion}from"../../core/item/item-format-version.js";import{assertProjectRuntimeFormatGuard}from"../environment/project-runtime-compatibility.js";import{enforceWorkflowMutation}from"../../core/policy/workflow-policy-store.js";import jsonPatch from"fast-json-patch";import fs from"node:fs/promises";import{readLocatedItemSnapshot}from"../../core/store/item-store.js";import{assertItemMutationPreconditions}from"../../core/store/item-mutation-precondition.js";import{readHistorySnapshot}from"../../core/history/read.js";import{verifyHistoryRewriteNoDrift}from"../../core/history/history-rewrite.js";import{resolveHistorySubject}from"../history/subject.js";import{historyVersionOffset}from"../../core/history/version-address.js";import{writeFileAtomic,appendHistoryEntry,createHistoryEntry,replayToCanonicalItemDocument,replayToItemDocument,toReplayDocument,enforceHistoryStreamPolicyForItem,canonicalDocument,serializeItemDocument,resolveItemTypeRegistry,acquireLockLease,EXIT_CODE,PmCliError,nowIso,getActiveExtensionRegistrations,projectAfterCommandItemSnapshot,recordAfterCommandAffectedItem,runActiveOnWriteHooks,runActiveBeforeMutationHooks,createMutationGuardSdk,getItemPath,resolvePmRoot,resolveWorkspaceRoot,readSettings,resolveAuthor}from"../runtime-primitives.js";import{applyHistoryPatch,ensureMaterializedHistoryTarget as ensureMaterializedRestoreTarget,extractPatchFailureContext,replayHistoryToTarget as replayToTarget,resolveHistoryTarget}from"../history-read.js";import{acquireItemMetadataDerivedIndexLock,refreshItemMetadataDerivedIndex}from"../item-metadata-index.js";async function readRestoreItem(located,settings,history){const snapshot=await readLocatedItemSnapshot(located,{schema:settings.schema});return snapshot.error===null?{raw:snapshot.raw,document:snapshot.document}:{raw:snapshot.raw,document:replayCurrentDocument(history),recovered:!0}}function ensureReplayTarget(target,history){return resolveHistoryTarget(target,history,{errorSubject:"restore",allowFutureTimestamp:!0})}function replayCurrentDocument(history){const currentReplay=replayToTarget(history,history.length-1);return Object.keys(currentReplay.metadata).length===0?{metadata:{},body:currentReplay.body}:canonicalDocument(replayToItemDocument(currentReplay))}async function resolveRestoreSubject(pmRoot,id,settings,typeToFolder){const subject=await resolveHistorySubject(pmRoot,id,settings,typeToFolder),historyPolicy=subject.located?await enforceHistoryStreamPolicyForItem({pmRoot,settings,itemId:subject.id,commandLabel:"restore"}):{warnings:[]};return{...subject,historyPolicyWarnings:historyPolicy.warnings}}function changedFields(beforeDocument,afterDocument){const beforeReplay=toReplayDocument(beforeDocument),afterReplay=toReplayDocument(afterDocument),patch=jsonPatch.compare(beforeReplay,afterReplay),fields=new Set;for(const op of patch){if(op.path==="/body"||op.path.startsWith("/body/")){fields.add("body");continue}const segment=op.path.replace(/^\/(?:metadata|front_matter)\/?/,"").split("/")[0];fields.add(segment.replaceAll("~1","/").replaceAll("~0","~"))}return Array.from(fields).sort((a,b)=>a.localeCompare(b))}async function loadRestoreStateUnderLock(params){const verified=await verifyHistoryRewriteNoDrift({pmRoot:params.pmRoot,subject:params.subject,settings:params.settings,typeRegistry:params.typeRegistry,historyRawBeforeLock:params.historyRawBeforeLock,currentItemRawBeforeLock:params.currentItemRawBeforeLock,operation:"restore",readItem:located=>readRestoreItem(located,params.settings,params.history)});return{loadedItemUnderLock:verified.loadedItemUnderLock,existingItemPath:verified.locatedUnderLock?.itemPath??null}}function resolveRestoreCurrentState(loadedItemUnderLock,history){return loadedItemUnderLock?{document:loadedItemUnderLock.document,originalRaw:loadedItemUnderLock.raw}:{document:replayCurrentDocument(history),originalRaw:null}}function collectRestoreOwnershipWarnings(params){const assigned=params.document.metadata.assignee?.trim();if(!(assigned&&assigned!==params.author&&!params.force))return[];if(params.enforcement==="strict")throw new PmCliError(`Item ${params.resolvedId} is assigned to ${assigned}. Use --force to override.`,EXIT_CODE.CONFLICT);return params.enforcement==="warn"?[`ownership_warning:assignee_conflict:${params.resolvedId}:${assigned}`]:[]}async function restorePreviousItemAfterHistoryFailure(params){if(params.existingItemPath&¶ms.resolvedOriginalRaw!==null&¶ms.restoredItemPath!==params.existingItemPath){await writeFileAtomic(params.existingItemPath,params.resolvedOriginalRaw),await fs.rm(params.restoredItemPath,{force:!0});return}if(params.existingItemPath&¶ms.resolvedOriginalRaw!==null){await writeFileAtomic(params.existingItemPath,params.resolvedOriginalRaw);return}await fs.rm(params.restoredItemPath,{force:!0})}async function runRestoreWriteHooks(params){return[...await runActiveOnWriteHooks({path:params.restoredItemPath,scope:"project",op:"restore",item_id:params.after.metadata.id,item_type:params.after.metadata.type,before:params.before,after:params.after,changed_fields:["restored"]}),...await runActiveOnWriteHooks({path:params.historyPath,scope:"project",op:"restore:history",item_id:params.after.metadata.id,item_type:params.after.metadata.type,before:params.before,after:params.after,changed_fields:["restored"]})]}async function runRestore(id,target,options,global2){const pmRoot=resolvePmRoot(process.cwd(),global2.path);await assertInitializedTracker(pmRoot);const settings=await readSettings(pmRoot),typeRegistry=resolveItemTypeRegistry(settings,getActiveExtensionRegistrations()),subject=await resolveRestoreSubject(pmRoot,id,settings,typeRegistry.type_to_folder),resolvedId=subject.id,{raw:historyRawBeforeLock,entries:history}=await readHistorySnapshot(subject.historyPath,resolvedId);if(history.length===0)throw new PmCliError(`No history exists for ${resolvedId}; restore is unavailable.`,EXIT_CODE.NOT_FOUND);const resolvedTarget=ensureReplayTarget(target,history),replayDocument=ensureMaterializedRestoreTarget(replayToTarget(history,resolvedTarget.historyIndex),resolvedTarget),restoredDocument=replayToCanonicalItemDocument(replayDocument,{schema:settings.schema});if(restoredDocument.metadata.id!==resolvedId)throw new PmCliError(`Restore target resolved to item ${restoredDocument.metadata.id}, expected ${resolvedId}.`,EXIT_CODE.GENERIC_FAILURE);const currentItemRawBeforeLock=(subject.located?await readRestoreItem(subject.located,settings,history):null)?.raw??null,author=resolveAuthor(options.author,settings.author_default),lease=await acquireLockLease(pmRoot,resolvedId,settings.locks.ttl_seconds,author,!!options.force,settings.governance.force_required_for_stale_lock,settings.locks.wait_ms,{waitPolicy:"progress"}),releaseLock=lease.release;try{const{loadedItemUnderLock,existingItemPath}=await loadRestoreStateUnderLock({pmRoot,subject,settings,typeRegistry,historyRawBeforeLock,currentItemRawBeforeLock,history}),itemFormat="toon",currentState=resolveRestoreCurrentState(loadedItemUnderLock,history);assertItemMutationPreconditions(pmRoot,currentState.document),restoredDocument.metadata.pm_format_version=normalizeItemFormatVersion(Math.max(requiredItemFormatVersion(restoredDocument.metadata),requiredItemFormatVersion(currentState.document.metadata))),assertProjectRuntimeFormatGuard(resolveWorkspaceRoot(pmRoot),requiredItemFormatVersion(restoredDocument.metadata));const ownershipWarnings=collectRestoreOwnershipWarnings({document:currentState.document,author,force:options.force,enforcement:settings.governance.ownership_enforcement,resolvedId}),restoreChangedFields=changedFields(currentState.document,restoredDocument),workflowPolicy=await enforceWorkflowMutation({pmRoot,settings,operation:"restore",author,before:currentState.document,after:restoredDocument});await runActiveBeforeMutationHooks({pm_root:pmRoot,operation:"restore",before:currentState.document,after:restoredDocument,changed_fields:restoreChangedFields,sdk:createMutationGuardSdk({pmRoot,settings,typeToFolder:typeRegistry.type_to_folder})});const serializedRestore=serializeItemDocument(restoredDocument,{format:itemFormat,schema:settings.schema}),restoredItemPath=getItemPath(pmRoot,restoredDocument.metadata.type,resolvedId,itemFormat,typeRegistry.type_to_folder),derivedIndexWarnings=await lease.fence(async()=>{const releaseDerivedIndexLock=await acquireItemMetadataDerivedIndexLock(pmRoot,author);let derivedIndexWarnings2;try{await writeFileAtomic(restoredItemPath,serializedRestore),existingItemPath&&restoredItemPath!==existingItemPath&&await fs.rm(existingItemPath);const historyEntry=createHistoryEntry({nowIso:nowIso(),author,op:"restore",before:currentState.document,after:restoredDocument,message:options.message,context:workflowPolicy.decisions.length===0?void 0:{workflow_policies:workflowPolicy.decisions}});try{await appendHistoryEntry(subject.historyPath,historyEntry)}catch(error){throw await restorePreviousItemAfterHistoryFailure({existingItemPath,resolvedOriginalRaw:currentState.originalRaw,restoredItemPath}),error}derivedIndexWarnings2=await refreshItemMetadataDerivedIndex({pmRoot,preferredFormat:settings.item_format,typeToFolder:typeRegistry.type_to_folder,schema:settings.schema,itemPath:restoredItemPath,previousItemPath:existingItemPath??void 0,document:restoredDocument})}finally{await releaseDerivedIndexLock()}return derivedIndexWarnings2}),hookWarnings=await runRestoreWriteHooks({restoredItemPath,historyPath:subject.historyPath,before:currentState.document,after:restoredDocument});recordAfterCommandAffectedItem({id:restoredDocument.metadata.id,op:"restore",item_type:restoredDocument.metadata.type,previous_status:currentState.document.metadata.status,status:restoredDocument.metadata.status,previous:projectAfterCommandItemSnapshot(currentState.document.metadata,restoreChangedFields),current:projectAfterCommandItemSnapshot(restoredDocument.metadata,restoreChangedFields),changed_fields:restoreChangedFields});const targetEntry=history[resolvedTarget.historyIndex],offset=historyVersionOffset(history,!0);return{item:restoredDocument.metadata,restored_from:{kind:resolvedTarget.kind,target:resolvedTarget.raw,history_index:resolvedTarget.historyIndex+1,version:offset===null?null:offset+resolvedTarget.historyIndex+1,entry_ts:targetEntry.ts,entry_op:targetEntry.op},changed_fields:restoreChangedFields,warnings:[...workflowPolicy.warnings,...loadedItemUnderLock?.recovered?["restore_unreadable_item_recovered"]:[],...subject.historyPolicyWarnings,...ownershipWarnings,...derivedIndexWarnings,...hookWarnings]}}finally{await releaseLock()}}const _testOnlyRestoreCommand={applyHistoryPatch,changedFields,ensureMaterializedRestoreTarget,ensureReplayTarget,extractPatchFailureContext,replayCurrentDocument,replayToTarget,resolveRestoreSubject};export{_testOnlyRestoreCommand,runRestore};
|
|
1
|
+
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="89278323-311b-567b-b7ba-d51d3bec7a69")}catch{}})();import{assertInitializedTracker}from"../environment/tracker-preflight.js";import{normalizeItemFormatVersion,requiredItemFormatVersion}from"../../core/item/item-format-version.js";import{assertProjectRuntimeFormatGuard}from"../environment/project-runtime-compatibility.js";import{enforceWorkflowMutation}from"../../core/policy/workflow-policy-store.js";import jsonPatch from"fast-json-patch";import fs from"node:fs/promises";import{readLocatedItemSnapshot}from"../../core/store/item-store.js";import{advanceItemMutationPreconditions,assertItemMutationPreconditions,assertItemRevisionExpectationsOnUnreadable}from"../../core/store/item-mutation-precondition.js";import{EMPTY_CANONICAL_DOCUMENT}from"../../core/shared/constants.js";import{readHistorySnapshot}from"../../core/history/read.js";import{verifyHistoryRewriteNoDrift}from"../../core/history/history-rewrite.js";import{resolveHistorySubject}from"../history/subject.js";import{historyVersionOffset}from"../../core/history/version-address.js";import{writeFileAtomic,appendHistoryEntry,createHistoryEntry,replayToCanonicalItemDocument,replayToItemDocument,toReplayDocument,enforceHistoryStreamPolicyForItem,canonicalDocument,serializeItemDocument,resolveItemTypeRegistry,acquireLockLease,EXIT_CODE,PmCliError,nowIso,getActiveExtensionRegistrations,projectAfterCommandItemSnapshot,recordAfterCommandAffectedItem,runActiveOnWriteHooks,runActiveBeforeMutationHooks,createMutationGuardSdk,getItemPath,resolvePmRoot,resolveWorkspaceRoot,readSettings,resolveAuthor}from"../runtime-primitives.js";import{applyHistoryPatch,ensureMaterializedHistoryTarget as ensureMaterializedRestoreTarget,extractPatchFailureContext,replayHistoryToTarget as replayToTarget,resolveHistoryTarget}from"../history-read.js";import{acquireItemMetadataDerivedIndexLock,refreshItemMetadataDerivedIndex}from"../item-metadata-index.js";async function readRestoreItem(located,settings,history){const snapshot=await readLocatedItemSnapshot(located,{schema:settings.schema});return snapshot.error===null?{raw:snapshot.raw,document:snapshot.document}:{raw:snapshot.raw,document:replayCurrentDocument(history),recovered:!0}}function ensureReplayTarget(target,history){return resolveHistoryTarget(target,history,{errorSubject:"restore",allowFutureTimestamp:!0})}function replayCurrentDocument(history){const currentReplay=replayToTarget(history,history.length-1);return Object.keys(currentReplay.metadata).length===0?{metadata:{},body:currentReplay.body}:canonicalDocument(replayToItemDocument(currentReplay))}async function resolveRestoreSubject(pmRoot,id,settings,typeToFolder){const subject=await resolveHistorySubject(pmRoot,id,settings,typeToFolder),historyPolicy=subject.located?await enforceHistoryStreamPolicyForItem({pmRoot,settings,itemId:subject.id,commandLabel:"restore"}):{warnings:[]};return{...subject,historyPolicyWarnings:historyPolicy.warnings}}function changedFields(beforeDocument,afterDocument){const beforeReplay=toReplayDocument(beforeDocument),afterReplay=toReplayDocument(afterDocument),patch=jsonPatch.compare(beforeReplay,afterReplay),fields=new Set;for(const op of patch){if(op.path==="/body"||op.path.startsWith("/body/")){fields.add("body");continue}const segment=op.path.replace(/^\/(?:metadata|front_matter)\/?/,"").split("/")[0];fields.add(segment.replaceAll("~1","/").replaceAll("~0","~"))}return Array.from(fields).sort((a,b)=>a.localeCompare(b))}async function loadRestoreStateUnderLock(params){const verified=await verifyHistoryRewriteNoDrift({pmRoot:params.pmRoot,subject:params.subject,settings:params.settings,typeRegistry:params.typeRegistry,historyRawBeforeLock:params.historyRawBeforeLock,currentItemRawBeforeLock:params.currentItemRawBeforeLock,operation:"restore",readItem:located=>readRestoreItem(located,params.settings,params.history)});return{loadedItemUnderLock:verified.loadedItemUnderLock,existingItemPath:verified.locatedUnderLock?.itemPath??null}}function resolveRestoreCurrentState(loadedItemUnderLock,history){return loadedItemUnderLock?{document:loadedItemUnderLock.document,originalRaw:loadedItemUnderLock.raw}:{document:replayCurrentDocument(history),originalRaw:null}}function collectRestoreOwnershipWarnings(params){const assigned=params.document.metadata.assignee?.trim();if(!(assigned&&assigned!==params.author&&!params.force))return[];if(params.enforcement==="strict")throw new PmCliError(`Item ${params.resolvedId} is assigned to ${assigned}. Use --force to override.`,EXIT_CODE.CONFLICT);return params.enforcement==="warn"?[`ownership_warning:assignee_conflict:${params.resolvedId}:${assigned}`]:[]}async function restorePreviousItemAfterHistoryFailure(params){if(params.existingItemPath&¶ms.resolvedOriginalRaw!==null&¶ms.restoredItemPath!==params.existingItemPath){await writeFileAtomic(params.existingItemPath,params.resolvedOriginalRaw),await fs.rm(params.restoredItemPath,{force:!0});return}if(params.existingItemPath&¶ms.resolvedOriginalRaw!==null){await writeFileAtomic(params.existingItemPath,params.resolvedOriginalRaw);return}await fs.rm(params.restoredItemPath,{force:!0})}async function runRestoreWriteHooks(params){return[...await runActiveOnWriteHooks({path:params.restoredItemPath,scope:"project",op:"restore",item_id:params.after.metadata.id,item_type:params.after.metadata.type,before:params.before,after:params.after,changed_fields:["restored"]}),...await runActiveOnWriteHooks({path:params.historyPath,scope:"project",op:"restore:history",item_id:params.after.metadata.id,item_type:params.after.metadata.type,before:params.before,after:params.after,changed_fields:["restored"]})]}async function runRestore(id,target,options,global2){const pmRoot=resolvePmRoot(process.cwd(),global2.path);await assertInitializedTracker(pmRoot);const settings=await readSettings(pmRoot),typeRegistry=resolveItemTypeRegistry(settings,getActiveExtensionRegistrations()),subject=await resolveRestoreSubject(pmRoot,id,settings,typeRegistry.type_to_folder),resolvedId=subject.id,{raw:historyRawBeforeLock,entries:history}=await readHistorySnapshot(subject.historyPath,resolvedId);if(history.length===0)throw new PmCliError(`No history exists for ${resolvedId}; restore is unavailable.`,EXIT_CODE.NOT_FOUND);const resolvedTarget=ensureReplayTarget(target,history),replayDocument=ensureMaterializedRestoreTarget(replayToTarget(history,resolvedTarget.historyIndex),resolvedTarget),restoredDocument=replayToCanonicalItemDocument(replayDocument,{schema:settings.schema});if(restoredDocument.metadata.id!==resolvedId)throw new PmCliError(`Restore target resolved to item ${restoredDocument.metadata.id}, expected ${resolvedId}.`,EXIT_CODE.GENERIC_FAILURE);const currentItemRawBeforeLock=(subject.located?await readRestoreItem(subject.located,settings,history):null)?.raw??null,author=resolveAuthor(options.author,settings.author_default),lease=await acquireLockLease(pmRoot,resolvedId,settings.locks.ttl_seconds,author,!!options.force,settings.governance.force_required_for_stale_lock,settings.locks.wait_ms,{waitPolicy:"progress"}),releaseLock=lease.release;try{const{loadedItemUnderLock,existingItemPath}=await loadRestoreStateUnderLock({pmRoot,subject,settings,typeRegistry,historyRawBeforeLock,currentItemRawBeforeLock,history}),itemFormat="toon",currentState=resolveRestoreCurrentState(loadedItemUnderLock,history);loadedItemUnderLock?.recovered===!0&&assertItemRevisionExpectationsOnUnreadable(pmRoot,resolvedId,loadedItemUnderLock.raw),assertItemMutationPreconditions(pmRoot,loadedItemUnderLock?.document??EMPTY_CANONICAL_DOCUMENT,resolvedId),restoredDocument.metadata.pm_format_version=normalizeItemFormatVersion(Math.max(requiredItemFormatVersion(restoredDocument.metadata),requiredItemFormatVersion(currentState.document.metadata))),assertProjectRuntimeFormatGuard(resolveWorkspaceRoot(pmRoot),requiredItemFormatVersion(restoredDocument.metadata));const ownershipWarnings=collectRestoreOwnershipWarnings({document:currentState.document,author,force:options.force,enforcement:settings.governance.ownership_enforcement,resolvedId}),restoreChangedFields=changedFields(currentState.document,restoredDocument),workflowPolicy=await enforceWorkflowMutation({pmRoot,settings,operation:"restore",author,before:currentState.document,after:restoredDocument});await runActiveBeforeMutationHooks({pm_root:pmRoot,operation:"restore",before:currentState.document,after:restoredDocument,changed_fields:restoreChangedFields,sdk:createMutationGuardSdk({pmRoot,settings,typeToFolder:typeRegistry.type_to_folder})});const serializedRestore=serializeItemDocument(restoredDocument,{format:itemFormat,schema:settings.schema}),restoredItemPath=getItemPath(pmRoot,restoredDocument.metadata.type,resolvedId,itemFormat,typeRegistry.type_to_folder),derivedIndexWarnings=await lease.fence(async()=>{const releaseDerivedIndexLock=await acquireItemMetadataDerivedIndexLock(pmRoot,author);let derivedIndexWarnings2;try{await writeFileAtomic(restoredItemPath,serializedRestore),existingItemPath&&restoredItemPath!==existingItemPath&&await fs.rm(existingItemPath);const historyEntry=createHistoryEntry({nowIso:nowIso(),author,op:"restore",before:currentState.document,after:restoredDocument,message:options.message,context:workflowPolicy.decisions.length===0?void 0:{workflow_policies:workflowPolicy.decisions}});try{await appendHistoryEntry(subject.historyPath,historyEntry)}catch(error){throw await restorePreviousItemAfterHistoryFailure({existingItemPath,resolvedOriginalRaw:currentState.originalRaw,restoredItemPath}),error}derivedIndexWarnings2=await refreshItemMetadataDerivedIndex({pmRoot,preferredFormat:settings.item_format,typeToFolder:typeRegistry.type_to_folder,schema:settings.schema,itemPath:restoredItemPath,previousItemPath:existingItemPath??void 0,document:restoredDocument})}finally{await releaseDerivedIndexLock()}return derivedIndexWarnings2});advanceItemMutationPreconditions(pmRoot,restoredDocument,resolvedId);const hookWarnings=await runRestoreWriteHooks({restoredItemPath,historyPath:subject.historyPath,before:currentState.document,after:restoredDocument});recordAfterCommandAffectedItem({id:restoredDocument.metadata.id,op:"restore",item_type:restoredDocument.metadata.type,previous_status:currentState.document.metadata.status,status:restoredDocument.metadata.status,previous:projectAfterCommandItemSnapshot(currentState.document.metadata,restoreChangedFields),current:projectAfterCommandItemSnapshot(restoredDocument.metadata,restoreChangedFields),changed_fields:restoreChangedFields});const targetEntry=history[resolvedTarget.historyIndex],offset=historyVersionOffset(history,!0);return{item:restoredDocument.metadata,restored_from:{kind:resolvedTarget.kind,target:resolvedTarget.raw,history_index:resolvedTarget.historyIndex+1,version:offset===null?null:offset+resolvedTarget.historyIndex+1,entry_ts:targetEntry.ts,entry_op:targetEntry.op},changed_fields:restoreChangedFields,warnings:[...workflowPolicy.warnings,...loadedItemUnderLock?.recovered?["restore_unreadable_item_recovered"]:[],...subject.historyPolicyWarnings,...ownershipWarnings,...derivedIndexWarnings,...hookWarnings]}}finally{await releaseLock()}}const _testOnlyRestoreCommand={applyHistoryPatch,changedFields,ensureMaterializedRestoreTarget,ensureReplayTarget,extractPatchFailureContext,replayCurrentDocument,replayToTarget,resolveRestoreSubject};export{_testOnlyRestoreCommand,runRestore};
|
|
2
2
|
//# sourceMappingURL=restore.js.map
|