auvrynt 1.0.1
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/LICENSE +21 -0
- package/README.md +239 -0
- package/dist/blender-client.js +109 -0
- package/dist/blender-tools.js +930 -0
- package/dist/cli.js +370 -0
- package/dist/config.js +211 -0
- package/dist/connection-status.js +91 -0
- package/dist/db/client.js +22 -0
- package/dist/db/schema.js +29 -0
- package/dist/dotnet-tools.js +223 -0
- package/dist/git-worktrees.js +134 -0
- package/dist/git.js +41 -0
- package/dist/godot-animation-tilemap.js +82 -0
- package/dist/godot-csharp-build.js +93 -0
- package/dist/godot-csharp-project.js +157 -0
- package/dist/godot-csharp-runner.js +146 -0
- package/dist/godot-csharp-semantic.js +161 -0
- package/dist/godot-csharp-validate.js +71 -0
- package/dist/godot-dotnet-env.js +169 -0
- package/dist/godot-editor-bridge.js +140 -0
- package/dist/godot-gdscript.js +824 -0
- package/dist/godot-project-settings.js +223 -0
- package/dist/godot-runtime-testing.js +249 -0
- package/dist/godot-tools.js +183 -0
- package/dist/image-tools.js +157 -0
- package/dist/logger.js +76 -0
- package/dist/oauth-provider.js +266 -0
- package/dist/pi-tools.js +81 -0
- package/dist/processes.js +218 -0
- package/dist/review-checkpoints.js +142 -0
- package/dist/roots.js +53 -0
- package/dist/search-discovery.js +271 -0
- package/dist/serena-manager.js +443 -0
- package/dist/serena-tools.js +411 -0
- package/dist/server.js +2835 -0
- package/dist/skills.js +45 -0
- package/dist/ui/.vite/manifest.json +2520 -0
- package/dist/ui/assets/abap-CLvhMVsD.js +1 -0
- package/dist/ui/assets/actionscript-3--17pq3dv.js +1 -0
- package/dist/ui/assets/ada-C5qYipkI.js +1 -0
- package/dist/ui/assets/andromeeda-vGVdxbeo.js +1 -0
- package/dist/ui/assets/angular-html-BJqQFYI6.js +1 -0
- package/dist/ui/assets/angular-ts-CMJECO0Y.js +1 -0
- package/dist/ui/assets/apache-U0d_L8uA.js +1 -0
- package/dist/ui/assets/apex-CGTLDQj6.js +1 -0
- package/dist/ui/assets/apl-DWeXpBBr.js +1 -0
- package/dist/ui/assets/applescript-CCn79oCD.js +1 -0
- package/dist/ui/assets/ara-4CJ0cIlV.js +1 -0
- package/dist/ui/assets/asciidoc-DE70LPWp.js +1 -0
- package/dist/ui/assets/asm-Cmm7eHzH.js +1 -0
- package/dist/ui/assets/astro-CLbttLOq.js +1 -0
- package/dist/ui/assets/aurora-x-CDeNXAV0.js +1 -0
- package/dist/ui/assets/awk-BWXHIvNe.js +1 -0
- package/dist/ui/assets/ayu-dark-DluEY0Gj.js +1 -0
- package/dist/ui/assets/ayu-light-C3h-C4tm.js +1 -0
- package/dist/ui/assets/ayu-mirage-Bqwy1Gya.js +1 -0
- package/dist/ui/assets/ballerina-B7ZEbQpA.js +1 -0
- package/dist/ui/assets/bat-Bo4NYOV-.js +1 -0
- package/dist/ui/assets/beancount-D-usSTwE.js +1 -0
- package/dist/ui/assets/berry-DKpUyyne.js +1 -0
- package/dist/ui/assets/bibtex-Ci_nEsc7.js +1 -0
- package/dist/ui/assets/bicep-CUHmPFLl.js +1 -0
- package/dist/ui/assets/bird2-C2hNVINV.js +1 -0
- package/dist/ui/assets/blade-BOzY0P2V.js +1 -0
- package/dist/ui/assets/bsl-BkkzgIyY.js +1 -0
- package/dist/ui/assets/c-BG-8uJvh.js +1 -0
- package/dist/ui/assets/c3-CnJL0r0V.js +1 -0
- package/dist/ui/assets/cadence-CQ2zXKGN.js +1 -0
- package/dist/ui/assets/cairo-DLTphjLi.js +1 -0
- package/dist/ui/assets/catppuccin-frappe-3VR1Za6u.js +1 -0
- package/dist/ui/assets/catppuccin-latte-DwIHMF0Q.js +1 -0
- package/dist/ui/assets/catppuccin-macchiato-DYnBP6_5.js +1 -0
- package/dist/ui/assets/catppuccin-mocha-DYhrFGRu.js +1 -0
- package/dist/ui/assets/clarity-SemFz856.js +1 -0
- package/dist/ui/assets/clojure-DqKBuwfJ.js +1 -0
- package/dist/ui/assets/cmake-Bj61d0ZC.js +1 -0
- package/dist/ui/assets/cobol-I_17IuGe.js +1 -0
- package/dist/ui/assets/codeowners-C8r90Shi.js +1 -0
- package/dist/ui/assets/codeql-oeQT6MSM.js +1 -0
- package/dist/ui/assets/coffee-C0B8hmok.js +1 -0
- package/dist/ui/assets/common-lisp-Cv5bFMCO.js +1 -0
- package/dist/ui/assets/coq-BrsZFFmf.js +1 -0
- package/dist/ui/assets/cpp-DDJXt6Vs.js +1 -0
- package/dist/ui/assets/crystal-Bexqace6.js +1 -0
- package/dist/ui/assets/csharp-Ct8U2NOr.js +1 -0
- package/dist/ui/assets/css-DSQhw_9R.js +1 -0
- package/dist/ui/assets/csv-Dx-8-gkx.js +1 -0
- package/dist/ui/assets/cue-CE9AQfxI.js +1 -0
- package/dist/ui/assets/cypher-ClKdZ_lG.js +1 -0
- package/dist/ui/assets/d-qD-0Kul2.js +1 -0
- package/dist/ui/assets/dark-plus-Cs2F2srj.js +1 -0
- package/dist/ui/assets/dart-DkHntEIa.js +1 -0
- package/dist/ui/assets/dax-BkyTk9wS.js +1 -0
- package/dist/ui/assets/desktop-Dlh5hvp9.js +1 -0
- package/dist/ui/assets/diff-woXpYk--.js +1 -0
- package/dist/ui/assets/docker-IyjqRm3v.js +1 -0
- package/dist/ui/assets/dotenv-_5a1GRtc.js +1 -0
- package/dist/ui/assets/dracula-BHWKrbxM.js +1 -0
- package/dist/ui/assets/dracula-soft-5eyTD99u.js +1 -0
- package/dist/ui/assets/dream-maker-DW3nJb8Q.js +1 -0
- package/dist/ui/assets/edge-Z8YYkHOr.js +1 -0
- package/dist/ui/assets/elixir-CG9uKtAF.js +1 -0
- package/dist/ui/assets/elm-GfWG2IfT.js +1 -0
- package/dist/ui/assets/emacs-lisp-C9PiwqqW.js +1 -0
- package/dist/ui/assets/erb-xe89e73J.js +1 -0
- package/dist/ui/assets/erlang-Cphh6RMH.js +1 -0
- package/dist/ui/assets/everforest-dark-sB-x3p7T.js +1 -0
- package/dist/ui/assets/everforest-light-Df2xbC6M.js +1 -0
- package/dist/ui/assets/fennel-DQxkIbk2.js +1 -0
- package/dist/ui/assets/fish-BJitypiv.js +1 -0
- package/dist/ui/assets/fluent-C03EYrpw.js +1 -0
- package/dist/ui/assets/fortran-fixed-form-DEKoE2YW.js +1 -0
- package/dist/ui/assets/fortran-free-form-CYNrtFtB.js +1 -0
- package/dist/ui/assets/fsharp-D13ZGOAj.js +1 -0
- package/dist/ui/assets/gdresource-C0sCabJj.js +1 -0
- package/dist/ui/assets/gdscript-Cp2uCuqX.js +1 -0
- package/dist/ui/assets/gdshader-CBce3t8t.js +1 -0
- package/dist/ui/assets/genie-CV2tkWYe.js +1 -0
- package/dist/ui/assets/gherkin-DExj1W_8.js +1 -0
- package/dist/ui/assets/git-commit-BSykSTBG.js +1 -0
- package/dist/ui/assets/git-rebase-CoTL_uSE.js +1 -0
- package/dist/ui/assets/github-dark-C-LZuMrd.js +1 -0
- package/dist/ui/assets/github-dark-default-DXG-b-1a.js +1 -0
- package/dist/ui/assets/github-dark-dimmed-Bx1FflLF.js +1 -0
- package/dist/ui/assets/github-dark-high-contrast-B_tTalzw.js +1 -0
- package/dist/ui/assets/github-light-EUqPIrTm.js +1 -0
- package/dist/ui/assets/github-light-default-BXViO-2h.js +1 -0
- package/dist/ui/assets/github-light-high-contrast-B68TUdTA.js +1 -0
- package/dist/ui/assets/gleam-CSRkHgEL.js +1 -0
- package/dist/ui/assets/glimmer-js-DAn4UCSu.js +1 -0
- package/dist/ui/assets/glimmer-ts-Tjyi6Gh5.js +1 -0
- package/dist/ui/assets/glsl-CtTDZoqR.js +1 -0
- package/dist/ui/assets/gn-ilITqXS6.js +1 -0
- package/dist/ui/assets/gnuplot-7GGW24-e.js +1 -0
- package/dist/ui/assets/go-BJwz_mda.js +1 -0
- package/dist/ui/assets/graphql-D5gcC_Jk.js +1 -0
- package/dist/ui/assets/groovy-CacY0gHj.js +1 -0
- package/dist/ui/assets/gruvbox-dark-hard-C820rvS2.js +1 -0
- package/dist/ui/assets/gruvbox-dark-medium-BPjhmG05.js +1 -0
- package/dist/ui/assets/gruvbox-dark-soft-MrdJrrXF.js +1 -0
- package/dist/ui/assets/gruvbox-light-hard-BC_s9l72.js +1 -0
- package/dist/ui/assets/gruvbox-light-medium-BAWPOn9u.js +1 -0
- package/dist/ui/assets/gruvbox-light-soft-BSMLrYjP.js +1 -0
- package/dist/ui/assets/hack-BJXY27dt.js +1 -0
- package/dist/ui/assets/haml-BLfFoZf7.js +1 -0
- package/dist/ui/assets/handlebars-Dw6CWkvN.js +1 -0
- package/dist/ui/assets/haskell-D8IpX4py.js +1 -0
- package/dist/ui/assets/haxe-OTjmBuCE.js +1 -0
- package/dist/ui/assets/hcl-Dh228itO.js +1 -0
- package/dist/ui/assets/heavy-payload-Dcg0-F-S.js +4 -0
- package/dist/ui/assets/hjson-CxZEssPk.js +1 -0
- package/dist/ui/assets/hlsl-Cvrh5tZx.js +1 -0
- package/dist/ui/assets/horizon-CE9ld1lL.js +1 -0
- package/dist/ui/assets/horizon-bright-Br1oVSNq.js +1 -0
- package/dist/ui/assets/houston-CsvMBhTu.js +1 -0
- package/dist/ui/assets/html-CAcAWvoN.js +1 -0
- package/dist/ui/assets/html-derivative-8aSW2E_7.js +1 -0
- package/dist/ui/assets/http-B2YR_3V1.js +1 -0
- package/dist/ui/assets/hurl-BnDJ9Zhf.js +1 -0
- package/dist/ui/assets/hxml-B0Qn7Nwc.js +1 -0
- package/dist/ui/assets/hy-CZbG8q4J.js +1 -0
- package/dist/ui/assets/imba-DsUTQ-LC.js +1 -0
- package/dist/ui/assets/ini-B5eOa1yu.js +1 -0
- package/dist/ui/assets/java-Doxi4W8u.js +1 -0
- package/dist/ui/assets/javascript-BbRdEqti.js +1 -0
- package/dist/ui/assets/jinja-CS3Tpv_Q.js +1 -0
- package/dist/ui/assets/jison-BkPGYVHR.js +1 -0
- package/dist/ui/assets/json-BMt1m3m8.js +1 -0
- package/dist/ui/assets/json5-BR5RXkoi.js +1 -0
- package/dist/ui/assets/jsonc-CYpm1nAK.js +1 -0
- package/dist/ui/assets/jsonl-CmCQp5Yx.js +1 -0
- package/dist/ui/assets/jsonnet-CJTPZ8u_.js +1 -0
- package/dist/ui/assets/jssm-DXw9l8Rf.js +1 -0
- package/dist/ui/assets/jsx-CQKrJXXY.js +1 -0
- package/dist/ui/assets/julia-BuN7i2du.js +1 -0
- package/dist/ui/assets/just-BswEPFPu.js +1 -0
- package/dist/ui/assets/kanagawa-dragon-CXtmUGW6.js +1 -0
- package/dist/ui/assets/kanagawa-lotus-BN08jTvb.js +1 -0
- package/dist/ui/assets/kanagawa-wave-CTweb8Dz.js +1 -0
- package/dist/ui/assets/kdl-CsD5j6eV.js +1 -0
- package/dist/ui/assets/kotlin-DhhofPvG.js +1 -0
- package/dist/ui/assets/kusto-BUv0MjJC.js +1 -0
- package/dist/ui/assets/laserwave-C_8bwKvT.js +1 -0
- package/dist/ui/assets/latex-DU2VyFfA.js +1 -0
- package/dist/ui/assets/lean-CewbzKMR.js +1 -0
- package/dist/ui/assets/less-DVTAwKKz.js +1 -0
- package/dist/ui/assets/light-plus-DVQuIRkW.js +1 -0
- package/dist/ui/assets/liquid-Cmz1L3dq.js +1 -0
- package/dist/ui/assets/llvm-Cm23YOpf.js +1 -0
- package/dist/ui/assets/log-BNLmms1o.js +1 -0
- package/dist/ui/assets/logo-Cluzi2Zq.js +1 -0
- package/dist/ui/assets/lua-CfVXhkaJ.js +1 -0
- package/dist/ui/assets/luau-CNKltnaQ.js +1 -0
- package/dist/ui/assets/make-Dixweg8N.js +1 -0
- package/dist/ui/assets/markdown-BYOwaDjH.js +1 -0
- package/dist/ui/assets/marko-C5bfqGiA.js +1 -0
- package/dist/ui/assets/material-theme-Bm3Qr25_.js +1 -0
- package/dist/ui/assets/material-theme-darker-2IIEA8gg.js +1 -0
- package/dist/ui/assets/material-theme-lighter-uhdI0v04.js +1 -0
- package/dist/ui/assets/material-theme-ocean-CHQ94UKr.js +1 -0
- package/dist/ui/assets/material-theme-palenight-B5W6OYN7.js +1 -0
- package/dist/ui/assets/matlab-D7qyCx1q.js +1 -0
- package/dist/ui/assets/mdc-CVBXYfyq.js +1 -0
- package/dist/ui/assets/mdx-DQZ5AkYe.js +1 -0
- package/dist/ui/assets/mermaid-Bk4SNUv9.js +1 -0
- package/dist/ui/assets/min-dark-BSWPekZh.js +1 -0
- package/dist/ui/assets/min-light-DDpmG2fV.js +1 -0
- package/dist/ui/assets/mipsasm-BMqwQI7S.js +1 -0
- package/dist/ui/assets/mojo-BgCJLMeH.js +1 -0
- package/dist/ui/assets/monokai-CdkpiU2Y.js +1 -0
- package/dist/ui/assets/moonbit-CaWjb8XO.js +1 -0
- package/dist/ui/assets/move-B1IS1UjX.js +1 -0
- package/dist/ui/assets/narrat-_X_XdTYD.js +1 -0
- package/dist/ui/assets/nextflow-Bbiyy34d.js +1 -0
- package/dist/ui/assets/nextflow-groovy-Dc_ddanL.js +1 -0
- package/dist/ui/assets/nginx-CzJafxLa.js +1 -0
- package/dist/ui/assets/night-owl-DhmEMT88.js +1 -0
- package/dist/ui/assets/night-owl-light-eJ-hLW7d.js +1 -0
- package/dist/ui/assets/nim-DABKtHtM.js +1 -0
- package/dist/ui/assets/nix-IvuFDN5E.js +1 -0
- package/dist/ui/assets/nord-Cb4Vim4T.js +1 -0
- package/dist/ui/assets/nushell-DcLAeLz5.js +1 -0
- package/dist/ui/assets/objective-c-D1A_Heim.js +1 -0
- package/dist/ui/assets/objective-cpp-BsSzOQcm.js +1 -0
- package/dist/ui/assets/ocaml-O90oeIOV.js +1 -0
- package/dist/ui/assets/odin-B1RWQWA5.js +1 -0
- package/dist/ui/assets/one-dark-pro-CLwyXe_n.js +1 -0
- package/dist/ui/assets/one-light-D7Lr4KcI.js +1 -0
- package/dist/ui/assets/openscad-BUDT5pXO.js +1 -0
- package/dist/ui/assets/pascal-4ZHwLPI5.js +1 -0
- package/dist/ui/assets/perl-CBh7L3lZ.js +1 -0
- package/dist/ui/assets/php-DFbI9q5p.js +1 -0
- package/dist/ui/assets/pierre-dark-sU4Zdns8.js +1 -0
- package/dist/ui/assets/pierre-dark-soft-HXgun5vs.js +1 -0
- package/dist/ui/assets/pierre-light-DWBk51d8.js +1 -0
- package/dist/ui/assets/pierre-light-soft-CodEzPxf.js +1 -0
- package/dist/ui/assets/pkl-ot-7Btpt.js +1 -0
- package/dist/ui/assets/plastic-DQwYfKfQ.js +1 -0
- package/dist/ui/assets/plsql-DGHpHOYJ.js +1 -0
- package/dist/ui/assets/po-BiJDBrnU.js +1 -0
- package/dist/ui/assets/poimandres-DRFjx7u4.js +1 -0
- package/dist/ui/assets/polar-C7UOKdEL.js +1 -0
- package/dist/ui/assets/postcss-BXeXVLqQ.js +1 -0
- package/dist/ui/assets/powerquery-DNMTfnFr.js +1 -0
- package/dist/ui/assets/powershell-DshXNtvi.js +1 -0
- package/dist/ui/assets/prisma-BsRQq5mF.js +1 -0
- package/dist/ui/assets/prolog-iXnhIJG7.js +1 -0
- package/dist/ui/assets/proto-DB4EqR-F.js +1 -0
- package/dist/ui/assets/pug-C_PxC7gO.js +1 -0
- package/dist/ui/assets/puppet-CDv2pdJW.js +1 -0
- package/dist/ui/assets/purescript-9MfHhQsQ.js +1 -0
- package/dist/ui/assets/python-gzcpVVnB.js +1 -0
- package/dist/ui/assets/qml-DtngoFFK.js +1 -0
- package/dist/ui/assets/qmldir-DCQb3MpD.js +1 -0
- package/dist/ui/assets/qss-Fe1Jh2GI.js +1 -0
- package/dist/ui/assets/r-DohkcevW.js +1 -0
- package/dist/ui/assets/racket-DcIDlBhZ.js +1 -0
- package/dist/ui/assets/raku-B3gFvitq.js +1 -0
- package/dist/ui/assets/razor-C4t8J0_E.js +1 -0
- package/dist/ui/assets/red-CJ3rzSJv.js +1 -0
- package/dist/ui/assets/reg-CRGYupPL.js +1 -0
- package/dist/ui/assets/regexp-OGbTbjgY.js +1 -0
- package/dist/ui/assets/rel-BtDbiS_P.js +1 -0
- package/dist/ui/assets/review-payload-C5Qz60Kq.js +1 -0
- package/dist/ui/assets/riscv-Ckw8ddFX.js +1 -0
- package/dist/ui/assets/ron-VUp2lXgN.js +1 -0
- package/dist/ui/assets/rose-pine-BthvhNj6.js +1 -0
- package/dist/ui/assets/rose-pine-dawn-Dg85fqjY.js +1 -0
- package/dist/ui/assets/rose-pine-moon-hon4tzzS.js +1 -0
- package/dist/ui/assets/rosmsg-CAekHB0j.js +1 -0
- package/dist/ui/assets/rst-CfBbbcvC.js +1 -0
- package/dist/ui/assets/ruby-Bw0mpxHY.js +1 -0
- package/dist/ui/assets/rust-Cfkwpbl8.js +1 -0
- package/dist/ui/assets/sas-Cs3s9JOf.js +1 -0
- package/dist/ui/assets/sass-DXrisJhu.js +1 -0
- package/dist/ui/assets/scala-DKOlJaKm.js +1 -0
- package/dist/ui/assets/scheme-DQCgrYNe.js +1 -0
- package/dist/ui/assets/scss-sRxNJS54.js +1 -0
- package/dist/ui/assets/sdbl-bTVj8UrX.js +1 -0
- package/dist/ui/assets/shaderlab-TOUzSsQk.js +1 -0
- package/dist/ui/assets/shellscript-B0X6wh0R.js +1 -0
- package/dist/ui/assets/shellsession-D2FdOioR.js +1 -0
- package/dist/ui/assets/slack-dark-DnToyrRv.js +1 -0
- package/dist/ui/assets/slack-ochin-B2OO5cIa.js +1 -0
- package/dist/ui/assets/smalltalk-B16xEiuN.js +1 -0
- package/dist/ui/assets/snazzy-light-4G7pJPwS.js +1 -0
- package/dist/ui/assets/solarized-dark-DV17i1UV.js +1 -0
- package/dist/ui/assets/solarized-light-DSh2HLQt.js +1 -0
- package/dist/ui/assets/solidity-CKzVLygQ.js +1 -0
- package/dist/ui/assets/soy-s6g9OjJ1.js +1 -0
- package/dist/ui/assets/sparql-D_iOobhT.js +1 -0
- package/dist/ui/assets/splunk-BC2Px7Mm.js +1 -0
- package/dist/ui/assets/sql-DVTnh5V-.js +1 -0
- package/dist/ui/assets/ssh-config-BgfXC-Er.js +1 -0
- package/dist/ui/assets/stata-DFIDiXF9.js +1 -0
- package/dist/ui/assets/stylus-B6D30XZt.js +1 -0
- package/dist/ui/assets/surrealql-DVfrsLyg.js +1 -0
- package/dist/ui/assets/svelte-D5GsxESq.js +1 -0
- package/dist/ui/assets/swift-DonLKvLd.js +1 -0
- package/dist/ui/assets/synthwave-84-nFMaYfgc.js +1 -0
- package/dist/ui/assets/system-verilog-DJ5XKQeo.js +1 -0
- package/dist/ui/assets/systemd-BxMlprV5.js +1 -0
- package/dist/ui/assets/talonscript-CohzipZa.js +1 -0
- package/dist/ui/assets/tasl-DMoTqEGO.js +1 -0
- package/dist/ui/assets/tcl-CZd0xW_V.js +1 -0
- package/dist/ui/assets/templ-DI-Zyqzd.js +1 -0
- package/dist/ui/assets/terraform-DswuEJGm.js +1 -0
- package/dist/ui/assets/tex-WHHmlbJI.js +1 -0
- package/dist/ui/assets/tokyo-night-oM2G3aXe.js +1 -0
- package/dist/ui/assets/toml-CcmNWLt0.js +1 -0
- package/dist/ui/assets/ts-tags-Dwpo2RFJ.js +1 -0
- package/dist/ui/assets/tsv-sltzmVWM.js +1 -0
- package/dist/ui/assets/tsx-ph_idaAW.js +1 -0
- package/dist/ui/assets/turtle-ByJddavk.js +1 -0
- package/dist/ui/assets/twig-YO17jFjR.js +1 -0
- package/dist/ui/assets/typescript-CbAxjhkl.js +1 -0
- package/dist/ui/assets/typespec-B88KGewJ.js +1 -0
- package/dist/ui/assets/typst-DI99ib-x.js +1 -0
- package/dist/ui/assets/useFileDiffInstance-B2DLX3Vg.js +244 -0
- package/dist/ui/assets/v-DETTlOr0.js +1 -0
- package/dist/ui/assets/vala-zf12oZj6.js +1 -0
- package/dist/ui/assets/vb-Djn5o6TS.js +1 -0
- package/dist/ui/assets/verilog-CiiDBU1e.js +1 -0
- package/dist/ui/assets/vesper-D5bVUKB1.js +1 -0
- package/dist/ui/assets/vhdl-BroJfC0k.js +1 -0
- package/dist/ui/assets/viml-DvXPmvsu.js +1 -0
- package/dist/ui/assets/vitesse-black-fwtXNY1n.js +1 -0
- package/dist/ui/assets/vitesse-dark-BZCL-v6S.js +1 -0
- package/dist/ui/assets/vitesse-light-VbXTXTou.js +1 -0
- package/dist/ui/assets/vue-CraHL-Ps.js +1 -0
- package/dist/ui/assets/vue-html-e9tyZNtS.js +1 -0
- package/dist/ui/assets/vue-vine-CofmxaUb.js +1 -0
- package/dist/ui/assets/vyper-CgoNMtux.js +1 -0
- package/dist/ui/assets/wasm-BnjxR4X6.js +1 -0
- package/dist/ui/assets/wasm-ByWQv1Qj.js +1 -0
- package/dist/ui/assets/wenyan-C8pVoKbM.js +1 -0
- package/dist/ui/assets/wgsl-BsKzXJz4.js +1 -0
- package/dist/ui/assets/wikitext-ClFFjSW2.js +1 -0
- package/dist/ui/assets/wit-DdvCle-K.js +1 -0
- package/dist/ui/assets/wolfram-DLL8P-h_.js +1 -0
- package/dist/ui/assets/workspace-app-8--oTbCd.css +1 -0
- package/dist/ui/assets/workspace-app-C5QsE314.js +118 -0
- package/dist/ui/assets/xml-BWSdPZHm.js +1 -0
- package/dist/ui/assets/xsl-BtCt7Hx8.js +1 -0
- package/dist/ui/assets/yaml-BZiTw7cQ.js +1 -0
- package/dist/ui/assets/zenscript-BnlCZFoB.js +1 -0
- package/dist/ui/assets/zig-CMLA9XwU.js +1 -0
- package/dist/ui/workspace-app.html +15 -0
- package/dist/user-config.js +57 -0
- package/dist/view-image.js +104 -0
- package/dist/web-tools.js +200 -0
- package/dist/window-capture.js +74 -0
- package/dist/workspace-store.js +125 -0
- package/dist/workspaces.js +226 -0
- package/docs/DEVELOPMENT_TOOLS.md +95 -0
- package/docs/assets/auvrynt-logo-light.png +0 -0
- package/docs/assets/auvrynt-screenshot.png +0 -0
- package/docs/chatgpt-coding-workflow.md +143 -0
- package/docs/configuration.md +132 -0
- package/docs/gotchas.md +215 -0
- package/docs/security.md +100 -0
- package/docs/setup.md +132 -0
- package/package.json +70 -0
- package/scripts/dev-server.mjs +120 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { eq } from "drizzle-orm";
|
|
2
|
+
import { openDatabase } from "./db/client.js";
|
|
3
|
+
import { workspaceSessions, } from "./db/schema.js";
|
|
4
|
+
export class SqliteWorkspaceStore {
|
|
5
|
+
database;
|
|
6
|
+
constructor(stateDir) {
|
|
7
|
+
this.database = openDatabase(stateDir);
|
|
8
|
+
this.migrate();
|
|
9
|
+
}
|
|
10
|
+
createSession(input) {
|
|
11
|
+
const now = new Date().toISOString();
|
|
12
|
+
const session = {
|
|
13
|
+
id: input.id,
|
|
14
|
+
root: input.root,
|
|
15
|
+
status: "active",
|
|
16
|
+
mode: input.mode ?? "checkout",
|
|
17
|
+
sourceRoot: input.sourceRoot,
|
|
18
|
+
baseRef: input.baseRef,
|
|
19
|
+
baseSha: input.baseSha,
|
|
20
|
+
managed: input.managed ?? false,
|
|
21
|
+
createdAt: now,
|
|
22
|
+
lastUsedAt: now,
|
|
23
|
+
};
|
|
24
|
+
this.database.db
|
|
25
|
+
.insert(workspaceSessions)
|
|
26
|
+
.values({
|
|
27
|
+
id: session.id,
|
|
28
|
+
root: session.root,
|
|
29
|
+
status: session.status,
|
|
30
|
+
mode: session.mode,
|
|
31
|
+
sourceRoot: session.sourceRoot ?? null,
|
|
32
|
+
baseRef: session.baseRef ?? null,
|
|
33
|
+
baseSha: session.baseSha ?? null,
|
|
34
|
+
managed: String(session.managed),
|
|
35
|
+
createdAt: session.createdAt,
|
|
36
|
+
lastUsedAt: session.lastUsedAt,
|
|
37
|
+
})
|
|
38
|
+
.run();
|
|
39
|
+
return session;
|
|
40
|
+
}
|
|
41
|
+
getSession(id) {
|
|
42
|
+
const row = this.database.db
|
|
43
|
+
.select()
|
|
44
|
+
.from(workspaceSessions)
|
|
45
|
+
.where(eq(workspaceSessions.id, id))
|
|
46
|
+
.get();
|
|
47
|
+
return row ? rowToWorkspaceSession(row) : undefined;
|
|
48
|
+
}
|
|
49
|
+
touchSession(id) {
|
|
50
|
+
this.database.db
|
|
51
|
+
.update(workspaceSessions)
|
|
52
|
+
.set({ lastUsedAt: new Date().toISOString() })
|
|
53
|
+
.where(eq(workspaceSessions.id, id))
|
|
54
|
+
.run();
|
|
55
|
+
}
|
|
56
|
+
close() {
|
|
57
|
+
this.database.close();
|
|
58
|
+
}
|
|
59
|
+
migrate() {
|
|
60
|
+
this.database.sqlite.exec(`
|
|
61
|
+
create table if not exists workspace_sessions (
|
|
62
|
+
id text primary key,
|
|
63
|
+
root text not null,
|
|
64
|
+
status text not null default 'active',
|
|
65
|
+
mode text not null default 'checkout',
|
|
66
|
+
source_root text,
|
|
67
|
+
base_ref text,
|
|
68
|
+
base_sha text,
|
|
69
|
+
managed text not null default 'false',
|
|
70
|
+
created_at text not null,
|
|
71
|
+
last_used_at text not null
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
create index if not exists workspace_sessions_root_idx
|
|
75
|
+
on workspace_sessions(root, last_used_at desc);
|
|
76
|
+
|
|
77
|
+
create index if not exists workspace_sessions_status_idx
|
|
78
|
+
on workspace_sessions(status, last_used_at desc);
|
|
79
|
+
|
|
80
|
+
create table if not exists loaded_agent_files (
|
|
81
|
+
workspace_session_id text not null,
|
|
82
|
+
path text not null,
|
|
83
|
+
content_hash text not null,
|
|
84
|
+
content text not null,
|
|
85
|
+
loaded_at text not null,
|
|
86
|
+
last_seen_at text not null,
|
|
87
|
+
primary key (workspace_session_id, path),
|
|
88
|
+
foreign key (workspace_session_id)
|
|
89
|
+
references workspace_sessions(id)
|
|
90
|
+
on delete cascade
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
create index if not exists loaded_agent_files_path_idx
|
|
94
|
+
on loaded_agent_files(path);
|
|
95
|
+
`);
|
|
96
|
+
this.addColumnIfMissing("workspace_sessions", "mode", "text not null default 'checkout'");
|
|
97
|
+
this.addColumnIfMissing("workspace_sessions", "source_root", "text");
|
|
98
|
+
this.addColumnIfMissing("workspace_sessions", "base_ref", "text");
|
|
99
|
+
this.addColumnIfMissing("workspace_sessions", "base_sha", "text");
|
|
100
|
+
this.addColumnIfMissing("workspace_sessions", "managed", "text not null default 'false'");
|
|
101
|
+
}
|
|
102
|
+
addColumnIfMissing(table, column, definition) {
|
|
103
|
+
const columns = this.database.sqlite.prepare(`pragma table_info(${table})`).all();
|
|
104
|
+
if (columns.some((existingColumn) => existingColumn.name === column))
|
|
105
|
+
return;
|
|
106
|
+
this.database.sqlite.exec(`alter table ${table} add column ${column} ${definition}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
export function createWorkspaceStore(stateDir) {
|
|
110
|
+
return new SqliteWorkspaceStore(stateDir);
|
|
111
|
+
}
|
|
112
|
+
function rowToWorkspaceSession(row) {
|
|
113
|
+
return {
|
|
114
|
+
id: row.id,
|
|
115
|
+
root: row.root,
|
|
116
|
+
status: row.status,
|
|
117
|
+
mode: row.mode === "worktree" ? "worktree" : "checkout",
|
|
118
|
+
sourceRoot: row.sourceRoot ?? undefined,
|
|
119
|
+
baseRef: row.baseRef ?? undefined,
|
|
120
|
+
baseSha: row.baseSha ?? undefined,
|
|
121
|
+
managed: row.managed === "true",
|
|
122
|
+
createdAt: row.createdAt,
|
|
123
|
+
lastUsedAt: row.lastUsedAt,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { mkdir, opendir, stat } from "node:fs/promises";
|
|
3
|
+
import { dirname, join, relative, resolve, sep } from "node:path";
|
|
4
|
+
import { loadProjectContextFiles } from "@earendil-works/pi-coding-agent";
|
|
5
|
+
import { createManagedWorktree } from "./git-worktrees.js";
|
|
6
|
+
import { assertAllowedPath, isPathInsideRoot, resolveAllowedPath } from "./roots.js";
|
|
7
|
+
import { loadWorkspaceSkills, markSkillActivated, resolveSkillReadPath, } from "./skills.js";
|
|
8
|
+
export class WorkspaceRegistry {
|
|
9
|
+
config;
|
|
10
|
+
store;
|
|
11
|
+
workspaces = new Map();
|
|
12
|
+
constructor(config, store) {
|
|
13
|
+
this.config = config;
|
|
14
|
+
this.store = store;
|
|
15
|
+
}
|
|
16
|
+
async openWorkspace(input) {
|
|
17
|
+
const options = typeof input === "string" ? { path: input } : input;
|
|
18
|
+
const mode = options.mode ?? "checkout";
|
|
19
|
+
if (mode === "worktree") {
|
|
20
|
+
return this.openWorktreeWorkspace(options.path, options.baseRef);
|
|
21
|
+
}
|
|
22
|
+
return this.openCheckoutWorkspace(options.path);
|
|
23
|
+
}
|
|
24
|
+
getWorkspace(workspaceId) {
|
|
25
|
+
const workspace = this.workspaces.get(workspaceId);
|
|
26
|
+
if (workspace) {
|
|
27
|
+
this.store?.touchSession(workspaceId);
|
|
28
|
+
return workspace;
|
|
29
|
+
}
|
|
30
|
+
const session = this.store?.getSession(workspaceId);
|
|
31
|
+
if (!session) {
|
|
32
|
+
throw new Error(`Unknown workspaceId: ${workspaceId}. Call open_workspace first.`);
|
|
33
|
+
}
|
|
34
|
+
const root = this.assertWorkspaceRootAllowed(session.root, session.mode, session.sourceRoot);
|
|
35
|
+
const restoredWorkspace = {
|
|
36
|
+
id: session.id,
|
|
37
|
+
root,
|
|
38
|
+
mode: session.mode,
|
|
39
|
+
sourceRoot: session.sourceRoot,
|
|
40
|
+
worktree: session.mode === "worktree"
|
|
41
|
+
? {
|
|
42
|
+
path: root,
|
|
43
|
+
baseRef: session.baseRef ?? "HEAD",
|
|
44
|
+
baseSha: session.baseSha ?? "",
|
|
45
|
+
dirtySource: false,
|
|
46
|
+
detached: true,
|
|
47
|
+
managed: session.managed,
|
|
48
|
+
}
|
|
49
|
+
: undefined,
|
|
50
|
+
...this.loadSkillsForWorkspace(root),
|
|
51
|
+
activatedSkillDirs: new Set(),
|
|
52
|
+
};
|
|
53
|
+
this.store?.touchSession(workspaceId);
|
|
54
|
+
this.workspaces.set(restoredWorkspace.id, restoredWorkspace);
|
|
55
|
+
return restoredWorkspace;
|
|
56
|
+
}
|
|
57
|
+
resolvePath(workspace, inputPath) {
|
|
58
|
+
const absolutePath = resolveAllowedPath(inputPath, workspace.root, [workspace.root]);
|
|
59
|
+
if (!isPathInsideRoot(absolutePath, workspace.root)) {
|
|
60
|
+
throw new Error(`Path is outside workspace root: ${inputPath}`);
|
|
61
|
+
}
|
|
62
|
+
return absolutePath;
|
|
63
|
+
}
|
|
64
|
+
resolveReadPath(workspace, inputPath) {
|
|
65
|
+
try {
|
|
66
|
+
return {
|
|
67
|
+
absolutePath: this.resolvePath(workspace, inputPath),
|
|
68
|
+
readRoots: [workspace.root],
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
catch (workspaceError) {
|
|
72
|
+
const skillRead = resolveSkillReadPath(workspace.skills, workspace.activatedSkillDirs, inputPath);
|
|
73
|
+
if (!skillRead)
|
|
74
|
+
throw workspaceError;
|
|
75
|
+
return {
|
|
76
|
+
absolutePath: skillRead.absolutePath,
|
|
77
|
+
readRoots: [workspace.root, skillRead.skill.baseDir],
|
|
78
|
+
skillRead,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
markReadPathLoaded(workspace, readPath) {
|
|
83
|
+
if (readPath.skillRead?.isSkillFile) {
|
|
84
|
+
markSkillActivated(workspace.activatedSkillDirs, readPath.skillRead.skill);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
resolveWorkingDirectory(workspace, workingDirectory) {
|
|
88
|
+
const directory = workingDirectory ? this.resolvePath(workspace, workingDirectory) : workspace.root;
|
|
89
|
+
return assertAllowedPath(directory, [workspace.root]);
|
|
90
|
+
}
|
|
91
|
+
async openCheckoutWorkspace(path) {
|
|
92
|
+
const root = assertAllowedPath(path, this.config.allowedRoots);
|
|
93
|
+
await mkdir(root, { recursive: true });
|
|
94
|
+
const rootStats = await stat(root);
|
|
95
|
+
if (!rootStats.isDirectory()) {
|
|
96
|
+
throw new Error(`Workspace root must be a directory: ${path}`);
|
|
97
|
+
}
|
|
98
|
+
return this.createWorkspaceContext({ root, mode: "checkout" });
|
|
99
|
+
}
|
|
100
|
+
async openWorktreeWorkspace(path, baseRef) {
|
|
101
|
+
const worktree = await createManagedWorktree({
|
|
102
|
+
sourcePath: path,
|
|
103
|
+
baseRef,
|
|
104
|
+
config: this.config,
|
|
105
|
+
});
|
|
106
|
+
return this.createWorkspaceContext({
|
|
107
|
+
root: worktree.path,
|
|
108
|
+
mode: "worktree",
|
|
109
|
+
sourceRoot: worktree.sourceRoot,
|
|
110
|
+
worktree,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
async createWorkspaceContext(input) {
|
|
114
|
+
const workspace = {
|
|
115
|
+
id: `ws_${randomUUID()}`,
|
|
116
|
+
root: input.root,
|
|
117
|
+
mode: input.mode,
|
|
118
|
+
sourceRoot: input.sourceRoot,
|
|
119
|
+
worktree: input.worktree,
|
|
120
|
+
...this.loadSkillsForWorkspace(input.root),
|
|
121
|
+
activatedSkillDirs: new Set(),
|
|
122
|
+
};
|
|
123
|
+
this.store?.createSession({
|
|
124
|
+
id: workspace.id,
|
|
125
|
+
root: workspace.root,
|
|
126
|
+
mode: workspace.mode,
|
|
127
|
+
sourceRoot: workspace.sourceRoot,
|
|
128
|
+
baseRef: workspace.worktree?.baseRef,
|
|
129
|
+
baseSha: workspace.worktree?.baseSha,
|
|
130
|
+
managed: workspace.worktree?.managed,
|
|
131
|
+
});
|
|
132
|
+
this.workspaces.set(workspace.id, workspace);
|
|
133
|
+
const agentsFiles = this.loadInitialAgentsFiles(workspace.root);
|
|
134
|
+
const availableAgentsFiles = await this.findAvailableAgentsFiles(workspace.root, agentsFiles);
|
|
135
|
+
return { workspace, agentsFiles, availableAgentsFiles };
|
|
136
|
+
}
|
|
137
|
+
loadSkillsForWorkspace(root) {
|
|
138
|
+
const result = loadWorkspaceSkills(this.config, root);
|
|
139
|
+
return {
|
|
140
|
+
skills: result.skills,
|
|
141
|
+
skillDiagnostics: result.diagnostics,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
assertWorkspaceRootAllowed(root, mode, sourceRoot) {
|
|
145
|
+
if (mode === "worktree") {
|
|
146
|
+
if (!sourceRoot) {
|
|
147
|
+
throw new Error(`Stored worktree workspace is missing sourceRoot: ${root}`);
|
|
148
|
+
}
|
|
149
|
+
assertAllowedPath(sourceRoot, this.config.allowedRoots);
|
|
150
|
+
return assertAllowedPath(root, [this.config.worktreeRoot]);
|
|
151
|
+
}
|
|
152
|
+
return assertAllowedPath(root, this.config.allowedRoots);
|
|
153
|
+
}
|
|
154
|
+
loadInitialAgentsFiles(root) {
|
|
155
|
+
const agentDir = resolve(this.config.agentDir);
|
|
156
|
+
return loadProjectContextFiles({ cwd: root, agentDir })
|
|
157
|
+
.filter((file) => {
|
|
158
|
+
const path = resolve(file.path);
|
|
159
|
+
if (isPathInsideRoot(path, agentDir))
|
|
160
|
+
return true;
|
|
161
|
+
return isPathInsideRoot(path, root) && dirname(path) === root;
|
|
162
|
+
})
|
|
163
|
+
.map((file) => ({
|
|
164
|
+
path: resolve(file.path),
|
|
165
|
+
content: file.content,
|
|
166
|
+
}));
|
|
167
|
+
}
|
|
168
|
+
async findAvailableAgentsFiles(root, loadedFiles) {
|
|
169
|
+
const loadedPaths = new Set(loadedFiles.map((file) => resolve(file.path)));
|
|
170
|
+
const discovered = [];
|
|
171
|
+
await walkWorkspace(root, async (path, entry) => {
|
|
172
|
+
if (!entry.isFile())
|
|
173
|
+
return;
|
|
174
|
+
if (!CONTEXT_FILE_NAMES.has(entry.name))
|
|
175
|
+
return;
|
|
176
|
+
if (loadedPaths.has(path))
|
|
177
|
+
return;
|
|
178
|
+
discovered.push({ path });
|
|
179
|
+
});
|
|
180
|
+
return discovered.sort((a, b) => a.path.localeCompare(b.path));
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
const CONTEXT_FILE_NAMES = new Set(["AGENTS.md", "AGENTS.MD", "CLAUDE.md", "CLAUDE.MD"]);
|
|
184
|
+
const SKIPPED_CONTEXT_DIRS = new Set([
|
|
185
|
+
".git",
|
|
186
|
+
".hg",
|
|
187
|
+
".svn",
|
|
188
|
+
".auvrynt",
|
|
189
|
+
"node_modules",
|
|
190
|
+
"dist",
|
|
191
|
+
"build",
|
|
192
|
+
".next",
|
|
193
|
+
".turbo",
|
|
194
|
+
".cache",
|
|
195
|
+
]);
|
|
196
|
+
export function formatAgentsPath(path, workspaceRoot) {
|
|
197
|
+
if (!workspaceRoot)
|
|
198
|
+
return path.split(sep).join("/");
|
|
199
|
+
const relationship = relative(workspaceRoot, path);
|
|
200
|
+
if (relationship === "" ||
|
|
201
|
+
relationship.startsWith("..") ||
|
|
202
|
+
relationship === ".." ||
|
|
203
|
+
relationship.includes(`..${sep}`)) {
|
|
204
|
+
return path.split(sep).join("/");
|
|
205
|
+
}
|
|
206
|
+
return relationship.split(sep).join("/");
|
|
207
|
+
}
|
|
208
|
+
async function walkWorkspace(directory, visit) {
|
|
209
|
+
let entries;
|
|
210
|
+
try {
|
|
211
|
+
entries = await opendir(directory);
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
for await (const entry of entries) {
|
|
217
|
+
const path = join(directory, entry.name);
|
|
218
|
+
if (entry.isDirectory()) {
|
|
219
|
+
if (!SKIPPED_CONTEXT_DIRS.has(entry.name)) {
|
|
220
|
+
await walkWorkspace(path, visit);
|
|
221
|
+
}
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
await visit(path, entry);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# Auvrynt Local Development Tools Guide
|
|
2
|
+
|
|
3
|
+
Auvrynt extends Model Context Protocol (MCP) with tools for web application development, C#/.NET software development, Godot 4 game development, image inspection/comparison, and persistent process management.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Architecture & Security Boundaries
|
|
8
|
+
|
|
9
|
+
Use `get_connection_status` after `open_workspace` to automatically probe the
|
|
10
|
+
authenticated MCP session, the local Blender bridge, the Godot editor bridge,
|
|
11
|
+
browser support, Chrome MCP registration, and tracked workspace processes. A
|
|
12
|
+
browser marked `available` means Playwright is installed; browser sessions are
|
|
13
|
+
created on demand and are not persistent connections.
|
|
14
|
+
|
|
15
|
+
1. **Workspace Boundary Enforcement**: Every path input must be relative to the opened workspace root. Path traversal (`..`) or symbolic links escaping the workspace are blocked by `WorkspaceRegistry.resolvePath`.
|
|
16
|
+
2. **Persistent Processes**: Long-running servers, .NET applications, and Godot games run as background child processes managed by `ProcessManager`. Standard output and error streams are captured in bounded in-memory log buffers (max 1000 lines).
|
|
17
|
+
3. **Secret Redaction**: Environment variables containing keywords like `TOKEN`, `SECRET`, `PASSWORD`, `KEY`, or `CONNECTION_STRING` are automatically redacted in responses and log entries.
|
|
18
|
+
4. **Browser & Network Security**: `capture_page_screenshot` and `inspect_page` enforce strict SSRF defenses, blocking non-HTTP(S) schemes (`file:`, `data:`, `javascript:`) and cloud metadata / private network IP addresses unless targeting recognized local development hosts (`localhost`, `127.0.0.1`, `[::1]`).
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Tool Reference
|
|
23
|
+
|
|
24
|
+
### Phase 1: Persistent Process Management
|
|
25
|
+
- `start_process`: Spawns background process inside workspace. Returns `processId`.
|
|
26
|
+
- `get_process_logs`: Tail stdout/stderr for a process (default 100 lines, max 500 lines).
|
|
27
|
+
- `list_processes`: List tracked background processes for a workspace.
|
|
28
|
+
- `stop_process`: Gracefully stop or force-kill (`force: true`) process tree.
|
|
29
|
+
|
|
30
|
+
### Phase 2: Structured Project Discovery & Search
|
|
31
|
+
- `glob_files`: Fast file globbing respecting `.gitignore` and default exclusions (`.git`, `node_modules`, `dist`, `bin`, `obj`).
|
|
32
|
+
- `search_text`: Workspace-wide text search returning matching lines and context snippets.
|
|
33
|
+
- `inspect_project`: Auto-detect Node.js, TypeScript, .NET, Godot, Python, Git projects and recommended build/run/test commands.
|
|
34
|
+
|
|
35
|
+
### Phase 3: Web-Development Tools
|
|
36
|
+
- `start_dev_server`: Launch web dev server (auto-detects `npm run dev` script).
|
|
37
|
+
- `capture_page_screenshot`: Playwright browser screenshot saved inside workspace and returned as MCP image content.
|
|
38
|
+
- `inspect_page`: Extract structured page title, headings, buttons, links, landmarks, console errors, and failed requests.
|
|
39
|
+
|
|
40
|
+
### Phase 4: Image and Screenshot Inspection
|
|
41
|
+
- `inspect_image`: Inspect dimensions, format, MIME type, alpha, and color palette.
|
|
42
|
+
- `compare_images`: RGBA pixel-by-pixel image comparison returning match %, changed pixels, and optional diff PNG output.
|
|
43
|
+
- `inspect_sprite`: Analyze sprite sheet grid dimensions, cell divisibility, and frame bounds.
|
|
44
|
+
- `split_sprite_sheet`: Slices sprite sheet into individual frame PNGs saved inside the workspace.
|
|
45
|
+
|
|
46
|
+
### Phase 5: C# and .NET Tools
|
|
47
|
+
- `inspect_dotnet_project`: Parse `.csproj`, `.fsproj`, `.sln` for SDK style, frameworks, packages, and test runner.
|
|
48
|
+
- `dotnet_restore`: Run `dotnet restore` securely.
|
|
49
|
+
- `dotnet_build`: Run `dotnet build` returning structured compiler errors/warnings with line and column.
|
|
50
|
+
- `dotnet_test`: Run `dotnet test` returning pass/fail/skip counts, failed test names, and assertion messages.
|
|
51
|
+
- `dotnet_run`: Launch .NET app as persistent process.
|
|
52
|
+
- `dotnet_format`: Run `dotnet format` (`verifyOnly` mode supported).
|
|
53
|
+
|
|
54
|
+
### Phase 6: Godot 4 Tools
|
|
55
|
+
- `detect_godot_project`: Read `project.godot` for project name, main scene, renderer, autoloads, input actions.
|
|
56
|
+
- `godot_run`: Launch Godot game or editor as persistent process. Environment variable `GODOT_EXECUTABLE` overrides path.
|
|
57
|
+
- `inspect_godot_scene`: Parse `.tscn` text scene trees, node types, signals, and external resources.
|
|
58
|
+
|
|
59
|
+
### Phase 7: Window Capture
|
|
60
|
+
- `capture_window`: Capture screenshot of Auvrynt-tracked application window (Windows only).
|
|
61
|
+
- `godot_capture_game`: Wrap window capture for Godot game processes.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Development Workflows
|
|
66
|
+
|
|
67
|
+
### Web Development Workflow
|
|
68
|
+
```text
|
|
69
|
+
1. open_workspace(path)
|
|
70
|
+
2. inspect_project(workspaceId)
|
|
71
|
+
3. start_dev_server(workspaceId)
|
|
72
|
+
4. capture_page_screenshot(workspaceId, url="http://localhost:3000", outputPath="screenshots/home.png")
|
|
73
|
+
5. inspect_page(workspaceId, url="http://localhost:3000")
|
|
74
|
+
6. stop_process(workspaceId, processId)
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### .NET Workflow
|
|
78
|
+
```text
|
|
79
|
+
1. open_workspace(path)
|
|
80
|
+
2. inspect_dotnet_project(workspaceId, projectPath="MyApp.csproj")
|
|
81
|
+
3. dotnet_restore(workspaceId, projectPath="MyApp.csproj")
|
|
82
|
+
4. dotnet_build(workspaceId, projectPath="MyApp.csproj")
|
|
83
|
+
5. dotnet_test(workspaceId, projectPath="MyApp.Tests.csproj")
|
|
84
|
+
6. dotnet_run(workspaceId, projectPath="MyApp.csproj")
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Godot 4 Workflow
|
|
88
|
+
```text
|
|
89
|
+
1. open_workspace(path)
|
|
90
|
+
2. detect_godot_project(workspaceId)
|
|
91
|
+
3. inspect_godot_scene(workspaceId, scenePath="scenes/main.tscn")
|
|
92
|
+
4. godot_run(workspaceId, projectPath=".")
|
|
93
|
+
5. godot_capture_game(workspaceId, processId, outputPath="captures/game.png")
|
|
94
|
+
6. stop_process(workspaceId, processId)
|
|
95
|
+
```
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# ChatGPT Coding Workflow
|
|
2
|
+
|
|
3
|
+
Auvrynt brings a Codex-style coding-agent loop to ChatGPT and other MCP hosts:
|
|
4
|
+
inspect the repo, follow local instructions, make scoped edits, run
|
|
5
|
+
verification, and show the user what changed.
|
|
6
|
+
|
|
7
|
+
## Open One Workspace
|
|
8
|
+
|
|
9
|
+
ChatGPT should call `open_workspace` once for a project folder:
|
|
10
|
+
|
|
11
|
+
```json
|
|
12
|
+
{
|
|
13
|
+
"path": "~/work/my-project"
|
|
14
|
+
}
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
The result includes a `workspaceId`. All later file, search, edit, show-changes,
|
|
18
|
+
and shell calls should reuse that same `workspaceId`.
|
|
19
|
+
|
|
20
|
+
Do not reopen the same folder unless:
|
|
21
|
+
|
|
22
|
+
- the `workspaceId` is rejected as unknown
|
|
23
|
+
- the user switches to another folder
|
|
24
|
+
- the user switches between checkout and worktree mode
|
|
25
|
+
- the user explicitly asks to reopen
|
|
26
|
+
|
|
27
|
+
## Checkout Mode
|
|
28
|
+
|
|
29
|
+
Checkout mode is the default. Auvrynt opens the actual directory:
|
|
30
|
+
|
|
31
|
+
```json
|
|
32
|
+
{
|
|
33
|
+
"path": "~/work/my-project"
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Use this when the user wants ChatGPT to work in the current checkout.
|
|
38
|
+
|
|
39
|
+
## Worktree Mode
|
|
40
|
+
|
|
41
|
+
Use worktree mode for isolated parallel work:
|
|
42
|
+
|
|
43
|
+
```json
|
|
44
|
+
{
|
|
45
|
+
"path": "~/work/my-project",
|
|
46
|
+
"mode": "worktree"
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Managed worktrees are created under:
|
|
51
|
+
|
|
52
|
+
```text
|
|
53
|
+
~/.auvrynt/worktrees
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Worktree mode requires a Git repository with at least one commit. It starts from
|
|
57
|
+
`HEAD` unless `baseRef` is provided.
|
|
58
|
+
|
|
59
|
+
Uncommitted source checkout changes are not copied into the managed worktree.
|
|
60
|
+
Auvrynt reports when the source checkout was dirty so the model can decide how
|
|
61
|
+
to proceed with the user.
|
|
62
|
+
|
|
63
|
+
## Project Instructions
|
|
64
|
+
|
|
65
|
+
When a workspace opens, Auvrynt loads root-level instruction files:
|
|
66
|
+
|
|
67
|
+
- `AGENTS.md`
|
|
68
|
+
- `AGENTS.MD`
|
|
69
|
+
- `CLAUDE.md`
|
|
70
|
+
- `CLAUDE.MD`
|
|
71
|
+
|
|
72
|
+
Nested instruction files are returned as `availableAgentsFiles`. The model
|
|
73
|
+
should read the relevant nested file before working under that directory.
|
|
74
|
+
|
|
75
|
+
This keeps instructions explicit and inspectable instead of silently injecting
|
|
76
|
+
new context during later tool calls.
|
|
77
|
+
|
|
78
|
+
## Skills
|
|
79
|
+
|
|
80
|
+
Skills are enabled by default for coding-agent workflows.
|
|
81
|
+
|
|
82
|
+
Auvrynt discovers skills from:
|
|
83
|
+
|
|
84
|
+
- `AUVRYNT_AGENT_DIR`, which defaults to `~/.codex`
|
|
85
|
+
- project `.pi/skills`
|
|
86
|
+
- optional paths from `AUVRYNT_SKILL_PATHS`
|
|
87
|
+
|
|
88
|
+
When `open_workspace` returns matching skills, the model should read the
|
|
89
|
+
advertised `SKILL.md` before following that skill.
|
|
90
|
+
|
|
91
|
+
Skill paths may be outside the workspace. Auvrynt only permits reading:
|
|
92
|
+
|
|
93
|
+
- advertised `SKILL.md` files
|
|
94
|
+
- files under a skill directory after that skill's `SKILL.md` has been read
|
|
95
|
+
|
|
96
|
+
Set `AUVRYNT_SKILLS=0` to hide skills from workspace output.
|
|
97
|
+
|
|
98
|
+
## Tool Names
|
|
99
|
+
|
|
100
|
+
Short names are the default:
|
|
101
|
+
|
|
102
|
+
- `open_workspace`
|
|
103
|
+
- `read`
|
|
104
|
+
- `write`
|
|
105
|
+
- `edit`
|
|
106
|
+
- `bash`
|
|
107
|
+
|
|
108
|
+
By default, Auvrynt also runs in `AUVRYNT_TOOL_MODE=minimal`, so dedicated
|
|
109
|
+
`grep`, `glob`, and `ls` tools are hidden. Use `bash` with command-line tools
|
|
110
|
+
such as `rg`, `find`, and `ls` for search and directory inspection.
|
|
111
|
+
|
|
112
|
+
Legacy names are available with `AUVRYNT_TOOL_NAMING=legacy`:
|
|
113
|
+
|
|
114
|
+
- `open_workspace`
|
|
115
|
+
- `read_file`
|
|
116
|
+
- `write_file`
|
|
117
|
+
- `edit_file`
|
|
118
|
+
- `run_shell`
|
|
119
|
+
|
|
120
|
+
Use `AUVRYNT_TOOL_MODE=full` to restore dedicated search and directory tools.
|
|
121
|
+
|
|
122
|
+
## Show Changes
|
|
123
|
+
|
|
124
|
+
By default, `AUVRYNT_WIDGETS=full`.
|
|
125
|
+
|
|
126
|
+
In that mode, Auvrynt attaches widget UI to the exposed workspace, file, edit,
|
|
127
|
+
and shell tools. The aggregate `show_changes` tool is not exposed by default.
|
|
128
|
+
|
|
129
|
+
Use `AUVRYNT_WIDGETS=off` to disable widget UI, or `AUVRYNT_WIDGETS=changes`
|
|
130
|
+
to expose the aggregate show-changes flow.
|
|
131
|
+
|
|
132
|
+
## Shell Use
|
|
133
|
+
|
|
134
|
+
The shell tool is for commands that belong in a terminal:
|
|
135
|
+
|
|
136
|
+
- tests
|
|
137
|
+
- builds
|
|
138
|
+
- git inspection
|
|
139
|
+
- package scripts
|
|
140
|
+
- environment checks
|
|
141
|
+
|
|
142
|
+
File writes should go through the edit/write tools rather than shell
|
|
143
|
+
redirection, heredocs, `tee`, `sed -i`, or generated scripts.
|