sidebar-md 0.1.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/LICENSE +21 -0
- package/README.md +205 -0
- package/dist/server/annotation-ops.d.ts +104 -0
- package/dist/server/annotation-ops.js +166 -0
- package/dist/server/annotation-ops.js.map +1 -0
- package/dist/server/args.d.ts +20 -0
- package/dist/server/args.js +118 -0
- package/dist/server/args.js.map +1 -0
- package/dist/server/author.d.ts +1 -0
- package/dist/server/author.js +45 -0
- package/dist/server/author.js.map +1 -0
- package/dist/server/cli.d.ts +2 -0
- package/dist/server/cli.js +364 -0
- package/dist/server/cli.js.map +1 -0
- package/dist/server/config/gitignore.d.ts +10 -0
- package/dist/server/config/gitignore.js +53 -0
- package/dist/server/config/gitignore.js.map +1 -0
- package/dist/server/config/index.d.ts +5 -0
- package/dist/server/config/index.js +5 -0
- package/dist/server/config/index.js.map +1 -0
- package/dist/server/config/load.d.ts +21 -0
- package/dist/server/config/load.js +106 -0
- package/dist/server/config/load.js.map +1 -0
- package/dist/server/config/paths.d.ts +9 -0
- package/dist/server/config/paths.js +26 -0
- package/dist/server/config/paths.js.map +1 -0
- package/dist/server/config/schema.d.ts +26 -0
- package/dist/server/config/schema.js +56 -0
- package/dist/server/config/schema.js.map +1 -0
- package/dist/server/config/write.d.ts +29 -0
- package/dist/server/config/write.js +74 -0
- package/dist/server/config/write.js.map +1 -0
- package/dist/server/connection-file.d.ts +22 -0
- package/dist/server/connection-file.js +72 -0
- package/dist/server/connection-file.js.map +1 -0
- package/dist/server/dirty-buffer.d.ts +7 -0
- package/dist/server/dirty-buffer.js +39 -0
- package/dist/server/dirty-buffer.js.map +1 -0
- package/dist/server/files.d.ts +19 -0
- package/dist/server/files.js +112 -0
- package/dist/server/files.js.map +1 -0
- package/dist/server/hash.d.ts +1 -0
- package/dist/server/hash.js +7 -0
- package/dist/server/hash.js.map +1 -0
- package/dist/server/init.d.ts +16 -0
- package/dist/server/init.js +53 -0
- package/dist/server/init.js.map +1 -0
- package/dist/server/log.d.ts +8 -0
- package/dist/server/log.js +19 -0
- package/dist/server/log.js.map +1 -0
- package/dist/server/marker-ids.d.ts +3 -0
- package/dist/server/marker-ids.js +31 -0
- package/dist/server/marker-ids.js.map +1 -0
- package/dist/server/mcp-server.d.ts +22 -0
- package/dist/server/mcp-server.js +469 -0
- package/dist/server/mcp-server.js.map +1 -0
- package/dist/server/mention-ops.d.ts +115 -0
- package/dist/server/mention-ops.js +202 -0
- package/dist/server/mention-ops.js.map +1 -0
- package/dist/server/mention-store.d.ts +123 -0
- package/dist/server/mention-store.js +91 -0
- package/dist/server/mention-store.js.map +1 -0
- package/dist/server/runtime-check.d.ts +1 -0
- package/dist/server/runtime-check.js +10 -0
- package/dist/server/runtime-check.js.map +1 -0
- package/dist/server/server.d.ts +28 -0
- package/dist/server/server.js +736 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/stdio.d.ts +18 -0
- package/dist/server/stdio.js +144 -0
- package/dist/server/stdio.js.map +1 -0
- package/dist/server/verbs/builtin.d.ts +16 -0
- package/dist/server/verbs/builtin.js +27 -0
- package/dist/server/verbs/builtin.js.map +1 -0
- package/dist/server/verbs/index.d.ts +2 -0
- package/dist/server/verbs/index.js +3 -0
- package/dist/server/verbs/index.js.map +1 -0
- package/dist/server/verbs/load.d.ts +7 -0
- package/dist/server/verbs/load.js +24 -0
- package/dist/server/verbs/load.js.map +1 -0
- package/dist/server/workspace.d.ts +19 -0
- package/dist/server/workspace.js +138 -0
- package/dist/server/workspace.js.map +1 -0
- package/dist/shared/backoff.d.ts +1 -0
- package/dist/shared/backoff.js +12 -0
- package/dist/shared/backoff.js.map +1 -0
- package/dist/shared/markers.d.ts +136 -0
- package/dist/shared/markers.js +497 -0
- package/dist/shared/markers.js.map +1 -0
- package/dist/shared/protocol.d.ts +201 -0
- package/dist/shared/protocol.js +4 -0
- package/dist/shared/protocol.js.map +1 -0
- package/dist/static/assets/apl-B4CMkyY2.js +2 -0
- package/dist/static/assets/apl-B4CMkyY2.js.map +1 -0
- package/dist/static/assets/asciiarmor-Df11BRmG.js +2 -0
- package/dist/static/assets/asciiarmor-Df11BRmG.js.map +1 -0
- package/dist/static/assets/asn1-EdZsLKOL.js +2 -0
- package/dist/static/assets/asn1-EdZsLKOL.js.map +1 -0
- package/dist/static/assets/asterisk-B-8jnY81.js +2 -0
- package/dist/static/assets/asterisk-B-8jnY81.js.map +1 -0
- package/dist/static/assets/brainfuck-C4LP7Hcl.js +2 -0
- package/dist/static/assets/brainfuck-C4LP7Hcl.js.map +1 -0
- package/dist/static/assets/clike-B9uivgTg.js +2 -0
- package/dist/static/assets/clike-B9uivgTg.js.map +1 -0
- package/dist/static/assets/clojure-BMjYHr_A.js +2 -0
- package/dist/static/assets/clojure-BMjYHr_A.js.map +1 -0
- package/dist/static/assets/cmake-BQqOBYOt.js +2 -0
- package/dist/static/assets/cmake-BQqOBYOt.js.map +1 -0
- package/dist/static/assets/cobol-CWcv1MsR.js +2 -0
- package/dist/static/assets/cobol-CWcv1MsR.js.map +1 -0
- package/dist/static/assets/coffeescript-S37ZYGWr.js +2 -0
- package/dist/static/assets/coffeescript-S37ZYGWr.js.map +1 -0
- package/dist/static/assets/commonlisp-DBKNyK5s.js +2 -0
- package/dist/static/assets/commonlisp-DBKNyK5s.js.map +1 -0
- package/dist/static/assets/crystal-SjHAIU92.js +2 -0
- package/dist/static/assets/crystal-SjHAIU92.js.map +1 -0
- package/dist/static/assets/css-BnMrqG3P.js +2 -0
- package/dist/static/assets/css-BnMrqG3P.js.map +1 -0
- package/dist/static/assets/cypher-C_CwsFkJ.js +2 -0
- package/dist/static/assets/cypher-C_CwsFkJ.js.map +1 -0
- package/dist/static/assets/d-pRatUO7H.js +2 -0
- package/dist/static/assets/d-pRatUO7H.js.map +1 -0
- package/dist/static/assets/diff-DbItnlRl.js +2 -0
- package/dist/static/assets/diff-DbItnlRl.js.map +1 -0
- package/dist/static/assets/dockerfile-BKs6k2Af.js +2 -0
- package/dist/static/assets/dockerfile-BKs6k2Af.js.map +1 -0
- package/dist/static/assets/dtd-DF_7sFjM.js +2 -0
- package/dist/static/assets/dtd-DF_7sFjM.js.map +1 -0
- package/dist/static/assets/dylan-DwRh75JA.js +2 -0
- package/dist/static/assets/dylan-DwRh75JA.js.map +1 -0
- package/dist/static/assets/ebnf-CDyGwa7X.js +2 -0
- package/dist/static/assets/ebnf-CDyGwa7X.js.map +1 -0
- package/dist/static/assets/ecl-Cabwm37j.js +2 -0
- package/dist/static/assets/ecl-Cabwm37j.js.map +1 -0
- package/dist/static/assets/eiffel-CnydiIhH.js +2 -0
- package/dist/static/assets/eiffel-CnydiIhH.js.map +1 -0
- package/dist/static/assets/elm-vLlmbW-K.js +2 -0
- package/dist/static/assets/elm-vLlmbW-K.js.map +1 -0
- package/dist/static/assets/erlang-BNw1qcRV.js +2 -0
- package/dist/static/assets/erlang-BNw1qcRV.js.map +1 -0
- package/dist/static/assets/factor-kuTfRLto.js +2 -0
- package/dist/static/assets/factor-kuTfRLto.js.map +1 -0
- package/dist/static/assets/fcl-Kvtd6kyn.js +2 -0
- package/dist/static/assets/fcl-Kvtd6kyn.js.map +1 -0
- package/dist/static/assets/forth-Ffai-XNe.js +2 -0
- package/dist/static/assets/forth-Ffai-XNe.js.map +1 -0
- package/dist/static/assets/fortran-DYz_wnZ1.js +2 -0
- package/dist/static/assets/fortran-DYz_wnZ1.js.map +1 -0
- package/dist/static/assets/gas-Bneqetm1.js +2 -0
- package/dist/static/assets/gas-Bneqetm1.js.map +1 -0
- package/dist/static/assets/gherkin-heZmZLOM.js +2 -0
- package/dist/static/assets/gherkin-heZmZLOM.js.map +1 -0
- package/dist/static/assets/groovy-D9Dt4D0W.js +2 -0
- package/dist/static/assets/groovy-D9Dt4D0W.js.map +1 -0
- package/dist/static/assets/haskell-BWDZoCOh.js +2 -0
- package/dist/static/assets/haskell-BWDZoCOh.js.map +1 -0
- package/dist/static/assets/haxe-H-WmDvRZ.js +2 -0
- package/dist/static/assets/haxe-H-WmDvRZ.js.map +1 -0
- package/dist/static/assets/http-DBlCnlav.js +2 -0
- package/dist/static/assets/http-DBlCnlav.js.map +1 -0
- package/dist/static/assets/idl-BEugSyMb.js +2 -0
- package/dist/static/assets/idl-BEugSyMb.js.map +1 -0
- package/dist/static/assets/index-76gOt96S.js +2 -0
- package/dist/static/assets/index-76gOt96S.js.map +1 -0
- package/dist/static/assets/index-BOQmpwuG.js +2 -0
- package/dist/static/assets/index-BOQmpwuG.js.map +1 -0
- package/dist/static/assets/index-BRr3mRH4.js +2 -0
- package/dist/static/assets/index-BRr3mRH4.js.map +1 -0
- package/dist/static/assets/index-B_hEIVV3.js +2 -0
- package/dist/static/assets/index-B_hEIVV3.js.map +1 -0
- package/dist/static/assets/index-Be89YI4R.js +2 -0
- package/dist/static/assets/index-Be89YI4R.js.map +1 -0
- package/dist/static/assets/index-BiZobR_v.js +4 -0
- package/dist/static/assets/index-BiZobR_v.js.map +1 -0
- package/dist/static/assets/index-Brumy5_9.js +8 -0
- package/dist/static/assets/index-Brumy5_9.js.map +1 -0
- package/dist/static/assets/index-BsJm14K9.js +2 -0
- package/dist/static/assets/index-BsJm14K9.js.map +1 -0
- package/dist/static/assets/index-CTGcuUyU.js +2 -0
- package/dist/static/assets/index-CTGcuUyU.js.map +1 -0
- package/dist/static/assets/index-Cvxvsst9.js +2 -0
- package/dist/static/assets/index-Cvxvsst9.js.map +1 -0
- package/dist/static/assets/index-D6ORLFAQ.js +2 -0
- package/dist/static/assets/index-D6ORLFAQ.js.map +1 -0
- package/dist/static/assets/index-DEhB0VAu.js +3 -0
- package/dist/static/assets/index-DEhB0VAu.js.map +1 -0
- package/dist/static/assets/index-DTNng05d.js +2 -0
- package/dist/static/assets/index-DTNng05d.js.map +1 -0
- package/dist/static/assets/index-DUOyyduC.js +2 -0
- package/dist/static/assets/index-DUOyyduC.js.map +1 -0
- package/dist/static/assets/index-DaO1DHpW.js +101 -0
- package/dist/static/assets/index-DaO1DHpW.js.map +1 -0
- package/dist/static/assets/index-DjRybwG9.js +2 -0
- package/dist/static/assets/index-DjRybwG9.js.map +1 -0
- package/dist/static/assets/index-MU4h_pJS.js +2 -0
- package/dist/static/assets/index-MU4h_pJS.js.map +1 -0
- package/dist/static/assets/index-PYTD2O0j.js +2 -0
- package/dist/static/assets/index-PYTD2O0j.js.map +1 -0
- package/dist/static/assets/index-SfxJH5Y4.css +1 -0
- package/dist/static/assets/javascript-qCveANmP.js +2 -0
- package/dist/static/assets/javascript-qCveANmP.js.map +1 -0
- package/dist/static/assets/julia-DuME0IfC.js +2 -0
- package/dist/static/assets/julia-DuME0IfC.js.map +1 -0
- package/dist/static/assets/livescript-BwQOo05w.js +2 -0
- package/dist/static/assets/livescript-BwQOo05w.js.map +1 -0
- package/dist/static/assets/lua-BgMRiT3U.js +2 -0
- package/dist/static/assets/lua-BgMRiT3U.js.map +1 -0
- package/dist/static/assets/mathematica-DTrFuWx2.js +2 -0
- package/dist/static/assets/mathematica-DTrFuWx2.js.map +1 -0
- package/dist/static/assets/mbox-CNhZ1qSd.js +2 -0
- package/dist/static/assets/mbox-CNhZ1qSd.js.map +1 -0
- package/dist/static/assets/mirc-CjQqDB4T.js +2 -0
- package/dist/static/assets/mirc-CjQqDB4T.js.map +1 -0
- package/dist/static/assets/mllike-CXdrOF99.js +2 -0
- package/dist/static/assets/mllike-CXdrOF99.js.map +1 -0
- package/dist/static/assets/modelica-Dc1JOy9r.js +2 -0
- package/dist/static/assets/modelica-Dc1JOy9r.js.map +1 -0
- package/dist/static/assets/mscgen-BA5vi2Kp.js +2 -0
- package/dist/static/assets/mscgen-BA5vi2Kp.js.map +1 -0
- package/dist/static/assets/mumps-BT43cFF4.js +2 -0
- package/dist/static/assets/mumps-BT43cFF4.js.map +1 -0
- package/dist/static/assets/nginx-DdIZxoE0.js +2 -0
- package/dist/static/assets/nginx-DdIZxoE0.js.map +1 -0
- package/dist/static/assets/nsis-LdVXkNf5.js +2 -0
- package/dist/static/assets/nsis-LdVXkNf5.js.map +1 -0
- package/dist/static/assets/ntriples-BfvgReVJ.js +2 -0
- package/dist/static/assets/ntriples-BfvgReVJ.js.map +1 -0
- package/dist/static/assets/octave-Ck1zUtKM.js +2 -0
- package/dist/static/assets/octave-Ck1zUtKM.js.map +1 -0
- package/dist/static/assets/oz-BzwKVEFT.js +2 -0
- package/dist/static/assets/oz-BzwKVEFT.js.map +1 -0
- package/dist/static/assets/pascal--L3eBynH.js +2 -0
- package/dist/static/assets/pascal--L3eBynH.js.map +1 -0
- package/dist/static/assets/perl-CdXCOZ3F.js +2 -0
- package/dist/static/assets/perl-CdXCOZ3F.js.map +1 -0
- package/dist/static/assets/pig-CevX1Tat.js +2 -0
- package/dist/static/assets/pig-CevX1Tat.js.map +1 -0
- package/dist/static/assets/powershell-CFHJl5sT.js +2 -0
- package/dist/static/assets/powershell-CFHJl5sT.js.map +1 -0
- package/dist/static/assets/properties-C78fOPTZ.js +2 -0
- package/dist/static/assets/properties-C78fOPTZ.js.map +1 -0
- package/dist/static/assets/protobuf-ChK-085T.js +2 -0
- package/dist/static/assets/protobuf-ChK-085T.js.map +1 -0
- package/dist/static/assets/pug-DukmZTjD.js +2 -0
- package/dist/static/assets/pug-DukmZTjD.js.map +1 -0
- package/dist/static/assets/puppet-DMA9R1ak.js +2 -0
- package/dist/static/assets/puppet-DMA9R1ak.js.map +1 -0
- package/dist/static/assets/python-BuPzkPfP.js +2 -0
- package/dist/static/assets/python-BuPzkPfP.js.map +1 -0
- package/dist/static/assets/q-pXgVlZs6.js +2 -0
- package/dist/static/assets/q-pXgVlZs6.js.map +1 -0
- package/dist/static/assets/r-DUYO_cvP.js +2 -0
- package/dist/static/assets/r-DUYO_cvP.js.map +1 -0
- package/dist/static/assets/rpm-CTu-6PCP.js +2 -0
- package/dist/static/assets/rpm-CTu-6PCP.js.map +1 -0
- package/dist/static/assets/ruby-B2Rjki9n.js +2 -0
- package/dist/static/assets/ruby-B2Rjki9n.js.map +1 -0
- package/dist/static/assets/sas-B4kiWyti.js +2 -0
- package/dist/static/assets/sas-B4kiWyti.js.map +1 -0
- package/dist/static/assets/scheme-C41bIUwD.js +2 -0
- package/dist/static/assets/scheme-C41bIUwD.js.map +1 -0
- package/dist/static/assets/shell-CjFT_Tl9.js +2 -0
- package/dist/static/assets/shell-CjFT_Tl9.js.map +1 -0
- package/dist/static/assets/sieve-C3Gn_uJK.js +2 -0
- package/dist/static/assets/sieve-C3Gn_uJK.js.map +1 -0
- package/dist/static/assets/simple-mode-GW_nhZxv.js +2 -0
- package/dist/static/assets/simple-mode-GW_nhZxv.js.map +1 -0
- package/dist/static/assets/smalltalk-CnHTOXQT.js +2 -0
- package/dist/static/assets/smalltalk-CnHTOXQT.js.map +1 -0
- package/dist/static/assets/solr-DehyRSwq.js +2 -0
- package/dist/static/assets/solr-DehyRSwq.js.map +1 -0
- package/dist/static/assets/sparql-DkYu6x3z.js +2 -0
- package/dist/static/assets/sparql-DkYu6x3z.js.map +1 -0
- package/dist/static/assets/spreadsheet-BCZA_wO0.js +2 -0
- package/dist/static/assets/spreadsheet-BCZA_wO0.js.map +1 -0
- package/dist/static/assets/sql-D0XecflT.js +2 -0
- package/dist/static/assets/sql-D0XecflT.js.map +1 -0
- package/dist/static/assets/stex-C3f8Ysf7.js +2 -0
- package/dist/static/assets/stex-C3f8Ysf7.js.map +1 -0
- package/dist/static/assets/stylus-B533Al4x.js +2 -0
- package/dist/static/assets/stylus-B533Al4x.js.map +1 -0
- package/dist/static/assets/swift-BzpIVaGY.js +2 -0
- package/dist/static/assets/swift-BzpIVaGY.js.map +1 -0
- package/dist/static/assets/tcl-DVfN8rqt.js +2 -0
- package/dist/static/assets/tcl-DVfN8rqt.js.map +1 -0
- package/dist/static/assets/textile-CnDTJFAw.js +2 -0
- package/dist/static/assets/textile-CnDTJFAw.js.map +1 -0
- package/dist/static/assets/tiddlywiki-DO-Gjzrf.js +2 -0
- package/dist/static/assets/tiddlywiki-DO-Gjzrf.js.map +1 -0
- package/dist/static/assets/tiki-DGYXhP31.js +2 -0
- package/dist/static/assets/tiki-DGYXhP31.js.map +1 -0
- package/dist/static/assets/toml-Bm5Em-hy.js +2 -0
- package/dist/static/assets/toml-Bm5Em-hy.js.map +1 -0
- package/dist/static/assets/troff-wAsdV37c.js +2 -0
- package/dist/static/assets/troff-wAsdV37c.js.map +1 -0
- package/dist/static/assets/ttcn-CfJYG6tj.js +2 -0
- package/dist/static/assets/ttcn-CfJYG6tj.js.map +1 -0
- package/dist/static/assets/ttcn-cfg-B9xdYoR4.js +2 -0
- package/dist/static/assets/ttcn-cfg-B9xdYoR4.js.map +1 -0
- package/dist/static/assets/turtle-B1tBg_DP.js +2 -0
- package/dist/static/assets/turtle-B1tBg_DP.js.map +1 -0
- package/dist/static/assets/vb-CmGdzxic.js +2 -0
- package/dist/static/assets/vb-CmGdzxic.js.map +1 -0
- package/dist/static/assets/vbscript-BuJXcnF6.js +2 -0
- package/dist/static/assets/vbscript-BuJXcnF6.js.map +1 -0
- package/dist/static/assets/velocity-D8B20fx6.js +2 -0
- package/dist/static/assets/velocity-D8B20fx6.js.map +1 -0
- package/dist/static/assets/verilog-C6RDOZhf.js +2 -0
- package/dist/static/assets/verilog-C6RDOZhf.js.map +1 -0
- package/dist/static/assets/vhdl-lSbBsy5d.js +2 -0
- package/dist/static/assets/vhdl-lSbBsy5d.js.map +1 -0
- package/dist/static/assets/webidl-ZXfAyPTL.js +2 -0
- package/dist/static/assets/webidl-ZXfAyPTL.js.map +1 -0
- package/dist/static/assets/xquery-CQfU5ijd.js +2 -0
- package/dist/static/assets/xquery-CQfU5ijd.js.map +1 -0
- package/dist/static/assets/yacas-BJ4BC0dw.js +2 -0
- package/dist/static/assets/yacas-BJ4BC0dw.js.map +1 -0
- package/dist/static/assets/z80-Hz9HOZM7.js +2 -0
- package/dist/static/assets/z80-Hz9HOZM7.js.map +1 -0
- package/dist/static/index.html +14 -0
- package/package.json +89 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { sanitizeAttribute } from "../shared/markers.js";
|
|
5
|
+
// Resolve the `author` attribute written into a human-origin marker.
|
|
6
|
+
//
|
|
7
|
+
// Spec: Identity and Multi-Agent / Human identity in markers.
|
|
8
|
+
// Resolution order, evaluated per write:
|
|
9
|
+
//
|
|
10
|
+
// 1. `git config user.name` if `.git/` exists in the workspace root and
|
|
11
|
+
// the value is non-empty.
|
|
12
|
+
// 2. `$USER` from the environment.
|
|
13
|
+
// 3. Literal `human`.
|
|
14
|
+
//
|
|
15
|
+
// Control characters are stripped, `"` is replaced with `'` so the value
|
|
16
|
+
// never breaks the HTML comment's quoted attribute. Empty after sanitization
|
|
17
|
+
// falls back to the next candidate, ultimately to `human`.
|
|
18
|
+
const FALLBACK = "human";
|
|
19
|
+
export function resolveHumanAuthor(cwd, env = process.env) {
|
|
20
|
+
const gitName = readGitUserName(cwd);
|
|
21
|
+
const gitSan = sanitizeAttribute(gitName).trim();
|
|
22
|
+
if (gitSan)
|
|
23
|
+
return gitSan;
|
|
24
|
+
const userEnv = env.USER ?? "";
|
|
25
|
+
const userSan = sanitizeAttribute(userEnv).trim();
|
|
26
|
+
if (userSan)
|
|
27
|
+
return userSan;
|
|
28
|
+
return FALLBACK;
|
|
29
|
+
}
|
|
30
|
+
function readGitUserName(cwd) {
|
|
31
|
+
if (!existsSync(join(cwd, ".git")))
|
|
32
|
+
return "";
|
|
33
|
+
try {
|
|
34
|
+
const out = execFileSync("git", ["config", "user.name"], {
|
|
35
|
+
cwd,
|
|
36
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
37
|
+
encoding: "utf8",
|
|
38
|
+
});
|
|
39
|
+
return out.trim();
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return "";
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=author.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"author.js","sourceRoot":"","sources":["../../src/server/author.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,qEAAqE;AACrE,EAAE;AACF,8DAA8D;AAC9D,yCAAyC;AACzC,EAAE;AACF,0EAA0E;AAC1E,+BAA+B;AAC/B,qCAAqC;AACrC,wBAAwB;AACxB,EAAE;AACF,yEAAyE;AACzE,6EAA6E;AAC7E,2DAA2D;AAE3D,MAAM,QAAQ,GAAG,OAAO,CAAC;AAEzB,MAAM,UAAU,kBAAkB,CAChC,GAAW,EACX,MAA0C,OAAO,CAAC,GAAG;IAErD,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IACjD,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAClD,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAE5B,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,eAAe,CAAC,GAAW;IAClC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE;YACvD,GAAG;YACH,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;YACnC,QAAQ,EAAE,MAAM;SACjB,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { mkdir } from "node:fs/promises";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { argv, env, exit, cwd as procCwd, stdin, stdout } from "node:process";
|
|
6
|
+
import { createInterface } from "node:readline/promises";
|
|
7
|
+
import { fileURLToPath } from "node:url";
|
|
8
|
+
import open from "open";
|
|
9
|
+
import { ArgsError, helpText, parseArgs } from "./args.js";
|
|
10
|
+
import { ConfigLoadError, LOCAL_REL, gitignoreState, loadProjectConfig, } from "./config/index.js";
|
|
11
|
+
import { probeConnectionFile } from "./connection-file.js";
|
|
12
|
+
import { SUPPORTED_AGENTS, isSupportedAgent, runInit } from "./init.js";
|
|
13
|
+
import { log, setLogLevel } from "./log.js";
|
|
14
|
+
import { assertNodeVersion } from "./runtime-check.js";
|
|
15
|
+
import { startServer } from "./server.js";
|
|
16
|
+
import { bootStdio } from "./stdio.js";
|
|
17
|
+
import { buildVerbCatalog } from "./verbs/index.js";
|
|
18
|
+
import { createWorkspace, defaultScope, defaultScopeDirExists, isDefaultScope, } from "./workspace.js";
|
|
19
|
+
const PORT_FALLBACK_START = 5180;
|
|
20
|
+
const PORT_FALLBACK_END = 5189;
|
|
21
|
+
async function main() {
|
|
22
|
+
try {
|
|
23
|
+
assertNodeVersion(process.version);
|
|
24
|
+
}
|
|
25
|
+
catch (e) {
|
|
26
|
+
process.stderr.write(`${e.message}\n`);
|
|
27
|
+
exit(2);
|
|
28
|
+
}
|
|
29
|
+
let args;
|
|
30
|
+
try {
|
|
31
|
+
args = parseArgs(argv.slice(2));
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
if (e instanceof ArgsError) {
|
|
35
|
+
process.stderr.write(`${e.message}\n\n${helpText()}`);
|
|
36
|
+
exit(2);
|
|
37
|
+
}
|
|
38
|
+
throw e;
|
|
39
|
+
}
|
|
40
|
+
if (args.helpRequested) {
|
|
41
|
+
process.stdout.write(helpText());
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (args.verbose)
|
|
45
|
+
setLogLevel("DEBUG");
|
|
46
|
+
else if (args.quiet)
|
|
47
|
+
setLogLevel("WARN");
|
|
48
|
+
// `init` writes a .mcp.json; it does not need the .sidebar/ config layer.
|
|
49
|
+
// Everything else passes through the loader so an invalid file refuses
|
|
50
|
+
// boot per the Q9 "no silent fallback" stance.
|
|
51
|
+
if (args.subcommand === "init") {
|
|
52
|
+
await runInitCommand(args);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const cwd = procCwd();
|
|
56
|
+
let loaded;
|
|
57
|
+
try {
|
|
58
|
+
loaded = await loadProjectConfig(cwd);
|
|
59
|
+
}
|
|
60
|
+
catch (e) {
|
|
61
|
+
if (e instanceof ConfigLoadError) {
|
|
62
|
+
process.stderr.write(`${e.message}\n`);
|
|
63
|
+
exit(8);
|
|
64
|
+
}
|
|
65
|
+
throw e;
|
|
66
|
+
}
|
|
67
|
+
warnUnignoredLocal(cwd, loaded.local);
|
|
68
|
+
const settings = resolveSettings(args, loaded);
|
|
69
|
+
switch (args.subcommand) {
|
|
70
|
+
case "stdio":
|
|
71
|
+
await runStdioCommand(settings);
|
|
72
|
+
return;
|
|
73
|
+
case "serve":
|
|
74
|
+
await runServeCommand(settings);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function resolveSettings(args, loaded) {
|
|
79
|
+
const cfg = loaded.config;
|
|
80
|
+
const loc = loaded.local;
|
|
81
|
+
const scope = args.scope ?? cfg?.scope ?? defaultScope();
|
|
82
|
+
const scopeFromDisk = args.scope !== undefined || cfg?.scope !== undefined;
|
|
83
|
+
const port = args.port ?? loc?.port;
|
|
84
|
+
const portExplicit = args.port !== undefined || loc?.port !== undefined;
|
|
85
|
+
const browser = args.browser ?? loc?.browser ?? "default";
|
|
86
|
+
return { scope, scopeFromDisk, port, portExplicit, browser, config: cfg };
|
|
87
|
+
}
|
|
88
|
+
function warnUnignoredLocal(cwd, local) {
|
|
89
|
+
if (!local)
|
|
90
|
+
return;
|
|
91
|
+
if (gitignoreState(cwd) === "unignored") {
|
|
92
|
+
// Spec: Configuration / Gitignore behavior. Single-line stderr nag; no
|
|
93
|
+
// persistent dismissal flag.
|
|
94
|
+
process.stderr.write(`warning: ${LOCAL_REL} exists in this project but is not gitignored. ` +
|
|
95
|
+
`Add it to .gitignore (per-machine state should not be committed).\n`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async function runInitCommand(args) {
|
|
99
|
+
const cwd = procCwd();
|
|
100
|
+
let agentName = args.initAgent;
|
|
101
|
+
if (!agentName) {
|
|
102
|
+
if (args.yes || !stdin.isTTY) {
|
|
103
|
+
// Non-interactive default: V1 ships claude-code (spec: Invocation
|
|
104
|
+
// modes / V1 supports Claude Code and Compound's shared .mcp.json).
|
|
105
|
+
agentName = "claude-code";
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
agentName = await promptForAgent();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (!isSupportedAgent(agentName)) {
|
|
112
|
+
process.stderr.write(`unsupported agent: ${agentName}. ` +
|
|
113
|
+
`Supported in V1: ${SUPPORTED_AGENTS.join(", ")}. ` +
|
|
114
|
+
`Cursor, Codex, and Aider variants land in V1.1.\n`);
|
|
115
|
+
exit(2);
|
|
116
|
+
}
|
|
117
|
+
let outcome;
|
|
118
|
+
try {
|
|
119
|
+
outcome = await runInit(cwd, agentName);
|
|
120
|
+
}
|
|
121
|
+
catch (e) {
|
|
122
|
+
process.stderr.write(`init failed: ${e.message}\n`);
|
|
123
|
+
exit(6);
|
|
124
|
+
}
|
|
125
|
+
const verb = outcome.action === "created"
|
|
126
|
+
? "wrote new"
|
|
127
|
+
: outcome.action === "updated"
|
|
128
|
+
? "updated"
|
|
129
|
+
: "left unchanged";
|
|
130
|
+
process.stdout.write(`sidebar init: ${verb} ${outcome.path}\n` +
|
|
131
|
+
` agent: ${agentName}\n` +
|
|
132
|
+
` mcpServers: ${outcome.agents.join(", ")}\n` +
|
|
133
|
+
`\n` +
|
|
134
|
+
`Start ${agentName} in this project; it will spawn sidebar via stdio.\n`);
|
|
135
|
+
}
|
|
136
|
+
async function promptForAgent() {
|
|
137
|
+
const rl = createInterface({ input: stdin, output: stdout });
|
|
138
|
+
try {
|
|
139
|
+
stdout.write(`\nWhich MCP-speaking agent should sidebar wire up?\n\n` +
|
|
140
|
+
SUPPORTED_AGENTS.map((a, i) => ` [${i + 1}] ${a}`).join("\n") +
|
|
141
|
+
`\n\nEnter a number or the agent name (default: claude-code): `);
|
|
142
|
+
const ans = (await rl.question("")).trim();
|
|
143
|
+
if (!ans)
|
|
144
|
+
return "claude-code";
|
|
145
|
+
const idx = Number.parseInt(ans, 10);
|
|
146
|
+
if (!Number.isNaN(idx) && idx >= 1 && idx <= SUPPORTED_AGENTS.length) {
|
|
147
|
+
return SUPPORTED_AGENTS[idx - 1];
|
|
148
|
+
}
|
|
149
|
+
return ans;
|
|
150
|
+
}
|
|
151
|
+
finally {
|
|
152
|
+
rl.close();
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
async function runStdioCommand(settings) {
|
|
156
|
+
const cwd = procCwd();
|
|
157
|
+
const workspace = await prepareWorkspaceOrExit(settings, cwd, { promptOnMissing: false });
|
|
158
|
+
const staticRoot = resolveStaticRoot();
|
|
159
|
+
const verbCatalog = buildVerbCatalog(settings.config);
|
|
160
|
+
const boot = await bootStdio({
|
|
161
|
+
cwd,
|
|
162
|
+
startPrimary: async () => {
|
|
163
|
+
const handle = await bindServer(workspace, settings, staticRoot, verbCatalog);
|
|
164
|
+
process.stderr.write(`sidebar primary listening at ${handle.url}\n`);
|
|
165
|
+
process.stderr.write(` workspace: ${workspace.root}\n`);
|
|
166
|
+
process.stderr.write(` scope: ${workspace.scope}\n`);
|
|
167
|
+
// Only the primary opens a browser; proxies share the primary tab.
|
|
168
|
+
await maybeLaunchBrowser(settings.browser, handle.url);
|
|
169
|
+
return handle;
|
|
170
|
+
},
|
|
171
|
+
});
|
|
172
|
+
installStdioShutdown(boot.shutdown);
|
|
173
|
+
await boot.done;
|
|
174
|
+
}
|
|
175
|
+
async function runServeCommand(settings) {
|
|
176
|
+
const cwd = procCwd();
|
|
177
|
+
// ADR-0007 / spec: Invocation modes. Standalone must refuse to start while
|
|
178
|
+
// a primary is already alive for this project.
|
|
179
|
+
const probe = await probeConnectionFile(cwd);
|
|
180
|
+
if (probe.kind === "alive") {
|
|
181
|
+
process.stderr.write(`primary sidebar already running at ${probe.info.url} (pid ${probe.info.pid}).\n` +
|
|
182
|
+
`Attach via that URL or stop the running primary first.\n`);
|
|
183
|
+
exit(7);
|
|
184
|
+
}
|
|
185
|
+
if (probe.kind === "stale" || probe.kind === "malformed") {
|
|
186
|
+
log.warn(`removing stale .sidebar/connection.json (probe: ${probe.kind})`);
|
|
187
|
+
// Don't block the user behind a manual cleanup; the file is per-project
|
|
188
|
+
// discovery, not configuration.
|
|
189
|
+
const { removeConnectionFile } = await import("./connection-file.js");
|
|
190
|
+
await removeConnectionFile(cwd);
|
|
191
|
+
}
|
|
192
|
+
const workspace = await prepareWorkspaceOrExit(settings, cwd, { promptOnMissing: true });
|
|
193
|
+
const staticRoot = resolveStaticRoot();
|
|
194
|
+
const verbCatalog = buildVerbCatalog(settings.config);
|
|
195
|
+
const handle = await bindServer(workspace, settings, staticRoot, verbCatalog);
|
|
196
|
+
process.stderr.write(`sidebar listening at ${handle.url}\n`);
|
|
197
|
+
process.stderr.write(` workspace: ${workspace.root}\n`);
|
|
198
|
+
process.stderr.write(` scope: ${workspace.scope}\n`);
|
|
199
|
+
await maybeLaunchBrowser(settings.browser, handle.url);
|
|
200
|
+
installShutdown(handle);
|
|
201
|
+
}
|
|
202
|
+
// Bind the HTTP server honouring the precedence rules: an explicit port
|
|
203
|
+
// (CLI or local.json) refuses on collision; an absent port walks the
|
|
204
|
+
// 5180-5189 fallback range.
|
|
205
|
+
async function bindServer(workspace, settings, staticRoot, verbCatalog) {
|
|
206
|
+
if (settings.portExplicit && settings.port !== undefined) {
|
|
207
|
+
try {
|
|
208
|
+
return await startServer({ workspace, port: settings.port, staticRoot, verbCatalog });
|
|
209
|
+
}
|
|
210
|
+
catch (e) {
|
|
211
|
+
const code = e.code;
|
|
212
|
+
if (code === "EADDRINUSE") {
|
|
213
|
+
process.stderr.write(`port ${settings.port} is already in use (EADDRINUSE). ` +
|
|
214
|
+
`Pick a different --port, or use --port 0.\n`);
|
|
215
|
+
exit(4);
|
|
216
|
+
}
|
|
217
|
+
throw e;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return tryFallback(workspace, staticRoot, verbCatalog);
|
|
221
|
+
}
|
|
222
|
+
async function prepareWorkspaceOrExit(settings, cwd, opts) {
|
|
223
|
+
let scope = settings.scope;
|
|
224
|
+
// The docs/ prompt only fires for the *default* scope. A scope coming from
|
|
225
|
+
// either CLI or config.json is the user's explicit choice; we don't second-
|
|
226
|
+
// guess it.
|
|
227
|
+
if (!settings.scopeFromDisk && isDefaultScope(scope) && !defaultScopeDirExists(cwd)) {
|
|
228
|
+
if (!opts.promptOnMissing) {
|
|
229
|
+
// --stdio is non-interactive (the user's agent is on the other end of
|
|
230
|
+
// stdio). Refuse rather than silently fall back.
|
|
231
|
+
process.stderr.write(`docs/ not found at ${cwd}.\n` +
|
|
232
|
+
`Sidebar's --stdio mode is non-interactive. ` +
|
|
233
|
+
`Re-run \`npx sidebar-md\` interactively to create docs/, or wire ` +
|
|
234
|
+
`\`--scope "<glob>"\` into your .mcp.json entry.\n`);
|
|
235
|
+
exit(5);
|
|
236
|
+
}
|
|
237
|
+
const decision = await promptDocsMissing(cwd);
|
|
238
|
+
if (decision.kind === "quit") {
|
|
239
|
+
exit(0);
|
|
240
|
+
}
|
|
241
|
+
else if (decision.kind === "create") {
|
|
242
|
+
await mkdir(join(cwd, "docs"), { recursive: true });
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
scope = decision.scope;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return createWorkspace(cwd, scope);
|
|
249
|
+
}
|
|
250
|
+
async function tryFallback(workspace, staticRoot, verbCatalog) {
|
|
251
|
+
for (let p = PORT_FALLBACK_START; p <= PORT_FALLBACK_END; p++) {
|
|
252
|
+
try {
|
|
253
|
+
return await startServer({ workspace, port: p, staticRoot, verbCatalog });
|
|
254
|
+
}
|
|
255
|
+
catch (e) {
|
|
256
|
+
if (e.code !== "EADDRINUSE")
|
|
257
|
+
throw e;
|
|
258
|
+
log.debug(`port ${p} busy, trying next`);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
process.stderr.write(`no free port in ${PORT_FALLBACK_START}-${PORT_FALLBACK_END}. Use --port <N> or --port 0.\n`);
|
|
262
|
+
exit(3);
|
|
263
|
+
}
|
|
264
|
+
async function maybeLaunchBrowser(browser, url) {
|
|
265
|
+
if (browser === "none")
|
|
266
|
+
return;
|
|
267
|
+
const override = env.SIDEBAR_OPEN;
|
|
268
|
+
if (override === "noop")
|
|
269
|
+
return;
|
|
270
|
+
if (override === "fail") {
|
|
271
|
+
log.warn("SIDEBAR_OPEN=fail: skipping browser launch (test harness)");
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
try {
|
|
275
|
+
if (browser === "default") {
|
|
276
|
+
await open(url);
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
await open(url, { app: { name: browser } });
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
catch (e) {
|
|
283
|
+
log.warn(`browser launch failed: ${e.message}`);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
function installShutdown(handle) {
|
|
287
|
+
let shuttingDown = false;
|
|
288
|
+
const shutdown = async (sig) => {
|
|
289
|
+
if (shuttingDown)
|
|
290
|
+
return;
|
|
291
|
+
shuttingDown = true;
|
|
292
|
+
process.stderr.write(`received ${sig}, shutting down\n`);
|
|
293
|
+
try {
|
|
294
|
+
await handle.close();
|
|
295
|
+
}
|
|
296
|
+
catch (e) {
|
|
297
|
+
process.stderr.write(`shutdown error: ${e.message}\n`);
|
|
298
|
+
}
|
|
299
|
+
exit(0);
|
|
300
|
+
};
|
|
301
|
+
process.on("SIGINT", () => void shutdown("SIGINT"));
|
|
302
|
+
process.on("SIGTERM", () => void shutdown("SIGTERM"));
|
|
303
|
+
}
|
|
304
|
+
function installStdioShutdown(stop) {
|
|
305
|
+
let shuttingDown = false;
|
|
306
|
+
const shutdown = async (sig) => {
|
|
307
|
+
if (shuttingDown)
|
|
308
|
+
return;
|
|
309
|
+
shuttingDown = true;
|
|
310
|
+
process.stderr.write(`received ${sig}, shutting down stdio\n`);
|
|
311
|
+
try {
|
|
312
|
+
await stop();
|
|
313
|
+
}
|
|
314
|
+
catch (e) {
|
|
315
|
+
process.stderr.write(`stdio shutdown error: ${e.message}\n`);
|
|
316
|
+
}
|
|
317
|
+
exit(0);
|
|
318
|
+
};
|
|
319
|
+
process.on("SIGINT", () => void shutdown("SIGINT"));
|
|
320
|
+
process.on("SIGTERM", () => void shutdown("SIGTERM"));
|
|
321
|
+
}
|
|
322
|
+
async function promptDocsMissing(cwd) {
|
|
323
|
+
if (!stdin.isTTY) {
|
|
324
|
+
process.stderr.write(`docs/ not found at ${cwd}.\n` +
|
|
325
|
+
`Sidebar uses docs/**/*.md as its default workspace scope.\n` +
|
|
326
|
+
`Re-run with --scope "<glob>" or create docs/ and try again.\n`);
|
|
327
|
+
exit(5);
|
|
328
|
+
}
|
|
329
|
+
const rl = createInterface({ input: stdin, output: stdout });
|
|
330
|
+
try {
|
|
331
|
+
stdout.write(`\ndocs/ not found at ${cwd}.\n` +
|
|
332
|
+
`Sidebar uses docs/**/*.md as its default workspace scope.\n\n` +
|
|
333
|
+
` [c] create docs/ here\n` +
|
|
334
|
+
` [s] use a different scope glob\n` +
|
|
335
|
+
` [q] quit\n\n`);
|
|
336
|
+
for (;;) {
|
|
337
|
+
const ans = (await rl.question("choice [c/s/q]: ")).trim().toLowerCase();
|
|
338
|
+
if (ans === "c" || ans === "create")
|
|
339
|
+
return { kind: "create" };
|
|
340
|
+
if (ans === "q" || ans === "quit")
|
|
341
|
+
return { kind: "quit" };
|
|
342
|
+
if (ans === "s" || ans === "scope") {
|
|
343
|
+
const scope = (await rl.question("scope glob: ")).trim();
|
|
344
|
+
if (scope)
|
|
345
|
+
return { kind: "scope", scope };
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
finally {
|
|
350
|
+
rl.close();
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
function resolveStaticRoot() {
|
|
354
|
+
// After `npm run build`, the SPA is at dist/static. When running from
|
|
355
|
+
// source via tsx, the directory may not exist yet; the server handles
|
|
356
|
+
// that case by returning a friendly 503.
|
|
357
|
+
const path = fileURLToPath(new URL("../../dist/static", import.meta.url));
|
|
358
|
+
return existsSync(path) ? path : null;
|
|
359
|
+
}
|
|
360
|
+
main().catch((e) => {
|
|
361
|
+
process.stderr.write(`fatal: ${e.message}\n`);
|
|
362
|
+
exit(1);
|
|
363
|
+
});
|
|
364
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/server/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type GitignoreState = "absent" | "ignored" | "unignored";
|
|
2
|
+
/** Returns "absent" when there is no .git/ directory at `cwd`. */
|
|
3
|
+
export declare function gitignoreState(cwd: string): GitignoreState;
|
|
4
|
+
export declare function isLocalIgnored(cwd: string): boolean;
|
|
5
|
+
/**
|
|
6
|
+
* Append the local.json entry to .gitignore, preserving existing entries.
|
|
7
|
+
* Creates .gitignore if it doesn't exist. No-ops if the entry is already
|
|
8
|
+
* present (defensive double-add guard, in case the caller skipped the check).
|
|
9
|
+
*/
|
|
10
|
+
export declare function appendLocalToGitignore(cwd: string): Promise<void>;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { LOCAL_REL } from "./paths.js";
|
|
5
|
+
/** Returns "absent" when there is no .git/ directory at `cwd`. */
|
|
6
|
+
export function gitignoreState(cwd) {
|
|
7
|
+
if (!existsSync(join(cwd, ".git")))
|
|
8
|
+
return "absent";
|
|
9
|
+
return isLocalIgnored(cwd) ? "ignored" : "unignored";
|
|
10
|
+
}
|
|
11
|
+
export function isLocalIgnored(cwd) {
|
|
12
|
+
const path = join(cwd, ".gitignore");
|
|
13
|
+
if (!existsSync(path))
|
|
14
|
+
return false;
|
|
15
|
+
let body;
|
|
16
|
+
try {
|
|
17
|
+
body = readFileSync(path, "utf8");
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
return matchesLocalLine(body);
|
|
23
|
+
}
|
|
24
|
+
function matchesLocalLine(body) {
|
|
25
|
+
for (const raw of body.split(/\r?\n/)) {
|
|
26
|
+
const line = raw.trim();
|
|
27
|
+
if (!line || line.startsWith("#"))
|
|
28
|
+
continue;
|
|
29
|
+
if (line === LOCAL_REL)
|
|
30
|
+
return true;
|
|
31
|
+
// Allow a leading slash form (".sidebar/local.json" vs "/.sidebar/...").
|
|
32
|
+
if (line === `/${LOCAL_REL}`)
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Append the local.json entry to .gitignore, preserving existing entries.
|
|
39
|
+
* Creates .gitignore if it doesn't exist. No-ops if the entry is already
|
|
40
|
+
* present (defensive double-add guard, in case the caller skipped the check).
|
|
41
|
+
*/
|
|
42
|
+
export async function appendLocalToGitignore(cwd) {
|
|
43
|
+
const path = join(cwd, ".gitignore");
|
|
44
|
+
let body = "";
|
|
45
|
+
if (existsSync(path)) {
|
|
46
|
+
body = await readFile(path, "utf8");
|
|
47
|
+
if (matchesLocalLine(body))
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const sep = body.length === 0 || body.endsWith("\n") ? "" : "\n";
|
|
51
|
+
await writeFile(path, `${body}${sep}${LOCAL_REL}\n`, "utf8");
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=gitignore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitignore.js","sourceRoot":"","sources":["../../../src/server/config/gitignore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAQvC,kEAAkE;AAClE,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAAE,OAAO,QAAQ,CAAC;IACpD,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACrC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACpC,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5C,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACpC,yEAAyE;QACzE,IAAI,IAAI,KAAK,IAAI,SAAS,EAAE;YAAE,OAAO,IAAI,CAAC;IAC5C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,GAAW;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACrC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACpC,IAAI,gBAAgB,CAAC,IAAI,CAAC;YAAE,OAAO;IACrC,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACjE,MAAM,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,GAAG,GAAG,GAAG,SAAS,IAAI,EAAE,MAAM,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { ConfigLoadError, type LoadConfigResult, loadProjectConfig, } from "./load.js";
|
|
2
|
+
export { CONFIG_REL, LOCAL_REL, configPath, localPath, sidebarDir, } from "./paths.js";
|
|
3
|
+
export type { SidebarConfigFile, SidebarLocalFile } from "./schema.js";
|
|
4
|
+
export { type GitignoreAction, type GitignoreConsent, type PersistConfigResult, type PersistLocalResult, persistConfig, persistLocal, } from "./write.js";
|
|
5
|
+
export { type GitignoreState, appendLocalToGitignore, gitignoreState, isLocalIgnored, } from "./gitignore.js";
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { ConfigLoadError, loadProjectConfig, } from "./load.js";
|
|
2
|
+
export { CONFIG_REL, LOCAL_REL, configPath, localPath, sidebarDir, } from "./paths.js";
|
|
3
|
+
export { persistConfig, persistLocal, } from "./write.js";
|
|
4
|
+
export { appendLocalToGitignore, gitignoreState, isLocalIgnored, } from "./gitignore.js";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EAEf,iBAAiB,GAClB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,UAAU,EACV,SAAS,EACT,UAAU,EACV,SAAS,EACT,UAAU,GACX,MAAM,YAAY,CAAC;AAEpB,OAAO,EAKL,aAAa,EACb,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EAEL,sBAAsB,EACtB,cAAc,EACd,cAAc,GACf,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type SidebarConfigFile, type SidebarLocalFile } from "./schema.js";
|
|
2
|
+
export declare class ConfigLoadError extends Error {
|
|
3
|
+
/** Relative path of the offending file (".sidebar/config.json"). */
|
|
4
|
+
readonly file: string;
|
|
5
|
+
/** Dotted field path (e.g. "verbs.human.rephrase"); empty for whole-file errors. */
|
|
6
|
+
readonly fieldPath: string;
|
|
7
|
+
/** Human-readable explanation. */
|
|
8
|
+
readonly reason: string;
|
|
9
|
+
constructor(
|
|
10
|
+
/** Relative path of the offending file (".sidebar/config.json"). */
|
|
11
|
+
file: string,
|
|
12
|
+
/** Dotted field path (e.g. "verbs.human.rephrase"); empty for whole-file errors. */
|
|
13
|
+
fieldPath: string,
|
|
14
|
+
/** Human-readable explanation. */
|
|
15
|
+
reason: string);
|
|
16
|
+
}
|
|
17
|
+
export type LoadConfigResult = {
|
|
18
|
+
config: SidebarConfigFile | null;
|
|
19
|
+
local: SidebarLocalFile | null;
|
|
20
|
+
};
|
|
21
|
+
export declare function loadProjectConfig(cwd: string): Promise<LoadConfigResult>;
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { BUILTIN_AGENT_VERB_NAMES, BUILTIN_HUMAN_VERB_NAMES } from "../verbs/builtin.js";
|
|
4
|
+
import { CONFIG_REL, LOCAL_REL, configPath, localPath } from "./paths.js";
|
|
5
|
+
import { sidebarConfigSchema, sidebarLocalSchema, } from "./schema.js";
|
|
6
|
+
// ConfigLoadError carries enough context for the CLI to print a one-line
|
|
7
|
+
// "<file>: <field>: <reason>" message. The Q9 stance is firm: no silent
|
|
8
|
+
// fallback. If we get a load error, sidebar refuses to start.
|
|
9
|
+
export class ConfigLoadError extends Error {
|
|
10
|
+
file;
|
|
11
|
+
fieldPath;
|
|
12
|
+
reason;
|
|
13
|
+
constructor(
|
|
14
|
+
/** Relative path of the offending file (".sidebar/config.json"). */
|
|
15
|
+
file,
|
|
16
|
+
/** Dotted field path (e.g. "verbs.human.rephrase"); empty for whole-file errors. */
|
|
17
|
+
fieldPath,
|
|
18
|
+
/** Human-readable explanation. */
|
|
19
|
+
reason) {
|
|
20
|
+
super(fieldPath ? `${file}: ${fieldPath}: ${reason}` : `${file}: ${reason}`);
|
|
21
|
+
this.file = file;
|
|
22
|
+
this.fieldPath = fieldPath;
|
|
23
|
+
this.reason = reason;
|
|
24
|
+
this.name = "ConfigLoadError";
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export async function loadProjectConfig(cwd) {
|
|
28
|
+
const config = await loadOne(configPath(cwd), CONFIG_REL, sidebarConfigSchema);
|
|
29
|
+
if (config)
|
|
30
|
+
assertNoBuiltinVerbRedefinition(config);
|
|
31
|
+
const local = await loadOne(localPath(cwd), LOCAL_REL, sidebarLocalSchema);
|
|
32
|
+
return { config, local };
|
|
33
|
+
}
|
|
34
|
+
// Spec: Configuration -- "Redefining a built-in verb is a load error."
|
|
35
|
+
// We run this after schema parsing so the error path can name the specific
|
|
36
|
+
// verb the user wrote (e.g. "verbs.human.rephrase") rather than the parent
|
|
37
|
+
// record.
|
|
38
|
+
function assertNoBuiltinVerbRedefinition(config) {
|
|
39
|
+
const human = config.verbs?.human;
|
|
40
|
+
if (human) {
|
|
41
|
+
for (const name of Object.keys(human)) {
|
|
42
|
+
if (BUILTIN_HUMAN_VERB_NAMES.has(name)) {
|
|
43
|
+
throw new ConfigLoadError(CONFIG_REL, `verbs.human.${name}`, `cannot redefine built-in human verb '${name}'`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const agent = config.verbs?.agent;
|
|
48
|
+
if (agent) {
|
|
49
|
+
for (const name of Object.keys(agent)) {
|
|
50
|
+
if (BUILTIN_AGENT_VERB_NAMES.has(name)) {
|
|
51
|
+
throw new ConfigLoadError(CONFIG_REL, `verbs.agent.${name}`, `cannot redefine built-in agent verb '${name}'`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async function loadOne(absPath, relName, schema) {
|
|
57
|
+
if (!existsSync(absPath))
|
|
58
|
+
return null;
|
|
59
|
+
let raw;
|
|
60
|
+
try {
|
|
61
|
+
raw = await readFile(absPath, "utf8");
|
|
62
|
+
}
|
|
63
|
+
catch (e) {
|
|
64
|
+
// Race: file existed at existsSync, gone (or unreadable) now. Surface as
|
|
65
|
+
// a load error rather than silently treating it as absent.
|
|
66
|
+
throw new ConfigLoadError(relName, "", `failed to read: ${e.message}`);
|
|
67
|
+
}
|
|
68
|
+
let parsed;
|
|
69
|
+
try {
|
|
70
|
+
parsed = JSON.parse(raw);
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
73
|
+
throw new ConfigLoadError(relName, "", `invalid JSON (${e.message})`);
|
|
74
|
+
}
|
|
75
|
+
const result = schema.safeParse(parsed);
|
|
76
|
+
if (!result.success) {
|
|
77
|
+
throw zodToLoadError(relName, result.error);
|
|
78
|
+
}
|
|
79
|
+
return result.data;
|
|
80
|
+
}
|
|
81
|
+
function zodToLoadError(file, err) {
|
|
82
|
+
// Pick the most actionable issue. Zod returns one per offending field; for
|
|
83
|
+
// strict-mode unknown keys it returns `unrecognized_keys` with `keys` on
|
|
84
|
+
// the issue. Surface the first one with a normalized path.
|
|
85
|
+
const issue = err.issues[0];
|
|
86
|
+
if (!issue)
|
|
87
|
+
return new ConfigLoadError(file, "", err.message);
|
|
88
|
+
let path = issue.path.map((p) => String(p)).join(".");
|
|
89
|
+
let reason = issue.message;
|
|
90
|
+
if (issue.code === "unrecognized_keys") {
|
|
91
|
+
const keys = issue.keys ?? [];
|
|
92
|
+
if (keys.length > 0) {
|
|
93
|
+
// Surface the offending key in the dotted path so error messages name
|
|
94
|
+
// the field the user actually wrote.
|
|
95
|
+
path = path ? `${path}.${keys[0]}` : keys[0];
|
|
96
|
+
reason = `unknown key '${keys[0]}'`;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (issue.code === "invalid_value" && path === "version") {
|
|
100
|
+
// Zod literal mismatch is the V2 migration hook; the default message
|
|
101
|
+
// ("Invalid input: expected 1") reads poorly. Override.
|
|
102
|
+
reason = "version must be 1 (V2 migration hook; other values rejected)";
|
|
103
|
+
}
|
|
104
|
+
return new ConfigLoadError(file, path, reason);
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=load.js.map
|