@iowarp/clio-coder 0.4.6 → 0.4.7

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 (657) hide show
  1. package/.claude-plugin/marketplace.json +283 -0
  2. package/CHANGELOG.md +50 -0
  3. package/CONTRIBUTING.md +102 -29
  4. package/NOTICE +8 -0
  5. package/README.md +37 -5
  6. package/dist/{acp-UVEVWSDL.js → acp-W3Y3TRHD.js} +12 -12
  7. package/dist/{agents-VWY37DTK.js → agents-J4ICNLQ3.js} +52 -52
  8. package/dist/assets/codewiki.json +1 -1
  9. package/dist/assets/tui-notices/get-east-asian-width-LICENSE +9 -0
  10. package/dist/assets/tui-notices/marked-LICENSE +44 -0
  11. package/dist/assets/tui-notices/pi-tui-LICENSE +21 -0
  12. package/dist/{auth-PCV2XQDV.js → auth-X2UJUMOC.js} +24 -24
  13. package/dist/{builtins-PD652MTK.js → builtins-XLXWWSRF.js} +6 -6
  14. package/dist/{chunk-DZK63TZJ.js → chunk-24S3DN22.js} +336 -612
  15. package/dist/{chunk-NTK3WTHM.js → chunk-24TOGHPO.js} +2 -2
  16. package/dist/{chunk-M6TAYK66.js → chunk-2O2LVQQK.js} +11 -4
  17. package/dist/{chunk-OQM5IVJY.js → chunk-34XHRVKG.js} +3 -3
  18. package/dist/{chunk-LY4N4TTL.js → chunk-3LXJOICS.js} +2 -2
  19. package/dist/{chunk-3BJGMT2D.js → chunk-3XE4NRLF.js} +1 -1
  20. package/dist/{chunk-N2OKBREN.js → chunk-4MFBBY2Z.js} +3 -3
  21. package/dist/{chunk-5VTJP36Q.js → chunk-4N2RZ4TO.js} +2 -2
  22. package/dist/{chunk-WNGF5AJX.js → chunk-4QKAITQT.js} +3 -3
  23. package/dist/chunk-4UHVS5T7.js +207 -0
  24. package/dist/{chunk-GLYBJ4RQ.js → chunk-5AJPUR72.js} +6 -6
  25. package/dist/{chunk-5CY4Q6QI.js → chunk-5EQO5NWP.js} +105 -3
  26. package/dist/{chunk-6HAO6X5B.js → chunk-65BGHOUR.js} +8 -5
  27. package/dist/{chunk-6VRRJT7L.js → chunk-6CA2BHOR.js} +2 -2
  28. package/dist/{chunk-HL26ADLH.js → chunk-6CB2IL4N.js} +2 -1
  29. package/dist/{chunk-E7RF4KBO.js → chunk-6LRLOJHQ.js} +3 -3
  30. package/dist/{chunk-HXHFDHB6.js → chunk-6TAATXXH.js} +6 -6
  31. package/dist/{chunk-P6M7RKMI.js → chunk-6YHPAAZR.js} +3 -3
  32. package/dist/{chunk-5QRX7SLS.js → chunk-7EEGBKV4.js} +7 -7
  33. package/dist/{chunk-BS4GAMUB.js → chunk-A67NR5AT.js} +2 -2
  34. package/dist/{chunk-WJIMKGD6.js → chunk-BAU36233.js} +8 -8
  35. package/dist/{chunk-PZN2LQY6.js → chunk-BO4XV5VX.js} +4 -4
  36. package/dist/{chunk-I2K2NCZQ.js → chunk-BQQ5MXUC.js} +6 -6
  37. package/dist/{chunk-X3BI7HTV.js → chunk-C3G5PNUO.js} +21 -21
  38. package/dist/{chunk-SRZOW5L2.js → chunk-C6GEXX4L.js} +1 -1
  39. package/dist/{chunk-6RYDAVQT.js → chunk-CE64C5K5.js} +219 -64
  40. package/dist/chunk-CP3HIR5H.js +2119 -0
  41. package/dist/{chunk-BBV5TKE6.js → chunk-CPXGJI2A.js} +2 -2
  42. package/dist/{chunk-IGLVVNEG.js → chunk-CULVKYTK.js} +4 -4
  43. package/dist/{chunk-DXLUVUD4.js → chunk-D2T66PDV.js} +5 -5
  44. package/dist/{chunk-NF3BK5WR.js → chunk-DACXIVVF.js} +5 -5
  45. package/dist/{chunk-IKRWLEDA.js → chunk-DLIYANB7.js} +20 -15
  46. package/dist/{chunk-RGZNQ5CT.js → chunk-DO7M3LSX.js} +9 -9
  47. package/dist/{chunk-2QPI3TR3.js → chunk-DVJL77SO.js} +2 -2
  48. package/dist/{chunk-ODUTYZIU.js → chunk-EUEXGXXR.js} +5 -5
  49. package/dist/{chunk-WKUYQBCG.js → chunk-EUZRMP4Y.js} +18 -16
  50. package/dist/{chunk-JMPL7NUB.js → chunk-G4LGUTOE.js} +4 -4
  51. package/dist/{chunk-CBSKDFWL.js → chunk-GEVQNST4.js} +2 -2
  52. package/dist/{chunk-NNWJYUNO.js → chunk-GFQ7P2UF.js} +7 -7
  53. package/dist/{chunk-SXQKNKRA.js → chunk-GI5RRMAH.js} +14 -14
  54. package/dist/{chunk-HPTJF6DG.js → chunk-GVZFCJHE.js} +336 -83
  55. package/dist/{chunk-ACCKVSHU.js → chunk-GXIWHXDB.js} +3 -3
  56. package/dist/{chunk-LUL5Z66S.js → chunk-HOX4YZ2K.js} +6 -5
  57. package/dist/chunk-HRAKUPIH.js +57 -0
  58. package/dist/{chunk-F5Z7EWMN.js → chunk-IJMW64DX.js} +50 -50
  59. package/dist/{chunk-QNWRHOMF.js → chunk-IMOD2YPV.js} +16 -9
  60. package/dist/{chunk-HZ2T2YED.js → chunk-IQCNVLO6.js} +28 -8
  61. package/dist/{chunk-HZFBVU5X.js → chunk-ISNCCX42.js} +8 -8
  62. package/dist/{chunk-7JSSKXG2.js → chunk-IZYTT3CD.js} +7 -3
  63. package/dist/chunk-KKEYGFX4.js +915 -0
  64. package/dist/{chunk-HHVJNVUJ.js → chunk-KS7ETA3P.js} +2 -2
  65. package/dist/{chunk-BLTEAUCB.js → chunk-L3Z5ANCV.js} +7 -7
  66. package/dist/{chunk-4VMV6OS6.js → chunk-LBFQMYS3.js} +2 -2
  67. package/dist/{chunk-URBGEOH3.js → chunk-M6Z2V6YU.js} +5 -5
  68. package/dist/{chunk-BT7HGDOX.js → chunk-MBJO5VNZ.js} +12 -12
  69. package/dist/chunk-MNQN3X6Y.js +595 -0
  70. package/dist/{chunk-3QKXHCGS.js → chunk-MZHXENL7.js} +5 -5
  71. package/dist/chunk-MZNWZUJM.js +1801 -0
  72. package/dist/{chunk-7YJWEF2L.js → chunk-N37QC5FV.js} +5 -5
  73. package/dist/{chunk-TJFDL26W.js → chunk-NCCQ6DVS.js} +7 -7
  74. package/dist/{chunk-P5JMBPDJ.js → chunk-NO7J45X6.js} +162 -47
  75. package/dist/chunk-OH3YYA3B.js +15 -0
  76. package/dist/{chunk-22PQ4TX4.js → chunk-P4DL2LM5.js} +16 -77
  77. package/dist/{chunk-LIN2K3EL.js → chunk-PFLOULP3.js} +4 -4
  78. package/dist/{chunk-QXFBABFJ.js → chunk-QKWL7SYE.js} +11 -11
  79. package/dist/chunk-RFCKPS2V.js +26 -0
  80. package/dist/{chunk-ZS43Y2FT.js → chunk-RTLNFZMD.js} +12 -4
  81. package/dist/{chunk-U7H5WRG5.js → chunk-RXFPB32E.js} +8 -6
  82. package/dist/{chunk-Q7NNUHQV.js → chunk-SEDI5K5B.js} +16 -16
  83. package/dist/{chunk-WV6TDAPN.js → chunk-SELG4SUR.js} +7 -7
  84. package/dist/{chunk-3WBALRQH.js → chunk-SER7RRAE.js} +27 -832
  85. package/dist/{chunk-K2HL3GBL.js → chunk-T4TY5GG3.js} +165 -15
  86. package/dist/chunk-T7QQBNLH.js +691 -0
  87. package/dist/{chunk-6OII3LOK.js → chunk-TLTGZTXI.js} +3 -3
  88. package/dist/chunk-TZ6UVP2H.js +637 -0
  89. package/dist/{chunk-3JLFK5MW.js → chunk-TZHN5ITX.js} +13 -41
  90. package/dist/{chunk-VANN3GDP.js → chunk-U3TPUXOQ.js} +399 -234
  91. package/dist/{chunk-VHMX7SXF.js → chunk-UA3W4FGC.js} +6 -6
  92. package/dist/{chunk-3O2ZAUGQ.js → chunk-UA6W4XFJ.js} +2 -2
  93. package/dist/chunk-UWD3JD5X.js +709 -0
  94. package/dist/chunk-V4ZKOKRB.js +13433 -0
  95. package/dist/{chunk-NC4KV7EL.js → chunk-VCRVEDUC.js} +5 -5
  96. package/dist/{chunk-4DU2TVI4.js → chunk-VMATUZB6.js} +12 -10
  97. package/dist/{chunk-J2FYEQ5L.js → chunk-VTYHHQ57.js} +2 -2
  98. package/dist/chunk-WB7POC6M.js +891 -0
  99. package/dist/{chunk-3HQVBIKD.js → chunk-WBVKKTUT.js} +2 -2
  100. package/dist/{chunk-EHOSNVVM.js → chunk-WLHX3MM5.js} +6 -2
  101. package/dist/{chunk-24T2YZ7A.js → chunk-WN552PKN.js} +553 -298
  102. package/dist/{chunk-4U4TKZFR.js → chunk-WT5TRMO4.js} +51 -26
  103. package/dist/{chunk-XWMSPJYN.js → chunk-WURGVOZJ.js} +56 -12
  104. package/dist/{chunk-7WUZEB2M.js → chunk-XR3XJN2M.js} +2 -2
  105. package/dist/chunk-XW2UZICE.js +372 -0
  106. package/dist/{chunk-2AKYFREM.js → chunk-XZ6UFQ52.js} +11 -11
  107. package/dist/chunk-Y3JU5RPK.js +8 -0
  108. package/dist/chunk-YKRJTYNP.js +1143 -0
  109. package/dist/{chunk-PWWSIB2A.js → chunk-ZGIGW4ZG.js} +5 -5
  110. package/dist/cli/index.js +34 -36
  111. package/dist/{clio-QQCMTUZE.js → clio-L2P7S2R2.js} +9 -9
  112. package/dist/{code-nav-GUPM6766.js → code-nav-B5LNX4KU.js} +25 -25
  113. package/dist/{components-TNIKXCBH.js → components-63MMQKUT.js} +6 -6
  114. package/dist/{config-IIM7YOD3.js → config-YXARKGTX.js} +70 -67
  115. package/dist/{configure-4ZM5HWJX.js → configure-LMVQJ46J.js} +47 -35
  116. package/dist/{context-OL5P3HEP.js → context-7HJEWTTP.js} +87 -44
  117. package/dist/{context-44BZLJ3J.js → context-XSZKKFBW.js} +14 -14
  118. package/dist/{context-AIDVQKMW.js → context-YG2LZDYZ.js} +60 -58
  119. package/dist/{context-clear-OQV76MYP.js → context-clear-AC5NXHM2.js} +57 -55
  120. package/dist/{context-index-HP2JFUWA.js → context-index-KKTPRV5G.js} +3 -3
  121. package/dist/{context-map-INTXD54D.js → context-map-T7ROR5D5.js} +4 -4
  122. package/dist/{context-working-set-ZUW3EGLS.js → context-working-set-F4Q4J3NS.js} +12 -10
  123. package/dist/{detail-UXPWRANG.js → detail-H73BEF2N.js} +58 -56
  124. package/dist/{dispatch-runner-P3ZW6G77.js → dispatch-runner-3RY5FSJC.js} +74 -72
  125. package/dist/{doctor-JJVGPZWT.js → doctor-EQYJOGUG.js} +44 -30
  126. package/dist/{eval-V2RTN3UH.js → eval-4P7O6CCE.js} +109 -46
  127. package/dist/{evidence-35PYWGSO.js → evidence-D6GUSYJW.js} +57 -55
  128. package/dist/{evidence-CIGGKI6J.js → evidence-O76QF7TZ.js} +62 -59
  129. package/dist/{evolve-33SM3NJP.js → evolve-H47BCETS.js} +58 -56
  130. package/dist/{extensions-YVRHX6ZI.js → extensions-NNL3ZOCU.js} +98 -20
  131. package/dist/{fleet-LFO7SIPC.js → fleet-KMNS6NOM.js} +106 -99
  132. package/dist/{fleet-commands-RLK72GU3.js → fleet-commands-DOWSYCBX.js} +14 -14
  133. package/dist/{fleet-decisions-3SBSCTCW.js → fleet-decisions-S3PTZV2D.js} +9 -9
  134. package/dist/{fleet-graph-JZIBCGMW.js → fleet-graph-F2DE2TME.js} +26 -24
  135. package/dist/{fleet-inspect-2L5YGGZJ.js → fleet-inspect-EN2Q6IVB.js} +60 -57
  136. package/dist/{fleet-preflight-QRSHIIDE.js → fleet-preflight-FRLETDD3.js} +3 -3
  137. package/dist/{fleet-validate-LIAVKDUU.js → fleet-validate-B2XDLS57.js} +28 -29
  138. package/dist/{fleet-verify-JIK3OQZR.js → fleet-verify-4JKUWGJ7.js} +57 -55
  139. package/dist/{fleet-view-IWHYGQKK.js → fleet-view-BHJFW26B.js} +60 -57
  140. package/dist/{init-NJEDOTQW.js → init-XAT5N5YM.js} +79 -74
  141. package/dist/interop-FVECHFKG.js +246 -0
  142. package/dist/{inventory-74UL7UHU.js → inventory-7KFQGLCV.js} +60 -57
  143. package/dist/library-NY2XOT75.js +492 -0
  144. package/dist/library-QAPAO23R.js +306 -0
  145. package/dist/library-import-5Y6MAS3R.js +183 -0
  146. package/dist/library-inventory-JT6HWITQ.js +56 -0
  147. package/dist/library-validation-EQUH25DC.js +42 -0
  148. package/dist/{memory-I76I5VUH.js → memory-DYVTTCP6.js} +58 -56
  149. package/dist/{models-D4YDIQZQ.js → models-MASFJ6Y2.js} +48 -36
  150. package/dist/{monitor-NKVD55HX.js → monitor-YMP4NXJJ.js} +64 -61
  151. package/dist/{orchestrator-I6OATVPK.js → orchestrator-AFQRRTEI.js} +3685 -1841
  152. package/dist/{panes-7BTYH3XQ.js → panes-D3Y2KFG5.js} +4 -4
  153. package/dist/{panes-WPOMEMRH.js → panes-NICTHQCV.js} +7 -7
  154. package/dist/{paths-J3KN7UAO.js → paths-PSFAUIGO.js} +5 -5
  155. package/dist/{preload-EJAWJEIO.js → preload-5Q7VXRFJ.js} +57 -55
  156. package/dist/{reset-4XMQKDNZ.js → reset-7NKZK7JN.js} +9 -9
  157. package/dist/{resources-TVYVXK3Q.js → resources-NILSIZAT.js} +94 -38
  158. package/dist/{run-OWQNNSJU.js → run-BPZGEBZV.js} +121 -105
  159. package/dist/{share-NPZZMUXG.js → share-EZ6ERBMH.js} +31 -28
  160. package/dist/skills-BTVVNYVM.js +100 -0
  161. package/dist/{skills-eval-J5TCKSJA.js → skills-eval-UY34MNK7.js} +110 -72
  162. package/dist/{skills-inventory-7II4DM57.js → skills-inventory-JDHSIA7I.js} +30 -25
  163. package/dist/{slash-commands-MDSDSWYF.js → slash-commands-K4FNQ2AT.js} +49 -46
  164. package/dist/{steer-S7D7IKPU.js → steer-2B3EQGFH.js} +4 -4
  165. package/dist/{support-5VAEC32W.js → support-L2SOL3IE.js} +7 -7
  166. package/dist/{targets-KILZEOCE.js → targets-44VKGFLN.js} +64 -58
  167. package/dist/{tasks-R6P6OV22.js → tasks-3KODKFU7.js} +12 -12
  168. package/dist/{terminal-lease-LZCG2KN3.js → terminal-lease-LXA7MMPO.js} +32 -19
  169. package/dist/{tools-6OCQ6SVB.js → tools-3UB7TEVR.js} +7 -7
  170. package/dist/{trace-JHLXWUMN.js → trace-TAMIU4OJ.js} +5 -4
  171. package/dist/{tui-primitives-RCY2HN7G.js → tui-primitives-A6MUW32V.js} +3 -2
  172. package/dist/{uninstall-FXYMFFRT.js → uninstall-QYVRPEM4.js} +9 -9
  173. package/dist/{upgrade-D2OZH6IQ.js → upgrade-7PMKM2JH.js} +15 -16
  174. package/dist/{usage-PIASNUS4.js → usage-6EQV7EQK.js} +70 -67
  175. package/dist/{verifiers-LTHUY2PX.js → verifiers-JLITWSHU.js} +15 -15
  176. package/dist/{verify-HYF7KBVE.js → verify-T7NAEVIG.js} +13 -13
  177. package/dist/{web-fetch-MQN4FH3X.js → web-fetch-W4TNW4Q7.js} +4 -4
  178. package/dist/{wiki-generate-RK7JQ5NP.js → wiki-generate-T2TJQJUA.js} +81 -76
  179. package/dist/{with-panes-OFTNAR4Y.js → with-panes-CHFC7HGI.js} +4 -4
  180. package/dist/worker/entry.js +283 -76
  181. package/docs/README.md +43 -0
  182. package/docs/architecture/architecture.md +8 -7
  183. package/docs/architecture/artifact-versions.md +3 -3
  184. package/docs/architecture/context-engine.md +35 -1
  185. package/docs/architecture/library.md +32 -0
  186. package/docs/architecture/middleware-and-components.md +1 -1
  187. package/docs/architecture/model-catalog.md +21 -1
  188. package/docs/architecture/pi-boundary.md +18 -0
  189. package/docs/architecture/prompt-envelope-and-tools.md +5 -5
  190. package/docs/architecture/safety-model.md +21 -2
  191. package/docs/architecture/session-lifecycle.md +12 -1
  192. package/docs/architecture/tui-design.md +108 -9
  193. package/docs/architecture/worker-context.md +106 -0
  194. package/docs/guide/authoring-plugins.md +160 -0
  195. package/docs/guide/built-in-agents.md +5 -5
  196. package/docs/guide/commands-and-modes.md +161 -56
  197. package/docs/guide/configuration-and-targets.md +1 -1
  198. package/docs/guide/configuration-reference.md +27 -34
  199. package/docs/guide/environment-variables.md +2 -2
  200. package/docs/guide/exit-codes-and-output.md +1 -1
  201. package/docs/guide/extensions-and-sharing.md +93 -53
  202. package/docs/guide/fleet-dispatch.md +31 -4
  203. package/docs/guide/glossary.md +1 -1
  204. package/docs/guide/harness-extensions.md +291 -0
  205. package/docs/guide/installation-and-lifecycle.md +9 -9
  206. package/docs/guide/interop.md +243 -0
  207. package/docs/guide/panes-and-files.md +3 -3
  208. package/docs/guide/plugins.md +80 -0
  209. package/docs/guide/resource-library.md +111 -45
  210. package/docs/guide/skills-marketplace.md +35 -72
  211. package/docs/guide/tool-usage.md +19 -7
  212. package/docs/guide/troubleshooting.md +1 -1
  213. package/docs/process/development-pipeline.md +14 -14
  214. package/docs/process/documentation-coverage.md +28 -1
  215. package/docs/process/documentation-guide.md +15 -7
  216. package/docs/process/eval-runner.md +8 -3
  217. package/docs/process/performance-methodology.md +1 -1
  218. package/docs/process/release-cut-checklist.md +4 -0
  219. package/docs/process/scientific-validation.md +23 -0
  220. package/evals/scalar-decision-machinery.ts +1 -1
  221. package/examples/extensions/README.md +67 -0
  222. package/examples/extensions/lab-status/clio-coder-extension.json +14 -0
  223. package/examples/extensions/lab-status/extension.mjs +68 -0
  224. package/examples/extensions/lab-status/jobs.synthetic.json +9 -0
  225. package/examples/extensions/measurements/clio-coder-extension.json +28 -0
  226. package/examples/extensions/measurements/summarize.cjs +23 -0
  227. package/library/README.md +109 -0
  228. package/library/_authoring/templates/agent/README.md +28 -0
  229. package/library/_authoring/templates/agent/agents/benchmark-scout.md +30 -0
  230. package/library/_authoring/templates/agent/plugin.json +23 -0
  231. package/library/_authoring/templates/fleet/README.md +29 -0
  232. package/library/_authoring/templates/fleet/fleets/pipeline-review.md +31 -0
  233. package/library/_authoring/templates/fleet/plugin.json +23 -0
  234. package/library/_authoring/templates/plugin/README.md +37 -0
  235. package/library/_authoring/templates/plugin/agents/data-curator.md +31 -0
  236. package/library/_authoring/templates/plugin/assets/curation-guide.md +22 -0
  237. package/library/_authoring/templates/plugin/plugin.json +42 -0
  238. package/library/_authoring/templates/plugin/prompts/inspect-dataset.md +15 -0
  239. package/library/_authoring/templates/plugin/skills/dataset-curation/SKILL.md +36 -0
  240. package/library/_authoring/templates/plugin/skills/dataset-curation/evals.md +17 -0
  241. package/library/_authoring/templates/prompt/README.md +28 -0
  242. package/library/_authoring/templates/prompt/plugin.json +23 -0
  243. package/library/_authoring/templates/prompt/prompts/paper-summary.md +26 -0
  244. package/library/_authoring/templates/skill/README.md +24 -0
  245. package/library/_authoring/templates/skill/SKILL.md +39 -0
  246. package/library/_authoring/templates/skill/evals.md +30 -0
  247. package/library/_authoring/templates/skill/plugin.json +23 -0
  248. package/library/agents/README.md +7 -0
  249. package/library/fleets/README.md +7 -0
  250. package/library/plugins/materio/README.md +137 -0
  251. package/library/plugins/materio/ai.iowarp.clio/agents/materio-lab-definer.md +208 -0
  252. package/library/plugins/materio/ai.iowarp.clio/agents/materio-literature-reviewer.md +308 -0
  253. package/library/plugins/materio/ai.iowarp.clio/agents/materio-research-explorer.md +249 -0
  254. package/library/plugins/materio/ai.iowarp.clio/agents/materio-task-executor.md +416 -0
  255. package/library/plugins/materio/ai.iowarp.clio/agents/materio-task-verifier.md +60 -0
  256. package/library/plugins/materio/ai.iowarp.clio/agents/materio-workflow-planner.md +238 -0
  257. package/library/plugins/materio/ai.iowarp.clio/fleets/materio-execute-task.md +50 -0
  258. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/add-task.md +66 -0
  259. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/archive-task.md +65 -0
  260. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/checkpoint.md +26 -0
  261. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/define-research-tasks.md +230 -0
  262. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/define-virtual-lab.md +181 -0
  263. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/execute-task.md +292 -0
  264. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/help.md +129 -0
  265. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/identify-research.md +206 -0
  266. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/literature-review.md +201 -0
  267. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/pause-research.md +12 -0
  268. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/progress.md +105 -0
  269. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/remove-task.md +63 -0
  270. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/resume-research.md +64 -0
  271. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/settings.md +16 -0
  272. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/status.md +92 -0
  273. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/upload-data.md +104 -0
  274. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/wtfp.md +145 -0
  275. package/library/plugins/materio/ai.iowarp.clio/references/execution.md +56 -0
  276. package/library/plugins/materio/ai.iowarp.portability/provenance.json +9 -0
  277. package/library/plugins/materio/assets/actions/add-task.md +86 -0
  278. package/library/plugins/materio/assets/actions/archive-task.md +84 -0
  279. package/library/plugins/materio/assets/actions/checkpoint.md +47 -0
  280. package/library/plugins/materio/assets/actions/define-research-tasks.md +228 -0
  281. package/library/plugins/materio/assets/actions/define-virtual-lab.md +179 -0
  282. package/library/plugins/materio/assets/actions/execute-task.md +290 -0
  283. package/library/plugins/materio/assets/actions/help.md +140 -0
  284. package/library/plugins/materio/assets/actions/identify-research.md +204 -0
  285. package/library/plugins/materio/assets/actions/literature-review.md +199 -0
  286. package/library/plugins/materio/assets/actions/pause-research.md +34 -0
  287. package/library/plugins/materio/assets/actions/progress.md +125 -0
  288. package/library/plugins/materio/assets/actions/remove-task.md +82 -0
  289. package/library/plugins/materio/assets/actions/resume-research.md +84 -0
  290. package/library/plugins/materio/assets/actions/settings.md +38 -0
  291. package/library/plugins/materio/assets/actions/status.md +112 -0
  292. package/library/plugins/materio/assets/actions/upload-data.md +123 -0
  293. package/library/plugins/materio/assets/actions/wtfp.md +179 -0
  294. package/library/plugins/materio/assets/references/research-domains.md +134 -0
  295. package/library/plugins/materio/assets/references/research-policy.md +77 -0
  296. package/library/plugins/materio/assets/references/traditional-workflows.md +146 -0
  297. package/library/plugins/materio/assets/scripts/check_physics.py +271 -0
  298. package/library/plugins/materio/assets/scripts/check_scripts.py +248 -0
  299. package/library/plugins/materio/assets/scripts/project_plugin.py +165 -0
  300. package/library/plugins/materio/assets/scripts/research_state.py +400 -0
  301. package/library/plugins/materio/assets/scripts/verify_citations.py +616 -0
  302. package/library/plugins/materio/assets/templates/RESEARCH.md +39 -0
  303. package/library/plugins/materio/assets/templates/VIRTUAL-LAB.md +120 -0
  304. package/library/plugins/materio/assets/templates/WORKFLOW.md +42 -0
  305. package/library/plugins/materio/assets/templates/config.json +5 -0
  306. package/library/plugins/materio/evals/scripts.yaml +29 -0
  307. package/library/plugins/materio/plugin.json +530 -0
  308. package/library/plugins/materio/skills/materio-lab-definer/SKILL.md +74 -0
  309. package/library/plugins/materio/skills/materio-literature-reviewer/SKILL.md +64 -0
  310. package/library/plugins/materio/skills/materio-research-explorer/SKILL.md +74 -0
  311. package/library/plugins/materio/skills/materio-task-executor/SKILL.md +214 -0
  312. package/library/plugins/materio/skills/materio-task-verifier/SKILL.md +46 -0
  313. package/library/plugins/materio/skills/materio-workflow-planner/SKILL.md +79 -0
  314. package/library/plugins/materio/tests/test_check_physics.py +139 -0
  315. package/library/plugins/materio/tests/test_check_scripts.py +140 -0
  316. package/library/plugins/materio/tests/test_research_state.py +291 -0
  317. package/library/plugins/materio/tests/test_verify_citations.py +337 -0
  318. package/library/prompts/README.md +7 -0
  319. package/library/registry.yaml +921 -0
  320. package/library/skills/README.md +120 -0
  321. package/{skills → library/skills}/coding/ast-grep/SKILL.md +1 -1
  322. package/{skills → library/skills}/coding/ast-grep/evals.md +1 -1
  323. package/library/skills/coding/ast-grep/plugin.json +23 -0
  324. package/{skills → library/skills}/coding/coding-standards/SKILL.md +1 -1
  325. package/{skills → library/skills}/coding/coding-standards/evals.md +1 -1
  326. package/library/skills/coding/coding-standards/plugin.json +23 -0
  327. package/{skills → library/skills}/coding/prototype/SKILL.md +1 -1
  328. package/{skills → library/skills}/coding/prototype/evals.md +1 -1
  329. package/library/skills/coding/prototype/plugin.json +23 -0
  330. package/{skills → library/skills}/coding/tdd/SKILL.md +1 -1
  331. package/{skills → library/skills}/coding/tdd/evals.md +1 -1
  332. package/library/skills/coding/tdd/plugin.json +23 -0
  333. package/{skills → library/skills}/context/context-handoff/SKILL.md +1 -1
  334. package/{skills → library/skills}/context/context-handoff/evals.md +1 -1
  335. package/library/skills/context/context-handoff/plugin.json +23 -0
  336. package/{skills → library/skills}/context/context-prime/SKILL.md +1 -1
  337. package/{skills → library/skills}/context/context-prime/evals.md +1 -1
  338. package/library/skills/context/context-prime/plugin.json +23 -0
  339. package/{skills → library/skills}/git/branch-closeout/SKILL.md +1 -1
  340. package/library/skills/git/branch-closeout/plugin.json +23 -0
  341. package/{skills → library/skills}/git/file-ticket/SKILL.md +1 -1
  342. package/library/skills/git/file-ticket/plugin.json +23 -0
  343. package/{skills → library/skills}/git/fix-issue/SKILL.md +1 -1
  344. package/library/skills/git/fix-issue/plugin.json +23 -0
  345. package/{skills → library/skills}/git/resolve-merge-conflicts/SKILL.md +1 -1
  346. package/{skills → library/skills}/git/resolve-merge-conflicts/evals.md +1 -1
  347. package/library/skills/git/resolve-merge-conflicts/plugin.json +23 -0
  348. package/{skills → library/skills}/git/ship/SKILL.md +1 -1
  349. package/library/skills/git/ship/plugin.json +23 -0
  350. package/{skills → library/skills}/git/worktree-create/SKILL.md +1 -1
  351. package/library/skills/git/worktree-create/plugin.json +23 -0
  352. package/{skills → library/skills}/git/worktree-merge/SKILL.md +1 -1
  353. package/library/skills/git/worktree-merge/plugin.json +23 -0
  354. package/{skills → library/skills}/meta/clio-coder-dev/SKILL.md +1 -1
  355. package/{skills → library/skills}/meta/clio-coder-dev/evals.md +1 -1
  356. package/library/skills/meta/clio-coder-dev/plugin.json +23 -0
  357. package/{skills → library/skills}/meta/clio-coder-test/SKILL.md +1 -1
  358. package/{skills → library/skills}/meta/clio-coder-test/evals.md +1 -1
  359. package/library/skills/meta/clio-coder-test/plugin.json +23 -0
  360. package/{skills → library/skills}/meta/credentials/SKILL.md +1 -1
  361. package/{skills → library/skills}/meta/credentials/evals.md +1 -1
  362. package/library/skills/meta/credentials/plugin.json +23 -0
  363. package/library/skills/meta/find-skills/SKILL.md +85 -0
  364. package/library/skills/meta/find-skills/evals.md +65 -0
  365. package/library/skills/meta/find-skills/plugin.json +23 -0
  366. package/{skills → library/skills}/meta/herdr/SKILL.md +1 -1
  367. package/{skills → library/skills}/meta/herdr/evals.md +1 -1
  368. package/library/skills/meta/herdr/plugin.json +23 -0
  369. package/{skills → library/skills}/meta/skill-craft/SKILL.md +23 -9
  370. package/{skills → library/skills}/meta/skill-craft/evals.md +11 -3
  371. package/library/skills/meta/skill-craft/plugin.json +23 -0
  372. package/{skills → library/skills}/planning/archify/SKILL.md +13 -13
  373. package/library/skills/planning/archify/plugin.json +23 -0
  374. package/{skills → library/skills}/planning/architecture/SKILL.md +1 -1
  375. package/{skills → library/skills}/planning/architecture/evals.md +1 -1
  376. package/library/skills/planning/architecture/plugin.json +23 -0
  377. package/{skills → library/skills}/planning/backlog/SKILL.md +1 -1
  378. package/{skills → library/skills}/planning/backlog/evals.md +1 -1
  379. package/library/skills/planning/backlog/plugin.json +23 -0
  380. package/{skills → library/skills}/planning/prd/SKILL.md +1 -1
  381. package/{skills → library/skills}/planning/prd/evals.md +1 -1
  382. package/library/skills/planning/prd/plugin.json +23 -0
  383. package/{skills → library/skills}/planning/product-intent/SKILL.md +1 -1
  384. package/{skills → library/skills}/planning/product-intent/evals.md +1 -1
  385. package/library/skills/planning/product-intent/plugin.json +23 -0
  386. package/{skills → library/skills}/planning/tech-spec/SKILL.md +1 -1
  387. package/{skills → library/skills}/planning/tech-spec/evals.md +1 -1
  388. package/library/skills/planning/tech-spec/plugin.json +23 -0
  389. package/{skills → library/skills}/registry.yaml +7 -7
  390. package/{skills → library/skills}/remote.yaml +1 -1
  391. package/{skills → library/skills}/research/arxiv-literature/SKILL.md +1 -1
  392. package/{skills → library/skills}/research/arxiv-literature/evals.md +1 -1
  393. package/library/skills/research/arxiv-literature/plugin.json +23 -0
  394. package/{skills → library/skills}/research/experiment-protocol/SKILL.md +1 -1
  395. package/{skills → library/skills}/research/experiment-protocol/evals.md +1 -1
  396. package/library/skills/research/experiment-protocol/plugin.json +23 -0
  397. package/{skills → library/skills}/research/scientific-debugging/SKILL.md +1 -1
  398. package/{skills → library/skills}/research/scientific-debugging/evals.md +1 -1
  399. package/library/skills/research/scientific-debugging/plugin.json +23 -0
  400. package/{skills → library/skills}/research/scientific-modernization/SKILL.md +1 -1
  401. package/{skills → library/skills}/research/scientific-modernization/evals.md +1 -1
  402. package/library/skills/research/scientific-modernization/plugin.json +23 -0
  403. package/{skills → library/skills}/skill-marketplace.json +37 -37
  404. package/{skills → library/skills}/workflow/cut-it/SKILL.md +1 -1
  405. package/{skills → library/skills}/workflow/cut-it/evals.md +1 -1
  406. package/library/skills/workflow/cut-it/plugin.json +23 -0
  407. package/{skills → library/skills}/workflow/design-council/SKILL.md +1 -1
  408. package/{skills → library/skills}/workflow/design-council/evals.md +1 -1
  409. package/library/skills/workflow/design-council/plugin.json +23 -0
  410. package/{skills → library/skills}/workflow/grill-me/SKILL.md +1 -1
  411. package/{skills → library/skills}/workflow/grill-me/evals.md +1 -1
  412. package/library/skills/workflow/grill-me/plugin.json +23 -0
  413. package/{skills → library/skills}/workflow/workflow-distiller/SKILL.md +14 -11
  414. package/{skills → library/skills}/workflow/workflow-distiller/evals.md +14 -6
  415. package/library/skills/workflow/workflow-distiller/plugin.json +23 -0
  416. package/package.json +12 -5
  417. package/src/cli/agents.ts +1 -1
  418. package/src/cli/config-inspect.ts +1 -1
  419. package/src/cli/configure.ts +2 -2
  420. package/src/cli/eval.ts +40 -6
  421. package/src/cli/extensions.ts +74 -8
  422. package/src/cli/fleet-preflight.ts +2 -0
  423. package/src/cli/fleet.ts +2 -0
  424. package/src/cli/index.ts +1 -3
  425. package/src/cli/interop-inspect.ts +61 -33
  426. package/src/cli/interop.ts +79 -9
  427. package/src/cli/library-import.ts +139 -0
  428. package/src/cli/library.ts +418 -120
  429. package/src/cli/run.ts +26 -9
  430. package/src/cli/skills-eval.ts +43 -6
  431. package/src/cli/skills-inventory.ts +6 -2
  432. package/src/cli/skills.ts +44 -491
  433. package/src/core/bus-events.ts +5 -0
  434. package/src/core/defaults.ts +1 -1
  435. package/src/core/recent-models.ts +2 -2
  436. package/src/core/session-routing.ts +3 -3
  437. package/src/core/state-file-lock.ts +1 -1
  438. package/src/core/tool-names.ts +5 -0
  439. package/src/domains/agents/extension.ts +42 -6
  440. package/src/domains/agents/fleet-commands.ts +92 -1
  441. package/src/domains/agents/fleet-contract.ts +87 -19
  442. package/src/domains/agents/recipe.ts +5 -4
  443. package/src/domains/agents/registry.ts +80 -24
  444. package/src/domains/config/keybindings.ts +155 -95
  445. package/src/domains/context/worker/contract.ts +91 -0
  446. package/src/domains/context/worker/pressure.ts +120 -0
  447. package/src/domains/context/worker/recall.ts +62 -0
  448. package/src/domains/context/worker/select.ts +164 -0
  449. package/src/domains/context/worker/snapshot.ts +35 -0
  450. package/src/domains/context/worker/store.ts +16 -0
  451. package/src/domains/context/working-set/replay/synthetic.ts +2 -1
  452. package/src/domains/dispatch/active-route-planner.ts +2 -0
  453. package/src/domains/dispatch/backoff.ts +1 -0
  454. package/src/domains/dispatch/code-step.ts +12 -2
  455. package/src/domains/dispatch/contract.ts +3 -0
  456. package/src/domains/dispatch/execution-plan.ts +2 -0
  457. package/src/domains/dispatch/extension.ts +109 -27
  458. package/src/domains/dispatch/fleet-plan.ts +10 -0
  459. package/src/domains/dispatch/fleet-run.ts +1 -0
  460. package/src/domains/dispatch/orphan-recovery.ts +1 -0
  461. package/src/domains/dispatch/receipt-integrity.ts +4 -0
  462. package/src/domains/dispatch/state.ts +1 -0
  463. package/src/domains/dispatch/types.ts +5 -0
  464. package/src/domains/dispatch/validation.ts +12 -0
  465. package/src/domains/dispatch/workspace-checkpoint.ts +1 -1
  466. package/src/domains/evidence/failure-attribution.ts +1 -0
  467. package/src/domains/evidence/trust-status.ts +22 -3
  468. package/src/domains/extensions/command-schema.ts +145 -0
  469. package/src/domains/extensions/command-tools.ts +15 -0
  470. package/src/domains/extensions/compatibility.ts +7 -0
  471. package/src/domains/extensions/contract.ts +0 -4
  472. package/src/domains/extensions/discovery.ts +69 -205
  473. package/src/domains/extensions/extension.ts +0 -4
  474. package/src/domains/extensions/index.ts +1 -5
  475. package/src/domains/extensions/manager.ts +1 -6
  476. package/src/domains/extensions/operator-commands.ts +29 -0
  477. package/src/domains/extensions/operator-runtime.ts +483 -0
  478. package/src/domains/extensions/public-api.ts +53 -0
  479. package/src/domains/extensions/runtime-child.mjs +114 -0
  480. package/src/domains/extensions/runtime-process.ts +306 -0
  481. package/src/domains/extensions/runtime-schema.ts +146 -0
  482. package/src/domains/extensions/{resources.ts → snapshot-access.ts} +1 -17
  483. package/src/domains/extensions/snapshot.ts +4 -32
  484. package/src/domains/extensions/state.ts +5 -83
  485. package/src/domains/extensions/types.ts +33 -34
  486. package/src/domains/interop/adopt.ts +546 -0
  487. package/src/domains/interop/detect.ts +50 -12
  488. package/src/domains/interop/foreign.ts +554 -0
  489. package/src/domains/interop/import.ts +277 -0
  490. package/src/domains/interop/index.ts +24 -0
  491. package/src/domains/interop/install.ts +6 -0
  492. package/src/domains/interop/inventory.ts +351 -0
  493. package/src/domains/interop/projection.ts +360 -0
  494. package/src/domains/interop/registry.ts +106 -3
  495. package/src/domains/interop/types.ts +51 -0
  496. package/src/domains/lifecycle/migrations/index.ts +0 -2
  497. package/src/domains/lifecycle/naming-resources.ts +1 -1
  498. package/src/domains/middleware/marketplace-offer.ts +1 -1
  499. package/src/domains/mux/contract.ts +1 -1
  500. package/src/domains/plugins/catalog.ts +204 -0
  501. package/src/domains/plugins/contract.ts +24 -0
  502. package/src/domains/plugins/discovery.ts +316 -0
  503. package/src/domains/plugins/extension.ts +40 -0
  504. package/src/domains/plugins/index.ts +77 -0
  505. package/src/domains/plugins/integrity.ts +6 -0
  506. package/src/domains/plugins/manifest.ts +3 -0
  507. package/src/domains/plugins/resources.ts +102 -0
  508. package/src/domains/plugins/state.ts +753 -0
  509. package/src/domains/plugins/types.ts +217 -0
  510. package/src/domains/prompts/extension.ts +9 -2
  511. package/src/domains/prompts/fragments/operating/skills.md +10 -10
  512. package/src/domains/resources/common-loader.ts +9 -6
  513. package/src/domains/resources/index.ts +67 -0
  514. package/src/domains/resources/library-actions.ts +836 -0
  515. package/src/domains/resources/library-evals.ts +38 -0
  516. package/src/domains/resources/library-inventory.ts +1048 -0
  517. package/src/domains/resources/library-types.ts +50 -0
  518. package/src/domains/resources/library-validation.ts +634 -0
  519. package/src/domains/resources/library.ts +437 -156
  520. package/src/domains/resources/package-references.ts +66 -0
  521. package/src/domains/resources/prompts/loader.ts +75 -41
  522. package/src/domains/resources/skills/install.ts +2 -2
  523. package/src/domains/resources/skills/loader.ts +77 -22
  524. package/src/domains/resources/skills/marketplace.ts +48 -57
  525. package/src/domains/resources/skills/promotion.ts +2 -2
  526. package/src/domains/resources/skills/provenance-pin.ts +17 -4
  527. package/src/domains/safety/action-classifier.ts +2 -2
  528. package/src/domains/safety/default-path-policy.ts +3 -1
  529. package/src/domains/safety/policy-engine.ts +1 -1
  530. package/src/domains/safety/protected-artifacts.ts +21 -5
  531. package/src/domains/safety/skill-authority.ts +5 -2
  532. package/src/domains/share/archive.ts +1 -1
  533. package/src/engine/apis/openai-completions.ts +52 -2
  534. package/src/engine/notices/pi-tui-LICENSE +21 -0
  535. package/src/engine/tui.ts +3 -0
  536. package/src/engine/worker-runtime.ts +58 -14
  537. package/src/engine/worker-tools.ts +5 -0
  538. package/src/entry/orchestrator.ts +26 -5
  539. package/src/entry/plugin-reload.ts +18 -0
  540. package/src/interactive/application-controller.ts +67 -21
  541. package/src/interactive/chat-loop.ts +32 -5
  542. package/src/interactive/chat-panel.ts +5 -1
  543. package/src/interactive/clio-editor.ts +53 -21
  544. package/src/interactive/command-output.ts +56 -1
  545. package/src/interactive/editor-submit.ts +65 -28
  546. package/src/interactive/fleet-run-preview.ts +2 -0
  547. package/src/interactive/follow-up-queue-panel.ts +3 -3
  548. package/src/interactive/footer/dashboard.ts +4 -1
  549. package/src/interactive/footer/notifications.ts +2 -2
  550. package/src/interactive/footer/widgets.ts +2 -2
  551. package/src/interactive/interactive-application.ts +209 -21
  552. package/src/interactive/interactive-input-runtime.ts +254 -7
  553. package/src/interactive/interactive-presentation.ts +41 -12
  554. package/src/interactive/interactive-slash-runtime.ts +37 -8
  555. package/src/interactive/keybinding-manager.ts +156 -79
  556. package/src/interactive/keyboard-owner.ts +37 -0
  557. package/src/interactive/leader-key.ts +49 -102
  558. package/src/interactive/leader-menu.ts +45 -0
  559. package/src/interactive/overlay-ask-user-lifecycle.ts +9 -1
  560. package/src/interactive/overlay-frame.ts +15 -0
  561. package/src/interactive/overlay-key-routing.ts +46 -47
  562. package/src/interactive/overlay-lifecycle.ts +30 -15
  563. package/src/interactive/overlay-resource-openers.ts +56 -46
  564. package/src/interactive/overlays/ask-user.ts +630 -556
  565. package/src/interactive/overlays/extension-panel.ts +70 -0
  566. package/src/interactive/overlays/extensions.ts +28 -5
  567. package/src/interactive/overlays/fleet-run-approval.ts +7 -3
  568. package/src/interactive/overlays/help-reference.ts +89 -40
  569. package/src/interactive/overlays/interop.ts +122 -3
  570. package/src/interactive/overlays/keybinding-detail.ts +2 -2
  571. package/src/interactive/overlays/library-lifecycle.ts +90 -0
  572. package/src/interactive/overlays/library-model.ts +574 -0
  573. package/src/interactive/overlays/library-review.ts +557 -0
  574. package/src/interactive/overlays/library-tabs.ts +3 -15
  575. package/src/interactive/overlays/library.ts +602 -0
  576. package/src/interactive/overlays/list-overlay.ts +218 -39
  577. package/src/interactive/overlays/model-selector.ts +28 -25
  578. package/src/interactive/overlays/session-selector.ts +9 -3
  579. package/src/interactive/overlays/settings.ts +25 -18
  580. package/src/interactive/overlays/tree-selector.ts +16 -11
  581. package/src/interactive/permission-hint.ts +13 -0
  582. package/src/interactive/permission-overlay.ts +77 -28
  583. package/src/interactive/prompt-source-label.ts +21 -0
  584. package/src/interactive/renderers/reference-card.ts +35 -0
  585. package/src/interactive/renderers/worker-entry.ts +35 -3
  586. package/src/interactive/slash-autocomplete.ts +99 -1
  587. package/src/interactive/slash-commands.ts +390 -67
  588. package/src/interactive/slash-spec.ts +0 -1
  589. package/src/interactive/terminal-lease.ts +44 -12
  590. package/src/interactive/turn-queues.ts +8 -7
  591. package/src/interactive/turn-runtime.ts +1 -1
  592. package/src/interactive/view/view-overlay.ts +19 -14
  593. package/src/interactive/welcome-dashboard.ts +525 -408
  594. package/src/tools/bootstrap.ts +8 -0
  595. package/src/tools/builtin-tool-catalog.ts +7 -2
  596. package/src/tools/context/index.ts +58 -5
  597. package/src/tools/context/library.ts +465 -0
  598. package/src/tools/context/surface.ts +20 -6
  599. package/src/tools/core-bootstrap.ts +3 -0
  600. package/src/tools/dispatch-admission.ts +24 -1
  601. package/src/tools/dispatch-arguments.ts +8 -0
  602. package/src/tools/dispatch-plan.ts +32 -0
  603. package/src/tools/dispatch-schema.ts +31 -1
  604. package/src/tools/dispatch-types.ts +3 -0
  605. package/src/tools/dispatch.ts +1 -1
  606. package/src/tools/harness-extensions.ts +169 -0
  607. package/src/tools/observation.ts +4 -0
  608. package/src/tools/policy.ts +7 -1
  609. package/src/tools/registry.ts +19 -1
  610. package/src/tools/worker-evidence.ts +5 -0
  611. package/src/worker/context-seed.ts +192 -0
  612. package/src/worker/entry.ts +1 -0
  613. package/src/worker/spec-contract.ts +8 -1
  614. package/dist/chunk-3UW3KU4A.js +0 -21
  615. package/dist/chunk-536HXRFE.js +0 -1257
  616. package/dist/chunk-B3MOMLJ4.js +0 -433
  617. package/dist/chunk-CXQ37WJH.js +0 -45
  618. package/dist/chunk-KTFSFCVN.js +0 -46
  619. package/dist/chunk-QCOV5DFY.js +0 -911
  620. package/dist/chunk-QRFXEO6Y.js +0 -17
  621. package/dist/chunk-VAHLPXPY.js +0 -399
  622. package/dist/interop-RVCAYECG.js +0 -115
  623. package/dist/library-CTKZA7K3.js +0 -226
  624. package/dist/skills-OXFEAWMT.js +0 -510
  625. package/skills/README.md +0 -418
  626. package/skills/meta/find-skills/SKILL.md +0 -78
  627. package/skills/meta/find-skills/evals.md +0 -47
  628. package/src/domains/extensions/resource-path.ts +0 -27
  629. package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +0 -27
  630. package/src/interactive/overlays/agents.ts +0 -70
  631. package/src/interactive/overlays/library-install-confirm.ts +0 -152
  632. package/src/interactive/overlays/prompts.ts +0 -89
  633. package/src/interactive/overlays/skills-hub.ts +0 -615
  634. /package/{skills → library/skills}/coding/ast-grep/references/rule_reference.md +0 -0
  635. /package/{skills → library/skills}/coding/prototype/references/LOGIC.md +0 -0
  636. /package/{skills → library/skills}/coding/prototype/references/UI.md +0 -0
  637. /package/{skills → library/skills}/coding/tdd/references/mocking.md +0 -0
  638. /package/{skills → library/skills}/coding/tdd/references/tests.md +0 -0
  639. /package/{skills → library/skills}/context/context-handoff/scripts/new-handoff.sh +0 -0
  640. /package/{skills → library/skills}/git/branch-closeout/evals.md +0 -0
  641. /package/{skills → library/skills}/git/branch-closeout/references/closeout-checklist.md +0 -0
  642. /package/{skills → library/skills}/git/file-ticket/assets/issue-template.md +0 -0
  643. /package/{skills → library/skills}/git/file-ticket/evals.md +0 -0
  644. /package/{skills → library/skills}/git/file-ticket/references/issue-discovery.md +0 -0
  645. /package/{skills → library/skills}/git/fix-issue/evals.md +0 -0
  646. /package/{skills → library/skills}/git/fix-issue/references/diagnosis-and-rca.md +0 -0
  647. /package/{skills → library/skills}/git/resolve-merge-conflicts/references/conflict-matrix.md +0 -0
  648. /package/{skills → library/skills}/git/ship/assets/pr-template.md +0 -0
  649. /package/{skills → library/skills}/git/ship/evals.md +0 -0
  650. /package/{skills → library/skills}/git/ship/references/remote-and-branch-policy.md +0 -0
  651. /package/{skills → library/skills}/git/worktree-create/evals.md +0 -0
  652. /package/{skills → library/skills}/git/worktree-create/references/worktree-setup.md +0 -0
  653. /package/{skills → library/skills}/git/worktree-merge/evals.md +0 -0
  654. /package/{skills → library/skills}/git/worktree-merge/references/merge-strategies.md +0 -0
  655. /package/{skills → library/skills}/meta/clio-coder-test/references/harness.md +0 -0
  656. /package/{skills → library/skills}/meta/clio-coder-test/references/test-map.md +0 -0
  657. /package/{skills → library/skills}/planning/archify/evals.md +0 -0
@@ -0,0 +1,836 @@
1
+ /**
2
+ * Library lifecycle: one reviewed plan per operation, applied per package above
3
+ * the atomic package writers. Planning stages sources and writes nothing; apply
4
+ * rechecks reviewed facts inside each writer's lock, keeps every committed write
5
+ * when a later step fails, releases every staged source, and reports disk/state
6
+ * verification, actual recipe admission and host refresh as separate facts.
7
+ */
8
+ import { randomBytes } from "node:crypto";
9
+ import { existsSync } from "node:fs";
10
+ import path from "node:path";
11
+ import type { LibraryImportApplyResult, LibraryImportPlan } from "../interop/import.js";
12
+ import {
13
+ disablePlugin,
14
+ enablePlugin,
15
+ type InstalledPlugin,
16
+ listInstalledPlugins,
17
+ newlyBrokenDependents,
18
+ observePluginCopy,
19
+ type PluginDependentBreak,
20
+ type PluginDiagnostic,
21
+ type PluginExpectedCopy,
22
+ type PluginMutationResult,
23
+ type PluginScope,
24
+ type PluginSnapshot,
25
+ PluginWriterRefusal,
26
+ pluginBaseDir,
27
+ pluginContentDigest,
28
+ readPluginInstallRecord,
29
+ reloadPluginResources,
30
+ removePlugin,
31
+ withPluginScopeLock,
32
+ } from "../plugins/index.js";
33
+ import {
34
+ classifyLibraryRequirements,
35
+ commitLibraryInstallPlan,
36
+ discoverLibrary,
37
+ type LibraryInstallPlan,
38
+ libraryEntryRef,
39
+ planLibraryInstall,
40
+ planLibraryUpdate,
41
+ releaseLibraryPlan,
42
+ resolveInstalledLibraryEntry,
43
+ resolveLibraryPackage,
44
+ } from "./library.js";
45
+ import { type LibraryCopyState, libraryCopyState, readLibraryInventory } from "./library-inventory.js";
46
+ import {
47
+ isLibraryKind,
48
+ type LibraryEntryKind,
49
+ type LibraryRequirementRef,
50
+ type LibraryResourceKind,
51
+ } from "./library-types.js";
52
+ import { validateLibraryPackage } from "./library-validation.js";
53
+
54
+ export type LibraryOperation = "install" | "update" | "enable" | "disable" | "remove";
55
+
56
+ export interface LibraryPackageIdentity {
57
+ ref: LibraryRequirementRef;
58
+ kind: LibraryEntryKind;
59
+ name: string;
60
+ scope: PluginScope;
61
+ }
62
+
63
+ export interface LibraryLifecycleRequest {
64
+ operation: LibraryOperation;
65
+ /** "kind:name", a bare name when unambiguous, or (install) a local path / GitHub tree. */
66
+ ref: string;
67
+ scope?: PluginScope;
68
+ /** Existing replace-with-recovery semantics only; never a dependency bypass. */
69
+ force?: boolean;
70
+ withRequirements?: boolean;
71
+ catalog?: string;
72
+ cwd?: string;
73
+ }
74
+
75
+ export type LibraryExpectedCopy = PluginExpectedCopy;
76
+
77
+ export interface LibraryPlanStep {
78
+ operation: LibraryOperation;
79
+ identity: LibraryPackageIdentity;
80
+ destination: string;
81
+ source?: { sourceUrl: string; sha256: string; staged: boolean };
82
+ content?: {
83
+ valid: boolean;
84
+ resources: Array<{ kind: LibraryResourceKind; name: string; valid: boolean }>;
85
+ diagnostics: string[];
86
+ };
87
+ expected: LibraryExpectedCopy[];
88
+ dependencies: {
89
+ requires: LibraryRequirementRef[];
90
+ missing: LibraryRequirementRef[];
91
+ inactive: LibraryRequirementRef[];
92
+ };
93
+ dependents: { newlyBroken: PluginDependentBreak[]; preexisting: PluginDependentBreak[] };
94
+ effectiveAfter?: { scope: PluginScope; loadable: boolean; state: LibraryCopyState };
95
+ fallbackNote: string;
96
+ recovery: string;
97
+ refusal?: string;
98
+ }
99
+
100
+ export interface LibraryLifecyclePlan {
101
+ version: 1;
102
+ id: string;
103
+ createdAt: string;
104
+ cwd: string;
105
+ request: LibraryLifecycleRequest;
106
+ steps: LibraryPlanStep[];
107
+ applicable: boolean;
108
+ diagnostics: string[];
109
+ }
110
+
111
+ export type LibraryStepStatus = "committed" | "failed" | "unattempted";
112
+
113
+ export interface LibraryStepVerification {
114
+ /** Whether the admission read ran before or after the host refreshed its snapshot. */
115
+ evidence: "pre-refresh" | "post-refresh";
116
+ tree: "present" | "absent" | "changed";
117
+ record: "recorded" | "absent" | "unreadable";
118
+ copy?: LibraryCopyState;
119
+ resources: Array<{ kind: LibraryResourceKind; name: string; available: boolean; reason?: string }>;
120
+ effective: { scope: PluginScope; loadable: boolean } | null;
121
+ }
122
+
123
+ export interface LibraryStepOutcome {
124
+ status: LibraryStepStatus;
125
+ operation: LibraryOperation;
126
+ identity: LibraryPackageIdentity;
127
+ verification?: LibraryStepVerification;
128
+ recovery?: { packageBackup?: string; stateBackup?: string };
129
+ diagnostics: string[];
130
+ error?: {
131
+ code: "stale_plan" | "locked" | "refused" | "writer" | "verification";
132
+ message: string;
133
+ changed?: PluginWriterRefusal["changed"];
134
+ next: string;
135
+ };
136
+ }
137
+
138
+ export type LibraryRefreshResult =
139
+ | { status: "refreshed"; generation: number; changed: boolean }
140
+ | { status: "failed"; error: string }
141
+ | { status: "not-applicable"; reason: string };
142
+
143
+ /** Provided by the active host. Must never re-run a lifecycle write. */
144
+ export type LibraryRefreshHost = (cwd: string) => LibraryRefreshResult;
145
+
146
+ export interface LibraryApplyResult {
147
+ planId: string;
148
+ dryRun: boolean;
149
+ outcomes: LibraryStepOutcome[];
150
+ committed: number;
151
+ failed: number;
152
+ unattempted: number;
153
+ refresh: LibraryRefreshResult;
154
+ }
155
+
156
+ // ---------------------------------------------------------------------------
157
+ // Staging registry: plans stay JSON-safe; staged sources are tracked by plan id.
158
+ // ---------------------------------------------------------------------------
159
+
160
+ const staged = new Map<string, Map<string, LibraryInstallPlan>>();
161
+
162
+ function stepKey(identity: LibraryPackageIdentity): string {
163
+ return `${identity.scope}:${identity.ref}`;
164
+ }
165
+
166
+ function retain(planId: string, identity: LibraryPackageIdentity, plan: LibraryInstallPlan): void {
167
+ const byStep = staged.get(planId) ?? new Map<string, LibraryInstallPlan>();
168
+ byStep.set(stepKey(identity), plan);
169
+ staged.set(planId, byStep);
170
+ }
171
+
172
+ /** Cancel: release every staged source and write nothing. Idempotent. */
173
+ export function releaseLibraryLifecycle(plan: Pick<LibraryLifecyclePlan, "id">): void {
174
+ const byStep = staged.get(plan.id);
175
+ staged.delete(plan.id);
176
+ for (const item of byStep?.values() ?? []) releaseLibraryPlan(item);
177
+ }
178
+
179
+ /** Plans carry no callbacks or bytes; this exists so callers can treat them symmetrically with import summaries. */
180
+ export function libraryLifecyclePlanSummary(plan: LibraryLifecyclePlan): LibraryLifecyclePlan {
181
+ return plan;
182
+ }
183
+
184
+ // ---------------------------------------------------------------------------
185
+ // Planning
186
+ // ---------------------------------------------------------------------------
187
+
188
+ function peerOf(scope: PluginScope): PluginScope {
189
+ return scope === "user" ? "project" : "user";
190
+ }
191
+
192
+ function identityOf(kind: LibraryEntryKind, name: string, scope: PluginScope): LibraryPackageIdentity {
193
+ return { ref: `${kind}:${name}`, kind, name, scope };
194
+ }
195
+
196
+ function copyOf(
197
+ entries: ReadonlyArray<InstalledPlugin>,
198
+ identity: LibraryPackageIdentity,
199
+ ): InstalledPlugin | undefined {
200
+ return entries.find(
201
+ (item) => item.id === identity.name && (item.kind ?? "plugin") === identity.kind && item.scope === identity.scope,
202
+ );
203
+ }
204
+
205
+ function observe(cwd: string, scope: PluginScope, id: string, diagnostics: string[]): LibraryExpectedCopy | undefined {
206
+ try {
207
+ return observePluginCopy(scope, id, cwd);
208
+ } catch (error) {
209
+ diagnostics.push(`state for ${scope}:${id} unreadable: ${error instanceof Error ? error.message : String(error)}`);
210
+ return undefined;
211
+ }
212
+ }
213
+
214
+ /**
215
+ * Facts to recheck for one step: the mutated copy, its peer-scope copy when the
216
+ * peer plugin directory exists, and every dependent consulted. Copies written by
217
+ * earlier steps of the same batch are excluded so a plan cannot stale itself.
218
+ */
219
+ function expectedFor(
220
+ cwd: string,
221
+ identity: LibraryPackageIdentity,
222
+ consulted: ReadonlyArray<{ scope: PluginScope; id: string }>,
223
+ earlier: ReadonlyArray<LibraryPackageIdentity>,
224
+ diagnostics: string[],
225
+ ): LibraryExpectedCopy[] {
226
+ const wanted = new Map<string, { scope: PluginScope; id: string }>();
227
+ wanted.set(`${identity.scope}:${identity.name}`, { scope: identity.scope, id: identity.name });
228
+ if (existsSync(pluginBaseDir(peerOf(identity.scope), cwd)))
229
+ wanted.set(`${peerOf(identity.scope)}:${identity.name}`, { scope: peerOf(identity.scope), id: identity.name });
230
+ for (const item of consulted) wanted.set(`${item.scope}:${item.id}`, item);
231
+ for (const item of earlier) wanted.delete(`${item.scope}:${item.name}`);
232
+ const out: LibraryExpectedCopy[] = [];
233
+ for (const item of wanted.values()) {
234
+ const fact = observe(cwd, item.scope, item.id, diagnostics);
235
+ if (fact) out.push(fact);
236
+ }
237
+ return out;
238
+ }
239
+
240
+ function stateAfterInstall(entries: ReadonlyArray<InstalledPlugin>, identity: LibraryPackageIdentity) {
241
+ const peer = entries.find(
242
+ (item) => item.id === identity.name && item.scope === peerOf(identity.scope) && item.valid && item.compatible,
243
+ );
244
+ if (identity.scope === "user" && peer) {
245
+ return {
246
+ effectiveAfter: { scope: "project" as const, loadable: peer.loadable, state: libraryCopyState(peer) },
247
+ fallbackNote: `the project copy stays effective; the new user copy is shadowed until the project copy is removed`,
248
+ };
249
+ }
250
+ return {
251
+ effectiveAfter: { scope: identity.scope, loadable: true, state: "loadable" as const },
252
+ fallbackNote:
253
+ peer && identity.scope === "project"
254
+ ? "the new project copy shadows the existing user copy"
255
+ : "this copy becomes the effective copy",
256
+ };
257
+ }
258
+
259
+ function contentOf(root: string): NonNullable<LibraryPlanStep["content"]> {
260
+ const result = validateLibraryPackage(root);
261
+ return {
262
+ valid: result.valid,
263
+ resources: result.validation.resources
264
+ .filter((item): item is typeof item & { kind: LibraryResourceKind } => item.kind !== "plugin")
265
+ .map((item) => ({ kind: item.kind, name: item.name, valid: item.valid })),
266
+ diagnostics: [...result.diagnostics.map((d) => d.message), ...result.validation.diagnostics.map((d) => d.message)],
267
+ };
268
+ }
269
+
270
+ function installStep(
271
+ planId: string,
272
+ cwd: string,
273
+ scope: PluginScope,
274
+ staged: LibraryInstallPlan,
275
+ operation: "install" | "update",
276
+ entries: ReadonlyArray<InstalledPlugin>,
277
+ earlier: ReadonlyArray<LibraryPackageIdentity>,
278
+ dependencies: LibraryPlanStep["dependencies"],
279
+ diagnostics: string[],
280
+ ): LibraryPlanStep {
281
+ const identity = identityOf(staged.entry.kind, staged.entry.name, scope);
282
+ retain(planId, identity, staged);
283
+ const existing = copyOf(entries, identity);
284
+ const expected = expectedFor(cwd, identity, [], earlier, diagnostics);
285
+ staged.expect = { copies: expected };
286
+ const refusal =
287
+ existing && operation === "install" && !staged.force
288
+ ? `${identity.ref} is already installed in ${scope} scope; use update or force`
289
+ : undefined;
290
+ return {
291
+ operation,
292
+ identity,
293
+ destination: staged.path,
294
+ source: { sourceUrl: staged.entry.sourceUrl, sha256: staged.sha256, staged: staged.sourceRoot !== undefined },
295
+ content: contentOf(staged.sourceRoot as string),
296
+ expected,
297
+ dependencies,
298
+ dependents: { newlyBroken: [], preexisting: [] },
299
+ ...stateAfterInstall(entries, identity),
300
+ recovery: existing
301
+ ? "files in the current tree that differ from its record are kept beside it as a backup copy"
302
+ : "nothing to recover; the destination is empty",
303
+ ...(refusal ? { refusal } : {}),
304
+ };
305
+ }
306
+
307
+ function requirementRefs(status: ReturnType<typeof classifyLibraryRequirements>): LibraryPlanStep["dependencies"] {
308
+ return {
309
+ requires: status.ordered.map(libraryEntryRef),
310
+ missing: status.unsatisfied.map(libraryEntryRef),
311
+ inactive: (status.inactive ?? []).map(libraryEntryRef),
312
+ };
313
+ }
314
+
315
+ export function planLibraryLifecycle(request: LibraryLifecycleRequest): LibraryLifecyclePlan {
316
+ const cwd = path.resolve(request.cwd ?? process.cwd());
317
+ const id = randomBytes(8).toString("hex");
318
+ const diagnostics: string[] = [];
319
+ const steps: LibraryPlanStep[] = [];
320
+ const discoveryOptions = { cwd, ...(request.catalog ? { catalog: request.catalog } : {}) };
321
+ const entries = listInstalledPlugins(cwd, { all: true });
322
+ try {
323
+ if (request.operation === "install") {
324
+ const scope = request.scope ?? "user";
325
+ const entry = resolveLibraryPackage(request.ref, discoveryOptions);
326
+ let status: ReturnType<typeof classifyLibraryRequirements> = { ordered: [], satisfied: [], unsatisfied: [] };
327
+ let refusal: string | undefined;
328
+ try {
329
+ status = classifyLibraryRequirements(entry, discoverLibrary(discoveryOptions).entries, { cwd });
330
+ } catch (error) {
331
+ // A requirement absent from every index, or a cycle: refuse, do not throw.
332
+ refusal = error instanceof Error ? error.message : String(error);
333
+ }
334
+ const dependencies = requirementRefs(status);
335
+ if (!refusal && status.inactive?.length)
336
+ refusal = `library_requirement_inactive: ${dependencies.inactive.join(", ")}; enable or repair those packages first`;
337
+ else if (!refusal && status.unsatisfied.length && !request.withRequirements)
338
+ refusal = `library_requirement_missing: ${dependencies.missing.join(", ")}; plan with requirements`;
339
+ const identity = identityOf(entry.kind, entry.name, scope);
340
+ if (refusal) {
341
+ // Refused before staging: nothing is fetched for a plan that cannot apply.
342
+ steps.push({
343
+ operation: "install",
344
+ identity,
345
+ destination: path.join(pluginBaseDir(scope, cwd), entry.name),
346
+ source: { sourceUrl: entry.sourceUrl, sha256: entry.sha256 ?? "", staged: false },
347
+ expected: [],
348
+ dependencies,
349
+ dependents: { newlyBroken: [], preexisting: [] },
350
+ fallbackNote: "no change",
351
+ recovery: "nothing changes",
352
+ refusal,
353
+ });
354
+ } else {
355
+ const earlier: LibraryPackageIdentity[] = [];
356
+ for (const dependency of status.unsatisfied) {
357
+ const step = installStep(
358
+ id,
359
+ cwd,
360
+ scope,
361
+ planLibraryInstall(dependency, { cwd, scope }),
362
+ "install",
363
+ entries,
364
+ earlier,
365
+ requirementRefs(classifyLibraryRequirements(dependency, discoverLibrary(discoveryOptions).entries, { cwd })),
366
+ diagnostics,
367
+ );
368
+ steps.push(step);
369
+ earlier.push(step.identity);
370
+ }
371
+ steps.push(
372
+ installStep(
373
+ id,
374
+ cwd,
375
+ scope,
376
+ planLibraryInstall(entry, { cwd, scope, force: request.force ?? false }),
377
+ "install",
378
+ entries,
379
+ earlier,
380
+ dependencies,
381
+ diagnostics,
382
+ ),
383
+ );
384
+ }
385
+ } else if (request.operation === "update") {
386
+ const identity = resolveInstalledLibraryEntry(request.ref, {
387
+ cwd,
388
+ ...(request.scope ? { scope: request.scope } : {}),
389
+ });
390
+ let stagedPlan: LibraryInstallPlan | undefined;
391
+ let refusal: string | undefined;
392
+ try {
393
+ stagedPlan = planLibraryUpdate(request.ref, {
394
+ cwd,
395
+ scope: identity.scope,
396
+ force: request.force ?? false,
397
+ ...(request.catalog ? { catalog: request.catalog } : {}),
398
+ });
399
+ } catch (error) {
400
+ refusal = error instanceof Error ? error.message : String(error);
401
+ }
402
+ const requires = identity.requires ?? [];
403
+ const dependencies = {
404
+ requires,
405
+ missing: requires.filter(
406
+ (ref) => !entries.some((item) => item.loadable && `${item.kind ?? "plugin"}:${item.id}` === ref),
407
+ ),
408
+ inactive: [],
409
+ };
410
+ if (stagedPlan)
411
+ steps.push(installStep(id, cwd, identity.scope, stagedPlan, "update", entries, [], dependencies, diagnostics));
412
+ else {
413
+ const target = identityOf(identity.kind, identity.name, identity.scope);
414
+ steps.push({
415
+ operation: "update",
416
+ identity: target,
417
+ destination: path.join(pluginBaseDir(identity.scope, cwd), identity.name),
418
+ expected: [],
419
+ dependencies,
420
+ dependents: { newlyBroken: [], preexisting: [] },
421
+ fallbackNote: "no change",
422
+ recovery: "nothing changes",
423
+ refusal: refusal ?? "update source unavailable",
424
+ });
425
+ }
426
+ } else {
427
+ const resolved = resolveInstalledLibraryEntry(request.ref, {
428
+ cwd,
429
+ ...(request.scope ? { scope: request.scope } : {}),
430
+ });
431
+ const identity = identityOf(resolved.kind, resolved.name, resolved.scope);
432
+ const copy = copyOf(entries, identity);
433
+ if (!copy) throw new Error(`package not installed: ${identity.ref} (${identity.scope})`);
434
+ let refusal: string | undefined;
435
+ let dependents: LibraryPlanStep["dependents"] = { newlyBroken: [], preexisting: [] };
436
+ let effectiveAfter: LibraryPlanStep["effectiveAfter"];
437
+ let fallbackNote: string;
438
+ const requires = copy.manifest?.clio.requires ?? [];
439
+ const missing = requires.filter(
440
+ (ref) => !entries.some((item) => item.loadable && `${item.kind ?? "plugin"}:${item.id}` === ref),
441
+ );
442
+ if (request.operation === "enable") {
443
+ if (!copy.valid || !copy.compatible)
444
+ refusal = `${identity.ref} cannot be enabled: ${copy.diagnostics.map((d) => d.message).join("; ")}`;
445
+ else if (missing.length)
446
+ refusal = `library_requirement_missing: ${missing.join(", ")}; install or enable those first`;
447
+ const winner = entries.find((item) => item.id === identity.name && item.effective);
448
+ effectiveAfter = winner
449
+ ? {
450
+ scope: winner.scope,
451
+ loadable: winner === copy ? copy.valid && copy.compatible : winner.loadable,
452
+ state: winner === copy ? "loadable" : libraryCopyState(winner),
453
+ }
454
+ : undefined;
455
+ fallbackNote =
456
+ winner && winner !== copy
457
+ ? `the ${winner.scope} copy stays effective; this ${identity.scope} copy remains shadowed`
458
+ : "this copy becomes loadable";
459
+ } else {
460
+ const projection = newlyBrokenDependents(entries, {
461
+ scope: identity.scope,
462
+ id: identity.name,
463
+ operation: request.operation,
464
+ });
465
+ dependents = { newlyBroken: projection.newlyBroken, preexisting: projection.preexisting };
466
+ if (projection.newlyBroken.length)
467
+ refusal = `${request.operation} would break ${projection.newlyBroken
468
+ .map((item) => `${item.scope}:${item.ref} (missing ${item.missing.join(", ")})`)
469
+ .join("; ")}; disable or remove those dependents first`;
470
+ const survivor = projection.effectiveAfter;
471
+ effectiveAfter = survivor
472
+ ? { scope: survivor.scope, loadable: survivor.loadable, state: libraryCopyState(survivor) }
473
+ : undefined;
474
+ if (request.operation === "disable")
475
+ fallbackNote =
476
+ survivor && survivor.scope === identity.scope
477
+ ? survivor.overriddenBy || entries.some((item) => item.id === identity.name && item.scope !== identity.scope)
478
+ ? `the disabled ${identity.scope} copy still shadows the ${peerOf(identity.scope)} copy; removal would reveal it`
479
+ : "no other copy exists; nothing falls back"
480
+ : "another copy is already effective";
481
+ else
482
+ fallbackNote = survivor
483
+ ? `the ${survivor.scope} copy becomes effective (${survivor.loadable ? "loadable" : libraryCopyState(survivor)})`
484
+ : "no other copy exists; the package will be absent";
485
+ }
486
+ const consulted = entries
487
+ .filter((item) => item.loadable && (item.manifest?.clio.requires?.length ?? 0) > 0)
488
+ .map((item) => ({ scope: item.scope, id: item.id }));
489
+ steps.push({
490
+ operation: request.operation,
491
+ identity,
492
+ destination: copy.rootPath,
493
+ ...(request.operation === "enable" ? { content: contentOf(copy.rootPath) } : {}),
494
+ expected: expectedFor(cwd, identity, consulted, [], diagnostics),
495
+ dependencies: { requires, missing, inactive: [] },
496
+ dependents,
497
+ ...(effectiveAfter ? { effectiveAfter } : {}),
498
+ fallbackNote,
499
+ recovery:
500
+ request.operation === "remove"
501
+ ? "files that differ from the recorded content are kept beside the destination as a removed backup"
502
+ : "only the enabled flag in state.json changes; no files move",
503
+ ...(refusal ? { refusal } : {}),
504
+ });
505
+ }
506
+ } catch (error) {
507
+ releaseLibraryLifecycle({ id });
508
+ throw error;
509
+ }
510
+ return {
511
+ version: 1,
512
+ id,
513
+ createdAt: new Date().toISOString(),
514
+ cwd,
515
+ request,
516
+ steps,
517
+ applicable: steps.every((step) => !step.refusal),
518
+ diagnostics,
519
+ };
520
+ }
521
+
522
+ // ---------------------------------------------------------------------------
523
+ // Verification
524
+ // ---------------------------------------------------------------------------
525
+
526
+ /** Read back one copy: tree, record, inventory state, actual recipe admission and the surviving effective copy. */
527
+ export function verifyLibraryStep(
528
+ identity: LibraryPackageIdentity,
529
+ cwd: string,
530
+ evidence: LibraryStepVerification["evidence"] = "pre-refresh",
531
+ ): LibraryStepVerification {
532
+ const entries = listInstalledPlugins(cwd, { all: true });
533
+ const copy = copyOf(entries, identity);
534
+ const root = path.join(pluginBaseDir(identity.scope, cwd), identity.name);
535
+ let record: LibraryStepVerification["record"] = "absent";
536
+ let recordedDigest: string | undefined;
537
+ try {
538
+ const saved = readPluginInstallRecord(identity.name, { cwd, scope: identity.scope });
539
+ record = saved ? "recorded" : "absent";
540
+ recordedDigest = saved?.contentDigest;
541
+ } catch {
542
+ record = "unreadable";
543
+ }
544
+ let tree: LibraryStepVerification["tree"] = "absent";
545
+ if (existsSync(root)) {
546
+ try {
547
+ tree = recordedDigest && pluginContentDigest(root) !== recordedDigest ? "changed" : "present";
548
+ } catch {
549
+ tree = "changed";
550
+ }
551
+ }
552
+ const kinds = new Set<LibraryResourceKind>();
553
+ for (const kind of Object.keys(copy?.resources ?? {}))
554
+ if (kind === "skills" || kind === "agents" || kind === "prompts" || kind === "fleets")
555
+ kinds.add(kind.slice(0, -1) as LibraryResourceKind);
556
+ const resources: LibraryStepVerification["resources"] = [];
557
+ if (copy && kinds.size) {
558
+ const inventory = readLibraryInventory({
559
+ cwd,
560
+ include: { packages: false, copies: false },
561
+ kinds: [...kinds],
562
+ sources: ["package"],
563
+ });
564
+ for (const resource of inventory.resources)
565
+ if (resource.owner?.ref === identity.ref && resource.owner.scope === identity.scope)
566
+ resources.push({
567
+ kind: resource.kind,
568
+ name: resource.name,
569
+ available: resource.availability === "available",
570
+ ...(resource.reason ? { reason: resource.reason } : {}),
571
+ });
572
+ }
573
+ const effective = entries.find((item) => item.id === identity.name && item.effective);
574
+ return {
575
+ evidence,
576
+ tree,
577
+ record,
578
+ ...(copy ? { copy: libraryCopyState(copy) } : {}),
579
+ resources,
580
+ effective: effective ? { scope: effective.scope, loadable: effective.loadable } : null,
581
+ };
582
+ }
583
+
584
+ // ---------------------------------------------------------------------------
585
+ // Apply
586
+ // ---------------------------------------------------------------------------
587
+
588
+ function nextFor(code: NonNullable<LibraryStepOutcome["error"]>["code"]): string {
589
+ switch (code) {
590
+ case "stale_plan":
591
+ return "review a fresh plan";
592
+ case "locked":
593
+ return "retry the same plan when the other operation finishes";
594
+ case "refused":
595
+ return "resolve the refusal and review a fresh plan";
596
+ case "verification":
597
+ return "inspect the copy and its recovery paths";
598
+ default:
599
+ return "inspect the diagnostics and recovery paths, then review a fresh plan";
600
+ }
601
+ }
602
+
603
+ function failed(
604
+ step: LibraryPlanStep,
605
+ code: NonNullable<LibraryStepOutcome["error"]>["code"],
606
+ message: string,
607
+ extra: Pick<Partial<LibraryStepOutcome>, "diagnostics" | "recovery"> = {},
608
+ ): LibraryStepOutcome {
609
+ return {
610
+ status: "failed",
611
+ operation: step.operation,
612
+ identity: step.identity,
613
+ diagnostics: [],
614
+ ...extra,
615
+ error: { code, message, next: nextFor(code) },
616
+ };
617
+ }
618
+
619
+ function writerError(diagnostics: PluginDiagnostic[]): PluginDiagnostic | undefined {
620
+ return diagnostics.find((item) => item.type === "error");
621
+ }
622
+
623
+ function runWriter(plan: LibraryLifecyclePlan, step: LibraryPlanStep): PluginMutationResult {
624
+ const { identity } = step;
625
+ const scoped = { cwd: plan.cwd, scope: identity.scope, expect: { copies: step.expected } };
626
+ if (step.operation === "install" || step.operation === "update") {
627
+ const stagedPlan = staged.get(plan.id)?.get(stepKey(identity));
628
+ if (!stagedPlan) throw new Error(`plan ${plan.id} has no staged source for ${identity.ref}; it was released`);
629
+ stagedPlan.expect = scoped.expect;
630
+ return commitLibraryInstallPlan(stagedPlan);
631
+ }
632
+ if (step.operation === "enable") return enablePlugin(identity.name, scoped);
633
+ if (step.operation === "disable") return disablePlugin(identity.name, scoped);
634
+ return removePlugin(identity.name, scoped);
635
+ }
636
+
637
+ function applyStep(plan: LibraryLifecyclePlan, step: LibraryPlanStep): LibraryStepOutcome {
638
+ const peer = peerOf(step.identity.scope);
639
+ const holdPeer = step.expected.some((fact) => fact.scope === peer) && existsSync(pluginBaseDir(peer, plan.cwd));
640
+ let result: PluginMutationResult;
641
+ try {
642
+ result = holdPeer ? withPluginScopeLock(peer, plan.cwd, () => runWriter(plan, step)) : runWriter(plan, step);
643
+ } catch (error: unknown) {
644
+ if (error instanceof PluginWriterRefusal) {
645
+ const outcome = failed(step, error.code === "dependents" ? "refused" : error.code, error.message);
646
+ if (error.changed && outcome.error) outcome.error.changed = error.changed;
647
+ return outcome;
648
+ }
649
+ return failed(step, "writer", error instanceof Error ? error.message : String(error));
650
+ }
651
+ const problem = writerError(result.diagnostics);
652
+ if (problem) {
653
+ const code = problem.code === "dependents" ? "refused" : (problem.code ?? "writer");
654
+ const outcome = failed(step, code, problem.message, {
655
+ diagnostics: result.diagnostics.map((d) => d.message),
656
+ ...(result.recovery ? { recovery: result.recovery } : {}),
657
+ });
658
+ if (problem.changed && outcome.error) outcome.error.changed = problem.changed;
659
+ return outcome;
660
+ }
661
+ // The writer committed durably. Verification can only annotate that fact;
662
+ // a read-back failure never turns the commit into a failed step.
663
+ const outcome: LibraryStepOutcome = {
664
+ status: "committed",
665
+ operation: step.operation,
666
+ identity: step.identity,
667
+ ...(result.recovery ? { recovery: result.recovery } : {}),
668
+ diagnostics: result.diagnostics.map((d) => d.message),
669
+ };
670
+ annotateVerification(outcome, plan.cwd, "pre-refresh", step.operation === "remove");
671
+ return outcome;
672
+ }
673
+
674
+ function annotateVerification(
675
+ outcome: LibraryStepOutcome,
676
+ cwd: string,
677
+ evidence: LibraryStepVerification["evidence"],
678
+ wantsAbsent: boolean,
679
+ ): void {
680
+ let verification: LibraryStepVerification;
681
+ try {
682
+ verification = verifyLibraryStep(outcome.identity, cwd, evidence);
683
+ } catch (error) {
684
+ outcome.error = {
685
+ code: "verification",
686
+ message: `${evidence} read-back failed: ${error instanceof Error ? error.message : String(error)}`,
687
+ next: nextFor("verification"),
688
+ };
689
+ return;
690
+ }
691
+ outcome.verification = verification;
692
+ const diskOk = wantsAbsent
693
+ ? verification.tree === "absent" && verification.record === "absent"
694
+ : verification.tree === "present" && verification.record === "recorded";
695
+ if (diskOk) delete outcome.error;
696
+ else
697
+ outcome.error = {
698
+ code: "verification",
699
+ message: `writer reported success but the ${outcome.identity.scope} copy reads back tree=${verification.tree} record=${verification.record}`,
700
+ next: nextFor("verification"),
701
+ };
702
+ }
703
+
704
+ function unattempted(step: LibraryPlanStep): LibraryStepOutcome {
705
+ return { status: "unattempted", operation: step.operation, identity: step.identity, diagnostics: [] };
706
+ }
707
+
708
+ export function applyLibraryLifecycle(
709
+ plan: LibraryLifecyclePlan,
710
+ options: { dryRun?: boolean; refresh?: LibraryRefreshHost } = {},
711
+ ): LibraryApplyResult {
712
+ const outcomes: LibraryStepOutcome[] = [];
713
+ try {
714
+ if (options.dryRun) {
715
+ for (const step of plan.steps) outcomes.push(unattempted(step));
716
+ return summarize(plan, true, outcomes, { status: "not-applicable", reason: "dry run; nothing committed" });
717
+ }
718
+ if (!plan.applicable) {
719
+ for (const step of plan.steps)
720
+ outcomes.push(step.refusal ? failed(step, "refused", step.refusal) : { ...unattempted(step) });
721
+ return summarize(plan, false, outcomes, { status: "not-applicable", reason: "plan refused; nothing committed" });
722
+ }
723
+ let aborted = false;
724
+ for (const step of plan.steps) {
725
+ if (aborted) {
726
+ outcomes.push(unattempted(step));
727
+ continue;
728
+ }
729
+ const outcome = applyStep(plan, step);
730
+ outcomes.push(outcome);
731
+ // A durable commit with a verification problem still stops the batch;
732
+ // later steps must not build on a copy whose state cannot be proven.
733
+ if (outcome.status !== "committed" || outcome.error) aborted = true;
734
+ }
735
+ } finally {
736
+ releaseLibraryLifecycle(plan);
737
+ }
738
+ const committed = outcomes.filter((item) => item.status === "committed");
739
+ const refresh = committed.length
740
+ ? retryLibraryRefresh(plan.cwd, options.refresh)
741
+ : ({ status: "not-applicable", reason: "nothing committed" } as const);
742
+ if (refresh.status === "refreshed")
743
+ for (const outcome of committed)
744
+ annotateVerification(outcome, plan.cwd, "post-refresh", outcome.operation === "remove");
745
+ return summarize(plan, false, outcomes, refresh);
746
+ }
747
+
748
+ function summarize(
749
+ plan: LibraryLifecyclePlan,
750
+ dryRun: boolean,
751
+ outcomes: LibraryStepOutcome[],
752
+ refresh: LibraryRefreshResult,
753
+ ): LibraryApplyResult {
754
+ return {
755
+ planId: plan.id,
756
+ dryRun,
757
+ outcomes,
758
+ committed: outcomes.filter((item) => item.status === "committed").length,
759
+ failed: outcomes.filter((item) => item.status === "failed").length,
760
+ unattempted: outcomes.filter((item) => item.status === "unattempted").length,
761
+ refresh,
762
+ };
763
+ }
764
+
765
+ /** Refresh only. Never reinstalls or removes; safe after a partial batch or a failed refresh. */
766
+ export function retryLibraryRefresh(cwd: string, refresh?: LibraryRefreshHost): LibraryRefreshResult {
767
+ if (!refresh)
768
+ return {
769
+ status: "not-applicable",
770
+ reason: "no active session in this process; use /library reload in the running TUI",
771
+ };
772
+ try {
773
+ return refresh(cwd);
774
+ } catch (error) {
775
+ return { status: "failed", error: error instanceof Error ? error.message : String(error) };
776
+ }
777
+ }
778
+
779
+ /** Default host adapter over the snapshot reload; the TUI wraps it with its bus notification. */
780
+ export function pluginSnapshotRefreshHost(
781
+ reload: (cwd: string) => PluginSnapshot = reloadPluginResources,
782
+ previousGeneration: (cwd: string) => number = () => 0,
783
+ ): LibraryRefreshHost {
784
+ return (cwd) => {
785
+ const before = previousGeneration(cwd);
786
+ const next = reload(cwd);
787
+ return { status: "refreshed", generation: next.generation, changed: before === 0 || next.generation !== before };
788
+ };
789
+ }
790
+
791
+ /** The typed kind of an import: the applied install record when published, else the reviewed manifest bytes. */
792
+ function importedKind(plan: LibraryImportPlan, result: LibraryImportApplyResult, name: string): LibraryEntryKind {
793
+ if (result.published) {
794
+ try {
795
+ const saved = readPluginInstallRecord(name, { cwd: plan.cwd, scope: plan.scope });
796
+ if (saved?.kind) return saved.kind;
797
+ } catch {
798
+ // Fall through to the reviewed bytes.
799
+ }
800
+ }
801
+ try {
802
+ const manifest = plan.files?.["plugin.json"];
803
+ const parsed = manifest ? (JSON.parse(manifest) as { extensions?: Record<string, { kind?: unknown }> }) : undefined;
804
+ const kind = parsed?.extensions?.["ai.iowarp.clio"]?.kind;
805
+ if (isLibraryKind(kind)) return kind;
806
+ } catch {
807
+ // Unreadable review bytes: portable default.
808
+ }
809
+ return "plugin";
810
+ }
811
+
812
+ /** Read-only projection of an explicit import into the shared outcome shape. Trust stays foreign; nothing re-runs. */
813
+ export function libraryImportOutcome(plan: LibraryImportPlan, result: LibraryImportApplyResult): LibraryStepOutcome {
814
+ const name = result.installed ?? plan.id ?? path.basename(plan.source.root);
815
+ const identity = identityOf(importedKind(plan, result, name), name, plan.scope);
816
+ if (!result.published)
817
+ return {
818
+ status: "failed",
819
+ operation: "install",
820
+ identity,
821
+ diagnostics: result.diagnostics,
822
+ error: {
823
+ code: "refused",
824
+ message: result.diagnostics.join("; ") || "import not published",
825
+ next: nextFor("refused"),
826
+ },
827
+ };
828
+ const outcome: LibraryStepOutcome = {
829
+ status: "committed",
830
+ operation: "install",
831
+ identity,
832
+ diagnostics: [...result.diagnostics, `foreign trust; project-import gate ${String(result.admission.gateEnabled)}`],
833
+ };
834
+ annotateVerification(outcome, plan.cwd, "pre-refresh", false);
835
+ return outcome;
836
+ }