@unbrained/pm-cli 2026.6.11 → 2026.6.12

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 (180) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/cli/commands/completion.js +20 -8
  3. package/dist/cli/commands/completion.js.map +1 -1
  4. package/dist/cli/commands/create.js +6 -3
  5. package/dist/cli/commands/create.js.map +1 -1
  6. package/dist/cli/commands/docs.d.ts +2 -0
  7. package/dist/cli/commands/docs.js +2 -2
  8. package/dist/cli/commands/docs.js.map +1 -1
  9. package/dist/cli/commands/files.d.ts +2 -0
  10. package/dist/cli/commands/files.js +2 -2
  11. package/dist/cli/commands/files.js.map +1 -1
  12. package/dist/cli/commands/health.d.ts +1 -1
  13. package/dist/cli/commands/health.js +77 -2
  14. package/dist/cli/commands/health.js.map +1 -1
  15. package/dist/cli/commands/history-repair.d.ts +36 -0
  16. package/dist/cli/commands/history-repair.js +68 -3
  17. package/dist/cli/commands/history-repair.js.map +1 -1
  18. package/dist/cli/commands/index.d.ts +1 -1
  19. package/dist/cli/commands/index.js +3 -3
  20. package/dist/cli/commands/index.js.map +1 -1
  21. package/dist/cli/commands/linked-artifacts.d.ts +18 -0
  22. package/dist/cli/commands/linked-artifacts.js +26 -3
  23. package/dist/cli/commands/linked-artifacts.js.map +1 -1
  24. package/dist/cli/commands/plan.d.ts +6 -0
  25. package/dist/cli/commands/plan.js +93 -32
  26. package/dist/cli/commands/plan.js.map +1 -1
  27. package/dist/cli/commands/validate.d.ts +20 -0
  28. package/dist/cli/commands/validate.js +292 -28
  29. package/dist/cli/commands/validate.js.map +1 -1
  30. package/dist/cli/help-content.js +7 -3
  31. package/dist/cli/help-content.js.map +1 -1
  32. package/dist/cli/register-mutation.js +47 -16
  33. package/dist/cli/register-mutation.js.map +1 -1
  34. package/dist/cli/register-operations.js +10 -2
  35. package/dist/cli/register-operations.js.map +1 -1
  36. package/dist/cli/register-setup.js +16 -16
  37. package/dist/cli/register-setup.js.map +1 -1
  38. package/dist/cli-bundle/chunks/{chunk-P2PSODAQ.js → chunk-35P4GT6E.js} +110 -9
  39. package/dist/cli-bundle/chunks/chunk-35P4GT6E.js.map +7 -0
  40. package/dist/cli-bundle/chunks/{chunk-B65UUCGQ.js → chunk-37CYVF73.js} +2 -2
  41. package/dist/cli-bundle/chunks/{chunk-J3GD64J2.js → chunk-7AMK6DOW.js} +4 -4
  42. package/dist/cli-bundle/chunks/{chunk-J3GD64J2.js.map → chunk-7AMK6DOW.js.map} +1 -1
  43. package/dist/cli-bundle/chunks/{chunk-IKOH24GZ.js → chunk-AX4GEVQC.js} +3 -3
  44. package/dist/cli-bundle/chunks/{chunk-IKOH24GZ.js.map → chunk-AX4GEVQC.js.map} +2 -2
  45. package/dist/cli-bundle/chunks/chunk-C6SAP27O.js +187 -0
  46. package/dist/cli-bundle/chunks/chunk-C6SAP27O.js.map +1 -0
  47. package/dist/cli-bundle/chunks/chunk-EKS6O2IR.js +217 -0
  48. package/dist/cli-bundle/chunks/chunk-EKS6O2IR.js.map +1 -0
  49. package/dist/cli-bundle/chunks/{chunk-PSD7F7DX.js → chunk-KBPQHXWG.js} +17 -4
  50. package/dist/cli-bundle/chunks/chunk-KBPQHXWG.js.map +1 -0
  51. package/dist/cli-bundle/chunks/{chunk-3SLOMKCJ.js → chunk-L5EPZQIC.js} +2 -2
  52. package/dist/cli-bundle/chunks/chunk-NAWVUHXH.js +220 -0
  53. package/dist/cli-bundle/chunks/chunk-NAWVUHXH.js.map +7 -0
  54. package/dist/cli-bundle/chunks/{chunk-UOO6BYIA.js → chunk-PNYAAB4S.js} +21 -188
  55. package/dist/cli-bundle/chunks/chunk-PNYAAB4S.js.map +1 -0
  56. package/dist/cli-bundle/chunks/chunk-R2OUQVBK.js +190 -0
  57. package/dist/cli-bundle/chunks/chunk-R2OUQVBK.js.map +7 -0
  58. package/dist/cli-bundle/chunks/{chunk-LCSCXBGT.js → chunk-R4VWYWRN.js} +19 -193
  59. package/dist/cli-bundle/chunks/chunk-R4VWYWRN.js.map +7 -0
  60. package/dist/cli-bundle/chunks/{chunk-7RIT3OCD.js → chunk-SO55HRA5.js} +2 -2
  61. package/dist/cli-bundle/chunks/{chunk-FXRU333M.js → chunk-UIG4TW2H.js} +110 -9
  62. package/dist/cli-bundle/chunks/chunk-UIG4TW2H.js.map +1 -0
  63. package/dist/cli-bundle/chunks/{chunk-E5DUIJA4.js → chunk-WPDMBIX6.js} +16 -3
  64. package/dist/cli-bundle/chunks/chunk-WPDMBIX6.js.map +7 -0
  65. package/dist/cli-bundle/chunks/{chunk-IH4MBKK7.js → chunk-XWMF3POR.js} +2 -2
  66. package/dist/cli-bundle/chunks/{contracts-3NKWYKKU.js → contracts-2G66IGIA.js} +2 -2
  67. package/dist/cli-bundle/chunks/{contracts-MIXBWJIB.js → contracts-PJCHYSO5.js} +2 -2
  68. package/dist/cli-bundle/chunks/{create-IFA26O2I.js → create-5433DP3G.js} +2 -2
  69. package/dist/cli-bundle/chunks/{create-JVXYHYH4.js → create-VWLWS34Z.js} +2 -2
  70. package/dist/cli-bundle/chunks/{docs-5WMBVQT2.js → docs-I3BAF5WH.js} +4 -4
  71. package/dist/cli-bundle/chunks/docs-I3BAF5WH.js.map +1 -0
  72. package/dist/cli-bundle/chunks/{docs-MB53UJAJ.js → docs-MXLGZUIT.js} +3 -3
  73. package/dist/cli-bundle/chunks/docs-MXLGZUIT.js.map +7 -0
  74. package/dist/cli-bundle/chunks/{files-GVMNVLCB.js → files-FYP3MDPX.js} +3 -3
  75. package/dist/cli-bundle/chunks/files-FYP3MDPX.js.map +7 -0
  76. package/dist/cli-bundle/chunks/{files-DLB5LJEP.js → files-GUXUM2MB.js} +4 -4
  77. package/dist/cli-bundle/chunks/files-GUXUM2MB.js.map +1 -0
  78. package/dist/cli-bundle/chunks/{gc-2WEPW6D6.js → gc-FENB2ESG.js} +12 -174
  79. package/dist/cli-bundle/chunks/gc-FENB2ESG.js.map +1 -0
  80. package/dist/cli-bundle/chunks/{gc-4Z3IKHAZ.js → gc-KGQG66SA.js} +10 -179
  81. package/dist/cli-bundle/chunks/gc-KGQG66SA.js.map +7 -0
  82. package/dist/cli-bundle/chunks/{health-YO5LRWN4.js → health-7MTXAVR2.js} +71 -4
  83. package/dist/cli-bundle/chunks/health-7MTXAVR2.js.map +7 -0
  84. package/dist/cli-bundle/chunks/{health-4ZYB3IYQ.js → health-E4D7KGHD.js} +72 -5
  85. package/dist/cli-bundle/chunks/health-E4D7KGHD.js.map +1 -0
  86. package/dist/cli-bundle/chunks/{history-repair-KVPFJKOS.js → history-repair-OSQOKJ3E.js} +61 -3
  87. package/dist/cli-bundle/chunks/history-repair-OSQOKJ3E.js.map +7 -0
  88. package/dist/cli-bundle/chunks/{history-repair-RUGKD3YR.js → history-repair-SBK7P34V.js} +62 -4
  89. package/dist/cli-bundle/chunks/history-repair-SBK7P34V.js.map +1 -0
  90. package/dist/cli-bundle/chunks/{plan-VNUG3WZZ.js → plan-2YTQYWGM.js} +52 -12
  91. package/dist/cli-bundle/chunks/plan-2YTQYWGM.js.map +1 -0
  92. package/dist/cli-bundle/chunks/{plan-FQLMJRLZ.js → plan-7IVSICR6.js} +51 -11
  93. package/dist/cli-bundle/chunks/plan-7IVSICR6.js.map +7 -0
  94. package/dist/cli-bundle/chunks/{register-list-query-VHDXWEPP.js → register-list-query-4UPMHONX.js} +3 -3
  95. package/dist/cli-bundle/chunks/{register-list-query-NPE3ECJQ.js → register-list-query-7VOW2C3W.js} +3 -3
  96. package/dist/cli-bundle/chunks/{register-mutation-EAYNLGOS.js → register-mutation-FARSGYRD.js} +43 -26
  97. package/dist/cli-bundle/chunks/{register-mutation-EAYNLGOS.js.map → register-mutation-FARSGYRD.js.map} +2 -2
  98. package/dist/cli-bundle/chunks/{register-mutation-DG53FCBV.js → register-mutation-LJDNVREU.js} +44 -27
  99. package/dist/cli-bundle/chunks/{register-mutation-DG53FCBV.js.map → register-mutation-LJDNVREU.js.map} +1 -1
  100. package/dist/cli-bundle/chunks/{register-operations-AM6KTWB6.js → register-operations-FFTYAL42.js} +17 -13
  101. package/dist/cli-bundle/chunks/register-operations-FFTYAL42.js.map +1 -0
  102. package/dist/cli-bundle/chunks/{register-operations-FWFE64JG.js → register-operations-HCJKDUA6.js} +16 -12
  103. package/dist/cli-bundle/chunks/{register-operations-FWFE64JG.js.map → register-operations-HCJKDUA6.js.map} +2 -2
  104. package/dist/cli-bundle/chunks/{register-setup-IKX5524L.js → register-setup-6AVIUOCC.js} +19 -19
  105. package/dist/cli-bundle/chunks/register-setup-6AVIUOCC.js.map +1 -0
  106. package/dist/cli-bundle/chunks/{register-setup-G4QYI3RX.js → register-setup-KVNLO5OJ.js} +18 -18
  107. package/dist/cli-bundle/chunks/register-setup-KVNLO5OJ.js.map +7 -0
  108. package/dist/cli-bundle/chunks/{update-2EVXOC7V.js → update-36JM7YZT.js} +3 -3
  109. package/dist/cli-bundle/chunks/{update-5A2B6QYB.js → update-I246PCLO.js} +3 -3
  110. package/dist/cli-bundle/chunks/{update-many-V4LA3C4H.js → update-many-F4IKDWZB.js} +3 -3
  111. package/dist/cli-bundle/chunks/{update-many-TUGU5YXQ.js → update-many-NTWZ5YT3.js} +3 -3
  112. package/dist/cli-bundle/chunks/{validate-EQTT6WVX.js → validate-46KCRHL7.js} +448 -36
  113. package/dist/cli-bundle/chunks/validate-46KCRHL7.js.map +1 -0
  114. package/dist/cli-bundle/chunks/{validate-XN4I4DPL.js → validate-CRFMPTYD.js} +468 -35
  115. package/dist/cli-bundle/chunks/validate-CRFMPTYD.js.map +7 -0
  116. package/dist/cli-bundle/main.js +24 -10
  117. package/dist/cli-bundle/main.js.map +2 -2
  118. package/dist/core/diagnostics/remediation.js +19 -6
  119. package/dist/core/diagnostics/remediation.js.map +1 -1
  120. package/dist/core/lock/lock-gc.d.ts +31 -0
  121. package/dist/core/lock/lock-gc.js +120 -62
  122. package/dist/core/lock/lock-gc.js.map +1 -1
  123. package/dist/core/telemetry/consent.js +18 -3
  124. package/dist/core/telemetry/consent.js.map +1 -1
  125. package/dist/core/validate/fix-planning.d.ts +130 -0
  126. package/dist/core/validate/fix-planning.js +202 -0
  127. package/dist/core/validate/fix-planning.js.map +1 -0
  128. package/dist/core/validate/missing-by-type.d.ts +21 -0
  129. package/dist/core/validate/missing-by-type.js +39 -0
  130. package/dist/core/validate/missing-by-type.js.map +1 -0
  131. package/dist/core/validate/stale-file-classification.d.ts +41 -0
  132. package/dist/core/validate/stale-file-classification.js +73 -0
  133. package/dist/core/validate/stale-file-classification.js.map +1 -0
  134. package/dist/mcp/server.js +41 -8
  135. package/dist/mcp/server.js.map +1 -1
  136. package/dist/sdk/cli-contracts/tool-parameter-tables.js +38 -2
  137. package/dist/sdk/cli-contracts/tool-parameter-tables.js.map +1 -1
  138. package/dist/sdk/cli-contracts.d.ts +6 -1
  139. package/dist/sdk/cli-contracts.js +74 -7
  140. package/dist/sdk/cli-contracts.js.map +1 -1
  141. package/docs/AGENT_GUIDE.md +6 -1
  142. package/docs/COMMANDS.md +23 -1
  143. package/package.json +1 -1
  144. package/dist/cli-bundle/chunks/chunk-E5DUIJA4.js.map +0 -7
  145. package/dist/cli-bundle/chunks/chunk-FXRU333M.js.map +0 -1
  146. package/dist/cli-bundle/chunks/chunk-LCSCXBGT.js.map +0 -7
  147. package/dist/cli-bundle/chunks/chunk-P2PSODAQ.js.map +0 -7
  148. package/dist/cli-bundle/chunks/chunk-PSD7F7DX.js.map +0 -1
  149. package/dist/cli-bundle/chunks/chunk-UOO6BYIA.js.map +0 -1
  150. package/dist/cli-bundle/chunks/docs-5WMBVQT2.js.map +0 -1
  151. package/dist/cli-bundle/chunks/docs-MB53UJAJ.js.map +0 -7
  152. package/dist/cli-bundle/chunks/files-DLB5LJEP.js.map +0 -1
  153. package/dist/cli-bundle/chunks/files-GVMNVLCB.js.map +0 -7
  154. package/dist/cli-bundle/chunks/gc-2WEPW6D6.js.map +0 -1
  155. package/dist/cli-bundle/chunks/gc-4Z3IKHAZ.js.map +0 -7
  156. package/dist/cli-bundle/chunks/health-4ZYB3IYQ.js.map +0 -1
  157. package/dist/cli-bundle/chunks/health-YO5LRWN4.js.map +0 -7
  158. package/dist/cli-bundle/chunks/history-repair-KVPFJKOS.js.map +0 -7
  159. package/dist/cli-bundle/chunks/history-repair-RUGKD3YR.js.map +0 -1
  160. package/dist/cli-bundle/chunks/plan-FQLMJRLZ.js.map +0 -7
  161. package/dist/cli-bundle/chunks/plan-VNUG3WZZ.js.map +0 -1
  162. package/dist/cli-bundle/chunks/register-operations-AM6KTWB6.js.map +0 -1
  163. package/dist/cli-bundle/chunks/register-setup-G4QYI3RX.js.map +0 -7
  164. package/dist/cli-bundle/chunks/register-setup-IKX5524L.js.map +0 -1
  165. package/dist/cli-bundle/chunks/validate-EQTT6WVX.js.map +0 -1
  166. package/dist/cli-bundle/chunks/validate-XN4I4DPL.js.map +0 -7
  167. /package/dist/cli-bundle/chunks/{chunk-B65UUCGQ.js.map → chunk-37CYVF73.js.map} +0 -0
  168. /package/dist/cli-bundle/chunks/{chunk-3SLOMKCJ.js.map → chunk-L5EPZQIC.js.map} +0 -0
  169. /package/dist/cli-bundle/chunks/{chunk-7RIT3OCD.js.map → chunk-SO55HRA5.js.map} +0 -0
  170. /package/dist/cli-bundle/chunks/{chunk-IH4MBKK7.js.map → chunk-XWMF3POR.js.map} +0 -0
  171. /package/dist/cli-bundle/chunks/{contracts-3NKWYKKU.js.map → contracts-2G66IGIA.js.map} +0 -0
  172. /package/dist/cli-bundle/chunks/{contracts-MIXBWJIB.js.map → contracts-PJCHYSO5.js.map} +0 -0
  173. /package/dist/cli-bundle/chunks/{create-IFA26O2I.js.map → create-5433DP3G.js.map} +0 -0
  174. /package/dist/cli-bundle/chunks/{create-JVXYHYH4.js.map → create-VWLWS34Z.js.map} +0 -0
  175. /package/dist/cli-bundle/chunks/{register-list-query-VHDXWEPP.js.map → register-list-query-4UPMHONX.js.map} +0 -0
  176. /package/dist/cli-bundle/chunks/{register-list-query-NPE3ECJQ.js.map → register-list-query-7VOW2C3W.js.map} +0 -0
  177. /package/dist/cli-bundle/chunks/{update-2EVXOC7V.js.map → update-36JM7YZT.js.map} +0 -0
  178. /package/dist/cli-bundle/chunks/{update-5A2B6QYB.js.map → update-I246PCLO.js.map} +0 -0
  179. /package/dist/cli-bundle/chunks/{update-many-V4LA3C4H.js.map → update-many-F4IKDWZB.js.map} +0 -0
  180. /package/dist/cli-bundle/chunks/{update-many-TUGU5YXQ.js.map → update-many-NTWZ5YT3.js.map} +0 -0
@@ -32,7 +32,7 @@ import fg from "fast-glob";
32
32
  !(function() {
33
33
  try {
34
34
  var e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : {}, n = new e.Error().stack;
35
- n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "352e67e3-0c41-5c04-8d2d-3395c6216303");
35
+ n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "5daf731a-1742-5bff-81a8-b1868a81a9f4");
36
36
  } catch (e2) {
37
37
  }
38
38
  })();
@@ -157,6 +157,19 @@ async function expandAddGlobEntries(entries) {
157
157
  }
158
158
  return expanded;
159
159
  }
160
+ function applyStandaloneNote(adds, note, hasAddFlags) {
161
+ if (note === void 0) {
162
+ return adds;
163
+ }
164
+ if (!hasAddFlags) {
165
+ throw new PmCliError("--note requires --add or --add-glob in the same invocation (the note annotates the links being added)", EXIT_CODE.USAGE);
166
+ }
167
+ const trimmed = note.trim();
168
+ if (trimmed.length === 0) {
169
+ return adds;
170
+ }
171
+ return adds.map((entry) => entry.note === void 0 ? { ...entry, note: trimmed } : entry);
172
+ }
160
173
  function artifactKey(value) {
161
174
  return `${value.path}::${value.scope}`;
162
175
  }
@@ -237,7 +250,7 @@ async function runLinkedArtifacts(id, options, global2, config) {
237
250
  const parsedAdds = parseAddEntries(resolvedAdds, config.bareNoun);
238
251
  const addGlobs = parseAddGlobEntries(resolvedAddGlobs);
239
252
  const expandedGlobAdds = await expandAddGlobEntries(addGlobs);
240
- const adds = [...parsedAdds, ...expandedGlobAdds];
253
+ const adds = applyStandaloneNote([...parsedAdds, ...expandedGlobAdds], options.note, parsedAdds.length > 0 || addGlobs.length > 0);
241
254
  const removes = parseRemoveEntries(resolvedRemoves);
242
255
  const migrations = parseMigrateEntries(resolvedMigrations);
243
256
  const shouldMutate = adds.length > 0 || removes.length > 0 || migrations.length > 0;
@@ -346,4 +359,4 @@ export {
346
359
  runLinkedArtifacts,
347
360
  renameArtifactsResultKey
348
361
  };
349
- //# sourceMappingURL=chunk-E5DUIJA4.js.map
362
+ //# sourceMappingURL=chunk-WPDMBIX6.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../../cli/commands/linked-artifacts.ts"],
4
+ "sourcesContent": ["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport fg from \"fast-glob\";\nimport { pathExists } from \"../../core/fs/fs-utils.js\";\nimport { getActiveExtensionRegistrations } from \"../../core/extensions/index.js\";\nimport { createStdinTokenResolver, parseCsvKv } from \"../../core/item/parse.js\";\nimport { resolveItemTypeRegistry } from \"../../core/item/type-registry.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 { listAllFrontMatter, locateItem, mutateItem, readLocatedItem } from \"../../core/store/item-store.js\";\nimport { getSettingsPath, resolvePmRoot } from \"../../core/store/paths.js\";\nimport { readSettings } from \"../../core/store/settings.js\";\nimport { SCOPE_VALUES } from \"../../types/index.js\";\nimport { resolveAuthor } from \"../../core/shared/author.js\";\nimport type { LinkScope } from \"../../types/index.js\";\n\nexport type LinkedArtifact = {\n path: string;\n scope: LinkScope;\n note?: string;\n};\n\nexport interface LinkedArtifactCommandOptions {\n add?: string[];\n addGlob?: string[];\n remove?: string[];\n migrate?: string[];\n /**\n * GH-170 (pm-pfnx): standalone note applied to every link added by --add /\n * --add-glob in the same invocation. A per-entry embedded note (the\n * `path=...,note=...` pair syntax) takes precedence over this flag.\n * Requires at least one --add/--add-glob; rejected otherwise.\n */\n note?: string;\n list?: boolean;\n appendStable?: boolean;\n validatePaths?: boolean;\n audit?: boolean;\n author?: string;\n message?: string;\n force?: boolean;\n}\n\nexport interface PathMigration {\n from: string;\n to: string;\n}\n\nexport interface AddGlobEntry {\n pattern: string;\n scope: LinkScope;\n note?: string;\n}\n\nexport interface LinkedPathValidation {\n checked: number;\n existing_files: string[];\n missing_paths: string[];\n non_file_paths: string[];\n}\n\nexport interface LinkedPathAuditEntry {\n path: string;\n linked_by_count: number;\n linked_item_ids: string[];\n}\n\nexport interface LinkedArtifactResult {\n id: string;\n changed: boolean;\n count: number;\n migrations_applied?: number;\n validation?: LinkedPathValidation;\n audit?: LinkedPathAuditEntry[];\n artifacts: LinkedArtifact[];\n}\n\n/**\n * Configuration that adapts the shared linked-artifact command core to a\n * specific resource kind (files or docs) while preserving every behavioral\n * detail of the original twin implementations.\n */\nexport interface LinkedArtifactKindConfig {\n /** Metadata key under which the artifacts are stored (e.g. \"files\" | \"docs\"). */\n metadataKey: \"files\" | \"docs\";\n /** Mutation op recorded in history (e.g. \"files_add\" | \"docs_add\"). */\n op: \"files_add\" | \"docs_add\";\n /** Noun used in the \"bare <noun> path\" --add usage error (e.g. \"file\" | \"doc\"). */\n bareNoun: \"file\" | \"doc\";\n /**\n * Whether this kind honors the append-stable option. files supports it;\n * docs always sorts and must never expose append-stable behavior.\n */\n supportsAppendStable: boolean;\n}\n\nexport function ensureScope(raw: string | undefined): LinkScope {\n const value = (raw ?? \"project\") as LinkScope;\n if (!SCOPE_VALUES.includes(value)) {\n throw new PmCliError(\n `Invalid scope \"${raw}\". Valid scopes: ${SCOPE_VALUES.join(\", \")} (default: project).`,\n EXIT_CODE.USAGE,\n );\n }\n return value;\n}\n\nexport function looksLikeStructuredPathEntry(raw: string): boolean {\n if (raw.startsWith(\"```\") || raw.includes(\"\\n\")) {\n return true;\n }\n return /^(?:[-*+]\\s+)?(?:path|scope|note)\\s*[:=]/i.test(raw);\n}\n\nexport function parseAddEntries(raw: string[] | undefined, bareNoun: \"file\" | \"doc\"): LinkedArtifact[] {\n if (!raw) return [];\n return raw.map((entry) => {\n const trimmed = entry.trim();\n const kv = looksLikeStructuredPathEntry(trimmed) ? parseCsvKv(entry, \"--add\") : { path: trimmed };\n if (!kv.path) {\n throw new PmCliError(`--add requires path=<value> or a bare ${bareNoun} path`, EXIT_CODE.USAGE);\n }\n return {\n path: kv.path,\n scope: ensureScope(kv.scope),\n note: kv.note?.trim() || undefined,\n };\n });\n}\n\nexport function parseAddGlobEntries(raw: string[] | undefined): AddGlobEntry[] {\n if (!raw) return [];\n return raw.map((entry) => {\n const trimmed = entry.trim();\n if (!trimmed) {\n throw new PmCliError(\"--add-glob requires a glob pattern value\", EXIT_CODE.USAGE);\n }\n if (trimmed.includes(\"=\") || /^(?:[-*+]\\s+)?(?:pattern|glob|path)\\s*[:=]/i.test(trimmed) || trimmed.startsWith(\"```\")) {\n const kv = parseCsvKv(trimmed, \"--add-glob\");\n const pattern = kv.pattern?.trim() || kv.glob?.trim() || kv.path?.trim();\n if (!pattern) {\n throw new PmCliError(\"--add-glob key/value form requires pattern=<glob>\", EXIT_CODE.USAGE);\n }\n return {\n pattern,\n scope: ensureScope(kv.scope),\n note: kv.note?.trim() || undefined,\n };\n }\n return {\n pattern: trimmed,\n scope: \"project\",\n };\n });\n}\n\nexport function parseRemoveEntries(raw: string[] | undefined): string[] {\n if (!raw) return [];\n return raw.map((entry) => {\n const trimmed = entry.trim();\n if (!trimmed) {\n throw new PmCliError(\"--remove requires a path value\", EXIT_CODE.USAGE);\n }\n if (trimmed.includes(\"=\") || /^(?:[-*+]\\s+)?path\\s*[:=]/i.test(trimmed) || trimmed.startsWith(\"```\")) {\n const kv = parseCsvKv(trimmed, \"--remove\");\n if (!kv.path) {\n throw new PmCliError(\"--remove key/value form requires path=<value>\", EXIT_CODE.USAGE);\n }\n return kv.path;\n }\n return trimmed;\n });\n}\n\nexport function parseMigrateEntries(raw: string[] | undefined): PathMigration[] {\n if (!raw) return [];\n return raw.map((entry) => {\n const kv = parseCsvKv(entry, \"--migrate\");\n const from = kv.from?.trim();\n const to = kv.to?.trim();\n if (!from || !to) {\n throw new PmCliError(\"--migrate requires from=<value> and to=<value>\", EXIT_CODE.USAGE);\n }\n return { from, to };\n });\n}\n\nexport function applyPathMigrations(artifactPath: string, migrations: PathMigration[]): string {\n let next = artifactPath;\n for (const migration of migrations) {\n if (next.startsWith(migration.from)) {\n next = `${migration.to}${next.slice(migration.from.length)}`;\n }\n }\n return next;\n}\n\nexport function normalizeLinkedPath(value: string): string {\n return value.split(path.sep).join(\"/\");\n}\n\nexport async function expandAddGlobEntries(entries: AddGlobEntry[]): Promise<LinkedArtifact[]> {\n const expanded: LinkedArtifact[] = [];\n for (const entry of entries) {\n const absolutePattern = path.isAbsolute(entry.pattern);\n const matches = await fg(entry.pattern, {\n cwd: process.cwd(),\n absolute: absolutePattern,\n onlyFiles: true,\n dot: true,\n unique: true,\n followSymbolicLinks: true,\n });\n const sortedMatches = [...new Set(matches.map((match) => normalizeLinkedPath(path.normalize(match))))].sort((left, right) =>\n left.localeCompare(right),\n );\n for (const matchedPath of sortedMatches) {\n expanded.push({\n path: matchedPath,\n scope: entry.scope,\n note: entry.note,\n });\n }\n }\n return expanded;\n}\n\n/**\n * GH-170 (pm-pfnx): apply a standalone --note to the links added in this\n * invocation. Semantics (documented on pm-pfnx): the note is attached to EVERY\n * entry added via --add/--add-glob so a single flag annotates the whole batch\n * predictably; a per-entry embedded `note=` wins over the standalone flag; and\n * --note without any --add/--add-glob flag is a usage error because there is\n * nothing to annotate (it never retro-edits existing links). `hasAddFlags`\n * reflects flag presence, not match count, so a glob that legitimately matches\n * zero files is not an error.\n */\nexport function applyStandaloneNote(\n adds: LinkedArtifact[],\n note: string | undefined,\n hasAddFlags: boolean,\n): LinkedArtifact[] {\n if (note === undefined) {\n return adds;\n }\n if (!hasAddFlags) {\n throw new PmCliError(\n \"--note requires --add or --add-glob in the same invocation (the note annotates the links being added)\",\n EXIT_CODE.USAGE,\n );\n }\n const trimmed = note.trim();\n if (trimmed.length === 0) {\n return adds;\n }\n return adds.map((entry) => (entry.note === undefined ? { ...entry, note: trimmed } : entry));\n}\n\nexport function artifactKey(value: Pick<LinkedArtifact, \"path\" | \"scope\">): string {\n return `${value.path}::${value.scope}`;\n}\n\nexport function sortLinkedArtifacts(artifacts: LinkedArtifact[]): LinkedArtifact[] {\n return [...artifacts].sort((left, right) => {\n const byPath = left.path.localeCompare(right.path);\n if (byPath !== 0) return byPath;\n return left.scope.localeCompare(right.scope);\n });\n}\n\nexport function dedupeLinkedArtifacts(artifacts: LinkedArtifact[]): LinkedArtifact[] {\n return [...new Map(artifacts.map((entry) => [artifactKey(entry), entry])).values()].map((entry) => ({\n ...entry,\n note: entry.note?.trim() || undefined,\n }));\n}\n\nexport async function validateLinkedPaths(paths: string[]): Promise<LinkedPathValidation> {\n const uniquePaths = [...new Set(paths)].sort((left, right) => left.localeCompare(right));\n const existingFiles: string[] = [];\n const missingPaths: string[] = [];\n const nonFilePaths: string[] = [];\n for (const relativePath of uniquePaths) {\n const resolvedPath = path.isAbsolute(relativePath) ? relativePath : path.resolve(process.cwd(), relativePath);\n try {\n const stats = await fs.stat(resolvedPath);\n if (stats.isFile()) {\n existingFiles.push(relativePath);\n } else {\n nonFilePaths.push(relativePath);\n }\n } catch (error: unknown) {\n if (typeof error === \"object\" && error !== null && \"code\" in error && (error as { code?: string }).code === \"ENOENT\") {\n missingPaths.push(relativePath);\n continue;\n }\n nonFilePaths.push(relativePath);\n }\n }\n return {\n checked: uniquePaths.length,\n existing_files: existingFiles,\n missing_paths: missingPaths,\n non_file_paths: nonFilePaths,\n };\n}\n\nexport function buildLinkedPathAudit(\n paths: string[],\n allItems: Array<{ id: string; artifacts?: LinkedArtifact[] }>,\n): LinkedPathAuditEntry[] {\n const index = new Map<string, Set<string>>();\n for (const item of allItems) {\n for (const linkedArtifact of item.artifacts ?? []) {\n const seen = index.get(linkedArtifact.path) ?? new Set<string>();\n seen.add(item.id);\n index.set(linkedArtifact.path, seen);\n }\n }\n return [...new Set(paths)]\n .sort((left, right) => left.localeCompare(right))\n .map((linkedPath) => {\n const linkedIds = [...(index.get(linkedPath) ?? new Set<string>())].sort((left, right) => left.localeCompare(right));\n return {\n path: linkedPath,\n linked_by_count: linkedIds.length,\n linked_item_ids: linkedIds,\n };\n });\n}\n\n/**\n * Shared linked-artifact list/mutate command core used by runFiles and runDocs.\n * The kind config selects metadata key, op, bare-path noun, and whether\n * append-stable ordering is honored, preserving each twin's exact semantics.\n */\nexport async function runLinkedArtifacts(\n id: string,\n options: LinkedArtifactCommandOptions,\n global: GlobalOptions,\n config: LinkedArtifactKindConfig,\n): Promise<LinkedArtifactResult> {\n const { metadataKey } = config;\n const stdinResolver = createStdinTokenResolver();\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 const settings = await readSettings(pmRoot);\n const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());\n const resolvedAdds = await stdinResolver.resolveList(options.add, \"--add\");\n const resolvedAddGlobs = await stdinResolver.resolveList(options.addGlob, \"--add-glob\");\n const resolvedRemoves = await stdinResolver.resolveList(options.remove, \"--remove\");\n const resolvedMigrations = await stdinResolver.resolveList(options.migrate, \"--migrate\");\n const parsedAdds = parseAddEntries(resolvedAdds, config.bareNoun);\n const addGlobs = parseAddGlobEntries(resolvedAddGlobs);\n const expandedGlobAdds = await expandAddGlobEntries(addGlobs);\n const adds = applyStandaloneNote(\n [...parsedAdds, ...expandedGlobAdds],\n options.note,\n parsedAdds.length > 0 || addGlobs.length > 0,\n );\n const removes = parseRemoveEntries(resolvedRemoves);\n const migrations = parseMigrateEntries(resolvedMigrations);\n const shouldMutate = adds.length > 0 || removes.length > 0 || migrations.length > 0;\n\n const collectAuditItems = async (): Promise<Array<{ id: string; artifacts?: LinkedArtifact[] }>> =>\n (await listAllFrontMatter(pmRoot, settings.item_format, typeRegistry.type_to_folder, undefined, settings.schema)).map((entry) => ({\n id: entry.id,\n artifacts: (entry as Record<string, unknown>)[metadataKey] as LinkedArtifact[] | undefined,\n }));\n\n if (!shouldMutate) {\n const located = await locateItem(pmRoot, id, settings.id_prefix, settings.item_format, typeRegistry.type_to_folder);\n if (!located) {\n throw new PmCliError(`Item ${id} not found`, EXIT_CODE.NOT_FOUND);\n }\n const loaded = await readLocatedItem(located, { schema: settings.schema });\n const artifacts = ((loaded.document.metadata as Record<string, unknown>)[metadataKey] as LinkedArtifact[] | undefined) ?? [];\n return {\n id: located.id,\n artifacts,\n changed: false,\n count: artifacts.length,\n validation: options.validatePaths ? await validateLinkedPaths(artifacts.map((entry) => entry.path)) : undefined,\n audit: options.audit ? buildLinkedPathAudit(artifacts.map((entry) => entry.path), await collectAuditItems()) : undefined,\n };\n }\n\n const author = resolveAuthor(options.author, settings.author_default);\n const result = await mutateItem({\n pmRoot,\n settings,\n id,\n op: config.op,\n author,\n message: options.message,\n force: options.force,\n mutate(document) {\n const metadata = document.metadata as Record<string, unknown>;\n const next = [...((metadata[metadataKey] as LinkedArtifact[] | undefined) ?? [])];\n let migrationCount = 0;\n if (migrations.length > 0) {\n for (let index = 0; index < next.length; index += 1) {\n const migratedPath = applyPathMigrations(next[index].path, migrations);\n if (migratedPath !== next[index].path) {\n next[index] = { ...next[index], path: migratedPath };\n migrationCount += 1;\n }\n }\n }\n const migratedAdds = adds.map((entry) => {\n const migratedPath = applyPathMigrations(entry.path, migrations);\n if (migratedPath !== entry.path) {\n migrationCount += 1;\n }\n return {\n ...entry,\n path: migratedPath,\n };\n });\n const migratedRemoves = removes.map((entry) => applyPathMigrations(entry, migrations));\n for (const add of migratedAdds) {\n const exists = next.some((entry) => entry.path === add.path && entry.scope === add.scope);\n if (!exists) {\n next.push(add);\n }\n }\n if (migratedRemoves.length > 0) {\n for (let i = next.length - 1; i >= 0; i -= 1) {\n if (migratedRemoves.includes(next[i].path)) {\n next.splice(i, 1);\n }\n }\n }\n const deduped = dedupeLinkedArtifacts(next);\n const normalized = config.supportsAppendStable && options.appendStable ? deduped : sortLinkedArtifacts(deduped);\n if (normalized.length > 0) {\n metadata[metadataKey] = normalized;\n } else {\n delete metadata[metadataKey];\n }\n return { changedFields: [metadataKey], warnings: migrationCount > 0 ? [`path_migrations_applied:${migrationCount}`] : [] };\n },\n });\n\n const artifacts = ((result.item as Record<string, unknown>)[metadataKey] as LinkedArtifact[] | undefined) ?? [];\n const migrationWarning = result.warnings.find((warning) => warning.startsWith(\"path_migrations_applied:\"));\n const migrationCount = migrationWarning ? Number(migrationWarning.slice(\"path_migrations_applied:\".length)) : 0;\n const allItems = options.audit ? await collectAuditItems() : [];\n return {\n id: result.item.id,\n artifacts,\n changed: true,\n count: artifacts.length,\n migrations_applied: migrationCount > 0 ? migrationCount : undefined,\n validation: options.validatePaths ? await validateLinkedPaths(artifacts.map((entry) => entry.path)) : undefined,\n audit: options.audit ? buildLinkedPathAudit(artifacts.map((entry) => entry.path), allItems) : undefined,\n };\n}\n\n/**\n * Re-key the generic `artifacts` field to the resource-specific name (files/docs)\n * while preserving the original key order and presence so kind-specific result\n * shapes (and their deterministic JSON key ordering) stay byte-identical.\n */\nexport function renameArtifactsResultKey(result: LinkedArtifactResult, key: \"files\" | \"docs\"): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [field, value] of Object.entries(result)) {\n out[field === \"artifacts\" ? key : field] = value;\n }\n return out;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["global", "artifacts", "migrationCount"]
7
+ }
@@ -12,7 +12,7 @@ import {
12
12
  readFirstStringFromCommanderOptions,
13
13
  readFirstValueFromCommanderOptions,
14
14
  readStringArrayFromCommanderOptions
15
- } from "./chunk-FXRU333M.js";
15
+ } from "./chunk-UIG4TW2H.js";
16
16
  import {
17
17
  refreshSearchArtifactsForMutation,
18
18
  shouldRunSearchRefreshInForeground
@@ -719,6 +719,6 @@ export {
719
719
  normalizeContextOptions,
720
720
  invalidateSearchCachesForMutation
721
721
  };
722
- //# sourceMappingURL=chunk-IH4MBKK7.js.map
722
+ //# sourceMappingURL=chunk-XWMF3POR.js.map
723
723
 
724
724
  //# debugId=757afd85-8988-5517-aa0a-61a39e52c652
@@ -85,7 +85,7 @@ import {
85
85
  UPGRADE_FLAG_CONTRACTS,
86
86
  VALIDATE_FLAG_CONTRACTS,
87
87
  compactFlagAliasContracts
88
- } from "./chunk-FXRU333M.js";
88
+ } from "./chunk-UIG4TW2H.js";
89
89
  import {
90
90
  commandOptionFlagLabel,
91
91
  resolveCommandOptionPolicyState,
@@ -1578,6 +1578,6 @@ async function runContracts(options, global) {
1578
1578
  export {
1579
1579
  runContracts
1580
1580
  };
1581
- //# sourceMappingURL=contracts-3NKWYKKU.js.map
1581
+ //# sourceMappingURL=contracts-2G66IGIA.js.map
1582
1582
 
1583
1583
  //# debugId=9a644368-c7ae-5fc2-a886-bc44dcaf3c42
@@ -83,7 +83,7 @@ import {
83
83
  UPGRADE_FLAG_CONTRACTS,
84
84
  VALIDATE_FLAG_CONTRACTS,
85
85
  compactFlagAliasContracts
86
- } from "./chunk-P2PSODAQ.js";
86
+ } from "./chunk-35P4GT6E.js";
87
87
  import {
88
88
  commandOptionFlagLabel,
89
89
  resolveCommandOptionPolicyState,
@@ -1590,4 +1590,4 @@ async function runContracts(options, global2) {
1590
1590
  export {
1591
1591
  runContracts
1592
1592
  };
1593
- //# sourceMappingURL=contracts-MIXBWJIB.js.map
1593
+ //# sourceMappingURL=contracts-PJCHYSO5.js.map
@@ -6,7 +6,7 @@ import {
6
6
  parseLogSeed,
7
7
  parseTests,
8
8
  runCreate
9
- } from "./chunk-J3GD64J2.js";
9
+ } from "./chunk-7AMK6DOW.js";
10
10
  import "./chunk-4HFU4UO2.js";
11
11
  import "./chunk-I7NYDZDV.js";
12
12
  import "./chunk-Y3YKK7CY.js";
@@ -26,6 +26,6 @@ export {
26
26
  parseTests,
27
27
  runCreate
28
28
  };
29
- //# sourceMappingURL=create-IFA26O2I.js.map
29
+ //# sourceMappingURL=create-5433DP3G.js.map
30
30
 
31
31
  //# debugId=45eac7fa-f181-5cca-93b7-cfb58909dbb3
@@ -4,7 +4,7 @@ import {
4
4
  parseLogSeed,
5
5
  parseTests,
6
6
  runCreate
7
- } from "./chunk-IKOH24GZ.js";
7
+ } from "./chunk-AX4GEVQC.js";
8
8
  import "./chunk-SXKNJPQ7.js";
9
9
  import "./chunk-TNAP7EJX.js";
10
10
  import "./chunk-XTKJSVWH.js";
@@ -24,4 +24,4 @@ export {
24
24
  parseTests,
25
25
  runCreate
26
26
  };
27
- //# sourceMappingURL=create-JVXYHYH4.js.map
27
+ //# sourceMappingURL=create-VWLWS34Z.js.map
@@ -1,9 +1,9 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="339a5d11-6712-52d2-9904-0960437e7557")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="226b34e7-2b3d-52f1-8041-a515be3bbbbb")}catch(e){}}();
3
3
  import {
4
4
  renameArtifactsResultKey,
5
5
  runLinkedArtifacts
6
- } from "./chunk-PSD7F7DX.js";
6
+ } from "./chunk-KBPQHXWG.js";
7
7
  import "./chunk-J27KIHTG.js";
8
8
  import "./chunk-I7NYDZDV.js";
9
9
  import "./chunk-HI7STVF2.js";
@@ -26,6 +26,6 @@ async function runDocs(id, options, global) {
26
26
  export {
27
27
  runDocs
28
28
  };
29
- //# sourceMappingURL=docs-5WMBVQT2.js.map
29
+ //# sourceMappingURL=docs-I3BAF5WH.js.map
30
30
 
31
- //# debugId=339a5d11-6712-52d2-9904-0960437e7557
31
+ //# debugId=226b34e7-2b3d-52f1-8041-a515be3bbbbb
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../cli/commands/docs.ts"],"sourcesContent":["import type { GlobalOptions } from \"../../core/shared/command-types.js\";\nimport type { LinkedDoc } from \"../../types/index.js\";\nimport {\n renameArtifactsResultKey,\n runLinkedArtifacts,\n type LinkedArtifactResult,\n type LinkedPathAuditEntry,\n type LinkedPathValidation,\n} from \"./linked-artifacts.js\";\n\nexport interface DocsCommandOptions {\n add?: string[];\n addGlob?: string[];\n remove?: string[];\n migrate?: string[];\n /** GH-170 (pm-pfnx): standalone note applied to every --add/--add-glob link in this invocation. */\n note?: string;\n list?: boolean;\n validatePaths?: boolean;\n audit?: boolean;\n author?: string;\n message?: string;\n force?: boolean;\n}\n\nexport interface DocsResult {\n id: string;\n docs: LinkedDoc[];\n changed: boolean;\n count: number;\n migrations_applied?: number;\n validation?: LinkedPathValidation;\n audit?: LinkedPathAuditEntry[];\n}\n\nexport async function runDocs(id: string, options: DocsCommandOptions, global: GlobalOptions): Promise<DocsResult> {\n const result: LinkedArtifactResult = await runLinkedArtifacts(id, options, global, {\n metadataKey: \"docs\",\n op: \"docs_add\",\n bareNoun: \"doc\",\n supportsAppendStable: false,\n });\n return renameArtifactsResultKey(result, \"docs\") as unknown as DocsResult;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAmCA,eAAsB,QAAQ,IAAY,SAA6B,QAAqB;AAC1F,QAAM,SAA+B,MAAM,mBAAmB,IAAI,SAAS,QAAQ;IACjF,aAAa;IACb,IAAI;IACJ,UAAU;IACV,sBAAsB;GACvB;AACD,SAAO,yBAAyB,QAAQ,MAAM;AAChD","debugId":"226b34e7-2b3d-52f1-8041-a515be3bbbbb"}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  renameArtifactsResultKey,
3
3
  runLinkedArtifacts
4
- } from "./chunk-E5DUIJA4.js";
4
+ } from "./chunk-WPDMBIX6.js";
5
5
  import "./chunk-O7IWB35H.js";
6
6
  import "./chunk-TNAP7EJX.js";
7
7
  import "./chunk-3KLPFWZ4.js";
@@ -15,7 +15,7 @@ import "./chunk-FY4SPXSC.js";
15
15
  !(function() {
16
16
  try {
17
17
  var e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : {}, n = new e.Error().stack;
18
- n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "c472c425-e416-5ea3-b562-6a5aa7642b1d");
18
+ n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "4a210017-20fc-5725-9b04-750255ff66ef");
19
19
  } catch (e2) {
20
20
  }
21
21
  })();
@@ -31,4 +31,4 @@ async function runDocs(id, options, global2) {
31
31
  export {
32
32
  runDocs
33
33
  };
34
- //# sourceMappingURL=docs-MB53UJAJ.js.map
34
+ //# sourceMappingURL=docs-MXLGZUIT.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../../cli/commands/docs.ts"],
4
+ "sourcesContent": ["import type { GlobalOptions } from \"../../core/shared/command-types.js\";\nimport type { LinkedDoc } from \"../../types/index.js\";\nimport {\n renameArtifactsResultKey,\n runLinkedArtifacts,\n type LinkedArtifactResult,\n type LinkedPathAuditEntry,\n type LinkedPathValidation,\n} from \"./linked-artifacts.js\";\n\nexport interface DocsCommandOptions {\n add?: string[];\n addGlob?: string[];\n remove?: string[];\n migrate?: string[];\n /** GH-170 (pm-pfnx): standalone note applied to every --add/--add-glob link in this invocation. */\n note?: string;\n list?: boolean;\n validatePaths?: boolean;\n audit?: boolean;\n author?: string;\n message?: string;\n force?: boolean;\n}\n\nexport interface DocsResult {\n id: string;\n docs: LinkedDoc[];\n changed: boolean;\n count: number;\n migrations_applied?: number;\n validation?: LinkedPathValidation;\n audit?: LinkedPathAuditEntry[];\n}\n\nexport async function runDocs(id: string, options: DocsCommandOptions, global: GlobalOptions): Promise<DocsResult> {\n const result: LinkedArtifactResult = await runLinkedArtifacts(id, options, global, {\n metadataKey: \"docs\",\n op: \"docs_add\",\n bareNoun: \"doc\",\n supportsAppendStable: false,\n });\n return renameArtifactsResultKey(result, \"docs\") as unknown as DocsResult;\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;AAmCA,eAAsB,QAAQ,IAAY,SAA6BA,SAAqB;AAC1F,QAAM,SAA+B,MAAM,mBAAmB,IAAI,SAASA,SAAQ;IACjF,aAAa;IACb,IAAI;IACJ,UAAU;IACV,sBAAsB;GACvB;AACD,SAAO,yBAAyB,QAAQ,MAAM;AAChD;",
6
+ "names": ["global"]
7
+ }
@@ -4,7 +4,7 @@ import {
4
4
  renameArtifactsResultKey,
5
5
  runLinkedArtifacts,
6
6
  sortLinkedArtifacts
7
- } from "./chunk-E5DUIJA4.js";
7
+ } from "./chunk-WPDMBIX6.js";
8
8
  import {
9
9
  resolveAuthor
10
10
  } from "./chunk-O7IWB35H.js";
@@ -37,7 +37,7 @@ import path from "node:path";
37
37
  !(function() {
38
38
  try {
39
39
  var e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : {}, n = new e.Error().stack;
40
- n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "883ae96b-499a-523b-8bd9-33d06f168517");
40
+ n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "b10d1d4c-80ae-5c19-b212-1f7203d3c0f4");
41
41
  } catch (e2) {
42
42
  }
43
43
  })();
@@ -282,4 +282,4 @@ export {
282
282
  runFiles,
283
283
  runFilesDiscover
284
284
  };
285
- //# sourceMappingURL=files-GVMNVLCB.js.map
285
+ //# sourceMappingURL=files-FYP3MDPX.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../../cli/commands/files.ts"],
4
+ "sourcesContent": ["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { pathExists } from \"../../core/fs/fs-utils.js\";\nimport { getActiveExtensionRegistrations } from \"../../core/extensions/index.js\";\nimport { resolveItemTypeRegistry } from \"../../core/item/type-registry.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 { locateItem, mutateItem, readLocatedItem } from \"../../core/store/item-store.js\";\nimport { getSettingsPath, resolvePmRoot } from \"../../core/store/paths.js\";\nimport { readSettings } from \"../../core/store/settings.js\";\nimport { resolveAuthor } from \"../../core/shared/author.js\";\nimport { isPathWithinDirectory } from \"../../core/fs/path-utils.js\";\nimport type { ItemDocument, LinkedFile, LinkScope } from \"../../types/index.js\";\nimport {\n dedupeLinkedArtifacts,\n normalizeLinkedPath,\n renameArtifactsResultKey,\n runLinkedArtifacts,\n sortLinkedArtifacts,\n type LinkedArtifactResult,\n type LinkedPathAuditEntry,\n type LinkedPathValidation,\n} from \"./linked-artifacts.js\";\n\nexport interface FilesCommandOptions {\n add?: string[];\n addGlob?: string[];\n remove?: string[];\n migrate?: string[];\n /** GH-170 (pm-pfnx): standalone note applied to every --add/--add-glob link in this invocation. */\n note?: string;\n list?: boolean;\n appendStable?: boolean;\n validatePaths?: boolean;\n audit?: boolean;\n author?: string;\n message?: string;\n force?: boolean;\n}\n\nexport interface FilesDiscoverOptions {\n apply?: boolean;\n appendStable?: boolean;\n note?: string;\n author?: string;\n message?: string;\n force?: boolean;\n}\n\nexport interface FilesDiscoveryCandidate {\n path: string;\n scope: LinkScope;\n status: \"addable\" | \"already_linked\";\n source_count: number;\n source_fields: string[];\n original_paths: string[];\n}\n\nexport interface FilesResult {\n id: string;\n files: LinkedFile[];\n changed: boolean;\n count: number;\n migrations_applied?: number;\n validation?: LinkedPathValidation;\n audit?: LinkedPathAuditEntry[];\n}\n\nexport interface FilesDiscoverResult {\n id: string;\n files: LinkedFile[];\n changed: boolean;\n apply: boolean;\n count: number;\n candidate_count: number;\n addable_count: number;\n added_count: number;\n skipped_existing_count: number;\n candidates: FilesDiscoveryCandidate[];\n added: LinkedFile[];\n skipped_existing: FilesDiscoveryCandidate[];\n}\n\ninterface TextReference {\n field: string;\n value: string;\n}\n\ninterface RawPathReference {\n field: string;\n value: string;\n}\n\nfunction normalizeCandidatePathForOutput(value: string): string {\n return normalizeLinkedPath(path.normalize(value));\n}\n\nasync function realpathForContainment(inputPath: string): Promise<string> {\n try {\n return await fs.realpath(inputPath);\n } catch {\n return path.resolve(inputPath);\n }\n}\n\nfunction linkedFileResolvedKey(linkedFile: Pick<LinkedFile, \"path\" | \"scope\">, projectRoot: string): string {\n const resolvedPath = path.isAbsolute(linkedFile.path)\n ? path.resolve(linkedFile.path)\n : path.resolve(projectRoot, linkedFile.path);\n return `${normalizeCandidatePathForOutput(resolvedPath)}::${linkedFile.scope}`;\n}\n\nfunction collectTextReferences(value: unknown, fieldPath: string, references: TextReference[]): void {\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (trimmed.length > 0) {\n references.push({ field: fieldPath, value: trimmed });\n }\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((entry, index) => collectTextReferences(entry, `${fieldPath}[${index}]`, references));\n return;\n }\n if (typeof value === \"object\" && value !== null) {\n for (const [key, nested] of Object.entries(value)) {\n collectTextReferences(nested, fieldPath ? `${fieldPath}.${key}` : key, references);\n }\n }\n}\n\nfunction collectItemTextReferences(document: ItemDocument): TextReference[] {\n const references: TextReference[] = [];\n collectTextReferences(document.metadata, \"metadata\", references);\n collectTextReferences(document.body, \"body\", references);\n return references;\n}\n\nfunction cleanupPathToken(value: string): string {\n let next = value.trim();\n next = next.replace(/^[`\"'<([{]+/u, \"\");\n next = next.replace(/[`\"'>)\\]},;!?]+$/u, \"\");\n next = next.replace(/[.]+$/u, \"\");\n next = next.replace(/:(?:\\d+)(?::\\d+)?$/u, \"\");\n next = next.replace(/[.]+$/u, \"\");\n return next;\n}\n\nfunction extractRawPathReferences(references: TextReference[]): RawPathReference[] {\n const rawReferences: RawPathReference[] = [];\n const absolutePattern = /(?:[A-Za-z]:[\\\\/]|\\/)[^\\s\"'`<>()\\[\\]{},;]+/gu;\n const relativePattern =\n /(?:\\.{1,2}[\\\\/])?(?:(?:[A-Za-z0-9_.@-]+[\\\\/])+[A-Za-z0-9_.@-]+|[A-Za-z0-9_.@-]+\\.[A-Za-z0-9][A-Za-z0-9._-]*)/gu;\n for (const reference of references) {\n const seenInField = new Set<string>();\n for (const pattern of [absolutePattern, relativePattern]) {\n pattern.lastIndex = 0;\n for (const match of reference.value.matchAll(pattern)) {\n const token = cleanupPathToken(match[0] ?? \"\");\n if (!token || seenInField.has(token)) {\n continue;\n }\n seenInField.add(token);\n rawReferences.push({ field: reference.field, value: token });\n }\n }\n }\n return rawReferences;\n}\n\nasync function resolveDiscoveredFile(\n rawPath: string,\n projectRoot: string,\n): Promise<Pick<LinkedFile, \"path\" | \"scope\"> | undefined> {\n const absolutePath = path.isAbsolute(rawPath) ? path.resolve(rawPath) : path.resolve(projectRoot, rawPath);\n let stats;\n try {\n stats = await fs.stat(absolutePath);\n } catch {\n return undefined;\n }\n if (!stats.isFile()) {\n return undefined;\n }\n const [canonicalProjectRoot, canonicalAbsolutePath] = await Promise.all([\n realpathForContainment(projectRoot),\n realpathForContainment(absolutePath),\n ]);\n if (isPathWithinDirectory(canonicalProjectRoot, canonicalAbsolutePath)) {\n const relativePath = path.relative(canonicalProjectRoot, canonicalAbsolutePath);\n if (!relativePath || relativePath.startsWith(\"..\") || path.isAbsolute(relativePath)) {\n return undefined;\n }\n return {\n path: normalizeCandidatePathForOutput(relativePath),\n scope: \"project\",\n };\n }\n return {\n path: normalizeCandidatePathForOutput(absolutePath),\n scope: \"global\",\n };\n}\n\nasync function discoverReferencedFiles(document: ItemDocument, projectRoot: string): Promise<FilesDiscoveryCandidate[]> {\n const existingResolvedKeys = new Set((document.metadata.files ?? []).map((entry) => linkedFileResolvedKey(entry, projectRoot)));\n const grouped = new Map<\n string,\n {\n path: string;\n scope: LinkScope;\n sourceFields: Set<string>;\n originalPaths: Set<string>;\n sourceCount: number;\n }\n >();\n const rawReferences = extractRawPathReferences(collectItemTextReferences(document));\n for (const reference of rawReferences) {\n const resolved = await resolveDiscoveredFile(reference.value, projectRoot);\n if (!resolved) {\n continue;\n }\n const key = linkedFileResolvedKey(resolved, projectRoot);\n const existing = grouped.get(key) ?? {\n path: resolved.path,\n scope: resolved.scope,\n sourceFields: new Set<string>(),\n originalPaths: new Set<string>(),\n sourceCount: 0,\n };\n existing.sourceFields.add(reference.field);\n existing.originalPaths.add(reference.value);\n existing.sourceCount += 1;\n grouped.set(key, existing);\n }\n return [...grouped.entries()]\n .map(([key, entry]) => ({\n path: entry.path,\n scope: entry.scope,\n status: existingResolvedKeys.has(key) ? (\"already_linked\" as const) : (\"addable\" as const),\n source_count: entry.sourceCount,\n source_fields: [...entry.sourceFields].sort((left, right) => left.localeCompare(right)),\n original_paths: [...entry.originalPaths].sort((left, right) => left.localeCompare(right)),\n }))\n .sort((left, right) => {\n const byStatus = left.status.localeCompare(right.status);\n if (byStatus !== 0) return byStatus;\n const byPath = left.path.localeCompare(right.path);\n if (byPath !== 0) return byPath;\n return left.scope.localeCompare(right.scope);\n });\n}\n\nexport async function runFiles(id: string, options: FilesCommandOptions, global: GlobalOptions): Promise<FilesResult> {\n const result: LinkedArtifactResult = await runLinkedArtifacts(id, options, global, {\n metadataKey: \"files\",\n op: \"files_add\",\n bareNoun: \"file\",\n supportsAppendStable: true,\n });\n return renameArtifactsResultKey(result, \"files\") as unknown as FilesResult;\n}\n\nexport async function runFilesDiscover(\n id: string,\n options: FilesDiscoverOptions,\n global: GlobalOptions,\n): Promise<FilesDiscoverResult> {\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 const settings = await readSettings(pmRoot);\n const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());\n const located = await locateItem(pmRoot, id, settings.id_prefix, settings.item_format, typeRegistry.type_to_folder);\n if (!located) {\n throw new PmCliError(`Item ${id} not found`, EXIT_CODE.NOT_FOUND);\n }\n const loaded = await readLocatedItem(located, { schema: settings.schema });\n const candidates = await discoverReferencedFiles(loaded.document, process.cwd());\n const addableCandidates = candidates.filter((candidate) => candidate.status === \"addable\");\n const skippedExisting = candidates.filter((candidate) => candidate.status === \"already_linked\");\n const requestedApply = options.apply === true;\n const note = options.note?.trim() || \"discovered from item text\";\n\n if (!requestedApply || addableCandidates.length === 0) {\n const files = loaded.document.metadata.files ?? [];\n return {\n id: located.id,\n files,\n changed: false,\n apply: requestedApply,\n count: files.length,\n candidate_count: candidates.length,\n addable_count: addableCandidates.length,\n added_count: 0,\n skipped_existing_count: skippedExisting.length,\n candidates,\n added: [],\n skipped_existing: skippedExisting,\n };\n }\n\n const author = resolveAuthor(options.author, settings.author_default);\n const discoveredAdds: LinkedFile[] = addableCandidates.map((candidate) => ({\n path: candidate.path,\n scope: candidate.scope,\n note,\n }));\n const result = await mutateItem({\n pmRoot,\n settings,\n id,\n op: \"files_discover\",\n author,\n message: options.message ?? \"Discover referenced file links\",\n force: options.force,\n mutate(document) {\n const next = [...(document.metadata.files ?? [])];\n const existingResolvedKeys = new Set(next.map((entry) => linkedFileResolvedKey(entry, process.cwd())));\n const appliedAdds: LinkedFile[] = [];\n for (const add of discoveredAdds) {\n const resolvedKey = linkedFileResolvedKey(add, process.cwd());\n if (existingResolvedKeys.has(resolvedKey)) {\n continue;\n }\n next.push(add);\n existingResolvedKeys.add(resolvedKey);\n appliedAdds.push(add);\n }\n const deduped = dedupeLinkedArtifacts(next);\n const normalized = options.appendStable ? deduped : sortLinkedArtifacts(deduped);\n if (normalized.length > 0) {\n document.metadata.files = normalized;\n } else {\n delete document.metadata.files;\n }\n return {\n changedFields: appliedAdds.length > 0 ? [\"files\"] : [],\n warnings: appliedAdds.length !== discoveredAdds.length ? [`files_discover_skipped_existing:${discoveredAdds.length - appliedAdds.length}`] : [],\n };\n },\n });\n\n const files = result.item.files ?? [];\n const addedResolvedKeys = new Set(discoveredAdds.map((entry) => linkedFileResolvedKey(entry, process.cwd())));\n const added = files.filter((entry) => addedResolvedKeys.has(linkedFileResolvedKey(entry, process.cwd())));\n return {\n id: result.item.id,\n files,\n changed: added.length > 0,\n apply: true,\n count: files.length,\n candidate_count: candidates.length,\n addable_count: addableCandidates.length,\n added_count: added.length,\n skipped_existing_count: skippedExisting.length,\n candidates,\n added,\n skipped_existing: skippedExisting,\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["global", "files"]
7
+ }
@@ -1,12 +1,12 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="2fdc8a3e-c4aa-531a-bd76-1570005b876f")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="79b8aa64-64f8-5ac6-9af9-cb7ae576f4dd")}catch(e){}}();
3
3
  import {
4
4
  dedupeLinkedArtifacts,
5
5
  normalizeLinkedPath,
6
6
  renameArtifactsResultKey,
7
7
  runLinkedArtifacts,
8
8
  sortLinkedArtifacts
9
- } from "./chunk-PSD7F7DX.js";
9
+ } from "./chunk-KBPQHXWG.js";
10
10
  import {
11
11
  resolveAuthor
12
12
  } from "./chunk-J27KIHTG.js";
@@ -277,6 +277,6 @@ export {
277
277
  runFiles,
278
278
  runFilesDiscover
279
279
  };
280
- //# sourceMappingURL=files-DLB5LJEP.js.map
280
+ //# sourceMappingURL=files-GUXUM2MB.js.map
281
281
 
282
- //# debugId=2fdc8a3e-c4aa-531a-bd76-1570005b876f
282
+ //# debugId=79b8aa64-64f8-5ac6-9af9-cb7ae576f4dd
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../cli/commands/files.ts"],"sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { pathExists } from \"../../core/fs/fs-utils.js\";\nimport { getActiveExtensionRegistrations } from \"../../core/extensions/index.js\";\nimport { resolveItemTypeRegistry } from \"../../core/item/type-registry.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 { locateItem, mutateItem, readLocatedItem } from \"../../core/store/item-store.js\";\nimport { getSettingsPath, resolvePmRoot } from \"../../core/store/paths.js\";\nimport { readSettings } from \"../../core/store/settings.js\";\nimport { resolveAuthor } from \"../../core/shared/author.js\";\nimport { isPathWithinDirectory } from \"../../core/fs/path-utils.js\";\nimport type { ItemDocument, LinkedFile, LinkScope } from \"../../types/index.js\";\nimport {\n dedupeLinkedArtifacts,\n normalizeLinkedPath,\n renameArtifactsResultKey,\n runLinkedArtifacts,\n sortLinkedArtifacts,\n type LinkedArtifactResult,\n type LinkedPathAuditEntry,\n type LinkedPathValidation,\n} from \"./linked-artifacts.js\";\n\nexport interface FilesCommandOptions {\n add?: string[];\n addGlob?: string[];\n remove?: string[];\n migrate?: string[];\n /** GH-170 (pm-pfnx): standalone note applied to every --add/--add-glob link in this invocation. */\n note?: string;\n list?: boolean;\n appendStable?: boolean;\n validatePaths?: boolean;\n audit?: boolean;\n author?: string;\n message?: string;\n force?: boolean;\n}\n\nexport interface FilesDiscoverOptions {\n apply?: boolean;\n appendStable?: boolean;\n note?: string;\n author?: string;\n message?: string;\n force?: boolean;\n}\n\nexport interface FilesDiscoveryCandidate {\n path: string;\n scope: LinkScope;\n status: \"addable\" | \"already_linked\";\n source_count: number;\n source_fields: string[];\n original_paths: string[];\n}\n\nexport interface FilesResult {\n id: string;\n files: LinkedFile[];\n changed: boolean;\n count: number;\n migrations_applied?: number;\n validation?: LinkedPathValidation;\n audit?: LinkedPathAuditEntry[];\n}\n\nexport interface FilesDiscoverResult {\n id: string;\n files: LinkedFile[];\n changed: boolean;\n apply: boolean;\n count: number;\n candidate_count: number;\n addable_count: number;\n added_count: number;\n skipped_existing_count: number;\n candidates: FilesDiscoveryCandidate[];\n added: LinkedFile[];\n skipped_existing: FilesDiscoveryCandidate[];\n}\n\ninterface TextReference {\n field: string;\n value: string;\n}\n\ninterface RawPathReference {\n field: string;\n value: string;\n}\n\nfunction normalizeCandidatePathForOutput(value: string): string {\n return normalizeLinkedPath(path.normalize(value));\n}\n\nasync function realpathForContainment(inputPath: string): Promise<string> {\n try {\n return await fs.realpath(inputPath);\n } catch {\n return path.resolve(inputPath);\n }\n}\n\nfunction linkedFileResolvedKey(linkedFile: Pick<LinkedFile, \"path\" | \"scope\">, projectRoot: string): string {\n const resolvedPath = path.isAbsolute(linkedFile.path)\n ? path.resolve(linkedFile.path)\n : path.resolve(projectRoot, linkedFile.path);\n return `${normalizeCandidatePathForOutput(resolvedPath)}::${linkedFile.scope}`;\n}\n\nfunction collectTextReferences(value: unknown, fieldPath: string, references: TextReference[]): void {\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (trimmed.length > 0) {\n references.push({ field: fieldPath, value: trimmed });\n }\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((entry, index) => collectTextReferences(entry, `${fieldPath}[${index}]`, references));\n return;\n }\n if (typeof value === \"object\" && value !== null) {\n for (const [key, nested] of Object.entries(value)) {\n collectTextReferences(nested, fieldPath ? `${fieldPath}.${key}` : key, references);\n }\n }\n}\n\nfunction collectItemTextReferences(document: ItemDocument): TextReference[] {\n const references: TextReference[] = [];\n collectTextReferences(document.metadata, \"metadata\", references);\n collectTextReferences(document.body, \"body\", references);\n return references;\n}\n\nfunction cleanupPathToken(value: string): string {\n let next = value.trim();\n next = next.replace(/^[`\"'<([{]+/u, \"\");\n next = next.replace(/[`\"'>)\\]},;!?]+$/u, \"\");\n next = next.replace(/[.]+$/u, \"\");\n next = next.replace(/:(?:\\d+)(?::\\d+)?$/u, \"\");\n next = next.replace(/[.]+$/u, \"\");\n return next;\n}\n\nfunction extractRawPathReferences(references: TextReference[]): RawPathReference[] {\n const rawReferences: RawPathReference[] = [];\n const absolutePattern = /(?:[A-Za-z]:[\\\\/]|\\/)[^\\s\"'`<>()\\[\\]{},;]+/gu;\n const relativePattern =\n /(?:\\.{1,2}[\\\\/])?(?:(?:[A-Za-z0-9_.@-]+[\\\\/])+[A-Za-z0-9_.@-]+|[A-Za-z0-9_.@-]+\\.[A-Za-z0-9][A-Za-z0-9._-]*)/gu;\n for (const reference of references) {\n const seenInField = new Set<string>();\n for (const pattern of [absolutePattern, relativePattern]) {\n pattern.lastIndex = 0;\n for (const match of reference.value.matchAll(pattern)) {\n const token = cleanupPathToken(match[0] ?? \"\");\n if (!token || seenInField.has(token)) {\n continue;\n }\n seenInField.add(token);\n rawReferences.push({ field: reference.field, value: token });\n }\n }\n }\n return rawReferences;\n}\n\nasync function resolveDiscoveredFile(\n rawPath: string,\n projectRoot: string,\n): Promise<Pick<LinkedFile, \"path\" | \"scope\"> | undefined> {\n const absolutePath = path.isAbsolute(rawPath) ? path.resolve(rawPath) : path.resolve(projectRoot, rawPath);\n let stats;\n try {\n stats = await fs.stat(absolutePath);\n } catch {\n return undefined;\n }\n if (!stats.isFile()) {\n return undefined;\n }\n const [canonicalProjectRoot, canonicalAbsolutePath] = await Promise.all([\n realpathForContainment(projectRoot),\n realpathForContainment(absolutePath),\n ]);\n if (isPathWithinDirectory(canonicalProjectRoot, canonicalAbsolutePath)) {\n const relativePath = path.relative(canonicalProjectRoot, canonicalAbsolutePath);\n if (!relativePath || relativePath.startsWith(\"..\") || path.isAbsolute(relativePath)) {\n return undefined;\n }\n return {\n path: normalizeCandidatePathForOutput(relativePath),\n scope: \"project\",\n };\n }\n return {\n path: normalizeCandidatePathForOutput(absolutePath),\n scope: \"global\",\n };\n}\n\nasync function discoverReferencedFiles(document: ItemDocument, projectRoot: string): Promise<FilesDiscoveryCandidate[]> {\n const existingResolvedKeys = new Set((document.metadata.files ?? []).map((entry) => linkedFileResolvedKey(entry, projectRoot)));\n const grouped = new Map<\n string,\n {\n path: string;\n scope: LinkScope;\n sourceFields: Set<string>;\n originalPaths: Set<string>;\n sourceCount: number;\n }\n >();\n const rawReferences = extractRawPathReferences(collectItemTextReferences(document));\n for (const reference of rawReferences) {\n const resolved = await resolveDiscoveredFile(reference.value, projectRoot);\n if (!resolved) {\n continue;\n }\n const key = linkedFileResolvedKey(resolved, projectRoot);\n const existing = grouped.get(key) ?? {\n path: resolved.path,\n scope: resolved.scope,\n sourceFields: new Set<string>(),\n originalPaths: new Set<string>(),\n sourceCount: 0,\n };\n existing.sourceFields.add(reference.field);\n existing.originalPaths.add(reference.value);\n existing.sourceCount += 1;\n grouped.set(key, existing);\n }\n return [...grouped.entries()]\n .map(([key, entry]) => ({\n path: entry.path,\n scope: entry.scope,\n status: existingResolvedKeys.has(key) ? (\"already_linked\" as const) : (\"addable\" as const),\n source_count: entry.sourceCount,\n source_fields: [...entry.sourceFields].sort((left, right) => left.localeCompare(right)),\n original_paths: [...entry.originalPaths].sort((left, right) => left.localeCompare(right)),\n }))\n .sort((left, right) => {\n const byStatus = left.status.localeCompare(right.status);\n if (byStatus !== 0) return byStatus;\n const byPath = left.path.localeCompare(right.path);\n if (byPath !== 0) return byPath;\n return left.scope.localeCompare(right.scope);\n });\n}\n\nexport async function runFiles(id: string, options: FilesCommandOptions, global: GlobalOptions): Promise<FilesResult> {\n const result: LinkedArtifactResult = await runLinkedArtifacts(id, options, global, {\n metadataKey: \"files\",\n op: \"files_add\",\n bareNoun: \"file\",\n supportsAppendStable: true,\n });\n return renameArtifactsResultKey(result, \"files\") as unknown as FilesResult;\n}\n\nexport async function runFilesDiscover(\n id: string,\n options: FilesDiscoverOptions,\n global: GlobalOptions,\n): Promise<FilesDiscoverResult> {\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 const settings = await readSettings(pmRoot);\n const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());\n const located = await locateItem(pmRoot, id, settings.id_prefix, settings.item_format, typeRegistry.type_to_folder);\n if (!located) {\n throw new PmCliError(`Item ${id} not found`, EXIT_CODE.NOT_FOUND);\n }\n const loaded = await readLocatedItem(located, { schema: settings.schema });\n const candidates = await discoverReferencedFiles(loaded.document, process.cwd());\n const addableCandidates = candidates.filter((candidate) => candidate.status === \"addable\");\n const skippedExisting = candidates.filter((candidate) => candidate.status === \"already_linked\");\n const requestedApply = options.apply === true;\n const note = options.note?.trim() || \"discovered from item text\";\n\n if (!requestedApply || addableCandidates.length === 0) {\n const files = loaded.document.metadata.files ?? [];\n return {\n id: located.id,\n files,\n changed: false,\n apply: requestedApply,\n count: files.length,\n candidate_count: candidates.length,\n addable_count: addableCandidates.length,\n added_count: 0,\n skipped_existing_count: skippedExisting.length,\n candidates,\n added: [],\n skipped_existing: skippedExisting,\n };\n }\n\n const author = resolveAuthor(options.author, settings.author_default);\n const discoveredAdds: LinkedFile[] = addableCandidates.map((candidate) => ({\n path: candidate.path,\n scope: candidate.scope,\n note,\n }));\n const result = await mutateItem({\n pmRoot,\n settings,\n id,\n op: \"files_discover\",\n author,\n message: options.message ?? \"Discover referenced file links\",\n force: options.force,\n mutate(document) {\n const next = [...(document.metadata.files ?? [])];\n const existingResolvedKeys = new Set(next.map((entry) => linkedFileResolvedKey(entry, process.cwd())));\n const appliedAdds: LinkedFile[] = [];\n for (const add of discoveredAdds) {\n const resolvedKey = linkedFileResolvedKey(add, process.cwd());\n if (existingResolvedKeys.has(resolvedKey)) {\n continue;\n }\n next.push(add);\n existingResolvedKeys.add(resolvedKey);\n appliedAdds.push(add);\n }\n const deduped = dedupeLinkedArtifacts(next);\n const normalized = options.appendStable ? deduped : sortLinkedArtifacts(deduped);\n if (normalized.length > 0) {\n document.metadata.files = normalized;\n } else {\n delete document.metadata.files;\n }\n return {\n changedFields: appliedAdds.length > 0 ? [\"files\"] : [],\n warnings: appliedAdds.length !== discoveredAdds.length ? [`files_discover_skipped_existing:${discoveredAdds.length - appliedAdds.length}`] : [],\n };\n },\n });\n\n const files = result.item.files ?? [];\n const addedResolvedKeys = new Set(discoveredAdds.map((entry) => linkedFileResolvedKey(entry, process.cwd())));\n const added = files.filter((entry) => addedResolvedKeys.has(linkedFileResolvedKey(entry, process.cwd())));\n return {\n id: result.item.id,\n files,\n changed: added.length > 0,\n apply: true,\n count: files.length,\n candidate_count: candidates.length,\n addable_count: addableCandidates.length,\n added_count: added.length,\n skipped_existing_count: skippedExisting.length,\n candidates,\n added,\n skipped_existing: skippedExisting,\n };\n}\n"],"names":["files"],"mappings":"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","debugId":"79b8aa64-64f8-5ac6-9af9-cb7ae576f4dd"}
@@ -1,5 +1,8 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="ad200c72-c878-50dd-8e2f-6dd46e979296")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="53de24e8-b5be-5de6-93ad-bdaa9f3015b0")}catch(e){}}();
3
+ import {
4
+ runLockGc
5
+ } from "./chunk-EKS6O2IR.js";
3
6
  import {
4
7
  nowIso
5
8
  } from "./chunk-WUNFKP7M.js";
@@ -16,173 +19,8 @@ import {
16
19
  } from "./chunk-A6LXQFO7.js";
17
20
 
18
21
  // dist/cli/commands/gc.js
19
- import fs2 from "node:fs/promises";
20
- import path2 from "node:path";
21
-
22
- // dist/core/lock/lock-gc.js
23
22
  import fs from "node:fs/promises";
24
23
  import path from "node:path";
25
- function parseLock(raw) {
26
- let parsed;
27
- try {
28
- parsed = JSON.parse(raw);
29
- } catch {
30
- return null;
31
- }
32
- if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
33
- return null;
34
- }
35
- const candidate = parsed;
36
- const { id, owner, created_at, ttl_seconds } = candidate;
37
- if (typeof id !== "string" || typeof owner !== "string" || typeof created_at !== "string" || typeof ttl_seconds !== "number" || !Number.isFinite(ttl_seconds)) {
38
- return null;
39
- }
40
- return { id, owner, created_at, ttl_seconds };
41
- }
42
- function isErrno(error, code) {
43
- return typeof error === "object" && error !== null && "code" in error && error.code === code;
44
- }
45
- async function runLockGc(pmRoot, options) {
46
- const { dryRun, hooks } = options;
47
- const nowMs = options.now ?? Date.now();
48
- const locksDir = path.join(pmRoot, "locks");
49
- const result = {
50
- scanned: 0,
51
- removed: [],
52
- retained: [],
53
- warnings: [],
54
- entries: []
55
- };
56
- let dirEntries;
57
- try {
58
- const raw = await fs.readdir(locksDir);
59
- dirEntries = raw.filter((f) => f.endsWith(".lock")).sort();
60
- } catch (error) {
61
- if (isErrno(error, "ENOENT")) {
62
- return result;
63
- }
64
- throw error;
65
- }
66
- for (const file of dirEntries) {
67
- result.scanned += 1;
68
- const absPath = path.join(locksDir, file);
69
- const relPath = `locks/${file}`;
70
- if (hooks?.onRead) {
71
- const hookWarnings = await hooks.onRead(absPath);
72
- result.warnings.push(...hookWarnings);
73
- }
74
- let raw;
75
- try {
76
- raw = await fs.readFile(absPath, "utf8");
77
- } catch (readError) {
78
- if (isErrno(readError, "ENOENT")) {
79
- result.scanned -= 1;
80
- continue;
81
- }
82
- result.warnings.push(`lock_unreadable:${file}`);
83
- result.retained.push(relPath);
84
- result.entries.push({
85
- file,
86
- id: null,
87
- owner: null,
88
- created_at: null,
89
- ttl_seconds: null,
90
- age_seconds: null,
91
- stale: false,
92
- reason: "unparseable"
93
- });
94
- continue;
95
- }
96
- const lock = parseLock(raw);
97
- if (lock === null) {
98
- result.warnings.push(`lock_unparseable:${file}`);
99
- result.retained.push(relPath);
100
- result.entries.push({
101
- file,
102
- id: null,
103
- owner: null,
104
- created_at: null,
105
- ttl_seconds: null,
106
- age_seconds: null,
107
- stale: false,
108
- reason: "unparseable"
109
- });
110
- continue;
111
- }
112
- const createdAtMs = Date.parse(lock.created_at);
113
- if (!Number.isFinite(createdAtMs)) {
114
- result.warnings.push(`lock_invalid_timestamp:${file}`);
115
- result.retained.push(relPath);
116
- result.entries.push({
117
- file,
118
- id: lock.id,
119
- owner: lock.owner,
120
- created_at: lock.created_at,
121
- ttl_seconds: lock.ttl_seconds,
122
- age_seconds: null,
123
- stale: false,
124
- reason: "unparseable"
125
- });
126
- continue;
127
- }
128
- const ageMs = nowMs - createdAtMs;
129
- const age_seconds = Math.floor(ageMs / 1e3);
130
- const stale = ageMs > lock.ttl_seconds * 1e3;
131
- if (!stale) {
132
- result.retained.push(relPath);
133
- result.entries.push({
134
- file,
135
- id: lock.id,
136
- owner: lock.owner,
137
- created_at: lock.created_at,
138
- ttl_seconds: lock.ttl_seconds,
139
- age_seconds,
140
- stale: false,
141
- reason: "active"
142
- });
143
- continue;
144
- }
145
- if (!dryRun) {
146
- try {
147
- await fs.unlink(absPath);
148
- } catch (unlinkError) {
149
- if (!isErrno(unlinkError, "ENOENT")) {
150
- result.warnings.push(`lock_remove_failed:${file}`);
151
- result.retained.push(relPath);
152
- result.entries.push({
153
- file,
154
- id: lock.id,
155
- owner: lock.owner,
156
- created_at: lock.created_at,
157
- ttl_seconds: lock.ttl_seconds,
158
- age_seconds,
159
- stale: true,
160
- reason: "expired"
161
- });
162
- continue;
163
- }
164
- }
165
- if (hooks?.onWrite) {
166
- const hookWarnings = await hooks.onWrite(absPath);
167
- result.warnings.push(...hookWarnings);
168
- }
169
- }
170
- result.removed.push(relPath);
171
- result.entries.push({
172
- file,
173
- id: lock.id,
174
- owner: lock.owner,
175
- created_at: lock.created_at,
176
- ttl_seconds: lock.ttl_seconds,
177
- age_seconds,
178
- stale: true,
179
- reason: "expired"
180
- });
181
- }
182
- return result;
183
- }
184
-
185
- // dist/cli/commands/gc.js
186
24
  var GC_SCOPE_VALUES = ["index", "embeddings", "runtime", "locks"];
187
25
  var GC_TARGETS = [
188
26
  {
@@ -216,18 +54,18 @@ var GC_TARGETS = [
216
54
  kind: "file"
217
55
  }
218
56
  ];
219
- function isErrno2(error, code) {
57
+ function isErrno(error, code) {
220
58
  return typeof error === "object" && error !== null && "code" in error && error.code === code;
221
59
  }
222
60
  async function removeCacheFile(pmRoot, target, dryRun) {
223
61
  const relativePath = target.relativePath;
224
- const absolutePath = path2.join(pmRoot, relativePath);
62
+ const absolutePath = path.join(pmRoot, relativePath);
225
63
  const warnings = await runActiveOnReadHooks({
226
64
  path: absolutePath,
227
65
  scope: "project"
228
66
  });
229
67
  try {
230
- const stats = await fs2.stat(absolutePath);
68
+ const stats = await fs.stat(absolutePath);
231
69
  if (target.kind === "file" && !stats.isFile()) {
232
70
  return {
233
71
  removed: false,
@@ -247,9 +85,9 @@ async function removeCacheFile(pmRoot, target, dryRun) {
247
85
  };
248
86
  }
249
87
  if (target.kind === "file") {
250
- await fs2.unlink(absolutePath);
88
+ await fs.unlink(absolutePath);
251
89
  } else {
252
- await fs2.rm(absolutePath, { recursive: true, force: true });
90
+ await fs.rm(absolutePath, { recursive: true, force: true });
253
91
  }
254
92
  const writeWarnings = await runActiveOnWriteHooks({
255
93
  path: absolutePath,
@@ -261,7 +99,7 @@ async function removeCacheFile(pmRoot, target, dryRun) {
261
99
  warnings: [...warnings, ...writeWarnings]
262
100
  };
263
101
  } catch (error) {
264
- if (isErrno2(error, "ENOENT")) {
102
+ if (isErrno(error, "ENOENT")) {
265
103
  return {
266
104
  removed: false,
267
105
  warnings
@@ -365,6 +203,6 @@ async function runGc(global, options = {}) {
365
203
  export {
366
204
  runGc
367
205
  };
368
- //# sourceMappingURL=gc-2WEPW6D6.js.map
206
+ //# sourceMappingURL=gc-FENB2ESG.js.map
369
207
 
370
- //# debugId=ad200c72-c878-50dd-8e2f-6dd46e979296
208
+ //# debugId=53de24e8-b5be-5de6-93ad-bdaa9f3015b0