@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.
- package/.claude-plugin/marketplace.json +283 -0
- package/CHANGELOG.md +50 -0
- package/CONTRIBUTING.md +102 -29
- package/NOTICE +8 -0
- package/README.md +37 -5
- package/dist/{acp-UVEVWSDL.js → acp-W3Y3TRHD.js} +12 -12
- package/dist/{agents-VWY37DTK.js → agents-J4ICNLQ3.js} +52 -52
- package/dist/assets/codewiki.json +1 -1
- package/dist/assets/tui-notices/get-east-asian-width-LICENSE +9 -0
- package/dist/assets/tui-notices/marked-LICENSE +44 -0
- package/dist/assets/tui-notices/pi-tui-LICENSE +21 -0
- package/dist/{auth-PCV2XQDV.js → auth-X2UJUMOC.js} +24 -24
- package/dist/{builtins-PD652MTK.js → builtins-XLXWWSRF.js} +6 -6
- package/dist/{chunk-DZK63TZJ.js → chunk-24S3DN22.js} +336 -612
- package/dist/{chunk-NTK3WTHM.js → chunk-24TOGHPO.js} +2 -2
- package/dist/{chunk-M6TAYK66.js → chunk-2O2LVQQK.js} +11 -4
- package/dist/{chunk-OQM5IVJY.js → chunk-34XHRVKG.js} +3 -3
- package/dist/{chunk-LY4N4TTL.js → chunk-3LXJOICS.js} +2 -2
- package/dist/{chunk-3BJGMT2D.js → chunk-3XE4NRLF.js} +1 -1
- package/dist/{chunk-N2OKBREN.js → chunk-4MFBBY2Z.js} +3 -3
- package/dist/{chunk-5VTJP36Q.js → chunk-4N2RZ4TO.js} +2 -2
- package/dist/{chunk-WNGF5AJX.js → chunk-4QKAITQT.js} +3 -3
- package/dist/chunk-4UHVS5T7.js +207 -0
- package/dist/{chunk-GLYBJ4RQ.js → chunk-5AJPUR72.js} +6 -6
- package/dist/{chunk-5CY4Q6QI.js → chunk-5EQO5NWP.js} +105 -3
- package/dist/{chunk-6HAO6X5B.js → chunk-65BGHOUR.js} +8 -5
- package/dist/{chunk-6VRRJT7L.js → chunk-6CA2BHOR.js} +2 -2
- package/dist/{chunk-HL26ADLH.js → chunk-6CB2IL4N.js} +2 -1
- package/dist/{chunk-E7RF4KBO.js → chunk-6LRLOJHQ.js} +3 -3
- package/dist/{chunk-HXHFDHB6.js → chunk-6TAATXXH.js} +6 -6
- package/dist/{chunk-P6M7RKMI.js → chunk-6YHPAAZR.js} +3 -3
- package/dist/{chunk-5QRX7SLS.js → chunk-7EEGBKV4.js} +7 -7
- package/dist/{chunk-BS4GAMUB.js → chunk-A67NR5AT.js} +2 -2
- package/dist/{chunk-WJIMKGD6.js → chunk-BAU36233.js} +8 -8
- package/dist/{chunk-PZN2LQY6.js → chunk-BO4XV5VX.js} +4 -4
- package/dist/{chunk-I2K2NCZQ.js → chunk-BQQ5MXUC.js} +6 -6
- package/dist/{chunk-X3BI7HTV.js → chunk-C3G5PNUO.js} +21 -21
- package/dist/{chunk-SRZOW5L2.js → chunk-C6GEXX4L.js} +1 -1
- package/dist/{chunk-6RYDAVQT.js → chunk-CE64C5K5.js} +219 -64
- package/dist/chunk-CP3HIR5H.js +2119 -0
- package/dist/{chunk-BBV5TKE6.js → chunk-CPXGJI2A.js} +2 -2
- package/dist/{chunk-IGLVVNEG.js → chunk-CULVKYTK.js} +4 -4
- package/dist/{chunk-DXLUVUD4.js → chunk-D2T66PDV.js} +5 -5
- package/dist/{chunk-NF3BK5WR.js → chunk-DACXIVVF.js} +5 -5
- package/dist/{chunk-IKRWLEDA.js → chunk-DLIYANB7.js} +20 -15
- package/dist/{chunk-RGZNQ5CT.js → chunk-DO7M3LSX.js} +9 -9
- package/dist/{chunk-2QPI3TR3.js → chunk-DVJL77SO.js} +2 -2
- package/dist/{chunk-ODUTYZIU.js → chunk-EUEXGXXR.js} +5 -5
- package/dist/{chunk-WKUYQBCG.js → chunk-EUZRMP4Y.js} +18 -16
- package/dist/{chunk-JMPL7NUB.js → chunk-G4LGUTOE.js} +4 -4
- package/dist/{chunk-CBSKDFWL.js → chunk-GEVQNST4.js} +2 -2
- package/dist/{chunk-NNWJYUNO.js → chunk-GFQ7P2UF.js} +7 -7
- package/dist/{chunk-SXQKNKRA.js → chunk-GI5RRMAH.js} +14 -14
- package/dist/{chunk-HPTJF6DG.js → chunk-GVZFCJHE.js} +336 -83
- package/dist/{chunk-ACCKVSHU.js → chunk-GXIWHXDB.js} +3 -3
- package/dist/{chunk-LUL5Z66S.js → chunk-HOX4YZ2K.js} +6 -5
- package/dist/chunk-HRAKUPIH.js +57 -0
- package/dist/{chunk-F5Z7EWMN.js → chunk-IJMW64DX.js} +50 -50
- package/dist/{chunk-QNWRHOMF.js → chunk-IMOD2YPV.js} +16 -9
- package/dist/{chunk-HZ2T2YED.js → chunk-IQCNVLO6.js} +28 -8
- package/dist/{chunk-HZFBVU5X.js → chunk-ISNCCX42.js} +8 -8
- package/dist/{chunk-7JSSKXG2.js → chunk-IZYTT3CD.js} +7 -3
- package/dist/chunk-KKEYGFX4.js +915 -0
- package/dist/{chunk-HHVJNVUJ.js → chunk-KS7ETA3P.js} +2 -2
- package/dist/{chunk-BLTEAUCB.js → chunk-L3Z5ANCV.js} +7 -7
- package/dist/{chunk-4VMV6OS6.js → chunk-LBFQMYS3.js} +2 -2
- package/dist/{chunk-URBGEOH3.js → chunk-M6Z2V6YU.js} +5 -5
- package/dist/{chunk-BT7HGDOX.js → chunk-MBJO5VNZ.js} +12 -12
- package/dist/chunk-MNQN3X6Y.js +595 -0
- package/dist/{chunk-3QKXHCGS.js → chunk-MZHXENL7.js} +5 -5
- package/dist/chunk-MZNWZUJM.js +1801 -0
- package/dist/{chunk-7YJWEF2L.js → chunk-N37QC5FV.js} +5 -5
- package/dist/{chunk-TJFDL26W.js → chunk-NCCQ6DVS.js} +7 -7
- package/dist/{chunk-P5JMBPDJ.js → chunk-NO7J45X6.js} +162 -47
- package/dist/chunk-OH3YYA3B.js +15 -0
- package/dist/{chunk-22PQ4TX4.js → chunk-P4DL2LM5.js} +16 -77
- package/dist/{chunk-LIN2K3EL.js → chunk-PFLOULP3.js} +4 -4
- package/dist/{chunk-QXFBABFJ.js → chunk-QKWL7SYE.js} +11 -11
- package/dist/chunk-RFCKPS2V.js +26 -0
- package/dist/{chunk-ZS43Y2FT.js → chunk-RTLNFZMD.js} +12 -4
- package/dist/{chunk-U7H5WRG5.js → chunk-RXFPB32E.js} +8 -6
- package/dist/{chunk-Q7NNUHQV.js → chunk-SEDI5K5B.js} +16 -16
- package/dist/{chunk-WV6TDAPN.js → chunk-SELG4SUR.js} +7 -7
- package/dist/{chunk-3WBALRQH.js → chunk-SER7RRAE.js} +27 -832
- package/dist/{chunk-K2HL3GBL.js → chunk-T4TY5GG3.js} +165 -15
- package/dist/chunk-T7QQBNLH.js +691 -0
- package/dist/{chunk-6OII3LOK.js → chunk-TLTGZTXI.js} +3 -3
- package/dist/chunk-TZ6UVP2H.js +637 -0
- package/dist/{chunk-3JLFK5MW.js → chunk-TZHN5ITX.js} +13 -41
- package/dist/{chunk-VANN3GDP.js → chunk-U3TPUXOQ.js} +399 -234
- package/dist/{chunk-VHMX7SXF.js → chunk-UA3W4FGC.js} +6 -6
- package/dist/{chunk-3O2ZAUGQ.js → chunk-UA6W4XFJ.js} +2 -2
- package/dist/chunk-UWD3JD5X.js +709 -0
- package/dist/chunk-V4ZKOKRB.js +13433 -0
- package/dist/{chunk-NC4KV7EL.js → chunk-VCRVEDUC.js} +5 -5
- package/dist/{chunk-4DU2TVI4.js → chunk-VMATUZB6.js} +12 -10
- package/dist/{chunk-J2FYEQ5L.js → chunk-VTYHHQ57.js} +2 -2
- package/dist/chunk-WB7POC6M.js +891 -0
- package/dist/{chunk-3HQVBIKD.js → chunk-WBVKKTUT.js} +2 -2
- package/dist/{chunk-EHOSNVVM.js → chunk-WLHX3MM5.js} +6 -2
- package/dist/{chunk-24T2YZ7A.js → chunk-WN552PKN.js} +553 -298
- package/dist/{chunk-4U4TKZFR.js → chunk-WT5TRMO4.js} +51 -26
- package/dist/{chunk-XWMSPJYN.js → chunk-WURGVOZJ.js} +56 -12
- package/dist/{chunk-7WUZEB2M.js → chunk-XR3XJN2M.js} +2 -2
- package/dist/chunk-XW2UZICE.js +372 -0
- package/dist/{chunk-2AKYFREM.js → chunk-XZ6UFQ52.js} +11 -11
- package/dist/chunk-Y3JU5RPK.js +8 -0
- package/dist/chunk-YKRJTYNP.js +1143 -0
- package/dist/{chunk-PWWSIB2A.js → chunk-ZGIGW4ZG.js} +5 -5
- package/dist/cli/index.js +34 -36
- package/dist/{clio-QQCMTUZE.js → clio-L2P7S2R2.js} +9 -9
- package/dist/{code-nav-GUPM6766.js → code-nav-B5LNX4KU.js} +25 -25
- package/dist/{components-TNIKXCBH.js → components-63MMQKUT.js} +6 -6
- package/dist/{config-IIM7YOD3.js → config-YXARKGTX.js} +70 -67
- package/dist/{configure-4ZM5HWJX.js → configure-LMVQJ46J.js} +47 -35
- package/dist/{context-OL5P3HEP.js → context-7HJEWTTP.js} +87 -44
- package/dist/{context-44BZLJ3J.js → context-XSZKKFBW.js} +14 -14
- package/dist/{context-AIDVQKMW.js → context-YG2LZDYZ.js} +60 -58
- package/dist/{context-clear-OQV76MYP.js → context-clear-AC5NXHM2.js} +57 -55
- package/dist/{context-index-HP2JFUWA.js → context-index-KKTPRV5G.js} +3 -3
- package/dist/{context-map-INTXD54D.js → context-map-T7ROR5D5.js} +4 -4
- package/dist/{context-working-set-ZUW3EGLS.js → context-working-set-F4Q4J3NS.js} +12 -10
- package/dist/{detail-UXPWRANG.js → detail-H73BEF2N.js} +58 -56
- package/dist/{dispatch-runner-P3ZW6G77.js → dispatch-runner-3RY5FSJC.js} +74 -72
- package/dist/{doctor-JJVGPZWT.js → doctor-EQYJOGUG.js} +44 -30
- package/dist/{eval-V2RTN3UH.js → eval-4P7O6CCE.js} +109 -46
- package/dist/{evidence-35PYWGSO.js → evidence-D6GUSYJW.js} +57 -55
- package/dist/{evidence-CIGGKI6J.js → evidence-O76QF7TZ.js} +62 -59
- package/dist/{evolve-33SM3NJP.js → evolve-H47BCETS.js} +58 -56
- package/dist/{extensions-YVRHX6ZI.js → extensions-NNL3ZOCU.js} +98 -20
- package/dist/{fleet-LFO7SIPC.js → fleet-KMNS6NOM.js} +106 -99
- package/dist/{fleet-commands-RLK72GU3.js → fleet-commands-DOWSYCBX.js} +14 -14
- package/dist/{fleet-decisions-3SBSCTCW.js → fleet-decisions-S3PTZV2D.js} +9 -9
- package/dist/{fleet-graph-JZIBCGMW.js → fleet-graph-F2DE2TME.js} +26 -24
- package/dist/{fleet-inspect-2L5YGGZJ.js → fleet-inspect-EN2Q6IVB.js} +60 -57
- package/dist/{fleet-preflight-QRSHIIDE.js → fleet-preflight-FRLETDD3.js} +3 -3
- package/dist/{fleet-validate-LIAVKDUU.js → fleet-validate-B2XDLS57.js} +28 -29
- package/dist/{fleet-verify-JIK3OQZR.js → fleet-verify-4JKUWGJ7.js} +57 -55
- package/dist/{fleet-view-IWHYGQKK.js → fleet-view-BHJFW26B.js} +60 -57
- package/dist/{init-NJEDOTQW.js → init-XAT5N5YM.js} +79 -74
- package/dist/interop-FVECHFKG.js +246 -0
- package/dist/{inventory-74UL7UHU.js → inventory-7KFQGLCV.js} +60 -57
- package/dist/library-NY2XOT75.js +492 -0
- package/dist/library-QAPAO23R.js +306 -0
- package/dist/library-import-5Y6MAS3R.js +183 -0
- package/dist/library-inventory-JT6HWITQ.js +56 -0
- package/dist/library-validation-EQUH25DC.js +42 -0
- package/dist/{memory-I76I5VUH.js → memory-DYVTTCP6.js} +58 -56
- package/dist/{models-D4YDIQZQ.js → models-MASFJ6Y2.js} +48 -36
- package/dist/{monitor-NKVD55HX.js → monitor-YMP4NXJJ.js} +64 -61
- package/dist/{orchestrator-I6OATVPK.js → orchestrator-AFQRRTEI.js} +3685 -1841
- package/dist/{panes-7BTYH3XQ.js → panes-D3Y2KFG5.js} +4 -4
- package/dist/{panes-WPOMEMRH.js → panes-NICTHQCV.js} +7 -7
- package/dist/{paths-J3KN7UAO.js → paths-PSFAUIGO.js} +5 -5
- package/dist/{preload-EJAWJEIO.js → preload-5Q7VXRFJ.js} +57 -55
- package/dist/{reset-4XMQKDNZ.js → reset-7NKZK7JN.js} +9 -9
- package/dist/{resources-TVYVXK3Q.js → resources-NILSIZAT.js} +94 -38
- package/dist/{run-OWQNNSJU.js → run-BPZGEBZV.js} +121 -105
- package/dist/{share-NPZZMUXG.js → share-EZ6ERBMH.js} +31 -28
- package/dist/skills-BTVVNYVM.js +100 -0
- package/dist/{skills-eval-J5TCKSJA.js → skills-eval-UY34MNK7.js} +110 -72
- package/dist/{skills-inventory-7II4DM57.js → skills-inventory-JDHSIA7I.js} +30 -25
- package/dist/{slash-commands-MDSDSWYF.js → slash-commands-K4FNQ2AT.js} +49 -46
- package/dist/{steer-S7D7IKPU.js → steer-2B3EQGFH.js} +4 -4
- package/dist/{support-5VAEC32W.js → support-L2SOL3IE.js} +7 -7
- package/dist/{targets-KILZEOCE.js → targets-44VKGFLN.js} +64 -58
- package/dist/{tasks-R6P6OV22.js → tasks-3KODKFU7.js} +12 -12
- package/dist/{terminal-lease-LZCG2KN3.js → terminal-lease-LXA7MMPO.js} +32 -19
- package/dist/{tools-6OCQ6SVB.js → tools-3UB7TEVR.js} +7 -7
- package/dist/{trace-JHLXWUMN.js → trace-TAMIU4OJ.js} +5 -4
- package/dist/{tui-primitives-RCY2HN7G.js → tui-primitives-A6MUW32V.js} +3 -2
- package/dist/{uninstall-FXYMFFRT.js → uninstall-QYVRPEM4.js} +9 -9
- package/dist/{upgrade-D2OZH6IQ.js → upgrade-7PMKM2JH.js} +15 -16
- package/dist/{usage-PIASNUS4.js → usage-6EQV7EQK.js} +70 -67
- package/dist/{verifiers-LTHUY2PX.js → verifiers-JLITWSHU.js} +15 -15
- package/dist/{verify-HYF7KBVE.js → verify-T7NAEVIG.js} +13 -13
- package/dist/{web-fetch-MQN4FH3X.js → web-fetch-W4TNW4Q7.js} +4 -4
- package/dist/{wiki-generate-RK7JQ5NP.js → wiki-generate-T2TJQJUA.js} +81 -76
- package/dist/{with-panes-OFTNAR4Y.js → with-panes-CHFC7HGI.js} +4 -4
- package/dist/worker/entry.js +283 -76
- package/docs/README.md +43 -0
- package/docs/architecture/architecture.md +8 -7
- package/docs/architecture/artifact-versions.md +3 -3
- package/docs/architecture/context-engine.md +35 -1
- package/docs/architecture/library.md +32 -0
- package/docs/architecture/middleware-and-components.md +1 -1
- package/docs/architecture/model-catalog.md +21 -1
- package/docs/architecture/pi-boundary.md +18 -0
- package/docs/architecture/prompt-envelope-and-tools.md +5 -5
- package/docs/architecture/safety-model.md +21 -2
- package/docs/architecture/session-lifecycle.md +12 -1
- package/docs/architecture/tui-design.md +108 -9
- package/docs/architecture/worker-context.md +106 -0
- package/docs/guide/authoring-plugins.md +160 -0
- package/docs/guide/built-in-agents.md +5 -5
- package/docs/guide/commands-and-modes.md +161 -56
- package/docs/guide/configuration-and-targets.md +1 -1
- package/docs/guide/configuration-reference.md +27 -34
- package/docs/guide/environment-variables.md +2 -2
- package/docs/guide/exit-codes-and-output.md +1 -1
- package/docs/guide/extensions-and-sharing.md +93 -53
- package/docs/guide/fleet-dispatch.md +31 -4
- package/docs/guide/glossary.md +1 -1
- package/docs/guide/harness-extensions.md +291 -0
- package/docs/guide/installation-and-lifecycle.md +9 -9
- package/docs/guide/interop.md +243 -0
- package/docs/guide/panes-and-files.md +3 -3
- package/docs/guide/plugins.md +80 -0
- package/docs/guide/resource-library.md +111 -45
- package/docs/guide/skills-marketplace.md +35 -72
- package/docs/guide/tool-usage.md +19 -7
- package/docs/guide/troubleshooting.md +1 -1
- package/docs/process/development-pipeline.md +14 -14
- package/docs/process/documentation-coverage.md +28 -1
- package/docs/process/documentation-guide.md +15 -7
- package/docs/process/eval-runner.md +8 -3
- package/docs/process/performance-methodology.md +1 -1
- package/docs/process/release-cut-checklist.md +4 -0
- package/docs/process/scientific-validation.md +23 -0
- package/evals/scalar-decision-machinery.ts +1 -1
- package/examples/extensions/README.md +67 -0
- package/examples/extensions/lab-status/clio-coder-extension.json +14 -0
- package/examples/extensions/lab-status/extension.mjs +68 -0
- package/examples/extensions/lab-status/jobs.synthetic.json +9 -0
- package/examples/extensions/measurements/clio-coder-extension.json +28 -0
- package/examples/extensions/measurements/summarize.cjs +23 -0
- package/library/README.md +109 -0
- package/library/_authoring/templates/agent/README.md +28 -0
- package/library/_authoring/templates/agent/agents/benchmark-scout.md +30 -0
- package/library/_authoring/templates/agent/plugin.json +23 -0
- package/library/_authoring/templates/fleet/README.md +29 -0
- package/library/_authoring/templates/fleet/fleets/pipeline-review.md +31 -0
- package/library/_authoring/templates/fleet/plugin.json +23 -0
- package/library/_authoring/templates/plugin/README.md +37 -0
- package/library/_authoring/templates/plugin/agents/data-curator.md +31 -0
- package/library/_authoring/templates/plugin/assets/curation-guide.md +22 -0
- package/library/_authoring/templates/plugin/plugin.json +42 -0
- package/library/_authoring/templates/plugin/prompts/inspect-dataset.md +15 -0
- package/library/_authoring/templates/plugin/skills/dataset-curation/SKILL.md +36 -0
- package/library/_authoring/templates/plugin/skills/dataset-curation/evals.md +17 -0
- package/library/_authoring/templates/prompt/README.md +28 -0
- package/library/_authoring/templates/prompt/plugin.json +23 -0
- package/library/_authoring/templates/prompt/prompts/paper-summary.md +26 -0
- package/library/_authoring/templates/skill/README.md +24 -0
- package/library/_authoring/templates/skill/SKILL.md +39 -0
- package/library/_authoring/templates/skill/evals.md +30 -0
- package/library/_authoring/templates/skill/plugin.json +23 -0
- package/library/agents/README.md +7 -0
- package/library/fleets/README.md +7 -0
- package/library/plugins/materio/README.md +137 -0
- package/library/plugins/materio/ai.iowarp.clio/agents/materio-lab-definer.md +208 -0
- package/library/plugins/materio/ai.iowarp.clio/agents/materio-literature-reviewer.md +308 -0
- package/library/plugins/materio/ai.iowarp.clio/agents/materio-research-explorer.md +249 -0
- package/library/plugins/materio/ai.iowarp.clio/agents/materio-task-executor.md +416 -0
- package/library/plugins/materio/ai.iowarp.clio/agents/materio-task-verifier.md +60 -0
- package/library/plugins/materio/ai.iowarp.clio/agents/materio-workflow-planner.md +238 -0
- package/library/plugins/materio/ai.iowarp.clio/fleets/materio-execute-task.md +50 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/add-task.md +66 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/archive-task.md +65 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/checkpoint.md +26 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/define-research-tasks.md +230 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/define-virtual-lab.md +181 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/execute-task.md +292 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/help.md +129 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/identify-research.md +206 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/literature-review.md +201 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/pause-research.md +12 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/progress.md +105 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/remove-task.md +63 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/resume-research.md +64 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/settings.md +16 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/status.md +92 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/upload-data.md +104 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/wtfp.md +145 -0
- package/library/plugins/materio/ai.iowarp.clio/references/execution.md +56 -0
- package/library/plugins/materio/ai.iowarp.portability/provenance.json +9 -0
- package/library/plugins/materio/assets/actions/add-task.md +86 -0
- package/library/plugins/materio/assets/actions/archive-task.md +84 -0
- package/library/plugins/materio/assets/actions/checkpoint.md +47 -0
- package/library/plugins/materio/assets/actions/define-research-tasks.md +228 -0
- package/library/plugins/materio/assets/actions/define-virtual-lab.md +179 -0
- package/library/plugins/materio/assets/actions/execute-task.md +290 -0
- package/library/plugins/materio/assets/actions/help.md +140 -0
- package/library/plugins/materio/assets/actions/identify-research.md +204 -0
- package/library/plugins/materio/assets/actions/literature-review.md +199 -0
- package/library/plugins/materio/assets/actions/pause-research.md +34 -0
- package/library/plugins/materio/assets/actions/progress.md +125 -0
- package/library/plugins/materio/assets/actions/remove-task.md +82 -0
- package/library/plugins/materio/assets/actions/resume-research.md +84 -0
- package/library/plugins/materio/assets/actions/settings.md +38 -0
- package/library/plugins/materio/assets/actions/status.md +112 -0
- package/library/plugins/materio/assets/actions/upload-data.md +123 -0
- package/library/plugins/materio/assets/actions/wtfp.md +179 -0
- package/library/plugins/materio/assets/references/research-domains.md +134 -0
- package/library/plugins/materio/assets/references/research-policy.md +77 -0
- package/library/plugins/materio/assets/references/traditional-workflows.md +146 -0
- package/library/plugins/materio/assets/scripts/check_physics.py +271 -0
- package/library/plugins/materio/assets/scripts/check_scripts.py +248 -0
- package/library/plugins/materio/assets/scripts/project_plugin.py +165 -0
- package/library/plugins/materio/assets/scripts/research_state.py +400 -0
- package/library/plugins/materio/assets/scripts/verify_citations.py +616 -0
- package/library/plugins/materio/assets/templates/RESEARCH.md +39 -0
- package/library/plugins/materio/assets/templates/VIRTUAL-LAB.md +120 -0
- package/library/plugins/materio/assets/templates/WORKFLOW.md +42 -0
- package/library/plugins/materio/assets/templates/config.json +5 -0
- package/library/plugins/materio/evals/scripts.yaml +29 -0
- package/library/plugins/materio/plugin.json +530 -0
- package/library/plugins/materio/skills/materio-lab-definer/SKILL.md +74 -0
- package/library/plugins/materio/skills/materio-literature-reviewer/SKILL.md +64 -0
- package/library/plugins/materio/skills/materio-research-explorer/SKILL.md +74 -0
- package/library/plugins/materio/skills/materio-task-executor/SKILL.md +214 -0
- package/library/plugins/materio/skills/materio-task-verifier/SKILL.md +46 -0
- package/library/plugins/materio/skills/materio-workflow-planner/SKILL.md +79 -0
- package/library/plugins/materio/tests/test_check_physics.py +139 -0
- package/library/plugins/materio/tests/test_check_scripts.py +140 -0
- package/library/plugins/materio/tests/test_research_state.py +291 -0
- package/library/plugins/materio/tests/test_verify_citations.py +337 -0
- package/library/prompts/README.md +7 -0
- package/library/registry.yaml +921 -0
- package/library/skills/README.md +120 -0
- package/{skills → library/skills}/coding/ast-grep/SKILL.md +1 -1
- package/{skills → library/skills}/coding/ast-grep/evals.md +1 -1
- package/library/skills/coding/ast-grep/plugin.json +23 -0
- package/{skills → library/skills}/coding/coding-standards/SKILL.md +1 -1
- package/{skills → library/skills}/coding/coding-standards/evals.md +1 -1
- package/library/skills/coding/coding-standards/plugin.json +23 -0
- package/{skills → library/skills}/coding/prototype/SKILL.md +1 -1
- package/{skills → library/skills}/coding/prototype/evals.md +1 -1
- package/library/skills/coding/prototype/plugin.json +23 -0
- package/{skills → library/skills}/coding/tdd/SKILL.md +1 -1
- package/{skills → library/skills}/coding/tdd/evals.md +1 -1
- package/library/skills/coding/tdd/plugin.json +23 -0
- package/{skills → library/skills}/context/context-handoff/SKILL.md +1 -1
- package/{skills → library/skills}/context/context-handoff/evals.md +1 -1
- package/library/skills/context/context-handoff/plugin.json +23 -0
- package/{skills → library/skills}/context/context-prime/SKILL.md +1 -1
- package/{skills → library/skills}/context/context-prime/evals.md +1 -1
- package/library/skills/context/context-prime/plugin.json +23 -0
- package/{skills → library/skills}/git/branch-closeout/SKILL.md +1 -1
- package/library/skills/git/branch-closeout/plugin.json +23 -0
- package/{skills → library/skills}/git/file-ticket/SKILL.md +1 -1
- package/library/skills/git/file-ticket/plugin.json +23 -0
- package/{skills → library/skills}/git/fix-issue/SKILL.md +1 -1
- package/library/skills/git/fix-issue/plugin.json +23 -0
- package/{skills → library/skills}/git/resolve-merge-conflicts/SKILL.md +1 -1
- package/{skills → library/skills}/git/resolve-merge-conflicts/evals.md +1 -1
- package/library/skills/git/resolve-merge-conflicts/plugin.json +23 -0
- package/{skills → library/skills}/git/ship/SKILL.md +1 -1
- package/library/skills/git/ship/plugin.json +23 -0
- package/{skills → library/skills}/git/worktree-create/SKILL.md +1 -1
- package/library/skills/git/worktree-create/plugin.json +23 -0
- package/{skills → library/skills}/git/worktree-merge/SKILL.md +1 -1
- package/library/skills/git/worktree-merge/plugin.json +23 -0
- package/{skills → library/skills}/meta/clio-coder-dev/SKILL.md +1 -1
- package/{skills → library/skills}/meta/clio-coder-dev/evals.md +1 -1
- package/library/skills/meta/clio-coder-dev/plugin.json +23 -0
- package/{skills → library/skills}/meta/clio-coder-test/SKILL.md +1 -1
- package/{skills → library/skills}/meta/clio-coder-test/evals.md +1 -1
- package/library/skills/meta/clio-coder-test/plugin.json +23 -0
- package/{skills → library/skills}/meta/credentials/SKILL.md +1 -1
- package/{skills → library/skills}/meta/credentials/evals.md +1 -1
- package/library/skills/meta/credentials/plugin.json +23 -0
- package/library/skills/meta/find-skills/SKILL.md +85 -0
- package/library/skills/meta/find-skills/evals.md +65 -0
- package/library/skills/meta/find-skills/plugin.json +23 -0
- package/{skills → library/skills}/meta/herdr/SKILL.md +1 -1
- package/{skills → library/skills}/meta/herdr/evals.md +1 -1
- package/library/skills/meta/herdr/plugin.json +23 -0
- package/{skills → library/skills}/meta/skill-craft/SKILL.md +23 -9
- package/{skills → library/skills}/meta/skill-craft/evals.md +11 -3
- package/library/skills/meta/skill-craft/plugin.json +23 -0
- package/{skills → library/skills}/planning/archify/SKILL.md +13 -13
- package/library/skills/planning/archify/plugin.json +23 -0
- package/{skills → library/skills}/planning/architecture/SKILL.md +1 -1
- package/{skills → library/skills}/planning/architecture/evals.md +1 -1
- package/library/skills/planning/architecture/plugin.json +23 -0
- package/{skills → library/skills}/planning/backlog/SKILL.md +1 -1
- package/{skills → library/skills}/planning/backlog/evals.md +1 -1
- package/library/skills/planning/backlog/plugin.json +23 -0
- package/{skills → library/skills}/planning/prd/SKILL.md +1 -1
- package/{skills → library/skills}/planning/prd/evals.md +1 -1
- package/library/skills/planning/prd/plugin.json +23 -0
- package/{skills → library/skills}/planning/product-intent/SKILL.md +1 -1
- package/{skills → library/skills}/planning/product-intent/evals.md +1 -1
- package/library/skills/planning/product-intent/plugin.json +23 -0
- package/{skills → library/skills}/planning/tech-spec/SKILL.md +1 -1
- package/{skills → library/skills}/planning/tech-spec/evals.md +1 -1
- package/library/skills/planning/tech-spec/plugin.json +23 -0
- package/{skills → library/skills}/registry.yaml +7 -7
- package/{skills → library/skills}/remote.yaml +1 -1
- package/{skills → library/skills}/research/arxiv-literature/SKILL.md +1 -1
- package/{skills → library/skills}/research/arxiv-literature/evals.md +1 -1
- package/library/skills/research/arxiv-literature/plugin.json +23 -0
- package/{skills → library/skills}/research/experiment-protocol/SKILL.md +1 -1
- package/{skills → library/skills}/research/experiment-protocol/evals.md +1 -1
- package/library/skills/research/experiment-protocol/plugin.json +23 -0
- package/{skills → library/skills}/research/scientific-debugging/SKILL.md +1 -1
- package/{skills → library/skills}/research/scientific-debugging/evals.md +1 -1
- package/library/skills/research/scientific-debugging/plugin.json +23 -0
- package/{skills → library/skills}/research/scientific-modernization/SKILL.md +1 -1
- package/{skills → library/skills}/research/scientific-modernization/evals.md +1 -1
- package/library/skills/research/scientific-modernization/plugin.json +23 -0
- package/{skills → library/skills}/skill-marketplace.json +37 -37
- package/{skills → library/skills}/workflow/cut-it/SKILL.md +1 -1
- package/{skills → library/skills}/workflow/cut-it/evals.md +1 -1
- package/library/skills/workflow/cut-it/plugin.json +23 -0
- package/{skills → library/skills}/workflow/design-council/SKILL.md +1 -1
- package/{skills → library/skills}/workflow/design-council/evals.md +1 -1
- package/library/skills/workflow/design-council/plugin.json +23 -0
- package/{skills → library/skills}/workflow/grill-me/SKILL.md +1 -1
- package/{skills → library/skills}/workflow/grill-me/evals.md +1 -1
- package/library/skills/workflow/grill-me/plugin.json +23 -0
- package/{skills → library/skills}/workflow/workflow-distiller/SKILL.md +14 -11
- package/{skills → library/skills}/workflow/workflow-distiller/evals.md +14 -6
- package/library/skills/workflow/workflow-distiller/plugin.json +23 -0
- package/package.json +12 -5
- package/src/cli/agents.ts +1 -1
- package/src/cli/config-inspect.ts +1 -1
- package/src/cli/configure.ts +2 -2
- package/src/cli/eval.ts +40 -6
- package/src/cli/extensions.ts +74 -8
- package/src/cli/fleet-preflight.ts +2 -0
- package/src/cli/fleet.ts +2 -0
- package/src/cli/index.ts +1 -3
- package/src/cli/interop-inspect.ts +61 -33
- package/src/cli/interop.ts +79 -9
- package/src/cli/library-import.ts +139 -0
- package/src/cli/library.ts +418 -120
- package/src/cli/run.ts +26 -9
- package/src/cli/skills-eval.ts +43 -6
- package/src/cli/skills-inventory.ts +6 -2
- package/src/cli/skills.ts +44 -491
- package/src/core/bus-events.ts +5 -0
- package/src/core/defaults.ts +1 -1
- package/src/core/recent-models.ts +2 -2
- package/src/core/session-routing.ts +3 -3
- package/src/core/state-file-lock.ts +1 -1
- package/src/core/tool-names.ts +5 -0
- package/src/domains/agents/extension.ts +42 -6
- package/src/domains/agents/fleet-commands.ts +92 -1
- package/src/domains/agents/fleet-contract.ts +87 -19
- package/src/domains/agents/recipe.ts +5 -4
- package/src/domains/agents/registry.ts +80 -24
- package/src/domains/config/keybindings.ts +155 -95
- package/src/domains/context/worker/contract.ts +91 -0
- package/src/domains/context/worker/pressure.ts +120 -0
- package/src/domains/context/worker/recall.ts +62 -0
- package/src/domains/context/worker/select.ts +164 -0
- package/src/domains/context/worker/snapshot.ts +35 -0
- package/src/domains/context/worker/store.ts +16 -0
- package/src/domains/context/working-set/replay/synthetic.ts +2 -1
- package/src/domains/dispatch/active-route-planner.ts +2 -0
- package/src/domains/dispatch/backoff.ts +1 -0
- package/src/domains/dispatch/code-step.ts +12 -2
- package/src/domains/dispatch/contract.ts +3 -0
- package/src/domains/dispatch/execution-plan.ts +2 -0
- package/src/domains/dispatch/extension.ts +109 -27
- package/src/domains/dispatch/fleet-plan.ts +10 -0
- package/src/domains/dispatch/fleet-run.ts +1 -0
- package/src/domains/dispatch/orphan-recovery.ts +1 -0
- package/src/domains/dispatch/receipt-integrity.ts +4 -0
- package/src/domains/dispatch/state.ts +1 -0
- package/src/domains/dispatch/types.ts +5 -0
- package/src/domains/dispatch/validation.ts +12 -0
- package/src/domains/dispatch/workspace-checkpoint.ts +1 -1
- package/src/domains/evidence/failure-attribution.ts +1 -0
- package/src/domains/evidence/trust-status.ts +22 -3
- package/src/domains/extensions/command-schema.ts +145 -0
- package/src/domains/extensions/command-tools.ts +15 -0
- package/src/domains/extensions/compatibility.ts +7 -0
- package/src/domains/extensions/contract.ts +0 -4
- package/src/domains/extensions/discovery.ts +69 -205
- package/src/domains/extensions/extension.ts +0 -4
- package/src/domains/extensions/index.ts +1 -5
- package/src/domains/extensions/manager.ts +1 -6
- package/src/domains/extensions/operator-commands.ts +29 -0
- package/src/domains/extensions/operator-runtime.ts +483 -0
- package/src/domains/extensions/public-api.ts +53 -0
- package/src/domains/extensions/runtime-child.mjs +114 -0
- package/src/domains/extensions/runtime-process.ts +306 -0
- package/src/domains/extensions/runtime-schema.ts +146 -0
- package/src/domains/extensions/{resources.ts → snapshot-access.ts} +1 -17
- package/src/domains/extensions/snapshot.ts +4 -32
- package/src/domains/extensions/state.ts +5 -83
- package/src/domains/extensions/types.ts +33 -34
- package/src/domains/interop/adopt.ts +546 -0
- package/src/domains/interop/detect.ts +50 -12
- package/src/domains/interop/foreign.ts +554 -0
- package/src/domains/interop/import.ts +277 -0
- package/src/domains/interop/index.ts +24 -0
- package/src/domains/interop/install.ts +6 -0
- package/src/domains/interop/inventory.ts +351 -0
- package/src/domains/interop/projection.ts +360 -0
- package/src/domains/interop/registry.ts +106 -3
- package/src/domains/interop/types.ts +51 -0
- package/src/domains/lifecycle/migrations/index.ts +0 -2
- package/src/domains/lifecycle/naming-resources.ts +1 -1
- package/src/domains/middleware/marketplace-offer.ts +1 -1
- package/src/domains/mux/contract.ts +1 -1
- package/src/domains/plugins/catalog.ts +204 -0
- package/src/domains/plugins/contract.ts +24 -0
- package/src/domains/plugins/discovery.ts +316 -0
- package/src/domains/plugins/extension.ts +40 -0
- package/src/domains/plugins/index.ts +77 -0
- package/src/domains/plugins/integrity.ts +6 -0
- package/src/domains/plugins/manifest.ts +3 -0
- package/src/domains/plugins/resources.ts +102 -0
- package/src/domains/plugins/state.ts +753 -0
- package/src/domains/plugins/types.ts +217 -0
- package/src/domains/prompts/extension.ts +9 -2
- package/src/domains/prompts/fragments/operating/skills.md +10 -10
- package/src/domains/resources/common-loader.ts +9 -6
- package/src/domains/resources/index.ts +67 -0
- package/src/domains/resources/library-actions.ts +836 -0
- package/src/domains/resources/library-evals.ts +38 -0
- package/src/domains/resources/library-inventory.ts +1048 -0
- package/src/domains/resources/library-types.ts +50 -0
- package/src/domains/resources/library-validation.ts +634 -0
- package/src/domains/resources/library.ts +437 -156
- package/src/domains/resources/package-references.ts +66 -0
- package/src/domains/resources/prompts/loader.ts +75 -41
- package/src/domains/resources/skills/install.ts +2 -2
- package/src/domains/resources/skills/loader.ts +77 -22
- package/src/domains/resources/skills/marketplace.ts +48 -57
- package/src/domains/resources/skills/promotion.ts +2 -2
- package/src/domains/resources/skills/provenance-pin.ts +17 -4
- package/src/domains/safety/action-classifier.ts +2 -2
- package/src/domains/safety/default-path-policy.ts +3 -1
- package/src/domains/safety/policy-engine.ts +1 -1
- package/src/domains/safety/protected-artifacts.ts +21 -5
- package/src/domains/safety/skill-authority.ts +5 -2
- package/src/domains/share/archive.ts +1 -1
- package/src/engine/apis/openai-completions.ts +52 -2
- package/src/engine/notices/pi-tui-LICENSE +21 -0
- package/src/engine/tui.ts +3 -0
- package/src/engine/worker-runtime.ts +58 -14
- package/src/engine/worker-tools.ts +5 -0
- package/src/entry/orchestrator.ts +26 -5
- package/src/entry/plugin-reload.ts +18 -0
- package/src/interactive/application-controller.ts +67 -21
- package/src/interactive/chat-loop.ts +32 -5
- package/src/interactive/chat-panel.ts +5 -1
- package/src/interactive/clio-editor.ts +53 -21
- package/src/interactive/command-output.ts +56 -1
- package/src/interactive/editor-submit.ts +65 -28
- package/src/interactive/fleet-run-preview.ts +2 -0
- package/src/interactive/follow-up-queue-panel.ts +3 -3
- package/src/interactive/footer/dashboard.ts +4 -1
- package/src/interactive/footer/notifications.ts +2 -2
- package/src/interactive/footer/widgets.ts +2 -2
- package/src/interactive/interactive-application.ts +209 -21
- package/src/interactive/interactive-input-runtime.ts +254 -7
- package/src/interactive/interactive-presentation.ts +41 -12
- package/src/interactive/interactive-slash-runtime.ts +37 -8
- package/src/interactive/keybinding-manager.ts +156 -79
- package/src/interactive/keyboard-owner.ts +37 -0
- package/src/interactive/leader-key.ts +49 -102
- package/src/interactive/leader-menu.ts +45 -0
- package/src/interactive/overlay-ask-user-lifecycle.ts +9 -1
- package/src/interactive/overlay-frame.ts +15 -0
- package/src/interactive/overlay-key-routing.ts +46 -47
- package/src/interactive/overlay-lifecycle.ts +30 -15
- package/src/interactive/overlay-resource-openers.ts +56 -46
- package/src/interactive/overlays/ask-user.ts +630 -556
- package/src/interactive/overlays/extension-panel.ts +70 -0
- package/src/interactive/overlays/extensions.ts +28 -5
- package/src/interactive/overlays/fleet-run-approval.ts +7 -3
- package/src/interactive/overlays/help-reference.ts +89 -40
- package/src/interactive/overlays/interop.ts +122 -3
- package/src/interactive/overlays/keybinding-detail.ts +2 -2
- package/src/interactive/overlays/library-lifecycle.ts +90 -0
- package/src/interactive/overlays/library-model.ts +574 -0
- package/src/interactive/overlays/library-review.ts +557 -0
- package/src/interactive/overlays/library-tabs.ts +3 -15
- package/src/interactive/overlays/library.ts +602 -0
- package/src/interactive/overlays/list-overlay.ts +218 -39
- package/src/interactive/overlays/model-selector.ts +28 -25
- package/src/interactive/overlays/session-selector.ts +9 -3
- package/src/interactive/overlays/settings.ts +25 -18
- package/src/interactive/overlays/tree-selector.ts +16 -11
- package/src/interactive/permission-hint.ts +13 -0
- package/src/interactive/permission-overlay.ts +77 -28
- package/src/interactive/prompt-source-label.ts +21 -0
- package/src/interactive/renderers/reference-card.ts +35 -0
- package/src/interactive/renderers/worker-entry.ts +35 -3
- package/src/interactive/slash-autocomplete.ts +99 -1
- package/src/interactive/slash-commands.ts +390 -67
- package/src/interactive/slash-spec.ts +0 -1
- package/src/interactive/terminal-lease.ts +44 -12
- package/src/interactive/turn-queues.ts +8 -7
- package/src/interactive/turn-runtime.ts +1 -1
- package/src/interactive/view/view-overlay.ts +19 -14
- package/src/interactive/welcome-dashboard.ts +525 -408
- package/src/tools/bootstrap.ts +8 -0
- package/src/tools/builtin-tool-catalog.ts +7 -2
- package/src/tools/context/index.ts +58 -5
- package/src/tools/context/library.ts +465 -0
- package/src/tools/context/surface.ts +20 -6
- package/src/tools/core-bootstrap.ts +3 -0
- package/src/tools/dispatch-admission.ts +24 -1
- package/src/tools/dispatch-arguments.ts +8 -0
- package/src/tools/dispatch-plan.ts +32 -0
- package/src/tools/dispatch-schema.ts +31 -1
- package/src/tools/dispatch-types.ts +3 -0
- package/src/tools/dispatch.ts +1 -1
- package/src/tools/harness-extensions.ts +169 -0
- package/src/tools/observation.ts +4 -0
- package/src/tools/policy.ts +7 -1
- package/src/tools/registry.ts +19 -1
- package/src/tools/worker-evidence.ts +5 -0
- package/src/worker/context-seed.ts +192 -0
- package/src/worker/entry.ts +1 -0
- package/src/worker/spec-contract.ts +8 -1
- package/dist/chunk-3UW3KU4A.js +0 -21
- package/dist/chunk-536HXRFE.js +0 -1257
- package/dist/chunk-B3MOMLJ4.js +0 -433
- package/dist/chunk-CXQ37WJH.js +0 -45
- package/dist/chunk-KTFSFCVN.js +0 -46
- package/dist/chunk-QCOV5DFY.js +0 -911
- package/dist/chunk-QRFXEO6Y.js +0 -17
- package/dist/chunk-VAHLPXPY.js +0 -399
- package/dist/interop-RVCAYECG.js +0 -115
- package/dist/library-CTKZA7K3.js +0 -226
- package/dist/skills-OXFEAWMT.js +0 -510
- package/skills/README.md +0 -418
- package/skills/meta/find-skills/SKILL.md +0 -78
- package/skills/meta/find-skills/evals.md +0 -47
- package/src/domains/extensions/resource-path.ts +0 -27
- package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +0 -27
- package/src/interactive/overlays/agents.ts +0 -70
- package/src/interactive/overlays/library-install-confirm.ts +0 -152
- package/src/interactive/overlays/prompts.ts +0 -89
- package/src/interactive/overlays/skills-hub.ts +0 -615
- /package/{skills → library/skills}/coding/ast-grep/references/rule_reference.md +0 -0
- /package/{skills → library/skills}/coding/prototype/references/LOGIC.md +0 -0
- /package/{skills → library/skills}/coding/prototype/references/UI.md +0 -0
- /package/{skills → library/skills}/coding/tdd/references/mocking.md +0 -0
- /package/{skills → library/skills}/coding/tdd/references/tests.md +0 -0
- /package/{skills → library/skills}/context/context-handoff/scripts/new-handoff.sh +0 -0
- /package/{skills → library/skills}/git/branch-closeout/evals.md +0 -0
- /package/{skills → library/skills}/git/branch-closeout/references/closeout-checklist.md +0 -0
- /package/{skills → library/skills}/git/file-ticket/assets/issue-template.md +0 -0
- /package/{skills → library/skills}/git/file-ticket/evals.md +0 -0
- /package/{skills → library/skills}/git/file-ticket/references/issue-discovery.md +0 -0
- /package/{skills → library/skills}/git/fix-issue/evals.md +0 -0
- /package/{skills → library/skills}/git/fix-issue/references/diagnosis-and-rca.md +0 -0
- /package/{skills → library/skills}/git/resolve-merge-conflicts/references/conflict-matrix.md +0 -0
- /package/{skills → library/skills}/git/ship/assets/pr-template.md +0 -0
- /package/{skills → library/skills}/git/ship/evals.md +0 -0
- /package/{skills → library/skills}/git/ship/references/remote-and-branch-policy.md +0 -0
- /package/{skills → library/skills}/git/worktree-create/evals.md +0 -0
- /package/{skills → library/skills}/git/worktree-create/references/worktree-setup.md +0 -0
- /package/{skills → library/skills}/git/worktree-merge/evals.md +0 -0
- /package/{skills → library/skills}/git/worktree-merge/references/merge-strategies.md +0 -0
- /package/{skills → library/skills}/meta/clio-coder-test/references/harness.md +0 -0
- /package/{skills → library/skills}/meta/clio-coder-test/references/test-map.md +0 -0
- /package/{skills → library/skills}/planning/archify/evals.md +0 -0
|
@@ -1,30 +1,36 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
3
2
|
import path from "node:path";
|
|
4
|
-
import {
|
|
3
|
+
import { stringify as stringifyYaml } from "yaml";
|
|
5
4
|
import { readSettings, updateSettings } from "../../core/config.js";
|
|
6
5
|
import { runCommandVector, type SafeCommandResult } from "../../core/safe-exec.js";
|
|
7
6
|
import { safeResourceWrite } from "../../core/safe-resource-write.js";
|
|
7
|
+
import { withStateFileLockSync } from "../../core/state-file-lock.js";
|
|
8
8
|
import { clioConfigDir } from "../../core/xdg.js";
|
|
9
|
-
import { parseFrontmatter } from "../agents/frontmatter.js";
|
|
10
9
|
import {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
10
|
+
bundledPluginCatalog,
|
|
11
|
+
fetchPluginSource,
|
|
12
|
+
type PluginCatalogEntry,
|
|
13
|
+
parsePluginGithubSource,
|
|
14
|
+
pluginLocalPath,
|
|
15
|
+
readPluginCatalog,
|
|
16
|
+
} from "../plugins/catalog.js";
|
|
18
17
|
import {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
type
|
|
23
|
-
type
|
|
24
|
-
|
|
25
|
-
|
|
18
|
+
installPlugin,
|
|
19
|
+
listInstalledPlugins,
|
|
20
|
+
type PluginExpectedState,
|
|
21
|
+
type PluginMutationResult,
|
|
22
|
+
type PluginScope,
|
|
23
|
+
pluginBaseDir,
|
|
24
|
+
pluginContentDigest,
|
|
25
|
+
pluginResourcePath,
|
|
26
|
+
readPluginInstallRecord,
|
|
27
|
+
readPluginManifest,
|
|
28
|
+
removePlugin,
|
|
29
|
+
} from "../plugins/index.js";
|
|
30
|
+
import { splitYamlFrontmatter } from "./common-loader.js";
|
|
31
|
+
import type { LibraryPackageEntry, LibraryRequirementRef } from "./library-types.js";
|
|
26
32
|
|
|
27
|
-
export type LibraryEntry =
|
|
33
|
+
export type LibraryEntry = LibraryPackageEntry;
|
|
28
34
|
|
|
29
35
|
export interface LibraryDiscoveryResult {
|
|
30
36
|
entries: LibraryEntry[];
|
|
@@ -32,69 +38,23 @@ export interface LibraryDiscoveryResult {
|
|
|
32
38
|
refusals: Readonly<Record<string, string>>;
|
|
33
39
|
}
|
|
34
40
|
|
|
35
|
-
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
36
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
41
|
function catalogPath(): string {
|
|
40
42
|
const configured = readSettings().integrations.library.catalog;
|
|
41
43
|
return path.resolve(configured ?? path.join(clioConfigDir(), "library.yaml"));
|
|
42
44
|
}
|
|
43
45
|
|
|
44
46
|
function parseCatalog(filePath: string, diagnostics: string[]): LibraryEntry[] {
|
|
45
|
-
|
|
47
|
+
return readPluginCatalog(filePath, diagnostics).map((entry) => ({ ...entry, origin: "index" }));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** Discovery retains damaged copies even when their provenance record cannot be read. */
|
|
51
|
+
function displayInstallRecord(id: string, options: LibraryScopeOptions, diagnostics: string[]) {
|
|
46
52
|
try {
|
|
47
|
-
|
|
48
|
-
const parsed = filePath.endsWith(".json") ? JSON.parse(raw) : parseYaml(raw);
|
|
49
|
-
const rows = Array.isArray(parsed) ? parsed : isRecord(parsed) && Array.isArray(parsed.skills) ? parsed.skills : [];
|
|
50
|
-
return rows.flatMap((value): LibraryEntry[] => {
|
|
51
|
-
if (
|
|
52
|
-
!isRecord(value) ||
|
|
53
|
-
typeof value.name !== "string" ||
|
|
54
|
-
typeof value.description !== "string" ||
|
|
55
|
-
typeof value.sourceUrl !== "string"
|
|
56
|
-
) {
|
|
57
|
-
diagnostics.push(`library catalog entry malformed: ${filePath}`);
|
|
58
|
-
return [];
|
|
59
|
-
}
|
|
60
|
-
const kind: LibraryEntryKind =
|
|
61
|
-
value.kind === undefined || value.kind === "skill"
|
|
62
|
-
? "skill"
|
|
63
|
-
: value.kind === "agent" || value.kind === "prompt" || value.kind === "fleet"
|
|
64
|
-
? value.kind
|
|
65
|
-
: "skill";
|
|
66
|
-
if (value.kind !== undefined && !["skill", "agent", "prompt", "fleet"].includes(String(value.kind))) {
|
|
67
|
-
diagnostics.push(`library catalog entry has unsupported kind: ${value.name}`);
|
|
68
|
-
return [];
|
|
69
|
-
}
|
|
70
|
-
if (
|
|
71
|
-
value.requires !== undefined &&
|
|
72
|
-
(!Array.isArray(value.requires) || value.requires.some((item) => typeof item !== "string"))
|
|
73
|
-
) {
|
|
74
|
-
diagnostics.push(`library_requirement_malformed: ${value.name}`);
|
|
75
|
-
return [];
|
|
76
|
-
}
|
|
77
|
-
const sourceUrl = /^(?:https?:\/\/|git@)/.test(value.sourceUrl)
|
|
78
|
-
? value.sourceUrl
|
|
79
|
-
: path.resolve(path.dirname(filePath), value.sourceUrl);
|
|
80
|
-
const requires = Array.isArray(value.requires)
|
|
81
|
-
? value.requires.filter((item): item is LibraryRequirementRef => typeof item === "string")
|
|
82
|
-
: undefined;
|
|
83
|
-
return [
|
|
84
|
-
{
|
|
85
|
-
kind,
|
|
86
|
-
name: value.name.trim(),
|
|
87
|
-
description: value.description.trim(),
|
|
88
|
-
sourceUrl,
|
|
89
|
-
origin: "index",
|
|
90
|
-
...(typeof value.version === "string" ? { version: value.version } : {}),
|
|
91
|
-
...(requires ? { requires } : {}),
|
|
92
|
-
},
|
|
93
|
-
];
|
|
94
|
-
});
|
|
53
|
+
return readPluginInstallRecord(id, options);
|
|
95
54
|
} catch (error) {
|
|
96
|
-
|
|
97
|
-
|
|
55
|
+
const message = `package state unavailable (${options.scope}:${id}): ${error instanceof Error ? error.message : String(error)}`;
|
|
56
|
+
if (!diagnostics.includes(message)) diagnostics.push(message);
|
|
57
|
+
return undefined;
|
|
98
58
|
}
|
|
99
59
|
}
|
|
100
60
|
|
|
@@ -102,31 +62,48 @@ export function libraryEntryRef(entry: Pick<LibraryEntry, "kind" | "name">): Lib
|
|
|
102
62
|
return `${entry.kind}:${entry.name}`;
|
|
103
63
|
}
|
|
104
64
|
|
|
105
|
-
export function discoverLibrary(
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
const marketplace = discoverMarketplaceSkills({
|
|
109
|
-
...(options.marketplace ?? {}),
|
|
110
|
-
...(options.cwd ? { cwd: options.cwd } : {}),
|
|
111
|
-
});
|
|
112
|
-
const diagnostics = [...marketplace.diagnostics.filter((item) => !item.includes("no local skill marketplace"))];
|
|
65
|
+
export function discoverLibrary(options: { catalog?: string; cwd?: string } = {}): LibraryDiscoveryResult {
|
|
66
|
+
const diagnostics: string[] = [];
|
|
67
|
+
const bundledPlugins = bundledPluginCatalog(diagnostics);
|
|
113
68
|
const privatePath = catalogPath();
|
|
114
69
|
const primary = options.catalog ? parseCatalog(path.resolve(options.catalog), diagnostics) : [];
|
|
115
70
|
const privateEntries = parseCatalog(privatePath, diagnostics);
|
|
116
71
|
const byRef = new Map<string, LibraryEntry>();
|
|
117
|
-
for (const entry of [
|
|
72
|
+
for (const entry of [
|
|
73
|
+
...bundledPlugins,
|
|
74
|
+
...privateEntries,
|
|
75
|
+
...parseCatalog(path.join(options.cwd ?? process.cwd(), ".clio-coder", "library.yaml"), diagnostics),
|
|
76
|
+
...primary,
|
|
77
|
+
])
|
|
78
|
+
byRef.set(libraryEntryRef(entry), entry);
|
|
79
|
+
for (const plugin of listInstalledPlugins(options.cwd ?? process.cwd(), { all: true })) {
|
|
80
|
+
const ref = `${plugin.kind ?? "plugin"}:${plugin.id}`;
|
|
81
|
+
if (byRef.has(ref)) continue;
|
|
82
|
+
const record = displayInstallRecord(
|
|
83
|
+
plugin.id,
|
|
84
|
+
{ ...(options.cwd ? { cwd: options.cwd } : {}), scope: plugin.scope },
|
|
85
|
+
diagnostics,
|
|
86
|
+
);
|
|
87
|
+
byRef.set(ref, {
|
|
88
|
+
kind: plugin.kind ?? "plugin",
|
|
89
|
+
name: plugin.id,
|
|
90
|
+
version: plugin.version,
|
|
91
|
+
description: plugin.description,
|
|
92
|
+
sourceUrl: record?.source ?? plugin.rootPath,
|
|
93
|
+
origin: "installed",
|
|
94
|
+
});
|
|
95
|
+
}
|
|
118
96
|
const refusals: Record<string, string> = {};
|
|
119
|
-
const entries = [...byRef.values()]
|
|
97
|
+
const entries = [...byRef.values()];
|
|
98
|
+
for (const entry of entries) {
|
|
120
99
|
try {
|
|
121
100
|
resolveLibraryRequirements(entry, [...byRef.values()]);
|
|
122
|
-
return true;
|
|
123
101
|
} catch (error) {
|
|
124
102
|
const message = error instanceof Error ? error.message : String(error);
|
|
125
103
|
refusals[libraryEntryRef(entry)] = message;
|
|
126
104
|
if (!diagnostics.includes(message)) diagnostics.push(message);
|
|
127
|
-
return false;
|
|
128
105
|
}
|
|
129
|
-
}
|
|
106
|
+
}
|
|
130
107
|
return {
|
|
131
108
|
entries: entries.sort((a, b) => libraryEntryRef(a).localeCompare(libraryEntryRef(b))),
|
|
132
109
|
diagnostics,
|
|
@@ -134,7 +111,7 @@ export function discoverLibrary(
|
|
|
134
111
|
};
|
|
135
112
|
}
|
|
136
113
|
|
|
137
|
-
const REQUIREMENT_PATTERN = /^(skill|agent|prompt|fleet):([A-Za-z0-9][A-Za-z0-9._-]*)$/;
|
|
114
|
+
const REQUIREMENT_PATTERN = /^(skill|agent|prompt|fleet|plugin):([A-Za-z0-9][A-Za-z0-9._-]*)$/;
|
|
138
115
|
|
|
139
116
|
export function resolveLibraryRequirements(entry: LibraryEntry, catalog: ReadonlyArray<LibraryEntry>): LibraryEntry[] {
|
|
140
117
|
const byRef = new Map(catalog.map((item) => [libraryEntryRef(item), item]));
|
|
@@ -162,64 +139,170 @@ export function resolveLibraryRequirements(entry: LibraryEntry, catalog: Readonl
|
|
|
162
139
|
return ordered;
|
|
163
140
|
}
|
|
164
141
|
|
|
165
|
-
function sourceFile(entry: LibraryEntry): string {
|
|
166
|
-
const source = path.resolve(entry.sourceUrl);
|
|
167
|
-
if (entry.kind === "skill") return source;
|
|
168
|
-
if (!existsSync(source)) throw new Error(`library source path does not exist: ${source}`);
|
|
169
|
-
return source;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
function validateEntry(entry: LibraryEntry, raw: string, filePath: string): void {
|
|
173
|
-
if (entry.kind === "fleet") {
|
|
174
|
-
parseFleetContract(raw, filePath);
|
|
175
|
-
return;
|
|
176
|
-
}
|
|
177
|
-
if (entry.kind === "agent") {
|
|
178
|
-
const parsed = parseFrontmatter(raw, filePath);
|
|
179
|
-
const recipe = parseAgentRecipeSchema({ id: entry.name, source: "user", filepath: filePath, ...parsed });
|
|
180
|
-
assertAgentSpecPolicy(normalizeAgentSpec(recipe));
|
|
181
|
-
return;
|
|
182
|
-
}
|
|
183
|
-
if (entry.kind === "prompt") {
|
|
184
|
-
const loaded = loadPromptTemplates({ roots: [{ path: path.dirname(filePath), scope: "user", source: "library" }] });
|
|
185
|
-
if (!loaded.items.some((item) => item.filePath === filePath))
|
|
186
|
-
throw new Error(`prompt template is malformed: ${filePath}`);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
|
|
190
142
|
export interface LibraryInstallPlan {
|
|
191
143
|
entry: LibraryEntry;
|
|
192
144
|
path: string;
|
|
193
145
|
sha256: string;
|
|
146
|
+
/** Plugin source retained until acceptance; release a cancelled plan. */
|
|
147
|
+
sourceRoot?: string;
|
|
148
|
+
cleanup?: () => void;
|
|
149
|
+
cwd?: string;
|
|
150
|
+
scope?: PluginScope;
|
|
151
|
+
force?: boolean;
|
|
152
|
+
expectedInstalledDigest?: string;
|
|
153
|
+
/** Reviewed facts rechecked inside the writer's lock. */
|
|
154
|
+
expect?: PluginExpectedState;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export interface LibraryScopeOptions {
|
|
158
|
+
cwd?: string;
|
|
159
|
+
scope?: PluginScope;
|
|
194
160
|
}
|
|
195
161
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
162
|
+
/** Installed state remains addressable after its index entry is removed. */
|
|
163
|
+
export function resolveInstalledLibraryEntry(
|
|
164
|
+
ref: string,
|
|
165
|
+
options: LibraryScopeOptions = {},
|
|
166
|
+
): LibraryEntry & { scope: PluginScope } {
|
|
167
|
+
const copies = listInstalledPlugins(options.cwd ?? process.cwd(), { ...options, all: true })
|
|
168
|
+
.filter((item) => (ref.includes(":") ? `${item.kind ?? "plugin"}:${item.id}` === ref : item.id === ref))
|
|
169
|
+
.sort((a, b) => Number(b.scope === "project") - Number(a.scope === "project"));
|
|
170
|
+
const item = copies[0];
|
|
171
|
+
if (!item) throw new Error(`package not installed: ${ref}`);
|
|
172
|
+
const saved = readPluginInstallRecord(item.id, { ...options, scope: item.scope });
|
|
173
|
+
return {
|
|
174
|
+
scope: item.scope,
|
|
175
|
+
kind: item.kind ?? "plugin",
|
|
176
|
+
name: item.id,
|
|
177
|
+
description: item.description,
|
|
178
|
+
version: item.version,
|
|
179
|
+
sourceUrl: saved?.source ?? item.rootPath,
|
|
180
|
+
origin: "installed",
|
|
181
|
+
...(item.manifest?.clio.requires ? { requires: item.manifest.clio.requires } : {}),
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/** Register verified bytes in one scoped index without installing or enabling them. */
|
|
186
|
+
export function registerLibraryPackage(
|
|
187
|
+
source: string,
|
|
188
|
+
options: LibraryScopeOptions & { force?: boolean } = {},
|
|
189
|
+
): LibraryEntry {
|
|
190
|
+
const local = pluginLocalPath(source, options.cwd);
|
|
191
|
+
const candidate = readPluginManifest(local);
|
|
192
|
+
if (!candidate.valid || !candidate.manifest || !candidate.contentDigest)
|
|
193
|
+
throw new Error(candidate.diagnostics.map((item) => item.message).join("; "));
|
|
194
|
+
const manifest = candidate.manifest;
|
|
195
|
+
const entry: LibraryEntry = {
|
|
196
|
+
kind: manifest.clio.kind ?? "plugin",
|
|
197
|
+
name: manifest.name,
|
|
198
|
+
description: manifest.description ?? "",
|
|
199
|
+
...(manifest.version ? { version: manifest.version } : {}),
|
|
200
|
+
sha256: candidate.contentDigest,
|
|
201
|
+
sourceUrl: local,
|
|
202
|
+
origin: "index",
|
|
203
|
+
...(manifest.clio.requires ? { requires: manifest.clio.requires } : {}),
|
|
204
|
+
};
|
|
205
|
+
const file =
|
|
206
|
+
options.scope === "project" ? path.join(options.cwd ?? process.cwd(), ".clio-coder", "library.yaml") : catalogPath();
|
|
207
|
+
withStateFileLockSync(file, () => {
|
|
208
|
+
const diagnostics: string[] = [];
|
|
209
|
+
const before = existsSync(file) ? readFileSync(file, "utf8") : undefined;
|
|
210
|
+
const entries = readPluginCatalog(file, diagnostics);
|
|
211
|
+
if (diagnostics.length) throw new Error(diagnostics.join("; "));
|
|
212
|
+
const previous = entries.find((item) => item.name === entry.name);
|
|
213
|
+
if (previous && !options.force)
|
|
214
|
+
throw new Error(`package already registered: ${entry.name}; use --force to replace its pin`);
|
|
215
|
+
const next = [...entries.filter((item) => item.name !== entry.name), entry].sort((a, b) =>
|
|
216
|
+
a.name.localeCompare(b.name),
|
|
217
|
+
);
|
|
218
|
+
if ((existsSync(file) ? readFileSync(file, "utf8") : undefined) !== before)
|
|
219
|
+
throw new Error("library index changed during registration");
|
|
220
|
+
safeResourceWrite(file, stringifyYaml({ entries: next.map(({ origin: _origin, index: _index, ...item }) => item) }), {
|
|
221
|
+
encoding: "utf8",
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
return entry;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/** One workspace view includes available packages and every installed scope. */
|
|
228
|
+
export function libraryWorkspace(options: LibraryScopeOptions & { catalog?: string } = {}) {
|
|
229
|
+
const discovery = discoverLibrary(options);
|
|
230
|
+
const installed = listInstalledPlugins(options.cwd ?? process.cwd(), { ...options, all: true });
|
|
231
|
+
return {
|
|
232
|
+
...discovery,
|
|
233
|
+
entries: discovery.entries.map((entry) => ({
|
|
234
|
+
...entry,
|
|
235
|
+
installed: installed
|
|
236
|
+
.filter((item) => item.id === entry.name && (item.kind ?? "plugin") === entry.kind)
|
|
237
|
+
.map((item) => ({
|
|
238
|
+
...item,
|
|
239
|
+
origin: displayInstallRecord(item.id, { ...options, scope: item.scope }, discovery.diagnostics)?.origin,
|
|
240
|
+
})),
|
|
241
|
+
})),
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/** Resolve the authored invocation identity; package names do not rewrite resource IDs. */
|
|
246
|
+
export function libraryRuntimeName(
|
|
247
|
+
entry: Pick<LibraryEntry, "kind" | "name">,
|
|
248
|
+
options: LibraryScopeOptions = {},
|
|
249
|
+
): string | undefined {
|
|
250
|
+
const installed = installedPlugin(entry, options);
|
|
251
|
+
if (!installed?.loadable || entry.kind === "plugin") return undefined;
|
|
252
|
+
const manifest = installed.manifest;
|
|
253
|
+
const component = manifest?.clio.components.find((item) => item.kind === entry.kind);
|
|
254
|
+
if (!manifest || !component) return undefined;
|
|
255
|
+
const file = pluginResourcePath(installed.rootPath, component.path);
|
|
256
|
+
if (entry.kind === "agent") return path.basename(file, ".md");
|
|
257
|
+
if (entry.kind === "prompt")
|
|
258
|
+
return path
|
|
259
|
+
.relative(pluginResourcePath(installed.rootPath, manifest.clio.resources.prompts as string), file)
|
|
260
|
+
.replace(/\.md$/, "")
|
|
261
|
+
.split(path.sep)
|
|
262
|
+
.join(":");
|
|
263
|
+
const parsed = splitYamlFrontmatter(readFileSync(file, "utf8"));
|
|
264
|
+
if (!parsed.ok) return undefined;
|
|
265
|
+
const metadata = parsed.frontmatter;
|
|
266
|
+
return typeof metadata.name === "string" ? metadata.name : undefined;
|
|
200
267
|
}
|
|
201
268
|
|
|
202
|
-
function
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
269
|
+
function installedPlugin(entry: Pick<LibraryEntry, "kind" | "name">, options: LibraryScopeOptions = {}) {
|
|
270
|
+
return listInstalledPlugins(options.cwd ?? process.cwd(), {
|
|
271
|
+
all: true,
|
|
272
|
+
...(options.scope ? { scope: options.scope } : {}),
|
|
273
|
+
})
|
|
274
|
+
.filter((plugin) => plugin.id === entry.name && (plugin.kind ?? "plugin") === entry.kind)
|
|
275
|
+
.sort((left, right) => Number(right.scope === "project") - Number(left.scope === "project"))[0];
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
export function libraryInstallPath(
|
|
279
|
+
entry: Pick<LibraryEntry, "kind" | "name">,
|
|
280
|
+
options: LibraryScopeOptions = {},
|
|
281
|
+
): string {
|
|
282
|
+
if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(entry.name)) throw new Error(`invalid library entry name: ${entry.name}`);
|
|
283
|
+
return (
|
|
284
|
+
installedPlugin(entry, options)?.rootPath ??
|
|
285
|
+
path.join(pluginBaseDir(options.scope ?? "user", options.cwd ?? process.cwd()), entry.name)
|
|
286
|
+
);
|
|
207
287
|
}
|
|
208
288
|
|
|
209
289
|
export interface LibraryRequirementStatus {
|
|
210
290
|
ordered: LibraryEntry[];
|
|
211
291
|
satisfied: LibraryEntry[];
|
|
212
292
|
unsatisfied: LibraryEntry[];
|
|
293
|
+
/** Installed dependencies requiring explicit enable or repair before use. */
|
|
294
|
+
inactive?: LibraryEntry[];
|
|
213
295
|
}
|
|
214
296
|
|
|
215
297
|
/**
|
|
216
|
-
* Whether this entry
|
|
217
|
-
*
|
|
218
|
-
* the requirement classifier applies, so a surface that draws an installed or
|
|
219
|
-
* available column never disagrees with the gate that refuses an install.
|
|
298
|
+
* Whether this entry has an installed copy, including disabled or damaged copies.
|
|
299
|
+
* Requirement checks separately require a verified, loadable copy.
|
|
220
300
|
*/
|
|
221
|
-
export function libraryEntryInstalled(
|
|
222
|
-
|
|
301
|
+
export function libraryEntryInstalled(
|
|
302
|
+
entry: Pick<LibraryEntry, "kind" | "name">,
|
|
303
|
+
options: LibraryScopeOptions = {},
|
|
304
|
+
): boolean {
|
|
305
|
+
return installedPlugin(entry, options) !== undefined;
|
|
223
306
|
}
|
|
224
307
|
|
|
225
308
|
/**
|
|
@@ -229,57 +312,255 @@ export function libraryEntryInstalled(entry: Pick<LibraryEntry, "kind" | "name">
|
|
|
229
312
|
*/
|
|
230
313
|
export function libraryEntryPin(
|
|
231
314
|
entry: Pick<LibraryEntry, "kind" | "name">,
|
|
315
|
+
options: LibraryScopeOptions = {},
|
|
232
316
|
): { sha256: string; sourceUrl: string } | undefined {
|
|
233
|
-
|
|
317
|
+
const plugin = installedPlugin(entry, options);
|
|
318
|
+
if (!plugin) return undefined;
|
|
319
|
+
const record = displayInstallRecord(entry.name, { ...options, scope: plugin.scope }, []);
|
|
320
|
+
return record ? { sha256: record.contentDigest, sourceUrl: record.source } : undefined;
|
|
234
321
|
}
|
|
235
322
|
|
|
236
323
|
export function classifyLibraryRequirements(
|
|
237
324
|
entry: LibraryEntry,
|
|
238
325
|
catalog: ReadonlyArray<LibraryEntry>,
|
|
326
|
+
options: LibraryScopeOptions = {},
|
|
239
327
|
): LibraryRequirementStatus {
|
|
240
328
|
const ordered = resolveLibraryRequirements(entry, catalog).slice(0, -1);
|
|
241
|
-
const
|
|
329
|
+
const inactive = ordered.filter(
|
|
330
|
+
(requirement) =>
|
|
331
|
+
libraryEntryInstalled(requirement, options) &&
|
|
332
|
+
!listInstalledPlugins(options.cwd ?? process.cwd(), options).some(
|
|
333
|
+
(plugin) => plugin.id === requirement.name && (plugin.kind ?? "plugin") === requirement.kind && plugin.loadable,
|
|
334
|
+
),
|
|
335
|
+
);
|
|
336
|
+
const inactiveRefs = new Set(inactive.map(libraryEntryRef));
|
|
337
|
+
const satisfied = ordered.filter(
|
|
338
|
+
(requirement) => libraryEntryInstalled(requirement, options) && !inactiveRefs.has(libraryEntryRef(requirement)),
|
|
339
|
+
);
|
|
242
340
|
const satisfiedRefs = new Set(satisfied.map(libraryEntryRef));
|
|
243
341
|
return {
|
|
244
342
|
ordered,
|
|
245
343
|
satisfied,
|
|
344
|
+
...(inactive.length ? { inactive } : {}),
|
|
246
345
|
unsatisfied: ordered.filter((requirement) => !satisfiedRefs.has(libraryEntryRef(requirement))),
|
|
247
346
|
};
|
|
248
347
|
}
|
|
249
348
|
|
|
250
|
-
export function planLibraryInstall(
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
349
|
+
export function planLibraryInstall(
|
|
350
|
+
entry: LibraryEntry,
|
|
351
|
+
options: { cwd?: string; scope?: PluginScope; force?: boolean } = {},
|
|
352
|
+
): LibraryInstallPlan {
|
|
353
|
+
const fetched = fetchPluginSource(entry.sourceUrl, options.cwd);
|
|
354
|
+
try {
|
|
355
|
+
const candidate = readPluginManifest(fetched.root);
|
|
356
|
+
if (!candidate.valid || !candidate.manifest)
|
|
357
|
+
throw new Error(`invalid plugin: ${candidate.diagnostics.map((item) => item.message).join("; ")}`);
|
|
358
|
+
if ((candidate.manifest.clio.kind ?? "plugin") !== entry.kind)
|
|
359
|
+
throw new Error(`package kind mismatch: expected ${entry.kind}`);
|
|
360
|
+
if (candidate.manifest.name !== entry.name)
|
|
361
|
+
throw new Error(`plugin identity mismatch: expected ${entry.name}, found ${candidate.manifest.name}`);
|
|
362
|
+
if (entry.version && candidate.manifest.version !== entry.version)
|
|
363
|
+
throw new Error(`plugin version mismatch: expected ${entry.version}, found ${candidate.manifest.version}`);
|
|
364
|
+
const declaredRequirements = candidate.manifest.clio.requires ?? [];
|
|
365
|
+
if (JSON.stringify([...declaredRequirements].sort()) !== JSON.stringify([...(entry.requires ?? [])].sort()))
|
|
366
|
+
throw new Error(
|
|
367
|
+
`library_requirement_mismatch: ${entry.name}; index and manifest must declare the same requirements`,
|
|
368
|
+
);
|
|
369
|
+
const sha256 = pluginContentDigest(fetched.root);
|
|
370
|
+
if (entry.sha256 && sha256 !== entry.sha256) throw new Error(`plugin_pin_mismatch: ${entry.name}`);
|
|
255
371
|
return {
|
|
256
|
-
entry,
|
|
257
|
-
path:
|
|
258
|
-
sha256
|
|
372
|
+
entry: { ...entry, ...(candidate.manifest.version ? { version: candidate.manifest.version } : {}) },
|
|
373
|
+
path: path.join(pluginBaseDir(options.scope ?? "user", options.cwd ?? process.cwd()), entry.name),
|
|
374
|
+
sha256,
|
|
375
|
+
sourceRoot: fetched.root,
|
|
376
|
+
cleanup: fetched.cleanup,
|
|
377
|
+
...options,
|
|
259
378
|
};
|
|
379
|
+
} catch (error) {
|
|
380
|
+
fetched.cleanup();
|
|
381
|
+
throw error;
|
|
260
382
|
}
|
|
261
|
-
const source = sourceFile(entry);
|
|
262
|
-
const raw = readFileSync(source, "utf8");
|
|
263
|
-
validateEntry(entry, raw, source);
|
|
264
|
-
return {
|
|
265
|
-
entry,
|
|
266
|
-
path: libraryInstallPath(entry),
|
|
267
|
-
sha256: createHash("sha256").update(raw).digest("hex"),
|
|
268
|
-
};
|
|
269
383
|
}
|
|
270
384
|
|
|
271
|
-
function
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
385
|
+
export function releaseLibraryPlan(plan: LibraryInstallPlan): void {
|
|
386
|
+
plan.cleanup?.();
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
/** All surfaces commit the reviewed digest, including every bundle asset. */
|
|
390
|
+
export interface LibraryInstallResult {
|
|
391
|
+
recovery?: { stateBackup?: string; packageBackup?: string };
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
/**
|
|
395
|
+
* Commit a staged plan through the package writer without releasing it. The
|
|
396
|
+
* destination digest reviewed before the lock is also rechecked inside it when
|
|
397
|
+
* the plan carries `expect`. Returns the writer's structured result.
|
|
398
|
+
*/
|
|
399
|
+
export function commitLibraryInstallPlan(plan: LibraryInstallPlan): PluginMutationResult {
|
|
400
|
+
if (existsSync(plan.path) && !plan.force) throw new Error(`library destination already exists: ${plan.path}`);
|
|
401
|
+
if (!plan.sourceRoot) throw new Error("plugin install plan has no staged source");
|
|
402
|
+
if (plan.expectedInstalledDigest && pluginContentDigest(plan.path) !== plan.expectedInstalledDigest)
|
|
403
|
+
throw new Error(`plugin_destination_changed: ${plan.entry.name}`);
|
|
404
|
+
const expect: PluginExpectedState | undefined =
|
|
405
|
+
plan.expect ??
|
|
406
|
+
(plan.expectedInstalledDigest
|
|
407
|
+
? {
|
|
408
|
+
copies: [
|
|
409
|
+
{
|
|
410
|
+
scope: plan.scope ?? "user",
|
|
411
|
+
id: plan.entry.name,
|
|
412
|
+
partial: true,
|
|
413
|
+
recorded: true,
|
|
414
|
+
tree: plan.expectedInstalledDigest,
|
|
415
|
+
},
|
|
416
|
+
],
|
|
417
|
+
}
|
|
418
|
+
: undefined);
|
|
419
|
+
return installPlugin(plan.sourceRoot, {
|
|
420
|
+
...(plan.cwd ? { cwd: plan.cwd } : {}),
|
|
421
|
+
scope: plan.scope ?? "user",
|
|
422
|
+
force: plan.force ?? false,
|
|
423
|
+
expectedDigest: plan.sha256,
|
|
424
|
+
expectedId: plan.entry.name,
|
|
425
|
+
expectedKind: plan.entry.kind,
|
|
426
|
+
...(plan.entry.version ? { expectedVersion: plan.entry.version } : {}),
|
|
427
|
+
...(expect ? { expect } : {}),
|
|
428
|
+
origin: {
|
|
429
|
+
kind:
|
|
430
|
+
plan.entry.origin === "catalog" || plan.entry.origin === "index"
|
|
431
|
+
? "catalog"
|
|
432
|
+
: parsePluginGithubSource(plan.entry.sourceUrl)
|
|
433
|
+
? "github"
|
|
434
|
+
: "local",
|
|
435
|
+
source: plan.entry.sourceUrl,
|
|
436
|
+
},
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
export function installLibraryPlan(plan: LibraryInstallPlan): LibraryInstallResult {
|
|
441
|
+
let recovery: LibraryInstallResult["recovery"];
|
|
442
|
+
try {
|
|
443
|
+
const result = commitLibraryInstallPlan(plan);
|
|
444
|
+
if (!result.plugin || result.diagnostics.some((item) => item.type === "error"))
|
|
445
|
+
throw new Error(
|
|
446
|
+
`${result.diagnostics.map((item) => item.message).join("; ") || "plugin install failed"}${result.recovery ? `; recovery: ${JSON.stringify(result.recovery)}` : ""}`,
|
|
447
|
+
);
|
|
448
|
+
recovery = result.recovery;
|
|
449
|
+
return recovery ? { recovery } : {};
|
|
450
|
+
} finally {
|
|
451
|
+
releaseLibraryPlan(plan);
|
|
452
|
+
}
|
|
276
453
|
}
|
|
277
454
|
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
455
|
+
/** Existing paths beat catalog IDs, including a directory named like a curated plugin. */
|
|
456
|
+
export function resolveLibraryPackage(
|
|
457
|
+
source: string,
|
|
458
|
+
options: { cwd?: string; catalog?: string } = {},
|
|
459
|
+
): PluginCatalogEntry {
|
|
460
|
+
const local = pluginLocalPath(source, options.cwd);
|
|
461
|
+
if (existsSync(local)) {
|
|
462
|
+
const candidate = readPluginManifest(local);
|
|
463
|
+
if (!candidate.valid || !candidate.manifest)
|
|
464
|
+
throw new Error(`invalid plugin: ${candidate.diagnostics.map((item) => item.message).join("; ")}`);
|
|
465
|
+
return {
|
|
466
|
+
kind: candidate.manifest.clio.kind ?? "plugin",
|
|
467
|
+
name: candidate.manifest.name,
|
|
468
|
+
...(candidate.manifest.clio.requires ? { requires: candidate.manifest.clio.requires } : {}),
|
|
469
|
+
description: candidate.manifest.description ?? "",
|
|
470
|
+
...(candidate.manifest.version ? { version: candidate.manifest.version } : {}),
|
|
471
|
+
sourceUrl: local,
|
|
472
|
+
origin: "installed",
|
|
473
|
+
};
|
|
474
|
+
}
|
|
475
|
+
const matches = discoverLibrary(options).entries.filter((item) =>
|
|
476
|
+
source.includes(":") ? libraryEntryRef(item) === source : item.name === source,
|
|
477
|
+
);
|
|
478
|
+
if (matches.length > 1) throw new Error(`ambiguous package: ${source}; use kind:name`);
|
|
479
|
+
const entry = matches[0];
|
|
480
|
+
if (entry) return entry;
|
|
481
|
+
if (parsePluginGithubSource(source))
|
|
482
|
+
throw new Error("remote plugin installation requires a catalog entry with version and full-tree sha256 pin");
|
|
483
|
+
throw new Error(`plugin source is neither an existing local directory nor a catalog entry: ${source}`);
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
export function planLibraryUpdate(
|
|
487
|
+
id: string,
|
|
488
|
+
options: { cwd?: string; scope?: PluginScope; force?: boolean; catalog?: string } = {},
|
|
489
|
+
): LibraryInstallPlan {
|
|
490
|
+
const identity = resolveInstalledLibraryEntry(id, options);
|
|
491
|
+
const plugin = installedPlugin(identity, options);
|
|
492
|
+
if (!plugin) throw new Error(`plugin not installed: ${id}`);
|
|
493
|
+
const pin = libraryEntryPin(identity, { ...options, scope: plugin.scope });
|
|
494
|
+
if (!options.force && pin && pluginContentDigest(plugin.rootPath) !== pin.sha256)
|
|
495
|
+
throw new Error(`plugin_local_changes: ${id}; use --force to replace local changes`);
|
|
496
|
+
const record = readPluginInstallRecord(identity.name, { ...options, scope: plugin.scope });
|
|
497
|
+
if (typeof record?.origin === "object" && record.origin.kind === "interop")
|
|
498
|
+
throw new Error("interop packages require a new reviewed adoption; remove the installed copy and adopt it again");
|
|
499
|
+
const catalogOrigin = record?.origin && typeof record.origin === "object" && record.origin.kind === "catalog";
|
|
500
|
+
const discovery = discoverLibrary(options);
|
|
501
|
+
const catalog = catalogOrigin
|
|
502
|
+
? discovery.entries.find(
|
|
503
|
+
(entry) => entry.kind === identity.kind && entry.name === identity.name && entry.origin !== "installed",
|
|
504
|
+
)
|
|
505
|
+
: undefined;
|
|
506
|
+
if (catalogOrigin && !catalog)
|
|
507
|
+
throw new Error(
|
|
508
|
+
`plugin catalog source unavailable: ${id}; restore its pinned catalog entry or explicitly install a new source`,
|
|
509
|
+
);
|
|
510
|
+
const entry = catalog ?? (pin ? resolveLibraryPackage(pin.sourceUrl, options) : undefined);
|
|
511
|
+
if (!entry) throw new Error(`plugin has no update source: ${id}`);
|
|
512
|
+
if (entry.name !== identity.name || entry.kind !== identity.kind)
|
|
513
|
+
throw new Error(`package identity mismatch: expected ${id}, found ${libraryEntryRef(entry)}`);
|
|
514
|
+
const requirements = classifyLibraryRequirements(entry, discovery.entries, options);
|
|
515
|
+
if (requirements.inactive?.length)
|
|
516
|
+
throw new Error(
|
|
517
|
+
`library_requirement_inactive: ${requirements.inactive.map(libraryEntryRef).join(", ")}; enable or repair these plugins explicitly`,
|
|
518
|
+
);
|
|
519
|
+
if (requirements.unsatisfied.length)
|
|
520
|
+
throw new Error(
|
|
521
|
+
`library_requirement_missing: ${requirements.unsatisfied.map(libraryEntryRef).join(", ")}; install required resources before updating`,
|
|
522
|
+
);
|
|
523
|
+
const plan = planLibraryInstall(entry, { ...options, scope: plugin.scope, force: true });
|
|
524
|
+
if (!options.force) plan.expectedInstalledDigest = pluginContentDigest(plugin.rootPath);
|
|
525
|
+
return plan;
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
export function removeLibraryEntry(
|
|
529
|
+
entry: Pick<LibraryEntry, "kind" | "name">,
|
|
530
|
+
options: { cwd?: string; scope?: PluginScope; expect?: PluginExpectedState } = {},
|
|
531
|
+
): LibraryInstallResult {
|
|
532
|
+
const installed = installedPlugin(entry, options);
|
|
533
|
+
if (!installed) throw new Error(`package not installed: ${libraryEntryRef(entry)}`);
|
|
534
|
+
const result = removePlugin(entry.name, { ...options, scope: installed.scope });
|
|
535
|
+
if (result.diagnostics.some((item) => item.type === "error"))
|
|
536
|
+
throw new Error(
|
|
537
|
+
`${result.diagnostics.map((item) => item.message).join("; ")}${result.recovery ? `; recovery: ${JSON.stringify(result.recovery)}` : ""}`,
|
|
538
|
+
);
|
|
539
|
+
return result.recovery ? { recovery: result.recovery } : {};
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
export function pinLibraryEntry(
|
|
543
|
+
entry: LibraryEntry,
|
|
544
|
+
options: LibraryScopeOptions = {},
|
|
545
|
+
): { sha256: string; sourceUrl: string } {
|
|
546
|
+
const installed = libraryInstallPath(entry, options);
|
|
547
|
+
const pin = libraryEntryPin(entry, options);
|
|
548
|
+
if (!pin) throw new Error(`plugin is not installed with a verified pin: ${entry.name}`);
|
|
549
|
+
if (pluginContentDigest(installed) !== pin.sha256)
|
|
550
|
+
throw new Error(`plugin_local_changes: ${entry.name}; reinstall explicitly to accept changed content`);
|
|
551
|
+
return pin;
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
export function libraryEntryDrift(
|
|
555
|
+
entry: Pick<LibraryEntry, "kind" | "name">,
|
|
556
|
+
options: LibraryScopeOptions = {},
|
|
557
|
+
): { status: "clean" | "changed" | "missing" | "unpinned"; expected?: string; observed?: string } {
|
|
558
|
+
const installed = libraryInstallPath(entry, options);
|
|
559
|
+
if (!existsSync(installed)) return { status: "missing" };
|
|
560
|
+
const pin = libraryEntryPin(entry, options);
|
|
561
|
+
if (!pin) return { status: "unpinned" };
|
|
562
|
+
const observed = pluginContentDigest(installed);
|
|
563
|
+
return { status: observed === pin.sha256 ? "clean" : "changed", expected: pin.sha256, observed };
|
|
283
564
|
}
|
|
284
565
|
|
|
285
566
|
function confirmedRemote(): string {
|