@unbrained/pm-cli 2026.10.3 → 2026.10.5

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 (742) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/CHANGELOG.md +28 -2
  3. package/dist/cli/after-command-context-usage.js +1 -1
  4. package/dist/cli/argv-utils.js +1 -1
  5. package/dist/cli/bootstrap-args.js +1 -1
  6. package/dist/cli/bundle-integrity.js +2 -2
  7. package/dist/cli/command-namespaces.js +1 -1
  8. package/dist/cli/commander-usage.d.ts +1 -1
  9. package/dist/cli/commander-usage.js +7 -4
  10. package/dist/cli/commands/annotations/comments.js +1 -1
  11. package/dist/cli/commands/annotations/docs.js +1 -1
  12. package/dist/cli/commands/annotations/files.js +1 -1
  13. package/dist/cli/commands/annotations/learnings.js +1 -1
  14. package/dist/cli/commands/annotations/notes.js +1 -1
  15. package/dist/cli/commands/extension/describe.js +1 -1
  16. package/dist/cli/commands/extension/extension.js +1 -1
  17. package/dist/cli/commands/extension/scaffold.js +1 -1
  18. package/dist/cli/commands/extension/shared.js +1 -1
  19. package/dist/cli/commands/governance/gc.js +1 -1
  20. package/dist/cli/commands/governance/health.js +1 -1
  21. package/dist/cli/commands/governance/telemetry.js +1 -1
  22. package/dist/cli/commands/governance/validate.js +1 -1
  23. package/dist/cli/commands/history/activity.js +1 -1
  24. package/dist/cli/commands/history/history-compact.js +1 -1
  25. package/dist/cli/commands/history/history-redact.js +1 -1
  26. package/dist/cli/commands/history/history-repair.js +1 -1
  27. package/dist/cli/commands/history/history.js +1 -1
  28. package/dist/cli/commands/history/restore.js +1 -1
  29. package/dist/cli/commands/lifecycle/append.js +1 -1
  30. package/dist/cli/commands/lifecycle/claim.js +1 -1
  31. package/dist/cli/commands/lifecycle/close-many.js +1 -1
  32. package/dist/cli/commands/lifecycle/close.js +1 -1
  33. package/dist/cli/commands/lifecycle/copy.js +1 -1
  34. package/dist/cli/commands/lifecycle/create.js +1 -1
  35. package/dist/cli/commands/lifecycle/delete.js +1 -1
  36. package/dist/cli/commands/lifecycle/focus.js +1 -1
  37. package/dist/cli/commands/lifecycle/plan.js +1 -1
  38. package/dist/cli/commands/lifecycle/update-many.js +1 -1
  39. package/dist/cli/commands/lifecycle/update.js +1 -1
  40. package/dist/cli/commands/query/aggregate.js +1 -1
  41. package/dist/cli/commands/query/context.js +1 -1
  42. package/dist/cli/commands/query/deps.js +1 -1
  43. package/dist/cli/commands/query/duplicates.js +1 -1
  44. package/dist/cli/commands/query/eval.js +1 -1
  45. package/dist/cli/commands/query/get.js +1 -1
  46. package/dist/cli/commands/query/graph.js +1 -1
  47. package/dist/cli/commands/query/list.js +1 -1
  48. package/dist/cli/commands/query/next.js +1 -1
  49. package/dist/cli/commands/query/search.js +1 -1
  50. package/dist/cli/commands/query/stats.js +1 -1
  51. package/dist/cli/commands/test/test-all.js +1 -1
  52. package/dist/cli/commands/test/test-runs.js +1 -1
  53. package/dist/cli/commands/test/test.js +1 -1
  54. package/dist/cli/commands/workspace/config.js +1 -1
  55. package/dist/cli/commands/workspace/contracts.js +1 -1
  56. package/dist/cli/commands/workspace/init.js +1 -1
  57. package/dist/cli/commands/workspace/merge.js +1 -1
  58. package/dist/cli/commands/workspace/profile.js +1 -1
  59. package/dist/cli/commands/workspace/schema.js +1 -1
  60. package/dist/cli/commands/workspace/upgrade.js +1 -1
  61. package/dist/cli/context-intent-invocation.js +1 -1
  62. package/dist/cli/description-stdin.js +1 -1
  63. package/dist/cli/error-guidance.js +3 -1
  64. package/dist/cli/extension-command-help.js +5 -3
  65. package/dist/cli/extension-command-options.js +1 -1
  66. package/dist/cli/extension-recovery.js +1 -1
  67. package/dist/cli/help-content.js +5 -2
  68. package/dist/cli/help-json-payload.js +6 -3
  69. package/dist/cli/invocation-profile.js +2 -2
  70. package/dist/cli/main.js +5 -5
  71. package/dist/cli/migration-gates.js +1 -1
  72. package/dist/cli/option-values.js +1 -1
  73. package/dist/cli/public.js +1 -1
  74. package/dist/cli/register-annotations.js +1 -1
  75. package/dist/cli/register-assurance.js +1 -1
  76. package/dist/cli/register-files-lookup.js +1 -1
  77. package/dist/cli/register-history-activity.js +1 -1
  78. package/dist/cli/register-history-author.js +1 -1
  79. package/dist/cli/register-history-maintenance.js +2 -2
  80. package/dist/cli/register-list-query.js +10 -10
  81. package/dist/cli/register-mutation-options.js +1 -1
  82. package/dist/cli/register-mutation.js +2 -2
  83. package/dist/cli/register-operations.js +1 -1
  84. package/dist/cli/register-setup.js +1 -1
  85. package/dist/cli/register-structured-mutation.js +1 -1
  86. package/dist/cli/registration-helpers.js +1 -1
  87. package/dist/cli/runtime/activation.js +1 -1
  88. package/dist/cli/runtime/invocation-options.js +1 -1
  89. package/dist/cli/runtime/projection-retry.js +1 -1
  90. package/dist/cli/runtime/selection.js +1 -1
  91. package/dist/cli/runtime/telemetry-outcome.js +1 -1
  92. package/dist/cli/runtime-compatibility-boundary.d.ts +1 -1
  93. package/dist/cli/runtime-compatibility-boundary.js +4 -4
  94. package/dist/cli/schema/registration.js +2 -2
  95. package/dist/cli/schema-registration-helpers.js +1 -1
  96. package/dist/cli/search-refresh.js +1 -1
  97. package/dist/cli/stats-analytics-json.js +1 -1
  98. package/dist/cli/telemetry-flush.js +1 -1
  99. package/dist/cli-bundle/bundle-manifest.json +162 -162
  100. package/dist/cli-bundle/chunks/chunk-3CYOBJUK.js +3 -0
  101. package/dist/cli-bundle/chunks/chunk-5MNOWZPN.js +3 -0
  102. package/dist/cli-bundle/chunks/chunk-AJ7H6XUF.js +20 -0
  103. package/dist/cli-bundle/chunks/chunk-D332RXZ7.js +80 -0
  104. package/dist/cli-bundle/chunks/chunk-HRJ6G6ZG.js +31 -0
  105. package/dist/cli-bundle/chunks/chunk-KRVI56QE.js +6 -0
  106. package/dist/cli-bundle/chunks/chunk-N4YGSG6F.js +238 -0
  107. package/dist/cli-bundle/chunks/chunk-OOLYASYJ.js +2 -0
  108. package/dist/cli-bundle/chunks/chunk-R7CG2DB7.js +2 -0
  109. package/dist/cli-bundle/chunks/chunk-TGMONGWX.js +2 -0
  110. package/dist/cli-bundle/chunks/chunk-UZ7BIUCI.js +2 -0
  111. package/dist/cli-bundle/chunks/{chunk-44UGMMQ6.js → chunk-VZ63DEVJ.js} +3 -3
  112. package/dist/cli-bundle/chunks/chunk-WFZ4UEOB.js +2 -0
  113. package/dist/cli-bundle/chunks/chunk-YVBRASXO.js +8 -0
  114. package/dist/cli-bundle/chunks/{chunk-5XKF5SQV.js → chunk-Z66DWDAU.js} +91 -91
  115. package/dist/cli-bundle/chunks/{register-list-query-DYCGUQEW.js → register-list-query-75QXHIFH.js} +11 -11
  116. package/dist/cli-bundle/chunks/register-mutation-YS54SCHG.js +20 -0
  117. package/dist/cli-bundle/chunks/register-operations-6KHZQSYJ.js +2 -0
  118. package/dist/cli-bundle/chunks/register-setup-RTATEN2M.js +2 -0
  119. package/dist/cli-bundle/focused-chunks/{chunk-3BIYG72P.js → chunk-2CVX3KR3.js} +2 -2
  120. package/dist/cli-bundle/focused-chunks/chunk-5C3IDDW7.js +2 -0
  121. package/dist/cli-bundle/focused-chunks/{chunk-DBD4W4QP.js → chunk-ABV67XCC.js} +3 -3
  122. package/dist/cli-bundle/focused-chunks/chunk-B5RSLVE6.js +3 -0
  123. package/dist/cli-bundle/focused-chunks/chunk-C224METM.js +20 -0
  124. package/dist/cli-bundle/focused-chunks/chunk-CLDPTMQY.js +6 -0
  125. package/dist/cli-bundle/focused-chunks/chunk-DDRN42PB.js +8 -0
  126. package/dist/cli-bundle/focused-chunks/{chunk-EJN7DY3B.js → chunk-DOVTUKJQ.js} +2 -2
  127. package/dist/cli-bundle/focused-chunks/chunk-ECBOPEJE.js +75 -0
  128. package/dist/cli-bundle/focused-chunks/chunk-GITOYRUW.js +165 -0
  129. package/dist/cli-bundle/focused-chunks/chunk-GUIF3WVC.js +30 -0
  130. package/dist/cli-bundle/focused-chunks/chunk-LE4JUCRR.js +3 -0
  131. package/dist/cli-bundle/focused-chunks/{chunk-HFAW3FJQ.js → chunk-PSXFFQFT.js} +2 -2
  132. package/dist/cli-bundle/focused-chunks/chunk-RHIH6XIW.js +12 -0
  133. package/dist/cli-bundle/focused-chunks/chunk-UDYRVBOZ.js +2 -0
  134. package/dist/cli-bundle/focused-chunks/chunk-XV5RV4ZT.js +2 -0
  135. package/dist/cli-bundle/focused-chunks/{chunk-XRSCIYHR.js → chunk-YMU42COG.js} +2 -2
  136. package/dist/cli-bundle/main.js +28 -28
  137. package/dist/cli-bundle/sdk-authoring.js +1 -1
  138. package/dist/cli-bundle/sdk-contracts.js +2 -2
  139. package/dist/cli-bundle/sdk-core.js +32 -32
  140. package/dist/cli-bundle/sdk-governance.js +1 -1
  141. package/dist/cli-bundle/sdk-graph.js +1 -1
  142. package/dist/cli-bundle/sdk-merge.js +55 -55
  143. package/dist/cli-bundle/sdk-query.js +1 -1
  144. package/dist/cli-bundle/sdk-runtime.js +1 -1
  145. package/dist/cli-bundle/sdk-testing.js +1 -1
  146. package/dist/cli-bundle/sdk.js +10 -10
  147. package/dist/cli.js +1 -1
  148. package/dist/core/checkpoint/checkpoint-gc.js +1 -1
  149. package/dist/core/checkpoint/mutation-checkpoint.js +2 -2
  150. package/dist/core/config/nested-settings.js +1 -1
  151. package/dist/core/config/positional-value.js +1 -1
  152. package/dist/core/diagnostics/remediation.js +1 -1
  153. package/dist/core/extensions/activation-summary-markdown.js +2 -1
  154. package/dist/core/extensions/activation-summary.js +1 -1
  155. package/dist/core/extensions/activation-transaction.js +1 -1
  156. package/dist/core/extensions/capability-usage.js +1 -1
  157. package/dist/core/extensions/command-hook-context.js +1 -1
  158. package/dist/core/extensions/command-metadata-contract.js +1 -1
  159. package/dist/core/extensions/command-visibility-tier.js +1 -1
  160. package/dist/core/extensions/contribution-inventory.js +1 -1
  161. package/dist/core/extensions/exporter-output-contract.js +1 -1
  162. package/dist/core/extensions/extension-candidate.js +1 -1
  163. package/dist/core/extensions/extension-capability-aliases.js +1 -1
  164. package/dist/core/extensions/extension-hook-runtime.js +1 -1
  165. package/dist/core/extensions/extension-policy.js +1 -1
  166. package/dist/core/extensions/extension-registries.js +1 -1
  167. package/dist/core/extensions/extension-runtime-helpers.js +1 -1
  168. package/dist/core/extensions/extension-types.d.ts +8 -1
  169. package/dist/core/extensions/extension-types.js +1 -1
  170. package/dist/core/extensions/flag-definition-validation.js +1 -1
  171. package/dist/core/extensions/flag-value-types.js +1 -1
  172. package/dist/core/extensions/index.js +1 -1
  173. package/dist/core/extensions/item-field-types.js +1 -1
  174. package/dist/core/extensions/item-fields.js +1 -1
  175. package/dist/core/extensions/loader.js +1 -1
  176. package/dist/core/extensions/manifest-parser.js +1 -1
  177. package/dist/core/extensions/manifest-schema.js +1 -1
  178. package/dist/core/extensions/module-graph-snapshot.js +1 -1
  179. package/dist/core/extensions/preflight-ownership.js +1 -1
  180. package/dist/core/extensions/registration-contracts.js +1 -1
  181. package/dist/core/extensions/registration-validation.js +1 -1
  182. package/dist/core/extensions/registration-values.js +1 -1
  183. package/dist/core/extensions/reserved-host-flags.js +1 -1
  184. package/dist/core/extensions/runtime-registrations.js +1 -1
  185. package/dist/core/extensions/service-ownership.js +1 -1
  186. package/dist/core/extensions/version-compat.js +1 -1
  187. package/dist/core/fs/atomic-create.js +1 -1
  188. package/dist/core/fs/fs-utils.js +2 -2
  189. package/dist/core/fs/host-environment-errors.js +1 -1
  190. package/dist/core/fs/index.js +1 -1
  191. package/dist/core/fs/path-utils.js +1 -1
  192. package/dist/core/governance/content-fields.js +1 -1
  193. package/dist/core/governance/issue-codes.js +1 -1
  194. package/dist/core/governance/metadata-coverage.js +1 -1
  195. package/dist/core/history/digest.js +1 -1
  196. package/dist/core/history/drift-cache.js +3 -3
  197. package/dist/core/history/drift-scan.d.ts +4 -0
  198. package/dist/core/history/drift-scan.js +1 -1
  199. package/dist/core/history/event-classification.js +1 -1
  200. package/dist/core/history/event-index.js +8 -7
  201. package/dist/core/history/history-compact-bulk.js +1 -1
  202. package/dist/core/history/history-diff.js +1 -1
  203. package/dist/core/history/history-rewrite.js +1 -1
  204. package/dist/core/history/history-storage-stats.js +1 -1
  205. package/dist/core/history/history-stream-policy.js +1 -1
  206. package/dist/core/history/history.js +2 -2
  207. package/dist/core/history/identity.js +1 -1
  208. package/dist/core/history/index.js +1 -1
  209. package/dist/core/history/operation-contract.js +1 -1
  210. package/dist/core/history/projection.js +1 -1
  211. package/dist/core/history/read.js +1 -1
  212. package/dist/core/history/replay.js +2 -1
  213. package/dist/core/history/tombstone.js +1 -1
  214. package/dist/core/history/version-address.js +1 -1
  215. package/dist/core/history/workspace-history.js +2 -2
  216. package/dist/core/io/body-file.js +1 -1
  217. package/dist/core/io/bulk-ids-input.js +2 -1
  218. package/dist/core/item/actionability.js +1 -1
  219. package/dist/core/item/dependency-reference.js +1 -1
  220. package/dist/core/item/id.js +1 -1
  221. package/dist/core/item/index.js +1 -1
  222. package/dist/core/item/item-format-version.js +1 -1
  223. package/dist/core/item/item-format.js +6 -4
  224. package/dist/core/item/item-record.js +1 -1
  225. package/dist/core/item/item-type-definition.js +1 -1
  226. package/dist/core/item/parent-reference-policy.js +1 -1
  227. package/dist/core/item/parse.js +8 -2
  228. package/dist/core/item/plan-lifecycle.js +1 -1
  229. package/dist/core/item/priority.js +1 -1
  230. package/dist/core/item/sprint-release-format.js +1 -1
  231. package/dist/core/item/status-filter.js +1 -1
  232. package/dist/core/item/status.js +1 -1
  233. package/dist/core/item/toon-decode.js +1 -1
  234. package/dist/core/item/type-registry.js +1 -1
  235. package/dist/core/item/type-synonyms.js +1 -1
  236. package/dist/core/lock/index.js +1 -1
  237. package/dist/core/lock/lock-gc.js +1 -1
  238. package/dist/core/lock/lock.js +3 -3
  239. package/dist/core/output/mutation-projection.js +1 -1
  240. package/dist/core/output/output-control.js +1 -1
  241. package/dist/core/output/output.js +22 -10
  242. package/dist/core/output/query-summary.js +1 -1
  243. package/dist/core/output/tabular.js +3 -1
  244. package/dist/core/packages/manifest.js +1 -1
  245. package/dist/core/packages/root.js +1 -1
  246. package/dist/core/policy/workflow-policy-schema.js +1 -1
  247. package/dist/core/policy/workflow-policy-store.js +1 -1
  248. package/dist/core/policy/workflow-policy.js +1 -1
  249. package/dist/core/profile/profile-describe.js +1 -1
  250. package/dist/core/profile/profile-lint.js +1 -1
  251. package/dist/core/profile/profile-plan.js +1 -1
  252. package/dist/core/profile/profile-presets.js +25 -1
  253. package/dist/core/reproducibility/context.js +1 -1
  254. package/dist/core/schema/fields-file.js +2 -2
  255. package/dist/core/schema/item-types-file.js +2 -2
  256. package/dist/core/schema/runtime-field-filters.js +1 -1
  257. package/dist/core/schema/runtime-field-values.js +1 -1
  258. package/dist/core/schema/runtime-schema.js +2 -2
  259. package/dist/core/schema/status-defs-file.js +2 -2
  260. package/dist/core/schema/status-token.js +1 -1
  261. package/dist/core/schema/type-inference.js +1 -1
  262. package/dist/core/schema/type-presets.js +1 -1
  263. package/dist/core/schema/type-workflows.js +1 -1
  264. package/dist/core/search/background-refresh.js +2 -2
  265. package/dist/core/search/bm25.js +1 -1
  266. package/dist/core/search/cache.js +2 -2
  267. package/dist/core/search/corpus.js +1 -1
  268. package/dist/core/search/embedding-batches.js +1 -1
  269. package/dist/core/search/eval-thresholds.js +1 -1
  270. package/dist/core/search/eval.js +1 -1
  271. package/dist/core/search/http-client.js +1 -1
  272. package/dist/core/search/providers.js +1 -1
  273. package/dist/core/search/relevance.js +1 -1
  274. package/dist/core/search/semantic-defaults.js +1 -1
  275. package/dist/core/search/staleness.js +1 -1
  276. package/dist/core/search/vector-stores.js +2 -2
  277. package/dist/core/search/vectorization-metadata.js +1 -1
  278. package/dist/core/sentry/helpers.js +1 -1
  279. package/dist/core/sentry/instrument.js +1 -1
  280. package/dist/core/session/session-state.js +1 -1
  281. package/dist/core/shared/agent-session-context.js +1 -1
  282. package/dist/core/shared/author.js +5 -1
  283. package/dist/core/shared/command-line.js +1 -1
  284. package/dist/core/shared/command-types.js +1 -1
  285. package/dist/core/shared/conflict-markers.js +1 -1
  286. package/dist/core/shared/constants.js +1 -1
  287. package/dist/core/shared/errors.js +1 -1
  288. package/dist/core/shared/html-entity-decode.js +1 -1
  289. package/dist/core/shared/index.js +1 -1
  290. package/dist/core/shared/item-metadata-contract.js +1 -1
  291. package/dist/core/shared/lazy-module.js +1 -1
  292. package/dist/core/shared/levenshtein.js +1 -1
  293. package/dist/core/shared/memo.js +1 -1
  294. package/dist/core/shared/numeric-parsers.js +1 -1
  295. package/dist/core/shared/option-alias-visibility.js +1 -1
  296. package/dist/core/shared/primitives.js +1 -1
  297. package/dist/core/shared/secret-rules.js +1 -1
  298. package/dist/core/shared/serial-queue.js +1 -1
  299. package/dist/core/shared/serialization.js +1 -1
  300. package/dist/core/shared/split-comma-list.js +1 -1
  301. package/dist/core/shared/text-normalization.js +1 -1
  302. package/dist/core/shared/time.js +2 -1
  303. package/dist/core/store/index.js +1 -1
  304. package/dist/core/store/item-format-migration.js +1 -1
  305. package/dist/core/store/item-metadata-cache.js +1 -1
  306. package/dist/core/store/item-metadata-query-index.js +7 -7
  307. package/dist/core/store/item-metadata-read-work.js +1 -1
  308. package/dist/core/store/item-store.js +1 -1
  309. package/dist/core/store/paths.js +1 -1
  310. package/dist/core/store/settings-concurrency.js +1 -1
  311. package/dist/core/store/settings-read-cache.js +1 -1
  312. package/dist/core/store/settings-validator.js +1 -1
  313. package/dist/core/store/settings.d.ts +11 -2
  314. package/dist/core/store/settings.js +3 -3
  315. package/dist/core/store/tracker-preflight.js +1 -1
  316. package/dist/core/telemetry/consent.js +2 -2
  317. package/dist/core/telemetry/observability.js +1 -1
  318. package/dist/core/telemetry/policy.js +1 -1
  319. package/dist/core/telemetry/read-sampling.js +2 -2
  320. package/dist/core/telemetry/runtime.js +9 -5
  321. package/dist/core/test/background-runs.js +3 -3
  322. package/dist/core/test/item-test-run-tracking.js +1 -1
  323. package/dist/core/test/run-selectors.js +1 -1
  324. package/dist/core/validate/estimate-defaults.js +1 -1
  325. package/dist/core/validate/fix-planning.js +1 -1
  326. package/dist/core/validate/linked-artifact-reference.js +1 -1
  327. package/dist/core/validate/missing-by-type.js +1 -1
  328. package/dist/core/validate/missing-link-owners.js +1 -1
  329. package/dist/core/validate/stale-file-classification.js +1 -1
  330. package/dist/mcp/http-server.js +6 -4
  331. package/dist/mcp/legacy-adapter.js +1 -1
  332. package/dist/mcp/runtime-capabilities.js +1 -1
  333. package/dist/mcp/server.js +4 -4
  334. package/dist/mcp/tool-definitions.js +1 -1
  335. package/dist/sdk/actionability.js +1 -1
  336. package/dist/sdk/agent/closed-domain-contracts.js +1 -1
  337. package/dist/sdk/agent/command-recovery.js +1 -1
  338. package/dist/sdk/agent/command-suggestions.js +1 -1
  339. package/dist/sdk/agent/create-option-policy.js +1 -1
  340. package/dist/sdk/agent/identity-config.js +1 -1
  341. package/dist/sdk/agent/item-addressing.js +1 -1
  342. package/dist/sdk/agent/refusal-closure-census.js +2 -1
  343. package/dist/sdk/agent/refusal-closure.js +1 -1
  344. package/dist/sdk/agent/refusal-corpus-contracts.js +1 -1
  345. package/dist/sdk/agent/refusal-reachability.js +3 -1
  346. package/dist/sdk/agent/subcommand-recovery.js +1 -1
  347. package/dist/sdk/agent/task-transcript-contracts.js +1 -1
  348. package/dist/sdk/agent/tracker-preflight-contracts.js +1 -1
  349. package/dist/sdk/agent-capability-contracts.js +3 -1
  350. package/dist/sdk/agent-session-context.js +1 -1
  351. package/dist/sdk/annotations.js +1 -1
  352. package/dist/sdk/author-attribution.js +1 -1
  353. package/dist/sdk/authoring.js +1 -1
  354. package/dist/sdk/cli-bootstrap.js +1 -1
  355. package/dist/sdk/cli-contracts/agent-output-contracts.js +5 -3
  356. package/dist/sdk/cli-contracts/bootstrap-command-scanner.js +1 -1
  357. package/dist/sdk/cli-contracts/command-aliases.js +1 -1
  358. package/dist/sdk/cli-contracts/command-exit-contracts.js +1 -1
  359. package/dist/sdk/cli-contracts/commander-mutation-options.js +1 -1
  360. package/dist/sdk/cli-contracts/commander-types.js +1 -1
  361. package/dist/sdk/cli-contracts/completeness.js +1 -1
  362. package/dist/sdk/cli-contracts/enum-contracts.js +1 -1
  363. package/dist/sdk/cli-contracts/flag-contracts.js +1 -1
  364. package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +2 -1
  365. package/dist/sdk/cli-contracts/grammar-contracts.js +1 -1
  366. package/dist/sdk/cli-contracts/registration-helpers.js +7 -7
  367. package/dist/sdk/cli-contracts/runtime-contracts.js +1 -1
  368. package/dist/sdk/cli-contracts/schemas/assurance-definition.js +1 -1
  369. package/dist/sdk/cli-contracts/string-lists.js +1 -1
  370. package/dist/sdk/cli-contracts/tool-option-contracts.js +1 -1
  371. package/dist/sdk/cli-contracts/tool-parameter-tables.js +1 -1
  372. package/dist/sdk/cli-contracts/tool-schema.js +1 -1
  373. package/dist/sdk/cli-contracts/typed-action-inputs.js +1 -1
  374. package/dist/sdk/cli-contracts.js +1 -1
  375. package/dist/sdk/cli-program.js +1 -1
  376. package/dist/sdk/command-line.js +1 -1
  377. package/dist/sdk/comments.js +1 -1
  378. package/dist/sdk/compile-cache.js +1 -1
  379. package/dist/sdk/completion/bash.js +2 -1
  380. package/dist/sdk/completion/fish.js +13 -7
  381. package/dist/sdk/completion/shared.js +1 -1
  382. package/dist/sdk/completion/zsh.js +14 -8
  383. package/dist/sdk/completion.js +1 -1
  384. package/dist/sdk/compose.js +1 -1
  385. package/dist/sdk/config.js +1 -1
  386. package/dist/sdk/context/recency.js +1 -1
  387. package/dist/sdk/context/semantic-session-attribution.js +1 -1
  388. package/dist/sdk/context/usage-egress.js +1 -1
  389. package/dist/sdk/context/usage-ledger.js +6 -3
  390. package/dist/sdk/context-intent-contracts.js +1 -1
  391. package/dist/sdk/context-intent-runtime.js +1 -1
  392. package/dist/sdk/context-packing.js +1 -1
  393. package/dist/sdk/context-relevance.js +1 -1
  394. package/dist/sdk/context-signal-store.js +2 -2
  395. package/dist/sdk/context-usage.js +1 -1
  396. package/dist/sdk/contracts.js +1 -1
  397. package/dist/sdk/core-governance.js +1 -1
  398. package/dist/sdk/core.js +1 -1
  399. package/dist/sdk/corpus-shape.js +1 -1
  400. package/dist/sdk/define.js +1 -1
  401. package/dist/sdk/dependencies.js +1 -1
  402. package/dist/sdk/dependency-flag-validation.js +1 -1
  403. package/dist/sdk/dependency-provenance.js +1 -1
  404. package/dist/sdk/docs.js +1 -1
  405. package/dist/sdk/duplicates.js +1 -1
  406. package/dist/sdk/environment/agent-environment.js +1 -1
  407. package/dist/sdk/environment/host-environment-errors.js +1 -1
  408. package/dist/sdk/environment/project-runtime-compatibility.js +2 -1
  409. package/dist/sdk/environment/source-context.js +1 -1
  410. package/dist/sdk/environment/tracker-preflight.js +1 -1
  411. package/dist/sdk/error-code-catalog.js +1 -1
  412. package/dist/sdk/error-runtime.js +1 -1
  413. package/dist/sdk/errors.js +1 -1
  414. package/dist/sdk/eval.js +1 -1
  415. package/dist/sdk/extension/author-manifest.js +1 -1
  416. package/dist/sdk/extension/bundled-catalog.js +1 -1
  417. package/dist/sdk/extension/concurrency.js +1 -1
  418. package/dist/sdk/extension/copy-scope.js +1 -1
  419. package/dist/sdk/extension/custom-field-collisions.js +1 -1
  420. package/dist/sdk/extension/describe.js +4 -2
  421. package/dist/sdk/extension/doctor.js +1 -1
  422. package/dist/sdk/extension/install-plan.js +1 -1
  423. package/dist/sdk/extension/install-receipts.js +1 -1
  424. package/dist/sdk/extension/install-runtime.js +3 -3
  425. package/dist/sdk/extension/install-snapshot.js +1 -1
  426. package/dist/sdk/extension/install-sources.js +5 -5
  427. package/dist/sdk/extension/managed-state.js +2 -2
  428. package/dist/sdk/extension/migrations.js +2 -2
  429. package/dist/sdk/extension/output-ownership.js +1 -1
  430. package/dist/sdk/extension/runtime-summary.js +1 -1
  431. package/dist/sdk/extension/scaffold.js +11 -4
  432. package/dist/sdk/extension/shared.js +1 -1
  433. package/dist/sdk/extension/source-resolution.js +1 -1
  434. package/dist/sdk/extension/static-inventory.js +1 -1
  435. package/dist/sdk/extension/update-check.js +1 -1
  436. package/dist/sdk/extension-command-context.js +1 -1
  437. package/dist/sdk/extension-contracts.js +1 -1
  438. package/dist/sdk/extension.js +1 -1
  439. package/dist/sdk/files.js +1 -1
  440. package/dist/sdk/flag-invocation-contracts.js +1 -1
  441. package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -1
  442. package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -1
  443. package/dist/sdk/generated-error-code-catalog.js +1 -1
  444. package/dist/sdk/governance/assurance-action-contracts.js +1 -1
  445. package/dist/sdk/governance/assurance-action.js +1 -1
  446. package/dist/sdk/governance/assurance-limits.js +1 -1
  447. package/dist/sdk/governance/assurance-mutation-error.js +1 -1
  448. package/dist/sdk/governance/assurance-presets.js +1 -1
  449. package/dist/sdk/governance/assurance-runtime.js +1 -1
  450. package/dist/sdk/governance/assurance.js +4 -4
  451. package/dist/sdk/governance/boundary-fixtures.js +1 -1
  452. package/dist/sdk/governance/closure-timestamps.js +1 -1
  453. package/dist/sdk/governance/coverage-assurance.js +1 -1
  454. package/dist/sdk/governance/defect-recurrence-coverage.js +1 -1
  455. package/dist/sdk/governance/defect-recurrence-graph.js +1 -1
  456. package/dist/sdk/governance/defect-recurrence-signals.js +1 -1
  457. package/dist/sdk/governance/defect-recurrence.js +1 -1
  458. package/dist/sdk/governance/extension-host-version.js +1 -1
  459. package/dist/sdk/governance/gc.js +1 -1
  460. package/dist/sdk/governance/health-merge-evidence.js +1 -1
  461. package/dist/sdk/governance/health.js +2 -1
  462. package/dist/sdk/governance/hierarchy-validation.js +1 -1
  463. package/dist/sdk/governance/linked-file-report.js +1 -1
  464. package/dist/sdk/governance/merge-receipt-history.js +1 -1
  465. package/dist/sdk/governance/provenance-health.js +4 -1
  466. package/dist/sdk/governance/reindex.js +5 -4
  467. package/dist/sdk/governance/stale-work.js +1 -1
  468. package/dist/sdk/governance/status-role-diagnostics.js +1 -1
  469. package/dist/sdk/governance/storage-integrity.js +1 -1
  470. package/dist/sdk/governance/tracked-runtime-cache.js +1 -1
  471. package/dist/sdk/governance/upgrade.js +2 -2
  472. package/dist/sdk/governance/validate-history-drift.js +1 -1
  473. package/dist/sdk/governance/validate-item-reader.js +1 -1
  474. package/dist/sdk/governance/validate-normalization.js +1 -1
  475. package/dist/sdk/governance/validate.js +1 -1
  476. package/dist/sdk/governance/workflow-completeness.js +1 -1
  477. package/dist/sdk/governance/workflow-policy.js +3 -3
  478. package/dist/sdk/governance/workspace-position.js +2 -1
  479. package/dist/sdk/governance.js +1 -1
  480. package/dist/sdk/graph/adapter.js +1 -1
  481. package/dist/sdk/graph/analytics.js +1 -1
  482. package/dist/sdk/graph/assembly.js +1 -1
  483. package/dist/sdk/graph/cache.js +1 -1
  484. package/dist/sdk/graph/centrality.js +1 -1
  485. package/dist/sdk/graph/conformance.js +1 -1
  486. package/dist/sdk/graph/deadline-scheduling.js +1 -1
  487. package/dist/sdk/graph/durable-cache.js +1 -1
  488. package/dist/sdk/graph/governance-contracts.js +1 -1
  489. package/dist/sdk/graph/governance.js +1 -1
  490. package/dist/sdk/graph/hierarchy-integrity.js +1 -1
  491. package/dist/sdk/graph/index.js +1 -1
  492. package/dist/sdk/graph/lifecycle-coverage.js +1 -1
  493. package/dist/sdk/graph/mutation-advisory.js +1 -1
  494. package/dist/sdk/graph/query-contracts.js +1 -1
  495. package/dist/sdk/graph/remediation.js +1 -1
  496. package/dist/sdk/graph/run.js +1 -1
  497. package/dist/sdk/graph/scheduling.js +1 -1
  498. package/dist/sdk/graph/traversal.js +1 -1
  499. package/dist/sdk/graph/workspace-relationship-kind-registry.js +1 -1
  500. package/dist/sdk/graph.js +1 -1
  501. package/dist/sdk/guide-topics.js +1 -1
  502. package/dist/sdk/guide.js +8 -1
  503. package/dist/sdk/history/attestation-command.js +1 -1
  504. package/dist/sdk/history/attestation-contract.js +1 -1
  505. package/dist/sdk/history/attestation-scan.js +1 -1
  506. package/dist/sdk/history/attestation.js +1 -1
  507. package/dist/sdk/history/maintenance.js +1 -1
  508. package/dist/sdk/history/salvage.js +3 -2
  509. package/dist/sdk/history/subject.js +1 -1
  510. package/dist/sdk/history-analytics.js +1 -1
  511. package/dist/sdk/history-compact.js +1 -1
  512. package/dist/sdk/history-mcp.js +1 -1
  513. package/dist/sdk/history-provenance.js +1 -1
  514. package/dist/sdk/history-read.js +1 -1
  515. package/dist/sdk/history-redact.js +1 -1
  516. package/dist/sdk/history-repair.js +1 -1
  517. package/dist/sdk/improvement-ledger-validation.js +1 -1
  518. package/dist/sdk/improvement-ledger.js +2 -2
  519. package/dist/sdk/index.js +1 -1
  520. package/dist/sdk/init-agent-guidance.js +16 -2
  521. package/dist/sdk/init.js +16 -2
  522. package/dist/sdk/invocation-author.js +1 -1
  523. package/dist/sdk/item-children.js +1 -1
  524. package/dist/sdk/item-metadata-index.js +1 -1
  525. package/dist/sdk/item-schedule.js +1 -1
  526. package/dist/sdk/item-transaction.js +1 -1
  527. package/dist/sdk/learnings.js +1 -1
  528. package/dist/sdk/lifecycle/append.js +4 -2
  529. package/dist/sdk/lifecycle/claim.js +1 -1
  530. package/dist/sdk/lifecycle/close-many.js +1 -1
  531. package/dist/sdk/lifecycle/close.js +1 -1
  532. package/dist/sdk/lifecycle/copy.js +1 -1
  533. package/dist/sdk/lifecycle/create.js +1 -1
  534. package/dist/sdk/lifecycle/delete.js +1 -1
  535. package/dist/sdk/lifecycle/event-validation-messages.js +1 -1
  536. package/dist/sdk/lifecycle/focus.js +1 -1
  537. package/dist/sdk/lifecycle/hierarchy-mutation-lock.js +1 -1
  538. package/dist/sdk/lifecycle/legacy-none-tokens.js +1 -1
  539. package/dist/sdk/lifecycle/lifecycle-transitions.js +1 -1
  540. package/dist/sdk/lifecycle/mcp-actions.js +1 -1
  541. package/dist/sdk/lifecycle/metadata-normalizers.js +1 -1
  542. package/dist/sdk/lifecycle/mutation-command-options.js +1 -1
  543. package/dist/sdk/lifecycle/plan-mutation-receipt.js +1 -1
  544. package/dist/sdk/lifecycle/plan.js +1 -1
  545. package/dist/sdk/lifecycle/recurrence-parsers.js +1 -1
  546. package/dist/sdk/lifecycle/reopen.js +1 -1
  547. package/dist/sdk/lifecycle/repeatable-metadata-parsers.js +2 -1
  548. package/dist/sdk/lifecycle/restore.js +1 -1
  549. package/dist/sdk/lifecycle/shared-unset-fields.js +1 -1
  550. package/dist/sdk/lifecycle/task-composition.js +1 -1
  551. package/dist/sdk/lifecycle/update-many.js +1 -1
  552. package/dist/sdk/lifecycle/update.js +2 -1
  553. package/dist/sdk/lifecycle-completion.js +1 -1
  554. package/dist/sdk/lifecycle-policy.js +1 -1
  555. package/dist/sdk/linked-artifacts.js +2 -1
  556. package/dist/sdk/mcp/apps.js +1 -1
  557. package/dist/sdk/mcp/authorization.js +1 -1
  558. package/dist/sdk/mcp/discovery.js +1 -1
  559. package/dist/sdk/mcp/interactions.js +1 -1
  560. package/dist/sdk/mcp/protocol.js +1 -1
  561. package/dist/sdk/mcp/skills.js +3 -1
  562. package/dist/sdk/mcp/subscriptions.js +1 -1
  563. package/dist/sdk/mcp/tasks.js +2 -2
  564. package/dist/sdk/mcp/transport.js +1 -1
  565. package/dist/sdk/merge/abandoned-receipts.js +1 -1
  566. package/dist/sdk/merge/driver.js +1 -1
  567. package/dist/sdk/merge/index.js +1 -1
  568. package/dist/sdk/merge/install.js +4 -2
  569. package/dist/sdk/merge/receipt-file-boundary.js +1 -1
  570. package/dist/sdk/merge/receipt-operation.js +1 -1
  571. package/dist/sdk/merge/receipt-schema.js +1 -1
  572. package/dist/sdk/merge/receipts.js +4 -4
  573. package/dist/sdk/merge/reconcile.js +1 -1
  574. package/dist/sdk/merge/three-way.js +3 -2
  575. package/dist/sdk/merge/worktree-config.js +1 -1
  576. package/dist/sdk/merge.js +1 -1
  577. package/dist/sdk/mutation-events.js +1 -1
  578. package/dist/sdk/mutation-guard.js +1 -1
  579. package/dist/sdk/notes.js +1 -1
  580. package/dist/sdk/output-contracts.js +1 -1
  581. package/dist/sdk/output-projection.js +1 -1
  582. package/dist/sdk/output-token-accounting.js +1 -1
  583. package/dist/sdk/output.js +2 -1
  584. package/dist/sdk/ownership-source.js +1 -1
  585. package/dist/sdk/package-import-adapters.js +1 -1
  586. package/dist/sdk/package-migrations.js +1 -1
  587. package/dist/sdk/package-runtime-options.js +1 -1
  588. package/dist/sdk/pagination.js +1 -1
  589. package/dist/sdk/profile.js +5 -1
  590. package/dist/sdk/provenance.js +1 -1
  591. package/dist/sdk/public-surface.json +1 -1
  592. package/dist/sdk/query/activity.js +1 -1
  593. package/dist/sdk/query/aggregate.js +1 -1
  594. package/dist/sdk/query/calendar.js +4 -1
  595. package/dist/sdk/query/complete-list.js +1 -1
  596. package/dist/sdk/query/context.js +2 -1
  597. package/dist/sdk/query/duplicate-candidates.js +1 -1
  598. package/dist/sdk/query/get.d.ts +14 -2
  599. package/dist/sdk/query/get.js +1 -1
  600. package/dist/sdk/query/history.js +1 -1
  601. package/dist/sdk/query/item-filter-options.js +1 -1
  602. package/dist/sdk/query/light-metadata.js +1 -1
  603. package/dist/sdk/query/list-filter-shared.js +1 -1
  604. package/dist/sdk/query/list.js +1 -1
  605. package/dist/sdk/query/multi-value-filters.js +1 -1
  606. package/dist/sdk/query/next-ready-budget.js +1 -1
  607. package/dist/sdk/query/next.js +2 -1
  608. package/dist/sdk/query/parsers.js +1 -1
  609. package/dist/sdk/query/projection-contracts.js +1 -1
  610. package/dist/sdk/query/search/corpus.js +2 -1
  611. package/dist/sdk/query/search/filters.js +1 -1
  612. package/dist/sdk/query/search/input.js +1 -1
  613. package/dist/sdk/query/search/lexical.js +1 -1
  614. package/dist/sdk/query/search/response.js +1 -1
  615. package/dist/sdk/query/search/semantic.js +3 -2
  616. package/dist/sdk/query/search/types.js +1 -1
  617. package/dist/sdk/query/search-contracts.js +1 -1
  618. package/dist/sdk/query/search-pagination.d.ts +1 -1
  619. package/dist/sdk/query/search-pagination.js +1 -1
  620. package/dist/sdk/query/search-rendering.js +1 -1
  621. package/dist/sdk/query/search.js +1 -1
  622. package/dist/sdk/query/workspace-contracts.js +1 -1
  623. package/dist/sdk/query.js +1 -1
  624. package/dist/sdk/read-output/continuation.js +1 -1
  625. package/dist/sdk/read-output/options.js +1 -1
  626. package/dist/sdk/read-output/provenance.js +1 -1
  627. package/dist/sdk/read-output-budget.js +1 -1
  628. package/dist/sdk/read-output-contracts.js +1 -1
  629. package/dist/sdk/read-output-rows.js +1 -1
  630. package/dist/sdk/read-output-session.js +1 -1
  631. package/dist/sdk/relationship-analytics.js +1 -1
  632. package/dist/sdk/relationship-context.js +1 -1
  633. package/dist/sdk/relationship-history.js +7 -4
  634. package/dist/sdk/relationship-kinds/contract.js +1 -1
  635. package/dist/sdk/relationship-migration.js +1 -1
  636. package/dist/sdk/relationships.js +1 -1
  637. package/dist/sdk/reproducibility/process.js +1 -1
  638. package/dist/sdk/runtime/actions.js +1 -1
  639. package/dist/sdk/runtime/context.js +1 -1
  640. package/dist/sdk/runtime/schema-preview.js +1 -1
  641. package/dist/sdk/runtime/schema.js +1 -1
  642. package/dist/sdk/runtime-action-aliases.js +1 -1
  643. package/dist/sdk/runtime-extended-actions.js +1 -1
  644. package/dist/sdk/runtime-input.js +1 -1
  645. package/dist/sdk/runtime-primitives.js +1 -1
  646. package/dist/sdk/runtime-public-contracts.js +1 -1
  647. package/dist/sdk/runtime-stats-options.js +1 -1
  648. package/dist/sdk/runtime.js +1 -1
  649. package/dist/sdk/scheduling-shortcuts.js +1 -1
  650. package/dist/sdk/schema-migration.js +4 -3
  651. package/dist/sdk/schema.js +7 -1
  652. package/dist/sdk/search-refresh-worker.js +1 -1
  653. package/dist/sdk/similarity-scoring.js +1 -1
  654. package/dist/sdk/similarity.js +1 -1
  655. package/dist/sdk/start-task-status.js +1 -1
  656. package/dist/sdk/stats.js +1 -1
  657. package/dist/sdk/structured-mutations.js +1 -1
  658. package/dist/sdk/telemetry-flush.js +1 -1
  659. package/dist/sdk/telemetry.js +4 -3
  660. package/dist/sdk/templates.js +26 -2
  661. package/dist/sdk/test/batch.js +2 -2
  662. package/dist/sdk/test/entry.js +1 -1
  663. package/dist/sdk/test/execution.js +6 -5
  664. package/dist/sdk/test/json-path.js +1 -1
  665. package/dist/sdk/test/linked-command-detection.js +1 -1
  666. package/dist/sdk/test/measurements.js +1 -1
  667. package/dist/sdk/test/parsers.js +1 -1
  668. package/dist/sdk/test/runs.js +1 -1
  669. package/dist/sdk/test/trust.js +2 -2
  670. package/dist/sdk/test/workspace-snapshot.js +1 -1
  671. package/dist/sdk/testing.js +7 -4
  672. package/dist/sdk/traceability/runtime-files-lookup.js +1 -1
  673. package/dist/sdk/traceability/source-traceability.js +2 -1
  674. package/dist/sdk/tracker-root-discovery.js +1 -1
  675. package/dist/sdk/workspace-contracts-cache.js +1 -1
  676. package/dist/sdk/workspace-contracts.js +1 -1
  677. package/dist/sdk/workspace-memory.js +2 -2
  678. package/dist/sdk/workspace-recipe.js +1 -1
  679. package/dist/sdk/workspace-snapshot.js +5 -4
  680. package/dist/sdk/workspace-transaction-gc.js +1 -1
  681. package/dist/sdk/workspace-transaction.js +2 -2
  682. package/dist/sdk/workspace.js +3 -2
  683. package/dist/types/index.js +1 -1
  684. package/dist/types.js +1 -1
  685. package/docs/AGENT_EVIDENCE_CONSISTENCY.md +88 -0
  686. package/docs/DIAGNOSTIC_OUTPUT_CONTRACTS.md +25 -0
  687. package/docs/GET_READ_EVIDENCE.md +68 -0
  688. package/docs/OUTPUT_PROJECTION_CONTRACTS.md +23 -0
  689. package/docs/README.md +2 -0
  690. package/docs/SDK_AUDITED_MUTATIONS.md +35 -0
  691. package/docs/TESTING.md +8 -0
  692. package/docs/ecosystem-review-2026-09-28.json +2864 -3157
  693. package/marketplace.json +2 -2
  694. package/package.json +1 -1
  695. package/packages/pm-beads/package.json +1 -1
  696. package/packages/pm-calendar/package.json +1 -1
  697. package/packages/pm-command-kit/package.json +1 -1
  698. package/packages/pm-digital-twin/package.json +1 -1
  699. package/packages/pm-governance-audit/package.json +1 -1
  700. package/packages/pm-guide-shell/package.json +1 -1
  701. package/packages/pm-kanban/package.json +1 -1
  702. package/packages/pm-lifecycle-hooks/package.json +1 -1
  703. package/packages/pm-linked-test-adapters/package.json +1 -1
  704. package/packages/pm-search-advanced/package.json +1 -1
  705. package/packages/pm-templates/package.json +1 -1
  706. package/packages/pm-todos/package.json +1 -1
  707. package/packages/pm-vcs/extensions/vcs/index.ts +4 -2
  708. package/packages/pm-vcs/package.json +1 -1
  709. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  710. package/plugins/pm-claude/package.json +2 -2
  711. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  712. package/plugins/pm-codex/package.json +2 -2
  713. package/plugins/pm-codex/plugin.json +1 -1
  714. package/scripts/finalize-build.mjs +3 -2
  715. package/dist/cli-bundle/chunks/chunk-3AF2R3Y6.js +0 -6
  716. package/dist/cli-bundle/chunks/chunk-6ST3SCQ6.js +0 -2
  717. package/dist/cli-bundle/chunks/chunk-6Z4IV2MC.js +0 -8
  718. package/dist/cli-bundle/chunks/chunk-DEZPZOQ7.js +0 -2
  719. package/dist/cli-bundle/chunks/chunk-FW5LJXQY.js +0 -31
  720. package/dist/cli-bundle/chunks/chunk-H2DZW6I6.js +0 -3
  721. package/dist/cli-bundle/chunks/chunk-H7CXQBGQ.js +0 -2
  722. package/dist/cli-bundle/chunks/chunk-KP7NBQK3.js +0 -80
  723. package/dist/cli-bundle/chunks/chunk-MKXBCBAN.js +0 -20
  724. package/dist/cli-bundle/chunks/chunk-QPKQKSQU.js +0 -238
  725. package/dist/cli-bundle/chunks/chunk-SGFQQXFD.js +0 -2
  726. package/dist/cli-bundle/chunks/chunk-YCBGZF3T.js +0 -2
  727. package/dist/cli-bundle/chunks/chunk-YDWKGUQU.js +0 -3
  728. package/dist/cli-bundle/chunks/register-mutation-5PT3NW3A.js +0 -20
  729. package/dist/cli-bundle/chunks/register-operations-QDDQOAAV.js +0 -2
  730. package/dist/cli-bundle/chunks/register-setup-BBX67YMA.js +0 -2
  731. package/dist/cli-bundle/focused-chunks/chunk-4FFPGNCJ.js +0 -6
  732. package/dist/cli-bundle/focused-chunks/chunk-73DA7ISY.js +0 -75
  733. package/dist/cli-bundle/focused-chunks/chunk-E754JDLY.js +0 -2
  734. package/dist/cli-bundle/focused-chunks/chunk-FKK2HI3S.js +0 -2
  735. package/dist/cli-bundle/focused-chunks/chunk-GMYUNHST.js +0 -3
  736. package/dist/cli-bundle/focused-chunks/chunk-HIA2ZF64.js +0 -12
  737. package/dist/cli-bundle/focused-chunks/chunk-UTRSM3ZK.js +0 -8
  738. package/dist/cli-bundle/focused-chunks/chunk-VVWYI2X7.js +0 -2
  739. package/dist/cli-bundle/focused-chunks/chunk-WAJNX4RN.js +0 -20
  740. package/dist/cli-bundle/focused-chunks/chunk-WCY6HRZO.js +0 -30
  741. package/dist/cli-bundle/focused-chunks/chunk-YC32ZSLS.js +0 -165
  742. package/dist/cli-bundle/focused-chunks/chunk-ZIXFMIUL.js +0 -3
@@ -1,2 +1,2 @@
1
- !(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]="9b9004b5-2446-539c-9adc-75aeaa3acbba")}catch(e2){}})();import{normalizeAddTypeInput,parseItemTypesFile,serializeItemTypesFile,upsertItemType}from"../schema/item-types-file.js";import{normalizeAddStatusInput,parseStatusDefsFile,serializeStatusDefsFile,upsertStatusDef}from"../schema/status-defs-file.js";import{normalizeAddFieldInput,parseFieldsFile,serializeFieldsFile,upsertField}from"../schema/fields-file.js";import{parseNestedSettingValue,readNestedSettingValue,resolveNestedSettingDescriptor}from"../config/nested-settings.js";function planSchemaComponent(initialFile,inputs,keyOf,serialize,upsert){let file=initialFile;const changes=[];for(const input of inputs){const before=serialize(file);const result=upsert(file,input);const after=serialize(result.file);file=result.file;const status=before===after?"unchanged":result.replaced?"update":"add";changes.push({key:keyOf(input),status})}return{file,changes,changed:changes.some(change=>change.status!=="unchanged")}}function canonicalTransitions(transitions){return JSON.stringify(transitions.map(pair=>pair.join("\0")).sort())}function planWorkflows(current,desired){const result=current.map(entry=>({...entry}));const changes=[];for(const workflow of desired){const index=result.findIndex(entry=>entry.type===workflow.type);const next={type:workflow.type,allowed_transitions:workflow.allowed_transitions};if(index<0){result.push(next);changes.push({type:workflow.type,status:"add"})}else if(canonicalTransitions(result[index].allowed_transitions)===canonicalTransitions(workflow.allowed_transitions)){changes.push({type:workflow.type,status:"unchanged"})}else{result[index]=next;changes.push({type:workflow.type,status:"update"})}}return{changes,result,changed:changes.some(change=>change.status!=="unchanged")}}function planConfig(profile,settings){const changes=[];for(const entry of profile.config){const descriptor=resolveNestedSettingDescriptor(entry.key);if(descriptor===void 0){throw new Error(`Profile "${profile.name}" references unknown config key "${entry.key}".`)}const parsed=parseNestedSettingValue(descriptor,entry.value);if(!parsed.ok){throw new Error(`Profile "${profile.name}" config ${entry.key}: ${parsed.error.message}`)}const current=readNestedSettingValue(settings,descriptor);const status=current===null?"add":current===parsed.parsed.value?"unchanged":"update";changes.push({key:descriptor.key,path:descriptor.path,value:parsed.parsed.value,status})}return{changes,changed:changes.some(change=>change.status!=="unchanged")}}function canonicalTemplateOptions(options){const sorted=Object.entries(options).sort(([left],[right])=>left.localeCompare(right));return JSON.stringify(sorted)}function planTemplates(profile,existing){const changes=[];for(const template of profile.templates){const current=existing.get(template.name);let status;if(current===void 0){status="add"}else if(canonicalTemplateOptions(current)===canonicalTemplateOptions(template.options)){status="unchanged"}else{status="update"}changes.push({name:template.name,options:template.options,status})}return{changes,changed:changes.some(change=>change.status!=="unchanged")}}function planProfileApplication(profile,current){const types=planSchemaComponent(parseItemTypesFile(current.typesRaw),profile.types,input=>normalizeAddTypeInput(input).name,serializeItemTypesFile,(file,input)=>upsertItemType(file,normalizeAddTypeInput(input)));const statuses=planSchemaComponent(parseStatusDefsFile(current.statusesRaw),profile.statuses,input=>normalizeAddStatusInput(input).id,serializeStatusDefsFile,(file,input)=>upsertStatusDef(file,normalizeAddStatusInput(input)));const fields=planSchemaComponent(parseFieldsFile(current.fieldsRaw),profile.fields,input=>normalizeAddFieldInput(input).key,serializeFieldsFile,(file,input)=>upsertField(file,normalizeAddFieldInput(input)));const workflows=planWorkflows(current.workflows,profile.workflows);const config=planConfig(profile,current.settings);const templates=planTemplates(profile,current.templates);const packages=profile.packages.map(recommendation=>({spec:recommendation.spec,reason:recommendation.reason,status:current.installedPackages.has(recommendation.spec)?"installed":"recommended"}));const changed=types.changed||statuses.changed||fields.changed||workflows.changed||config.changed||templates.changed;return{profile:{name:profile.name,title:profile.title,summary:profile.summary},types,statuses,fields,workflows,config,templates,packages,changed}}export{planProfileApplication};
1
+ (function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="be2b507d-2797-570c-b211-46d950edcbde")}catch{}})();import{normalizeAddTypeInput,parseItemTypesFile,serializeItemTypesFile,upsertItemType}from"../schema/item-types-file.js";import{normalizeAddStatusInput,parseStatusDefsFile,serializeStatusDefsFile,upsertStatusDef}from"../schema/status-defs-file.js";import{normalizeAddFieldInput,parseFieldsFile,serializeFieldsFile,upsertField}from"../schema/fields-file.js";import{parseNestedSettingValue,readNestedSettingValue,resolveNestedSettingDescriptor}from"../config/nested-settings.js";function planSchemaComponent(initialFile,inputs,keyOf,serialize,upsert){let file=initialFile;const changes=[];for(const input of inputs){const before=serialize(file),result=upsert(file,input),after=serialize(result.file);file=result.file;const status=before===after?"unchanged":result.replaced?"update":"add";changes.push({key:keyOf(input),status})}return{file,changes,changed:changes.some(change=>change.status!=="unchanged")}}function canonicalTransitions(transitions){return JSON.stringify(transitions.map(pair=>pair.join("\0")).sort())}function planWorkflows(current,desired){const result=current.map(entry=>({...entry})),changes=[];for(const workflow of desired){const index=result.findIndex(entry=>entry.type===workflow.type),next={type:workflow.type,allowed_transitions:workflow.allowed_transitions};index<0?(result.push(next),changes.push({type:workflow.type,status:"add"})):canonicalTransitions(result[index].allowed_transitions)===canonicalTransitions(workflow.allowed_transitions)?changes.push({type:workflow.type,status:"unchanged"}):(result[index]=next,changes.push({type:workflow.type,status:"update"}))}return{changes,result,changed:changes.some(change=>change.status!=="unchanged")}}function planConfig(profile,settings){const changes=[];for(const entry of profile.config){const descriptor=resolveNestedSettingDescriptor(entry.key);if(descriptor===void 0)throw new Error(`Profile "${profile.name}" references unknown config key "${entry.key}".`);const parsed=parseNestedSettingValue(descriptor,entry.value);if(!parsed.ok)throw new Error(`Profile "${profile.name}" config ${entry.key}: ${parsed.error.message}`);const current=readNestedSettingValue(settings,descriptor),status=current===null?"add":current===parsed.parsed.value?"unchanged":"update";changes.push({key:descriptor.key,path:descriptor.path,value:parsed.parsed.value,status})}return{changes,changed:changes.some(change=>change.status!=="unchanged")}}function canonicalTemplateOptions(options){const sorted=Object.entries(options).sort(([left],[right])=>left.localeCompare(right));return JSON.stringify(sorted)}function planTemplates(profile,existing){const changes=[];for(const template of profile.templates){const current=existing.get(template.name);let status;current===void 0?status="add":canonicalTemplateOptions(current)===canonicalTemplateOptions(template.options)?status="unchanged":status="update",changes.push({name:template.name,options:template.options,status})}return{changes,changed:changes.some(change=>change.status!=="unchanged")}}function planProfileApplication(profile,current){const types=planSchemaComponent(parseItemTypesFile(current.typesRaw),profile.types,input=>normalizeAddTypeInput(input).name,serializeItemTypesFile,(file,input)=>upsertItemType(file,normalizeAddTypeInput(input))),statuses=planSchemaComponent(parseStatusDefsFile(current.statusesRaw),profile.statuses,input=>normalizeAddStatusInput(input).id,serializeStatusDefsFile,(file,input)=>upsertStatusDef(file,normalizeAddStatusInput(input))),fields=planSchemaComponent(parseFieldsFile(current.fieldsRaw),profile.fields,input=>normalizeAddFieldInput(input).key,serializeFieldsFile,(file,input)=>upsertField(file,normalizeAddFieldInput(input))),workflows=planWorkflows(current.workflows,profile.workflows),config=planConfig(profile,current.settings),templates=planTemplates(profile,current.templates),packages=profile.packages.map(recommendation=>({spec:recommendation.spec,reason:recommendation.reason,status:current.installedPackages.has(recommendation.spec)?"installed":"recommended"})),changed=types.changed||statuses.changed||fields.changed||workflows.changed||config.changed||templates.changed;return{profile:{name:profile.name,title:profile.title,summary:profile.summary},types,statuses,fields,workflows,config,templates,packages,changed}}export{planProfileApplication};
2
2
  //# sourceMappingURL=profile-plan.js.map
@@ -1,2 +1,26 @@
1
- !(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]="ddcc068c-6727-5508-baa3-e089bcd0a0a9")}catch(e2){}})();import{TYPE_PRESET_DEFINITIONS}from"../schema/type-presets.js";const PROFILE_NAMES=["agile","ops","research"];const BUILTIN_PROFILES={agile:{name:"agile",title:"Agile delivery",summary:"Story/Spike delivery with a review stage, story points, and acceptance ownership.",types:TYPE_PRESET_DEFINITIONS.agile,statuses:[{id:"review",roles:["active"],aliases:["in-review"],description:"Work is implementation-complete and awaiting peer review."}],fields:[{key:"story_points",type:"number",commands:["create","update","list"],description:"Relative estimation size for a story or spike.",aliases:["points"]},{key:"acceptance_owner",type:"string",commands:["create","update","list"],description:"Stakeholder accountable for accepting the delivered story.",aliases:["acceptor"]}],workflows:[{type:"Story",allowed_transitions:[["open","in_progress"],["in_progress","review"],["review","in_progress"],["review","closed"],["in_progress","blocked"],["blocked","in_progress"]]}],config:[{key:"search_provider",value:"bm25",summary:"Offline BM25 lexical search works without an embedding service."},{key:"search_max_results",value:"20",summary:"Sprint-sized result cap for quick triage."}],templates:[{name:"story",options:{type:"Story",priority:"2",tags:"story",acceptanceCriteria:"Story delivers the stated user outcome with tests and docs updated.",body:"## As a\n\n## I want\n\n## So that\n\n## Acceptance\n- [ ] \n"}}],packages:[{spec:"templates",reason:"Reusable create templates for recurring story shapes."},{spec:"calendar",reason:"Sprint and iteration scheduling views."},{spec:"search-advanced",reason:"Richer retrieval as the backlog grows."}]},ops:{name:"ops",title:"Operations",summary:"Incident/Runbook response with mitigation and monitoring stages, severity, and service fields.",types:TYPE_PRESET_DEFINITIONS.ops,statuses:[{id:"mitigating",roles:["active"],aliases:["mitigation"],description:"Active mitigation is underway to restore service."},{id:"monitoring",roles:["active"],aliases:["observing"],description:"Mitigation applied; monitoring for recurrence before closure."}],fields:[{key:"severity",type:"string",commands:["create","update","list"],description:"Incident severity classification (e.g. sev1, sev2, sev3).",aliases:["sev"]},{key:"service",type:"string",commands:["create","update","list"],description:"Primary affected service or component."}],workflows:[{type:"Incident",allowed_transitions:[["open","mitigating"],["mitigating","monitoring"],["monitoring","mitigating"],["monitoring","closed"],["mitigating","blocked"],["blocked","mitigating"]]}],config:[{key:"search_provider",value:"bm25",summary:"Offline BM25 lexical search for fast incident lookup."},{key:"search_max_results",value:"25",summary:"Wider result cap to surface related incidents and runbooks."}],templates:[{name:"incident",options:{type:"Incident",priority:"1",tags:"incident",acceptanceCriteria:"Service restored, root cause documented, and follow-ups filed.",body:"## Impact\n\n## Timeline\n\n## Root cause\n\n## Mitigation\n\n## Follow-ups\n"}}],packages:[{spec:"lifecycle-hooks",reason:"Automate transitions and notifications on incident state changes."},{spec:"governance-audit",reason:"Audit incident metadata completeness and closure quality."},{spec:"calendar",reason:"On-call and follow-up scheduling."}]},research:{name:"research",title:"Research",summary:"Experiment/Hypothesis investigation with an analysis stage, hypothesis, and method fields.",types:TYPE_PRESET_DEFINITIONS.research,statuses:[{id:"analyzing",roles:["active"],aliases:["analysis"],description:"Data collected; analysis and synthesis in progress."}],fields:[{key:"hypothesis",type:"string",commands:["create","update"],description:"The testable claim the experiment evaluates."},{key:"method",type:"string",commands:["create","update","list"],description:"Experimental method or protocol used to evaluate the hypothesis.",aliases:["protocol"]}],workflows:[{type:"Experiment",allowed_transitions:[["open","in_progress"],["in_progress","analyzing"],["analyzing","in_progress"],["analyzing","closed"],["in_progress","blocked"],["blocked","in_progress"]]}],config:[{key:"search_provider",value:"bm25",summary:"Offline BM25 lexical search across the research corpus."},{key:"search_max_results",value:"50",summary:"Broader recall cap for literature and prior-experiment discovery."}],templates:[{name:"experiment",options:{type:"Experiment",priority:"2",tags:"experiment",acceptanceCriteria:"Hypothesis is supported, rejected, or refined with recorded evidence.",body:"## Hypothesis\n\n## Method\n\n## Results\n\n## Conclusion\n"}}],packages:[{spec:"search-advanced",reason:"Semantic retrieval over experiments and findings."},{spec:"templates",reason:"Consistent experiment and hypothesis scaffolds."},{spec:"beads",reason:"Import structured prior work into the tracker."}]}};function normalizeProfileName(rawValue){if(rawValue===void 0){return void 0}const normalized=normalizeProfileLookupKey(rawValue);if(normalized.length===0){throw new Error("Profile name must not be empty.")}if(PROFILE_NAMES.includes(normalized)){return normalized}throw new Error(`Invalid profile "${rawValue}". Allowed: ${PROFILE_NAMES.join(", ")}.`)}function resolveProfile(rawValue){const name=normalizeProfileName(rawValue);if(name===void 0){throw new Error(`Profile name is required. Allowed: ${PROFILE_NAMES.join(", ")}.`)}return BUILTIN_PROFILES[name]}function listProfiles(){return PROFILE_NAMES.map(name=>BUILTIN_PROFILES[name])}function normalizeProfileLookupKey(rawValue){return rawValue.trim().toLowerCase().replaceAll("-","_")}function formatAvailableProfileNames(profiles){return profiles.map(entry=>entry.definition.name).join(", ")}function resolveProfileCatalog(contributions=[]){const profiles=PROFILE_NAMES.map(name=>({definition:BUILTIN_PROFILES[name],source:"builtin"}));const builtinKeys=new Set(PROFILE_NAMES.map(name=>normalizeProfileLookupKey(name)));const seen=new Set(builtinKeys);const warnings=[];for(const contribution of contributions){const key=normalizeProfileLookupKey(contribution.profile.name);if(builtinKeys.has(key)){warnings.push(`Extension "${contribution.name}" profile "${contribution.profile.name}" uses a name reserved by a built-in archetype and was ignored.`);continue}if(seen.has(key)){warnings.push(`Profile "${contribution.profile.name}" from extension "${contribution.name}" duplicates an already-registered profile and was ignored.`);continue}seen.add(key);profiles.push({definition:contribution.profile,source:"extension",package:contribution.name})}return{profiles,warnings}}function resolveProfileEntry(rawValue,contributions=[]){const{profiles,warnings}=resolveProfileCatalog(contributions);if(typeof rawValue!=="string"||rawValue.trim().length===0){throw new Error(`Profile name is required. Allowed: ${formatAvailableProfileNames(profiles)}.`)}const key=normalizeProfileLookupKey(rawValue);const match=profiles.find(entry=>normalizeProfileLookupKey(entry.definition.name)===key);if(match===void 0){throw new Error(`Invalid profile "${rawValue}". Allowed: ${formatAvailableProfileNames(profiles)}.`)}return{resolved:match,warnings}}export{BUILTIN_PROFILES,PROFILE_NAMES,listProfiles,normalizeProfileLookupKey,normalizeProfileName,resolveProfile,resolveProfileCatalog,resolveProfileEntry};
1
+ (function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="59d16a38-d6df-5695-96e3-28b6e384f76b")}catch{}})();import{TYPE_PRESET_DEFINITIONS}from"../schema/type-presets.js";const PROFILE_NAMES=["agile","ops","research"],BUILTIN_PROFILES={agile:{name:"agile",title:"Agile delivery",summary:"Story/Spike delivery with a review stage, story points, and acceptance ownership.",types:TYPE_PRESET_DEFINITIONS.agile,statuses:[{id:"review",roles:["active"],aliases:["in-review"],description:"Work is implementation-complete and awaiting peer review."}],fields:[{key:"story_points",type:"number",commands:["create","update","list"],description:"Relative estimation size for a story or spike.",aliases:["points"]},{key:"acceptance_owner",type:"string",commands:["create","update","list"],description:"Stakeholder accountable for accepting the delivered story.",aliases:["acceptor"]}],workflows:[{type:"Story",allowed_transitions:[["open","in_progress"],["in_progress","review"],["review","in_progress"],["review","closed"],["in_progress","blocked"],["blocked","in_progress"]]}],config:[{key:"search_provider",value:"bm25",summary:"Offline BM25 lexical search works without an embedding service."},{key:"search_max_results",value:"20",summary:"Sprint-sized result cap for quick triage."}],templates:[{name:"story",options:{type:"Story",priority:"2",tags:"story",acceptanceCriteria:"Story delivers the stated user outcome with tests and docs updated.",body:`## As a
2
+
3
+ ## I want
4
+
5
+ ## So that
6
+
7
+ ## Acceptance
8
+ - [ ]
9
+ `}}],packages:[{spec:"templates",reason:"Reusable create templates for recurring story shapes."},{spec:"calendar",reason:"Sprint and iteration scheduling views."},{spec:"search-advanced",reason:"Richer retrieval as the backlog grows."}]},ops:{name:"ops",title:"Operations",summary:"Incident/Runbook response with mitigation and monitoring stages, severity, and service fields.",types:TYPE_PRESET_DEFINITIONS.ops,statuses:[{id:"mitigating",roles:["active"],aliases:["mitigation"],description:"Active mitigation is underway to restore service."},{id:"monitoring",roles:["active"],aliases:["observing"],description:"Mitigation applied; monitoring for recurrence before closure."}],fields:[{key:"severity",type:"string",commands:["create","update","list"],description:"Incident severity classification (e.g. sev1, sev2, sev3).",aliases:["sev"]},{key:"service",type:"string",commands:["create","update","list"],description:"Primary affected service or component."}],workflows:[{type:"Incident",allowed_transitions:[["open","mitigating"],["mitigating","monitoring"],["monitoring","mitigating"],["monitoring","closed"],["mitigating","blocked"],["blocked","mitigating"]]}],config:[{key:"search_provider",value:"bm25",summary:"Offline BM25 lexical search for fast incident lookup."},{key:"search_max_results",value:"25",summary:"Wider result cap to surface related incidents and runbooks."}],templates:[{name:"incident",options:{type:"Incident",priority:"1",tags:"incident",acceptanceCriteria:"Service restored, root cause documented, and follow-ups filed.",body:`## Impact
10
+
11
+ ## Timeline
12
+
13
+ ## Root cause
14
+
15
+ ## Mitigation
16
+
17
+ ## Follow-ups
18
+ `}}],packages:[{spec:"lifecycle-hooks",reason:"Automate transitions and notifications on incident state changes."},{spec:"governance-audit",reason:"Audit incident metadata completeness and closure quality."},{spec:"calendar",reason:"On-call and follow-up scheduling."}]},research:{name:"research",title:"Research",summary:"Experiment/Hypothesis investigation with an analysis stage, hypothesis, and method fields.",types:TYPE_PRESET_DEFINITIONS.research,statuses:[{id:"analyzing",roles:["active"],aliases:["analysis"],description:"Data collected; analysis and synthesis in progress."}],fields:[{key:"hypothesis",type:"string",commands:["create","update"],description:"The testable claim the experiment evaluates."},{key:"method",type:"string",commands:["create","update","list"],description:"Experimental method or protocol used to evaluate the hypothesis.",aliases:["protocol"]}],workflows:[{type:"Experiment",allowed_transitions:[["open","in_progress"],["in_progress","analyzing"],["analyzing","in_progress"],["analyzing","closed"],["in_progress","blocked"],["blocked","in_progress"]]}],config:[{key:"search_provider",value:"bm25",summary:"Offline BM25 lexical search across the research corpus."},{key:"search_max_results",value:"50",summary:"Broader recall cap for literature and prior-experiment discovery."}],templates:[{name:"experiment",options:{type:"Experiment",priority:"2",tags:"experiment",acceptanceCriteria:"Hypothesis is supported, rejected, or refined with recorded evidence.",body:`## Hypothesis
19
+
20
+ ## Method
21
+
22
+ ## Results
23
+
24
+ ## Conclusion
25
+ `}}],packages:[{spec:"search-advanced",reason:"Semantic retrieval over experiments and findings."},{spec:"templates",reason:"Consistent experiment and hypothesis scaffolds."},{spec:"beads",reason:"Import structured prior work into the tracker."}]}};function normalizeProfileName(rawValue){if(rawValue===void 0)return;const normalized=normalizeProfileLookupKey(rawValue);if(normalized.length===0)throw new Error("Profile name must not be empty.");if(PROFILE_NAMES.includes(normalized))return normalized;throw new Error(`Invalid profile "${rawValue}". Allowed: ${PROFILE_NAMES.join(", ")}.`)}function resolveProfile(rawValue){const name=normalizeProfileName(rawValue);if(name===void 0)throw new Error(`Profile name is required. Allowed: ${PROFILE_NAMES.join(", ")}.`);return BUILTIN_PROFILES[name]}function listProfiles(){return PROFILE_NAMES.map(name=>BUILTIN_PROFILES[name])}function normalizeProfileLookupKey(rawValue){return rawValue.trim().toLowerCase().replaceAll("-","_")}function formatAvailableProfileNames(profiles){return profiles.map(entry=>entry.definition.name).join(", ")}function resolveProfileCatalog(contributions=[]){const profiles=PROFILE_NAMES.map(name=>({definition:BUILTIN_PROFILES[name],source:"builtin"})),builtinKeys=new Set(PROFILE_NAMES.map(name=>normalizeProfileLookupKey(name))),seen=new Set(builtinKeys),warnings=[];for(const contribution of contributions){const key=normalizeProfileLookupKey(contribution.profile.name);if(builtinKeys.has(key)){warnings.push(`Extension "${contribution.name}" profile "${contribution.profile.name}" uses a name reserved by a built-in archetype and was ignored.`);continue}if(seen.has(key)){warnings.push(`Profile "${contribution.profile.name}" from extension "${contribution.name}" duplicates an already-registered profile and was ignored.`);continue}seen.add(key),profiles.push({definition:contribution.profile,source:"extension",package:contribution.name})}return{profiles,warnings}}function resolveProfileEntry(rawValue,contributions=[]){const{profiles,warnings}=resolveProfileCatalog(contributions);if(typeof rawValue!="string"||rawValue.trim().length===0)throw new Error(`Profile name is required. Allowed: ${formatAvailableProfileNames(profiles)}.`);const key=normalizeProfileLookupKey(rawValue),match=profiles.find(entry=>normalizeProfileLookupKey(entry.definition.name)===key);if(match===void 0)throw new Error(`Invalid profile "${rawValue}". Allowed: ${formatAvailableProfileNames(profiles)}.`);return{resolved:match,warnings}}export{BUILTIN_PROFILES,PROFILE_NAMES,listProfiles,normalizeProfileLookupKey,normalizeProfileName,resolveProfile,resolveProfileCatalog,resolveProfileEntry};
2
26
  //# sourceMappingURL=profile-presets.js.map
@@ -1,2 +1,2 @@
1
- !(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]="38ed5847-939e-5846-bc7d-6d257d36a25f")}catch(e2){}})();import crypto from"node:crypto";import{AsyncLocalStorage}from"node:async_hooks";const executionStorage=new AsyncLocalStorage;const MAX_REPRODUCIBLE_TOKEN_LENGTH=1024;function validateReproducibleExecutionSettings(settings){const clockMs=Date.parse(settings.clock);if(!Number.isFinite(clockMs)){throw new Error(`Invalid reproducible workspace clock: ${settings.clock}`)}if(!Number.isSafeInteger(settings.tickMs)||settings.tickMs<0){throw new Error("Reproducible workspace tickMs must be a non-negative integer")}if(settings.seed.trim().length===0){throw new Error("Reproducible workspace seed must not be empty")}return{...settings,clock:new Date(clockMs).toISOString()}}function createReproducibleExecutionRunner(settings){const normalized=validateReproducibleExecutionSettings(settings);const state={...normalized,clockReads:0,tokenReads:0};return operation=>executionStorage.run(state,operation)}async function runWithReproducibleExecution(settings,operation){return createReproducibleExecutionRunner(settings)(operation)}function nextReproducibleTimestamp(){const state=executionStorage.getStore();if(state===void 0){return void 0}const timestamp=new Date(Date.parse(state.clock)+state.clockReads*state.tickMs).toISOString();state.clockReads+=1;return timestamp}function nextReproducibleToken(length){const state=executionStorage.getStore();if(state===void 0){return void 0}if(!Number.isSafeInteger(length)||length<0||length>MAX_REPRODUCIBLE_TOKEN_LENGTH){throw new Error(`Reproducible token length must be an integer between 0 and ${MAX_REPRODUCIBLE_TOKEN_LENGTH}`)}let token="";while(token.length<length){const digest=crypto.createHash("sha256").update(`${state.seed}\0${state.tokenReads}`).digest();state.tokenReads+=1;for(const byte of digest){token+=(byte%36).toString(36);if(token.length===length){break}}}return token}export{createReproducibleExecutionRunner,nextReproducibleTimestamp,nextReproducibleToken,runWithReproducibleExecution,validateReproducibleExecutionSettings};
1
+ (function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="ced47074-06d3-53b9-af75-63586cbd4f6a")}catch{}})();import crypto from"node:crypto";import{AsyncLocalStorage}from"node:async_hooks";const executionStorage=new AsyncLocalStorage,MAX_REPRODUCIBLE_TOKEN_LENGTH=1024;function validateReproducibleExecutionSettings(settings){const clockMs=Date.parse(settings.clock);if(!Number.isFinite(clockMs))throw new Error(`Invalid reproducible workspace clock: ${settings.clock}`);if(!Number.isSafeInteger(settings.tickMs)||settings.tickMs<0)throw new Error("Reproducible workspace tickMs must be a non-negative integer");if(settings.seed.trim().length===0)throw new Error("Reproducible workspace seed must not be empty");return{...settings,clock:new Date(clockMs).toISOString()}}function createReproducibleExecutionRunner(settings){const state={...validateReproducibleExecutionSettings(settings),clockReads:0,tokenReads:0};return operation=>executionStorage.run(state,operation)}async function runWithReproducibleExecution(settings,operation){return createReproducibleExecutionRunner(settings)(operation)}function nextReproducibleTimestamp(){const state=executionStorage.getStore();if(state===void 0)return;const timestamp=new Date(Date.parse(state.clock)+state.clockReads*state.tickMs).toISOString();return state.clockReads+=1,timestamp}function nextReproducibleToken(length){const state=executionStorage.getStore();if(state===void 0)return;if(!Number.isSafeInteger(length)||length<0||length>MAX_REPRODUCIBLE_TOKEN_LENGTH)throw new Error(`Reproducible token length must be an integer between 0 and ${MAX_REPRODUCIBLE_TOKEN_LENGTH}`);let token="";for(;token.length<length;){const digest=crypto.createHash("sha256").update(`${state.seed}\0${state.tokenReads}`).digest();state.tokenReads+=1;for(const byte of digest)if(token+=(byte%36).toString(36),token.length===length)break}return token}export{createReproducibleExecutionRunner,nextReproducibleTimestamp,nextReproducibleToken,runWithReproducibleExecution,validateReproducibleExecutionSettings};
2
2
  //# sourceMappingURL=context.js.map
@@ -1,3 +1,3 @@
1
- !(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]="f9535c02-9214-5d5e-bac0-2dabbe5d395e")}catch(e2){}})();import{RUNTIME_FIELD_COMMAND_VALUES,RUNTIME_FIELD_TYPE_VALUES}from"../../types/index.js";import{ITEM_METADATA_KEY_ORDER}from"../shared/constants.js";import{normalizeStatusToken as normalizeFieldKey}from"./status-token.js";import{normalizeStatusToken}from"./status-token.js";const RUNTIME_FIELD_TYPE_SET=new Set(RUNTIME_FIELD_TYPE_VALUES);const RUNTIME_FIELD_COMMAND_SET=new Set(RUNTIME_FIELD_COMMAND_VALUES);const BUILTIN_FIELD_KEYS=new Set([...ITEM_METADATA_KEY_ORDER.filter(key=>key!=="severity"),"id","title","type","status","priority","tags","assignee","parent","description","body","created_at","updated_at","closed_at","completed_at","author","deadline","estimate","sprint","release","risk","confidence","reviewer","resolution","expected","actual"]);const DEFAULT_FIELD_COMMANDS=["create","update"];function normalizeCliToken(value){if(typeof value!=="string"){return""}const collapsed=value.trim().toLowerCase().replaceAll(/[\s_]+/g,"-");return collapsed.startsWith("--")?collapsed.slice(2):collapsed}function keyToDefaultCliFlag(key){return key.replaceAll("_","-")}function dedupeCliTokens(values,exclude){const seen=new Set;for(const value of values){const token=normalizeCliToken(value);if(token.length>0&&token!==exclude){seen.add(token)}}return[...seen].sort((left,right)=>left.localeCompare(right))}function dedupeStringList(values){const seen=new Set;for(const value of values??[]){const trimmed=value.trim();if(trimmed.length>0){seen.add(trimmed)}}return[...seen].sort((left,right)=>left.localeCompare(right))}function normalizeFieldCommands(rawCommands){const seen=new Set;const normalized=[];for(const rawCommand of rawCommands??[]){const command=rawCommand.trim().toLowerCase();if(command.length===0){continue}if(!RUNTIME_FIELD_COMMAND_SET.has(command)){throw new Error(`Invalid field command "${rawCommand}". Allowed: ${RUNTIME_FIELD_COMMAND_VALUES.join(", ")}.`)}if(!seen.has(command)){seen.add(command);normalized.push(command)}}return rawCommands===void 0||normalized.length===0?[...DEFAULT_FIELD_COMMANDS]:normalized}function normalizeAddFieldInput(raw){const key=normalizeFieldKey(raw.key);if(key.length===0){throw new Error("Field key must not be empty.")}if(BUILTIN_FIELD_KEYS.has(key)){throw new Error(`Cannot define custom field "${key}": custom schema field "${key}" collides with built-in item metadata "${key}". Rename the custom field with a project-specific prefix. Reserved fields: ${[...BUILTIN_FIELD_KEYS].sort((left,right)=>left.localeCompare(right)).join(", ")}.`)}const typeCandidate=typeof raw.type==="string"&&raw.type.trim().length>0?raw.type.trim().toLowerCase():"string";if(!RUNTIME_FIELD_TYPE_SET.has(typeCandidate)){throw new Error(`Invalid field type "${raw.type}". Allowed: ${RUNTIME_FIELD_TYPE_VALUES.join(", ")}.`)}const type=typeCandidate;const commands=normalizeFieldCommands(raw.commands);const cliFlagToken=normalizeCliToken(raw.cliFlag);const cliFlag=cliFlagToken.length>0&&cliFlagToken!==keyToDefaultCliFlag(key)?cliFlagToken:void 0;const effectiveFlag=cliFlag??keyToDefaultCliFlag(key);const cliAliases=dedupeCliTokens(raw.aliases??[],effectiveFlag);const description=raw.description?.trim();return{key,type,commands,description:description&&description.length>0?description:void 0,cliFlag,cliAliases,required:raw.required===true,requiredOnCreate:raw.requiredOnCreate===true,allowUnset:raw.allowUnset!==false,requiredTypes:dedupeStringList(raw.requiredTypes)}}function selectFieldsArray(parsed){if(Array.isArray(parsed)){return parsed}if(typeof parsed!=="object"||parsed===null){return void 0}const record=parsed;if(Array.isArray(record.fields)){return record.fields}if(Array.isArray(record.definitions)){return record.definitions}return void 0}function extractFieldDefinitions(parsed){const candidate=selectFieldsArray(parsed);if(!candidate){return[]}const definitions=[];for(const entry of candidate){if(typeof entry!=="object"||entry===null||Array.isArray(entry)){continue}const record=entry;if(typeof record.key!=="string"||record.key.trim().length===0){continue}definitions.push(record)}return definitions}function parseFieldsFile(raw){if(raw===null||raw===void 0||raw.trim().length===0){return{fields:[]}}let parsed;try{parsed=JSON.parse(raw)}catch{throw new Error("schema/fields.json contains invalid JSON.")}return{fields:extractFieldDefinitions(parsed)}}function serializeFieldsFile(file){return`${JSON.stringify({fields:file.fields},null,2)}
2
- `}function upsertField(file,input){const existing=file.fields.find(definition=>normalizeFieldKey(definition.key)===input.key);const replaced=existing!==void 0;const fields=file.fields.filter(definition=>normalizeFieldKey(definition.key)!==input.key);const next={...existing,key:input.key,type:input.type,commands:[...input.commands]};applyOptionalString(next,"description",input.description);applyOptionalString(next,"cli_flag",input.cliFlag);if(input.cliAliases.length>0){next.cli_aliases=[...input.cliAliases]}else{delete next.cli_aliases}applyBooleanFlag(next,"required",input.required);applyBooleanFlag(next,"required_on_create",input.requiredOnCreate);if(input.allowUnset===false){next.allow_unset=false}else{delete next.allow_unset}if(input.requiredTypes.length>0){next.required_types=[...input.requiredTypes]}else{delete next.required_types}fields.push(next);fields.sort((left,right)=>normalizeFieldKey(left.key).localeCompare(normalizeFieldKey(right.key)));return{file:{fields},definition:next,replaced}}function removeField(file,key){const normalizedKey=normalizeFieldKey(key);if(normalizedKey.length===0){throw new Error("Field key must not be empty.")}const removed=[];const fields=file.fields.filter(definition=>{if(normalizeFieldKey(definition.key)===normalizedKey){removed.push(definition);return false}return true});if(removed.length===0){return{file:{fields},removed:false}}return{file:{fields},removed:true,definition:removed[0]}}function applyOptionalString(definition,key,value){const record=definition;if(value!==void 0&&value.length>0){record[key]=value}else{delete record[key]}}function applyBooleanFlag(definition,key,value){const record=definition;if(value){record[key]=true}else{delete record[key]}}export{BUILTIN_FIELD_KEYS,normalizeAddFieldInput,normalizeStatusToken as normalizeFieldKey,parseFieldsFile,removeField,serializeFieldsFile,upsertField};
1
+ (function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="68be16cc-4cb4-5df6-90f0-897d4fe82339")}catch{}})();import{RUNTIME_FIELD_COMMAND_VALUES,RUNTIME_FIELD_TYPE_VALUES}from"../../types/index.js";import{ITEM_METADATA_KEY_ORDER}from"../shared/constants.js";import{normalizeStatusToken as normalizeFieldKey}from"./status-token.js";import{normalizeStatusToken}from"./status-token.js";const RUNTIME_FIELD_TYPE_SET=new Set(RUNTIME_FIELD_TYPE_VALUES),RUNTIME_FIELD_COMMAND_SET=new Set(RUNTIME_FIELD_COMMAND_VALUES),BUILTIN_FIELD_KEYS=new Set([...ITEM_METADATA_KEY_ORDER.filter(key=>key!=="severity"),"id","title","type","status","priority","tags","assignee","parent","description","body","created_at","updated_at","closed_at","completed_at","author","deadline","estimate","sprint","release","risk","confidence","reviewer","resolution","expected","actual"]),DEFAULT_FIELD_COMMANDS=["create","update"];function normalizeCliToken(value){if(typeof value!="string")return"";const collapsed=value.trim().toLowerCase().replaceAll(/[\s_]+/g,"-");return collapsed.startsWith("--")?collapsed.slice(2):collapsed}function keyToDefaultCliFlag(key){return key.replaceAll("_","-")}function dedupeCliTokens(values,exclude){const seen=new Set;for(const value of values){const token=normalizeCliToken(value);token.length>0&&token!==exclude&&seen.add(token)}return[...seen].sort((left,right)=>left.localeCompare(right))}function dedupeStringList(values){const seen=new Set;for(const value of values??[]){const trimmed=value.trim();trimmed.length>0&&seen.add(trimmed)}return[...seen].sort((left,right)=>left.localeCompare(right))}function normalizeFieldCommands(rawCommands){const seen=new Set,normalized=[];for(const rawCommand of rawCommands??[]){const command=rawCommand.trim().toLowerCase();if(command.length!==0){if(!RUNTIME_FIELD_COMMAND_SET.has(command))throw new Error(`Invalid field command "${rawCommand}". Allowed: ${RUNTIME_FIELD_COMMAND_VALUES.join(", ")}.`);seen.has(command)||(seen.add(command),normalized.push(command))}}return rawCommands===void 0||normalized.length===0?[...DEFAULT_FIELD_COMMANDS]:normalized}function normalizeAddFieldInput(raw){const key=normalizeFieldKey(raw.key);if(key.length===0)throw new Error("Field key must not be empty.");if(BUILTIN_FIELD_KEYS.has(key))throw new Error(`Cannot define custom field "${key}": custom schema field "${key}" collides with built-in item metadata "${key}". Rename the custom field with a project-specific prefix. Reserved fields: ${[...BUILTIN_FIELD_KEYS].sort((left,right)=>left.localeCompare(right)).join(", ")}.`);const typeCandidate=typeof raw.type=="string"&&raw.type.trim().length>0?raw.type.trim().toLowerCase():"string";if(!RUNTIME_FIELD_TYPE_SET.has(typeCandidate))throw new Error(`Invalid field type "${raw.type}". Allowed: ${RUNTIME_FIELD_TYPE_VALUES.join(", ")}.`);const type=typeCandidate,commands=normalizeFieldCommands(raw.commands),cliFlagToken=normalizeCliToken(raw.cliFlag),cliFlag=cliFlagToken.length>0&&cliFlagToken!==keyToDefaultCliFlag(key)?cliFlagToken:void 0,effectiveFlag=cliFlag??keyToDefaultCliFlag(key),cliAliases=dedupeCliTokens(raw.aliases??[],effectiveFlag),description=raw.description?.trim();return{key,type,commands,description:description&&description.length>0?description:void 0,cliFlag,cliAliases,required:raw.required===!0,requiredOnCreate:raw.requiredOnCreate===!0,allowUnset:raw.allowUnset!==!1,requiredTypes:dedupeStringList(raw.requiredTypes)}}function selectFieldsArray(parsed){if(Array.isArray(parsed))return parsed;if(typeof parsed!="object"||parsed===null)return;const record=parsed;if(Array.isArray(record.fields))return record.fields;if(Array.isArray(record.definitions))return record.definitions}function extractFieldDefinitions(parsed){const candidate=selectFieldsArray(parsed);if(!candidate)return[];const definitions=[];for(const entry of candidate){if(typeof entry!="object"||entry===null||Array.isArray(entry))continue;const record=entry;typeof record.key!="string"||record.key.trim().length===0||definitions.push(record)}return definitions}function parseFieldsFile(raw){if(raw==null||raw.trim().length===0)return{fields:[]};let parsed;try{parsed=JSON.parse(raw)}catch{throw new Error("schema/fields.json contains invalid JSON.")}return{fields:extractFieldDefinitions(parsed)}}function serializeFieldsFile(file){return`${JSON.stringify({fields:file.fields},null,2)}
2
+ `}function upsertField(file,input){const existing=file.fields.find(definition=>normalizeFieldKey(definition.key)===input.key),replaced=existing!==void 0,fields=file.fields.filter(definition=>normalizeFieldKey(definition.key)!==input.key),next={...existing,key:input.key,type:input.type,commands:[...input.commands]};return applyOptionalString(next,"description",input.description),applyOptionalString(next,"cli_flag",input.cliFlag),input.cliAliases.length>0?next.cli_aliases=[...input.cliAliases]:delete next.cli_aliases,applyBooleanFlag(next,"required",input.required),applyBooleanFlag(next,"required_on_create",input.requiredOnCreate),input.allowUnset===!1?next.allow_unset=!1:delete next.allow_unset,input.requiredTypes.length>0?next.required_types=[...input.requiredTypes]:delete next.required_types,fields.push(next),fields.sort((left,right)=>normalizeFieldKey(left.key).localeCompare(normalizeFieldKey(right.key))),{file:{fields},definition:next,replaced}}function removeField(file,key){const normalizedKey=normalizeFieldKey(key);if(normalizedKey.length===0)throw new Error("Field key must not be empty.");const removed=[],fields=file.fields.filter(definition=>normalizeFieldKey(definition.key)===normalizedKey?(removed.push(definition),!1):!0);return removed.length===0?{file:{fields},removed:!1}:{file:{fields},removed:!0,definition:removed[0]}}function applyOptionalString(definition,key,value){const record=definition;value!==void 0&&value.length>0?record[key]=value:delete record[key]}function applyBooleanFlag(definition,key,value){const record=definition;value?record[key]=!0:delete record[key]}export{BUILTIN_FIELD_KEYS,normalizeAddFieldInput,normalizeStatusToken as normalizeFieldKey,parseFieldsFile,removeField,serializeFieldsFile,upsertField};
3
3
  //# sourceMappingURL=fields-file.js.map
@@ -1,3 +1,3 @@
1
- !(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]="24688724-53cd-5375-ae7e-cfe098cd0dc8")}catch(e2){}})();import{BUILTIN_ITEM_TYPE_VALUES}from"../../types/index.js";import{normalizeItemTypeFolder,toDefaultFolder}from"../item/type-registry.js";const BUILTIN_NAME_LOOKUP=new Map(BUILTIN_ITEM_TYPE_VALUES.map(name=>[name.toLowerCase(),name]));const TYPE_NAME_TOKEN_PATTERN=/^[A-Za-z][A-Za-z0-9_-]*$/;function assertValidTypeToken(value,label){if(!TYPE_NAME_TOKEN_PATTERN.test(value)){throw new Error(`${label} "${value}" is not a valid identifier. Use a single letter-led token of letters, digits, hyphen, or underscore with no spaces or punctuation (e.g. "Spike" or "code-review").`)}}function matchBuiltinTypeName(name){return BUILTIN_NAME_LOOKUP.get(name.trim().toLowerCase())}function coerceAliasArray(value){return Array.isArray(value)?value.filter(entry=>typeof entry==="string"):[]}function escapeForDoubleQuotes(value){return value.replace(/[\\"`$]/g,char=>`\\${char}`)}function dedupeAliases(values){const seen=new Map;for(const value of values){const trimmed=value.trim();if(trimmed.length===0){continue}const key=trimmed.toLowerCase();if(!seen.has(key)){seen.set(key,trimmed)}}return[...seen.values()].sort((left,right)=>left.localeCompare(right))}function normalizeAddTypeInput(raw){const name=(raw.name??"").trim();if(name.length===0){throw new Error("Type name must not be empty.")}assertValidTypeToken(name,"Type name");const builtinMatch=matchBuiltinTypeName(name);if(builtinMatch){throw new Error(`Cannot redefine built-in item type "${builtinMatch}". Built-in types are reserved: ${BUILTIN_ITEM_TYPE_VALUES.join(", ")}.`)}const description=raw.description?.trim();const defaultStatus=raw.defaultStatus?.trim();const rawFolder=raw.folder?.trim();const folder=rawFolder&&rawFolder.length>0?normalizeItemTypeFolder(rawFolder):void 0;const aliases=dedupeAliases(raw.aliases??[]);for(const alias of aliases){assertValidTypeToken(alias,"Alias");const aliasBuiltin=matchBuiltinTypeName(alias);if(aliasBuiltin){throw new Error(`Alias "${alias}" collides with built-in item type "${aliasBuiltin}". Built-in types are reserved: ${BUILTIN_ITEM_TYPE_VALUES.join(", ")}.`)}}return{name,description:description&&description.length>0?description:void 0,defaultStatus:defaultStatus&&defaultStatus.length>0?defaultStatus:void 0,folder,aliases}}function assertAliasesAvailable(input,existing){const selfLower=input.name.toLowerCase();const taken=new Map;for(const definition of existing.definitions){if(typeof definition.name!=="string"){continue}const definitionName=definition.name.trim();if(definitionName.length===0||definitionName.toLowerCase()===selfLower){continue}taken.set(definitionName.toLowerCase(),definitionName);for(const alias of coerceAliasArray(definition.aliases)){if(alias.trim().length>0){taken.set(alias.trim().toLowerCase(),definitionName)}}}const nameOwner=taken.get(selfLower);if(nameOwner){throw new Error(`Type name "${input.name}" collides with an alias of existing item type "${nameOwner}".`)}for(const alias of input.aliases){const owner=taken.get(alias.toLowerCase());if(owner){throw new Error(`Alias "${alias}" already maps to existing item type "${owner}".`)}}}function resolveDefinitionFolder(name,folder){if(typeof folder==="string"&&folder.trim().length>0){return normalizeItemTypeFolder(folder).toLowerCase()}return toDefaultFolder(name).toLowerCase()}function assertTypeFolderAvailable(input,existing,reservedFolders){const selfLower=input.name.toLowerCase();const inputFolder=resolveDefinitionFolder(input.name,input.folder);const fail=ownerName=>{throw new Error(`Item type "${input.name}" would store items in folder "${inputFolder}", which already belongs to existing item type "${ownerName}". Pass a distinct --folder to keep their storage separate.`)};for(const definition of existing.definitions){if(typeof definition.name!=="string"){continue}const definitionName=definition.name.trim();if(definitionName.length===0||definitionName.toLowerCase()===selfLower){continue}if(resolveDefinitionFolder(definitionName,definition.folder)===inputFolder){fail(definitionName)}}const reservedOwner=reservedFolders?.get(inputFolder);if(reservedOwner!==void 0&&reservedOwner.toLowerCase()!==selfLower){fail(reservedOwner)}}function parseItemTypesFile(raw){if(raw===null||raw===void 0||raw.trim().length===0){return{definitions:[]}}let parsed;try{parsed=JSON.parse(raw)}catch{throw new Error("schema/types.json contains invalid JSON.")}return{definitions:extractDefinitions(parsed)}}function extractDefinitions(parsed){const candidate=selectDefinitionsArray(parsed);if(!candidate){return[]}const definitions=[];for(const entry of candidate){if(typeof entry!=="object"||entry===null||Array.isArray(entry)){continue}const record=entry;if(typeof record.name!=="string"||record.name.trim().length===0){continue}definitions.push(record)}return definitions}function selectDefinitionsArray(parsed){if(Array.isArray(parsed)){return parsed}if(typeof parsed!=="object"||parsed===null){return void 0}const record=parsed;if(Array.isArray(record.definitions)){return record.definitions}if(typeof record.item_types==="object"&&record.item_types!==null){const nested=record.item_types;if(Array.isArray(nested.definitions)){return nested.definitions}}return void 0}function upsertItemType(file,input){const lowerName=input.name.toLowerCase();const definitions=file.definitions.slice();const existingIndex=definitions.findIndex(definition=>typeof definition.name==="string"&&definition.name.trim().toLowerCase()===lowerName);const existing=existingIndex>=0?definitions[existingIndex]:void 0;const mergedAliases=dedupeAliases([...coerceAliasArray(existing?.aliases),...input.aliases]);const next={...existing,name:input.name};if(input.folder!==void 0){next.folder=input.folder}if(mergedAliases.length>0){next.aliases=mergedAliases}else if(next.aliases!==void 0){delete next.aliases}applyAttribute(next,"description",input.description);applyAttribute(next,"default_status",input.defaultStatus);if(existingIndex>=0){definitions[existingIndex]=next}else{definitions.push(next)}definitions.sort((left,right)=>left.name.localeCompare(right.name));return{file:{definitions},definition:next,replaced:existingIndex>=0,...existing&&typeof existing.name==="string"?{previousName:existing.name}:{}}}function removeItemType(file,name){const trimmed=(name??"").trim();if(trimmed.length===0){throw new Error("Type name must not be empty.")}const builtinMatch=matchBuiltinTypeName(trimmed);if(builtinMatch){throw new Error(`Cannot remove built-in item type "${builtinMatch}". Built-in types are reserved: ${BUILTIN_ITEM_TYPE_VALUES.join(", ")}.`)}const lowerName=trimmed.toLowerCase();const definitions=file.definitions.slice();const existingIndex=definitions.findIndex(definition2=>typeof definition2.name==="string"&&definition2.name.trim().toLowerCase()===lowerName);if(existingIndex<0){return{file:{definitions},removed:false}}const[definition]=definitions.splice(existingIndex,1);return{file:{definitions},removed:true,definition}}function applyAttribute(definition,key,value){const record=definition;if(value!==void 0){record[key]=value}}function serializeItemTypesFile(file){return`${JSON.stringify({definitions:file.definitions},null,2)}
2
- `}function buildInvalidTypeHint(name,typesFilePath){const safeName=name.trim().length>0?name.trim():name;const target=typesFilePath?.trim()||".agents/pm/schema/types.json";return`To register a custom type, run: pm schema add-type "${escapeForDoubleQuotes(safeName)}" (writes ${target}).`}function buildInvalidTypeError(name,allowedTypes,typesFilePath){return`Invalid type value "${name}". Allowed: ${allowedTypes.join(", ")}. ${buildInvalidTypeHint(name,typesFilePath)}`}export{assertAliasesAvailable,assertTypeFolderAvailable,buildInvalidTypeError,buildInvalidTypeHint,escapeForDoubleQuotes,matchBuiltinTypeName,normalizeAddTypeInput,parseItemTypesFile,removeItemType,serializeItemTypesFile,upsertItemType};
1
+ (function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="158d5065-075c-5355-a65c-f3edc9c5f1f0")}catch{}})();import{BUILTIN_ITEM_TYPE_VALUES}from"../../types/index.js";import{normalizeItemTypeFolder,toDefaultFolder}from"../item/type-registry.js";const BUILTIN_NAME_LOOKUP=new Map(BUILTIN_ITEM_TYPE_VALUES.map(name=>[name.toLowerCase(),name])),TYPE_NAME_TOKEN_PATTERN=/^[A-Za-z][A-Za-z0-9_-]*$/;function assertValidTypeToken(value,label){if(!TYPE_NAME_TOKEN_PATTERN.test(value))throw new Error(`${label} "${value}" is not a valid identifier. Use a single letter-led token of letters, digits, hyphen, or underscore with no spaces or punctuation (e.g. "Spike" or "code-review").`)}function matchBuiltinTypeName(name){return BUILTIN_NAME_LOOKUP.get(name.trim().toLowerCase())}function coerceAliasArray(value){return Array.isArray(value)?value.filter(entry=>typeof entry=="string"):[]}function escapeForDoubleQuotes(value){return value.replace(/[\\"`$]/g,char=>`\\${char}`)}function dedupeAliases(values){const seen=new Map;for(const value of values){const trimmed=value.trim();if(trimmed.length===0)continue;const key=trimmed.toLowerCase();seen.has(key)||seen.set(key,trimmed)}return[...seen.values()].sort((left,right)=>left.localeCompare(right))}function normalizeAddTypeInput(raw){const name=(raw.name??"").trim();if(name.length===0)throw new Error("Type name must not be empty.");assertValidTypeToken(name,"Type name");const builtinMatch=matchBuiltinTypeName(name);if(builtinMatch)throw new Error(`Cannot redefine built-in item type "${builtinMatch}". Built-in types are reserved: ${BUILTIN_ITEM_TYPE_VALUES.join(", ")}.`);const description=raw.description?.trim(),defaultStatus=raw.defaultStatus?.trim(),rawFolder=raw.folder?.trim(),folder=rawFolder&&rawFolder.length>0?normalizeItemTypeFolder(rawFolder):void 0,aliases=dedupeAliases(raw.aliases??[]);for(const alias of aliases){assertValidTypeToken(alias,"Alias");const aliasBuiltin=matchBuiltinTypeName(alias);if(aliasBuiltin)throw new Error(`Alias "${alias}" collides with built-in item type "${aliasBuiltin}". Built-in types are reserved: ${BUILTIN_ITEM_TYPE_VALUES.join(", ")}.`)}return{name,description:description&&description.length>0?description:void 0,defaultStatus:defaultStatus&&defaultStatus.length>0?defaultStatus:void 0,folder,aliases}}function assertAliasesAvailable(input,existing){const selfLower=input.name.toLowerCase(),taken=new Map;for(const definition of existing.definitions){if(typeof definition.name!="string")continue;const definitionName=definition.name.trim();if(!(definitionName.length===0||definitionName.toLowerCase()===selfLower)){taken.set(definitionName.toLowerCase(),definitionName);for(const alias of coerceAliasArray(definition.aliases))alias.trim().length>0&&taken.set(alias.trim().toLowerCase(),definitionName)}}const nameOwner=taken.get(selfLower);if(nameOwner)throw new Error(`Type name "${input.name}" collides with an alias of existing item type "${nameOwner}".`);for(const alias of input.aliases){const owner=taken.get(alias.toLowerCase());if(owner)throw new Error(`Alias "${alias}" already maps to existing item type "${owner}".`)}}function resolveDefinitionFolder(name,folder){return typeof folder=="string"&&folder.trim().length>0?normalizeItemTypeFolder(folder).toLowerCase():toDefaultFolder(name).toLowerCase()}function assertTypeFolderAvailable(input,existing,reservedFolders){const selfLower=input.name.toLowerCase(),inputFolder=resolveDefinitionFolder(input.name,input.folder),fail=ownerName=>{throw new Error(`Item type "${input.name}" would store items in folder "${inputFolder}", which already belongs to existing item type "${ownerName}". Pass a distinct --folder to keep their storage separate.`)};for(const definition of existing.definitions){if(typeof definition.name!="string")continue;const definitionName=definition.name.trim();definitionName.length===0||definitionName.toLowerCase()===selfLower||resolveDefinitionFolder(definitionName,definition.folder)===inputFolder&&fail(definitionName)}const reservedOwner=reservedFolders?.get(inputFolder);reservedOwner!==void 0&&reservedOwner.toLowerCase()!==selfLower&&fail(reservedOwner)}function parseItemTypesFile(raw){if(raw==null||raw.trim().length===0)return{definitions:[]};let parsed;try{parsed=JSON.parse(raw)}catch{throw new Error("schema/types.json contains invalid JSON.")}return{definitions:extractDefinitions(parsed)}}function extractDefinitions(parsed){const candidate=selectDefinitionsArray(parsed);if(!candidate)return[];const definitions=[];for(const entry of candidate){if(typeof entry!="object"||entry===null||Array.isArray(entry))continue;const record=entry;typeof record.name!="string"||record.name.trim().length===0||definitions.push(record)}return definitions}function selectDefinitionsArray(parsed){if(Array.isArray(parsed))return parsed;if(typeof parsed!="object"||parsed===null)return;const record=parsed;if(Array.isArray(record.definitions))return record.definitions;if(typeof record.item_types=="object"&&record.item_types!==null){const nested=record.item_types;if(Array.isArray(nested.definitions))return nested.definitions}}function upsertItemType(file,input){const lowerName=input.name.toLowerCase(),definitions=file.definitions.slice(),existingIndex=definitions.findIndex(definition=>typeof definition.name=="string"&&definition.name.trim().toLowerCase()===lowerName),existing=existingIndex>=0?definitions[existingIndex]:void 0,mergedAliases=dedupeAliases([...coerceAliasArray(existing?.aliases),...input.aliases]),next={...existing,name:input.name};return input.folder!==void 0&&(next.folder=input.folder),mergedAliases.length>0?next.aliases=mergedAliases:next.aliases!==void 0&&delete next.aliases,applyAttribute(next,"description",input.description),applyAttribute(next,"default_status",input.defaultStatus),existingIndex>=0?definitions[existingIndex]=next:definitions.push(next),definitions.sort((left,right)=>left.name.localeCompare(right.name)),{file:{definitions},definition:next,replaced:existingIndex>=0,...existing&&typeof existing.name=="string"?{previousName:existing.name}:{}}}function removeItemType(file,name){const trimmed=(name??"").trim();if(trimmed.length===0)throw new Error("Type name must not be empty.");const builtinMatch=matchBuiltinTypeName(trimmed);if(builtinMatch)throw new Error(`Cannot remove built-in item type "${builtinMatch}". Built-in types are reserved: ${BUILTIN_ITEM_TYPE_VALUES.join(", ")}.`);const lowerName=trimmed.toLowerCase(),definitions=file.definitions.slice(),existingIndex=definitions.findIndex(definition2=>typeof definition2.name=="string"&&definition2.name.trim().toLowerCase()===lowerName);if(existingIndex<0)return{file:{definitions},removed:!1};const[definition]=definitions.splice(existingIndex,1);return{file:{definitions},removed:!0,definition}}function applyAttribute(definition,key,value){const record=definition;value!==void 0&&(record[key]=value)}function serializeItemTypesFile(file){return`${JSON.stringify({definitions:file.definitions},null,2)}
2
+ `}function buildInvalidTypeHint(name,typesFilePath){const safeName=name.trim().length>0?name.trim():name,target=typesFilePath?.trim()||".agents/pm/schema/types.json";return`To register a custom type, run: pm schema add-type "${escapeForDoubleQuotes(safeName)}" (writes ${target}).`}function buildInvalidTypeError(name,allowedTypes,typesFilePath){return`Invalid type value "${name}". Allowed: ${allowedTypes.join(", ")}. ${buildInvalidTypeHint(name,typesFilePath)}`}export{assertAliasesAvailable,assertTypeFolderAvailable,buildInvalidTypeError,buildInvalidTypeHint,escapeForDoubleQuotes,matchBuiltinTypeName,normalizeAddTypeInput,parseItemTypesFile,removeItemType,serializeItemTypesFile,upsertItemType};
3
3
  //# sourceMappingURL=item-types-file.js.map
@@ -1,2 +1,2 @@
1
- !(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]="7778b388-1b28-53e7-a06e-ef6441b0ed68")}catch(e2){}})();import{coerceRuntimeFieldValue,readRuntimeFieldOptionValue}from"./runtime-field-values.js";import{stableValueEquals}from"../shared/serialization.js";function valuesEqual(left,right){return stableValueEquals(left,right)}function collectRuntimeFilterValues(options,fieldRegistry,command){const filters={};for(const definition of fieldRegistry.command_to_fields.get(command)??[]){const rawValue=readRuntimeFieldOptionValue(options,definition);if(rawValue===void 0){continue}filters[definition.metadata_key]=coerceRuntimeFieldValue(definition,rawValue)}return filters}function matchesRuntimeFilters(item,filters){for(const[fieldKey,expectedValue]of Object.entries(filters)){const actualValue=item[fieldKey];if(Array.isArray(expectedValue)){if(Array.isArray(actualValue)){const normalizedActual=actualValue.map(value=>String(value));const normalizedExpected=expectedValue.map(value=>String(value));if(!normalizedExpected.every(value=>normalizedActual.includes(value))){return false}continue}if(!valuesEqual(actualValue,expectedValue[expectedValue.length-1])){return false}continue}if(!valuesEqual(actualValue,expectedValue)){return false}}return true}export{collectRuntimeFilterValues,matchesRuntimeFilters};
1
+ (function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="4b79bd02-51ae-5c46-be4c-2f41dd8c9486")}catch{}})();import{coerceRuntimeFieldValue,readRuntimeFieldOptionValue}from"./runtime-field-values.js";import{stableValueEquals}from"../shared/serialization.js";function valuesEqual(left,right){return stableValueEquals(left,right)}function collectRuntimeFilterValues(options,fieldRegistry,command){const filters={};for(const definition of fieldRegistry.command_to_fields.get(command)??[]){const rawValue=readRuntimeFieldOptionValue(options,definition);rawValue!==void 0&&(filters[definition.metadata_key]=coerceRuntimeFieldValue(definition,rawValue))}return filters}function matchesRuntimeFilters(item,filters){for(const[fieldKey,expectedValue]of Object.entries(filters)){const actualValue=item[fieldKey];if(Array.isArray(expectedValue)){if(Array.isArray(actualValue)){const normalizedActual=actualValue.map(value=>String(value));if(!expectedValue.map(value=>String(value)).every(value=>normalizedActual.includes(value)))return!1;continue}if(!valuesEqual(actualValue,expectedValue[expectedValue.length-1]))return!1;continue}if(!valuesEqual(actualValue,expectedValue))return!1}return!0}export{collectRuntimeFilterValues,matchesRuntimeFilters};
2
2
  //# sourceMappingURL=runtime-field-filters.js.map
@@ -1,2 +1,2 @@
1
- !(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]="42eb2987-269d-5b18-b0fe-5b4334fdb6a0")}catch(e2){}})();import{EXIT_CODE}from"../shared/constants.js";import{PmCliError}from"../shared/errors.js";import{stableStringify}from"../shared/serialization.js";import{isRfc3339DateTime}from"../shared/time.js";import{runtimeFieldOptionTarget}from"./runtime-schema.js";const MAX_VALUE_SCHEMA_DEPTH=16;function toCamelToken(value){const segments=value.trim().replaceAll(/[^A-Za-z0-9]+/g," ").split(/\s+/).filter(segment=>segment.length>0).map(segment=>segment.toLowerCase());if(segments.length===0){return value}const[first,...rest]=segments;return`${first}${rest.map(segment=>`${segment.slice(0,1).toUpperCase()}${segment.slice(1)}`).join("")}`}function resolveCandidateOptionKeys(definition){return[...new Set([runtimeFieldOptionTarget(definition),toCamelToken(definition.key),toCamelToken(definition.cli_flag),...definition.cli_aliases.map(alias=>toCamelToken(alias))])]}function readRuntimeFieldOptionValue(options,definition){for(const candidateKey of resolveCandidateOptionKeys(definition)){if(!Object.hasOwn(options,candidateKey)){continue}const value=options[candidateKey];if(value!==void 0){return value}}return void 0}function normalizeStringArrayValue(value){if(Array.isArray(value)){return value.flatMap(entry=>normalizeStringArrayValue(entry)).map(entry=>entry.trim()).filter(entry=>entry.length>0)}if(typeof value==="string"){return value.split(/[,\n|]/).map(entry=>entry.trim()).filter(entry=>entry.length>0)}if(value===void 0||value===null){return[]}return[String(value).trim()].filter(entry=>entry.length>0)}function parseBooleanValue(raw,label){if(typeof raw==="boolean"){return raw}if(typeof raw==="number"){if(raw===1){return true}if(raw===0){return false}}if(typeof raw==="string"){const normalized=raw.trim().toLowerCase();if(normalized==="true"||normalized==="1"||normalized==="yes"){return true}if(normalized==="false"||normalized==="0"||normalized==="no"){return false}}throw new PmCliError(`${label} must be one of true|false|1|0|yes|no`,EXIT_CODE.USAGE)}function parseNumberValue(raw,label){if(typeof raw==="number"&&Number.isFinite(raw)){return raw}const candidate=typeof raw==="string"?raw.trim():String(raw);const parsed=Number(candidate);if(!Number.isFinite(parsed)){throw new PmCliError(`${label} must be a number`,EXIT_CODE.USAGE)}return parsed}function parseJsonContainerValue(raw,label,expectedType){const parsed=typeof raw==="string"?(()=>{try{return JSON.parse(raw)}catch{return void 0}})():raw;if(expectedType==="array"&&Array.isArray(parsed)||expectedType==="object"&&typeof parsed==="object"&&parsed!==null&&!Array.isArray(parsed)){return parsed}throw new PmCliError(`${label} must be valid JSON ${expectedType}`,EXIT_CODE.USAGE)}function valueMatchesSchemaType(value,type){if(type===void 0)return true;if(type==="array")return Array.isArray(value);if(type==="object"){return typeof value==="object"&&value!==null&&!Array.isArray(value)}return typeof value===type}function runtimeFieldPrimitiveSchemaError(value,schema,path){if(schema.const!==void 0&&stableStringify(value)!==stableStringify(schema.const)){return`${path} must equal ${stableStringify(schema.const)}`}if(schema.enum!==void 0&&!schema.enum.some(candidate=>stableStringify(candidate)===stableStringify(value))){return`${path} must be one of ${schema.enum.map(entry=>stableStringify(entry)).join("|")}`}if(!valueMatchesSchemaType(value,schema.type)){return`${path} must match configured type ${String(schema.type)}`}if(typeof value==="string"){if(schema.min_length!==void 0&&value.length<schema.min_length){return`${path} must contain at least ${schema.min_length} characters`}if(schema.format==="date-time"&&!isRfc3339DateTime(value)){return`${path} must be an RFC 3339 date-time`}}return void 0}function runtimeFieldArraySchemaError(value,schema,path,depth){if(!Array.isArray(value))return void 0;if(schema.min_items!==void 0&&value.length<schema.min_items){return`${path} must contain at least ${schema.min_items} items`}if(!schema.items)return void 0;for(const[index,entry]of value.entries()){const error=runtimeFieldSchemaError(entry,schema.items,`${path}[${index}]`,depth+1);if(error)return error}return void 0}function runtimeFieldObjectSchemaError(value,schema,path,depth){if(typeof value!=="object"||value===null||Array.isArray(value))return void 0;const record=value;for(const key of schema.required??[]){if(!Object.hasOwn(record,key))return`${path}.${key} is required`}for(const[key,entry]of Object.entries(record)){const propertySchema=schema.properties?.[key];if(!propertySchema){if(schema.additional_properties===false)return`${path}.${key} is not allowed`;continue}const error=runtimeFieldSchemaError(entry,propertySchema,`${path}.${key}`,depth+1);if(error)return error}return void 0}function runtimeFieldSchemaError(value,schema,path,depth=0){if(depth>MAX_VALUE_SCHEMA_DEPTH)return`${path} value schema exceeds maximum depth`;const directError=runtimeFieldPrimitiveSchemaError(value,schema,path);if(directError)return directError;const arrayError=runtimeFieldArraySchemaError(value,schema,path,depth);if(arrayError)return arrayError;const objectError=runtimeFieldObjectSchemaError(value,schema,path,depth);if(objectError)return objectError;if(!schema.one_of)return void 0;let matches=0;for(const candidate of schema.one_of){if(runtimeFieldSchemaError(value,candidate,path,depth+1)===void 0){matches+=1;if(matches>1)break}}return matches===1?void 0:`${path} must match exactly one configured schema variant`}function validateRuntimeFieldValue(definition,value,label){if(!definition.value_schema||value===void 0)return value;const error=runtimeFieldSchemaError(value,definition.value_schema,label);if(error)throw new PmCliError(error,EXIT_CODE.USAGE);return value}function coerceRuntimeFieldValue(definition,rawValue,labelOverride){const label=labelOverride??`--${definition.cli_flag}`;if(definition.type==="array"||definition.type==="object"){const containerRaw=Array.isArray(rawValue)?rawValue[rawValue.length-1]:rawValue;if(containerRaw===void 0){return void 0}return validateRuntimeFieldValue(definition,parseJsonContainerValue(containerRaw,label,definition.type),label)}if(definition.repeatable||definition.type==="string_array"){const values=normalizeStringArrayValue(rawValue);if(definition.type==="number"){return validateRuntimeFieldValue(definition,values.map(value=>parseNumberValue(value,label)),label)}if(definition.type==="boolean"){return validateRuntimeFieldValue(definition,values.map(value=>parseBooleanValue(value,label)),label)}return validateRuntimeFieldValue(definition,values,label)}const scalarRaw=Array.isArray(rawValue)?rawValue[rawValue.length-1]:rawValue;if(scalarRaw===void 0){return void 0}if(definition.type==="number"){return validateRuntimeFieldValue(definition,parseNumberValue(scalarRaw,label),label)}if(definition.type==="boolean"){return validateRuntimeFieldValue(definition,parseBooleanValue(scalarRaw,label),label)}return validateRuntimeFieldValue(definition,typeof scalarRaw==="string"?scalarRaw:String(scalarRaw),label)}function shouldRequireFieldOnCreate(definition,itemTypeName){if(!definition.required&&!definition.required_on_create){return false}if(definition.required_types.length===0){return true}if(!itemTypeName){return false}return definition.required_types.map(value=>value.toLowerCase()).includes(itemTypeName.trim().toLowerCase())}function collectRuntimeCreateFieldValues(options,fieldRegistry,itemTypeName){const values={};const missingRequiredFlags=[];for(const definition of fieldRegistry.command_to_fields.get("create")??[]){const rawValue=readRuntimeFieldOptionValue(options,definition);if(rawValue===void 0){if(shouldRequireFieldOnCreate(definition,itemTypeName)){missingRequiredFlags.push(`--${definition.cli_flag}`)}continue}values[definition.metadata_key]=coerceRuntimeFieldValue(definition,rawValue)}return{values,missing_required_flags:[...new Set(missingRequiredFlags)].sort((left,right)=>left.localeCompare(right))}}function collectRuntimeUpdateFieldValues(options,fieldRegistry,commands=["update"]){const values={};const definitions=(commands??["update"]).flatMap(command=>fieldRegistry.command_to_fields.get(command)??[]);const seen=new Set;for(const definition of definitions){const rawValue=readRuntimeFieldOptionValue(options,definition);if(rawValue===void 0){continue}if(seen.has(definition.metadata_key)){continue}seen.add(definition.metadata_key);values[definition.metadata_key]=coerceRuntimeFieldValue(definition,rawValue)}return values}export{coerceRuntimeFieldValue,collectRuntimeCreateFieldValues,collectRuntimeUpdateFieldValues,readRuntimeFieldOptionValue};
1
+ (function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="5a40c811-2441-5507-93d2-523f6792e2f1")}catch{}})();import{EXIT_CODE}from"../shared/constants.js";import{PmCliError}from"../shared/errors.js";import{stableStringify}from"../shared/serialization.js";import{isRfc3339DateTime}from"../shared/time.js";import{runtimeFieldOptionTarget}from"./runtime-schema.js";const MAX_VALUE_SCHEMA_DEPTH=16;function toCamelToken(value){const segments=value.trim().replaceAll(/[^A-Za-z0-9]+/g," ").split(/\s+/).filter(segment=>segment.length>0).map(segment=>segment.toLowerCase());if(segments.length===0)return value;const[first,...rest]=segments;return`${first}${rest.map(segment=>`${segment.slice(0,1).toUpperCase()}${segment.slice(1)}`).join("")}`}function resolveCandidateOptionKeys(definition){return[...new Set([runtimeFieldOptionTarget(definition),toCamelToken(definition.key),toCamelToken(definition.cli_flag),...definition.cli_aliases.map(alias=>toCamelToken(alias))])]}function readRuntimeFieldOptionValue(options,definition){for(const candidateKey of resolveCandidateOptionKeys(definition)){if(!Object.hasOwn(options,candidateKey))continue;const value=options[candidateKey];if(value!==void 0)return value}}function normalizeStringArrayValue(value){return Array.isArray(value)?value.flatMap(entry=>normalizeStringArrayValue(entry)).map(entry=>entry.trim()).filter(entry=>entry.length>0):typeof value=="string"?value.split(/[,\n|]/).map(entry=>entry.trim()).filter(entry=>entry.length>0):value==null?[]:[String(value).trim()].filter(entry=>entry.length>0)}function parseBooleanValue(raw,label){if(typeof raw=="boolean")return raw;if(typeof raw=="number"){if(raw===1)return!0;if(raw===0)return!1}if(typeof raw=="string"){const normalized=raw.trim().toLowerCase();if(normalized==="true"||normalized==="1"||normalized==="yes")return!0;if(normalized==="false"||normalized==="0"||normalized==="no")return!1}throw new PmCliError(`${label} must be one of true|false|1|0|yes|no`,EXIT_CODE.USAGE)}function parseNumberValue(raw,label){if(typeof raw=="number"&&Number.isFinite(raw))return raw;const candidate=typeof raw=="string"?raw.trim():String(raw),parsed=Number(candidate);if(!Number.isFinite(parsed))throw new PmCliError(`${label} must be a number`,EXIT_CODE.USAGE);return parsed}function parseJsonContainerValue(raw,label,expectedType){const parsed=typeof raw=="string"?(()=>{try{return JSON.parse(raw)}catch{return}})():raw;if(expectedType==="array"&&Array.isArray(parsed)||expectedType==="object"&&typeof parsed=="object"&&parsed!==null&&!Array.isArray(parsed))return parsed;throw new PmCliError(`${label} must be valid JSON ${expectedType}`,EXIT_CODE.USAGE)}function valueMatchesSchemaType(value,type){return type===void 0?!0:type==="array"?Array.isArray(value):type==="object"?typeof value=="object"&&value!==null&&!Array.isArray(value):typeof value===type}function runtimeFieldPrimitiveSchemaError(value,schema,path){if(schema.const!==void 0&&stableStringify(value)!==stableStringify(schema.const))return`${path} must equal ${stableStringify(schema.const)}`;if(schema.enum!==void 0&&!schema.enum.some(candidate=>stableStringify(candidate)===stableStringify(value)))return`${path} must be one of ${schema.enum.map(entry=>stableStringify(entry)).join("|")}`;if(!valueMatchesSchemaType(value,schema.type))return`${path} must match configured type ${String(schema.type)}`;if(typeof value=="string"){if(schema.min_length!==void 0&&value.length<schema.min_length)return`${path} must contain at least ${schema.min_length} characters`;if(schema.format==="date-time"&&!isRfc3339DateTime(value))return`${path} must be an RFC 3339 date-time`}}function runtimeFieldArraySchemaError(value,schema,path,depth){if(Array.isArray(value)){if(schema.min_items!==void 0&&value.length<schema.min_items)return`${path} must contain at least ${schema.min_items} items`;if(schema.items)for(const[index,entry]of value.entries()){const error=runtimeFieldSchemaError(entry,schema.items,`${path}[${index}]`,depth+1);if(error)return error}}}function runtimeFieldObjectSchemaError(value,schema,path,depth){if(typeof value!="object"||value===null||Array.isArray(value))return;const record=value;for(const key of schema.required??[])if(!Object.hasOwn(record,key))return`${path}.${key} is required`;for(const[key,entry]of Object.entries(record)){const propertySchema=schema.properties?.[key];if(!propertySchema){if(schema.additional_properties===!1)return`${path}.${key} is not allowed`;continue}const error=runtimeFieldSchemaError(entry,propertySchema,`${path}.${key}`,depth+1);if(error)return error}}function runtimeFieldSchemaError(value,schema,path,depth=0){if(depth>MAX_VALUE_SCHEMA_DEPTH)return`${path} value schema exceeds maximum depth`;const directError=runtimeFieldPrimitiveSchemaError(value,schema,path);if(directError)return directError;const arrayError=runtimeFieldArraySchemaError(value,schema,path,depth);if(arrayError)return arrayError;const objectError=runtimeFieldObjectSchemaError(value,schema,path,depth);if(objectError)return objectError;if(!schema.one_of)return;let matches=0;for(const candidate of schema.one_of)if(runtimeFieldSchemaError(value,candidate,path,depth+1)===void 0&&(matches+=1,matches>1))break;return matches===1?void 0:`${path} must match exactly one configured schema variant`}function validateRuntimeFieldValue(definition,value,label){if(!definition.value_schema||value===void 0)return value;const error=runtimeFieldSchemaError(value,definition.value_schema,label);if(error)throw new PmCliError(error,EXIT_CODE.USAGE);return value}function coerceRuntimeFieldValue(definition,rawValue,labelOverride){const label=labelOverride??`--${definition.cli_flag}`;if(definition.type==="array"||definition.type==="object"){const containerRaw=Array.isArray(rawValue)?rawValue[rawValue.length-1]:rawValue;return containerRaw===void 0?void 0:validateRuntimeFieldValue(definition,parseJsonContainerValue(containerRaw,label,definition.type),label)}if(definition.repeatable||definition.type==="string_array"){const values=normalizeStringArrayValue(rawValue);return definition.type==="number"?validateRuntimeFieldValue(definition,values.map(value=>parseNumberValue(value,label)),label):definition.type==="boolean"?validateRuntimeFieldValue(definition,values.map(value=>parseBooleanValue(value,label)),label):validateRuntimeFieldValue(definition,values,label)}const scalarRaw=Array.isArray(rawValue)?rawValue[rawValue.length-1]:rawValue;if(scalarRaw!==void 0)return definition.type==="number"?validateRuntimeFieldValue(definition,parseNumberValue(scalarRaw,label),label):definition.type==="boolean"?validateRuntimeFieldValue(definition,parseBooleanValue(scalarRaw,label),label):validateRuntimeFieldValue(definition,typeof scalarRaw=="string"?scalarRaw:String(scalarRaw),label)}function shouldRequireFieldOnCreate(definition,itemTypeName){return!definition.required&&!definition.required_on_create?!1:definition.required_types.length===0?!0:itemTypeName?definition.required_types.map(value=>value.toLowerCase()).includes(itemTypeName.trim().toLowerCase()):!1}function collectRuntimeCreateFieldValues(options,fieldRegistry,itemTypeName){const values={},missingRequiredFlags=[];for(const definition of fieldRegistry.command_to_fields.get("create")??[]){const rawValue=readRuntimeFieldOptionValue(options,definition);if(rawValue===void 0){shouldRequireFieldOnCreate(definition,itemTypeName)&&missingRequiredFlags.push(`--${definition.cli_flag}`);continue}values[definition.metadata_key]=coerceRuntimeFieldValue(definition,rawValue)}return{values,missing_required_flags:[...new Set(missingRequiredFlags)].sort((left,right)=>left.localeCompare(right))}}function collectRuntimeUpdateFieldValues(options,fieldRegistry,commands=["update"]){const values={},definitions=(commands??["update"]).flatMap(command=>fieldRegistry.command_to_fields.get(command)??[]),seen=new Set;for(const definition of definitions){const rawValue=readRuntimeFieldOptionValue(options,definition);rawValue!==void 0&&(seen.has(definition.metadata_key)||(seen.add(definition.metadata_key),values[definition.metadata_key]=coerceRuntimeFieldValue(definition,rawValue)))}return values}export{coerceRuntimeFieldValue,collectRuntimeCreateFieldValues,collectRuntimeUpdateFieldValues,readRuntimeFieldOptionValue};
2
2
  //# sourceMappingURL=runtime-field-values.js.map
@@ -1,3 +1,3 @@
1
- !(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]="5e083565-3e07-5fb3-81ce-c392feaa8630")}catch(e2){}})();import path from"node:path";import{pathExists,readFileIfExists}from"../fs/fs-utils.js";import{createFileAtomic}from"../fs/atomic-create.js";import{DEFAULT_STATUS_DEFINITIONS,DEFAULT_WORKFLOW_DEFINITION}from"../shared/constants.js";import{RUNTIME_FIELD_COMMAND_VALUES,RUNTIME_FIELD_TYPE_VALUES,RUNTIME_STATUS_ROLE_VALUES,RUNTIME_UNKNOWN_FIELD_POLICY_VALUES,STATUS_VALUES}from"../../types/index.js";import{normalizeStatusToken}from"./status-token.js";const DEFAULT_RUNTIME_SCHEMA_FILE_PATHS=Object.freeze({types:"schema/types.json",statuses:"schema/statuses.json",fields:"schema/fields.json",workflows:"schema/workflows.json"});const DEFAULT_RUNTIME_WORKFLOW=DEFAULT_WORKFLOW_DEFINITION;const DEFAULT_RUNTIME_STATUS_DEFINITIONS=DEFAULT_STATUS_DEFINITIONS;const DEFAULT_RUNTIME_FIELD_COMMANDS=["create","update"];const RUNTIME_STATUS_ROLE_SET=new Set(RUNTIME_STATUS_ROLE_VALUES);const RUNTIME_FIELD_TYPE_SET=new Set(RUNTIME_FIELD_TYPE_VALUES);const RUNTIME_FIELD_COMMAND_SET=new Set(RUNTIME_FIELD_COMMAND_VALUES);const RUNTIME_UNKNOWN_FIELD_POLICY_SET=new Set(RUNTIME_UNKNOWN_FIELD_POLICY_VALUES);const RUNTIME_FIELD_VALUE_TYPE_SET=new Set(["string","number","boolean","array","object"]);const MAX_RUNTIME_FIELD_VALUE_SCHEMA_DEPTH=16;function isPlainObject(value){return typeof value==="object"&&value!==null&&!Array.isArray(value)}const RUNTIME_FIELD_VALUE_SCHEMA_SHAPE_VALIDATORS=[schema=>schema.type===void 0||typeof schema.type==="string"&&RUNTIME_FIELD_VALUE_TYPE_SET.has(schema.type),schema=>!Object.hasOwn(schema,"const")||isStructuredJsonValue(schema.const),schema=>schema.enum===void 0||Array.isArray(schema.enum)&&schema.enum.every(entry=>isStructuredJsonValue(entry)),schema=>schema.min_length===void 0||Number.isInteger(schema.min_length)&&schema.min_length>=0,schema=>schema.min_items===void 0||Number.isInteger(schema.min_items)&&schema.min_items>=0,schema=>schema.format===void 0||schema.format==="date-time",schema=>schema.required===void 0||Array.isArray(schema.required)&&schema.required.every(entry=>typeof entry==="string"&&entry.length>0),schema=>schema.additional_properties===void 0||typeof schema.additional_properties==="boolean",schema=>schema.properties===void 0||isPlainObject(schema.properties),schema=>schema.one_of===void 0||Array.isArray(schema.one_of)&&schema.one_of.length>0];function isStructuredJsonValue(value,ancestors=new Set){if(value===null||typeof value==="string"||typeof value==="boolean"){return true}if(typeof value==="number")return Number.isFinite(value);if(typeof value!=="object"||ancestors.has(value))return false;ancestors.add(value);const valid=Array.isArray(value)?value.every(entry=>isStructuredJsonValue(entry,ancestors)):Object.values(value).every(entry=>isStructuredJsonValue(entry,ancestors));ancestors.delete(value);return valid}function normalizeRuntimeFieldValueSchema(value,depth=0,ancestors=new Set){if(!isPlainObject(value)||depth>MAX_RUNTIME_FIELD_VALUE_SCHEMA_DEPTH||ancestors.has(value)){return void 0}ancestors.add(value);const schema=value;const type=schema.type;const enumValues=schema.enum;const oneOf=schema.one_of;const properties=schema.properties;const items=schema.items;const required=schema.required;const minLength=schema.min_length;const minItems=schema.min_items;const format=schema.format;const additionalProperties=schema.additional_properties;if(!RUNTIME_FIELD_VALUE_SCHEMA_SHAPE_VALIDATORS.every(check=>check(schema))){ancestors.delete(value);return void 0}const normalizedProperties=properties===void 0?void 0:Object.fromEntries(Object.entries(properties).map(([key,entry])=>[key,normalizeRuntimeFieldValueSchema(entry,depth+1,ancestors)]));const normalizedItems=items===void 0?void 0:normalizeRuntimeFieldValueSchema(items,depth+1,ancestors);const normalizedOneOf=oneOf===void 0?void 0:oneOf.map(entry=>normalizeRuntimeFieldValueSchema(entry,depth+1,ancestors));const normalizedNestedSchemas=[...Object.values(normalizedProperties??{}),...items===void 0?[]:[normalizedItems],...normalizedOneOf??[]];if(normalizedNestedSchemas.some(entry=>entry===void 0)){ancestors.delete(value);return void 0}ancestors.delete(value);return Object.fromEntries(Object.entries({type,const:Object.hasOwn(schema,"const")?schema.const:void 0,enum:enumValues,min_length:minLength,min_items:minItems,format,properties:normalizedProperties,required:required===void 0?void 0:[...new Set(required)],additional_properties:additionalProperties,items:normalizedItems,one_of:normalizedOneOf}).filter(([,entry])=>entry!==void 0))}function normalizeStringList(values){const candidates=Array.isArray(values)?values:[];return[...new Set(candidates.map(value=>typeof value==="string"?value.trim():"").filter(value=>value.length>0))].sort((left,right)=>left.localeCompare(right))}function normalizeStatusId(value){if(typeof value!=="string"||value.length===0){return void 0}const normalized=normalizeStatusToken(value);return normalized.length>0?normalized:void 0}function stripFlagPrefix(value){return value.startsWith("--")?value.slice(2):value}function normalizeCliToken(value){return typeof value==="string"?stripFlagPrefix(value.trim().toLowerCase().replaceAll(/[\s_]+/g,"-")):""}function keyToDefaultCliFlag(value){return value.replaceAll("_","-")}function toCamelCase(input){const segments=input.replaceAll(/[^A-Za-z0-9]+/g," ").trim().split(/\s+/).filter(segment=>segment.length>0).map(segment=>segment.toLowerCase());if(segments.length===0){return input}const[first,...rest]=segments;return`${first}${rest.map(segment=>`${segment.slice(0,1).toUpperCase()}${segment.slice(1)}`).join("")}`}function normalizeRuntimeStatusDefinition(definition,fallbackOrder){const id=normalizeStatusId(definition.id);if(!id){return null}const aliases=[...new Set(normalizeStringList(definition.aliases).map(normalizeStatusToken).filter(value=>value.length>0))].sort((left,right)=>left.localeCompare(right));const roles=normalizeStringList(definition.roles).filter(value=>RUNTIME_STATUS_ROLE_SET.has(value));const description=definition.description?.trim();const order=typeof definition.order==="number"&&Number.isFinite(definition.order)?definition.order:fallbackOrder;return{id,aliases,roles,description:description&&description.length>0?description:void 0,order}}function normalizeRuntimeWorkflow(workflow){return{draft_status:normalizeStatusId(workflow?.draft_status),open_status:normalizeStatusId(workflow?.open_status),in_progress_status:normalizeStatusId(workflow?.in_progress_status),blocked_status:normalizeStatusId(workflow?.blocked_status),close_status:normalizeStatusId(workflow?.close_status),canceled_status:normalizeStatusId(workflow?.canceled_status)}}function appendTypeWorkflowPair(record,pair){if(!Array.isArray(pair)||pair.length!==2){return}const from=normalizeStatusToken(pair[0]);const to=normalizeStatusToken(pair[1]);if(from.length===0||to.length===0){return}if(record.pairs.some(candidate=>candidate[0]===from&&candidate[1]===to)){return}record.pairs.push([from,to])}function normalizedTypeWorkflowEntry(entry){const rawType=typeof entry?.type==="string"?entry.type.trim():"";if(rawType.length===0||!Array.isArray(entry?.allowed_transitions)){return null}const record={type:rawType,pairs:[],denyAll:entry.allowed_transitions.length===0};for(const pair of entry.allowed_transitions){appendTypeWorkflowPair(record,pair)}return{typeKey:rawType.toLowerCase(),record}}function normalizeTypeWorkflowDefinitions(workflows){if(!Array.isArray(workflows)||workflows.length===0){return void 0}const byTypeKey=new Map;for(const entry of workflows){const normalized2=normalizedTypeWorkflowEntry(entry);if(normalized2===null){continue}const record=byTypeKey.get(normalized2.typeKey)??normalized2.record;record.denyAll||=normalized2.record.denyAll;for(const pair of normalized2.record.pairs){appendTypeWorkflowPair(record,pair)}byTypeKey.set(normalized2.typeKey,record)}const normalized=[];for(const record of byTypeKey.values()){if(record.pairs.length>0||record.denyAll){normalized.push({type:record.type,allowed_transitions:record.pairs})}}normalized.sort((left,right)=>left.type.localeCompare(right.type));return normalized.length>0?normalized:void 0}function normalizeRuntimeFieldDefinition(definition){const key=normalizeStatusToken(definition.key??"");if(!key){return null}const metadataKey=normalizeStatusToken(definition.metadata_key??definition.front_matter_key??key);const cliFlag=normalizeCliToken(definition.cli_flag??keyToDefaultCliFlag(key));if(!cliFlag){return null}const cliAliases=normalizeStringList(definition.cli_aliases).map(value=>normalizeCliToken(value)).filter(value=>value.length>0&&value!==cliFlag);const typeCandidate=typeof definition.type==="string"?definition.type.trim().toLowerCase():"string";const type=RUNTIME_FIELD_TYPE_SET.has(typeCandidate)?typeCandidate:"string";const commands=(()=>{const normalized=normalizeStringList(definition.commands).filter(value=>RUNTIME_FIELD_COMMAND_SET.has(value));if(normalized.length>0){return normalized}return[...DEFAULT_RUNTIME_FIELD_COMMANDS]})();const description=definition.description?.trim();const requiredTypes=normalizeStringList(definition.required_types);const valueSchema=definition.value_schema===void 0?void 0:normalizeRuntimeFieldValueSchema(definition.value_schema);if(definition.value_schema!==void 0&&valueSchema===void 0){return null}return{key,metadata_key:metadataKey,cli_flag:cliFlag,cli_aliases:cliAliases,description:description&&description.length>0?description:void 0,type,commands,repeatable:[definition.repeatable===true,type==="string_array"].includes(true),required:definition.required===true,required_on_create:definition.required_on_create===true,required_types:requiredTypes,allow_unset:definition.allow_unset!==false,value_schema:valueSchema}}function normalizeRuntimeStatusDefinitions(statusesSource){const dedupedById=new Map;for(const[index,definition]of statusesSource.entries()){const normalized=normalizeRuntimeStatusDefinition(definition,index);if(normalized){dedupedById.set(normalized.id,normalized)}}const values=sortRuntimeStatusDefinitions([...dedupedById.values()]);if(values.length>0){return values}return sortRuntimeStatusDefinitions(DEFAULT_RUNTIME_STATUS_DEFINITIONS.map((definition,index)=>normalizeRuntimeStatusDefinition(definition,index)).filter(definition=>definition!==null))}function sortRuntimeStatusDefinitions(definitions){return definitions.sort((left,right)=>left.order===right.order?left.id.localeCompare(right.id):left.order-right.order)}function normalizeRuntimeFieldDefinitions(fieldsSource){const dedupedByKey=new Map;for(const definition of fieldsSource??[]){const normalized=normalizeRuntimeFieldDefinition(definition);if(normalized){dedupedByKey.set(normalized.key,normalized)}}return[...dedupedByKey.values()].sort((left,right)=>left.key.localeCompare(right.key))}function serializeRuntimeStatusDefinition(definition){return{id:definition.id,aliases:definition.aliases.length>0?[...definition.aliases]:void 0,roles:definition.roles.length>0?[...definition.roles]:void 0,description:definition.description,order:definition.order}}function serializeRuntimeFieldDefinition(definition){return{key:definition.key,metadata_key:definition.metadata_key!==definition.key?definition.metadata_key:void 0,cli_flag:definition.cli_flag!==keyToDefaultCliFlag(definition.key)?definition.cli_flag:void 0,cli_aliases:definition.cli_aliases.length>0?[...definition.cli_aliases]:void 0,description:definition.description,type:definition.type,commands:[...definition.commands],repeatable:definition.repeatable===true?true:void 0,required:definition.required===true?true:void 0,required_on_create:definition.required_on_create===true?true:void 0,required_types:definition.required_types.length>0?[...definition.required_types]:void 0,allow_unset:definition.allow_unset===false?false:void 0,value_schema:definition.value_schema}}function normalizeUnknownFieldPolicy(policy){const candidate=typeof policy==="string"?policy.trim().toLowerCase():"allow";return RUNTIME_UNKNOWN_FIELD_POLICY_SET.has(candidate)?candidate:"allow"}function normalizeRuntimeSchemaSettings(schema){const files={...DEFAULT_RUNTIME_SCHEMA_FILE_PATHS,...schema?.files};const statusesSource=schema?.statuses&&schema.statuses.length>0?schema.statuses:DEFAULT_RUNTIME_STATUS_DEFINITIONS;const normalizedStatuses=normalizeRuntimeStatusDefinitions(statusesSource);const normalizedFields=normalizeRuntimeFieldDefinitions(schema?.fields);return{version:typeof schema?.version==="number"&&Number.isFinite(schema.version)?Math.floor(schema.version):1,files,statuses:normalizedStatuses.map(serializeRuntimeStatusDefinition),fields:normalizedFields.map(serializeRuntimeFieldDefinition),workflow:{...DEFAULT_RUNTIME_WORKFLOW,...normalizeRuntimeWorkflow(schema?.workflow)},type_workflows:normalizeTypeWorkflowDefinitions(schema?.type_workflows),unknown_field_policy:normalizeUnknownFieldPolicy(schema?.unknown_field_policy)}}function parseOptionalJson(raw,warningKey,warnings){try{return JSON.parse(raw)}catch{warnings.push(warningKey);return void 0}}function readTypeDefinitionsFromSchemaFile(parsed){if(Array.isArray(parsed)){return parsed}if(typeof parsed!=="object"||parsed===null){return void 0}const record=parsed;if(Array.isArray(record.definitions)){return record.definitions}if(typeof record.item_types==="object"&&record.item_types!==null){const itemTypesRecord=record.item_types;if(Array.isArray(itemTypesRecord.definitions)){return itemTypesRecord.definitions}}return void 0}function readStatusesFromSchemaFile(parsed){if(Array.isArray(parsed)){return parsed}if(typeof parsed!=="object"||parsed===null){return void 0}const record=parsed;if(Array.isArray(record.statuses)){return record.statuses}if(Array.isArray(record.definitions)){return record.definitions}return void 0}function readFieldsFromSchemaFile(parsed){if(Array.isArray(parsed)){return parsed}if(typeof parsed!=="object"||parsed===null){return void 0}const record=parsed;if(Array.isArray(record.fields)){return record.fields}if(Array.isArray(record.definitions)){return record.definitions}return void 0}function readWorkflowFromSchemaFile(parsed){if(typeof parsed!=="object"||parsed===null||Array.isArray(parsed)){return void 0}const record=parsed;if(typeof record.workflow==="object"&&record.workflow!==null&&!Array.isArray(record.workflow)){return record.workflow}if(typeof record.workflows==="object"&&record.workflows!==null&&!Array.isArray(record.workflows)){return record.workflows}return record}function readTypeWorkflowsFromSchemaFile(parsed){if(typeof parsed!=="object"||parsed===null||Array.isArray(parsed)){return void 0}const record=parsed;if(Array.isArray(record.type_workflows)){return record.type_workflows}return void 0}function filePathForSchemaSection(pmRoot,configuredPath,fallbackPath){const normalized=configuredPath?.trim()||fallbackPath;if(path.isAbsolute(normalized)){return normalized}return path.join(pmRoot,normalized)}function resolveItemTypesFilePath(pmRoot,schema){return filePathForSchemaSection(pmRoot,schema.files.types,DEFAULT_RUNTIME_SCHEMA_FILE_PATHS.types)}async function ensureRuntimeSchemaFileScaffold(pmRoot,schema){const normalizedSchema=normalizeRuntimeSchemaSettings(schema);const specs=[{path:filePathForSchemaSection(pmRoot,normalizedSchema.files.types,DEFAULT_RUNTIME_SCHEMA_FILE_PATHS.types),seed:{definitions:[]}},{path:filePathForSchemaSection(pmRoot,normalizedSchema.files.statuses,DEFAULT_RUNTIME_SCHEMA_FILE_PATHS.statuses),seed:{statuses:DEFAULT_RUNTIME_STATUS_DEFINITIONS}},{path:filePathForSchemaSection(pmRoot,normalizedSchema.files.fields,DEFAULT_RUNTIME_SCHEMA_FILE_PATHS.fields),seed:{fields:[]}},{path:filePathForSchemaSection(pmRoot,normalizedSchema.files.workflows,DEFAULT_RUNTIME_SCHEMA_FILE_PATHS.workflows),seed:{workflow:DEFAULT_RUNTIME_WORKFLOW}}];const createdPaths=[];for(const spec of specs){if(await pathExists(spec.path)){continue}if(await createFileAtomic(spec.path,`${JSON.stringify(spec.seed,null,2)}
2
- `)){createdPaths.push(spec.path)}}return{created_paths:createdPaths}}async function loadRuntimeSchemaFromOptionalFiles(pmRoot,schema){const normalizedSchema=normalizeRuntimeSchemaSettings(schema);const warnings=[];const typeFilePath=filePathForSchemaSection(pmRoot,normalizedSchema.files.types,DEFAULT_RUNTIME_SCHEMA_FILE_PATHS.types);const statusFilePath=filePathForSchemaSection(pmRoot,normalizedSchema.files.statuses,DEFAULT_RUNTIME_SCHEMA_FILE_PATHS.statuses);const fieldsFilePath=filePathForSchemaSection(pmRoot,normalizedSchema.files.fields,DEFAULT_RUNTIME_SCHEMA_FILE_PATHS.fields);const workflowsFilePath=filePathForSchemaSection(pmRoot,normalizedSchema.files.workflows,DEFAULT_RUNTIME_SCHEMA_FILE_PATHS.workflows);let loadedTypeDefinitions;let loadedStatuses;let loadedFields;let loadedWorkflow;let loadedTypeWorkflows;const readAndParse=async(targetPath,warningKey)=>{const raw=await readFileIfExists(targetPath);if(raw===null){return void 0}return parseOptionalJson(raw,warningKey,warnings)};const parsedTypes=await readAndParse(typeFilePath,"runtime_schema_types_invalid_json");if(parsedTypes!==void 0){loadedTypeDefinitions=readTypeDefinitionsFromSchemaFile(parsedTypes);if(loadedTypeDefinitions===void 0){warnings.push("runtime_schema_types_invalid_shape")}}const parsedStatuses=await readAndParse(statusFilePath,"runtime_schema_statuses_invalid_json");if(parsedStatuses!==void 0){loadedStatuses=readStatusesFromSchemaFile(parsedStatuses);if(loadedStatuses===void 0){warnings.push("runtime_schema_statuses_invalid_shape")}}const parsedFields=await readAndParse(fieldsFilePath,"runtime_schema_fields_invalid_json");if(parsedFields!==void 0){loadedFields=readFieldsFromSchemaFile(parsedFields);if(loadedFields===void 0){warnings.push("runtime_schema_fields_invalid_shape")}}const parsedWorkflow=await readAndParse(workflowsFilePath,"runtime_schema_workflows_invalid_json");if(parsedWorkflow!==void 0){loadedWorkflow=readWorkflowFromSchemaFile(parsedWorkflow);if(loadedWorkflow===void 0){warnings.push("runtime_schema_workflows_invalid_shape")}loadedTypeWorkflows=readTypeWorkflowsFromSchemaFile(parsedWorkflow)}const mergedSchema=normalizeRuntimeSchemaSettings({...normalizedSchema,statuses:[...normalizedSchema.statuses,...loadedStatuses??[]],fields:[...normalizedSchema.fields,...loadedFields??[]],workflow:{...normalizedSchema.workflow,...loadedWorkflow},type_workflows:[...normalizedSchema.type_workflows??[],...loadedTypeWorkflows??[]]});return{schema:mergedSchema,type_definitions_from_file:loadedTypeDefinitions,warnings,created_paths:[]}}function preferredStatusForRole(definitions,role,fallbackValues,fallbackFirst=false){const normalizedFallbacks=fallbackValues.map(value=>normalizeStatusId(value)).filter(value=>typeof value==="string");const fallbackMatch=normalizedFallbacks.find(normalized=>definitions.some(definition=>definition.id===normalized));if(fallbackFirst&&fallbackMatch!==void 0){return fallbackMatch}const withRole=definitions.find(definition=>definition.roles.includes(role));if(withRole!==void 0){return withRole.id}return fallbackMatch??definitions[0]?.id}function buildRuntimeStatusIndexes(definitions){const aliasToId=new Map;const byId=new Map;for(const definition of definitions){byId.set(definition.id,definition);aliasToId.set(definition.id,definition.id);aliasToId.set(definition.id.replaceAll("_","-"),definition.id);aliasToId.set(definition.id.replaceAll("_"," "),definition.id);for(const alias of definition.aliases){aliasToId.set(alias,definition.id);aliasToId.set(alias.replaceAll("_","-"),definition.id);aliasToId.set(alias.replaceAll("_"," "),definition.id)}}return{aliasToId,byId}}function buildRuntimeStatusRoleSets(definitions){const result={activeStatuses:new Set,blockedStatuses:new Set,draftStatuses:new Set,terminalCanceledStatuses:new Set,terminalDoneStatuses:new Set,terminalStatuses:new Set};for(const definition of definitions){const roles=new Set(definition.roles);if(roles.has("terminal")||roles.has("terminal_done")||roles.has("terminal_canceled")){result.terminalStatuses.add(definition.id)}if(roles.has("terminal_done"))result.terminalDoneStatuses.add(definition.id);if(roles.has("terminal_canceled")){result.terminalCanceledStatuses.add(definition.id)}if(roles.has("active"))result.activeStatuses.add(definition.id);if(roles.has("blocked"))result.blockedStatuses.add(definition.id);if(roles.has("draft"))result.draftStatuses.add(definition.id)}return result}function resolveRuntimeStatusRegistry(schema){const normalizedSchema=normalizeRuntimeSchemaSettings(schema);const definitions=normalizedSchema.statuses.map((definition,index)=>normalizeRuntimeStatusDefinition(definition,index)).filter(definition=>definition!==null);const{aliasToId,byId}=buildRuntimeStatusIndexes(definitions);const{activeStatuses,blockedStatuses,draftStatuses,terminalCanceledStatuses,terminalDoneStatuses,terminalStatuses}=buildRuntimeStatusRoleSets(definitions);const workflow=normalizedSchema.workflow;const openStatus=normalizeStatusId(workflow.open_status)??preferredStatusForRole(definitions,"default_open",["open","in_progress",STATUS_VALUES[0]]);const inProgressStatus=normalizeStatusId(workflow.in_progress_status)??preferredStatusForRole(definitions,"active",["in_progress","in-progress",openStatus],true);const blockedStatus=normalizeStatusId(workflow.blocked_status)??preferredStatusForRole(definitions,"blocked",["blocked"]);const closeStatus=normalizeStatusId(workflow.close_status)??preferredStatusForRole(definitions,"default_close",["closed","done","complete"]);const canceledStatus=normalizeStatusId(workflow.canceled_status)??preferredStatusForRole(definitions,"default_cancel",["canceled","cancelled"]);return{definitions,by_id:byId,alias_to_id:aliasToId,terminal_statuses:terminalStatuses,terminal_done_statuses:terminalDoneStatuses,terminal_canceled_statuses:terminalCanceledStatuses,active_statuses:activeStatuses,blocked_statuses:blockedStatuses,draft_statuses:draftStatuses,open_status:openStatus,in_progress_status:inProgressStatus,blocked_status:blockedStatus,close_status:closeStatus,canceled_status:canceledStatus}}function normalizeStatusInputWithRegistry(value,registry){const normalized=normalizeStatusToken(value);if(!normalized){return void 0}return registry.alias_to_id.get(normalized)}function resolveRuntimeFieldRegistry(schema){const normalizedSchema=normalizeRuntimeSchemaSettings(schema);const dedupedByKey=new Map;const normalizedFields=normalizedSchema.fields.map(definition=>normalizeRuntimeFieldDefinition(definition)).filter(definition=>definition!==null);for(const normalized of normalizedFields){dedupedByKey.set(normalized.key,normalized)}const definitions=[...dedupedByKey.values()].sort((left,right)=>left.key.localeCompare(right.key));const byKey=new Map;const byCliToken=new Map;const commandToFields=new Map;for(const definition of definitions){byKey.set(definition.key,definition);byCliToken.set(definition.cli_flag,definition);for(const alias of definition.cli_aliases){byCliToken.set(alias,definition)}for(const command of definition.commands){const existing=commandToFields.get(command)??[];existing.push(definition);commandToFields.set(command,existing)}}for(const[command,fieldDefinitions]of commandToFields.entries()){fieldDefinitions.sort((left,right)=>left.key.localeCompare(right.key));commandToFields.set(command,fieldDefinitions)}return{definitions,by_key:byKey,by_cli_token:byCliToken,command_to_fields:commandToFields}}function runtimeFieldOptionTarget(field){return toCamelCase(field.key)}function statusIsTerminal(status,registry){const normalized=normalizeStatusInputWithRegistry(status,registry);if(!normalized){return false}return registry.terminal_statuses.has(normalized)}export{DEFAULT_RUNTIME_SCHEMA_FILE_PATHS,DEFAULT_RUNTIME_STATUS_DEFINITIONS,DEFAULT_RUNTIME_WORKFLOW,ensureRuntimeSchemaFileScaffold,filePathForSchemaSection,loadRuntimeSchemaFromOptionalFiles,normalizeRuntimeSchemaSettings,normalizeStatusInputWithRegistry,resolveItemTypesFilePath,resolveRuntimeFieldRegistry,resolveRuntimeStatusRegistry,runtimeFieldOptionTarget,statusIsTerminal};
1
+ (function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="6e07b1b6-1757-54dd-8833-9d3f984ccf79")}catch{}})();import path from"node:path";import{pathExists,readFileIfExists}from"../fs/fs-utils.js";import{createFileAtomic}from"../fs/atomic-create.js";import{DEFAULT_STATUS_DEFINITIONS,DEFAULT_WORKFLOW_DEFINITION}from"../shared/constants.js";import{RUNTIME_FIELD_COMMAND_VALUES,RUNTIME_FIELD_TYPE_VALUES,RUNTIME_STATUS_ROLE_VALUES,RUNTIME_UNKNOWN_FIELD_POLICY_VALUES,STATUS_VALUES}from"../../types/index.js";import{normalizeStatusToken}from"./status-token.js";const DEFAULT_RUNTIME_SCHEMA_FILE_PATHS=Object.freeze({types:"schema/types.json",statuses:"schema/statuses.json",fields:"schema/fields.json",workflows:"schema/workflows.json"}),DEFAULT_RUNTIME_WORKFLOW=DEFAULT_WORKFLOW_DEFINITION,DEFAULT_RUNTIME_STATUS_DEFINITIONS=DEFAULT_STATUS_DEFINITIONS,DEFAULT_RUNTIME_FIELD_COMMANDS=["create","update"],RUNTIME_STATUS_ROLE_SET=new Set(RUNTIME_STATUS_ROLE_VALUES),RUNTIME_FIELD_TYPE_SET=new Set(RUNTIME_FIELD_TYPE_VALUES),RUNTIME_FIELD_COMMAND_SET=new Set(RUNTIME_FIELD_COMMAND_VALUES),RUNTIME_UNKNOWN_FIELD_POLICY_SET=new Set(RUNTIME_UNKNOWN_FIELD_POLICY_VALUES),RUNTIME_FIELD_VALUE_TYPE_SET=new Set(["string","number","boolean","array","object"]),MAX_RUNTIME_FIELD_VALUE_SCHEMA_DEPTH=16;function isPlainObject(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}const RUNTIME_FIELD_VALUE_SCHEMA_SHAPE_VALIDATORS=[schema=>schema.type===void 0||typeof schema.type=="string"&&RUNTIME_FIELD_VALUE_TYPE_SET.has(schema.type),schema=>!Object.hasOwn(schema,"const")||isStructuredJsonValue(schema.const),schema=>schema.enum===void 0||Array.isArray(schema.enum)&&schema.enum.every(entry=>isStructuredJsonValue(entry)),schema=>schema.min_length===void 0||Number.isInteger(schema.min_length)&&schema.min_length>=0,schema=>schema.min_items===void 0||Number.isInteger(schema.min_items)&&schema.min_items>=0,schema=>schema.format===void 0||schema.format==="date-time",schema=>schema.required===void 0||Array.isArray(schema.required)&&schema.required.every(entry=>typeof entry=="string"&&entry.length>0),schema=>schema.additional_properties===void 0||typeof schema.additional_properties=="boolean",schema=>schema.properties===void 0||isPlainObject(schema.properties),schema=>schema.one_of===void 0||Array.isArray(schema.one_of)&&schema.one_of.length>0];function isStructuredJsonValue(value,ancestors=new Set){if(value===null||typeof value=="string"||typeof value=="boolean")return!0;if(typeof value=="number")return Number.isFinite(value);if(typeof value!="object"||ancestors.has(value))return!1;ancestors.add(value);const valid=Array.isArray(value)?value.every(entry=>isStructuredJsonValue(entry,ancestors)):Object.values(value).every(entry=>isStructuredJsonValue(entry,ancestors));return ancestors.delete(value),valid}function normalizeRuntimeFieldValueSchema(value,depth=0,ancestors=new Set){if(!isPlainObject(value)||depth>MAX_RUNTIME_FIELD_VALUE_SCHEMA_DEPTH||ancestors.has(value))return;ancestors.add(value);const schema=value,type=schema.type,enumValues=schema.enum,oneOf=schema.one_of,properties=schema.properties,items=schema.items,required=schema.required,minLength=schema.min_length,minItems=schema.min_items,format=schema.format,additionalProperties=schema.additional_properties;if(!RUNTIME_FIELD_VALUE_SCHEMA_SHAPE_VALIDATORS.every(check=>check(schema))){ancestors.delete(value);return}const normalizedProperties=properties===void 0?void 0:Object.fromEntries(Object.entries(properties).map(([key,entry])=>[key,normalizeRuntimeFieldValueSchema(entry,depth+1,ancestors)])),normalizedItems=items===void 0?void 0:normalizeRuntimeFieldValueSchema(items,depth+1,ancestors),normalizedOneOf=oneOf===void 0?void 0:oneOf.map(entry=>normalizeRuntimeFieldValueSchema(entry,depth+1,ancestors));if([...Object.values(normalizedProperties??{}),...items===void 0?[]:[normalizedItems],...normalizedOneOf??[]].some(entry=>entry===void 0)){ancestors.delete(value);return}return ancestors.delete(value),Object.fromEntries(Object.entries({type,const:Object.hasOwn(schema,"const")?schema.const:void 0,enum:enumValues,min_length:minLength,min_items:minItems,format,properties:normalizedProperties,required:required===void 0?void 0:[...new Set(required)],additional_properties:additionalProperties,items:normalizedItems,one_of:normalizedOneOf}).filter(([,entry])=>entry!==void 0))}function normalizeStringList(values){const candidates=Array.isArray(values)?values:[];return[...new Set(candidates.map(value=>typeof value=="string"?value.trim():"").filter(value=>value.length>0))].sort((left,right)=>left.localeCompare(right))}function normalizeStatusId(value){if(typeof value!="string"||value.length===0)return;const normalized=normalizeStatusToken(value);return normalized.length>0?normalized:void 0}function stripFlagPrefix(value){return value.startsWith("--")?value.slice(2):value}function normalizeCliToken(value){return typeof value=="string"?stripFlagPrefix(value.trim().toLowerCase().replaceAll(/[\s_]+/g,"-")):""}function keyToDefaultCliFlag(value){return value.replaceAll("_","-")}function toCamelCase(input){const segments=input.replaceAll(/[^A-Za-z0-9]+/g," ").trim().split(/\s+/).filter(segment=>segment.length>0).map(segment=>segment.toLowerCase());if(segments.length===0)return input;const[first,...rest]=segments;return`${first}${rest.map(segment=>`${segment.slice(0,1).toUpperCase()}${segment.slice(1)}`).join("")}`}function normalizeRuntimeStatusDefinition(definition,fallbackOrder){const id=normalizeStatusId(definition.id);if(!id)return null;const aliases=[...new Set(normalizeStringList(definition.aliases).map(normalizeStatusToken).filter(value=>value.length>0))].sort((left,right)=>left.localeCompare(right)),roles=normalizeStringList(definition.roles).filter(value=>RUNTIME_STATUS_ROLE_SET.has(value)),description=definition.description?.trim(),order=typeof definition.order=="number"&&Number.isFinite(definition.order)?definition.order:fallbackOrder;return{id,aliases,roles,description:description&&description.length>0?description:void 0,order}}function normalizeRuntimeWorkflow(workflow){return{draft_status:normalizeStatusId(workflow?.draft_status),open_status:normalizeStatusId(workflow?.open_status),in_progress_status:normalizeStatusId(workflow?.in_progress_status),blocked_status:normalizeStatusId(workflow?.blocked_status),close_status:normalizeStatusId(workflow?.close_status),canceled_status:normalizeStatusId(workflow?.canceled_status)}}function appendTypeWorkflowPair(record,pair){if(!Array.isArray(pair)||pair.length!==2)return;const from=normalizeStatusToken(pair[0]),to=normalizeStatusToken(pair[1]);from.length===0||to.length===0||record.pairs.some(candidate=>candidate[0]===from&&candidate[1]===to)||record.pairs.push([from,to])}function normalizedTypeWorkflowEntry(entry){const rawType=typeof entry?.type=="string"?entry.type.trim():"";if(rawType.length===0||!Array.isArray(entry?.allowed_transitions))return null;const record={type:rawType,pairs:[],denyAll:entry.allowed_transitions.length===0};for(const pair of entry.allowed_transitions)appendTypeWorkflowPair(record,pair);return{typeKey:rawType.toLowerCase(),record}}function normalizeTypeWorkflowDefinitions(workflows){if(!Array.isArray(workflows)||workflows.length===0)return;const byTypeKey=new Map;for(const entry of workflows){const normalized2=normalizedTypeWorkflowEntry(entry);if(normalized2===null)continue;const record=byTypeKey.get(normalized2.typeKey)??normalized2.record;record.denyAll||=normalized2.record.denyAll;for(const pair of normalized2.record.pairs)appendTypeWorkflowPair(record,pair);byTypeKey.set(normalized2.typeKey,record)}const normalized=[];for(const record of byTypeKey.values())(record.pairs.length>0||record.denyAll)&&normalized.push({type:record.type,allowed_transitions:record.pairs});return normalized.sort((left,right)=>left.type.localeCompare(right.type)),normalized.length>0?normalized:void 0}function normalizeRuntimeFieldDefinition(definition){const key=normalizeStatusToken(definition.key??"");if(!key)return null;const metadataKey=normalizeStatusToken(definition.metadata_key??definition.front_matter_key??key),cliFlag=normalizeCliToken(definition.cli_flag??keyToDefaultCliFlag(key));if(!cliFlag)return null;const cliAliases=normalizeStringList(definition.cli_aliases).map(value=>normalizeCliToken(value)).filter(value=>value.length>0&&value!==cliFlag),typeCandidate=typeof definition.type=="string"?definition.type.trim().toLowerCase():"string",type=RUNTIME_FIELD_TYPE_SET.has(typeCandidate)?typeCandidate:"string",commands=(()=>{const normalized=normalizeStringList(definition.commands).filter(value=>RUNTIME_FIELD_COMMAND_SET.has(value));return normalized.length>0?normalized:[...DEFAULT_RUNTIME_FIELD_COMMANDS]})(),description=definition.description?.trim(),requiredTypes=normalizeStringList(definition.required_types),valueSchema=definition.value_schema===void 0?void 0:normalizeRuntimeFieldValueSchema(definition.value_schema);return definition.value_schema!==void 0&&valueSchema===void 0?null:{key,metadata_key:metadataKey,cli_flag:cliFlag,cli_aliases:cliAliases,description:description&&description.length>0?description:void 0,type,commands,repeatable:[definition.repeatable===!0,type==="string_array"].includes(!0),required:definition.required===!0,required_on_create:definition.required_on_create===!0,required_types:requiredTypes,allow_unset:definition.allow_unset!==!1,value_schema:valueSchema}}function normalizeRuntimeStatusDefinitions(statusesSource){const dedupedById=new Map;for(const[index,definition]of statusesSource.entries()){const normalized=normalizeRuntimeStatusDefinition(definition,index);normalized&&dedupedById.set(normalized.id,normalized)}const values=sortRuntimeStatusDefinitions([...dedupedById.values()]);return values.length>0?values:sortRuntimeStatusDefinitions(DEFAULT_RUNTIME_STATUS_DEFINITIONS.map((definition,index)=>normalizeRuntimeStatusDefinition(definition,index)).filter(definition=>definition!==null))}function sortRuntimeStatusDefinitions(definitions){return definitions.sort((left,right)=>left.order===right.order?left.id.localeCompare(right.id):left.order-right.order)}function normalizeRuntimeFieldDefinitions(fieldsSource){const dedupedByKey=new Map;for(const definition of fieldsSource??[]){const normalized=normalizeRuntimeFieldDefinition(definition);normalized&&dedupedByKey.set(normalized.key,normalized)}return[...dedupedByKey.values()].sort((left,right)=>left.key.localeCompare(right.key))}function serializeRuntimeStatusDefinition(definition){return{id:definition.id,aliases:definition.aliases.length>0?[...definition.aliases]:void 0,roles:definition.roles.length>0?[...definition.roles]:void 0,description:definition.description,order:definition.order}}function serializeRuntimeFieldDefinition(definition){return{key:definition.key,metadata_key:definition.metadata_key!==definition.key?definition.metadata_key:void 0,cli_flag:definition.cli_flag!==keyToDefaultCliFlag(definition.key)?definition.cli_flag:void 0,cli_aliases:definition.cli_aliases.length>0?[...definition.cli_aliases]:void 0,description:definition.description,type:definition.type,commands:[...definition.commands],repeatable:definition.repeatable===!0?!0:void 0,required:definition.required===!0?!0:void 0,required_on_create:definition.required_on_create===!0?!0:void 0,required_types:definition.required_types.length>0?[...definition.required_types]:void 0,allow_unset:definition.allow_unset===!1?!1:void 0,value_schema:definition.value_schema}}function normalizeUnknownFieldPolicy(policy){const candidate=typeof policy=="string"?policy.trim().toLowerCase():"allow";return RUNTIME_UNKNOWN_FIELD_POLICY_SET.has(candidate)?candidate:"allow"}function normalizeRuntimeSchemaSettings(schema){const files={...DEFAULT_RUNTIME_SCHEMA_FILE_PATHS,...schema?.files},statusesSource=schema?.statuses&&schema.statuses.length>0?schema.statuses:DEFAULT_RUNTIME_STATUS_DEFINITIONS,normalizedStatuses=normalizeRuntimeStatusDefinitions(statusesSource),normalizedFields=normalizeRuntimeFieldDefinitions(schema?.fields);return{version:typeof schema?.version=="number"&&Number.isFinite(schema.version)?Math.floor(schema.version):1,files,statuses:normalizedStatuses.map(serializeRuntimeStatusDefinition),fields:normalizedFields.map(serializeRuntimeFieldDefinition),workflow:{...DEFAULT_RUNTIME_WORKFLOW,...normalizeRuntimeWorkflow(schema?.workflow)},type_workflows:normalizeTypeWorkflowDefinitions(schema?.type_workflows),unknown_field_policy:normalizeUnknownFieldPolicy(schema?.unknown_field_policy)}}function parseOptionalJson(raw,warningKey,warnings){try{return JSON.parse(raw)}catch{warnings.push(warningKey);return}}function readTypeDefinitionsFromSchemaFile(parsed){if(Array.isArray(parsed))return parsed;if(typeof parsed!="object"||parsed===null)return;const record=parsed;if(Array.isArray(record.definitions))return record.definitions;if(typeof record.item_types=="object"&&record.item_types!==null){const itemTypesRecord=record.item_types;if(Array.isArray(itemTypesRecord.definitions))return itemTypesRecord.definitions}}function readStatusesFromSchemaFile(parsed){if(Array.isArray(parsed))return parsed;if(typeof parsed!="object"||parsed===null)return;const record=parsed;if(Array.isArray(record.statuses))return record.statuses;if(Array.isArray(record.definitions))return record.definitions}function readFieldsFromSchemaFile(parsed){if(Array.isArray(parsed))return parsed;if(typeof parsed!="object"||parsed===null)return;const record=parsed;if(Array.isArray(record.fields))return record.fields;if(Array.isArray(record.definitions))return record.definitions}function readWorkflowFromSchemaFile(parsed){if(typeof parsed!="object"||parsed===null||Array.isArray(parsed))return;const record=parsed;return typeof record.workflow=="object"&&record.workflow!==null&&!Array.isArray(record.workflow)?record.workflow:typeof record.workflows=="object"&&record.workflows!==null&&!Array.isArray(record.workflows)?record.workflows:record}function readTypeWorkflowsFromSchemaFile(parsed){if(typeof parsed!="object"||parsed===null||Array.isArray(parsed))return;const record=parsed;if(Array.isArray(record.type_workflows))return record.type_workflows}function filePathForSchemaSection(pmRoot,configuredPath,fallbackPath){const normalized=configuredPath?.trim()||fallbackPath;return path.isAbsolute(normalized)?normalized:path.join(pmRoot,normalized)}function resolveItemTypesFilePath(pmRoot,schema){return filePathForSchemaSection(pmRoot,schema.files.types,DEFAULT_RUNTIME_SCHEMA_FILE_PATHS.types)}async function ensureRuntimeSchemaFileScaffold(pmRoot,schema){const normalizedSchema=normalizeRuntimeSchemaSettings(schema),specs=[{path:filePathForSchemaSection(pmRoot,normalizedSchema.files.types,DEFAULT_RUNTIME_SCHEMA_FILE_PATHS.types),seed:{definitions:[]}},{path:filePathForSchemaSection(pmRoot,normalizedSchema.files.statuses,DEFAULT_RUNTIME_SCHEMA_FILE_PATHS.statuses),seed:{statuses:DEFAULT_RUNTIME_STATUS_DEFINITIONS}},{path:filePathForSchemaSection(pmRoot,normalizedSchema.files.fields,DEFAULT_RUNTIME_SCHEMA_FILE_PATHS.fields),seed:{fields:[]}},{path:filePathForSchemaSection(pmRoot,normalizedSchema.files.workflows,DEFAULT_RUNTIME_SCHEMA_FILE_PATHS.workflows),seed:{workflow:DEFAULT_RUNTIME_WORKFLOW}}],createdPaths=[];for(const spec of specs)await pathExists(spec.path)||await createFileAtomic(spec.path,`${JSON.stringify(spec.seed,null,2)}
2
+ `)&&createdPaths.push(spec.path);return{created_paths:createdPaths}}async function loadRuntimeSchemaFromOptionalFiles(pmRoot,schema){const normalizedSchema=normalizeRuntimeSchemaSettings(schema),warnings=[],typeFilePath=filePathForSchemaSection(pmRoot,normalizedSchema.files.types,DEFAULT_RUNTIME_SCHEMA_FILE_PATHS.types),statusFilePath=filePathForSchemaSection(pmRoot,normalizedSchema.files.statuses,DEFAULT_RUNTIME_SCHEMA_FILE_PATHS.statuses),fieldsFilePath=filePathForSchemaSection(pmRoot,normalizedSchema.files.fields,DEFAULT_RUNTIME_SCHEMA_FILE_PATHS.fields),workflowsFilePath=filePathForSchemaSection(pmRoot,normalizedSchema.files.workflows,DEFAULT_RUNTIME_SCHEMA_FILE_PATHS.workflows);let loadedTypeDefinitions,loadedStatuses,loadedFields,loadedWorkflow,loadedTypeWorkflows;const readAndParse=async(targetPath,warningKey)=>{const raw=await readFileIfExists(targetPath);if(raw!==null)return parseOptionalJson(raw,warningKey,warnings)},parsedTypes=await readAndParse(typeFilePath,"runtime_schema_types_invalid_json");parsedTypes!==void 0&&(loadedTypeDefinitions=readTypeDefinitionsFromSchemaFile(parsedTypes),loadedTypeDefinitions===void 0&&warnings.push("runtime_schema_types_invalid_shape"));const parsedStatuses=await readAndParse(statusFilePath,"runtime_schema_statuses_invalid_json");parsedStatuses!==void 0&&(loadedStatuses=readStatusesFromSchemaFile(parsedStatuses),loadedStatuses===void 0&&warnings.push("runtime_schema_statuses_invalid_shape"));const parsedFields=await readAndParse(fieldsFilePath,"runtime_schema_fields_invalid_json");parsedFields!==void 0&&(loadedFields=readFieldsFromSchemaFile(parsedFields),loadedFields===void 0&&warnings.push("runtime_schema_fields_invalid_shape"));const parsedWorkflow=await readAndParse(workflowsFilePath,"runtime_schema_workflows_invalid_json");return parsedWorkflow!==void 0&&(loadedWorkflow=readWorkflowFromSchemaFile(parsedWorkflow),loadedWorkflow===void 0&&warnings.push("runtime_schema_workflows_invalid_shape"),loadedTypeWorkflows=readTypeWorkflowsFromSchemaFile(parsedWorkflow)),{schema:normalizeRuntimeSchemaSettings({...normalizedSchema,statuses:[...normalizedSchema.statuses,...loadedStatuses??[]],fields:[...normalizedSchema.fields,...loadedFields??[]],workflow:{...normalizedSchema.workflow,...loadedWorkflow},type_workflows:[...normalizedSchema.type_workflows??[],...loadedTypeWorkflows??[]]}),type_definitions_from_file:loadedTypeDefinitions,warnings,created_paths:[]}}function preferredStatusForRole(definitions,role,fallbackValues,fallbackFirst=!1){const fallbackMatch=fallbackValues.map(value=>normalizeStatusId(value)).filter(value=>typeof value=="string").find(normalized=>definitions.some(definition=>definition.id===normalized));if(fallbackFirst&&fallbackMatch!==void 0)return fallbackMatch;const withRole=definitions.find(definition=>definition.roles.includes(role));return withRole!==void 0?withRole.id:fallbackMatch??definitions[0]?.id}function buildRuntimeStatusIndexes(definitions){const aliasToId=new Map,byId=new Map;for(const definition of definitions){byId.set(definition.id,definition),aliasToId.set(definition.id,definition.id),aliasToId.set(definition.id.replaceAll("_","-"),definition.id),aliasToId.set(definition.id.replaceAll("_"," "),definition.id);for(const alias of definition.aliases)aliasToId.set(alias,definition.id),aliasToId.set(alias.replaceAll("_","-"),definition.id),aliasToId.set(alias.replaceAll("_"," "),definition.id)}return{aliasToId,byId}}function buildRuntimeStatusRoleSets(definitions){const result={activeStatuses:new Set,blockedStatuses:new Set,draftStatuses:new Set,terminalCanceledStatuses:new Set,terminalDoneStatuses:new Set,terminalStatuses:new Set};for(const definition of definitions){const roles=new Set(definition.roles);(roles.has("terminal")||roles.has("terminal_done")||roles.has("terminal_canceled"))&&result.terminalStatuses.add(definition.id),roles.has("terminal_done")&&result.terminalDoneStatuses.add(definition.id),roles.has("terminal_canceled")&&result.terminalCanceledStatuses.add(definition.id),roles.has("active")&&result.activeStatuses.add(definition.id),roles.has("blocked")&&result.blockedStatuses.add(definition.id),roles.has("draft")&&result.draftStatuses.add(definition.id)}return result}function resolveRuntimeStatusRegistry(schema){const normalizedSchema=normalizeRuntimeSchemaSettings(schema),definitions=normalizedSchema.statuses.map((definition,index)=>normalizeRuntimeStatusDefinition(definition,index)).filter(definition=>definition!==null),{aliasToId,byId}=buildRuntimeStatusIndexes(definitions),{activeStatuses,blockedStatuses,draftStatuses,terminalCanceledStatuses,terminalDoneStatuses,terminalStatuses}=buildRuntimeStatusRoleSets(definitions),workflow=normalizedSchema.workflow,openStatus=normalizeStatusId(workflow.open_status)??preferredStatusForRole(definitions,"default_open",["open","in_progress",STATUS_VALUES[0]]),inProgressStatus=normalizeStatusId(workflow.in_progress_status)??preferredStatusForRole(definitions,"active",["in_progress","in-progress",openStatus],!0),blockedStatus=normalizeStatusId(workflow.blocked_status)??preferredStatusForRole(definitions,"blocked",["blocked"]),closeStatus=normalizeStatusId(workflow.close_status)??preferredStatusForRole(definitions,"default_close",["closed","done","complete"]),canceledStatus=normalizeStatusId(workflow.canceled_status)??preferredStatusForRole(definitions,"default_cancel",["canceled","cancelled"]);return{definitions,by_id:byId,alias_to_id:aliasToId,terminal_statuses:terminalStatuses,terminal_done_statuses:terminalDoneStatuses,terminal_canceled_statuses:terminalCanceledStatuses,active_statuses:activeStatuses,blocked_statuses:blockedStatuses,draft_statuses:draftStatuses,open_status:openStatus,in_progress_status:inProgressStatus,blocked_status:blockedStatus,close_status:closeStatus,canceled_status:canceledStatus}}function normalizeStatusInputWithRegistry(value,registry){const normalized=normalizeStatusToken(value);if(normalized)return registry.alias_to_id.get(normalized)}function resolveRuntimeFieldRegistry(schema){const normalizedSchema=normalizeRuntimeSchemaSettings(schema),dedupedByKey=new Map,normalizedFields=normalizedSchema.fields.map(definition=>normalizeRuntimeFieldDefinition(definition)).filter(definition=>definition!==null);for(const normalized of normalizedFields)dedupedByKey.set(normalized.key,normalized);const definitions=[...dedupedByKey.values()].sort((left,right)=>left.key.localeCompare(right.key)),byKey=new Map,byCliToken=new Map,commandToFields=new Map;for(const definition of definitions){byKey.set(definition.key,definition),byCliToken.set(definition.cli_flag,definition);for(const alias of definition.cli_aliases)byCliToken.set(alias,definition);for(const command of definition.commands){const existing=commandToFields.get(command)??[];existing.push(definition),commandToFields.set(command,existing)}}for(const[command,fieldDefinitions]of commandToFields.entries())fieldDefinitions.sort((left,right)=>left.key.localeCompare(right.key)),commandToFields.set(command,fieldDefinitions);return{definitions,by_key:byKey,by_cli_token:byCliToken,command_to_fields:commandToFields}}function runtimeFieldOptionTarget(field){return toCamelCase(field.key)}function statusIsTerminal(status,registry){const normalized=normalizeStatusInputWithRegistry(status,registry);return normalized?registry.terminal_statuses.has(normalized):!1}export{DEFAULT_RUNTIME_SCHEMA_FILE_PATHS,DEFAULT_RUNTIME_STATUS_DEFINITIONS,DEFAULT_RUNTIME_WORKFLOW,ensureRuntimeSchemaFileScaffold,filePathForSchemaSection,loadRuntimeSchemaFromOptionalFiles,normalizeRuntimeSchemaSettings,normalizeStatusInputWithRegistry,resolveItemTypesFilePath,resolveRuntimeFieldRegistry,resolveRuntimeStatusRegistry,runtimeFieldOptionTarget,statusIsTerminal};
3
3
  //# sourceMappingURL=runtime-schema.js.map
@@ -1,3 +1,3 @@
1
- !(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]="e3a1e65b-55d7-5206-b3e7-cac3ac29745c")}catch(e2){}})();import{RUNTIME_STATUS_ROLE_VALUES}from"../../types/index.js";import{DEFAULT_RUNTIME_STATUS_DEFINITIONS}from"./runtime-schema.js";import{normalizeStatusToken}from"./status-token.js";import{normalizeStatusToken as normalizeStatusToken2}from"./status-token.js";const RUNTIME_STATUS_ROLE_SET=new Set(RUNTIME_STATUS_ROLE_VALUES);const BUILTIN_STATUS_IDS=new Set(DEFAULT_RUNTIME_STATUS_DEFINITIONS.map(definition=>normalizeStatusToken(definition.id)).filter(id=>id.length>0));function dedupeTokens(values){const seen=new Set;for(const value of values){const token=normalizeStatusToken(value);if(token.length>0){seen.add(token)}}return[...seen].sort((left,right)=>left.localeCompare(right))}function normalizeAddStatusInput(raw){const id=normalizeStatusToken(raw.id);if(id.length===0){throw new Error("Status id must not be empty.")}if(BUILTIN_STATUS_IDS.has(id)){throw new Error(`Cannot add-status the built-in status "${id}". Built-in statuses are reserved: ${[...BUILTIN_STATUS_IDS].join(", ")}.`)}let roles;if(raw.roles!==void 0){roles=[];const seenRoles=new Set;for(const rawRole of raw.roles){const role=typeof rawRole==="string"?rawRole.trim().toLowerCase():"";if(role.length===0){continue}if(!RUNTIME_STATUS_ROLE_SET.has(role)){throw new Error(`Invalid status role "${rawRole}". Allowed roles: ${RUNTIME_STATUS_ROLE_VALUES.join(", ")}.`)}if(!seenRoles.has(role)){seenRoles.add(role);roles.push(role)}}if(roles.length===0){throw new Error(`Status role must include at least one lifecycle role. Allowed roles: ${RUNTIME_STATUS_ROLE_VALUES.join(", ")}.`)}}const aliases=raw.aliases===void 0?void 0:dedupeTokens(raw.aliases).filter(alias=>alias!==id);const description=raw.description?.trim();const order=typeof raw.order==="number"&&Number.isFinite(raw.order)?Math.trunc(raw.order):void 0;return{id,roles,aliases,description:description&&description.length>0?description:void 0,order}}function selectStatusesArray(parsed){if(Array.isArray(parsed)){return parsed}if(typeof parsed!=="object"||parsed===null){return void 0}const record=parsed;if(Array.isArray(record.statuses)){return record.statuses}if(Array.isArray(record.definitions)){return record.definitions}return void 0}function extractStatusDefinitions(parsed){const candidate=selectStatusesArray(parsed);if(!candidate){return[]}const definitions=[];for(const entry of candidate){if(typeof entry!=="object"||entry===null||Array.isArray(entry)){continue}const record=entry;if(typeof record.id!=="string"||record.id.trim().length===0){continue}definitions.push(record)}return definitions}function parseStatusDefsFile(raw){if(raw===null||raw===void 0||raw.trim().length===0){return{statuses:[]}}let parsed;try{parsed=JSON.parse(raw)}catch{throw new Error("schema/statuses.json contains invalid JSON.")}return{statuses:extractStatusDefinitions(parsed)}}function serializeStatusDefsFile(file){return`${JSON.stringify({statuses:file.statuses},null,2)}
2
- `}function upsertStatusDef(file,input,baseDefinition){const statuses=file.statuses.slice();const existingIndex=statuses.findIndex(definition=>normalizeStatusToken(definition.id)===input.id);const existing=existingIndex>=0?statuses[existingIndex]:baseDefinition;const next={...existing,id:input.id};if(input.roles!==void 0){if(input.roles.length>0){next.roles=[...input.roles]}else if(next.roles!==void 0){delete next.roles}}if(input.aliases!==void 0){if(input.aliases.length>0){next.aliases=[...input.aliases]}else if(next.aliases!==void 0){delete next.aliases}}if(input.description!==void 0){next.description=input.description}if(input.order!==void 0){next.order=input.order}if(existingIndex>=0){statuses[existingIndex]=next}else{statuses.push(next)}return{file:{statuses},definition:next,replaced:existing!==void 0}}function removeStatusDef(file,id){const normalizedId=normalizeStatusToken(id);if(normalizedId.length===0){throw new Error("Status id must not be empty.")}if(BUILTIN_STATUS_IDS.has(normalizedId)){throw new Error(`Cannot remove built-in status "${normalizedId}". Built-in statuses are reserved: ${[...BUILTIN_STATUS_IDS].join(", ")}.`)}const statuses=file.statuses.slice();const existingIndex=statuses.findIndex(definition2=>normalizeStatusToken(definition2.id)===normalizedId);if(existingIndex<0){return{file:{statuses},removed:false}}const[definition]=statuses.splice(existingIndex,1);return{file:{statuses},removed:true,definition}}function assertStatusTokensAvailable(input,resolvedAliasToId){const candidates=[input.id,...input.aliases??[]];for(const candidate of candidates){const token=normalizeStatusToken(candidate);if(token.length===0){continue}const owner=resolvedAliasToId.get(token);if(owner!==void 0&&owner!==input.id){throw new Error(`Status token "${token}" already belongs to status "${owner}". Choose a different id/alias to avoid shadowing it.`)}}}export{BUILTIN_STATUS_IDS,assertStatusTokensAvailable,normalizeAddStatusInput,normalizeStatusToken2 as normalizeStatusToken,parseStatusDefsFile,removeStatusDef,serializeStatusDefsFile,upsertStatusDef};
1
+ (function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="b1e4c04e-0ade-5d24-95e3-b8dca3832c5a")}catch{}})();import{RUNTIME_STATUS_ROLE_VALUES}from"../../types/index.js";import{DEFAULT_RUNTIME_STATUS_DEFINITIONS}from"./runtime-schema.js";import{normalizeStatusToken}from"./status-token.js";import{normalizeStatusToken as normalizeStatusToken2}from"./status-token.js";const RUNTIME_STATUS_ROLE_SET=new Set(RUNTIME_STATUS_ROLE_VALUES),BUILTIN_STATUS_IDS=new Set(DEFAULT_RUNTIME_STATUS_DEFINITIONS.map(definition=>normalizeStatusToken(definition.id)).filter(id=>id.length>0));function dedupeTokens(values){const seen=new Set;for(const value of values){const token=normalizeStatusToken(value);token.length>0&&seen.add(token)}return[...seen].sort((left,right)=>left.localeCompare(right))}function normalizeAddStatusInput(raw){const id=normalizeStatusToken(raw.id);if(id.length===0)throw new Error("Status id must not be empty.");if(BUILTIN_STATUS_IDS.has(id))throw new Error(`Cannot add-status the built-in status "${id}". Built-in statuses are reserved: ${[...BUILTIN_STATUS_IDS].join(", ")}.`);let roles;if(raw.roles!==void 0){roles=[];const seenRoles=new Set;for(const rawRole of raw.roles){const role=typeof rawRole=="string"?rawRole.trim().toLowerCase():"";if(role.length!==0){if(!RUNTIME_STATUS_ROLE_SET.has(role))throw new Error(`Invalid status role "${rawRole}". Allowed roles: ${RUNTIME_STATUS_ROLE_VALUES.join(", ")}.`);seenRoles.has(role)||(seenRoles.add(role),roles.push(role))}}if(roles.length===0)throw new Error(`Status role must include at least one lifecycle role. Allowed roles: ${RUNTIME_STATUS_ROLE_VALUES.join(", ")}.`)}const aliases=raw.aliases===void 0?void 0:dedupeTokens(raw.aliases).filter(alias=>alias!==id),description=raw.description?.trim(),order=typeof raw.order=="number"&&Number.isFinite(raw.order)?Math.trunc(raw.order):void 0;return{id,roles,aliases,description:description&&description.length>0?description:void 0,order}}function selectStatusesArray(parsed){if(Array.isArray(parsed))return parsed;if(typeof parsed!="object"||parsed===null)return;const record=parsed;if(Array.isArray(record.statuses))return record.statuses;if(Array.isArray(record.definitions))return record.definitions}function extractStatusDefinitions(parsed){const candidate=selectStatusesArray(parsed);if(!candidate)return[];const definitions=[];for(const entry of candidate){if(typeof entry!="object"||entry===null||Array.isArray(entry))continue;const record=entry;typeof record.id!="string"||record.id.trim().length===0||definitions.push(record)}return definitions}function parseStatusDefsFile(raw){if(raw==null||raw.trim().length===0)return{statuses:[]};let parsed;try{parsed=JSON.parse(raw)}catch{throw new Error("schema/statuses.json contains invalid JSON.")}return{statuses:extractStatusDefinitions(parsed)}}function serializeStatusDefsFile(file){return`${JSON.stringify({statuses:file.statuses},null,2)}
2
+ `}function upsertStatusDef(file,input,baseDefinition){const statuses=file.statuses.slice(),existingIndex=statuses.findIndex(definition=>normalizeStatusToken(definition.id)===input.id),existing=existingIndex>=0?statuses[existingIndex]:baseDefinition,next={...existing,id:input.id};return input.roles!==void 0&&(input.roles.length>0?next.roles=[...input.roles]:next.roles!==void 0&&delete next.roles),input.aliases!==void 0&&(input.aliases.length>0?next.aliases=[...input.aliases]:next.aliases!==void 0&&delete next.aliases),input.description!==void 0&&(next.description=input.description),input.order!==void 0&&(next.order=input.order),existingIndex>=0?statuses[existingIndex]=next:statuses.push(next),{file:{statuses},definition:next,replaced:existing!==void 0}}function removeStatusDef(file,id){const normalizedId=normalizeStatusToken(id);if(normalizedId.length===0)throw new Error("Status id must not be empty.");if(BUILTIN_STATUS_IDS.has(normalizedId))throw new Error(`Cannot remove built-in status "${normalizedId}". Built-in statuses are reserved: ${[...BUILTIN_STATUS_IDS].join(", ")}.`);const statuses=file.statuses.slice(),existingIndex=statuses.findIndex(definition2=>normalizeStatusToken(definition2.id)===normalizedId);if(existingIndex<0)return{file:{statuses},removed:!1};const[definition]=statuses.splice(existingIndex,1);return{file:{statuses},removed:!0,definition}}function assertStatusTokensAvailable(input,resolvedAliasToId){const candidates=[input.id,...input.aliases??[]];for(const candidate of candidates){const token=normalizeStatusToken(candidate);if(token.length===0)continue;const owner=resolvedAliasToId.get(token);if(owner!==void 0&&owner!==input.id)throw new Error(`Status token "${token}" already belongs to status "${owner}". Choose a different id/alias to avoid shadowing it.`)}}export{BUILTIN_STATUS_IDS,assertStatusTokensAvailable,normalizeAddStatusInput,normalizeStatusToken2 as normalizeStatusToken,parseStatusDefsFile,removeStatusDef,serializeStatusDefsFile,upsertStatusDef};
3
3
  //# sourceMappingURL=status-defs-file.js.map
@@ -1,2 +1,2 @@
1
- !(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]="d66d32f8-a5f2-5068-bcd0-b93094d7c6a4")}catch(e2){}})();import{evictOldestMemoEntries}from"../shared/memo.js";const STATUS_TOKEN_MEMO_MAX_ENTRIES=2e3;const statusTokenMemo=new Map;function normalizeStatusToken(value){if(typeof value!=="string"){return""}const memoized=statusTokenMemo.get(value);if(memoized!==void 0){return memoized}const normalized=value.trim().toLowerCase().replaceAll(/[\s-]+/g,"_");if(statusTokenMemo.size>=STATUS_TOKEN_MEMO_MAX_ENTRIES){evictOldestMemoEntries(statusTokenMemo)}statusTokenMemo.set(value,normalized);return normalized}export{normalizeStatusToken};
1
+ (function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="2075887b-6d4b-582f-9da2-bab13198f9a5")}catch{}})();import{evictOldestMemoEntries}from"../shared/memo.js";const STATUS_TOKEN_MEMO_MAX_ENTRIES=2e3,statusTokenMemo=new Map;function normalizeStatusToken(value){if(typeof value!="string")return"";const memoized=statusTokenMemo.get(value);if(memoized!==void 0)return memoized;const normalized=value.trim().toLowerCase().replaceAll(/[\s-]+/g,"_");return statusTokenMemo.size>=STATUS_TOKEN_MEMO_MAX_ENTRIES&&evictOldestMemoEntries(statusTokenMemo),statusTokenMemo.set(value,normalized),normalized}export{normalizeStatusToken};
2
2
  //# sourceMappingURL=status-token.js.map
@@ -1,2 +1,2 @@
1
- !(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]="96cec314-edb6-5c51-abc4-d028bdc4f10c")}catch(e2){}})();import{matchBuiltinTypeName}from"./item-types-file.js";const PREFIX_PATTERN=/^([A-Za-z][A-Za-z0-9_-]*?)\s*[-:]\s+\S/;function extractTitlePrefix(title){const match=PREFIX_PATTERN.exec(title.trim());if(!match){return void 0}const token=match[1];if(token.length<2){return void 0}if(/^[A-Za-z]\d+$/.test(token)){return void 0}return token.toLowerCase()}function prefixToTypeName(prefix){return prefix.split(/[-_]+/).filter(segment=>segment.length>0).map(segment=>`${segment.slice(0,1).toUpperCase()}${segment.slice(1).toLowerCase()}`).join("")}function inferTypesFromTitles(titles,options={}){const minCount=typeof options.minCount==="number"&&options.minCount>0?Math.trunc(options.minCount):10;const maxExamples=typeof options.maxExamples==="number"&&options.maxExamples>0?Math.trunc(options.maxExamples):3;const byPrefix=new Map;for(const rawTitle of titles){const title=typeof rawTitle==="string"?rawTitle.trim():"";if(title.length===0){continue}const prefix=extractTitlePrefix(title);if(prefix===void 0){continue}const bucket=byPrefix.get(prefix)??{count:0,examples:[]};bucket.count+=1;if(bucket.examples.length<maxExamples){bucket.examples.push(title)}byPrefix.set(prefix,bucket)}const candidates=[];for(const[prefix,bucket]of byPrefix.entries()){if(bucket.count<minCount){continue}const name=prefixToTypeName(prefix);candidates.push({name,prefix,count:bucket.count,examples:bucket.examples,shadows_builtin:matchBuiltinTypeName(name)!==void 0})}candidates.sort((left,right)=>right.count-left.count||left.name.localeCompare(right.name));return candidates}export{extractTitlePrefix,inferTypesFromTitles,prefixToTypeName};
1
+ (function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="4d01ffa0-2cdb-5d22-834e-d23d31403ad6")}catch{}})();import{matchBuiltinTypeName}from"./item-types-file.js";const PREFIX_PATTERN=/^([A-Za-z][A-Za-z0-9_-]*?)\s*[-:]\s+\S/;function extractTitlePrefix(title){const match=PREFIX_PATTERN.exec(title.trim());if(!match)return;const token=match[1];if(!(token.length<2)&&!/^[A-Za-z]\d+$/.test(token))return token.toLowerCase()}function prefixToTypeName(prefix){return prefix.split(/[-_]+/).filter(segment=>segment.length>0).map(segment=>`${segment.slice(0,1).toUpperCase()}${segment.slice(1).toLowerCase()}`).join("")}function inferTypesFromTitles(titles,options={}){const minCount=typeof options.minCount=="number"&&options.minCount>0?Math.trunc(options.minCount):10,maxExamples=typeof options.maxExamples=="number"&&options.maxExamples>0?Math.trunc(options.maxExamples):3,byPrefix=new Map;for(const rawTitle of titles){const title=typeof rawTitle=="string"?rawTitle.trim():"";if(title.length===0)continue;const prefix=extractTitlePrefix(title);if(prefix===void 0)continue;const bucket=byPrefix.get(prefix)??{count:0,examples:[]};bucket.count+=1,bucket.examples.length<maxExamples&&bucket.examples.push(title),byPrefix.set(prefix,bucket)}const candidates=[];for(const[prefix,bucket]of byPrefix.entries()){if(bucket.count<minCount)continue;const name=prefixToTypeName(prefix);candidates.push({name,prefix,count:bucket.count,examples:bucket.examples,shadows_builtin:matchBuiltinTypeName(name)!==void 0})}return candidates.sort((left,right)=>right.count-left.count||left.name.localeCompare(right.name)),candidates}export{extractTitlePrefix,inferTypesFromTitles,prefixToTypeName};
2
2
  //# sourceMappingURL=type-inference.js.map
@@ -1,2 +1,2 @@
1
- !(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]="ebcb45a2-996a-5194-8086-efe882dbcacc")}catch(e2){}})();import{normalizeAddTypeInput}from"./item-types-file.js";const TYPE_PRESET_NAMES=["agile","ops","research"];const TYPE_PRESET_DEFINITIONS={agile:[{name:"Story",description:"User-facing outcome or capability slice expressed from a stakeholder perspective.",defaultStatus:"open",folder:"stories",aliases:["user-story"]},{name:"Spike",description:"Time-boxed investigation used to reduce uncertainty before implementation.",defaultStatus:"open",folder:"spikes",aliases:["research-spike"]}],ops:[{name:"Incident",description:"Operational disruption, degradation, or support escalation with recovery tracking.",defaultStatus:"open",folder:"incidents",aliases:["outage"]},{name:"Runbook",description:"Repeatable operational procedure, diagnostic path, or response playbook.",defaultStatus:"open",folder:"runbooks",aliases:["playbook"]}],research:[{name:"Experiment",description:"Validated-learning activity with hypothesis, method, and outcome tracking.",defaultStatus:"open",folder:"experiments",aliases:["study"]},{name:"Hypothesis",description:"Testable claim or assumption that should be supported, rejected, or refined.",defaultStatus:"open",folder:"hypotheses",aliases:["assumption"]}]};function normalizeTypePresetName(rawValue){if(rawValue===void 0){return void 0}const normalized=rawValue.trim().toLowerCase().replaceAll("-","_");if(normalized.length===0){throw new Error("Type preset name must not be empty.")}if(normalized==="agile"||normalized==="ops"||normalized==="research"){return normalized}throw new Error(`Invalid type preset "${rawValue}". Allowed: ${TYPE_PRESET_NAMES.join(", ")}.`)}function resolveTypePresetDefinitions(preset){return TYPE_PRESET_DEFINITIONS[preset].map(rawDefinition=>normalizeAddTypeInput(rawDefinition))}export{TYPE_PRESET_DEFINITIONS,TYPE_PRESET_NAMES,normalizeTypePresetName,resolveTypePresetDefinitions};
1
+ (function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="abb182c9-6d6c-5be4-a2ad-c91b00a098d0")}catch{}})();import{normalizeAddTypeInput}from"./item-types-file.js";const TYPE_PRESET_NAMES=["agile","ops","research"],TYPE_PRESET_DEFINITIONS={agile:[{name:"Story",description:"User-facing outcome or capability slice expressed from a stakeholder perspective.",defaultStatus:"open",folder:"stories",aliases:["user-story"]},{name:"Spike",description:"Time-boxed investigation used to reduce uncertainty before implementation.",defaultStatus:"open",folder:"spikes",aliases:["research-spike"]}],ops:[{name:"Incident",description:"Operational disruption, degradation, or support escalation with recovery tracking.",defaultStatus:"open",folder:"incidents",aliases:["outage"]},{name:"Runbook",description:"Repeatable operational procedure, diagnostic path, or response playbook.",defaultStatus:"open",folder:"runbooks",aliases:["playbook"]}],research:[{name:"Experiment",description:"Validated-learning activity with hypothesis, method, and outcome tracking.",defaultStatus:"open",folder:"experiments",aliases:["study"]},{name:"Hypothesis",description:"Testable claim or assumption that should be supported, rejected, or refined.",defaultStatus:"open",folder:"hypotheses",aliases:["assumption"]}]};function normalizeTypePresetName(rawValue){if(rawValue===void 0)return;const normalized=rawValue.trim().toLowerCase().replaceAll("-","_");if(normalized.length===0)throw new Error("Type preset name must not be empty.");if(normalized==="agile"||normalized==="ops"||normalized==="research")return normalized;throw new Error(`Invalid type preset "${rawValue}". Allowed: ${TYPE_PRESET_NAMES.join(", ")}.`)}function resolveTypePresetDefinitions(preset){return TYPE_PRESET_DEFINITIONS[preset].map(rawDefinition=>normalizeAddTypeInput(rawDefinition))}export{TYPE_PRESET_DEFINITIONS,TYPE_PRESET_NAMES,normalizeTypePresetName,resolveTypePresetDefinitions};
2
2
  //# sourceMappingURL=type-presets.js.map
@@ -1,2 +1,2 @@
1
- !(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]="ef20c613-623c-5a11-8384-ccf4ee3addde")}catch(e2){}})();import{normalizeStatusToken}from"./status-token.js";import{normalizeStatusToken as normalizeStatusToken2}from"./status-token.js";function normalizeTypeName(value){return typeof value==="string"?value.trim().toLowerCase():""}function resolveStatusId(value,statusRegistry){const token=normalizeStatusToken(value);if(token.length===0){return""}return statusRegistry?.alias_to_id?.get(token)??token}function resolveTypeWorkflows(schema){const rawWorkflows=Array.isArray(schema?.type_workflows)?schema.type_workflows:[];const byType=new Map;for(const entry of rawWorkflows){const type=normalizeTypeName(entry?.type);if(type.length===0){continue}if(!Array.isArray(entry?.allowed_transitions)){continue}const pairs=entry.allowed_transitions;const record=byType.get(type)??{pairs:[],denyAll:false};if(pairs.length===0){record.denyAll=true}for(const pair of pairs){if(!Array.isArray(pair)||pair.length!==2){continue}const from=normalizeStatusToken(pair[0]);const to=normalizeStatusToken(pair[1]);if(from.length===0||to.length===0){continue}if(record.pairs.some(candidate=>candidate[0]===from&&candidate[1]===to)){continue}record.pairs.push([from,to])}byType.set(type,record)}return[...byType.entries()].filter(([,record])=>record.pairs.length>0||record.denyAll).map(([type,record])=>({type,allowed_transitions:record.pairs})).sort((left,right)=>left.type.localeCompare(right.type))}function evaluateTransition(input){const typeName=normalizeTypeName(input.typeName);const matched=input.typeWorkflows.find(workflow=>workflow.type===typeName);if(!matched){return{allowed:true,hasRule:false,allowedTransitions:[]}}const from=resolveStatusId(input.fromStatus,input.statusRegistry);const to=resolveStatusId(input.toStatus,input.statusRegistry);if(from.length>0&&from===to){return{allowed:true,hasRule:true,allowedTransitions:matched.allowed_transitions}}const allowed=matched.allowed_transitions.some(pair=>{const ruleFrom=resolveStatusId(pair[0],input.statusRegistry);const ruleTo=resolveStatusId(pair[1],input.statusRegistry);return ruleFrom===from&&ruleTo===to});return{allowed,hasRule:true,allowedTransitions:matched.allowed_transitions}}function describeAllowedTransitions(allowedTransitions){if(allowedTransitions.length===0){return"(no transitions allowed)"}return allowedTransitions.map(pair=>`${pair[0]} -> ${pair[1]}`).join(", ")}export{describeAllowedTransitions,evaluateTransition,normalizeStatusToken2 as normalizeStatusToken,resolveTypeWorkflows};
1
+ (function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="be646cfd-4742-5e15-9df1-648f1d250a99")}catch{}})();import{normalizeStatusToken}from"./status-token.js";import{normalizeStatusToken as normalizeStatusToken2}from"./status-token.js";function normalizeTypeName(value){return typeof value=="string"?value.trim().toLowerCase():""}function resolveStatusId(value,statusRegistry){const token=normalizeStatusToken(value);return token.length===0?"":statusRegistry?.alias_to_id?.get(token)??token}function resolveTypeWorkflows(schema){const rawWorkflows=Array.isArray(schema?.type_workflows)?schema.type_workflows:[],byType=new Map;for(const entry of rawWorkflows){const type=normalizeTypeName(entry?.type);if(type.length===0||!Array.isArray(entry?.allowed_transitions))continue;const pairs=entry.allowed_transitions,record=byType.get(type)??{pairs:[],denyAll:!1};pairs.length===0&&(record.denyAll=!0);for(const pair of pairs){if(!Array.isArray(pair)||pair.length!==2)continue;const from=normalizeStatusToken(pair[0]),to=normalizeStatusToken(pair[1]);from.length===0||to.length===0||record.pairs.some(candidate=>candidate[0]===from&&candidate[1]===to)||record.pairs.push([from,to])}byType.set(type,record)}return[...byType.entries()].filter(([,record])=>record.pairs.length>0||record.denyAll).map(([type,record])=>({type,allowed_transitions:record.pairs})).sort((left,right)=>left.type.localeCompare(right.type))}function evaluateTransition(input){const typeName=normalizeTypeName(input.typeName),matched=input.typeWorkflows.find(workflow=>workflow.type===typeName);if(!matched)return{allowed:!0,hasRule:!1,allowedTransitions:[]};const from=resolveStatusId(input.fromStatus,input.statusRegistry),to=resolveStatusId(input.toStatus,input.statusRegistry);return from.length>0&&from===to?{allowed:!0,hasRule:!0,allowedTransitions:matched.allowed_transitions}:{allowed:matched.allowed_transitions.some(pair=>{const ruleFrom=resolveStatusId(pair[0],input.statusRegistry),ruleTo=resolveStatusId(pair[1],input.statusRegistry);return ruleFrom===from&&ruleTo===to}),hasRule:!0,allowedTransitions:matched.allowed_transitions}}function describeAllowedTransitions(allowedTransitions){return allowedTransitions.length===0?"(no transitions allowed)":allowedTransitions.map(pair=>`${pair[0]} -> ${pair[1]}`).join(", ")}export{describeAllowedTransitions,evaluateTransition,normalizeStatusToken2 as normalizeStatusToken,resolveTypeWorkflows};
2
2
  //# sourceMappingURL=type-workflows.js.map
@@ -1,3 +1,3 @@
1
- !(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]="22112449-f1ab-5b6b-a9bb-37e5d3c5b83a")}catch(e2){}})();import{spawn}from"node:child_process";import{mkdirSync,rmSync,statSync}from"node:fs";import path from"node:path";import{pathExists,readFileIfExists,writeFileAtomic}from"../fs/fs-utils.js";import{acquireLock}from"../lock/lock.js";import{resolvePmPackageRootFromModule}from"../packages/root.js";import{readSettingsWithMetadata}from"../store/settings.js";import{toErrorMessage}from"../shared/primitives.js";import{resolveAuthor}from"../shared/author.js";import{resolveSettingsWithSemanticRuntimeDefaults}from"./semantic-defaults.js";const REINDEX_LOCK_ID="reindex";const PENDING_QUEUE_REL_PATH="search/pending-refresh.json";const PENDING_QUEUE_GATE_REL_PATH="search/pending-refresh.gate.lock";const PENDING_QUEUE_GATE_STALE_MS=3e4;const SEARCH_REFRESH_INLINE_ENV="PM_SEARCH_REFRESH_INLINE";const SEARCH_REFRESH_CHILD_ENV="PM_SEARCH_REFRESH_CHILD";const SEARCH_REFRESH_RETRY_DELAY_MS=3e4;function parseBooleanTrueLike(value){if(typeof value!=="string"){return false}const normalized=value.trim().toLowerCase();return normalized==="1"||normalized==="true"||normalized==="yes"||normalized==="on"}function shouldRunSearchRefreshInForeground(){if(parseBooleanTrueLike(process.env[SEARCH_REFRESH_INLINE_ENV])){return true}if(parseBooleanTrueLike(process.env[SEARCH_REFRESH_CHILD_ENV])){return true}const nodeEnv=(process.env.NODE_ENV??"").trim().toLowerCase();return typeof process.env.VITEST==="string"||typeof process.env.VITEST_WORKER_ID==="string"||nodeEnv==="test"}function pendingQueuePath(pmRoot){return path.join(pmRoot,PENDING_QUEUE_REL_PATH)}function pendingQueueGatePath(pmRoot){return path.join(pmRoot,PENDING_QUEUE_GATE_REL_PATH)}function acquireQueueGate(pmRoot){const gatePath=pendingQueueGatePath(pmRoot);try{if(Date.now()-statSync(gatePath).mtimeMs<PENDING_QUEUE_GATE_STALE_MS){return false}rmSync(gatePath,{recursive:true,force:true})}catch{}try{mkdirSync(path.dirname(gatePath),{recursive:true});mkdirSync(gatePath);return true}catch{return false}}function releaseQueueGate(pmRoot){try{rmSync(pendingQueueGatePath(pmRoot),{recursive:true,force:true})}catch{}}async function withQueueGate(pmRoot,fn,fallback){for(let attempt=0;attempt<50;attempt+=1){if(acquireQueueGate(pmRoot)){try{return await fn()}finally{releaseQueueGate(pmRoot)}}await delay(20)}return fallback}function delay(ms){return new Promise(resolve=>{setTimeout(resolve,ms)})}async function readPendingQueueIds(pmRoot){const raw=await readFileIfExists(pendingQueuePath(pmRoot));if(!raw||raw.trim().length===0){return[]}try{const parsed=JSON.parse(raw);if(!Array.isArray(parsed.ids)){return[]}return parsed.ids.filter(id=>typeof id==="string"&&id.length>0)}catch{return[]}}async function writePendingQueueIds(pmRoot,ids){await writeFileAtomic(pendingQueuePath(pmRoot),`${JSON.stringify({ids})}
2
- `)}async function enqueuePendingRefreshIds(pmRoot,itemIds){const incoming=itemIds.filter(id=>typeof id==="string"&&id.trim().length>0);if(incoming.length===0){return}const mergeIncoming=async()=>{const existing=await readPendingQueueIds(pmRoot);const merged=[...new Set([...existing,...incoming])].sort((left,right)=>left.localeCompare(right));await writePendingQueueIds(pmRoot,merged)};const gated=await withQueueGate(pmRoot,async()=>{await mergeIncoming();return true},false);if(!gated){await mergeIncoming()}}async function drainPendingRefreshIds(pmRoot){return withQueueGate(pmRoot,async()=>{const ids=await readPendingQueueIds(pmRoot);if(ids.length>0){await writePendingQueueIds(pmRoot,[])}return ids},[])}function searchRefreshRunnerPath(){return path.join(resolvePmPackageRootFromModule(import.meta.url,["../../.."]),"dist","cli","search-refresh.js")}function dispatchRefreshChild(pmRoot){try{const child=spawn(process.execPath,[searchRefreshRunnerPath()],{detached:true,stdio:"ignore",env:{...process.env,PM_PATH:pmRoot,[SEARCH_REFRESH_CHILD_ENV]:"1"}});child.on("error",()=>{});child.unref()}catch{}}function scheduleDelayedRefreshRetry(pmRoot){setTimeout(()=>dispatchRefreshChild(pmRoot),SEARCH_REFRESH_RETRY_DELAY_MS)}async function scheduleBackgroundSemanticRefresh(pmRoot,itemIds){await enqueuePendingRefreshIds(pmRoot,itemIds);dispatchRefreshChild(pmRoot)}async function runSemanticRefreshWorker(pmRoot,refresh,scheduleRetry=scheduleDelayedRefreshRetry){const warnings=[];const processed=[];if(!await pathExists(pmRoot)){return{processed,rounds:0,warnings}}let settings;try{const settingsRead=await readSettingsWithMetadata(pmRoot);const readFailure=settingsRead.warnings.find(warning=>warning.startsWith("settings_read_"));if(readFailure){scheduleRetry(pmRoot);return{processed,rounds:0,warnings:[`search_background_refresh_settings_read_failed:${readFailure}`]}}settings=resolveSettingsWithSemanticRuntimeDefaults(settingsRead.settings).settings}catch(error){scheduleRetry(pmRoot);return{processed,rounds:0,warnings:[`search_background_refresh_settings_read_failed:${toErrorMessage(error)}`]}}let release=null;try{release=await acquireLock(pmRoot,REINDEX_LOCK_ID,settings.locks.ttl_seconds,resolveAuthor(void 0,"pm-search-refresh"),false,settings.governance.force_required_for_stale_lock,settings.locks.wait_ms)}catch{}if(!release){return{processed,rounds:0,warnings}}let rounds=0;let failed=false;let retryPending=false;try{for(;;){const ids=await drainPendingRefreshIds(pmRoot);if(ids.length===0){break}rounds+=1;try{const result=await refresh(pmRoot,ids);warnings.push(...result.warnings);if(result.warnings.some(warning=>warning.startsWith("search_semantic_refresh_skipped:settings_read_failed:"))){await enqueuePendingRefreshIds(pmRoot,ids);failed=true;retryPending=true;break}processed.push(...result.refreshed)}catch(error){warnings.push(`search_background_refresh_failed:${toErrorMessage(error)}`);await enqueuePendingRefreshIds(pmRoot,ids);failed=true;break}}}finally{await release?.()}if(retryPending){scheduleRetry(pmRoot)}const remaining=failed?[]:await readPendingQueueIds(pmRoot);if(remaining.length>0){dispatchRefreshChild(pmRoot)}return{processed:[...new Set(processed)].sort((a,b)=>a.localeCompare(b)),rounds,warnings}}export{REINDEX_LOCK_ID,SEARCH_REFRESH_RETRY_DELAY_MS,drainPendingRefreshIds,enqueuePendingRefreshIds,runSemanticRefreshWorker,scheduleBackgroundSemanticRefresh,shouldRunSearchRefreshInForeground};
1
+ (function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="9ecff496-8afa-5cfc-9178-2be8bd403978")}catch{}})();import{spawn}from"node:child_process";import{mkdirSync,rmSync,statSync}from"node:fs";import path from"node:path";import{pathExists,readFileIfExists,writeFileAtomic}from"../fs/fs-utils.js";import{acquireLock}from"../lock/lock.js";import{resolvePmPackageRootFromModule}from"../packages/root.js";import{readSettingsWithMetadata}from"../store/settings.js";import{toErrorMessage}from"../shared/primitives.js";import{resolveAuthor}from"../shared/author.js";import{resolveSettingsWithSemanticRuntimeDefaults}from"./semantic-defaults.js";const REINDEX_LOCK_ID="reindex",PENDING_QUEUE_REL_PATH="search/pending-refresh.json",PENDING_QUEUE_GATE_REL_PATH="search/pending-refresh.gate.lock",PENDING_QUEUE_GATE_STALE_MS=3e4,SEARCH_REFRESH_INLINE_ENV="PM_SEARCH_REFRESH_INLINE",SEARCH_REFRESH_CHILD_ENV="PM_SEARCH_REFRESH_CHILD",SEARCH_REFRESH_RETRY_DELAY_MS=3e4;function parseBooleanTrueLike(value){if(typeof value!="string")return!1;const normalized=value.trim().toLowerCase();return normalized==="1"||normalized==="true"||normalized==="yes"||normalized==="on"}function shouldRunSearchRefreshInForeground(){if(parseBooleanTrueLike(process.env[SEARCH_REFRESH_INLINE_ENV])||parseBooleanTrueLike(process.env[SEARCH_REFRESH_CHILD_ENV]))return!0;const nodeEnv=(process.env.NODE_ENV??"").trim().toLowerCase();return typeof process.env.VITEST=="string"||typeof process.env.VITEST_WORKER_ID=="string"||nodeEnv==="test"}function pendingQueuePath(pmRoot){return path.join(pmRoot,PENDING_QUEUE_REL_PATH)}function pendingQueueGatePath(pmRoot){return path.join(pmRoot,PENDING_QUEUE_GATE_REL_PATH)}function acquireQueueGate(pmRoot){const gatePath=pendingQueueGatePath(pmRoot);try{if(Date.now()-statSync(gatePath).mtimeMs<PENDING_QUEUE_GATE_STALE_MS)return!1;rmSync(gatePath,{recursive:!0,force:!0})}catch{}try{return mkdirSync(path.dirname(gatePath),{recursive:!0}),mkdirSync(gatePath),!0}catch{return!1}}function releaseQueueGate(pmRoot){try{rmSync(pendingQueueGatePath(pmRoot),{recursive:!0,force:!0})}catch{}}async function withQueueGate(pmRoot,fn,fallback){for(let attempt=0;attempt<50;attempt+=1){if(acquireQueueGate(pmRoot))try{return await fn()}finally{releaseQueueGate(pmRoot)}await delay(20)}return fallback}function delay(ms){return new Promise(resolve=>{setTimeout(resolve,ms)})}async function readPendingQueueIds(pmRoot){const raw=await readFileIfExists(pendingQueuePath(pmRoot));if(!raw||raw.trim().length===0)return[];try{const parsed=JSON.parse(raw);return Array.isArray(parsed.ids)?parsed.ids.filter(id=>typeof id=="string"&&id.length>0):[]}catch{return[]}}async function writePendingQueueIds(pmRoot,ids){await writeFileAtomic(pendingQueuePath(pmRoot),`${JSON.stringify({ids})}
2
+ `)}async function enqueuePendingRefreshIds(pmRoot,itemIds){const incoming=itemIds.filter(id=>typeof id=="string"&&id.trim().length>0);if(incoming.length===0)return;const mergeIncoming=async()=>{const existing=await readPendingQueueIds(pmRoot),merged=[...new Set([...existing,...incoming])].sort((left,right)=>left.localeCompare(right));await writePendingQueueIds(pmRoot,merged)};await withQueueGate(pmRoot,async()=>(await mergeIncoming(),!0),!1)||await mergeIncoming()}async function drainPendingRefreshIds(pmRoot){return withQueueGate(pmRoot,async()=>{const ids=await readPendingQueueIds(pmRoot);return ids.length>0&&await writePendingQueueIds(pmRoot,[]),ids},[])}function searchRefreshRunnerPath(){return path.join(resolvePmPackageRootFromModule(import.meta.url,["../../.."]),"dist","cli","search-refresh.js")}function dispatchRefreshChild(pmRoot){try{const child=spawn(process.execPath,[searchRefreshRunnerPath()],{detached:!0,stdio:"ignore",env:{...process.env,PM_PATH:pmRoot,[SEARCH_REFRESH_CHILD_ENV]:"1"}});child.on("error",()=>{}),child.unref()}catch{}}function scheduleDelayedRefreshRetry(pmRoot){setTimeout(()=>dispatchRefreshChild(pmRoot),SEARCH_REFRESH_RETRY_DELAY_MS)}async function scheduleBackgroundSemanticRefresh(pmRoot,itemIds){await enqueuePendingRefreshIds(pmRoot,itemIds),dispatchRefreshChild(pmRoot)}async function runSemanticRefreshWorker(pmRoot,refresh,scheduleRetry=scheduleDelayedRefreshRetry){const warnings=[],processed=[];if(!await pathExists(pmRoot))return{processed,rounds:0,warnings};let settings;try{const settingsRead=await readSettingsWithMetadata(pmRoot),readFailure=settingsRead.warnings.find(warning=>warning.startsWith("settings_read_"));if(readFailure)return scheduleRetry(pmRoot),{processed,rounds:0,warnings:[`search_background_refresh_settings_read_failed:${readFailure}`]};settings=resolveSettingsWithSemanticRuntimeDefaults(settingsRead.settings).settings}catch(error){return scheduleRetry(pmRoot),{processed,rounds:0,warnings:[`search_background_refresh_settings_read_failed:${toErrorMessage(error)}`]}}let release=null;try{release=await acquireLock(pmRoot,REINDEX_LOCK_ID,settings.locks.ttl_seconds,resolveAuthor(void 0,"pm-search-refresh"),!1,settings.governance.force_required_for_stale_lock,settings.locks.wait_ms)}catch{}if(!release)return{processed,rounds:0,warnings};let rounds=0,failed=!1,retryPending=!1;try{for(;;){const ids=await drainPendingRefreshIds(pmRoot);if(ids.length===0)break;rounds+=1;try{const result=await refresh(pmRoot,ids);if(warnings.push(...result.warnings),result.warnings.some(warning=>warning.startsWith("search_semantic_refresh_skipped:settings_read_failed:"))){await enqueuePendingRefreshIds(pmRoot,ids),failed=!0,retryPending=!0;break}processed.push(...result.refreshed)}catch(error){warnings.push(`search_background_refresh_failed:${toErrorMessage(error)}`),await enqueuePendingRefreshIds(pmRoot,ids),failed=!0;break}}}finally{await release?.()}return retryPending&&scheduleRetry(pmRoot),(failed?[]:await readPendingQueueIds(pmRoot)).length>0&&dispatchRefreshChild(pmRoot),{processed:[...new Set(processed)].sort((a,b)=>a.localeCompare(b)),rounds,warnings}}export{REINDEX_LOCK_ID,SEARCH_REFRESH_RETRY_DELAY_MS,drainPendingRefreshIds,enqueuePendingRefreshIds,runSemanticRefreshWorker,scheduleBackgroundSemanticRefresh,shouldRunSearchRefreshInForeground};
3
3
  //# sourceMappingURL=background-refresh.js.map
@@ -1,2 +1,2 @@
1
- !(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]="bc52818b-d37f-5d00-954d-d50203a433c2")}catch(e2){}})();import{tokenizeAlphaNumeric}from"../shared/text-normalization.js";const DEFAULT_BM25_K1=1.2;const DEFAULT_BM25_B=.75;function tokenizeBm25(text){return tokenizeAlphaNumeric(text)}function buildTermFrequencies(tokens){const frequencies=new Map;for(const token of tokens){frequencies.set(token,(frequencies.get(token)??0)+1)}return frequencies}function buildBm25Index(documents){const stats=[];const documentFrequency=new Map;let totalLength=0;for(const document of documents){const tokens=tokenizeBm25(document.text);const termFrequencies=buildTermFrequencies(tokens);totalLength+=tokens.length;for(const term of termFrequencies.keys()){documentFrequency.set(term,(documentFrequency.get(term)??0)+1)}stats.push({id:document.id,termFrequencies,length:tokens.length})}const documentCount=stats.length;return{documents:stats,documentFrequency,documentCount,averageDocumentLength:documentCount>0?totalLength/documentCount:0}}function inverseDocumentFrequency(documentCount,termDocumentFrequency){return Math.log(1+(documentCount-termDocumentFrequency+.5)/(termDocumentFrequency+.5))}function scoreBm25Query(index,queryTokens,params){const scores=new Map;if(index.documentCount===0||index.averageDocumentLength===0){return scores}const distinctQueryTerms=[...new Set(queryTokens.filter(token=>token.length>0))];if(distinctQueryTerms.length===0){return scores}const idfByTerm=new Map;for(const term of distinctQueryTerms){const termDocumentFrequency=index.documentFrequency.get(term);if(termDocumentFrequency===void 0){continue}idfByTerm.set(term,inverseDocumentFrequency(index.documentCount,termDocumentFrequency))}if(idfByTerm.size===0){return scores}for(const document of index.documents){let score=0;for(const[term,idf]of idfByTerm){const termFrequency=document.termFrequencies.get(term);if(termFrequency===void 0){continue}const lengthNormalization=1-params.b+params.b*document.length/index.averageDocumentLength;const denominator=termFrequency+params.k1*lengthNormalization;score+=idf*(termFrequency*(params.k1+1)/denominator)}if(score>0){scores.set(document.id,score)}}return scores}function resolveClampedParam(candidate,fallback,min,max){if(typeof candidate!=="number"||!Number.isFinite(candidate)){return fallback}return Math.min(max,Math.max(min,candidate))}function flattenSearchCorpusText(corpus){const collectValueText=value=>{if(typeof value==="string"){return[value]}if(typeof value==="number"){return[String(value)]}if(Array.isArray(value)){return value.flatMap(collectValueText)}if(typeof value==="object"&&value!==null){return Object.values(value).flatMap(collectValueText)}return[]};return collectValueText(Object.values(corpus)).join(" ")}function resolveBm25Params(settings){const bm25=settings?.search?.bm25;return{k1:resolveClampedParam(bm25?.k1,DEFAULT_BM25_K1,0,1e3),b:resolveClampedParam(bm25?.b,DEFAULT_BM25_B,0,1)}}export{DEFAULT_BM25_B,DEFAULT_BM25_K1,buildBm25Index,flattenSearchCorpusText,resolveBm25Params,scoreBm25Query,tokenizeBm25};
1
+ (function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="0272e482-0dab-5970-b19a-4da286fd112b")}catch{}})();import{tokenizeAlphaNumeric}from"../shared/text-normalization.js";const DEFAULT_BM25_K1=1.2,DEFAULT_BM25_B=.75;function tokenizeBm25(text){return tokenizeAlphaNumeric(text)}function buildTermFrequencies(tokens){const frequencies=new Map;for(const token of tokens)frequencies.set(token,(frequencies.get(token)??0)+1);return frequencies}function buildBm25Index(documents){const stats=[],documentFrequency=new Map;let totalLength=0;for(const document of documents){const tokens=tokenizeBm25(document.text),termFrequencies=buildTermFrequencies(tokens);totalLength+=tokens.length;for(const term of termFrequencies.keys())documentFrequency.set(term,(documentFrequency.get(term)??0)+1);stats.push({id:document.id,termFrequencies,length:tokens.length})}const documentCount=stats.length;return{documents:stats,documentFrequency,documentCount,averageDocumentLength:documentCount>0?totalLength/documentCount:0}}function inverseDocumentFrequency(documentCount,termDocumentFrequency){return Math.log(1+(documentCount-termDocumentFrequency+.5)/(termDocumentFrequency+.5))}function scoreBm25Query(index,queryTokens,params){const scores=new Map;if(index.documentCount===0||index.averageDocumentLength===0)return scores;const distinctQueryTerms=[...new Set(queryTokens.filter(token=>token.length>0))];if(distinctQueryTerms.length===0)return scores;const idfByTerm=new Map;for(const term of distinctQueryTerms){const termDocumentFrequency=index.documentFrequency.get(term);termDocumentFrequency!==void 0&&idfByTerm.set(term,inverseDocumentFrequency(index.documentCount,termDocumentFrequency))}if(idfByTerm.size===0)return scores;for(const document of index.documents){let score=0;for(const[term,idf]of idfByTerm){const termFrequency=document.termFrequencies.get(term);if(termFrequency===void 0)continue;const lengthNormalization=1-params.b+params.b*document.length/index.averageDocumentLength,denominator=termFrequency+params.k1*lengthNormalization;score+=idf*(termFrequency*(params.k1+1)/denominator)}score>0&&scores.set(document.id,score)}return scores}function resolveClampedParam(candidate,fallback,min,max){return typeof candidate!="number"||!Number.isFinite(candidate)?fallback:Math.min(max,Math.max(min,candidate))}function flattenSearchCorpusText(corpus){const collectValueText=value=>typeof value=="string"?[value]:typeof value=="number"?[String(value)]:Array.isArray(value)?value.flatMap(collectValueText):typeof value=="object"&&value!==null?Object.values(value).flatMap(collectValueText):[];return collectValueText(Object.values(corpus)).join(" ")}function resolveBm25Params(settings){const bm25=settings?.search?.bm25;return{k1:resolveClampedParam(bm25?.k1,DEFAULT_BM25_K1,0,1e3),b:resolveClampedParam(bm25?.b,DEFAULT_BM25_B,0,1)}}export{DEFAULT_BM25_B,DEFAULT_BM25_K1,buildBm25Index,flattenSearchCorpusText,resolveBm25Params,scoreBm25Query,tokenizeBm25};
2
2
  //# sourceMappingURL=bm25.js.map