@iowarp/clio-coder 0.4.5 → 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 +74 -0
- package/CONTRIBUTING.md +116 -38
- package/NOTICE +24 -0
- package/README.md +341 -682
- package/dist/{acp-H3CU2HBQ.js → acp-W3Y3TRHD.js} +12 -12
- package/dist/{agents-IXQQZ7BD.js → agents-J4ICNLQ3.js} +57 -56
- 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-R7KYF7N3.js → auth-X2UJUMOC.js} +25 -25
- package/dist/{builtins-CRFDQUVP.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-SE4ZKILO.js → chunk-3XE4NRLF.js} +30 -9
- package/dist/{chunk-YYB3MC65.js → chunk-4MFBBY2Z.js} +3 -3
- package/dist/{chunk-5VTJP36Q.js → chunk-4N2RZ4TO.js} +2 -2
- package/dist/{chunk-FKIOX6DS.js → chunk-4QKAITQT.js} +10 -5
- package/dist/chunk-4UHVS5T7.js +207 -0
- package/dist/{chunk-VLPTKCKT.js → chunk-5AJPUR72.js} +6 -6
- package/dist/{chunk-5CY4Q6QI.js → chunk-5EQO5NWP.js} +105 -3
- package/dist/{chunk-RXIOCVBZ.js → chunk-65BGHOUR.js} +8 -5
- package/dist/{chunk-T53XI6I7.js → chunk-6CA2BHOR.js} +2 -2
- package/dist/{chunk-HL26ADLH.js → chunk-6CB2IL4N.js} +2 -1
- package/dist/{chunk-HR3HPQ76.js → chunk-6LRLOJHQ.js} +3 -3
- package/dist/{chunk-HXHFDHB6.js → chunk-6TAATXXH.js} +6 -6
- package/dist/{chunk-WFKDPU7U.js → chunk-6YHPAAZR.js} +3 -3
- package/dist/{chunk-ZMZQEBKI.js → chunk-7EEGBKV4.js} +11 -11
- package/dist/{chunk-BS4GAMUB.js → chunk-A67NR5AT.js} +2 -2
- package/dist/{chunk-WJIMKGD6.js → chunk-BAU36233.js} +8 -8
- package/dist/{chunk-MDU3C27C.js → chunk-BO4XV5VX.js} +8 -8
- package/dist/{chunk-KF6GFW6O.js → chunk-BQQ5MXUC.js} +11 -11
- package/dist/{chunk-K6RDB7IA.js → chunk-C3G5PNUO.js} +23 -23
- package/dist/{chunk-SRZOW5L2.js → chunk-C6GEXX4L.js} +1 -1
- package/dist/{chunk-U2JOLB7O.js → chunk-CE64C5K5.js} +227 -72
- package/dist/chunk-CP3HIR5H.js +2119 -0
- package/dist/{chunk-BBV5TKE6.js → chunk-CPXGJI2A.js} +2 -2
- package/dist/{chunk-5DDOTTG4.js → chunk-CULVKYTK.js} +5 -5
- package/dist/{chunk-F34AR6O3.js → chunk-D2T66PDV.js} +6 -6
- package/dist/{chunk-NF3BK5WR.js → chunk-DACXIVVF.js} +5 -5
- package/dist/{chunk-4SVIVOMC.js → chunk-DLIYANB7.js} +20 -15
- package/dist/{chunk-E3BQTQUP.js → chunk-DO7M3LSX.js} +9 -9
- package/dist/{chunk-2QPI3TR3.js → chunk-DVJL77SO.js} +2 -2
- package/dist/chunk-EM2WNQS2.js +93 -0
- package/dist/{chunk-ODUTYZIU.js → chunk-EUEXGXXR.js} +5 -5
- package/dist/{chunk-UL36QJX6.js → chunk-EUZRMP4Y.js} +18 -16
- package/dist/{chunk-R6MAYTMS.js → chunk-G4LGUTOE.js} +4 -4
- package/dist/{chunk-CBSKDFWL.js → chunk-GEVQNST4.js} +2 -2
- package/dist/{chunk-XXBQKW32.js → chunk-GFQ7P2UF.js} +7 -7
- package/dist/{chunk-SBZX6ARC.js → chunk-GI5RRMAH.js} +14 -14
- package/dist/{chunk-KDWLXVMN.js → chunk-GVZFCJHE.js} +343 -113
- package/dist/{chunk-633EXGZA.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-KYKNBD4Y.js → chunk-IJMW64DX.js} +978 -258
- package/dist/{chunk-DIMRLNIC.js → chunk-IMOD2YPV.js} +16 -9
- package/dist/{chunk-6CDNRHWH.js → chunk-IQCNVLO6.js} +28 -8
- package/dist/{chunk-UTUNT5QL.js → chunk-ISNCCX42.js} +9 -9
- package/dist/{chunk-RLTT5GVY.js → chunk-IZYTT3CD.js} +9 -5
- package/dist/{chunk-5ZMXGW7P.js → chunk-KAFMW7WM.js} +4 -85
- package/dist/chunk-KKEYGFX4.js +915 -0
- package/dist/{chunk-HHVJNVUJ.js → chunk-KS7ETA3P.js} +2 -2
- package/dist/{chunk-UXAC2FX4.js → chunk-L3Z5ANCV.js} +7 -7
- package/dist/{chunk-EHCPSZJF.js → chunk-LBFQMYS3.js} +2 -2
- package/dist/{chunk-QEQISF75.js → chunk-LK2FN5JY.js} +1 -1
- package/dist/{chunk-URBGEOH3.js → chunk-M6Z2V6YU.js} +5 -5
- package/dist/{chunk-DRD2A54W.js → chunk-MBJO5VNZ.js} +18 -18
- package/dist/chunk-MNQN3X6Y.js +595 -0
- package/dist/{chunk-GXCCHKN6.js → chunk-MZHXENL7.js} +7 -7
- package/dist/chunk-MZNWZUJM.js +1801 -0
- package/dist/{chunk-7YJWEF2L.js → chunk-N37QC5FV.js} +5 -5
- package/dist/{chunk-WLMSOT73.js → chunk-NCCQ6DVS.js} +7 -7
- package/dist/{chunk-TZ7MFRG4.js → chunk-NO7J45X6.js} +170 -53
- package/dist/chunk-OH3YYA3B.js +15 -0
- package/dist/{chunk-22PQ4TX4.js → chunk-P4DL2LM5.js} +16 -77
- package/dist/{chunk-R6MICQYU.js → chunk-PFLOULP3.js} +4 -4
- package/dist/{chunk-MC3JSVR6.js → chunk-QJMRYTCX.js} +7 -7
- package/dist/{chunk-ILJ7DWGE.js → chunk-QKWL7SYE.js} +12 -12
- package/dist/chunk-R2CT5YDO.js +66 -0
- package/dist/chunk-RFCKPS2V.js +26 -0
- package/dist/{chunk-ONRTXOZY.js → chunk-RTLNFZMD.js} +12 -4
- package/dist/{chunk-U7H5WRG5.js → chunk-RXFPB32E.js} +8 -6
- package/dist/{chunk-S32UQ5GL.js → chunk-SEDI5K5B.js} +18 -18
- package/dist/{chunk-ICO4TQ2F.js → chunk-SELG4SUR.js} +41 -25
- package/dist/{chunk-YEJIG7LN.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-HGSLRG33.js → chunk-TLTGZTXI.js} +3 -3
- package/dist/chunk-TZ6UVP2H.js +637 -0
- package/dist/{chunk-EWD5P3GK.js → chunk-TZHN5ITX.js} +13 -41
- package/dist/{chunk-7TKWWPD7.js → chunk-U3TPUXOQ.js} +398 -253
- package/dist/{chunk-GNQRWTMY.js → chunk-UA3W4FGC.js} +6 -6
- package/dist/{chunk-O2RQ7LCK.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-I7VLWRK2.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-GVYWZNRK.js → chunk-WBVKKTUT.js} +2 -2
- package/dist/{chunk-EHOSNVVM.js → chunk-WLHX3MM5.js} +6 -2
- package/dist/{chunk-SDWNDICN.js → chunk-WN552PKN.js} +573 -316
- package/dist/{chunk-TEG3RYVZ.js → chunk-WT5TRMO4.js} +51 -26
- package/dist/{chunk-NY6IWDVU.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-FSTIBAGM.js → chunk-XZ6UFQ52.js} +11 -11
- package/dist/chunk-Y3JU5RPK.js +8 -0
- package/dist/chunk-YKRJTYNP.js +1143 -0
- package/dist/{chunk-7HBHHVCK.js → chunk-YPRSNUTC.js} +2 -2
- package/dist/{chunk-PWWSIB2A.js → chunk-ZGIGW4ZG.js} +5 -5
- package/dist/cli/index.js +34 -36
- package/dist/{clio-5I2IBFYL.js → clio-L2P7S2R2.js} +9 -9
- package/dist/{code-nav-YXIAEZVS.js → code-nav-B5LNX4KU.js} +25 -25
- package/dist/{components-TNIKXCBH.js → components-63MMQKUT.js} +6 -6
- package/dist/{config-Y2JDJ3JJ.js → config-YXARKGTX.js} +81 -77
- package/dist/configure-LMVQJ46J.js +85 -0
- package/dist/{context-QQ53HSGJ.js → context-7HJEWTTP.js} +92 -48
- package/dist/{context-S2EEC3EJ.js → context-XSZKKFBW.js} +14 -14
- package/dist/{context-P5YSEO55.js → context-YG2LZDYZ.js} +67 -64
- package/dist/{context-clear-TMEQCOTH.js → context-clear-AC5NXHM2.js} +64 -61
- 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-CNLSQN5K.js → context-working-set-F4Q4J3NS.js} +15 -12
- package/dist/{detail-5572VLBO.js → detail-H73BEF2N.js} +65 -62
- package/dist/{dispatch-runner-FRHD6P2O.js → dispatch-runner-3RY5FSJC.js} +83 -80
- package/dist/{doctor-N3LCM2LG.js → doctor-EQYJOGUG.js} +47 -32
- package/dist/{eval-BUU3ZOUZ.js → eval-4P7O6CCE.js} +114 -50
- package/dist/{evidence-DTGEN456.js → evidence-D6GUSYJW.js} +64 -61
- package/dist/{evidence-SQ5DNFEN.js → evidence-O76QF7TZ.js} +69 -65
- package/dist/{evolve-IJNUFZDS.js → evolve-H47BCETS.js} +65 -62
- package/dist/{extensions-YVRHX6ZI.js → extensions-NNL3ZOCU.js} +98 -20
- package/dist/{fleet-ZNNVSYFO.js → fleet-KMNS6NOM.js} +115 -107
- package/dist/{fleet-commands-5YE7NPJL.js → fleet-commands-DOWSYCBX.js} +15 -15
- package/dist/{fleet-decisions-3SBSCTCW.js → fleet-decisions-S3PTZV2D.js} +9 -9
- package/dist/{fleet-graph-6HHPWF5T.js → fleet-graph-F2DE2TME.js} +26 -24
- package/dist/{fleet-inspect-JEYMGCGC.js → fleet-inspect-EN2Q6IVB.js} +67 -63
- package/dist/{fleet-preflight-QRSHIIDE.js → fleet-preflight-FRLETDD3.js} +3 -3
- package/dist/{fleet-validate-4PM4GDDL.js → fleet-validate-B2XDLS57.js} +28 -29
- package/dist/{fleet-verify-NJDTHTO3.js → fleet-verify-4JKUWGJ7.js} +64 -61
- package/dist/{fleet-view-UP2BWQQY.js → fleet-view-BHJFW26B.js} +67 -63
- package/dist/{init-S3GZQ5ZF.js → init-XAT5N5YM.js} +86 -80
- package/dist/interop-FVECHFKG.js +246 -0
- package/dist/{inventory-K2OZ36YJ.js → inventory-7KFQGLCV.js} +67 -63
- 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-OQOXQGYD.js → memory-DYVTTCP6.js} +65 -62
- package/dist/{models-3IK2Y5WE.js → models-MASFJ6Y2.js} +51 -38
- package/dist/{monitor-FTJLTKCQ.js → monitor-YMP4NXJJ.js} +73 -69
- package/dist/{orchestrator-N47O7SFD.js → orchestrator-AFQRRTEI.js} +4255 -2845
- 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-65U34NG6.js → preload-5Q7VXRFJ.js} +64 -61
- package/dist/{reset-MUVQDLNL.js → reset-7NKZK7JN.js} +11 -9
- package/dist/{resources-LM76COAO.js → resources-NILSIZAT.js} +94 -38
- package/dist/{run-3VFZQ33N.js → run-BPZGEBZV.js} +131 -114
- package/dist/{share-4JUB4BL7.js → share-EZ6ERBMH.js} +31 -28
- package/dist/skills-BTVVNYVM.js +100 -0
- package/dist/{skills-eval-G6T57L7M.js → skills-eval-UY34MNK7.js} +117 -78
- package/dist/{skills-inventory-WLM46PJH.js → skills-inventory-JDHSIA7I.js} +30 -25
- package/dist/{slash-commands-GBARG3Y7.js → slash-commands-K4FNQ2AT.js} +53 -49
- package/dist/{steer-S7D7IKPU.js → steer-2B3EQGFH.js} +4 -4
- package/dist/{support-5VAEC32W.js → support-L2SOL3IE.js} +7 -7
- package/dist/{targets-N5REUETU.js → targets-44VKGFLN.js} +69 -47
- package/dist/{tasks-6BVY5YZF.js → tasks-3KODKFU7.js} +14 -14
- package/dist/{terminal-lease-57UEOJKS.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-4HD5HAIV.js → upgrade-7PMKM2JH.js} +17 -18
- package/dist/{usage-4GWM2WWP.js → usage-6EQV7EQK.js} +77 -73
- package/dist/{verifiers-GSKWKWVG.js → verifiers-JLITWSHU.js} +16 -16
- package/dist/{verify-3AS3ULCY.js → verify-T7NAEVIG.js} +13 -13
- package/dist/{web-fetch-MQN4FH3X.js → web-fetch-W4TNW4Q7.js} +4 -4
- package/dist/{wiki-generate-7BV7XWIY.js → wiki-generate-T2TJQJUA.js} +90 -84
- package/dist/{with-panes-OFTNAR4Y.js → with-panes-CHFC7HGI.js} +4 -4
- package/dist/worker/entry.js +297 -88
- 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 +36 -2
- 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 +153 -39
- 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 +186 -80
- package/docs/guide/configuration-and-targets.md +123 -28
- package/docs/guide/configuration-reference.md +36 -38
- 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 +32 -10
- package/docs/guide/glossary.md +2 -2
- package/docs/guide/harness-extensions.md +291 -0
- package/docs/guide/installation-and-lifecycle.md +53 -20
- 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 +15 -15
- package/docs/process/documentation-coverage.md +29 -2
- 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 +22 -6
- 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/ask.ts +10 -10
- package/src/cli/config-inspect.ts +1 -1
- package/src/cli/configure-editor.ts +51 -0
- package/src/cli/configure-interop.ts +1 -1
- package/src/cli/configure-oauth.ts +1 -1
- package/src/cli/configure-onboarding.ts +232 -96
- package/src/cli/configure-prompts.ts +76 -0
- package/src/cli/configure-quick.ts +274 -0
- package/src/cli/configure-target.ts +14 -2
- package/src/cli/configure.ts +415 -176
- 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/oauth-manual-input.ts +1 -1
- package/src/cli/reset.ts +2 -0
- package/src/cli/run.ts +26 -9
- package/src/cli/select.ts +35 -4
- 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/cli/upgrade.ts +2 -2
- package/src/core/bus-events.ts +5 -0
- package/src/core/config.ts +6 -1
- package/src/core/defaults.ts +34 -12
- package/src/{interactive → core}/external-editor.ts +4 -4
- 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/classify.ts +1 -1
- package/src/domains/config/keybindings.ts +156 -124
- 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/providers/probe/fingerprint.ts +13 -6
- package/src/domains/providers/probe/reasoning.ts +2 -0
- package/src/domains/providers/runtimes/common/probe-helpers.ts +23 -7
- package/src/domains/providers/runtimes/protocol/anthropic-compat.ts +7 -2
- package/src/domains/providers/runtimes/protocol/openai-compat.ts +10 -4
- 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 +68 -52
- package/src/interactive/chat-loop.ts +32 -5
- package/src/interactive/chat-panel.ts +168 -638
- package/src/interactive/chat-renderer.ts +13 -30
- package/src/interactive/clio-editor.ts +53 -21
- package/src/interactive/command-output.ts +56 -1
- package/src/interactive/dispatch-board.ts +1 -3
- package/src/interactive/editor-submit.ts +73 -59
- 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 +12 -4
- package/src/interactive/footer/notifications.ts +2 -2
- package/src/interactive/footer/widgets.ts +52 -93
- package/src/interactive/interactive-application.ts +225 -63
- package/src/interactive/interactive-event-projection.ts +2 -44
- package/src/interactive/interactive-input-runtime.ts +257 -35
- package/src/interactive/interactive-presentation.ts +71 -21
- package/src/interactive/interactive-slash-runtime.ts +40 -48
- package/src/interactive/keybinding-manager.ts +156 -79
- package/src/interactive/keyboard-owner.ts +37 -0
- package/src/interactive/layout.ts +29 -4
- 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-general-openers.ts +2 -0
- package/src/interactive/overlay-key-routing.ts +46 -47
- package/src/interactive/overlay-lifecycle.ts +31 -15
- package/src/interactive/overlay-resource-openers.ts +56 -46
- package/src/interactive/overlay-session-lifecycle.ts +1 -1
- 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 +34 -26
- 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/preview.ts +16 -0
- package/src/interactive/renderers/reference-card.ts +35 -0
- package/src/interactive/renderers/tool-execution.ts +67 -160
- package/src/interactive/renderers/worker-entry.ts +90 -42
- package/src/interactive/slash-autocomplete.ts +100 -7
- package/src/interactive/slash-commands.ts +396 -105
- package/src/interactive/slash-spec.ts +0 -1
- package/src/interactive/status/controller.ts +0 -5
- package/src/interactive/status/state-machine.ts +44 -26
- package/src/interactive/status/types.ts +3 -0
- package/src/interactive/status/verbs.ts +13 -12
- package/src/interactive/terminal-lease.ts +44 -12
- package/src/interactive/transcript-detail.ts +50 -112
- package/src/interactive/turn-queues.ts +8 -7
- package/src/interactive/turn-runtime.ts +1 -1
- package/src/interactive/view/artifacts.ts +4 -0
- package/src/interactive/view/view-overlay.ts +58 -43
- 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/presentation.ts +1 -1
- package/src/tools/registry.ts +20 -2
- package/src/tools/verify/numeric.ts +4 -4
- 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-6SYEGZI3.js +0 -433
- package/dist/chunk-CXQ37WJH.js +0 -45
- package/dist/chunk-EQEJJ53P.js +0 -399
- package/dist/chunk-KTFSFCVN.js +0 -46
- package/dist/chunk-QRFXEO6Y.js +0 -17
- package/dist/chunk-T7FDXNRU.js +0 -1257
- package/dist/chunk-U7VQ4NI4.js +0 -911
- package/dist/configure-SML6UBZ5.js +0 -55
- package/dist/interop-YOTGXFJM.js +0 -115
- package/dist/library-GJI6W6OK.js +0 -226
- package/dist/skills-S36AAJHU.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
|
@@ -10,7 +10,8 @@ import {
|
|
|
10
10
|
visibleWidth,
|
|
11
11
|
wrapTextWithAnsi,
|
|
12
12
|
} from "../../engine/tui.js";
|
|
13
|
-
import {
|
|
13
|
+
import { localKey } from "../keyboard-owner.js";
|
|
14
|
+
import { buildHint, FILTER_HINT, type HintEntry, type OverlayEscVerb, showClioOverlayFrame } from "../overlay-frame.js";
|
|
14
15
|
import { clioTheme, GLYPH, listGroupHeader, markdownTheme, rule, selectListTheme } from "../theme/index.js";
|
|
15
16
|
|
|
16
17
|
const ELLIPSIS = "…";
|
|
@@ -48,6 +49,8 @@ export interface ListOverlayTab {
|
|
|
48
49
|
|
|
49
50
|
export interface ListOverlayOptions {
|
|
50
51
|
title: string;
|
|
52
|
+
/** Opt-in terminal-sized layout; ordinary list modals retain their compact size. */
|
|
53
|
+
fullScreen?: boolean;
|
|
51
54
|
items: ReadonlyArray<ListOverlayItem>;
|
|
52
55
|
/**
|
|
53
56
|
* Tabs, drawn as a bar above the filter row and switched with ←/→, which is
|
|
@@ -62,12 +65,31 @@ export interface ListOverlayOptions {
|
|
|
62
65
|
onTabChange?: (tabId: string) => void;
|
|
63
66
|
/** Enables the type-to-filter input row. */
|
|
64
67
|
filterable?: boolean;
|
|
65
|
-
/**
|
|
68
|
+
/** Start in the list; / enters search, whose letters and arrows belong to the input. */
|
|
69
|
+
explicitSearch?: boolean;
|
|
70
|
+
/** Persistent, width-aware scope/mode text, including when the selected tab is empty. */
|
|
71
|
+
status?: (width: number) => string;
|
|
72
|
+
/** Actions that do not require a selected row, such as scope or view mode. */
|
|
73
|
+
globalActions?: Record<string, () => void>;
|
|
74
|
+
globalHints?: ReadonlyArray<HintEntry>;
|
|
75
|
+
/**
|
|
76
|
+
* An inner level Esc leaves before it closes the overlay, such as a package's
|
|
77
|
+
* member list. `active` is asked by the footer so the key it advertises is the
|
|
78
|
+
* key the operator gets; `back` is called only when Esc actually fires.
|
|
79
|
+
*/
|
|
80
|
+
onBack?: { active: () => boolean; back: () => void };
|
|
81
|
+
/** Pre-applied filter text. */
|
|
66
82
|
initialFilter?: string;
|
|
67
|
-
/**
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
83
|
+
/**
|
|
84
|
+
* Extra hint entries beyond movement/filter/Esc (builder appends Esc). A
|
|
85
|
+
* function is asked per frame and is handed the selected row, so a footer can
|
|
86
|
+
* advertise the keys that row actually offers rather than a fixed set.
|
|
87
|
+
*/
|
|
88
|
+
hints?:
|
|
89
|
+
| ReadonlyArray<{ key: string; verb: string }>
|
|
90
|
+
| ((selected: ListOverlayItem | undefined) => ReadonlyArray<{ key: string; verb: string }>);
|
|
91
|
+
/** Custom message when list is empty; a function is asked per frame. */
|
|
92
|
+
emptyMessage?: string | (() => string);
|
|
71
93
|
/** Layout mode: stack (detail below list) or split (detail to the right). */
|
|
72
94
|
layout?: "stack" | "split";
|
|
73
95
|
/** Primary action; omitted means Enter toggles the detail pane. */
|
|
@@ -78,6 +100,7 @@ export interface ListOverlayOptions {
|
|
|
78
100
|
}
|
|
79
101
|
|
|
80
102
|
export class ListOverlayView implements Component {
|
|
103
|
+
private viewportRows = 24;
|
|
81
104
|
private selectedIndex = 0;
|
|
82
105
|
private filterText = "";
|
|
83
106
|
private isFilterFocused = false;
|
|
@@ -125,7 +148,7 @@ export class ListOverlayView implements Component {
|
|
|
125
148
|
private readonly options: ListOverlayOptions,
|
|
126
149
|
private readonly onChange: () => void,
|
|
127
150
|
) {
|
|
128
|
-
this.isFilterFocused = !!options.filterable;
|
|
151
|
+
this.isFilterFocused = !!options.filterable && !options.explicitSearch;
|
|
129
152
|
this.filterText = options.initialFilter ?? "";
|
|
130
153
|
this.items = options.items;
|
|
131
154
|
this.detailPaneDrawn = options.layout === "split";
|
|
@@ -168,6 +191,28 @@ export class ListOverlayView implements Component {
|
|
|
168
191
|
this.setItems(activeItems);
|
|
169
192
|
}
|
|
170
193
|
|
|
194
|
+
/**
|
|
195
|
+
* Move the cursor onto a row by id, reporting whether that row is here.
|
|
196
|
+
*
|
|
197
|
+
* A command that names one package opens the browser on it rather than at the
|
|
198
|
+
* top of a list the operator then has to search. A miss is reported instead of
|
|
199
|
+
* silently landing on row zero, because "not found" and "found, first" are
|
|
200
|
+
* different answers.
|
|
201
|
+
*/
|
|
202
|
+
selectById(id: string): boolean {
|
|
203
|
+
const index = this.filteredItems().findIndex((item) => item.id === id);
|
|
204
|
+
if (index === -1) return false;
|
|
205
|
+
this.selectIndex(index);
|
|
206
|
+
this.renderMemo = null;
|
|
207
|
+
return true;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/** Show or hide the stacked detail pane, for callers that bind their own key to it. */
|
|
211
|
+
toggleDetail(): void {
|
|
212
|
+
this.showDetail = !this.showDetail;
|
|
213
|
+
this.renderMemo = null;
|
|
214
|
+
}
|
|
215
|
+
|
|
171
216
|
/** Switch tabs and rebuild. A tab id this overlay does not carry is ignored. */
|
|
172
217
|
setActiveTab(tabId: string): void {
|
|
173
218
|
const tabs = this.options.tabs;
|
|
@@ -198,8 +243,11 @@ export class ListOverlayView implements Component {
|
|
|
198
243
|
const current = tabs.findIndex((tab) => tab.id === this.activeTabId);
|
|
199
244
|
const next = tabs[((((current === -1 ? 0 : current) + delta) % tabs.length) + tabs.length) % tabs.length];
|
|
200
245
|
if (!next || next.id === this.activeTabId) return false;
|
|
201
|
-
|
|
246
|
+
// The owner is told first: it keeps its own view state keyed on the tab, and
|
|
247
|
+
// rebuilding the rows before it knew which tab they were for built one tab's
|
|
248
|
+
// rows against the previous tab's subjects.
|
|
202
249
|
this.options.onTabChange?.(next.id);
|
|
250
|
+
this.setActiveTab(next.id);
|
|
203
251
|
this.onChange();
|
|
204
252
|
return true;
|
|
205
253
|
}
|
|
@@ -215,7 +263,23 @@ export class ListOverlayView implements Component {
|
|
|
215
263
|
? theme.style("accent", `${GLYPH.cursor} ${text}`, { bold: true })
|
|
216
264
|
: theme.fg("dim", ` ${text}`);
|
|
217
265
|
});
|
|
218
|
-
|
|
266
|
+
const full = parts.join(theme.fg("frame", " │ "));
|
|
267
|
+
if (visibleWidth(full) > width) {
|
|
268
|
+
const active = this.activeTab();
|
|
269
|
+
if (active) {
|
|
270
|
+
const position = tabs.findIndex((tab) => tab.id === active.id) + 1;
|
|
271
|
+
return [
|
|
272
|
+
this.padLine(
|
|
273
|
+
theme.fg(
|
|
274
|
+
"accent",
|
|
275
|
+
`${GLYPH.cursor} ${active.label} ${this.tabCounts.get(active.id) ?? 0} · ${position}/${tabs.length} ←→`,
|
|
276
|
+
),
|
|
277
|
+
width,
|
|
278
|
+
),
|
|
279
|
+
];
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
return [this.padLine(full, width)];
|
|
219
283
|
}
|
|
220
284
|
|
|
221
285
|
/**
|
|
@@ -260,6 +324,12 @@ export class ListOverlayView implements Component {
|
|
|
260
324
|
* than letting one fall through to the filter.
|
|
261
325
|
*/
|
|
262
326
|
private runAction(data: string, filteredItems: ReadonlyArray<ListOverlayItem>): boolean {
|
|
327
|
+
const global = this.options.globalActions?.[data];
|
|
328
|
+
if (global) {
|
|
329
|
+
global();
|
|
330
|
+
this.onChange();
|
|
331
|
+
return true;
|
|
332
|
+
}
|
|
263
333
|
const action = this.options.actions?.[data];
|
|
264
334
|
if (!action) return false;
|
|
265
335
|
const selectedItem = filteredItems[this.selectedIndex];
|
|
@@ -268,8 +338,8 @@ export class ListOverlayView implements Component {
|
|
|
268
338
|
}
|
|
269
339
|
|
|
270
340
|
/**
|
|
271
|
-
* Esc
|
|
272
|
-
*
|
|
341
|
+
* Esc clears a nonempty filter first. Explicit search then returns to the
|
|
342
|
+
* list before a further Esc closes the overlay.
|
|
273
343
|
*/
|
|
274
344
|
private clearFilterOrClose(): void {
|
|
275
345
|
if (this.filterText.length > 0) {
|
|
@@ -279,9 +349,29 @@ export class ListOverlayView implements Component {
|
|
|
279
349
|
this.onChange();
|
|
280
350
|
return;
|
|
281
351
|
}
|
|
352
|
+
if (this.options.explicitSearch && this.isFilterFocused) {
|
|
353
|
+
this.isFilterFocused = false;
|
|
354
|
+
this.onChange();
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
// An inner level is left before the overlay is. Drilling into a package's
|
|
358
|
+
// members and pressing Esc should return to the packages, not close the
|
|
359
|
+
// Library and lose the category, mode and scope the operator set.
|
|
360
|
+
if (this.options.onBack?.active()) {
|
|
361
|
+
this.options.onBack.back();
|
|
362
|
+
this.onChange();
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
282
365
|
this.options.onClose();
|
|
283
366
|
}
|
|
284
367
|
|
|
368
|
+
/** The verb Esc carries right now, following clearFilterOrClose exactly. */
|
|
369
|
+
private escapeVerb(): OverlayEscVerb {
|
|
370
|
+
if (this.filterText.length > 0) return "clear filter";
|
|
371
|
+
if (this.options.onBack?.active()) return "back";
|
|
372
|
+
return "close";
|
|
373
|
+
}
|
|
374
|
+
|
|
285
375
|
/**
|
|
286
376
|
* The tab entry a tabbed footer carries. The verb names the active tab and
|
|
287
377
|
* how many rows it holds, so the count a reader sees is the count of the tab
|
|
@@ -295,18 +385,26 @@ export class ListOverlayView implements Component {
|
|
|
295
385
|
}
|
|
296
386
|
|
|
297
387
|
getHint(): string {
|
|
388
|
+
if (this.options.explicitSearch && this.isFilterFocused) {
|
|
389
|
+
return buildHint(
|
|
390
|
+
[{ key: "Enter", verb: "back to list", critical: true }],
|
|
391
|
+
this.filterText.length > 0 ? "clear filter" : "back",
|
|
392
|
+
);
|
|
393
|
+
}
|
|
298
394
|
const tabEntry = this.tabHintEntry();
|
|
299
395
|
// A list with no rows has no row to select, invoke, or act on. Offering
|
|
300
396
|
// those keys anyway is the same lie the empty state exists to stop telling.
|
|
301
397
|
// A tab key is the exception: on an empty tab it is the way to a full one.
|
|
302
|
-
if (this.items.length === 0)
|
|
398
|
+
if (this.items.length === 0)
|
|
399
|
+
return buildHint([...(tabEntry ? [tabEntry] : []), ...(this.options.globalHints ?? [])], this.escapeVerb());
|
|
303
400
|
|
|
304
401
|
const hintEntries: HintEntry[] = [];
|
|
305
402
|
if (tabEntry) hintEntries.push(tabEntry);
|
|
306
403
|
hintEntries.push({ key: "↑↓", verb: "select" });
|
|
307
404
|
if (this.options.filterable) {
|
|
308
|
-
hintEntries.push(FILTER_HINT);
|
|
405
|
+
hintEntries.push(this.options.explicitSearch ? { key: "/", verb: "search", critical: true } : FILTER_HINT);
|
|
309
406
|
}
|
|
407
|
+
hintEntries.push(...(this.options.globalHints ?? []));
|
|
310
408
|
|
|
311
409
|
// Navigation before actions, which is the order a narrowing footer drops in:
|
|
312
410
|
// droppable entries go left to right, so the last one written is the last one
|
|
@@ -322,14 +420,18 @@ export class ListOverlayView implements Component {
|
|
|
322
420
|
hintEntries.push({ key: this.options.onSelect ? "Tab" : "Enter/Tab", verb: "detail" });
|
|
323
421
|
}
|
|
324
422
|
|
|
325
|
-
|
|
326
|
-
|
|
423
|
+
const hints =
|
|
424
|
+
typeof this.options.hints === "function"
|
|
425
|
+
? this.options.hints(this.filteredItems()[this.selectedIndex])
|
|
426
|
+
: this.options.hints;
|
|
427
|
+
if (hints) {
|
|
428
|
+
hintEntries.push(...hints);
|
|
327
429
|
}
|
|
328
430
|
|
|
329
431
|
// The footer follows clearFilterOrClose(). With a filter typed, Esc does
|
|
330
432
|
// not close, and saying it does sent operators out of an overlay they were
|
|
331
433
|
// still in and back in again to find out.
|
|
332
|
-
return buildHint(hintEntries, this.
|
|
434
|
+
return buildHint(hintEntries, this.escapeVerb());
|
|
333
435
|
}
|
|
334
436
|
|
|
335
437
|
private padLine(line: string, targetWidth: number): string {
|
|
@@ -391,7 +493,9 @@ export class ListOverlayView implements Component {
|
|
|
391
493
|
// A list with nothing in it and a filter that matched nothing are
|
|
392
494
|
// different states. Only the first one is the caller's empty state, and
|
|
393
495
|
// it wraps rather than truncating so a remedy survives a narrow pane.
|
|
394
|
-
const
|
|
496
|
+
const empty =
|
|
497
|
+
typeof this.options.emptyMessage === "function" ? this.options.emptyMessage() : this.options.emptyMessage;
|
|
498
|
+
const text = allItems.length === 0 ? (empty ?? "No matches found") : "No matches found";
|
|
395
499
|
for (const wrapped of wrapTextWithAnsi(text, Math.max(1, width - 2))) {
|
|
396
500
|
lines.push(this.padLine(clioTheme().fg("muted", ` ${wrapped}`), width));
|
|
397
501
|
}
|
|
@@ -426,7 +530,20 @@ export class ListOverlayView implements Component {
|
|
|
426
530
|
const prefix = isSelected ? theme.selectedPrefix(`${GLYPH.cursor} `) : " ";
|
|
427
531
|
const prefixLen = 2;
|
|
428
532
|
const availableWidth = width - prefixLen;
|
|
429
|
-
|
|
533
|
+
// The name comes first at every width. Metadata used to take whatever
|
|
534
|
+
// it wanted, so at 48 columns a row of origin, scope and state left
|
|
535
|
+
// the package name as a single ellipsis: a list of rows nobody could
|
|
536
|
+
// identify. The label keeps at least half the row, and the metadata
|
|
537
|
+
// compacts into what is left or drops out entirely.
|
|
538
|
+
const rawMeta = item.meta ?? "";
|
|
539
|
+
const reservedLabel = Math.min(visibleWidth(item.label), Math.max(8, Math.floor(availableWidth * 0.5)));
|
|
540
|
+
const maxMetaWidth = Math.max(0, availableWidth - reservedLabel - 2);
|
|
541
|
+
const metaStr =
|
|
542
|
+
rawMeta.length === 0 || maxMetaWidth === 0
|
|
543
|
+
? ""
|
|
544
|
+
: visibleWidth(rawMeta) > maxMetaWidth
|
|
545
|
+
? truncateToWidth(rawMeta, maxMetaWidth, ELLIPSIS, true)
|
|
546
|
+
: rawMeta;
|
|
430
547
|
const metaLen = metaStr ? visibleWidth(metaStr) : 0;
|
|
431
548
|
|
|
432
549
|
const maxLabelWidth = Math.max(1, availableWidth - (metaLen > 0 ? metaLen + 2 : 0));
|
|
@@ -497,8 +614,14 @@ export class ListOverlayView implements Component {
|
|
|
497
614
|
return padded;
|
|
498
615
|
}
|
|
499
616
|
|
|
617
|
+
/** Called by the mounted overlay's visibility callback before each render. */
|
|
618
|
+
setViewportRows(rows: number): void {
|
|
619
|
+
this.viewportRows = Math.max(1, Math.floor(rows));
|
|
620
|
+
}
|
|
621
|
+
|
|
500
622
|
render(width: number): string[] {
|
|
501
623
|
const filteredItems = this.filteredItems();
|
|
624
|
+
const status = this.options.status?.(width);
|
|
502
625
|
|
|
503
626
|
if (this.selectedIndex >= filteredItems.length) {
|
|
504
627
|
this.selectIndex(Math.max(0, filteredItems.length - 1));
|
|
@@ -515,6 +638,7 @@ export class ListOverlayView implements Component {
|
|
|
515
638
|
// overlay frame's childLines identity cache short-circuit the whole frame.
|
|
516
639
|
const memoKey = [
|
|
517
640
|
width,
|
|
641
|
+
this.options.fullScreen ? this.viewportRows : 0,
|
|
518
642
|
this.filterText,
|
|
519
643
|
this.selectedIndex,
|
|
520
644
|
this.isFilterFocused,
|
|
@@ -524,12 +648,14 @@ export class ListOverlayView implements Component {
|
|
|
524
648
|
this.inputEpoch,
|
|
525
649
|
this.itemsEpoch,
|
|
526
650
|
this.activeTabId,
|
|
651
|
+
status,
|
|
527
652
|
].join("|");
|
|
528
653
|
if (this.renderMemo?.key === memoKey) return this.renderMemo.lines;
|
|
529
654
|
|
|
530
655
|
const lines: string[] = [];
|
|
531
656
|
|
|
532
657
|
lines.push(...this.renderTabBar(width));
|
|
658
|
+
if (status !== undefined) lines.push(this.padLine(status, width));
|
|
533
659
|
|
|
534
660
|
if (this.options.filterable) {
|
|
535
661
|
this.input.focused = this.isFilterFocused;
|
|
@@ -537,8 +663,9 @@ export class ListOverlayView implements Component {
|
|
|
537
663
|
lines.push(...inputLines);
|
|
538
664
|
}
|
|
539
665
|
|
|
666
|
+
const availableRows = Math.max(1, this.viewportRows - 2 - lines.length);
|
|
540
667
|
if (isSplit) {
|
|
541
|
-
const listMaxLines = 14;
|
|
668
|
+
const listMaxLines = this.options.fullScreen ? availableRows : 14;
|
|
542
669
|
const detailWidth = Math.max(32, Math.floor(width * 0.45));
|
|
543
670
|
const listWidth = width - detailWidth - 1;
|
|
544
671
|
|
|
@@ -552,30 +679,62 @@ export class ListOverlayView implements Component {
|
|
|
552
679
|
lines.push(`${left}${separator}${right}`);
|
|
553
680
|
}
|
|
554
681
|
} else {
|
|
555
|
-
const
|
|
682
|
+
const showDetail = this.showDetail && hasDetail;
|
|
683
|
+
const listMaxLines = this.options.fullScreen
|
|
684
|
+
? showDetail
|
|
685
|
+
? Math.max(1, Math.floor((availableRows - 1) / 2))
|
|
686
|
+
: availableRows
|
|
687
|
+
: showDetail
|
|
688
|
+
? 6
|
|
689
|
+
: 12;
|
|
556
690
|
const listLines = this.renderList(width, listMaxLines, filteredItems, false);
|
|
557
691
|
lines.push(...listLines);
|
|
558
692
|
|
|
559
693
|
if (this.showDetail && hasDetail) {
|
|
560
694
|
lines.push(rule(clioTheme(), width));
|
|
561
|
-
const
|
|
695
|
+
const detailRows = this.options.fullScreen ? Math.max(1, availableRows - listMaxLines - 1) : 10;
|
|
696
|
+
const detailLines = this.renderDetail(width, detailRows, selectedItem);
|
|
562
697
|
lines.push(...detailLines);
|
|
563
698
|
}
|
|
564
699
|
}
|
|
565
700
|
|
|
701
|
+
if (this.options.fullScreen) {
|
|
702
|
+
while (lines.length < this.viewportRows - 2) lines.push(" ".repeat(width));
|
|
703
|
+
}
|
|
566
704
|
this.renderMemo = { key: memoKey, lines };
|
|
567
705
|
return lines;
|
|
568
706
|
}
|
|
569
707
|
|
|
570
708
|
private detailPaneVisible(): boolean {
|
|
571
|
-
return this.
|
|
709
|
+
return this.detailPaneDrawn;
|
|
572
710
|
}
|
|
573
711
|
|
|
712
|
+
get keyboardScope(): "edit" | "browse" {
|
|
713
|
+
return this.isFilterFocused ? "edit" : "browse";
|
|
714
|
+
}
|
|
715
|
+
undoInput(): boolean {
|
|
716
|
+
if (!this.isFilterFocused) return false;
|
|
717
|
+
this.input.applyEdit("undo");
|
|
718
|
+
this.filterText = this.input.getValue();
|
|
719
|
+
this.inputEpoch += 1;
|
|
720
|
+
this.selectIndex(0);
|
|
721
|
+
this.onChange();
|
|
722
|
+
return true;
|
|
723
|
+
}
|
|
574
724
|
handleInput(data: string): void {
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
725
|
+
data = localKey(data);
|
|
726
|
+
if (matchesKey(data, "escape")) {
|
|
727
|
+
this.clearFilterOrClose();
|
|
728
|
+
return;
|
|
729
|
+
}
|
|
730
|
+
if (this.options.filterable && this.options.explicitSearch && !this.isFilterFocused && data === "/") {
|
|
731
|
+
this.isFilterFocused = true;
|
|
732
|
+
this.onChange();
|
|
733
|
+
return;
|
|
734
|
+
}
|
|
735
|
+
// Explicit search owns its cursor arrows. Otherwise ←/→ switch tabs,
|
|
736
|
+
// matching the Settings Center's section navigation.
|
|
737
|
+
if (this.options.tabs && this.options.tabs.length > 0 && !(this.options.explicitSearch && this.isFilterFocused)) {
|
|
579
738
|
if (matchesKey(data, "left")) {
|
|
580
739
|
this.stepTab(-1);
|
|
581
740
|
return;
|
|
@@ -588,7 +747,7 @@ export class ListOverlayView implements Component {
|
|
|
588
747
|
|
|
589
748
|
// PgDn / Ctrl+D and PgUp / Ctrl+U scroll the detail pane, but only
|
|
590
749
|
// while one is visible; otherwise the keys fall through untouched.
|
|
591
|
-
if (this.detailPaneVisible()) {
|
|
750
|
+
if (this.detailPaneVisible() && !(this.options.explicitSearch && this.isFilterFocused)) {
|
|
592
751
|
if (data === "\x1b[6~" || data === "\x04") {
|
|
593
752
|
this.detailScrollOffset += 5;
|
|
594
753
|
this.onChange();
|
|
@@ -621,6 +780,11 @@ export class ListOverlayView implements Component {
|
|
|
621
780
|
return;
|
|
622
781
|
}
|
|
623
782
|
if (matchesKey(data, "enter") || data === "\n") {
|
|
783
|
+
if (this.options.explicitSearch) {
|
|
784
|
+
this.isFilterFocused = false;
|
|
785
|
+
this.onChange();
|
|
786
|
+
return;
|
|
787
|
+
}
|
|
624
788
|
if (this.options.onSelect) {
|
|
625
789
|
const selectedItem = filteredItems[this.selectedIndex];
|
|
626
790
|
if (selectedItem) {
|
|
@@ -642,22 +806,14 @@ export class ListOverlayView implements Component {
|
|
|
642
806
|
return;
|
|
643
807
|
}
|
|
644
808
|
|
|
645
|
-
// The footer advertises the action keys from the moment the overlay opens
|
|
646
|
-
// and the filter input holds focus then, so the first `d` an operator
|
|
647
|
-
// pressed in /interop landed in the filter box instead of declining the
|
|
648
|
-
// selected row. An empty query has nothing to narrow, so a bound key acts
|
|
649
|
-
// on the selection. Once a query is typed the letters belong to it, and
|
|
650
|
-
// ↑/↓ hands focus back to the list where the same keys act again.
|
|
651
|
-
if (this.filterText.length === 0 && data.length === 1 && this.runAction(data, filteredItems)) return;
|
|
652
|
-
|
|
653
809
|
this.inputEpoch += 1;
|
|
654
810
|
this.input.handleInput(data);
|
|
655
811
|
const next = this.input.getValue();
|
|
656
812
|
if (next !== this.filterText) {
|
|
657
813
|
this.filterText = next;
|
|
658
814
|
this.selectIndex(0);
|
|
659
|
-
this.onChange();
|
|
660
815
|
}
|
|
816
|
+
this.onChange();
|
|
661
817
|
} else {
|
|
662
818
|
if (matchesKey(data, "up") || data === "k") {
|
|
663
819
|
if (filteredItems.length > 0) {
|
|
@@ -697,7 +853,7 @@ export class ListOverlayView implements Component {
|
|
|
697
853
|
|
|
698
854
|
if (this.runAction(data, filteredItems)) return;
|
|
699
855
|
|
|
700
|
-
if (this.options.filterable && matchesKey(data, "backspace")) {
|
|
856
|
+
if (this.options.filterable && !this.options.explicitSearch && matchesKey(data, "backspace")) {
|
|
701
857
|
this.isFilterFocused = true;
|
|
702
858
|
this.inputEpoch += 1;
|
|
703
859
|
this.input.handleInput(data);
|
|
@@ -707,7 +863,7 @@ export class ListOverlayView implements Component {
|
|
|
707
863
|
return;
|
|
708
864
|
}
|
|
709
865
|
|
|
710
|
-
if (this.options.filterable && data.length === 1 && !matchesKey(data, "space")) {
|
|
866
|
+
if (this.options.filterable && !this.options.explicitSearch && data.length === 1 && !matchesKey(data, "space")) {
|
|
711
867
|
this.isFilterFocused = true;
|
|
712
868
|
this.inputEpoch += 1;
|
|
713
869
|
this.input.handleInput(data);
|
|
@@ -740,6 +896,10 @@ export interface ListOverlayHandle extends OverlayHandle {
|
|
|
740
896
|
setActiveTab(tabId: string): void;
|
|
741
897
|
/** The active tab's id, or the empty string on an untabbed overlay. */
|
|
742
898
|
activeTabId(): string;
|
|
899
|
+
/** Move the cursor onto a row by id; false when this view has no such row. */
|
|
900
|
+
selectById(id: string): boolean;
|
|
901
|
+
/** Show or hide the stacked detail pane. */
|
|
902
|
+
toggleDetail(): void;
|
|
743
903
|
}
|
|
744
904
|
|
|
745
905
|
/**
|
|
@@ -754,7 +914,17 @@ export function openListOverlay(tui: TUI, options: ListOverlayOptions & { marker
|
|
|
754
914
|
const view = new ListOverlayView(options, () => tui.requestRender());
|
|
755
915
|
const handle = showClioOverlayFrame(tui, view, {
|
|
756
916
|
anchor: "center",
|
|
757
|
-
width: 100,
|
|
917
|
+
width: options.fullScreen ? "100%" : 100,
|
|
918
|
+
...(options.fullScreen
|
|
919
|
+
? {
|
|
920
|
+
margin: 0,
|
|
921
|
+
maxHeight: "100%" as const,
|
|
922
|
+
visible: (_width: number, rows: number) => {
|
|
923
|
+
view.setViewportRows(rows);
|
|
924
|
+
return true;
|
|
925
|
+
},
|
|
926
|
+
}
|
|
927
|
+
: {}),
|
|
758
928
|
markerId: options.markerId,
|
|
759
929
|
// A function, not the string: on a tabbed overlay the title names the tab
|
|
760
930
|
// and must be re-read after every switch.
|
|
@@ -777,5 +947,14 @@ export function openListOverlay(tui: TUI, options: ListOverlayOptions & { marker
|
|
|
777
947
|
activeTabId(): string {
|
|
778
948
|
return view.activeTab()?.id ?? "";
|
|
779
949
|
},
|
|
950
|
+
selectById(id: string): boolean {
|
|
951
|
+
const found = view.selectById(id);
|
|
952
|
+
if (found) tui.requestRender();
|
|
953
|
+
return found;
|
|
954
|
+
},
|
|
955
|
+
toggleDetail(): void {
|
|
956
|
+
view.toggleDetail();
|
|
957
|
+
tui.requestRender();
|
|
958
|
+
},
|
|
780
959
|
});
|
|
781
960
|
}
|
|
@@ -24,6 +24,7 @@ import {
|
|
|
24
24
|
type Component,
|
|
25
25
|
fuzzyFilter,
|
|
26
26
|
getKeybindings,
|
|
27
|
+
Input,
|
|
27
28
|
matchesKey,
|
|
28
29
|
type OverlayHandle,
|
|
29
30
|
type SelectItem,
|
|
@@ -32,6 +33,7 @@ import {
|
|
|
32
33
|
visibleWidth,
|
|
33
34
|
wrapTextWithAnsi,
|
|
34
35
|
} from "../../engine/tui.js";
|
|
36
|
+
import { localKey } from "../keyboard-owner.js";
|
|
35
37
|
import {
|
|
36
38
|
buildHint,
|
|
37
39
|
clioError,
|
|
@@ -62,9 +64,6 @@ const RUNTIME_COL_WIDTH_NARROW = 10;
|
|
|
62
64
|
const RUNTIME_COL_WIDTH_MEDIUM = 14;
|
|
63
65
|
const RUNTIME_COL_WIDTH_WIDE = 18;
|
|
64
66
|
const SELECTED_PREFIX_WIDTH = 6;
|
|
65
|
-
const BACKSPACE = "\x7f";
|
|
66
|
-
const BACKSPACE_ALT = "\b";
|
|
67
|
-
const CTRL_U = "\x15";
|
|
68
67
|
const TAB = "\t";
|
|
69
68
|
|
|
70
69
|
function resolveOverlayWidth(terminalColumns: number): number {
|
|
@@ -814,6 +813,16 @@ interface ModelRefreshActions {
|
|
|
814
813
|
export class ModelOverlayView implements Component {
|
|
815
814
|
private selectedIndex = 0;
|
|
816
815
|
private query = "";
|
|
816
|
+
private readonly queryInput = new Input();
|
|
817
|
+
get keyboardScope(): "edit" | "browse" {
|
|
818
|
+
return this.query ? "edit" : "browse";
|
|
819
|
+
}
|
|
820
|
+
undoInput(): boolean {
|
|
821
|
+
this.queryInput.applyEdit("undo");
|
|
822
|
+
this.query = this.queryInput.getValue();
|
|
823
|
+
this.selectedIndex = 0;
|
|
824
|
+
return true;
|
|
825
|
+
}
|
|
817
826
|
private showAll = false;
|
|
818
827
|
private rows: ModelRow[];
|
|
819
828
|
private summary: ModelOverlaySummary;
|
|
@@ -890,23 +899,11 @@ export class ModelOverlayView implements Component {
|
|
|
890
899
|
this.selectedIndex = (this.selectedIndex + delta + count) % count;
|
|
891
900
|
}
|
|
892
901
|
|
|
893
|
-
private appendQuery(data: string): void {
|
|
894
|
-
this.selectionError = null;
|
|
895
|
-
this.query += data;
|
|
896
|
-
this.selectedIndex = 0;
|
|
897
|
-
}
|
|
898
|
-
|
|
899
|
-
private deleteQueryChar(): void {
|
|
900
|
-
if (this.query.length === 0) return;
|
|
901
|
-
this.selectionError = null;
|
|
902
|
-
this.query = this.query.slice(0, -1);
|
|
903
|
-
this.selectedIndex = 0;
|
|
904
|
-
}
|
|
905
|
-
|
|
906
902
|
private clearQuery(): void {
|
|
907
903
|
if (this.query.length === 0) return;
|
|
908
904
|
this.selectionError = null;
|
|
909
905
|
this.query = "";
|
|
906
|
+
this.queryInput.setValue("");
|
|
910
907
|
this.selectedIndex = 0;
|
|
911
908
|
}
|
|
912
909
|
|
|
@@ -980,7 +977,14 @@ export class ModelOverlayView implements Component {
|
|
|
980
977
|
invalidate(): void {}
|
|
981
978
|
|
|
982
979
|
handleInput(data: string): void {
|
|
980
|
+
data = localKey(data);
|
|
983
981
|
if (this.lifecycle.signal.aborted) return;
|
|
982
|
+
if (matchesKey(data, "escape")) {
|
|
983
|
+
if (this.query) this.clearQuery();
|
|
984
|
+
else this.onClose();
|
|
985
|
+
this.refreshActions.requestRender?.();
|
|
986
|
+
return;
|
|
987
|
+
}
|
|
984
988
|
const kb = getKeybindings();
|
|
985
989
|
if (kb.matches(data, "tui.select.up")) {
|
|
986
990
|
this.move(-1);
|
|
@@ -1022,14 +1026,6 @@ export class ModelOverlayView implements Component {
|
|
|
1022
1026
|
this.onClose();
|
|
1023
1027
|
return;
|
|
1024
1028
|
}
|
|
1025
|
-
if (data === BACKSPACE || data === BACKSPACE_ALT) {
|
|
1026
|
-
this.deleteQueryChar();
|
|
1027
|
-
return;
|
|
1028
|
-
}
|
|
1029
|
-
if (data === CTRL_U) {
|
|
1030
|
-
this.clearQuery();
|
|
1031
|
-
return;
|
|
1032
|
-
}
|
|
1033
1029
|
if (data === TAB) {
|
|
1034
1030
|
this.toggleShowAll();
|
|
1035
1031
|
return;
|
|
@@ -1046,7 +1042,14 @@ export class ModelOverlayView implements Component {
|
|
|
1046
1042
|
this.toggleFavorite();
|
|
1047
1043
|
return;
|
|
1048
1044
|
}
|
|
1049
|
-
|
|
1045
|
+
this.queryInput.handleInput(data);
|
|
1046
|
+
const next = this.queryInput.getValue();
|
|
1047
|
+
if (next !== this.query) {
|
|
1048
|
+
this.query = next;
|
|
1049
|
+
this.selectedIndex = 0;
|
|
1050
|
+
this.selectionError = null;
|
|
1051
|
+
this.refreshActions.requestRender?.();
|
|
1052
|
+
}
|
|
1050
1053
|
}
|
|
1051
1054
|
}
|
|
1052
1055
|
|
|
@@ -131,7 +131,13 @@ function createSessionOverlayBox(
|
|
|
131
131
|
let list = buildList(filtered);
|
|
132
132
|
let pendingEscape = "";
|
|
133
133
|
let pendingEscapeTimer: ReturnType<typeof setTimeout> | null = null;
|
|
134
|
-
const box = new FocusBox(
|
|
134
|
+
const box = new FocusBox(input, { onInput: handleInput }) as FocusBox & { dispose(): void };
|
|
135
|
+
box.undoInput = () => {
|
|
136
|
+
input.applyEdit("undo");
|
|
137
|
+
lastQuery = input.getValue();
|
|
138
|
+
applyFilter();
|
|
139
|
+
return true;
|
|
140
|
+
};
|
|
135
141
|
box.dispose = (): void => {
|
|
136
142
|
clearPendingEscape();
|
|
137
143
|
};
|
|
@@ -218,11 +224,11 @@ function createSessionOverlayBox(
|
|
|
218
224
|
moveSelectionByPage(1);
|
|
219
225
|
return;
|
|
220
226
|
}
|
|
221
|
-
if (
|
|
227
|
+
if (keybindings.matches(data, "tui.select.up") || keybindings.matches(data, "tui.select.down")) {
|
|
222
228
|
list.handleInput(data);
|
|
223
229
|
return;
|
|
224
230
|
}
|
|
225
|
-
if (
|
|
231
|
+
if (keybindings.matches(data, "tui.select.confirm") || data === "\n") {
|
|
226
232
|
list.handleInput(data);
|
|
227
233
|
return;
|
|
228
234
|
}
|