@unbrained/pm-cli 2026.10.28 → 2026.10.30

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.
Files changed (166) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +18 -0
  3. package/dist/cli/commands/lifecycle/append.d.ts +4 -0
  4. package/dist/cli/commands/lifecycle/append.js +1 -1
  5. package/dist/cli/commands/lifecycle/create.d.ts +4 -0
  6. package/dist/cli/commands/lifecycle/create.js +1 -1
  7. package/dist/cli/commands/lifecycle/plan.d.ts +3 -0
  8. package/dist/cli/commands/lifecycle/plan.js +1 -1
  9. package/dist/cli/commands/lifecycle/update-many.d.ts +4 -0
  10. package/dist/cli/commands/lifecycle/update-many.js +1 -1
  11. package/dist/cli/commands/lifecycle/update.d.ts +4 -0
  12. package/dist/cli/commands/lifecycle/update.js +1 -1
  13. package/dist/cli/help-content.js +2 -2
  14. package/dist/cli/register-list-query.js +3 -3
  15. package/dist/cli-bundle/bundle-manifest.json +1 -1
  16. package/dist/cli-bundle/chunks/{chunk-XHONSCLJ.js → chunk-34MP7WKK.js} +3 -3
  17. package/dist/cli-bundle/chunks/chunk-42BHHNTL.js +128 -0
  18. package/dist/cli-bundle/chunks/{chunk-D6P6IBPN.js → chunk-4BQD5SW2.js} +46 -46
  19. package/dist/cli-bundle/chunks/{chunk-YYD5MNAV.js → chunk-EHBGHX55.js} +2 -2
  20. package/dist/cli-bundle/chunks/{chunk-DM3PICGU.js → chunk-GRABKNFL.js} +2 -2
  21. package/dist/cli-bundle/chunks/chunk-I5O3XZOA.js +2 -0
  22. package/dist/cli-bundle/chunks/{chunk-CXUQEZDX.js → chunk-LEIVUGDH.js} +2 -2
  23. package/dist/cli-bundle/chunks/chunk-MVL27TAH.js +2 -0
  24. package/dist/cli-bundle/chunks/{chunk-7V37RC2L.js → chunk-OH7WPD42.js} +35 -35
  25. package/dist/cli-bundle/chunks/chunk-OOD2A7AF.js +20 -0
  26. package/dist/cli-bundle/chunks/chunk-Q5V7P6NM.js +2 -0
  27. package/dist/cli-bundle/chunks/{chunk-2J7I54MQ.js → chunk-QLPFYBXN.js} +2 -2
  28. package/dist/cli-bundle/chunks/chunk-S2U7ECUJ.js +2 -0
  29. package/dist/cli-bundle/chunks/{chunk-E5QBZ4HI.js → chunk-SA5NYLPE.js} +2 -2
  30. package/dist/cli-bundle/chunks/{chunk-YUBUNECD.js → chunk-UUQX3PFD.js} +57 -57
  31. package/dist/cli-bundle/chunks/chunk-VHLAVTJN.js +31 -0
  32. package/dist/cli-bundle/chunks/{chunk-DKLEDWVW.js → chunk-XAOVJG52.js} +2 -2
  33. package/dist/cli-bundle/chunks/chunk-XPQ4RTSF.js +2 -0
  34. package/dist/cli-bundle/chunks/{chunk-D3AIQZXF.js → chunk-Y6NC3X3E.js} +2 -2
  35. package/dist/cli-bundle/chunks/item-transaction-WIOBZW4E.js +2 -0
  36. package/dist/cli-bundle/chunks/{mutation-admission-GKDKHRTZ.js → mutation-admission-TRGAVS7N.js} +2 -2
  37. package/dist/cli-bundle/chunks/{register-list-query-MHJJUM6M.js → register-list-query-BH4F6M7Z.js} +6 -6
  38. package/dist/cli-bundle/chunks/register-mutation-5V2NANIS.js +20 -0
  39. package/dist/cli-bundle/chunks/register-operations-XSFRMUFX.js +2 -0
  40. package/dist/cli-bundle/chunks/{register-setup-WUZ2ZSMY.js → register-setup-QPWSVHFZ.js} +2 -2
  41. package/dist/cli-bundle/chunks/{stage-2FYJGGG3.js → stage-RTB6RAAO.js} +2 -2
  42. package/dist/cli-bundle/focused-chunks/chunk-2V6NMNYN.js +26 -0
  43. package/dist/cli-bundle/focused-chunks/{chunk-ML5JIUM6.js → chunk-3SRX77ES.js} +2 -2
  44. package/dist/cli-bundle/focused-chunks/{chunk-YLVHHWHN.js → chunk-4PW5XWVI.js} +2 -2
  45. package/dist/cli-bundle/focused-chunks/{chunk-Z26ZPQH6.js → chunk-ASHGXMX4.js} +3 -3
  46. package/dist/cli-bundle/focused-chunks/{chunk-JTCGDODH.js → chunk-BCIUAEWX.js} +2 -2
  47. package/dist/cli-bundle/focused-chunks/{chunk-7SZPZOIC.js → chunk-BPE6JTKL.js} +2 -2
  48. package/dist/cli-bundle/focused-chunks/{chunk-LPWZERVD.js → chunk-CKBN2D42.js} +3 -3
  49. package/dist/cli-bundle/focused-chunks/chunk-FRFNGMAK.js +2 -0
  50. package/dist/cli-bundle/focused-chunks/chunk-I642DXOT.js +22 -0
  51. package/dist/cli-bundle/focused-chunks/chunk-K7DKG5HM.js +91 -0
  52. package/dist/cli-bundle/focused-chunks/chunk-NMQBXU7N.js +44 -0
  53. package/dist/cli-bundle/focused-chunks/{chunk-6VDRAJYX.js → chunk-PGM3ENGZ.js} +2 -2
  54. package/dist/cli-bundle/focused-chunks/{chunk-DRN4W3YJ.js → chunk-POJPJX64.js} +2 -2
  55. package/dist/cli-bundle/focused-chunks/{chunk-B4ZQJEMT.js → chunk-QFNV4JTA.js} +2 -2
  56. package/dist/cli-bundle/focused-chunks/{chunk-QUPGBO2L.js → chunk-QVJCQMZY.js} +2 -2
  57. package/dist/cli-bundle/focused-chunks/chunk-R2TPPPVU.js +2 -0
  58. package/dist/cli-bundle/focused-chunks/{chunk-TUN4M757.js → chunk-RGQEJFXO.js} +2 -2
  59. package/dist/cli-bundle/focused-chunks/{chunk-ON5WFDCG.js → chunk-RKPUQDWF.js} +2 -2
  60. package/dist/cli-bundle/focused-chunks/chunk-RYEZSZJ7.js +2 -0
  61. package/dist/cli-bundle/focused-chunks/{chunk-4GN2ZPT5.js → chunk-S23ZUASN.js} +2 -2
  62. package/dist/cli-bundle/focused-chunks/{chunk-R3EA3SDW.js → chunk-SAT7IAEB.js} +3 -3
  63. package/dist/cli-bundle/focused-chunks/{chunk-I4X6AKOO.js → chunk-VFWCSQAG.js} +2 -2
  64. package/dist/cli-bundle/focused-chunks/chunk-VJVJ2ZX2.js +2 -0
  65. package/dist/cli-bundle/focused-chunks/{chunk-C2GLO7HU.js → chunk-YQUZL2CK.js} +54 -54
  66. package/dist/cli-bundle/focused-chunks/{chunk-IQKLJFJE.js → chunk-YU7QOYYV.js} +18 -18
  67. package/dist/cli-bundle/focused-chunks/{indexed-receipt-blobs-5H6RMRTK.js → indexed-receipt-blobs-VK2363JB.js} +2 -2
  68. package/dist/cli-bundle/focused-chunks/item-transaction-ZFDKJIP7.js +2 -0
  69. package/dist/cli-bundle/focused-chunks/{mutation-admission-TM3SVU2O.js → mutation-admission-7VUODEPJ.js} +2 -2
  70. package/dist/cli-bundle/focused-chunks/{settlement-hook-LBVWWSCF.js → settlement-hook-OK6A7PG2.js} +2 -2
  71. package/dist/cli-bundle/focused-chunks/{stage-7ZBRX2Q2.js → stage-S5RP5SZH.js} +2 -2
  72. package/dist/cli-bundle/main.js +3 -3
  73. package/dist/cli-bundle/sdk-authoring.js +1 -1
  74. package/dist/cli-bundle/sdk-contracts.js +2 -2
  75. package/dist/cli-bundle/sdk-core.js +1 -43
  76. package/dist/cli-bundle/sdk-governance.js +1 -1
  77. package/dist/cli-bundle/sdk-graph.js +1 -1
  78. package/dist/cli-bundle/sdk-merge.js +61 -61
  79. package/dist/cli-bundle/sdk-query.js +1 -1
  80. package/dist/cli-bundle/sdk-runtime.js +1 -1
  81. package/dist/cli-bundle/sdk-testing.js +1 -1
  82. package/dist/cli-bundle/sdk.js +9 -9
  83. package/dist/core/history/operation-contract.d.ts +2 -2
  84. package/dist/core/history/operation-contract.js +1 -1
  85. package/dist/core/item/literal-mutation-input.d.ts +12 -0
  86. package/dist/core/item/literal-mutation-input.js +2 -0
  87. package/dist/core/item/parse.d.ts +2 -0
  88. package/dist/core/item/parse.js +2 -2
  89. package/dist/core/output/output.js +2 -2
  90. package/dist/core/store/item-store.js +1 -1
  91. package/dist/sdk/cli-contracts/flag-contracts.js +1 -1
  92. package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +1 -1
  93. package/dist/sdk/cli-contracts/registration-helpers.js +1 -1
  94. package/dist/sdk/cli-contracts/tool-parameter-tables.js +1 -1
  95. package/dist/sdk/cli-contracts/tool-schema.js +1 -1
  96. package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -1
  97. package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -1
  98. package/dist/sdk/item-transaction.d.ts +33 -2
  99. package/dist/sdk/item-transaction.js +1 -1
  100. package/dist/sdk/lifecycle/append.js +1 -1
  101. package/dist/sdk/lifecycle/cli-input.d.ts +4 -0
  102. package/dist/sdk/lifecycle/cli-input.js +2 -0
  103. package/dist/sdk/lifecycle/create.js +1 -1
  104. package/dist/sdk/lifecycle/legacy-none-tokens.js +1 -1
  105. package/dist/sdk/lifecycle/reopen.js +1 -1
  106. package/dist/sdk/lifecycle/update-many.js +1 -1
  107. package/dist/sdk/lifecycle/update.js +2 -2
  108. package/dist/sdk/output/table-rows.d.ts +9 -1
  109. package/dist/sdk/output/table-rows.js +1 -1
  110. package/dist/sdk/public-surface.json +1 -1
  111. package/dist/sdk/query/history.d.ts +2 -0
  112. package/dist/sdk/query/history.js +1 -1
  113. package/dist/sdk/runtime/mutation-value-validation.d.ts +16 -0
  114. package/dist/sdk/runtime/mutation-value-validation.js +2 -0
  115. package/dist/sdk/runtime-input.js +1 -1
  116. package/dist/sdk/runtime-primitives.d.ts +1 -0
  117. package/dist/sdk/runtime-primitives.js +1 -1
  118. package/dist/sdk/runtime.d.ts +14 -0
  119. package/dist/sdk/runtime.js +1 -1
  120. package/dist/sdk/structured-mutations.js +1 -1
  121. package/dist/sdk/workspace-transaction-gc.js +1 -1
  122. package/dist/sdk/workspace-transaction.d.ts +54 -0
  123. package/dist/sdk/workspace-transaction.js +2 -2
  124. package/docs/COMMANDS.md +15 -10
  125. package/docs/OUTPUT_PROJECTION_CONTRACTS.md +24 -2
  126. package/docs/SDK.md +134 -9
  127. package/docs/TESTING.md +8 -0
  128. package/docs/generated/FLAG_LEXICON_BUDGETS.md +1 -1
  129. package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +6 -3
  130. package/marketplace.json +1 -1
  131. package/package.json +1 -1
  132. package/packages/pm-beads/package.json +1 -1
  133. package/packages/pm-calendar/package.json +1 -1
  134. package/packages/pm-command-kit/package.json +1 -1
  135. package/packages/pm-digital-twin/package.json +1 -1
  136. package/packages/pm-governance-audit/package.json +1 -1
  137. package/packages/pm-guide-shell/package.json +1 -1
  138. package/packages/pm-kanban/package.json +1 -1
  139. package/packages/pm-lifecycle-hooks/package.json +1 -1
  140. package/packages/pm-linked-test-adapters/package.json +1 -1
  141. package/packages/pm-search-advanced/package.json +1 -1
  142. package/packages/pm-templates/package.json +1 -1
  143. package/packages/pm-todos/package.json +1 -1
  144. package/packages/pm-vcs/package.json +1 -1
  145. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  146. package/plugins/pm-claude/package.json +1 -1
  147. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  148. package/plugins/pm-codex/package.json +1 -1
  149. package/plugins/pm-codex/plugin.json +1 -1
  150. package/runtime-dependencies.json +1 -1
  151. package/dist/cli-bundle/chunks/chunk-4D25HF3V.js +0 -2
  152. package/dist/cli-bundle/chunks/chunk-AHVN4GHF.js +0 -31
  153. package/dist/cli-bundle/chunks/chunk-CS7QDSUX.js +0 -128
  154. package/dist/cli-bundle/chunks/chunk-JESLOJD7.js +0 -2
  155. package/dist/cli-bundle/chunks/chunk-PQLRKFPZ.js +0 -20
  156. package/dist/cli-bundle/chunks/chunk-SGFQQXFD.js +0 -2
  157. package/dist/cli-bundle/chunks/chunk-ZX3XMTZG.js +0 -2
  158. package/dist/cli-bundle/chunks/register-mutation-SN425O3R.js +0 -20
  159. package/dist/cli-bundle/chunks/register-operations-EYUIUGPW.js +0 -2
  160. package/dist/cli-bundle/focused-chunks/chunk-3EHVI673.js +0 -2
  161. package/dist/cli-bundle/focused-chunks/chunk-46WLWK73.js +0 -2
  162. package/dist/cli-bundle/focused-chunks/chunk-6L4KKRK7.js +0 -26
  163. package/dist/cli-bundle/focused-chunks/chunk-BZSACRVX.js +0 -91
  164. package/dist/cli-bundle/focused-chunks/chunk-F6UQJJYB.js +0 -2
  165. package/dist/cli-bundle/focused-chunks/chunk-L5GX2FGZ.js +0 -2
  166. package/dist/cli-bundle/focused-chunks/chunk-OASYSUOH.js +0 -22
@@ -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]="4d215571-44e3-5ce8-9644-47e42dd4b23e")}catch{}})();import crypto from"node:crypto";import{constants}from"node:fs";import{isFileMissingError,readRegularFile,transactionPreviewNonRegularFileError}from"../core/fs/fs-utils.js";import{cp,lstat,mkdir,mkdtemp,open,readdir,realpath,rm,stat,writeFile}from"node:fs/promises";import{tmpdir}from"node:os";import{getActiveExtensionRegistrations,setActiveExtensionRegistrations}from"../core/extensions/index.js";import path from"node:path";import{transferMutationStdinTokenPolicy}from"../core/item/parse.js";import{EXIT_CODE,PM_REQUIRED_SUBDIRS,SETTINGS_DEFAULTS,SETTINGS_FILENAME}from"../core/shared/constants.js";import{resolveItemTypeRegistry}from"../core/item/type-registry.js";import{listAllItemMetadataLight}from"../core/store/item-store.js";import{runWithItemMutationPrecondition}from"../core/store/item-mutation-precondition.js";import{hashDocument,hashHistoryStream}from"../core/history/history.js";import{historyVersionOffset}from"../core/history/version-address.js";import{isConfigurationOnlySettingsRead,readSettings}from"../core/store/settings.js";import{DEFAULT_RUNTIME_SCHEMA_FILE_PATHS,filePathForSchemaSection,loadRuntimeSchemaFromOptionalFiles,normalizeRuntimeSchemaSettings}from"../core/schema/runtime-schema.js";import{validateSettings}from"../core/store/settings-validator.js";import{resolveWorkspaceRoot}from"../core/store/paths.js";import{getSessionStatePath}from"../core/session/session-state.js";import{PmCliError}from"../core/shared/errors.js";import{stableUpsertValue}from"./structured-mutations.js";import{stableStringify}from"../core/shared/serialization.js";import{assertMutationOptionValueTypes}from"./lifecycle/mutation-option-validation.js";import{readHistoryEntries}from"./history-read.js";import{PM_CONTEXT_INTENTS_FILE}from"./context-intent-runtime.js";import{close,create,deleteItem,get,release,restore,update,runWithActiveExtensions}from"./runtime.js";import{commitWorkspaceTransaction,validateWorkspaceTransactionIdentity}from"./workspace-transaction.js";async function resolveTransactionSchema(pmRoot,settings){if(!isConfigurationOnlySettingsRead(pmRoot))return{schema:normalizeRuntimeSchemaSettings(settings.schema),typeDefinitionsFromFile:[]};const loaded=await loadGuardedRuntimeSchema(pmRoot,settings.schema);return{schema:loaded.schema,typeDefinitionsFromFile:loaded.type_definitions_from_file??[]}}async function listUpsertKeyCandidates(pmRoot,settings,schemaContext,key){const typeRegistry=resolveItemTypeRegistry({...settings,item_types:{...settings.item_types,definitions:[...settings.item_types?.definitions??[],...schemaContext.typeDefinitionsFromFile]}},getActiveExtensionRegistrations());return(await listAllItemMetadataLight(pmRoot,settings.item_format,typeRegistry.type_to_folder,void 0,schemaContext.schema)).flatMap(item=>{const value=item[key];return value==null?[]:[{id:item.id,value}]})}function createUniqueKeyIndex(pmRoot){const scans=new Map,scan=async key=>{const settings=await readSettings(pmRoot),schemaContext=await resolveTransactionSchema(pmRoot,settings),byValue=new Map;for(const candidate of await listUpsertKeyCandidates(pmRoot,settings,schemaContext,key)){const stable=stableUpsertValue(candidate.value);byValue.set(stable,[...byValue.get(stable)??[],candidate.id])}return byValue};return{lookup(key){const pending=scans.get(key)??scan(key);return scans.set(key,pending),pending},async recordCreate(item){for(const[key,pending]of scans){const value=item[key];if(value==null)continue;const byValue=await pending,stable=stableUpsertValue(value);byValue.set(stable,[...byValue.get(stable)??[],String(item.id)])}},invalidate(){scans.clear()}}}async function assertUniqueKeyFree(index,unique){const stable=stableUpsertValue(unique.value),existing=(await index.lookup(unique.key)).get(stable)??[];if(existing.length!==0)throw new PmCliError(`Upsert key "${unique.key}" value ${JSON.stringify(stable)} now matches existing item ${existing.join(", ")}; the plan was resolved before it existed.`,EXIT_CODE.CONFLICT,{code:"upsert_key_conflict",required:"Re-plan the document so the row updates the existing item instead of creating a duplicate.",why:"Keyed upsert is resolved before the writer lock, so every remaining create is re-checked under the lock; concurrent imports therefore cannot create two items for one key value.",nextSteps:["Re-run pm item mutate with the same document and --upsert-key; the re-plan turns the row into an update of the existing item.","Inspect the existing item first when its content should win over the document row."]})}function assertUpsertMatchCurrent(document,id,match){const current=document.metadata[match.key],expected=stableUpsertValue(match.value);if(stableUpsertValue(current)!==expected)throw new PmCliError(`Item ${id} no longer carries upsert key "${match.key}" value ${JSON.stringify(expected)}; the plan selected it before the key changed.`,EXIT_CODE.CONFLICT,{code:"upsert_match_changed",required:"Re-plan the document so the row is resolved against the current key values.",why:"Keyed upsert selects its target before the writer lock, so the update re-reads the key under the lock instead of updating a mismatched item blindly.",nextSteps:["Re-run pm item mutate with the same document and --upsert-key; the re-plan creates or re-targets the row from the current key values."]})}function isValidUniqueKey(value){if(value===null||typeof value!="object"||Array.isArray(value))return!1;const candidate=value;return typeof candidate.key=="string"&&candidate.key.trim().length>0&&candidate.value!==void 0&&candidate.value!==null}function mergeTransactionMutationOptions(source,additions){const merged={...source,...additions};return source===void 0?merged:transferMutationStdinTokenPolicy(source,merged)}async function readItemSnapshot(pmRoot,id){try{const item=(await get(id,{},{pmRoot})).item;return{id:item.id,closedAt:item.closed_at,updatedAt:item.updated_at,assignee:item.assignee,claimPrincipal:item.claim_principal}}catch(error){if(error instanceof PmCliError&&error.exitCode===EXIT_CODE.NOT_FOUND)return;throw error}}function deriveStepId(mutation,index){const sanitizedTarget=mutation.id.replaceAll(/[^a-zA-Z0-9._-]/gu,"_"),fingerprint=crypto.createHash("sha256").update(stableStringify(mutation)).digest("hex").slice(0,12);return`${index+1}-${mutation.op}-${sanitizedTarget}-${fingerprint}`}function deriveOutcomeKey(mutation,index){const sanitizedTarget=mutation.id.replaceAll(/[^a-zA-Z0-9._-]/gu,"_");return`${index+1}-${mutation.op}-${sanitizedTarget}`}function bulkHistoryMarker(transactionId,stepId,phase){return`bulk-item-transaction ${transactionId} ${stepId} ${phase}`}async function isUpdateMarkerApplied(pmRoot,canonicalId,transactionId,stepId){const entries=await readHistoryEntries(path.join(pmRoot,"history",`${canonicalId}.jsonl`),canonicalId),applyMarker=bulkHistoryMarker(transactionId,stepId,"apply"),compensateMarker=bulkHistoryMarker(transactionId,stepId,"compensate");for(let index=entries.length-1;index>=0;index-=1){const message=entries[index].message;if(message===applyMarker)return!0;if(message===compensateMarker)return!1}return!1}async function prepareRestoreCompensation(pmRoot,mutation){const snapshot=await readItemSnapshot(pmRoot,mutation.id);if(snapshot?.updatedAt===void 0)throw new PmCliError(`Bulk ${mutation.op} target ${mutation.id} does not exist or has no restorable version`,EXIT_CODE.NOT_FOUND);const history=await readHistoryEntries(path.join(pmRoot,"history",`${snapshot.id}.jsonl`),snapshot.id);if(history.length===0)throw new PmCliError(`Bulk ${mutation.op} target ${mutation.id} has no restorable history`,EXIT_CODE.NOT_FOUND);return{target_updated_at:snapshot.updatedAt,target_version:String(historyVersionOffset(history)+history.length),target_history_hash:hashHistoryStream(history),target_history_length:history.length}}function partialMutationError(config,itemId,stepId){return new PmCliError(`Transaction ${config.transactionId} cannot safely compensate incomplete step ${stepId}; review item ${itemId} history before recovery.`,EXIT_CODE.CONFLICT,{code:"transaction_partial_mutation",item_id:itemId,required:"Reconcile the item's partial or intervening changes before resuming this transaction.",why:"The retained history does not prove exclusive ownership of the changes to undo. The journal remains compensating instead of claiming a rollback or overwriting another writer.",nextSteps:[`Run pm history ${itemId} and inspect this transaction's retained compensation data before explicitly restoring or reconciling the item.`]})}function isTransactionHistoryEntry(entry,transactionId){const prefix=`bulk-item-transaction ${transactionId} `;return[entry.message,entry.context?.item_transaction_step].some(value=>typeof value=="string"&&value.startsWith(prefix))}function hasOwnedCompensationEffects(history,proof,identity){const{expectedHistory,length,version}=proof;if(hashHistoryStream(history)===expectedHistory)return!1;if(typeof length!="number"||!Number.isSafeInteger(length)||length<1||hashHistoryStream(history.slice(0,length))!==expectedHistory||version!==String(historyVersionOffset(history)+length))throw partialMutationError(identity,identity.itemId,identity.stepId);const marker=bulkHistoryMarker(identity.transactionId,identity.stepId,"apply"),changes=history.slice(length),isOwned=entry=>entry.message===marker||entry.context?.item_transaction_step===marker,compensationMarker=bulkHistoryMarker(identity.transactionId,identity.stepId,"compensate");if(changes.filter(entry=>isOwned(entry)||entry.message===compensationMarker).at(-1)?.message===compensationMarker)return!1;const owned=changes.filter(isOwned);if(owned.length===0)return!1;const siblingsRestored=history.at(-1).after_hash===owned.at(-1).after_hash&&changes.every(entry=>isTransactionHistoryEntry(entry,identity.transactionId));if(owned.length!==changes.length&&!siblingsRestored)throw partialMutationError(identity,identity.itemId,identity.stepId);return!0}async function compensateByRestore(config,itemId,stepId,data){const receipt=data!==null&&typeof data=="object"&&!Array.isArray(data)?data:void 0;if(receipt===void 0||typeof receipt.target_updated_at!="string")return;const target=receipt.target_updated_at,current=await readItemSnapshot(config.pmRoot,itemId);if(current===void 0)return;const history=await readHistoryEntries(path.join(config.pmRoot,"history",`${current.id}.jsonl`),current.id),expectedHistory=receipt.target_history_hash;if(typeof expectedHistory=="string"){if(!hasOwnedCompensationEffects(history,{expectedHistory,length:receipt.target_history_length,version:receipt.target_version},{...config,itemId:current.id,stepId}))return}else{if(current.updatedAt===target)return;if(!await isUpdateMarkerApplied(config.pmRoot,current.id,config.transactionId,stepId))throw partialMutationError(config,current.id,stepId)}const applyRestore=()=>restore(itemId,typeof receipt.target_version=="string"?receipt.target_version:target,{force:!0,author:config.author,message:bulkHistoryMarker(config.transactionId,stepId,"compensate")},{pmRoot:config.pmRoot});await runWithItemMutationPrecondition({pmRoot:config.pmRoot,id:current.id,validate:document=>{if(hashDocument(document)!==history.at(-1).after_hash)throw partialMutationError(config,current.id,stepId)}},applyRestore)}function buildCreateStep(config,mutation,stepId){return{id:stepId,async inspect(){const snapshot=await readItemSnapshot(config.pmRoot,mutation.id);if(snapshot===void 0)return{state:"pending"};if(snapshot.closedAt!==void 0){const history=await readHistoryEntries(path.join(config.pmRoot,"history",`${snapshot.id}.jsonl`),snapshot.id),reason=`Compensated: interrupted bulk transaction ${config.transactionId}`;if(history.filter(entry=>entry.op==="close").at(-1)?.patch.some(change=>change.op==="add"||change.op==="replace"?change.path==="/metadata/close_reason"&&change.value===reason:!1)??!1)throw new PmCliError(`Created item ${snapshot.id} remains closed by transaction compensation; explicitly reopen or reconcile it before retrying.`,EXIT_CODE.CONFLICT,{code:"transaction_create_compensated",item_id:snapshot.id,required:"Review the compensated item and explicitly reopen it before retrying the same document.",why:"This item's latest closure belongs to transaction compensation. Automatically reopening it could overwrite later lifecycle decisions.",nextSteps:[`Run pm item reopen ${snapshot.id} "Retry compensated creation" after reviewing its history, then retry the transaction.`]})}return{state:"applied",result:{id:snapshot.id,op:"create"}}},async apply(){mutation.unique!==void 0&&await assertUniqueKeyFree(config.uniqueIndex,mutation.unique);const created=await create(mergeTransactionMutationOptions(mutation.options,{author:config.author,id:mutation.id}),{pmRoot:config.pmRoot}),createdItem=created.item;return config.onCreateWarnings?.(String(createdItem.id),created.warnings),await config.uniqueIndex.recordCreate(createdItem),{id:String(createdItem.id),op:"create"}},async compensate(){const snapshot=await readItemSnapshot(config.pmRoot,mutation.id);if(snapshot!==void 0){if(config.createCompensation==="delete"){await deleteItem(mutation.id,{force:!0,author:config.author,message:`Compensate interrupted bulk transaction ${config.transactionId}`},{pmRoot:config.pmRoot});return}snapshot.closedAt===void 0&&await close(mutation.id,`Compensated: interrupted bulk transaction ${config.transactionId}`,{force:!0,author:config.author},{pmRoot:config.pmRoot})}}}}function buildUpdateStep(config,mutation,stepId){return{id:stepId,compensatePending:!0,async inspect(){const snapshot=await readItemSnapshot(config.pmRoot,mutation.id);return snapshot===void 0?{state:"pending"}:await isUpdateMarkerApplied(config.pmRoot,snapshot.id,config.transactionId,stepId)?{state:"applied",result:{id:snapshot.id,op:"update"}}:{state:"pending"}},async prepareCompensation(){return prepareRestoreCompensation(config.pmRoot,mutation)},async apply(){const applyUpdate=()=>update(mutation.id,mergeTransactionMutationOptions(mutation.options,{author:config.author,message:bulkHistoryMarker(config.transactionId,stepId,"apply")}),{pmRoot:config.pmRoot}),match=mutation.match;let currentMatch=match;const updatedItem=(await runWithItemMutationPrecondition({pmRoot:config.pmRoot,id:String((await get(mutation.id,{},{pmRoot:config.pmRoot})).item.id),validate:document=>{currentMatch!==void 0&&assertUpsertMatchCurrent(document,mutation.id,currentMatch)},committed:document=>{match!==void 0&&(currentMatch={key:match.key,value:structuredClone(document.metadata[match.key])})},historyContext:{item_transaction_step:bulkHistoryMarker(config.transactionId,stepId,"apply")}},applyUpdate)).item;return config.uniqueIndex.invalidate(),{id:String(updatedItem.id),op:"update"}},async compensate(data){await compensateByRestore(config,mutation.id,stepId,data)}}}function buildCloseStep(config,mutation,stepId){return{id:stepId,async inspect(){const snapshot=await readItemSnapshot(config.pmRoot,mutation.id);return snapshot===void 0?{state:"pending"}:await isUpdateMarkerApplied(config.pmRoot,snapshot.id,config.transactionId,stepId)?{state:"applied",result:{id:snapshot.id,op:"close"}}:snapshot.closedAt===void 0?{state:"pending"}:{state:"applied",result:{id:snapshot.id,op:"close"}}},async prepareCompensation(){return prepareRestoreCompensation(config.pmRoot,mutation)},async apply(){const closedItem=(await close(mutation.id,mutation.reason,mergeTransactionMutationOptions(mutation.options,{author:config.author,message:bulkHistoryMarker(config.transactionId,stepId,"apply")}),{pmRoot:config.pmRoot})).item;return config.uniqueIndex.invalidate(),{id:String(closedItem.id),op:"close"}},async compensate(data){await compensateByRestore(config,mutation.id,stepId,data)}}}function buildReleaseStep(config,mutation,stepId){return{id:stepId,async inspect(){const snapshot=await readItemSnapshot(config.pmRoot,mutation.id);return snapshot===void 0?{state:"pending"}:await isUpdateMarkerApplied(config.pmRoot,snapshot.id,config.transactionId,stepId)?{state:"applied",result:{id:snapshot.id,op:"release"}}:snapshot.assignee!==void 0||snapshot.claimPrincipal!==void 0?{state:"pending"}:{state:"applied",result:{id:snapshot.id,op:"release"}}},async prepareCompensation(){return prepareRestoreCompensation(config.pmRoot,mutation)},async apply(){const releasedItem=(await release(mutation.id,mergeTransactionMutationOptions(mutation.options,{author:config.author,message:bulkHistoryMarker(config.transactionId,stepId,"apply")}),{pmRoot:config.pmRoot})).item;return config.uniqueIndex.invalidate(),{id:String(releasedItem.id),op:"release"}},async compensate(data){await compensateByRestore(config,mutation.id,stepId,data)}}}function buildStepForMutation(config,mutation,index){const stepId=deriveStepId(mutation,index);switch(mutation.op){case"create":return buildCreateStep(config,mutation,stepId);case"update":return buildUpdateStep(config,mutation,stepId);case"close":return buildCloseStep(config,mutation,stepId);case"release":return buildReleaseStep(config,mutation,stepId)}}function assertValidBulkMutation(mutation,index){if(mutation===null||typeof mutation!="object"||Array.isArray(mutation))throw new TypeError(`Bulk mutation ${index+1} must be an object`);if(!["create","update","close","release"].includes(mutation.op))throw new TypeError(`Bulk mutation ${index+1} op must be create, update, close, or release`);if(typeof mutation.id!="string"||mutation.id.trim().length===0)throw new TypeError(`Bulk mutation ${index+1} requires a non-empty id`);if(mutation.op==="close"&&(typeof mutation.reason!="string"||mutation.reason.trim().length===0))throw new TypeError(`Bulk close mutation ${index+1} requires a non-empty reason`);if(mutation.op==="create"&&mutation.unique!==void 0&&!isValidUniqueKey(mutation.unique))throw new TypeError(`Bulk create mutation ${index+1} unique must be an object with a non-empty key and a value`);if(mutation.op==="update"&&mutation.match!==void 0&&!isValidUniqueKey(mutation.match))throw new TypeError(`Bulk update mutation ${index+1} match must be an object with a non-empty key and a value`);assertMutationOptionValueTypes(mutation.options,mutation.op,index)}function assertValidBulkMutations(mutations){if(mutations.length===0)throw new TypeError("Bulk item transaction requires at least one mutation");const keys=new Map;for(const[index,mutation]of mutations.entries()){if(assertValidBulkMutation(mutation,index),mutation.op!=="create"||mutation.unique===void 0)continue;const{key,value}=mutation.unique,values=keys.get(key)??new Map,stable=stableUpsertValue(value),previous=values.get(stable);if(previous!==void 0)throw new PmCliError(`Bulk create mutations ${previous+1} and ${index+1} share the upsert key value ${JSON.stringify(stable)} for "${key}".`,EXIT_CODE.USAGE,{code:"upsert_key_duplicate",required:"Each create must carry a distinct unique key value within one batch.",why:"Direct SDK batches must preserve the same uniqueness invariant as planned document rows."});values.set(stable,index),keys.set(key,values)}}async function validateMutationOperation(mutation,index,run){try{return await run()}catch(error){throw error instanceof PmCliError?new PmCliError(error.message,error.exitCode,{...error.context,transaction_operation:{index,op:mutation.op,id:mutation.id}}):error}}function includePreviewPath(root,file,ownedPaths,retainedPaths){const relative=path.relative(root,file),segments=relative.split(path.sep);return segments[0]==="extensions"&&segments[2]==="node_modules"&&!retainedPaths.some(retained=>relative===retained||relative.startsWith(`${retained}${path.sep}`)||retained.startsWith(`${relative}${path.sep}`))?!1:["locks","runtime","search"].includes(relative.split(path.sep)[0])?retainedPaths.some(retained=>relative===retained||relative.startsWith(`${retained}${path.sep}`)||retained.startsWith(`${relative}${path.sep}`)):relative===""||ownedPaths===void 0||ownedPaths.some(owned=>relative===owned||relative.startsWith(`${owned}${path.sep}`)||owned.startsWith(`${relative}${path.sep}`))}async function previewEntryStat(root,file){const entry=await lstat(file);if(entry.isSymbolicLink())await stat(file);else if(entry.isDirectory()||entry.isFile())return entry;throw transactionPreviewNonRegularFileError(path.relative(root,file))}async function previewFileDigest(root,file){const handle=await open(file,constants.O_RDONLY|constants.O_NOFOLLOW|constants.O_NONBLOCK);try{const entry=await handle.stat();if(!entry.isFile())throw transactionPreviewNonRegularFileError(path.relative(root,file));const contents=crypto.createHash("sha256");if(entry.size>0)for await(const chunk of handle.createReadStream({highWaterMark:64*1024,end:entry.size-1,autoClose:!1}))contents.update(chunk);return contents.digest()}finally{await handle.close()}}async function previewTrackerFingerprint(root,ownedPaths,retainedPaths){const fingerprint=crypto.createHash("sha256");async function visit(directory){for(const name of(await readdir(directory)).sort()){const file=path.join(directory,name);includePreviewPath(root,file,ownedPaths,retainedPaths)&&((await previewEntryStat(root,file)).isDirectory()?await visit(file):(fingerprint.update(JSON.stringify(path.relative(root,file))),fingerprint.update(await previewFileDigest(root,file))))}}return await visit(root),fingerprint.digest("hex")}function previewSnapshotChangedError(){return new PmCliError("Tracker changed while preparing the transaction preview; retry against stable state.",EXIT_CODE.CONFLICT,{code:"transaction_preview_snapshot_changed"})}async function isDisappearingPreviewPath(error){if(!isFileMissingError(error))return!1;const file=error.path;if(typeof file!="string")return!1;const original=path.resolve(file);let candidate=original;for(;;)try{const entry=await lstat(candidate);return candidate!==original&&entry.isDirectory()}catch(lookupError){if(!isFileMissingError(lookupError))return!1;const parent=path.dirname(candidate);if(parent===candidate)return!1;candidate=parent}}async function readPreviewConfiguration(root,relative){const file=path.join(root,relative);try{let current=root;for(const component of relative.split(path.sep).slice(0,-1))current=path.join(current,component),await previewEntryStat(root,current);if(!(await previewEntryStat(root,file)).isFile())throw transactionPreviewNonRegularFileError(relative);return await readRegularFile(file,transactionPreviewNonRegularFileError(relative))}catch(error){if(await isDisappearingPreviewPath(error))return;throw error}}async function stageGuardedSchemaSections(root,configurationRoot,schemaSettings,configuration){const schema=normalizeRuntimeSchemaSettings(schemaSettings);for(const[section,configuredPath]of Object.entries(schema.files)){const relative=path.relative(root,filePathForSchemaSection(root,configuredPath,DEFAULT_RUNTIME_SCHEMA_FILE_PATHS[section]));if(relative===""||!path.resolve(root,relative).startsWith(path.join(root,path.sep)))throw new PmCliError("Transaction preview requires schema files inside the selected tracker root; relocate the configured schema file before retrying.",EXIT_CODE.USAGE,{code:"transaction_preview_external_schema",field:`schema.files.${section}`});schema.files[section]=relative;const contents=await readPreviewConfiguration(root,relative);if(configuration?.set(relative,contents),contents!==void 0){const target=path.join(configurationRoot,relative);await mkdir(path.dirname(target),{recursive:!0}),await writeFile(target,contents)}}return loadRuntimeSchemaFromOptionalFiles(configurationRoot,schema)}async function loadGuardedRuntimeSchema(pmRoot,schemaSettings){await stat(pmRoot);const root=await mkdtemp(path.join(tmpdir(),"pm-schema-plan-"));try{const resolvedRoot=await realpath(pmRoot);return await stageGuardedSchemaSections(resolvedRoot,path.join(root,"configuration"),schemaSettings)}catch(error){throw await isDisappearingPreviewPath(error)?previewSnapshotChangedError():error}finally{await rm(root,{recursive:!0,force:!0})}}async function resolvePreviewStorage(root,configurationRoot,registrations){const configuration=new Map,rawSettings=await readPreviewConfiguration(root,SETTINGS_FILENAME);configuration.set(SETTINGS_FILENAME,rawSettings);let parsed;try{parsed=JSON.parse(rawSettings??"null")}catch{parsed=null}const validated=validateSettings(parsed),settings=validated.success?validated.data:void 0,loaded=await stageGuardedSchemaSections(root,configurationRoot,settings?.schema,configuration),schema=loaded.schema,sessionPath=path.relative(root,getSessionStatePath(root));configuration.set(sessionPath,await readPreviewConfiguration(root,sessionPath));const registry=resolveItemTypeRegistry({...SETTINGS_DEFAULTS,item_types:{definitions:[...settings?.item_types?.definitions??[],...loaded.type_definitions_from_file??[]]}},registrations),ownedPaths=resolveWorkspaceRoot(root)===root?[...PM_REQUIRED_SUBDIRS.filter(Boolean),SETTINGS_FILENAME,PM_CONTEXT_INTENTS_FILE,"transactions",...registry.folders,...configuration.keys()].map(entry=>path.normalize(entry)):void 0,stagedSettings=settings===void 0?void 0:JSON.stringify({...parsed,schema:{...settings.schema,files:schema.files}});return{configuration,ownedPaths,stagedSettings,registryFolders:registry.folders}}async function stagePreviewTracker(sourceRoot,stagedRoot,registrations){await stat(sourceRoot);try{const resolvedRoot=await realpath(sourceRoot),storage=await resolvePreviewStorage(resolvedRoot,path.join(path.dirname(stagedRoot),"configuration"),registrations),retainedPaths=[...storage.configuration.keys(),...storage.registryFolders].map(entry=>path.normalize(entry)),sourceFingerprint=await previewTrackerFingerprint(resolvedRoot,storage.ownedPaths,retainedPaths);await cp(resolvedRoot,stagedRoot,{recursive:!0,dereference:!1,filter:async source=>includePreviewPath(resolvedRoot,source,storage.ownedPaths,retainedPaths)?(await previewEntryStat(resolvedRoot,source),!0):!1});const[currentFingerprint,stagedFingerprint]=await Promise.all([previewTrackerFingerprint(resolvedRoot,storage.ownedPaths,retainedPaths),previewTrackerFingerprint(stagedRoot,storage.ownedPaths,retainedPaths)]);if(sourceFingerprint!==currentFingerprint||sourceFingerprint!==stagedFingerprint)throw previewSnapshotChangedError();for(const[relative,contents]of storage.configuration)if(await readPreviewConfiguration(stagedRoot,relative)!==contents)throw previewSnapshotChangedError();storage.stagedSettings!==void 0&&await writeFile(path.join(stagedRoot,SETTINGS_FILENAME),storage.stagedSettings)}catch(error){throw await isDisappearingPreviewPath(error)?previewSnapshotChangedError():error}}async function previewItemMutations(options){const identity=validateWorkspaceTransactionIdentity(options),mutations=[...options.mutations];assertValidBulkMutations(mutations);const registrations=getActiveExtensionRegistrations(),root=await mkdtemp(path.join(tmpdir(),"pm-transaction-preview-")),stagedRoot=path.join(root,"tracker");try{await stagePreviewTracker(identity.pmRoot,stagedRoot,registrations);let validated=!1;const warnings=[];return await runWithActiveExtensions({path:stagedRoot,noExtensions:!0},async()=>{setActiveExtensionRegistrations(registrations);const config={...identity,pmRoot:stagedRoot,createCompensation:"close",uniqueIndex:createUniqueKeyIndex(stagedRoot)},steps=mutations.map((mutation,index)=>{const step=buildStepForMutation({...config,onCreateWarnings:(id,messages)=>{messages.length>0&&warnings.push({index,id,op:"create",warnings:messages})}},mutation,index);return{...step,inspect:()=>validateMutationOperation(mutation,index,()=>step.inspect()),prepareCompensation:()=>validateMutationOperation(mutation,index,async()=>step.prepareCompensation?.()),apply:()=>validateMutationOperation(mutation,index,()=>step.apply())}});await commitWorkspaceTransaction({...identity,pmRoot:stagedRoot,steps,onTransition:({transition})=>{transition==="committed"&&(validated=!0)}})}),{validated,state:validated?"staged_snapshot":"replayed_committed_plan",warnings,unresolved_commit_constraints:["concurrent_tracker_changes","extension_mutation_guards_and_hooks","derived_extension_dependencies_excluded"]}}finally{await rm(root,{recursive:!0,force:!0})}}async function commitItemMutations(options){const mutations=[...options.mutations];assertValidBulkMutations(mutations);const createCompensation=options.createCompensation??"close";if(!["close","delete"].includes(createCompensation))throw new TypeError("Bulk item transaction createCompensation must be close or delete");const stepConfig={pmRoot:options.pmRoot,author:options.author,transactionId:options.transactionId,createCompensation,uniqueIndex:createUniqueKeyIndex(options.pmRoot)},committed=await commitWorkspaceTransaction({pmRoot:options.pmRoot,transactionId:options.transactionId,author:options.author,steps:mutations.map((mutation,index)=>buildStepForMutation(stepConfig,mutation,index)),...options.lockTtlSeconds===void 0?{}:{lockTtlSeconds:options.lockTtlSeconds},...options.lockWaitMs===void 0?{}:{lockWaitMs:options.lockWaitMs},...options.onTransition===void 0?{}:{onTransition:options.onTransition}}),results={};for(const[index,mutation]of mutations.entries()){const stepId=deriveStepId(mutation,index),value=committed.results[stepId];results[deriveOutcomeKey(mutation,index)]=value}return{transactionId:committed.transactionId,status:"committed",recovered:committed.recovered,results}}function buildItemCompletionMutations(options){const mutations=[];return options.evidence!==void 0&&Object.keys(options.evidence).length>0&&mutations.push({op:"update",id:options.id,options:options.evidence}),mutations.push({op:"close",id:options.id,reason:options.reason,...options.closeOptions===void 0?{}:{options:options.closeOptions}},{op:"release",id:options.id,...options.releaseOptions===void 0?{}:{options:options.releaseOptions}}),mutations}function commitItemCompletion(options){return commitItemMutations({pmRoot:options.pmRoot,transactionId:options.transactionId,author:options.author,mutations:buildItemCompletionMutations(options),...options.lockTtlSeconds===void 0?{}:{lockTtlSeconds:options.lockTtlSeconds},...options.lockWaitMs===void 0?{}:{lockWaitMs:options.lockWaitMs},...options.onTransition===void 0?{}:{onTransition:options.onTransition}})}const _testOnlyItemTransaction={buildCreateStep,bulkHistoryMarker,compensateByRestore,deriveStepId,isUpdateMarkerApplied,readItemSnapshot};export{_testOnlyItemTransaction,buildItemCompletionMutations,commitItemCompletion,commitItemMutations,listUpsertKeyCandidates,loadGuardedRuntimeSchema,previewItemMutations,resolveTransactionSchema};
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]="49806fc6-ff49-5b67-9b3f-c182ace00c20")}catch{}})();import crypto from"node:crypto";import{runGet}from"./query/get.js";import{constants}from"node:fs";import{isFileMissingError,readRegularFile,transactionPreviewNonRegularFileError}from"../core/fs/fs-utils.js";import{cp,lstat,mkdir,mkdtemp,open,readdir,realpath,rm,stat,writeFile}from"node:fs/promises";import{tmpdir}from"node:os";import{getActiveExtensionRegistrations,setActiveExtensionRegistrations}from"../core/extensions/index.js";import path from"node:path";import{transferMutationStdinTokenPolicy}from"../core/item/parse.js";import{EXIT_CODE,PM_REQUIRED_SUBDIRS,SETTINGS_DEFAULTS,SETTINGS_FILENAME}from"../core/shared/constants.js";import{resolveItemTypeRegistry}from"../core/item/type-registry.js";import{listAllItemMetadataLight}from"../core/store/item-store.js";import{runWithItemMutationPrecondition}from"../core/store/item-mutation-precondition.js";import{hashDocument,hashHistoryStream}from"../core/history/history.js";import{historyVersionOffset}from"../core/history/version-address.js";import{isConfigurationOnlySettingsRead,readSettings}from"../core/store/settings.js";import{DEFAULT_RUNTIME_SCHEMA_FILE_PATHS,filePathForSchemaSection,loadRuntimeSchemaFromOptionalFiles,normalizeRuntimeSchemaSettings}from"../core/schema/runtime-schema.js";import{validateSettings}from"../core/store/settings-validator.js";import{resolveWorkspaceRoot}from"../core/store/paths.js";import{getSessionStatePath}from"../core/session/session-state.js";import{PmCliError}from"../core/shared/errors.js";import{stableUpsertValue}from"./structured-mutations.js";import{stableStringify}from"../core/shared/serialization.js";import{assertMutationOptionValueTypes}from"./lifecycle/mutation-option-validation.js";import{readHistoryEntries}from"./history-read.js";import{PM_CONTEXT_INTENTS_FILE}from"./context-intent-runtime.js";import{close,create,deleteItem,get,release,restore,update,runWithActiveExtensions}from"./runtime.js";import{commitWorkspaceTransaction,abandonWorkspaceTransaction,readWorkspaceTransaction,workspaceTransactionPlanDigest,validateWorkspaceTransactionIdentity}from"./workspace-transaction.js";async function resolveTransactionSchema(pmRoot,settings){if(!isConfigurationOnlySettingsRead(pmRoot))return{schema:normalizeRuntimeSchemaSettings(settings.schema),typeDefinitionsFromFile:[]};const loaded=await loadGuardedRuntimeSchema(pmRoot,settings.schema);return{schema:loaded.schema,typeDefinitionsFromFile:loaded.type_definitions_from_file??[]}}async function listUpsertKeyCandidates(pmRoot,settings,schemaContext,key){const typeRegistry=resolveItemTypeRegistry({...settings,item_types:{...settings.item_types,definitions:[...settings.item_types?.definitions??[],...schemaContext.typeDefinitionsFromFile]}},getActiveExtensionRegistrations());return(await listAllItemMetadataLight(pmRoot,settings.item_format,typeRegistry.type_to_folder,void 0,schemaContext.schema)).flatMap(item=>{const value=item[key];return value==null?[]:[{id:item.id,value}]})}function createUniqueKeyIndex(pmRoot){const scans=new Map,scan=async key=>{const settings=await readSettings(pmRoot),schemaContext=await resolveTransactionSchema(pmRoot,settings),byValue=new Map;for(const candidate of await listUpsertKeyCandidates(pmRoot,settings,schemaContext,key)){const stable=stableUpsertValue(candidate.value);byValue.set(stable,[...byValue.get(stable)??[],candidate.id])}return byValue};return{lookup(key){const pending=scans.get(key)??scan(key);return scans.set(key,pending),pending},async recordCreate(item){for(const[key,pending]of scans){const value=item[key];if(value==null)continue;const byValue=await pending,stable=stableUpsertValue(value);byValue.set(stable,[...byValue.get(stable)??[],String(item.id)])}},invalidate(){scans.clear()}}}async function assertUniqueKeyFree(index,unique){const stable=stableUpsertValue(unique.value),existing=(await index.lookup(unique.key)).get(stable)??[];if(existing.length!==0)throw new PmCliError(`Upsert key "${unique.key}" value ${JSON.stringify(stable)} now matches existing item ${existing.join(", ")}; the plan was resolved before it existed.`,EXIT_CODE.CONFLICT,{code:"upsert_key_conflict",required:"Re-plan the document so the row updates the existing item instead of creating a duplicate.",why:"Keyed upsert is resolved before the writer lock, so every remaining create is re-checked under the lock; concurrent imports therefore cannot create two items for one key value.",nextSteps:["Re-run pm item mutate with the same document and --upsert-key; the re-plan turns the row into an update of the existing item.","Inspect the existing item first when its content should win over the document row."]})}function assertUpsertMatchCurrent(document,id,match){const current=document.metadata[match.key],expected=stableUpsertValue(match.value);if(stableUpsertValue(current)!==expected)throw new PmCliError(`Item ${id} no longer carries upsert key "${match.key}" value ${JSON.stringify(expected)}; the plan selected it before the key changed.`,EXIT_CODE.CONFLICT,{code:"upsert_match_changed",required:"Re-plan the document so the row is resolved against the current key values.",why:"Keyed upsert selects its target before the writer lock, so the update re-reads the key under the lock instead of updating a mismatched item blindly.",nextSteps:["Re-run pm item mutate with the same document and --upsert-key; the re-plan creates or re-targets the row from the current key values."]})}function isValidUniqueKey(value){if(value===null||typeof value!="object"||Array.isArray(value))return!1;const candidate=value;return typeof candidate.key=="string"&&candidate.key.trim().length>0&&candidate.value!==void 0&&candidate.value!==null}function mergeTransactionMutationOptions(source,additions){const merged={...source,...additions};return source===void 0?merged:transferMutationStdinTokenPolicy(source,merged)}async function readItemSnapshot(pmRoot,id){try{const item=(await get(id,{},{pmRoot})).item;return{id:item.id,closedAt:item.closed_at,updatedAt:item.updated_at,assignee:item.assignee,claimPrincipal:item.claim_principal}}catch(error){if(error instanceof PmCliError&&error.exitCode===EXIT_CODE.NOT_FOUND)return;throw error}}function deriveStepId(mutation,index){const sanitizedTarget=mutation.id.replaceAll(/[^a-zA-Z0-9._-]/gu,"_"),fingerprint=crypto.createHash("sha256").update(stableStringify(mutation)).digest("hex").slice(0,12);return`${index+1}-${mutation.op}-${sanitizedTarget}-${fingerprint}`}function deriveOutcomeKey(mutation,index){const sanitizedTarget=mutation.id.replaceAll(/[^a-zA-Z0-9._-]/gu,"_");return`${index+1}-${mutation.op}-${sanitizedTarget}`}function bulkHistoryMarker(transactionId,stepId,phase){return`bulk-item-transaction ${transactionId} ${stepId} ${phase}`}async function isUpdateMarkerApplied(pmRoot,canonicalId,transactionId,stepId){const entries=await readHistoryEntries(path.join(pmRoot,"history",`${canonicalId}.jsonl`),canonicalId),applyMarker=bulkHistoryMarker(transactionId,stepId,"apply"),compensateMarker=bulkHistoryMarker(transactionId,stepId,"compensate");for(let index=entries.length-1;index>=0;index-=1){const message=entries[index].message;if(message===applyMarker)return!0;if(message===compensateMarker)return!1}return!1}async function prepareRestoreCompensation(pmRoot,mutation){const snapshot=await readItemSnapshot(pmRoot,mutation.id);if(snapshot?.updatedAt===void 0)throw new PmCliError(`Bulk ${mutation.op} target ${mutation.id} does not exist or has no restorable version`,EXIT_CODE.NOT_FOUND);const history=await readHistoryEntries(path.join(pmRoot,"history",`${snapshot.id}.jsonl`),snapshot.id);if(history.length===0)throw new PmCliError(`Bulk ${mutation.op} target ${mutation.id} has no restorable history`,EXIT_CODE.NOT_FOUND);return{target_updated_at:snapshot.updatedAt,target_version:String(historyVersionOffset(history)+history.length),target_history_hash:hashHistoryStream(history),target_history_length:history.length}}function partialMutationError(config,itemId,stepId){return new PmCliError(`Transaction ${config.transactionId} cannot safely compensate incomplete step ${stepId}; review item ${itemId} history before recovery.`,EXIT_CODE.CONFLICT,{code:"transaction_partial_mutation",item_id:itemId,required:"Reconcile the item's partial or intervening changes before resuming this transaction.",why:"The retained history does not prove exclusive ownership of the changes to undo. The journal remains compensating instead of claiming a rollback or overwriting another writer.",nextSteps:[`Run pm history ${itemId} and inspect this transaction's retained compensation data before explicitly restoring or reconciling the item.`]})}function isTransactionHistoryEntry(entry,transactionId){const prefix=`bulk-item-transaction ${transactionId} `;return[entry.message,entry.context?.item_transaction_step].some(value=>typeof value=="string"&&value.startsWith(prefix))}function hasOwnedCompensationEffects(history,proof,identity){const{expectedHistory,length,version}=proof;if(hashHistoryStream(history)===expectedHistory)return!1;if(typeof length!="number"||!Number.isSafeInteger(length)||length<1||hashHistoryStream(history.slice(0,length))!==expectedHistory||version!==String(historyVersionOffset(history)+length))throw partialMutationError(identity,identity.itemId,identity.stepId);const marker=bulkHistoryMarker(identity.transactionId,identity.stepId,"apply"),changes=history.slice(length),isOwned=entry=>entry.message===marker||entry.context?.item_transaction_step===marker,compensationMarker=bulkHistoryMarker(identity.transactionId,identity.stepId,"compensate");if(changes.filter(entry=>isOwned(entry)||entry.message===compensationMarker).at(-1)?.message===compensationMarker)return!1;const owned=changes.filter(isOwned);if(owned.length===0)return!1;const siblingsRestored=history.at(-1).after_hash===owned.at(-1).after_hash&&changes.every(entry=>isTransactionHistoryEntry(entry,identity.transactionId));if(owned.length!==changes.length&&!siblingsRestored)throw partialMutationError(identity,identity.itemId,identity.stepId);return!0}async function compensateByRestore(config,itemId,stepId,data){const receipt=data!==null&&typeof data=="object"&&!Array.isArray(data)?data:void 0;if(receipt===void 0||typeof receipt.target_updated_at!="string")return;const target=receipt.target_updated_at,current=await readItemSnapshot(config.pmRoot,itemId);if(current===void 0)return;const history=await readHistoryEntries(path.join(config.pmRoot,"history",`${current.id}.jsonl`),current.id),expectedHistory=receipt.target_history_hash;if(typeof expectedHistory=="string"){if(!hasOwnedCompensationEffects(history,{expectedHistory,length:receipt.target_history_length,version:receipt.target_version},{...config,itemId:current.id,stepId}))return}else{if(current.updatedAt===target)return;if(!await isUpdateMarkerApplied(config.pmRoot,current.id,config.transactionId,stepId))throw partialMutationError(config,current.id,stepId)}const applyRestore=()=>restore(itemId,typeof receipt.target_version=="string"?receipt.target_version:target,{force:!0,author:config.author,message:bulkHistoryMarker(config.transactionId,stepId,"compensate")},{pmRoot:config.pmRoot});await runWithItemMutationPrecondition({pmRoot:config.pmRoot,id:current.id,validate:document=>{if(hashDocument(document)!==history.at(-1).after_hash)throw partialMutationError(config,current.id,stepId)}},applyRestore)}function buildCreateStep(config,mutation,stepId){return{id:stepId,async inspect(){const snapshot=await readItemSnapshot(config.pmRoot,mutation.id);if(snapshot===void 0)return{state:"pending"};if(snapshot.closedAt!==void 0){const history=await readHistoryEntries(path.join(config.pmRoot,"history",`${snapshot.id}.jsonl`),snapshot.id),reason=`Compensated: interrupted bulk transaction ${config.transactionId}`;if(history.filter(entry=>entry.op==="close").at(-1)?.patch.some(change=>change.op==="add"||change.op==="replace"?change.path==="/metadata/close_reason"&&change.value===reason:!1)??!1)throw new PmCliError(`Created item ${snapshot.id} remains closed by transaction compensation; explicitly reopen or reconcile it before retrying.`,EXIT_CODE.CONFLICT,{code:"transaction_create_compensated",item_id:snapshot.id,required:"Review the compensated item and explicitly reopen it before retrying the same document.",why:"This item's latest closure belongs to transaction compensation. Automatically reopening it could overwrite later lifecycle decisions.",nextSteps:[`Run pm item reopen ${snapshot.id} "Retry compensated creation" after reviewing its history, then retry the transaction.`]})}return{state:"applied",result:{id:snapshot.id,op:"create"}}},async apply(){mutation.unique!==void 0&&await assertUniqueKeyFree(config.uniqueIndex,mutation.unique);const created=await create(mergeTransactionMutationOptions(mutation.options,{author:config.author,id:mutation.id,message:bulkHistoryMarker(config.transactionId,stepId,"apply")}),{pmRoot:config.pmRoot}),createdItem=created.item;return config.onCreateWarnings?.(String(createdItem.id),created.warnings),await config.uniqueIndex.recordCreate(createdItem),{id:String(createdItem.id),op:"create"}},async compensate(){await compensateCreatedItem(config,mutation.id,stepId)}}}async function compensateCreatedItem(config,id,stepId){const snapshot=await readItemSnapshot(config.pmRoot,id);if(snapshot===void 0||config.createCompensation==="close"&&snapshot.closedAt!==void 0)return;const history=await readHistoryEntries(path.join(config.pmRoot,"history",`${snapshot.id}.jsonl`),snapshot.id),applyMarker=bulkHistoryMarker(config.transactionId,stepId,"apply"),compensationMarker=bulkHistoryMarker(config.transactionId,stepId,"compensate"),latestMarker=history.filter(entry=>entry.message===applyMarker||entry.message===compensationMarker).at(-1);if(latestMarker?.message!==compensationMarker){if(latestMarker===void 0||!history.every(entry=>isTransactionHistoryEntry(entry,config.transactionId)))throw partialMutationError(config,snapshot.id,stepId);await runWithItemMutationPrecondition({pmRoot:config.pmRoot,id:snapshot.id,validate:document=>{if(hashDocument(document)!==history.at(-1).after_hash)throw partialMutationError(config,snapshot.id,stepId)}},async()=>{const options={force:!0,author:config.author,message:compensationMarker};config.createCompensation==="delete"?await deleteItem(id,options,{pmRoot:config.pmRoot}):await close(id,`Compensated: interrupted bulk transaction ${config.transactionId}`,options,{pmRoot:config.pmRoot})})}}function buildUpdateStep(config,mutation,stepId){return{id:stepId,compensatePending:!0,async inspect(){const snapshot=await readItemSnapshot(config.pmRoot,mutation.id);return snapshot===void 0?{state:"pending"}:await isUpdateMarkerApplied(config.pmRoot,snapshot.id,config.transactionId,stepId)?{state:"applied",result:{id:snapshot.id,op:"update"}}:{state:"pending"}},async prepareCompensation(){return prepareRestoreCompensation(config.pmRoot,mutation)},async apply(){const applyUpdate=()=>update(mutation.id,mergeTransactionMutationOptions(mutation.options,{author:config.author,message:bulkHistoryMarker(config.transactionId,stepId,"apply")}),{pmRoot:config.pmRoot}),match=mutation.match;let currentMatch=match;const updatedItem=(await runWithItemMutationPrecondition({pmRoot:config.pmRoot,id:String((await get(mutation.id,{},{pmRoot:config.pmRoot})).item.id),validate:document=>{currentMatch!==void 0&&assertUpsertMatchCurrent(document,mutation.id,currentMatch)},committed:document=>{match!==void 0&&(currentMatch={key:match.key,value:structuredClone(document.metadata[match.key])})},historyContext:{item_transaction_step:bulkHistoryMarker(config.transactionId,stepId,"apply")}},applyUpdate)).item;return config.uniqueIndex.invalidate(),{id:String(updatedItem.id),op:"update"}},async compensate(data){await compensateByRestore(config,mutation.id,stepId,data)}}}function buildCloseStep(config,mutation,stepId){return{id:stepId,async inspect(){const snapshot=await readItemSnapshot(config.pmRoot,mutation.id);return snapshot===void 0?{state:"pending"}:await isUpdateMarkerApplied(config.pmRoot,snapshot.id,config.transactionId,stepId)?{state:"applied",result:{id:snapshot.id,op:"close"}}:snapshot.closedAt===void 0?{state:"pending"}:{state:"applied",result:{id:snapshot.id,op:"close"}}},async prepareCompensation(){return prepareRestoreCompensation(config.pmRoot,mutation)},async apply(){const closedItem=(await close(mutation.id,mutation.reason,mergeTransactionMutationOptions(mutation.options,{author:config.author,message:bulkHistoryMarker(config.transactionId,stepId,"apply")}),{pmRoot:config.pmRoot})).item;return config.uniqueIndex.invalidate(),{id:String(closedItem.id),op:"close"}},async compensate(data){await compensateByRestore(config,mutation.id,stepId,data)}}}function buildReleaseStep(config,mutation,stepId){return{id:stepId,async inspect(){const snapshot=await readItemSnapshot(config.pmRoot,mutation.id);return snapshot===void 0?{state:"pending"}:await isUpdateMarkerApplied(config.pmRoot,snapshot.id,config.transactionId,stepId)?{state:"applied",result:{id:snapshot.id,op:"release"}}:snapshot.assignee!==void 0||snapshot.claimPrincipal!==void 0?{state:"pending"}:{state:"applied",result:{id:snapshot.id,op:"release"}}},async prepareCompensation(){return prepareRestoreCompensation(config.pmRoot,mutation)},async apply(){const releasedItem=(await release(mutation.id,mergeTransactionMutationOptions(mutation.options,{author:config.author,message:bulkHistoryMarker(config.transactionId,stepId,"apply")}),{pmRoot:config.pmRoot})).item;return config.uniqueIndex.invalidate(),{id:String(releasedItem.id),op:"release"}},async compensate(data){await compensateByRestore(config,mutation.id,stepId,data)}}}function buildStepForMutation(config,mutation,index){const stepId=deriveStepId(mutation,index);switch(mutation.op){case"create":return buildCreateStep(config,mutation,stepId);case"update":return buildUpdateStep(config,mutation,stepId);case"close":return buildCloseStep(config,mutation,stepId);case"release":return buildReleaseStep(config,mutation,stepId)}}function assertValidBulkMutation(mutation,index){if(mutation===null||typeof mutation!="object"||Array.isArray(mutation))throw new TypeError(`Bulk mutation ${index+1} must be an object`);if(!["create","update","close","release"].includes(mutation.op))throw new TypeError(`Bulk mutation ${index+1} op must be create, update, close, or release`);if(typeof mutation.id!="string"||mutation.id.trim().length===0)throw new TypeError(`Bulk mutation ${index+1} requires a non-empty id`);if(mutation.op==="close"&&(typeof mutation.reason!="string"||mutation.reason.trim().length===0))throw new TypeError(`Bulk close mutation ${index+1} requires a non-empty reason`);if(mutation.op==="create"&&mutation.unique!==void 0&&!isValidUniqueKey(mutation.unique))throw new TypeError(`Bulk create mutation ${index+1} unique must be an object with a non-empty key and a value`);if(mutation.op==="update"&&mutation.match!==void 0&&!isValidUniqueKey(mutation.match))throw new TypeError(`Bulk update mutation ${index+1} match must be an object with a non-empty key and a value`);assertMutationOptionValueTypes(mutation.options,mutation.op,index)}function assertValidBulkMutations(mutations){if(mutations.length===0)throw new TypeError("Bulk item transaction requires at least one mutation");const keys=new Map;for(const[index,mutation]of mutations.entries()){if(assertValidBulkMutation(mutation,index),mutation.op!=="create"||mutation.unique===void 0)continue;const{key,value}=mutation.unique,values=keys.get(key)??new Map,stable=stableUpsertValue(value),previous=values.get(stable);if(previous!==void 0)throw new PmCliError(`Bulk create mutations ${previous+1} and ${index+1} share the upsert key value ${JSON.stringify(stable)} for "${key}".`,EXIT_CODE.USAGE,{code:"upsert_key_duplicate",required:"Each create must carry a distinct unique key value within one batch.",why:"Direct SDK batches must preserve the same uniqueness invariant as planned document rows."});values.set(stable,index),keys.set(key,values)}}function snapshotBulkMutations(input){const mutations=[...input];return assertValidBulkMutations(mutations),mutations.map(mutation=>{const snapshot=structuredClone(mutation);return mutation.options!==void 0&&snapshot.options!==void 0&&transferMutationStdinTokenPolicy(mutation.options,snapshot.options),snapshot})}function previewClockFields(value,pointer=""){return value===null||typeof value!="object"?[]:Object.entries(value).flatMap(([key,nested])=>{const current=`${pointer}/${key.replaceAll("~","~0").replaceAll("/","~1")}`;return/^(created_at|updated_at|closed_at|completed_at|timestamp)$/u.test(key)?[current]:previewClockFields(nested,current)})}async function validateMutationOperation(mutation,index,run){try{return await run()}catch(error){throw error instanceof PmCliError?new PmCliError(error.message,error.exitCode,{...error.context,transaction_operation:{index,op:mutation.op,id:mutation.id}}):error}}function includePreviewPath(root,file,ownedPaths,retainedPaths){const relative=path.relative(root,file),segments=relative.split(path.sep);return segments[0]==="extensions"&&segments[2]==="node_modules"&&!retainedPaths.some(retained=>relative===retained||relative.startsWith(`${retained}${path.sep}`)||retained.startsWith(`${relative}${path.sep}`))?!1:["locks","runtime","search"].includes(relative.split(path.sep)[0])?retainedPaths.some(retained=>relative===retained||relative.startsWith(`${retained}${path.sep}`)||retained.startsWith(`${relative}${path.sep}`)):relative===""||ownedPaths===void 0||ownedPaths.some(owned=>relative===owned||relative.startsWith(`${owned}${path.sep}`)||owned.startsWith(`${relative}${path.sep}`))}async function previewEntryStat(root,file){const entry=await lstat(file);if(entry.isSymbolicLink())await stat(file);else if(entry.isDirectory()||entry.isFile())return entry;throw transactionPreviewNonRegularFileError(path.relative(root,file))}async function previewFileDigest(root,file){const handle=await open(file,constants.O_RDONLY|constants.O_NOFOLLOW|constants.O_NONBLOCK);try{const entry=await handle.stat();if(!entry.isFile())throw transactionPreviewNonRegularFileError(path.relative(root,file));const contents=crypto.createHash("sha256");if(entry.size>0)for await(const chunk of handle.createReadStream({highWaterMark:64*1024,end:entry.size-1,autoClose:!1}))contents.update(chunk);return contents.digest()}finally{await handle.close()}}async function previewTrackerFingerprint(root,ownedPaths,retainedPaths){const fingerprint=crypto.createHash("sha256");async function visit(directory){for(const name of(await readdir(directory)).sort()){const file=path.join(directory,name);includePreviewPath(root,file,ownedPaths,retainedPaths)&&((await previewEntryStat(root,file)).isDirectory()?await visit(file):(fingerprint.update(JSON.stringify(path.relative(root,file))),fingerprint.update(await previewFileDigest(root,file))))}}return await visit(root),fingerprint.digest("hex")}function previewSnapshotChangedError(){return new PmCliError("Tracker changed while preparing the transaction preview; retry against stable state.",EXIT_CODE.CONFLICT,{code:"transaction_preview_snapshot_changed"})}async function isDisappearingPreviewPath(error){if(!isFileMissingError(error))return!1;const file=error.path;if(typeof file!="string")return!1;const original=path.resolve(file);let candidate=original;for(;;)try{const entry=await lstat(candidate);return candidate!==original&&entry.isDirectory()}catch(lookupError){if(!isFileMissingError(lookupError))return!1;const parent=path.dirname(candidate);if(parent===candidate)return!1;candidate=parent}}async function readPreviewConfiguration(root,relative){const file=path.join(root,relative);try{let current=root;for(const component of relative.split(path.sep).slice(0,-1))current=path.join(current,component),await previewEntryStat(root,current);if(!(await previewEntryStat(root,file)).isFile())throw transactionPreviewNonRegularFileError(relative);return await readRegularFile(file,transactionPreviewNonRegularFileError(relative))}catch(error){if(await isDisappearingPreviewPath(error))return;throw error}}async function stageGuardedSchemaSections(root,configurationRoot,schemaSettings,configuration){const schema=normalizeRuntimeSchemaSettings(schemaSettings);for(const[section,configuredPath]of Object.entries(schema.files)){const relative=path.relative(root,filePathForSchemaSection(root,configuredPath,DEFAULT_RUNTIME_SCHEMA_FILE_PATHS[section]));if(relative===""||!path.resolve(root,relative).startsWith(path.join(root,path.sep)))throw new PmCliError("Transaction preview requires schema files inside the selected tracker root; relocate the configured schema file before retrying.",EXIT_CODE.USAGE,{code:"transaction_preview_external_schema",field:`schema.files.${section}`});schema.files[section]=relative;const contents=await readPreviewConfiguration(root,relative);if(configuration?.set(relative,contents),contents!==void 0){const target=path.join(configurationRoot,relative);await mkdir(path.dirname(target),{recursive:!0}),await writeFile(target,contents)}}return loadRuntimeSchemaFromOptionalFiles(configurationRoot,schema)}async function loadGuardedRuntimeSchema(pmRoot,schemaSettings){await stat(pmRoot);const root=await mkdtemp(path.join(tmpdir(),"pm-schema-plan-"));try{const resolvedRoot=await realpath(pmRoot);return await stageGuardedSchemaSections(resolvedRoot,path.join(root,"configuration"),schemaSettings)}catch(error){throw await isDisappearingPreviewPath(error)?previewSnapshotChangedError():error}finally{await rm(root,{recursive:!0,force:!0})}}async function resolvePreviewStorage(root,configurationRoot,registrations){const configuration=new Map,rawSettings=await readPreviewConfiguration(root,SETTINGS_FILENAME);configuration.set(SETTINGS_FILENAME,rawSettings);let parsed;try{parsed=JSON.parse(rawSettings??"null")}catch{parsed=null}const validated=validateSettings(parsed),settings=validated.success?validated.data:void 0,loaded=await stageGuardedSchemaSections(root,configurationRoot,settings?.schema,configuration),schema=loaded.schema,sessionPath=path.relative(root,getSessionStatePath(root));configuration.set(sessionPath,await readPreviewConfiguration(root,sessionPath));const registry=resolveItemTypeRegistry({...SETTINGS_DEFAULTS,item_types:{definitions:[...settings?.item_types?.definitions??[],...loaded.type_definitions_from_file??[]]}},registrations),ownedPaths=resolveWorkspaceRoot(root)===root?[...PM_REQUIRED_SUBDIRS.filter(Boolean),SETTINGS_FILENAME,PM_CONTEXT_INTENTS_FILE,"transactions",...registry.folders,...configuration.keys()].map(entry=>path.normalize(entry)):void 0,stagedSettings=settings===void 0?void 0:JSON.stringify({...parsed,schema:{...settings.schema,files:schema.files}});return{configuration,ownedPaths,stagedSettings,registryFolders:registry.folders}}async function stagePreviewTracker(sourceRoot,stagedRoot,registrations){await stat(sourceRoot);try{const resolvedRoot=await realpath(sourceRoot),storage=await resolvePreviewStorage(resolvedRoot,path.join(path.dirname(stagedRoot),"configuration"),registrations),retainedPaths=[...storage.configuration.keys(),...storage.registryFolders].map(entry=>path.normalize(entry)),sourceFingerprint=await previewTrackerFingerprint(resolvedRoot,storage.ownedPaths,retainedPaths);await cp(resolvedRoot,stagedRoot,{recursive:!0,dereference:!1,filter:async source=>includePreviewPath(resolvedRoot,source,storage.ownedPaths,retainedPaths)?(await previewEntryStat(resolvedRoot,source),!0):!1});const[currentFingerprint,stagedFingerprint]=await Promise.all([previewTrackerFingerprint(resolvedRoot,storage.ownedPaths,retainedPaths),previewTrackerFingerprint(stagedRoot,storage.ownedPaths,retainedPaths)]);if(sourceFingerprint!==currentFingerprint||sourceFingerprint!==stagedFingerprint)throw previewSnapshotChangedError();for(const[relative,contents]of storage.configuration)if(await readPreviewConfiguration(stagedRoot,relative)!==contents)throw previewSnapshotChangedError();storage.stagedSettings!==void 0&&await writeFile(path.join(stagedRoot,SETTINGS_FILENAME),storage.stagedSettings)}catch(error){throw await isDisappearingPreviewPath(error)?previewSnapshotChangedError():error}}async function previewItemMutations(options){const identity=validateWorkspaceTransactionIdentity(options),mutations=snapshotBulkMutations(options.mutations),registrations=getActiveExtensionRegistrations(),root=await mkdtemp(path.join(tmpdir(),"pm-transaction-preview-")),stagedRoot=path.join(root,"tracker");try{await stagePreviewTracker(identity.pmRoot,stagedRoot,registrations);let validated=!1;const warnings=[],records=[],applied=new Set;return await runWithActiveExtensions({path:stagedRoot,noExtensions:!0},async()=>{setActiveExtensionRegistrations(registrations);const config={...identity,pmRoot:stagedRoot,createCompensation:"close",uniqueIndex:createUniqueKeyIndex(stagedRoot)},steps=mutations.map((mutation,index)=>{const step=buildStepForMutation({...config,onCreateWarnings:(id,messages)=>{messages.length>0&&warnings.push({index,id,op:"create",warnings:messages})}},mutation,index);return{...step,inspect:()=>validateMutationOperation(mutation,index,()=>step.inspect()),prepareCompensation:()=>validateMutationOperation(mutation,index,async()=>step.prepareCompensation?.()),apply:()=>validateMutationOperation(mutation,index,async()=>{const outcome=await step.apply();return applied.add(index),outcome})}});if(await commitWorkspaceTransaction({...identity,pmRoot:stagedRoot,steps,onTransition:({transition})=>{transition==="committed"&&(validated=!0)}}),validated)for(const[index,mutation]of mutations.entries()){const item=(await runGet(mutation.id,{path:stagedRoot},{full:!0})).item;records.push({index,id:String(item.id),op:mutation.op,execution:applied.has(index)?"applied":"adopted",item,commit_time_fields:previewClockFields(item)})}}),{records,validated,state:validated?"staged_snapshot":"replayed_committed_plan",warnings,unresolved_commit_constraints:["concurrent_tracker_changes","extension_mutation_guards_and_hooks","derived_extension_dependencies_excluded","generated_timestamps_and_provenance"]}}finally{await rm(root,{recursive:!0,force:!0})}}async function commitItemMutations(options){const identity=validateWorkspaceTransactionIdentity(options),mutations=snapshotBulkMutations(options.mutations),createCompensation=options.createCompensation??"close";if(!["close","delete"].includes(createCompensation))throw new TypeError("Bulk item transaction createCompensation must be close or delete");const stepConfig={...identity,createCompensation,uniqueIndex:createUniqueKeyIndex(identity.pmRoot)},committed=await commitWorkspaceTransaction({...identity,steps:mutations.map((mutation,index)=>buildStepForMutation(stepConfig,mutation,index)),recoveryData:JSON.parse(JSON.stringify({kind:"item-mutations-v1",mutations,createCompensation})),...options.lockTtlSeconds===void 0?{}:{lockTtlSeconds:options.lockTtlSeconds},...options.lockWaitMs===void 0?{}:{lockWaitMs:options.lockWaitMs},...options.onTransition===void 0?{}:{onTransition:options.onTransition}}),results={};for(const[index,mutation]of mutations.entries()){const stepId=deriveStepId(mutation,index),value=committed.results[stepId];results[deriveOutcomeKey(mutation,index)]=value}return{transactionId:committed.transactionId,status:"committed",recovered:committed.recovered,results}}function buildItemCompletionMutations(options){const mutations=[];return options.evidence!==void 0&&Object.keys(options.evidence).length>0&&mutations.push({op:"update",id:options.id,options:options.evidence}),mutations.push({op:"close",id:options.id,reason:options.reason,...options.closeOptions===void 0?{}:{options:options.closeOptions}},{op:"release",id:options.id,...options.releaseOptions===void 0?{}:{options:options.releaseOptions}}),mutations}function commitItemCompletion(options){return commitItemMutations({pmRoot:options.pmRoot,transactionId:options.transactionId,author:options.author,mutations:buildItemCompletionMutations(options),...options.lockTtlSeconds===void 0?{}:{lockTtlSeconds:options.lockTtlSeconds},...options.lockWaitMs===void 0?{}:{lockWaitMs:options.lockWaitMs},...options.onTransition===void 0?{}:{onTransition:options.onTransition}})}const _testOnlyItemTransaction={buildCreateStep,bulkHistoryMarker,compensateByRestore,deriveStepId,isUpdateMarkerApplied,readItemSnapshot};async function readItemTransaction(pmRoot,transactionId){const journal=await readWorkspaceTransaction(pmRoot,transactionId);return journal===void 0?void 0:{journal,planDigest:workspaceTransactionPlanDigest(journal)}}function recoveryItemSteps(options,journal){const data=journal.recoveryData;if(data===null||typeof data!="object"||Array.isArray(data)||data.kind!=="item-mutations-v1"||!Array.isArray(data.mutations)||!["close","delete"].includes(String(data.createCompensation)))throw new PmCliError("Transaction has no supported item recovery plan",EXIT_CODE.CONFLICT,{code:"transaction_recovery_plan_missing",required:"Resume with the original plan and its original adapter.",why:"Legacy or foreign journals cannot safely reconstruct item compensation."});const mutations=data.mutations;assertValidBulkMutations(mutations);const config={...options,createCompensation:data.createCompensation,uniqueIndex:createUniqueKeyIndex(options.pmRoot)};return mutations.map((mutation,index)=>buildStepForMutation(config,mutation,index))}async function abandonItemTransaction(options){const identity=validateWorkspaceTransactionIdentity(options),journal=await abandonWorkspaceTransaction({...options,...identity,resolveSteps:receipt=>recoveryItemSteps({...options,...identity},receipt)});return{journal,planDigest:workspaceTransactionPlanDigest(journal)}}export{_testOnlyItemTransaction,abandonItemTransaction,buildItemCompletionMutations,commitItemCompletion,commitItemMutations,listUpsertKeyCandidates,loadGuardedRuntimeSchema,previewItemMutations,readItemTransaction,resolveTransactionSchema};
2
2
  //# sourceMappingURL=item-transaction.js.map
@@ -1,4 +1,4 @@
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]="a5bdc2e7-1633-5bc8-97c7-8f6ecd253294")}catch{}})();import{assertInitializedTracker}from"../environment/tracker-preflight.js";import{EXIT_CODE,PmCliError,resolveAuthor,toItemRecord,createStdinTokenResolver,shouldResolveMutationStdinTokenField,mutateItem,resolvePmRoot,readSettings}from"../runtime-primitives.js";async function runAppend(id,options,global2){if(options.body===void 0)throw new PmCliError("Missing required --body text",EXIT_CODE.USAGE);const stdinResolver=createStdinTokenResolver(),pmRoot=resolvePmRoot(process.cwd(),global2.path);await assertInitializedTracker(pmRoot);const settings=await readSettings(pmRoot),author=resolveAuthor(options.author,settings.author_default),appended=(await stdinResolver.resolveValue(options.body,"--body",shouldResolveMutationStdinTokenField(options,"body"))).trim();if(appended.length===0)throw new PmCliError("--body text cannot be empty; append requires non-blank content and empty appends would only rewrite updated_at.",EXIT_CODE.USAGE,{code:"append_empty_body",required:"Provide non-empty body text positionally, via --body, or with - for stdin.",examples:['pm append pm-a1b2 --body "Progress note"',"pm append pm-a1b2 --body -"]});const result=await mutateItem({pmRoot,settings,id,op:"append",author,message:options.message,force:options.force,mutate(document){const spacer=document.body.trim().length>0?`
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]="28dd911b-487d-5ada-8fa5-527798ceb36e")}catch{}})();import{assertInitializedTracker}from"../environment/tracker-preflight.js";import{assertAppendMutationValues,assertMutationStringOperand}from"../runtime/mutation-value-validation.js";import{preserveSdkMutationInput}from"../../core/item/parse.js";import{EXIT_CODE,PmCliError,resolveAuthor,toItemRecord,createStdinTokenResolver,shouldResolveMutationStdinTokenField,mutateItem,resolvePmRoot,readSettings}from"../runtime-primitives.js";async function runAppend(id,options,global2){if(assertAppendMutationValues(options),assertMutationStringOperand(id,"append","id"),options=preserveSdkMutationInput(options),options.body===void 0)throw new PmCliError("Missing required --body text",EXIT_CODE.USAGE);const stdinResolver=createStdinTokenResolver(),pmRoot=resolvePmRoot(process.cwd(),global2.path);await assertInitializedTracker(pmRoot);const settings=await readSettings(pmRoot),author=resolveAuthor(options.author,settings.author_default),appended=(await stdinResolver.resolveValue(options.body,"--body",shouldResolveMutationStdinTokenField(options,"body"))).trim();if(appended.length===0)throw new PmCliError("--body text cannot be empty; append requires non-blank content and empty appends would only rewrite updated_at.",EXIT_CODE.USAGE,{code:"append_empty_body",required:"Provide non-empty body text positionally, via --body, or with - for stdin.",examples:['pm append pm-a1b2 --body "Progress note"',"pm append pm-a1b2 --body -"]});const result=await mutateItem({pmRoot,settings,id,op:"append",author,message:options.message,force:options.force,mutate(document){const spacer=document.body.trim().length>0?`
2
2
 
3
3
  `:"";return document.body=`${document.body.trimEnd()}${spacer}${appended}
4
4
  `,{changedFields:["body"]}}});return{item:toItemRecord(result.item),appended,changed_fields:result.changedFields}}export{runAppend};
@@ -0,0 +1,4 @@
1
+ /** Clone lifecycle options and opt a command adapter into CLI stdin and clear-token syntax. */
2
+ export declare function withCliMutationInput<T extends object>(options:T):T;
3
+ /** Clone decoded data and keep every sentinel spelling literal, even inside a CLI adapter. */
4
+ export declare function withLiteralMutationInput<T extends object>(options:T):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]="e363ee89-b438-5c8e-bb06-f4d05cc814cc")}catch{}})();import{markCliMutationInput,preserveLiteralMutationInput}from"../../core/item/literal-mutation-input.js";import{preserveMutationStdinTokenLiterals,transferMutationStdinTokenPolicy}from"../../core/item/parse.js";function withCliMutationInput(options){const cloned={...options};for(const[key,value]of Object.entries(cloned))Array.isArray(value)&&Reflect.set(cloned,key,[...value]);return markCliMutationInput(transferMutationStdinTokenPolicy(options,cloned))}function withLiteralMutationInput(options){return preserveLiteralMutationInput(preserveMutationStdinTokenLiterals(transferMutationStdinTokenPolicy(options,{...options})))}export{withCliMutationInput,withLiteralMutationInput};
2
+ //# sourceMappingURL=cli-input.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]="06c5404e-a36d-5a81-ab4d-05b6829823ce")}catch{}})();import{assertInitializedTracker}from"../environment/tracker-preflight.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{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){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){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/--clear-* directives cannot satisfy required options`,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 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){const warningSuffix=handlerResult.warnings.length>0?` (${handlerResult.warnings.join(", ")})`:"";throw new PmCliError(`Unable to resolve template "${templateName}" via templates package. Run "pm templates show ${templateName}" for details.${warningSuffix}`,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});if(typeof params.explicitId!="string")throw new PmCliError("--id must be a string",EXIT_CODE.USAGE);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(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){const assertNoLegacyScalarToken=(value,optionKey)=>{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){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),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]="aa572d5e-8906-5596-a847-4cc16a4da92a")}catch{}})();import{assertInitializedTracker}from"../environment/tracker-preflight.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{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/--clear-* directives cannot satisfy required options`,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){const warningSuffix=handlerResult.warnings.length>0?` (${handlerResult.warnings.join(", ")})`:"";throw new PmCliError(`Unable to resolve template "${templateName}" via templates package. Run "pm templates show ${templateName}" for details.${warningSuffix}`,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),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};
2
2
  //# sourceMappingURL=create.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]="c22dc1f8-285a-5858-9087-17a8deed6db8")}catch{}})();import{EXIT_CODE,PmCliError}from"../runtime-primitives.js";const LEGACY_NONE_TOKENS=new Set(["none","null"]);function createLegacyNoneCollectionNormalizers(options={}){return[{optionKey:"dep",clearFlagKey:"clearDeps",valueFlag:"--dep",clearFlag:"--clear-deps",...options.depDisableFlagKey===void 0?{}:{disableFlagKey:options.depDisableFlagKey}},{optionKey:"comment",clearFlagKey:"clearComments",valueFlag:"--comment",clearFlag:"--clear-comments"},{optionKey:"note",clearFlagKey:"clearNotes",valueFlag:"--note",clearFlag:"--clear-notes"},{optionKey:"learning",clearFlagKey:"clearLearnings",valueFlag:"--learning",clearFlag:"--clear-learnings"},{optionKey:"file",clearFlagKey:"clearFiles",valueFlag:"--file",clearFlag:"--clear-files",...options.fileDisableFlagKey===void 0?{}:{disableFlagKey:options.fileDisableFlagKey}},{optionKey:"test",clearFlagKey:"clearTests",valueFlag:"--test",clearFlag:"--clear-tests",...options.testDisableFlagKey===void 0?{}:{disableFlagKey:options.testDisableFlagKey}},{optionKey:"doc",clearFlagKey:"clearDocs",valueFlag:"--doc",clearFlag:"--clear-docs",...options.docDisableFlagKey===void 0?{}:{disableFlagKey:options.docDisableFlagKey}},{optionKey:"reminder",clearFlagKey:"clearReminders",valueFlag:"--reminder",clearFlag:"--clear-reminders"},{optionKey:"event",clearFlagKey:"clearEvents",valueFlag:"--event",clearFlag:"--clear-events"},{optionKey:"typeOption",clearFlagKey:"clearTypeOptions",valueFlag:"--type-option",clearFlag:"--clear-type-options"}]}function isLegacyNoneToken(value){return value===void 0?!1:LEGACY_NONE_TOKENS.has(value.trim().toLowerCase())}function assertNoLegacyNoneToken(value,flag,replacementHint){if(!isLegacyNoneToken(value))return;const suffix=replacementHint?` ${replacementHint}`:"";throw new PmCliError(`${flag} no longer accepts "none" or "null".${suffix}`.trim(),EXIT_CODE.USAGE)}function assertNoLegacyNoneTokens(values,flag,replacementHint){if(!values||values.length===0||!values.some(value=>isLegacyNoneToken(value)))return;const suffix=replacementHint?` ${replacementHint}`:"";throw new PmCliError(`${flag} no longer accepts "none" or "null".${suffix}`.trim(),EXIT_CODE.USAGE)}function applyLegacyNoneCollectionNormalizers(normalized,definitions){for(const definition of definitions){const candidate=normalized[definition.optionKey];if(!Array.isArray(candidate)||candidate.length===0)continue;if(!candidate.every(entry=>typeof entry=="string"))throw new PmCliError(`${definition.valueFlag} entries must be strings.`,EXIT_CODE.USAGE);const entries=candidate;if(entries.some(entry=>isLegacyNoneToken(entry))){if(entries.filter(entry=>!isLegacyNoneToken(entry)).length>0)throw new PmCliError(`Cannot mix legacy clear token "none"/"null" with concrete ${definition.valueFlag} entries. Use ${definition.clearFlag} to clear or provide explicit entries.`,EXIT_CODE.USAGE);normalized[definition.optionKey]=void 0,normalized[definition.clearFlagKey]=!0,definition.disableFlagKey&&(normalized[definition.disableFlagKey]=!1)}}return normalized}export{applyLegacyNoneCollectionNormalizers,assertNoLegacyNoneToken,assertNoLegacyNoneTokens,createLegacyNoneCollectionNormalizers,isLegacyNoneToken};
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]="202cbe4e-7d36-5b12-be9d-d35608a6b36d")}catch{}})();import{EXIT_CODE,PmCliError}from"../runtime-primitives.js";import{isLiteralMutationInput}from"../../core/item/literal-mutation-input.js";const LEGACY_NONE_TOKENS=new Set(["none","null"]);function createLegacyNoneCollectionNormalizers(options={}){return[{optionKey:"dep",clearFlagKey:"clearDeps",valueFlag:"--dep",clearFlag:"--clear-deps",...options.depDisableFlagKey===void 0?{}:{disableFlagKey:options.depDisableFlagKey}},{optionKey:"comment",clearFlagKey:"clearComments",valueFlag:"--comment",clearFlag:"--clear-comments"},{optionKey:"note",clearFlagKey:"clearNotes",valueFlag:"--note",clearFlag:"--clear-notes"},{optionKey:"learning",clearFlagKey:"clearLearnings",valueFlag:"--learning",clearFlag:"--clear-learnings"},{optionKey:"file",clearFlagKey:"clearFiles",valueFlag:"--file",clearFlag:"--clear-files",...options.fileDisableFlagKey===void 0?{}:{disableFlagKey:options.fileDisableFlagKey}},{optionKey:"test",clearFlagKey:"clearTests",valueFlag:"--test",clearFlag:"--clear-tests",...options.testDisableFlagKey===void 0?{}:{disableFlagKey:options.testDisableFlagKey}},{optionKey:"doc",clearFlagKey:"clearDocs",valueFlag:"--doc",clearFlag:"--clear-docs",...options.docDisableFlagKey===void 0?{}:{disableFlagKey:options.docDisableFlagKey}},{optionKey:"reminder",clearFlagKey:"clearReminders",valueFlag:"--reminder",clearFlag:"--clear-reminders"},{optionKey:"event",clearFlagKey:"clearEvents",valueFlag:"--event",clearFlag:"--clear-events"},{optionKey:"typeOption",clearFlagKey:"clearTypeOptions",valueFlag:"--type-option",clearFlag:"--clear-type-options"}]}function isLegacyNoneToken(value){return value===void 0?!1:LEGACY_NONE_TOKENS.has(value.trim().toLowerCase())}function assertNoLegacyNoneToken(value,flag,replacementHint){if(!isLegacyNoneToken(value))return;const suffix=replacementHint?` ${replacementHint}`:"";throw new PmCliError(`${flag} no longer accepts "none" or "null".${suffix}`.trim(),EXIT_CODE.USAGE)}function assertNoLegacyNoneTokens(values,flag,replacementHint){if(!values||values.length===0||isLiteralMutationInput(values)||!values.some(value=>isLegacyNoneToken(value)))return;const suffix=replacementHint?` ${replacementHint}`:"";throw new PmCliError(`${flag} no longer accepts "none" or "null".${suffix}`.trim(),EXIT_CODE.USAGE)}function applyLegacyNoneCollectionNormalizers(normalized,definitions){for(const definition of definitions){const candidate=normalized[definition.optionKey];if(!Array.isArray(candidate)||candidate.length===0)continue;if(!candidate.every(entry=>typeof entry=="string"))throw new PmCliError(`${definition.valueFlag} entries must be strings.`,EXIT_CODE.USAGE);if(isLiteralMutationInput(candidate))continue;const entries=candidate;if(entries.some(entry=>isLegacyNoneToken(entry))){if(entries.filter(entry=>!isLegacyNoneToken(entry)).length>0)throw new PmCliError(`Cannot mix legacy clear token "none"/"null" with concrete ${definition.valueFlag} entries. Use ${definition.clearFlag} to clear or provide explicit entries.`,EXIT_CODE.USAGE);normalized[definition.optionKey]=void 0,normalized[definition.clearFlagKey]=!0,definition.disableFlagKey&&(normalized[definition.disableFlagKey]=!1)}}return normalized}export{applyLegacyNoneCollectionNormalizers,assertNoLegacyNoneToken,assertNoLegacyNoneTokens,createLegacyNoneCollectionNormalizers,isLegacyNoneToken};
2
2
  //# sourceMappingURL=legacy-none-tokens.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]="b1e6c7ca-bea7-5875-83e6-917c4326b936")}catch{}})();import{EXIT_CODE}from"../../core/shared/constants.js";import{PmCliError}from"../../core/shared/errors.js";import{renderPmCommand}from"../command-line.js";import{normalizeStatusInput}from"../../core/item/status.js";import{resolveRuntimeStatusRegistry}from"../../core/schema/runtime-schema.js";import{resolvePmRoot}from"../../core/store/paths.js";import{readSettings}from"../../core/store/settings.js";import{resolveStartTaskInProgressStatus}from"../start-task-status.js";import{runReopenUpdate}from"./update.js";async function runReopen(id,reason,options,global2){const normalizedReason=reason.trim();if(normalizedReason.length===0)throw new PmCliError("pm item reopen requires a non-empty recurrence reason.",EXIT_CODE.USAGE,{code:"reopen_reason_required",required:"Describe why the terminal work became active again.",recovery:{suggested_retry:`pm item reopen ${id} "<recurrence reason>"`,suggested_retry_args:["item","reopen",id,"<recurrence reason>"]}});const pmRoot=resolvePmRoot(process.cwd(),global2.path),expectedResult=options.expectedResult?.trim();if(expectedResult!==void 0&&expectedResult.length===0)throw new PmCliError("Reopen expected result must describe the current active outcome.",EXIT_CODE.USAGE);const statusRegistry=resolveRuntimeStatusRegistry((await readSettings(pmRoot)).schema),openStatus=statusRegistry.open_status,inProgressStatus=resolveStartTaskInProgressStatus(statusRegistry),requestedStatus=options.status??openStatus,targetStatus=normalizeStatusInput(requestedStatus,statusRegistry)??requestedStatus;if(targetStatus!==openStatus&&targetStatus!==inProgressStatus)throw new PmCliError(`Reopen target status must be ${openStatus} or ${inProgressStatus}; received ${requestedStatus}.`,EXIT_CODE.USAGE,{code:"reopen_target_status_invalid",required:"Choose the workspace open or in-progress lifecycle status.",recovery:{allowed_values:[...new Set([openStatus,inProgressStatus])],suggested_retry:`pm item reopen ${id} "${normalizedReason}" --status ${openStatus}`,suggested_retry_args:["item","reopen",id,normalizedReason,"--status",openStatus]}});const update=await runReopenUpdate(id,{status:targetStatus,expectedResult,unset:["close-reason","resolution",...expectedResult===void 0?["expected-result"]:[],"actual-result","fixed-version"],author:options.author,message:options.message,force:options.force},global2,normalizedReason);return{item:update.item,changed_fields:update.changed_fields,warnings:update.warnings,recurrence:update.lifecycle_transition,...expectedResult===void 0?{recovery:{missing:["expected_result"],suggested_retry_args:["--pm-path",pmRoot,"update",id,"--expected-result","<current expected outcome>"],suggested_retry:renderPmCommand(["--pm-path",pmRoot,"update",id,"--expected-result","<current expected outcome>"])}}:{}}}export{runReopen};
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]="72dfe5b1-a1dd-573a-9f38-e66bf4e88100")}catch{}})();import{EXIT_CODE}from"../../core/shared/constants.js";import{PmCliError}from"../../core/shared/errors.js";import{renderPmCommand}from"../command-line.js";import{normalizeStatusInput}from"../../core/item/status.js";import{resolveRuntimeStatusRegistry}from"../../core/schema/runtime-schema.js";import{resolvePmRoot}from"../../core/store/paths.js";import{readSettings}from"../../core/store/settings.js";import{resolveStartTaskInProgressStatus}from"../start-task-status.js";import{assertMutationStringOperand,assertReopenMutationValues}from"../runtime/mutation-value-validation.js";import{runReopenUpdate}from"./update.js";async function runReopen(id,reason,options,global2){assertMutationStringOperand(id,"reopen","id"),assertMutationStringOperand(reason,"reopen","reason"),assertReopenMutationValues(options);const normalizedReason=reason.trim();if(normalizedReason.length===0)throw new PmCliError("pm item reopen requires a non-empty recurrence reason.",EXIT_CODE.USAGE,{code:"reopen_reason_required",required:"Describe why the terminal work became active again.",recovery:{suggested_retry:`pm item reopen ${id} "<recurrence reason>"`,suggested_retry_args:["item","reopen",id,"<recurrence reason>"]}});const pmRoot=resolvePmRoot(process.cwd(),global2.path),expectedResult=options.expectedResult?.trim();if(expectedResult!==void 0&&expectedResult.length===0)throw new PmCliError("Reopen expected result must describe the current active outcome.",EXIT_CODE.USAGE);const statusRegistry=resolveRuntimeStatusRegistry((await readSettings(pmRoot)).schema),openStatus=statusRegistry.open_status,inProgressStatus=resolveStartTaskInProgressStatus(statusRegistry),requestedStatus=options.status??openStatus,targetStatus=normalizeStatusInput(requestedStatus,statusRegistry)??requestedStatus;if(targetStatus!==openStatus&&targetStatus!==inProgressStatus)throw new PmCliError(`Reopen target status must be ${openStatus} or ${inProgressStatus}; received ${requestedStatus}.`,EXIT_CODE.USAGE,{code:"reopen_target_status_invalid",required:"Choose the workspace open or in-progress lifecycle status.",recovery:{allowed_values:[...new Set([openStatus,inProgressStatus])],suggested_retry:`pm item reopen ${id} "${normalizedReason}" --status ${openStatus}`,suggested_retry_args:["item","reopen",id,normalizedReason,"--status",openStatus]}});const update=await runReopenUpdate(id,{status:targetStatus,expectedResult,unset:["close-reason","resolution",...expectedResult===void 0?["expected-result"]:[],"actual-result","fixed-version"],author:options.author,message:options.message,force:options.force},global2,normalizedReason);return{item:update.item,changed_fields:update.changed_fields,warnings:update.warnings,recurrence:update.lifecycle_transition,...expectedResult===void 0?{recovery:{missing:["expected_result"],suggested_retry_args:["--pm-path",pmRoot,"update",id,"--expected-result","<current expected outcome>"],suggested_retry:renderPmCommand(["--pm-path",pmRoot,"update",id,"--expected-result","<current expected outcome>"])}}:{}}}export{runReopen};
2
2
  //# sourceMappingURL=reopen.js.map