@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
package/src/core/defaults.ts
CHANGED
|
@@ -219,15 +219,37 @@ export interface RetrySettings {
|
|
|
219
219
|
streamStallMs: number;
|
|
220
220
|
}
|
|
221
221
|
|
|
222
|
-
export
|
|
222
|
+
export const OUTPUT_STYLES = ["compact", "standard", "detailed"] as const;
|
|
223
|
+
export type OutputStyle = (typeof OUTPUT_STYLES)[number];
|
|
224
|
+
|
|
225
|
+
/** Read older preferences without rewriting a user's settings on startup. */
|
|
226
|
+
export function normalizeOutputStyle(value: unknown): OutputStyle | undefined {
|
|
227
|
+
switch (value) {
|
|
228
|
+
case "minimal":
|
|
229
|
+
case "compact":
|
|
230
|
+
return "compact";
|
|
231
|
+
case "default":
|
|
232
|
+
case "standard":
|
|
233
|
+
return "standard";
|
|
234
|
+
case "verbose":
|
|
235
|
+
case "detailed":
|
|
236
|
+
return "detailed";
|
|
237
|
+
default:
|
|
238
|
+
return undefined;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
export function nextOutputStyle(style: OutputStyle): OutputStyle {
|
|
243
|
+
return OUTPUT_STYLES[(OUTPUT_STYLES.indexOf(style) + 1) % OUTPUT_STYLES.length] ?? "standard";
|
|
244
|
+
}
|
|
223
245
|
export type TuiMode = "regular" | "fullscreen";
|
|
224
246
|
export type FullscreenScrollbar = "hidden" | "auto" | "always";
|
|
225
247
|
export type SmoothStreaming = "off" | "auto" | "on";
|
|
226
248
|
|
|
227
249
|
export interface InterfaceSettings {
|
|
228
250
|
terminalProgress: boolean;
|
|
229
|
-
/**
|
|
230
|
-
outputDetail:
|
|
251
|
+
/** Output style: Compact, Standard, or Detailed bounded previews. */
|
|
252
|
+
outputDetail: OutputStyle;
|
|
231
253
|
/** Regular scrollback-preserving renderer or alternate-screen sticky layout. */
|
|
232
254
|
mode: TuiMode;
|
|
233
255
|
/** Fullscreen transcript scrollbar visibility. */
|
|
@@ -261,7 +283,7 @@ export interface ReviewSettings {
|
|
|
261
283
|
}
|
|
262
284
|
|
|
263
285
|
export interface ModelSelectorSettings {
|
|
264
|
-
/** Exact target/model refs
|
|
286
|
+
/** Exact target/model refs used by the scoped model cycle actions. */
|
|
265
287
|
cycleSet: string[];
|
|
266
288
|
/** Exact target/model refs shown in the focused model picker. */
|
|
267
289
|
favorites: string[];
|
|
@@ -456,7 +478,7 @@ export const DEFAULT_SETTINGS = {
|
|
|
456
478
|
recentLimit: 12,
|
|
457
479
|
} as ModelSelectorSettings,
|
|
458
480
|
maxOutputTokens: 0,
|
|
459
|
-
prewarm:
|
|
481
|
+
prewarm: false,
|
|
460
482
|
retry: {
|
|
461
483
|
enabled: true,
|
|
462
484
|
maxRetries: 3,
|
|
@@ -484,7 +506,7 @@ export const DEFAULT_SETTINGS = {
|
|
|
484
506
|
mode: "deny" as WorkerPermissionMode,
|
|
485
507
|
escalation: { timeoutMs: 120000, fallback: "deny" } as WorkerEscalationSettings,
|
|
486
508
|
},
|
|
487
|
-
concurrency:
|
|
509
|
+
concurrency: 1 as "auto" | number,
|
|
488
510
|
retry: { maxRetries: 2, routeCooldownMs: 15000 },
|
|
489
511
|
limits: {
|
|
490
512
|
toolCallsPerRun: GUARDRAIL_DEFAULTS.workerToolCallCap,
|
|
@@ -521,10 +543,10 @@ export const DEFAULT_SETTINGS = {
|
|
|
521
543
|
} as SafetySettings,
|
|
522
544
|
interface: {
|
|
523
545
|
terminalProgress: false,
|
|
524
|
-
outputDetail: "
|
|
546
|
+
outputDetail: "standard",
|
|
525
547
|
mode: "regular",
|
|
526
548
|
fullscreenScrollbar: "auto",
|
|
527
|
-
smoothStreaming: "
|
|
549
|
+
smoothStreaming: "auto",
|
|
528
550
|
desktopNotifications: false,
|
|
529
551
|
panes: {
|
|
530
552
|
enabled: "off",
|
|
@@ -591,7 +613,7 @@ chat:
|
|
|
591
613
|
favorites: []
|
|
592
614
|
recentLimit: 12
|
|
593
615
|
maxOutputTokens: 0
|
|
594
|
-
prewarm:
|
|
616
|
+
prewarm: false
|
|
595
617
|
retry:
|
|
596
618
|
enabled: true
|
|
597
619
|
maxRetries: 3
|
|
@@ -617,7 +639,7 @@ fleet:
|
|
|
617
639
|
escalation:
|
|
618
640
|
timeoutMs: 120000
|
|
619
641
|
fallback: deny
|
|
620
|
-
concurrency:
|
|
642
|
+
concurrency: 1
|
|
621
643
|
retry:
|
|
622
644
|
maxRetries: 2
|
|
623
645
|
routeCooldownMs: 15000
|
|
@@ -659,8 +681,8 @@ safety:
|
|
|
659
681
|
enabled: false
|
|
660
682
|
|
|
661
683
|
interface:
|
|
662
|
-
outputDetail:
|
|
663
|
-
smoothStreaming:
|
|
684
|
+
outputDetail: standard
|
|
685
|
+
smoothStreaming: auto
|
|
664
686
|
mode: regular
|
|
665
687
|
fullscreenScrollbar: auto
|
|
666
688
|
terminalProgress: false
|
|
@@ -3,7 +3,7 @@ import { randomUUID } from "node:crypto";
|
|
|
3
3
|
import { readFileSync, unlinkSync, writeFileSync } from "node:fs";
|
|
4
4
|
import { tmpdir } from "node:os";
|
|
5
5
|
import { join } from "node:path";
|
|
6
|
-
import { shellQuote } from "
|
|
6
|
+
import { shellQuote } from "./shell-quote.js";
|
|
7
7
|
|
|
8
8
|
export type ExternalEditorProbe = (candidates: ReadonlyArray<string>) => string | null;
|
|
9
9
|
|
|
@@ -48,11 +48,11 @@ export function resolveExternalEditor(
|
|
|
48
48
|
return probe(["nano", "vi"]);
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
export function editTextExternally(initialText: string, command: string | null): ExternalEditResult {
|
|
51
|
+
export function editTextExternally(initialText: string, command: string | null, extension = ".md"): ExternalEditResult {
|
|
52
52
|
if (!command) return { ok: false, error: "no external editor configured; set VISUAL or EDITOR" };
|
|
53
|
-
const tmpFile = join(tmpdir(), `clio-coder-editor-${process.pid}-${randomUUID()}
|
|
53
|
+
const tmpFile = join(tmpdir(), `clio-coder-editor-${process.pid}-${randomUUID()}${extension}`);
|
|
54
54
|
try {
|
|
55
|
-
writeFileSync(tmpFile, initialText, "utf8");
|
|
55
|
+
writeFileSync(tmpFile, initialText, { encoding: "utf8", mode: 0o600, flag: "wx" });
|
|
56
56
|
const result = runEditor(command, tmpFile);
|
|
57
57
|
if (result.error) return { ok: false, error: result.error.message };
|
|
58
58
|
if (result.status !== 0) return { ok: false, error: `external editor exited with code ${result.status ?? "?"}` };
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Recents are runtime state, not user configuration, so they live in the state
|
|
5
5
|
* dir (recent-models.json) and never in settings.yaml. Keeping them out
|
|
6
|
-
* of the settings file means an Alt+
|
|
6
|
+
* of the settings file means an Alt+M model pick does not rewrite settings.yaml
|
|
7
7
|
* just to bump a recency list, which would fire the config watcher in every
|
|
8
8
|
* other running session. Favorites (modelSelector.favorites) remain in
|
|
9
9
|
* settings.yaml because they are deliberate user configuration.
|
|
@@ -72,7 +72,7 @@ export function rememberRecentModel(ref: string, limit: number): string[] {
|
|
|
72
72
|
const next = [ref, ...base.filter((entry) => entry !== ref)].slice(0, max);
|
|
73
73
|
cache = next;
|
|
74
74
|
cachePath = path;
|
|
75
|
-
// An Alt+
|
|
75
|
+
// An Alt+M model pick in a session outliving `clio-coder uninstall` must not
|
|
76
76
|
// rebuild the state root around recent-models.json. The in-memory list still
|
|
77
77
|
// updates so the picker behaves for the rest of the run; see stateRootRemoved().
|
|
78
78
|
if (stateRootRemoved()) return next;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Saved settings (settings.yaml) are defaults shared by every Clio process.
|
|
5
5
|
* Live routing for a running session — active orchestrator target/model/
|
|
6
|
-
* thinking, the fleet default used by /run, and the
|
|
6
|
+
* thinking, the fleet default used by /run, and the configured model-cycle scope list —
|
|
7
7
|
* is owned by the process that is running the session. Each process seeds its
|
|
8
8
|
* routing from saved settings at boot and afterwards reads everything through
|
|
9
9
|
* an effective view: the shared snapshot (targets, theme, safety, retry, …)
|
|
@@ -279,7 +279,7 @@ const ROUTING_FIELD_LABELS: ReadonlyArray<{
|
|
|
279
279
|
},
|
|
280
280
|
{
|
|
281
281
|
field: "chat.modelPicker.cycleSet",
|
|
282
|
-
label: "
|
|
282
|
+
label: "Scoped model cycle set",
|
|
283
283
|
read: (s) => s.chat.modelPicker.cycleSet.join(","),
|
|
284
284
|
},
|
|
285
285
|
];
|
|
@@ -317,7 +317,7 @@ export interface RoutingChangeNotice {
|
|
|
317
317
|
* moves settings.yaml underneath it. One helper feeds every surface — the TUI
|
|
318
318
|
* notification center and the ACP session ledger — so the wording cannot
|
|
319
319
|
* drift. `commandHints` appends the interactive remedies (/settings, /model,
|
|
320
|
-
* Alt+
|
|
320
|
+
* Alt+M), which only make sense where a user can type slash commands.
|
|
321
321
|
*/
|
|
322
322
|
export function routingChangeNotices(
|
|
323
323
|
changedPaths: ReadonlyArray<string>,
|
|
@@ -118,7 +118,7 @@ function tryAcquire(lockPath: string): boolean {
|
|
|
118
118
|
|
|
119
119
|
function timeoutError(lockPath: string, timeoutMs: number): Error {
|
|
120
120
|
return new Error(
|
|
121
|
-
`timed out after ${timeoutMs}ms waiting for ${lockPath} (owner pid=${readLockOwner(lockPath)?.pid ?? "?"}); delete it if no other clio process is running`,
|
|
121
|
+
`timed out after ${timeoutMs}ms waiting for ${lockPath} (owner pid=${readLockOwner(lockPath)?.pid ?? "?"}); delete it if no other clio-coder process is running`,
|
|
122
122
|
);
|
|
123
123
|
}
|
|
124
124
|
|
package/src/core/tool-names.ts
CHANGED
|
@@ -67,3 +67,8 @@ export const ALL_TOOL_NAMES: ReadonlyArray<BuiltinToolName> = Object.values(Tool
|
|
|
67
67
|
export function isBuiltinToolName(name: ToolName): name is BuiltinToolName {
|
|
68
68
|
return (ALL_TOOL_NAMES as ReadonlyArray<string>).includes(name);
|
|
69
69
|
}
|
|
70
|
+
|
|
71
|
+
/** Reserved command-capability namespace. Syntax conveys execution class, never availability. */
|
|
72
|
+
export function isHarnessExtensionToolName(name: string): name is DynamicToolName {
|
|
73
|
+
return name.length <= 64 && /^extension_[a-z0-9][a-z0-9_-]*__[a-z][a-z0-9_]*$/.test(name);
|
|
74
|
+
}
|
|
@@ -12,34 +12,70 @@ export function createAgentsBundle(_context: DomainContext): DomainBundle<Agents
|
|
|
12
12
|
let specs: ReadonlyArray<AgentSpec> = [];
|
|
13
13
|
let diagnostics: ReadonlyArray<AgentRecipeDiagnostic> = [];
|
|
14
14
|
let revision = 0;
|
|
15
|
+
let rediscoveryPending = false;
|
|
16
|
+
let attemptedRecipes: ReadonlyArray<AgentRecipe> | null = null;
|
|
15
17
|
|
|
16
18
|
function discover(): void {
|
|
19
|
+
attemptedRecipes = null;
|
|
17
20
|
const nextDiagnostics: AgentRecipeDiagnostic[] = [];
|
|
18
21
|
const merged = discoverAgentRecipes(process.cwd(), nextDiagnostics);
|
|
22
|
+
attemptedRecipes = merged;
|
|
19
23
|
const config = _context.getContract<ConfigContract>("config");
|
|
20
24
|
assertAgentIdNamespace(merged, config?.get()?.integrations.externalAgents?.entries ?? []);
|
|
21
25
|
recipes = merged;
|
|
22
26
|
specs = recipes.map(normalizeAgentSpec);
|
|
23
27
|
diagnostics = nextDiagnostics;
|
|
24
28
|
revision += 1;
|
|
29
|
+
rediscoveryPending = false;
|
|
25
30
|
}
|
|
26
31
|
|
|
27
32
|
let unsubscribeExtensionsReload: (() => void) | null = null;
|
|
28
33
|
const extension: DomainExtension = {
|
|
29
34
|
async start() {
|
|
30
35
|
discover();
|
|
31
|
-
// Recipes are cached at start;
|
|
32
|
-
// committed
|
|
33
|
-
|
|
34
|
-
if ((payload as { changed?: unknown } | undefined)?.changed !== true) return;
|
|
36
|
+
// Recipes are cached at start; plugin agent roots come from the
|
|
37
|
+
// committed plugin generation, so a changed generation rediscovers.
|
|
38
|
+
const onResourceReload = (payload: unknown) => {
|
|
39
|
+
if (!rediscoveryPending && (payload as { changed?: unknown } | undefined)?.changed !== true) return;
|
|
35
40
|
try {
|
|
36
41
|
discover();
|
|
37
42
|
} catch (error) {
|
|
43
|
+
// Snapshot admission may already have revoked packages. Never retain
|
|
44
|
+
// their cached authority when namespace or filesystem discovery fails.
|
|
45
|
+
rediscoveryPending = true;
|
|
46
|
+
recipes = attemptedRecipes ?? recipes.filter((recipe) => recipe.source === "builtin");
|
|
47
|
+
let conflictingIds = new Set<string>();
|
|
48
|
+
try {
|
|
49
|
+
const config = _context.getContract<ConfigContract>("config");
|
|
50
|
+
conflictingIds = new Set((config?.get()?.integrations.externalAgents?.entries ?? []).map((agent) => agent.id));
|
|
51
|
+
} catch {
|
|
52
|
+
// If even current operator configuration is unreadable, no custom
|
|
53
|
+
// cached recipe has a trustworthy namespace admission decision.
|
|
54
|
+
recipes = recipes.filter((recipe) => recipe.source === "builtin");
|
|
55
|
+
}
|
|
56
|
+
recipes = recipes.filter((recipe) => recipe.source !== "plugin" && !conflictingIds.has(recipe.id));
|
|
57
|
+
specs = recipes.map(normalizeAgentSpec);
|
|
58
|
+
diagnostics = [
|
|
59
|
+
...diagnostics,
|
|
60
|
+
{
|
|
61
|
+
source: "project" as const,
|
|
62
|
+
filepath: process.cwd(),
|
|
63
|
+
message: `recipe reload failed; package recipes withdrawn until retry: ${error instanceof Error ? error.message : String(error)}`,
|
|
64
|
+
},
|
|
65
|
+
].slice(-100);
|
|
66
|
+
revision += 1;
|
|
38
67
|
process.stderr.write(
|
|
39
|
-
`[clio-coder:agents] rediscovery after
|
|
68
|
+
`[clio-coder:agents] rediscovery after resource reload failed: ${error instanceof Error ? error.message : String(error)}\n`,
|
|
40
69
|
);
|
|
41
70
|
}
|
|
42
|
-
}
|
|
71
|
+
};
|
|
72
|
+
const unsubscribe = [
|
|
73
|
+
_context.bus.on(BusChannels.ExtensionsReloaded, onResourceReload),
|
|
74
|
+
_context.bus.on(BusChannels.PluginsReloaded, onResourceReload),
|
|
75
|
+
];
|
|
76
|
+
unsubscribeExtensionsReload = () => {
|
|
77
|
+
for (const stop of unsubscribe) stop();
|
|
78
|
+
};
|
|
43
79
|
},
|
|
44
80
|
async stop() {
|
|
45
81
|
unsubscribeExtensionsReload?.();
|
|
@@ -38,7 +38,14 @@ export const FLEET_COMMAND_DEFAULT_TIMEOUT_MS = 600_000;
|
|
|
38
38
|
*/
|
|
39
39
|
export const FLEET_COMMAND_BASE_ENV: ReadonlyArray<string> = ["PATH", "HOME", "LANG", "LC_ALL", "TZ", "TMPDIR"];
|
|
40
40
|
|
|
41
|
+
export interface FleetCommandArgumentSlot {
|
|
42
|
+
name: string;
|
|
43
|
+
maxLength: number;
|
|
44
|
+
}
|
|
45
|
+
|
|
41
46
|
export interface FleetCommand {
|
|
47
|
+
/** Operator-owned required positional data slots; omission forbids appended args. */
|
|
48
|
+
argumentSlots?: ReadonlyArray<FleetCommandArgumentSlot>;
|
|
42
49
|
id: string;
|
|
43
50
|
/** argv list, never a shell string: no quoting bugs and no shell injection. */
|
|
44
51
|
argv: ReadonlyArray<string>;
|
|
@@ -59,6 +66,18 @@ export interface FleetCommandRegistry {
|
|
|
59
66
|
const CommandSchema = Type.Object(
|
|
60
67
|
{
|
|
61
68
|
argv: Type.Array(Type.String({ minLength: 1 }), { minItems: 1 }),
|
|
69
|
+
argumentSlots: Type.Optional(
|
|
70
|
+
Type.Array(
|
|
71
|
+
Type.Object(
|
|
72
|
+
{
|
|
73
|
+
name: Type.String({ pattern: "^[A-Za-z][A-Za-z0-9_-]{0,63}$" }),
|
|
74
|
+
maxLength: Type.Integer({ minimum: 1, maximum: 8192 }),
|
|
75
|
+
},
|
|
76
|
+
{ additionalProperties: false },
|
|
77
|
+
),
|
|
78
|
+
{ minItems: 1, maxItems: 64 },
|
|
79
|
+
),
|
|
80
|
+
),
|
|
62
81
|
cwd: Type.Optional(Type.String({ minLength: 1 })),
|
|
63
82
|
timeoutMs: Type.Optional(
|
|
64
83
|
Type.Integer({ minimum: FLEET_COMMAND_MIN_TIMEOUT_MS, maximum: FLEET_COMMAND_MAX_TIMEOUT_MS }),
|
|
@@ -114,7 +133,17 @@ export function parseFleetCommands(raw: string, sourcePath: string): FleetComman
|
|
|
114
133
|
if (schemaError !== null) throw new Error(`fleet commands ${sourcePath}: ${schemaError}`);
|
|
115
134
|
const registry = parsed as {
|
|
116
135
|
version: 1;
|
|
117
|
-
commands: Record<
|
|
136
|
+
commands: Record<
|
|
137
|
+
string,
|
|
138
|
+
{
|
|
139
|
+
argv: string[];
|
|
140
|
+
argumentSlots?: FleetCommandArgumentSlot[];
|
|
141
|
+
cwd?: string;
|
|
142
|
+
timeoutMs?: number;
|
|
143
|
+
env?: string[];
|
|
144
|
+
description?: string;
|
|
145
|
+
}
|
|
146
|
+
>;
|
|
118
147
|
};
|
|
119
148
|
const commands = new Map<string, FleetCommand>();
|
|
120
149
|
for (const [id, entry] of Object.entries(registry.commands)) {
|
|
@@ -130,9 +159,16 @@ export function parseFleetCommands(raw: string, sourcePath: string): FleetComman
|
|
|
130
159
|
throw new Error(`fleet commands ${sourcePath}: command '${id}' env name '${name}' is not a variable name`);
|
|
131
160
|
}
|
|
132
161
|
}
|
|
162
|
+
if (entry.argumentSlots)
|
|
163
|
+
validateFleetCommandArgs(
|
|
164
|
+
{ id, argv: entry.argv, cwd: "", timeoutMs: 1000, env: [], description: "", argumentSlots: entry.argumentSlots },
|
|
165
|
+
entry.argumentSlots.map(() => "{{slot}}"),
|
|
166
|
+
{ allowTemplates: true },
|
|
167
|
+
);
|
|
133
168
|
commands.set(id, {
|
|
134
169
|
id,
|
|
135
170
|
argv: [...entry.argv],
|
|
171
|
+
...(entry.argumentSlots ? { argumentSlots: entry.argumentSlots.map((slot) => ({ ...slot })) } : {}),
|
|
136
172
|
cwd: entry.cwd === undefined ? "" : checkCwd(id, entry.cwd, sourcePath),
|
|
137
173
|
timeoutMs: entry.timeoutMs ?? FLEET_COMMAND_DEFAULT_TIMEOUT_MS,
|
|
138
174
|
env: [...(entry.env ?? [])],
|
|
@@ -152,3 +188,58 @@ export function loadFleetCommands(cwd: string): FleetCommandRegistry | null {
|
|
|
152
188
|
if (!existsSync(path)) return null;
|
|
153
189
|
return parseFleetCommands(readFileSync(path, "utf8"), path);
|
|
154
190
|
}
|
|
191
|
+
|
|
192
|
+
/** Bind authored code-step arguments before plan admission; each stays one argv token. */
|
|
193
|
+
export function resolveFleetCommandArgs(
|
|
194
|
+
args: ReadonlyArray<string>,
|
|
195
|
+
vars: Readonly<Record<string, string>> = {},
|
|
196
|
+
): string[] {
|
|
197
|
+
if (args.length > 64) throw new Error("fleet code args: at most 64 arguments are allowed");
|
|
198
|
+
return args.map((token) => {
|
|
199
|
+
const match = /^\{\{\s*([A-Za-z_][A-Za-z0-9_-]*)\s*\}\}$/u.exec(token);
|
|
200
|
+
if (!match && token.includes("{{")) throw new Error("fleet code args: placeholders must occupy a whole argument");
|
|
201
|
+
const value = match ? vars[match[1] ?? ""] : token;
|
|
202
|
+
if (value === undefined) throw new Error(`fleet code args: missing variable ${match?.[1]} (pass --var name=value)`);
|
|
203
|
+
if (value.includes("\0") || value.length > 8192)
|
|
204
|
+
throw new Error("fleet code args: invalid NUL or oversized argument");
|
|
205
|
+
return value;
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/** Enforce operator-declared data slots; contracts cannot append flags or executable code. */
|
|
210
|
+
export function validateFleetCommandArgs(
|
|
211
|
+
command: FleetCommand,
|
|
212
|
+
args: ReadonlyArray<string>,
|
|
213
|
+
options: { allowTemplates?: boolean } = {},
|
|
214
|
+
): void {
|
|
215
|
+
const slots = command.argumentSlots ?? [];
|
|
216
|
+
if (
|
|
217
|
+
slots.length > 64 ||
|
|
218
|
+
new Set(slots.map((slot) => slot.name)).size !== slots.length ||
|
|
219
|
+
slots.some(
|
|
220
|
+
(slot) =>
|
|
221
|
+
!/^[A-Za-z][A-Za-z0-9_-]{0,63}$/u.test(slot.name) ||
|
|
222
|
+
!Number.isInteger(slot.maxLength) ||
|
|
223
|
+
slot.maxLength < 1 ||
|
|
224
|
+
slot.maxLength > 8192,
|
|
225
|
+
)
|
|
226
|
+
) {
|
|
227
|
+
throw new Error(`fleet command '${command.id}': invalid argumentSlots declaration`);
|
|
228
|
+
}
|
|
229
|
+
if (args.length !== slots.length) {
|
|
230
|
+
throw new Error(
|
|
231
|
+
`fleet command '${command.id}': expected ${slots.length} declared argument slots, got ${args.length}; the operator must declare argumentSlots in commands.yaml`,
|
|
232
|
+
);
|
|
233
|
+
}
|
|
234
|
+
for (let index = 0; index < slots.length; index++) {
|
|
235
|
+
const slot = slots[index];
|
|
236
|
+
const value = args[index];
|
|
237
|
+
if (!slot || typeof value !== "string") throw new Error(`fleet command '${command.id}': invalid argument`);
|
|
238
|
+
if (options.allowTemplates && /^\{\{\s*([A-Za-z_][A-Za-z0-9_-]*)\s*\}\}$/u.test(value)) continue;
|
|
239
|
+
if (value.length === 0 || value.length > slot.maxLength || value.includes("\0") || value.startsWith("-")) {
|
|
240
|
+
throw new Error(
|
|
241
|
+
`fleet command '${command.id}': argument '${slot.name}' must be nonempty data of at most ${slot.maxLength} characters, without NUL or a leading dash; fixed flags belong in argv`,
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { enabledPluginResourceRoots } from "../plugins/index.js";
|
|
2
|
+
import { resolvePackagePathReference, resolvePackageReferences } from "../resources/package-references.js";
|
|
1
3
|
/**
|
|
2
4
|
* Repo-owned fleet contracts (Symphony P5: work policy lives in the repo,
|
|
3
5
|
* versioned and strictly validated).
|
|
@@ -16,8 +18,12 @@ import { Type } from "typebox";
|
|
|
16
18
|
import { Value } from "typebox/value";
|
|
17
19
|
import { resolvePackageRoot } from "../../core/package-root.js";
|
|
18
20
|
import { clioConfigDir } from "../../core/xdg.js";
|
|
19
|
-
import {
|
|
20
|
-
|
|
21
|
+
import {
|
|
22
|
+
type FleetCommandRegistry,
|
|
23
|
+
loadFleetCommands,
|
|
24
|
+
resolveFleetCommandArgs,
|
|
25
|
+
validateFleetCommandArgs,
|
|
26
|
+
} from "./fleet-commands.js";
|
|
21
27
|
import { parseFrontmatter } from "./frontmatter.js";
|
|
22
28
|
import { normalizeWriteBoundary, WRITE_BOUNDARY_MAX_ENTRIES } from "./write-boundary.js";
|
|
23
29
|
|
|
@@ -111,6 +117,7 @@ export interface FleetContractCodeStep {
|
|
|
111
117
|
kind: "code";
|
|
112
118
|
id: string;
|
|
113
119
|
command: string;
|
|
120
|
+
args?: ReadonlyArray<string>;
|
|
114
121
|
scope: FleetStepScope;
|
|
115
122
|
dependencies: ReadonlyArray<string>;
|
|
116
123
|
commitFrom?: ReadonlyArray<string>;
|
|
@@ -119,7 +126,13 @@ export interface FleetContractCodeStep {
|
|
|
119
126
|
|
|
120
127
|
/** The verification half of a loop: the question that decides continuation. */
|
|
121
128
|
export type FleetContractLoopCheck =
|
|
122
|
-
| {
|
|
129
|
+
| {
|
|
130
|
+
kind: "code";
|
|
131
|
+
command: string;
|
|
132
|
+
args?: ReadonlyArray<string>;
|
|
133
|
+
scope: FleetStepScope;
|
|
134
|
+
writes?: ReadonlyArray<string>;
|
|
135
|
+
}
|
|
123
136
|
| {
|
|
124
137
|
kind: "agent";
|
|
125
138
|
agent: string;
|
|
@@ -199,7 +212,7 @@ export interface FleetContract {
|
|
|
199
212
|
path: string;
|
|
200
213
|
}
|
|
201
214
|
|
|
202
|
-
export type FleetContractSource = "builtin" | "
|
|
215
|
+
export type FleetContractSource = "builtin" | "plugin" | "user" | "project";
|
|
203
216
|
|
|
204
217
|
export interface FleetContractListing {
|
|
205
218
|
name: string;
|
|
@@ -291,6 +304,7 @@ function codeStepSchema(version: FleetContractVersion) {
|
|
|
291
304
|
kind: Type.Literal("code"),
|
|
292
305
|
id: Type.String({ minLength: 1 }),
|
|
293
306
|
command: Type.String({ minLength: 1 }),
|
|
307
|
+
args: Type.Optional(Type.Array(Type.String({ maxLength: 8192, pattern: "^[^\\u0000]*$" }), { maxItems: 64 })),
|
|
294
308
|
scope: FleetScopeSchema,
|
|
295
309
|
dependencies: Type.Array(Type.String({ minLength: 1 })),
|
|
296
310
|
...(version >= 3 ? { commitFrom: Type.Optional(Type.Array(Type.String({ minLength: 1 }), { minItems: 1 })) } : {}),
|
|
@@ -313,6 +327,7 @@ function loopStepSchema(version: FleetContractVersion) {
|
|
|
313
327
|
{
|
|
314
328
|
kind: Type.Literal("code"),
|
|
315
329
|
command: Type.String({ minLength: 1 }),
|
|
330
|
+
args: Type.Optional(Type.Array(Type.String({ maxLength: 8192, pattern: "^[^\\u0000]*$" }), { maxItems: 64 })),
|
|
316
331
|
scope: FleetScopeSchema,
|
|
317
332
|
...writesSchema(version),
|
|
318
333
|
},
|
|
@@ -412,12 +427,14 @@ type RawStep = {
|
|
|
412
427
|
id: string;
|
|
413
428
|
agent?: string;
|
|
414
429
|
command?: string;
|
|
430
|
+
args?: string[];
|
|
415
431
|
commitFrom?: string[];
|
|
416
432
|
writes?: string[];
|
|
417
433
|
maxAttempts?: number;
|
|
418
434
|
check?: {
|
|
419
435
|
kind: "code" | "agent" | "gate";
|
|
420
436
|
command?: string;
|
|
437
|
+
args?: string[];
|
|
421
438
|
agent?: string;
|
|
422
439
|
gate?: string;
|
|
423
440
|
scope: FleetStepScope;
|
|
@@ -488,7 +505,13 @@ function normalizeStep(step: RawStep): FleetContractStep {
|
|
|
488
505
|
dependencies: [...step.dependencies],
|
|
489
506
|
check:
|
|
490
507
|
check.kind === "code"
|
|
491
|
-
? {
|
|
508
|
+
? {
|
|
509
|
+
kind: "code",
|
|
510
|
+
command: check.command ?? "",
|
|
511
|
+
...(check.args ? { args: [...check.args] } : {}),
|
|
512
|
+
scope: check.scope,
|
|
513
|
+
...normalizedWrites(check.writes),
|
|
514
|
+
}
|
|
492
515
|
: check.kind === "gate"
|
|
493
516
|
? { kind: "gate", gate: check.gate ?? "" }
|
|
494
517
|
: {
|
|
@@ -512,6 +535,7 @@ function normalizeStep(step: RawStep): FleetContractStep {
|
|
|
512
535
|
kind: "code",
|
|
513
536
|
id: step.id,
|
|
514
537
|
command: step.command ?? "",
|
|
538
|
+
...(step.args ? { args: [...step.args] } : {}),
|
|
515
539
|
scope: step.scope,
|
|
516
540
|
dependencies: [...step.dependencies],
|
|
517
541
|
...(step.commitFrom !== undefined ? { commitFrom: [...step.commitFrom] } : {}),
|
|
@@ -901,13 +925,20 @@ export function fleetLoopSteps(contract: FleetContract): FleetContractLoopStep[]
|
|
|
901
925
|
* check is a code step in every way that matters to the registry, so it is
|
|
902
926
|
* bound to a real command by the same validation.
|
|
903
927
|
*/
|
|
904
|
-
export function fleetCodeSteps(
|
|
905
|
-
|
|
928
|
+
export function fleetCodeSteps(
|
|
929
|
+
contract: FleetContract,
|
|
930
|
+
): Array<{ id: string; command: string; args?: ReadonlyArray<string> }> {
|
|
931
|
+
const steps: Array<{ id: string; command: string; args?: ReadonlyArray<string> }> = [];
|
|
906
932
|
for (const step of contract.steps) {
|
|
907
|
-
if (step.kind === "code")
|
|
933
|
+
if (step.kind === "code")
|
|
934
|
+
steps.push({ id: step.id, command: step.command, ...(step.args ? { args: step.args } : {}) });
|
|
908
935
|
else if (step.kind === "gate") steps.push({ id: step.id, command: step.run });
|
|
909
936
|
else if (step.kind === "loop" && step.check.kind === "code") {
|
|
910
|
-
steps.push({
|
|
937
|
+
steps.push({
|
|
938
|
+
id: fleetLoopCheckStepId(step.id, 1),
|
|
939
|
+
command: step.check.command,
|
|
940
|
+
...(step.check.args ? { args: step.check.args } : {}),
|
|
941
|
+
});
|
|
911
942
|
}
|
|
912
943
|
}
|
|
913
944
|
return steps;
|
|
@@ -945,19 +976,26 @@ export class FleetCommandRegistryMissingError extends Error {
|
|
|
945
976
|
* failure mode this whole mechanism exists to prevent: a green test phase that
|
|
946
977
|
* never ran a test.
|
|
947
978
|
*/
|
|
948
|
-
export function validateFleetCommands(
|
|
979
|
+
export function validateFleetCommands(
|
|
980
|
+
contract: FleetContract,
|
|
981
|
+
registry: FleetCommandRegistry | null,
|
|
982
|
+
vars?: Readonly<Record<string, string>>,
|
|
983
|
+
): void {
|
|
949
984
|
const codeSteps = fleetCodeSteps(contract);
|
|
950
985
|
if (codeSteps.length === 0) return;
|
|
951
986
|
if (registry === null) {
|
|
952
987
|
throw new FleetCommandRegistryMissingError(contract.path, [...new Set(codeSteps.map((step) => step.command))].sort());
|
|
953
988
|
}
|
|
954
989
|
for (const step of codeSteps) {
|
|
955
|
-
|
|
990
|
+
const command = registry.commands.get(step.command);
|
|
991
|
+
if (!command) {
|
|
956
992
|
const known = [...registry.commands.keys()].sort().join(", ");
|
|
957
993
|
throw new Error(
|
|
958
994
|
`fleet contract ${contract.path}: step '${step.id}' names unknown command '${step.command}' (registered: ${known || "none"})`,
|
|
959
995
|
);
|
|
960
996
|
}
|
|
997
|
+
const args = vars === undefined ? (step.args ?? []) : resolveFleetCommandArgs(step.args ?? [], vars);
|
|
998
|
+
validateFleetCommandArgs(command, args, { allowTemplates: vars === undefined });
|
|
961
999
|
}
|
|
962
1000
|
}
|
|
963
1001
|
|
|
@@ -971,21 +1009,48 @@ function builtinFleetsDir(): string {
|
|
|
971
1009
|
return join(resolvePackageRoot(), "src", "domains", "agents", "fleets");
|
|
972
1010
|
}
|
|
973
1011
|
|
|
974
|
-
function
|
|
1012
|
+
export function resolveFleetReferences(
|
|
1013
|
+
contract: FleetContract,
|
|
1014
|
+
source: { source: FleetContractSource; rootPath?: string },
|
|
1015
|
+
): FleetContract {
|
|
1016
|
+
if (!source.rootPath) return contract;
|
|
1017
|
+
const context = { rootPath: source.rootPath, plugin: source.source === "plugin" };
|
|
1018
|
+
// Authored text is resolved after schema parsing; paths cannot inject YAML keys.
|
|
1019
|
+
return {
|
|
1020
|
+
...contract,
|
|
1021
|
+
body: resolvePackageReferences(contract.body, context),
|
|
1022
|
+
steps: contract.steps.map((step) => {
|
|
1023
|
+
if (step.kind === "code" && step.args)
|
|
1024
|
+
return { ...step, args: step.args.map((arg) => resolvePackagePathReference(arg, context)) };
|
|
1025
|
+
if (step.kind === "loop" && step.check.kind === "code" && step.check.args)
|
|
1026
|
+
return {
|
|
1027
|
+
...step,
|
|
1028
|
+
check: { ...step.check, args: step.check.args.map((arg) => resolvePackagePathReference(arg, context)) },
|
|
1029
|
+
};
|
|
1030
|
+
return step;
|
|
1031
|
+
}),
|
|
1032
|
+
};
|
|
1033
|
+
}
|
|
1034
|
+
|
|
1035
|
+
function fleetSources(cwd: string): ReadonlyArray<{ dir: string; source: FleetContractSource; rootPath?: string }> {
|
|
975
1036
|
return [
|
|
976
1037
|
{ dir: builtinFleetsDir(), source: "builtin" },
|
|
977
|
-
...
|
|
1038
|
+
...enabledPluginResourceRoots("fleets", cwd)
|
|
978
1039
|
.sort((left, right) => left.source.localeCompare(right.source))
|
|
979
|
-
.map((root) => ({ dir: root.path, source: "
|
|
1040
|
+
.map((root) => ({ dir: root.path, rootPath: root.rootPath, source: "plugin" as const })),
|
|
980
1041
|
{ dir: join(clioConfigDir(), "fleets"), source: "user" },
|
|
981
1042
|
{ dir: fleetsDir(cwd), source: "project" },
|
|
982
1043
|
];
|
|
983
1044
|
}
|
|
984
1045
|
|
|
985
|
-
function fleetContractPath(
|
|
1046
|
+
function fleetContractPath(
|
|
1047
|
+
cwd: string,
|
|
1048
|
+
name: string,
|
|
1049
|
+
): { path: string; source: FleetContractSource; rootPath?: string } | null {
|
|
986
1050
|
for (const source of [...fleetSources(cwd)].reverse()) {
|
|
987
1051
|
const candidate = join(source.dir, `${name}.md`);
|
|
988
|
-
if (existsSync(candidate))
|
|
1052
|
+
if (existsSync(candidate))
|
|
1053
|
+
return { path: candidate, source: source.source, ...(source.rootPath ? { rootPath: source.rootPath } : {}) };
|
|
989
1054
|
}
|
|
990
1055
|
return null;
|
|
991
1056
|
}
|
|
@@ -995,7 +1060,7 @@ export function loadFleetContract(cwd: string, name: string): FleetContract {
|
|
|
995
1060
|
if (located === null) {
|
|
996
1061
|
throw new Error(`fleet contract not found: ${join(fleetsDir(cwd), `${name}.md`)} (and no builtin named '${name}')`);
|
|
997
1062
|
}
|
|
998
|
-
const contract = parseFleetContract(readFileSync(located.path, "utf8"), located.path);
|
|
1063
|
+
const contract = resolveFleetReferences(parseFleetContract(readFileSync(located.path, "utf8"), located.path), located);
|
|
999
1064
|
validateFleetCommands(contract, loadFleetCommands(cwd));
|
|
1000
1065
|
return contract;
|
|
1001
1066
|
}
|
|
@@ -1027,12 +1092,15 @@ export function listFleetContracts(cwd: string): FleetContractListing[] {
|
|
|
1027
1092
|
}
|
|
1028
1093
|
const listings = new Map<string, FleetContractListing>();
|
|
1029
1094
|
const sources = fleetSources(cwd);
|
|
1030
|
-
for (const { dir, source } of sources) {
|
|
1095
|
+
for (const { dir, source, rootPath } of sources) {
|
|
1031
1096
|
for (const file of listDirectory(dir)) {
|
|
1032
1097
|
const path = join(dir, file);
|
|
1033
1098
|
const name = basename(file, ".md");
|
|
1034
1099
|
try {
|
|
1035
|
-
const contract = parseFleetContract(readFileSync(path, "utf8"), path)
|
|
1100
|
+
const contract = resolveFleetReferences(parseFleetContract(readFileSync(path, "utf8"), path), {
|
|
1101
|
+
source,
|
|
1102
|
+
...(rootPath ? { rootPath } : {}),
|
|
1103
|
+
});
|
|
1036
1104
|
if (registryError !== null && fleetCodeSteps(contract).length > 0) throw new Error(registryError);
|
|
1037
1105
|
validateFleetCommands(contract, registry);
|
|
1038
1106
|
listings.set(name, { name, path, source, contract, error: null, needsCommands: null });
|
|
@@ -131,20 +131,21 @@ export interface AgentRecipe {
|
|
|
131
131
|
resultContract: ResultContract;
|
|
132
132
|
product?: AgentProduct;
|
|
133
133
|
tags: ReadonlyArray<string>;
|
|
134
|
-
source: "builtin" | "
|
|
134
|
+
source: "builtin" | "plugin" | "user" | "project";
|
|
135
135
|
filepath: string;
|
|
136
136
|
/** Persona prompt body. */
|
|
137
137
|
body: string;
|
|
138
138
|
}
|
|
139
139
|
|
|
140
140
|
export interface RecipeSource {
|
|
141
|
+
rootPath?: string;
|
|
141
142
|
dir: string;
|
|
142
143
|
source: AgentRecipe["source"];
|
|
143
|
-
/** Project root whose
|
|
144
|
+
/** Project root whose package and skill resources are being discovered. */
|
|
144
145
|
cwd?: string;
|
|
145
|
-
/** Stable provenance used to correlate resources from one
|
|
146
|
+
/** Stable provenance used to correlate resources from one package. */
|
|
146
147
|
origin?: string;
|
|
147
|
-
/** The declaring
|
|
148
|
+
/** The declaring package's skill root; package agents may bind only here. */
|
|
148
149
|
skillRoot?: string;
|
|
149
150
|
}
|
|
150
151
|
|