@macintacos/caret 0.1.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/.claude-plugin/plugin.json +18 -0
- package/LICENSE +21 -0
- package/README.md +122 -0
- package/bin/caret +53 -0
- package/commands/debug.md +130 -0
- package/commands/demo.md +21 -0
- package/commands/discovery.md +35 -0
- package/dist/cli.js +32593 -0
- package/hooks/hooks.json +28 -0
- package/opencode/caret.plugin.ts +293 -0
- package/opencode/commands/debug.md +53 -0
- package/opencode/commands/demo.md +29 -0
- package/opencode/commands/discovery.md +31 -0
- package/package.json +65 -0
- package/ui/dist/assets/abap-CLvhMVsD.js +1 -0
- package/ui/dist/assets/actionscript-3--17pq3dv.js +1 -0
- package/ui/dist/assets/ada-C5qYipkI.js +1 -0
- package/ui/dist/assets/angular-html-Cg_qO4OQ.js +1 -0
- package/ui/dist/assets/angular-ts-BmV-Wd4K.js +1 -0
- package/ui/dist/assets/apache-U0d_L8uA.js +1 -0
- package/ui/dist/assets/apex-VAyPSnFM.js +1 -0
- package/ui/dist/assets/apl-CnwPGSsG.js +1 -0
- package/ui/dist/assets/apl-DDDJQLEy.js +1 -0
- package/ui/dist/assets/applescript-CCn79oCD.js +1 -0
- package/ui/dist/assets/ara-4CJ0cIlV.js +1 -0
- package/ui/dist/assets/asciiarmor-qTkVPQu6.js +1 -0
- package/ui/dist/assets/asciidoc-DE70LPWp.js +1 -0
- package/ui/dist/assets/asm-Cmm7eHzH.js +1 -0
- package/ui/dist/assets/asn1-Dr8qZg38.js +1 -0
- package/ui/dist/assets/asterisk-Bja0s6e1.js +1 -0
- package/ui/dist/assets/astro-Cq94xJ2F.js +1 -0
- package/ui/dist/assets/awk-BWXHIvNe.js +1 -0
- package/ui/dist/assets/ballerina-B7ZEbQpA.js +1 -0
- package/ui/dist/assets/bat-Bo4NYOV-.js +1 -0
- package/ui/dist/assets/beancount-D-usSTwE.js +1 -0
- package/ui/dist/assets/berry-DKpUyyne.js +1 -0
- package/ui/dist/assets/bibtex-Ci_nEsc7.js +1 -0
- package/ui/dist/assets/bicep-CUHmPFLl.js +1 -0
- package/ui/dist/assets/bird2-C6vDhewU.js +1 -0
- package/ui/dist/assets/blade-DZCNRrZB.js +1 -0
- package/ui/dist/assets/brainfuck-D5EjA2JK.js +1 -0
- package/ui/dist/assets/bsl-BkkzgIyY.js +1 -0
- package/ui/dist/assets/c-CwNkiPnO.js +1 -0
- package/ui/dist/assets/c3-BFHwR3_K.js +1 -0
- package/ui/dist/assets/cadence-CQ2zXKGN.js +1 -0
- package/ui/dist/assets/cairo-DLTphjLi.js +1 -0
- package/ui/dist/assets/clarity-SemFz856.js +1 -0
- package/ui/dist/assets/clike-DHH8Ad3s.js +1 -0
- package/ui/dist/assets/clojure-BflJGmDX.js +1 -0
- package/ui/dist/assets/clojure-DqKBuwfJ.js +1 -0
- package/ui/dist/assets/cmake-Bj61d0ZC.js +1 -0
- package/ui/dist/assets/cmake-CyVbuzPu.js +1 -0
- package/ui/dist/assets/cobol-B_OZ4V-R.js +1 -0
- package/ui/dist/assets/cobol-CgSNuNV-.js +1 -0
- package/ui/dist/assets/codeowners-C8r90Shi.js +1 -0
- package/ui/dist/assets/codeql-oeQT6MSM.js +1 -0
- package/ui/dist/assets/coffee-DWlIdtuG.js +1 -0
- package/ui/dist/assets/coffeescript-B2pKbFk8.js +1 -0
- package/ui/dist/assets/common-lisp-Cv5bFMCO.js +1 -0
- package/ui/dist/assets/commonlisp-CcllspGY.js +1 -0
- package/ui/dist/assets/coq-BrsZFFmf.js +1 -0
- package/ui/dist/assets/cpp-CmiYyU8y.js +1 -0
- package/ui/dist/assets/crystal-BiyOLiea.js +1 -0
- package/ui/dist/assets/crystal-M5-qzICs.js +1 -0
- package/ui/dist/assets/csharp-oqKa8noW.js +1 -0
- package/ui/dist/assets/css-CYpP4FRV.js +1 -0
- package/ui/dist/assets/css-DGiwxBdC.js +1 -0
- package/ui/dist/assets/csv-Dx-8-gkx.js +1 -0
- package/ui/dist/assets/cue-CE9AQfxI.js +1 -0
- package/ui/dist/assets/cypher-ClKdZ_lG.js +1 -0
- package/ui/dist/assets/cypher-p9eYesGn.js +1 -0
- package/ui/dist/assets/d-BhMjBjQP.js +1 -0
- package/ui/dist/assets/d-qD-0Kul2.js +1 -0
- package/ui/dist/assets/dart-CnvKMtbv.js +1 -0
- package/ui/dist/assets/dax-BkyTk9wS.js +1 -0
- package/ui/dist/assets/desktop-Dlh5hvp9.js +1 -0
- package/ui/dist/assets/diff-ChtP43wD.js +1 -0
- package/ui/dist/assets/diff-woXpYk--.js +1 -0
- package/ui/dist/assets/dist-24WuufPm.js +1 -0
- package/ui/dist/assets/dist-B-SHQUSo.js +1 -0
- package/ui/dist/assets/dist-B3mK9QMK.js +1 -0
- package/ui/dist/assets/dist-BViEvwEG.js +2 -0
- package/ui/dist/assets/dist-BXtMxuI7.js +1 -0
- package/ui/dist/assets/dist-BkSlyoLl.js +1 -0
- package/ui/dist/assets/dist-C-hQPg8K.js +1 -0
- package/ui/dist/assets/dist-C1Qk3ApG.js +1 -0
- package/ui/dist/assets/dist-C9DszYV1.js +9 -0
- package/ui/dist/assets/dist-CCQGXHXf.js +1 -0
- package/ui/dist/assets/dist-CKVYvLDM.js +11 -0
- package/ui/dist/assets/dist-CNR9H9hI.js +1 -0
- package/ui/dist/assets/dist-C_IYb7Qh.js +1 -0
- package/ui/dist/assets/dist-CbS4AEdX.js +1 -0
- package/ui/dist/assets/dist-CfztD2mm.js +1 -0
- package/ui/dist/assets/dist-Cr9g-IkY.js +1 -0
- package/ui/dist/assets/dist-D_I8tzqw.js +1 -0
- package/ui/dist/assets/docker-IyjqRm3v.js +1 -0
- package/ui/dist/assets/dockerfile-BLkNEvjs.js +1 -0
- package/ui/dist/assets/dotenv-_5a1GRtc.js +1 -0
- package/ui/dist/assets/dream-maker-DW3nJb8Q.js +1 -0
- package/ui/dist/assets/dtd-DTF72YNO.js +1 -0
- package/ui/dist/assets/dylan-C6jEEEk-.js +1 -0
- package/ui/dist/assets/ebnf-D4c0_ac3.js +1 -0
- package/ui/dist/assets/ecl-BSZaIHnp.js +1 -0
- package/ui/dist/assets/edge-CZXzS9pm.js +1 -0
- package/ui/dist/assets/eiffel-BEjRio4Q.js +1 -0
- package/ui/dist/assets/elixir-BTnUmaBf.js +1 -0
- package/ui/dist/assets/elm-Bq5po3Zd.js +1 -0
- package/ui/dist/assets/elm-Cshzl8qu.js +1 -0
- package/ui/dist/assets/emacs-lisp-B4R74twV.js +1 -0
- package/ui/dist/assets/erb-BOVmqWJf.js +1 -0
- package/ui/dist/assets/erlang-Cphh6RMH.js +1 -0
- package/ui/dist/assets/erlang-DaB2Rkuy.js +1 -0
- package/ui/dist/assets/factor-D7LVTn2l.js +1 -0
- package/ui/dist/assets/fcl-ClOhbFR7.js +1 -0
- package/ui/dist/assets/fennel-DQxkIbk2.js +1 -0
- package/ui/dist/assets/fish-BJitypiv.js +1 -0
- package/ui/dist/assets/fluent-C03EYrpw.js +1 -0
- package/ui/dist/assets/forth-Cezjo90N.js +1 -0
- package/ui/dist/assets/fortran-Bt6PBEDR.js +1 -0
- package/ui/dist/assets/fortran-fixed-form-DEKoE2YW.js +1 -0
- package/ui/dist/assets/fortran-free-form-CYNrtFtB.js +1 -0
- package/ui/dist/assets/fsharp-D13ZGOAj.js +1 -0
- package/ui/dist/assets/gas-BHEdbvp9.js +1 -0
- package/ui/dist/assets/gdresource-C0sCabJj.js +1 -0
- package/ui/dist/assets/gdscript-Cp2uCuqX.js +1 -0
- package/ui/dist/assets/gdshader-CBce3t8t.js +1 -0
- package/ui/dist/assets/genie-CV2tkWYe.js +1 -0
- package/ui/dist/assets/gherkin-DExj1W_8.js +1 -0
- package/ui/dist/assets/gherkin-oBAE_ms0.js +1 -0
- package/ui/dist/assets/git-commit-BSykSTBG.js +1 -0
- package/ui/dist/assets/git-rebase-DLQM-CxK.js +1 -0
- package/ui/dist/assets/gleam-CSRkHgEL.js +1 -0
- package/ui/dist/assets/glimmer-js-DzMlcKY7.js +1 -0
- package/ui/dist/assets/glimmer-ts-Dz691XKF.js +1 -0
- package/ui/dist/assets/glsl-CMQZ1AkF.js +1 -0
- package/ui/dist/assets/gn-ilITqXS6.js +1 -0
- package/ui/dist/assets/gnuplot-7GGW24-e.js +1 -0
- package/ui/dist/assets/go-rLFTqkRN.js +1 -0
- package/ui/dist/assets/graphql-DBKIWtF7.js +1 -0
- package/ui/dist/assets/groovy-BC3IOsC8.js +1 -0
- package/ui/dist/assets/groovy-CacY0gHj.js +1 -0
- package/ui/dist/assets/hack-DZbb_fkF.js +1 -0
- package/ui/dist/assets/haml-CSjdx5hj.js +1 -0
- package/ui/dist/assets/handlebars-Mu9SxQrl.js +1 -0
- package/ui/dist/assets/haskell-BRsoo5mP.js +1 -0
- package/ui/dist/assets/haskell-D8IpX4py.js +1 -0
- package/ui/dist/assets/haxe-DIz0ZZqd.js +1 -0
- package/ui/dist/assets/haxe-OTjmBuCE.js +1 -0
- package/ui/dist/assets/hcl-Dh228itO.js +1 -0
- package/ui/dist/assets/hjson-CxZEssPk.js +1 -0
- package/ui/dist/assets/hlsl-Cvrh5tZx.js +1 -0
- package/ui/dist/assets/html-D4wtNI0H.js +1 -0
- package/ui/dist/assets/html-derivative-DHrkr74L.js +1 -0
- package/ui/dist/assets/http-CLVgA2GD.js +1 -0
- package/ui/dist/assets/http-DtBk1Y64.js +1 -0
- package/ui/dist/assets/hurl-1qu6SWMo.js +1 -0
- package/ui/dist/assets/hxml-B0Qn7Nwc.js +1 -0
- package/ui/dist/assets/hy-CZbG8q4J.js +1 -0
- package/ui/dist/assets/idl-BUZw3wgd.js +1 -0
- package/ui/dist/assets/imba-DsUTQ-LC.js +1 -0
- package/ui/dist/assets/index-DT45eblI.css +1 -0
- package/ui/dist/assets/index-Dqm3ZFVQ.js +554 -0
- package/ui/dist/assets/ini-B5eOa1yu.js +1 -0
- package/ui/dist/assets/java-CLLSyNOn.js +1 -0
- package/ui/dist/assets/javascript-9Tg8ixDm.js +1 -0
- package/ui/dist/assets/javascript-B-_kYMSx.js +1 -0
- package/ui/dist/assets/jinja-BtHF51nI.js +1 -0
- package/ui/dist/assets/jison-C93_a--j.js +1 -0
- package/ui/dist/assets/json-C4FWYbGR.js +1 -0
- package/ui/dist/assets/json5-BR5RXkoi.js +1 -0
- package/ui/dist/assets/jsonc-CYpm1nAK.js +1 -0
- package/ui/dist/assets/jsonl-CmCQp5Yx.js +1 -0
- package/ui/dist/assets/jsonnet-CJTPZ8u_.js +1 -0
- package/ui/dist/assets/jssm-DXw9l8Rf.js +1 -0
- package/ui/dist/assets/jsx-BdkuTVvH.js +1 -0
- package/ui/dist/assets/julia-BmboAp4o.js +1 -0
- package/ui/dist/assets/julia-CQfgDRfP.js +1 -0
- package/ui/dist/assets/just-E1Wftakf.js +1 -0
- package/ui/dist/assets/kdl-CsD5j6eV.js +1 -0
- package/ui/dist/assets/kotlin-DhhofPvG.js +1 -0
- package/ui/dist/assets/kusto-C7mF5XQf.js +1 -0
- package/ui/dist/assets/latex-DZFvvGDu.js +1 -0
- package/ui/dist/assets/lean-CewbzKMR.js +1 -0
- package/ui/dist/assets/less-DVTAwKKz.js +1 -0
- package/ui/dist/assets/liquid-BUTRgRVi.js +1 -0
- package/ui/dist/assets/livescript-BXxG0Yva.js +1 -0
- package/ui/dist/assets/llvm-Cm23YOpf.js +1 -0
- package/ui/dist/assets/log-BNLmms1o.js +1 -0
- package/ui/dist/assets/logo-Cluzi2Zq.js +1 -0
- package/ui/dist/assets/lua-CiA1ziua.js +1 -0
- package/ui/dist/assets/lua-Dl1ciOfH.js +1 -0
- package/ui/dist/assets/luau-FMPmPwt6.js +1 -0
- package/ui/dist/assets/make-Dixweg8N.js +1 -0
- package/ui/dist/assets/markdown-BYOwaDjH.js +1 -0
- package/ui/dist/assets/marko-Bh-A3HQZ.js +1 -0
- package/ui/dist/assets/mathematica-u8YMmbU0.js +1 -0
- package/ui/dist/assets/matlab-D7qyCx1q.js +1 -0
- package/ui/dist/assets/mbox-BEMVcqjs.js +1 -0
- package/ui/dist/assets/mdc-C2XCGsSV.js +1 -0
- package/ui/dist/assets/mdx-DQZ5AkYe.js +1 -0
- package/ui/dist/assets/mermaid-Bk4SNUv9.js +1 -0
- package/ui/dist/assets/mipsasm-BMqwQI7S.js +1 -0
- package/ui/dist/assets/mirc-C9zpzAZU.js +1 -0
- package/ui/dist/assets/mllike-B45xgp2S.js +1 -0
- package/ui/dist/assets/modelica-CqHI_q-D.js +1 -0
- package/ui/dist/assets/mojo-BgCJLMeH.js +1 -0
- package/ui/dist/assets/moonbit-CaWjb8XO.js +1 -0
- package/ui/dist/assets/move-B1IS1UjX.js +1 -0
- package/ui/dist/assets/mscgen-qgSLujhx.js +1 -0
- package/ui/dist/assets/mumps-CW_TBmxz.js +1 -0
- package/ui/dist/assets/narrat-_X_XdTYD.js +1 -0
- package/ui/dist/assets/nextflow-BJtWHP5T.js +1 -0
- package/ui/dist/assets/nextflow-groovy-DJMQeKeT.js +1 -0
- package/ui/dist/assets/nginx-BMaDbqW3.js +1 -0
- package/ui/dist/assets/nginx-igqyMv_F.js +1 -0
- package/ui/dist/assets/nim-DelsCcX1.js +1 -0
- package/ui/dist/assets/nix-IvuFDN5E.js +1 -0
- package/ui/dist/assets/nsis-AQ_alPln.js +1 -0
- package/ui/dist/assets/ntriples-d28e9m0E.js +1 -0
- package/ui/dist/assets/nushell-DcLAeLz5.js +1 -0
- package/ui/dist/assets/objective-c-D1A_Heim.js +1 -0
- package/ui/dist/assets/objective-cpp-BsSzOQcm.js +1 -0
- package/ui/dist/assets/ocaml-O90oeIOV.js +1 -0
- package/ui/dist/assets/octave-D2Q8cUp1.js +1 -0
- package/ui/dist/assets/odin-B1RWQWA5.js +1 -0
- package/ui/dist/assets/openscad-BUDT5pXO.js +1 -0
- package/ui/dist/assets/oz-BwTct_5T.js +1 -0
- package/ui/dist/assets/pascal-4ZHwLPI5.js +1 -0
- package/ui/dist/assets/pascal-Dp_KdFgX.js +1 -0
- package/ui/dist/assets/perl-CdEHsPfU.js +1 -0
- package/ui/dist/assets/perl-Cgh7mkol.js +1 -0
- package/ui/dist/assets/php-DXn-4Rf4.js +1 -0
- package/ui/dist/assets/pig-AF4Hwhju.js +1 -0
- package/ui/dist/assets/pkl-ot-7Btpt.js +1 -0
- package/ui/dist/assets/plsql-DGHpHOYJ.js +1 -0
- package/ui/dist/assets/po-BiJDBrnU.js +1 -0
- package/ui/dist/assets/polar-C7UOKdEL.js +1 -0
- package/ui/dist/assets/postcss-BXeXVLqQ.js +1 -0
- package/ui/dist/assets/powerquery-DNMTfnFr.js +1 -0
- package/ui/dist/assets/powershell-CzG71I4L.js +1 -0
- package/ui/dist/assets/powershell-DshXNtvi.js +1 -0
- package/ui/dist/assets/prisma-BsRQq5mF.js +1 -0
- package/ui/dist/assets/prolog-iXnhIJG7.js +1 -0
- package/ui/dist/assets/properties-C357ku5U.js +1 -0
- package/ui/dist/assets/proto-DB4EqR-F.js +1 -0
- package/ui/dist/assets/protobuf-D1ij_kNL.js +1 -0
- package/ui/dist/assets/pug-BNWZhj7f.js +1 -0
- package/ui/dist/assets/pug-Bugr-47h.js +1 -0
- package/ui/dist/assets/puppet-B4hC2X4m.js +1 -0
- package/ui/dist/assets/puppet-CDv2pdJW.js +1 -0
- package/ui/dist/assets/purescript-9MfHhQsQ.js +1 -0
- package/ui/dist/assets/python-BqYw9LYJ.js +1 -0
- package/ui/dist/assets/python-gzcpVVnB.js +1 -0
- package/ui/dist/assets/q-B9NhS7L_.js +1 -0
- package/ui/dist/assets/qml-CHLXijrJ.js +1 -0
- package/ui/dist/assets/qmldir-DCQb3MpD.js +1 -0
- package/ui/dist/assets/qss-Fe1Jh2GI.js +1 -0
- package/ui/dist/assets/r-DADKenSm.js +1 -0
- package/ui/dist/assets/r-g949Oasl.js +1 -0
- package/ui/dist/assets/racket-DcIDlBhZ.js +1 -0
- package/ui/dist/assets/raku-B3gFvitq.js +1 -0
- package/ui/dist/assets/razor-BUv8GTQg.js +1 -0
- package/ui/dist/assets/reg-CRGYupPL.js +1 -0
- package/ui/dist/assets/regexp-Dxi3LqhO.js +1 -0
- package/ui/dist/assets/rel-BtDbiS_P.js +1 -0
- package/ui/dist/assets/riscv-Ckw8ddFX.js +1 -0
- package/ui/dist/assets/ron-VUp2lXgN.js +1 -0
- package/ui/dist/assets/rosmsg-CAekHB0j.js +1 -0
- package/ui/dist/assets/rpm-gpDK5sbt.js +1 -0
- package/ui/dist/assets/rst-CMQNxthU.js +1 -0
- package/ui/dist/assets/ruby-CDBQomnV.js +1 -0
- package/ui/dist/assets/ruby-DsYpTuWg.js +1 -0
- package/ui/dist/assets/rust-Cfkwpbl8.js +1 -0
- package/ui/dist/assets/sas-C2OyD2Y6.js +1 -0
- package/ui/dist/assets/sas-uuqXrFx7.js +1 -0
- package/ui/dist/assets/sass-DXrisJhu.js +1 -0
- package/ui/dist/assets/scala-DKOlJaKm.js +1 -0
- package/ui/dist/assets/scheme-CyDdOh7e.js +1 -0
- package/ui/dist/assets/scheme-DQCgrYNe.js +1 -0
- package/ui/dist/assets/scss-CniJSQ3f.js +1 -0
- package/ui/dist/assets/sdbl-bTVj8UrX.js +1 -0
- package/ui/dist/assets/shaderlab-TOUzSsQk.js +1 -0
- package/ui/dist/assets/shell-Du5Qg9im.js +1 -0
- package/ui/dist/assets/shellscript-CuBMk1iS.js +1 -0
- package/ui/dist/assets/shellsession-BzDlSDO2.js +1 -0
- package/ui/dist/assets/sieve-BAxa3IjF.js +1 -0
- package/ui/dist/assets/simple-mode-DRpGK0lJ.js +1 -0
- package/ui/dist/assets/smalltalk-B16xEiuN.js +1 -0
- package/ui/dist/assets/smalltalk-BLp5-jwC.js +1 -0
- package/ui/dist/assets/solidity-CKzVLygQ.js +1 -0
- package/ui/dist/assets/solr-BBopId9w.js +1 -0
- package/ui/dist/assets/soy-e0u5_VID.js +1 -0
- package/ui/dist/assets/sparql-D_iOobhT.js +1 -0
- package/ui/dist/assets/sparql-Dz-mlCAC.js +1 -0
- package/ui/dist/assets/splunk-BC2Px7Mm.js +1 -0
- package/ui/dist/assets/spreadsheet-CTIncYxj.js +1 -0
- package/ui/dist/assets/sql-Cbg060Y9.js +1 -0
- package/ui/dist/assets/sql-DcCJ9jop.js +1 -0
- package/ui/dist/assets/ssh-config-BgfXC-Er.js +1 -0
- package/ui/dist/assets/stata-n_N_Lnpt.js +1 -0
- package/ui/dist/assets/stex-sDrdk2BW.js +1 -0
- package/ui/dist/assets/stylus-B6D30XZt.js +1 -0
- package/ui/dist/assets/stylus-DLLZ8dgm.js +1 -0
- package/ui/dist/assets/surrealql-Sa2566xv.js +1 -0
- package/ui/dist/assets/svelte-B0zgpD2X.js +1 -0
- package/ui/dist/assets/swift-DKB6_1j6.js +1 -0
- package/ui/dist/assets/swift-DonLKvLd.js +1 -0
- package/ui/dist/assets/system-verilog-DJ5XKQeo.js +1 -0
- package/ui/dist/assets/systemd-BxMlprV5.js +1 -0
- package/ui/dist/assets/talonscript-CohzipZa.js +1 -0
- package/ui/dist/assets/tasl-DMoTqEGO.js +1 -0
- package/ui/dist/assets/tcl-BGfruO1u.js +1 -0
- package/ui/dist/assets/tcl-CZd0xW_V.js +1 -0
- package/ui/dist/assets/templ-BMfZts2f.js +1 -0
- package/ui/dist/assets/terraform-DswuEJGm.js +1 -0
- package/ui/dist/assets/tex-7PyiPoxe.js +1 -0
- package/ui/dist/assets/textile-DWBqthVk.js +1 -0
- package/ui/dist/assets/tiddlywiki-VlUiK86J.js +1 -0
- package/ui/dist/assets/tiki-CxVlf5KZ.js +1 -0
- package/ui/dist/assets/toml-CcmNWLt0.js +1 -0
- package/ui/dist/assets/toml-LvoKBwCs.js +1 -0
- package/ui/dist/assets/troff-C2dAgh7P.js +1 -0
- package/ui/dist/assets/ts-tags-nHnZDDzD.js +1 -0
- package/ui/dist/assets/tsv-sltzmVWM.js +1 -0
- package/ui/dist/assets/tsx-BgvqLYni.js +1 -0
- package/ui/dist/assets/ttcn-BePYh-hG.js +1 -0
- package/ui/dist/assets/ttcn-cfg-CY0aot7Q.js +1 -0
- package/ui/dist/assets/turtle-BDLWE2cD.js +1 -0
- package/ui/dist/assets/turtle-ByJddavk.js +1 -0
- package/ui/dist/assets/twig-BqJ1gUqf.js +1 -0
- package/ui/dist/assets/typescript-C2nbCIiA.js +1 -0
- package/ui/dist/assets/typespec-BRdr0IET.js +1 -0
- package/ui/dist/assets/typst-DI99ib-x.js +1 -0
- package/ui/dist/assets/unused-shiki-extras-CUWqhvIR.js +1 -0
- package/ui/dist/assets/v-DETTlOr0.js +1 -0
- package/ui/dist/assets/vala-zf12oZj6.js +1 -0
- package/ui/dist/assets/vb-BthdM_4N.js +1 -0
- package/ui/dist/assets/vb-Djn5o6TS.js +1 -0
- package/ui/dist/assets/vbscript-D9f6rSsU.js +1 -0
- package/ui/dist/assets/velocity-CqftRsjg.js +1 -0
- package/ui/dist/assets/verilog-CiiDBU1e.js +1 -0
- package/ui/dist/assets/verilog-D-x6ne0Z.js +1 -0
- package/ui/dist/assets/vhdl-BroJfC0k.js +1 -0
- package/ui/dist/assets/vhdl-CMrOq2q1.js +1 -0
- package/ui/dist/assets/viml-DvXPmvsu.js +1 -0
- package/ui/dist/assets/vue-B_l4_yyQ.js +1 -0
- package/ui/dist/assets/vue-html-qalJD3cY.js +1 -0
- package/ui/dist/assets/vue-vine-Cle_s8sp.js +1 -0
- package/ui/dist/assets/vyper-CgoNMtux.js +1 -0
- package/ui/dist/assets/wasm-ByWQv1Qj.js +1 -0
- package/ui/dist/assets/webidl-D5jiJvOU.js +1 -0
- package/ui/dist/assets/wenyan-C8pVoKbM.js +1 -0
- package/ui/dist/assets/wgsl-BsKzXJz4.js +1 -0
- package/ui/dist/assets/wikitext-ClFFjSW2.js +1 -0
- package/ui/dist/assets/wit-DdvCle-K.js +1 -0
- package/ui/dist/assets/wolfram-DLL8P-h_.js +1 -0
- package/ui/dist/assets/xml-CnKUcNAY.js +1 -0
- package/ui/dist/assets/xquery-fj_R-kMw.js +1 -0
- package/ui/dist/assets/xsl-D5cPGaiC.js +1 -0
- package/ui/dist/assets/yacas-CXXgtw0p.js +1 -0
- package/ui/dist/assets/yaml-BcZKwY9y.js +1 -0
- package/ui/dist/assets/z80-CL1naaMV.js +1 -0
- package/ui/dist/assets/zenscript-BnlCZFoB.js +1 -0
- package/ui/dist/assets/zig-CMLA9XwU.js +1 -0
- package/ui/dist/index.html +20 -0
package/hooks/hooks.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"hooks": {
|
|
3
|
+
"PermissionRequest": [
|
|
4
|
+
{
|
|
5
|
+
"matcher": "ExitPlanMode",
|
|
6
|
+
"hooks": [
|
|
7
|
+
{
|
|
8
|
+
"type": "command",
|
|
9
|
+
"command": "${CLAUDE_PLUGIN_ROOT}/bin/caret review",
|
|
10
|
+
"timeout": 3900
|
|
11
|
+
}
|
|
12
|
+
]
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"PostToolUse": [
|
|
16
|
+
{
|
|
17
|
+
"matcher": "EnterPlanMode",
|
|
18
|
+
"hooks": [
|
|
19
|
+
{
|
|
20
|
+
"type": "command",
|
|
21
|
+
"command": "${CLAUDE_PLUGIN_ROOT}/bin/caret prewarm",
|
|
22
|
+
"timeout": 30
|
|
23
|
+
}
|
|
24
|
+
]
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
// caret's OpenCode plugin (EXC-339). OpenCode is plugin-shaped, not command-hook
|
|
2
|
+
// shaped: it loads this in-process module and lets it register tools and mutate
|
|
3
|
+
// config. caret has no native plan-approval gate to intercept here (OpenCode has
|
|
4
|
+
// no ExitPlanMode equivalent), so this plugin REGISTERS its own plan-review tool,
|
|
5
|
+
// steers the Plan agent to call it, and
|
|
6
|
+
// runs the review synchronously inside the tool's execute(): it spawns
|
|
7
|
+
// `caret review` (CARET_AGENT=opencode) with a caret-defined envelope on stdin,
|
|
8
|
+
// blocks until the human decides in caret's browser UI, and returns the approval
|
|
9
|
+
// or change-request string as the tool result. The whole caret daemon/review
|
|
10
|
+
// pipeline is reused unchanged — this plugin is the OpenCode-side counterpart to
|
|
11
|
+
// Claude Code's hooks.json, which likewise spawns `caret review`.
|
|
12
|
+
//
|
|
13
|
+
// Subagent-bypass mitigation: OpenCode's tool.execute.before does not fire for
|
|
14
|
+
// subagent tool calls, so caret does NOT rely on a hook to gate subagents. The
|
|
15
|
+
// config hook restricts the tool to primary agents (experimental.primary_tools +
|
|
16
|
+
// per-agent permission), and the tool body re-checks the caller — defense in depth.
|
|
17
|
+
//
|
|
18
|
+
// This file is deployed verbatim (with the two __CARET_*__ markers substituted) by
|
|
19
|
+
// `caret install-opencode` into OpenCode's auto-loaded plugin dir, so it is
|
|
20
|
+
// self-contained: its only imports are node:child_process and @opencode-ai/plugin
|
|
21
|
+
// (the latter resolved by OpenCode at runtime). Live in-OpenCode verification of
|
|
22
|
+
// the exact ctx/tool/config shapes against the installed OpenCode version is a
|
|
23
|
+
// documented follow-up; the pure logic below is covered by test/opencode/.
|
|
24
|
+
|
|
25
|
+
import { spawn } from "node:child_process";
|
|
26
|
+
import { type Hooks, type Plugin, tool } from "@opencode-ai/plugin";
|
|
27
|
+
|
|
28
|
+
/** Install-time markers: `caret install-opencode` rewrites these string literals
|
|
29
|
+
* with the resolved caret version and binary path before deploying this file. */
|
|
30
|
+
export const CARET_PLUGIN_VERSION = "__CARET_VERSION__";
|
|
31
|
+
const CARET_BIN = "__CARET_BIN__";
|
|
32
|
+
|
|
33
|
+
/** The plan-review tool the Plan agent calls. */
|
|
34
|
+
export const REVIEW_TOOL = "caret_review_plan";
|
|
35
|
+
|
|
36
|
+
/** OpenCode's built-in primary planning agent — the one agent caret steers toward
|
|
37
|
+
* the review tool and allows to call it. */
|
|
38
|
+
export const PLANNING_AGENTS = ["plan"] as const;
|
|
39
|
+
|
|
40
|
+
export interface CaretDecision {
|
|
41
|
+
behavior: "allow" | "deny";
|
|
42
|
+
feedback?: string;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
// Pure helpers (exported for unit tests)
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
|
|
49
|
+
/** The first markdown heading in the plan, used as the review title — or
|
|
50
|
+
* undefined when the plan has no `# ` heading. */
|
|
51
|
+
export function planTitle(plan: string): string | undefined {
|
|
52
|
+
for (const line of plan.split("\n")) {
|
|
53
|
+
const m = line.match(/^#\s+(.+?)\s*$/);
|
|
54
|
+
if (m?.[1]) return m[1];
|
|
55
|
+
}
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** Build the caret review envelope `caret review` (CARET_AGENT=opencode) parses.
|
|
60
|
+
* Mirrors the snake_case session/cwd shape the opencode adapter's parseHookInput
|
|
61
|
+
* reads — both ends are caret-owned. */
|
|
62
|
+
export function buildEnvelope(
|
|
63
|
+
plan: string,
|
|
64
|
+
ctx: { sessionID?: string; directory?: string },
|
|
65
|
+
): string {
|
|
66
|
+
return JSON.stringify({
|
|
67
|
+
session_id: ctx.sessionID,
|
|
68
|
+
cwd: ctx.directory,
|
|
69
|
+
tool_input: { plan, title: planTitle(plan) },
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** Parse the single decision JSON line `caret review` prints on stdout. Fail-safe:
|
|
74
|
+
* anything unrecognized or unparseable becomes a deny — shipping an unreviewed
|
|
75
|
+
* plan is the one outcome caret never allows. */
|
|
76
|
+
export function parseDecision(stdout: string): CaretDecision {
|
|
77
|
+
const line =
|
|
78
|
+
stdout
|
|
79
|
+
.trim()
|
|
80
|
+
.split("\n")
|
|
81
|
+
.map((s) => s.trim())
|
|
82
|
+
.filter(Boolean)
|
|
83
|
+
.at(-1) ?? "";
|
|
84
|
+
try {
|
|
85
|
+
const d = JSON.parse(line) as { behavior?: unknown; feedback?: unknown };
|
|
86
|
+
if (d.behavior === "allow") return { behavior: "allow" };
|
|
87
|
+
if (d.behavior === "deny") {
|
|
88
|
+
return {
|
|
89
|
+
behavior: "deny",
|
|
90
|
+
feedback: typeof d.feedback === "string" ? d.feedback : "Plan changes requested.",
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
return failsafeDeny("caret: unrecognized review decision — denying to fail safe.");
|
|
94
|
+
} catch {
|
|
95
|
+
return failsafeDeny("caret: could not parse the review decision — denying to fail safe.");
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function failsafeDeny(feedback: string): CaretDecision {
|
|
100
|
+
return { behavior: "deny", feedback };
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** Only the configured planning agent(s) may call the review tool — the second
|
|
104
|
+
* line of defense against the subagent-bypass (the config hook is the first). */
|
|
105
|
+
export function isPlanningAgent(agent: string | undefined): boolean {
|
|
106
|
+
return agent !== undefined && (PLANNING_AGENTS as readonly string[]).includes(agent);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** Tool result returned to the agent on approval. */
|
|
110
|
+
export function approvedMessage(): string {
|
|
111
|
+
return "caret: the user APPROVED this plan. Proceed with the implementation as planned.";
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** Tool result returned to the agent on a change request: the reviewer feedback
|
|
115
|
+
* plus a line-numbered copy of the current plan so the agent can revise precisely
|
|
116
|
+
* and resubmit via the same tool. */
|
|
117
|
+
export function deniedMessage(feedback: string, plan: string): string {
|
|
118
|
+
const lines = plan.split("\n");
|
|
119
|
+
const numbered = lines.map((l, i) => `${i + 1}\t${l}`).join("\n");
|
|
120
|
+
return [
|
|
121
|
+
"caret: the user requested CHANGES to this plan.",
|
|
122
|
+
"",
|
|
123
|
+
"Feedback:",
|
|
124
|
+
feedback,
|
|
125
|
+
"",
|
|
126
|
+
`Revise the plan accordingly, then call \`${REVIEW_TOOL}\` again with the updated plan.`,
|
|
127
|
+
"",
|
|
128
|
+
`## Current plan (${lines.length} lines)`,
|
|
129
|
+
"",
|
|
130
|
+
"```",
|
|
131
|
+
numbered,
|
|
132
|
+
"```",
|
|
133
|
+
].join("\n");
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** The planning-prompt steer appended to the system array so the Plan agent
|
|
137
|
+
* submits its plan to caret instead of calling the native plan_exit. */
|
|
138
|
+
export function planningSteer(): string {
|
|
139
|
+
return [
|
|
140
|
+
"## Plan review (caret)",
|
|
141
|
+
"",
|
|
142
|
+
`When you have a plan ready for the user, do NOT call plan_exit. Instead call the \`${REVIEW_TOOL}\` tool with your full plan (markdown) as the \`plan\` argument.`,
|
|
143
|
+
"It opens caret's visual review UI in the browser; the user approves or requests changes. Any change request comes back as the tool result — revise the plan and call the tool again until it is approved.",
|
|
144
|
+
].join("\n");
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// --- config-hook mutation (subagent-bypass mitigation) -------------------------
|
|
148
|
+
|
|
149
|
+
type LooseAgent = { mode?: string; permission?: unknown } & Record<string, unknown>;
|
|
150
|
+
type LooseConfig = {
|
|
151
|
+
experimental?: { primary_tools?: string[] } & Record<string, unknown>;
|
|
152
|
+
agent?: Record<string, LooseAgent>;
|
|
153
|
+
} & Record<string, unknown>;
|
|
154
|
+
|
|
155
|
+
/** Mutate the OpenCode config in place to (1) mark the review tool primary-only so
|
|
156
|
+
* subagents cannot call it, and (2) allow it on the planning agent while denying it
|
|
157
|
+
* on the build agent. Idempotent and preservation-safe (existing primary_tools,
|
|
158
|
+
* agent modes, and other permissions are kept). */
|
|
159
|
+
export function applyCaretConfig(config: LooseConfig): void {
|
|
160
|
+
config.experimental ??= {};
|
|
161
|
+
const pt = Array.isArray(config.experimental.primary_tools)
|
|
162
|
+
? config.experimental.primary_tools
|
|
163
|
+
: [];
|
|
164
|
+
if (!pt.includes(REVIEW_TOOL)) config.experimental.primary_tools = [...pt, REVIEW_TOOL];
|
|
165
|
+
|
|
166
|
+
for (const name of PLANNING_AGENTS) setToolPermission(config, name, "allow");
|
|
167
|
+
// Deny on the build agent so a non-planning primary can't ship an unreviewed plan.
|
|
168
|
+
setToolPermission(config, "build", "deny");
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function ensureAgent(config: LooseConfig, name: string): LooseAgent {
|
|
172
|
+
config.agent ??= {};
|
|
173
|
+
config.agent[name] ??= {};
|
|
174
|
+
return config.agent[name];
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/** Return the agent's permission map, normalizing the two degenerate shapes
|
|
178
|
+
* OpenCode allows — a bare action string (preserved as a `"*"` catch-all) or an
|
|
179
|
+
* absent/non-object value — so the assignment below never corrupts it. */
|
|
180
|
+
function ensurePermission(agent: LooseAgent): Record<string, unknown> {
|
|
181
|
+
const p = agent.permission;
|
|
182
|
+
if (typeof p === "string") agent.permission = { "*": p };
|
|
183
|
+
else if (typeof p !== "object" || p === null) agent.permission = {};
|
|
184
|
+
return agent.permission as Record<string, unknown>;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function setToolPermission(config: LooseConfig, agentName: string, action: "allow" | "deny"): void {
|
|
188
|
+
ensurePermission(ensureAgent(config, agentName))[REVIEW_TOOL] = action;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// --- the spawn bridge ----------------------------------------------------------
|
|
192
|
+
|
|
193
|
+
/** Runs `caret review`, returning its captured stdout. Injected so execute() is
|
|
194
|
+
* unit-testable without spawning a real process. */
|
|
195
|
+
export type SpawnRunner = (
|
|
196
|
+
bin: string,
|
|
197
|
+
env: Record<string, string | undefined>,
|
|
198
|
+
stdin: string,
|
|
199
|
+
) => Promise<{ stdout: string; exitCode: number }>;
|
|
200
|
+
|
|
201
|
+
/** Spawn `caret review` with the review envelope on stdin and CARET_AGENT=opencode,
|
|
202
|
+
* then parse its decision line. Any spawn failure fails safe to a deny. */
|
|
203
|
+
export async function runReviewViaCaret(
|
|
204
|
+
envelope: string,
|
|
205
|
+
opts: { bin: string; run: SpawnRunner },
|
|
206
|
+
): Promise<CaretDecision> {
|
|
207
|
+
try {
|
|
208
|
+
const { stdout } = await opts.run(
|
|
209
|
+
opts.bin,
|
|
210
|
+
{ ...process.env, CARET_AGENT: "opencode" },
|
|
211
|
+
envelope,
|
|
212
|
+
);
|
|
213
|
+
return parseDecision(stdout);
|
|
214
|
+
} catch (e) {
|
|
215
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
216
|
+
return failsafeDeny(`caret: review failed to run (${message}) — denying to fail safe.`);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/** Production runner: spawn the caret binary's `review` subcommand. stderr is
|
|
221
|
+
* inherited so caret's "review this plan at <url>" line reaches the user. */
|
|
222
|
+
const nodeSpawnRunner: SpawnRunner = (bin, env, stdin) =>
|
|
223
|
+
new Promise((resolve, reject) => {
|
|
224
|
+
const child = spawn(bin, ["review"], { env, stdio: ["pipe", "pipe", "inherit"] });
|
|
225
|
+
let stdout = "";
|
|
226
|
+
child.stdout.on("data", (chunk) => {
|
|
227
|
+
stdout += chunk.toString();
|
|
228
|
+
});
|
|
229
|
+
child.on("error", reject);
|
|
230
|
+
child.on("close", (code) => resolve({ stdout, exitCode: code ?? 0 }));
|
|
231
|
+
child.stdin.write(stdin);
|
|
232
|
+
child.stdin.end();
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
// ---------------------------------------------------------------------------
|
|
236
|
+
// The plugin
|
|
237
|
+
// ---------------------------------------------------------------------------
|
|
238
|
+
|
|
239
|
+
/** Build the caret OpenCode plugin. The DI seam (bin/run) keeps the tool's
|
|
240
|
+
* execute() unit-testable; the default export wires the production runner. */
|
|
241
|
+
export function createCaretPlugin(opts: { bin?: string; run?: SpawnRunner } = {}): Plugin {
|
|
242
|
+
const bin = opts.bin ?? process.env.CARET_OPENCODE_BIN ?? CARET_BIN;
|
|
243
|
+
const run = opts.run ?? nodeSpawnRunner;
|
|
244
|
+
|
|
245
|
+
return async () => {
|
|
246
|
+
const hooks: Hooks = {
|
|
247
|
+
// Restrict the review tool to primary agents + allow/deny per agent.
|
|
248
|
+
config: async (config) => {
|
|
249
|
+
applyCaretConfig(config as unknown as LooseConfig);
|
|
250
|
+
},
|
|
251
|
+
// Steer the Plan agent to submit its plan to caret instead of plan_exit.
|
|
252
|
+
"experimental.chat.system.transform": async (_input, output) => {
|
|
253
|
+
output.system.push(planningSteer());
|
|
254
|
+
},
|
|
255
|
+
// Redirect the native plan_exit tool's description toward caret's tool.
|
|
256
|
+
"tool.definition": async (input, output) => {
|
|
257
|
+
if (input.toolID === "plan_exit") {
|
|
258
|
+
output.description = `Do not call this tool. Call ${REVIEW_TOOL} instead — it opens caret's visual plan-review UI for human approval.`;
|
|
259
|
+
}
|
|
260
|
+
},
|
|
261
|
+
tool: {
|
|
262
|
+
[REVIEW_TOOL]: tool({
|
|
263
|
+
description:
|
|
264
|
+
"Submit the current plan to caret for human review in a local browser UI. Blocks until the user approves or requests changes. On a change request, revise the plan and call this tool again with the updated plan.",
|
|
265
|
+
args: {
|
|
266
|
+
plan: tool.schema
|
|
267
|
+
.string()
|
|
268
|
+
.describe("The complete plan, as markdown, to present for human review."),
|
|
269
|
+
},
|
|
270
|
+
async execute(args, context) {
|
|
271
|
+
const agent = (context as { agent?: string }).agent;
|
|
272
|
+
if (!isPlanningAgent(agent)) {
|
|
273
|
+
return `${REVIEW_TOOL} is restricted to the plan agent (${PLANNING_AGENTS.join(", ")}); it was called by "${agent ?? "unknown"}". Continue without caret review, or switch to the plan agent and resubmit.`;
|
|
274
|
+
}
|
|
275
|
+
const envelope = buildEnvelope(args.plan, {
|
|
276
|
+
sessionID: context.sessionID,
|
|
277
|
+
directory: context.directory,
|
|
278
|
+
});
|
|
279
|
+
const decision = await runReviewViaCaret(envelope, { bin, run });
|
|
280
|
+
return decision.behavior === "allow"
|
|
281
|
+
? approvedMessage()
|
|
282
|
+
: deniedMessage(decision.feedback ?? "Plan changes requested.", args.plan);
|
|
283
|
+
},
|
|
284
|
+
}),
|
|
285
|
+
},
|
|
286
|
+
};
|
|
287
|
+
return hooks;
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/** The deployed plugin OpenCode auto-loads (bare default-export function). */
|
|
292
|
+
const CaretPlugin: Plugin = createCaretPlugin();
|
|
293
|
+
export default CaretPlugin;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Review caret's recent reviews and errors from its logs and help debug failures
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
caret persists every review and logs to its state dir. This command reviews the current
|
|
6
|
+
session — the plans sent for review and their outcomes — and surfaces recent errors so a
|
|
7
|
+
failure can be diagnosed. A failure usually first shows as a deny like "caret: … — denying
|
|
8
|
+
so no unreviewed plan ships."
|
|
9
|
+
|
|
10
|
+
## 1. Locate caret's state
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
dir="${XDG_STATE_HOME:-$HOME/.local/state}/caret"
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
- `reviews/<id>.json` — one JSON review record per file: `id`, `sessionId`, `cwd`,
|
|
17
|
+
`title`, `status` (`pending`/`rejected`/`approved`/`expired`), a `versions` array, and
|
|
18
|
+
(once resolved) a `decision`.
|
|
19
|
+
- `caret.log` / `daemon.log` — NDJSON, one object per line: `level` (pino numeric: 20
|
|
20
|
+
debug, 30 info, 40 warn, 50 error), `time`, `step`, `msg`, and on errors an `err` chain.
|
|
21
|
+
Feedback and plan bodies are never logged.
|
|
22
|
+
|
|
23
|
+
## 2. Session review
|
|
24
|
+
|
|
25
|
+
Reconstruct this session's reviews (newest session whose `cwd` matches the working
|
|
26
|
+
directory), grouped by status. Never select or echo `versions[].plan` or
|
|
27
|
+
`generalCommentDraft` — they hold full plan/draft bodies.
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
sid=$(jq -rs --arg cwd "$PWD" '[.[] | select(.cwd == $cwd)] | sort_by(.updatedAt) | last | .sessionId // empty' "$dir"/reviews/*.json)
|
|
31
|
+
jq -s --arg sid "$sid" '[.[] | select(.sessionId == $sid)] | sort_by(.createdAt) | .[] | {id, title, status, versions: (.versions | length), feedback: .decision.feedback}' "$dir"/reviews/*.json
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
If `$dir/reviews` is missing or empty the glob won't match — treat that as "no reviews
|
|
35
|
+
recorded", not a failure.
|
|
36
|
+
|
|
37
|
+
## 3. Recent errors
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
grep '^{' "$dir/caret.log" | jq -s '[.[] | select(.level >= 50)] | .[-5:]'
|
|
41
|
+
grep '^{' "$dir/daemon.log" | jq -s '[.[] | select(.level >= 50)] | .[-5:]'
|
|
42
|
+
tail -n 40 "$dir/daemon.log"
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
A "socket connection closed" on the hook side often has its real cause on the daemon side
|
|
46
|
+
— check both. If neither log has a record with `level >= 50`, report "caret has no errors
|
|
47
|
+
recorded".
|
|
48
|
+
|
|
49
|
+
## 4. Debug
|
|
50
|
+
|
|
51
|
+
If a failure is present, reason from the failing step, msg, cause, and stack to the likely
|
|
52
|
+
cause and propose a fix. Keep output diagnostic-focused; never fetch or echo plan content
|
|
53
|
+
into the conversation.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Demo caret by submitting a short fake plan to caret's review UI
|
|
3
|
+
agent: plan
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
This is a caret demo. Do **not** do any real work, research, or file edits — the only goal
|
|
7
|
+
is to exercise caret's plan-review flow.
|
|
8
|
+
|
|
9
|
+
Call the `caret_review_plan` tool with the following short, deliberately-fake plan as the
|
|
10
|
+
`plan` argument (verbatim):
|
|
11
|
+
|
|
12
|
+
```markdown
|
|
13
|
+
# Demo plan
|
|
14
|
+
|
|
15
|
+
## Context
|
|
16
|
+
Exercise caret's review flow end to end — nothing here is real work.
|
|
17
|
+
|
|
18
|
+
## Steps
|
|
19
|
+
1. Pretend to add a `GET /status` endpoint returning `{ ok: true }`.
|
|
20
|
+
2. Pretend to register it before the rate limiter.
|
|
21
|
+
3. Pretend to add a unit test asserting 200 and the JSON body.
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
caret opens the plan in a local browser UI for inline review. When the user approves or
|
|
25
|
+
requests changes, the decision returns as the tool result:
|
|
26
|
+
|
|
27
|
+
- **Approved** → acknowledge that caret approved the demo plan, and stop.
|
|
28
|
+
- **Changes requested** → revise the fake plan per the feedback and call
|
|
29
|
+
`caret_review_plan` again (caret captures it as a new version).
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Gather a redacted caret diagnostics snapshot ready to paste into a bug report
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
caret's `discovery` subcommand prints a one-shot, read-only snapshot of the local install
|
|
6
|
+
— running caret processes, daemon identity, lock/port state, effective settings, review
|
|
7
|
+
counts, the OpenCode adapter's install-state probe (plugin version, enabled state), log
|
|
8
|
+
sizes and error counts, and system basics. The report is **always redacted** (home paths
|
|
9
|
+
become `~`, foreign usernames censored) and never contains plan, prompt, or feedback
|
|
10
|
+
bodies — it exists to be shared.
|
|
11
|
+
|
|
12
|
+
First ask the user (briefly) which format they want:
|
|
13
|
+
|
|
14
|
+
- **JSON** — for pasting into a bug report or feeding to tooling.
|
|
15
|
+
- **Human-readable** — for scanning in the conversation.
|
|
16
|
+
|
|
17
|
+
Then run the matching invocation (the `CARET_AGENT=opencode` selector makes the install
|
|
18
|
+
probe read caret's OpenCode plugin state):
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
CARET_AGENT=opencode "__CARET_BIN__" discovery --json # JSON
|
|
22
|
+
CARET_AGENT=opencode "__CARET_BIN__" discovery # human-readable
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
End your output with the command's stdout **verbatim** in a fenced code block so the user
|
|
26
|
+
can copy it straight into a bug report. Add nothing inside the block and do not summarize
|
|
27
|
+
sections away — the report is already redacted and complete. A degraded section (e.g.
|
|
28
|
+
`daemon error: …`) is normal when the daemon is down; present it as-is.
|
|
29
|
+
|
|
30
|
+
If the command exits non-zero, present the exit code and stderr instead. If the binary is
|
|
31
|
+
missing (a checkout that was never built), say so and point at caret's install script.
|
package/package.json
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@macintacos/caret",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"description": "A Claude Code plugin that replaces the terminal plan-approval prompt with a local web UI for inline review, annotation, and approval.",
|
|
7
|
+
"homepage": "https://github.com/macintacos/caret",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/macintacos/caret.git"
|
|
11
|
+
},
|
|
12
|
+
"publishConfig": {
|
|
13
|
+
"access": "public"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist/",
|
|
17
|
+
"ui/dist/",
|
|
18
|
+
"bin/caret",
|
|
19
|
+
"hooks/",
|
|
20
|
+
"commands/",
|
|
21
|
+
"opencode/",
|
|
22
|
+
".claude-plugin/plugin.json"
|
|
23
|
+
],
|
|
24
|
+
"scripts": {
|
|
25
|
+
"test": "bun test --conditions browser",
|
|
26
|
+
"lint": "mise run lint",
|
|
27
|
+
"format": "mise run format",
|
|
28
|
+
"build": "mise run build"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@happy-dom/global-registrator": "^20.9.0",
|
|
32
|
+
"@opencode-ai/plugin": "^1.16.2",
|
|
33
|
+
"@playwright/test": "^1.60.0",
|
|
34
|
+
"@sveltejs/vite-plugin-svelte": "^7.1.2",
|
|
35
|
+
"@types/bun": "^1.3.14",
|
|
36
|
+
"@types/semver": "^7.7.1",
|
|
37
|
+
"happy-dom": "^20.9.0",
|
|
38
|
+
"listr2": "^10.2.1",
|
|
39
|
+
"pino-pretty": "^13.1.3",
|
|
40
|
+
"svelte": "^5.55.9",
|
|
41
|
+
"svelte-check": "^4.4.8",
|
|
42
|
+
"typescript": "^6.0.3",
|
|
43
|
+
"vite": "^8.0.14"
|
|
44
|
+
},
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"@codemirror/commands": "^6.10.3",
|
|
47
|
+
"@codemirror/lang-markdown": "^6.5.0",
|
|
48
|
+
"@codemirror/language": "^6.12.3",
|
|
49
|
+
"@codemirror/language-data": "^6.5.2",
|
|
50
|
+
"@codemirror/state": "^6.6.0",
|
|
51
|
+
"@codemirror/view": "^6.43.0",
|
|
52
|
+
"@commander-js/extra-typings": "^15.0.0",
|
|
53
|
+
"@lezer/highlight": "^1.2.3",
|
|
54
|
+
"@pierre/diffs": "1.2.7",
|
|
55
|
+
"commander": "^15.0.0",
|
|
56
|
+
"marked": "^18.0.4",
|
|
57
|
+
"pino": "^10.3.1",
|
|
58
|
+
"prettier": "3.8.3",
|
|
59
|
+
"semver": "^7.8.1",
|
|
60
|
+
"shiki": "^4.1.0",
|
|
61
|
+
"smol-toml": "1.6.1",
|
|
62
|
+
"xss": "^1.0.15",
|
|
63
|
+
"zod": "4.4.3"
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e=[Object.freeze(JSON.parse(`{"displayName":"ABAP","fileTypes":["abap","ABAP"],"foldingStartMarker":"/\\\\*\\\\*|\\\\{\\\\s*$","foldingStopMarker":"\\\\*\\\\*/|^\\\\s*}","name":"abap","patterns":[{"captures":{"1":{"name":"punctuation.definition.comment.abap"}},"match":"^\\\\*.*\\\\n?","name":"comment.line.full.abap"},{"captures":{"1":{"name":"punctuation.definition.comment.abap"}},"match":"\\".*\\\\n?","name":"comment.line.partial.abap"},{"match":"(?<!\\\\S)##.*?(?=([,.:\\\\s]))","name":"comment.line.pragma.abap"},{"match":"(?i)(?<=[-~\\\\s])(?<=[-=]>)([/_a-z][/-9_a-z]*)(?=\\\\s+(?:|[-*+/]|&&?)=\\\\s+)","name":"variable.other.abap"},{"match":"\\\\b[0-9]+(\\\\b|[,.])","name":"constant.numeric.abap"},{"match":"(?i)(^|\\\\s+)((P(?:UBLIC|RIVATE|ROTECTED))\\\\sSECTION)(?=\\\\s+|[.:])","name":"storage.modifier.class.abap"},{"begin":"(?<!\\\\\\\\)(\\\\|)(.*?)","beginCaptures":{"1":{"name":"constant.character.escape.abap"}},"end":"(?<!\\\\\\\\)(\\\\||(\\\\\\\\\\\\\\\\\\\\|))","endCaptures":{"1":{"name":"constant.character.escape.abap"}},"name":"string.interpolated.abap","patterns":[{"match":"(\\\\{ )|( })","name":"constant.character.escape"},{"match":"\\\\\\\\\\\\|","name":"constant.character.escape.abap"},{"match":"(?i)(?<=\\\\s)(align|alpha|case|country|currency|date|decimals|exponent|number|pad|sign|style|time|timestamp|timezone|width|xsd|zero)(?=\\\\s=)","name":"entity.name.property.stringtemplate.abap"},{"match":"(?i)(?<==\\\\s)(center|engineering|environment|in|iso|left|leftplus|leftspace|lower|no|out|raw|right|rightplus|rightspace|scale_preserving|scale_preserving_scientific|scientific|scientific_with_leading_zero|sign_as_postfix|simple|space|upper|user|yes)(?=\\\\s)","name":"entity.value.property.stringtemplate.abap"}]},{"begin":"'","end":"'","name":"string.quoted.single.abap","patterns":[{"match":"''","name":"constant.character.escape.abap"}]},{"begin":"\`","end":"\`","name":"string.quoted.single.abap","patterns":[{"match":"\`\`","name":"constant.character.escape.abap"}]},{"begin":"(?i)^\\\\s*(class)\\\\s([/_a-z][/-9_a-z]*)","beginCaptures":{"1":{"name":"storage.type.block.abap"},"2":{"name":"entity.name.type.block.abap"}},"end":"\\\\s*\\\\.\\\\s*\\\\n?","name":"meta.block.begin.implementation.abap","patterns":[{"match":"(?i)(^|\\\\s+)(definition|implementation|public|inheriting\\\\s+from|final|deferred|abstract|shared\\\\s+memory\\\\s+enabled|(global|local)*\\\\s*friends|(create\\\\s+(p(?:ublic|rotected|rivate)))|for\\\\s+behavior\\\\s+of|for\\\\s+testing|risk\\\\s+level\\\\s+(critical|dangerous|harmless))|duration\\\\s(short|medium|long)(?=\\\\s+|\\\\.)","name":"storage.modifier.class.abap"},{"begin":"(?=[A-Z_a-z][0-9A-Z_a-z]*)","contentName":"entity.name.type.block.abap","end":"(?![0-9A-Z_a-z])","patterns":[{"include":"#generic_names"}]}]},{"begin":"(?i)^\\\\s*(method)\\\\s(?:([/_a-z][/-9_a-z]*)~)?([/_a-z][/-9_a-z]*)","beginCaptures":{"1":{"name":"storage.type.block.abap"},"2":{"name":"entity.name.type.abap"},"3":{"name":"entity.name.function.abap"}},"end":"\\\\s*\\\\.\\\\s*\\\\n?","patterns":[{"match":"(?i)(?<=^|\\\\s)(BY(?:\\\\s+DATABASE(\\\\s+PROCEDURE|\\\\s+FUNCTION|\\\\s+GRAPH\\\\s+WORKSPACE)|\\\\s+KERNEL\\\\s+MODULE))(?=\\\\s+|\\\\.)","name":"storage.modifier.method.abap"},{"match":"(?i)(?<=^|\\\\s)(FOR\\\\s+(HDB|LLANG))(?=\\\\s+|\\\\.)","name":"storage.modifier.method.abap"},{"match":"(?i)(?<=\\\\s)(OPTIONS\\\\s+(READ-ONLY|DETERMINISTIC|SUPPRESS\\\\s+SYNTAX\\\\s+ERRORS))(?=\\\\s+|\\\\.)","name":"storage.modifier.method.abap"},{"match":"(?i)(?<=^|\\\\s)(LANGUAGE\\\\s+(SQLSCRIPT|SQL|GRAPH))(?=\\\\s+|\\\\.)","name":"storage.modifier.method.abap"},{"captures":{"1":{"name":"storage.modifier.method.abap"}},"match":"(?i)(?<=\\\\s)(USING)\\\\s+([/_a-z][/-9=>_a-z]*)+(?=\\\\s+|\\\\.)"},{"begin":"(?=[A-Z_a-z][0-9A-Z_a-z]*)","end":"(?![0-9A-Z_a-z])","patterns":[{"include":"#generic_names"}]}]},{"begin":"(?i)^\\\\s*(INTERFACE)\\\\s([/_a-z][/-9_a-z]*)","beginCaptures":{"1":{"name":"storage.type.block.abap"},"2":{"name":"entity.name.type.abap"}},"end":"\\\\s*\\\\.\\\\s*\\\\n?","patterns":[{"match":"(?i)(?<=^|\\\\s)(DEFERRED|PUBLIC)(?=\\\\s+|\\\\.)","name":"storage.modifier.method.abap"}]},{"begin":"(?i)^\\\\s*(FORM)\\\\s([/_a-z][-/-9?_a-z]*)","beginCaptures":{"1":{"name":"storage.type.block.abap"},"2":{"name":"entity.name.type.abap"}},"end":"\\\\s*\\\\.\\\\s*\\\\n?","patterns":[{"match":"(?i)(?<=^|\\\\s)(USING|TABLES|CHANGING|RAISING|IMPLEMENTATION|DEFINITION)(?=\\\\s+|\\\\.)","name":"storage.modifier.form.abap"},{"include":"#abaptypes"},{"include":"#keywords_followed_by_braces"}]},{"match":"(?i)(end(?:class|method|form|interface))","name":"storage.type.block.end.abap"},{"match":"(?i)(<[A-Z_a-z][0-9A-Z_a-z]*>)","name":"variable.other.field.symbol.abap"},{"include":"#keywords"},{"include":"#abap_constants"},{"include":"#reserved_names"},{"include":"#operators"},{"include":"#builtin_functions"},{"include":"#abaptypes"},{"include":"#system_fields"},{"include":"#sql_functions"},{"include":"#sql_types"}],"repository":{"abap_constants":{"match":"(?i)(?<=\\\\s)(initial|null|@?space|@?abap_true|@?abap_false|@?abap_undefined|table_line|%_final|%_hints|%_predefined|col_background|col_group|col_heading|col_key|col_negative|col_normal|col_positive|col_total|adabas|as400|db2|db6|hdb|oracle|sybase|mssqlnt|pos_low|pos_high)(?=[,.\\\\s])","name":"constant.language.abap"},"abaptypes":{"patterns":[{"match":"(?i)\\\\s(abap_bool|string|xstring|any|clike|csequence|numeric|xsequence|decfloat|decfloat16|decfloat34|utclong|simple|int8|[cdfinptx])(?=[,.\\\\s])","name":"support.type.abap"},{"match":"(?i)\\\\s(TYPE|REF|TO|LIKE|LINE|OF|STRUCTURE|STANDARD|SORTED|HASHED|INDEX|TABLE|WITH|UNIQUE|NON-UNIQUE|SECONDARY|DEFAULT|KEY)(?=[,.\\\\s])","name":"keyword.control.simple.abap"}]},"arithmetic_operator":{"match":"(?i)(?<=\\\\s)([-*+]|\\\\*\\\\*|[%/]|DIV|MOD|BIT-AND|BIT-OR|BIT-XOR|BIT-NOT)(?=\\\\s)","name":"keyword.control.simple.abap"},"builtin_functions":{"match":"(?i)(?<=\\\\s)(abs|sign|ceil|floor|trunc|frac|acos|asin|atan|cos|sin|tan|cosh|sinh|tanh|exp|log|log10|sqrt|strlen|xstrlen|charlen|lines|numofchar|dbmaxlen|round|rescale|nmax|nmin|cmax|cmin|boolc|boolx|xsdbool|contains|contains_any_of|contains_any_not_of|matches|line_exists|ipow|char_off|count|count_any_of|count_any_not_of|distance|condense|concat_lines_of|escape|find|find_end|find_any_of|find_any_not_of|insert|match|repeat|replace|reverse|segment|shift_left|shift_right|substring|substring_after|substring_from|substring_before|substring_to|to_upper|to_lower|to_mixed|from_mixed|translate|bit-set|line_index)(?=\\\\()","name":"entity.name.function.builtin.abap"},"comparison_operator":{"match":"(?i)(?<=\\\\s)([<>]|<=|>=|=|<>|eq|ne|lt|le|gt|ge|cs|cp|co|cn|ca|na|ns|np|byte-co|byte-cn|byte-ca|byte-na|byte-cs|byte-ns|[moz])(?=\\\\s)","name":"keyword.control.simple.abap"},"control_keywords":{"match":"(?i)(^|\\\\s)(at|case|catch|continue|do|elseif|else|endat|endcase|endcatch|enddo|endif|endloop|endon|endtry|endwhile|if|loop|on|raise|try|while)(?=[.:\\\\s])","name":"keyword.control.flow.abap"},"generic_names":{"match":"[A-Z_a-z][0-9A-Z_a-z]*"},"keywords":{"patterns":[{"include":"#main_keywords"},{"include":"#text_symbols"},{"include":"#control_keywords"},{"include":"#keywords_followed_by_braces"}]},"keywords_followed_by_braces":{"captures":{"1":{"name":"keyword.control.simple.abap"},"2":{"name":"variable.other.abap"}},"match":"(?i)\\\\b(data|value|field-symbol|final|reference|resumable)\\\\((<?[/_a-z][/-9_a-z]*>?)\\\\)"},"logical_operator":{"match":"(?i)(?<=\\\\s)(not|or|and)(?=\\\\s)","name":"keyword.control.simple.abap"},"main_keywords":{"match":"(?i)(?<=^|\\\\s)(abap-source|abstract|accept|accepting|access|according|action|activation|actual|add|add-corresponding|adjacent|after|alias|aliases|all|allocate|amdp|analysis|analyzer|append|appending|application|archive|area|arithmetic|as|ascending|assert|assign|assigned|assigning|association|asynchronous|at|attributes|authority|authority-check|authorization|auto|back|background|backward|badi|base|before|begin|behavior|between|binary|bit|blanks??|blocks??|bound|boundaries|bounds|boxed|break|break-point|buffer|by|bypassing|byte|byte-order|call|calling|cast|casting|cds|centered|change|changing|channels|char-to-hex|character|check|checkbox|cid|circular|class|class-data|class-events|class-methods??|class-pool|cleanup|clear|clients??|clock|clone|close|cnt|code|collect|color|column|comments??|commit|common|communication|comparing|components??|compression|compute|concatenate|cond|condense|condition|connection|constants??|contexts??|controls??|conv|conversion|convert|copy|corresponding|count|country|cover|create|currency|current|cursor|customer-function|data|database|datainfo|dataset|date|daylight|ddl|deallocate|decimals|declarations|deep|default|deferred|define|delete|deleting|demand|descending|describe|destination|detail|determine|dialog|did|directory|discarding|display|display-mode|distance|distinct|divide|divide-corresponding|dummy|duplicates??|duration|during|dynpro|edit|editor-call|empty|enabled|enabling|encoding|end|end-enhancement-section|end-of-definition|end-of-page|end-of-selection|end-test-injection|end-test-seam|endenhancement|endexec|endfunction|endian|ending|endmodule|endprovide|endselect|endwith|enhancement|enhancement-point|enhancement-section|enhancements|entities|entity|entries|entry|enum|equiv|errors|escape|escaping|events??|exact|except|exception|exception-table|exceptions|excluding|exec|execute|exists|exit|exit-command|expanding|explicit|exponent|export|exporting|extended|extension|extract|fail|failed|features|fetch|field|field-groups|field-symbols|fields|file|fill|filters??|final|find|first|first-line|fixed-point|flush|following|for|format|forward|found|frames??|free|from|full|function|function-pool|generate|get|giving|graph|groups??|handler??|hashed|having|headers??|heading|help-id|help-request|hide|hint|hold|hotspot|icon|id|identification|identifier|ignore|ignoring|immediately|implemented|implicit|import|importing|in|inactive|incl|includes??|including|increment|index|index-line|indicators|infotypes|inheriting|init|initial|initialization|inner|input|insert|instances??|intensified|interface|interface-pool|interfaces|internal|intervals|into|inverse|inverted-date|is|job|join|keep|keeping|kernel|keys??|keywords|kind|language|last|late|layout|leading|leave|left|left-justified|legacy|length|let|levels??|like|line|line-count|line-selection|line-size|linefeed|lines|link|list|list-processing|listbox|load|load-of-program|locale??|locks??|log-point|logical|lower|mapped|mapping|margin|mark|mask|match|matchcode|maximum|members|memory|mesh|message|message-id|messages|messaging|methods??|mode|modif|modifier|modify|module|move|move-corresponding|multiply|multiply-corresponding|name|nametab|native|nested|nesting|new|new-line|new-page|new-section|next|no-display|no-extension|no-gaps??|no-grouping|no-heading|no-scrolling|no-sign|no-title|no-zero|nodes|non-unicode|non-unique|number|objects??|objmgr|obligatory|occurences??|occurrences??|occurs|of|offset|on|only|open|optional|options??|order|others|out|outer|output|output-length|overflow|overlay|pack|package|padding|page|parameter|parameter-table|parameters|part|partially|pcre|perform|performing|permissions|pf-status|places|pool|position|pragmas|preceding|precompiled|preferred|preserving|primary|print|print-control|private|privileged|procedure|process|program|property|protected|provide|push|pushbutton|put|query|queue-only|queueonly|quickinfo|radiobutton|raising|ranges??|read|read-only|received??|receiving|redefinition|reduce|ref|reference|refresh|regex|reject|renaming|replace|replacement|replacing|report|reported|request|requested|required|reserve|reset|resolution|respecting|response|restore|results??|resumable|resume|retry|return|returning|right|right-justified|rollback|rows|rp-provide-from-last|run|sap|sap-spool|save|saving|scan|screen|scroll|scroll-boundary|scrolling|search|seconds|section|select|select-options|selection|selection-screen|selection-sets??|selection-table|selections|send|separated??|session|set|shared|shift|shortdump|shortdump-id|sign|simple|simulation|single|size|skip|skipping|smart|some|sort|sortable|sorted|source|specified|split|spool|spots|sql|stable|stamp|standard|start-of-selection|starting|state|statements??|statics??|statusinfo|step|step-loop|stop|structures??|style|subkey|submatches|submit|subroutine|subscreen|substring|subtract|subtract-corresponding|suffix|sum|summary|supplied|supply|suppress|switch|symbol|syntax-check|syntax-trace|system-call|system-exceptions|tab|tabbed|tables??|tableview|tabstrip|target|tasks??|test|test-injection|test-seam|testing|text|textpool|then|throw|times??|title|titlebar|to|tokens|top-lines|top-of-page|trace-file|trace-table|trailing|transaction|transfer|transformation|translate|transporting|trmac|truncate|truncation|type|type-pools??|types|uline|unassign|unbounded|under|unicode|union|unique|unit|unix|unpack|until|unwind|up|update|upper|user|user-command|using|utf-8|uuid|valid|validate|value|value-request|values|vary|varying|version|via|visible|wait|when|where|windows??|with|with-heading|with-title|without|word|work|workspace|write|xml|zone)(?=[,.:\\\\s])","name":"keyword.control.simple.abap"},"operators":{"patterns":[{"include":"#other_operator"},{"include":"#arithmetic_operator"},{"include":"#comparison_operator"},{"include":"#logical_operator"}]},"other_operator":{"match":"(?<=\\\\s)(&&?|\\\\?=|\\\\+=|-=|/=|\\\\*=|&&=|&=)(?=\\\\s)","name":"keyword.control.simple.abap"},"reserved_names":{"match":"(?i)(?<=\\\\s)(me|super)(?=[,.\\\\s]|->)","name":"constant.language.abap"},"sql_functions":{"match":"(?i)(?<=\\\\s)(abap_system_timezone|abap_user_timezone|abs|add_days|add_months|allow_precision_loss|as_geo_json|avg|bintohex|cast|ceil|coalesce|concat_with_space|concat|corr_spearman|corr|count|currency_conversion|datn_add_days|datn_add_months|datn_days_between|dats_add_days|dats_add_months|dats_days_between|dats_from_datn|dats_is_valid|dats_tims_to_tstmp|dats_to_datn|dayname|days_between|dense_rank|division|div|extract_day|extract_hour|extract_minute|extract_month|extract_second|extract_year|first_value|floor|grouping|hextobin|initcap|instr|is_valid|lag|last_value|lead|left|length|like_regexpr|locate_regexpr_after|locate_regexpr|locate|lower|lpad|ltrim|max|median|min|mod|monthname|ntile|occurrences_regexpr|over|product|rank|replace_regexpr|replace|rigth|round|row_number|rpad|rtrim|stddev|string_agg|substring_regexpr|substring|sum|tims_from_timn|tims_is_valid|tims_to_timn|to_blob|to_clob|tstmp_add_seconds|tstmp_current_utctimestamp|tstmp_is_valid|tstmp_seconds_between|tstmp_to_dats|tstmp_to_dst|tstmp_to_tims|tstmpl_from_utcl|tstmpl_to_utcl|unit_conversion|upper|utcl_add_seconds|utcl_current|utcl_seconds_between|uuid|var|weekday)(?=\\\\()","name":"entity.name.function.sql.abap"},"sql_types":{"match":"(?i)(?<=\\\\s)(char|clnt|cuky|curr|datn|dats|dec|decfloat16|decfloat34|fltp|int1|int2|int4|int8|lang|numc|quan|raw|sstring|timn|tims|unit|utclong)(?=[()\\\\s])","name":"entity.name.type.sql.abap"},"system_fields":{"captures":{"1":{"name":"variable.language.abap"},"2":{"name":"variable.language.abap"}},"match":"(?i)\\\\b(sy)-(abcde|batch|binpt|calld|callr|colno|cpage|cprog|cucol|curow|datar|datlo|datum|dayst|dbcnt|dbnam|dbsysc|dyngr|dynnr|fdayw|fdpos|host|index|langu|ldbpg|lilli|linct|linno|linsz|lisel|listi|loopc|lsind|macol|mandt|marow|modno|msgid|msgli|msgno|msgty|msgv[1-4]|opsysc|pagno|pfkey|repid|saprl|scols|slset|spono|srows|staco|staro|stepl|subrc|sysid|tabix|tcode|tfill|timlo|title|tleng|tvar[0-9]|tzone|ucomm|uline|uname|uzeit|vline|wtitl|zonlo)(?=[.\\\\s])"},"text_symbols":{"captures":{"1":{"name":"keyword.control.simple.abap"},"2":{"name":"constant.numeric.abap"}},"match":"(?i)(?<=^|\\\\s)(text)-([0-9A-Z]{1,3})(?=[,.:\\\\s])"}},"scopeName":"source.abap"}`))];export{e as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e=[Object.freeze(JSON.parse(`{"displayName":"ActionScript","fileTypes":["as"],"name":"actionscript-3","patterns":[{"include":"#comments"},{"include":"#package"},{"include":"#class"},{"include":"#interface"},{"include":"#namespace_declaration"},{"include":"#import"},{"include":"#mxml"},{"include":"#strings"},{"include":"#regexp"},{"include":"#variable_declaration"},{"include":"#numbers"},{"include":"#primitive_types"},{"include":"#primitive_error_types"},{"include":"#dynamic_type"},{"include":"#primitive_functions"},{"include":"#language_constants"},{"include":"#language_variables"},{"include":"#guess_type"},{"include":"#guess_constant"},{"include":"#other_operators"},{"include":"#arithmetic_operators"},{"include":"#logical_operators"},{"include":"#array_access_operators"},{"include":"#vector_creation_operators"},{"include":"#control_keywords"},{"include":"#other_keywords"},{"include":"#use_namespace"},{"include":"#functions"}],"repository":{"arithmetic_operators":{"match":"([-%+/]|(?<!:)\\\\*)","name":"keyword.operator.actionscript.3"},"array_access_operators":{"match":"([]\\\\[])","name":"keyword.operator.actionscript.3"},"class":{"begin":"(^|\\\\s+|;)(\\\\b(dynamic|final|abstract)\\\\b\\\\s+)?(\\\\b(internal|public)\\\\b\\\\s+)?(\\\\b(dynamic|final|abstract)\\\\b\\\\s+)?(?=\\\\bclass\\\\b)","beginCaptures":{"3":{"name":"storage.modifier.actionscript.3"},"5":{"name":"storage.modifier.actionscript.3"},"7":{"name":"storage.modifier.actionscript.3"}},"end":"}","name":"meta.class.actionscript.3","patterns":[{"include":"#class_declaration"},{"include":"#declaration_code_block"},{"include":"#metadata"},{"include":"#method"},{"include":"#comments"},{"include":"#strings"},{"include":"#regexp"},{"include":"#numbers"},{"include":"#primitive_types"},{"include":"#primitive_error_types"},{"include":"#dynamic_type"},{"include":"#primitive_functions"},{"include":"#language_constants"},{"include":"#language_variables"},{"include":"#other_operators"},{"include":"#other_keywords"},{"include":"#use_namespace"},{"include":"#guess_type"},{"include":"#guess_constant"},{"include":"#arithmetic_operators"},{"include":"#array_access_operators"},{"include":"#vector_creation_operators"},{"include":"#variable_declaration"},{"include":"#object_literal"},{"include":"#conditional_compilation"}]},"class_declaration":{"begin":"\\\\b(class)\\\\b\\\\s+([$.0-9A-Z_a-z]+|\\\\*)","beginCaptures":{"1":{"name":"storage.type.class.actionscript.3"},"2":{"name":"entity.name.class.actionscript.3"}},"end":"\\\\{","name":"meta.class_declaration.actionscript.3","patterns":[{"include":"#extends"},{"include":"#implements"},{"include":"#comments"}]},"comments":{"patterns":[{"begin":"/\\\\*\\\\*(?!/)","end":"\\\\*/","name":"comment.block.documentation.actionscript.3","patterns":[{"match":"@(copy|default|eventType|example|exampleText|includeExample|inheritDoc|internal|param|private|return|see|since|throws)\\\\b","name":"keyword.other.documentation.actionscript.3.asdoc"}]},{"begin":"/\\\\*","end":"\\\\*/","name":"comment.block.actionscript.3"},{"match":"//.*","name":"comment.line.actionscript.3"}]},"conditional_compilation":{"captures":{"2":{"name":"constant.other.actionscript.3"},"3":{"name":"constant.other.actionscript.3"}},"match":"(^|\\\\s+|;)\\\\b(\\\\w+)\\\\b::\\\\b(\\\\w+)\\\\b","name":"meta.conditional.actionscript.3"},"control_keywords":{"match":"\\\\b(if|else|do|while|for|each|continue|return|switch|case|default|break|try|catch|finally|throw|with)\\\\b","name":"keyword.control.actionscript.3"},"declaration_code_block":{"begin":"\\\\{","end":"}","name":"meta.code_block.actionscript.3","patterns":[{"include":"#method"},{"include":"#variable_declaration"},{"include":"#comments"},{"include":"#strings"},{"include":"#regexp"},{"include":"#numbers"},{"include":"#primitive_types"},{"include":"#primitive_error_types"},{"include":"#dynamic_type"},{"include":"#primitive_functions"},{"include":"#language_constants"},{"include":"#language_variables"},{"include":"#guess_type"},{"include":"#guess_constant"},{"include":"#other_operators"},{"include":"#arithmetic_operators"},{"include":"#logical_operators"},{"include":"#array_access_operators"},{"include":"#vector_creation_operators"},{"include":"#control_keywords"},{"include":"#other_keywords"},{"include":"#use_namespace"},{"include":"#functions"},{"include":"#import"}]},"dynamic_type":{"captures":{"1":{"name":"support.type.actionscript.3"}},"match":"(?<=:)\\\\s*(\\\\*)"},"escapes":{"match":"\\\\\\\\(x\\\\h{2}|[012][0-7]{0,2}|3[0-6][0-7]|37[0-7]?|[4-7][0-7]?|.)","name":"constant.character.escape.actionscript.3"},"extends":{"captures":{"1":{"name":"keyword.other.actionscript.3"},"2":{"name":"entity.other.inherited-class.actionscript.3"},"3":{"name":"entity.other.inherited-class.actionscript.3"}},"match":"\\\\b(extends)\\\\b\\\\s+([$.0-9A-Z_a-z]+)\\\\s*(?:,\\\\s*([$.0-9A-Z_a-z]+))*\\\\s*","name":"meta.extends.actionscript.3"},"function_arguments":{"begin":"\\\\(","end":"\\\\)","name":"meta.function_arguments.actionscript.3","patterns":[{"include":"#parameters"},{"include":"#comments"}]},"functions":{"begin":"\\\\b(function)\\\\b(?:\\\\s+\\\\b([gs]et)\\\\b\\\\s+)?\\\\s*([$0-9A-Z_a-z]+\\\\b)?","beginCaptures":{"1":{"name":"storage.type.function.actionscript.3"},"2":{"name":"storage.modifier.actionscript.3"},"3":{"name":"entity.name.function.actionscript.3"}},"end":"($|;|(?=\\\\{))","name":"meta.function.actionscript.3","patterns":[{"include":"#function_arguments"},{"include":"#return_type"},{"include":"#comments"}]},"guess_constant":{"captures":{"1":{"name":"constant.other.actionscript.3"}},"match":"\\\\b([$A-Z][0-9A-Z_]+)\\\\b"},"guess_type":{"captures":{"1":{"name":"support.type.actionscript.3"}},"match":"\\\\b((?:[$0-9A-Z_a-z]+\\\\.)*[A-Z][0-9A-Z]*[a-z]+[$0-9A-Z_a-z]*)\\\\b"},"implements":{"captures":{"1":{"name":"keyword.other.actionscript.3"},"2":{"name":"entity.other.inherited-class.actionscript.3"},"3":{"name":"entity.other.inherited-class.actionscript.3"}},"match":"\\\\b(implements)\\\\b\\\\s+([$.0-9A-Z_a-z]+)\\\\s*(?:,\\\\s*([$.0-9A-Z_a-z]+))*\\\\s*","name":"meta.implements.actionscript.3"},"import":{"captures":{"2":{"name":"keyword.control.import.actionscript.3"},"3":{"name":"support.type.actionscript.3"}},"match":"(^|\\\\s+|;)\\\\b(import)\\\\b\\\\s+([$.0-9A-Z_a-z]+(?:\\\\.\\\\*)?)\\\\s*(?=;|$)","name":"meta.import.actionscript.3"},"interface":{"begin":"(^|\\\\s+|;)(\\\\b(internal|public)\\\\b\\\\s+)?(?=\\\\binterface\\\\b)","beginCaptures":{"3":{"name":"storage.modifier.actionscript.3"}},"end":"}","name":"meta.interface.actionscript.3","patterns":[{"include":"#interface_declaration"},{"include":"#metadata"},{"include":"#functions"},{"include":"#comments"}]},"interface_declaration":{"begin":"\\\\b(interface)\\\\b\\\\s+([$.0-9A-Z_a-z]+)","beginCaptures":{"1":{"name":"storage.type.interface.actionscript.3"},"2":{"name":"entity.name.class.actionscript.3"}},"end":"\\\\{","name":"meta.class_declaration.actionscript.3","patterns":[{"include":"#extends"},{"include":"#comments"}]},"language_constants":{"match":"\\\\b(true|false|null|Infinity|-Infinity|NaN|undefined)\\\\b","name":"constant.language.actionscript.3"},"language_variables":{"match":"\\\\b(super|this|arguments)\\\\b","name":"variable.language.actionscript.3"},"local_code_block":{"begin":"\\\\{","end":"}","name":"meta.code_block.actionscript.3","patterns":[{"include":"#local_code_block"},{"include":"#comments"},{"include":"#strings"},{"include":"#regexp"},{"include":"#variable_declaration"},{"include":"#numbers"},{"include":"#primitive_types"},{"include":"#primitive_error_types"},{"include":"#dynamic_type"},{"include":"#primitive_functions"},{"include":"#language_constants"},{"include":"#language_variables"},{"include":"#guess_type"},{"include":"#guess_constant"},{"include":"#other_operators"},{"include":"#arithmetic_operators"},{"include":"#logical_operators"},{"include":"#array_access_operators"},{"include":"#vector_creation_operators"},{"include":"#control_keywords"},{"include":"#other_keywords"},{"include":"#use_namespace"},{"include":"#functions"},{"include":"#import"}]},"logical_operators":{"match":"([!\\\\&<>?^|~])","name":"keyword.operator.actionscript.3"},"metadata":{"begin":"(?<=(?:^|[;{}]|\\\\*/)\\\\s*)\\\\[\\\\s*\\\\b([$A-Z_a-z][$0-9A-Z_a-z]+)\\\\b","beginCaptures":{"1":{"name":"keyword.other.actionscript.3"}},"end":"]","name":"meta.metadata_info.actionscript.3","patterns":[{"include":"#metadata_info"}]},"metadata_info":{"begin":"\\\\(","end":"\\\\)","patterns":[{"include":"#strings"},{"captures":{"1":{"name":"variable.parameter.actionscript.3"},"2":{"name":"keyword.operator.actionscript.3"}},"match":"(\\\\w+)\\\\s*(=)"}]},"method":{"begin":"(^|\\\\s+)((\\\\w+)\\\\s+)?((\\\\w+)\\\\s+)?((\\\\w+)\\\\s+)?((\\\\w+)\\\\s+)?(?=\\\\bfunction\\\\b)","beginCaptures":{"3":{"name":"storage.modifier.actionscript.3"},"5":{"name":"storage.modifier.actionscript.3"},"7":{"name":"storage.modifier.actionscript.3"},"8":{"name":"storage.modifier.actionscript.3"}},"end":"(?<=([;}]))","name":"meta.method.actionscript.3","patterns":[{"include":"#functions"},{"include":"#local_code_block"}]},"mxml":{"begin":"<!\\\\[CDATA\\\\[","end":"]]>","name":"meta.cdata.actionscript.3","patterns":[{"include":"#comments"},{"include":"#import"},{"include":"#metadata"},{"include":"#class"},{"include":"#namespace_declaration"},{"include":"#use_namespace"},{"include":"#class_declaration"},{"include":"#method"},{"include":"#comments"},{"include":"#strings"},{"include":"#regexp"},{"include":"#numbers"},{"include":"#primitive_types"},{"include":"#primitive_error_types"},{"include":"#dynamic_type"},{"include":"#primitive_functions"},{"include":"#language_constants"},{"include":"#language_variables"},{"include":"#other_keywords"},{"include":"#guess_type"},{"include":"#guess_constant"},{"include":"#other_operators"},{"include":"#arithmetic_operators"},{"include":"#array_access_operators"},{"include":"#vector_creation_operators"},{"include":"#variable_declaration"}]},"namespace_declaration":{"captures":{"2":{"name":"storage.modifier.actionscript.3"},"3":{"name":"storage.modifier.actionscript.3"}},"match":"((\\\\w+)\\\\s+)?(namespace)\\\\s+[$0-9A-Z_a-z]+","name":"meta.namespace_declaration.actionscript.3"},"numbers":{"match":"\\\\b((0([Xx])\\\\h*)|(([0-9]+\\\\.?[0-9]*)|(\\\\.[0-9]+))(([Ee])([-+])?[0-9]+)?)([Ll]|UL|ul|[FUfu])?\\\\b","name":"constant.numeric.actionscript.3"},"object_literal":{"begin":"\\\\{","end":"}","name":"meta.object_literal.actionscript.3","patterns":[{"include":"#object_literal"},{"include":"#comments"},{"include":"#strings"},{"include":"#regexp"},{"include":"#numbers"},{"include":"#primitive_types"},{"include":"#primitive_error_types"},{"include":"#dynamic_type"},{"include":"#primitive_functions"},{"include":"#language_constants"},{"include":"#language_variables"},{"include":"#guess_type"},{"include":"#guess_constant"},{"include":"#array_access_operators"},{"include":"#vector_creation_operators"},{"include":"#functions"}]},"other_keywords":{"match":"\\\\b(as|delete|in|instanceof|is|native|new|to|typeof)\\\\b","name":"keyword.other.actionscript.3"},"other_operators":{"match":"([.=])","name":"keyword.operator.actionscript.3"},"package":{"begin":"(^|\\\\s+)(package)\\\\b","beginCaptures":{"2":{"name":"keyword.other.actionscript.3"}},"end":"}","name":"meta.package.actionscript.3","patterns":[{"include":"#package_name"},{"include":"#variable_declaration"},{"include":"#method"},{"include":"#comments"},{"include":"#return_type"},{"include":"#import"},{"include":"#use_namespace"},{"include":"#strings"},{"include":"#numbers"},{"include":"#language_constants"},{"include":"#metadata"},{"include":"#class"},{"include":"#interface"},{"include":"#namespace_declaration"}]},"package_name":{"begin":"(?<=package)\\\\s+([._\\\\w]*)\\\\b","end":"\\\\{","name":"meta.package_name.actionscript.3"},"parameters":{"begin":"(\\\\.\\\\.\\\\.)?\\\\s*([$A-Z_a-z][$0-9A-Z_a-z]*)(?:\\\\s*(:)\\\\s*(?:([$A-Za-z][$0-9A-Z_a-z]+(?:\\\\.[$A-Za-z][$0-9A-Z_a-z]+)*)(?:\\\\.<([$A-Za-z][$0-9A-Z_a-z]+(?:\\\\.[$A-Za-z][$0-9A-Z_a-z]+)*)>)?|(\\\\*)))?(?:\\\\s*(=))?","beginCaptures":{"1":{"name":"keyword.operator.actionscript.3"},"2":{"name":"variable.parameter.actionscript.3"},"3":{"name":"keyword.operator.actionscript.3"},"4":{"name":"support.type.actionscript.3"},"5":{"name":"support.type.actionscript.3"},"6":{"name":"support.type.actionscript.3"},"7":{"name":"keyword.operator.actionscript.3"}},"end":",|(?=\\\\))","patterns":[{"include":"#strings"},{"include":"#numbers"},{"include":"#language_constants"},{"include":"#comments"},{"include":"#primitive_types"},{"include":"#primitive_error_types"},{"include":"#dynamic_type"},{"include":"#guess_type"},{"include":"#guess_constant"}]},"primitive_error_types":{"captures":{"1":{"name":"support.class.error.actionscript.3"}},"match":"\\\\b((Argument|Definition|Eval|Internal|Range|Reference|Security|Syntax|Type|URI|Verify)?Error)\\\\b"},"primitive_functions":{"captures":{"1":{"name":"support.function.actionscript.3"}},"match":"\\\\b(decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|escape|isFinite|isNaN|isXMLName|parseFloat|parseInt|trace|unescape)(?=\\\\s*\\\\()"},"primitive_types":{"captures":{"1":{"name":"support.class.builtin.actionscript.3"}},"match":"\\\\b(Array|Boolean|Class|Date|Function|int|JSON|Math|Namespace|Number|Object|QName|RegExp|String|uint|Vector|XML|XMLList|\\\\*(?<=a))\\\\b"},"regexp":{"begin":"(?<=[(,:=\\\\[]|^|return|&&|\\\\|\\\\||!)\\\\s*(/)(?![*+/?{}])","end":"$|(/)[gim]*","name":"string.regex.actionscript.3","patterns":[{"match":"\\\\\\\\.","name":"constant.character.escape.actionscript.3"},{"match":"\\\\[(\\\\\\\\]|[^]])*]","name":"constant.character.class.actionscript.3"}]},"return_type":{"captures":{"1":{"name":"keyword.operator.actionscript.3"},"2":{"name":"support.type.actionscript.3"},"3":{"name":"support.type.actionscript.3"},"4":{"name":"support.type.actionscript.3"}},"match":"(:)\\\\s*([$A-Za-z][$0-9A-Z_a-z]+(?:\\\\.[$A-Za-z][$0-9A-Z_a-z]+)*)(?:\\\\.<([$A-Za-z][$0-9A-Z_a-z]+(?:\\\\.[$A-Za-z][$0-9A-Z_a-z]+)*)>)?|(\\\\*)"},"strings":{"patterns":[{"begin":"@\\"","end":"\\"","name":"string.quoted.verbatim.actionscript.3"},{"begin":"\\"","end":"\\"","name":"string.quoted.double.actionscript.3","patterns":[{"include":"#escapes"}]},{"begin":"'","end":"'","name":"string.quoted.single.actionscript.3","patterns":[{"include":"#escapes"}]}]},"use_namespace":{"captures":{"2":{"name":"keyword.other.actionscript.3"},"3":{"name":"keyword.other.actionscript.3"},"4":{"name":"storage.modifier.actionscript.3"}},"match":"(^|\\\\s+|;)(use\\\\s+)?(namespace)\\\\s+(\\\\w+)\\\\s*(;|$)"},"variable_declaration":{"captures":{"2":{"name":"storage.modifier.actionscript.3"},"4":{"name":"storage.modifier.actionscript.3"},"6":{"name":"storage.modifier.actionscript.3"},"7":{"name":"storage.modifier.actionscript.3"},"8":{"name":"keyword.operator.actionscript.3"}},"match":"((static)\\\\s+)?((\\\\w+)\\\\s+)?((static)\\\\s+)?(const|var)\\\\s+[$0-9A-Z_a-z]+(?:\\\\s*(:))?","name":"meta.variable_declaration.actionscript.3"},"vector_creation_operators":{"match":"([<>])","name":"keyword.operator.actionscript.3"}},"scopeName":"source.actionscript.3"}`))];export{e as default};
|