@unbrained/pm-cli 2026.6.21 → 2026.6.23

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 (429) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/dist/cli/commands/completion.js +7 -4
  3. package/dist/cli/commands/completion.js.map +1 -1
  4. package/dist/cli/commands/contracts.js +4 -3
  5. package/dist/cli/commands/contracts.js.map +1 -1
  6. package/dist/cli/commands/extension/describe.d.ts +70 -0
  7. package/dist/cli/commands/extension/describe.js +76 -0
  8. package/dist/cli/commands/extension/describe.js.map +1 -0
  9. package/dist/cli/commands/extension/doctor.d.ts +11 -0
  10. package/dist/cli/commands/extension/doctor.js +31 -2
  11. package/dist/cli/commands/extension/doctor.js.map +1 -1
  12. package/dist/cli/commands/extension/scaffold.d.ts +16 -2
  13. package/dist/cli/commands/extension/scaffold.js +529 -48
  14. package/dist/cli/commands/extension/scaffold.js.map +1 -1
  15. package/dist/cli/commands/extension.d.ts +3 -1
  16. package/dist/cli/commands/extension.js +35 -5
  17. package/dist/cli/commands/extension.js.map +1 -1
  18. package/dist/cli/help-content.js +20 -4
  19. package/dist/cli/help-content.js.map +1 -1
  20. package/dist/cli/register-setup.js +14 -2
  21. package/dist/cli/register-setup.js.map +1 -1
  22. package/dist/cli-bundle/chunks/{activity-KW3IRP44.js → activity-H2LMOSSW.js} +11 -11
  23. package/dist/cli-bundle/chunks/activity-XUZ2AHCW.js +18 -0
  24. package/dist/cli-bundle/chunks/{aggregate-3ZKQG5SW.js → aggregate-EGJLZQBI.js} +10 -10
  25. package/dist/cli-bundle/chunks/{aggregate-FIGQEIL3.js → aggregate-R725FC3S.js} +10 -10
  26. package/dist/cli-bundle/chunks/{append-EWJYJ7CH.js → append-5J345QGU.js} +8 -8
  27. package/dist/cli-bundle/chunks/{append-QEOLX3XB.js → append-O5HPBMRN.js} +8 -8
  28. package/dist/cli-bundle/chunks/{chunk-GOZUHWFD.js → chunk-2A34E3BA.js} +2 -2
  29. package/dist/cli-bundle/chunks/{chunk-A4Z7ZOL5.js → chunk-2BFPAUAF.js} +31 -15
  30. package/dist/cli-bundle/chunks/chunk-2BFPAUAF.js.map +1 -0
  31. package/dist/cli-bundle/chunks/{chunk-5QICDWMV.js → chunk-2CKH2LMV.js} +2 -2
  32. package/dist/cli-bundle/chunks/{chunk-WQ7NIVDK.js → chunk-2RDVQEWV.js} +4 -4
  33. package/dist/cli-bundle/chunks/{chunk-NSBZ2CKF.js → chunk-2T3JG6V4.js} +2 -2
  34. package/dist/cli-bundle/chunks/{chunk-76Z3YSHV.js → chunk-34EONI5F.js} +2 -2
  35. package/dist/cli-bundle/chunks/{chunk-PUH4D67U.js → chunk-3VY3YQO6.js} +2 -2
  36. package/dist/cli-bundle/chunks/{chunk-N5ZJACJ6.js → chunk-46G6RSB6.js} +8 -8
  37. package/dist/cli-bundle/chunks/{chunk-SRYYRVPB.js → chunk-4BHT5VDC.js} +2 -2
  38. package/dist/cli-bundle/chunks/{chunk-PFSRUHDH.js → chunk-4KD54S3Z.js} +9 -9
  39. package/dist/cli-bundle/chunks/{chunk-QQHISQBJ.js → chunk-55ISXAQH.js} +7 -4
  40. package/dist/cli-bundle/chunks/{chunk-QQHISQBJ.js.map → chunk-55ISXAQH.js.map} +2 -2
  41. package/dist/cli-bundle/chunks/{chunk-NIUEXCFS.js → chunk-5UVVASSA.js} +6 -6
  42. package/dist/cli-bundle/chunks/{chunk-CF55WVVS.js → chunk-5VOINNKT.js} +2 -2
  43. package/dist/cli-bundle/chunks/{chunk-NIGXMNNI.js → chunk-66MEDTUD.js} +2 -2
  44. package/dist/cli-bundle/chunks/{chunk-AZMOLBN3.js → chunk-7AUB5HNA.js} +7 -7
  45. package/dist/cli-bundle/chunks/{chunk-OTHIWLMB.js → chunk-7K2XXO4I.js} +5 -5
  46. package/dist/cli-bundle/chunks/{chunk-7D3SAQXM.js → chunk-7MRQ4HMK.js} +2 -2
  47. package/dist/cli-bundle/chunks/{chunk-EBH56IXK.js → chunk-7SV63ZHD.js} +8 -8
  48. package/dist/cli-bundle/chunks/{chunk-OFYMIDF2.js → chunk-7UGEAPRY.js} +9 -9
  49. package/dist/cli-bundle/chunks/{chunk-LUWW7L4B.js → chunk-7XGQXHFB.js} +3 -3
  50. package/dist/cli-bundle/chunks/{chunk-UEMNL33O.js → chunk-AD3A7ZD6.js} +8 -8
  51. package/dist/cli-bundle/chunks/{chunk-3EWSGA7N.js → chunk-AONIHR2C.js} +12 -12
  52. package/dist/cli-bundle/chunks/{chunk-RVHYI7SL.js → chunk-BB6MDVNQ.js} +8 -8
  53. package/dist/cli-bundle/chunks/chunk-C5AOG6D2.js +691 -0
  54. package/dist/cli-bundle/chunks/chunk-C5AOG6D2.js.map +1 -0
  55. package/dist/cli-bundle/chunks/{chunk-52OCIDPG.js → chunk-CE5P2NQR.js} +5 -5
  56. package/dist/cli-bundle/chunks/{chunk-NXS7ZKAK.js → chunk-CIIK67GW.js} +4 -4
  57. package/dist/cli-bundle/chunks/{chunk-HC4AWIKT.js → chunk-CKGNPJAG.js} +31 -15
  58. package/dist/cli-bundle/chunks/chunk-CKGNPJAG.js.map +7 -0
  59. package/dist/cli-bundle/chunks/{chunk-NB3PYLQ6.js → chunk-DT5LPYOD.js} +5 -5
  60. package/dist/cli-bundle/chunks/{chunk-37QXHBIB.js → chunk-FIGAZ4Y7.js} +3 -3
  61. package/dist/cli-bundle/chunks/{chunk-UV6IYE5U.js → chunk-FXR67XVQ.js} +2 -2
  62. package/dist/cli-bundle/chunks/{chunk-3MDHREEV.js → chunk-G6N5VEOK.js} +3 -3
  63. package/dist/cli-bundle/chunks/{chunk-5PCI3UBT.js → chunk-G6PYHBBR.js} +152 -253
  64. package/dist/cli-bundle/chunks/chunk-G6PYHBBR.js.map +7 -0
  65. package/dist/cli-bundle/chunks/{chunk-2GCDRRIF.js → chunk-GAJVRGGA.js} +12 -12
  66. package/dist/cli-bundle/chunks/{chunk-HCU6WUSY.js → chunk-H2IP4QLJ.js} +9 -9
  67. package/dist/cli-bundle/chunks/{chunk-CZUB4XWO.js → chunk-H4IIJDE4.js} +2 -2
  68. package/dist/cli-bundle/chunks/{chunk-RLK7P77C.js → chunk-HFFUQR73.js} +5 -5
  69. package/dist/cli-bundle/chunks/{chunk-6M4RJS4M.js → chunk-IB3GYLQE.js} +3 -3
  70. package/dist/cli-bundle/chunks/{chunk-SX75ADBK.js → chunk-IPKJ6B36.js} +6 -6
  71. package/dist/cli-bundle/chunks/{chunk-H7NJZWG2.js → chunk-JR2LV3M4.js} +13 -13
  72. package/dist/cli-bundle/chunks/{chunk-PP2U4NMT.js → chunk-KFWBJPSG.js} +5 -5
  73. package/dist/cli-bundle/chunks/{chunk-32R4PIC6.js → chunk-KQMUV6LX.js} +145 -253
  74. package/dist/cli-bundle/chunks/chunk-KQMUV6LX.js.map +1 -0
  75. package/dist/cli-bundle/chunks/{chunk-F7K5GWP3.js → chunk-LRKKONT2.js} +9 -9
  76. package/dist/cli-bundle/chunks/{chunk-5IDI42VV.js → chunk-M4T5DXD5.js} +7 -7
  77. package/dist/cli-bundle/chunks/{chunk-2PKHRP6G.js → chunk-MJTINN54.js} +10 -10
  78. package/dist/cli-bundle/chunks/{chunk-HMOADQVT.js → chunk-MJTSZKK5.js} +107 -3
  79. package/dist/cli-bundle/chunks/chunk-MJTSZKK5.js.map +7 -0
  80. package/dist/cli-bundle/chunks/chunk-MVKFOLLM.js +694 -0
  81. package/dist/cli-bundle/chunks/chunk-MVKFOLLM.js.map +7 -0
  82. package/dist/cli-bundle/chunks/{chunk-QGG32QHW.js → chunk-NCVCO3NZ.js} +3 -3
  83. package/dist/cli-bundle/chunks/{chunk-AIS5PGI3.js → chunk-NK3UPBVG.js} +2 -2
  84. package/dist/cli-bundle/chunks/{chunk-6H4LF7AO.js → chunk-O6LLO73I.js} +2 -2
  85. package/dist/cli-bundle/chunks/{chunk-YCJX76PW.js → chunk-P77P2ILI.js} +2 -2
  86. package/dist/cli-bundle/chunks/{chunk-F5NZWFSW.js → chunk-Q2KNGP7C.js} +7 -7
  87. package/dist/cli-bundle/chunks/{chunk-GMHPNNYG.js → chunk-QH3PJYON.js} +10 -10
  88. package/dist/cli-bundle/chunks/{chunk-NJHMAJ6N.js → chunk-QL5RVYOA.js} +8 -8
  89. package/dist/cli-bundle/chunks/{chunk-O47BPOPC.js → chunk-S26C36QC.js} +2 -2
  90. package/dist/cli-bundle/chunks/{chunk-D7FYS6PG.js → chunk-S2RUQSX2.js} +2 -2
  91. package/dist/cli-bundle/chunks/{chunk-CZPXY7UW.js → chunk-SBQTAVJZ.js} +3 -3
  92. package/dist/cli-bundle/chunks/{chunk-M5XALUSL.js → chunk-SKH7OGE5.js} +2 -2
  93. package/dist/cli-bundle/chunks/{chunk-NJN7LL7U.js → chunk-SKN7LC5W.js} +5 -5
  94. package/dist/cli-bundle/chunks/{chunk-6ZXM2XNF.js → chunk-SR3EKWZG.js} +8 -8
  95. package/dist/cli-bundle/chunks/{chunk-B473GZWW.js → chunk-T5472OMV.js} +3 -3
  96. package/dist/cli-bundle/chunks/{chunk-2EIMPCE4.js → chunk-T72AZDBA.js} +3 -3
  97. package/dist/cli-bundle/chunks/{chunk-6CJWZAN7.js → chunk-TQZH6OD6.js} +7 -7
  98. package/dist/cli-bundle/chunks/{chunk-FWPDUYEY.js → chunk-U2Z5YUSO.js} +7 -7
  99. package/dist/cli-bundle/chunks/{chunk-434HM6Z5.js → chunk-UELRKQQU.js} +100 -3
  100. package/dist/cli-bundle/chunks/chunk-UELRKQQU.js.map +1 -0
  101. package/dist/cli-bundle/chunks/{chunk-HIP7WVTL.js → chunk-UVC5LOR7.js} +4 -4
  102. package/dist/cli-bundle/chunks/{chunk-LEU5GHRC.js → chunk-VAYA4XFX.js} +3 -3
  103. package/dist/cli-bundle/chunks/{chunk-J4MYYSOL.js → chunk-VFAQ4LMN.js} +5 -5
  104. package/dist/cli-bundle/chunks/{chunk-UPE3CDD7.js → chunk-W72GHSJE.js} +7 -7
  105. package/dist/cli-bundle/chunks/{chunk-C4N5I7ZW.js → chunk-WBRKK5QR.js} +3 -3
  106. package/dist/cli-bundle/chunks/{chunk-Z6T4PQI2.js → chunk-WM5ZVBPE.js} +4 -4
  107. package/dist/cli-bundle/chunks/{chunk-TKBHZPKD.js → chunk-WZQWHN4R.js} +3 -3
  108. package/dist/cli-bundle/chunks/{chunk-FKBDKV7Y.js → chunk-XVF4YARA.js} +3 -3
  109. package/dist/cli-bundle/chunks/{chunk-SBGXDO7A.js → chunk-Y4SUQQYH.js} +8 -5
  110. package/dist/cli-bundle/chunks/{chunk-SBGXDO7A.js.map → chunk-Y4SUQQYH.js.map} +1 -1
  111. package/dist/cli-bundle/chunks/{chunk-QZTWBFXJ.js → chunk-YDEXO24S.js} +2 -2
  112. package/dist/cli-bundle/chunks/{chunk-FRUFKWNK.js → chunk-YJ3SUEPD.js} +2 -2
  113. package/dist/cli-bundle/chunks/{chunk-5FIEHKEX.js → chunk-YUDJD3XO.js} +5 -5
  114. package/dist/cli-bundle/chunks/{chunk-Q2J2HJUN.js → chunk-ZQ3ZVXX2.js} +2 -2
  115. package/dist/cli-bundle/chunks/{chunk-C3AZ5ZML.js → chunk-ZRK4O56R.js} +13 -13
  116. package/dist/cli-bundle/chunks/{claim-RC56YUWG.js → claim-4KHAA2RN.js} +10 -10
  117. package/dist/cli-bundle/chunks/{claim-THOJ6CMV.js → claim-CSPJFLNH.js} +10 -10
  118. package/dist/cli-bundle/chunks/close-A3EMKBBY.js +15 -0
  119. package/dist/cli-bundle/chunks/{close-SG5MNCVQ.js → close-W56IOGYG.js} +8 -8
  120. package/dist/cli-bundle/chunks/{close-many-3L3AQZBU.js → close-many-BX5DCSVV.js} +15 -15
  121. package/dist/cli-bundle/chunks/{close-many-DKQLBGLV.js → close-many-TQU5F4E4.js} +15 -15
  122. package/dist/cli-bundle/chunks/{comments-M7ZOZNBX.js → comments-U5KUC4EU.js} +10 -10
  123. package/dist/cli-bundle/chunks/{comments-SKWMDWCW.js → comments-VRECH75R.js} +10 -10
  124. package/dist/cli-bundle/chunks/{config-OZCUABPB.js → config-D3OKQO52.js} +8 -8
  125. package/dist/cli-bundle/chunks/{config-7CK62S7T.js → config-MMJA4LLK.js} +8 -8
  126. package/dist/cli-bundle/chunks/{context-PUG2A7RC.js → context-BLBD3PUB.js} +13 -13
  127. package/dist/cli-bundle/chunks/{context-OEC366TO.js → context-DHLVPXN3.js} +13 -13
  128. package/dist/cli-bundle/chunks/{contracts-3THOLA7L.js → contracts-C3SZCXXG.js} +7 -5
  129. package/dist/cli-bundle/chunks/contracts-C3SZCXXG.js.map +7 -0
  130. package/dist/cli-bundle/chunks/{contracts-N65FXEOL.js → contracts-XGVMMPC5.js} +8 -6
  131. package/dist/cli-bundle/chunks/contracts-XGVMMPC5.js.map +1 -0
  132. package/dist/cli-bundle/chunks/{copy-JPX7VZCH.js → copy-5D5DX3VK.js} +7 -7
  133. package/dist/cli-bundle/chunks/{copy-6QLHILAC.js → copy-HHL3K4QP.js} +7 -7
  134. package/dist/cli-bundle/chunks/{create-Y54ZVVZH.js → create-IXY43O4H.js} +14 -14
  135. package/dist/cli-bundle/chunks/create-QVGFYA2X.js +30 -0
  136. package/dist/cli-bundle/chunks/{delete-63PCMQAJ.js → delete-IBUR3M42.js} +7 -7
  137. package/dist/cli-bundle/chunks/{delete-GDSMGAGJ.js → delete-QQC2FGUH.js} +7 -7
  138. package/dist/cli-bundle/chunks/{deps-XYQ73XRH.js → deps-KWKRHXIN.js} +7 -7
  139. package/dist/cli-bundle/chunks/{deps-T4ZF5G54.js → deps-VTPO4BSE.js} +7 -7
  140. package/dist/cli-bundle/chunks/{docs-EHNPDWUL.js → docs-7CHFHXLN.js} +9 -9
  141. package/dist/cli-bundle/chunks/{docs-C75YIXHC.js → docs-IIO3FEUO.js} +9 -9
  142. package/dist/cli-bundle/chunks/{eval-GTENKE24.js → eval-CEYYEPSX.js} +12 -12
  143. package/dist/cli-bundle/chunks/{eval-3WKDTRMH.js → eval-IO7LREOL.js} +12 -12
  144. package/dist/cli-bundle/chunks/{extension-D5FDZ2CO.js → extension-KCPUWSY2.js} +6 -5
  145. package/dist/cli-bundle/chunks/{extension-46NWACO3.js → extension-UTTQDUYI.js} +6 -5
  146. package/dist/cli-bundle/chunks/{files-X3H7CCBQ.js → files-TPUL6KWB.js} +9 -9
  147. package/dist/cli-bundle/chunks/{files-DSZBOSSN.js → files-Z2HHEFGP.js} +9 -9
  148. package/dist/cli-bundle/chunks/{focus-5STQXDPU.js → focus-JVJCGC2D.js} +8 -8
  149. package/dist/cli-bundle/chunks/{focus-MDVPOWB5.js → focus-YRNNH7IP.js} +8 -8
  150. package/dist/cli-bundle/chunks/{gc-ZMST3WQP.js → gc-O5GUO3SU.js} +3 -3
  151. package/dist/cli-bundle/chunks/{gc-ZC7JHBG7.js → gc-PYVVEELM.js} +3 -3
  152. package/dist/cli-bundle/chunks/{get-NT7L2HUZ.js → get-ENLTEGTX.js} +11 -11
  153. package/dist/cli-bundle/chunks/{get-J2IPJRZW.js → get-X4O3HBEY.js} +11 -11
  154. package/dist/cli-bundle/chunks/{health-WOYBR3KU.js → health-5EXTY44Q.js} +14 -13
  155. package/dist/cli-bundle/chunks/{health-WOYBR3KU.js.map → health-5EXTY44Q.js.map} +1 -1
  156. package/dist/cli-bundle/chunks/{health-IVMA3XQC.js → health-BOTB7YSU.js} +16 -15
  157. package/dist/cli-bundle/chunks/{health-IVMA3XQC.js.map → health-BOTB7YSU.js.map} +1 -1
  158. package/dist/cli-bundle/chunks/{history-RLH2QCRO.js → history-AJTXLT6S.js} +10 -10
  159. package/dist/cli-bundle/chunks/history-AK3E5Z3C.js +20 -0
  160. package/dist/cli-bundle/chunks/{history-compact-UXDIFC33.js → history-compact-43OOUAWD.js} +12 -12
  161. package/dist/cli-bundle/chunks/{history-compact-ZBEBGJM7.js → history-compact-46MRHW3I.js} +12 -12
  162. package/dist/cli-bundle/chunks/{history-redact-P7I7AWMB.js → history-redact-KUUUVUFM.js} +11 -11
  163. package/dist/cli-bundle/chunks/history-redact-TWIYQV5J.js +21 -0
  164. package/dist/cli-bundle/chunks/{history-repair-52KINVIK.js → history-repair-B5PZBOPU.js} +12 -12
  165. package/dist/cli-bundle/chunks/{history-repair-RM5ITLU5.js → history-repair-VQTYOSRS.js} +12 -12
  166. package/dist/cli-bundle/chunks/{init-2BNZOO6F.js → init-BNLVFPRG.js} +11 -10
  167. package/dist/cli-bundle/chunks/init-RCRKW5PL.js +21 -0
  168. package/dist/cli-bundle/chunks/{learnings-YGYVHWJK.js → learnings-MUUU5KMC.js} +10 -10
  169. package/dist/cli-bundle/chunks/{learnings-W6F3FIPL.js → learnings-XSGX52S7.js} +10 -10
  170. package/dist/cli-bundle/chunks/{list-K6FPV4J4.js → list-32U7BSKE.js} +10 -10
  171. package/dist/cli-bundle/chunks/{list-KPAYU5KZ.js → list-ZEEOHLTQ.js} +10 -10
  172. package/dist/cli-bundle/chunks/{notes-PU74EPKV.js → notes-NJ45OZGF.js} +10 -10
  173. package/dist/cli-bundle/chunks/{notes-YTD6ZILW.js → notes-OHU25L3M.js} +10 -10
  174. package/dist/cli-bundle/chunks/{plan-GEQYUCBW.js → plan-KQA7CAKI.js} +14 -14
  175. package/dist/cli-bundle/chunks/{plan-FNXHXRCI.js → plan-LWWAEV5Y.js} +14 -14
  176. package/dist/cli-bundle/chunks/{register-list-query-QI45RMKN.js → register-list-query-DDCHPONM.js} +19 -19
  177. package/dist/cli-bundle/chunks/{register-list-query-PHWYHENI.js → register-list-query-YNPBVIKM.js} +19 -19
  178. package/dist/cli-bundle/chunks/{register-mutation-YINRTS7L.js → register-mutation-7ALWDDAX.js} +33 -33
  179. package/dist/cli-bundle/chunks/{register-mutation-X3BUOQEL.js → register-mutation-LAVKYY63.js} +33 -33
  180. package/dist/cli-bundle/chunks/{register-operations-E5JEASRK.js → register-operations-R4VOQ6EF.js} +32 -32
  181. package/dist/cli-bundle/chunks/{register-operations-MIDTRW7S.js → register-operations-U5JAW3WE.js} +32 -32
  182. package/dist/cli-bundle/chunks/{register-setup-EG2U6CEU.js → register-setup-KBXQDCXE.js} +27 -18
  183. package/dist/cli-bundle/chunks/register-setup-KBXQDCXE.js.map +7 -0
  184. package/dist/cli-bundle/chunks/{register-setup-DYBFLEZX.js → register-setup-RCRUHMSZ.js} +28 -19
  185. package/dist/cli-bundle/chunks/register-setup-RCRUHMSZ.js.map +1 -0
  186. package/dist/cli-bundle/chunks/restore-2ZKT6UDC.js +19 -0
  187. package/dist/cli-bundle/chunks/{restore-XQYSWBV7.js → restore-6K53WOWO.js} +11 -11
  188. package/dist/cli-bundle/chunks/{scheduling-shortcuts-NNT5ASZR.js → scheduling-shortcuts-NJ5UVJFB.js} +14 -14
  189. package/dist/cli-bundle/chunks/{scheduling-shortcuts-HJMTEXKE.js → scheduling-shortcuts-OQVJXG3M.js} +14 -14
  190. package/dist/cli-bundle/chunks/{schema-263RI4WW.js → schema-MNTAVQCY.js} +9 -9
  191. package/dist/cli-bundle/chunks/{schema-TZXW6XWD.js → schema-RBTJ2YXW.js} +9 -9
  192. package/dist/cli-bundle/chunks/{search-SFRJOVDG.js → search-6HOIVZDU.js} +12 -12
  193. package/dist/cli-bundle/chunks/{search-LECJYSXE.js → search-ZWYEMASC.js} +12 -12
  194. package/dist/cli-bundle/chunks/{stats-N7ER2PNK.js → stats-FS742AMA.js} +8 -8
  195. package/dist/cli-bundle/chunks/{stats-VPBGSRQH.js → stats-R5OAJVZK.js} +8 -8
  196. package/dist/cli-bundle/chunks/{telemetry-PP3FUNBU.js → telemetry-7DIGDQUO.js} +4 -4
  197. package/dist/cli-bundle/chunks/{telemetry-L6K3BUIQ.js → telemetry-FWEXSJLQ.js} +4 -4
  198. package/dist/cli-bundle/chunks/{test-3EGNS3T5.js → test-NZF7OT2F.js} +16 -15
  199. package/dist/cli-bundle/chunks/test-QJXLKV26.js +36 -0
  200. package/dist/cli-bundle/chunks/{test-all-NJ5V2QFS.js → test-all-DPN62TX7.js} +16 -15
  201. package/dist/cli-bundle/chunks/{test-all-NJ5V2QFS.js.map → test-all-DPN62TX7.js.map} +1 -1
  202. package/dist/cli-bundle/chunks/{test-all-ZHFAWNC3.js → test-all-KL7TLMJF.js} +18 -17
  203. package/dist/cli-bundle/chunks/{test-all-ZHFAWNC3.js.map → test-all-KL7TLMJF.js.map} +1 -1
  204. package/dist/cli-bundle/chunks/{test-runs-GN3C6GOI.js → test-runs-C6CFIVOS.js} +5 -5
  205. package/dist/cli-bundle/chunks/{test-runs-AJHR6IQF.js → test-runs-IAJDL6CA.js} +5 -5
  206. package/dist/cli-bundle/chunks/update-2XCQNOD6.js +28 -0
  207. package/dist/cli-bundle/chunks/update-IWUCXVH2.js +24 -0
  208. package/dist/cli-bundle/chunks/{update-many-RYQ64CFW.js → update-many-MUTIOAP3.js} +23 -23
  209. package/dist/cli-bundle/chunks/{update-many-N2AN6ZDH.js → update-many-YEH2DQL6.js} +23 -23
  210. package/dist/cli-bundle/chunks/{upgrade-VPCIYAVW.js → upgrade-HYJ3SWWU.js} +8 -7
  211. package/dist/cli-bundle/chunks/{upgrade-VPCIYAVW.js.map → upgrade-HYJ3SWWU.js.map} +1 -1
  212. package/dist/cli-bundle/chunks/{upgrade-TJXFLZIX.js → upgrade-UBNLBZNR.js} +6 -5
  213. package/dist/cli-bundle/chunks/{upgrade-TJXFLZIX.js.map → upgrade-UBNLBZNR.js.map} +1 -1
  214. package/dist/cli-bundle/chunks/{validate-PHKIYGSY.js → validate-6QWQVCX2.js} +21 -20
  215. package/dist/cli-bundle/chunks/{validate-PHKIYGSY.js.map → validate-6QWQVCX2.js.map} +1 -1
  216. package/dist/cli-bundle/chunks/{validate-JMNWEUYF.js → validate-W5V5ZGQX.js} +23 -22
  217. package/dist/cli-bundle/chunks/{validate-JMNWEUYF.js.map → validate-W5V5ZGQX.js.map} +1 -1
  218. package/dist/cli-bundle/main.js +38 -22
  219. package/dist/cli-bundle/main.js.map +2 -2
  220. package/dist/cli.js +3 -3
  221. package/dist/cli.js.map +1 -1
  222. package/dist/core/extensions/activation-summary.d.ts +109 -0
  223. package/dist/core/extensions/activation-summary.js +60 -0
  224. package/dist/core/extensions/activation-summary.js.map +1 -0
  225. package/dist/core/extensions/capability-usage.d.ts +92 -0
  226. package/dist/core/extensions/capability-usage.js +142 -0
  227. package/dist/core/extensions/capability-usage.js.map +1 -0
  228. package/dist/core/extensions/extension-capability-aliases.d.ts +7 -0
  229. package/dist/core/extensions/extension-capability-aliases.js +12 -2
  230. package/dist/core/extensions/extension-capability-aliases.js.map +1 -1
  231. package/dist/core/extensions/index.d.ts +1 -0
  232. package/dist/core/extensions/index.js +3 -2
  233. package/dist/core/extensions/index.js.map +1 -1
  234. package/dist/core/telemetry/runtime.js +5 -2
  235. package/dist/core/telemetry/runtime.js.map +1 -1
  236. package/dist/sdk/cli-contracts/enum-contracts.d.ts +1 -1
  237. package/dist/sdk/cli-contracts/enum-contracts.js +4 -2
  238. package/dist/sdk/cli-contracts/enum-contracts.js.map +1 -1
  239. package/dist/sdk/cli-contracts.d.ts +2 -0
  240. package/dist/sdk/cli-contracts.js +26 -13
  241. package/dist/sdk/cli-contracts.js.map +1 -1
  242. package/dist/sdk/compose.d.ts +297 -0
  243. package/dist/sdk/compose.js +420 -0
  244. package/dist/sdk/compose.js.map +1 -0
  245. package/dist/sdk/define.d.ts +194 -0
  246. package/dist/sdk/define.js +205 -0
  247. package/dist/sdk/define.js.map +1 -0
  248. package/dist/sdk/index.d.ts +8 -26
  249. package/dist/sdk/index.js +8 -10
  250. package/dist/sdk/index.js.map +1 -1
  251. package/dist/sdk/testing.d.ts +667 -2
  252. package/dist/sdk/testing.js +654 -18
  253. package/dist/sdk/testing.js.map +1 -1
  254. package/docs/COMMANDS.md +1 -0
  255. package/docs/EXTENSIONS.md +10 -11
  256. package/docs/SDK.md +502 -16
  257. package/package.json +2 -2
  258. package/dist/cli-bundle/chunks/activity-CIHV64UC.js +0 -18
  259. package/dist/cli-bundle/chunks/chunk-32R4PIC6.js.map +0 -1
  260. package/dist/cli-bundle/chunks/chunk-434HM6Z5.js.map +0 -1
  261. package/dist/cli-bundle/chunks/chunk-5PCI3UBT.js.map +0 -7
  262. package/dist/cli-bundle/chunks/chunk-A4Z7ZOL5.js.map +0 -1
  263. package/dist/cli-bundle/chunks/chunk-HC4AWIKT.js.map +0 -7
  264. package/dist/cli-bundle/chunks/chunk-HMOADQVT.js.map +0 -7
  265. package/dist/cli-bundle/chunks/close-DNMHGOCX.js +0 -15
  266. package/dist/cli-bundle/chunks/contracts-3THOLA7L.js.map +0 -7
  267. package/dist/cli-bundle/chunks/contracts-N65FXEOL.js.map +0 -1
  268. package/dist/cli-bundle/chunks/create-NNP6TSFO.js +0 -30
  269. package/dist/cli-bundle/chunks/history-WX3MGFS2.js +0 -20
  270. package/dist/cli-bundle/chunks/history-redact-YQGU3XRA.js +0 -21
  271. package/dist/cli-bundle/chunks/init-SC2P6CHP.js +0 -20
  272. package/dist/cli-bundle/chunks/register-setup-DYBFLEZX.js.map +0 -1
  273. package/dist/cli-bundle/chunks/register-setup-EG2U6CEU.js.map +0 -7
  274. package/dist/cli-bundle/chunks/restore-5KHR2YYQ.js +0 -19
  275. package/dist/cli-bundle/chunks/test-RQCTSWUK.js +0 -35
  276. package/dist/cli-bundle/chunks/update-6YXOGHRT.js +0 -24
  277. package/dist/cli-bundle/chunks/update-V33YUBRP.js +0 -28
  278. /package/dist/cli-bundle/chunks/{activity-KW3IRP44.js.map → activity-H2LMOSSW.js.map} +0 -0
  279. /package/dist/cli-bundle/chunks/{activity-CIHV64UC.js.map → activity-XUZ2AHCW.js.map} +0 -0
  280. /package/dist/cli-bundle/chunks/{aggregate-3ZKQG5SW.js.map → aggregate-EGJLZQBI.js.map} +0 -0
  281. /package/dist/cli-bundle/chunks/{aggregate-FIGQEIL3.js.map → aggregate-R725FC3S.js.map} +0 -0
  282. /package/dist/cli-bundle/chunks/{append-EWJYJ7CH.js.map → append-5J345QGU.js.map} +0 -0
  283. /package/dist/cli-bundle/chunks/{append-QEOLX3XB.js.map → append-O5HPBMRN.js.map} +0 -0
  284. /package/dist/cli-bundle/chunks/{chunk-GOZUHWFD.js.map → chunk-2A34E3BA.js.map} +0 -0
  285. /package/dist/cli-bundle/chunks/{chunk-5QICDWMV.js.map → chunk-2CKH2LMV.js.map} +0 -0
  286. /package/dist/cli-bundle/chunks/{chunk-WQ7NIVDK.js.map → chunk-2RDVQEWV.js.map} +0 -0
  287. /package/dist/cli-bundle/chunks/{chunk-NSBZ2CKF.js.map → chunk-2T3JG6V4.js.map} +0 -0
  288. /package/dist/cli-bundle/chunks/{chunk-76Z3YSHV.js.map → chunk-34EONI5F.js.map} +0 -0
  289. /package/dist/cli-bundle/chunks/{chunk-PUH4D67U.js.map → chunk-3VY3YQO6.js.map} +0 -0
  290. /package/dist/cli-bundle/chunks/{chunk-N5ZJACJ6.js.map → chunk-46G6RSB6.js.map} +0 -0
  291. /package/dist/cli-bundle/chunks/{chunk-SRYYRVPB.js.map → chunk-4BHT5VDC.js.map} +0 -0
  292. /package/dist/cli-bundle/chunks/{chunk-PFSRUHDH.js.map → chunk-4KD54S3Z.js.map} +0 -0
  293. /package/dist/cli-bundle/chunks/{chunk-NIUEXCFS.js.map → chunk-5UVVASSA.js.map} +0 -0
  294. /package/dist/cli-bundle/chunks/{chunk-CF55WVVS.js.map → chunk-5VOINNKT.js.map} +0 -0
  295. /package/dist/cli-bundle/chunks/{chunk-NIGXMNNI.js.map → chunk-66MEDTUD.js.map} +0 -0
  296. /package/dist/cli-bundle/chunks/{chunk-AZMOLBN3.js.map → chunk-7AUB5HNA.js.map} +0 -0
  297. /package/dist/cli-bundle/chunks/{chunk-OTHIWLMB.js.map → chunk-7K2XXO4I.js.map} +0 -0
  298. /package/dist/cli-bundle/chunks/{chunk-7D3SAQXM.js.map → chunk-7MRQ4HMK.js.map} +0 -0
  299. /package/dist/cli-bundle/chunks/{chunk-EBH56IXK.js.map → chunk-7SV63ZHD.js.map} +0 -0
  300. /package/dist/cli-bundle/chunks/{chunk-OFYMIDF2.js.map → chunk-7UGEAPRY.js.map} +0 -0
  301. /package/dist/cli-bundle/chunks/{chunk-LUWW7L4B.js.map → chunk-7XGQXHFB.js.map} +0 -0
  302. /package/dist/cli-bundle/chunks/{chunk-UEMNL33O.js.map → chunk-AD3A7ZD6.js.map} +0 -0
  303. /package/dist/cli-bundle/chunks/{chunk-3EWSGA7N.js.map → chunk-AONIHR2C.js.map} +0 -0
  304. /package/dist/cli-bundle/chunks/{chunk-RVHYI7SL.js.map → chunk-BB6MDVNQ.js.map} +0 -0
  305. /package/dist/cli-bundle/chunks/{chunk-52OCIDPG.js.map → chunk-CE5P2NQR.js.map} +0 -0
  306. /package/dist/cli-bundle/chunks/{chunk-NXS7ZKAK.js.map → chunk-CIIK67GW.js.map} +0 -0
  307. /package/dist/cli-bundle/chunks/{chunk-NB3PYLQ6.js.map → chunk-DT5LPYOD.js.map} +0 -0
  308. /package/dist/cli-bundle/chunks/{chunk-37QXHBIB.js.map → chunk-FIGAZ4Y7.js.map} +0 -0
  309. /package/dist/cli-bundle/chunks/{chunk-UV6IYE5U.js.map → chunk-FXR67XVQ.js.map} +0 -0
  310. /package/dist/cli-bundle/chunks/{chunk-3MDHREEV.js.map → chunk-G6N5VEOK.js.map} +0 -0
  311. /package/dist/cli-bundle/chunks/{chunk-2GCDRRIF.js.map → chunk-GAJVRGGA.js.map} +0 -0
  312. /package/dist/cli-bundle/chunks/{chunk-HCU6WUSY.js.map → chunk-H2IP4QLJ.js.map} +0 -0
  313. /package/dist/cli-bundle/chunks/{chunk-CZUB4XWO.js.map → chunk-H4IIJDE4.js.map} +0 -0
  314. /package/dist/cli-bundle/chunks/{chunk-RLK7P77C.js.map → chunk-HFFUQR73.js.map} +0 -0
  315. /package/dist/cli-bundle/chunks/{chunk-6M4RJS4M.js.map → chunk-IB3GYLQE.js.map} +0 -0
  316. /package/dist/cli-bundle/chunks/{chunk-SX75ADBK.js.map → chunk-IPKJ6B36.js.map} +0 -0
  317. /package/dist/cli-bundle/chunks/{chunk-H7NJZWG2.js.map → chunk-JR2LV3M4.js.map} +0 -0
  318. /package/dist/cli-bundle/chunks/{chunk-PP2U4NMT.js.map → chunk-KFWBJPSG.js.map} +0 -0
  319. /package/dist/cli-bundle/chunks/{chunk-F7K5GWP3.js.map → chunk-LRKKONT2.js.map} +0 -0
  320. /package/dist/cli-bundle/chunks/{chunk-5IDI42VV.js.map → chunk-M4T5DXD5.js.map} +0 -0
  321. /package/dist/cli-bundle/chunks/{chunk-2PKHRP6G.js.map → chunk-MJTINN54.js.map} +0 -0
  322. /package/dist/cli-bundle/chunks/{chunk-QGG32QHW.js.map → chunk-NCVCO3NZ.js.map} +0 -0
  323. /package/dist/cli-bundle/chunks/{chunk-AIS5PGI3.js.map → chunk-NK3UPBVG.js.map} +0 -0
  324. /package/dist/cli-bundle/chunks/{chunk-6H4LF7AO.js.map → chunk-O6LLO73I.js.map} +0 -0
  325. /package/dist/cli-bundle/chunks/{chunk-YCJX76PW.js.map → chunk-P77P2ILI.js.map} +0 -0
  326. /package/dist/cli-bundle/chunks/{chunk-F5NZWFSW.js.map → chunk-Q2KNGP7C.js.map} +0 -0
  327. /package/dist/cli-bundle/chunks/{chunk-GMHPNNYG.js.map → chunk-QH3PJYON.js.map} +0 -0
  328. /package/dist/cli-bundle/chunks/{chunk-NJHMAJ6N.js.map → chunk-QL5RVYOA.js.map} +0 -0
  329. /package/dist/cli-bundle/chunks/{chunk-O47BPOPC.js.map → chunk-S26C36QC.js.map} +0 -0
  330. /package/dist/cli-bundle/chunks/{chunk-D7FYS6PG.js.map → chunk-S2RUQSX2.js.map} +0 -0
  331. /package/dist/cli-bundle/chunks/{chunk-CZPXY7UW.js.map → chunk-SBQTAVJZ.js.map} +0 -0
  332. /package/dist/cli-bundle/chunks/{chunk-M5XALUSL.js.map → chunk-SKH7OGE5.js.map} +0 -0
  333. /package/dist/cli-bundle/chunks/{chunk-NJN7LL7U.js.map → chunk-SKN7LC5W.js.map} +0 -0
  334. /package/dist/cli-bundle/chunks/{chunk-6ZXM2XNF.js.map → chunk-SR3EKWZG.js.map} +0 -0
  335. /package/dist/cli-bundle/chunks/{chunk-B473GZWW.js.map → chunk-T5472OMV.js.map} +0 -0
  336. /package/dist/cli-bundle/chunks/{chunk-2EIMPCE4.js.map → chunk-T72AZDBA.js.map} +0 -0
  337. /package/dist/cli-bundle/chunks/{chunk-6CJWZAN7.js.map → chunk-TQZH6OD6.js.map} +0 -0
  338. /package/dist/cli-bundle/chunks/{chunk-FWPDUYEY.js.map → chunk-U2Z5YUSO.js.map} +0 -0
  339. /package/dist/cli-bundle/chunks/{chunk-HIP7WVTL.js.map → chunk-UVC5LOR7.js.map} +0 -0
  340. /package/dist/cli-bundle/chunks/{chunk-LEU5GHRC.js.map → chunk-VAYA4XFX.js.map} +0 -0
  341. /package/dist/cli-bundle/chunks/{chunk-J4MYYSOL.js.map → chunk-VFAQ4LMN.js.map} +0 -0
  342. /package/dist/cli-bundle/chunks/{chunk-UPE3CDD7.js.map → chunk-W72GHSJE.js.map} +0 -0
  343. /package/dist/cli-bundle/chunks/{chunk-C4N5I7ZW.js.map → chunk-WBRKK5QR.js.map} +0 -0
  344. /package/dist/cli-bundle/chunks/{chunk-Z6T4PQI2.js.map → chunk-WM5ZVBPE.js.map} +0 -0
  345. /package/dist/cli-bundle/chunks/{chunk-TKBHZPKD.js.map → chunk-WZQWHN4R.js.map} +0 -0
  346. /package/dist/cli-bundle/chunks/{chunk-FKBDKV7Y.js.map → chunk-XVF4YARA.js.map} +0 -0
  347. /package/dist/cli-bundle/chunks/{chunk-QZTWBFXJ.js.map → chunk-YDEXO24S.js.map} +0 -0
  348. /package/dist/cli-bundle/chunks/{chunk-FRUFKWNK.js.map → chunk-YJ3SUEPD.js.map} +0 -0
  349. /package/dist/cli-bundle/chunks/{chunk-5FIEHKEX.js.map → chunk-YUDJD3XO.js.map} +0 -0
  350. /package/dist/cli-bundle/chunks/{chunk-Q2J2HJUN.js.map → chunk-ZQ3ZVXX2.js.map} +0 -0
  351. /package/dist/cli-bundle/chunks/{chunk-C3AZ5ZML.js.map → chunk-ZRK4O56R.js.map} +0 -0
  352. /package/dist/cli-bundle/chunks/{claim-RC56YUWG.js.map → claim-4KHAA2RN.js.map} +0 -0
  353. /package/dist/cli-bundle/chunks/{claim-THOJ6CMV.js.map → claim-CSPJFLNH.js.map} +0 -0
  354. /package/dist/cli-bundle/chunks/{close-DNMHGOCX.js.map → close-A3EMKBBY.js.map} +0 -0
  355. /package/dist/cli-bundle/chunks/{close-SG5MNCVQ.js.map → close-W56IOGYG.js.map} +0 -0
  356. /package/dist/cli-bundle/chunks/{close-many-3L3AQZBU.js.map → close-many-BX5DCSVV.js.map} +0 -0
  357. /package/dist/cli-bundle/chunks/{close-many-DKQLBGLV.js.map → close-many-TQU5F4E4.js.map} +0 -0
  358. /package/dist/cli-bundle/chunks/{comments-M7ZOZNBX.js.map → comments-U5KUC4EU.js.map} +0 -0
  359. /package/dist/cli-bundle/chunks/{comments-SKWMDWCW.js.map → comments-VRECH75R.js.map} +0 -0
  360. /package/dist/cli-bundle/chunks/{config-OZCUABPB.js.map → config-D3OKQO52.js.map} +0 -0
  361. /package/dist/cli-bundle/chunks/{config-7CK62S7T.js.map → config-MMJA4LLK.js.map} +0 -0
  362. /package/dist/cli-bundle/chunks/{context-PUG2A7RC.js.map → context-BLBD3PUB.js.map} +0 -0
  363. /package/dist/cli-bundle/chunks/{context-OEC366TO.js.map → context-DHLVPXN3.js.map} +0 -0
  364. /package/dist/cli-bundle/chunks/{copy-JPX7VZCH.js.map → copy-5D5DX3VK.js.map} +0 -0
  365. /package/dist/cli-bundle/chunks/{copy-6QLHILAC.js.map → copy-HHL3K4QP.js.map} +0 -0
  366. /package/dist/cli-bundle/chunks/{create-Y54ZVVZH.js.map → create-IXY43O4H.js.map} +0 -0
  367. /package/dist/cli-bundle/chunks/{create-NNP6TSFO.js.map → create-QVGFYA2X.js.map} +0 -0
  368. /package/dist/cli-bundle/chunks/{delete-63PCMQAJ.js.map → delete-IBUR3M42.js.map} +0 -0
  369. /package/dist/cli-bundle/chunks/{delete-GDSMGAGJ.js.map → delete-QQC2FGUH.js.map} +0 -0
  370. /package/dist/cli-bundle/chunks/{deps-XYQ73XRH.js.map → deps-KWKRHXIN.js.map} +0 -0
  371. /package/dist/cli-bundle/chunks/{deps-T4ZF5G54.js.map → deps-VTPO4BSE.js.map} +0 -0
  372. /package/dist/cli-bundle/chunks/{docs-EHNPDWUL.js.map → docs-7CHFHXLN.js.map} +0 -0
  373. /package/dist/cli-bundle/chunks/{docs-C75YIXHC.js.map → docs-IIO3FEUO.js.map} +0 -0
  374. /package/dist/cli-bundle/chunks/{eval-GTENKE24.js.map → eval-CEYYEPSX.js.map} +0 -0
  375. /package/dist/cli-bundle/chunks/{eval-3WKDTRMH.js.map → eval-IO7LREOL.js.map} +0 -0
  376. /package/dist/cli-bundle/chunks/{extension-D5FDZ2CO.js.map → extension-KCPUWSY2.js.map} +0 -0
  377. /package/dist/cli-bundle/chunks/{extension-46NWACO3.js.map → extension-UTTQDUYI.js.map} +0 -0
  378. /package/dist/cli-bundle/chunks/{files-X3H7CCBQ.js.map → files-TPUL6KWB.js.map} +0 -0
  379. /package/dist/cli-bundle/chunks/{files-DSZBOSSN.js.map → files-Z2HHEFGP.js.map} +0 -0
  380. /package/dist/cli-bundle/chunks/{focus-5STQXDPU.js.map → focus-JVJCGC2D.js.map} +0 -0
  381. /package/dist/cli-bundle/chunks/{focus-MDVPOWB5.js.map → focus-YRNNH7IP.js.map} +0 -0
  382. /package/dist/cli-bundle/chunks/{gc-ZMST3WQP.js.map → gc-O5GUO3SU.js.map} +0 -0
  383. /package/dist/cli-bundle/chunks/{gc-ZC7JHBG7.js.map → gc-PYVVEELM.js.map} +0 -0
  384. /package/dist/cli-bundle/chunks/{get-NT7L2HUZ.js.map → get-ENLTEGTX.js.map} +0 -0
  385. /package/dist/cli-bundle/chunks/{get-J2IPJRZW.js.map → get-X4O3HBEY.js.map} +0 -0
  386. /package/dist/cli-bundle/chunks/{history-RLH2QCRO.js.map → history-AJTXLT6S.js.map} +0 -0
  387. /package/dist/cli-bundle/chunks/{history-WX3MGFS2.js.map → history-AK3E5Z3C.js.map} +0 -0
  388. /package/dist/cli-bundle/chunks/{history-compact-UXDIFC33.js.map → history-compact-43OOUAWD.js.map} +0 -0
  389. /package/dist/cli-bundle/chunks/{history-compact-ZBEBGJM7.js.map → history-compact-46MRHW3I.js.map} +0 -0
  390. /package/dist/cli-bundle/chunks/{history-redact-P7I7AWMB.js.map → history-redact-KUUUVUFM.js.map} +0 -0
  391. /package/dist/cli-bundle/chunks/{history-redact-YQGU3XRA.js.map → history-redact-TWIYQV5J.js.map} +0 -0
  392. /package/dist/cli-bundle/chunks/{history-repair-52KINVIK.js.map → history-repair-B5PZBOPU.js.map} +0 -0
  393. /package/dist/cli-bundle/chunks/{history-repair-RM5ITLU5.js.map → history-repair-VQTYOSRS.js.map} +0 -0
  394. /package/dist/cli-bundle/chunks/{init-2BNZOO6F.js.map → init-BNLVFPRG.js.map} +0 -0
  395. /package/dist/cli-bundle/chunks/{init-SC2P6CHP.js.map → init-RCRKW5PL.js.map} +0 -0
  396. /package/dist/cli-bundle/chunks/{learnings-YGYVHWJK.js.map → learnings-MUUU5KMC.js.map} +0 -0
  397. /package/dist/cli-bundle/chunks/{learnings-W6F3FIPL.js.map → learnings-XSGX52S7.js.map} +0 -0
  398. /package/dist/cli-bundle/chunks/{list-K6FPV4J4.js.map → list-32U7BSKE.js.map} +0 -0
  399. /package/dist/cli-bundle/chunks/{list-KPAYU5KZ.js.map → list-ZEEOHLTQ.js.map} +0 -0
  400. /package/dist/cli-bundle/chunks/{notes-PU74EPKV.js.map → notes-NJ45OZGF.js.map} +0 -0
  401. /package/dist/cli-bundle/chunks/{notes-YTD6ZILW.js.map → notes-OHU25L3M.js.map} +0 -0
  402. /package/dist/cli-bundle/chunks/{plan-GEQYUCBW.js.map → plan-KQA7CAKI.js.map} +0 -0
  403. /package/dist/cli-bundle/chunks/{plan-FNXHXRCI.js.map → plan-LWWAEV5Y.js.map} +0 -0
  404. /package/dist/cli-bundle/chunks/{register-list-query-QI45RMKN.js.map → register-list-query-DDCHPONM.js.map} +0 -0
  405. /package/dist/cli-bundle/chunks/{register-list-query-PHWYHENI.js.map → register-list-query-YNPBVIKM.js.map} +0 -0
  406. /package/dist/cli-bundle/chunks/{register-mutation-YINRTS7L.js.map → register-mutation-7ALWDDAX.js.map} +0 -0
  407. /package/dist/cli-bundle/chunks/{register-mutation-X3BUOQEL.js.map → register-mutation-LAVKYY63.js.map} +0 -0
  408. /package/dist/cli-bundle/chunks/{register-operations-E5JEASRK.js.map → register-operations-R4VOQ6EF.js.map} +0 -0
  409. /package/dist/cli-bundle/chunks/{register-operations-MIDTRW7S.js.map → register-operations-U5JAW3WE.js.map} +0 -0
  410. /package/dist/cli-bundle/chunks/{restore-5KHR2YYQ.js.map → restore-2ZKT6UDC.js.map} +0 -0
  411. /package/dist/cli-bundle/chunks/{restore-XQYSWBV7.js.map → restore-6K53WOWO.js.map} +0 -0
  412. /package/dist/cli-bundle/chunks/{scheduling-shortcuts-NNT5ASZR.js.map → scheduling-shortcuts-NJ5UVJFB.js.map} +0 -0
  413. /package/dist/cli-bundle/chunks/{scheduling-shortcuts-HJMTEXKE.js.map → scheduling-shortcuts-OQVJXG3M.js.map} +0 -0
  414. /package/dist/cli-bundle/chunks/{schema-263RI4WW.js.map → schema-MNTAVQCY.js.map} +0 -0
  415. /package/dist/cli-bundle/chunks/{schema-TZXW6XWD.js.map → schema-RBTJ2YXW.js.map} +0 -0
  416. /package/dist/cli-bundle/chunks/{search-SFRJOVDG.js.map → search-6HOIVZDU.js.map} +0 -0
  417. /package/dist/cli-bundle/chunks/{search-LECJYSXE.js.map → search-ZWYEMASC.js.map} +0 -0
  418. /package/dist/cli-bundle/chunks/{stats-N7ER2PNK.js.map → stats-FS742AMA.js.map} +0 -0
  419. /package/dist/cli-bundle/chunks/{stats-VPBGSRQH.js.map → stats-R5OAJVZK.js.map} +0 -0
  420. /package/dist/cli-bundle/chunks/{telemetry-PP3FUNBU.js.map → telemetry-7DIGDQUO.js.map} +0 -0
  421. /package/dist/cli-bundle/chunks/{telemetry-L6K3BUIQ.js.map → telemetry-FWEXSJLQ.js.map} +0 -0
  422. /package/dist/cli-bundle/chunks/{test-3EGNS3T5.js.map → test-NZF7OT2F.js.map} +0 -0
  423. /package/dist/cli-bundle/chunks/{test-RQCTSWUK.js.map → test-QJXLKV26.js.map} +0 -0
  424. /package/dist/cli-bundle/chunks/{test-runs-GN3C6GOI.js.map → test-runs-C6CFIVOS.js.map} +0 -0
  425. /package/dist/cli-bundle/chunks/{test-runs-AJHR6IQF.js.map → test-runs-IAJDL6CA.js.map} +0 -0
  426. /package/dist/cli-bundle/chunks/{update-V33YUBRP.js.map → update-2XCQNOD6.js.map} +0 -0
  427. /package/dist/cli-bundle/chunks/{update-6YXOGHRT.js.map → update-IWUCXVH2.js.map} +0 -0
  428. /package/dist/cli-bundle/chunks/{update-many-RYQ64CFW.js.map → update-many-MUTIOAP3.js.map} +0 -0
  429. /package/dist/cli-bundle/chunks/{update-many-N2AN6ZDH.js.map → update-many-YEH2DQL6.js.map} +0 -0
package/docs/SDK.md CHANGED
@@ -36,6 +36,8 @@ Source of truth:
36
36
  Common authoring exports:
37
37
 
38
38
  - `defineExtension`
39
+ - `composeExtension` / `deriveExtensionCapabilities`
40
+ - `describeExtensionBlueprint` (static surface map of a blueprint) / `lintExtensionBlueprint` (author-time preflight)
39
41
  - `EXTENSION_CAPABILITIES`
40
42
  - `EXTENSION_CAPABILITY_CONTRACT`
41
43
  - `EXTENSION_CAPABILITY_CONTRACT_VERSION`
@@ -48,6 +50,14 @@ Common authoring exports:
48
50
  - `createPmCliExpectedError`
49
51
  - `isPmCliExpectedError`
50
52
 
53
+ Registration builders (`define*`, zero-cost identity — see [Authoring Builders](#authoring-builders)):
54
+
55
+ - `defineCommand` / `defineFlag` / `defineItemType` / `defineItemField` / `defineMigration`
56
+ - `defineSearchProvider` / `defineVectorStoreAdapter`
57
+ - `defineCommandOverride` / `defineParserOverride` / `definePreflightOverride` / `defineServiceOverride` / `defineRendererOverride`
58
+ - `defineImporter` / `defineExporter`
59
+ - `defineBeforeCommandHook` / `defineAfterCommandHook` / `defineOnWriteHook` / `defineOnReadHook` / `defineOnIndexHook`
60
+
51
61
  Package manifest exports:
52
62
 
53
63
  - `PM_PACKAGE_RESOURCE_KINDS` (`extensions`, `docs`, `examples`, `assets`, `prompts`)
@@ -73,7 +83,22 @@ Command/action contract exports:
73
83
 
74
84
  Testing helper exports (also under `@unbrained/pm-cli/sdk/testing`):
75
85
 
86
+ - `createExtensionTestHarness`
76
87
  - `activateExtensionForTest`
88
+ - `deactivateExtensionForTest`
89
+ - `runRegisteredCommandForTest`
90
+ - `runRegisteredHookForTest`
91
+ - `runRegisteredParserOverrideForTest`
92
+ - `runRegisteredPreflightOverrideForTest`
93
+ - `runRegisteredCommandOverrideForTest`
94
+ - `runRegisteredRendererOverrideForTest`
95
+ - `runRegisteredServiceOverrideForTest`
96
+ - `runRegisteredSearchProviderForTest`
97
+ - `runRegisteredVectorStoreAdapterForTest`
98
+ - `runRegisteredMigrationForTest`
99
+ - `runRegisteredImporterForTest`
100
+ - `runRegisteredExporterForTest`
101
+ - `assertExtensionDeactivated`
77
102
  - `assertPackageManifest`
78
103
  - `assertRegisteredCommandContract`
79
104
  - `assertRegisteredFlags`
@@ -90,6 +115,171 @@ Testing helper exports (also under `@unbrained/pm-cli/sdk/testing`):
90
115
  - `assertRegisteredItemType`
91
116
  - `assertRegisteredServiceOverride`
92
117
  - `assertRegisteredMigration`
118
+ - `assertExtensionCapabilityUsage`
119
+ - `assertExtensionBlueprint` (throwing preflight; pairs with `lintExtensionBlueprint`)
120
+ - `describeExtensionActivation`
121
+ - `describeExtensionBlueprint` / `lintExtensionBlueprint` (also surfaced here for the full author → describe → preflight → test loop)
122
+
123
+ `createExtensionTestHarness(module, options)` is the recommended entry point and
124
+ the ergonomic capstone over every standalone helper below: it activates the
125
+ module once and returns a fluent `ExtensionTestHarness` whose `assert*`/`run*`
126
+ methods are pre-bound to the correct activation sub-registry, so a package author
127
+ never threads `activation.registrations` vs `activation.commands` vs
128
+ `activation.hooks` (etc.) by hand — picking the wrong one is a common footgun that
129
+ surfaces as a confusing `available: (none)` error. Write
130
+ `const ext = await createExtensionTestHarness(module, { capabilities: ["commands"] })`,
131
+ then `ext.assertCommandContract({ command })`, `await ext.runCommand({ command })`,
132
+ and `await ext.deactivate()`. The methods do not use `this`, so they remain safe
133
+ to destructure (`const { runCommand } = ext;`), and the raw `ext.activation`
134
+ stays public as an escape hatch to the standalone helpers for any surface a
135
+ convenience method does not cover.
136
+
137
+ `assertExtensionCapabilityUsage(activation, { declared })` is the least-privilege
138
+ counterpart of the per-surface `assertRegistered*` helpers: pass the same
139
+ capabilities as your `manifest.capabilities` and it fails the test when the
140
+ manifest grants a capability the extension never registers against. Use
141
+ `allowUnused` for capabilities a runtime registers only behind a config flag.
142
+
143
+ `deactivateExtensionForTest(module, options)` is the teardown counterpart to
144
+ `activateExtensionForTest`: it runs pm's real `deactivateExtensions` engine
145
+ (including the bounded per-hook timeout and best-effort failure capture) over the
146
+ module and returns the `ExtensionDeactivationResult`, so a package can prove its
147
+ `deactivate` releases the resources `activate` opened. `assertExtensionDeactivated(result)`
148
+ asserts the single-extension happy path (one extension deactivated, none failed)
149
+ by default; pass `{ deactivated, failed }` to assert other counts. Forward the
150
+ `activation` result and `deactivateTimeoutMs` to mirror real host teardown.
151
+
152
+ `runRegisteredCommandForTest(activation.commands, { command, args, options, global, pmRoot })`
153
+ is the "invoke" verb that completes the package-author testing loop —
154
+ `activateExtensionForTest` → `assertRegisteredCommandContract` → **run** →
155
+ `deactivateExtensionForTest`. It dispatches a registered command handler through
156
+ pm's real engine and returns the `CommandHandlerResult`, so a test can assert
157
+ *behavior* (`result.result`) rather than only that the command is wired. The
158
+ `CommandHandlerContext` is built with agent-safe global defaults
159
+ (`{ json: true, quiet: true, noPager: true }`) that callers may override. A clean
160
+ run yields `{ handled: true, result, warnings: [] }`; a handler that throws a
161
+ non-exit error yields `{ handled: false, warnings: [code], errorMessage }` so the
162
+ failure can be asserted, while one that throws an error carrying a numeric
163
+ `exitCode` propagates the throw. An unregistered command throws a descriptive
164
+ error listing the available handler command paths. Because
165
+ `registerImporter`/`registerExporter` register handlers under `"<name> import"` /
166
+ `"<name> export"`, the same helper exercises importer and exporter handlers too.
167
+
168
+ The remaining runtime surfaces an extension can register have matching invoke
169
+ helpers, so the "invoke" verb covers the whole command pipeline — not just
170
+ command handlers:
171
+
172
+ - `runRegisteredHookForTest(activation.hooks, { kind, context })` fires every
173
+ registered lifecycle hook of a `kind` (`before_command` | `after_command` |
174
+ `on_read` | `on_write` | `on_index`) through pm's real hook runner and returns
175
+ the warnings array (`[]` = clean; a thrown hook contributes one
176
+ `extension_hook_failed:*` warning while the others still run). The `context` is
177
+ type-safe per `kind`.
178
+ - `runRegisteredParserOverrideForTest(activation.parsers, context)` returns the
179
+ rewritten `ParserOverrideResult` (args/options/global the override produces
180
+ before dispatch).
181
+ - `runRegisteredPreflightOverrideForTest(activation.preflight, context)` returns
182
+ the `PreflightOverrideResult` (the migration/format gate decision).
183
+ - `runRegisteredCommandOverrideForTest(activation.commands, context)` returns the
184
+ `CommandOverrideResult` (the transformed command result payload).
185
+ - `runRegisteredRendererOverrideForTest(activation.renderers, context)` returns
186
+ the `RendererOverrideResult` (the custom string rendered for an output format).
187
+ - `runRegisteredServiceOverrideForTest(activation.services, context)` returns the
188
+ `ServiceOverrideResult` (how the override handles an internal service payload).
189
+
190
+ Each override helper guards that a matching override is registered for the target
191
+ (command / format / service), so a typo surfaces as a descriptive error rather
192
+ than a silent `overridden: false` / `handled: false`.
193
+
194
+ The *executable registration* surfaces — search providers, vector store
195
+ adapters, schema migrations, importers, and exporters — also have invoke helpers,
196
+ so every executable register\* method has both an `assertRegistered*` and a
197
+ `runRegistered*ForTest` counterpart. Each exercises the real registered behavior,
198
+ not a re-implementation, but along two execution paths that mirror how the host
199
+ runs them. Providers, adapters, and migrations are resolved through the same
200
+ runtime resolver the host uses and invoked via their `runtime_definition` (the
201
+ clone that preserves live functions). Importers and exporters have no standalone
202
+ `runtime_definition` — `registerImporter`/`registerExporter` wrap their handler
203
+ into a command path, so their helpers resolve by name and dispatch through the
204
+ command runner instead, returning a `CommandHandlerResult`:
205
+
206
+ - `runRegisteredSearchProviderForTest(activation.registrations, { provider, operation, context })`
207
+ resolves a registered provider by name (case-insensitive, last registration
208
+ wins) and invokes one `operation` — `query`, `embed`, `embedBatch`,
209
+ `queryExpansion`, or `rerank` — returning that operation's result. The
210
+ `context` and return type are inferred from `operation`, and the camelCase /
211
+ snake_case spellings the host accepts (`embedBatch`/`embed_batch`,
212
+ `queryExpansion`/`query_expansion`) both resolve.
213
+ - `runRegisteredVectorStoreAdapterForTest(activation.registrations, { adapter, operation, context })`
214
+ resolves a registered adapter by name and invokes `query` (returns
215
+ `VectorStoreQueryHit[]`), `upsert`, or `delete`.
216
+ - `runRegisteredMigrationForTest(activation.registrations, { migration, extensionName?, pmRoot? })`
217
+ resolves a registered migration by id and invokes its `run` with a context
218
+ mirroring the host's (`command: "migration"`, the registering extension's
219
+ layer/name, the supplied `pmRoot`, and the migration's normalized status),
220
+ returning whatever `run` returns. Unlike the host — which skips applied
221
+ migrations and folds a throw into a warning — it always invokes `run` and lets a
222
+ throw propagate, so both success and failure are assertable.
223
+ - `runRegisteredImporterForTest(activation, { importer, extensionName?, args?, options?, global?, pmRoot? })`
224
+ and `runRegisteredExporterForTest(activation, { exporter, ... })` resolve a
225
+ registered importer/exporter by name, derive the `"<name> import"` /
226
+ `"<name> export"` command path internally — so authors never hand-build it — and
227
+ validate that the name is genuinely a registered importer/exporter before
228
+ dispatching. They take the whole `activation` because resolution spans two
229
+ sub-registries (`registrations` proves it exists, `commands` holds the wrapped
230
+ handler), and they return the command runner's `CommandHandlerResult` verbatim,
231
+ so `handled`/`warnings`/`errorMessage` semantics and `exitCode` propagation match
232
+ invoking the importer/exporter as a command.
233
+
234
+ Each surface helper guards that the named provider / adapter / migration /
235
+ importer / exporter is registered (and, for providers and adapters, implements the
236
+ requested operation), so a typo surfaces as a descriptive error rather than a
237
+ silent no-op. All invoke helpers are `async`, so a test always `await`s them.
238
+
239
+ `describeExtensionActivation(activation, { extensionName })` is the **describe**
240
+ (enumerate-all) verb that complements the `assertRegistered*` (verify-one) and
241
+ `runRegistered*ForTest` (invoke-one) helpers. The activation result already
242
+ carries per-surface *counts*; this returns the *names*. It walks every
243
+ sub-registry once and returns a flat `ExtensionActivationSummary` whose arrays
244
+ are de-duplicated and locale-sorted (except `hooks`, emitted in canonical
245
+ lifecycle order to mirror `hook_counts`) of every registered surface's
246
+ identifiers — command paths, hook kinds, item-type /
247
+ field names, migration ids, importer / exporter / provider / adapter names,
248
+ overridden service names and renderer formats, flag target-commands, and the
249
+ preflight-override count — plus the `capabilities` those surfaces exercise. Two
250
+ uses:
251
+
252
+ ```ts
253
+ import { describeExtensionActivation } from "@unbrained/pm-cli/sdk/testing";
254
+
255
+ const summary = describeExtensionActivation(activation);
256
+ // Least-privilege check: assert the WHOLE registration surface in one deepEqual.
257
+ assert.deepEqual(summary.commands, ["greet hello"]);
258
+ assert.deepEqual(summary.hooks, ["after_command"]);
259
+ assert.deepEqual(summary.capabilities, ["commands", "hooks"]);
260
+ ```
261
+
262
+ Without `extensionName` the summary unions every extension in the activation;
263
+ with it (matched case-insensitively after trimming, like
264
+ `collectUsedExtensionCapabilities`) only that extension's registrations
265
+ contribute. The three command fields capture distinct dimensions and can
266
+ overlap: `commands` lists definitions declared via `registerCommand(definition)`,
267
+ `command_handlers` lists every command path backed by an extension handler (a
268
+ superset that also includes the synthesized `"<name> import"` / `"<name> export"`
269
+ importer/exporter paths), and `command_overrides` lists built-in commands
270
+ replaced via `registerCommand(name, override)`. For agents, one call returns the
271
+ entire surface instead of traversing fifteen-plus sub-registries — keeping the context
272
+ window lean ("project management = context management").
273
+
274
+ The same verb is reachable from the CLI and MCP without writing a test:
275
+ `pm extension describe [name]` / `pm package describe [name]` (and `pm_run` with
276
+ `action: "extension"`/`"package"` and `describe: true`) activate the workspace's
277
+ extensions and return each loaded extension's `ExtensionActivationSummary` under
278
+ `details.extensions[].surfaces`, plus a deduplicated `details.union`. Omit the name
279
+ to map every loaded package; pass one to scope to it. This is the agent-facing answer
280
+ to "what does this installed package add to my context?" — distinct from
281
+ `pm package doctor` (errors/policy) and `pm package manage` (update metadata), which
282
+ report only command/action paths, not the full registration surface.
93
283
 
94
284
  Commander option contract exports:
95
285
 
@@ -116,9 +306,17 @@ Extension runtime contract exports:
116
306
  - `PM_EXTENSION_TRUST_MODE_CONTRACTS`
117
307
  - `PM_EXTENSION_SANDBOX_PROFILE_CONTRACTS`
118
308
 
309
+ Least-privilege capability reconciliation exports (map declared capabilities to
310
+ the registration surfaces a package actually exercises at activation):
311
+
312
+ - `EXTENSION_CAPABILITY_REGISTRATION_SURFACES`
313
+ - `collectUsedExtensionCapabilities`
314
+ - `reconcileExtensionCapabilityUsage`
315
+
119
316
  Common types:
120
317
 
121
318
  - `ExtensionApi`
319
+ - `ExtensionActivationSummary`
122
320
  - `ExtensionManifest`
123
321
  - `ExtensionManifestEngines`
124
322
  - `CommandDefinition`
@@ -196,26 +394,18 @@ assertPackageManifest(manifest, {
196
394
  ```
197
395
 
198
396
  Package tests can also assert extension registrations without importing private
199
- loader internals. Use `activateExtensionForTest` plus the targeted assertion for
200
- the surface your package owns:
397
+ loader internals. Prefer `createExtensionTestHarness` its `assert*`/`run*`
398
+ methods bind to the right sub-registry for you:
201
399
 
202
400
  ```ts
203
- import {
204
- activateExtensionForTest,
205
- assertRegisteredCommandContract,
206
- assertRegisteredFlags,
207
- } from "@unbrained/pm-cli/sdk/testing";
401
+ import { createExtensionTestHarness } from "@unbrained/pm-cli/sdk/testing";
208
402
 
209
- const activation = await activateExtensionForTest(extensionModule);
403
+ const ext = await createExtensionTestHarness(extensionModule, { capabilities: ["commands", "schema"] });
210
404
 
211
- assertRegisteredCommandContract(activation.registrations, {
212
- command: "incident triage",
213
- flags: ["--severity"],
214
- });
215
- assertRegisteredFlags(activation.registrations, {
216
- targetCommand: "list",
217
- flags: ["--incident-filter"],
218
- });
405
+ ext.assertCommandContract({ command: "incident triage", flags: ["--severity"] });
406
+ ext.assertFlags({ targetCommand: "list", flags: ["--incident-filter"] });
407
+ const { result } = await ext.runCommand({ command: "incident triage", options: { severity: "high" } });
408
+ await ext.deactivate();
219
409
  ```
220
410
 
221
411
  For provider-safe schemas, use `PM_PROVIDER_TOOL_PARAMETERS_SCHEMA`. It is flat and avoids advanced schema constructs such as root `oneOf`.
@@ -282,6 +472,16 @@ Manifest:
282
472
  "version": "0.1.0",
283
473
  "entry": "./index.js",
284
474
  "pm_min_version": "2026.5.31",
475
+ "trusted": true,
476
+ "sandbox_profile": "strict",
477
+ "permissions": {
478
+ "fs_read": false,
479
+ "fs_write": false,
480
+ "network": false,
481
+ "env_read": false,
482
+ "env_write": false,
483
+ "process_spawn": false
484
+ },
285
485
  "capabilities": ["commands"]
286
486
  }
287
487
  ```
@@ -300,11 +500,27 @@ Manifest typing also accepts optional `engines` metadata:
300
500
  ```
301
501
 
302
502
  Use `pm_min_version` for the loader gate. Keep `engines` as package-manager and tooling metadata.
503
+ For pure command packages, keep `trusted: true`, `sandbox_profile: "strict"`, and all six permissions set to `false`; relax only the permission keys the package actually needs and verify the result with `pm package doctor --project --detail deep --trace`.
303
504
 
304
505
  For a complete commands-capability package that combines `registerCommand`,
305
506
  `registerFlags`, and `registerParser`, see the first-party
306
507
  [pm-command-kit exemplar](../packages/pm-command-kit/README.md).
307
508
 
509
+ For a generated starter, use `pm package init ./my-package`. Pass
510
+ `--capability hooks` to scaffold a command plus an `afterCommand` lifecycle
511
+ reactor and a runnable `node:test` file that exercises
512
+ `activateExtensionForTest`, `assertRegisteredHook`, `runRegisteredHookForTest`,
513
+ and `deactivateExtensionForTest`. Pass `--capability search` to scaffold a
514
+ command plus a deterministic search provider/vector-store adapter pair and a
515
+ runnable `node:test` file that exercises `assertRegisteredSearchProvider`,
516
+ `assertRegisteredVectorStoreAdapter`, `runRegisteredSearchProviderForTest`, and
517
+ `runRegisteredVectorStoreAdapterForTest`. Pass `--capability importers` to
518
+ scaffold paired import/export commands with example flag metadata and a runnable
519
+ `node:test` file that exercises `assertRegisteredImporter`,
520
+ `assertRegisteredExporter`, `runRegisteredImporterForTest`, and
521
+ `runRegisteredExporterForTest`; the generated manifest declares both `importers`
522
+ and `schema` because extension flag metadata is schema-governed.
523
+
308
524
  ## Self-Identity and Lifecycle
309
525
 
310
526
  `activate(api)` receives a read-only `api.extension` describing the extension it
@@ -410,6 +626,153 @@ import { createPmCliExpectedError } from "@unbrained/pm-cli/sdk/runtime";
410
626
 
411
627
  `PM_CLI_PACKAGE_ROOT` is reserved for first-party packages bundled inside this repository. Those packages use it to locate the running CLI's `dist/sdk/runtime.js` before they are installed as independent npm packages. External packages must not depend on `PM_CLI_PACKAGE_ROOT`, `dist/` paths, or `src/core/...`; declare `@unbrained/pm-cli` as a dependency or peer dependency and import the public SDK subpaths instead. When pm installs a registry package, it links that dependency to the running host CLI so the package gets the active SDK without downloading a second CLI copy into the project.
412
628
 
629
+ ## Authoring Builders
630
+
631
+ Tracked: [pm-12tj](../.agents/pm/features/pm-12tj.toon) (design rationale: ADR [pm-3mph](../.agents/pm/decisions/pm-3mph.toon)).
632
+
633
+ The `define*` builders are the authoring half of the `author → register → test`
634
+ loop: they type a registration definition where you write it, before it ever
635
+ reaches `api.register*`. Each is a zero-cost identity function (it returns its
636
+ argument unchanged), exactly like `defineExtension` and the wider
637
+ `defineConfig`/`defineComponent` ecosystem convention — the value is entirely at
638
+ the type level.
639
+
640
+ This matters most in **plain-JavaScript packages** (the default `pm package init`
641
+ scaffold). A bare `const cmd = { ... }` is unchecked because JS has no type
642
+ annotations; wrapping it in a builder restores full contract checking and infers
643
+ the nested handler's `context` parameter through the editor's TypeScript language
644
+ service. It also lets you colocate, export, reuse, and unit-test a definition
645
+ apart from `activate`:
646
+
647
+ ```js
648
+ import { defineCommand, defineAfterCommandHook } from "@unbrained/pm-cli/sdk";
649
+
650
+ // `context` is inferred even though this is a .js file with no annotations.
651
+ export const greetCommand = defineCommand({
652
+ name: "greet hello",
653
+ action: "greet-hello",
654
+ description: "Say hello.",
655
+ run: (context) => ({ greeting: `hi ${context.args[0] ?? "world"}` }),
656
+ });
657
+
658
+ export const auditHook = defineAfterCommandHook((context) => {
659
+ if (!context.ok) return;
660
+ // react to context.affected — "project management = context management"
661
+ });
662
+
663
+ export function activate(api) {
664
+ api.registerCommand(greetCommand);
665
+ api.hooks.afterCommand(auditHook);
666
+ }
667
+ ```
668
+
669
+ Object-definition builders (`defineExtensionManifest`, `defineCommand`,
670
+ `defineFlag`, `defineItemType`, `defineItemField`, `defineMigration`,
671
+ `defineSearchProvider`, `defineVectorStoreAdapter`) preserve the narrow literal
672
+ type. `defineExtensionManifest` additionally contract-checks the in-module
673
+ manifest mirror where it is authored and pairs with `deriveExtensionCapabilities`
674
+ (see [Declarative Authoring](#declarative-authoring)). Function-definition
675
+ builders (`defineCommandOverride`, `defineParserOverride`,
676
+ `definePreflightOverride`, `defineServiceOverride`, `defineRendererOverride`,
677
+ `defineImporter`, `defineExporter`, and the five hook builders
678
+ `defineBeforeCommandHook` / `defineAfterCommandHook` / `defineOnWriteHook` /
679
+ `defineOnReadHook` / `defineOnIndexHook`) are non-generic so a bare arrow's
680
+ parameter is contextually typed instead of falling back to `any`. The
681
+ [`assertRegistered*`](#testing-helpers) helpers below verify these same
682
+ definitions once registered.
683
+
684
+ ## Declarative Authoring
685
+
686
+ Tracked: [pm-iqq0](../.agents/pm/features/pm-iqq0.toon).
687
+
688
+ `composeExtension` is the capstone of the `author → register → test` loop. Instead
689
+ of hand-wiring each `api.register*` call inside an imperative `activate(api)`
690
+ body — calling the right method, in the right order, without forgetting one —
691
+ describe **what** to register as a plain `ExtensionBlueprint` object and let the
692
+ SDK generate the `activate` for you. Every field is optional; populate the
693
+ surfaces you use (ideally with `define*`-authored definitions) and leave the rest
694
+ out:
695
+
696
+ ```js
697
+ import { composeExtension, defineCommand, deriveExtensionCapabilities } from "@unbrained/pm-cli/sdk";
698
+
699
+ const echo = defineCommand({
700
+ name: "command-kit echo",
701
+ action: "command-kit-echo",
702
+ description: "Echo a message as structured output.",
703
+ run: (context) => ({ message: context.args.join(" ") }),
704
+ });
705
+
706
+ const blueprint = {
707
+ commands: [echo],
708
+ parsers: { "command-kit echo": (context) => ({ options: context.options }) },
709
+ flags: { list: [{ long: "--kit-note", value_type: "string", value_name: "text" }] },
710
+ };
711
+
712
+ // The generated `activate` registers commands → overrides → flags → parsers →
713
+ // renderers → services → preflights → item types → item fields → migrations →
714
+ // search providers → vector store adapters → importers → exporters → hooks, then
715
+ // awaits any imperative `activate` you also pass (an escape hatch run last).
716
+ export default composeExtension(blueprint);
717
+ ```
718
+
719
+ `deriveExtensionCapabilities(blueprint)` returns the exact least-privilege
720
+ capability set the blueprint exercises (sorted, de-duplicated), so you can author
721
+ `manifest.json` `capabilities` with zero declared-but-unused or used-but-undeclared
722
+ drift. It is the author-time inverse of the runtime
723
+ [`reconcileExtensionCapabilityUsage`](#capability-requirements) check, and the set
724
+ it returns is the set `composeExtension`'s generated `activate` requires — they
725
+ agree by construction:
726
+
727
+ ```js
728
+ deriveExtensionCapabilities(blueprint); // ["commands", "parser", "schema"]
729
+ ```
730
+
731
+ The blueprint's record-keyed fields (`commandOverrides`, `flags`, `parsers`,
732
+ `renderers`, `services`) map a routing key to its handler, mirroring the
733
+ two-argument `api.register*` overloads; `hooks` groups the five lifecycle kinds.
734
+ `composeExtension` is a pure assembler: it does not validate definitions —
735
+ per-surface contract enforcement stays in `api.register*` and the loader, so a
736
+ malformed definition surfaces the same activation diagnostic as a hand-written
737
+ `activate`. The bundled first-party packages intentionally keep import-free
738
+ hand-written `activate` bodies so they load in extension-only installs; reach for
739
+ `composeExtension` in npm package-mode authoring where the SDK is a dependency.
740
+
741
+ ### Author-time introspection and preflight
742
+
743
+ Tracked: [pm-tlpv](../.agents/pm/features/pm-tlpv.toon),
744
+ [pm-9ect](../.agents/pm/features/pm-9ect.toon),
745
+ [pm-4oio](../.agents/pm/decisions/pm-4oio.toon).
746
+
747
+ Two pure, no-activation helpers complete the loop, so a blueprint is fully
748
+ inspectable and verifiable before it is ever loaded — the author-time inverse of
749
+ the runtime guardrails (the same discipline as `deriveExtensionCapabilities`
750
+ inverting [`reconcileExtensionCapabilityUsage`](#capability-requirements)):
751
+
752
+ ```js
753
+ import { describeExtensionBlueprint, lintExtensionBlueprint } from "@unbrained/pm-cli/sdk";
754
+
755
+ // describeExtensionBlueprint returns the same ExtensionActivationSummary shape as
756
+ // the runtime describeExtensionActivation — but from the blueprint data alone, no
757
+ // activation. It is to the named surfaces what deriveExtensionCapabilities is to
758
+ // the capability set.
759
+ describeExtensionBlueprint(blueprint).command_handlers; // ["command-kit echo", ...]
760
+
761
+ // lintExtensionBlueprint preflights for the footguns activation would otherwise
762
+ // surface late: a capability a surface exercises but the manifest omits is an
763
+ // `error` (the loader throws extension_capability_missing); a declared-but-unused
764
+ // capability, a duplicate command, a command/override conflict, and a present-but-
765
+ // empty surface are `warning`s. Pass declaredCapabilities or set manifest.capabilities.
766
+ const report = lintExtensionBlueprint(blueprint, { declaredCapabilities: ["commands", "parser", "schema"] });
767
+ report.ok; // false if any error-severity finding
768
+ report.findings; // [{ code, severity, message, capability?/command?/field? }, ...]
769
+ ```
770
+
771
+ Both read only the declarative data, so the imperative `activate` escape hatch is
772
+ invisible to them — a blueprint that registers everything through that hatch
773
+ summarizes as empty and lints clean. In a package test, `assertExtensionBlueprint`
774
+ (below) turns the lint into a one-line CI guard.
775
+
413
776
  ## Testing Helpers
414
777
 
415
778
  Package tests can assert registration contracts without depending on Vitest-specific
@@ -457,6 +820,96 @@ guardrails, but it does not discover files or install packages. Use it for unit
457
820
  tests of extension registration shape; keep `pm package doctor` and runtime
458
821
  contracts in integration tests.
459
822
 
823
+ For declarative (`composeExtension`) packages, `assertExtensionBlueprint(blueprint, options?)`
824
+ is the `assert*` family member that preflights the blueprint *without* activating
825
+ it — it runs `lintExtensionBlueprint` and throws if any finding is error-severity
826
+ (today: a capability a surface exercises but the declared set omits, which would
827
+ fail activation with `extension_capability_missing`). It returns the full
828
+ `ExtensionBlueprintLintResult` on success so a test can still inspect advisory
829
+ warnings:
830
+
831
+ ```ts
832
+ import { assertExtensionBlueprint } from "@unbrained/pm-cli/sdk/testing";
833
+
834
+ // Throws if the blueprint and its declared capabilities have drifted; otherwise
835
+ // returns the lint result (including any non-blocking warnings) for inspection.
836
+ const report = assertExtensionBlueprint(blueprint);
837
+ ```
838
+
839
+ Invoke a registered command handler to assert its behavior (not just that it was
840
+ registered). `runRegisteredCommandForTest` dispatches through pm's real engine and
841
+ returns the `CommandHandlerResult`:
842
+
843
+ ```ts
844
+ import { runRegisteredCommandForTest } from "@unbrained/pm-cli/sdk/testing";
845
+
846
+ const invocation = await runRegisteredCommandForTest(activation.commands, {
847
+ command: "hello",
848
+ options: { name: "ada" },
849
+ });
850
+
851
+ // invocation.handled === true; invocation.result is the handler's return value.
852
+ ```
853
+
854
+ Importers and exporters get dedicated name-based helpers so tests never hand-build
855
+ the `"<name> import"` / `"<name> export"` command path. Pass the whole `activation`
856
+ and the registration name:
857
+
858
+ ```ts
859
+ import { runRegisteredImporterForTest, runRegisteredExporterForTest } from "@unbrained/pm-cli/sdk/testing";
860
+
861
+ const imported = await runRegisteredImporterForTest(activation, {
862
+ importer: "csv",
863
+ options: { rows: 3 },
864
+ });
865
+ const exported = await runRegisteredExporterForTest(activation, { exporter: "csv" });
866
+
867
+ // Both return a CommandHandlerResult: imported.result is the importer's return value.
868
+ ```
869
+
870
+ Fire a registered lifecycle hook to assert its behavior (the `context` is
871
+ type-safe per `kind`). A clean run returns `[]`; a hook that throws contributes a
872
+ single `extension_hook_failed:*` warning while the others still run:
873
+
874
+ ```ts
875
+ import { runRegisteredHookForTest } from "@unbrained/pm-cli/sdk/testing";
876
+
877
+ const warnings = await runRegisteredHookForTest(activation.hooks, {
878
+ kind: "after_command",
879
+ context: { command: "close", args: ["pm-1a2b"], pm_root: "", ok: true },
880
+ });
881
+ // warnings === [] when every after_command hook ran cleanly.
882
+ ```
883
+
884
+ The override surfaces have parallel invoke helpers that delegate to pm's real
885
+ runners and return the override result verbatim, after guarding that a matching
886
+ override is registered for the target (command / format / service):
887
+
888
+ ```ts
889
+ import {
890
+ runRegisteredParserOverrideForTest,
891
+ runRegisteredCommandOverrideForTest,
892
+ runRegisteredRendererOverrideForTest,
893
+ runRegisteredServiceOverrideForTest,
894
+ runRegisteredPreflightOverrideForTest,
895
+ } from "@unbrained/pm-cli/sdk/testing";
896
+
897
+ const parsed = await runRegisteredParserOverrideForTest(activation.parsers, {
898
+ command: "deploy",
899
+ args: ["staging"],
900
+ options: {},
901
+ global: {},
902
+ pm_root: "",
903
+ });
904
+ // parsed.overridden === true; parsed.context holds the rewritten args/options.
905
+
906
+ const rendered = await runRegisteredRendererOverrideForTest(activation.renderers, {
907
+ format: "toon",
908
+ result: { id: "pm-1a2b" },
909
+ });
910
+ // rendered.rendered is the custom string the override produced.
911
+ ```
912
+
460
913
  Assert a command registration contract:
461
914
 
462
915
  ```ts
@@ -585,6 +1038,39 @@ Together these complete the SDK assertion surface: every extension `register*`
585
1038
  method now has a matching `assertRegistered*` helper, so packages can prove any
586
1039
  registration without importing private registry internals.
587
1040
 
1041
+ The three executable registration surfaces add `runRegistered*ForTest` invoke
1042
+ helpers on top of those assertions, so a package can exercise the real behavior of
1043
+ a custom provider, adapter, or migration:
1044
+
1045
+ ```ts
1046
+ import {
1047
+ runRegisteredSearchProviderForTest,
1048
+ runRegisteredVectorStoreAdapterForTest,
1049
+ runRegisteredMigrationForTest,
1050
+ } from "@unbrained/pm-cli/sdk/testing";
1051
+
1052
+ // Invoke a registered provider's semantic query (or embed / embedBatch /
1053
+ // queryExpansion / rerank); the result type follows `operation`.
1054
+ const hits = await runRegisteredSearchProviderForTest(activation.registrations, {
1055
+ provider: "semantic-local",
1056
+ operation: "query",
1057
+ context: { query: "calendar", mode: "semantic", tokens: ["calendar"], options: {}, settings, documents },
1058
+ });
1059
+
1060
+ // Invoke a registered adapter's upsert / query / delete.
1061
+ await runRegisteredVectorStoreAdapterForTest(activation.registrations, {
1062
+ adapter: "pinecone",
1063
+ operation: "upsert",
1064
+ context: { points: [{ id: "pm-1", vector }], settings },
1065
+ });
1066
+
1067
+ // Invoke a registered migration's run with a host-shaped context.
1068
+ await runRegisteredMigrationForTest(activation.registrations, {
1069
+ migration: "backfill-severity",
1070
+ pmRoot,
1071
+ });
1072
+ ```
1073
+
588
1074
  The bundled `pm-lifecycle-hooks` package is the first-party hooks exemplar. It
589
1075
  declares only the `hooks` capability and registers a default-inert `afterCommand`
590
1076
  hook, so package authors can copy a lifecycle pattern that does not write files,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-cli",
3
- "version": "2026.6.21",
3
+ "version": "2026.6.23",
4
4
  "description": "Git-native project management CLI for humans and agents.",
5
5
  "type": "module",
6
6
  "author": "unbrained",
@@ -133,7 +133,7 @@
133
133
  },
134
134
  "devDependencies": {
135
135
  "@sentry/cli": "^3.5.1",
136
- "@types/node": "^25.9.3",
136
+ "@types/node": "^20.0.0",
137
137
  "@vitest/coverage-v8": "^4.1.9",
138
138
  "esbuild": "0.28.1",
139
139
  "tsx": "^4.22.4",
@@ -1,18 +0,0 @@
1
- import {
2
- _testOnly,
3
- runActivity
4
- } from "./chunk-5IDI42VV.js";
5
- import "./chunk-RVHYI7SL.js";
6
- import "./chunk-HIP7WVTL.js";
7
- import "./chunk-B473GZWW.js";
8
- import "./chunk-SX75ADBK.js";
9
- import "./chunk-7D3SAQXM.js";
10
- import "./chunk-QGG32QHW.js";
11
- import "./chunk-FRUFKWNK.js";
12
- import "./chunk-YCJX76PW.js";
13
- import "./chunk-HMOADQVT.js";
14
- export {
15
- _testOnly,
16
- runActivity
17
- };
18
- //# sourceMappingURL=activity-CIHV64UC.js.map