@unbrained/pm-cli 2026.3.12 → 2026.5.1-2

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 (285) hide show
  1. package/.agents/pm/extensions/.managed-extensions.json +42 -0
  2. package/.agents/pm/extensions/beads/index.js +109 -0
  3. package/.agents/pm/extensions/beads/manifest.json +7 -0
  4. package/{dist/cli/commands/beads.js → .agents/pm/extensions/beads/runtime.js} +31 -21
  5. package/.agents/pm/extensions/beads/runtime.ts +702 -0
  6. package/.agents/pm/extensions/todos/index.js +126 -0
  7. package/.agents/pm/extensions/todos/manifest.json +7 -0
  8. package/{dist/extensions/builtins/todos/import-export.js → .agents/pm/extensions/todos/runtime.js} +39 -29
  9. package/.agents/pm/extensions/todos/runtime.ts +568 -0
  10. package/AGENTS.md +196 -92
  11. package/CHANGELOG.md +404 -0
  12. package/CODE_OF_CONDUCT.md +42 -0
  13. package/CONTRIBUTING.md +144 -0
  14. package/PRD.md +512 -164
  15. package/README.md +1053 -2
  16. package/SECURITY.md +51 -0
  17. package/dist/cli/commands/activity.d.ts +5 -0
  18. package/dist/cli/commands/activity.js +66 -3
  19. package/dist/cli/commands/activity.js.map +1 -1
  20. package/dist/cli/commands/aggregate.d.ts +54 -0
  21. package/dist/cli/commands/aggregate.js +181 -0
  22. package/dist/cli/commands/aggregate.js.map +1 -0
  23. package/dist/cli/commands/append.js +4 -1
  24. package/dist/cli/commands/append.js.map +1 -1
  25. package/dist/cli/commands/calendar.d.ts +109 -0
  26. package/dist/cli/commands/calendar.js +797 -0
  27. package/dist/cli/commands/calendar.js.map +1 -0
  28. package/dist/cli/commands/claim.d.ts +5 -1
  29. package/dist/cli/commands/claim.js +42 -21
  30. package/dist/cli/commands/claim.js.map +1 -1
  31. package/dist/cli/commands/close.d.ts +1 -0
  32. package/dist/cli/commands/close.js +54 -5
  33. package/dist/cli/commands/close.js.map +1 -1
  34. package/dist/cli/commands/comments-audit.d.ts +91 -0
  35. package/dist/cli/commands/comments-audit.js +195 -0
  36. package/dist/cli/commands/comments-audit.js.map +1 -0
  37. package/dist/cli/commands/comments.d.ts +1 -0
  38. package/dist/cli/commands/comments.js +70 -21
  39. package/dist/cli/commands/comments.js.map +1 -1
  40. package/dist/cli/commands/completion.d.ts +10 -4
  41. package/dist/cli/commands/completion.js +1184 -137
  42. package/dist/cli/commands/completion.js.map +1 -1
  43. package/dist/cli/commands/config.d.ts +35 -3
  44. package/dist/cli/commands/config.js +968 -13
  45. package/dist/cli/commands/config.js.map +1 -1
  46. package/dist/cli/commands/context.d.ts +86 -0
  47. package/dist/cli/commands/context.js +299 -0
  48. package/dist/cli/commands/context.js.map +1 -0
  49. package/dist/cli/commands/contracts.d.ts +78 -0
  50. package/dist/cli/commands/contracts.js +920 -0
  51. package/dist/cli/commands/contracts.js.map +1 -0
  52. package/dist/cli/commands/create.d.ts +48 -14
  53. package/dist/cli/commands/create.js +1331 -160
  54. package/dist/cli/commands/create.js.map +1 -1
  55. package/dist/cli/commands/dedupe-audit.d.ts +81 -0
  56. package/dist/cli/commands/dedupe-audit.js +330 -0
  57. package/dist/cli/commands/dedupe-audit.js.map +1 -0
  58. package/dist/cli/commands/deps.d.ts +52 -0
  59. package/dist/cli/commands/deps.js +204 -0
  60. package/dist/cli/commands/deps.js.map +1 -0
  61. package/dist/cli/commands/docs.d.ts +19 -0
  62. package/dist/cli/commands/docs.js +212 -13
  63. package/dist/cli/commands/docs.js.map +1 -1
  64. package/dist/cli/commands/extension.d.ts +122 -0
  65. package/dist/cli/commands/extension.js +1850 -0
  66. package/dist/cli/commands/extension.js.map +1 -0
  67. package/dist/cli/commands/files.d.ts +52 -1
  68. package/dist/cli/commands/files.js +455 -13
  69. package/dist/cli/commands/files.js.map +1 -1
  70. package/dist/cli/commands/gc.d.ts +11 -1
  71. package/dist/cli/commands/gc.js +89 -11
  72. package/dist/cli/commands/gc.js.map +1 -1
  73. package/dist/cli/commands/get.d.ts +13 -0
  74. package/dist/cli/commands/get.js +35 -3
  75. package/dist/cli/commands/get.js.map +1 -1
  76. package/dist/cli/commands/health.d.ts +10 -2
  77. package/dist/cli/commands/health.js +774 -23
  78. package/dist/cli/commands/health.js.map +1 -1
  79. package/dist/cli/commands/history.d.ts +20 -0
  80. package/dist/cli/commands/history.js +152 -6
  81. package/dist/cli/commands/history.js.map +1 -1
  82. package/dist/cli/commands/index.d.ts +16 -3
  83. package/dist/cli/commands/index.js +16 -3
  84. package/dist/cli/commands/index.js.map +1 -1
  85. package/dist/cli/commands/init.d.ts +7 -2
  86. package/dist/cli/commands/init.js +137 -5
  87. package/dist/cli/commands/init.js.map +1 -1
  88. package/dist/cli/commands/learnings.d.ts +17 -0
  89. package/dist/cli/commands/learnings.js +129 -0
  90. package/dist/cli/commands/learnings.js.map +1 -0
  91. package/dist/cli/commands/list.d.ts +29 -1
  92. package/dist/cli/commands/list.js +289 -53
  93. package/dist/cli/commands/list.js.map +1 -1
  94. package/dist/cli/commands/normalize.d.ts +51 -0
  95. package/dist/cli/commands/normalize.js +298 -0
  96. package/dist/cli/commands/normalize.js.map +1 -0
  97. package/dist/cli/commands/notes.d.ts +17 -0
  98. package/dist/cli/commands/notes.js +129 -0
  99. package/dist/cli/commands/notes.js.map +1 -0
  100. package/dist/cli/commands/reindex.d.ts +1 -0
  101. package/dist/cli/commands/reindex.js +208 -32
  102. package/dist/cli/commands/reindex.js.map +1 -1
  103. package/dist/cli/commands/restore.js +164 -30
  104. package/dist/cli/commands/restore.js.map +1 -1
  105. package/dist/cli/commands/search.d.ts +14 -1
  106. package/dist/cli/commands/search.js +475 -81
  107. package/dist/cli/commands/search.js.map +1 -1
  108. package/dist/cli/commands/stats.js +26 -10
  109. package/dist/cli/commands/stats.js.map +1 -1
  110. package/dist/cli/commands/templates.d.ts +26 -0
  111. package/dist/cli/commands/templates.js +179 -0
  112. package/dist/cli/commands/templates.js.map +1 -0
  113. package/dist/cli/commands/test-all.d.ts +19 -1
  114. package/dist/cli/commands/test-all.js +161 -13
  115. package/dist/cli/commands/test-all.js.map +1 -1
  116. package/dist/cli/commands/test-runs.d.ts +63 -0
  117. package/dist/cli/commands/test-runs.js +179 -0
  118. package/dist/cli/commands/test-runs.js.map +1 -0
  119. package/dist/cli/commands/test.d.ts +75 -1
  120. package/dist/cli/commands/test.js +1360 -41
  121. package/dist/cli/commands/test.js.map +1 -1
  122. package/dist/cli/commands/update-many.d.ts +57 -0
  123. package/dist/cli/commands/update-many.js +631 -0
  124. package/dist/cli/commands/update-many.js.map +1 -0
  125. package/dist/cli/commands/update.d.ts +30 -0
  126. package/dist/cli/commands/update.js +1393 -84
  127. package/dist/cli/commands/update.js.map +1 -1
  128. package/dist/cli/commands/validate.d.ts +30 -0
  129. package/dist/cli/commands/validate.js +1151 -0
  130. package/dist/cli/commands/validate.js.map +1 -0
  131. package/dist/cli/error-guidance.d.ts +33 -0
  132. package/dist/cli/error-guidance.js +337 -0
  133. package/dist/cli/error-guidance.js.map +1 -0
  134. package/dist/cli/extension-command-options.d.ts +1 -0
  135. package/dist/cli/extension-command-options.js +92 -0
  136. package/dist/cli/extension-command-options.js.map +1 -1
  137. package/dist/cli/help-content.d.ts +20 -0
  138. package/dist/cli/help-content.js +543 -0
  139. package/dist/cli/help-content.js.map +1 -0
  140. package/dist/cli/main.js +3625 -445
  141. package/dist/cli/main.js.map +1 -1
  142. package/dist/core/extensions/index.d.ts +13 -1
  143. package/dist/core/extensions/index.js +108 -1
  144. package/dist/core/extensions/index.js.map +1 -1
  145. package/dist/core/extensions/item-fields.d.ts +2 -0
  146. package/dist/core/extensions/item-fields.js +79 -0
  147. package/dist/core/extensions/item-fields.js.map +1 -0
  148. package/dist/core/extensions/loader.d.ts +322 -9
  149. package/dist/core/extensions/loader.js +911 -20
  150. package/dist/core/extensions/loader.js.map +1 -1
  151. package/dist/core/extensions/runtime-registrations.d.ts +5 -0
  152. package/dist/core/extensions/runtime-registrations.js +51 -0
  153. package/dist/core/extensions/runtime-registrations.js.map +1 -0
  154. package/dist/core/history/history-stream-policy.d.ts +20 -0
  155. package/dist/core/history/history-stream-policy.js +53 -0
  156. package/dist/core/history/history-stream-policy.js.map +1 -0
  157. package/dist/core/history/history.js +90 -1
  158. package/dist/core/history/history.js.map +1 -1
  159. package/dist/core/item/id.js +4 -1
  160. package/dist/core/item/id.js.map +1 -1
  161. package/dist/core/item/index.d.ts +1 -0
  162. package/dist/core/item/index.js +1 -0
  163. package/dist/core/item/index.js.map +1 -1
  164. package/dist/core/item/item-format.d.ts +11 -5
  165. package/dist/core/item/item-format.js +507 -24
  166. package/dist/core/item/item-format.js.map +1 -1
  167. package/dist/core/item/parent-reference-policy.d.ts +6 -0
  168. package/dist/core/item/parent-reference-policy.js +32 -0
  169. package/dist/core/item/parent-reference-policy.js.map +1 -0
  170. package/dist/core/item/parse.d.ts +5 -0
  171. package/dist/core/item/parse.js +216 -19
  172. package/dist/core/item/parse.js.map +1 -1
  173. package/dist/core/item/sprint-release-format.d.ts +6 -0
  174. package/dist/core/item/sprint-release-format.js +33 -0
  175. package/dist/core/item/sprint-release-format.js.map +1 -0
  176. package/dist/core/item/status.d.ts +3 -0
  177. package/dist/core/item/status.js +24 -0
  178. package/dist/core/item/status.js.map +1 -0
  179. package/dist/core/item/type-registry.d.ts +37 -0
  180. package/dist/core/item/type-registry.js +706 -0
  181. package/dist/core/item/type-registry.js.map +1 -0
  182. package/dist/core/lock/lock.d.ts +1 -1
  183. package/dist/core/lock/lock.js +101 -12
  184. package/dist/core/lock/lock.js.map +1 -1
  185. package/dist/core/output/command-aware.d.ts +1 -0
  186. package/dist/core/output/command-aware.js +394 -0
  187. package/dist/core/output/command-aware.js.map +1 -0
  188. package/dist/core/output/output.d.ts +3 -0
  189. package/dist/core/output/output.js +124 -6
  190. package/dist/core/output/output.js.map +1 -1
  191. package/dist/core/schema/runtime-field-filters.d.ts +3 -0
  192. package/dist/core/schema/runtime-field-filters.js +39 -0
  193. package/dist/core/schema/runtime-field-filters.js.map +1 -0
  194. package/dist/core/schema/runtime-field-values.d.ts +8 -0
  195. package/dist/core/schema/runtime-field-values.js +154 -0
  196. package/dist/core/schema/runtime-field-values.js.map +1 -0
  197. package/dist/core/schema/runtime-schema.d.ts +68 -0
  198. package/dist/core/schema/runtime-schema.js +554 -0
  199. package/dist/core/schema/runtime-schema.js.map +1 -0
  200. package/dist/core/search/cache.d.ts +13 -1
  201. package/dist/core/search/cache.js +123 -14
  202. package/dist/core/search/cache.js.map +1 -1
  203. package/dist/core/search/semantic-defaults.d.ts +6 -0
  204. package/dist/core/search/semantic-defaults.js +120 -0
  205. package/dist/core/search/semantic-defaults.js.map +1 -0
  206. package/dist/core/search/vector-stores.js +3 -1
  207. package/dist/core/search/vector-stores.js.map +1 -1
  208. package/dist/core/shared/command-types.d.ts +2 -0
  209. package/dist/core/shared/conflict-markers.d.ts +7 -0
  210. package/dist/core/shared/conflict-markers.js +27 -0
  211. package/dist/core/shared/conflict-markers.js.map +1 -0
  212. package/dist/core/shared/constants.d.ts +15 -4
  213. package/dist/core/shared/constants.js +141 -1
  214. package/dist/core/shared/constants.js.map +1 -1
  215. package/dist/core/shared/errors.d.ts +10 -1
  216. package/dist/core/shared/errors.js +3 -1
  217. package/dist/core/shared/errors.js.map +1 -1
  218. package/dist/core/shared/text-normalization.d.ts +4 -0
  219. package/dist/core/shared/text-normalization.js +33 -0
  220. package/dist/core/shared/text-normalization.js.map +1 -0
  221. package/dist/core/shared/time.d.ts +1 -2
  222. package/dist/core/shared/time.js +98 -11
  223. package/dist/core/shared/time.js.map +1 -1
  224. package/dist/core/store/index.d.ts +1 -0
  225. package/dist/core/store/index.js +1 -0
  226. package/dist/core/store/index.js.map +1 -1
  227. package/dist/core/store/item-format-migration.d.ts +9 -0
  228. package/dist/core/store/item-format-migration.js +87 -0
  229. package/dist/core/store/item-format-migration.js.map +1 -0
  230. package/dist/core/store/item-store.d.ts +13 -4
  231. package/dist/core/store/item-store.js +238 -51
  232. package/dist/core/store/item-store.js.map +1 -1
  233. package/dist/core/store/paths.d.ts +21 -3
  234. package/dist/core/store/paths.js +59 -4
  235. package/dist/core/store/paths.js.map +1 -1
  236. package/dist/core/store/settings.d.ts +14 -1
  237. package/dist/core/store/settings.js +463 -7
  238. package/dist/core/store/settings.js.map +1 -1
  239. package/dist/core/telemetry/consent.d.ts +2 -0
  240. package/dist/core/telemetry/consent.js +79 -0
  241. package/dist/core/telemetry/consent.js.map +1 -0
  242. package/dist/core/telemetry/runtime.d.ts +38 -0
  243. package/dist/core/telemetry/runtime.js +733 -0
  244. package/dist/core/telemetry/runtime.js.map +1 -0
  245. package/dist/core/test/background-runs.d.ts +117 -0
  246. package/dist/core/test/background-runs.js +760 -0
  247. package/dist/core/test/background-runs.js.map +1 -0
  248. package/dist/core/test/item-test-run-tracking.d.ts +9 -0
  249. package/dist/core/test/item-test-run-tracking.js +50 -0
  250. package/dist/core/test/item-test-run-tracking.js.map +1 -0
  251. package/dist/sdk/cli-contracts.d.ts +92 -0
  252. package/dist/sdk/cli-contracts.js +2357 -0
  253. package/dist/sdk/cli-contracts.js.map +1 -0
  254. package/dist/sdk/index.d.ts +34 -0
  255. package/dist/sdk/index.js +23 -0
  256. package/dist/sdk/index.js.map +1 -0
  257. package/dist/types.d.ts +197 -3
  258. package/dist/types.js +48 -1
  259. package/dist/types.js.map +1 -1
  260. package/docs/ARCHITECTURE.md +368 -39
  261. package/docs/EXTENSIONS.md +454 -49
  262. package/docs/RELEASING.md +70 -19
  263. package/docs/SDK.md +123 -0
  264. package/docs/examples/starter-extension/README.md +48 -0
  265. package/docs/examples/starter-extension/index.js +191 -0
  266. package/docs/examples/starter-extension/manifest.json +17 -0
  267. package/docs/examples/starter-extension/package.json +10 -0
  268. package/package.json +41 -14
  269. package/.pi/extensions/pm-cli/index.ts +0 -778
  270. package/dist/cli/commands/beads.d.ts +0 -16
  271. package/dist/cli/commands/beads.js.map +0 -1
  272. package/dist/cli/commands/install.d.ts +0 -18
  273. package/dist/cli/commands/install.js +0 -87
  274. package/dist/cli/commands/install.js.map +0 -1
  275. package/dist/core/extensions/builtins.d.ts +0 -3
  276. package/dist/core/extensions/builtins.js +0 -47
  277. package/dist/core/extensions/builtins.js.map +0 -1
  278. package/dist/extensions/builtins/beads/index.d.ts +0 -8
  279. package/dist/extensions/builtins/beads/index.js +0 -33
  280. package/dist/extensions/builtins/beads/index.js.map +0 -1
  281. package/dist/extensions/builtins/todos/import-export.d.ts +0 -26
  282. package/dist/extensions/builtins/todos/import-export.js.map +0 -1
  283. package/dist/extensions/builtins/todos/index.d.ts +0 -8
  284. package/dist/extensions/builtins/todos/index.js +0 -38
  285. package/dist/extensions/builtins/todos/index.js.map +0 -1
@@ -1,19 +1,35 @@
1
- import fs from "node:fs/promises";
2
1
  import path from "node:path";
3
- import { runActiveOnIndexHooks, runActiveOnReadHooks, runActiveOnWriteHooks } from "../../core/extensions/index.js";
2
+ import { getActiveExtensionRegistrations, runActiveOnIndexHooks, runActiveOnWriteHooks } from "../../core/extensions/index.js";
3
+ import { resolveRegisteredSearchProvider, resolveRegisteredVectorStoreAdapter, } from "../../core/extensions/runtime-registrations.js";
4
4
  import { pathExists, writeFileAtomic } from "../../core/fs/fs-utils.js";
5
- import { parseItemDocument } from "../../core/item/item-format.js";
5
+ import { resolveItemTypeRegistry } from "../../core/item/type-registry.js";
6
6
  import { executeEmbeddingBatchesWithRetry } from "../../core/search/embedding-batches.js";
7
+ import { writeVectorizationStatusLedger } from "../../core/search/cache.js";
7
8
  import { resolveEmbeddingProviders } from "../../core/search/providers.js";
9
+ import { resolveSettingsWithSemanticRuntimeDefaults } from "../../core/search/semantic-defaults.js";
8
10
  import { executeVectorUpsert, resolveVectorStores } from "../../core/search/vector-stores.js";
9
- import { EXIT_CODE, TYPE_TO_FOLDER } from "../../core/shared/constants.js";
11
+ import { EXIT_CODE } from "../../core/shared/constants.js";
10
12
  import { PmCliError } from "../../core/shared/errors.js";
11
13
  import { nowIso } from "../../core/shared/time.js";
12
- import { listAllFrontMatter } from "../../core/store/item-store.js";
14
+ import { listAllFrontMatterWithBody } from "../../core/store/item-store.js";
13
15
  import { getSettingsPath, resolvePmRoot } from "../../core/store/paths.js";
14
16
  import { readSettings } from "../../core/store/settings.js";
15
17
  const MANIFEST_PATH = "index/manifest.json";
16
18
  const EMBEDDINGS_PATH = "search/embeddings.jsonl";
19
+ function shouldEmitReindexProgress(options) {
20
+ return options.progress === true || process.stderr.isTTY === true;
21
+ }
22
+ function emitReindexProgress(enabled, message) {
23
+ if (!enabled) {
24
+ return;
25
+ }
26
+ try {
27
+ process.stderr.write(`[pm reindex] ${message}\n`);
28
+ }
29
+ catch {
30
+ // Ignore transient stderr write failures.
31
+ }
32
+ }
17
33
  function parseMode(raw) {
18
34
  const normalized = (raw ?? "keyword").trim().toLowerCase();
19
35
  if (normalized === "keyword") {
@@ -24,20 +40,15 @@ function parseMode(raw) {
24
40
  }
25
41
  throw new PmCliError("Reindex mode must be one of keyword|semantic|hybrid", EXIT_CODE.USAGE);
26
42
  }
27
- async function loadDocuments(pmRoot) {
28
- const items = await listAllFrontMatter(pmRoot);
29
- const sortedItems = [...items].sort((a, b) => a.id.localeCompare(b.id));
30
- const documents = [];
31
- for (const item of sortedItems) {
32
- const itemPath = path.join(pmRoot, TYPE_TO_FOLDER[item.type], `${item.id}.md`);
33
- const raw = await fs.readFile(itemPath, "utf8");
34
- await runActiveOnReadHooks({
35
- path: itemPath,
36
- scope: "project",
37
- });
38
- documents.push(parseItemDocument(raw));
39
- }
40
- return documents;
43
+ async function loadDocuments(pmRoot, itemFormat, typeToFolder, schema) {
44
+ const items = await listAllFrontMatterWithBody(pmRoot, itemFormat, typeToFolder, undefined, schema);
45
+ return items.map((item) => {
46
+ const { body, ...frontMatter } = item;
47
+ return {
48
+ front_matter: frontMatter,
49
+ body,
50
+ };
51
+ });
41
52
  }
42
53
  function buildKeywordRecord(document, mode) {
43
54
  const item = document.front_matter;
@@ -64,29 +75,128 @@ function buildKeywordRecord(document, mode) {
64
75
  function buildSemanticCorpusInput(document) {
65
76
  return JSON.stringify(buildKeywordRecord(document, "semantic").corpus);
66
77
  }
78
+ function toOptionalNonEmptyString(value) {
79
+ if (typeof value !== "string") {
80
+ return undefined;
81
+ }
82
+ const normalized = value.trim();
83
+ return normalized.length > 0 ? normalized : undefined;
84
+ }
85
+ function resolveExtensionSearchEmbedding(settings) {
86
+ const registrations = getActiveExtensionRegistrations();
87
+ const providerName = toOptionalNonEmptyString(settings.search?.provider);
88
+ const registration = resolveRegisteredSearchProvider(registrations, providerName);
89
+ if (!registration) {
90
+ return null;
91
+ }
92
+ const runtimeDefinition = registration.runtime_definition ?? registration.definition;
93
+ const name = toOptionalNonEmptyString(runtimeDefinition.name) ??
94
+ toOptionalNonEmptyString(registration.definition.name) ??
95
+ providerName;
96
+ if (!name) {
97
+ return null;
98
+ }
99
+ const embedBatch = runtimeDefinition.embedBatch;
100
+ const embedBatchSnake = runtimeDefinition.embed_batch;
101
+ const embed = runtimeDefinition.embed;
102
+ const resolvedEmbedBatch = typeof embedBatch === "function"
103
+ ? embedBatch
104
+ : typeof embedBatchSnake === "function"
105
+ ? embedBatchSnake
106
+ : undefined;
107
+ const resolvedEmbed = typeof embed === "function" ? embed : undefined;
108
+ if (!resolvedEmbedBatch && !resolvedEmbed) {
109
+ return null;
110
+ }
111
+ return {
112
+ name,
113
+ embedBatch: resolvedEmbedBatch,
114
+ embed: resolvedEmbed,
115
+ };
116
+ }
117
+ function resolveExtensionVectorUpsert(settings) {
118
+ const registrations = getActiveExtensionRegistrations();
119
+ const adapterName = toOptionalNonEmptyString(settings.vector_store?.adapter);
120
+ const registration = resolveRegisteredVectorStoreAdapter(registrations, adapterName);
121
+ if (!registration) {
122
+ return null;
123
+ }
124
+ const runtimeDefinition = registration.runtime_definition ?? registration.definition;
125
+ const name = toOptionalNonEmptyString(runtimeDefinition.name) ??
126
+ toOptionalNonEmptyString(registration.definition.name) ??
127
+ adapterName;
128
+ const upsert = runtimeDefinition.upsert;
129
+ if (!name || typeof upsert !== "function") {
130
+ return null;
131
+ }
132
+ return {
133
+ name,
134
+ upsert: upsert,
135
+ };
136
+ }
137
+ function assertVector(value, context) {
138
+ if (!Array.isArray(value) || value.some((entry) => typeof entry !== "number" || !Number.isFinite(entry))) {
139
+ throw new PmCliError(`Invalid vector returned by ${context}`, EXIT_CODE.GENERIC_FAILURE);
140
+ }
141
+ return value;
142
+ }
143
+ async function executeExtensionEmbedding(extensionEmbedding, settings, corpusInputs) {
144
+ const model = settings.search?.embedding_model?.trim() || "text-embedding-3-small";
145
+ if (extensionEmbedding.embedBatch) {
146
+ const vectors = await Promise.resolve(extensionEmbedding.embedBatch({
147
+ inputs: corpusInputs,
148
+ settings,
149
+ model,
150
+ }));
151
+ if (!Array.isArray(vectors)) {
152
+ throw new PmCliError(`Extension search provider "${extensionEmbedding.name}" embedBatch must return an array of vectors`, EXIT_CODE.GENERIC_FAILURE);
153
+ }
154
+ return vectors.map((vector, index) => assertVector(vector, `extension search provider "${extensionEmbedding.name}" embedBatch output at index ${index}`));
155
+ }
156
+ if (!extensionEmbedding.embed) {
157
+ throw new PmCliError(`Extension search provider "${extensionEmbedding.name}" does not implement embed/embedBatch`, EXIT_CODE.GENERIC_FAILURE);
158
+ }
159
+ const vectors = [];
160
+ for (const [index, input] of corpusInputs.entries()) {
161
+ const vector = await Promise.resolve(extensionEmbedding.embed({
162
+ input,
163
+ settings,
164
+ model,
165
+ }));
166
+ vectors.push(assertVector(vector, `extension search provider "${extensionEmbedding.name}" embed output at index ${index}`));
167
+ }
168
+ return vectors;
169
+ }
67
170
  export async function runReindex(options, global) {
68
171
  const requestedMode = parseMode(options.mode);
172
+ const progressEnabled = shouldEmitReindexProgress(options);
173
+ emitReindexProgress(progressEnabled, `start mode=${requestedMode}`);
69
174
  const pmRoot = resolvePmRoot(process.cwd(), global.path);
70
175
  if (!(await pathExists(getSettingsPath(pmRoot)))) {
71
176
  throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);
72
177
  }
73
- const settings = await readSettings(pmRoot);
178
+ const settings = resolveSettingsWithSemanticRuntimeDefaults(await readSettings(pmRoot)).settings;
179
+ const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());
180
+ const extensionEmbedding = resolveExtensionSearchEmbedding(settings);
181
+ const extensionVectorUpsert = resolveExtensionVectorUpsert(settings);
74
182
  let activeEmbeddingProvider = null;
75
183
  let activeVectorStore = null;
76
184
  if (requestedMode !== "keyword") {
77
185
  const providerResolution = resolveEmbeddingProviders(settings);
78
- if (!providerResolution.active) {
79
- throw new PmCliError(`Reindex mode '${requestedMode}' requires a configured embedding provider in settings.providers.openai or settings.providers.ollama`, EXIT_CODE.USAGE);
186
+ if (!providerResolution.active && !extensionEmbedding) {
187
+ throw new PmCliError(`Reindex mode '${requestedMode}' requires a configured embedding provider in settings.providers.openai/settings.providers.ollama or an extension provider selected by settings.search.provider`, EXIT_CODE.USAGE);
80
188
  }
81
189
  const vectorResolution = resolveVectorStores(settings);
82
- if (!vectorResolution.active) {
83
- throw new PmCliError(`Reindex mode '${requestedMode}' requires a configured vector store in settings.vector_store.qdrant or settings.vector_store.lancedb`, EXIT_CODE.USAGE);
190
+ if (!vectorResolution.active && !extensionVectorUpsert) {
191
+ throw new PmCliError(`Reindex mode '${requestedMode}' requires a configured vector store in settings.vector_store.qdrant/settings.vector_store.lancedb or an extension adapter selected by settings.vector_store.adapter`, EXIT_CODE.USAGE);
84
192
  }
85
193
  activeEmbeddingProvider = providerResolution.active;
86
194
  activeVectorStore = vectorResolution.active;
87
195
  }
88
196
  const mode = requestedMode;
89
- const documents = await loadDocuments(pmRoot);
197
+ emitReindexProgress(progressEnabled, "loading item corpus");
198
+ const documents = await loadDocuments(pmRoot, settings.item_format, typeRegistry.type_to_folder, settings.schema);
199
+ emitReindexProgress(progressEnabled, `loaded_items=${documents.length}`);
90
200
  const generatedAt = nowIso();
91
201
  const manifest = {
92
202
  version: 1,
@@ -105,13 +215,37 @@ export async function runReindex(options, global) {
105
215
  const embeddingsPath = path.join(pmRoot, EMBEDDINGS_PATH);
106
216
  const embeddingsLines = documents.map((document) => JSON.stringify(buildKeywordRecord(document, mode))).join("\n");
107
217
  const semanticWarnings = [];
108
- if (mode !== "keyword" && documents.length > 0 && activeEmbeddingProvider && activeVectorStore) {
218
+ const vectorizationLedgerEntries = {};
219
+ if (mode !== "keyword" && documents.length > 0) {
220
+ emitReindexProgress(progressEnabled, `embedding_start items=${documents.length}`);
109
221
  const corpusInputs = documents.map((document) => buildSemanticCorpusInput(document));
110
- const embeddingResult = await executeEmbeddingBatchesWithRetry(activeEmbeddingProvider, settings, corpusInputs);
111
- semanticWarnings.push(...embeddingResult.warnings);
112
- await executeVectorUpsert(activeVectorStore, documents.map((document, index) => ({
222
+ let vectors = [];
223
+ if (extensionEmbedding) {
224
+ try {
225
+ vectors = await executeExtensionEmbedding(extensionEmbedding, settings, corpusInputs);
226
+ }
227
+ catch (error) {
228
+ if (!activeEmbeddingProvider) {
229
+ throw new PmCliError(`Extension search provider "${extensionEmbedding.name}" failed to generate embeddings: ${error instanceof Error ? error.message : String(error)}`, EXIT_CODE.GENERIC_FAILURE);
230
+ }
231
+ semanticWarnings.push(`Extension search provider "${extensionEmbedding.name}" failed; falling back to built-in provider (${error instanceof Error ? error.message : String(error)})`);
232
+ }
233
+ }
234
+ if (vectors.length === 0) {
235
+ if (!activeEmbeddingProvider) {
236
+ throw new PmCliError(`No embedding executor available for reindex mode '${requestedMode}'`, EXIT_CODE.USAGE);
237
+ }
238
+ const embeddingResult = await executeEmbeddingBatchesWithRetry(activeEmbeddingProvider, settings, corpusInputs);
239
+ semanticWarnings.push(...embeddingResult.warnings);
240
+ vectors = embeddingResult.vectors;
241
+ }
242
+ emitReindexProgress(progressEnabled, `embedding_complete vectors=${vectors.length}`);
243
+ if (vectors.length !== documents.length) {
244
+ throw new PmCliError(`Embedding output size mismatch (expected ${documents.length}, received ${vectors.length})`, EXIT_CODE.GENERIC_FAILURE);
245
+ }
246
+ const points = documents.map((document, index) => ({
113
247
  id: document.front_matter.id,
114
- vector: embeddingResult.vectors[index],
248
+ vector: assertVector(vectors[index], `reindex embeddings output at index ${index}`),
115
249
  payload: {
116
250
  id: document.front_matter.id,
117
251
  type: document.front_matter.type,
@@ -119,10 +253,51 @@ export async function runReindex(options, global) {
119
253
  priority: document.front_matter.priority,
120
254
  updated_at: document.front_matter.updated_at,
121
255
  },
122
- })));
256
+ }));
257
+ if (extensionVectorUpsert) {
258
+ try {
259
+ emitReindexProgress(progressEnabled, `vector_upsert_start adapter=${extensionVectorUpsert.name} points=${points.length}`);
260
+ await Promise.resolve(extensionVectorUpsert.upsert({
261
+ points,
262
+ settings,
263
+ }));
264
+ emitReindexProgress(progressEnabled, `vector_upsert_complete adapter=${extensionVectorUpsert.name}`);
265
+ }
266
+ catch (error) {
267
+ if (!activeVectorStore) {
268
+ throw new PmCliError(`Extension vector adapter "${extensionVectorUpsert.name}" failed to upsert vectors: ${error instanceof Error ? error.message : String(error)}`, EXIT_CODE.GENERIC_FAILURE);
269
+ }
270
+ semanticWarnings.push(`Extension vector adapter "${extensionVectorUpsert.name}" failed; falling back to built-in vector store (${error instanceof Error ? error.message : String(error)})`);
271
+ emitReindexProgress(progressEnabled, "vector_upsert_fallback built_in_store");
272
+ await executeVectorUpsert(activeVectorStore, points);
273
+ emitReindexProgress(progressEnabled, `vector_upsert_complete adapter=${activeVectorStore.name}`);
274
+ }
275
+ }
276
+ else if (activeVectorStore) {
277
+ emitReindexProgress(progressEnabled, `vector_upsert_start adapter=${activeVectorStore.name} points=${points.length}`);
278
+ await executeVectorUpsert(activeVectorStore, points);
279
+ emitReindexProgress(progressEnabled, `vector_upsert_complete adapter=${activeVectorStore.name}`);
280
+ }
281
+ else {
282
+ throw new PmCliError(`No vector upsert executor available for reindex mode '${requestedMode}'`, EXIT_CODE.USAGE);
283
+ }
284
+ for (const document of documents) {
285
+ vectorizationLedgerEntries[document.front_matter.id] = document.front_matter.updated_at;
286
+ }
123
287
  }
288
+ emitReindexProgress(progressEnabled, "writing keyword artifacts");
124
289
  await writeFileAtomic(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`);
125
290
  await writeFileAtomic(embeddingsPath, `${embeddingsLines}\n`);
291
+ const vectorizationWarnings = [];
292
+ if (mode !== "keyword") {
293
+ try {
294
+ emitReindexProgress(progressEnabled, "writing vectorization status ledger");
295
+ await writeVectorizationStatusLedger(pmRoot, vectorizationLedgerEntries);
296
+ }
297
+ catch (error) {
298
+ vectorizationWarnings.push(`search_vectorization_status_ledger_write_failed:${error instanceof Error ? error.message : String(error)}`);
299
+ }
300
+ }
126
301
  const hookWarnings = [
127
302
  ...(await runActiveOnWriteHooks({
128
303
  path: manifestPath,
@@ -139,6 +314,7 @@ export async function runReindex(options, global) {
139
314
  total_items: documents.length,
140
315
  })),
141
316
  ];
317
+ emitReindexProgress(progressEnabled, "done");
142
318
  return {
143
319
  ok: true,
144
320
  mode,
@@ -147,7 +323,7 @@ export async function runReindex(options, global) {
147
323
  manifest: MANIFEST_PATH,
148
324
  embeddings: EMBEDDINGS_PATH,
149
325
  },
150
- warnings: [...semanticWarnings, ...hookWarnings],
326
+ warnings: [...semanticWarnings, ...vectorizationWarnings, ...hookWarnings],
151
327
  generated_at: generatedAt,
152
328
  };
153
329
  }
@@ -1 +1 @@
1
- {"version":3,"file":"reindex.js","sourceRoot":"","sources":["../../../src/cli/commands/reindex.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reindex.js","sourceRoot":"","sources":["../../../src/cli/commands/reindex.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,19 @@
1
1
  import jsonPatch from "fast-json-patch";
2
+ import fs from "node:fs/promises";
2
3
  import { pathExists, writeFileAtomic } from "../../core/fs/fs-utils.js";
3
4
  import { appendHistoryEntry, createHistoryEntry } from "../../core/history/history.js";
5
+ import { enforceHistoryStreamPolicyForItem } from "../../core/history/history-stream-policy.js";
6
+ import { normalizeItemId, normalizeRawItemId } from "../../core/item/id.js";
4
7
  import { canonicalDocument, serializeItemDocument } from "../../core/item/item-format.js";
8
+ import { resolveItemTypeRegistry } from "../../core/item/type-registry.js";
5
9
  import { acquireLock } from "../../core/lock/lock.js";
6
10
  import { EXIT_CODE, FRONT_MATTER_KEY_ORDER } from "../../core/shared/constants.js";
7
11
  import { PmCliError } from "../../core/shared/errors.js";
8
12
  import { nowIso } from "../../core/shared/time.js";
9
13
  import { orderObject, sha256Hex, stableStringify } from "../../core/shared/serialization.js";
10
- import { runActiveOnWriteHooks } from "../../core/extensions/index.js";
14
+ import { getActiveExtensionRegistrations, runActiveOnWriteHooks } from "../../core/extensions/index.js";
11
15
  import { locateItem, readLocatedItem } from "../../core/store/item-store.js";
12
- import { getHistoryPath, getSettingsPath, resolvePmRoot } from "../../core/store/paths.js";
16
+ import { getHistoryPath, getItemPath, getSettingsPath, resolvePmRoot } from "../../core/store/paths.js";
13
17
  import { readSettings } from "../../core/store/settings.js";
14
18
  import { readHistoryEntries } from "./history.js";
15
19
  const EMPTY_REPLAY_DOCUMENT = {
@@ -22,6 +26,12 @@ function toAuthor(candidate, defaultAuthor) {
22
26
  return trimmed || "unknown";
23
27
  }
24
28
  function toReplayDocument(document) {
29
+ if (!document.front_matter || Object.keys(document.front_matter).length === 0) {
30
+ return {
31
+ front_matter: {},
32
+ body: document.body ?? "",
33
+ };
34
+ }
25
35
  const canonical = canonicalDocument(document);
26
36
  return {
27
37
  front_matter: orderObject(canonical.front_matter, FRONT_MATTER_KEY_ORDER),
@@ -70,7 +80,41 @@ function ensureReplayTarget(target, history) {
70
80
  historyIndex: index,
71
81
  };
72
82
  }
73
- function applyHistoryPatch(current, patch, entryNumber) {
83
+ function extractPatchFailureContext(patch, error) {
84
+ const context = {};
85
+ if (error instanceof Error && error.message.trim().length > 0) {
86
+ context.reason = error.message.trim();
87
+ }
88
+ if (typeof error !== "object" || error === null) {
89
+ return context;
90
+ }
91
+ const candidate = error;
92
+ if (typeof candidate.index === "number" && Number.isInteger(candidate.index) && candidate.index >= 0) {
93
+ context.patchIndex = candidate.index;
94
+ }
95
+ const operationRecord = typeof candidate.operation === "object" && candidate.operation !== null
96
+ ? candidate.operation
97
+ : null;
98
+ if (operationRecord && typeof operationRecord.op === "string") {
99
+ context.op = operationRecord.op;
100
+ }
101
+ if (operationRecord && typeof operationRecord.path === "string") {
102
+ context.path = operationRecord.path;
103
+ }
104
+ if (operationRecord && typeof operationRecord.from === "string") {
105
+ context.from = operationRecord.from;
106
+ }
107
+ if ((context.op === undefined || context.path === undefined) && context.patchIndex !== undefined) {
108
+ const fallback = patch[context.patchIndex];
109
+ if (fallback) {
110
+ context.op = context.op ?? fallback.op;
111
+ context.path = context.path ?? fallback.path;
112
+ context.from = context.from ?? fallback.from;
113
+ }
114
+ }
115
+ return context;
116
+ }
117
+ function applyHistoryPatch(current, patch, entryNumber, entryOp) {
74
118
  try {
75
119
  const applied = jsonPatch.applyPatch(structuredClone(current), patch, true, false).newDocument;
76
120
  if (typeof applied !== "object" ||
@@ -92,7 +136,16 @@ function applyHistoryPatch(current, patch, entryNumber) {
92
136
  if (error instanceof PmCliError) {
93
137
  throw error;
94
138
  }
95
- throw new PmCliError(`Failed to apply history patch at entry ${entryNumber}.`, EXIT_CODE.GENERIC_FAILURE);
139
+ const failureContext = extractPatchFailureContext(patch, error);
140
+ const contextTokens = [
141
+ `history_op=${entryOp}`,
142
+ failureContext.patchIndex !== undefined ? `patch_index=${failureContext.patchIndex}` : null,
143
+ failureContext.op ? `op=${failureContext.op}` : null,
144
+ failureContext.path ? `path=${failureContext.path}` : null,
145
+ failureContext.from ? `from=${failureContext.from}` : null,
146
+ ].filter((token) => token !== null);
147
+ const reasonSuffix = failureContext.reason ? ` ${failureContext.reason}` : "";
148
+ throw new PmCliError(`Failed to apply history patch at entry ${entryNumber} (${contextTokens.join(", ")}).${reasonSuffix}`, EXIT_CODE.GENERIC_FAILURE);
96
149
  }
97
150
  }
98
151
  function replayToTarget(history, targetIndex) {
@@ -103,7 +156,7 @@ function replayToTarget(history, targetIndex) {
103
156
  if (beforeHash !== entry.before_hash) {
104
157
  throw new PmCliError(`History hash mismatch before replay at entry ${i + 1}.`, EXIT_CODE.GENERIC_FAILURE);
105
158
  }
106
- document = applyHistoryPatch(document, entry.patch, i + 1);
159
+ document = applyHistoryPatch(document, entry.patch, i + 1, entry.op);
107
160
  const afterHash = replayHash(document);
108
161
  if (afterHash !== entry.after_hash) {
109
162
  throw new PmCliError(`History hash mismatch after replay at entry ${i + 1}.`, EXIT_CODE.GENERIC_FAILURE);
@@ -111,6 +164,58 @@ function replayToTarget(history, targetIndex) {
111
164
  }
112
165
  return document;
113
166
  }
167
+ function ensureMaterializedRestoreTarget(replayDocument, target) {
168
+ if (Object.keys(replayDocument.front_matter).length > 0) {
169
+ return replayDocument;
170
+ }
171
+ throw new PmCliError(`Restore target ${target.raw} resolves to a deleted state; choose a version or timestamp where the item exists.`, EXIT_CODE.USAGE);
172
+ }
173
+ function replayCurrentDocument(history) {
174
+ const currentReplay = replayToTarget(history, history.length - 1);
175
+ if (Object.keys(currentReplay.front_matter).length === 0) {
176
+ return {
177
+ front_matter: {},
178
+ body: currentReplay.body,
179
+ };
180
+ }
181
+ return canonicalDocument({
182
+ front_matter: currentReplay.front_matter,
183
+ body: currentReplay.body,
184
+ });
185
+ }
186
+ async function resolveRestoreSubject(pmRoot, id, settings, typeToFolder) {
187
+ const located = await locateItem(pmRoot, id, settings.id_prefix, settings.item_format, typeToFolder);
188
+ if (located) {
189
+ const historyPath = getHistoryPath(pmRoot, located.id);
190
+ const historyPolicy = await enforceHistoryStreamPolicyForItem({
191
+ pmRoot,
192
+ settings,
193
+ itemId: located.id,
194
+ commandLabel: "restore",
195
+ });
196
+ return {
197
+ id: located.id,
198
+ historyPath,
199
+ located,
200
+ historyPolicyWarnings: historyPolicy.warnings,
201
+ };
202
+ }
203
+ const normalizedId = normalizeItemId(id, settings.id_prefix);
204
+ const rawNormalizedId = normalizeRawItemId(id);
205
+ const candidateIds = normalizedId === rawNormalizedId ? [normalizedId] : [normalizedId, rawNormalizedId];
206
+ for (const candidateId of candidateIds) {
207
+ const historyPath = getHistoryPath(pmRoot, candidateId);
208
+ if (await pathExists(historyPath)) {
209
+ return {
210
+ id: candidateId,
211
+ historyPath,
212
+ located: null,
213
+ historyPolicyWarnings: [],
214
+ };
215
+ }
216
+ }
217
+ throw new PmCliError(`Item ${id} not found`, EXIT_CODE.NOT_FOUND);
218
+ }
114
219
  function changedFields(beforeDocument, afterDocument) {
115
220
  const beforeReplay = toReplayDocument(beforeDocument);
116
221
  const afterReplay = toReplayDocument(afterDocument);
@@ -132,57 +237,86 @@ export async function runRestore(id, target, options, global) {
132
237
  throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);
133
238
  }
134
239
  const settings = await readSettings(pmRoot);
135
- const located = await locateItem(pmRoot, id, settings.id_prefix);
136
- if (!located) {
137
- throw new PmCliError(`Item ${id} not found`, EXIT_CODE.NOT_FOUND);
138
- }
139
- const historyPath = getHistoryPath(pmRoot, located.id);
140
- const history = await readHistoryEntries(historyPath, located.id);
240
+ const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());
241
+ const subject = await resolveRestoreSubject(pmRoot, id, settings, typeRegistry.type_to_folder);
242
+ const resolvedId = subject.id;
243
+ const history = await readHistoryEntries(subject.historyPath, resolvedId);
141
244
  if (history.length === 0) {
142
- throw new PmCliError(`No history exists for ${located.id}; restore is unavailable.`, EXIT_CODE.NOT_FOUND);
245
+ throw new PmCliError(`No history exists for ${resolvedId}; restore is unavailable.`, EXIT_CODE.NOT_FOUND);
143
246
  }
144
247
  const resolvedTarget = ensureReplayTarget(target, history);
145
- const replayDocument = replayToTarget(history, resolvedTarget.historyIndex);
248
+ const replayDocument = ensureMaterializedRestoreTarget(replayToTarget(history, resolvedTarget.historyIndex), resolvedTarget);
146
249
  const restoredDocument = canonicalDocument({
147
250
  front_matter: replayDocument.front_matter,
148
251
  body: replayDocument.body,
149
- });
150
- if (restoredDocument.front_matter.id !== located.id) {
151
- throw new PmCliError(`Restore target resolved to item ${restoredDocument.front_matter.id}, expected ${located.id}.`, EXIT_CODE.GENERIC_FAILURE);
252
+ }, { schema: settings.schema });
253
+ if (restoredDocument.front_matter.id !== resolvedId) {
254
+ throw new PmCliError(`Restore target resolved to item ${restoredDocument.front_matter.id}, expected ${resolvedId}.`, EXIT_CODE.GENERIC_FAILURE);
152
255
  }
153
256
  const author = toAuthor(options.author, settings.author_default);
154
- const releaseLock = await acquireLock(pmRoot, located.id, settings.locks.ttl_seconds, author, Boolean(options.force));
257
+ const releaseLock = await acquireLock(pmRoot, resolvedId, settings.locks.ttl_seconds, author, Boolean(options.force), settings.governance.force_required_for_stale_lock);
155
258
  try {
156
- const { raw: originalRaw, document: currentDocument } = await readLocatedItem(located);
157
- const assigned = currentDocument.front_matter.assignee?.trim();
158
- if (assigned && assigned !== author && !options.force) {
159
- throw new PmCliError(`Item ${located.id} is assigned to ${assigned}. Use --force to override.`, EXIT_CODE.CONFLICT);
259
+ const existingItemPath = subject.located?.itemPath ?? null;
260
+ const itemFormat = subject.located?.item_format ?? settings.item_format;
261
+ let resolvedCurrentDocument;
262
+ let resolvedOriginalRaw = null;
263
+ if (subject.located) {
264
+ const loaded = await readLocatedItem(subject.located, { schema: settings.schema });
265
+ resolvedCurrentDocument = loaded.document;
266
+ resolvedOriginalRaw = loaded.raw;
267
+ }
268
+ else {
269
+ resolvedCurrentDocument = replayCurrentDocument(history);
270
+ }
271
+ const assigned = resolvedCurrentDocument.front_matter.assignee?.trim();
272
+ const ownershipWarnings = [];
273
+ const hasOwnershipConflict = assigned && assigned !== author && !options.force;
274
+ if (hasOwnershipConflict) {
275
+ if (settings.governance.ownership_enforcement === "strict") {
276
+ throw new PmCliError(`Item ${resolvedId} is assigned to ${assigned}. Use --force to override.`, EXIT_CODE.CONFLICT);
277
+ }
278
+ if (settings.governance.ownership_enforcement === "warn") {
279
+ ownershipWarnings.push(`ownership_warning:assignee_conflict:${resolvedId}:${assigned}`);
280
+ }
281
+ }
282
+ const serializedRestore = serializeItemDocument(restoredDocument, { format: itemFormat, schema: settings.schema });
283
+ const restoredItemPath = getItemPath(pmRoot, restoredDocument.front_matter.type, resolvedId, itemFormat, typeRegistry.type_to_folder);
284
+ await writeFileAtomic(restoredItemPath, serializedRestore);
285
+ if (existingItemPath && restoredItemPath !== existingItemPath) {
286
+ await fs.rm(existingItemPath);
160
287
  }
161
- const serializedRestore = serializeItemDocument(restoredDocument);
162
- await writeFileAtomic(located.itemPath, serializedRestore);
163
288
  const historyEntry = createHistoryEntry({
164
289
  nowIso: nowIso(),
165
290
  author,
166
291
  op: "restore",
167
- before: currentDocument,
292
+ before: resolvedCurrentDocument,
168
293
  after: restoredDocument,
169
294
  message: options.message,
170
295
  });
171
296
  try {
172
- await appendHistoryEntry(historyPath, historyEntry);
297
+ await appendHistoryEntry(subject.historyPath, historyEntry);
173
298
  }
174
299
  catch (error) {
175
- await writeFileAtomic(located.itemPath, originalRaw);
300
+ if (existingItemPath && resolvedOriginalRaw !== null && restoredItemPath !== existingItemPath) {
301
+ await writeFileAtomic(existingItemPath, resolvedOriginalRaw);
302
+ await fs.rm(restoredItemPath, { force: true });
303
+ }
304
+ else if (existingItemPath && resolvedOriginalRaw !== null) {
305
+ await writeFileAtomic(existingItemPath, resolvedOriginalRaw);
306
+ }
307
+ else {
308
+ await fs.rm(restoredItemPath, { force: true });
309
+ }
176
310
  throw error;
177
311
  }
178
312
  const hookWarnings = [
179
313
  ...(await runActiveOnWriteHooks({
180
- path: located.itemPath,
314
+ path: restoredItemPath,
181
315
  scope: "project",
182
316
  op: "restore",
183
317
  })),
184
318
  ...(await runActiveOnWriteHooks({
185
- path: historyPath,
319
+ path: subject.historyPath,
186
320
  scope: "project",
187
321
  op: "restore:history",
188
322
  })),
@@ -197,8 +331,8 @@ export async function runRestore(id, target, options, global) {
197
331
  entry_ts: targetEntry.ts,
198
332
  entry_op: targetEntry.op,
199
333
  },
200
- changed_fields: changedFields(currentDocument, restoredDocument),
201
- warnings: hookWarnings,
334
+ changed_fields: changedFields(resolvedCurrentDocument, restoredDocument),
335
+ warnings: [...subject.historyPolicyWarnings, ...ownershipWarnings, ...hookWarnings],
202
336
  };
203
337
  }
204
338
  finally {