@iowarp/clio-coder 0.4.6 → 0.4.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +283 -0
- package/CHANGELOG.md +50 -0
- package/CONTRIBUTING.md +102 -29
- package/NOTICE +8 -0
- package/README.md +37 -5
- package/dist/{acp-UVEVWSDL.js → acp-W3Y3TRHD.js} +12 -12
- package/dist/{agents-VWY37DTK.js → agents-J4ICNLQ3.js} +52 -52
- package/dist/assets/codewiki.json +1 -1
- package/dist/assets/tui-notices/get-east-asian-width-LICENSE +9 -0
- package/dist/assets/tui-notices/marked-LICENSE +44 -0
- package/dist/assets/tui-notices/pi-tui-LICENSE +21 -0
- package/dist/{auth-PCV2XQDV.js → auth-X2UJUMOC.js} +24 -24
- package/dist/{builtins-PD652MTK.js → builtins-XLXWWSRF.js} +6 -6
- package/dist/{chunk-DZK63TZJ.js → chunk-24S3DN22.js} +336 -612
- package/dist/{chunk-NTK3WTHM.js → chunk-24TOGHPO.js} +2 -2
- package/dist/{chunk-M6TAYK66.js → chunk-2O2LVQQK.js} +11 -4
- package/dist/{chunk-OQM5IVJY.js → chunk-34XHRVKG.js} +3 -3
- package/dist/{chunk-LY4N4TTL.js → chunk-3LXJOICS.js} +2 -2
- package/dist/{chunk-3BJGMT2D.js → chunk-3XE4NRLF.js} +1 -1
- package/dist/{chunk-N2OKBREN.js → chunk-4MFBBY2Z.js} +3 -3
- package/dist/{chunk-5VTJP36Q.js → chunk-4N2RZ4TO.js} +2 -2
- package/dist/{chunk-WNGF5AJX.js → chunk-4QKAITQT.js} +3 -3
- package/dist/chunk-4UHVS5T7.js +207 -0
- package/dist/{chunk-GLYBJ4RQ.js → chunk-5AJPUR72.js} +6 -6
- package/dist/{chunk-5CY4Q6QI.js → chunk-5EQO5NWP.js} +105 -3
- package/dist/{chunk-6HAO6X5B.js → chunk-65BGHOUR.js} +8 -5
- package/dist/{chunk-6VRRJT7L.js → chunk-6CA2BHOR.js} +2 -2
- package/dist/{chunk-HL26ADLH.js → chunk-6CB2IL4N.js} +2 -1
- package/dist/{chunk-E7RF4KBO.js → chunk-6LRLOJHQ.js} +3 -3
- package/dist/{chunk-HXHFDHB6.js → chunk-6TAATXXH.js} +6 -6
- package/dist/{chunk-P6M7RKMI.js → chunk-6YHPAAZR.js} +3 -3
- package/dist/{chunk-5QRX7SLS.js → chunk-7EEGBKV4.js} +7 -7
- package/dist/{chunk-BS4GAMUB.js → chunk-A67NR5AT.js} +2 -2
- package/dist/{chunk-WJIMKGD6.js → chunk-BAU36233.js} +8 -8
- package/dist/{chunk-PZN2LQY6.js → chunk-BO4XV5VX.js} +4 -4
- package/dist/{chunk-I2K2NCZQ.js → chunk-BQQ5MXUC.js} +6 -6
- package/dist/{chunk-X3BI7HTV.js → chunk-C3G5PNUO.js} +21 -21
- package/dist/{chunk-SRZOW5L2.js → chunk-C6GEXX4L.js} +1 -1
- package/dist/{chunk-6RYDAVQT.js → chunk-CE64C5K5.js} +219 -64
- package/dist/chunk-CP3HIR5H.js +2119 -0
- package/dist/{chunk-BBV5TKE6.js → chunk-CPXGJI2A.js} +2 -2
- package/dist/{chunk-IGLVVNEG.js → chunk-CULVKYTK.js} +4 -4
- package/dist/{chunk-DXLUVUD4.js → chunk-D2T66PDV.js} +5 -5
- package/dist/{chunk-NF3BK5WR.js → chunk-DACXIVVF.js} +5 -5
- package/dist/{chunk-IKRWLEDA.js → chunk-DLIYANB7.js} +20 -15
- package/dist/{chunk-RGZNQ5CT.js → chunk-DO7M3LSX.js} +9 -9
- package/dist/{chunk-2QPI3TR3.js → chunk-DVJL77SO.js} +2 -2
- package/dist/{chunk-ODUTYZIU.js → chunk-EUEXGXXR.js} +5 -5
- package/dist/{chunk-WKUYQBCG.js → chunk-EUZRMP4Y.js} +18 -16
- package/dist/{chunk-JMPL7NUB.js → chunk-G4LGUTOE.js} +4 -4
- package/dist/{chunk-CBSKDFWL.js → chunk-GEVQNST4.js} +2 -2
- package/dist/{chunk-NNWJYUNO.js → chunk-GFQ7P2UF.js} +7 -7
- package/dist/{chunk-SXQKNKRA.js → chunk-GI5RRMAH.js} +14 -14
- package/dist/{chunk-HPTJF6DG.js → chunk-GVZFCJHE.js} +336 -83
- package/dist/{chunk-ACCKVSHU.js → chunk-GXIWHXDB.js} +3 -3
- package/dist/{chunk-LUL5Z66S.js → chunk-HOX4YZ2K.js} +6 -5
- package/dist/chunk-HRAKUPIH.js +57 -0
- package/dist/{chunk-F5Z7EWMN.js → chunk-IJMW64DX.js} +50 -50
- package/dist/{chunk-QNWRHOMF.js → chunk-IMOD2YPV.js} +16 -9
- package/dist/{chunk-HZ2T2YED.js → chunk-IQCNVLO6.js} +28 -8
- package/dist/{chunk-HZFBVU5X.js → chunk-ISNCCX42.js} +8 -8
- package/dist/{chunk-7JSSKXG2.js → chunk-IZYTT3CD.js} +7 -3
- package/dist/chunk-KKEYGFX4.js +915 -0
- package/dist/{chunk-HHVJNVUJ.js → chunk-KS7ETA3P.js} +2 -2
- package/dist/{chunk-BLTEAUCB.js → chunk-L3Z5ANCV.js} +7 -7
- package/dist/{chunk-4VMV6OS6.js → chunk-LBFQMYS3.js} +2 -2
- package/dist/{chunk-URBGEOH3.js → chunk-M6Z2V6YU.js} +5 -5
- package/dist/{chunk-BT7HGDOX.js → chunk-MBJO5VNZ.js} +12 -12
- package/dist/chunk-MNQN3X6Y.js +595 -0
- package/dist/{chunk-3QKXHCGS.js → chunk-MZHXENL7.js} +5 -5
- package/dist/chunk-MZNWZUJM.js +1801 -0
- package/dist/{chunk-7YJWEF2L.js → chunk-N37QC5FV.js} +5 -5
- package/dist/{chunk-TJFDL26W.js → chunk-NCCQ6DVS.js} +7 -7
- package/dist/{chunk-P5JMBPDJ.js → chunk-NO7J45X6.js} +162 -47
- package/dist/chunk-OH3YYA3B.js +15 -0
- package/dist/{chunk-22PQ4TX4.js → chunk-P4DL2LM5.js} +16 -77
- package/dist/{chunk-LIN2K3EL.js → chunk-PFLOULP3.js} +4 -4
- package/dist/{chunk-QXFBABFJ.js → chunk-QKWL7SYE.js} +11 -11
- package/dist/chunk-RFCKPS2V.js +26 -0
- package/dist/{chunk-ZS43Y2FT.js → chunk-RTLNFZMD.js} +12 -4
- package/dist/{chunk-U7H5WRG5.js → chunk-RXFPB32E.js} +8 -6
- package/dist/{chunk-Q7NNUHQV.js → chunk-SEDI5K5B.js} +16 -16
- package/dist/{chunk-WV6TDAPN.js → chunk-SELG4SUR.js} +7 -7
- package/dist/{chunk-3WBALRQH.js → chunk-SER7RRAE.js} +27 -832
- package/dist/{chunk-K2HL3GBL.js → chunk-T4TY5GG3.js} +165 -15
- package/dist/chunk-T7QQBNLH.js +691 -0
- package/dist/{chunk-6OII3LOK.js → chunk-TLTGZTXI.js} +3 -3
- package/dist/chunk-TZ6UVP2H.js +637 -0
- package/dist/{chunk-3JLFK5MW.js → chunk-TZHN5ITX.js} +13 -41
- package/dist/{chunk-VANN3GDP.js → chunk-U3TPUXOQ.js} +399 -234
- package/dist/{chunk-VHMX7SXF.js → chunk-UA3W4FGC.js} +6 -6
- package/dist/{chunk-3O2ZAUGQ.js → chunk-UA6W4XFJ.js} +2 -2
- package/dist/chunk-UWD3JD5X.js +709 -0
- package/dist/chunk-V4ZKOKRB.js +13433 -0
- package/dist/{chunk-NC4KV7EL.js → chunk-VCRVEDUC.js} +5 -5
- package/dist/{chunk-4DU2TVI4.js → chunk-VMATUZB6.js} +12 -10
- package/dist/{chunk-J2FYEQ5L.js → chunk-VTYHHQ57.js} +2 -2
- package/dist/chunk-WB7POC6M.js +891 -0
- package/dist/{chunk-3HQVBIKD.js → chunk-WBVKKTUT.js} +2 -2
- package/dist/{chunk-EHOSNVVM.js → chunk-WLHX3MM5.js} +6 -2
- package/dist/{chunk-24T2YZ7A.js → chunk-WN552PKN.js} +553 -298
- package/dist/{chunk-4U4TKZFR.js → chunk-WT5TRMO4.js} +51 -26
- package/dist/{chunk-XWMSPJYN.js → chunk-WURGVOZJ.js} +56 -12
- package/dist/{chunk-7WUZEB2M.js → chunk-XR3XJN2M.js} +2 -2
- package/dist/chunk-XW2UZICE.js +372 -0
- package/dist/{chunk-2AKYFREM.js → chunk-XZ6UFQ52.js} +11 -11
- package/dist/chunk-Y3JU5RPK.js +8 -0
- package/dist/chunk-YKRJTYNP.js +1143 -0
- package/dist/{chunk-PWWSIB2A.js → chunk-ZGIGW4ZG.js} +5 -5
- package/dist/cli/index.js +34 -36
- package/dist/{clio-QQCMTUZE.js → clio-L2P7S2R2.js} +9 -9
- package/dist/{code-nav-GUPM6766.js → code-nav-B5LNX4KU.js} +25 -25
- package/dist/{components-TNIKXCBH.js → components-63MMQKUT.js} +6 -6
- package/dist/{config-IIM7YOD3.js → config-YXARKGTX.js} +70 -67
- package/dist/{configure-4ZM5HWJX.js → configure-LMVQJ46J.js} +47 -35
- package/dist/{context-OL5P3HEP.js → context-7HJEWTTP.js} +87 -44
- package/dist/{context-44BZLJ3J.js → context-XSZKKFBW.js} +14 -14
- package/dist/{context-AIDVQKMW.js → context-YG2LZDYZ.js} +60 -58
- package/dist/{context-clear-OQV76MYP.js → context-clear-AC5NXHM2.js} +57 -55
- package/dist/{context-index-HP2JFUWA.js → context-index-KKTPRV5G.js} +3 -3
- package/dist/{context-map-INTXD54D.js → context-map-T7ROR5D5.js} +4 -4
- package/dist/{context-working-set-ZUW3EGLS.js → context-working-set-F4Q4J3NS.js} +12 -10
- package/dist/{detail-UXPWRANG.js → detail-H73BEF2N.js} +58 -56
- package/dist/{dispatch-runner-P3ZW6G77.js → dispatch-runner-3RY5FSJC.js} +74 -72
- package/dist/{doctor-JJVGPZWT.js → doctor-EQYJOGUG.js} +44 -30
- package/dist/{eval-V2RTN3UH.js → eval-4P7O6CCE.js} +109 -46
- package/dist/{evidence-35PYWGSO.js → evidence-D6GUSYJW.js} +57 -55
- package/dist/{evidence-CIGGKI6J.js → evidence-O76QF7TZ.js} +62 -59
- package/dist/{evolve-33SM3NJP.js → evolve-H47BCETS.js} +58 -56
- package/dist/{extensions-YVRHX6ZI.js → extensions-NNL3ZOCU.js} +98 -20
- package/dist/{fleet-LFO7SIPC.js → fleet-KMNS6NOM.js} +106 -99
- package/dist/{fleet-commands-RLK72GU3.js → fleet-commands-DOWSYCBX.js} +14 -14
- package/dist/{fleet-decisions-3SBSCTCW.js → fleet-decisions-S3PTZV2D.js} +9 -9
- package/dist/{fleet-graph-JZIBCGMW.js → fleet-graph-F2DE2TME.js} +26 -24
- package/dist/{fleet-inspect-2L5YGGZJ.js → fleet-inspect-EN2Q6IVB.js} +60 -57
- package/dist/{fleet-preflight-QRSHIIDE.js → fleet-preflight-FRLETDD3.js} +3 -3
- package/dist/{fleet-validate-LIAVKDUU.js → fleet-validate-B2XDLS57.js} +28 -29
- package/dist/{fleet-verify-JIK3OQZR.js → fleet-verify-4JKUWGJ7.js} +57 -55
- package/dist/{fleet-view-IWHYGQKK.js → fleet-view-BHJFW26B.js} +60 -57
- package/dist/{init-NJEDOTQW.js → init-XAT5N5YM.js} +79 -74
- package/dist/interop-FVECHFKG.js +246 -0
- package/dist/{inventory-74UL7UHU.js → inventory-7KFQGLCV.js} +60 -57
- package/dist/library-NY2XOT75.js +492 -0
- package/dist/library-QAPAO23R.js +306 -0
- package/dist/library-import-5Y6MAS3R.js +183 -0
- package/dist/library-inventory-JT6HWITQ.js +56 -0
- package/dist/library-validation-EQUH25DC.js +42 -0
- package/dist/{memory-I76I5VUH.js → memory-DYVTTCP6.js} +58 -56
- package/dist/{models-D4YDIQZQ.js → models-MASFJ6Y2.js} +48 -36
- package/dist/{monitor-NKVD55HX.js → monitor-YMP4NXJJ.js} +64 -61
- package/dist/{orchestrator-I6OATVPK.js → orchestrator-AFQRRTEI.js} +3685 -1841
- package/dist/{panes-7BTYH3XQ.js → panes-D3Y2KFG5.js} +4 -4
- package/dist/{panes-WPOMEMRH.js → panes-NICTHQCV.js} +7 -7
- package/dist/{paths-J3KN7UAO.js → paths-PSFAUIGO.js} +5 -5
- package/dist/{preload-EJAWJEIO.js → preload-5Q7VXRFJ.js} +57 -55
- package/dist/{reset-4XMQKDNZ.js → reset-7NKZK7JN.js} +9 -9
- package/dist/{resources-TVYVXK3Q.js → resources-NILSIZAT.js} +94 -38
- package/dist/{run-OWQNNSJU.js → run-BPZGEBZV.js} +121 -105
- package/dist/{share-NPZZMUXG.js → share-EZ6ERBMH.js} +31 -28
- package/dist/skills-BTVVNYVM.js +100 -0
- package/dist/{skills-eval-J5TCKSJA.js → skills-eval-UY34MNK7.js} +110 -72
- package/dist/{skills-inventory-7II4DM57.js → skills-inventory-JDHSIA7I.js} +30 -25
- package/dist/{slash-commands-MDSDSWYF.js → slash-commands-K4FNQ2AT.js} +49 -46
- package/dist/{steer-S7D7IKPU.js → steer-2B3EQGFH.js} +4 -4
- package/dist/{support-5VAEC32W.js → support-L2SOL3IE.js} +7 -7
- package/dist/{targets-KILZEOCE.js → targets-44VKGFLN.js} +64 -58
- package/dist/{tasks-R6P6OV22.js → tasks-3KODKFU7.js} +12 -12
- package/dist/{terminal-lease-LZCG2KN3.js → terminal-lease-LXA7MMPO.js} +32 -19
- package/dist/{tools-6OCQ6SVB.js → tools-3UB7TEVR.js} +7 -7
- package/dist/{trace-JHLXWUMN.js → trace-TAMIU4OJ.js} +5 -4
- package/dist/{tui-primitives-RCY2HN7G.js → tui-primitives-A6MUW32V.js} +3 -2
- package/dist/{uninstall-FXYMFFRT.js → uninstall-QYVRPEM4.js} +9 -9
- package/dist/{upgrade-D2OZH6IQ.js → upgrade-7PMKM2JH.js} +15 -16
- package/dist/{usage-PIASNUS4.js → usage-6EQV7EQK.js} +70 -67
- package/dist/{verifiers-LTHUY2PX.js → verifiers-JLITWSHU.js} +15 -15
- package/dist/{verify-HYF7KBVE.js → verify-T7NAEVIG.js} +13 -13
- package/dist/{web-fetch-MQN4FH3X.js → web-fetch-W4TNW4Q7.js} +4 -4
- package/dist/{wiki-generate-RK7JQ5NP.js → wiki-generate-T2TJQJUA.js} +81 -76
- package/dist/{with-panes-OFTNAR4Y.js → with-panes-CHFC7HGI.js} +4 -4
- package/dist/worker/entry.js +283 -76
- package/docs/README.md +43 -0
- package/docs/architecture/architecture.md +8 -7
- package/docs/architecture/artifact-versions.md +3 -3
- package/docs/architecture/context-engine.md +35 -1
- package/docs/architecture/library.md +32 -0
- package/docs/architecture/middleware-and-components.md +1 -1
- package/docs/architecture/model-catalog.md +21 -1
- package/docs/architecture/pi-boundary.md +18 -0
- package/docs/architecture/prompt-envelope-and-tools.md +5 -5
- package/docs/architecture/safety-model.md +21 -2
- package/docs/architecture/session-lifecycle.md +12 -1
- package/docs/architecture/tui-design.md +108 -9
- package/docs/architecture/worker-context.md +106 -0
- package/docs/guide/authoring-plugins.md +160 -0
- package/docs/guide/built-in-agents.md +5 -5
- package/docs/guide/commands-and-modes.md +161 -56
- package/docs/guide/configuration-and-targets.md +1 -1
- package/docs/guide/configuration-reference.md +27 -34
- package/docs/guide/environment-variables.md +2 -2
- package/docs/guide/exit-codes-and-output.md +1 -1
- package/docs/guide/extensions-and-sharing.md +93 -53
- package/docs/guide/fleet-dispatch.md +31 -4
- package/docs/guide/glossary.md +1 -1
- package/docs/guide/harness-extensions.md +291 -0
- package/docs/guide/installation-and-lifecycle.md +9 -9
- package/docs/guide/interop.md +243 -0
- package/docs/guide/panes-and-files.md +3 -3
- package/docs/guide/plugins.md +80 -0
- package/docs/guide/resource-library.md +111 -45
- package/docs/guide/skills-marketplace.md +35 -72
- package/docs/guide/tool-usage.md +19 -7
- package/docs/guide/troubleshooting.md +1 -1
- package/docs/process/development-pipeline.md +14 -14
- package/docs/process/documentation-coverage.md +28 -1
- package/docs/process/documentation-guide.md +15 -7
- package/docs/process/eval-runner.md +8 -3
- package/docs/process/performance-methodology.md +1 -1
- package/docs/process/release-cut-checklist.md +4 -0
- package/docs/process/scientific-validation.md +23 -0
- package/evals/scalar-decision-machinery.ts +1 -1
- package/examples/extensions/README.md +67 -0
- package/examples/extensions/lab-status/clio-coder-extension.json +14 -0
- package/examples/extensions/lab-status/extension.mjs +68 -0
- package/examples/extensions/lab-status/jobs.synthetic.json +9 -0
- package/examples/extensions/measurements/clio-coder-extension.json +28 -0
- package/examples/extensions/measurements/summarize.cjs +23 -0
- package/library/README.md +109 -0
- package/library/_authoring/templates/agent/README.md +28 -0
- package/library/_authoring/templates/agent/agents/benchmark-scout.md +30 -0
- package/library/_authoring/templates/agent/plugin.json +23 -0
- package/library/_authoring/templates/fleet/README.md +29 -0
- package/library/_authoring/templates/fleet/fleets/pipeline-review.md +31 -0
- package/library/_authoring/templates/fleet/plugin.json +23 -0
- package/library/_authoring/templates/plugin/README.md +37 -0
- package/library/_authoring/templates/plugin/agents/data-curator.md +31 -0
- package/library/_authoring/templates/plugin/assets/curation-guide.md +22 -0
- package/library/_authoring/templates/plugin/plugin.json +42 -0
- package/library/_authoring/templates/plugin/prompts/inspect-dataset.md +15 -0
- package/library/_authoring/templates/plugin/skills/dataset-curation/SKILL.md +36 -0
- package/library/_authoring/templates/plugin/skills/dataset-curation/evals.md +17 -0
- package/library/_authoring/templates/prompt/README.md +28 -0
- package/library/_authoring/templates/prompt/plugin.json +23 -0
- package/library/_authoring/templates/prompt/prompts/paper-summary.md +26 -0
- package/library/_authoring/templates/skill/README.md +24 -0
- package/library/_authoring/templates/skill/SKILL.md +39 -0
- package/library/_authoring/templates/skill/evals.md +30 -0
- package/library/_authoring/templates/skill/plugin.json +23 -0
- package/library/agents/README.md +7 -0
- package/library/fleets/README.md +7 -0
- package/library/plugins/materio/README.md +137 -0
- package/library/plugins/materio/ai.iowarp.clio/agents/materio-lab-definer.md +208 -0
- package/library/plugins/materio/ai.iowarp.clio/agents/materio-literature-reviewer.md +308 -0
- package/library/plugins/materio/ai.iowarp.clio/agents/materio-research-explorer.md +249 -0
- package/library/plugins/materio/ai.iowarp.clio/agents/materio-task-executor.md +416 -0
- package/library/plugins/materio/ai.iowarp.clio/agents/materio-task-verifier.md +60 -0
- package/library/plugins/materio/ai.iowarp.clio/agents/materio-workflow-planner.md +238 -0
- package/library/plugins/materio/ai.iowarp.clio/fleets/materio-execute-task.md +50 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/add-task.md +66 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/archive-task.md +65 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/checkpoint.md +26 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/define-research-tasks.md +230 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/define-virtual-lab.md +181 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/execute-task.md +292 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/help.md +129 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/identify-research.md +206 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/literature-review.md +201 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/pause-research.md +12 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/progress.md +105 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/remove-task.md +63 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/resume-research.md +64 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/settings.md +16 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/status.md +92 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/upload-data.md +104 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/wtfp.md +145 -0
- package/library/plugins/materio/ai.iowarp.clio/references/execution.md +56 -0
- package/library/plugins/materio/ai.iowarp.portability/provenance.json +9 -0
- package/library/plugins/materio/assets/actions/add-task.md +86 -0
- package/library/plugins/materio/assets/actions/archive-task.md +84 -0
- package/library/plugins/materio/assets/actions/checkpoint.md +47 -0
- package/library/plugins/materio/assets/actions/define-research-tasks.md +228 -0
- package/library/plugins/materio/assets/actions/define-virtual-lab.md +179 -0
- package/library/plugins/materio/assets/actions/execute-task.md +290 -0
- package/library/plugins/materio/assets/actions/help.md +140 -0
- package/library/plugins/materio/assets/actions/identify-research.md +204 -0
- package/library/plugins/materio/assets/actions/literature-review.md +199 -0
- package/library/plugins/materio/assets/actions/pause-research.md +34 -0
- package/library/plugins/materio/assets/actions/progress.md +125 -0
- package/library/plugins/materio/assets/actions/remove-task.md +82 -0
- package/library/plugins/materio/assets/actions/resume-research.md +84 -0
- package/library/plugins/materio/assets/actions/settings.md +38 -0
- package/library/plugins/materio/assets/actions/status.md +112 -0
- package/library/plugins/materio/assets/actions/upload-data.md +123 -0
- package/library/plugins/materio/assets/actions/wtfp.md +179 -0
- package/library/plugins/materio/assets/references/research-domains.md +134 -0
- package/library/plugins/materio/assets/references/research-policy.md +77 -0
- package/library/plugins/materio/assets/references/traditional-workflows.md +146 -0
- package/library/plugins/materio/assets/scripts/check_physics.py +271 -0
- package/library/plugins/materio/assets/scripts/check_scripts.py +248 -0
- package/library/plugins/materio/assets/scripts/project_plugin.py +165 -0
- package/library/plugins/materio/assets/scripts/research_state.py +400 -0
- package/library/plugins/materio/assets/scripts/verify_citations.py +616 -0
- package/library/plugins/materio/assets/templates/RESEARCH.md +39 -0
- package/library/plugins/materio/assets/templates/VIRTUAL-LAB.md +120 -0
- package/library/plugins/materio/assets/templates/WORKFLOW.md +42 -0
- package/library/plugins/materio/assets/templates/config.json +5 -0
- package/library/plugins/materio/evals/scripts.yaml +29 -0
- package/library/plugins/materio/plugin.json +530 -0
- package/library/plugins/materio/skills/materio-lab-definer/SKILL.md +74 -0
- package/library/plugins/materio/skills/materio-literature-reviewer/SKILL.md +64 -0
- package/library/plugins/materio/skills/materio-research-explorer/SKILL.md +74 -0
- package/library/plugins/materio/skills/materio-task-executor/SKILL.md +214 -0
- package/library/plugins/materio/skills/materio-task-verifier/SKILL.md +46 -0
- package/library/plugins/materio/skills/materio-workflow-planner/SKILL.md +79 -0
- package/library/plugins/materio/tests/test_check_physics.py +139 -0
- package/library/plugins/materio/tests/test_check_scripts.py +140 -0
- package/library/plugins/materio/tests/test_research_state.py +291 -0
- package/library/plugins/materio/tests/test_verify_citations.py +337 -0
- package/library/prompts/README.md +7 -0
- package/library/registry.yaml +921 -0
- package/library/skills/README.md +120 -0
- package/{skills → library/skills}/coding/ast-grep/SKILL.md +1 -1
- package/{skills → library/skills}/coding/ast-grep/evals.md +1 -1
- package/library/skills/coding/ast-grep/plugin.json +23 -0
- package/{skills → library/skills}/coding/coding-standards/SKILL.md +1 -1
- package/{skills → library/skills}/coding/coding-standards/evals.md +1 -1
- package/library/skills/coding/coding-standards/plugin.json +23 -0
- package/{skills → library/skills}/coding/prototype/SKILL.md +1 -1
- package/{skills → library/skills}/coding/prototype/evals.md +1 -1
- package/library/skills/coding/prototype/plugin.json +23 -0
- package/{skills → library/skills}/coding/tdd/SKILL.md +1 -1
- package/{skills → library/skills}/coding/tdd/evals.md +1 -1
- package/library/skills/coding/tdd/plugin.json +23 -0
- package/{skills → library/skills}/context/context-handoff/SKILL.md +1 -1
- package/{skills → library/skills}/context/context-handoff/evals.md +1 -1
- package/library/skills/context/context-handoff/plugin.json +23 -0
- package/{skills → library/skills}/context/context-prime/SKILL.md +1 -1
- package/{skills → library/skills}/context/context-prime/evals.md +1 -1
- package/library/skills/context/context-prime/plugin.json +23 -0
- package/{skills → library/skills}/git/branch-closeout/SKILL.md +1 -1
- package/library/skills/git/branch-closeout/plugin.json +23 -0
- package/{skills → library/skills}/git/file-ticket/SKILL.md +1 -1
- package/library/skills/git/file-ticket/plugin.json +23 -0
- package/{skills → library/skills}/git/fix-issue/SKILL.md +1 -1
- package/library/skills/git/fix-issue/plugin.json +23 -0
- package/{skills → library/skills}/git/resolve-merge-conflicts/SKILL.md +1 -1
- package/{skills → library/skills}/git/resolve-merge-conflicts/evals.md +1 -1
- package/library/skills/git/resolve-merge-conflicts/plugin.json +23 -0
- package/{skills → library/skills}/git/ship/SKILL.md +1 -1
- package/library/skills/git/ship/plugin.json +23 -0
- package/{skills → library/skills}/git/worktree-create/SKILL.md +1 -1
- package/library/skills/git/worktree-create/plugin.json +23 -0
- package/{skills → library/skills}/git/worktree-merge/SKILL.md +1 -1
- package/library/skills/git/worktree-merge/plugin.json +23 -0
- package/{skills → library/skills}/meta/clio-coder-dev/SKILL.md +1 -1
- package/{skills → library/skills}/meta/clio-coder-dev/evals.md +1 -1
- package/library/skills/meta/clio-coder-dev/plugin.json +23 -0
- package/{skills → library/skills}/meta/clio-coder-test/SKILL.md +1 -1
- package/{skills → library/skills}/meta/clio-coder-test/evals.md +1 -1
- package/library/skills/meta/clio-coder-test/plugin.json +23 -0
- package/{skills → library/skills}/meta/credentials/SKILL.md +1 -1
- package/{skills → library/skills}/meta/credentials/evals.md +1 -1
- package/library/skills/meta/credentials/plugin.json +23 -0
- package/library/skills/meta/find-skills/SKILL.md +85 -0
- package/library/skills/meta/find-skills/evals.md +65 -0
- package/library/skills/meta/find-skills/plugin.json +23 -0
- package/{skills → library/skills}/meta/herdr/SKILL.md +1 -1
- package/{skills → library/skills}/meta/herdr/evals.md +1 -1
- package/library/skills/meta/herdr/plugin.json +23 -0
- package/{skills → library/skills}/meta/skill-craft/SKILL.md +23 -9
- package/{skills → library/skills}/meta/skill-craft/evals.md +11 -3
- package/library/skills/meta/skill-craft/plugin.json +23 -0
- package/{skills → library/skills}/planning/archify/SKILL.md +13 -13
- package/library/skills/planning/archify/plugin.json +23 -0
- package/{skills → library/skills}/planning/architecture/SKILL.md +1 -1
- package/{skills → library/skills}/planning/architecture/evals.md +1 -1
- package/library/skills/planning/architecture/plugin.json +23 -0
- package/{skills → library/skills}/planning/backlog/SKILL.md +1 -1
- package/{skills → library/skills}/planning/backlog/evals.md +1 -1
- package/library/skills/planning/backlog/plugin.json +23 -0
- package/{skills → library/skills}/planning/prd/SKILL.md +1 -1
- package/{skills → library/skills}/planning/prd/evals.md +1 -1
- package/library/skills/planning/prd/plugin.json +23 -0
- package/{skills → library/skills}/planning/product-intent/SKILL.md +1 -1
- package/{skills → library/skills}/planning/product-intent/evals.md +1 -1
- package/library/skills/planning/product-intent/plugin.json +23 -0
- package/{skills → library/skills}/planning/tech-spec/SKILL.md +1 -1
- package/{skills → library/skills}/planning/tech-spec/evals.md +1 -1
- package/library/skills/planning/tech-spec/plugin.json +23 -0
- package/{skills → library/skills}/registry.yaml +7 -7
- package/{skills → library/skills}/remote.yaml +1 -1
- package/{skills → library/skills}/research/arxiv-literature/SKILL.md +1 -1
- package/{skills → library/skills}/research/arxiv-literature/evals.md +1 -1
- package/library/skills/research/arxiv-literature/plugin.json +23 -0
- package/{skills → library/skills}/research/experiment-protocol/SKILL.md +1 -1
- package/{skills → library/skills}/research/experiment-protocol/evals.md +1 -1
- package/library/skills/research/experiment-protocol/plugin.json +23 -0
- package/{skills → library/skills}/research/scientific-debugging/SKILL.md +1 -1
- package/{skills → library/skills}/research/scientific-debugging/evals.md +1 -1
- package/library/skills/research/scientific-debugging/plugin.json +23 -0
- package/{skills → library/skills}/research/scientific-modernization/SKILL.md +1 -1
- package/{skills → library/skills}/research/scientific-modernization/evals.md +1 -1
- package/library/skills/research/scientific-modernization/plugin.json +23 -0
- package/{skills → library/skills}/skill-marketplace.json +37 -37
- package/{skills → library/skills}/workflow/cut-it/SKILL.md +1 -1
- package/{skills → library/skills}/workflow/cut-it/evals.md +1 -1
- package/library/skills/workflow/cut-it/plugin.json +23 -0
- package/{skills → library/skills}/workflow/design-council/SKILL.md +1 -1
- package/{skills → library/skills}/workflow/design-council/evals.md +1 -1
- package/library/skills/workflow/design-council/plugin.json +23 -0
- package/{skills → library/skills}/workflow/grill-me/SKILL.md +1 -1
- package/{skills → library/skills}/workflow/grill-me/evals.md +1 -1
- package/library/skills/workflow/grill-me/plugin.json +23 -0
- package/{skills → library/skills}/workflow/workflow-distiller/SKILL.md +14 -11
- package/{skills → library/skills}/workflow/workflow-distiller/evals.md +14 -6
- package/library/skills/workflow/workflow-distiller/plugin.json +23 -0
- package/package.json +12 -5
- package/src/cli/agents.ts +1 -1
- package/src/cli/config-inspect.ts +1 -1
- package/src/cli/configure.ts +2 -2
- package/src/cli/eval.ts +40 -6
- package/src/cli/extensions.ts +74 -8
- package/src/cli/fleet-preflight.ts +2 -0
- package/src/cli/fleet.ts +2 -0
- package/src/cli/index.ts +1 -3
- package/src/cli/interop-inspect.ts +61 -33
- package/src/cli/interop.ts +79 -9
- package/src/cli/library-import.ts +139 -0
- package/src/cli/library.ts +418 -120
- package/src/cli/run.ts +26 -9
- package/src/cli/skills-eval.ts +43 -6
- package/src/cli/skills-inventory.ts +6 -2
- package/src/cli/skills.ts +44 -491
- package/src/core/bus-events.ts +5 -0
- package/src/core/defaults.ts +1 -1
- package/src/core/recent-models.ts +2 -2
- package/src/core/session-routing.ts +3 -3
- package/src/core/state-file-lock.ts +1 -1
- package/src/core/tool-names.ts +5 -0
- package/src/domains/agents/extension.ts +42 -6
- package/src/domains/agents/fleet-commands.ts +92 -1
- package/src/domains/agents/fleet-contract.ts +87 -19
- package/src/domains/agents/recipe.ts +5 -4
- package/src/domains/agents/registry.ts +80 -24
- package/src/domains/config/keybindings.ts +155 -95
- package/src/domains/context/worker/contract.ts +91 -0
- package/src/domains/context/worker/pressure.ts +120 -0
- package/src/domains/context/worker/recall.ts +62 -0
- package/src/domains/context/worker/select.ts +164 -0
- package/src/domains/context/worker/snapshot.ts +35 -0
- package/src/domains/context/worker/store.ts +16 -0
- package/src/domains/context/working-set/replay/synthetic.ts +2 -1
- package/src/domains/dispatch/active-route-planner.ts +2 -0
- package/src/domains/dispatch/backoff.ts +1 -0
- package/src/domains/dispatch/code-step.ts +12 -2
- package/src/domains/dispatch/contract.ts +3 -0
- package/src/domains/dispatch/execution-plan.ts +2 -0
- package/src/domains/dispatch/extension.ts +109 -27
- package/src/domains/dispatch/fleet-plan.ts +10 -0
- package/src/domains/dispatch/fleet-run.ts +1 -0
- package/src/domains/dispatch/orphan-recovery.ts +1 -0
- package/src/domains/dispatch/receipt-integrity.ts +4 -0
- package/src/domains/dispatch/state.ts +1 -0
- package/src/domains/dispatch/types.ts +5 -0
- package/src/domains/dispatch/validation.ts +12 -0
- package/src/domains/dispatch/workspace-checkpoint.ts +1 -1
- package/src/domains/evidence/failure-attribution.ts +1 -0
- package/src/domains/evidence/trust-status.ts +22 -3
- package/src/domains/extensions/command-schema.ts +145 -0
- package/src/domains/extensions/command-tools.ts +15 -0
- package/src/domains/extensions/compatibility.ts +7 -0
- package/src/domains/extensions/contract.ts +0 -4
- package/src/domains/extensions/discovery.ts +69 -205
- package/src/domains/extensions/extension.ts +0 -4
- package/src/domains/extensions/index.ts +1 -5
- package/src/domains/extensions/manager.ts +1 -6
- package/src/domains/extensions/operator-commands.ts +29 -0
- package/src/domains/extensions/operator-runtime.ts +483 -0
- package/src/domains/extensions/public-api.ts +53 -0
- package/src/domains/extensions/runtime-child.mjs +114 -0
- package/src/domains/extensions/runtime-process.ts +306 -0
- package/src/domains/extensions/runtime-schema.ts +146 -0
- package/src/domains/extensions/{resources.ts → snapshot-access.ts} +1 -17
- package/src/domains/extensions/snapshot.ts +4 -32
- package/src/domains/extensions/state.ts +5 -83
- package/src/domains/extensions/types.ts +33 -34
- package/src/domains/interop/adopt.ts +546 -0
- package/src/domains/interop/detect.ts +50 -12
- package/src/domains/interop/foreign.ts +554 -0
- package/src/domains/interop/import.ts +277 -0
- package/src/domains/interop/index.ts +24 -0
- package/src/domains/interop/install.ts +6 -0
- package/src/domains/interop/inventory.ts +351 -0
- package/src/domains/interop/projection.ts +360 -0
- package/src/domains/interop/registry.ts +106 -3
- package/src/domains/interop/types.ts +51 -0
- package/src/domains/lifecycle/migrations/index.ts +0 -2
- package/src/domains/lifecycle/naming-resources.ts +1 -1
- package/src/domains/middleware/marketplace-offer.ts +1 -1
- package/src/domains/mux/contract.ts +1 -1
- package/src/domains/plugins/catalog.ts +204 -0
- package/src/domains/plugins/contract.ts +24 -0
- package/src/domains/plugins/discovery.ts +316 -0
- package/src/domains/plugins/extension.ts +40 -0
- package/src/domains/plugins/index.ts +77 -0
- package/src/domains/plugins/integrity.ts +6 -0
- package/src/domains/plugins/manifest.ts +3 -0
- package/src/domains/plugins/resources.ts +102 -0
- package/src/domains/plugins/state.ts +753 -0
- package/src/domains/plugins/types.ts +217 -0
- package/src/domains/prompts/extension.ts +9 -2
- package/src/domains/prompts/fragments/operating/skills.md +10 -10
- package/src/domains/resources/common-loader.ts +9 -6
- package/src/domains/resources/index.ts +67 -0
- package/src/domains/resources/library-actions.ts +836 -0
- package/src/domains/resources/library-evals.ts +38 -0
- package/src/domains/resources/library-inventory.ts +1048 -0
- package/src/domains/resources/library-types.ts +50 -0
- package/src/domains/resources/library-validation.ts +634 -0
- package/src/domains/resources/library.ts +437 -156
- package/src/domains/resources/package-references.ts +66 -0
- package/src/domains/resources/prompts/loader.ts +75 -41
- package/src/domains/resources/skills/install.ts +2 -2
- package/src/domains/resources/skills/loader.ts +77 -22
- package/src/domains/resources/skills/marketplace.ts +48 -57
- package/src/domains/resources/skills/promotion.ts +2 -2
- package/src/domains/resources/skills/provenance-pin.ts +17 -4
- package/src/domains/safety/action-classifier.ts +2 -2
- package/src/domains/safety/default-path-policy.ts +3 -1
- package/src/domains/safety/policy-engine.ts +1 -1
- package/src/domains/safety/protected-artifacts.ts +21 -5
- package/src/domains/safety/skill-authority.ts +5 -2
- package/src/domains/share/archive.ts +1 -1
- package/src/engine/apis/openai-completions.ts +52 -2
- package/src/engine/notices/pi-tui-LICENSE +21 -0
- package/src/engine/tui.ts +3 -0
- package/src/engine/worker-runtime.ts +58 -14
- package/src/engine/worker-tools.ts +5 -0
- package/src/entry/orchestrator.ts +26 -5
- package/src/entry/plugin-reload.ts +18 -0
- package/src/interactive/application-controller.ts +67 -21
- package/src/interactive/chat-loop.ts +32 -5
- package/src/interactive/chat-panel.ts +5 -1
- package/src/interactive/clio-editor.ts +53 -21
- package/src/interactive/command-output.ts +56 -1
- package/src/interactive/editor-submit.ts +65 -28
- package/src/interactive/fleet-run-preview.ts +2 -0
- package/src/interactive/follow-up-queue-panel.ts +3 -3
- package/src/interactive/footer/dashboard.ts +4 -1
- package/src/interactive/footer/notifications.ts +2 -2
- package/src/interactive/footer/widgets.ts +2 -2
- package/src/interactive/interactive-application.ts +209 -21
- package/src/interactive/interactive-input-runtime.ts +254 -7
- package/src/interactive/interactive-presentation.ts +41 -12
- package/src/interactive/interactive-slash-runtime.ts +37 -8
- package/src/interactive/keybinding-manager.ts +156 -79
- package/src/interactive/keyboard-owner.ts +37 -0
- package/src/interactive/leader-key.ts +49 -102
- package/src/interactive/leader-menu.ts +45 -0
- package/src/interactive/overlay-ask-user-lifecycle.ts +9 -1
- package/src/interactive/overlay-frame.ts +15 -0
- package/src/interactive/overlay-key-routing.ts +46 -47
- package/src/interactive/overlay-lifecycle.ts +30 -15
- package/src/interactive/overlay-resource-openers.ts +56 -46
- package/src/interactive/overlays/ask-user.ts +630 -556
- package/src/interactive/overlays/extension-panel.ts +70 -0
- package/src/interactive/overlays/extensions.ts +28 -5
- package/src/interactive/overlays/fleet-run-approval.ts +7 -3
- package/src/interactive/overlays/help-reference.ts +89 -40
- package/src/interactive/overlays/interop.ts +122 -3
- package/src/interactive/overlays/keybinding-detail.ts +2 -2
- package/src/interactive/overlays/library-lifecycle.ts +90 -0
- package/src/interactive/overlays/library-model.ts +574 -0
- package/src/interactive/overlays/library-review.ts +557 -0
- package/src/interactive/overlays/library-tabs.ts +3 -15
- package/src/interactive/overlays/library.ts +602 -0
- package/src/interactive/overlays/list-overlay.ts +218 -39
- package/src/interactive/overlays/model-selector.ts +28 -25
- package/src/interactive/overlays/session-selector.ts +9 -3
- package/src/interactive/overlays/settings.ts +25 -18
- package/src/interactive/overlays/tree-selector.ts +16 -11
- package/src/interactive/permission-hint.ts +13 -0
- package/src/interactive/permission-overlay.ts +77 -28
- package/src/interactive/prompt-source-label.ts +21 -0
- package/src/interactive/renderers/reference-card.ts +35 -0
- package/src/interactive/renderers/worker-entry.ts +35 -3
- package/src/interactive/slash-autocomplete.ts +99 -1
- package/src/interactive/slash-commands.ts +390 -67
- package/src/interactive/slash-spec.ts +0 -1
- package/src/interactive/terminal-lease.ts +44 -12
- package/src/interactive/turn-queues.ts +8 -7
- package/src/interactive/turn-runtime.ts +1 -1
- package/src/interactive/view/view-overlay.ts +19 -14
- package/src/interactive/welcome-dashboard.ts +525 -408
- package/src/tools/bootstrap.ts +8 -0
- package/src/tools/builtin-tool-catalog.ts +7 -2
- package/src/tools/context/index.ts +58 -5
- package/src/tools/context/library.ts +465 -0
- package/src/tools/context/surface.ts +20 -6
- package/src/tools/core-bootstrap.ts +3 -0
- package/src/tools/dispatch-admission.ts +24 -1
- package/src/tools/dispatch-arguments.ts +8 -0
- package/src/tools/dispatch-plan.ts +32 -0
- package/src/tools/dispatch-schema.ts +31 -1
- package/src/tools/dispatch-types.ts +3 -0
- package/src/tools/dispatch.ts +1 -1
- package/src/tools/harness-extensions.ts +169 -0
- package/src/tools/observation.ts +4 -0
- package/src/tools/policy.ts +7 -1
- package/src/tools/registry.ts +19 -1
- package/src/tools/worker-evidence.ts +5 -0
- package/src/worker/context-seed.ts +192 -0
- package/src/worker/entry.ts +1 -0
- package/src/worker/spec-contract.ts +8 -1
- package/dist/chunk-3UW3KU4A.js +0 -21
- package/dist/chunk-536HXRFE.js +0 -1257
- package/dist/chunk-B3MOMLJ4.js +0 -433
- package/dist/chunk-CXQ37WJH.js +0 -45
- package/dist/chunk-KTFSFCVN.js +0 -46
- package/dist/chunk-QCOV5DFY.js +0 -911
- package/dist/chunk-QRFXEO6Y.js +0 -17
- package/dist/chunk-VAHLPXPY.js +0 -399
- package/dist/interop-RVCAYECG.js +0 -115
- package/dist/library-CTKZA7K3.js +0 -226
- package/dist/skills-OXFEAWMT.js +0 -510
- package/skills/README.md +0 -418
- package/skills/meta/find-skills/SKILL.md +0 -78
- package/skills/meta/find-skills/evals.md +0 -47
- package/src/domains/extensions/resource-path.ts +0 -27
- package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +0 -27
- package/src/interactive/overlays/agents.ts +0 -70
- package/src/interactive/overlays/library-install-confirm.ts +0 -152
- package/src/interactive/overlays/prompts.ts +0 -89
- package/src/interactive/overlays/skills-hub.ts +0 -615
- /package/{skills → library/skills}/coding/ast-grep/references/rule_reference.md +0 -0
- /package/{skills → library/skills}/coding/prototype/references/LOGIC.md +0 -0
- /package/{skills → library/skills}/coding/prototype/references/UI.md +0 -0
- /package/{skills → library/skills}/coding/tdd/references/mocking.md +0 -0
- /package/{skills → library/skills}/coding/tdd/references/tests.md +0 -0
- /package/{skills → library/skills}/context/context-handoff/scripts/new-handoff.sh +0 -0
- /package/{skills → library/skills}/git/branch-closeout/evals.md +0 -0
- /package/{skills → library/skills}/git/branch-closeout/references/closeout-checklist.md +0 -0
- /package/{skills → library/skills}/git/file-ticket/assets/issue-template.md +0 -0
- /package/{skills → library/skills}/git/file-ticket/evals.md +0 -0
- /package/{skills → library/skills}/git/file-ticket/references/issue-discovery.md +0 -0
- /package/{skills → library/skills}/git/fix-issue/evals.md +0 -0
- /package/{skills → library/skills}/git/fix-issue/references/diagnosis-and-rca.md +0 -0
- /package/{skills → library/skills}/git/resolve-merge-conflicts/references/conflict-matrix.md +0 -0
- /package/{skills → library/skills}/git/ship/assets/pr-template.md +0 -0
- /package/{skills → library/skills}/git/ship/evals.md +0 -0
- /package/{skills → library/skills}/git/ship/references/remote-and-branch-policy.md +0 -0
- /package/{skills → library/skills}/git/worktree-create/evals.md +0 -0
- /package/{skills → library/skills}/git/worktree-create/references/worktree-setup.md +0 -0
- /package/{skills → library/skills}/git/worktree-merge/evals.md +0 -0
- /package/{skills → library/skills}/git/worktree-merge/references/merge-strategies.md +0 -0
- /package/{skills → library/skills}/meta/clio-coder-test/references/harness.md +0 -0
- /package/{skills → library/skills}/meta/clio-coder-test/references/test-map.md +0 -0
- /package/{skills → library/skills}/planning/archify/evals.md +0 -0
|
@@ -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
|
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { existsSync, readdirSync, readFileSync, realpathSync } from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
|
+
import { readSettings } from "../../core/config.js";
|
|
3
4
|
import { resolvePackageRoot } from "../../core/package-root.js";
|
|
4
5
|
import { clioConfigDir } from "../../core/xdg.js";
|
|
5
|
-
import {
|
|
6
|
+
import { enabledPluginResourceRoots } from "../plugins/index.js";
|
|
7
|
+
import { resolvePackageReferences } from "../resources/package-references.js";
|
|
6
8
|
import { loadSkills } from "../resources/skills/loader.js";
|
|
7
9
|
import { parseFrontmatter } from "./frontmatter.js";
|
|
8
10
|
import { type AgentRecipe, type RecipeSource, recipeIdFromPath } from "./recipe.js";
|
|
@@ -15,6 +17,25 @@ export interface AgentRecipeDiagnostic {
|
|
|
15
17
|
source: RecipeSource["source"];
|
|
16
18
|
filepath: string;
|
|
17
19
|
message: string;
|
|
20
|
+
/**
|
|
21
|
+
* Why a file is not in the catalog. `quarantine` is a parse/policy failure;
|
|
22
|
+
* `ignored` is a reserved or protected id; `overridden` lost same-id
|
|
23
|
+
* precedence to a later source. Absent on records from before this field.
|
|
24
|
+
*/
|
|
25
|
+
kind?: "quarantine" | "ignored" | "overridden";
|
|
26
|
+
/** Recipe id when it was parsed; quarantined files may not have one. */
|
|
27
|
+
id?: string;
|
|
28
|
+
/** Source that won, for `overridden`. */
|
|
29
|
+
by?: RecipeSource["source"];
|
|
30
|
+
/** Parsed audience of an ignored/overridden recipe, so listings can keep hiding internal ones. */
|
|
31
|
+
audience?: AgentRecipe["audience"];
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Diagnostics are a bounded inspection aid, never a second catalog. */
|
|
35
|
+
const MAX_AGENT_RECIPE_DIAGNOSTICS = 256;
|
|
36
|
+
|
|
37
|
+
function recordDiagnostic(diagnostics: AgentRecipeDiagnostic[], diagnostic: AgentRecipeDiagnostic): void {
|
|
38
|
+
if (diagnostics.length < MAX_AGENT_RECIPE_DIAGNOSTICS) diagnostics.push(diagnostic);
|
|
18
39
|
}
|
|
19
40
|
|
|
20
41
|
function resolveBoundSkills(recipe: AgentRecipe, source: RecipeSource): AgentRecipe {
|
|
@@ -22,31 +43,35 @@ function resolveBoundSkills(recipe: AgentRecipe, source: RecipeSource): AgentRec
|
|
|
22
43
|
// Builtins may bind a package-owned skill. Custom recipes deliberately use
|
|
23
44
|
// only the operator's discovered skill roots; a recipe cannot smuggle an
|
|
24
45
|
// arbitrary filesystem path into worker context through a skill name.
|
|
25
|
-
const packageSkills = path.resolve(source.dir, "..", "..", "..", "..", "skills");
|
|
26
|
-
if (source.source === "
|
|
27
|
-
throw new Error(
|
|
46
|
+
const packageSkills = path.resolve(source.dir, "..", "..", "..", "..", "library", "skills");
|
|
47
|
+
if (source.source === "plugin" && source.skillRoot === undefined) {
|
|
48
|
+
throw new Error(
|
|
49
|
+
`agent recipe: ${recipe.filepath}: ${source.source} declares bound skills but no skills resource root`,
|
|
50
|
+
);
|
|
28
51
|
}
|
|
29
52
|
const skills =
|
|
30
|
-
source.source === "
|
|
53
|
+
source.source === "plugin"
|
|
31
54
|
? loadSkills({
|
|
32
55
|
cwd: source.cwd ?? process.cwd(),
|
|
56
|
+
trustProjectCompatRoots: readSettings().integrations.projectResources.trustProjectImports,
|
|
33
57
|
disableDiscovery: true,
|
|
34
58
|
explicitSkillPaths: source.skillRoot === undefined ? [] : [source.skillRoot],
|
|
35
59
|
})
|
|
36
60
|
: loadSkills({
|
|
37
61
|
cwd: source.cwd ?? process.cwd(),
|
|
62
|
+
trustProjectCompatRoots: readSettings().integrations.projectResources.trustProjectImports,
|
|
38
63
|
...(source.source === "builtin" && existsSync(packageSkills) ? { explicitSkillPaths: [packageSkills] } : {}),
|
|
39
64
|
});
|
|
40
|
-
if (source.source === "
|
|
65
|
+
if (source.source === "plugin" && source.skillRoot !== undefined) {
|
|
41
66
|
const canonicalRoot = realpathSync(source.skillRoot);
|
|
42
67
|
for (const skill of skills.items) {
|
|
43
68
|
const relative = path.relative(canonicalRoot, realpathSync(skill.filePath));
|
|
44
69
|
if (relative === ".." || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {
|
|
45
|
-
throw new Error(`agent recipe: ${recipe.filepath}: bound skill escapes its
|
|
70
|
+
throw new Error(`agent recipe: ${recipe.filepath}: bound skill escapes its ${source.source}: ${skill.filePath}`);
|
|
46
71
|
}
|
|
47
72
|
}
|
|
48
73
|
}
|
|
49
|
-
const byName = new Map(skills.items.map((skill) => [skill.name, skill.filePath]));
|
|
74
|
+
const byName = new Map(skills.items.filter((skill) => skill.trusted).map((skill) => [skill.name, skill.filePath]));
|
|
50
75
|
const missing = recipe.skills.filter((skill) => !byName.has(skill));
|
|
51
76
|
if (missing.length > 0) {
|
|
52
77
|
throw new Error(`agent recipe: ${recipe.filepath}: bound skill(s) unavailable: ${missing.join(", ")}`);
|
|
@@ -83,7 +108,11 @@ export function loadRecipesFromDir(
|
|
|
83
108
|
try {
|
|
84
109
|
const id = recipeIdFromPath(filepath, source.dir);
|
|
85
110
|
const raw = readFileSync(filepath, "utf8");
|
|
86
|
-
const { frontmatter, body } = parseFrontmatter(raw, filepath);
|
|
111
|
+
const { frontmatter, body: rawBody } = parseFrontmatter(raw, filepath);
|
|
112
|
+
const body = resolvePackageReferences(rawBody, {
|
|
113
|
+
...(source.rootPath ? { rootPath: source.rootPath } : {}),
|
|
114
|
+
plugin: source.source === "plugin",
|
|
115
|
+
});
|
|
87
116
|
const parsedRecipe = parseAgentRecipeSchema({ id, source: source.source, filepath, body, frontmatter });
|
|
88
117
|
const recipe = resolveBoundSkills(parsedRecipe, source);
|
|
89
118
|
// Policy validation runs before a recipe enters any catalog, prompt, or
|
|
@@ -93,7 +122,7 @@ export function loadRecipesFromDir(
|
|
|
93
122
|
} catch (error) {
|
|
94
123
|
if (source.source === "builtin") throw error;
|
|
95
124
|
const message = error instanceof Error ? error.message : String(error);
|
|
96
|
-
diagnostics
|
|
125
|
+
recordDiagnostic(diagnostics, { kind: "quarantine", source: source.source, filepath, message });
|
|
97
126
|
process.stderr.write(`[clio-coder:agents] quarantine path=${filepath} source=${source.source} reason=${message}\n`);
|
|
98
127
|
}
|
|
99
128
|
}
|
|
@@ -102,7 +131,21 @@ export function loadRecipesFromDir(
|
|
|
102
131
|
return recipes;
|
|
103
132
|
}
|
|
104
133
|
|
|
105
|
-
function mergeRecipes(
|
|
134
|
+
function mergeRecipes(
|
|
135
|
+
diagnostics: AgentRecipeDiagnostic[],
|
|
136
|
+
...sources: ReadonlyArray<ReadonlyArray<AgentRecipe>>
|
|
137
|
+
): ReadonlyArray<AgentRecipe> {
|
|
138
|
+
const ignored = (recipe: AgentRecipe, reason: string): void => {
|
|
139
|
+
process.stderr.write(`[clio-coder:agents] ignore id=${recipe.id} by=${recipe.source} reason=${reason}\n`);
|
|
140
|
+
recordDiagnostic(diagnostics, {
|
|
141
|
+
kind: "ignored",
|
|
142
|
+
id: recipe.id,
|
|
143
|
+
source: recipe.source,
|
|
144
|
+
audience: recipe.audience,
|
|
145
|
+
filepath: recipe.filepath,
|
|
146
|
+
message: `agent recipe ${recipe.id} from ${recipe.source} ignored: ${reason}`,
|
|
147
|
+
});
|
|
148
|
+
};
|
|
106
149
|
const byId = new Map<string, AgentRecipe>();
|
|
107
150
|
const builtinById = new Map<string, AgentRecipe>();
|
|
108
151
|
for (const group of sources) {
|
|
@@ -113,23 +156,35 @@ function mergeRecipes(...sources: ReadonlyArray<ReadonlyArray<AgentRecipe>>): Re
|
|
|
113
156
|
for (const group of sources) {
|
|
114
157
|
for (const recipe of group) {
|
|
115
158
|
if (recipe.source !== "builtin" && RESERVED_CUSTOM_AGENT_IDS.has(recipe.id)) {
|
|
116
|
-
|
|
159
|
+
ignored(recipe, "reserved-agent-id");
|
|
117
160
|
continue;
|
|
118
161
|
}
|
|
119
162
|
const builtin = builtinById.get(recipe.id);
|
|
120
|
-
if (recipe.source === "
|
|
121
|
-
|
|
163
|
+
if (recipe.source === "plugin" && builtin) {
|
|
164
|
+
ignored(recipe, "reserved-builtin");
|
|
122
165
|
continue;
|
|
123
166
|
}
|
|
124
167
|
if (recipe.source === "user" && builtin && isShadowAgent(normalizeAgentSpec(builtin))) {
|
|
125
|
-
|
|
168
|
+
ignored(recipe, "reserved-shadow");
|
|
126
169
|
continue;
|
|
127
170
|
}
|
|
128
171
|
if (recipe.source === "project" && builtin) {
|
|
129
|
-
|
|
172
|
+
ignored(recipe, "reserved-builtin");
|
|
130
173
|
continue;
|
|
131
174
|
}
|
|
132
|
-
|
|
175
|
+
const previous = byId.get(recipe.id);
|
|
176
|
+
if (previous) {
|
|
177
|
+
process.stderr.write(`[clio-coder:agents] override id=${recipe.id} by=${recipe.source}\n`);
|
|
178
|
+
recordDiagnostic(diagnostics, {
|
|
179
|
+
kind: "overridden",
|
|
180
|
+
id: previous.id,
|
|
181
|
+
source: previous.source,
|
|
182
|
+
audience: previous.audience,
|
|
183
|
+
by: recipe.source,
|
|
184
|
+
filepath: previous.filepath,
|
|
185
|
+
message: `agent recipe ${previous.id} from ${previous.source} overridden by ${recipe.source}`,
|
|
186
|
+
});
|
|
187
|
+
}
|
|
133
188
|
byId.set(recipe.id, recipe);
|
|
134
189
|
}
|
|
135
190
|
}
|
|
@@ -138,9 +193,9 @@ function mergeRecipes(...sources: ReadonlyArray<ReadonlyArray<AgentRecipe>>): Re
|
|
|
138
193
|
|
|
139
194
|
/**
|
|
140
195
|
* Discover the one native-agent catalog used by listing, fleet admission, and
|
|
141
|
-
* dispatch.
|
|
142
|
-
*
|
|
143
|
-
*
|
|
196
|
+
* dispatch. Plugin recipes occupy the same precedence slot as plugin fleets:
|
|
197
|
+
* after builtins and before operator/user and project recipes. Their skill
|
|
198
|
+
* bindings remain constrained to the declaring plugin's skill root.
|
|
144
199
|
*/
|
|
145
200
|
export function discoverAgentRecipes(
|
|
146
201
|
cwd = process.cwd(),
|
|
@@ -154,15 +209,16 @@ export function discoverAgentRecipes(
|
|
|
154
209
|
},
|
|
155
210
|
diagnostics,
|
|
156
211
|
);
|
|
157
|
-
const skillRoots = new Map(
|
|
158
|
-
const
|
|
212
|
+
const skillRoots = new Map(enabledPluginResourceRoots("skills", cwd).map((root) => [root.source, root.path]));
|
|
213
|
+
const pluginRecipes = enabledPluginResourceRoots("agents", cwd)
|
|
159
214
|
.sort((left, right) => left.source.localeCompare(right.source))
|
|
160
215
|
.map((root) => {
|
|
161
216
|
const skillRoot = skillRoots.get(root.source);
|
|
162
217
|
return loadRecipesFromDir(
|
|
163
218
|
{
|
|
164
219
|
dir: root.path,
|
|
165
|
-
source: "
|
|
220
|
+
source: "plugin",
|
|
221
|
+
rootPath: root.rootPath,
|
|
166
222
|
cwd,
|
|
167
223
|
origin: root.source,
|
|
168
224
|
...(skillRoot === undefined ? {} : { skillRoot }),
|
|
@@ -175,5 +231,5 @@ export function discoverAgentRecipes(
|
|
|
175
231
|
{ dir: path.join(cwd, ".clio-coder", "agents"), source: "project", cwd },
|
|
176
232
|
diagnostics,
|
|
177
233
|
);
|
|
178
|
-
return mergeRecipes(builtin, ...
|
|
234
|
+
return mergeRecipes(diagnostics, builtin, ...pluginRecipes, user, project);
|
|
179
235
|
}
|