@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
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
|
|
2
2
|
import {
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
evaluateClioCompatibility,
|
|
4
|
+
extensionContentDigest,
|
|
5
|
+
extensionContentDigestWithCapture
|
|
6
|
+
} from "./chunk-XW2UZICE.js";
|
|
5
7
|
import {
|
|
6
8
|
require_dist
|
|
7
9
|
} from "./chunk-B5GGDIHT.js";
|
|
@@ -19,236 +21,277 @@ import {
|
|
|
19
21
|
// src/domains/extensions/discovery.ts
|
|
20
22
|
init_esm_shims();
|
|
21
23
|
var import_yaml = __toESM(require_dist(), 1);
|
|
22
|
-
import { existsSync,
|
|
23
|
-
import
|
|
24
|
+
import { existsSync, readdirSync, readFileSync, realpathSync as realpathSync2, statSync } from "node:fs";
|
|
25
|
+
import path2 from "node:path";
|
|
24
26
|
|
|
25
|
-
// src/domains/extensions/
|
|
27
|
+
// src/domains/extensions/command-schema.ts
|
|
26
28
|
init_esm_shims();
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
var
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
29
|
+
import { lstatSync, realpathSync } from "node:fs";
|
|
30
|
+
import path from "node:path";
|
|
31
|
+
var TOOL_KEYS = /* @__PURE__ */ new Set([
|
|
32
|
+
"name",
|
|
33
|
+
"description",
|
|
34
|
+
"runtime",
|
|
35
|
+
"entrypoint",
|
|
36
|
+
"inputSchema",
|
|
37
|
+
"timeoutMs",
|
|
38
|
+
"maxOutputBytes"
|
|
39
|
+
]);
|
|
40
|
+
var SCHEMA_KEYS = /* @__PURE__ */ new Set([
|
|
41
|
+
"type",
|
|
42
|
+
"description",
|
|
43
|
+
"properties",
|
|
44
|
+
"required",
|
|
45
|
+
"additionalProperties",
|
|
46
|
+
"items",
|
|
47
|
+
"enum",
|
|
48
|
+
"minimum",
|
|
49
|
+
"maximum",
|
|
50
|
+
"minLength",
|
|
51
|
+
"maxLength",
|
|
52
|
+
"minItems",
|
|
53
|
+
"maxItems"
|
|
54
|
+
]);
|
|
55
|
+
var TYPES = /* @__PURE__ */ new Set(["object", "array", "string", "number", "integer", "boolean", "null"]);
|
|
56
|
+
function record(value) {
|
|
57
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
58
|
+
}
|
|
59
|
+
function extensionToolName(id, name) {
|
|
60
|
+
return `extension_${id}__${name}`;
|
|
61
|
+
}
|
|
62
|
+
function validateSchema(value, depth = 0) {
|
|
63
|
+
if (depth > 12 || !record(value))
|
|
64
|
+
throw new Error("inputSchema must be a JSON schema object with at most 12 nesting levels");
|
|
65
|
+
for (const key of Object.keys(value)) {
|
|
66
|
+
if (!SCHEMA_KEYS.has(key)) throw new Error(`unsupported inputSchema keyword '${key}'`);
|
|
67
|
+
}
|
|
68
|
+
if (typeof value.type !== "string" || !TYPES.has(value.type))
|
|
69
|
+
throw new Error("inputSchema.type must be a supported JSON type");
|
|
70
|
+
if (value.description !== void 0 && typeof value.description !== "string")
|
|
71
|
+
throw new Error("inputSchema.description must be a string");
|
|
72
|
+
if (value.enum !== void 0 && (!Array.isArray(value.enum) || value.enum.length === 0 || value.enum.some((item) => item !== null && typeof item === "object"))) {
|
|
73
|
+
throw new Error("inputSchema.enum must contain JSON scalar values");
|
|
74
|
+
}
|
|
75
|
+
for (const key of ["minimum", "maximum", "minLength", "maxLength", "minItems", "maxItems"]) {
|
|
76
|
+
if (value[key] !== void 0 && (typeof value[key] !== "number" || !Number.isFinite(value[key])))
|
|
77
|
+
throw new Error(`inputSchema.${key} must be finite`);
|
|
78
|
+
}
|
|
79
|
+
if (value.type === "object") {
|
|
80
|
+
if (!record(value.properties) || value.additionalProperties !== false)
|
|
81
|
+
throw new Error("object inputSchema requires properties and additionalProperties: false");
|
|
82
|
+
for (const [key, child] of Object.entries(value.properties)) {
|
|
83
|
+
if (["__proto__", "constructor", "prototype"].includes(key)) throw new Error("unsafe inputSchema property name");
|
|
84
|
+
validateSchema(child, depth + 1);
|
|
48
85
|
}
|
|
86
|
+
if (value.required !== void 0 && (!Array.isArray(value.required) || value.required.some((key) => typeof key !== "string" || !Object.hasOwn(value.properties, key)))) {
|
|
87
|
+
throw new Error("inputSchema.required must name declared properties");
|
|
88
|
+
}
|
|
89
|
+
} else if (value.type === "array") {
|
|
90
|
+
validateSchema(value.items, depth + 1);
|
|
49
91
|
}
|
|
50
|
-
return out;
|
|
51
92
|
}
|
|
52
|
-
function
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
if (
|
|
57
|
-
const
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
93
|
+
function parseExtensionCapabilities(value, id) {
|
|
94
|
+
if (!record(value) || Object.keys(value).some((key) => key !== "tools") || !Array.isArray(value.tools) || value.tools.length === 0 || value.tools.length > 32) {
|
|
95
|
+
throw new Error("capabilities must contain tools with between 1 and 32 command declarations");
|
|
96
|
+
}
|
|
97
|
+
if (id.includes("__")) throw new Error("v2 extension id cannot contain double underscores");
|
|
98
|
+
const names = /* @__PURE__ */ new Set();
|
|
99
|
+
const tools = value.tools.map((tool) => {
|
|
100
|
+
if (!record(tool)) throw new Error("capabilities.tools entries must be objects");
|
|
101
|
+
for (const key of Object.keys(tool)) if (!TOOL_KEYS.has(key)) throw new Error(`unknown command tool key '${key}'`);
|
|
102
|
+
if (typeof tool.name !== "string" || !/^[a-z][a-z0-9_]*$/.test(tool.name) || tool.name.includes("__"))
|
|
103
|
+
throw new Error("command tool name must use lowercase letters, digits, and single underscores");
|
|
104
|
+
const name = extensionToolName(id, tool.name);
|
|
105
|
+
if (name.length > 64 || !/^[a-zA-Z0-9_-]+$/.test(name))
|
|
106
|
+
throw new Error("qualified command tool name must use provider-safe characters and fit 64 characters");
|
|
107
|
+
if (names.has(name)) throw new Error(`duplicate command tool name '${name}'`);
|
|
108
|
+
names.add(name);
|
|
109
|
+
if (typeof tool.description !== "string" || tool.description.trim().length === 0 || tool.description.length > 2e3)
|
|
110
|
+
throw new Error("command tool description must contain 1 to 2000 characters");
|
|
111
|
+
if (tool.runtime !== "node" && tool.runtime !== "python3")
|
|
112
|
+
throw new Error("command tool runtime must be node or python3");
|
|
113
|
+
if (typeof tool.entrypoint !== "string" || tool.entrypoint.includes("\0") || tool.entrypoint.includes("\\") || path.isAbsolute(tool.entrypoint) || tool.entrypoint.split("/").some((part) => part === ".." || part === "." || part === ""))
|
|
114
|
+
throw new Error("command tool entrypoint must be a contained relative file path");
|
|
115
|
+
validateSchema(tool.inputSchema);
|
|
116
|
+
if (tool.inputSchema.type !== "object") throw new Error("command tool inputSchema root must be object");
|
|
117
|
+
for (const [key, maximum] of [
|
|
118
|
+
["timeoutMs", 3e5],
|
|
119
|
+
["maxOutputBytes", 1048576]
|
|
120
|
+
]) {
|
|
121
|
+
const limit = tool[key];
|
|
122
|
+
if (limit !== void 0 && (typeof limit !== "number" || !Number.isInteger(limit) || limit < 1 || limit > maximum))
|
|
123
|
+
throw new Error(`command tool ${key} must be between 1 and ${maximum}`);
|
|
124
|
+
}
|
|
125
|
+
return structuredClone(tool);
|
|
126
|
+
});
|
|
127
|
+
return { tools };
|
|
62
128
|
}
|
|
63
|
-
function
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
129
|
+
function resolveExtensionEntrypoint(root, entrypoint) {
|
|
130
|
+
const canonicalRoot = realpathSync(root);
|
|
131
|
+
let cursor = canonicalRoot;
|
|
132
|
+
for (const segment of entrypoint.split("/")) {
|
|
133
|
+
if (segment === ".." || segment === "." || segment.length === 0)
|
|
134
|
+
throw new Error("invalid command entrypoint segment");
|
|
135
|
+
cursor = path.join(cursor, segment);
|
|
136
|
+
if (lstatSync(cursor).isSymbolicLink()) throw new Error("command entrypoint cannot contain symbolic links");
|
|
137
|
+
}
|
|
138
|
+
const stat = lstatSync(cursor);
|
|
139
|
+
if (!stat.isFile() || stat.nlink !== 1) throw new Error("command entrypoint must be an ordinary file with one link");
|
|
140
|
+
const relative = path.relative(canonicalRoot, realpathSync(cursor));
|
|
141
|
+
if (relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative))
|
|
142
|
+
throw new Error("command entrypoint escapes extension root");
|
|
143
|
+
return cursor;
|
|
67
144
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
145
|
+
|
|
146
|
+
// src/domains/extensions/runtime-schema.ts
|
|
147
|
+
init_esm_shims();
|
|
148
|
+
import { stripVTControlCharacters } from "node:util";
|
|
149
|
+
var RUNTIME_LIMITS = {
|
|
150
|
+
processes: 4,
|
|
151
|
+
messageBytes: 96 * 1024,
|
|
152
|
+
outputBytes: 64 * 1024,
|
|
153
|
+
argumentBytes: 16 * 1024,
|
|
154
|
+
startupMs: 5e3,
|
|
155
|
+
commandMs: 3e4,
|
|
156
|
+
observationMs: 2e3,
|
|
157
|
+
disposeMs: 250,
|
|
158
|
+
diagnosticsBytes: 64 * 1024
|
|
159
|
+
};
|
|
160
|
+
function record2(value) {
|
|
161
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) throw new Error("expected an object");
|
|
162
|
+
return value;
|
|
85
163
|
}
|
|
86
|
-
function
|
|
87
|
-
|
|
88
|
-
if (typeof left === "number" && typeof right === "number") return left < right ? -1 : 1;
|
|
89
|
-
if (typeof left === "number") return -1;
|
|
90
|
-
if (typeof right === "number") return 1;
|
|
91
|
-
return left < right ? -1 : 1;
|
|
164
|
+
function keys(value, allowed) {
|
|
165
|
+
for (const key of Object.keys(value)) if (!allowed.includes(key)) throw new Error(`unknown runtime field '${key}'`);
|
|
92
166
|
}
|
|
93
|
-
function
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
if (left.prerelease.length === 0 || right.prerelease.length === 0) {
|
|
98
|
-
if (left.prerelease.length === right.prerelease.length) return 0;
|
|
99
|
-
return left.prerelease.length === 0 ? 1 : -1;
|
|
100
|
-
}
|
|
101
|
-
const length = Math.max(left.prerelease.length, right.prerelease.length);
|
|
102
|
-
for (let index = 0; index < length; index += 1) {
|
|
103
|
-
const leftPart = left.prerelease[index];
|
|
104
|
-
const rightPart = right.prerelease[index];
|
|
105
|
-
if (leftPart === void 0 || rightPart === void 0) {
|
|
106
|
-
if (leftPart === rightPart) return 0;
|
|
107
|
-
return leftPart === void 0 ? -1 : 1;
|
|
108
|
-
}
|
|
109
|
-
const order = compareIdentifiers(leftPart, rightPart);
|
|
110
|
-
if (order !== 0) return order;
|
|
111
|
-
}
|
|
112
|
-
return 0;
|
|
167
|
+
function string(value, max) {
|
|
168
|
+
if (typeof value !== "string" || value.length === 0 || value.length > max)
|
|
169
|
+
throw new Error(`expected text of 1-${max} characters`);
|
|
170
|
+
return value;
|
|
113
171
|
}
|
|
114
|
-
function
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
minor: partial.minor ?? 0,
|
|
118
|
-
patch: partial.patch ?? 0,
|
|
119
|
-
prerelease: partial.prerelease
|
|
120
|
-
};
|
|
172
|
+
function array(value, max) {
|
|
173
|
+
if (!Array.isArray(value) || value.length > max) throw new Error(`expected an array of at most ${max} entries`);
|
|
174
|
+
return value;
|
|
121
175
|
}
|
|
122
|
-
function
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
176
|
+
function choices(value, allowed) {
|
|
177
|
+
const entries = array(value ?? [], allowed.length).map((item) => {
|
|
178
|
+
if (!allowed.includes(item)) throw new Error(`unsupported runtime capability '${String(item)}'`);
|
|
179
|
+
return item;
|
|
180
|
+
});
|
|
181
|
+
if (new Set(entries).size !== entries.length) throw new Error("duplicate runtime capability");
|
|
182
|
+
return entries;
|
|
127
183
|
}
|
|
128
|
-
function
|
|
129
|
-
|
|
184
|
+
function parseExtensionRuntime(value) {
|
|
185
|
+
const raw = record2(value);
|
|
186
|
+
keys(raw, ["api", "entrypoint", "commands", "events", "ui"]);
|
|
187
|
+
if (raw.api !== 1) throw new Error("runtime.api must be 1");
|
|
188
|
+
const entrypoint = string(raw.entrypoint, 240);
|
|
189
|
+
if (!entrypoint.endsWith(".mjs")) throw new Error("runtime.entrypoint must be a shipped .mjs file");
|
|
190
|
+
const names = /* @__PURE__ */ new Set();
|
|
191
|
+
const commands = array(raw.commands ?? [], 32).map((value2) => {
|
|
192
|
+
const command = record2(value2);
|
|
193
|
+
keys(command, ["name", "description", "timeoutMs"]);
|
|
194
|
+
const name = string(command.name, 40);
|
|
195
|
+
if (!/^[a-z][a-z0-9_]*$/.test(name) || names.has(name))
|
|
196
|
+
throw new Error(`invalid or duplicate runtime command '${name}'`);
|
|
197
|
+
names.add(name);
|
|
198
|
+
const description = string(command.description, 240);
|
|
199
|
+
const timeoutMs = command.timeoutMs ?? RUNTIME_LIMITS.commandMs;
|
|
200
|
+
if (!Number.isInteger(timeoutMs) || Number(timeoutMs) < 100 || Number(timeoutMs) > 3e5)
|
|
201
|
+
throw new Error("runtime command timeoutMs must be 100-300000");
|
|
202
|
+
return { name, description, timeoutMs: Number(timeoutMs) };
|
|
203
|
+
});
|
|
204
|
+
return {
|
|
205
|
+
api: 1,
|
|
206
|
+
entrypoint,
|
|
207
|
+
commands,
|
|
208
|
+
events: choices(raw.events, ["session_open", "turn_end"]),
|
|
209
|
+
ui: choices(raw.ui, ["status", "panel"])
|
|
210
|
+
};
|
|
130
211
|
}
|
|
131
|
-
function
|
|
132
|
-
return (
|
|
212
|
+
function extensionPlainText(value) {
|
|
213
|
+
return stripVTControlCharacters(value).replace(
|
|
214
|
+
/[\p{Cc}\p{Cf}]/gu,
|
|
215
|
+
(char) => char === "\n" || char === " " ? char : ""
|
|
216
|
+
);
|
|
133
217
|
}
|
|
134
|
-
function
|
|
135
|
-
return
|
|
218
|
+
function text(value, max) {
|
|
219
|
+
if (value === "") return "";
|
|
220
|
+
return extensionPlainText(string(value, max));
|
|
136
221
|
}
|
|
137
|
-
function
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
const
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
222
|
+
function parseExtensionOutput(value, declaration) {
|
|
223
|
+
if (Buffer.byteLength(JSON.stringify(value) ?? "") > RUNTIME_LIMITS.outputBytes)
|
|
224
|
+
throw new Error("runtime output exceeds 64 KiB");
|
|
225
|
+
const raw = record2(value);
|
|
226
|
+
keys(raw, ["text", "status", "panel"]);
|
|
227
|
+
const output = { text: text(raw.text, 32768) };
|
|
228
|
+
if (raw.status !== void 0) {
|
|
229
|
+
if (!declaration.ui.includes("status")) throw new Error("runtime did not declare status UI");
|
|
230
|
+
if (raw.status === null) output.status = null;
|
|
231
|
+
else {
|
|
232
|
+
const status = record2(raw.status);
|
|
233
|
+
keys(status, ["text", "tone"]);
|
|
234
|
+
const parsed = { text: text(status.text, 160).replaceAll("\n", " ").replaceAll(" ", " ") };
|
|
235
|
+
if (status.tone !== void 0) {
|
|
236
|
+
const [tone] = choices([status.tone], ["neutral", "positive", "warning", "error"]);
|
|
237
|
+
if (tone) parsed.tone = tone;
|
|
238
|
+
}
|
|
239
|
+
output.status = parsed;
|
|
150
240
|
}
|
|
151
|
-
return { predicates: [(candidate) => compare(candidate, base) === 0], prereleaseCore };
|
|
152
|
-
}
|
|
153
|
-
if (operator === ">=") return { predicates: [lowerBound(base, true)], prereleaseCore };
|
|
154
|
-
if (operator === "<") return { predicates: [upperBound(base, false)], prereleaseCore };
|
|
155
|
-
if (operator === ">") {
|
|
156
|
-
return {
|
|
157
|
-
predicates: [wildcardUpper === null ? lowerBound(base, false) : lowerBound(wildcardUpper, true)],
|
|
158
|
-
prereleaseCore
|
|
159
|
-
};
|
|
160
241
|
}
|
|
161
|
-
if (
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
};
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
}
|
|
195
|
-
const normalized = raw.replace(/(<=|>=|<|>|=|~|\^)\s+/gu, "$1");
|
|
196
|
-
const tokens = normalized.split(/\s+/u).filter((entry) => entry.length > 0);
|
|
197
|
-
if (tokens.length === 0) return null;
|
|
198
|
-
const predicates = [];
|
|
199
|
-
const prereleaseCores = /* @__PURE__ */ new Set();
|
|
200
|
-
for (const token of tokens) {
|
|
201
|
-
const parsed = predicatesForToken(token);
|
|
202
|
-
if (parsed === null) return null;
|
|
203
|
-
predicates.push(...parsed.predicates);
|
|
204
|
-
if (parsed.prereleaseCore !== null) prereleaseCores.add(parsed.prereleaseCore);
|
|
242
|
+
if (raw.panel !== void 0) {
|
|
243
|
+
if (!declaration.ui.includes("panel")) throw new Error("runtime did not declare panel UI");
|
|
244
|
+
const panel = record2(raw.panel);
|
|
245
|
+
keys(panel, ["title", "sections"]);
|
|
246
|
+
const parsed = { title: text(panel.title, 120), sections: [] };
|
|
247
|
+
for (const value2 of array(panel.sections, 16)) {
|
|
248
|
+
const section = record2(value2);
|
|
249
|
+
if (section.kind === "text") {
|
|
250
|
+
keys(section, ["kind", "text"]);
|
|
251
|
+
parsed.sections.push({ kind: "text", text: text(section.text, 8192) });
|
|
252
|
+
} else if (section.kind === "metrics") {
|
|
253
|
+
keys(section, ["kind", "items"]);
|
|
254
|
+
parsed.sections.push({
|
|
255
|
+
kind: "metrics",
|
|
256
|
+
items: array(section.items, 32).map((value3) => {
|
|
257
|
+
const item = record2(value3);
|
|
258
|
+
keys(item, ["label", "value"]);
|
|
259
|
+
return { label: text(item.label, 120), value: text(item.value, 240) };
|
|
260
|
+
})
|
|
261
|
+
});
|
|
262
|
+
} else if (section.kind === "table") {
|
|
263
|
+
keys(section, ["kind", "columns", "rows"]);
|
|
264
|
+
const columns = array(section.columns, 8).map((value3) => text(value3, 80));
|
|
265
|
+
if (columns.length === 0) throw new Error("table needs columns");
|
|
266
|
+
const rows = array(section.rows, 100).map((row) => {
|
|
267
|
+
const cells = array(row, columns.length);
|
|
268
|
+
if (cells.length !== columns.length) throw new Error("table row width differs from columns");
|
|
269
|
+
return cells.map((value3) => text(value3, 240));
|
|
270
|
+
});
|
|
271
|
+
parsed.sections.push({ kind: "table", columns, rows });
|
|
272
|
+
} else throw new Error("unsupported panel section");
|
|
273
|
+
}
|
|
274
|
+
output.panel = parsed;
|
|
205
275
|
}
|
|
206
|
-
return
|
|
207
|
-
}
|
|
208
|
-
function parseRange(range) {
|
|
209
|
-
const trimmed = range.trim();
|
|
210
|
-
if (trimmed.length === 0 || trimmed.length > MAX_RANGE_CHARS) return null;
|
|
211
|
-
const sets = trimmed.split("||");
|
|
212
|
-
if (sets.some((set) => set.trim().length === 0)) return null;
|
|
213
|
-
const parsed = sets.map((set) => predicatesForSet(set.trim()));
|
|
214
|
-
return parsed.every((set) => set !== null) ? parsed : null;
|
|
276
|
+
return output;
|
|
215
277
|
}
|
|
216
|
-
function
|
|
217
|
-
return
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
return set.predicates.every((predicate) => predicate(candidate));
|
|
226
|
-
});
|
|
227
|
-
}
|
|
228
|
-
function evaluateClioCompatibility(range, runningVersion = getVersionInfo().clio) {
|
|
229
|
-
const rangeValid = isValidSemVerRange(range);
|
|
230
|
-
return {
|
|
231
|
-
rangeValid,
|
|
232
|
-
satisfied: rangeValid && satisfiesSemVerRange(runningVersion, range),
|
|
233
|
-
runningVersion
|
|
234
|
-
};
|
|
278
|
+
function extensionPanelText(panel) {
|
|
279
|
+
return [
|
|
280
|
+
panel.title,
|
|
281
|
+
...panel.sections.flatMap((section) => {
|
|
282
|
+
if (section.kind === "text") return [section.text];
|
|
283
|
+
if (section.kind === "metrics") return section.items.map((item) => `${item.label}: ${item.value}`);
|
|
284
|
+
return [section.columns.join(" | "), ...section.rows.map((row) => row.join(" | "))];
|
|
285
|
+
})
|
|
286
|
+
].join("\n\n");
|
|
235
287
|
}
|
|
236
288
|
|
|
237
289
|
// src/domains/extensions/discovery.ts
|
|
238
290
|
var MANIFEST_NAMES = ["clio-coder-extension.yaml", "clio-coder-extension.yml", "clio-coder-extension.json"];
|
|
239
|
-
var MANIFEST_KEYS = /* @__PURE__ */ new Set([
|
|
240
|
-
"manifestVersion",
|
|
241
|
-
"id",
|
|
242
|
-
"name",
|
|
243
|
-
"version",
|
|
244
|
-
"description",
|
|
245
|
-
"resources",
|
|
246
|
-
"tools",
|
|
247
|
-
"settings",
|
|
248
|
-
"compatibility"
|
|
249
|
-
]);
|
|
250
|
-
var RESOURCE_KEYS = /* @__PURE__ */ new Set(["skills", "prompts", "agents", "fleets", "themes"]);
|
|
291
|
+
var MANIFEST_KEYS = /* @__PURE__ */ new Set(["id", "name", "version", "description", "compatibility", "capabilities", "runtime"]);
|
|
251
292
|
var COMPATIBILITY_KEYS = /* @__PURE__ */ new Set(["clio"]);
|
|
293
|
+
var PLUGIN_OWNED_KEYS = /* @__PURE__ */ new Set(["resources", "skills", "prompts", "agents", "fleets", "themes"]);
|
|
294
|
+
var PLUGIN_GUIDANCE = "domain resources belong in a plugin: clio-coder library install <path>";
|
|
252
295
|
function compareNames(a, b) {
|
|
253
296
|
return a.name < b.name ? -1 : a.name > b.name ? 1 : 0;
|
|
254
297
|
}
|
|
@@ -279,168 +322,22 @@ function rejectUnknownKeys(value, allowed, label, manifestPath, diagnostics) {
|
|
|
279
322
|
}
|
|
280
323
|
}
|
|
281
324
|
}
|
|
282
|
-
function
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
diagnostics.push({ type: "error", message: "resources must be an object", path: manifestPath });
|
|
286
|
-
return {};
|
|
287
|
-
}
|
|
288
|
-
rejectUnknownKeys(value, RESOURCE_KEYS, "resources", manifestPath, diagnostics);
|
|
289
|
-
const out = {};
|
|
290
|
-
for (const kind of RESOURCE_KEYS) {
|
|
291
|
-
if (value[kind] === void 0) continue;
|
|
292
|
-
const resourcePath = trimString(value[kind]);
|
|
293
|
-
if (!resourcePath) {
|
|
294
|
-
diagnostics.push({
|
|
295
|
-
type: "error",
|
|
296
|
-
message: `resources.${kind} must be a non-empty string`,
|
|
297
|
-
path: manifestPath
|
|
298
|
-
});
|
|
299
|
-
continue;
|
|
300
|
-
}
|
|
301
|
-
out[kind] = resourcePath;
|
|
302
|
-
}
|
|
303
|
-
return out;
|
|
304
|
-
}
|
|
305
|
-
function contained(root, candidate) {
|
|
306
|
-
const relative = path.relative(root, candidate);
|
|
307
|
-
return relative === "" || !relative.startsWith(`..${path.sep}`) && relative !== ".." && !path.isAbsolute(relative);
|
|
308
|
-
}
|
|
309
|
-
function validateResourceTree(root, resourcePath, kind, diagnostics) {
|
|
310
|
-
if (path.isAbsolute(resourcePath)) {
|
|
311
|
-
diagnostics.push({ type: "error", message: `resources.${kind} must be relative`, path: resourcePath });
|
|
312
|
-
return;
|
|
313
|
-
}
|
|
314
|
-
const resolvedRoot = path.resolve(root);
|
|
315
|
-
const resolved = path.resolve(resolvedRoot, resourcePath);
|
|
316
|
-
if (!contained(resolvedRoot, resolved) || resolved === resolvedRoot) {
|
|
317
|
-
diagnostics.push({ type: "error", message: `resources.${kind} escapes the extension root`, path: resourcePath });
|
|
318
|
-
return;
|
|
319
|
-
}
|
|
320
|
-
let canonicalRoot;
|
|
321
|
-
let canonicalResource;
|
|
322
|
-
try {
|
|
323
|
-
canonicalRoot = realpathSync(resolvedRoot);
|
|
324
|
-
canonicalResource = realpathSync(resolved);
|
|
325
|
-
if (!statSync(resolved).isDirectory()) {
|
|
326
|
-
diagnostics.push({ type: "error", message: `resources.${kind} is not a directory`, path: resolved });
|
|
327
|
-
return;
|
|
328
|
-
}
|
|
329
|
-
} catch (error) {
|
|
325
|
+
function rejectManifestKeys(value, manifestPath, diagnostics) {
|
|
326
|
+
for (const key of Object.keys(value).sort()) {
|
|
327
|
+
if (MANIFEST_KEYS.has(key)) continue;
|
|
330
328
|
diagnostics.push({
|
|
331
329
|
type: "error",
|
|
332
|
-
message: `
|
|
333
|
-
path:
|
|
330
|
+
message: PLUGIN_OWNED_KEYS.has(key) ? `harness extensions cannot declare '${key}'; ${PLUGIN_GUIDANCE}` : `unknown manifest key '${key}'`,
|
|
331
|
+
path: manifestPath
|
|
334
332
|
});
|
|
335
|
-
return;
|
|
336
|
-
}
|
|
337
|
-
if (!contained(canonicalRoot, canonicalResource)) {
|
|
338
|
-
diagnostics.push({ type: "error", message: `resources.${kind} escapes through a symbolic link`, path: resolved });
|
|
339
|
-
return;
|
|
340
333
|
}
|
|
341
|
-
const pending = [resolved];
|
|
342
|
-
while (pending.length > 0) {
|
|
343
|
-
const directory = pending.pop();
|
|
344
|
-
if (!directory) continue;
|
|
345
|
-
for (const entry of readdirSync(directory, { withFileTypes: true }).sort(compareNames)) {
|
|
346
|
-
const candidate = path.join(directory, entry.name);
|
|
347
|
-
if (entry.isSymbolicLink()) {
|
|
348
|
-
try {
|
|
349
|
-
const canonicalTarget = realpathSync(candidate);
|
|
350
|
-
if (!contained(canonicalRoot, canonicalTarget)) {
|
|
351
|
-
diagnostics.push({
|
|
352
|
-
type: "error",
|
|
353
|
-
message: `resources.${kind} contains an escaping symbolic link`,
|
|
354
|
-
path: candidate
|
|
355
|
-
});
|
|
356
|
-
continue;
|
|
357
|
-
}
|
|
358
|
-
const targetStat = statSync(candidate);
|
|
359
|
-
if (!targetStat.isDirectory() && !targetStat.isFile()) {
|
|
360
|
-
diagnostics.push({
|
|
361
|
-
type: "error",
|
|
362
|
-
message: `resources.${kind} contains a symbolic link to an unsupported filesystem entry`,
|
|
363
|
-
path: candidate
|
|
364
|
-
});
|
|
365
|
-
} else if (targetStat.isFile() && targetStat.nlink !== 1) {
|
|
366
|
-
diagnostics.push({
|
|
367
|
-
type: "error",
|
|
368
|
-
message: `resources.${kind} contains a symbolic link to a hard-linked file`,
|
|
369
|
-
path: candidate
|
|
370
|
-
});
|
|
371
|
-
}
|
|
372
|
-
} catch (error) {
|
|
373
|
-
diagnostics.push({
|
|
374
|
-
type: "error",
|
|
375
|
-
message: `resources.${kind} contains an unresolved symbolic link: ${error instanceof Error ? error.message : String(error)}`,
|
|
376
|
-
path: candidate
|
|
377
|
-
});
|
|
378
|
-
}
|
|
379
|
-
} else if (entry.isDirectory()) {
|
|
380
|
-
pending.push(candidate);
|
|
381
|
-
} else if (entry.isFile()) {
|
|
382
|
-
try {
|
|
383
|
-
if (lstatSync(candidate).nlink !== 1) {
|
|
384
|
-
diagnostics.push({
|
|
385
|
-
type: "error",
|
|
386
|
-
message: `resources.${kind} contains a hard-linked file`,
|
|
387
|
-
path: candidate
|
|
388
|
-
});
|
|
389
|
-
}
|
|
390
|
-
} catch (error) {
|
|
391
|
-
diagnostics.push({
|
|
392
|
-
type: "error",
|
|
393
|
-
message: `resources.${kind} entry could not be inspected: ${error instanceof Error ? error.message : String(error)}`,
|
|
394
|
-
path: candidate
|
|
395
|
-
});
|
|
396
|
-
}
|
|
397
|
-
} else {
|
|
398
|
-
diagnostics.push({
|
|
399
|
-
type: "error",
|
|
400
|
-
message: `resources.${kind} contains an unsupported filesystem entry`,
|
|
401
|
-
path: candidate
|
|
402
|
-
});
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
function validateResourceRoots(root, resources, diagnostics) {
|
|
408
|
-
for (const [kind, resourcePath] of Object.entries(resources)) {
|
|
409
|
-
if (resourcePath) validateResourceTree(root, resourcePath, kind, diagnostics);
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
function stringArray(value, field, manifestPath, diagnostics) {
|
|
413
|
-
if (value === void 0) return void 0;
|
|
414
|
-
if (!Array.isArray(value)) {
|
|
415
|
-
diagnostics.push({ type: "error", message: `${field} must be an array of non-empty strings`, path: manifestPath });
|
|
416
|
-
return void 0;
|
|
417
|
-
}
|
|
418
|
-
const out = [];
|
|
419
|
-
const seen = /* @__PURE__ */ new Set();
|
|
420
|
-
for (const entry of value) {
|
|
421
|
-
const parsed = trimString(entry);
|
|
422
|
-
if (!parsed) {
|
|
423
|
-
diagnostics.push({ type: "error", message: `${field} must contain only non-empty strings`, path: manifestPath });
|
|
424
|
-
continue;
|
|
425
|
-
}
|
|
426
|
-
if (seen.has(parsed)) {
|
|
427
|
-
diagnostics.push({ type: "error", message: `${field} contains duplicate entry '${parsed}'`, path: manifestPath });
|
|
428
|
-
continue;
|
|
429
|
-
}
|
|
430
|
-
seen.add(parsed);
|
|
431
|
-
out.push(parsed);
|
|
432
|
-
}
|
|
433
|
-
return out.length > 0 ? out : void 0;
|
|
434
334
|
}
|
|
435
335
|
function parseExtensionManifest(value, manifestPath) {
|
|
436
336
|
const diagnostics = [];
|
|
437
337
|
if (!isRecord(value)) {
|
|
438
338
|
return { diagnostics: [{ type: "error", message: "extension manifest must be an object", path: manifestPath }] };
|
|
439
339
|
}
|
|
440
|
-
|
|
441
|
-
if (value.manifestVersion !== 1) {
|
|
442
|
-
diagnostics.push({ type: "error", message: "manifestVersion must be 1", path: manifestPath });
|
|
443
|
-
}
|
|
340
|
+
rejectManifestKeys(value, manifestPath, diagnostics);
|
|
444
341
|
const id = trimString(value.id);
|
|
445
342
|
const name = trimString(value.name) ?? id;
|
|
446
343
|
const version = trimString(value.version);
|
|
@@ -452,9 +349,30 @@ function parseExtensionManifest(value, manifestPath) {
|
|
|
452
349
|
}
|
|
453
350
|
if (!version) diagnostics.push({ type: "error", message: "version is required", path: manifestPath });
|
|
454
351
|
if (!description) diagnostics.push({ type: "error", message: "description is required", path: manifestPath });
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
352
|
+
let capabilities;
|
|
353
|
+
let runtime;
|
|
354
|
+
if (value.runtime !== void 0) {
|
|
355
|
+
try {
|
|
356
|
+
runtime = parseExtensionRuntime(value.runtime);
|
|
357
|
+
} catch (error) {
|
|
358
|
+
diagnostics.push({
|
|
359
|
+
type: "error",
|
|
360
|
+
message: error instanceof Error ? error.message : String(error),
|
|
361
|
+
path: manifestPath
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
if (value.capabilities !== void 0) {
|
|
366
|
+
try {
|
|
367
|
+
capabilities = parseExtensionCapabilities(value.capabilities, id ?? "");
|
|
368
|
+
} catch (error) {
|
|
369
|
+
diagnostics.push({
|
|
370
|
+
type: "error",
|
|
371
|
+
message: error instanceof Error ? error.message : String(error),
|
|
372
|
+
path: manifestPath
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
}
|
|
458
376
|
let compatibility;
|
|
459
377
|
if (value.compatibility !== void 0) {
|
|
460
378
|
if (!isRecord(value.compatibility)) {
|
|
@@ -489,16 +407,9 @@ function parseExtensionManifest(value, manifestPath) {
|
|
|
489
407
|
if (!id || !name || !version || !description || diagnostics.some((diag) => diag.type === "error")) {
|
|
490
408
|
return { diagnostics };
|
|
491
409
|
}
|
|
492
|
-
const manifest = {
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
name,
|
|
496
|
-
version,
|
|
497
|
-
description,
|
|
498
|
-
resources
|
|
499
|
-
};
|
|
500
|
-
if (tools) manifest.tools = tools;
|
|
501
|
-
if (settings) manifest.settings = settings;
|
|
410
|
+
const manifest = { id, name, version, description };
|
|
411
|
+
if (runtime) manifest.runtime = runtime;
|
|
412
|
+
if (capabilities) manifest.capabilities = capabilities;
|
|
502
413
|
if (compatibility && Object.keys(compatibility).length > 0) manifest.compatibility = compatibility;
|
|
503
414
|
const clioRange = manifest.compatibility?.clio;
|
|
504
415
|
if (clioRange !== void 0) {
|
|
@@ -515,7 +426,7 @@ function parseExtensionManifest(value, manifestPath) {
|
|
|
515
426
|
}
|
|
516
427
|
function findExtensionManifestPath(root) {
|
|
517
428
|
for (const name of MANIFEST_NAMES) {
|
|
518
|
-
const candidate =
|
|
429
|
+
const candidate = path2.join(root, name);
|
|
519
430
|
try {
|
|
520
431
|
if (statSync(candidate).isFile()) return candidate;
|
|
521
432
|
} catch {
|
|
@@ -534,7 +445,28 @@ function loadManifestFromRoot(root) {
|
|
|
534
445
|
}
|
|
535
446
|
try {
|
|
536
447
|
const parsed = parseExtensionManifest(readJsonOrYaml(manifestPath), manifestPath);
|
|
537
|
-
if (parsed.manifest)
|
|
448
|
+
if (parsed.manifest?.runtime) {
|
|
449
|
+
try {
|
|
450
|
+
resolveExtensionEntrypoint(root, parsed.manifest.runtime.entrypoint);
|
|
451
|
+
} catch (error) {
|
|
452
|
+
parsed.diagnostics.push({
|
|
453
|
+
type: "error",
|
|
454
|
+
message: `runtime: ${error instanceof Error ? error.message : String(error)}`,
|
|
455
|
+
path: manifestPath
|
|
456
|
+
});
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
for (const tool of parsed.manifest?.capabilities?.tools ?? []) {
|
|
460
|
+
try {
|
|
461
|
+
resolveExtensionEntrypoint(root, tool.entrypoint);
|
|
462
|
+
} catch (error) {
|
|
463
|
+
parsed.diagnostics.push({
|
|
464
|
+
type: "error",
|
|
465
|
+
message: `command tool ${tool.name}: ${error instanceof Error ? error.message : String(error)}`,
|
|
466
|
+
path: manifestPath
|
|
467
|
+
});
|
|
468
|
+
}
|
|
469
|
+
}
|
|
538
470
|
return {
|
|
539
471
|
path: root,
|
|
540
472
|
manifestPath,
|
|
@@ -553,7 +485,7 @@ function loadManifestFromRoot(root) {
|
|
|
553
485
|
}
|
|
554
486
|
}
|
|
555
487
|
function discoverExtensionPackages(root) {
|
|
556
|
-
const full =
|
|
488
|
+
const full = path2.resolve(root);
|
|
557
489
|
if (!existsSync(full)) {
|
|
558
490
|
return [{ path: full, valid: false, diagnostics: [{ type: "error", message: "path does not exist", path: full }] }];
|
|
559
491
|
}
|
|
@@ -586,7 +518,7 @@ function discoverExtensionPackages(root) {
|
|
|
586
518
|
}
|
|
587
519
|
let canonicalFull;
|
|
588
520
|
try {
|
|
589
|
-
canonicalFull =
|
|
521
|
+
canonicalFull = realpathSync2(full);
|
|
590
522
|
} catch (error) {
|
|
591
523
|
return [
|
|
592
524
|
{
|
|
@@ -627,10 +559,10 @@ function discoverExtensionPackages(root) {
|
|
|
627
559
|
}
|
|
628
560
|
for (const entry of entries.sort(compareNames)) {
|
|
629
561
|
if (entry.name.startsWith(".")) continue;
|
|
630
|
-
const child =
|
|
562
|
+
const child = path2.join(canonicalFull, entry.name);
|
|
631
563
|
try {
|
|
632
564
|
if (!entry.isDirectory() && !(entry.isSymbolicLink() && statSync(child).isDirectory())) continue;
|
|
633
|
-
const canonicalChild =
|
|
565
|
+
const canonicalChild = realpathSync2(child);
|
|
634
566
|
const spellings = spellingsByCanonicalRoot.get(canonicalChild) ?? [];
|
|
635
567
|
spellings.push(child);
|
|
636
568
|
spellingsByCanonicalRoot.set(canonicalChild, spellings);
|
|
@@ -688,163 +620,9 @@ function discoverExtensionPackages(root) {
|
|
|
688
620
|
|
|
689
621
|
// src/domains/extensions/state.ts
|
|
690
622
|
init_esm_shims();
|
|
691
|
-
import { createHash as createHash2 } from "node:crypto";
|
|
692
|
-
import {
|
|
693
|
-
cpSync,
|
|
694
|
-
existsSync as existsSync2,
|
|
695
|
-
lstatSync as lstatSync3,
|
|
696
|
-
mkdirSync,
|
|
697
|
-
readdirSync as readdirSync3,
|
|
698
|
-
readFileSync as readFileSync3,
|
|
699
|
-
realpathSync as realpathSync3,
|
|
700
|
-
renameSync,
|
|
701
|
-
rmSync
|
|
702
|
-
} from "node:fs";
|
|
703
|
-
import path3 from "node:path";
|
|
704
|
-
|
|
705
|
-
// src/domains/extensions/integrity.ts
|
|
706
|
-
init_esm_shims();
|
|
707
623
|
import { createHash } from "node:crypto";
|
|
708
|
-
import {
|
|
709
|
-
|
|
710
|
-
constants,
|
|
711
|
-
fstatSync,
|
|
712
|
-
lstatSync as lstatSync2,
|
|
713
|
-
openSync,
|
|
714
|
-
readdirSync as readdirSync2,
|
|
715
|
-
readFileSync as readFileSync2,
|
|
716
|
-
readlinkSync,
|
|
717
|
-
realpathSync as realpathSync2
|
|
718
|
-
} from "node:fs";
|
|
719
|
-
import path2 from "node:path";
|
|
720
|
-
function contained2(root, candidate) {
|
|
721
|
-
const relative = path2.relative(root, candidate);
|
|
722
|
-
return relative === "" || !relative.startsWith(`..${path2.sep}`) && relative !== ".." && !path2.isAbsolute(relative);
|
|
723
|
-
}
|
|
724
|
-
function digestFrame(hash, kind, relativePath, payload) {
|
|
725
|
-
const header = Buffer.from(
|
|
726
|
-
`${kind}\0${relativePath.replaceAll(path2.sep, "/")}\0${payload?.byteLength ?? 0}\0`,
|
|
727
|
-
"utf8"
|
|
728
|
-
);
|
|
729
|
-
hash.update(header);
|
|
730
|
-
if (payload) hash.update(payload);
|
|
731
|
-
hash.update("\0");
|
|
732
|
-
}
|
|
733
|
-
function sameFileState(left, right) {
|
|
734
|
-
return left.dev === right.dev && left.ino === right.ino && left.mode === right.mode && left.nlink === right.nlink && left.size === right.size && left.mtimeMs === right.mtimeMs && left.ctimeMs === right.ctimeMs;
|
|
735
|
-
}
|
|
736
|
-
function readStableRegularFile(filePath, inspected) {
|
|
737
|
-
const fd = openSync(filePath, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0));
|
|
738
|
-
try {
|
|
739
|
-
const opened = fstatSync(fd);
|
|
740
|
-
if (!opened.isFile() || opened.nlink !== 1 || !sameFileState(inspected, opened)) {
|
|
741
|
-
throw new Error(`extension file changed while being opened: ${filePath}`);
|
|
742
|
-
}
|
|
743
|
-
const payload = readFileSync2(fd);
|
|
744
|
-
if (!sameFileState(opened, fstatSync(fd))) {
|
|
745
|
-
throw new Error(`extension file changed while being hashed: ${filePath}`);
|
|
746
|
-
}
|
|
747
|
-
return payload;
|
|
748
|
-
} finally {
|
|
749
|
-
closeSync(fd);
|
|
750
|
-
}
|
|
751
|
-
}
|
|
752
|
-
function readStableContainedLink(linkPath, inspected, canonicalRoot) {
|
|
753
|
-
const canonicalTarget = realpathSync2(linkPath);
|
|
754
|
-
if (!contained2(canonicalRoot, canonicalTarget)) {
|
|
755
|
-
throw new Error(`symbolic link escapes the extension root: ${linkPath}`);
|
|
756
|
-
}
|
|
757
|
-
const target = readlinkSync(linkPath);
|
|
758
|
-
const after = lstatSync2(linkPath);
|
|
759
|
-
if (!after.isSymbolicLink() || !sameFileState(inspected, after)) {
|
|
760
|
-
throw new Error(`symbolic link changed while being hashed: ${linkPath}`);
|
|
761
|
-
}
|
|
762
|
-
const canonicalAfter = realpathSync2(linkPath);
|
|
763
|
-
if (canonicalAfter !== canonicalTarget || !contained2(canonicalRoot, canonicalAfter)) {
|
|
764
|
-
throw new Error(`symbolic link changed or escapes the extension root: ${linkPath}`);
|
|
765
|
-
}
|
|
766
|
-
return Buffer.from(target, "utf8");
|
|
767
|
-
}
|
|
768
|
-
function assertStableDirectory(directoryPath, inspected, canonicalDirectory, canonicalRoot, expectedEntries) {
|
|
769
|
-
const after = lstatSync2(directoryPath);
|
|
770
|
-
if (!after.isDirectory() || !sameFileState(inspected, after)) {
|
|
771
|
-
throw new Error(`extension directory changed while being hashed: ${directoryPath}`);
|
|
772
|
-
}
|
|
773
|
-
const canonicalAfter = realpathSync2(directoryPath);
|
|
774
|
-
if (canonicalAfter !== canonicalDirectory || !contained2(canonicalRoot, canonicalAfter)) {
|
|
775
|
-
throw new Error(`extension directory changed or escapes the extension root: ${directoryPath}`);
|
|
776
|
-
}
|
|
777
|
-
if (expectedEntries !== void 0) {
|
|
778
|
-
const currentEntries = readdirSync2(directoryPath).sort();
|
|
779
|
-
if (currentEntries.length !== expectedEntries.length || currentEntries.some((entry, index) => entry !== expectedEntries[index])) {
|
|
780
|
-
throw new Error(`extension directory entries changed while being hashed: ${directoryPath}`);
|
|
781
|
-
}
|
|
782
|
-
}
|
|
783
|
-
}
|
|
784
|
-
function readStableDirectory(directoryPath, inspected, canonicalRoot) {
|
|
785
|
-
const canonicalDirectory = realpathSync2(directoryPath);
|
|
786
|
-
if (!contained2(canonicalRoot, canonicalDirectory)) {
|
|
787
|
-
throw new Error(`extension directory escapes the extension root: ${directoryPath}`);
|
|
788
|
-
}
|
|
789
|
-
const entries = readdirSync2(directoryPath).sort();
|
|
790
|
-
assertStableDirectory(directoryPath, inspected, canonicalDirectory, canonicalRoot);
|
|
791
|
-
return { canonicalDirectory, entries };
|
|
792
|
-
}
|
|
793
|
-
function extensionContentDigestWithCapture(root, options = {}) {
|
|
794
|
-
const resolvedRoot = path2.resolve(root);
|
|
795
|
-
const rootStat = lstatSync2(resolvedRoot);
|
|
796
|
-
if (rootStat.isSymbolicLink()) {
|
|
797
|
-
throw new Error(`extension root must be a directory, not a symbolic link: ${resolvedRoot}`);
|
|
798
|
-
}
|
|
799
|
-
if (!rootStat.isDirectory()) {
|
|
800
|
-
throw new Error(`extension root must be a directory: ${resolvedRoot}`);
|
|
801
|
-
}
|
|
802
|
-
const canonicalRoot = realpathSync2(resolvedRoot);
|
|
803
|
-
const canonicalizedRootStat = lstatSync2(resolvedRoot);
|
|
804
|
-
if (!canonicalizedRootStat.isDirectory() || !sameFileState(rootStat, canonicalizedRootStat)) {
|
|
805
|
-
throw new Error(`extension root changed while being canonicalized: ${resolvedRoot}`);
|
|
806
|
-
}
|
|
807
|
-
const hash = createHash("sha256");
|
|
808
|
-
const requested = new Set((options.capture ?? []).map((entry) => entry.replaceAll(path2.sep, "/")));
|
|
809
|
-
const captured = /* @__PURE__ */ new Map();
|
|
810
|
-
const visit = (absolutePath, relativePath) => {
|
|
811
|
-
const stat = lstatSync2(absolutePath);
|
|
812
|
-
if (stat.isSymbolicLink()) {
|
|
813
|
-
if (relativePath === "") {
|
|
814
|
-
throw new Error(`extension root changed to a symbolic link while being hashed: ${absolutePath}`);
|
|
815
|
-
}
|
|
816
|
-
digestFrame(hash, "link", relativePath, readStableContainedLink(absolutePath, stat, canonicalRoot));
|
|
817
|
-
return;
|
|
818
|
-
}
|
|
819
|
-
if (stat.isDirectory()) {
|
|
820
|
-
digestFrame(hash, "directory", relativePath);
|
|
821
|
-
const { canonicalDirectory, entries } = readStableDirectory(absolutePath, stat, canonicalRoot);
|
|
822
|
-
for (const entry of entries) {
|
|
823
|
-
visit(path2.join(absolutePath, entry), relativePath ? path2.join(relativePath, entry) : entry);
|
|
824
|
-
}
|
|
825
|
-
assertStableDirectory(absolutePath, stat, canonicalDirectory, canonicalRoot, entries);
|
|
826
|
-
return;
|
|
827
|
-
}
|
|
828
|
-
if (stat.isFile()) {
|
|
829
|
-
if (stat.nlink !== 1) {
|
|
830
|
-
throw new Error(`hard-linked file is unsupported in an extension: ${absolutePath}`);
|
|
831
|
-
}
|
|
832
|
-
const payload = readStableRegularFile(absolutePath, stat);
|
|
833
|
-
digestFrame(hash, "file", relativePath, payload);
|
|
834
|
-
const key = relativePath.replaceAll(path2.sep, "/");
|
|
835
|
-
if (requested.has(key)) captured.set(key, payload);
|
|
836
|
-
return;
|
|
837
|
-
}
|
|
838
|
-
throw new Error(`unsupported filesystem entry in extension: ${absolutePath}`);
|
|
839
|
-
};
|
|
840
|
-
visit(resolvedRoot, "");
|
|
841
|
-
return { digest: hash.digest("hex"), captured };
|
|
842
|
-
}
|
|
843
|
-
function extensionContentDigest(root) {
|
|
844
|
-
return extensionContentDigestWithCapture(root).digest;
|
|
845
|
-
}
|
|
846
|
-
|
|
847
|
-
// src/domains/extensions/state.ts
|
|
624
|
+
import { cpSync, existsSync as existsSync2, mkdirSync, readdirSync as readdirSync2, readFileSync as readFileSync2, realpathSync as realpathSync3, renameSync, rmSync } from "node:fs";
|
|
625
|
+
import path3 from "node:path";
|
|
848
626
|
var DEFAULT_STATE = { version: 1, disabled: [], installed: {} };
|
|
849
627
|
function extensionBaseDir(scope, cwd = process.cwd()) {
|
|
850
628
|
return scope === "user" ? path3.join(clioConfigDir(), "extensions") : path3.join(path3.resolve(cwd), ".clio-coder", "extensions");
|
|
@@ -861,7 +639,7 @@ function packageRecoveryPath(root, label) {
|
|
|
861
639
|
function preserveFile(filePath, label) {
|
|
862
640
|
if (!existsSync2(filePath)) return void 0;
|
|
863
641
|
const backupPath = recoveryPath(filePath, label);
|
|
864
|
-
safeResourceWrite(backupPath,
|
|
642
|
+
safeResourceWrite(backupPath, readFileSync2(filePath));
|
|
865
643
|
return backupPath;
|
|
866
644
|
}
|
|
867
645
|
function scopeRank(scope) {
|
|
@@ -871,7 +649,7 @@ function readState(scope, cwd = process.cwd()) {
|
|
|
871
649
|
const filePath = statePath(scope, cwd);
|
|
872
650
|
if (!existsSync2(filePath)) return { status: "absent", state: structuredClone(DEFAULT_STATE) };
|
|
873
651
|
try {
|
|
874
|
-
const parsed = JSON.parse(
|
|
652
|
+
const parsed = JSON.parse(readFileSync2(filePath, "utf8"));
|
|
875
653
|
if (!isRecord(parsed) || parsed.version !== 1) throw new Error("state must be a version 1 object");
|
|
876
654
|
if (!Array.isArray(parsed.disabled) || !parsed.disabled.every((entry) => typeof entry === "string")) {
|
|
877
655
|
throw new Error("state.disabled must be an array of strings");
|
|
@@ -941,7 +719,7 @@ function installedFromRoot(root, scope, stateResult, cwd, fallbackId) {
|
|
|
941
719
|
} else if (!expectedDigest) {
|
|
942
720
|
diagnostics.push({
|
|
943
721
|
type: "error",
|
|
944
|
-
message: `extension ${id} install provenance has no content digest;
|
|
722
|
+
message: `extension ${id} install provenance has no content digest; reinstall with --force`,
|
|
945
723
|
path: statePath(scope, cwd)
|
|
946
724
|
});
|
|
947
725
|
} else {
|
|
@@ -977,7 +755,7 @@ function installedFromRoot(root, scope, stateResult, cwd, fallbackId) {
|
|
|
977
755
|
scope,
|
|
978
756
|
...provenance?.source ? { sourcePath: provenance.source } : {},
|
|
979
757
|
canonicalRoot: realpathSync3(root),
|
|
980
|
-
manifestDigest:
|
|
758
|
+
manifestDigest: createHash("sha256").update(manifestBytes).digest("hex"),
|
|
981
759
|
contentDigest: expectedDigest
|
|
982
760
|
} : void 0;
|
|
983
761
|
const entry = {
|
|
@@ -985,6 +763,8 @@ function installedFromRoot(root, scope, stateResult, cwd, fallbackId) {
|
|
|
985
763
|
name: manifest?.name ?? id,
|
|
986
764
|
version: manifest?.version ?? "unknown",
|
|
987
765
|
description: manifest?.description ?? "Installed extension has an invalid manifest.",
|
|
766
|
+
...manifest?.capabilities ? { capabilities: manifest.capabilities } : {},
|
|
767
|
+
...manifest?.runtime ? { runtime: manifest.runtime } : {},
|
|
988
768
|
scope,
|
|
989
769
|
rootPath: root,
|
|
990
770
|
manifestPath: candidate.manifestPath ?? root,
|
|
@@ -995,7 +775,6 @@ function installedFromRoot(root, scope, stateResult, cwd, fallbackId) {
|
|
|
995
775
|
loadable: false,
|
|
996
776
|
...extensionProvenance ? { provenance: extensionProvenance } : {},
|
|
997
777
|
...observedDigest ? { observedContentDigest: observedDigest } : {},
|
|
998
|
-
resources: manifest?.resources ?? {},
|
|
999
778
|
diagnostics
|
|
1000
779
|
};
|
|
1001
780
|
return { entry, ...extensionProvenance && captured ? { captured } : {} };
|
|
@@ -1005,7 +784,7 @@ function listScope(scope, cwd = process.cwd()) {
|
|
|
1005
784
|
if (!existsSync2(base)) return [];
|
|
1006
785
|
const state = readState(scope, cwd);
|
|
1007
786
|
const out = [];
|
|
1008
|
-
for (const entry of
|
|
787
|
+
for (const entry of readdirSync2(base, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {
|
|
1009
788
|
if (!entry.isDirectory() || entry.name.startsWith(".")) continue;
|
|
1010
789
|
const root = path3.join(base, entry.name);
|
|
1011
790
|
const installed = installedFromRoot(root, scope, state, cwd, entry.name);
|
|
@@ -1013,84 +792,24 @@ function listScope(scope, cwd = process.cwd()) {
|
|
|
1013
792
|
}
|
|
1014
793
|
return out;
|
|
1015
794
|
}
|
|
1016
|
-
function upgradeLegacyExtensionInstallState(cwd = process.cwd(), scopes = ["user", "project"]) {
|
|
1017
|
-
const reports = [];
|
|
1018
|
-
for (const scope of scopes) {
|
|
1019
|
-
const filePath = statePath(scope, cwd);
|
|
1020
|
-
const report = { scope, statePath: filePath, upgraded: [], refused: [] };
|
|
1021
|
-
const stateResult = readState(scope, cwd);
|
|
1022
|
-
if (stateResult.status === "absent") {
|
|
1023
|
-
reports.push(report);
|
|
1024
|
-
continue;
|
|
1025
|
-
}
|
|
1026
|
-
if (stateResult.status === "corrupt") {
|
|
1027
|
-
report.refused.push({ id: "<state>", reason: `install state is corrupt: ${stateResult.message}` });
|
|
1028
|
-
reports.push(report);
|
|
1029
|
-
continue;
|
|
1030
|
-
}
|
|
1031
|
-
const next = structuredClone(stateResult.state);
|
|
1032
|
-
const verified = /* @__PURE__ */ new Map();
|
|
1033
|
-
for (const [id, record] of Object.entries(next.installed)) {
|
|
1034
|
-
if (record.contentDigest) continue;
|
|
1035
|
-
const root = path3.join(extensionBaseDir(scope, cwd), id);
|
|
1036
|
-
try {
|
|
1037
|
-
if (!lstatSync3(root).isDirectory()) throw new Error("installed path is not a directory");
|
|
1038
|
-
const candidate = loadManifestFromRoot(root);
|
|
1039
|
-
if (!candidate.valid || !candidate.manifest) {
|
|
1040
|
-
throw new Error(candidate.diagnostics.map((diagnostic) => diagnostic.message).join("; ") || "manifest is invalid");
|
|
1041
|
-
}
|
|
1042
|
-
if (candidate.manifest.id !== id) {
|
|
1043
|
-
throw new Error(`manifest id ${candidate.manifest.id} does not match install record ${id}`);
|
|
1044
|
-
}
|
|
1045
|
-
const digest = extensionContentDigest(root);
|
|
1046
|
-
record.contentDigest = digest;
|
|
1047
|
-
verified.set(id, { root, digest });
|
|
1048
|
-
report.upgraded.push(id);
|
|
1049
|
-
} catch (error) {
|
|
1050
|
-
report.refused.push({ id, reason: error instanceof Error ? error.message : String(error) });
|
|
1051
|
-
}
|
|
1052
|
-
}
|
|
1053
|
-
if (report.upgraded.length > 0) {
|
|
1054
|
-
const backupPath = `${filePath}.pre-digest.bak`;
|
|
1055
|
-
safeResourceWrite(filePath, `${JSON.stringify(next, null, 2)}
|
|
1056
|
-
`, {
|
|
1057
|
-
encoding: "utf8",
|
|
1058
|
-
backup: { path: backupPath },
|
|
1059
|
-
beforeRename: () => {
|
|
1060
|
-
for (const [id, expected] of verified) {
|
|
1061
|
-
const candidate = loadManifestFromRoot(expected.root);
|
|
1062
|
-
if (!candidate.valid || candidate.manifest?.id !== id) {
|
|
1063
|
-
throw new Error(`extension ${id} became invalid during digest migration`);
|
|
1064
|
-
}
|
|
1065
|
-
const observed = extensionContentDigest(expected.root);
|
|
1066
|
-
if (observed !== expected.digest) throw new Error(`extension ${id} changed during digest migration`);
|
|
1067
|
-
}
|
|
1068
|
-
}
|
|
1069
|
-
});
|
|
1070
|
-
report.backupPath = backupPath;
|
|
1071
|
-
}
|
|
1072
|
-
reports.push(report);
|
|
1073
|
-
}
|
|
1074
|
-
return reports;
|
|
1075
|
-
}
|
|
1076
795
|
function listInstalledExtensions(cwd = process.cwd(), options = {}) {
|
|
1077
|
-
return listInstalledExtensionRecords(cwd, options).map((
|
|
796
|
+
return listInstalledExtensionRecords(cwd, options).map((record3) => record3.entry);
|
|
1078
797
|
}
|
|
1079
798
|
function listInstalledExtensionRecords(cwd = process.cwd(), options = {}) {
|
|
1080
799
|
const scopes = options.scope ? [options.scope] : ["user", "project"];
|
|
1081
800
|
const records = scopes.flatMap((scope) => listScope(scope, cwd));
|
|
1082
801
|
const byId = /* @__PURE__ */ new Map();
|
|
1083
|
-
for (const
|
|
1084
|
-
const entry =
|
|
802
|
+
for (const record3 of records) {
|
|
803
|
+
const entry = record3.entry;
|
|
1085
804
|
const list = byId.get(entry.id) ?? [];
|
|
1086
|
-
list.push(
|
|
805
|
+
list.push(record3);
|
|
1087
806
|
byId.set(entry.id, list);
|
|
1088
807
|
}
|
|
1089
808
|
for (const group of byId.values()) {
|
|
1090
|
-
const winner = group.filter((
|
|
1091
|
-
for (const
|
|
1092
|
-
const entry =
|
|
1093
|
-
entry.effective =
|
|
809
|
+
const winner = group.filter((record3) => record3.entry.valid && record3.entry.compatible).sort((a, b) => scopeRank(a.entry.scope) - scopeRank(b.entry.scope)).at(-1);
|
|
810
|
+
for (const record3 of group) {
|
|
811
|
+
const entry = record3.entry;
|
|
812
|
+
entry.effective = record3 === winner;
|
|
1094
813
|
entry.loadable = entry.valid && entry.compatible && entry.enabled && entry.effective;
|
|
1095
814
|
if (entry.valid && entry.compatible && !entry.effective && winner) entry.overriddenBy = winner.entry.scope;
|
|
1096
815
|
}
|
|
@@ -1319,11 +1038,16 @@ function removeExtension(id, options = {}) {
|
|
|
1319
1038
|
}
|
|
1320
1039
|
|
|
1321
1040
|
export {
|
|
1041
|
+
extensionToolName,
|
|
1042
|
+
resolveExtensionEntrypoint,
|
|
1043
|
+
RUNTIME_LIMITS,
|
|
1044
|
+
extensionPlainText,
|
|
1045
|
+
parseExtensionOutput,
|
|
1046
|
+
extensionPanelText,
|
|
1047
|
+
parseExtensionManifest,
|
|
1322
1048
|
loadManifestFromRoot,
|
|
1323
1049
|
discoverExtensionPackages,
|
|
1324
|
-
extensionContentDigest,
|
|
1325
1050
|
extensionBaseDir,
|
|
1326
|
-
upgradeLegacyExtensionInstallState,
|
|
1327
1051
|
listInstalledExtensions,
|
|
1328
1052
|
listInstalledExtensionRecords,
|
|
1329
1053
|
installExtension,
|
|
@@ -1331,4 +1055,4 @@ export {
|
|
|
1331
1055
|
disableExtension,
|
|
1332
1056
|
removeExtension
|
|
1333
1057
|
};
|
|
1334
|
-
//# sourceMappingURL=chunk-
|
|
1058
|
+
//# sourceMappingURL=chunk-24S3DN22.js.map
|