@unbrained/pm-cli 2026.5.11 → 2026.5.14

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 (171) hide show
  1. package/AGENTS.md +3 -116
  2. package/CHANGELOG.md +18 -0
  3. package/PRD.md +18 -39
  4. package/README.md +8 -5
  5. package/dist/cli/commander-usage.js +27 -0
  6. package/dist/cli/commander-usage.js.map +1 -1
  7. package/dist/cli/commands/activity.js +19 -4
  8. package/dist/cli/commands/activity.js.map +1 -1
  9. package/dist/cli/commands/calendar.js +5 -2
  10. package/dist/cli/commands/calendar.js.map +1 -1
  11. package/dist/cli/commands/contracts.js +63 -19
  12. package/dist/cli/commands/contracts.js.map +1 -1
  13. package/dist/cli/commands/create.js +58 -3
  14. package/dist/cli/commands/create.js.map +1 -1
  15. package/dist/cli/commands/extension.d.ts +14 -3
  16. package/dist/cli/commands/extension.js +481 -95
  17. package/dist/cli/commands/extension.js.map +1 -1
  18. package/dist/cli/commands/index.d.ts +1 -8
  19. package/dist/cli/commands/index.js +1 -8
  20. package/dist/cli/commands/index.js.map +1 -1
  21. package/dist/cli/commands/reindex.d.ts +8 -0
  22. package/dist/cli/commands/reindex.js +96 -23
  23. package/dist/cli/commands/reindex.js.map +1 -1
  24. package/dist/cli/commands/search.js +51 -25
  25. package/dist/cli/commands/search.js.map +1 -1
  26. package/dist/cli/commands/test.js +14 -6
  27. package/dist/cli/commands/test.js.map +1 -1
  28. package/dist/cli/commands/upgrade.d.ts +63 -0
  29. package/dist/cli/commands/upgrade.js +260 -0
  30. package/dist/cli/commands/upgrade.js.map +1 -0
  31. package/dist/cli/guide-topics.js +18 -16
  32. package/dist/cli/guide-topics.js.map +1 -1
  33. package/dist/cli/help-content.js +57 -18
  34. package/dist/cli/help-content.js.map +1 -1
  35. package/dist/cli/main.js +73 -7
  36. package/dist/cli/main.js.map +1 -1
  37. package/dist/cli/register-list-query.js +24 -142
  38. package/dist/cli/register-list-query.js.map +1 -1
  39. package/dist/cli/register-mutation.js +49 -257
  40. package/dist/cli/register-mutation.js.map +1 -1
  41. package/dist/cli/register-operations.js +29 -198
  42. package/dist/cli/register-operations.js.map +1 -1
  43. package/dist/cli/register-setup.js +181 -204
  44. package/dist/cli/register-setup.js.map +1 -1
  45. package/dist/cli/registration-helpers.d.ts +2 -2
  46. package/dist/cli/registration-helpers.js +1 -19
  47. package/dist/cli/registration-helpers.js.map +1 -1
  48. package/dist/core/extensions/loader.js +7 -1
  49. package/dist/core/extensions/loader.js.map +1 -1
  50. package/dist/core/packages/manifest.d.ts +38 -0
  51. package/dist/core/packages/manifest.js +221 -0
  52. package/dist/core/packages/manifest.js.map +1 -0
  53. package/dist/core/search/embedding-batches.d.ts +13 -1
  54. package/dist/core/search/embedding-batches.js +19 -1
  55. package/dist/core/search/embedding-batches.js.map +1 -1
  56. package/dist/core/store/front-matter-cache.d.ts +8 -1
  57. package/dist/core/store/front-matter-cache.js +20 -11
  58. package/dist/core/store/front-matter-cache.js.map +1 -1
  59. package/dist/mcp/server.d.ts +8 -0
  60. package/dist/mcp/server.js +100 -43
  61. package/dist/mcp/server.js.map +1 -1
  62. package/dist/sdk/cli-contracts/commander-mutation-options.d.ts +7 -0
  63. package/dist/sdk/cli-contracts/commander-mutation-options.js +477 -0
  64. package/dist/sdk/cli-contracts/commander-mutation-options.js.map +1 -0
  65. package/dist/sdk/cli-contracts/commander-types.d.ts +21 -0
  66. package/dist/sdk/cli-contracts/commander-types.js +92 -0
  67. package/dist/sdk/cli-contracts/commander-types.js.map +1 -0
  68. package/dist/sdk/cli-contracts.d.ts +22 -32
  69. package/dist/sdk/cli-contracts.js +155 -296
  70. package/dist/sdk/cli-contracts.js.map +1 -1
  71. package/dist/sdk/index.d.ts +2 -0
  72. package/dist/sdk/index.js +2 -0
  73. package/dist/sdk/index.js.map +1 -1
  74. package/dist/sdk/runtime.d.ts +29 -0
  75. package/dist/sdk/runtime.js +28 -0
  76. package/dist/sdk/runtime.js.map +1 -0
  77. package/docs/ARCHITECTURE.md +1 -1
  78. package/docs/COMMANDS.md +17 -1
  79. package/docs/EXTENSIONS.md +169 -61
  80. package/docs/QUICKSTART.md +11 -2
  81. package/docs/README.md +4 -6
  82. package/docs/RELEASING.md +4 -2
  83. package/docs/SDK.md +79 -438
  84. package/package.json +6 -23
  85. package/packages/pm-beads/README.md +10 -0
  86. package/packages/pm-beads/extensions/beads/index.js +113 -0
  87. package/{.agents/pm/extensions/beads/index.js → packages/pm-beads/extensions/beads/index.ts} +42 -20
  88. package/{.agents/pm → packages/pm-beads}/extensions/beads/runtime.js +2 -17
  89. package/{.agents/pm → packages/pm-beads}/extensions/beads/runtime.ts +41 -18
  90. package/packages/pm-beads/package.json +50 -0
  91. package/packages/pm-calendar/README.md +13 -0
  92. package/packages/pm-calendar/extensions/calendar/index.js +56 -0
  93. package/packages/pm-calendar/extensions/calendar/index.ts +62 -0
  94. package/packages/pm-calendar/extensions/calendar/manifest.json +7 -0
  95. package/packages/pm-calendar/extensions/calendar/runtime.js +95 -0
  96. package/packages/pm-calendar/extensions/calendar/runtime.ts +104 -0
  97. package/packages/pm-calendar/package.json +51 -0
  98. package/packages/pm-governance-audit/README.md +23 -0
  99. package/packages/pm-governance-audit/extensions/governance-audit/index.js +117 -0
  100. package/packages/pm-governance-audit/extensions/governance-audit/index.ts +118 -0
  101. package/packages/pm-governance-audit/extensions/governance-audit/manifest.json +7 -0
  102. package/packages/pm-governance-audit/extensions/governance-audit/runtime.js +159 -0
  103. package/packages/pm-governance-audit/extensions/governance-audit/runtime.ts +176 -0
  104. package/packages/pm-governance-audit/package.json +52 -0
  105. package/packages/pm-guide-shell/README.md +23 -0
  106. package/packages/pm-guide-shell/extensions/guide-shell/index.js +76 -0
  107. package/packages/pm-guide-shell/extensions/guide-shell/index.ts +81 -0
  108. package/packages/pm-guide-shell/extensions/guide-shell/manifest.json +7 -0
  109. package/packages/pm-guide-shell/extensions/guide-shell/runtime.js +263 -0
  110. package/packages/pm-guide-shell/extensions/guide-shell/runtime.ts +327 -0
  111. package/packages/pm-guide-shell/package.json +52 -0
  112. package/packages/pm-linked-test-adapters/README.md +24 -0
  113. package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/index.js +101 -0
  114. package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/index.ts +102 -0
  115. package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/manifest.json +7 -0
  116. package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/runtime.js +142 -0
  117. package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/runtime.ts +173 -0
  118. package/packages/pm-linked-test-adapters/package.json +53 -0
  119. package/packages/pm-search-advanced/README.md +27 -0
  120. package/packages/pm-search-advanced/extensions/search-advanced/index.js +93 -0
  121. package/packages/pm-search-advanced/extensions/search-advanced/index.ts +94 -0
  122. package/packages/pm-search-advanced/extensions/search-advanced/manifest.json +7 -0
  123. package/packages/pm-search-advanced/extensions/search-advanced/runtime.js +120 -0
  124. package/packages/pm-search-advanced/extensions/search-advanced/runtime.ts +144 -0
  125. package/packages/pm-search-advanced/package.json +54 -0
  126. package/packages/pm-templates/README.md +20 -0
  127. package/packages/pm-templates/extensions/templates/index.js +101 -0
  128. package/packages/pm-templates/extensions/templates/index.ts +109 -0
  129. package/packages/pm-templates/extensions/templates/manifest.json +7 -0
  130. package/packages/pm-templates/extensions/templates/runtime.js +226 -0
  131. package/packages/pm-templates/extensions/templates/runtime.ts +283 -0
  132. package/packages/pm-templates/package.json +50 -0
  133. package/packages/pm-todos/README.md +11 -0
  134. package/packages/pm-todos/extensions/todos/index.js +130 -0
  135. package/{.agents/pm/extensions/todos/index.js → packages/pm-todos/extensions/todos/index.ts} +47 -23
  136. package/{.agents/pm → packages/pm-todos}/extensions/todos/runtime.js +3 -18
  137. package/{.agents/pm → packages/pm-todos}/extensions/todos/runtime.ts +42 -20
  138. package/packages/pm-todos/package.json +51 -0
  139. package/plugins/pm-cli-claude/README.md +1 -2
  140. package/plugins/pm-cli-claude/hooks/session-start.mjs +4 -55
  141. package/plugins/pm-cli-claude/scripts/pm-mcp-server.mjs +4 -2
  142. package/plugins/pm-cli-codex/scripts/pm-mcp-server.mjs +4 -2
  143. package/.agents/pm/extensions/.managed-extensions.json +0 -42
  144. package/.agents/skills/HARNESS_COMPATIBILITY.md +0 -45
  145. package/.agents/skills/README.md +0 -21
  146. package/.agents/skills/pm-developer/SKILL.md +0 -73
  147. package/.agents/skills/pm-developer/references/COMMAND_PLAYBOOK.md +0 -48
  148. package/.agents/skills/pm-developer/references/PROMPTS.md +0 -17
  149. package/.agents/skills/pm-extensions/SKILL.md +0 -57
  150. package/.agents/skills/pm-extensions/references/LIFECYCLE.md +0 -40
  151. package/.agents/skills/pm-extensions/references/TROUBLESHOOTING.md +0 -25
  152. package/.agents/skills/pm-sdk/SKILL.md +0 -50
  153. package/.agents/skills/pm-sdk/references/INTEGRATION_CHECKLIST.md +0 -31
  154. package/.agents/skills/pm-sdk/references/PROMPTS.md +0 -13
  155. package/.agents/skills/pm-user/SKILL.md +0 -59
  156. package/.agents/skills/pm-user/references/PROMPTS.md +0 -17
  157. package/.agents/skills/pm-user/references/WORKFLOWS.md +0 -35
  158. package/.pi/README.md +0 -35
  159. package/.pi/agents/pm-triage-agent.md +0 -19
  160. package/.pi/agents/pm-verification-agent.md +0 -21
  161. package/.pi/chains/pm-native-delivery.chain.md +0 -11
  162. package/.pi/extensions/pm-cli/index.js +0 -387
  163. package/.pi/prompts/pm-workflow.md +0 -5
  164. package/.pi/skills/pm-native/SKILL.md +0 -44
  165. package/.pi/skills/pm-release/SKILL.md +0 -35
  166. package/dist/pi/native.d.ts +0 -5
  167. package/dist/pi/native.js +0 -236
  168. package/dist/pi/native.js.map +0 -1
  169. package/docs/PI_PACKAGE.md +0 -141
  170. /package/{.agents/pm → packages/pm-beads}/extensions/beads/manifest.json +0 -0
  171. /package/{.agents/pm → packages/pm-todos}/extensions/todos/manifest.json +0 -0
@@ -1,21 +1,16 @@
1
1
  export { runAppend } from "./append.js";
2
2
  export { runAggregate, type AggregateOptions, type AggregateResult } from "./aggregate.js";
3
- export { runCompletion, type CompletionResult, type CompletionShell } from "./completion.js";
4
3
  export { runActivity } from "./activity.js";
5
4
  export { runClaim, runRelease } from "./claim.js";
6
5
  export { runClose, type CloseCommandOptions, type CloseResult } from "./close.js";
7
6
  export { runComments } from "./comments.js";
8
- export { runCommentsAudit, type CommentsAuditOptions, type CommentsAuditResult } from "./comments-audit.js";
9
7
  export { runConfig, type ConfigCommandOptions, type ConfigResult } from "./config.js";
10
8
  export { runContracts, type ContractsCommandOptions, type ContractsResult } from "./contracts.js";
11
- export { CALENDAR_OUTPUT_VALUES, CALENDAR_VIEW_VALUES, renderCalendarMarkdown, resolveCalendarOutputFormat, runCalendar, type CalendarOptions, type CalendarOutputFormat, type CalendarResult, type CalendarView, } from "./calendar.js";
12
9
  export { CONTEXT_OUTPUT_VALUES, renderContextMarkdown, resolveContextOutputFormat, runContext, type ContextOptions, type ContextOutputFormat, type ContextResult, } from "./context.js";
13
10
  export { runCreate, type CreateCommandOptions } from "./create.js";
14
11
  export { runDelete, type DeleteCommandOptions, type DeleteResult } from "./delete.js";
15
12
  export { runDeps, DEPS_FORMAT_VALUES, type DepsCommandOptions, type DepsFormat, type DepsResult } from "./deps.js";
16
- export { runDedupeAudit, DEDUPE_AUDIT_MODES, type DedupeAuditMode, type DedupeAuditOptions, type DedupeAuditResult } from "./dedupe-audit.js";
17
13
  export { runDocs } from "./docs.js";
18
- export { GUIDE_DEPTH_VALUES, GUIDE_OUTPUT_VALUES, renderGuideMarkdown, resolveGuideOutputFormat, runGuide, type GuideDepth, type GuideOptions, type GuideOutputFormat, type GuideResult, } from "./guide.js";
19
14
  export { runExtension, type ExtensionCommandOptions, type ExtensionCommandResult } from "./extension.js";
20
15
  export { runFiles, runFilesDiscover } from "./files.js";
21
16
  export { runGc } from "./gc.js";
@@ -25,16 +20,14 @@ export { runHistory } from "./history.js";
25
20
  export { runInit } from "./init.js";
26
21
  export { runLearnings } from "./learnings.js";
27
22
  export { runList, type ListOptions } from "./list.js";
28
- export { runNormalize, type NormalizeCommandOptions, type NormalizeResult } from "./normalize.js";
29
23
  export { runNotes } from "./notes.js";
30
24
  export { runSearch } from "./search.js";
31
- export { runReindex, type ReindexOptions, type ReindexResult } from "./reindex.js";
32
25
  export { runRestore } from "./restore.js";
33
26
  export { runStats } from "./stats.js";
34
27
  export { runTest } from "./test.js";
35
28
  export { runTestAll } from "./test-all.js";
36
29
  export { runStartBackgroundRun, runTestRunsList, runTestRunsLogs, runTestRunsResume, runTestRunsStatus, runTestRunsStop, runTestRunsWorker, } from "./test-runs.js";
37
- export { loadCreateTemplateOptions, runTemplatesList, runTemplatesSave, runTemplatesShow, type TemplatesListResult, type TemplatesSaveResult, type TemplatesShowResult, } from "./templates.js";
38
30
  export { runUpdate } from "./update.js";
39
31
  export { runUpdateMany, type UpdateManyCommandOptions, type UpdateManyResult } from "./update-many.js";
32
+ export { runUpgrade, type UpgradeCommandOptions, type UpgradeResult } from "./upgrade.js";
40
33
  export { runValidate, type ValidateCheck, type ValidateCommandOptions, type ValidateResult } from "./validate.js";
@@ -1,21 +1,16 @@
1
1
  export { runAppend } from "./append.js";
2
2
  export { runAggregate } from "./aggregate.js";
3
- export { runCompletion } from "./completion.js";
4
3
  export { runActivity } from "./activity.js";
5
4
  export { runClaim, runRelease } from "./claim.js";
6
5
  export { runClose } from "./close.js";
7
6
  export { runComments } from "./comments.js";
8
- export { runCommentsAudit } from "./comments-audit.js";
9
7
  export { runConfig } from "./config.js";
10
8
  export { runContracts } from "./contracts.js";
11
- export { CALENDAR_OUTPUT_VALUES, CALENDAR_VIEW_VALUES, renderCalendarMarkdown, resolveCalendarOutputFormat, runCalendar, } from "./calendar.js";
12
9
  export { CONTEXT_OUTPUT_VALUES, renderContextMarkdown, resolveContextOutputFormat, runContext, } from "./context.js";
13
10
  export { runCreate } from "./create.js";
14
11
  export { runDelete } from "./delete.js";
15
12
  export { runDeps, DEPS_FORMAT_VALUES } from "./deps.js";
16
- export { runDedupeAudit, DEDUPE_AUDIT_MODES } from "./dedupe-audit.js";
17
13
  export { runDocs } from "./docs.js";
18
- export { GUIDE_DEPTH_VALUES, GUIDE_OUTPUT_VALUES, renderGuideMarkdown, resolveGuideOutputFormat, runGuide, } from "./guide.js";
19
14
  export { runExtension } from "./extension.js";
20
15
  export { runFiles, runFilesDiscover } from "./files.js";
21
16
  export { runGc } from "./gc.js";
@@ -25,17 +20,15 @@ export { runHistory } from "./history.js";
25
20
  export { runInit } from "./init.js";
26
21
  export { runLearnings } from "./learnings.js";
27
22
  export { runList } from "./list.js";
28
- export { runNormalize } from "./normalize.js";
29
23
  export { runNotes } from "./notes.js";
30
24
  export { runSearch } from "./search.js";
31
- export { runReindex } from "./reindex.js";
32
25
  export { runRestore } from "./restore.js";
33
26
  export { runStats } from "./stats.js";
34
27
  export { runTest } from "./test.js";
35
28
  export { runTestAll } from "./test-all.js";
36
29
  export { runStartBackgroundRun, runTestRunsList, runTestRunsLogs, runTestRunsResume, runTestRunsStatus, runTestRunsStop, runTestRunsWorker, } from "./test-runs.js";
37
- export { loadCreateTemplateOptions, runTemplatesList, runTemplatesSave, runTemplatesShow, } from "./templates.js";
38
30
  export { runUpdate } from "./update.js";
39
31
  export { runUpdateMany } from "./update-many.js";
32
+ export { runUpgrade } from "./upgrade.js";
40
33
  export { runValidate } from "./validate.js";
41
34
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"/","sources":["cli/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,YAAY,EAA+C,MAAM,gBAAgB,CAAC;AAC3F,OAAO,EAAE,aAAa,EAA+C,MAAM,iBAAiB,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,QAAQ,EAA8C,MAAM,YAAY,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAuD,MAAM,qBAAqB,CAAC;AAC5G,OAAO,EAAE,SAAS,EAAgD,MAAM,aAAa,CAAC;AACtF,OAAO,EAAE,YAAY,EAAsD,MAAM,gBAAgB,CAAC;AAClG,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,sBAAsB,EACtB,2BAA2B,EAC3B,WAAW,GAKZ,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,0BAA0B,EAC1B,UAAU,GAIX,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,SAAS,EAA6B,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,SAAS,EAAgD,MAAM,aAAa,CAAC;AACtF,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAA6D,MAAM,WAAW,CAAC;AACnH,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAyE,MAAM,mBAAmB,CAAC;AAC9I,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,EACxB,QAAQ,GAKT,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAA6D,MAAM,gBAAgB,CAAC;AACzG,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAoB,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,YAAY,EAAsD,MAAM,gBAAgB,CAAC;AAClG,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAA2C,MAAM,cAAc,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,yBAAyB,EACzB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GAIjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAwD,MAAM,kBAAkB,CAAC;AACvG,OAAO,EAAE,WAAW,EAAwE,MAAM,eAAe,CAAC","sourcesContent":["export { runAppend } from \"./append.js\";\nexport { runAggregate, type AggregateOptions, type AggregateResult } from \"./aggregate.js\";\nexport { runCompletion, type CompletionResult, type CompletionShell } from \"./completion.js\";\nexport { runActivity } from \"./activity.js\";\nexport { runClaim, runRelease } from \"./claim.js\";\nexport { runClose, type CloseCommandOptions, type CloseResult } from \"./close.js\";\nexport { runComments } from \"./comments.js\";\nexport { runCommentsAudit, type CommentsAuditOptions, type CommentsAuditResult } from \"./comments-audit.js\";\nexport { runConfig, type ConfigCommandOptions, type ConfigResult } from \"./config.js\";\nexport { runContracts, type ContractsCommandOptions, type ContractsResult } from \"./contracts.js\";\nexport {\n CALENDAR_OUTPUT_VALUES,\n CALENDAR_VIEW_VALUES,\n renderCalendarMarkdown,\n resolveCalendarOutputFormat,\n runCalendar,\n type CalendarOptions,\n type CalendarOutputFormat,\n type CalendarResult,\n type CalendarView,\n} from \"./calendar.js\";\nexport {\n CONTEXT_OUTPUT_VALUES,\n renderContextMarkdown,\n resolveContextOutputFormat,\n runContext,\n type ContextOptions,\n type ContextOutputFormat,\n type ContextResult,\n} from \"./context.js\";\nexport { runCreate, type CreateCommandOptions } from \"./create.js\";\nexport { runDelete, type DeleteCommandOptions, type DeleteResult } from \"./delete.js\";\nexport { runDeps, DEPS_FORMAT_VALUES, type DepsCommandOptions, type DepsFormat, type DepsResult } from \"./deps.js\";\nexport { runDedupeAudit, DEDUPE_AUDIT_MODES, type DedupeAuditMode, type DedupeAuditOptions, type DedupeAuditResult } from \"./dedupe-audit.js\";\nexport { runDocs } from \"./docs.js\";\nexport {\n GUIDE_DEPTH_VALUES,\n GUIDE_OUTPUT_VALUES,\n renderGuideMarkdown,\n resolveGuideOutputFormat,\n runGuide,\n type GuideDepth,\n type GuideOptions,\n type GuideOutputFormat,\n type GuideResult,\n} from \"./guide.js\";\nexport { runExtension, type ExtensionCommandOptions, type ExtensionCommandResult } from \"./extension.js\";\nexport { runFiles, runFilesDiscover } from \"./files.js\";\nexport { runGc } from \"./gc.js\";\nexport { runGet } from \"./get.js\";\nexport { runHealth } from \"./health.js\";\nexport { runHistory } from \"./history.js\";\nexport { runInit } from \"./init.js\";\nexport { runLearnings } from \"./learnings.js\";\nexport { runList, type ListOptions } from \"./list.js\";\nexport { runNormalize, type NormalizeCommandOptions, type NormalizeResult } from \"./normalize.js\";\nexport { runNotes } from \"./notes.js\";\nexport { runSearch } from \"./search.js\";\nexport { runReindex, type ReindexOptions, type ReindexResult } from \"./reindex.js\";\nexport { runRestore } from \"./restore.js\";\nexport { runStats } from \"./stats.js\";\nexport { runTest } from \"./test.js\";\nexport { runTestAll } from \"./test-all.js\";\nexport {\n runStartBackgroundRun,\n runTestRunsList,\n runTestRunsLogs,\n runTestRunsResume,\n runTestRunsStatus,\n runTestRunsStop,\n runTestRunsWorker,\n} from \"./test-runs.js\";\nexport {\n loadCreateTemplateOptions,\n runTemplatesList,\n runTemplatesSave,\n runTemplatesShow,\n type TemplatesListResult,\n type TemplatesSaveResult,\n type TemplatesShowResult,\n} from \"./templates.js\";\nexport { runUpdate } from \"./update.js\";\nexport { runUpdateMany, type UpdateManyCommandOptions, type UpdateManyResult } from \"./update-many.js\";\nexport { runValidate, type ValidateCheck, type ValidateCommandOptions, type ValidateResult } from \"./validate.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"/","sources":["cli/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,YAAY,EAA+C,MAAM,gBAAgB,CAAC;AAC3F,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,QAAQ,EAA8C,MAAM,YAAY,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAgD,MAAM,aAAa,CAAC;AACtF,OAAO,EAAE,YAAY,EAAsD,MAAM,gBAAgB,CAAC;AAClG,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,0BAA0B,EAC1B,UAAU,GAIX,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,SAAS,EAA6B,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,SAAS,EAAgD,MAAM,aAAa,CAAC;AACtF,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAA6D,MAAM,WAAW,CAAC;AACnH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAA6D,MAAM,gBAAgB,CAAC;AACzG,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAoB,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAwD,MAAM,kBAAkB,CAAC;AACvG,OAAO,EAAE,UAAU,EAAkD,MAAM,cAAc,CAAC;AAC1F,OAAO,EAAE,WAAW,EAAwE,MAAM,eAAe,CAAC","sourcesContent":["export { runAppend } from \"./append.js\";\nexport { runAggregate, type AggregateOptions, type AggregateResult } from \"./aggregate.js\";\nexport { runActivity } from \"./activity.js\";\nexport { runClaim, runRelease } from \"./claim.js\";\nexport { runClose, type CloseCommandOptions, type CloseResult } from \"./close.js\";\nexport { runComments } from \"./comments.js\";\nexport { runConfig, type ConfigCommandOptions, type ConfigResult } from \"./config.js\";\nexport { runContracts, type ContractsCommandOptions, type ContractsResult } from \"./contracts.js\";\nexport {\n CONTEXT_OUTPUT_VALUES,\n renderContextMarkdown,\n resolveContextOutputFormat,\n runContext,\n type ContextOptions,\n type ContextOutputFormat,\n type ContextResult,\n} from \"./context.js\";\nexport { runCreate, type CreateCommandOptions } from \"./create.js\";\nexport { runDelete, type DeleteCommandOptions, type DeleteResult } from \"./delete.js\";\nexport { runDeps, DEPS_FORMAT_VALUES, type DepsCommandOptions, type DepsFormat, type DepsResult } from \"./deps.js\";\nexport { runDocs } from \"./docs.js\";\nexport { runExtension, type ExtensionCommandOptions, type ExtensionCommandResult } from \"./extension.js\";\nexport { runFiles, runFilesDiscover } from \"./files.js\";\nexport { runGc } from \"./gc.js\";\nexport { runGet } from \"./get.js\";\nexport { runHealth } from \"./health.js\";\nexport { runHistory } from \"./history.js\";\nexport { runInit } from \"./init.js\";\nexport { runLearnings } from \"./learnings.js\";\nexport { runList, type ListOptions } from \"./list.js\";\nexport { runNotes } from \"./notes.js\";\nexport { runSearch } from \"./search.js\";\nexport { runRestore } from \"./restore.js\";\nexport { runStats } from \"./stats.js\";\nexport { runTest } from \"./test.js\";\nexport { runTestAll } from \"./test-all.js\";\nexport {\n runStartBackgroundRun,\n runTestRunsList,\n runTestRunsLogs,\n runTestRunsResume,\n runTestRunsStatus,\n runTestRunsStop,\n runTestRunsWorker,\n} from \"./test-runs.js\";\nexport { runUpdate } from \"./update.js\";\nexport { runUpdateMany, type UpdateManyCommandOptions, type UpdateManyResult } from \"./update-many.js\";\nexport { runUpgrade, type UpgradeCommandOptions, type UpgradeResult } from \"./upgrade.js\";\nexport { runValidate, type ValidateCheck, type ValidateCommandOptions, type ValidateResult } from \"./validate.js\";\n"]}
@@ -7,6 +7,14 @@ export interface ReindexResult {
7
7
  ok: boolean;
8
8
  mode: "keyword" | "semantic" | "hybrid";
9
9
  total_items: number;
10
+ semantic: {
11
+ enabled: boolean;
12
+ stale_items: number;
13
+ unchanged_items: number;
14
+ embedded_items: number;
15
+ vector_upserted: number;
16
+ batches_completed: number;
17
+ };
10
18
  artifacts: {
11
19
  manifest: string;
12
20
  embeddings: string;
@@ -1,9 +1,11 @@
1
+ import fs from "node:fs/promises";
1
2
  import path from "node:path";
2
3
  import { toNonEmptyStringOrUndefined } from "../../core/shared/primitives.js";
3
4
  import { getActiveExtensionRegistrations, runActiveOnIndexHooks, runActiveOnWriteHooks } from "../../core/extensions/index.js";
4
5
  import { resolveRegisteredSearchProvider, resolveRegisteredVectorStoreAdapter, } from "../../core/extensions/runtime-registrations.js";
5
6
  import { pathExists, writeFileAtomic } from "../../core/fs/fs-utils.js";
6
7
  import { resolveItemTypeRegistry } from "../../core/item/type-registry.js";
8
+ import { parseItemDocument } from "../../core/item/item-format.js";
7
9
  import { acquireLock } from "../../core/lock/lock.js";
8
10
  import { buildSearchCorpus, buildSemanticCorpusInput } from "../../core/search/corpus.js";
9
11
  import { executeEmbeddingBatchesWithRetry } from "../../core/search/embedding-batches.js";
@@ -14,7 +16,7 @@ import { executeVectorUpsert, resolveVectorStores } from "../../core/search/vect
14
16
  import { EXIT_CODE } from "../../core/shared/constants.js";
15
17
  import { PmCliError } from "../../core/shared/errors.js";
16
18
  import { nowIso } from "../../core/shared/time.js";
17
- import { listAllFrontMatterWithBody } from "../../core/store/item-store.js";
19
+ import { listAllDocumentCandidatesCached } from "../../core/store/front-matter-cache.js";
18
20
  import { getSettingsPath, resolvePmRoot } from "../../core/store/paths.js";
19
21
  import { readSettings } from "../../core/store/settings.js";
20
22
  const MANIFEST_PATH = "index/manifest.json";
@@ -44,15 +46,48 @@ function parseMode(raw) {
44
46
  }
45
47
  throw new PmCliError("Reindex mode must be one of keyword|semantic|hybrid", EXIT_CODE.USAGE);
46
48
  }
47
- async function loadDocuments(pmRoot, itemFormat, typeToFolder, schema) {
48
- const items = await listAllFrontMatterWithBody(pmRoot, itemFormat, typeToFolder, undefined, schema);
49
- return items.map((item) => {
50
- const { body, ...frontMatter } = item;
51
- return {
52
- metadata: frontMatter,
53
- body,
54
- };
55
- });
49
+ async function loadDocumentCandidates(pmRoot, itemFormat, typeToFolder, schema) {
50
+ const warnings = [];
51
+ const candidates = await listAllDocumentCandidatesCached(pmRoot, itemFormat, typeToFolder, warnings, schema);
52
+ return {
53
+ candidates,
54
+ warnings,
55
+ };
56
+ }
57
+ async function hydrateDocuments(pmRoot, candidates, schema, warnings, itemIds) {
58
+ const hydrated = [];
59
+ for (const candidate of candidates) {
60
+ if (itemIds && !itemIds.has(candidate.metadata.id)) {
61
+ continue;
62
+ }
63
+ if (typeof candidate.body === "string") {
64
+ hydrated.push({
65
+ metadata: candidate.metadata,
66
+ body: candidate.body,
67
+ });
68
+ continue;
69
+ }
70
+ try {
71
+ const raw = await fs.readFile(candidate.item_path, "utf8");
72
+ const parsed = parseItemDocument(raw, {
73
+ format: candidate.item_format,
74
+ schema,
75
+ onWarning: (warning) => warnings.push(warning),
76
+ });
77
+ hydrated.push({
78
+ metadata: candidate.metadata,
79
+ body: parsed.body,
80
+ });
81
+ }
82
+ catch {
83
+ warnings.push(`item_list_item_read_failed:${path.relative(pmRoot, candidate.item_path)}`);
84
+ hydrated.push({
85
+ metadata: candidate.metadata,
86
+ body: "",
87
+ });
88
+ }
89
+ }
90
+ return hydrated;
56
91
  }
57
92
  function buildKeywordRecord(document, mode) {
58
93
  const item = document.metadata;
@@ -196,15 +231,21 @@ export async function runReindex(options, global) {
196
231
  }
197
232
  const mode = requestedMode;
198
233
  emitReindexProgress(progressEnabled, "loading item corpus");
199
- const documents = await loadDocuments(pmRoot, settings.item_format, typeRegistry.type_to_folder, settings.schema);
200
- emitReindexProgress(progressEnabled, `loaded_items=${documents.length}`);
234
+ const loadedCandidates = await loadDocumentCandidates(pmRoot, settings.item_format, typeRegistry.type_to_folder, settings.schema);
235
+ const reindexWarnings = [...loadedCandidates.warnings];
236
+ const documentCandidates = loadedCandidates.candidates;
237
+ const metadataDocuments = documentCandidates.map((candidate) => ({
238
+ metadata: candidate.metadata,
239
+ body: typeof candidate.body === "string" ? candidate.body : "",
240
+ }));
241
+ emitReindexProgress(progressEnabled, `loaded_items=${metadataDocuments.length}`);
201
242
  const generatedAt = nowIso();
202
243
  const manifest = {
203
244
  version: 1,
204
245
  mode,
205
246
  generated_at: generatedAt,
206
- total_items: documents.length,
207
- items: documents.map((document) => ({
247
+ total_items: metadataDocuments.length,
248
+ items: metadataDocuments.map((document) => ({
208
249
  id: document.metadata.id,
209
250
  type: document.metadata.type,
210
251
  status: document.metadata.status,
@@ -214,15 +255,32 @@ export async function runReindex(options, global) {
214
255
  };
215
256
  const manifestPath = path.join(pmRoot, MANIFEST_PATH);
216
257
  const embeddingsPath = path.join(pmRoot, EMBEDDINGS_PATH);
217
- const embeddingsLines = documents.map((document) => JSON.stringify(buildKeywordRecord(document, mode))).join("\n");
258
+ let documentsForKeywordArtifacts = mode === "keyword"
259
+ ? await hydrateDocuments(pmRoot, documentCandidates, settings.schema, reindexWarnings)
260
+ : metadataDocuments;
218
261
  const semanticWarnings = [];
219
262
  const vectorizationLedgerEntries = {};
220
- if (mode !== "keyword" && documents.length > 0) {
263
+ const semanticSummary = {
264
+ enabled: mode !== "keyword",
265
+ stale_items: 0,
266
+ unchanged_items: 0,
267
+ embedded_items: 0,
268
+ vector_upserted: 0,
269
+ batches_completed: 0,
270
+ };
271
+ if (mode !== "keyword" && metadataDocuments.length > 0) {
221
272
  const ledger = await readVectorizationStatusLedger(pmRoot);
222
273
  semanticWarnings.push(...ledger.warnings);
223
- const staleDocuments = documents.filter((document) => ledger.entries[document.metadata.id] !== document.metadata.updated_at);
224
- const freshDocuments = documents.length - staleDocuments.length;
225
- for (const document of documents) {
274
+ const staleIds = new Set(metadataDocuments
275
+ .filter((document) => ledger.entries[document.metadata.id] !== document.metadata.updated_at)
276
+ .map((document) => document.metadata.id));
277
+ const staleDocuments = staleIds.size > 0
278
+ ? await hydrateDocuments(pmRoot, documentCandidates, settings.schema, reindexWarnings, staleIds)
279
+ : [];
280
+ const freshDocuments = metadataDocuments.length - staleDocuments.length;
281
+ semanticSummary.stale_items = staleDocuments.length;
282
+ semanticSummary.unchanged_items = freshDocuments;
283
+ for (const document of metadataDocuments) {
226
284
  vectorizationLedgerEntries[document.metadata.id] = document.metadata.updated_at;
227
285
  }
228
286
  if (staleDocuments.length === 0) {
@@ -249,7 +307,14 @@ export async function runReindex(options, global) {
249
307
  if (!activeEmbeddingProvider) {
250
308
  throw new PmCliError(`No embedding executor available for reindex mode '${requestedMode}'`, EXIT_CODE.USAGE);
251
309
  }
252
- const embeddingResult = await executeEmbeddingBatchesWithRetry(activeEmbeddingProvider, settings, corpusInputs);
310
+ const embeddingResult = await executeEmbeddingBatchesWithRetry(activeEmbeddingProvider, settings, corpusInputs, {
311
+ onProgress: (event) => {
312
+ if (event.phase === "complete") {
313
+ semanticSummary.batches_completed = event.batch_index;
314
+ }
315
+ emitReindexProgress(progressEnabled, `embedding_batch_${event.phase} batch=${event.batch_index}/${event.batch_total} size=${event.batch_size} completed_inputs=${event.completed_inputs}/${event.total_inputs}`);
316
+ },
317
+ });
253
318
  semanticWarnings.push(...embeddingResult.warnings);
254
319
  vectors = embeddingResult.vectors;
255
320
  }
@@ -268,6 +333,7 @@ export async function runReindex(options, global) {
268
333
  updated_at: document.metadata.updated_at,
269
334
  },
270
335
  }));
336
+ semanticSummary.embedded_items = vectors.length;
271
337
  if (extensionVectorUpsert) {
272
338
  try {
273
339
  emitReindexProgress(progressEnabled, `vector_upsert_start adapter=${extensionVectorUpsert.name} points=${points.length}`);
@@ -275,6 +341,7 @@ export async function runReindex(options, global) {
275
341
  points,
276
342
  settings,
277
343
  }));
344
+ semanticSummary.vector_upserted = points.length;
278
345
  emitReindexProgress(progressEnabled, `vector_upsert_complete adapter=${extensionVectorUpsert.name}`);
279
346
  }
280
347
  catch (error) {
@@ -284,12 +351,14 @@ export async function runReindex(options, global) {
284
351
  semanticWarnings.push(`Extension vector adapter "${extensionVectorUpsert.name}" failed; falling back to built-in vector store (${error instanceof Error ? error.message : String(error)})`);
285
352
  emitReindexProgress(progressEnabled, "vector_upsert_fallback built_in_store");
286
353
  await executeVectorUpsert(activeVectorStore, points);
354
+ semanticSummary.vector_upserted = points.length;
287
355
  emitReindexProgress(progressEnabled, `vector_upsert_complete adapter=${activeVectorStore.name}`);
288
356
  }
289
357
  }
290
358
  else if (activeVectorStore) {
291
359
  emitReindexProgress(progressEnabled, `vector_upsert_start adapter=${activeVectorStore.name} points=${points.length}`);
292
360
  await executeVectorUpsert(activeVectorStore, points);
361
+ semanticSummary.vector_upserted = points.length;
293
362
  emitReindexProgress(progressEnabled, `vector_upsert_complete adapter=${activeVectorStore.name}`);
294
363
  }
295
364
  else {
@@ -298,8 +367,11 @@ export async function runReindex(options, global) {
298
367
  if (freshDocuments > 0) {
299
368
  semanticWarnings.push(`search_semantic_reindex_skipped_unchanged:count=${freshDocuments}`);
300
369
  }
370
+ const staleDocumentsById = new Map(staleDocuments.map((document) => [document.metadata.id, document]));
371
+ documentsForKeywordArtifacts = metadataDocuments.map((document) => staleDocumentsById.get(document.metadata.id) ?? document);
301
372
  }
302
373
  }
374
+ const embeddingsLines = documentsForKeywordArtifacts.map((document) => JSON.stringify(buildKeywordRecord(document, mode))).join("\n");
303
375
  emitReindexProgress(progressEnabled, "writing keyword artifacts");
304
376
  await writeFileAtomic(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`);
305
377
  await writeFileAtomic(embeddingsPath, `${embeddingsLines}\n`);
@@ -326,19 +398,20 @@ export async function runReindex(options, global) {
326
398
  })),
327
399
  ...(await runActiveOnIndexHooks({
328
400
  mode,
329
- total_items: documents.length,
401
+ total_items: metadataDocuments.length,
330
402
  })),
331
403
  ];
332
404
  emitReindexProgress(progressEnabled, "done");
333
405
  return {
334
406
  ok: true,
335
407
  mode,
336
- total_items: documents.length,
408
+ total_items: metadataDocuments.length,
409
+ semantic: semanticSummary,
337
410
  artifacts: {
338
411
  manifest: MANIFEST_PATH,
339
412
  embeddings: EMBEDDINGS_PATH,
340
413
  },
341
- warnings: [...semanticWarnings, ...vectorizationWarnings, ...hookWarnings],
414
+ warnings: [...reindexWarnings, ...semanticWarnings, ...vectorizationWarnings, ...hookWarnings],
342
415
  generated_at: generatedAt,
343
416
  };
344
417
  }
@@ -1 +1 @@
1
- {"version":3,"file":"reindex.js","sourceRoot":"/","sources":["cli/commands/reindex.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"node:path\";\nimport { toNonEmptyStringOrUndefined } from \"../../core/shared/primitives.js\";\nimport { getActiveExtensionRegistrations, runActiveOnIndexHooks, runActiveOnWriteHooks } from \"../../core/extensions/index.js\";\nimport {\n resolveRegisteredSearchProvider,\n resolveRegisteredVectorStoreAdapter,\n} from \"../../core/extensions/runtime-registrations.js\";\nimport { pathExists, writeFileAtomic } from \"../../core/fs/fs-utils.js\";\nimport { resolveItemTypeRegistry } from \"../../core/item/type-registry.js\";\nimport { acquireLock } from \"../../core/lock/lock.js\";\nimport { buildSearchCorpus, buildSemanticCorpusInput } from \"../../core/search/corpus.js\";\nimport { executeEmbeddingBatchesWithRetry } from \"../../core/search/embedding-batches.js\";\nimport { readVectorizationStatusLedger, writeVectorizationStatusLedger } from \"../../core/search/cache.js\";\nimport { resolveEmbeddingProviders } from \"../../core/search/providers.js\";\nimport { resolveSettingsWithSemanticRuntimeDefaults } from \"../../core/search/semantic-defaults.js\";\nimport { executeVectorUpsert, resolveVectorStores } from \"../../core/search/vector-stores.js\";\nimport { EXIT_CODE } from \"../../core/shared/constants.js\";\nimport type { GlobalOptions } from \"../../core/shared/command-types.js\";\nimport { PmCliError } from \"../../core/shared/errors.js\";\nimport { nowIso } from \"../../core/shared/time.js\";\nimport { listAllFrontMatterWithBody } from \"../../core/store/item-store.js\";\nimport { getSettingsPath, resolvePmRoot } from \"../../core/store/paths.js\";\nimport { readSettings } from \"../../core/store/settings.js\";\nimport type { ItemDocument, PmSettings } from \"../../types/index.js\";\n\nconst MANIFEST_PATH = \"index/manifest.json\";\nconst EMBEDDINGS_PATH = \"search/embeddings.jsonl\";\nconst REINDEX_LOCK_ID = \"reindex\";\n\nexport interface ReindexOptions {\n mode?: string;\n progress?: boolean;\n}\n\nexport interface ReindexResult {\n ok: boolean;\n mode: \"keyword\" | \"semantic\" | \"hybrid\";\n total_items: number;\n artifacts: {\n manifest: string;\n embeddings: string;\n };\n warnings: string[];\n generated_at: string;\n}\n\nfunction shouldEmitReindexProgress(options: ReindexOptions): boolean {\n return options.progress === true || process.stderr.isTTY === true;\n}\n\nfunction emitReindexProgress(enabled: boolean, message: string): void {\n if (!enabled) {\n return;\n }\n try {\n process.stderr.write(`[pm reindex] ${message}\\n`);\n } catch {\n // Ignore transient stderr write failures.\n }\n}\n\nfunction parseMode(raw: string | undefined): \"keyword\" | \"semantic\" | \"hybrid\" {\n const normalized = (raw ?? \"keyword\").trim().toLowerCase();\n if (normalized === \"keyword\") {\n return \"keyword\";\n }\n if (normalized === \"semantic\" || normalized === \"hybrid\") {\n return normalized;\n }\n throw new PmCliError(\"Reindex mode must be one of keyword|semantic|hybrid\", EXIT_CODE.USAGE);\n}\n\nasync function loadDocuments(\n pmRoot: string,\n itemFormat: \"toon\" | \"json_markdown\",\n typeToFolder: Record<string, string>,\n schema: PmSettings[\"schema\"],\n): Promise<ItemDocument[]> {\n const items = await listAllFrontMatterWithBody(pmRoot, itemFormat, typeToFolder, undefined, schema);\n return items.map((item) => {\n const { body, ...frontMatter } = item;\n return {\n metadata: frontMatter,\n body,\n };\n });\n}\n\nfunction buildKeywordRecord(document: ItemDocument, mode: \"keyword\" | \"semantic\" | \"hybrid\"): Record<string, unknown> {\n const item = document.metadata;\n return {\n id: item.id,\n mode,\n updated_at: item.updated_at,\n corpus: buildSearchCorpus(document),\n };\n}\n\ntype ExtensionEmbedBatch = (context: {\n inputs: string[];\n settings: PmSettings;\n model: string;\n}) => Promise<number[][]> | number[][];\n\ntype ExtensionEmbedOne = (context: {\n input: string;\n settings: PmSettings;\n model: string;\n}) => Promise<number[]> | number[];\n\ntype ExtensionVectorUpsert = (context: {\n points: Array<{\n id: string;\n vector: number[];\n payload: Record<string, unknown>;\n }>;\n settings: PmSettings;\n}) => Promise<void> | void;\n\nconst toOptionalNonEmptyString = toNonEmptyStringOrUndefined;\n\nfunction resolveExtensionSearchEmbedding(\n settings: PmSettings,\n): { name: string; embedBatch?: ExtensionEmbedBatch; embed?: ExtensionEmbedOne } | null {\n const registrations = getActiveExtensionRegistrations();\n const providerName = toOptionalNonEmptyString(settings.search?.provider);\n const registration = resolveRegisteredSearchProvider(registrations, providerName);\n if (!registration) {\n return null;\n }\n const runtimeDefinition = registration.runtime_definition ?? registration.definition;\n const name =\n toOptionalNonEmptyString((runtimeDefinition as { name?: unknown }).name) ??\n toOptionalNonEmptyString((registration.definition as { name?: unknown }).name) ??\n providerName;\n if (!name) {\n return null;\n }\n const embedBatch = (runtimeDefinition as { embedBatch?: unknown; embed_batch?: unknown }).embedBatch;\n const embedBatchSnake = (runtimeDefinition as { embedBatch?: unknown; embed_batch?: unknown }).embed_batch;\n const embed = (runtimeDefinition as { embed?: unknown }).embed;\n const resolvedEmbedBatch =\n typeof embedBatch === \"function\"\n ? (embedBatch as ExtensionEmbedBatch)\n : typeof embedBatchSnake === \"function\"\n ? (embedBatchSnake as ExtensionEmbedBatch)\n : undefined;\n const resolvedEmbed = typeof embed === \"function\" ? (embed as ExtensionEmbedOne) : undefined;\n if (!resolvedEmbedBatch && !resolvedEmbed) {\n return null;\n }\n return {\n name,\n embedBatch: resolvedEmbedBatch,\n embed: resolvedEmbed,\n };\n}\n\nfunction resolveExtensionVectorUpsert(settings: PmSettings): { name: string; upsert: ExtensionVectorUpsert } | null {\n const registrations = getActiveExtensionRegistrations();\n const adapterName = toOptionalNonEmptyString(settings.vector_store?.adapter);\n const registration = resolveRegisteredVectorStoreAdapter(registrations, adapterName);\n if (!registration) {\n return null;\n }\n const runtimeDefinition = registration.runtime_definition ?? registration.definition;\n const name =\n toOptionalNonEmptyString((runtimeDefinition as { name?: unknown }).name) ??\n toOptionalNonEmptyString((registration.definition as { name?: unknown }).name) ??\n adapterName;\n const upsert = (runtimeDefinition as { upsert?: unknown }).upsert;\n if (!name || typeof upsert !== \"function\") {\n return null;\n }\n return {\n name,\n upsert: upsert as ExtensionVectorUpsert,\n };\n}\n\nfunction assertVector(value: unknown, context: string): number[] {\n if (!Array.isArray(value) || value.some((entry) => typeof entry !== \"number\" || !Number.isFinite(entry))) {\n throw new PmCliError(`Invalid vector returned by ${context}`, EXIT_CODE.GENERIC_FAILURE);\n }\n return value;\n}\n\nasync function executeExtensionEmbedding(\n extensionEmbedding: { name: string; embedBatch?: ExtensionEmbedBatch; embed?: ExtensionEmbedOne },\n settings: PmSettings,\n corpusInputs: string[],\n): Promise<number[][]> {\n const model = settings.search?.embedding_model?.trim() || \"text-embedding-3-small\";\n if (extensionEmbedding.embedBatch) {\n const vectors = await Promise.resolve(\n extensionEmbedding.embedBatch({\n inputs: corpusInputs,\n settings,\n model,\n }),\n );\n if (!Array.isArray(vectors)) {\n throw new PmCliError(\n `Extension search provider \"${extensionEmbedding.name}\" embedBatch must return an array of vectors`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n return vectors.map((vector, index) =>\n assertVector(vector, `extension search provider \"${extensionEmbedding.name}\" embedBatch output at index ${index}`),\n );\n }\n if (!extensionEmbedding.embed) {\n throw new PmCliError(\n `Extension search provider \"${extensionEmbedding.name}\" does not implement embed/embedBatch`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n const vectors: number[][] = [];\n for (const [index, input] of corpusInputs.entries()) {\n const vector = await Promise.resolve(\n extensionEmbedding.embed({\n input,\n settings,\n model,\n }),\n );\n vectors.push(assertVector(vector, `extension search provider \"${extensionEmbedding.name}\" embed output at index ${index}`));\n }\n return vectors;\n}\n\nexport async function runReindex(options: ReindexOptions, global: GlobalOptions): Promise<ReindexResult> {\n const requestedMode = parseMode(options.mode);\n const progressEnabled = shouldEmitReindexProgress(options);\n emitReindexProgress(progressEnabled, `start mode=${requestedMode}`);\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n if (!(await pathExists(getSettingsPath(pmRoot)))) {\n throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);\n }\n\n const settings = resolveSettingsWithSemanticRuntimeDefaults(await readSettings(pmRoot)).settings;\n let releaseReindexLock: (() => Promise<void>) | null = null;\n try {\n releaseReindexLock = await acquireLock(\n pmRoot,\n REINDEX_LOCK_ID,\n settings.locks.ttl_seconds,\n process.env.PM_AUTHOR ?? \"pm-reindex\",\n false,\n settings.governance.force_required_for_stale_lock,\n );\n } catch (error: unknown) {\n if (error instanceof PmCliError && error.exitCode === EXIT_CODE.CONFLICT) {\n throw new PmCliError(\n \"Another pm reindex run is already active for this project. Wait for it to finish before starting a new keyword, semantic, or hybrid reindex.\",\n EXIT_CODE.CONFLICT,\n {\n code: \"reindex_already_running\",\n type: \"urn:pm-cli:error:reindex_already_running\",\n why: \"Semantic reindex can be expensive and duplicate runs compete for the same local embedding model and vector store.\",\n nextSteps: [\n \"Check active pm reindex processes before starting another reindex.\",\n \"Rerun with --progress when you need non-interactive visibility.\",\n ],\n },\n );\n }\n throw error;\n }\n\n try {\n const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());\n const extensionEmbedding = resolveExtensionSearchEmbedding(settings);\n const extensionVectorUpsert = resolveExtensionVectorUpsert(settings);\n let activeEmbeddingProvider: ReturnType<typeof resolveEmbeddingProviders>[\"active\"] = null;\n let activeVectorStore: ReturnType<typeof resolveVectorStores>[\"active\"] = null;\n if (requestedMode !== \"keyword\") {\n const providerResolution = resolveEmbeddingProviders(settings);\n if (!providerResolution.active && !extensionEmbedding) {\n throw new PmCliError(\n `Reindex mode '${requestedMode}' requires a configured embedding provider in settings.providers.openai/settings.providers.ollama or an extension provider selected by settings.search.provider`,\n EXIT_CODE.USAGE,\n );\n }\n const vectorResolution = resolveVectorStores(settings);\n if (!vectorResolution.active && !extensionVectorUpsert) {\n throw new PmCliError(\n `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`,\n EXIT_CODE.USAGE,\n );\n }\n activeEmbeddingProvider = providerResolution.active;\n activeVectorStore = vectorResolution.active;\n }\n const mode = requestedMode;\n emitReindexProgress(progressEnabled, \"loading item corpus\");\n const documents = await loadDocuments(pmRoot, settings.item_format, typeRegistry.type_to_folder, settings.schema);\n emitReindexProgress(progressEnabled, `loaded_items=${documents.length}`);\n const generatedAt = nowIso();\n\n const manifest = {\n version: 1,\n mode,\n generated_at: generatedAt,\n total_items: documents.length,\n items: documents.map((document) => ({\n id: document.metadata.id,\n type: document.metadata.type,\n status: document.metadata.status,\n priority: document.metadata.priority,\n updated_at: document.metadata.updated_at,\n })),\n };\n\n const manifestPath = path.join(pmRoot, MANIFEST_PATH);\n const embeddingsPath = path.join(pmRoot, EMBEDDINGS_PATH);\n\n const embeddingsLines = documents.map((document) => JSON.stringify(buildKeywordRecord(document, mode))).join(\"\\n\");\n const semanticWarnings: string[] = [];\n const vectorizationLedgerEntries: Record<string, string> = {};\n if (mode !== \"keyword\" && documents.length > 0) {\n const ledger = await readVectorizationStatusLedger(pmRoot);\n semanticWarnings.push(...ledger.warnings);\n const staleDocuments = documents.filter(\n (document) => ledger.entries[document.metadata.id] !== document.metadata.updated_at,\n );\n const freshDocuments = documents.length - staleDocuments.length;\n for (const document of documents) {\n vectorizationLedgerEntries[document.metadata.id] = document.metadata.updated_at;\n }\n if (staleDocuments.length === 0) {\n emitReindexProgress(progressEnabled, `embedding_skipped unchanged_items=${freshDocuments}`);\n semanticWarnings.push(`search_semantic_reindex_skipped_unchanged:count=${freshDocuments}`);\n } else {\n emitReindexProgress(progressEnabled, `embedding_start items=${staleDocuments.length} unchanged_items=${freshDocuments}`);\n const semanticProviderName = activeEmbeddingProvider?.name ?? extensionEmbedding?.name;\n const corpusInputs = staleDocuments.map((document) => buildSemanticCorpusInput(document, { providerName: semanticProviderName }));\n let vectors: number[][] = [];\n if (extensionEmbedding) {\n try {\n vectors = await executeExtensionEmbedding(extensionEmbedding, settings, corpusInputs);\n } catch (error: unknown) {\n if (!activeEmbeddingProvider) {\n throw new PmCliError(\n `Extension search provider \"${extensionEmbedding.name}\" failed to generate embeddings: ${error instanceof Error ? error.message : String(error)}`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n semanticWarnings.push(\n `Extension search provider \"${extensionEmbedding.name}\" failed; falling back to built-in provider (${error instanceof Error ? error.message : String(error)})`,\n );\n }\n }\n if (vectors.length === 0) {\n if (!activeEmbeddingProvider) {\n throw new PmCliError(\n `No embedding executor available for reindex mode '${requestedMode}'`,\n EXIT_CODE.USAGE,\n );\n }\n const embeddingResult = await executeEmbeddingBatchesWithRetry(activeEmbeddingProvider, settings, corpusInputs);\n semanticWarnings.push(...embeddingResult.warnings);\n vectors = embeddingResult.vectors;\n }\n emitReindexProgress(progressEnabled, `embedding_complete vectors=${vectors.length}`);\n if (vectors.length !== staleDocuments.length) {\n throw new PmCliError(\n `Embedding output size mismatch (expected ${staleDocuments.length}, received ${vectors.length})`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n const points = staleDocuments.map((document, index) => ({\n id: document.metadata.id,\n vector: assertVector(vectors[index], `reindex embeddings output at index ${index}`),\n payload: {\n id: document.metadata.id,\n type: document.metadata.type,\n status: document.metadata.status,\n priority: document.metadata.priority,\n updated_at: document.metadata.updated_at,\n },\n }));\n if (extensionVectorUpsert) {\n try {\n emitReindexProgress(progressEnabled, `vector_upsert_start adapter=${extensionVectorUpsert.name} points=${points.length}`);\n await Promise.resolve(\n extensionVectorUpsert.upsert({\n points,\n settings,\n }),\n );\n emitReindexProgress(progressEnabled, `vector_upsert_complete adapter=${extensionVectorUpsert.name}`);\n } catch (error: unknown) {\n if (!activeVectorStore) {\n throw new PmCliError(\n `Extension vector adapter \"${extensionVectorUpsert.name}\" failed to upsert vectors: ${error instanceof Error ? error.message : String(error)}`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n semanticWarnings.push(\n `Extension vector adapter \"${extensionVectorUpsert.name}\" failed; falling back to built-in vector store (${error instanceof Error ? error.message : String(error)})`,\n );\n emitReindexProgress(progressEnabled, \"vector_upsert_fallback built_in_store\");\n await executeVectorUpsert(activeVectorStore, points);\n emitReindexProgress(progressEnabled, `vector_upsert_complete adapter=${activeVectorStore.name}`);\n }\n } else if (activeVectorStore) {\n emitReindexProgress(progressEnabled, `vector_upsert_start adapter=${activeVectorStore.name} points=${points.length}`);\n await executeVectorUpsert(activeVectorStore, points);\n emitReindexProgress(progressEnabled, `vector_upsert_complete adapter=${activeVectorStore.name}`);\n } else {\n throw new PmCliError(\n `No vector upsert executor available for reindex mode '${requestedMode}'`,\n EXIT_CODE.USAGE,\n );\n }\n if (freshDocuments > 0) {\n semanticWarnings.push(`search_semantic_reindex_skipped_unchanged:count=${freshDocuments}`);\n }\n }\n }\n emitReindexProgress(progressEnabled, \"writing keyword artifacts\");\n await writeFileAtomic(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`);\n await writeFileAtomic(embeddingsPath, `${embeddingsLines}\\n`);\n const vectorizationWarnings: string[] = [];\n if (mode !== \"keyword\") {\n try {\n emitReindexProgress(progressEnabled, \"writing vectorization status ledger\");\n await writeVectorizationStatusLedger(pmRoot, vectorizationLedgerEntries);\n } catch (error: unknown) {\n vectorizationWarnings.push(\n `search_vectorization_status_ledger_write_failed:${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n const hookWarnings = [\n ...(await runActiveOnWriteHooks({\n path: manifestPath,\n scope: \"project\",\n op: \"reindex:manifest\",\n })),\n ...(await runActiveOnWriteHooks({\n path: embeddingsPath,\n scope: \"project\",\n op: \"reindex:embeddings\",\n })),\n ...(await runActiveOnIndexHooks({\n mode,\n total_items: documents.length,\n })),\n ];\n emitReindexProgress(progressEnabled, \"done\");\n\n return {\n ok: true,\n mode,\n total_items: documents.length,\n artifacts: {\n manifest: MANIFEST_PATH,\n embeddings: EMBEDDINGS_PATH,\n },\n warnings: [...semanticWarnings, ...vectorizationWarnings, ...hookWarnings],\n generated_at: generatedAt,\n };\n } finally {\n await releaseReindexLock?.();\n }\n}\n"]}
1
+ {"version":3,"file":"reindex.js","sourceRoot":"/","sources":["cli/commands/reindex.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { toNonEmptyStringOrUndefined } from \"../../core/shared/primitives.js\";\nimport { getActiveExtensionRegistrations, runActiveOnIndexHooks, runActiveOnWriteHooks } from \"../../core/extensions/index.js\";\nimport {\n resolveRegisteredSearchProvider,\n resolveRegisteredVectorStoreAdapter,\n} from \"../../core/extensions/runtime-registrations.js\";\nimport { pathExists, writeFileAtomic } from \"../../core/fs/fs-utils.js\";\nimport { resolveItemTypeRegistry } from \"../../core/item/type-registry.js\";\nimport { parseItemDocument } from \"../../core/item/item-format.js\";\nimport { acquireLock } from \"../../core/lock/lock.js\";\nimport { buildSearchCorpus, buildSemanticCorpusInput } from \"../../core/search/corpus.js\";\nimport { executeEmbeddingBatchesWithRetry } from \"../../core/search/embedding-batches.js\";\nimport { readVectorizationStatusLedger, writeVectorizationStatusLedger } from \"../../core/search/cache.js\";\nimport { resolveEmbeddingProviders } from \"../../core/search/providers.js\";\nimport { resolveSettingsWithSemanticRuntimeDefaults } from \"../../core/search/semantic-defaults.js\";\nimport { executeVectorUpsert, resolveVectorStores } from \"../../core/search/vector-stores.js\";\nimport { EXIT_CODE } from \"../../core/shared/constants.js\";\nimport type { GlobalOptions } from \"../../core/shared/command-types.js\";\nimport { PmCliError } from \"../../core/shared/errors.js\";\nimport { nowIso } from \"../../core/shared/time.js\";\nimport { listAllDocumentCandidatesCached, type CachedDocumentCandidate } from \"../../core/store/front-matter-cache.js\";\nimport { getSettingsPath, resolvePmRoot } from \"../../core/store/paths.js\";\nimport { readSettings } from \"../../core/store/settings.js\";\nimport type { ItemDocument, PmSettings } from \"../../types/index.js\";\n\nconst MANIFEST_PATH = \"index/manifest.json\";\nconst EMBEDDINGS_PATH = \"search/embeddings.jsonl\";\nconst REINDEX_LOCK_ID = \"reindex\";\n\nexport interface ReindexOptions {\n mode?: string;\n progress?: boolean;\n}\n\nexport interface ReindexResult {\n ok: boolean;\n mode: \"keyword\" | \"semantic\" | \"hybrid\";\n total_items: number;\n semantic: {\n enabled: boolean;\n stale_items: number;\n unchanged_items: number;\n embedded_items: number;\n vector_upserted: number;\n batches_completed: number;\n };\n artifacts: {\n manifest: string;\n embeddings: string;\n };\n warnings: string[];\n generated_at: string;\n}\n\nfunction shouldEmitReindexProgress(options: ReindexOptions): boolean {\n return options.progress === true || process.stderr.isTTY === true;\n}\n\nfunction emitReindexProgress(enabled: boolean, message: string): void {\n if (!enabled) {\n return;\n }\n try {\n process.stderr.write(`[pm reindex] ${message}\\n`);\n } catch {\n // Ignore transient stderr write failures.\n }\n}\n\nfunction parseMode(raw: string | undefined): \"keyword\" | \"semantic\" | \"hybrid\" {\n const normalized = (raw ?? \"keyword\").trim().toLowerCase();\n if (normalized === \"keyword\") {\n return \"keyword\";\n }\n if (normalized === \"semantic\" || normalized === \"hybrid\") {\n return normalized;\n }\n throw new PmCliError(\"Reindex mode must be one of keyword|semantic|hybrid\", EXIT_CODE.USAGE);\n}\n\nasync function loadDocumentCandidates(\n pmRoot: string,\n itemFormat: \"toon\" | \"json_markdown\",\n typeToFolder: Record<string, string>,\n schema: PmSettings[\"schema\"],\n): Promise<{ candidates: CachedDocumentCandidate[]; warnings: string[] }> {\n const warnings: string[] = [];\n const candidates = await listAllDocumentCandidatesCached(pmRoot, itemFormat, typeToFolder, warnings, schema);\n return {\n candidates,\n warnings,\n };\n}\n\nasync function hydrateDocuments(\n pmRoot: string,\n candidates: CachedDocumentCandidate[],\n schema: PmSettings[\"schema\"],\n warnings: string[],\n itemIds?: Set<string>,\n): Promise<ItemDocument[]> {\n const hydrated: ItemDocument[] = [];\n for (const candidate of candidates) {\n if (itemIds && !itemIds.has(candidate.metadata.id)) {\n continue;\n }\n if (typeof candidate.body === \"string\") {\n hydrated.push({\n metadata: candidate.metadata,\n body: candidate.body,\n });\n continue;\n }\n try {\n const raw = await fs.readFile(candidate.item_path, \"utf8\");\n const parsed = parseItemDocument(raw, {\n format: candidate.item_format,\n schema,\n onWarning: (warning) => warnings.push(warning),\n });\n hydrated.push({\n metadata: candidate.metadata,\n body: parsed.body,\n });\n } catch {\n warnings.push(`item_list_item_read_failed:${path.relative(pmRoot, candidate.item_path)}`);\n hydrated.push({\n metadata: candidate.metadata,\n body: \"\",\n });\n }\n }\n return hydrated;\n}\n\nfunction buildKeywordRecord(document: ItemDocument, mode: \"keyword\" | \"semantic\" | \"hybrid\"): Record<string, unknown> {\n const item = document.metadata;\n return {\n id: item.id,\n mode,\n updated_at: item.updated_at,\n corpus: buildSearchCorpus(document),\n };\n}\n\ntype ExtensionEmbedBatch = (context: {\n inputs: string[];\n settings: PmSettings;\n model: string;\n}) => Promise<number[][]> | number[][];\n\ntype ExtensionEmbedOne = (context: {\n input: string;\n settings: PmSettings;\n model: string;\n}) => Promise<number[]> | number[];\n\ntype ExtensionVectorUpsert = (context: {\n points: Array<{\n id: string;\n vector: number[];\n payload: Record<string, unknown>;\n }>;\n settings: PmSettings;\n}) => Promise<void> | void;\n\nconst toOptionalNonEmptyString = toNonEmptyStringOrUndefined;\n\nfunction resolveExtensionSearchEmbedding(\n settings: PmSettings,\n): { name: string; embedBatch?: ExtensionEmbedBatch; embed?: ExtensionEmbedOne } | null {\n const registrations = getActiveExtensionRegistrations();\n const providerName = toOptionalNonEmptyString(settings.search?.provider);\n const registration = resolveRegisteredSearchProvider(registrations, providerName);\n if (!registration) {\n return null;\n }\n const runtimeDefinition = registration.runtime_definition ?? registration.definition;\n const name =\n toOptionalNonEmptyString((runtimeDefinition as { name?: unknown }).name) ??\n toOptionalNonEmptyString((registration.definition as { name?: unknown }).name) ??\n providerName;\n if (!name) {\n return null;\n }\n const embedBatch = (runtimeDefinition as { embedBatch?: unknown; embed_batch?: unknown }).embedBatch;\n const embedBatchSnake = (runtimeDefinition as { embedBatch?: unknown; embed_batch?: unknown }).embed_batch;\n const embed = (runtimeDefinition as { embed?: unknown }).embed;\n const resolvedEmbedBatch =\n typeof embedBatch === \"function\"\n ? (embedBatch as ExtensionEmbedBatch)\n : typeof embedBatchSnake === \"function\"\n ? (embedBatchSnake as ExtensionEmbedBatch)\n : undefined;\n const resolvedEmbed = typeof embed === \"function\" ? (embed as ExtensionEmbedOne) : undefined;\n if (!resolvedEmbedBatch && !resolvedEmbed) {\n return null;\n }\n return {\n name,\n embedBatch: resolvedEmbedBatch,\n embed: resolvedEmbed,\n };\n}\n\nfunction resolveExtensionVectorUpsert(settings: PmSettings): { name: string; upsert: ExtensionVectorUpsert } | null {\n const registrations = getActiveExtensionRegistrations();\n const adapterName = toOptionalNonEmptyString(settings.vector_store?.adapter);\n const registration = resolveRegisteredVectorStoreAdapter(registrations, adapterName);\n if (!registration) {\n return null;\n }\n const runtimeDefinition = registration.runtime_definition ?? registration.definition;\n const name =\n toOptionalNonEmptyString((runtimeDefinition as { name?: unknown }).name) ??\n toOptionalNonEmptyString((registration.definition as { name?: unknown }).name) ??\n adapterName;\n const upsert = (runtimeDefinition as { upsert?: unknown }).upsert;\n if (!name || typeof upsert !== \"function\") {\n return null;\n }\n return {\n name,\n upsert: upsert as ExtensionVectorUpsert,\n };\n}\n\nfunction assertVector(value: unknown, context: string): number[] {\n if (!Array.isArray(value) || value.some((entry) => typeof entry !== \"number\" || !Number.isFinite(entry))) {\n throw new PmCliError(`Invalid vector returned by ${context}`, EXIT_CODE.GENERIC_FAILURE);\n }\n return value;\n}\n\nasync function executeExtensionEmbedding(\n extensionEmbedding: { name: string; embedBatch?: ExtensionEmbedBatch; embed?: ExtensionEmbedOne },\n settings: PmSettings,\n corpusInputs: string[],\n): Promise<number[][]> {\n const model = settings.search?.embedding_model?.trim() || \"text-embedding-3-small\";\n if (extensionEmbedding.embedBatch) {\n const vectors = await Promise.resolve(\n extensionEmbedding.embedBatch({\n inputs: corpusInputs,\n settings,\n model,\n }),\n );\n if (!Array.isArray(vectors)) {\n throw new PmCliError(\n `Extension search provider \"${extensionEmbedding.name}\" embedBatch must return an array of vectors`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n return vectors.map((vector, index) =>\n assertVector(vector, `extension search provider \"${extensionEmbedding.name}\" embedBatch output at index ${index}`),\n );\n }\n if (!extensionEmbedding.embed) {\n throw new PmCliError(\n `Extension search provider \"${extensionEmbedding.name}\" does not implement embed/embedBatch`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n const vectors: number[][] = [];\n for (const [index, input] of corpusInputs.entries()) {\n const vector = await Promise.resolve(\n extensionEmbedding.embed({\n input,\n settings,\n model,\n }),\n );\n vectors.push(assertVector(vector, `extension search provider \"${extensionEmbedding.name}\" embed output at index ${index}`));\n }\n return vectors;\n}\n\nexport async function runReindex(options: ReindexOptions, global: GlobalOptions): Promise<ReindexResult> {\n const requestedMode = parseMode(options.mode);\n const progressEnabled = shouldEmitReindexProgress(options);\n emitReindexProgress(progressEnabled, `start mode=${requestedMode}`);\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n if (!(await pathExists(getSettingsPath(pmRoot)))) {\n throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);\n }\n\n const settings = resolveSettingsWithSemanticRuntimeDefaults(await readSettings(pmRoot)).settings;\n let releaseReindexLock: (() => Promise<void>) | null = null;\n try {\n releaseReindexLock = await acquireLock(\n pmRoot,\n REINDEX_LOCK_ID,\n settings.locks.ttl_seconds,\n process.env.PM_AUTHOR ?? \"pm-reindex\",\n false,\n settings.governance.force_required_for_stale_lock,\n );\n } catch (error: unknown) {\n if (error instanceof PmCliError && error.exitCode === EXIT_CODE.CONFLICT) {\n throw new PmCliError(\n \"Another pm reindex run is already active for this project. Wait for it to finish before starting a new keyword, semantic, or hybrid reindex.\",\n EXIT_CODE.CONFLICT,\n {\n code: \"reindex_already_running\",\n type: \"urn:pm-cli:error:reindex_already_running\",\n why: \"Semantic reindex can be expensive and duplicate runs compete for the same local embedding model and vector store.\",\n nextSteps: [\n \"Check active pm reindex processes before starting another reindex.\",\n \"Rerun with --progress when you need non-interactive visibility.\",\n ],\n },\n );\n }\n throw error;\n }\n\n try {\n const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());\n const extensionEmbedding = resolveExtensionSearchEmbedding(settings);\n const extensionVectorUpsert = resolveExtensionVectorUpsert(settings);\n let activeEmbeddingProvider: ReturnType<typeof resolveEmbeddingProviders>[\"active\"] = null;\n let activeVectorStore: ReturnType<typeof resolveVectorStores>[\"active\"] = null;\n if (requestedMode !== \"keyword\") {\n const providerResolution = resolveEmbeddingProviders(settings);\n if (!providerResolution.active && !extensionEmbedding) {\n throw new PmCliError(\n `Reindex mode '${requestedMode}' requires a configured embedding provider in settings.providers.openai/settings.providers.ollama or an extension provider selected by settings.search.provider`,\n EXIT_CODE.USAGE,\n );\n }\n const vectorResolution = resolveVectorStores(settings);\n if (!vectorResolution.active && !extensionVectorUpsert) {\n throw new PmCliError(\n `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`,\n EXIT_CODE.USAGE,\n );\n }\n activeEmbeddingProvider = providerResolution.active;\n activeVectorStore = vectorResolution.active;\n }\n const mode = requestedMode;\n emitReindexProgress(progressEnabled, \"loading item corpus\");\n const loadedCandidates = await loadDocumentCandidates(pmRoot, settings.item_format, typeRegistry.type_to_folder, settings.schema);\n const reindexWarnings = [...loadedCandidates.warnings];\n const documentCandidates = loadedCandidates.candidates;\n const metadataDocuments: ItemDocument[] = documentCandidates.map((candidate) => ({\n metadata: candidate.metadata,\n body: typeof candidate.body === \"string\" ? candidate.body : \"\",\n }));\n emitReindexProgress(progressEnabled, `loaded_items=${metadataDocuments.length}`);\n const generatedAt = nowIso();\n\n const manifest = {\n version: 1,\n mode,\n generated_at: generatedAt,\n total_items: metadataDocuments.length,\n items: metadataDocuments.map((document) => ({\n id: document.metadata.id,\n type: document.metadata.type,\n status: document.metadata.status,\n priority: document.metadata.priority,\n updated_at: document.metadata.updated_at,\n })),\n };\n\n const manifestPath = path.join(pmRoot, MANIFEST_PATH);\n const embeddingsPath = path.join(pmRoot, EMBEDDINGS_PATH);\n\n let documentsForKeywordArtifacts =\n mode === \"keyword\"\n ? await hydrateDocuments(pmRoot, documentCandidates, settings.schema, reindexWarnings)\n : metadataDocuments;\n const semanticWarnings: string[] = [];\n const vectorizationLedgerEntries: Record<string, string> = {};\n const semanticSummary = {\n enabled: mode !== \"keyword\",\n stale_items: 0,\n unchanged_items: 0,\n embedded_items: 0,\n vector_upserted: 0,\n batches_completed: 0,\n };\n if (mode !== \"keyword\" && metadataDocuments.length > 0) {\n const ledger = await readVectorizationStatusLedger(pmRoot);\n semanticWarnings.push(...ledger.warnings);\n const staleIds = new Set(\n metadataDocuments\n .filter((document) => ledger.entries[document.metadata.id] !== document.metadata.updated_at)\n .map((document) => document.metadata.id),\n );\n const staleDocuments = staleIds.size > 0\n ? await hydrateDocuments(pmRoot, documentCandidates, settings.schema, reindexWarnings, staleIds)\n : [];\n const freshDocuments = metadataDocuments.length - staleDocuments.length;\n semanticSummary.stale_items = staleDocuments.length;\n semanticSummary.unchanged_items = freshDocuments;\n for (const document of metadataDocuments) {\n vectorizationLedgerEntries[document.metadata.id] = document.metadata.updated_at;\n }\n if (staleDocuments.length === 0) {\n emitReindexProgress(progressEnabled, `embedding_skipped unchanged_items=${freshDocuments}`);\n semanticWarnings.push(`search_semantic_reindex_skipped_unchanged:count=${freshDocuments}`);\n } else {\n emitReindexProgress(progressEnabled, `embedding_start items=${staleDocuments.length} unchanged_items=${freshDocuments}`);\n const semanticProviderName = activeEmbeddingProvider?.name ?? extensionEmbedding?.name;\n const corpusInputs = staleDocuments.map((document) => buildSemanticCorpusInput(document, { providerName: semanticProviderName }));\n let vectors: number[][] = [];\n if (extensionEmbedding) {\n try {\n vectors = await executeExtensionEmbedding(extensionEmbedding, settings, corpusInputs);\n } catch (error: unknown) {\n if (!activeEmbeddingProvider) {\n throw new PmCliError(\n `Extension search provider \"${extensionEmbedding.name}\" failed to generate embeddings: ${error instanceof Error ? error.message : String(error)}`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n semanticWarnings.push(\n `Extension search provider \"${extensionEmbedding.name}\" failed; falling back to built-in provider (${error instanceof Error ? error.message : String(error)})`,\n );\n }\n }\n if (vectors.length === 0) {\n if (!activeEmbeddingProvider) {\n throw new PmCliError(\n `No embedding executor available for reindex mode '${requestedMode}'`,\n EXIT_CODE.USAGE,\n );\n }\n const embeddingResult = await executeEmbeddingBatchesWithRetry(activeEmbeddingProvider, settings, corpusInputs, {\n onProgress: (event) => {\n if (event.phase === \"complete\") {\n semanticSummary.batches_completed = event.batch_index;\n }\n emitReindexProgress(\n progressEnabled,\n `embedding_batch_${event.phase} batch=${event.batch_index}/${event.batch_total} size=${event.batch_size} completed_inputs=${event.completed_inputs}/${event.total_inputs}`,\n );\n },\n });\n semanticWarnings.push(...embeddingResult.warnings);\n vectors = embeddingResult.vectors;\n }\n emitReindexProgress(progressEnabled, `embedding_complete vectors=${vectors.length}`);\n if (vectors.length !== staleDocuments.length) {\n throw new PmCliError(\n `Embedding output size mismatch (expected ${staleDocuments.length}, received ${vectors.length})`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n const points = staleDocuments.map((document, index) => ({\n id: document.metadata.id,\n vector: assertVector(vectors[index], `reindex embeddings output at index ${index}`),\n payload: {\n id: document.metadata.id,\n type: document.metadata.type,\n status: document.metadata.status,\n priority: document.metadata.priority,\n updated_at: document.metadata.updated_at,\n },\n }));\n semanticSummary.embedded_items = vectors.length;\n if (extensionVectorUpsert) {\n try {\n emitReindexProgress(progressEnabled, `vector_upsert_start adapter=${extensionVectorUpsert.name} points=${points.length}`);\n await Promise.resolve(\n extensionVectorUpsert.upsert({\n points,\n settings,\n }),\n );\n semanticSummary.vector_upserted = points.length;\n emitReindexProgress(progressEnabled, `vector_upsert_complete adapter=${extensionVectorUpsert.name}`);\n } catch (error: unknown) {\n if (!activeVectorStore) {\n throw new PmCliError(\n `Extension vector adapter \"${extensionVectorUpsert.name}\" failed to upsert vectors: ${error instanceof Error ? error.message : String(error)}`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n semanticWarnings.push(\n `Extension vector adapter \"${extensionVectorUpsert.name}\" failed; falling back to built-in vector store (${error instanceof Error ? error.message : String(error)})`,\n );\n emitReindexProgress(progressEnabled, \"vector_upsert_fallback built_in_store\");\n await executeVectorUpsert(activeVectorStore, points);\n semanticSummary.vector_upserted = points.length;\n emitReindexProgress(progressEnabled, `vector_upsert_complete adapter=${activeVectorStore.name}`);\n }\n } else if (activeVectorStore) {\n emitReindexProgress(progressEnabled, `vector_upsert_start adapter=${activeVectorStore.name} points=${points.length}`);\n await executeVectorUpsert(activeVectorStore, points);\n semanticSummary.vector_upserted = points.length;\n emitReindexProgress(progressEnabled, `vector_upsert_complete adapter=${activeVectorStore.name}`);\n } else {\n throw new PmCliError(\n `No vector upsert executor available for reindex mode '${requestedMode}'`,\n EXIT_CODE.USAGE,\n );\n }\n if (freshDocuments > 0) {\n semanticWarnings.push(`search_semantic_reindex_skipped_unchanged:count=${freshDocuments}`);\n }\n const staleDocumentsById = new Map(staleDocuments.map((document) => [document.metadata.id, document]));\n documentsForKeywordArtifacts = metadataDocuments.map(\n (document) => staleDocumentsById.get(document.metadata.id) ?? document,\n );\n }\n }\n const embeddingsLines = documentsForKeywordArtifacts.map((document) => JSON.stringify(buildKeywordRecord(document, mode))).join(\"\\n\");\n emitReindexProgress(progressEnabled, \"writing keyword artifacts\");\n await writeFileAtomic(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`);\n await writeFileAtomic(embeddingsPath, `${embeddingsLines}\\n`);\n const vectorizationWarnings: string[] = [];\n if (mode !== \"keyword\") {\n try {\n emitReindexProgress(progressEnabled, \"writing vectorization status ledger\");\n await writeVectorizationStatusLedger(pmRoot, vectorizationLedgerEntries);\n } catch (error: unknown) {\n vectorizationWarnings.push(\n `search_vectorization_status_ledger_write_failed:${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n const hookWarnings = [\n ...(await runActiveOnWriteHooks({\n path: manifestPath,\n scope: \"project\",\n op: \"reindex:manifest\",\n })),\n ...(await runActiveOnWriteHooks({\n path: embeddingsPath,\n scope: \"project\",\n op: \"reindex:embeddings\",\n })),\n ...(await runActiveOnIndexHooks({\n mode,\n total_items: metadataDocuments.length,\n })),\n ];\n emitReindexProgress(progressEnabled, \"done\");\n\n return {\n ok: true,\n mode,\n total_items: metadataDocuments.length,\n semantic: semanticSummary,\n artifacts: {\n manifest: MANIFEST_PATH,\n embeddings: EMBEDDINGS_PATH,\n },\n warnings: [...reindexWarnings, ...semanticWarnings, ...vectorizationWarnings, ...hookWarnings],\n generated_at: generatedAt,\n };\n } finally {\n await releaseReindexLock?.();\n }\n}\n"]}