@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
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
type ThinkingLevel,
|
|
18
18
|
thinkingLevelChoiceLabel,
|
|
19
19
|
} from "../domains/providers/index.js";
|
|
20
|
-
import type {
|
|
20
|
+
import type { ResourcesContract } from "../domains/resources/index.js";
|
|
21
21
|
import { installSkill } from "../domains/resources/skills/marketplace.js";
|
|
22
22
|
import { foldDecisionBoard } from "../domains/session/decision-board.js";
|
|
23
23
|
import type { SessionContract, SessionEntry } from "../domains/session/index.js";
|
|
@@ -33,7 +33,7 @@ import type { ChatLoop } from "./chat-loop.js";
|
|
|
33
33
|
import { type ChatPanel, createChatPanel } from "./chat-panel.js";
|
|
34
34
|
import { rehydrateChatPanelFromTurns } from "./chat-renderer.js";
|
|
35
35
|
import { runCompactWithNotice } from "./command-fallbacks.js";
|
|
36
|
-
import { appendNotice, appendOperatorCommand } from "./command-output.js";
|
|
36
|
+
import { appendNotice, appendOperatorAside, appendOperatorCommand, appendReferenceCard } from "./command-output.js";
|
|
37
37
|
import { runOperatorRecall } from "./context-recall-command.js";
|
|
38
38
|
import { renderSessionHtml } from "./export-html/index.js";
|
|
39
39
|
import { dateLocal } from "./format-time.js";
|
|
@@ -44,6 +44,7 @@ import {
|
|
|
44
44
|
type CouncilDispatchOutcome,
|
|
45
45
|
dispatchSlashCommand,
|
|
46
46
|
type InitCommandOptions,
|
|
47
|
+
type LibraryBrowseRequest,
|
|
47
48
|
parseSlashCommand,
|
|
48
49
|
type RunIo,
|
|
49
50
|
type SettingsAreaId,
|
|
@@ -61,10 +62,12 @@ export interface InteractiveSlashSubmitExpansion {
|
|
|
61
62
|
images: ImageContent[];
|
|
62
63
|
workingContextPaths: string[];
|
|
63
64
|
pendingSkillRequests: PendingSkillRequest[];
|
|
65
|
+
/** The typed line and a template note to paint instead of `text`; see `InteractiveSubmitExpansion`. */
|
|
66
|
+
display?: { text: string; note: string };
|
|
64
67
|
}
|
|
65
68
|
|
|
66
69
|
type SlashChat = Pick<ChatLoop, "clearSkillSurface" | "getSessionId" | "isStreaming" | "submit">;
|
|
67
|
-
type SlashChatPanel = Pick<ChatPanel, "appendReplayBlock" | "appendUser"
|
|
70
|
+
type SlashChatPanel = Pick<ChatPanel, "appendReplayBlock" | "appendUser">;
|
|
68
71
|
type UserTurnStatus = import("./chat-panel.js").UserTurnStatus;
|
|
69
72
|
type SlashResources = Pick<ResourcesContract, "prompts" | "expandPromptTemplate" | "reload">;
|
|
70
73
|
type SlashExtensions = Pick<ExtensionsContract, "list">;
|
|
@@ -72,6 +75,9 @@ type SlashAgents = Pick<AgentsContract, "getSpec" | "listSpecs">;
|
|
|
72
75
|
type SlashShare = Pick<ShareContract, "writeArchive" | "planImport" | "importArchive">;
|
|
73
76
|
|
|
74
77
|
export interface InteractiveSlashRuntimeDeps {
|
|
78
|
+
keyboardActions?: SlashCommandContext["keyboardActions"];
|
|
79
|
+
operatorExtensions?: SlashCommandContext["operatorExtensions"];
|
|
80
|
+
showExtensionOutput?: SlashCommandContext["showExtensionOutput"];
|
|
75
81
|
io: RunIo;
|
|
76
82
|
bus: SafeEventBus;
|
|
77
83
|
dispatch: DispatchContract;
|
|
@@ -82,6 +88,7 @@ export interface InteractiveSlashRuntimeDeps {
|
|
|
82
88
|
resources?: SlashResources;
|
|
83
89
|
extensions?: SlashExtensions;
|
|
84
90
|
reloadExtensions?: SlashCommandContext["reloadExtensions"];
|
|
91
|
+
reloadPlugins?: SlashCommandContext["reloadPlugins"];
|
|
85
92
|
interop?: SlashCommandContext["interop"];
|
|
86
93
|
agents?: SlashAgents;
|
|
87
94
|
share?: SlashShare;
|
|
@@ -119,7 +126,7 @@ export interface InteractiveSlashRuntimeDeps {
|
|
|
119
126
|
session?: Pick<SessionContract, "tree" | "current" | "appendEntry">;
|
|
120
127
|
expandSubmit: (text: string) => Promise<InteractiveSlashSubmitExpansion>;
|
|
121
128
|
openAskUser: AskUserHandler;
|
|
122
|
-
openSkillsHub: (
|
|
129
|
+
openSkillsHub: (request?: LibraryBrowseRequest) => void;
|
|
123
130
|
openCost: () => void;
|
|
124
131
|
/** Run one `/btw` side question in its own overlay. */
|
|
125
132
|
openSideQuestion: (question: string) => void;
|
|
@@ -155,8 +162,6 @@ export interface InteractiveSlashRuntimeDeps {
|
|
|
155
162
|
openTree: () => void;
|
|
156
163
|
openMessagePicker: () => void;
|
|
157
164
|
openHelp: (query?: string) => void;
|
|
158
|
-
openAgents: () => void;
|
|
159
|
-
openPrompts: () => void;
|
|
160
165
|
openExtensions: () => void;
|
|
161
166
|
openInterop?: () => void;
|
|
162
167
|
openContextReset: () => void;
|
|
@@ -178,7 +183,6 @@ export interface InteractiveSlashRuntime {
|
|
|
178
183
|
}
|
|
179
184
|
|
|
180
185
|
/** Owns slash-command context construction and its asynchronous command state. */
|
|
181
|
-
const OUTPUT_VERBOSITIES: ReadonlyArray<ClioSettings["interface"]["outputDetail"]> = ["minimal", "default", "verbose"];
|
|
182
186
|
|
|
183
187
|
/** Thinking capability of the active orchestrator target and model, or null when unresolved. */
|
|
184
188
|
export function resolveThinkingCapability(
|
|
@@ -261,13 +265,22 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
|
|
|
261
265
|
// is in the ledger yet, and a refused preflight must not leave a row
|
|
262
266
|
// that reads like a committed turn (issue #251).
|
|
263
267
|
let rowStatus: UserTurnStatus = "pending";
|
|
264
|
-
if (!willQueue)
|
|
268
|
+
if (!willQueue) {
|
|
269
|
+
deps.chatPanel.appendUser(sub.display?.text ?? sub.text, () => rowStatus);
|
|
270
|
+
if (sub.display) {
|
|
271
|
+
appendOperatorAside(sub.display.note, {
|
|
272
|
+
appendReplayBlock: (renderBlock) => deps.chatPanel.appendReplayBlock(renderBlock),
|
|
273
|
+
requestRender: deps.requestRender,
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
}
|
|
265
277
|
deps.requestRender();
|
|
266
278
|
let acknowledgeAdmission = (): void => {};
|
|
267
279
|
const admitted = new Promise<void>((resolve) => {
|
|
268
280
|
acknowledgeAdmission = resolve;
|
|
269
281
|
});
|
|
270
282
|
const turn = deps.chat.submit(sub.text, {
|
|
283
|
+
...(sub.display ? { display: sub.display } : {}),
|
|
271
284
|
...(sub.images.length > 0 ? { images: sub.images } : {}),
|
|
272
285
|
...(sub.workingContextPaths.length > 0 ? { workingContextPaths: sub.workingContextPaths } : {}),
|
|
273
286
|
...(sub.pendingSkillRequests.length > 0 ? { pendingSkillRequests: sub.pendingSkillRequests } : {}),
|
|
@@ -311,6 +324,13 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
|
|
|
311
324
|
const admitChat = async (text: string, signal?: AbortSignal): Promise<void> => {
|
|
312
325
|
try {
|
|
313
326
|
signal?.throwIfAborted();
|
|
327
|
+
// submitChat can be called directly, bypassing command dispatch. Keep
|
|
328
|
+
// the reserved clear command ahead of skill lookup and installation.
|
|
329
|
+
const command = parseSlashCommand(text);
|
|
330
|
+
if (command.kind === "skill-surface-clear") {
|
|
331
|
+
dispatchSlashCommand(command, context);
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
314
334
|
const submitted = await deps.expandSubmit(text);
|
|
315
335
|
signal?.throwIfAborted();
|
|
316
336
|
const uninstalled = submitted.pendingSkillRequests.find((request) => !request.installed);
|
|
@@ -380,6 +400,12 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
|
|
|
380
400
|
requestRender: deps.requestRender,
|
|
381
401
|
});
|
|
382
402
|
},
|
|
403
|
+
showReference: (card) => {
|
|
404
|
+
appendReferenceCard(card, {
|
|
405
|
+
appendReplayBlock: (renderBlock) => deps.chatPanel.appendReplayBlock(renderBlock),
|
|
406
|
+
requestRender: deps.requestRender,
|
|
407
|
+
});
|
|
408
|
+
},
|
|
383
409
|
dispatch: deps.dispatch,
|
|
384
410
|
...(deps.getDecisionBoard ? { getDecisionBoard: deps.getDecisionBoard } : {}),
|
|
385
411
|
bus: deps.bus,
|
|
@@ -394,6 +420,9 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
|
|
|
394
420
|
openSkillsHub: deps.openSkillsHub,
|
|
395
421
|
clearSkillSurface: () => deps.chat.clearSkillSurface(),
|
|
396
422
|
listExtensions: () => deps.extensions?.list(cwd(), { all: true }) ?? [],
|
|
423
|
+
...(deps.keyboardActions ? { keyboardActions: deps.keyboardActions } : {}),
|
|
424
|
+
...(deps.operatorExtensions ? { operatorExtensions: deps.operatorExtensions } : {}),
|
|
425
|
+
...(deps.showExtensionOutput ? { showExtensionOutput: deps.showExtensionOutput } : {}),
|
|
397
426
|
listAgents: () => deps.agents?.listSpecs().filter((spec) => spec.audience !== "internal") ?? [],
|
|
398
427
|
listDelegationAgents: () => deps.getSettings?.().integrations.externalAgents.entries ?? [],
|
|
399
428
|
exportShareArchive: (outPath) => {
|
|
@@ -466,7 +495,7 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
|
|
|
466
495
|
if (!match) {
|
|
467
496
|
return { status: "unsupported", level, supported: supported.map(labelFor) };
|
|
468
497
|
}
|
|
469
|
-
// Session scope, like
|
|
498
|
+
// Session scope, like Alt+O: onSetThinkingLevel writes the level
|
|
470
499
|
// through to settings.yaml as the new default, which a slash command
|
|
471
500
|
// has no mandate to do.
|
|
472
501
|
if (deps.commitSetting) {
|
|
@@ -508,42 +537,6 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
|
|
|
508
537
|
if (selected) dispatchSlashCommand({ kind: "thinking-set", level: selected.value }, context);
|
|
509
538
|
});
|
|
510
539
|
},
|
|
511
|
-
setOutputVerbosity: (verbosity) => {
|
|
512
|
-
if (!deps.getSettings || !(deps.commitSetting || deps.writeSettings)) return { status: "unavailable" };
|
|
513
|
-
const requested = verbosity.trim().toLowerCase();
|
|
514
|
-
const match = OUTPUT_VERBOSITIES.find((candidate) => candidate === requested);
|
|
515
|
-
if (!match) return { status: "unsupported", verbosity, supported: OUTPUT_VERBOSITIES };
|
|
516
|
-
const next = structuredClone(deps.getSettings()) as ClioSettings;
|
|
517
|
-
next.interface.outputDetail = match;
|
|
518
|
-
// Session scope: /output changes this session and leaves settings.yaml
|
|
519
|
-
// alone. Saving it as the default is what Settings → Terminal is for.
|
|
520
|
-
if (deps.commitSetting) deps.commitSetting("interface.outputDetail", next, "session");
|
|
521
|
-
else deps.writeSettings?.(next);
|
|
522
|
-
// `/output` is also the explicit reset action for transcript folds. Do
|
|
523
|
-
// this even when the requested level already matches the current one;
|
|
524
|
-
// the render-time change detector cannot observe a same-value command.
|
|
525
|
-
deps.chatPanel.clearFoldOverrides();
|
|
526
|
-
deps.refreshFooter();
|
|
527
|
-
return { status: "applied", verbosity: match };
|
|
528
|
-
},
|
|
529
|
-
openOutputPicker: () => {
|
|
530
|
-
void deps
|
|
531
|
-
.openAskUser([
|
|
532
|
-
{
|
|
533
|
-
question: "Choose transcript detail for this session.",
|
|
534
|
-
header: "Output",
|
|
535
|
-
options: OUTPUT_VERBOSITIES.map((value) => ({
|
|
536
|
-
label: `${value[0]?.toUpperCase()}${value.slice(1)}`,
|
|
537
|
-
})),
|
|
538
|
-
},
|
|
539
|
-
])
|
|
540
|
-
.then((result) => {
|
|
541
|
-
if (result.cancelled) return;
|
|
542
|
-
const answer = result.answers[0]?.answer.toLowerCase();
|
|
543
|
-
const selected = OUTPUT_VERBOSITIES.find((value) => value === answer);
|
|
544
|
-
if (selected) dispatchSlashCommand({ kind: "output-set", verbosity: selected }, context);
|
|
545
|
-
});
|
|
546
|
-
},
|
|
547
540
|
openModel: deps.openModel,
|
|
548
541
|
providers: deps.providers,
|
|
549
542
|
applyModelRef: (ref) => {
|
|
@@ -568,10 +561,9 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
|
|
|
568
561
|
openTree: deps.openTree,
|
|
569
562
|
openMessagePicker: deps.openMessagePicker,
|
|
570
563
|
openHelp: deps.openHelp,
|
|
571
|
-
openAgents: deps.openAgents,
|
|
572
|
-
openPrompts: deps.openPrompts,
|
|
573
564
|
openExtensions: deps.openExtensions,
|
|
574
565
|
...(deps.reloadExtensions ? { reloadExtensions: deps.reloadExtensions } : {}),
|
|
566
|
+
...(deps.reloadPlugins ? { reloadPlugins: deps.reloadPlugins } : {}),
|
|
575
567
|
...(deps.openInterop ? { openInterop: deps.openInterop } : {}),
|
|
576
568
|
...(deps.interop ? { interop: deps.interop } : {}),
|
|
577
569
|
setEditorText: (text) => {
|
|
@@ -595,7 +587,7 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
|
|
|
595
587
|
// operator overrides, and rendered at a stable width. HTML converts
|
|
596
588
|
// the resulting ANSI presentation to inline styles; Markdown keeps the
|
|
597
589
|
// prior plain-text fenced transcript.
|
|
598
|
-
const exportPanel = createChatPanel({ unboundedToolBodies: true,
|
|
590
|
+
const exportPanel = createChatPanel({ unboundedToolBodies: true, getOutputStyle: () => "detailed" });
|
|
599
591
|
// Scoped to the leaf the session is on, the same way /resume replays
|
|
600
592
|
// (issue #107): with a /tree pin persisted and not yet extended, the
|
|
601
593
|
// file still holds the abandoned branch after the pin, and an unscoped
|
|
@@ -64,20 +64,27 @@ export interface PlatformKeybindingWarning {
|
|
|
64
64
|
|
|
65
65
|
export interface LeaderTarget {
|
|
66
66
|
key: string;
|
|
67
|
-
id:
|
|
67
|
+
id: Keybinding;
|
|
68
|
+
label?: string;
|
|
69
|
+
disabledReason?: string;
|
|
68
70
|
}
|
|
69
71
|
|
|
70
72
|
export interface ClioKeybindingManager {
|
|
71
73
|
matches(data: string, id: Keybinding): boolean;
|
|
72
74
|
getKeys(id: Keybinding): ReadonlyArray<KeyId>;
|
|
73
|
-
getDescription(id:
|
|
75
|
+
getDescription(id: Keybinding): string;
|
|
76
|
+
readonly generation: number;
|
|
77
|
+
reload(overrides: Readonly<Record<string, string | string[]>>): void;
|
|
78
|
+
onReload(listener: () => void): () => void;
|
|
79
|
+
isDisabled(id: Keybinding): boolean;
|
|
80
|
+
actionLabel(id: Keybinding): string;
|
|
74
81
|
getConflicts(): ReadonlyArray<KeybindingConflict>;
|
|
75
82
|
overrideCount(): number;
|
|
76
83
|
invalidCount(): number;
|
|
77
84
|
invalidBindings(): ReadonlyArray<InvalidKeybinding>;
|
|
78
85
|
platformWarnings(): ReadonlyArray<PlatformKeybindingWarning>;
|
|
79
86
|
leaderTargets(): ReadonlyArray<LeaderTarget>;
|
|
80
|
-
hotkeyEntries(): ReadonlyArray<{ id:
|
|
87
|
+
hotkeyEntries(): ReadonlyArray<{ id: Keybinding; keys: string; description: string; source: "default" | "user" }>;
|
|
81
88
|
}
|
|
82
89
|
|
|
83
90
|
const BASE_SPECIAL_KEYS = new Set([
|
|
@@ -156,6 +163,15 @@ const MODIFIERS = new Set(["ctrl", "shift", "alt", "super"]);
|
|
|
156
163
|
* attempt to exercise pi-tui's matcher; we just reject identifiers that
|
|
157
164
|
* would silently fail at match time.
|
|
158
165
|
*/
|
|
166
|
+
function canonicalKey(key: string): string {
|
|
167
|
+
const parts = key.toLowerCase().split("+");
|
|
168
|
+
let base = parts.pop() ?? "";
|
|
169
|
+
if (base === "esc") base = "escape";
|
|
170
|
+
if (base === "return") base = "enter";
|
|
171
|
+
const modifiers = ["ctrl", "alt", "shift", "super"].filter((mod) => parts.includes(mod));
|
|
172
|
+
return [...modifiers, base].join("+");
|
|
173
|
+
}
|
|
174
|
+
|
|
159
175
|
function isValidKeyId(keyId: unknown): boolean {
|
|
160
176
|
if (typeof keyId !== "string" || keyId.length === 0) return false;
|
|
161
177
|
const parts = keyId.toLowerCase().split("+");
|
|
@@ -192,10 +208,13 @@ export function validateKeybindings(raw: Readonly<Record<string, string | string
|
|
|
192
208
|
const valid: KeybindingsConfig = {};
|
|
193
209
|
const invalid: InvalidKeybinding[] = [];
|
|
194
210
|
for (const [id, value] of Object.entries(raw)) {
|
|
211
|
+
if (!Object.hasOwn(CLIO_KEYBINDINGS, id)) {
|
|
212
|
+
invalid.push({ id, keys: ["unknown action ID; use /help"] });
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
195
215
|
if (typeof value === "string") {
|
|
196
|
-
if (value.length === 0) continue;
|
|
197
216
|
if (isValidKeyId(value)) {
|
|
198
|
-
valid[id] = value as KeyId;
|
|
217
|
+
valid[id] = canonicalKey(value) as KeyId;
|
|
199
218
|
} else {
|
|
200
219
|
invalid.push({ id, keys: [value] });
|
|
201
220
|
}
|
|
@@ -205,14 +224,17 @@ export function validateKeybindings(raw: Readonly<Record<string, string | string
|
|
|
205
224
|
const accepted: KeyId[] = [];
|
|
206
225
|
const rejected: string[] = [];
|
|
207
226
|
for (const entry of value) {
|
|
208
|
-
if (typeof entry !== "string"
|
|
227
|
+
if (typeof entry !== "string") {
|
|
228
|
+
rejected.push(String(entry));
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
209
231
|
if (isValidKeyId(entry)) {
|
|
210
|
-
accepted.push(entry as KeyId);
|
|
232
|
+
accepted.push(canonicalKey(entry) as KeyId);
|
|
211
233
|
} else {
|
|
212
234
|
rejected.push(entry);
|
|
213
235
|
}
|
|
214
236
|
}
|
|
215
|
-
if (accepted.length > 0) valid[id] = accepted;
|
|
237
|
+
if (accepted.length > 0 || value.length === 0) valid[id] = accepted;
|
|
216
238
|
if (rejected.length > 0) invalid.push({ id, keys: rejected });
|
|
217
239
|
}
|
|
218
240
|
}
|
|
@@ -329,8 +351,10 @@ function keyUsesAltLetter(keyId: string): boolean {
|
|
|
329
351
|
|
|
330
352
|
function terminalReservedReason(keyId: string): string | null {
|
|
331
353
|
const key = normalizeKeyForRisk(keyId);
|
|
332
|
-
if (key === "ctrl+s"
|
|
333
|
-
|
|
354
|
+
if (key === "ctrl+s")
|
|
355
|
+
return "an intermediary may intercept this chord; Node raw mode normally disables terminal flow control";
|
|
356
|
+
if (key === "ctrl+z")
|
|
357
|
+
return "an intermediary may intercept this chord; Node raw mode normally disables signal generation";
|
|
334
358
|
return null;
|
|
335
359
|
}
|
|
336
360
|
|
|
@@ -342,7 +366,7 @@ function keyRiskReason(keyId: string, support: TerminalKeySupport): string | nul
|
|
|
342
366
|
return terminalReservedReason(key);
|
|
343
367
|
}
|
|
344
368
|
|
|
345
|
-
const MACOS_OPTION_DEFAULT_WARNING_ID = "clio.macos.option-letter.defaults";
|
|
369
|
+
const MACOS_OPTION_DEFAULT_WARNING_ID = "clio-coder.macos.option-letter.defaults";
|
|
346
370
|
|
|
347
371
|
export function detectPlatformKeybindingWarnings(
|
|
348
372
|
userBindings: Readonly<KeybindingsConfig>,
|
|
@@ -403,94 +427,147 @@ function joinKeys(keys: ReadonlyArray<KeyId>): string {
|
|
|
403
427
|
return keys.join(" / ");
|
|
404
428
|
}
|
|
405
429
|
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
430
|
+
const VIEWPORT_LEADER_TARGETS: LeaderTarget[] = [
|
|
431
|
+
{ key: "z", id: "tui.editor.undo" },
|
|
432
|
+
{ key: "r", id: "tui.altScreen.search" },
|
|
433
|
+
{ key: "p", id: "tui.altScreen.pageUp" },
|
|
434
|
+
{ key: "n", id: "tui.altScreen.pageDown" },
|
|
435
|
+
{ key: "home", id: "tui.altScreen.top" },
|
|
436
|
+
{ key: "end", id: "tui.altScreen.bottom" },
|
|
437
|
+
{ key: "", id: "tui.altScreen.previousPrompt" },
|
|
438
|
+
{ key: "", id: "tui.altScreen.nextPrompt" },
|
|
439
|
+
];
|
|
440
|
+
|
|
441
|
+
function keybindingScope(id: string): string {
|
|
442
|
+
if (id.startsWith("clio-coder.")) return "composer";
|
|
443
|
+
if (id.startsWith("tui.select.")) return "selection";
|
|
444
|
+
if (/tui.altScreen.search(Next|Previous|Close)/u.test(id)) return "search";
|
|
445
|
+
if (id.startsWith("tui.altScreen.")) return "fullscreen composer";
|
|
446
|
+
return "editable field";
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
function legacyKey(key: string): string {
|
|
450
|
+
const canonical = canonicalKey(key);
|
|
451
|
+
return (
|
|
452
|
+
({ "ctrl+i": "tab", "ctrl+m": "enter", "ctrl+[": "escape", "ctrl+_": "ctrl+-" } as Record<string, string>)[
|
|
453
|
+
canonical
|
|
454
|
+
] ?? canonical
|
|
455
|
+
);
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
/** Selection, search and editable input deliberately share delivered keys. */
|
|
459
|
+
function scopesOverlap(a: string, b: string): boolean {
|
|
460
|
+
const left = keybindingScope(a),
|
|
461
|
+
right = keybindingScope(b);
|
|
462
|
+
if (left === "selection" || right === "selection") return left === right;
|
|
463
|
+
if (left === "search" || right === "search") return left === right;
|
|
464
|
+
if (
|
|
465
|
+
(a === "clio-coder.exit" && b === "tui.editor.deleteCharForward") ||
|
|
466
|
+
(b === "clio-coder.exit" && a === "tui.editor.deleteCharForward")
|
|
467
|
+
)
|
|
468
|
+
return false;
|
|
469
|
+
return true;
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
function effectiveConflicts(inner: KeybindingsManager): KeybindingConflict[] {
|
|
473
|
+
const keys = new Map<string, string[]>();
|
|
474
|
+
for (const id of Object.keys(CLIO_KEYBINDINGS) as Keybinding[]) {
|
|
475
|
+
for (const key of inner.getKeys(id)) {
|
|
476
|
+
const canonical = legacyKey(key);
|
|
477
|
+
const ids = keys.get(canonical) ?? [];
|
|
478
|
+
if (!ids.includes(id)) ids.push(id);
|
|
479
|
+
keys.set(canonical, ids);
|
|
412
480
|
}
|
|
413
481
|
}
|
|
414
|
-
return
|
|
482
|
+
return [...keys]
|
|
483
|
+
.filter(
|
|
484
|
+
([, ids]) =>
|
|
485
|
+
ids.length > 1 && ids.some((id, index) => ids.slice(index + 1).some((other) => scopesOverlap(id, other))),
|
|
486
|
+
)
|
|
487
|
+
.map(([key, keybindings]) => ({
|
|
488
|
+
key: key as KeyId,
|
|
489
|
+
keybindings: keybindings.filter((id) => keybindings.some((other) => other !== id && scopesOverlap(id, other))),
|
|
490
|
+
}));
|
|
415
491
|
}
|
|
416
492
|
|
|
417
493
|
function buildManager(
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
494
|
+
overrides: Readonly<Record<string, string | string[]>>,
|
|
495
|
+
env: Readonly<Record<string, string | undefined>>,
|
|
496
|
+
install: boolean,
|
|
421
497
|
): ClioKeybindingManager {
|
|
422
|
-
|
|
423
|
-
const
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
498
|
+
let validated = validateKeybindings(overrides);
|
|
499
|
+
const inner = new KeybindingsManager(CLIO_KEYBINDINGS, validated.valid);
|
|
500
|
+
if (install) setKeybindings(inner);
|
|
501
|
+
let generation = 0;
|
|
502
|
+
const listeners = new Set<() => void>();
|
|
503
|
+
const isDisabled = (id: Keybinding): boolean => {
|
|
504
|
+
const value = inner.getUserBindings()[id];
|
|
505
|
+
return Array.isArray(value) && value.length === 0;
|
|
506
|
+
};
|
|
507
|
+
const leaderTargets = (): LeaderTarget[] => {
|
|
508
|
+
if (inner.getKeys("clio-coder.leader").length === 0) return [];
|
|
509
|
+
const app = CLIO_APP_KEYBINDING_IDS.flatMap((id) => {
|
|
510
|
+
const descriptor = CLIO_APP_KEYBINDINGS[id];
|
|
511
|
+
return "leader" in descriptor ? [{ key: descriptor.leader, id }] : [];
|
|
512
|
+
});
|
|
513
|
+
return [...app, ...VIEWPORT_LEADER_TARGETS].filter(({ id }) => !isDisabled(id));
|
|
514
|
+
};
|
|
515
|
+
const actionLabel = (id: Keybinding): string => {
|
|
516
|
+
const keys = inner.getKeys(id);
|
|
517
|
+
const suffix = leaderTargets().find((entry) => entry.id === id)?.key;
|
|
518
|
+
return (
|
|
519
|
+
[keys.join(" / "), suffix ? `${inner.getKeys("clio-coder.leader")[0]} ${suffix}` : ""].filter(Boolean).join(" · ") ||
|
|
520
|
+
"unbound; see /help"
|
|
521
|
+
);
|
|
522
|
+
};
|
|
431
523
|
return {
|
|
432
|
-
matches(data, id)
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
getDescription(id) {
|
|
439
|
-
return inner.getDefinition(id as Keybinding).description ?? "";
|
|
440
|
-
},
|
|
441
|
-
getConflicts() {
|
|
442
|
-
return inner.getConflicts();
|
|
443
|
-
},
|
|
444
|
-
overrideCount() {
|
|
445
|
-
return Object.keys(inner.getUserBindings()).length;
|
|
524
|
+
matches: (data, id) => inner.matches(data, id),
|
|
525
|
+
getKeys: (id) => inner.getKeys(id),
|
|
526
|
+
getDescription: (id) => inner.getDefinition(id).description ?? "",
|
|
527
|
+
getConflicts: () => effectiveConflicts(inner),
|
|
528
|
+
get generation() {
|
|
529
|
+
return generation;
|
|
446
530
|
},
|
|
447
|
-
|
|
448
|
-
|
|
531
|
+
reload(next) {
|
|
532
|
+
validated = validateKeybindings(next);
|
|
533
|
+
inner.setUserBindings(validated.valid);
|
|
534
|
+
if (install) setKeybindings(inner);
|
|
535
|
+
generation += 1;
|
|
536
|
+
for (const listener of listeners) listener();
|
|
449
537
|
},
|
|
450
|
-
|
|
451
|
-
|
|
538
|
+
onReload(listener) {
|
|
539
|
+
listeners.add(listener);
|
|
540
|
+
return () => {
|
|
541
|
+
listeners.delete(listener);
|
|
542
|
+
};
|
|
452
543
|
},
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
544
|
+
isDisabled,
|
|
545
|
+
actionLabel,
|
|
546
|
+
overrideCount: () => Object.keys(validated.valid).length,
|
|
547
|
+
invalidCount: () => validated.invalid.reduce((sum, entry) => sum + entry.keys.length, 0),
|
|
548
|
+
invalidBindings: () => validated.invalid,
|
|
549
|
+
platformWarnings: () => detectPlatformKeybindingWarnings(validated.valid, detectTerminalKeySupport(env)),
|
|
550
|
+
leaderTargets,
|
|
551
|
+
hotkeyEntries: () =>
|
|
552
|
+
(Object.keys(CLIO_KEYBINDINGS) as Keybinding[]).map((id) => ({
|
|
462
553
|
id,
|
|
463
|
-
keys: joinKeys(inner.getKeys(id
|
|
464
|
-
description: inner.getDefinition(id
|
|
465
|
-
source:
|
|
466
|
-
}))
|
|
467
|
-
},
|
|
554
|
+
keys: joinKeys(inner.getKeys(id)),
|
|
555
|
+
description: `${inner.getDefinition(id).description ?? ""} (${keybindingScope(id)}${isDisabled(id) ? "; disabled by user" : ""})${id === "tui.input.copy" ? "; composer Ctrl+C cancels; use native terminal clipboard" : ""}`,
|
|
556
|
+
source: validated.valid[id] === undefined ? "default" : "user",
|
|
557
|
+
})),
|
|
468
558
|
};
|
|
469
559
|
}
|
|
470
560
|
|
|
471
|
-
/**
|
|
472
|
-
* Build a `ClioKeybindingManager` from the provided settings snapshot. The
|
|
473
|
-
* resulting manager is also installed as pi-tui's global so editor and
|
|
474
|
-
* select components pick up the same overrides. Callers are expected to
|
|
475
|
-
* recreate the manager if `settings.interface.keybindings` is replaced wholesale;
|
|
476
|
-
* partial live updates should instead go through `manager` state.
|
|
477
|
-
*/
|
|
478
561
|
export function createKeybindingManager(
|
|
479
562
|
settings: Readonly<ClioSettings>,
|
|
480
|
-
env:
|
|
563
|
+
env: Readonly<Record<string, string | undefined>> = process.env,
|
|
481
564
|
): ClioKeybindingManager {
|
|
482
|
-
|
|
483
|
-
const inner = new KeybindingsManager(CLIO_KEYBINDINGS, valid);
|
|
484
|
-
setKeybindings(inner);
|
|
485
|
-
return buildManager(inner, invalid, detectPlatformKeybindingWarnings(valid, detectTerminalKeySupport(env)));
|
|
565
|
+
return buildManager(settings.interface.keybindings ?? {}, env, true);
|
|
486
566
|
}
|
|
487
567
|
|
|
488
|
-
/** Pure test hook: build a manager from a raw settings snapshot without touching the pi-tui global. */
|
|
489
568
|
export function createKeybindingManagerForTesting(
|
|
490
569
|
overrides: Readonly<Record<string, string | string[]>> = {},
|
|
491
|
-
env:
|
|
570
|
+
env: Readonly<Record<string, string | undefined>> = {},
|
|
492
571
|
): ClioKeybindingManager {
|
|
493
|
-
|
|
494
|
-
const inner = new KeybindingsManager(CLIO_KEYBINDINGS, valid);
|
|
495
|
-
return buildManager(inner, invalid, detectPlatformKeybindingWarnings(valid, detectTerminalKeySupport(env)));
|
|
572
|
+
return buildManager(overrides, env, false);
|
|
496
573
|
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type Component,
|
|
3
|
+
decodePrintableKey,
|
|
4
|
+
Editor,
|
|
5
|
+
Input,
|
|
6
|
+
type TUI,
|
|
7
|
+
TuiAltScreen,
|
|
8
|
+
TuiMainScreen,
|
|
9
|
+
} from "../engine/tui.js";
|
|
10
|
+
|
|
11
|
+
/** Internal focus contract for Clio's existing components and frame wrappers. */
|
|
12
|
+
export interface KeyboardOwner {
|
|
13
|
+
readonly keyboardScope?: "browse" | "edit" | "review";
|
|
14
|
+
undoInput?(): boolean;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function keyboardOwner(component: object | null): KeyboardOwner {
|
|
18
|
+
if (component instanceof Editor || component instanceof Input) {
|
|
19
|
+
return {
|
|
20
|
+
keyboardScope: "edit",
|
|
21
|
+
undoInput: () => {
|
|
22
|
+
component.applyEdit("undo");
|
|
23
|
+
return true;
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
return (component as KeyboardOwner | null) ?? {};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function focusedComponent(tui: TUI): Component | null {
|
|
31
|
+
return tui instanceof TuiAltScreen || tui instanceof TuiMainScreen ? tui.getFocusedComponent() : null;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Preserve controls and paste packets; normalize only encoded printable keys. */
|
|
35
|
+
export function localKey(data: string): string {
|
|
36
|
+
return data.includes("\x1b[200~") ? data : (decodePrintableKey(data) ?? data);
|
|
37
|
+
}
|
|
@@ -13,6 +13,7 @@ export interface LayoutParts {
|
|
|
13
13
|
export interface LayoutOptions {
|
|
14
14
|
mode?: TuiMode;
|
|
15
15
|
fullscreenScrollbar?: ScrollViewScrollbar;
|
|
16
|
+
onTranscript?: (view: ScrollView) => void;
|
|
16
17
|
}
|
|
17
18
|
|
|
18
19
|
export interface FullscreenLayout {
|
|
@@ -20,10 +21,7 @@ export interface FullscreenLayout {
|
|
|
20
21
|
transcript: ScrollView;
|
|
21
22
|
}
|
|
22
23
|
|
|
23
|
-
function buildFullscreenLayout(
|
|
24
|
-
parts: LayoutParts,
|
|
25
|
-
options: Pick<LayoutOptions, "fullscreenScrollbar"> = {},
|
|
26
|
-
): FullscreenLayout {
|
|
24
|
+
function buildFullscreenLayout(parts: LayoutParts, options: LayoutOptions = {}): FullscreenLayout {
|
|
27
25
|
const document = new Container();
|
|
28
26
|
document.addChild(parts.banner);
|
|
29
27
|
document.addChild(parts.chat);
|
|
@@ -36,6 +34,7 @@ function buildFullscreenLayout(
|
|
|
36
34
|
scrollbarTrackStyle: (text) => theme.fg("frame", text),
|
|
37
35
|
scrollbarThumbStyle: () => theme.fg("frameStrong", GLYPH.barFull),
|
|
38
36
|
});
|
|
37
|
+
options.onTranscript?.(transcript);
|
|
39
38
|
const dock = new VStack();
|
|
40
39
|
if (parts.pending) dock.addChild(parts.pending, { shrink: 1, minSize: 0 });
|
|
41
40
|
dock.addChild(parts.editor, { shrink: 1, minSize: 3 });
|
|
@@ -56,3 +55,29 @@ export function buildLayout(parts: LayoutParts, options: LayoutOptions = {}): Co
|
|
|
56
55
|
root.addChild(parts.footer);
|
|
57
56
|
return root;
|
|
58
57
|
}
|
|
58
|
+
|
|
59
|
+
/** Keep the nearest surviving text at the viewport when a preset changes row counts. */
|
|
60
|
+
export function preserveTranscriptScroll(view: ScrollView | undefined, width: number, mutation: () => void): void {
|
|
61
|
+
if (!view || view.isFollowingEnd) {
|
|
62
|
+
mutation();
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const top = view.scrollTop;
|
|
66
|
+
const before = view.render(width);
|
|
67
|
+
mutation();
|
|
68
|
+
const after = view.render(width);
|
|
69
|
+
for (let row = top; row < Math.min(before.length, top + view.viewportHeight); row++) {
|
|
70
|
+
const anchor = before[row];
|
|
71
|
+
if (!anchor?.trim()) continue;
|
|
72
|
+
let match = -1;
|
|
73
|
+
for (let index = 0; index < after.length; index++) {
|
|
74
|
+
if (after[index] === anchor && (match < 0 || Math.abs(index - row) < Math.abs(match - row))) match = index;
|
|
75
|
+
}
|
|
76
|
+
if (match >= 0) {
|
|
77
|
+
view.updateLayout(after.length, view.viewportHeight, () => {});
|
|
78
|
+
view.scrollTo(Math.max(0, match - (row - top)), { disableFollow: true });
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
view.scrollTo(top, { disableFollow: true });
|
|
83
|
+
}
|