@unbrained/pm-cli 2026.5.18 → 2026.5.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/README.md +2 -1
  3. package/dist/cli/commander-usage.js +16 -2
  4. package/dist/cli/commander-usage.js.map +1 -1
  5. package/dist/cli/commands/annotation-command.d.ts +49 -0
  6. package/dist/cli/commands/annotation-command.js +135 -0
  7. package/dist/cli/commands/annotation-command.js.map +1 -0
  8. package/dist/cli/commands/append.js +3 -7
  9. package/dist/cli/commands/append.js.map +1 -1
  10. package/dist/cli/commands/calendar.js +3 -6
  11. package/dist/cli/commands/calendar.js.map +1 -1
  12. package/dist/cli/commands/claim.js +12 -22
  13. package/dist/cli/commands/claim.js.map +1 -1
  14. package/dist/cli/commands/close.js +61 -9
  15. package/dist/cli/commands/close.js.map +1 -1
  16. package/dist/cli/commands/comments.d.ts +5 -0
  17. package/dist/cli/commands/comments.js +27 -117
  18. package/dist/cli/commands/comments.js.map +1 -1
  19. package/dist/cli/commands/completion.js +102 -15
  20. package/dist/cli/commands/completion.js.map +1 -1
  21. package/dist/cli/commands/context.js +4 -10
  22. package/dist/cli/commands/context.js.map +1 -1
  23. package/dist/cli/commands/contracts.js +168 -36
  24. package/dist/cli/commands/contracts.js.map +1 -1
  25. package/dist/cli/commands/create.js +49 -44
  26. package/dist/cli/commands/create.js.map +1 -1
  27. package/dist/cli/commands/dedupe-audit.js +7 -4
  28. package/dist/cli/commands/dedupe-audit.js.map +1 -1
  29. package/dist/cli/commands/delete.d.ts +3 -0
  30. package/dist/cli/commands/delete.js +9 -8
  31. package/dist/cli/commands/delete.js.map +1 -1
  32. package/dist/cli/commands/docs.d.ts +1 -0
  33. package/dist/cli/commands/docs.js +4 -8
  34. package/dist/cli/commands/docs.js.map +1 -1
  35. package/dist/cli/commands/event-validation-messages.d.ts +3 -0
  36. package/dist/cli/commands/event-validation-messages.js +44 -0
  37. package/dist/cli/commands/event-validation-messages.js.map +1 -0
  38. package/dist/cli/commands/extension.d.ts +1 -0
  39. package/dist/cli/commands/extension.js +138 -21
  40. package/dist/cli/commands/extension.js.map +1 -1
  41. package/dist/cli/commands/files.js +6 -13
  42. package/dist/cli/commands/files.js.map +1 -1
  43. package/dist/cli/commands/gc.js +17 -4
  44. package/dist/cli/commands/gc.js.map +1 -1
  45. package/dist/cli/commands/get.d.ts +3 -2
  46. package/dist/cli/commands/get.js +50 -8
  47. package/dist/cli/commands/get.js.map +1 -1
  48. package/dist/cli/commands/health.d.ts +10 -0
  49. package/dist/cli/commands/health.js +254 -75
  50. package/dist/cli/commands/health.js.map +1 -1
  51. package/dist/cli/commands/history-redact.d.ts +8 -0
  52. package/dist/cli/commands/history-redact.js +14 -97
  53. package/dist/cli/commands/history-redact.js.map +1 -1
  54. package/dist/cli/commands/history-repair.d.ts +33 -0
  55. package/dist/cli/commands/history-repair.js +166 -0
  56. package/dist/cli/commands/history-repair.js.map +1 -0
  57. package/dist/cli/commands/history.d.ts +4 -4
  58. package/dist/cli/commands/history.js +10 -88
  59. package/dist/cli/commands/history.js.map +1 -1
  60. package/dist/cli/commands/index.d.ts +3 -1
  61. package/dist/cli/commands/index.js +5 -3
  62. package/dist/cli/commands/index.js.map +1 -1
  63. package/dist/cli/commands/init.d.ts +28 -0
  64. package/dist/cli/commands/init.js +23 -2
  65. package/dist/cli/commands/init.js.map +1 -1
  66. package/dist/cli/commands/learnings.js +20 -119
  67. package/dist/cli/commands/learnings.js.map +1 -1
  68. package/dist/cli/commands/linked-test-entry.d.ts +3 -0
  69. package/dist/cli/commands/linked-test-entry.js +62 -0
  70. package/dist/cli/commands/linked-test-entry.js.map +1 -0
  71. package/dist/cli/commands/list.js +32 -22
  72. package/dist/cli/commands/list.js.map +1 -1
  73. package/dist/cli/commands/notes.js +20 -119
  74. package/dist/cli/commands/notes.js.map +1 -1
  75. package/dist/cli/commands/plan.d.ts +3 -0
  76. package/dist/cli/commands/plan.js +184 -22
  77. package/dist/cli/commands/plan.js.map +1 -1
  78. package/dist/cli/commands/restore.js +7 -50
  79. package/dist/cli/commands/restore.js.map +1 -1
  80. package/dist/cli/commands/schema.d.ts +31 -0
  81. package/dist/cli/commands/schema.js +98 -0
  82. package/dist/cli/commands/schema.js.map +1 -0
  83. package/dist/cli/commands/search.js +151 -40
  84. package/dist/cli/commands/search.js.map +1 -1
  85. package/dist/cli/commands/templates.d.ts +4 -0
  86. package/dist/cli/commands/templates.js +89 -17
  87. package/dist/cli/commands/templates.js.map +1 -1
  88. package/dist/cli/commands/test-all.js +4 -8
  89. package/dist/cli/commands/test-all.js.map +1 -1
  90. package/dist/cli/commands/test.d.ts +1 -0
  91. package/dist/cli/commands/test.js +7 -10
  92. package/dist/cli/commands/test.js.map +1 -1
  93. package/dist/cli/commands/update-many.js +4 -8
  94. package/dist/cli/commands/update-many.js.map +1 -1
  95. package/dist/cli/commands/update.js +109 -51
  96. package/dist/cli/commands/update.js.map +1 -1
  97. package/dist/cli/commands/validate.d.ts +3 -1
  98. package/dist/cli/commands/validate.js +23 -71
  99. package/dist/cli/commands/validate.js.map +1 -1
  100. package/dist/cli/error-guidance.js +96 -6
  101. package/dist/cli/error-guidance.js.map +1 -1
  102. package/dist/cli/extension-command-help.d.ts +0 -1
  103. package/dist/cli/extension-command-help.js +2 -13
  104. package/dist/cli/extension-command-help.js.map +1 -1
  105. package/dist/cli/extension-command-options.d.ts +1 -0
  106. package/dist/cli/extension-command-options.js +106 -7
  107. package/dist/cli/extension-command-options.js.map +1 -1
  108. package/dist/cli/help-content.d.ts +0 -1
  109. package/dist/cli/help-content.js +13 -9
  110. package/dist/cli/help-content.js.map +1 -1
  111. package/dist/cli/help-json-payload.d.ts +1 -0
  112. package/dist/cli/help-json-payload.js +33 -3
  113. package/dist/cli/help-json-payload.js.map +1 -1
  114. package/dist/cli/main.js +35 -29
  115. package/dist/cli/main.js.map +1 -1
  116. package/dist/cli/register-list-query.d.ts +1 -1
  117. package/dist/cli/register-list-query.js +40 -17
  118. package/dist/cli/register-list-query.js.map +1 -1
  119. package/dist/cli/register-mutation.d.ts +1 -1
  120. package/dist/cli/register-mutation.js +232 -64
  121. package/dist/cli/register-mutation.js.map +1 -1
  122. package/dist/cli/register-operations.js +16 -11
  123. package/dist/cli/register-operations.js.map +1 -1
  124. package/dist/cli/register-setup.js +26 -14
  125. package/dist/cli/register-setup.js.map +1 -1
  126. package/dist/cli/registration-helpers.d.ts +0 -2
  127. package/dist/cli/registration-helpers.js +13 -40
  128. package/dist/cli/registration-helpers.js.map +1 -1
  129. package/dist/cli.js +23 -3
  130. package/dist/cli.js.map +1 -1
  131. package/dist/core/extensions/index.d.ts +0 -1
  132. package/dist/core/extensions/index.js +2 -14
  133. package/dist/core/extensions/index.js.map +1 -1
  134. package/dist/core/extensions/loader.js +3 -9
  135. package/dist/core/extensions/loader.js.map +1 -1
  136. package/dist/core/fs/path-utils.d.ts +1 -0
  137. package/dist/core/fs/path-utils.js +12 -0
  138. package/dist/core/fs/path-utils.js.map +1 -0
  139. package/dist/core/history/drift-scan.d.ts +11 -0
  140. package/dist/core/history/drift-scan.js +67 -0
  141. package/dist/core/history/drift-scan.js.map +1 -0
  142. package/dist/core/history/replay.d.ts +82 -0
  143. package/dist/core/history/replay.js +249 -0
  144. package/dist/core/history/replay.js.map +1 -0
  145. package/dist/core/item/item-format.js +11 -8
  146. package/dist/core/item/item-format.js.map +1 -1
  147. package/dist/core/item/item-type-definition.d.ts +52 -0
  148. package/dist/core/item/item-type-definition.js +123 -0
  149. package/dist/core/item/item-type-definition.js.map +1 -0
  150. package/dist/core/item/parse.js +3 -2
  151. package/dist/core/item/parse.js.map +1 -1
  152. package/dist/core/item/priority.d.ts +23 -0
  153. package/dist/core/item/priority.js +55 -0
  154. package/dist/core/item/priority.js.map +1 -0
  155. package/dist/core/item/status.d.ts +14 -1
  156. package/dist/core/item/status.js +22 -2
  157. package/dist/core/item/status.js.map +1 -1
  158. package/dist/core/item/toon-decode.d.ts +19 -0
  159. package/dist/core/item/toon-decode.js +69 -0
  160. package/dist/core/item/toon-decode.js.map +1 -0
  161. package/dist/core/item/type-registry.js +13 -84
  162. package/dist/core/item/type-registry.js.map +1 -1
  163. package/dist/core/packages/manifest.js +3 -9
  164. package/dist/core/packages/manifest.js.map +1 -1
  165. package/dist/core/schema/item-types-file.d.ts +85 -0
  166. package/dist/core/schema/item-types-file.js +243 -0
  167. package/dist/core/schema/item-types-file.js.map +1 -0
  168. package/dist/core/schema/runtime-schema.d.ts +2 -1
  169. package/dist/core/schema/runtime-schema.js +11 -9
  170. package/dist/core/schema/runtime-schema.js.map +1 -1
  171. package/dist/core/search/semantic-defaults.js +3 -3
  172. package/dist/core/search/semantic-defaults.js.map +1 -1
  173. package/dist/core/shared/author.d.ts +1 -0
  174. package/dist/core/shared/author.js +9 -0
  175. package/dist/core/shared/author.js.map +1 -0
  176. package/dist/core/shared/lazy-module.d.ts +1 -0
  177. package/dist/core/shared/lazy-module.js +11 -0
  178. package/dist/core/shared/lazy-module.js.map +1 -0
  179. package/dist/core/shared/option-alias-visibility.d.ts +44 -0
  180. package/dist/core/shared/option-alias-visibility.js +76 -0
  181. package/dist/core/shared/option-alias-visibility.js.map +1 -0
  182. package/dist/core/shared/text-normalization.d.ts +0 -1
  183. package/dist/core/shared/text-normalization.js +2 -5
  184. package/dist/core/shared/text-normalization.js.map +1 -1
  185. package/dist/core/store/item-store.d.ts +2 -0
  186. package/dist/core/store/item-store.js +70 -39
  187. package/dist/core/store/item-store.js.map +1 -1
  188. package/dist/core/store/settings-validator.d.ts +106 -0
  189. package/dist/core/store/settings-validator.js +279 -0
  190. package/dist/core/store/settings-validator.js.map +1 -0
  191. package/dist/core/store/settings.js +6 -343
  192. package/dist/core/store/settings.js.map +1 -1
  193. package/dist/core/telemetry/runtime.js +5 -3
  194. package/dist/core/telemetry/runtime.js.map +1 -1
  195. package/dist/mcp/server.js +64 -13
  196. package/dist/mcp/server.js.map +1 -1
  197. package/dist/sdk/cli-contracts.d.ts +9 -2
  198. package/dist/sdk/cli-contracts.js +204 -13
  199. package/dist/sdk/cli-contracts.js.map +1 -1
  200. package/dist/sdk/runtime.d.ts +25 -1
  201. package/dist/sdk/runtime.js +46 -3
  202. package/dist/sdk/runtime.js.map +1 -1
  203. package/dist/types.d.ts +6 -0
  204. package/dist/types.js +10 -2
  205. package/dist/types.js.map +1 -1
  206. package/docs/AGENT_GUIDE.md +7 -1
  207. package/docs/ARCHITECTURE.md +1 -1
  208. package/docs/COMMANDS.md +39 -6
  209. package/docs/CONFIGURATION.md +1 -1
  210. package/docs/RELEASING.md +11 -7
  211. package/docs/SDK.md +11 -2
  212. package/package.json +12 -11
  213. package/packages/pm-calendar/README.md +3 -1
  214. package/packages/pm-calendar/extensions/calendar/index.js +21 -2
  215. package/packages/pm-calendar/extensions/calendar/index.ts +21 -2
  216. package/packages/pm-search-advanced/README.md +8 -0
  217. package/packages/pm-search-advanced/extensions/search-advanced/index.js +74 -0
  218. package/packages/pm-search-advanced/extensions/search-advanced/index.ts +74 -0
  219. package/packages/pm-search-advanced/extensions/search-advanced/runtime.js +67 -9
  220. package/packages/pm-search-advanced/extensions/search-advanced/runtime.ts +67 -9
  221. package/packages/pm-templates/extensions/templates/runtime.js +11 -202
  222. package/packages/pm-templates/extensions/templates/runtime.ts +38 -230
  223. package/dist/core/output/command-aware.d.ts +0 -1
  224. package/dist/core/output/command-aware.js +0 -397
  225. package/dist/core/output/command-aware.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"semantic-defaults.js","sources":["core/search/semantic-defaults.ts"],"sourceRoot":"/","sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport type { PmSettings } from \"../../types/index.js\";\nimport { toNonEmptyString } from \"../shared/primitives.js\";\n\nconst DISABLE_AUTO_DEFAULTS_ENV = \"PM_DISABLE_OLLAMA_AUTO_DEFAULTS\";\nconst OLLAMA_MODEL_ENV = \"PM_OLLAMA_MODEL\";\nconst DEFAULT_OLLAMA_BASE_URL = \"http://localhost:11434\";\nconst DEFAULT_OLLAMA_MODEL = \"qwen3-embedding:0.6b\";\nconst DEFAULT_LANCEDB_PATH = \".agents/pm/search/lancedb/\";\nconst OLLAMA_VERSION_TIMEOUT_MS = 1_500;\nconst OLLAMA_LIST_TIMEOUT_MS = 2_500;\nconst QWEN_EMBEDDING_MODEL_PATTERN = /qwen.*(?:embed|embedding)|(?:embed|embedding).*qwen/i;\nconst EMBEDDING_MODEL_PATTERN = /embed|embedding/i;\n\nexport interface SemanticRuntimeDefaultsResolution {\n settings: PmSettings;\n auto_ollama_defaults_applied: boolean;\n}\n\nconst toOptionalNonEmptyString = toNonEmptyString;\n\nfunction isAutoDefaultsDisabled(): boolean {\n const raw = toOptionalNonEmptyString(process.env[DISABLE_AUTO_DEFAULTS_ENV]);\n if (!raw) {\n return false;\n }\n const normalized = raw.toLowerCase();\n return normalized === \"1\" || normalized === \"true\" || normalized === \"yes\";\n}\n\nfunction hasAnyExplicitSemanticConfiguration(settings: PmSettings): boolean {\n const candidateValues: Array<unknown> = [\n settings.search?.provider,\n settings.vector_store?.adapter,\n settings.providers?.openai?.base_url,\n settings.providers?.openai?.model,\n settings.providers?.openai?.api_key,\n settings.providers?.ollama?.base_url,\n settings.providers?.ollama?.model,\n settings.vector_store?.qdrant?.url,\n settings.vector_store?.qdrant?.api_key,\n settings.vector_store?.lancedb?.path,\n ];\n return candidateValues.some((entry) => toOptionalNonEmptyString(entry) !== null);\n}\n\nfunction isOllamaInstalled(): boolean {\n const result = spawnSync(\"ollama\", [\"--version\"], {\n encoding: \"utf8\",\n timeout: OLLAMA_VERSION_TIMEOUT_MS,\n });\n if (result.error) {\n return false;\n }\n return result.status === 0;\n}\n\nfunction parseOllamaModelList(output: string): string | null {\n const lines = output\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n if (lines.length === 0) {\n return null;\n }\n const models = lines\n .map((line) => line.split(/\\s+/)[0]?.trim())\n .filter((entry): entry is string => Boolean(entry && entry.length > 0))\n .filter((entry) => entry.toUpperCase() !== \"NAME\");\n if (models.length === 0) {\n return null;\n }\n const preferredQwenEmbeddingModel = models.find((entry) => QWEN_EMBEDDING_MODEL_PATTERN.test(entry));\n if (preferredQwenEmbeddingModel) {\n return preferredQwenEmbeddingModel;\n }\n const embeddingModel = models.find((entry) => EMBEDDING_MODEL_PATTERN.test(entry));\n return embeddingModel ?? models[0];\n}\n\nfunction resolveAutoOllamaModel(settings: PmSettings): string {\n const settingsModel = toOptionalNonEmptyString(settings.providers?.ollama?.model);\n if (settingsModel) {\n return settingsModel;\n }\n const envModel = toOptionalNonEmptyString(process.env[OLLAMA_MODEL_ENV]);\n if (envModel) {\n return envModel;\n }\n const listed = spawnSync(\"ollama\", [\"list\"], {\n encoding: \"utf8\",\n timeout: OLLAMA_LIST_TIMEOUT_MS,\n });\n if (!listed.error && listed.status === 0) {\n const listedModel = parseOllamaModelList(typeof listed.stdout === \"string\" ? listed.stdout : \"\");\n if (listedModel) {\n return listedModel;\n }\n }\n return DEFAULT_OLLAMA_MODEL;\n}\n\nexport function resolveSettingsWithSemanticRuntimeDefaults(settings: PmSettings): SemanticRuntimeDefaultsResolution {\n if (isAutoDefaultsDisabled()) {\n return {\n settings,\n auto_ollama_defaults_applied: false,\n };\n }\n if (hasAnyExplicitSemanticConfiguration(settings)) {\n return {\n settings,\n auto_ollama_defaults_applied: false,\n };\n }\n if (!isOllamaInstalled()) {\n return {\n settings,\n auto_ollama_defaults_applied: false,\n };\n }\n\n const nextSettings = structuredClone(settings);\n const resolvedModel = resolveAutoOllamaModel(nextSettings);\n nextSettings.providers.ollama.base_url = DEFAULT_OLLAMA_BASE_URL;\n nextSettings.providers.ollama.model = resolvedModel;\n nextSettings.vector_store.lancedb.path = DEFAULT_LANCEDB_PATH;\n if (!toOptionalNonEmptyString(nextSettings.search.embedding_model)) {\n nextSettings.search.embedding_model = resolvedModel;\n }\n return {\n settings: nextSettings,\n auto_ollama_defaults_applied: true,\n };\n}\n"],"names":[],"mappings":"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","debugId":"aea4dc3e-835b-52ab-b074-238deca3188d"}
1
+ {"version":3,"file":"semantic-defaults.js","sources":["core/search/semantic-defaults.ts"],"sourceRoot":"/","sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport type { PmSettings } from \"../../types/index.js\";\nimport { toNonEmptyString } from \"../shared/primitives.js\";\n\nconst DISABLE_AUTO_DEFAULTS_ENV = \"PM_DISABLE_OLLAMA_AUTO_DEFAULTS\";\nconst OLLAMA_MODEL_ENV = \"PM_OLLAMA_MODEL\";\nconst DEFAULT_OLLAMA_BASE_URL = \"http://localhost:11434\";\nconst DEFAULT_OLLAMA_MODEL = \"qwen3-embedding:0.6b\";\nconst DEFAULT_LANCEDB_PATH = \".agents/pm/search/lancedb/\";\nconst OLLAMA_VERSION_TIMEOUT_MS = 1_500;\nconst OLLAMA_LIST_TIMEOUT_MS = 2_500;\nconst QWEN_EMBEDDING_MODEL_PATTERN = /qwen.*(?:embed|embedding)|(?:embed|embedding).*qwen/i;\nconst EMBEDDING_MODEL_PATTERN = /embed|embedding/i;\n\nexport interface SemanticRuntimeDefaultsResolution {\n settings: PmSettings;\n auto_ollama_defaults_applied: boolean;\n}\n\nconst toOptionalNonEmptyString = toNonEmptyString;\n\nfunction isAutoDefaultsDisabled(): boolean {\n const raw = toOptionalNonEmptyString(process.env[DISABLE_AUTO_DEFAULTS_ENV]);\n if (!raw) {\n return false;\n }\n const normalized = raw.toLowerCase();\n return normalized === \"1\" || normalized === \"true\" || normalized === \"yes\";\n}\n\nfunction hasAnyExplicitSemanticConfiguration(settings: PmSettings): boolean {\n const candidateValues: Array<unknown> = [\n settings.search?.provider,\n settings.vector_store?.adapter,\n settings.providers?.openai?.base_url,\n settings.providers?.openai?.model,\n settings.providers?.openai?.api_key,\n settings.providers?.ollama?.base_url,\n settings.providers?.ollama?.model,\n settings.vector_store?.qdrant?.url,\n settings.vector_store?.qdrant?.api_key,\n settings.vector_store?.lancedb?.path,\n ];\n return candidateValues.some((entry) => toOptionalNonEmptyString(entry) !== null);\n}\n\nfunction isOllamaInstalled(): boolean {\n const result = spawnSync(\"ollama\", [\"--version\"], {\n encoding: \"utf8\",\n timeout: OLLAMA_VERSION_TIMEOUT_MS,\n });\n if (result.error) {\n return false;\n }\n return result.status === 0;\n}\n\nfunction parseOllamaModelList(output: string): string | null {\n const lines = output\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n if (lines.length === 0) {\n return null;\n }\n const models = lines\n .map((line) => line.split(/\\s+/)[0]?.trim())\n .filter((entry): entry is string => Boolean(entry && entry.length > 0))\n .filter((entry) => entry.toUpperCase() !== \"NAME\");\n if (models.length === 0) {\n return null;\n }\n const preferredQwenEmbeddingModel = models.find((entry) => QWEN_EMBEDDING_MODEL_PATTERN.test(entry));\n if (preferredQwenEmbeddingModel) {\n return preferredQwenEmbeddingModel;\n }\n const embeddingModel = models.find((entry) => EMBEDDING_MODEL_PATTERN.test(entry));\n return embeddingModel ?? null;\n}\n\nfunction resolveAutoOllamaModel(settings: PmSettings): string {\n const settingsModel = toOptionalNonEmptyString(settings.providers?.ollama?.model);\n if (settingsModel) {\n return settingsModel;\n }\n const envModel = toOptionalNonEmptyString(process.env[OLLAMA_MODEL_ENV]);\n if (envModel) {\n return envModel;\n }\n const listed = spawnSync(\"ollama\", [\"list\"], {\n encoding: \"utf8\",\n timeout: OLLAMA_LIST_TIMEOUT_MS,\n });\n if (!listed.error && listed.status === 0) {\n const listedModel = parseOllamaModelList(typeof listed.stdout === \"string\" ? listed.stdout : \"\");\n if (listedModel) {\n return listedModel;\n }\n }\n return DEFAULT_OLLAMA_MODEL;\n}\n\nexport function resolveSettingsWithSemanticRuntimeDefaults(settings: PmSettings): SemanticRuntimeDefaultsResolution {\n if (isAutoDefaultsDisabled()) {\n return {\n settings,\n auto_ollama_defaults_applied: false,\n };\n }\n if (hasAnyExplicitSemanticConfiguration(settings)) {\n return {\n settings,\n auto_ollama_defaults_applied: false,\n };\n }\n if (!isOllamaInstalled()) {\n return {\n settings,\n auto_ollama_defaults_applied: false,\n };\n }\n\n const nextSettings = structuredClone(settings);\n const resolvedModel = resolveAutoOllamaModel(nextSettings);\n nextSettings.providers.ollama.base_url = DEFAULT_OLLAMA_BASE_URL;\n nextSettings.providers.ollama.model = resolvedModel;\n nextSettings.vector_store.lancedb.path = DEFAULT_LANCEDB_PATH;\n if (!toOptionalNonEmptyString(nextSettings.search.embedding_model)) {\n nextSettings.search.embedding_model = resolvedModel;\n }\n return {\n settings: nextSettings,\n auto_ollama_defaults_applied: true,\n };\n}\n"],"names":[],"mappings":"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","debugId":"816e2cb5-1f71-5e76-83f6-e6d5ed77941f"}
@@ -0,0 +1 @@
1
+ export declare function resolveAuthor(candidate: string | undefined, fallback: string): string;
@@ -0,0 +1,9 @@
1
+
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="19131b8d-d294-5557-93b2-87e2f08b7417")}catch(e){}}();
3
+ export function resolveAuthor(candidate, fallback) {
4
+ const resolved = candidate ?? process.env.PM_AUTHOR ?? fallback;
5
+ const trimmed = resolved.trim();
6
+ return trimmed || "unknown";
7
+ }
8
+ //# sourceMappingURL=author.js.map
9
+ //# debugId=19131b8d-d294-5557-93b2-87e2f08b7417
@@ -0,0 +1 @@
1
+ {"version":3,"file":"author.js","sources":["core/shared/author.ts"],"sourceRoot":"/","sourcesContent":["export function resolveAuthor(candidate: string | undefined, fallback: string): string {\n const resolved = candidate ?? process.env.PM_AUTHOR ?? fallback;\n const trimmed = resolved.trim();\n return trimmed || \"unknown\";\n}\n"],"names":[],"mappings":";;AAAA,MAAM,UAAU,aAAa,CAAC,SAA6B,EAAE,QAAgB;IAC3E,MAAM,QAAQ,GAAG,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,QAAQ,CAAC;IAChE,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAChC,OAAO,OAAO,IAAI,SAAS,CAAC;AAC9B,CAAC","debugId":"19131b8d-d294-5557-93b2-87e2f08b7417"}
@@ -0,0 +1 @@
1
+ export declare function createLazyModule<T>(importer: () => Promise<T>): () => Promise<T>;
@@ -0,0 +1,11 @@
1
+
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="8a197e16-769b-582e-833f-997a66d98407")}catch(e){}}();
3
+ export function createLazyModule(importer) {
4
+ let promise = null;
5
+ return () => {
6
+ promise ??= importer();
7
+ return promise;
8
+ };
9
+ }
10
+ //# sourceMappingURL=lazy-module.js.map
11
+ //# debugId=8a197e16-769b-582e-833f-997a66d98407
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lazy-module.js","sources":["core/shared/lazy-module.ts"],"sourceRoot":"/","sourcesContent":["export function createLazyModule<T>(importer: () => Promise<T>): () => Promise<T> {\n let promise: Promise<T> | null = null;\n return () => {\n promise ??= importer();\n return promise;\n };\n}\n"],"names":[],"mappings":";;AAAA,MAAM,UAAU,gBAAgB,CAAI,QAA0B;IAC5D,IAAI,OAAO,GAAsB,IAAI,CAAC;IACtC,OAAO,GAAG,EAAE;QACV,OAAO,KAAK,QAAQ,EAAE,CAAC;QACvB,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;AACJ,CAAC","debugId":"8a197e16-769b-582e-833f-997a66d98407"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Helpers for deciding whether a CLI option alias is a pure snake_case
3
+ * underscore-duplicate of an existing kebab-case flag.
4
+ *
5
+ * Mutation commands historically register every `--foo-bar` flag together with
6
+ * a `--foo_bar` alias so agents are never blocked by a snake/kebab mismatch.
7
+ * Those underscore duplicates roughly double the option list of every
8
+ * `--help` and waste agent context. We keep them functional as parse-time
9
+ * aliases but hide them from the rendered `--help` text.
10
+ *
11
+ * The rule is intentionally narrow: an alias is hidden ONLY when its long flag
12
+ * is exactly the underscore form of an existing kebab flag (for example
13
+ * `--create_mode` is the `-`→`_` form of `--create-mode`). Semantically-distinct
14
+ * aliases (for example `--fail-on-warn` for `--strict-exit`, `--local` for
15
+ * `--project`, `--ac` for `--acceptance-criteria`) are NOT snake duplicates and
16
+ * stay visible.
17
+ */
18
+ /**
19
+ * Extract every long flag (for example `--create-mode`) from a commander flag
20
+ * spec that may include short aliases and a value placeholder. A spec can list
21
+ * more than one long flag, for example `"--estimate, --estimated-minutes
22
+ * <value>"` → `["--estimate", "--estimated-minutes"]`.
23
+ */
24
+ export declare function extractLongFlags(flagSpec: string): string[];
25
+ /**
26
+ * Extract the first long flag from a commander flag spec, or null when none is
27
+ * present.
28
+ */
29
+ export declare function extractLongFlag(flagSpec: string): string | null;
30
+ /**
31
+ * Returns true when `aliasFlagSpec` differs from `canonicalFlagSpec` ONLY by
32
+ * substituting one or more interior hyphens with underscores — i.e. it is a
33
+ * pure snake_case underscore-duplicate of the canonical kebab flag.
34
+ *
35
+ * Examples that match (alias hidden):
36
+ * --create-mode <- --create_mode
37
+ * --filter-assignee-filter <- --filter-assignee_filter
38
+ *
39
+ * Examples that do NOT match (alias stays visible):
40
+ * --acceptance-criteria <- --ac (different identifier)
41
+ * --order <- --rank (different identifier)
42
+ * --strict-exit <- --fail-on-warn (semantically distinct)
43
+ */
44
+ export declare function isPureSnakeCaseAlias(canonicalFlagSpec: string, aliasFlagSpec: string): boolean;
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Helpers for deciding whether a CLI option alias is a pure snake_case
3
+ * underscore-duplicate of an existing kebab-case flag.
4
+ *
5
+ * Mutation commands historically register every `--foo-bar` flag together with
6
+ * a `--foo_bar` alias so agents are never blocked by a snake/kebab mismatch.
7
+ * Those underscore duplicates roughly double the option list of every
8
+ * `--help` and waste agent context. We keep them functional as parse-time
9
+ * aliases but hide them from the rendered `--help` text.
10
+ *
11
+ * The rule is intentionally narrow: an alias is hidden ONLY when its long flag
12
+ * is exactly the underscore form of an existing kebab flag (for example
13
+ * `--create_mode` is the `-`→`_` form of `--create-mode`). Semantically-distinct
14
+ * aliases (for example `--fail-on-warn` for `--strict-exit`, `--local` for
15
+ * `--project`, `--ac` for `--acceptance-criteria`) are NOT snake duplicates and
16
+ * stay visible.
17
+ */
18
+ /**
19
+ * Extract every long flag (for example `--create-mode`) from a commander flag
20
+ * spec that may include short aliases and a value placeholder. A spec can list
21
+ * more than one long flag, for example `"--estimate, --estimated-minutes
22
+ * <value>"` → `["--estimate", "--estimated-minutes"]`.
23
+ */
24
+
25
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="9682a7a8-88b3-512a-9c6b-d2dfbe6bc2fb")}catch(e){}}();
26
+ export function extractLongFlags(flagSpec) {
27
+ return flagSpec
28
+ .split(/[\s,|]+/)
29
+ .map((token) => token.trim())
30
+ .filter((token) => token.startsWith("--"));
31
+ }
32
+ /**
33
+ * Extract the first long flag from a commander flag spec, or null when none is
34
+ * present.
35
+ */
36
+ export function extractLongFlag(flagSpec) {
37
+ return extractLongFlags(flagSpec)[0] ?? null;
38
+ }
39
+ /**
40
+ * Returns true when `aliasFlagSpec` differs from `canonicalFlagSpec` ONLY by
41
+ * substituting one or more interior hyphens with underscores — i.e. it is a
42
+ * pure snake_case underscore-duplicate of the canonical kebab flag.
43
+ *
44
+ * Examples that match (alias hidden):
45
+ * --create-mode <- --create_mode
46
+ * --filter-assignee-filter <- --filter-assignee_filter
47
+ *
48
+ * Examples that do NOT match (alias stays visible):
49
+ * --acceptance-criteria <- --ac (different identifier)
50
+ * --order <- --rank (different identifier)
51
+ * --strict-exit <- --fail-on-warn (semantically distinct)
52
+ */
53
+ export function isPureSnakeCaseAlias(canonicalFlagSpec, aliasFlagSpec) {
54
+ const aliasLong = extractLongFlag(aliasFlagSpec);
55
+ if (aliasLong === null) {
56
+ return false;
57
+ }
58
+ const normalize = (long) => long.slice(2).replaceAll("-", "_");
59
+ // The canonical spec may declare multiple long flags (e.g.
60
+ // "--estimate, --estimated-minutes <value>"); the alias is hidden when it is
61
+ // the underscore form of ANY of them.
62
+ return extractLongFlags(canonicalFlagSpec).some((canonicalLong) => {
63
+ if (!canonicalLong.slice(2).includes("-")) {
64
+ // No interior hyphen to convert, so there is no kebab form to snake-duplicate.
65
+ return false;
66
+ }
67
+ if (aliasLong === canonicalLong) {
68
+ // Identical flags are not aliases of one another.
69
+ return false;
70
+ }
71
+ // Reachable from the canonical purely by hyphen→underscore substitution.
72
+ return normalize(aliasLong) === normalize(canonicalLong);
73
+ });
74
+ }
75
+ //# sourceMappingURL=option-alias-visibility.js.map
76
+ //# debugId=9682a7a8-88b3-512a-9c6b-d2dfbe6bc2fb
@@ -0,0 +1 @@
1
+ {"version":3,"file":"option-alias-visibility.js","sources":["core/shared/option-alias-visibility.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Helpers for deciding whether a CLI option alias is a pure snake_case\n * underscore-duplicate of an existing kebab-case flag.\n *\n * Mutation commands historically register every `--foo-bar` flag together with\n * a `--foo_bar` alias so agents are never blocked by a snake/kebab mismatch.\n * Those underscore duplicates roughly double the option list of every\n * `--help` and waste agent context. We keep them functional as parse-time\n * aliases but hide them from the rendered `--help` text.\n *\n * The rule is intentionally narrow: an alias is hidden ONLY when its long flag\n * is exactly the underscore form of an existing kebab flag (for example\n * `--create_mode` is the `-`→`_` form of `--create-mode`). Semantically-distinct\n * aliases (for example `--fail-on-warn` for `--strict-exit`, `--local` for\n * `--project`, `--ac` for `--acceptance-criteria`) are NOT snake duplicates and\n * stay visible.\n */\n\n/**\n * Extract every long flag (for example `--create-mode`) from a commander flag\n * spec that may include short aliases and a value placeholder. A spec can list\n * more than one long flag, for example `\"--estimate, --estimated-minutes\n * <value>\"` → `[\"--estimate\", \"--estimated-minutes\"]`.\n */\nexport function extractLongFlags(flagSpec: string): string[] {\n return flagSpec\n .split(/[\\s,|]+/)\n .map((token) => token.trim())\n .filter((token) => token.startsWith(\"--\"));\n}\n\n/**\n * Extract the first long flag from a commander flag spec, or null when none is\n * present.\n */\nexport function extractLongFlag(flagSpec: string): string | null {\n return extractLongFlags(flagSpec)[0] ?? null;\n}\n\n/**\n * Returns true when `aliasFlagSpec` differs from `canonicalFlagSpec` ONLY by\n * substituting one or more interior hyphens with underscores — i.e. it is a\n * pure snake_case underscore-duplicate of the canonical kebab flag.\n *\n * Examples that match (alias hidden):\n * --create-mode <- --create_mode\n * --filter-assignee-filter <- --filter-assignee_filter\n *\n * Examples that do NOT match (alias stays visible):\n * --acceptance-criteria <- --ac (different identifier)\n * --order <- --rank (different identifier)\n * --strict-exit <- --fail-on-warn (semantically distinct)\n */\nexport function isPureSnakeCaseAlias(canonicalFlagSpec: string, aliasFlagSpec: string): boolean {\n const aliasLong = extractLongFlag(aliasFlagSpec);\n if (aliasLong === null) {\n return false;\n }\n const normalize = (long: string): string => long.slice(2).replaceAll(\"-\", \"_\");\n // The canonical spec may declare multiple long flags (e.g.\n // \"--estimate, --estimated-minutes <value>\"); the alias is hidden when it is\n // the underscore form of ANY of them.\n return extractLongFlags(canonicalFlagSpec).some((canonicalLong) => {\n if (!canonicalLong.slice(2).includes(\"-\")) {\n // No interior hyphen to convert, so there is no kebab form to snake-duplicate.\n return false;\n }\n if (aliasLong === canonicalLong) {\n // Identical flags are not aliases of one another.\n return false;\n }\n // Reachable from the canonical purely by hyphen→underscore substitution.\n return normalize(aliasLong) === normalize(canonicalLong);\n });\n}\n"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;;;GAKG;;;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,OAAO,QAAQ;SACZ,KAAK,CAAC,SAAS,CAAC;SAChB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SAC5B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,OAAO,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC/C,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,oBAAoB,CAAC,iBAAyB,EAAE,aAAqB;IACnF,MAAM,SAAS,GAAG,eAAe,CAAC,aAAa,CAAC,CAAC;IACjD,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,SAAS,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC/E,2DAA2D;IAC3D,6EAA6E;IAC7E,sCAAsC;IACtC,OAAO,gBAAgB,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,EAAE;QAChE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1C,+EAA+E;YAC/E,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,SAAS,KAAK,aAAa,EAAE,CAAC;YAChC,kDAAkD;YAClD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,yEAAyE;QACzE,OAAO,SAAS,CAAC,SAAS,CAAC,KAAK,SAAS,CAAC,aAAa,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC","debugId":"9682a7a8-88b3-512a-9c6b-d2dfbe6bc2fb"}
@@ -1,4 +1,3 @@
1
1
  export declare function normalizeLowercaseWhitespace(value: string): string;
2
2
  export declare function tokenizeAlphaNumeric(value: string): string[];
3
- export declare function uniqueTokens(value: string): string[];
4
3
  export declare function jaccardSimilarity(leftTokens: string[], rightTokens: string[]): number;
@@ -1,5 +1,5 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="519934fd-169a-536b-94a8-67607aac500c")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="1109b938-c421-5517-9671-2cebd7e10309")}catch(e){}}();
3
3
  export function normalizeLowercaseWhitespace(value) {
4
4
  return value
5
5
  .trim()
@@ -11,9 +11,6 @@ export function tokenizeAlphaNumeric(value) {
11
11
  .split(/[^a-z0-9]+/)
12
12
  .filter((token) => token.length > 0);
13
13
  }
14
- export function uniqueTokens(value) {
15
- return [...new Set(tokenizeAlphaNumeric(value))];
16
- }
17
14
  export function jaccardSimilarity(leftTokens, rightTokens) {
18
15
  if (leftTokens.length === 0 && rightTokens.length === 0) {
19
16
  return 1;
@@ -33,4 +30,4 @@ export function jaccardSimilarity(leftTokens, rightTokens) {
33
30
  return union === 0 ? 0 : intersection / union;
34
31
  }
35
32
  //# sourceMappingURL=text-normalization.js.map
36
- //# debugId=519934fd-169a-536b-94a8-67607aac500c
33
+ //# debugId=1109b938-c421-5517-9671-2cebd7e10309
@@ -1 +1 @@
1
- {"version":3,"file":"text-normalization.js","sources":["core/shared/text-normalization.ts"],"sourceRoot":"/","sourcesContent":["export function normalizeLowercaseWhitespace(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/\\s+/g, \" \");\n}\n\nexport function tokenizeAlphaNumeric(value: string): string[] {\n return normalizeLowercaseWhitespace(value)\n .split(/[^a-z0-9]+/)\n .filter((token) => token.length > 0);\n}\n\nexport function uniqueTokens(value: string): string[] {\n return [...new Set(tokenizeAlphaNumeric(value))];\n}\n\nexport function jaccardSimilarity(leftTokens: string[], rightTokens: string[]): number {\n if (leftTokens.length === 0 && rightTokens.length === 0) {\n return 1;\n }\n if (leftTokens.length === 0 || rightTokens.length === 0) {\n return 0;\n }\n const leftSet = new Set(leftTokens);\n const rightSet = new Set(rightTokens);\n let intersection = 0;\n for (const token of leftSet) {\n if (rightSet.has(token)) {\n intersection += 1;\n }\n }\n const union = new Set([...leftSet, ...rightSet]).size;\n return union === 0 ? 0 : intersection / union;\n}\n"],"names":[],"mappings":";;AAAA,MAAM,UAAU,4BAA4B,CAAC,KAAa;IACxD,OAAO,KAAK;SACT,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,OAAO,4BAA4B,CAAC,KAAK,CAAC;SACvC,KAAK,CAAC,YAAY,CAAC;SACnB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,UAAoB,EAAE,WAAqB;IAC3E,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;IACtC,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,YAAY,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IACtD,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,KAAK,CAAC;AAChD,CAAC","debugId":"519934fd-169a-536b-94a8-67607aac500c"}
1
+ {"version":3,"file":"text-normalization.js","sources":["core/shared/text-normalization.ts"],"sourceRoot":"/","sourcesContent":["export function normalizeLowercaseWhitespace(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/\\s+/g, \" \");\n}\n\nexport function tokenizeAlphaNumeric(value: string): string[] {\n return normalizeLowercaseWhitespace(value)\n .split(/[^a-z0-9]+/)\n .filter((token) => token.length > 0);\n}\n\nexport function jaccardSimilarity(leftTokens: string[], rightTokens: string[]): number {\n if (leftTokens.length === 0 && rightTokens.length === 0) {\n return 1;\n }\n if (leftTokens.length === 0 || rightTokens.length === 0) {\n return 0;\n }\n const leftSet = new Set(leftTokens);\n const rightSet = new Set(rightTokens);\n let intersection = 0;\n for (const token of leftSet) {\n if (rightSet.has(token)) {\n intersection += 1;\n }\n }\n const union = new Set([...leftSet, ...rightSet]).size;\n return union === 0 ? 0 : intersection / union;\n}\n"],"names":[],"mappings":";;AAAA,MAAM,UAAU,4BAA4B,CAAC,KAAa;IACxD,OAAO,KAAK;SACT,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,OAAO,4BAA4B,CAAC,KAAK,CAAC;SACvC,KAAK,CAAC,YAAY,CAAC;SACnB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,UAAoB,EAAE,WAAqB;IAC3E,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;IACtC,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,YAAY,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IACtD,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,KAAK,CAAC;AAChD,CAAC","debugId":"1109b938-c421-5517-9671-2cebd7e10309"}
@@ -46,8 +46,10 @@ export declare function deleteItem(params: {
46
46
  author: string;
47
47
  message?: string;
48
48
  force?: boolean;
49
+ dryRun?: boolean;
49
50
  }): Promise<{
50
51
  item: ItemFrontMatter;
51
52
  changedFields: string[];
52
53
  warnings: string[];
54
+ targetPath?: string;
53
55
  }>;
@@ -1,5 +1,5 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="9faa72aa-63a0-5ae8-b9c8-62376ee34108")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="2b2ff59e-d0db-53b1-b67f-a7dcc221ff00")}catch(e){}}();
3
3
  import fs from "node:fs/promises";
4
4
  import path from "node:path";
5
5
  import { getActiveExtensionRegistrations, runActiveOnReadHooks, runActiveOnWriteHooks, runActiveServiceOverride, } from "../extensions/index.js";
@@ -217,38 +217,72 @@ export async function buildItemNotFoundError(pmRoot, badId, idPrefix, typeToFold
217
217
  }
218
218
  return new PmCliError(`Item ${badId} not found`, EXIT_CODE.NOT_FOUND, { nextSteps });
219
219
  }
220
- export async function mutateItem(params) {
221
- const typeToFolder = params.typeToFolder ?? resolveItemTypeRegistry(params.settings, getActiveExtensionRegistrations()).type_to_folder;
220
+ function bypassesAssigneeConflict(op, bypassAssigneeConflict) {
221
+ return (op === "claim" ||
222
+ (bypassAssigneeConflict === true &&
223
+ (op === "comment_add" ||
224
+ op === "note_add" ||
225
+ op === "learning_add" ||
226
+ op === "release" ||
227
+ op === "update" ||
228
+ op === "update_audit")));
229
+ }
230
+ async function prepareLockedItem(params) {
231
+ const typeToFolder = params.typeToFolder ??
232
+ resolveItemTypeRegistry(params.settings, getActiveExtensionRegistrations())
233
+ .type_to_folder;
222
234
  const located = await locateItem(params.pmRoot, params.id, params.settings.id_prefix, params.settings.item_format, typeToFolder);
223
235
  if (!located) {
224
236
  throw await buildItemNotFoundError(params.pmRoot, params.id, params.settings.id_prefix, typeToFolder);
225
237
  }
226
238
  const releaseLock = await acquireLock(params.pmRoot, located.id, params.settings.locks.ttl_seconds, params.author, Boolean(params.force), params.settings.governance.force_required_for_stale_lock);
227
239
  try {
228
- const parseWarnings = [];
240
+ const warnings = [];
229
241
  const { raw: originalRaw, document } = await readLocatedItem(located, {
230
242
  schema: params.settings.schema,
231
- warnings: parseWarnings,
243
+ warnings,
232
244
  });
233
245
  const assigned = document.metadata.assignee?.trim();
234
246
  const governance = resolveGovernanceKnobs(params.settings);
235
- const bypassAssigneeConflict = params.op === "claim" ||
236
- ((params.op === "comment_add" ||
237
- params.op === "note_add" ||
238
- params.op === "learning_add" ||
239
- params.op === "release" ||
240
- params.op === "update" ||
241
- params.op === "update_audit") &&
242
- params.bypassAssigneeConflict === true);
243
- const hasOwnershipConflict = assigned && assigned !== params.author && !params.force && !bypassAssigneeConflict;
247
+ const hasOwnershipConflict = assigned &&
248
+ assigned !== params.author &&
249
+ !params.force &&
250
+ !bypassesAssigneeConflict(params.op, params.bypassAssigneeConflict);
244
251
  if (hasOwnershipConflict) {
245
252
  if (governance.ownership_enforcement === "strict") {
246
253
  throw new PmCliError(`Item ${located.id} is assigned to ${assigned}. Use --force to override.`, EXIT_CODE.CONFLICT);
247
254
  }
248
255
  if (governance.ownership_enforcement === "warn") {
249
- parseWarnings.push(`ownership_warning:assignee_conflict:${located.id}:${assigned}`);
256
+ warnings.push(`ownership_warning:assignee_conflict:${located.id}:${assigned}`);
250
257
  }
251
258
  }
259
+ return {
260
+ typeToFolder,
261
+ located,
262
+ originalRaw,
263
+ document,
264
+ warnings,
265
+ releaseLock,
266
+ };
267
+ }
268
+ catch (error) {
269
+ await releaseLock();
270
+ throw error;
271
+ }
272
+ }
273
+ export async function mutateItem(params) {
274
+ const prepared = await prepareLockedItem({
275
+ pmRoot: params.pmRoot,
276
+ settings: params.settings,
277
+ id: params.id,
278
+ op: params.op,
279
+ author: params.author,
280
+ force: params.force,
281
+ bypassAssigneeConflict: params.bypassAssigneeConflict,
282
+ typeToFolder: params.typeToFolder,
283
+ });
284
+ const { typeToFolder, located, originalRaw, document, warnings: parseWarnings, releaseLock, } = prepared;
285
+ try {
252
286
  const historyPolicy = await enforceHistoryStreamPolicyForItem({
253
287
  pmRoot: params.pmRoot,
254
288
  settings: params.settings,
@@ -282,7 +316,9 @@ export async function mutateItem(params) {
282
316
  let effectiveTargetItemPath = targetItemPath;
283
317
  let effectiveSerializedAfter = serializedAfter;
284
318
  let skipItemWrite = false;
285
- if (serviceWriteOverride.handled && typeof serviceWriteOverride.result === "object" && serviceWriteOverride.result !== null) {
319
+ if (serviceWriteOverride.handled &&
320
+ typeof serviceWriteOverride.result === "object" &&
321
+ serviceWriteOverride.result !== null) {
286
322
  const overrideRecord = serviceWriteOverride.result;
287
323
  if (typeof overrideRecord.target_item_path === "string" && overrideRecord.target_item_path.trim().length > 0) {
288
324
  effectiveTargetItemPath = overrideRecord.target_item_path;
@@ -351,29 +387,16 @@ export async function mutateItem(params) {
351
387
  }
352
388
  }
353
389
  export async function deleteItem(params) {
354
- const typeToFolder = resolveItemTypeRegistry(params.settings, getActiveExtensionRegistrations()).type_to_folder;
355
- const located = await locateItem(params.pmRoot, params.id, params.settings.id_prefix, params.settings.item_format, typeToFolder);
356
- if (!located) {
357
- throw await buildItemNotFoundError(params.pmRoot, params.id, params.settings.id_prefix, typeToFolder);
358
- }
359
- const releaseLock = await acquireLock(params.pmRoot, located.id, params.settings.locks.ttl_seconds, params.author, Boolean(params.force), params.settings.governance.force_required_for_stale_lock);
390
+ const prepared = await prepareLockedItem({
391
+ pmRoot: params.pmRoot,
392
+ settings: params.settings,
393
+ id: params.id,
394
+ op: "delete",
395
+ author: params.author,
396
+ force: params.force,
397
+ });
398
+ const { located, originalRaw, document, warnings: parseWarnings, releaseLock } = prepared;
360
399
  try {
361
- const parseWarnings = [];
362
- const { raw: originalRaw, document } = await readLocatedItem(located, {
363
- schema: params.settings.schema,
364
- warnings: parseWarnings,
365
- });
366
- const assigned = document.metadata.assignee?.trim();
367
- const governance = resolveGovernanceKnobs(params.settings);
368
- const hasOwnershipConflict = assigned && assigned !== params.author && !params.force;
369
- if (hasOwnershipConflict) {
370
- if (governance.ownership_enforcement === "strict") {
371
- throw new PmCliError(`Item ${located.id} is assigned to ${assigned}. Use --force to override.`, EXIT_CODE.CONFLICT);
372
- }
373
- if (governance.ownership_enforcement === "warn") {
374
- parseWarnings.push(`ownership_warning:assignee_conflict:${located.id}:${assigned}`);
375
- }
376
- }
377
400
  const historyPolicy = await enforceHistoryStreamPolicyForItem({
378
401
  pmRoot: params.pmRoot,
379
402
  settings: params.settings,
@@ -413,6 +436,14 @@ export async function deleteItem(params) {
413
436
  skipDelete = true;
414
437
  }
415
438
  }
439
+ if (params.dryRun === true) {
440
+ return {
441
+ item: beforeDocument.metadata,
442
+ changedFields: ["deleted"],
443
+ targetPath: effectiveItemPath,
444
+ warnings: [...parseWarnings, ...historyPolicy.warnings, ...serviceDeleteOverride.warnings],
445
+ };
446
+ }
416
447
  if (!skipDelete) {
417
448
  await fs.rm(effectiveItemPath);
418
449
  }
@@ -448,4 +479,4 @@ export async function deleteItem(params) {
448
479
  }
449
480
  }
450
481
  //# sourceMappingURL=item-store.js.map
451
- //# debugId=9faa72aa-63a0-5ae8-b9c8-62376ee34108
482
+ //# debugId=2b2ff59e-d0db-53b1-b67f-a7dcc221ff00