@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
|
@@ -0,0 +1,574 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Library browser's projection: one inventory read becomes the rows, the
|
|
3
|
+
* status line and the detail panes the operator actually sees.
|
|
4
|
+
*
|
|
5
|
+
* Everything here is pure. The overlay owns the keyboard, the lifecycle port
|
|
6
|
+
* owns the writes, and this module owns what is true on screen, so the wording
|
|
7
|
+
* of an origin label or a disabled reason is testable without a terminal.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { PluginScope } from "../../domains/plugins/types.js";
|
|
11
|
+
import type {
|
|
12
|
+
LibraryCopy,
|
|
13
|
+
LibraryCopyInspection,
|
|
14
|
+
LibraryEntryKind,
|
|
15
|
+
LibraryInventory,
|
|
16
|
+
LibraryOrigin,
|
|
17
|
+
LibraryPackageRecord,
|
|
18
|
+
LibraryProvidedResource,
|
|
19
|
+
LibraryResource,
|
|
20
|
+
LibraryResourceKind,
|
|
21
|
+
} from "../../domains/resources/index.js";
|
|
22
|
+
import { clioTheme, GLYPH } from "../theme/index.js";
|
|
23
|
+
import type { ListOverlayItem } from "./list-overlay.js";
|
|
24
|
+
|
|
25
|
+
/** Browse lists install targets; Installed lists the copies and recipes that exist here. */
|
|
26
|
+
export type LibraryMode = "browse" | "installed";
|
|
27
|
+
|
|
28
|
+
export interface LibraryView {
|
|
29
|
+
category: LibraryEntryKind;
|
|
30
|
+
mode: LibraryMode;
|
|
31
|
+
scope: PluginScope;
|
|
32
|
+
/** Set while drilled into one package's members. */
|
|
33
|
+
member?: { ref: string; scope?: PluginScope } | undefined;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** What one row is, so an action never has to re-parse a row id it printed. */
|
|
37
|
+
export type LibraryRowSubject =
|
|
38
|
+
| { kind: "package"; record: LibraryPackageRecord }
|
|
39
|
+
| { kind: "copy"; copy: LibraryCopy }
|
|
40
|
+
| { kind: "recipe"; resource: LibraryResource }
|
|
41
|
+
| { kind: "member"; owner: LibraryCopy; member: LibraryCopyInspection["resources"][number] }
|
|
42
|
+
| { kind: "hint"; record: LibraryPackageRecord; hint: LibraryProvidedResource }
|
|
43
|
+
| { kind: "notice"; message: string };
|
|
44
|
+
|
|
45
|
+
export const LIBRARY_GROUP_INSTALLED = "Installed";
|
|
46
|
+
export const LIBRARY_GROUP_AVAILABLE = "Available";
|
|
47
|
+
export const LIBRARY_GROUP_MEMBERS = "Members";
|
|
48
|
+
export const LIBRARY_GROUP_UNMANAGED = "Not a package";
|
|
49
|
+
export const LIBRARY_GROUP_NOTICES = "Notices";
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Where the bytes came from, in words.
|
|
53
|
+
*
|
|
54
|
+
* Origin is evidence about location and adoption. Format, trust, scope and
|
|
55
|
+
* availability are four other facts and each gets its own column or line, which
|
|
56
|
+
* is why none of them is folded into this string.
|
|
57
|
+
*/
|
|
58
|
+
export function libraryOriginLabel(origin: LibraryOrigin): string {
|
|
59
|
+
switch (origin.kind) {
|
|
60
|
+
case "bundled":
|
|
61
|
+
return "Bundled with Clio-Coder";
|
|
62
|
+
case "remote":
|
|
63
|
+
return "Remote";
|
|
64
|
+
case "local":
|
|
65
|
+
return "Local";
|
|
66
|
+
case "imported":
|
|
67
|
+
return `Imported from ${origin.agent}`;
|
|
68
|
+
case "core":
|
|
69
|
+
return "Core";
|
|
70
|
+
default:
|
|
71
|
+
return "Unknown origin";
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** The address behind the label: URL, path, catalog or marketplace, whichever the evidence carries. */
|
|
76
|
+
function libraryOriginDetail(origin: LibraryOrigin): string | undefined {
|
|
77
|
+
switch (origin.kind) {
|
|
78
|
+
case "bundled":
|
|
79
|
+
return origin.catalog;
|
|
80
|
+
case "remote":
|
|
81
|
+
return [origin.url, origin.catalog].filter(Boolean).join(" · ");
|
|
82
|
+
case "local":
|
|
83
|
+
return [origin.path, origin.catalog].filter(Boolean).join(" · ");
|
|
84
|
+
case "imported":
|
|
85
|
+
return [origin.path, origin.marketplace].filter(Boolean).join(" · ");
|
|
86
|
+
case "core":
|
|
87
|
+
return "src/domains/agents";
|
|
88
|
+
default:
|
|
89
|
+
return origin.detail;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** Vendor packaging format, which is neither a location nor a trust decision. */
|
|
94
|
+
function libraryFormatLabel(format: string | undefined): string {
|
|
95
|
+
if (format === "claude-code") return "Claude Code format";
|
|
96
|
+
if (format === "codex") return "Codex format";
|
|
97
|
+
if (format === "portable") return "Portable format";
|
|
98
|
+
return "Format unknown";
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* The persistent mode/scope row, at the width it is drawn.
|
|
103
|
+
*
|
|
104
|
+
* Mode and scope survive every width, because they say what the action keys
|
|
105
|
+
* will do. The counts are what gets dropped first: they are useful, and they
|
|
106
|
+
* are not the thing an operator would be wrong about.
|
|
107
|
+
*/
|
|
108
|
+
export function libraryStatusLine(
|
|
109
|
+
view: LibraryView,
|
|
110
|
+
counts: { rows: number; notices: number; truncated: boolean },
|
|
111
|
+
width: number,
|
|
112
|
+
): string {
|
|
113
|
+
const theme = clioTheme();
|
|
114
|
+
const mode = view.mode === "browse" ? "Browse" : "Installed";
|
|
115
|
+
const scope = view.scope === "user" ? "User" : "Project";
|
|
116
|
+
const core = `${mode} · ${scope}`;
|
|
117
|
+
if (width < 34) return theme.fg("accent", `${mode}·${scope}`);
|
|
118
|
+
const parts = [theme.fg("accent", core)];
|
|
119
|
+
if (view.member) parts.push(theme.fg("dim", `members of ${view.member.ref}`));
|
|
120
|
+
if (width >= 56) parts.push(theme.fg("dim", `${counts.rows} row${counts.rows === 1 ? "" : "s"}`));
|
|
121
|
+
if (counts.notices > 0) parts.push(theme.fg("warning", `${counts.notices} notice${counts.notices === 1 ? "" : "s"}`));
|
|
122
|
+
if (counts.truncated) parts.push(theme.fg("warning", "incomplete results"));
|
|
123
|
+
return parts.join(theme.fg("frame", " │ "));
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/** The composer text a `use` on this recipe writes, or null when its use is another surface. */
|
|
127
|
+
export function libraryUseInvocation(kind: LibraryResourceKind, name: string): string | null {
|
|
128
|
+
if (kind === "skill") return `/skill ${name} `;
|
|
129
|
+
if (kind === "agent") return `/run ${name} `;
|
|
130
|
+
if (kind === "prompt") return `/${name} `;
|
|
131
|
+
// A fleet's use is its `/fleet run` approval preview, not composer text.
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/** Which keys this row offers, and why the others are absent. */
|
|
136
|
+
export interface LibraryRowActions {
|
|
137
|
+
install: boolean;
|
|
138
|
+
remove: boolean;
|
|
139
|
+
enable: boolean;
|
|
140
|
+
update: boolean;
|
|
141
|
+
use: boolean;
|
|
142
|
+
open: boolean;
|
|
143
|
+
/** One sentence per unavailable action, shown in the detail pane rather than as a dead key. */
|
|
144
|
+
reasons: string[];
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function ownerScopeOf(record: LibraryPackageRecord, scope: PluginScope): { scope: PluginScope } | undefined {
|
|
148
|
+
return record.copies.find((copy) => copy.scope === scope);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* A row's available actions, computed from the same records the row printed.
|
|
153
|
+
*
|
|
154
|
+
* Nothing here guesses. A core or loose recipe is not a package, so it offers
|
|
155
|
+
* no package lifecycle at all and says so; an unavailable recipe offers no
|
|
156
|
+
* `use`, because the invocation would fail; and a package with no copy in the
|
|
157
|
+
* selected scope offers install rather than update.
|
|
158
|
+
*/
|
|
159
|
+
export function libraryRowActions(subject: LibraryRowSubject, view: LibraryView): LibraryRowActions {
|
|
160
|
+
const none: LibraryRowActions = {
|
|
161
|
+
install: false,
|
|
162
|
+
remove: false,
|
|
163
|
+
enable: false,
|
|
164
|
+
update: false,
|
|
165
|
+
use: false,
|
|
166
|
+
open: false,
|
|
167
|
+
reasons: [],
|
|
168
|
+
};
|
|
169
|
+
if (subject.kind === "notice") return none;
|
|
170
|
+
if (subject.kind === "package") {
|
|
171
|
+
const here = ownerScopeOf(subject.record, view.scope);
|
|
172
|
+
const reasons: string[] = [];
|
|
173
|
+
if (subject.record.refusal) reasons.push(subject.record.refusal);
|
|
174
|
+
if (!here) reasons.push(`No ${view.scope} copy; install writes one. Press s to select the other scope.`);
|
|
175
|
+
return {
|
|
176
|
+
install: !here && !subject.record.refusal,
|
|
177
|
+
remove: !!here,
|
|
178
|
+
enable: !!here,
|
|
179
|
+
update: !!here,
|
|
180
|
+
use: false,
|
|
181
|
+
open: true,
|
|
182
|
+
reasons,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
if (subject.kind === "copy") {
|
|
186
|
+
const selected = subject.copy.scope === view.scope;
|
|
187
|
+
const reasons: string[] = [];
|
|
188
|
+
if (!selected)
|
|
189
|
+
reasons.push(
|
|
190
|
+
`This copy is ${subject.copy.scope} scope and actions select ${view.scope}. Press s to select ${subject.copy.scope}.`,
|
|
191
|
+
);
|
|
192
|
+
return {
|
|
193
|
+
install: false,
|
|
194
|
+
remove: selected,
|
|
195
|
+
enable: selected,
|
|
196
|
+
update: selected,
|
|
197
|
+
use: false,
|
|
198
|
+
open: true,
|
|
199
|
+
reasons,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
if (subject.kind === "member") {
|
|
203
|
+
const selected = subject.owner.scope === view.scope;
|
|
204
|
+
const reasons = [`Actions here identify the whole owner ${subject.owner.ref} in ${view.scope} scope.`];
|
|
205
|
+
if (!selected) reasons.push(`The inspected copy is ${subject.owner.scope}; press s to select it.`);
|
|
206
|
+
if (!subject.member.valid) reasons.push("This member did not validate, so it has no use action.");
|
|
207
|
+
return {
|
|
208
|
+
install: false,
|
|
209
|
+
remove: selected,
|
|
210
|
+
enable: selected,
|
|
211
|
+
update: selected,
|
|
212
|
+
use: false,
|
|
213
|
+
open: false,
|
|
214
|
+
reasons,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
if (subject.kind === "hint") {
|
|
218
|
+
return {
|
|
219
|
+
install: !ownerScopeOf(subject.record, view.scope),
|
|
220
|
+
remove: !!ownerScopeOf(subject.record, view.scope),
|
|
221
|
+
enable: false,
|
|
222
|
+
update: false,
|
|
223
|
+
use: false,
|
|
224
|
+
open: false,
|
|
225
|
+
reasons: [
|
|
226
|
+
`A catalog hint from ${subject.record.ref}. It describes what that package says it contains; nothing is loaded until it is installed and verified.`,
|
|
227
|
+
],
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
const resource = subject.resource;
|
|
231
|
+
const owner = resource.owner;
|
|
232
|
+
const usable = resource.availability === "available";
|
|
233
|
+
const reasons: string[] = [];
|
|
234
|
+
if (!usable) reasons.push(resource.reason ?? `This resource is ${resource.availability} and cannot be used.`);
|
|
235
|
+
if (!owner)
|
|
236
|
+
reasons.push(
|
|
237
|
+
resource.source.class === "core"
|
|
238
|
+
? "Core recipes ship with Clio-Coder and have no package to install, update or remove."
|
|
239
|
+
: "This file was found directly in a resource root, not installed as a package, so package lifecycle does not apply.",
|
|
240
|
+
);
|
|
241
|
+
const selected = owner?.scope === view.scope;
|
|
242
|
+
if (owner && !selected) reasons.push(`Owned by ${owner.ref} in ${owner.scope} scope; press s to select it.`);
|
|
243
|
+
return {
|
|
244
|
+
install: false,
|
|
245
|
+
remove: !!owner && selected,
|
|
246
|
+
enable: !!owner && selected,
|
|
247
|
+
update: !!owner && selected,
|
|
248
|
+
use: usable,
|
|
249
|
+
open: !!owner,
|
|
250
|
+
reasons,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
function copyStateWord(copy: LibraryCopy): string {
|
|
255
|
+
const theme = clioTheme();
|
|
256
|
+
if (copy.state === "loadable") return theme.fg("success", "loadable");
|
|
257
|
+
if (copy.state === "disabled") return theme.fg("warning", "disabled");
|
|
258
|
+
if (copy.state === "shadowed") return theme.fg("dim", "shadowed");
|
|
259
|
+
return theme.fg("error", copy.state);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
function availabilityWord(resource: LibraryResource): string {
|
|
263
|
+
const theme = clioTheme();
|
|
264
|
+
if (resource.availability === "available") return theme.fg("success", "available");
|
|
265
|
+
if (resource.availability === "untrusted") return theme.fg("warning", "untrusted");
|
|
266
|
+
if (resource.availability === "shadowed") return theme.fg("dim", "shadowed");
|
|
267
|
+
return theme.fg("error", resource.availability);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
function metaOf(parts: ReadonlyArray<string | undefined>): string {
|
|
271
|
+
return parts.filter((part): part is string => !!part && part.length > 0).join(" · ");
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
function packageDetail(record: LibraryPackageRecord, view: LibraryView, actions: LibraryRowActions): string[] {
|
|
275
|
+
const lines = [`# ${record.name}`, `**Kind:** ${record.kind}`, `**Origin:** ${libraryOriginLabel(record.origin)}`];
|
|
276
|
+
const detail = libraryOriginDetail(record.origin);
|
|
277
|
+
if (detail) lines.push(`**Source:** \`${detail}\``);
|
|
278
|
+
lines.push(`**Format:** ${libraryFormatLabel(record.format)}`);
|
|
279
|
+
if (record.version) lines.push(`**Version:** ${record.version}`);
|
|
280
|
+
if (record.sha256) lines.push(`**Recorded digest:** \`${record.sha256.slice(0, 12)}\``);
|
|
281
|
+
lines.push(
|
|
282
|
+
`**Installed copies:** ${
|
|
283
|
+
record.copies.length === 0 ? "none" : record.copies.map((copy) => `${copy.scope} (${copy.state})`).join(", ")
|
|
284
|
+
}`,
|
|
285
|
+
);
|
|
286
|
+
lines.push(`**Selected scope:** ${view.scope}`);
|
|
287
|
+
if (record.requires?.length) lines.push(`**Requires:** ${record.requires.join(", ")}`);
|
|
288
|
+
if (record.provides?.length)
|
|
289
|
+
lines.push(`**Catalog hints:** ${record.provides.map((hint) => `${hint.kind}:${hint.name}`).join(", ")}`);
|
|
290
|
+
if (record.provides === undefined && record.copies.length === 0)
|
|
291
|
+
lines.push("**Contents:** unknown until this package is inspected or installed.");
|
|
292
|
+
for (const reason of actions.reasons) lines.push(`**Note:** ${reason}`);
|
|
293
|
+
lines.push("", "---", "", record.description);
|
|
294
|
+
return lines;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
function copyDetail(copy: LibraryCopy, view: LibraryView, actions: LibraryRowActions): string[] {
|
|
298
|
+
const lines = [
|
|
299
|
+
`# ${copy.name}`,
|
|
300
|
+
`**Kind:** ${copy.kind}`,
|
|
301
|
+
`**Scope:** ${copy.scope}`,
|
|
302
|
+
`**State:** ${copy.state}`,
|
|
303
|
+
`**Enabled:** ${copy.enabled ? "yes" : "no"} · **Valid:** ${copy.valid ? "yes" : "no"} · **Compatible:** ${copy.compatible ? "yes" : "no"} · **Effective:** ${copy.effective ? "yes" : "no"}`,
|
|
304
|
+
`**Trust:** ${copy.trust}`,
|
|
305
|
+
`**Origin:** ${libraryOriginLabel(copy.origin)}`,
|
|
306
|
+
];
|
|
307
|
+
const detail = libraryOriginDetail(copy.origin);
|
|
308
|
+
if (detail) lines.push(`**Source:** \`${detail}\``);
|
|
309
|
+
lines.push(`**Format:** ${libraryFormatLabel(copy.format)}`);
|
|
310
|
+
lines.push(`**Root:** \`${copy.root}\``);
|
|
311
|
+
if (copy.overriddenBy) lines.push(`**Overridden by:** the ${copy.overriddenBy} copy`);
|
|
312
|
+
if (copy.recordedDigest)
|
|
313
|
+
lines.push(
|
|
314
|
+
`**Integrity:** recorded \`${copy.recordedDigest.slice(0, 12)}\`${
|
|
315
|
+
copy.observedDigest
|
|
316
|
+
? copy.observedDigest === copy.recordedDigest
|
|
317
|
+
? ", observed identical"
|
|
318
|
+
: `, observed \`${copy.observedDigest.slice(0, 12)}\` (content changed)`
|
|
319
|
+
: ""
|
|
320
|
+
}`,
|
|
321
|
+
);
|
|
322
|
+
if (copy.installedAt) lines.push(`**Installed:** ${copy.installedAt}`);
|
|
323
|
+
lines.push(`**Selected scope:** ${view.scope}`);
|
|
324
|
+
for (const diagnostic of copy.diagnostics) lines.push(`**Diagnostic:** ${diagnostic}`);
|
|
325
|
+
for (const reason of actions.reasons) lines.push(`**Note:** ${reason}`);
|
|
326
|
+
lines.push("", "Press Enter to list this package's members.");
|
|
327
|
+
return lines;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
function resourceDetail(resource: LibraryResource, actions: LibraryRowActions): string[] {
|
|
331
|
+
const lines = [
|
|
332
|
+
`# ${resource.name}`,
|
|
333
|
+
`**Kind:** ${resource.kind}`,
|
|
334
|
+
`**Use:** ${resource.invocation ? `\`${resource.invocation}\`` : "not invocable in this state"}`,
|
|
335
|
+
`**Availability:** ${resource.availability}`,
|
|
336
|
+
`**Source:** ${resource.source.class} (${resource.source.id}), ${resource.source.scope} scope`,
|
|
337
|
+
`**Origin:** ${libraryOriginLabel(resource.origin)}`,
|
|
338
|
+
];
|
|
339
|
+
const detail = libraryOriginDetail(resource.origin);
|
|
340
|
+
if (detail) lines.push(`**Location:** \`${detail}\``);
|
|
341
|
+
if (resource.format) lines.push(`**Format:** ${libraryFormatLabel(resource.format)}`);
|
|
342
|
+
lines.push(`**Trusted:** ${resource.trusted ? "yes" : "no"}`);
|
|
343
|
+
if (resource.owner)
|
|
344
|
+
lines.push(
|
|
345
|
+
`**Owner:** ${resource.owner.ref} (${resource.owner.scope} scope)${
|
|
346
|
+
resource.owner.componentId ? `, declared component \`${resource.owner.componentId}\`` : ""
|
|
347
|
+
}`,
|
|
348
|
+
);
|
|
349
|
+
lines.push(`**Path:** \`${resource.path}\``);
|
|
350
|
+
if (resource.audience) lines.push(`**Audience:** ${resource.audience}`);
|
|
351
|
+
if (resource.reason) lines.push(`**Reason:** ${resource.reason}`);
|
|
352
|
+
for (const diagnostic of resource.diagnostics) lines.push(`**Diagnostic:** ${diagnostic}`);
|
|
353
|
+
for (const reason of actions.reasons) lines.push(`**Note:** ${reason}`);
|
|
354
|
+
lines.push("", "---", "", resource.description);
|
|
355
|
+
return lines;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
function memberDetail(subject: Extract<LibraryRowSubject, { kind: "member" }>, actions: LibraryRowActions): string[] {
|
|
359
|
+
const lines = [
|
|
360
|
+
`# ${subject.member.name}`,
|
|
361
|
+
`**Kind:** ${subject.member.kind}`,
|
|
362
|
+
`**Owner:** ${subject.owner.ref} (${subject.owner.scope} scope, ${subject.owner.state})`,
|
|
363
|
+
`**Valid:** ${subject.member.valid ? "yes" : "no"}`,
|
|
364
|
+
];
|
|
365
|
+
if (subject.member.componentId) lines.push(`**Declared component:** \`${subject.member.componentId}\``);
|
|
366
|
+
lines.push(`**Path:** \`${subject.member.path}\``);
|
|
367
|
+
lines.push(`**Origin:** ${libraryOriginLabel(subject.owner.origin)}`);
|
|
368
|
+
for (const diagnostic of subject.member.diagnostics) lines.push(`**Diagnostic:** ${diagnostic}`);
|
|
369
|
+
for (const reason of actions.reasons) lines.push(`**Note:** ${reason}`);
|
|
370
|
+
if (subject.member.description) lines.push("", "---", "", subject.member.description);
|
|
371
|
+
return lines;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/** The rows one view draws, with the subject behind each id. */
|
|
375
|
+
export interface LibraryRowSet {
|
|
376
|
+
items: ListOverlayItem[];
|
|
377
|
+
subjects: Map<string, LibraryRowSubject>;
|
|
378
|
+
notices: number;
|
|
379
|
+
truncated: boolean;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
function push(set: LibraryRowSet, id: string, subject: LibraryRowSubject, item: Omit<ListOverlayItem, "id">): void {
|
|
383
|
+
set.subjects.set(id, subject);
|
|
384
|
+
set.items.push({ id, ...item });
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
/**
|
|
388
|
+
* Incomplete evidence, said out loud.
|
|
389
|
+
*
|
|
390
|
+
* A capped copy list cannot prove a package is absent, so the browser says the
|
|
391
|
+
* results are incomplete and names the narrower reads that can answer, rather
|
|
392
|
+
* than drawing an "available" row that means "we stopped looking".
|
|
393
|
+
*/
|
|
394
|
+
export function libraryTruncationNotice(inventory: LibraryInventory): string | undefined {
|
|
395
|
+
const capped = [
|
|
396
|
+
inventory.truncated.packages ? "catalog packages" : undefined,
|
|
397
|
+
inventory.truncated.copies ? "installed copies" : undefined,
|
|
398
|
+
inventory.truncated.resources ? "recipes" : undefined,
|
|
399
|
+
].filter((part): part is string => part !== undefined);
|
|
400
|
+
if (capped.length === 0) return undefined;
|
|
401
|
+
return `Incomplete results: ${capped.join(", ")} were capped, so an absent row does not prove a package is not installed. Narrow with / search, switch category, or run clio-coder library inspect <ref>.`;
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
/**
|
|
405
|
+
* Narrow one inventory read to the active category.
|
|
406
|
+
*
|
|
407
|
+
* The whole inventory is read once per rebuild rather than once per tab,
|
|
408
|
+
* because the loaders enumerate their roots for precedence either way and five
|
|
409
|
+
* filtered passes would repeat that work five times. Selection is therefore a
|
|
410
|
+
* projection here rather than a `kinds` argument there.
|
|
411
|
+
*
|
|
412
|
+
* Browse keeps a package whose own kind matches or whose catalog hints mention
|
|
413
|
+
* the category, so a bundle that contains the skill someone is looking for is
|
|
414
|
+
* findable before it is installed. Installed keeps the category's recipes, plus
|
|
415
|
+
* the copies of that package kind that produced no loadable resource, so a
|
|
416
|
+
* damaged package stays reachable for repair instead of vanishing with the
|
|
417
|
+
* recipes it failed to provide.
|
|
418
|
+
*/
|
|
419
|
+
export function selectForCategory(inventory: LibraryInventory, view: LibraryView): LibraryInventory {
|
|
420
|
+
if (view.mode === "browse")
|
|
421
|
+
return {
|
|
422
|
+
...inventory,
|
|
423
|
+
packages: inventory.packages.filter(
|
|
424
|
+
(record) => record.kind === view.category || (record.provides ?? []).some((hint) => hint.kind === view.category),
|
|
425
|
+
),
|
|
426
|
+
copies: [],
|
|
427
|
+
resources: [],
|
|
428
|
+
};
|
|
429
|
+
if (view.category === "plugin")
|
|
430
|
+
return {
|
|
431
|
+
...inventory,
|
|
432
|
+
packages: [],
|
|
433
|
+
copies: inventory.copies.filter((copy) => copy.kind === "plugin"),
|
|
434
|
+
resources: [],
|
|
435
|
+
};
|
|
436
|
+
const resources = inventory.resources.filter((resource) => resource.kind === view.category);
|
|
437
|
+
const provided = new Set(resources.map((resource) => resource.owner?.ref).filter(Boolean));
|
|
438
|
+
return {
|
|
439
|
+
...inventory,
|
|
440
|
+
packages: [],
|
|
441
|
+
copies: inventory.copies.filter((copy) => copy.kind === view.category && !provided.has(copy.ref)),
|
|
442
|
+
resources,
|
|
443
|
+
};
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
export interface LibraryRowOptions {
|
|
447
|
+
inventory: LibraryInventory;
|
|
448
|
+
view: LibraryView;
|
|
449
|
+
/** Members of the drilled-into copy, read explicitly rather than during listing. */
|
|
450
|
+
inspection?: LibraryCopyInspection | undefined;
|
|
451
|
+
/** A one-line problem the last read hit, drawn as a notice row rather than swallowed. */
|
|
452
|
+
failure?: string | undefined;
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
/**
|
|
456
|
+
* Build one view's rows.
|
|
457
|
+
*
|
|
458
|
+
* The two modes answer different questions and so they list different records.
|
|
459
|
+
* Browse lists install targets, which is what an operator wanting something new
|
|
460
|
+
* is looking at. Installed lists what this machine actually has, which is what
|
|
461
|
+
* an operator repairing something is looking at. Neither hides the other's
|
|
462
|
+
* evidence: a browse row states its installed copies and an installed row
|
|
463
|
+
* states its origin.
|
|
464
|
+
*/
|
|
465
|
+
export function buildLibraryRows(options: LibraryRowOptions): LibraryRowSet {
|
|
466
|
+
const { inventory, view } = options;
|
|
467
|
+
const theme = clioTheme();
|
|
468
|
+
const set: LibraryRowSet = { items: [], subjects: new Map(), notices: 0, truncated: false };
|
|
469
|
+
|
|
470
|
+
if (view.member && options.inspection) {
|
|
471
|
+
const owner = options.inspection.copy;
|
|
472
|
+
for (const member of options.inspection.resources) {
|
|
473
|
+
const subject: LibraryRowSubject = { kind: "member", owner, member };
|
|
474
|
+
const actions = libraryRowActions(subject, view);
|
|
475
|
+
push(set, `mem:${owner.ref}@${owner.scope}#${member.kind}:${member.name}`, subject, {
|
|
476
|
+
label: member.name,
|
|
477
|
+
meta: metaOf([
|
|
478
|
+
member.kind,
|
|
479
|
+
member.valid ? theme.fg("success", "valid") : theme.fg("error", "invalid"),
|
|
480
|
+
member.componentId ? `component ${member.componentId}` : undefined,
|
|
481
|
+
]),
|
|
482
|
+
group: LIBRARY_GROUP_MEMBERS,
|
|
483
|
+
detail: () => memberDetail(subject, actions),
|
|
484
|
+
});
|
|
485
|
+
}
|
|
486
|
+
for (const item of options.inspection.ancillary) {
|
|
487
|
+
const subject: LibraryRowSubject = {
|
|
488
|
+
kind: "notice",
|
|
489
|
+
message: `${item.kind} ${item.id} is declared package metadata, not a recipe. It runs only on an explicit request.`,
|
|
490
|
+
};
|
|
491
|
+
push(set, `note:ancillary:${item.kind}:${item.id}`, subject, {
|
|
492
|
+
label: `${item.kind}: ${item.id}`,
|
|
493
|
+
meta: theme.fg("dim", "companion file"),
|
|
494
|
+
group: LIBRARY_GROUP_NOTICES,
|
|
495
|
+
detail: () => [`# ${item.id}`, `**Declared as:** ${item.kind}`, `**Path:** \`${item.path}\``, "", subject.message],
|
|
496
|
+
});
|
|
497
|
+
set.notices += 1;
|
|
498
|
+
}
|
|
499
|
+
for (const diagnostic of options.inspection.diagnostics) {
|
|
500
|
+
const subject: LibraryRowSubject = { kind: "notice", message: diagnostic };
|
|
501
|
+
push(set, `note:member-diag:${set.notices}`, subject, {
|
|
502
|
+
label: `${theme.fg("warning", GLYPH.warnInline)} ${diagnostic}`,
|
|
503
|
+
meta: theme.fg("dim", "inspection"),
|
|
504
|
+
group: LIBRARY_GROUP_NOTICES,
|
|
505
|
+
detail: () => ["# Inspection diagnostic", diagnostic],
|
|
506
|
+
});
|
|
507
|
+
set.notices += 1;
|
|
508
|
+
}
|
|
509
|
+
} else if (view.mode === "browse") {
|
|
510
|
+
for (const record of inventory.packages) {
|
|
511
|
+
const subject: LibraryRowSubject = { kind: "package", record };
|
|
512
|
+
const actions = libraryRowActions(subject, view);
|
|
513
|
+
const here = record.copies.find((copy) => copy.scope === view.scope);
|
|
514
|
+
const hints = (record.provides ?? []).filter((hint) => view.category === "plugin" || hint.kind === view.category);
|
|
515
|
+
push(set, `pkg:${record.ref}`, subject, {
|
|
516
|
+
label: record.name,
|
|
517
|
+
meta: metaOf([
|
|
518
|
+
libraryOriginLabel(record.origin),
|
|
519
|
+
record.version ? `v${record.version}` : undefined,
|
|
520
|
+
here ? theme.fg("success", `${here.scope} ${here.state}`) : theme.fg("dim", "not in this scope"),
|
|
521
|
+
hints.length > 0 ? `${hints.length} hinted` : undefined,
|
|
522
|
+
]),
|
|
523
|
+
group: record.copies.length > 0 ? LIBRARY_GROUP_INSTALLED : LIBRARY_GROUP_AVAILABLE,
|
|
524
|
+
detail: () => packageDetail(record, view, actions),
|
|
525
|
+
});
|
|
526
|
+
}
|
|
527
|
+
} else {
|
|
528
|
+
for (const copy of inventory.copies) {
|
|
529
|
+
const subject: LibraryRowSubject = { kind: "copy", copy };
|
|
530
|
+
const actions = libraryRowActions(subject, view);
|
|
531
|
+
push(set, `copy:${copy.ref}@${copy.scope}`, subject, {
|
|
532
|
+
label: copy.name,
|
|
533
|
+
meta: metaOf([
|
|
534
|
+
libraryOriginLabel(copy.origin),
|
|
535
|
+
copy.scope,
|
|
536
|
+
copyStateWord(copy),
|
|
537
|
+
copy.trust === "foreign" ? theme.fg("warning", "foreign") : undefined,
|
|
538
|
+
]),
|
|
539
|
+
group: LIBRARY_GROUP_INSTALLED,
|
|
540
|
+
detail: () => copyDetail(copy, view, actions),
|
|
541
|
+
});
|
|
542
|
+
}
|
|
543
|
+
for (const resource of inventory.resources) {
|
|
544
|
+
const subject: LibraryRowSubject = { kind: "recipe", resource };
|
|
545
|
+
const actions = libraryRowActions(subject, view);
|
|
546
|
+
push(set, `res:${resource.key}`, subject, {
|
|
547
|
+
label: resource.name,
|
|
548
|
+
meta: metaOf([
|
|
549
|
+
libraryOriginLabel(resource.origin),
|
|
550
|
+
resource.owner ? resource.owner.ref : resource.source.class,
|
|
551
|
+
availabilityWord(resource),
|
|
552
|
+
]),
|
|
553
|
+
group: resource.owner ? LIBRARY_GROUP_INSTALLED : LIBRARY_GROUP_UNMANAGED,
|
|
554
|
+
detail: () => resourceDetail(resource, actions),
|
|
555
|
+
});
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
const truncation = libraryTruncationNotice(inventory);
|
|
560
|
+
set.truncated = truncation !== undefined;
|
|
561
|
+
for (const message of [options.failure, truncation, ...inventory.diagnostics].filter(
|
|
562
|
+
(entry): entry is string => entry !== undefined,
|
|
563
|
+
)) {
|
|
564
|
+
const subject: LibraryRowSubject = { kind: "notice", message };
|
|
565
|
+
push(set, `note:${set.notices}`, subject, {
|
|
566
|
+
label: `${theme.fg("warning", GLYPH.warnInline)} ${message}`,
|
|
567
|
+
meta: theme.fg("dim", "library"),
|
|
568
|
+
group: LIBRARY_GROUP_NOTICES,
|
|
569
|
+
detail: () => ["# Library notice", "", message],
|
|
570
|
+
});
|
|
571
|
+
set.notices += 1;
|
|
572
|
+
}
|
|
573
|
+
return set;
|
|
574
|
+
}
|