vibe-splain 1.0.0
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/dist/commands/install.d.ts +1 -0
- package/dist/commands/install.js +78 -0
- package/dist/commands/serve.d.ts +1 -0
- package/dist/commands/serve.js +7 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +19 -0
- package/dist/mcp/server.d.ts +1 -0
- package/dist/mcp/server.js +72 -0
- package/dist/mcp/tools/get_file_context.d.ts +19 -0
- package/dist/mcp/tools/get_file_context.js +48 -0
- package/dist/mcp/tools/get_strategic_overview.d.ts +15 -0
- package/dist/mcp/tools/get_strategic_overview.js +45 -0
- package/dist/mcp/tools/get_wild_discoveries.d.ts +15 -0
- package/dist/mcp/tools/get_wild_discoveries.js +29 -0
- package/dist/mcp/tools/inspect_pillar.d.ts +19 -0
- package/dist/mcp/tools/inspect_pillar.js +37 -0
- package/dist/mcp/tools/mark_stale.d.ts +22 -0
- package/dist/mcp/tools/mark_stale.js +51 -0
- package/dist/mcp/tools/scan_project.d.ts +15 -0
- package/dist/mcp/tools/scan_project.js +66 -0
- package/dist/mcp/tools/write_decision_card.d.ts +57 -0
- package/dist/mcp/tools/write_decision_card.js +118 -0
- package/dist/ui/assets/abap-DsBKuouk.js +1 -0
- package/dist/ui/assets/actionscript-3-D_z4Izcz.js +1 -0
- package/dist/ui/assets/ada-727ZlQH0.js +1 -0
- package/dist/ui/assets/andromeeda-C3khCPGq.js +1 -0
- package/dist/ui/assets/angular-html-LfdN0zeE.js +1 -0
- package/dist/ui/assets/angular-ts-CKsD7JZE.js +1 -0
- package/dist/ui/assets/apache-Dn00JSTd.js +1 -0
- package/dist/ui/assets/apex-COJ4H7py.js +1 -0
- package/dist/ui/assets/apl-BBq3IX1j.js +1 -0
- package/dist/ui/assets/applescript-Bu5BbsvL.js +1 -0
- package/dist/ui/assets/ara-7O62HKoU.js +1 -0
- package/dist/ui/assets/arc-Bq1jVAKi.js +1 -0
- package/dist/ui/assets/architectureDiagram-3BPJPVTR-R4fhdlee.js +36 -0
- package/dist/ui/assets/asciidoc-BPT9niGB.js +1 -0
- package/dist/ui/assets/asm-Dhn9LcZ4.js +1 -0
- package/dist/ui/assets/astro-CqkE3fuf.js +1 -0
- package/dist/ui/assets/aurora-x-D-2ljcwZ.js +1 -0
- package/dist/ui/assets/awk-eg146-Ew.js +1 -0
- package/dist/ui/assets/ayu-dark-Cv9koXgw.js +1 -0
- package/dist/ui/assets/ballerina-Du268qiB.js +1 -0
- package/dist/ui/assets/bat-fje9CFhw.js +1 -0
- package/dist/ui/assets/beancount-BwXTMy5W.js +1 -0
- package/dist/ui/assets/berry-3xVqZejG.js +1 -0
- package/dist/ui/assets/bibtex-xW4inM5L.js +1 -0
- package/dist/ui/assets/bicep-DHo0CJ0O.js +1 -0
- package/dist/ui/assets/blade-a8OxSdnT.js +1 -0
- package/dist/ui/assets/blockDiagram-GPEHLZMM-5XkEXQwI.js +132 -0
- package/dist/ui/assets/bsl-Dgyn0ogV.js +1 -0
- package/dist/ui/assets/c-C3t2pwGQ.js +1 -0
- package/dist/ui/assets/c4Diagram-AAUBKEIU-CVMRi7xO.js +10 -0
- package/dist/ui/assets/cadence-DNquZEk8.js +1 -0
- package/dist/ui/assets/cairo--RitsXJZ.js +1 -0
- package/dist/ui/assets/catppuccin-frappe-CD_QflpE.js +1 -0
- package/dist/ui/assets/catppuccin-latte-DRW-0cLl.js +1 -0
- package/dist/ui/assets/catppuccin-macchiato-C-_shW-Y.js +1 -0
- package/dist/ui/assets/catppuccin-mocha-LGGdnPYs.js +1 -0
- package/dist/ui/assets/channel-DskATRfv.js +1 -0
- package/dist/ui/assets/chunk-2J33WTMH-CjoczKe2.js +1 -0
- package/dist/ui/assets/chunk-4BX2VUAB-zlxS7kMe.js +1 -0
- package/dist/ui/assets/chunk-55IACEB6-u-aLoWTA.js +1 -0
- package/dist/ui/assets/chunk-727SXJPM-CPXGcGn3.js +206 -0
- package/dist/ui/assets/chunk-AQP2D5EJ-DSRK_fjR.js +231 -0
- package/dist/ui/assets/chunk-FMBD7UC4-BhHjdiID.js +15 -0
- package/dist/ui/assets/chunk-ND2GUHAM-Dt_b_VFL.js +1 -0
- package/dist/ui/assets/chunk-QZHKN3VN-ljd83veX.js +1 -0
- package/dist/ui/assets/clarity-BHOwM8T6.js +1 -0
- package/dist/ui/assets/classDiagram-4FO5ZUOK-C45wsrAC.js +1 -0
- package/dist/ui/assets/classDiagram-v2-Q7XG4LA2-C45wsrAC.js +1 -0
- package/dist/ui/assets/clojure-DxSadP1t.js +1 -0
- package/dist/ui/assets/cmake-DbXoA79R.js +1 -0
- package/dist/ui/assets/cobol-PTqiYgYu.js +1 -0
- package/dist/ui/assets/codeowners-Bp6g37R7.js +1 -0
- package/dist/ui/assets/codeql-sacFqUAJ.js +1 -0
- package/dist/ui/assets/coffee-dyiR41kL.js +1 -0
- package/dist/ui/assets/common-lisp-C7gG9l05.js +1 -0
- package/dist/ui/assets/coq-Dsg_Bt_b.js +1 -0
- package/dist/ui/assets/cose-bilkent-S5V4N54A-B47jq-Qy.js +1 -0
- package/dist/ui/assets/cpp-BksuvNSY.js +1 -0
- package/dist/ui/assets/crystal-DtDmRg-F.js +1 -0
- package/dist/ui/assets/csharp-D9R-vmeu.js +1 -0
- package/dist/ui/assets/css-BPhBrDlE.js +1 -0
- package/dist/ui/assets/csv-B0qRVHPH.js +1 -0
- package/dist/ui/assets/cue-DtFQj3wx.js +1 -0
- package/dist/ui/assets/cypher-m2LEI-9-.js +1 -0
- package/dist/ui/assets/cytoscape.esm-CUqq0XTU.js +331 -0
- package/dist/ui/assets/d-BoXegm-a.js +1 -0
- package/dist/ui/assets/dagre-BM42HDAG-B8S6fvC9.js +4 -0
- package/dist/ui/assets/dark-plus-C3mMm8J8.js +1 -0
- package/dist/ui/assets/dart-B9wLZaAG.js +1 -0
- package/dist/ui/assets/dax-ClGRhx96.js +1 -0
- package/dist/ui/assets/defaultLocale-DX6XiGOO.js +1 -0
- package/dist/ui/assets/desktop-DEIpsLCJ.js +1 -0
- package/dist/ui/assets/diagram-2AECGRRQ-DdSf8QGx.js +43 -0
- package/dist/ui/assets/diagram-5GNKFQAL-DjNbvgIh.js +10 -0
- package/dist/ui/assets/diagram-KO2AKTUF-C_EbhXEU.js +3 -0
- package/dist/ui/assets/diagram-LMA3HP47-fkQGkC6F.js +24 -0
- package/dist/ui/assets/diagram-OG6HWLK6-ild2cowO.js +24 -0
- package/dist/ui/assets/diff-BgYniUM_.js +1 -0
- package/dist/ui/assets/docker-COcR7UxN.js +1 -0
- package/dist/ui/assets/dotenv-BjQB5zDj.js +1 -0
- package/dist/ui/assets/dracula-BzJJZx-M.js +1 -0
- package/dist/ui/assets/dracula-soft-BXkSAIEj.js +1 -0
- package/dist/ui/assets/dream-maker-C-nORZOA.js +1 -0
- package/dist/ui/assets/edge-D5gP-w-T.js +1 -0
- package/dist/ui/assets/elixir-CLiX3zqd.js +1 -0
- package/dist/ui/assets/elm-CmHSxxaM.js +1 -0
- package/dist/ui/assets/emacs-lisp-BX77sIaO.js +1 -0
- package/dist/ui/assets/erDiagram-TEJ5UH35-Cx3ooJxy.js +85 -0
- package/dist/ui/assets/erb-BYTLMnw6.js +1 -0
- package/dist/ui/assets/erlang-B-DoSBHF.js +1 -0
- package/dist/ui/assets/everforest-dark-BgDCqdQA.js +1 -0
- package/dist/ui/assets/everforest-light-C8M2exoo.js +1 -0
- package/dist/ui/assets/fennel-bCA53EVm.js +1 -0
- package/dist/ui/assets/fish-w-ucz2PV.js +1 -0
- package/dist/ui/assets/flowDiagram-I6XJVG4X-BijjyFdb.js +162 -0
- package/dist/ui/assets/fluent-Dayu4EKP.js +1 -0
- package/dist/ui/assets/fortran-fixed-form-TqA4NnZg.js +1 -0
- package/dist/ui/assets/fortran-free-form-DKXYxT9g.js +1 -0
- package/dist/ui/assets/fsharp-XplgxFYe.js +1 -0
- package/dist/ui/assets/ganttDiagram-6RSMTGT7-BYSSlI1j.js +292 -0
- package/dist/ui/assets/gdresource-BHYsBjWJ.js +1 -0
- package/dist/ui/assets/gdscript-DfxzS6Rs.js +1 -0
- package/dist/ui/assets/gdshader-SKMF96pI.js +1 -0
- package/dist/ui/assets/genie-ajMbGru0.js +1 -0
- package/dist/ui/assets/gherkin--30QC5Em.js +1 -0
- package/dist/ui/assets/git-commit-i4q6IMui.js +1 -0
- package/dist/ui/assets/git-rebase-B-v9cOL2.js +1 -0
- package/dist/ui/assets/gitGraphDiagram-PVQCEYII-BeQbA8KU.js +106 -0
- package/dist/ui/assets/github-dark-DHJKELXO.js +1 -0
- package/dist/ui/assets/github-dark-default-Cuk6v7N8.js +1 -0
- package/dist/ui/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
- package/dist/ui/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
- package/dist/ui/assets/github-light-DAi9KRSo.js +1 -0
- package/dist/ui/assets/github-light-default-D7oLnXFd.js +1 -0
- package/dist/ui/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
- package/dist/ui/assets/gleam-B430Bg39.js +1 -0
- package/dist/ui/assets/glimmer-js-D-cwc0-E.js +1 -0
- package/dist/ui/assets/glimmer-ts-pgjy16dm.js +1 -0
- package/dist/ui/assets/glsl-DBO2IWDn.js +1 -0
- package/dist/ui/assets/gnuplot-CM8KxXT1.js +1 -0
- package/dist/ui/assets/go-B1SYOhNW.js +1 -0
- package/dist/ui/assets/graph-BlwPajkw.js +1 -0
- package/dist/ui/assets/graphql-cDcHW_If.js +1 -0
- package/dist/ui/assets/groovy-DkBy-JyN.js +1 -0
- package/dist/ui/assets/hack-D1yCygmZ.js +1 -0
- package/dist/ui/assets/haml-B2EZWmdv.js +1 -0
- package/dist/ui/assets/handlebars-BQGss363.js +1 -0
- package/dist/ui/assets/haskell-BILxekzW.js +1 -0
- package/dist/ui/assets/haxe-C5wWYbrZ.js +1 -0
- package/dist/ui/assets/hcl-HzYwdGDm.js +1 -0
- package/dist/ui/assets/hjson-T-Tgc4AT.js +1 -0
- package/dist/ui/assets/hlsl-ifBTmRxC.js +1 -0
- package/dist/ui/assets/houston-DnULxvSX.js +1 -0
- package/dist/ui/assets/html-C2L_23MC.js +1 -0
- package/dist/ui/assets/html-derivative-CSfWNPLT.js +1 -0
- package/dist/ui/assets/http-FRrOvY1W.js +1 -0
- package/dist/ui/assets/hxml-TIA70rKU.js +1 -0
- package/dist/ui/assets/hy-BMj5Y0dO.js +1 -0
- package/dist/ui/assets/imba-bv_oIlVt.js +1 -0
- package/dist/ui/assets/index-DCM2k-QB.js +149 -0
- package/dist/ui/assets/index-DeSCjOUR.js +350 -0
- package/dist/ui/assets/index-Xf-qrRKj.css +1 -0
- package/dist/ui/assets/infoDiagram-5YYISTIA-C_uVe1ld.js +2 -0
- package/dist/ui/assets/ini-BjABl1g7.js +1 -0
- package/dist/ui/assets/init-Gi6I4Gst.js +1 -0
- package/dist/ui/assets/ishikawaDiagram-YF4QCWOH-hzDmyxpo.js +70 -0
- package/dist/ui/assets/java-xI-RfyKK.js +1 -0
- package/dist/ui/assets/javascript-ySlJ1b_l.js +1 -0
- package/dist/ui/assets/jinja-DGy0s7-h.js +1 -0
- package/dist/ui/assets/jison-BqZprYcd.js +1 -0
- package/dist/ui/assets/journeyDiagram-JHISSGLW-B7NJ1JZJ.js +139 -0
- package/dist/ui/assets/json-BQoSv7ci.js +1 -0
- package/dist/ui/assets/json5-w8dY5SsB.js +1 -0
- package/dist/ui/assets/jsonc-TU54ms6u.js +1 -0
- package/dist/ui/assets/jsonl-DREVFZK8.js +1 -0
- package/dist/ui/assets/jsonnet-BfivnA6A.js +1 -0
- package/dist/ui/assets/jssm-P4WzXJd0.js +1 -0
- package/dist/ui/assets/jsx-BAng5TT0.js +1 -0
- package/dist/ui/assets/julia-BBuGR-5E.js +1 -0
- package/dist/ui/assets/kanagawa-dragon-CkXjmgJE.js +1 -0
- package/dist/ui/assets/kanagawa-lotus-CfQXZHmo.js +1 -0
- package/dist/ui/assets/kanagawa-wave-DWedfzmr.js +1 -0
- package/dist/ui/assets/kanban-definition-UN3LZRKU-B6pVc1c6.js +89 -0
- package/dist/ui/assets/katex-C5jXJg4s.js +257 -0
- package/dist/ui/assets/kotlin-B5lbUyaz.js +1 -0
- package/dist/ui/assets/kusto-mebxcVVE.js +1 -0
- package/dist/ui/assets/laserwave-DUszq2jm.js +1 -0
- package/dist/ui/assets/latex-C-cWTeAZ.js +1 -0
- package/dist/ui/assets/layout-Boy8vhSP.js +1 -0
- package/dist/ui/assets/lean-XBlWyCtg.js +1 -0
- package/dist/ui/assets/less-BfCpw3nA.js +1 -0
- package/dist/ui/assets/light-plus-B7mTdjB0.js +1 -0
- package/dist/ui/assets/linear-B_KCGlU8.js +1 -0
- package/dist/ui/assets/liquid-D3W5UaiH.js +1 -0
- package/dist/ui/assets/log-Cc5clBb7.js +1 -0
- package/dist/ui/assets/logo-IuBKFhSY.js +1 -0
- package/dist/ui/assets/lua-CvWAzNxB.js +1 -0
- package/dist/ui/assets/luau-Du5NY7AG.js +1 -0
- package/dist/ui/assets/make-Bvotw-X0.js +1 -0
- package/dist/ui/assets/markdown-UIAJJxZW.js +1 -0
- package/dist/ui/assets/marko-z0MBrx5-.js +1 -0
- package/dist/ui/assets/material-theme-D5KoaKCx.js +1 -0
- package/dist/ui/assets/material-theme-darker-BfHTSMKl.js +1 -0
- package/dist/ui/assets/material-theme-lighter-B0m2ddpp.js +1 -0
- package/dist/ui/assets/material-theme-ocean-CyktbL80.js +1 -0
- package/dist/ui/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
- package/dist/ui/assets/matlab-D9-PGadD.js +1 -0
- package/dist/ui/assets/mdc-DB_EDNY_.js +1 -0
- package/dist/ui/assets/mdx-sdHcTMYB.js +1 -0
- package/dist/ui/assets/mermaid-Ci6OQyBP.js +1 -0
- package/dist/ui/assets/min-dark-CafNBF8u.js +1 -0
- package/dist/ui/assets/min-light-CTRr51gU.js +1 -0
- package/dist/ui/assets/mindmap-definition-RKZ34NQL-Dmpnosj8.js +96 -0
- package/dist/ui/assets/mipsasm-BC5c_5Pe.js +1 -0
- package/dist/ui/assets/mojo-Tz6hzZYG.js +1 -0
- package/dist/ui/assets/monokai-D4h5O-jR.js +1 -0
- package/dist/ui/assets/move-DB_GagMm.js +1 -0
- package/dist/ui/assets/narrat-DLbgOhZU.js +1 -0
- package/dist/ui/assets/nextflow-B0XVJmRM.js +1 -0
- package/dist/ui/assets/nginx-D_VnBJ67.js +1 -0
- package/dist/ui/assets/night-owl-C39BiMTA.js +1 -0
- package/dist/ui/assets/nim-ZlGxZxc3.js +1 -0
- package/dist/ui/assets/nix-shcSOmrb.js +1 -0
- package/dist/ui/assets/nord-Ddv68eIx.js +1 -0
- package/dist/ui/assets/nushell-D4Tzg5kh.js +1 -0
- package/dist/ui/assets/objective-c-Deuh7S70.js +1 -0
- package/dist/ui/assets/objective-cpp-BUEGK8hf.js +1 -0
- package/dist/ui/assets/ocaml-BNioltXt.js +1 -0
- package/dist/ui/assets/one-dark-pro-GBQ2dnAY.js +1 -0
- package/dist/ui/assets/one-light-PoHY5YXO.js +1 -0
- package/dist/ui/assets/ordinal-Cboi1Yqb.js +1 -0
- package/dist/ui/assets/pascal-JqZropPD.js +1 -0
- package/dist/ui/assets/perl-CHQXSrWU.js +1 -0
- package/dist/ui/assets/php-B5ebYQev.js +1 -0
- package/dist/ui/assets/pieDiagram-4H26LBE5-DWfhPrxk.js +30 -0
- package/dist/ui/assets/plastic-3e1v2bzS.js +1 -0
- package/dist/ui/assets/plsql-LKU2TuZ1.js +1 -0
- package/dist/ui/assets/po-BFLt1xDp.js +1 -0
- package/dist/ui/assets/poimandres-CS3Unz2-.js +1 -0
- package/dist/ui/assets/polar-DKykz6zU.js +1 -0
- package/dist/ui/assets/postcss-B3ZDOciz.js +1 -0
- package/dist/ui/assets/powerquery-CSHBycmS.js +1 -0
- package/dist/ui/assets/powershell-BIEUsx6d.js +1 -0
- package/dist/ui/assets/prisma-B48N-Iqd.js +1 -0
- package/dist/ui/assets/prolog-BY-TUvya.js +1 -0
- package/dist/ui/assets/proto-zocC4JxJ.js +1 -0
- package/dist/ui/assets/pug-CM9l7STV.js +1 -0
- package/dist/ui/assets/puppet-Cza_XSSt.js +1 -0
- package/dist/ui/assets/purescript-Bg-kzb6g.js +1 -0
- package/dist/ui/assets/python-DhUJRlN_.js +1 -0
- package/dist/ui/assets/qml-D8XfuvdV.js +1 -0
- package/dist/ui/assets/qmldir-C8lEn-DE.js +1 -0
- package/dist/ui/assets/qss-DhMKtDLN.js +1 -0
- package/dist/ui/assets/quadrantDiagram-W4KKPZXB-C9C_4UTm.js +7 -0
- package/dist/ui/assets/r-CwjWoCRV.js +1 -0
- package/dist/ui/assets/racket-CzouJOBO.js +1 -0
- package/dist/ui/assets/raku-B1bQXN8T.js +1 -0
- package/dist/ui/assets/razor-CNLDkMZG.js +1 -0
- package/dist/ui/assets/red-bN70gL4F.js +1 -0
- package/dist/ui/assets/reg-5LuOXUq_.js +1 -0
- package/dist/ui/assets/regexp-DWJ3fJO_.js +1 -0
- package/dist/ui/assets/rel-DJlmqQ1C.js +1 -0
- package/dist/ui/assets/requirementDiagram-4Y6WPE33-Rti8bvFJ.js +84 -0
- package/dist/ui/assets/riscv-QhoSD0DR.js +1 -0
- package/dist/ui/assets/rose-pine-CmCqftbK.js +1 -0
- package/dist/ui/assets/rose-pine-dawn-Ds-gbosJ.js +1 -0
- package/dist/ui/assets/rose-pine-moon-CjDtw9vr.js +1 -0
- package/dist/ui/assets/rst-4NLicBqY.js +1 -0
- package/dist/ui/assets/ruby-DeZ3UC14.js +1 -0
- package/dist/ui/assets/rust-Be6lgOlo.js +1 -0
- package/dist/ui/assets/sankeyDiagram-5OEKKPKP-DKJ1CJ1F.js +40 -0
- package/dist/ui/assets/sas-BmTFh92c.js +1 -0
- package/dist/ui/assets/sass-BJ4Li9vH.js +1 -0
- package/dist/ui/assets/scala-DQVVAn-B.js +1 -0
- package/dist/ui/assets/scheme-BJGe-b2p.js +1 -0
- package/dist/ui/assets/scss-C31hgJw-.js +1 -0
- package/dist/ui/assets/sdbl-BLhTXw86.js +1 -0
- package/dist/ui/assets/sequenceDiagram-3UESZ5HK-BCJdo3Yk.js +162 -0
- package/dist/ui/assets/shaderlab-B7qAK45m.js +1 -0
- package/dist/ui/assets/shellscript-atvbtKCR.js +1 -0
- package/dist/ui/assets/shellsession-C_rIy8kc.js +1 -0
- package/dist/ui/assets/slack-dark-BthQWCQV.js +1 -0
- package/dist/ui/assets/slack-ochin-DqwNpetd.js +1 -0
- package/dist/ui/assets/smalltalk-DkLiglaE.js +1 -0
- package/dist/ui/assets/snazzy-light-Bw305WKR.js +1 -0
- package/dist/ui/assets/solarized-dark-DXbdFlpD.js +1 -0
- package/dist/ui/assets/solarized-light-L9t79GZl.js +1 -0
- package/dist/ui/assets/solidity-C1w2a3ep.js +1 -0
- package/dist/ui/assets/soy-C-lX7w71.js +1 -0
- package/dist/ui/assets/sparql-bYkjHRlG.js +1 -0
- package/dist/ui/assets/splunk-Cf8iN4DR.js +1 -0
- package/dist/ui/assets/sql-COK4E0Yg.js +1 -0
- package/dist/ui/assets/ssh-config-BknIz3MU.js +1 -0
- package/dist/ui/assets/stata-DorPZHa4.js +1 -0
- package/dist/ui/assets/stateDiagram-AJRCARHV-BxlCyIOF.js +1 -0
- package/dist/ui/assets/stateDiagram-v2-BHNVJYJU-cIykpKBe.js +1 -0
- package/dist/ui/assets/stylus-BeQkCIfX.js +1 -0
- package/dist/ui/assets/svelte-MSaWC3Je.js +1 -0
- package/dist/ui/assets/swift-BSxZ-RaX.js +1 -0
- package/dist/ui/assets/synthwave-84-CbfX1IO0.js +1 -0
- package/dist/ui/assets/system-verilog-C7L56vO4.js +1 -0
- package/dist/ui/assets/systemd-CUnW07Te.js +1 -0
- package/dist/ui/assets/talonscript-C1XDQQGZ.js +1 -0
- package/dist/ui/assets/tasl-CQjiPCtT.js +1 -0
- package/dist/ui/assets/tcl-DQ1-QYvQ.js +1 -0
- package/dist/ui/assets/templ-dwX3ZSMB.js +1 -0
- package/dist/ui/assets/terraform-BbSNqyBO.js +1 -0
- package/dist/ui/assets/tex-rYs2v40G.js +1 -0
- package/dist/ui/assets/timeline-definition-PNZ67QCA-BBlZb3oG.js +120 -0
- package/dist/ui/assets/tokyo-night-DBQeEorK.js +1 -0
- package/dist/ui/assets/toml-CB2ApiWb.js +1 -0
- package/dist/ui/assets/ts-tags-CipyTH0X.js +1 -0
- package/dist/ui/assets/tsv-B_m7g4N7.js +1 -0
- package/dist/ui/assets/tsx-B6W0miNI.js +1 -0
- package/dist/ui/assets/turtle-BMR_PYu6.js +1 -0
- package/dist/ui/assets/twig-NC5TFiHP.js +1 -0
- package/dist/ui/assets/typescript-Dj6nwHGl.js +1 -0
- package/dist/ui/assets/typespec-BpWG_bgh.js +1 -0
- package/dist/ui/assets/typst-BVUVsWT6.js +1 -0
- package/dist/ui/assets/v-CAQ2eGtk.js +1 -0
- package/dist/ui/assets/vala-BFOHcciG.js +1 -0
- package/dist/ui/assets/vb-CdO5JTpU.js +1 -0
- package/dist/ui/assets/vennDiagram-CIIHVFJN-C-Nr9zGX.js +34 -0
- package/dist/ui/assets/verilog-CJaU5se_.js +1 -0
- package/dist/ui/assets/vesper-BEBZ7ncR.js +1 -0
- package/dist/ui/assets/vhdl-DYoNaHQp.js +1 -0
- package/dist/ui/assets/viml-m4uW47V2.js +1 -0
- package/dist/ui/assets/vitesse-black-Bkuqu6BP.js +1 -0
- package/dist/ui/assets/vitesse-dark-D0r3Knsf.js +1 -0
- package/dist/ui/assets/vitesse-light-CVO1_9PV.js +1 -0
- package/dist/ui/assets/vue-BuYVFjOK.js +1 -0
- package/dist/ui/assets/vue-html-xdeiXROB.js +1 -0
- package/dist/ui/assets/vyper-nyqBNV6O.js +1 -0
- package/dist/ui/assets/wardley-L42UT6IY-Bu2DsPJv.js +173 -0
- package/dist/ui/assets/wardleyDiagram-YWT4CUSO-Xlk_Tv4m.js +78 -0
- package/dist/ui/assets/wasm-C6j12Q_x.js +1 -0
- package/dist/ui/assets/wasm-CG6Dc4jp.js +1 -0
- package/dist/ui/assets/wenyan-7A4Fjokl.js +1 -0
- package/dist/ui/assets/wgsl-CB0Krxn9.js +1 -0
- package/dist/ui/assets/wikitext-DCE3LsBG.js +1 -0
- package/dist/ui/assets/wolfram-C3FkfJm5.js +1 -0
- package/dist/ui/assets/xml-e3z08dGr.js +1 -0
- package/dist/ui/assets/xsl-Dd0NUgwM.js +1 -0
- package/dist/ui/assets/xychartDiagram-2RQKCTM6-DF_rfRUs.js +7 -0
- package/dist/ui/assets/yaml-CVw76BM1.js +1 -0
- package/dist/ui/assets/zenscript-HnGAYVZD.js +1 -0
- package/dist/ui/assets/zig-BVz_zdnA.js +1 -0
- package/dist/ui/index.html +17 -0
- package/package.json +49 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function installCommand(): Promise<void>;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { readFile, writeFile } from 'fs/promises';
|
|
2
|
+
import { existsSync } from 'fs';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { homedir } from 'os';
|
|
5
|
+
function expandPath(p) {
|
|
6
|
+
if (p.startsWith('~')) {
|
|
7
|
+
return join(homedir(), p.slice(1));
|
|
8
|
+
}
|
|
9
|
+
if (p.startsWith('%APPDATA%')) {
|
|
10
|
+
const appData = process.env.APPDATA || join(homedir(), 'AppData', 'Roaming');
|
|
11
|
+
return join(appData, p.slice('%APPDATA%'.length));
|
|
12
|
+
}
|
|
13
|
+
return p;
|
|
14
|
+
}
|
|
15
|
+
const AGENT_CONFIGS = [
|
|
16
|
+
{ name: 'Claude Code', path: '~/.claude/claude_desktop_config.json', format: 'claude' },
|
|
17
|
+
{ name: 'Claude Code (Windows)', path: '%APPDATA%/Claude/claude_desktop_config.json', format: 'claude' },
|
|
18
|
+
{ name: 'Gemini CLI', path: '~/.gemini/settings.json', format: 'gemini' },
|
|
19
|
+
{ name: 'Cursor', path: '~/.cursor/mcp.json', format: 'cursor' },
|
|
20
|
+
{ name: 'Windsurf', path: '~/.codeium/windsurf/mcp_config.json', format: 'cursor' },
|
|
21
|
+
];
|
|
22
|
+
const MCP_ENTRY = {
|
|
23
|
+
command: 'npx',
|
|
24
|
+
args: ['-y', 'vibe-splain', 'serve'],
|
|
25
|
+
};
|
|
26
|
+
export async function installCommand() {
|
|
27
|
+
console.error('\n🔧 VIBE-SPLAIN Installer\n');
|
|
28
|
+
let patchedCount = 0;
|
|
29
|
+
for (const agent of AGENT_CONFIGS) {
|
|
30
|
+
const resolvedPath = expandPath(agent.path);
|
|
31
|
+
if (!existsSync(resolvedPath)) {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
console.error(` Found ${agent.name} config at ${resolvedPath}`);
|
|
35
|
+
try {
|
|
36
|
+
const raw = await readFile(resolvedPath, 'utf8');
|
|
37
|
+
let config;
|
|
38
|
+
try {
|
|
39
|
+
config = JSON.parse(raw);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
console.error(` ⚠ Could not parse JSON, skipping`);
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
// Check idempotency
|
|
46
|
+
if (config.mcpServers?.['vibe-splain']) {
|
|
47
|
+
console.error(` ✓ Already configured, skipping`);
|
|
48
|
+
patchedCount++;
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
// Patch config
|
|
52
|
+
if (!config.mcpServers) {
|
|
53
|
+
config.mcpServers = {};
|
|
54
|
+
}
|
|
55
|
+
config.mcpServers['vibe-splain'] = MCP_ENTRY;
|
|
56
|
+
await writeFile(resolvedPath, JSON.stringify(config, null, 2), 'utf8');
|
|
57
|
+
console.error(` ✅ Patched successfully`);
|
|
58
|
+
patchedCount++;
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
console.error(` ❌ Error patching: ${err}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (patchedCount === 0) {
|
|
65
|
+
console.error(`\n⚠️ No supported coding agent config found.`);
|
|
66
|
+
console.error(`Add this manually to your agent's MCP config:\n`);
|
|
67
|
+
console.error(JSON.stringify({
|
|
68
|
+
mcpServers: {
|
|
69
|
+
'vibe-splain': MCP_ENTRY
|
|
70
|
+
}
|
|
71
|
+
}, null, 2));
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
console.error(`\n✅ Patched ${patchedCount} agent config(s). Restart your coding agent to activate.\n`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function serveCommand(): Promise<void>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { startMCPServer } from '../mcp/server.js';
|
|
2
|
+
export async function serveCommand() {
|
|
3
|
+
console.error('[vibe-splain] Starting MCP server...');
|
|
4
|
+
await startMCPServer();
|
|
5
|
+
// Process stays alive — do NOT call process.exit() here
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=serve.js.map
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { installCommand } from './commands/install.js';
|
|
4
|
+
import { serveCommand } from './commands/serve.js';
|
|
5
|
+
const program = new Command();
|
|
6
|
+
program
|
|
7
|
+
.name('vibe-splain')
|
|
8
|
+
.description('Architectural dossier engine for vibe-coded projects')
|
|
9
|
+
.version('1.0.0');
|
|
10
|
+
program
|
|
11
|
+
.command('install')
|
|
12
|
+
.description('Patch coding agent MCP config files to register vibe-splain')
|
|
13
|
+
.action(installCommand);
|
|
14
|
+
program
|
|
15
|
+
.command('serve')
|
|
16
|
+
.description('Start the MCP server (called by the coding agent, not by you)')
|
|
17
|
+
.action(serveCommand);
|
|
18
|
+
program.parse();
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function startMCPServer(): Promise<void>;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
+
import { initParser } from '@vibe-splain/brain';
|
|
5
|
+
import { handleScanProject, scanProjectTool } from './tools/scan_project.js';
|
|
6
|
+
import { handleGetFileContext, getFileContextTool } from './tools/get_file_context.js';
|
|
7
|
+
import { handleWriteDecisionCard, writeDecisionCardTool } from './tools/write_decision_card.js';
|
|
8
|
+
import { handleGetStrategicOverview, getStrategicOverviewTool } from './tools/get_strategic_overview.js';
|
|
9
|
+
import { handleInspectPillar, inspectPillarTool } from './tools/inspect_pillar.js';
|
|
10
|
+
import { handleGetWildDiscoveries, getWildDiscoveriesTool } from './tools/get_wild_discoveries.js';
|
|
11
|
+
import { handleMarkStale, markStaleTool } from './tools/mark_stale.js';
|
|
12
|
+
// ⚠️ CRITICAL: Never use console.log() anywhere in this codebase.
|
|
13
|
+
// stdout is owned by the MCP SDK for protocol messages.
|
|
14
|
+
// Use console.error() for all diagnostic output.
|
|
15
|
+
const ALL_TOOLS = [
|
|
16
|
+
scanProjectTool,
|
|
17
|
+
getFileContextTool,
|
|
18
|
+
writeDecisionCardTool,
|
|
19
|
+
getStrategicOverviewTool,
|
|
20
|
+
inspectPillarTool,
|
|
21
|
+
getWildDiscoveriesTool,
|
|
22
|
+
markStaleTool,
|
|
23
|
+
];
|
|
24
|
+
const TOOL_HANDLERS = {
|
|
25
|
+
scan_project: handleScanProject,
|
|
26
|
+
get_file_context: handleGetFileContext,
|
|
27
|
+
write_decision_card: handleWriteDecisionCard,
|
|
28
|
+
get_strategic_overview: handleGetStrategicOverview,
|
|
29
|
+
inspect_pillar: handleInspectPillar,
|
|
30
|
+
get_wild_discoveries: handleGetWildDiscoveries,
|
|
31
|
+
mark_stale: handleMarkStale,
|
|
32
|
+
};
|
|
33
|
+
export async function startMCPServer() {
|
|
34
|
+
// Initialize Tree-Sitter WASM once at startup
|
|
35
|
+
await initParser();
|
|
36
|
+
console.error('[vibe-splain] Tree-Sitter parser initialized');
|
|
37
|
+
const server = new Server({ name: 'vibe-splain', version: '1.0.0' }, { capabilities: { tools: {} } });
|
|
38
|
+
// Register tool listing
|
|
39
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
40
|
+
tools: ALL_TOOLS,
|
|
41
|
+
}));
|
|
42
|
+
// Register tool execution
|
|
43
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
44
|
+
const { name, arguments: args } = request.params;
|
|
45
|
+
const handler = TOOL_HANDLERS[name];
|
|
46
|
+
if (!handler) {
|
|
47
|
+
return {
|
|
48
|
+
content: [{ type: 'text', text: `Unknown tool: ${name}` }],
|
|
49
|
+
isError: true,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
const result = await handler((args || {}));
|
|
54
|
+
return {
|
|
55
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
60
|
+
console.error(`[vibe-splain] Tool ${name} error:`, message);
|
|
61
|
+
return {
|
|
62
|
+
content: [{ type: 'text', text: `Error: ${message}` }],
|
|
63
|
+
isError: true,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
const transport = new StdioServerTransport();
|
|
68
|
+
await server.connect(transport);
|
|
69
|
+
console.error('[vibe-splain] MCP server running on stdio');
|
|
70
|
+
// Process stays alive — do NOT call process.exit() here
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare const getFileContextTool: {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
inputSchema: {
|
|
5
|
+
type: "object";
|
|
6
|
+
properties: {
|
|
7
|
+
projectRoot: {
|
|
8
|
+
type: string;
|
|
9
|
+
description: string;
|
|
10
|
+
};
|
|
11
|
+
filePath: {
|
|
12
|
+
type: string;
|
|
13
|
+
description: string;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
required: string[];
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
export declare function handleGetFileContext(args: Record<string, unknown>): Promise<unknown>;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { readFile } from 'fs/promises';
|
|
2
|
+
import { join, relative } from 'path';
|
|
3
|
+
import { readGraph } from '@vibe-splain/brain';
|
|
4
|
+
export const getFileContextTool = {
|
|
5
|
+
name: 'get_file_context',
|
|
6
|
+
description: 'Returns the full source code of a specific high-gravity file, its cognitive weight breakdown, and its import graph neighbors. Call this for each file you want to synthesize a Decision Card for. Use the source + neighbors to understand what the code does and WHY it was written that way.',
|
|
7
|
+
inputSchema: {
|
|
8
|
+
type: 'object',
|
|
9
|
+
properties: {
|
|
10
|
+
projectRoot: {
|
|
11
|
+
type: 'string',
|
|
12
|
+
description: 'Absolute path to the project root',
|
|
13
|
+
},
|
|
14
|
+
filePath: {
|
|
15
|
+
type: 'string',
|
|
16
|
+
description: 'Relative or absolute path to the file',
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
required: ['projectRoot', 'filePath'],
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
export async function handleGetFileContext(args) {
|
|
23
|
+
const projectRoot = args.projectRoot;
|
|
24
|
+
const filePath = args.filePath;
|
|
25
|
+
if (!projectRoot || !filePath)
|
|
26
|
+
throw new Error('projectRoot and filePath are required');
|
|
27
|
+
const fullPath = filePath.startsWith('/') ? filePath : join(projectRoot, filePath);
|
|
28
|
+
const relPath = relative(projectRoot, fullPath);
|
|
29
|
+
const source = await readFile(fullPath, 'utf8');
|
|
30
|
+
const graph = await readGraph(projectRoot);
|
|
31
|
+
// Find neighbors in import graph
|
|
32
|
+
const neighbors = [];
|
|
33
|
+
if (graph) {
|
|
34
|
+
for (const edge of graph.edges) {
|
|
35
|
+
if (edge.from === relPath)
|
|
36
|
+
neighbors.push(edge.to);
|
|
37
|
+
if (edge.to === relPath || edge.to.endsWith(relPath))
|
|
38
|
+
neighbors.push(edge.from);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
filePath: relPath,
|
|
43
|
+
source,
|
|
44
|
+
lineCount: source.split('\n').length,
|
|
45
|
+
neighbors: [...new Set(neighbors)],
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=get_file_context.js.map
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare const getStrategicOverviewTool: {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
inputSchema: {
|
|
5
|
+
type: "object";
|
|
6
|
+
properties: {
|
|
7
|
+
projectRoot: {
|
|
8
|
+
type: string;
|
|
9
|
+
description: string;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
required: string[];
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
export declare function handleGetStrategicOverview(args: Record<string, unknown>): Promise<unknown>;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { readDossier } from '@vibe-splain/brain';
|
|
2
|
+
export const getStrategicOverviewTool = {
|
|
3
|
+
name: 'get_strategic_overview',
|
|
4
|
+
description: 'Returns the current state of the dossier without evidence snippets (to save tokens). Use this to see what has already been analyzed and what is stale. Check stalePaths to know which files need re-analysis.',
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: 'object',
|
|
7
|
+
properties: {
|
|
8
|
+
projectRoot: {
|
|
9
|
+
type: 'string',
|
|
10
|
+
description: 'Absolute path to the project root',
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
required: ['projectRoot'],
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
export async function handleGetStrategicOverview(args) {
|
|
17
|
+
const projectRoot = args.projectRoot;
|
|
18
|
+
if (!projectRoot)
|
|
19
|
+
throw new Error('projectRoot is required');
|
|
20
|
+
const dossier = await readDossier(projectRoot);
|
|
21
|
+
if (!dossier) {
|
|
22
|
+
return { error: 'No dossier found. Run scan_project first.' };
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
version: dossier.version,
|
|
26
|
+
scannedAt: dossier.scannedAt,
|
|
27
|
+
projectRoot: dossier.projectRoot,
|
|
28
|
+
pillars: dossier.pillars.map(p => ({
|
|
29
|
+
name: p.name,
|
|
30
|
+
cardCount: p.cardCount,
|
|
31
|
+
decisions: p.decisions.map(d => ({
|
|
32
|
+
id: d.id,
|
|
33
|
+
title: d.title,
|
|
34
|
+
status: d.status,
|
|
35
|
+
pillar: d.pillar,
|
|
36
|
+
// Omit evidence snippets to save tokens
|
|
37
|
+
evidenceFileCount: d.evidence.length,
|
|
38
|
+
hasDiagram: !!d.diagram,
|
|
39
|
+
})),
|
|
40
|
+
})),
|
|
41
|
+
wildDiscoveriesCount: dossier.wildDiscoveries.length,
|
|
42
|
+
stalePaths: dossier.stalePaths,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=get_strategic_overview.js.map
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare const getWildDiscoveriesTool: {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
inputSchema: {
|
|
5
|
+
type: "object";
|
|
6
|
+
properties: {
|
|
7
|
+
projectRoot: {
|
|
8
|
+
type: string;
|
|
9
|
+
description: string;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
required: string[];
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
export declare function handleGetWildDiscoveries(args: Record<string, unknown>): Promise<unknown>;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { readDossier } from '@vibe-splain/brain';
|
|
2
|
+
export const getWildDiscoveriesTool = {
|
|
3
|
+
name: 'get_wild_discoveries',
|
|
4
|
+
description: 'Returns files with extremely high cognitive complexity (weight ≥ 25) that don\'t fit standard patterns. These are the most surprising and important parts of the codebase to understand.',
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: 'object',
|
|
7
|
+
properties: {
|
|
8
|
+
projectRoot: {
|
|
9
|
+
type: 'string',
|
|
10
|
+
description: 'Absolute path to the project root',
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
required: ['projectRoot'],
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
export async function handleGetWildDiscoveries(args) {
|
|
17
|
+
const projectRoot = args.projectRoot;
|
|
18
|
+
if (!projectRoot)
|
|
19
|
+
throw new Error('projectRoot is required');
|
|
20
|
+
const dossier = await readDossier(projectRoot);
|
|
21
|
+
if (!dossier) {
|
|
22
|
+
return { error: 'No dossier found. Run scan_project first.' };
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
wildDiscoveries: dossier.wildDiscoveries,
|
|
26
|
+
count: dossier.wildDiscoveries.length,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=get_wild_discoveries.js.map
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare const inspectPillarTool: {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
inputSchema: {
|
|
5
|
+
type: "object";
|
|
6
|
+
properties: {
|
|
7
|
+
projectRoot: {
|
|
8
|
+
type: string;
|
|
9
|
+
description: string;
|
|
10
|
+
};
|
|
11
|
+
pillarName: {
|
|
12
|
+
type: string;
|
|
13
|
+
description: string;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
required: string[];
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
export declare function handleInspectPillar(args: Record<string, unknown>): Promise<unknown>;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { readDossier } from '@vibe-splain/brain';
|
|
2
|
+
export const inspectPillarTool = {
|
|
3
|
+
name: 'inspect_pillar',
|
|
4
|
+
description: 'Returns all Decision Cards for a specific pillar including full evidence snippets. Use when you need deep detail on a specific area of the codebase.',
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: 'object',
|
|
7
|
+
properties: {
|
|
8
|
+
projectRoot: {
|
|
9
|
+
type: 'string',
|
|
10
|
+
description: 'Absolute path to the project root',
|
|
11
|
+
},
|
|
12
|
+
pillarName: {
|
|
13
|
+
type: 'string',
|
|
14
|
+
description: 'Name of the pillar to inspect',
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
required: ['projectRoot', 'pillarName'],
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
export async function handleInspectPillar(args) {
|
|
21
|
+
const projectRoot = args.projectRoot;
|
|
22
|
+
const pillarName = args.pillarName;
|
|
23
|
+
if (!projectRoot || !pillarName)
|
|
24
|
+
throw new Error('projectRoot and pillarName are required');
|
|
25
|
+
const dossier = await readDossier(projectRoot);
|
|
26
|
+
if (!dossier) {
|
|
27
|
+
return { error: 'No dossier found. Run scan_project first.' };
|
|
28
|
+
}
|
|
29
|
+
const pillar = dossier.pillars.find(p => p.name === pillarName);
|
|
30
|
+
if (!pillar) {
|
|
31
|
+
return {
|
|
32
|
+
error: `Pillar "${pillarName}" not found. Available pillars: ${dossier.pillars.map(p => p.name).join(', ')}`,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
return pillar;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=inspect_pillar.js.map
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export declare const markStaleTool: {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
inputSchema: {
|
|
5
|
+
type: "object";
|
|
6
|
+
properties: {
|
|
7
|
+
projectRoot: {
|
|
8
|
+
type: string;
|
|
9
|
+
description: string;
|
|
10
|
+
};
|
|
11
|
+
filePaths: {
|
|
12
|
+
type: string;
|
|
13
|
+
items: {
|
|
14
|
+
type: string;
|
|
15
|
+
};
|
|
16
|
+
description: string;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
required: string[];
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
export declare function handleMarkStale(args: Record<string, unknown>): Promise<unknown>;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { readDossier, writeDossier } from '@vibe-splain/brain';
|
|
2
|
+
export const markStaleTool = {
|
|
3
|
+
name: 'mark_stale',
|
|
4
|
+
description: 'Manually marks Decision Cards as stale when you detect a file has changed. The file watcher does this automatically, but call this if you modify a file yourself during a session.',
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: 'object',
|
|
7
|
+
properties: {
|
|
8
|
+
projectRoot: {
|
|
9
|
+
type: 'string',
|
|
10
|
+
description: 'Absolute path to the project root',
|
|
11
|
+
},
|
|
12
|
+
filePaths: {
|
|
13
|
+
type: 'array',
|
|
14
|
+
items: { type: 'string' },
|
|
15
|
+
description: 'Array of relative file paths to mark as stale',
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
required: ['projectRoot', 'filePaths'],
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
export async function handleMarkStale(args) {
|
|
22
|
+
const projectRoot = args.projectRoot;
|
|
23
|
+
const filePaths = args.filePaths;
|
|
24
|
+
if (!projectRoot || !filePaths)
|
|
25
|
+
throw new Error('projectRoot and filePaths are required');
|
|
26
|
+
const dossier = await readDossier(projectRoot);
|
|
27
|
+
if (!dossier) {
|
|
28
|
+
return { error: 'No dossier found. Run scan_project first.' };
|
|
29
|
+
}
|
|
30
|
+
let staleCount = 0;
|
|
31
|
+
for (const filePath of filePaths) {
|
|
32
|
+
for (const pillar of dossier.pillars) {
|
|
33
|
+
for (const card of pillar.decisions) {
|
|
34
|
+
if (card.evidence.some(e => e.file === filePath || filePath.endsWith(e.file))) {
|
|
35
|
+
card.status = 'stale';
|
|
36
|
+
staleCount++;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (!dossier.stalePaths.includes(filePath)) {
|
|
41
|
+
dossier.stalePaths.push(filePath);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
await writeDossier(projectRoot, dossier);
|
|
45
|
+
return {
|
|
46
|
+
success: true,
|
|
47
|
+
staleCardsMarked: staleCount,
|
|
48
|
+
totalStalePaths: dossier.stalePaths.length,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=mark_stale.js.map
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare const scanProjectTool: {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
inputSchema: {
|
|
5
|
+
type: "object";
|
|
6
|
+
properties: {
|
|
7
|
+
projectRoot: {
|
|
8
|
+
type: string;
|
|
9
|
+
description: string;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
required: string[];
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
export declare function handleScanProject(args: Record<string, unknown>): Promise<unknown>;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { scanProject, writeDossier, readDossier, startWatcher } from '@vibe-splain/brain';
|
|
2
|
+
export const scanProjectTool = {
|
|
3
|
+
name: 'scan_project',
|
|
4
|
+
description: 'Scans a codebase and returns its structural analysis. CALL THIS FIRST before any other tool. Returns High-Gravity files grouped by pillar, plus wildCandidates for unusual high-complexity files. After calling this tool, call get_file_context for each file in highGravityFiles, synthesize a narrative explaining WHY that code exists, then call write_decision_card to persist it. The uiUrl in the response is a file:// link — share it with the user so they can open the Dossier UI in their browser.',
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: 'object',
|
|
7
|
+
properties: {
|
|
8
|
+
projectRoot: {
|
|
9
|
+
type: 'string',
|
|
10
|
+
description: 'Absolute path to the project root directory to scan',
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
required: ['projectRoot'],
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
export async function handleScanProject(args) {
|
|
17
|
+
const projectRoot = args.projectRoot;
|
|
18
|
+
if (!projectRoot)
|
|
19
|
+
throw new Error('projectRoot is required');
|
|
20
|
+
console.error(`[vibe-splain] Scanning project: ${projectRoot}`);
|
|
21
|
+
const result = await scanProject(projectRoot);
|
|
22
|
+
// Create initial dossier structure
|
|
23
|
+
const existingDossier = await readDossier(projectRoot);
|
|
24
|
+
const dossier = existingDossier || {
|
|
25
|
+
version: '1.0.0',
|
|
26
|
+
scannedAt: new Date().toISOString(),
|
|
27
|
+
projectRoot,
|
|
28
|
+
pillars: [],
|
|
29
|
+
wildDiscoveries: [],
|
|
30
|
+
stalePaths: [],
|
|
31
|
+
};
|
|
32
|
+
// Update scan timestamp
|
|
33
|
+
dossier.scannedAt = new Date().toISOString();
|
|
34
|
+
// Create pillar entries from scan results
|
|
35
|
+
for (const group of result.pillarGroups) {
|
|
36
|
+
const existingPillar = dossier.pillars.find(p => p.name === group.name);
|
|
37
|
+
if (!existingPillar) {
|
|
38
|
+
dossier.pillars.push({ name: group.name, cardCount: 0, decisions: [] });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
await writeDossier(projectRoot, dossier);
|
|
42
|
+
// Start file watcher on high-gravity files
|
|
43
|
+
const watchPaths = result.highGravityFiles.map(f => f.path);
|
|
44
|
+
startWatcher(projectRoot, watchPaths);
|
|
45
|
+
console.error(`[vibe-splain] Scan complete. ${result.totalFilesScanned} files scanned, ${result.highGravityFiles.length} high-gravity files found.`);
|
|
46
|
+
return {
|
|
47
|
+
projectRoot: result.projectRoot,
|
|
48
|
+
totalFilesScanned: result.totalFilesScanned,
|
|
49
|
+
highGravityFiles: result.highGravityFiles.map(f => ({
|
|
50
|
+
relativePath: f.relativePath,
|
|
51
|
+
cognitiveWeight: f.cognitiveWeight,
|
|
52
|
+
pillars: f.pillars,
|
|
53
|
+
})),
|
|
54
|
+
pillarGroups: result.pillarGroups.map(g => ({
|
|
55
|
+
name: g.name,
|
|
56
|
+
fileCount: g.files.length,
|
|
57
|
+
files: g.files.map(f => f.relativePath),
|
|
58
|
+
})),
|
|
59
|
+
wildCandidates: result.wildCandidates.map(f => ({
|
|
60
|
+
relativePath: f.relativePath,
|
|
61
|
+
cognitiveWeight: f.cognitiveWeight,
|
|
62
|
+
})),
|
|
63
|
+
uiUrl: result.uiUrl,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=scan_project.js.map
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export declare const writeDecisionCardTool: {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
inputSchema: {
|
|
5
|
+
type: "object";
|
|
6
|
+
properties: {
|
|
7
|
+
projectRoot: {
|
|
8
|
+
type: string;
|
|
9
|
+
description: string;
|
|
10
|
+
};
|
|
11
|
+
pillar: {
|
|
12
|
+
type: string;
|
|
13
|
+
description: string;
|
|
14
|
+
};
|
|
15
|
+
title: {
|
|
16
|
+
type: string;
|
|
17
|
+
description: string;
|
|
18
|
+
};
|
|
19
|
+
narrative: {
|
|
20
|
+
type: string;
|
|
21
|
+
description: string;
|
|
22
|
+
};
|
|
23
|
+
evidence: {
|
|
24
|
+
type: string;
|
|
25
|
+
items: {
|
|
26
|
+
type: string;
|
|
27
|
+
properties: {
|
|
28
|
+
file: {
|
|
29
|
+
type: string;
|
|
30
|
+
description: string;
|
|
31
|
+
};
|
|
32
|
+
startLine: {
|
|
33
|
+
type: string;
|
|
34
|
+
description: string;
|
|
35
|
+
};
|
|
36
|
+
endLine: {
|
|
37
|
+
type: string;
|
|
38
|
+
description: string;
|
|
39
|
+
};
|
|
40
|
+
snippet: {
|
|
41
|
+
type: string;
|
|
42
|
+
description: string;
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
required: string[];
|
|
46
|
+
};
|
|
47
|
+
description: string;
|
|
48
|
+
};
|
|
49
|
+
diagram: {
|
|
50
|
+
type: string;
|
|
51
|
+
description: string;
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
required: string[];
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
export declare function handleWriteDecisionCard(args: Record<string, unknown>): Promise<unknown>;
|