@hienlh/ppm 0.17.16 → 0.17.18
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/CHANGELOG.md +19 -0
- package/assets/skills/ppm/SKILL.md +1 -1
- package/assets/skills/ppm/references/cli-reference.md +4 -4
- package/assets/skills/ppm/references/http-api.md +5 -1
- package/dist/web/assets/{ai-resource-editor-CsossqDO.js → ai-resource-editor-BgWg-ty8.js} +1 -1
- package/dist/web/assets/{angular-html-CkxY2iBQ.js → angular-html-2g8YGiJY.js} +1 -1
- package/dist/web/assets/{angular-ts-BePeGkkC.js → angular-ts-BwSmoLfh.js} +1 -1
- package/dist/web/assets/{api-settings-DAk7D-NP.js → api-settings-BJTjIG4U.js} +1 -1
- package/dist/web/assets/{api-themes-84MT-XqR.js → api-themes-DuLpbQFV.js} +1 -1
- package/dist/web/assets/{apl-DBS7PWvB.js → apl-B44SMKHp.js} +1 -1
- package/dist/web/assets/architecture-PBZL5I3N-gLlhsjM9.js +1 -0
- package/dist/web/assets/{astro-Clbk1k4h.js → astro-E5620wek.js} +1 -1
- package/dist/web/assets/{audio-preview-DIkokvPM.js → audio-preview-CLn1LTxc.js} +1 -1
- package/dist/web/assets/{blade-BeBsBuGS.js → blade-D-VQWAHB.js} +1 -1
- package/dist/web/assets/{bsl-DYigT3JZ.js → bsl-Bq5qFzpU.js} +1 -1
- package/dist/web/assets/{cairo-BjpO78wI.js → cairo-Cn9-ZKRa.js} +1 -1
- package/dist/web/assets/chat-tab-tTUVo4G3.js +13 -0
- package/dist/web/assets/{cobol-CpuUx69s.js → cobol-IM3E3iCH.js} +1 -1
- package/dist/web/assets/code-editor-DMfUjdk5.js +10 -0
- package/dist/web/assets/{coffee-FoFd2Cxo.js → coffee-24wG7ekn.js} +1 -1
- package/dist/web/assets/{conflict-editor-Dqm1bkyL.js → conflict-editor-BosR4PW3.js} +3 -3
- package/dist/web/assets/{cpp-CO_nPfdr.js → cpp-DH9Cqt4g.js} +1 -1
- package/dist/web/assets/{crystal-D-UygAAF.js → crystal-4nZYHhdi.js} +1 -1
- package/dist/web/assets/{csv-preview-CvP4xzug.js → csv-preview-BqszurHp.js} +1 -1
- package/dist/web/assets/data-grid-overlay-editor-DxdOKRAY.js +1 -0
- package/dist/web/assets/data-grid-types-CzEQU9PJ.js +1 -0
- package/dist/web/assets/database-viewer-CiomoOU6.js +1 -0
- package/dist/web/assets/dialog-BpkAWOy8.js +1 -0
- package/dist/web/assets/{diff-viewer-BfWixe_z.js → diff-viewer-aOrOaGWx.js} +1 -1
- package/dist/web/assets/dist-Bn3E6I4R.js +11 -0
- package/dist/web/assets/{docx-preview-CguUoTKe.js → docx-preview-BAzpJdua.js} +1 -1
- package/dist/web/assets/{edge-BSzxzX11.js → edge-DTI9d2Qi.js} +1 -1
- package/dist/web/assets/{elixir-DH1-Mrep.js → elixir-Ys0wioho.js} +1 -1
- package/dist/web/assets/{elm-B0ln5J70.js → elm-Cihc9TAz.js} +1 -1
- package/dist/web/assets/{erb-GIz6NnlZ.js → erb-BwYBWK2-.js} +1 -1
- package/dist/web/assets/{erlang-B8MgYhib.js → erlang-CzlD_Joo.js} +1 -1
- package/dist/web/assets/esm-JLkfN0k-.js +2 -0
- package/dist/web/assets/{extension-webview-DTpFt1eL.js → extension-webview-CKUUvgOr.js} +1 -1
- package/dist/web/assets/{fortran-fixed-form-D_-TrK6U.js → fortran-fixed-form-CT90EtSp.js} +1 -1
- package/dist/web/assets/{fsharp-C9cLCk2b.js → fsharp-LasxezlU.js} +1 -1
- package/dist/web/assets/{gdresource-CsZ3lXwY.js → gdresource-XqgPdfiE.js} +1 -1
- package/dist/web/assets/{git-commit-xmq0KqrA.js → git-commit-CZBgPolw.js} +1 -1
- package/dist/web/assets/{git-log-panel-DUX7N5tN.js → git-log-panel-B6GFWhj4.js} +1 -1
- package/dist/web/assets/{git-rebase-D3O-jsSX.js → git-rebase-C2VzKDB1.js} +1 -1
- package/dist/web/assets/gitGraph-HDMCJU4V-BKGq--Jw.js +1 -0
- package/dist/web/assets/glide-data-grid-z9FPvRBG.js +138 -0
- package/dist/web/assets/{glimmer-js-g74gESrC.js → glimmer-js-DfjWcOLD.js} +1 -1
- package/dist/web/assets/{glimmer-ts-DF4aDWHT.js → glimmer-ts-DBldQATc.js} +1 -1
- package/dist/web/assets/{glsl-D5LmfW7l.js → glsl-CzNv1NPP.js} +1 -1
- package/dist/web/assets/{graphql-_KI4RuXL.js → graphql-DDyLtQb4.js} +1 -1
- package/dist/web/assets/group-chat-tab-Bu31mwmF.js +1 -0
- package/dist/web/assets/{hack-B1NaTC39.js → hack-CtoYNYkC.js} +1 -1
- package/dist/web/assets/{haml-DDFXadZ4.js → haml-CnBVap7G.js} +1 -1
- package/dist/web/assets/{handlebars-Bp-Jq3K9.js → handlebars-Dg51esUH.js} +1 -1
- package/dist/web/assets/{html-DyB9_5Tj.js → html-Ec2_evSy.js} +1 -1
- package/dist/web/assets/{html-derivative-CC60wi-3.js → html-derivative-Cy-F7ZqL.js} +1 -1
- package/dist/web/assets/{http-C-9qngH4.js → http-C236v8Tg.js} +1 -1
- package/dist/web/assets/{hurl-BtxgpNDs.js → hurl-0rMD2gPU.js} +1 -1
- package/dist/web/assets/{hxml-DOoOS9op.js → hxml-e5uS5jTD.js} +1 -1
- package/dist/web/assets/{image-preview-CZg6FQ3w.js → image-preview-CaX4gpN6.js} +1 -1
- package/dist/web/assets/index-4M24PSHW.js +50 -0
- package/dist/web/assets/index-BYFXiFsa.css +2 -0
- package/dist/web/assets/info-3K5VOQVL-BOhGriBF.js +1 -0
- package/dist/web/assets/{jinja-cN-150ao.js → jinja-DybFmhfq.js} +1 -1
- package/dist/web/assets/{jison-CqjsqPq5.js → jison-hkHbixdZ.js} +1 -1
- package/dist/web/assets/{julia-C-I5m8W4.js → julia-QnxY6sRE.js} +1 -1
- package/dist/web/assets/{just-CgsSW9zs.js → just-1Rs-nm8g.js} +1 -1
- package/dist/web/assets/keybindings-store-Cv-U85V6.js +1 -0
- package/dist/web/assets/{latex-BFzR9N2d.js → latex-jEBQqA7u.js} +1 -1
- package/dist/web/assets/{liquid-BWfr-_iC.js → liquid-DfJaZpxG.js} +1 -1
- package/dist/web/assets/{lua-DsXVun6g.js → lua-ti0Jr6-C.js} +1 -1
- package/dist/web/assets/{markdown-renderer-CiQkvWP_.js → markdown-renderer-BNXJygz9.js} +3 -3
- package/dist/web/assets/markdown-renderer-DCsEEdo7.js +1 -0
- package/dist/web/assets/{marko-DWBbo09n.js → marko-DNj4AhPg.js} +1 -1
- package/dist/web/assets/{mdc-CUMe9LOG.js → mdc-DPFwQFe4.js} +1 -1
- package/dist/web/assets/mobile-bottom-sheet--5_YEewV.js +1 -0
- package/dist/web/assets/{nextflow-CoYbADOm.js → nextflow-BUrFV5aB.js} +1 -1
- package/dist/web/assets/{nginx-z-JRZREw.js → nginx-BrW9NdOb.js} +1 -1
- package/dist/web/assets/{nim-Ci4LHyBm.js → nim-DS_6PF2p.js} +1 -1
- package/dist/web/assets/notification-store-DADt1gJH.js +1 -0
- package/dist/web/assets/{number-overlay-editor-lnnuUpPI.js → number-overlay-editor-CReXWiQ1.js} +1 -1
- package/dist/web/assets/packet-RMMSAZCW-CdLFnL8a.js +1 -0
- package/dist/web/assets/{panel-store-D6RV_ztx.js → panel-store-DnbT1c8L.js} +1 -1
- package/dist/web/assets/{pdf-preview-B6ZqANpw.js → pdf-preview-DZzbm9A4.js} +1 -1
- package/dist/web/assets/{perl-pbDimKOO.js → perl-ytm9vKO_.js} +1 -1
- package/dist/web/assets/{php-B003E5v7.js → php-DWTD1Usw.js} +1 -1
- package/dist/web/assets/pie-UPGHQEXC-COC-h0zz.js +1 -0
- package/dist/web/assets/{trash-2-CbbD5QF1.js → plus-DcuJuDC3.js} +1 -1
- package/dist/web/assets/postgres-viewer-BxpeiVkt.js +3 -0
- package/dist/web/assets/{project-store-Cekcjcom.js → project-store-Sbnqc41N.js} +1 -1
- package/dist/web/assets/{pug-AoueAWJo.js → pug-Bt7KL3_r.js} +1 -1
- package/dist/web/assets/{qml-CepxioQA.js → qml-Dexdon5J.js} +1 -1
- package/dist/web/assets/radar-KQ55EAFF-CiCfdJNL.js +1 -0
- package/dist/web/assets/{razor-lIvU-Gu-.js → razor-DnYCSl0G.js} +1 -1
- package/dist/web/assets/{rst-Dn-dwElE.js → rst-BEFYzwF8.js} +1 -1
- package/dist/web/assets/{ruby-DmsD1Iz5.js → ruby-BPaXFEjN.js} +1 -1
- package/dist/web/assets/{sas-6IM2P4YP.js → sas-CywiNBp8.js} +1 -1
- package/dist/web/assets/{scss-RgYEZQqh.js → scss-CGk0L6hN.js} +1 -1
- package/dist/web/assets/{settings-store-BkSf4SPQ.js → settings-store-DkRZhj-g.js} +2 -2
- package/dist/web/assets/settings-tab-DJOhpW09.js +1 -0
- package/dist/web/assets/{shaderlab-B0MNEwt4.js → shaderlab-Byjk0kH7.js} +1 -1
- package/dist/web/assets/{shellsession-F8S4LrQI.js → shellsession-DbA70QB6.js} +1 -1
- package/dist/web/assets/{soy-DDlMbX7u.js → soy-Bm97kWiA.js} +1 -1
- package/dist/web/assets/sparkles-B3DmG8PJ.js +1 -0
- package/dist/web/assets/{sparql-kthmGAAe.js → sparql-CawLnniT.js} +1 -1
- package/dist/web/assets/{sql-query-editor-BYNM0RRl.js → sql-query-editor-9TwIPvRj.js} +1 -1
- package/dist/web/assets/sqlite-viewer-D-3i_x28.js +1 -0
- package/dist/web/assets/{stata-Tfbew8La.js → stata-RifEDtNO.js} +1 -1
- package/dist/web/assets/{surrealql-C0LIGqRx.js → surrealql-DGRQa5Lm.js} +1 -1
- package/dist/web/assets/{svelte-CfTy8CGF.js → svelte-w9Hb12aM.js} +1 -1
- package/dist/web/assets/system-monitor-tab-CuVVp2wt.js +1 -0
- package/dist/web/assets/{tab-store-CcLQfu8H.js → tab-store-vn0viMOP.js} +1 -1
- package/dist/web/assets/{templ-V5H1Sbfy.js → templ-BpUwjJXV.js} +1 -1
- package/dist/web/assets/{terminal-tab-CK3lX-0Y.js → terminal-tab-DrSqSrdX.js} +2 -2
- package/dist/web/assets/{tex-C3H3uMZf.js → tex-DJFSsuTD.js} +1 -1
- package/dist/web/assets/tool-cards-CtE_JnF-.js +7 -0
- package/dist/web/assets/treemap-KZPCXAKY-CZwuSCtA.js +1 -0
- package/dist/web/assets/{ts-tags-7AXgG5YS.js → ts-tags-vp9Qvx2O.js} +1 -1
- package/dist/web/assets/{twig-BSyS38T3.js → twig-CoazxjRB.js} +1 -1
- package/dist/web/assets/{use-blob-url-CpyRr7Cx.js → use-blob-url-DdXgVqfz.js} +1 -1
- package/dist/web/assets/use-is-mobile-CE6AamG6.js +1 -0
- package/dist/web/assets/{use-monaco-theme-Jj2OxkAE.js → use-monaco-theme-BvzqffqR.js} +1 -1
- package/dist/web/assets/{vendor-mermaid-DGOXKrJC.js → vendor-mermaid-DPpYkrMf.js} +193 -193
- package/dist/web/assets/{video-preview-BOHxkwKG.js → video-preview-DxdyVATR.js} +1 -1
- package/dist/web/assets/{vue-C4d_br9u.js → vue-CnshsiXd.js} +1 -1
- package/dist/web/assets/{vue-html-CGdoz4vW.js → vue-html-CZshynFp.js} +1 -1
- package/dist/web/assets/{vue-vine-CqNolQlN.js → vue-vine-C5gtp_T1.js} +1 -1
- package/dist/web/assets/{xml-UmCmu-Od.js → xml-BEGJasgj.js} +1 -1
- package/dist/web/assets/{xsl-DJG6USGh.js → xsl-DXpRLjYk.js} +1 -1
- package/dist/web/index.html +22 -20
- package/dist/web/monacoeditorwork/css.worker.bundle.js +122 -122
- package/dist/web/monacoeditorwork/editor.worker.bundle.js +78 -78
- package/dist/web/monacoeditorwork/html.worker.bundle.js +110 -110
- package/dist/web/monacoeditorwork/json.worker.bundle.js +108 -108
- package/dist/web/monacoeditorwork/ts.worker.bundle.js +81 -81
- package/dist/web/sw.js +1 -1
- package/docs/journal/binary-self-upgrade-260724.md +66 -0
- package/nul/docs/claude-agent-sdk-reference.md +780 -0
- package/nul/docs/code-standards.md +1080 -0
- package/nul/docs/codebase-summary.md +916 -0
- package/nul/docs/deployment-guide.md +702 -0
- package/nul/docs/design-guidelines.md +767 -0
- package/nul/docs/extension-development-guide.md +629 -0
- package/nul/docs/journals/260414-1400-ext-git-graph-port-complete.md +147 -0
- package/nul/docs/journals/260414-1452-git-graph-faithful-port.md +144 -0
- package/nul/docs/journals/260414-1810-git-graph-ui-improvements-complete.md +261 -0
- package/nul/docs/journals/260414-2001-bundled-extensions.md +219 -0
- package/nul/docs/journals/260415-frontend-memory-optimization.md +73 -0
- package/nul/docs/lessons-learned.md +70 -0
- package/nul/docs/project-changelog.md +574 -0
- package/nul/docs/project-overview-pdr.md +205 -0
- package/nul/docs/project-roadmap.md +222 -0
- package/nul/docs/system-architecture.md +1961 -0
- package/package.json +1 -1
- package/packages/vscode-compat/node_modules/.bin/tsc.bunx +0 -0
- package/packages/vscode-compat/node_modules/.bin/tsc.exe +0 -0
- package/packages/vscode-compat/node_modules/.bin/tsserver.bunx +0 -0
- package/packages/vscode-compat/node_modules/.bin/tsserver.exe +0 -0
- package/spike-group-channel.mjs +156 -0
- package/spike-group-chat.mjs +181 -0
- package/src/server/routes/group-chat.ts +118 -9
- package/src/services/group-chat/agent-runner.ts +15 -2
- package/src/services/group-chat/context-window.ts +15 -0
- package/src/services/group-chat/group-chat.service.ts +178 -79
- package/src/services/group-chat/group-chat.store.ts +30 -0
- package/src/services/group-chat/responder-router.ts +110 -0
- package/src/services/group-chat/transcript-archive.ts +18 -0
- package/src/services/group-chat/turn-engine.ts +183 -105
- package/src/services/jsonl-transcript-parser.ts +36 -0
- package/src/types/group-chat-ws.ts +2 -2
- package/src/types/group-chat.ts +33 -4
- package/src/web/components/group-chat/group-chat-tab.tsx +109 -14
- package/src/web/components/group-chat/group-create-dialog.tsx +10 -3
- package/src/web/components/group-chat/group-full-transcript-view.tsx +9 -8
- package/src/web/components/group-chat/group-member-edit-dialog.tsx +108 -0
- package/src/web/components/group-chat/group-member-roster.tsx +51 -23
- package/src/web/components/group-chat/group-message-item.tsx +45 -26
- package/src/web/components/group-chat/group-transcript-messages.tsx +126 -0
- package/src/web/components/layout/cloud-share-popover.tsx +10 -2
- package/src/web/components/layout/mobile-drawer-tab-bar.tsx +10 -0
- package/src/web/components/layout/mobile-drawer.tsx +26 -9
- package/src/web/components/layout/nav-section-rail.tsx +8 -2
- package/src/web/components/layout/upgrade-button.tsx +33 -11
- package/src/web/hooks/use-group-chat.ts +8 -1
- package/src/web/lib/api-group-chat.ts +47 -4
- package/src/web/lib/sidebar-tabs/tab-registry.ts +3 -1
- package/dist/web/assets/architecture-PBZL5I3N-NAS99xy0.js +0 -1
- package/dist/web/assets/chat-tab-Bh6l253v.js +0 -18
- package/dist/web/assets/click-outside-container-DXZVmhaX.js +0 -1
- package/dist/web/assets/code-editor-B7F-d4DK.js +0 -10
- package/dist/web/assets/data-grid-overlay-editor-CUlFsD-D.js +0 -1
- package/dist/web/assets/database-viewer-5oNTPgjF.js +0 -1
- package/dist/web/assets/dist-BsziT-tR.js +0 -11
- package/dist/web/assets/esm-CjVeOTNQ.js +0 -2
- package/dist/web/assets/gitGraph-HDMCJU4V-B4I3L4Sf.js +0 -1
- package/dist/web/assets/glide-data-grid-7vB1SNne.js +0 -138
- package/dist/web/assets/group-chat-tab-CNECY-zg.js +0 -1
- package/dist/web/assets/index-D2G6kmTs.js +0 -50
- package/dist/web/assets/index-DCmrZnq0.css +0 -2
- package/dist/web/assets/info-3K5VOQVL-CBbbOe3C.js +0 -1
- package/dist/web/assets/input-24Nf_edC.js +0 -1
- package/dist/web/assets/keybindings-store-D8Cppv4w.js +0 -1
- package/dist/web/assets/notification-store-DOGxkWih.js +0 -1
- package/dist/web/assets/packet-RMMSAZCW-fr8-QSTF.js +0 -1
- package/dist/web/assets/pie-UPGHQEXC-Biu7_Pbb.js +0 -1
- package/dist/web/assets/postgres-viewer-B23xTCSs.js +0 -3
- package/dist/web/assets/radar-KQ55EAFF-CMtNRpK6.js +0 -1
- package/dist/web/assets/settings-tab-D5hAA1bY.js +0 -1
- package/dist/web/assets/sparkles-2ii4lR7b.js +0 -1
- package/dist/web/assets/sqlite-viewer-DW9f2Hqj.js +0 -1
- package/dist/web/assets/system-monitor-tab-B5f4pgdX.js +0 -1
- package/dist/web/assets/treemap-KZPCXAKY-ZYVFjoaN.js +0 -1
- package/dist/web/assets/use-websocket-DrDBgIWU.js +0 -1
- /package/dist/web/assets/{abap-BZ3J5hF3.js → abap-wT6fgqwv.js} +0 -0
- /package/dist/web/assets/{actionscript-3-CkyGfT-8.js → actionscript-3-CqcHpPYj.js} +0 -0
- /package/dist/web/assets/{ada-CxNLBoe7.js → ada-DWE3Hn4E.js} +0 -0
- /package/dist/web/assets/{andromeeda-BPN5rsDz.js → andromeeda-DpQ-y-Jt.js} +0 -0
- /package/dist/web/assets/{apache-C1F5wHL6.js → apache-LRTUP4r3.js} +0 -0
- /package/dist/web/assets/{apex-BaNixdO-.js → apex-DwVeH5_h.js} +0 -0
- /package/dist/web/assets/{api-client-Dvzcc_EO.js → api-client-BK4NPNoY.js} +0 -0
- /package/dist/web/assets/{applescript-Cl_pdcch.js → applescript-DyQiO9JU.js} +0 -0
- /package/dist/web/assets/{apply-theme-ORrEdHKT.js → apply-theme-DxKsrDLA.js} +0 -0
- /package/dist/web/assets/{ara-B6UAE7M2.js → ara-Cf-OWd2S.js} +0 -0
- /package/dist/web/assets/{asciidoc-D9c9Twki.js → asciidoc-gocbKcVK.js} +0 -0
- /package/dist/web/assets/{asm-CNmtv7Y9.js → asm-C3meb5HY.js} +0 -0
- /package/dist/web/assets/{aurora-x-C9z-NyzR.js → aurora-x-BYcXaCIg.js} +0 -0
- /package/dist/web/assets/{awk-BfLHEnKa.js → awk-BcT6nIdN.js} +0 -0
- /package/dist/web/assets/{ayu-dark-Bn7trkt_.js → ayu-dark-CLZPoccg.js} +0 -0
- /package/dist/web/assets/{ayu-light-Dpya9hPf.js → ayu-light-CTyRQdS2.js} +0 -0
- /package/dist/web/assets/{ayu-mirage-Cc0jfABD.js → ayu-mirage-DjqfqZdo.js} +0 -0
- /package/dist/web/assets/{ballerina-BtiCmN7T.js → ballerina-BCARR-zK.js} +0 -0
- /package/dist/web/assets/{bat-tmFM76zR.js → bat-_yaRjWOb.js} +0 -0
- /package/dist/web/assets/{beancount-BjPqRrcH.js → beancount-BPESBMS9.js} +0 -0
- /package/dist/web/assets/{berry-D0SQBxN2.js → berry-BSLE-Sf8.js} +0 -0
- /package/dist/web/assets/{bibtex-CkjRWQKr.js → bibtex-CvUWWCVx.js} +0 -0
- /package/dist/web/assets/{bicep-Bhq28Cxc.js → bicep--vcqqALZ.js} +0 -0
- /package/dist/web/assets/{bird2-DFGInYb3.js → bird2-Clclqgh6.js} +0 -0
- /package/dist/web/assets/{c-CP8cB4k_.js → c-CSC2LwTp.js} +0 -0
- /package/dist/web/assets/{c3-oRytyeWo.js → c3-Cl1_jUnm.js} +0 -0
- /package/dist/web/assets/{cadence-Inf1rGb7.js → cadence-BwAD7vSC.js} +0 -0
- /package/dist/web/assets/{catppuccin-frappe-DAzribQo.js → catppuccin-frappe-hr0HKoFX.js} +0 -0
- /package/dist/web/assets/{catppuccin-latte-B6Y_mCCQ.js → catppuccin-latte-DXEIYlFO.js} +0 -0
- /package/dist/web/assets/{catppuccin-macchiato-COLbYqVL.js → catppuccin-macchiato-B2zST7sA.js} +0 -0
- /package/dist/web/assets/{catppuccin-mocha-DKWaML1B.js → catppuccin-mocha-CvrdnYv9.js} +0 -0
- /package/dist/web/assets/{chevron-right-BBc6ATtm.js → chevron-right-DeUue2aK.js} +0 -0
- /package/dist/web/assets/{circle-question-mark-CveWaCux.js → circle-question-mark-PaJgx-3d.js} +0 -0
- /package/dist/web/assets/{clarity-_ZLLrrsX.js → clarity-BeQd5TQD.js} +0 -0
- /package/dist/web/assets/{clojure-DWGVCg_P.js → clojure-Csdo0vb_.js} +0 -0
- /package/dist/web/assets/{cmake-Cwh3mug7.js → cmake-Cf0q7ddg.js} +0 -0
- /package/dist/web/assets/{code-7ZAlTvsm.js → code-TekEnDFM.js} +0 -0
- /package/dist/web/assets/{codeowners-BdV6CFYi.js → codeowners-CUEzlC7R.js} +0 -0
- /package/dist/web/assets/{codeql-NvupDIDf.js → codeql-DxHyogQt.js} +0 -0
- /package/dist/web/assets/{common-lisp-B-vtBh5k.js → common-lisp-WLb-tAda.js} +0 -0
- /package/dist/web/assets/{coq-M8-FTfiZ.js → coq-DFtMD6Wn.js} +0 -0
- /package/dist/web/assets/{csharp-B7Ugdtd-.js → csharp-DEnvXVjs.js} +0 -0
- /package/dist/web/assets/{css-86k3Z-YA.js → css-DMPpCfkZ.js} +0 -0
- /package/dist/web/assets/{csv-BX5XYhfH.js → csv-DTSgNSaP.js} +0 -0
- /package/dist/web/assets/{csv-parser-d56Fzpwc.js → csv-parser-B_xNn07y.js} +0 -0
- /package/dist/web/assets/{cue-B7099gQa.js → cue-BEmVIZmd.js} +0 -0
- /package/dist/web/assets/{cypher-D99mWVIu.js → cypher-CncQVhvU.js} +0 -0
- /package/dist/web/assets/{d-CFE8oQwh.js → d-BzUSBVex.js} +0 -0
- /package/dist/web/assets/{dark-plus-BEeeDwdg.js → dark-plus-mysFNRq2.js} +0 -0
- /package/dist/web/assets/{dart-HVSWGnI5.js → dart-BBu3nkcE.js} +0 -0
- /package/dist/web/assets/{database-BLht7BVM.js → database-COYAMZaw.js} +0 -0
- /package/dist/web/assets/{dax-DjDgSJkh.js → dax-DcLVz9_9.js} +0 -0
- /package/dist/web/assets/{desktop-B5A3i7J1.js → desktop-DS2PdvoU.js} +0 -0
- /package/dist/web/assets/{diff-CpTrlaE9.js → diff-aUYk5Qys.js} +0 -0
- /package/dist/web/assets/{dist-BSCgJs-V.js → dist-Dxl3dqhC.js} +0 -0
- /package/dist/web/assets/{docker-xBhmJeHj.js → docker-12Lj1QUD.js} +0 -0
- /package/dist/web/assets/{dotenv-DKKhLEv5.js → dotenv-D-P4bzvl.js} +0 -0
- /package/dist/web/assets/{dracula-CVwQuzra.js → dracula-C-eRNn4o.js} +0 -0
- /package/dist/web/assets/{dracula-soft-CG6mB-lf.js → dracula-soft-CBB1BI7O.js} +0 -0
- /package/dist/web/assets/{dream-maker-SC-IdYY3.js → dream-maker-C_j5A0r7.js} +0 -0
- /package/dist/web/assets/{edit-diff-preview-C50i1H63.js → edit-diff-preview-CRMu-6r1.js} +0 -0
- /package/dist/web/assets/{emacs-lisp-CIBFq6W8.js → emacs-lisp-W54LT7rh.js} +0 -0
- /package/dist/web/assets/{everforest-dark-odRT_lec.js → everforest-dark-B_ISUDeh.js} +0 -0
- /package/dist/web/assets/{everforest-light-or1Voqjl.js → everforest-light-CNUYa354.js} +0 -0
- /package/dist/web/assets/{fennel-tQd1z3iu.js → fennel-DK82-oso.js} +0 -0
- /package/dist/web/assets/{file-exclamation-point-C-lL0g_E.js → file-exclamation-point-DBEC-Kst.js} +0 -0
- /package/dist/web/assets/{fish-DSuZQG0k.js → fish-CbJVJzQj.js} +0 -0
- /package/dist/web/assets/{fluent-D7xI8a8e.js → fluent-Cug5cOL1.js} +0 -0
- /package/dist/web/assets/{fortran-free-form-BlAtcPd3.js → fortran-free-form-amHz32Zw.js} +0 -0
- /package/dist/web/assets/{gdscript-VsEQXBPm.js → gdscript-t_G6VYpv.js} +0 -0
- /package/dist/web/assets/{gdshader-iqHMOdwW.js → gdshader-DqZaHh4E.js} +0 -0
- /package/dist/web/assets/{genie-C4XU4g1a.js → genie-CIJtFlZK.js} +0 -0
- /package/dist/web/assets/{gherkin-C4nfQzAB.js → gherkin-CalidqLY.js} +0 -0
- /package/dist/web/assets/{github-dark-B_pbG3CC.js → github-dark-BG2xX0wa.js} +0 -0
- /package/dist/web/assets/{github-dark-default-kFbx7C95.js → github-dark-default-tDp_EOBs.js} +0 -0
- /package/dist/web/assets/{github-dark-dimmed-CpVfQEqs.js → github-dark-dimmed-DlSfPwW2.js} +0 -0
- /package/dist/web/assets/{github-dark-high-contrast-DYKqQwZh.js → github-dark-high-contrast-qZM7j5KB.js} +0 -0
- /package/dist/web/assets/{github-light-gEYBmKaj.js → github-light-CnvWTiyb.js} +0 -0
- /package/dist/web/assets/{github-light-default-DVHfMPQ2.js → github-light-default-Dy6OAt2Q.js} +0 -0
- /package/dist/web/assets/{github-light-high-contrast-ClVJDu-q.js → github-light-high-contrast-1BHQCOPl.js} +0 -0
- /package/dist/web/assets/{gleam-BLaPu7ft.js → gleam-D-2cpXVX.js} +0 -0
- /package/dist/web/assets/{gn-BKgerUyI.js → gn-C1cC4xLc.js} +0 -0
- /package/dist/web/assets/{gnuplot-cqJuEFb-.js → gnuplot-2Gp459mV.js} +0 -0
- /package/dist/web/assets/{go-B2EHdyD8.js → go-BA1q0q8h.js} +0 -0
- /package/dist/web/assets/{groovy-DdImoj8s.js → groovy-BlIa-VfI.js} +0 -0
- /package/dist/web/assets/{gruvbox-dark-hard-DlwstAds.js → gruvbox-dark-hard-BMIwVwaJ.js} +0 -0
- /package/dist/web/assets/{gruvbox-dark-medium-CiYEd1vd.js → gruvbox-dark-medium-DxfuBW3n.js} +0 -0
- /package/dist/web/assets/{gruvbox-dark-soft-C-wEa4h4.js → gruvbox-dark-soft-_NSslDDi.js} +0 -0
- /package/dist/web/assets/{gruvbox-light-hard-BqYmfna-.js → gruvbox-light-hard-CP5MIsL9.js} +0 -0
- /package/dist/web/assets/{gruvbox-light-medium-CxmfalT2.js → gruvbox-light-medium-BTMursH0.js} +0 -0
- /package/dist/web/assets/{gruvbox-light-soft-DGWXXMCB.js → gruvbox-light-soft-Bv6zFoVX.js} +0 -0
- /package/dist/web/assets/{haskell-H_C_IuVb.js → haskell-Da8UeSv-.js} +0 -0
- /package/dist/web/assets/{haxe-CGNSMpeZ.js → haxe-mcKlcxBa.js} +0 -0
- /package/dist/web/assets/{hcl-B7bSTSQf.js → hcl-BdZcx5JX.js} +0 -0
- /package/dist/web/assets/{hjson-DlJ-glQZ.js → hjson-pFXYbN4t.js} +0 -0
- /package/dist/web/assets/{hlsl-CehW5SJN.js → hlsl-Z0II0KR8.js} +0 -0
- /package/dist/web/assets/{horizon-Beabcz2d.js → horizon-CufN8DyP.js} +0 -0
- /package/dist/web/assets/{horizon-bright-BC87RXPa.js → horizon-bright-5qoQVyIY.js} +0 -0
- /package/dist/web/assets/{houston-Da7RFwUy.js → houston-DOFkQwep.js} +0 -0
- /package/dist/web/assets/{hy-m1H70w19.js → hy-BVbDMDcG.js} +0 -0
- /package/dist/web/assets/{imba-MExFsdAA.js → imba-DRM6LLS5.js} +0 -0
- /package/dist/web/assets/{ini-CJy_zmwy.js → ini-2KCnNvmz.js} +0 -0
- /package/dist/web/assets/{java-DqDFvJBH.js → java-BmvH-Ou1.js} +0 -0
- /package/dist/web/assets/{javascript-C3Wyv22X.js → javascript-B7VhU1Yc.js} +0 -0
- /package/dist/web/assets/{json-DnGBw_DZ.js → json-X1pNk0n7.js} +0 -0
- /package/dist/web/assets/{json5-CRN-zoN4.js → json5-CJeEJPTg.js} +0 -0
- /package/dist/web/assets/{jsonc-CKRUZNRo.js → jsonc-C1haTBsf.js} +0 -0
- /package/dist/web/assets/{jsonl-CGfD6FrH.js → jsonl-wQ8-AJgs.js} +0 -0
- /package/dist/web/assets/{jsonnet-nbFuDj0o.js → jsonnet-BrEjY3Xh.js} +0 -0
- /package/dist/web/assets/{jssm-D0ShzIqD.js → jssm-C6LgYbOs.js} +0 -0
- /package/dist/web/assets/{jsx-D27hbRbs.js → jsx-B2cfD_Fb.js} +0 -0
- /package/dist/web/assets/{kanagawa-dragon-Ov3f8K0T.js → kanagawa-dragon-6UCcJpLw.js} +0 -0
- /package/dist/web/assets/{kanagawa-lotus-CLyOqh-g.js → kanagawa-lotus-DOmfpsRg.js} +0 -0
- /package/dist/web/assets/{kanagawa-wave-Kj3dzabH.js → kanagawa-wave-CpxmPE7N.js} +0 -0
- /package/dist/web/assets/{kdl-DFF58Gu4.js → kdl-BrLEivmb.js} +0 -0
- /package/dist/web/assets/{kotlin-BM4PKaB4.js → kotlin-BO2FUnDB.js} +0 -0
- /package/dist/web/assets/{kusto-DrvHLCv5.js → kusto-Cev1yiq9.js} +0 -0
- /package/dist/web/assets/{laserwave-Db6i6ZkO.js → laserwave-BlEkf-eH.js} +0 -0
- /package/dist/web/assets/{lean-D0hEjzwk.js → lean-BLS3Xk2w.js} +0 -0
- /package/dist/web/assets/{less-BEj4npGG.js → less-BXmcsqcq.js} +0 -0
- /package/dist/web/assets/{lib-CBdlQ75W.js → lib-CxSBdrd7.js} +0 -0
- /package/dist/web/assets/{light-plus-DLIIbDea.js → light-plus-DS6zriYl.js} +0 -0
- /package/dist/web/assets/{llvm-DMt6umsO.js → llvm-C_wLnJgX.js} +0 -0
- /package/dist/web/assets/{log-BopvdtPW.js → log-Cg8pvmWi.js} +0 -0
- /package/dist/web/assets/{logo-CYSUFPFR.js → logo-C9-kEvPW.js} +0 -0
- /package/dist/web/assets/{luau-XC611HNO.js → luau-NwaGugfZ.js} +0 -0
- /package/dist/web/assets/{make-BMYZIfBj.js → make-DBpJE-Z8.js} +0 -0
- /package/dist/web/assets/{markdown-BLza5nvF.js → markdown-B7ZTAu7B.js} +0 -0
- /package/dist/web/assets/{material-theme-Uw27UfJW.js → material-theme-BsXH-Mss.js} +0 -0
- /package/dist/web/assets/{material-theme-darker-dfqt8XBY.js → material-theme-darker-CW9OlIeY.js} +0 -0
- /package/dist/web/assets/{material-theme-lighter-CPtBTblV.js → material-theme-lighter-D2PAh0Kw.js} +0 -0
- /package/dist/web/assets/{material-theme-ocean-BfZgVqC-.js → material-theme-ocean-Vz6DBVi3.js} +0 -0
- /package/dist/web/assets/{material-theme-palenight-DAZoVYg8.js → material-theme-palenight-D-GleP3G.js} +0 -0
- /package/dist/web/assets/{matlab-cSzmquiW.js → matlab-C7MYlMSn.js} +0 -0
- /package/dist/web/assets/{mdx-Dq0kW5VM.js → mdx-FkOOX3Dq.js} +0 -0
- /package/dist/web/assets/{mermaid-DoIKF0yS.js → mermaid-C_9qw5it.js} +0 -0
- /package/dist/web/assets/{min-dark-DyraimDU.js → min-dark-BowNvxk2.js} +0 -0
- /package/dist/web/assets/{min-light-Co9cbcUv.js → min-light-x8oWUmbL.js} +0 -0
- /package/dist/web/assets/{mipsasm-ph6cKgHn.js → mipsasm-Dmi1AZOT.js} +0 -0
- /package/dist/web/assets/{mojo-BBT0XwmY.js → mojo-C6z7mry2.js} +0 -0
- /package/dist/web/assets/{monokai-IP0T5Rtg.js → monokai-BQ4e_Hn0.js} +0 -0
- /package/dist/web/assets/{moonbit-B8cogNXl.js → moonbit-CEeNIoB4.js} +0 -0
- /package/dist/web/assets/{move-DkY26NtM.js → move-bALfKUa7.js} +0 -0
- /package/dist/web/assets/{narrat-rBs3byG0.js → narrat-DX4JlAWT.js} +0 -0
- /package/dist/web/assets/{nextflow-groovy-DkO9wMLP.js → nextflow-groovy-CKQWtRkO.js} +0 -0
- /package/dist/web/assets/{night-owl-jVR4lFji.js → night-owl-D4PQd726.js} +0 -0
- /package/dist/web/assets/{night-owl-light-fBYJ7s3U.js → night-owl-light-BQo_YHll.js} +0 -0
- /package/dist/web/assets/{nix-WX9oavu6.js → nix-B1jThkGj.js} +0 -0
- /package/dist/web/assets/{nord-Cf7G21Pu.js → nord-35quHUKo.js} +0 -0
- /package/dist/web/assets/{nushell-DQdzcJ1H.js → nushell-L6DbJTuL.js} +0 -0
- /package/dist/web/assets/{objective-c-JSO2uvZ-.js → objective-c-CTZ4bR2U.js} +0 -0
- /package/dist/web/assets/{objective-cpp-CZMGJ9Fb.js → objective-cpp-Dm1YDIdA.js} +0 -0
- /package/dist/web/assets/{ocaml-C4S4NSDo.js → ocaml-B3n__LGy.js} +0 -0
- /package/dist/web/assets/{odin-Y2jXCgVq.js → odin-DmqZ8n3i.js} +0 -0
- /package/dist/web/assets/{one-dark-pro-dVIxuoJY.js → one-dark-pro-16_UaUig.js} +0 -0
- /package/dist/web/assets/{one-light-BQ1IKfD1.js → one-light-B-GGjWn5.js} +0 -0
- /package/dist/web/assets/{openscad-Bddw4I3z.js → openscad-DTFB9Sj6.js} +0 -0
- /package/dist/web/assets/{pascal-BKVXrzC1.js → pascal-RcT1dQYN.js} +0 -0
- /package/dist/web/assets/{pkl-BTd-YRsO.js → pkl-Dr4yLQ_o.js} +0 -0
- /package/dist/web/assets/{plastic-eiGvBIxV.js → plastic-hp2Nry0R.js} +0 -0
- /package/dist/web/assets/{plsql-C290tieP.js → plsql-pFcO4WZ0.js} +0 -0
- /package/dist/web/assets/{po-DyDwh0tx.js → po-BkZ0_HvY.js} +0 -0
- /package/dist/web/assets/{poimandres-B87zc_g-.js → poimandres-BcTrxj7f.js} +0 -0
- /package/dist/web/assets/{polar-Cdub1YMT.js → polar-DHK3q8FF.js} +0 -0
- /package/dist/web/assets/{postcss-BcI_3K0v.js → postcss-Bv7WzijA.js} +0 -0
- /package/dist/web/assets/{powerquery-OdMrkJSe.js → powerquery-DpaU_hW9.js} +0 -0
- /package/dist/web/assets/{powershell-C8auT6xg.js → powershell-_Rqc0MGP.js} +0 -0
- /package/dist/web/assets/{prisma-DIbVv8PA.js → prisma-wyegE8us.js} +0 -0
- /package/dist/web/assets/{prolog-DbTOH3Ld.js → prolog-DspHCURv.js} +0 -0
- /package/dist/web/assets/{proto-C4Cq2dCD.js → proto-BOBiNGf5.js} +0 -0
- /package/dist/web/assets/{puppet-DJp3uqum.js → puppet-DfLvV8h2.js} +0 -0
- /package/dist/web/assets/{purescript-CLsV4rPU.js → purescript-BY5ZSOZy.js} +0 -0
- /package/dist/web/assets/{python-2gBtEza2.js → python-B758mMeg.js} +0 -0
- /package/dist/web/assets/{qmldir-DfhULcua.js → qmldir-C75bpHvy.js} +0 -0
- /package/dist/web/assets/{qss-DK--VTTV.js → qss-DcLTlbLd.js} +0 -0
- /package/dist/web/assets/{r-BArBO2Sa.js → r-D0G_Y1P5.js} +0 -0
- /package/dist/web/assets/{racket-5mijHsVy.js → racket-DTye_5qn.js} +0 -0
- /package/dist/web/assets/{raku-ir0suElk.js → raku-uJXBXkV0.js} +0 -0
- /package/dist/web/assets/{react-J9g6e3Rq.js → react-CorNPdie.js} +0 -0
- /package/dist/web/assets/{red-DSecpIOT.js → red-rs3HE3re.js} +0 -0
- /package/dist/web/assets/{reg-Dp30FusS.js → reg-DkTIaX7a.js} +0 -0
- /package/dist/web/assets/{regexp-DXJnEM_6.js → regexp-4TLSs4_m.js} +0 -0
- /package/dist/web/assets/{rel-Dr483ozj.js → rel-B0jumCjt.js} +0 -0
- /package/dist/web/assets/{resolve-theme-DJORYzKu.js → resolve-theme-CCoakF2E.js} +0 -0
- /package/dist/web/assets/{riscv-ZfBy5IA1.js → riscv-DtaWMlo0.js} +0 -0
- /package/dist/web/assets/{ron-ZJ_CljGP.js → ron-BCPxwJD6.js} +0 -0
- /package/dist/web/assets/{rose-pine-CcW_eJ6G.js → rose-pine-CNryoqGi.js} +0 -0
- /package/dist/web/assets/{rose-pine-dawn-v2l_UF-j.js → rose-pine-dawn-C-gJOQVP.js} +0 -0
- /package/dist/web/assets/{rose-pine-moon-CNXkwf3D.js → rose-pine-moon-BdXSXpZh.js} +0 -0
- /package/dist/web/assets/{rosmsg-BMYMVW84.js → rosmsg-CPG8X-D5.js} +0 -0
- /package/dist/web/assets/{rust-BR-zJh5q.js → rust-CxfW3ePx.js} +0 -0
- /package/dist/web/assets/{sass-BukPOBFz.js → sass-D-7bxo_L.js} +0 -0
- /package/dist/web/assets/{save-DO5xjW95.js → save-BM4p9_9n.js} +0 -0
- /package/dist/web/assets/{scala-DUFY7D6D.js → scala-DyUsfHNc.js} +0 -0
- /package/dist/web/assets/{scheme-Dl-dNNxQ.js → scheme-ROgrwiO-.js} +0 -0
- /package/dist/web/assets/{sdbl-DdmlQhia.js → sdbl-B1EAQWpp.js} +0 -0
- /package/dist/web/assets/{shellscript-UyhrvGcd.js → shellscript-HhmB_Ufy.js} +0 -0
- /package/dist/web/assets/{shield-check-m2QzZTuZ.js → shield-check-C3qYSU8a.js} +0 -0
- /package/dist/web/assets/{shield-off-DNn7VzJe.js → shield-off-D5tU7gQT.js} +0 -0
- /package/dist/web/assets/{slack-dark-Cv6Szr-q.js → slack-dark-DnmSY72G.js} +0 -0
- /package/dist/web/assets/{slack-ochin-V6Ii3lAm.js → slack-ochin-q97gHjcd.js} +0 -0
- /package/dist/web/assets/{smalltalk-BUCv5G91.js → smalltalk-B-1waXvA.js} +0 -0
- /package/dist/web/assets/{snazzy-light-B67a78qi.js → snazzy-light-C8yWDN2g.js} +0 -0
- /package/dist/web/assets/{solarized-dark-ccWnfYyA.js → solarized-dark-ClVDEMJZ.js} +0 -0
- /package/dist/web/assets/{solarized-light-C3WyRO5I.js → solarized-light-Bts6CUIP.js} +0 -0
- /package/dist/web/assets/{solidity-BFbRPNi_.js → solidity-DYxwp0om.js} +0 -0
- /package/dist/web/assets/{splunk-zdpwCJLE.js → splunk-jK6-Sr06.js} +0 -0
- /package/dist/web/assets/{sql-B2IPUsfz.js → sql-DPpd8aUS.js} +0 -0
- /package/dist/web/assets/{ssh-config-Co4cXifq.js → ssh-config-Bimb9LVr.js} +0 -0
- /package/dist/web/assets/{stylus-CmI75XY8.js → stylus-B2DgJRJw.js} +0 -0
- /package/dist/web/assets/{swift-Dfks9YQI.js → swift-ChEH2nFL.js} +0 -0
- /package/dist/web/assets/{synthwave-84-B3LERzNS.js → synthwave-84-DwSLbgAm.js} +0 -0
- /package/dist/web/assets/{system-verilog-BFvldiwl.js → system-verilog-DoVBMhJ8.js} +0 -0
- /package/dist/web/assets/{systemd-Cu4Vvgbu.js → systemd--Ux4VAYD.js} +0 -0
- /package/dist/web/assets/{table-CAVmgQMT.js → table-Di8pv2Y_.js} +0 -0
- /package/dist/web/assets/{talonscript-Bnq32pUB.js → talonscript-DQNx9nak.js} +0 -0
- /package/dist/web/assets/{tasl-Nwe2K3J1.js → tasl-Bwy_Y9uD.js} +0 -0
- /package/dist/web/assets/{tcl-zOnpywrl.js → tcl-Drea-2jA.js} +0 -0
- /package/dist/web/assets/{terraform-Bc9Vj-n3.js → terraform-4rS5HoFk.js} +0 -0
- /package/dist/web/assets/{tokyo-night-9_KyM8M2.js → tokyo-night-C9MqaxIn.js} +0 -0
- /package/dist/web/assets/{toml-ByH-fxOY.js → toml-tSgOSv42.js} +0 -0
- /package/dist/web/assets/{tsv-DrCnDClP.js → tsv-BmL4O1Zx.js} +0 -0
- /package/dist/web/assets/{tsx-B8LafSYr.js → tsx-BwzeA880.js} +0 -0
- /package/dist/web/assets/{turtle-DuyP_QCJ.js → turtle-2DYvssFL.js} +0 -0
- /package/dist/web/assets/{typescript-BTBJb5RD.js → typescript-ZC-vonSh.js} +0 -0
- /package/dist/web/assets/{typespec-DdOFo7M5.js → typespec-DkCEO45F.js} +0 -0
- /package/dist/web/assets/{typst-LYvnBWQu.js → typst-DAZdb2n6.js} +0 -0
- /package/dist/web/assets/{utils-CTg5uAYR.js → utils-CSCvNZxE.js} +0 -0
- /package/dist/web/assets/{v-BuBYA1_x.js → v-B_wsb4C1.js} +0 -0
- /package/dist/web/assets/{vala-vRIBYYe3.js → vala-BDBNS784.js} +0 -0
- /package/dist/web/assets/{vb-DwGi-IYM.js → vb-CuOoJSSa.js} +0 -0
- /package/dist/web/assets/{vendor-xterm-i6SHFTfU.js → vendor-xterm-CImj6i6Z.js} +0 -0
- /package/dist/web/assets/{verilog-6B1X4G2-.js → verilog-BCcOvOcc.js} +0 -0
- /package/dist/web/assets/{vesper-Dw1y_Ae7.js → vesper-vN8CREK5.js} +0 -0
- /package/dist/web/assets/{vhdl-DK8JwBzJ.js → vhdl-CI8PoqeM.js} +0 -0
- /package/dist/web/assets/{viml-BTKIEIqm.js → viml-B66dNP1B.js} +0 -0
- /package/dist/web/assets/{vitesse-black-BqqolhEg.js → vitesse-black-0bGIaCfD.js} +0 -0
- /package/dist/web/assets/{vitesse-dark-B9JL5WQA.js → vitesse-dark-Dk-RSXq-.js} +0 -0
- /package/dist/web/assets/{vitesse-light-DYJKj2se.js → vitesse-light-BUsA5RhG.js} +0 -0
- /package/dist/web/assets/{vyper-D-jDI3WH.js → vyper-dNodzEa8.js} +0 -0
- /package/dist/web/assets/{wasm-1-GlNdpk.js → wasm-BDxaNPCj.js} +0 -0
- /package/dist/web/assets/{wasm-BBW4WmT2.js → wasm-d6SE2_qm.js} +0 -0
- /package/dist/web/assets/{wenyan-B6cM7sDO.js → wenyan-D0h8Uz55.js} +0 -0
- /package/dist/web/assets/{wgsl-FaHGQgko.js → wgsl-vKs_vsvQ.js} +0 -0
- /package/dist/web/assets/{wikitext-DtIyPUrk.js → wikitext-BIWsPJit.js} +0 -0
- /package/dist/web/assets/{wit-BMVRif5Y.js → wit-6vmKi2H3.js} +0 -0
- /package/dist/web/assets/{wolfram-DQsCGohn.js → wolfram-zoNg6F1a.js} +0 -0
- /package/dist/web/assets/{x-C2VSAp7O.js → x-BsFLg-T8.js} +0 -0
- /package/dist/web/assets/{yaml-C-Va56Gt.js → yaml-W95qP6-B.js} +0 -0
- /package/dist/web/assets/{zenscript-DdobKGI-.js → zenscript-BxircxDx.js} +0 -0
- /package/dist/web/assets/{zig-vqDFwj6q.js → zig-DD79WQtz.js} +0 -0
|
@@ -0,0 +1,702 @@
|
|
|
1
|
+
# PPM Deployment Guide
|
|
2
|
+
|
|
3
|
+
## Prerequisites
|
|
4
|
+
|
|
5
|
+
### System Requirements
|
|
6
|
+
- **OS:** Linux or macOS (Windows support planned for v3)
|
|
7
|
+
- **RAM:** 512 MB minimum, 2 GB recommended
|
|
8
|
+
- **Disk:** 500 MB for binary + dependencies
|
|
9
|
+
- **Network:** localhost only (single-machine deployment)
|
|
10
|
+
|
|
11
|
+
### Required Software
|
|
12
|
+
- **Bun:** v1.3.6 or later (https://bun.sh)
|
|
13
|
+
- **Git:** v2.0+ (for git operations in chat/CLI)
|
|
14
|
+
- **Node.js or Bun:** For running npm/node commands in terminal
|
|
15
|
+
|
|
16
|
+
### Optional
|
|
17
|
+
- **ngrok or similar:** For exposing to network (not recommended for production)
|
|
18
|
+
- **systemd or launchd:** For daemon management
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Installation
|
|
23
|
+
|
|
24
|
+
### Option 1: Build from Source (Development)
|
|
25
|
+
|
|
26
|
+
#### Prerequisites
|
|
27
|
+
```bash
|
|
28
|
+
# Check Bun is installed
|
|
29
|
+
bun --version # Should be 1.3.6+
|
|
30
|
+
|
|
31
|
+
# Clone repository
|
|
32
|
+
git clone https://github.com/hienlh/ppm.git
|
|
33
|
+
cd ppm
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
#### Install & Build
|
|
37
|
+
```bash
|
|
38
|
+
# Install dependencies
|
|
39
|
+
bun install
|
|
40
|
+
|
|
41
|
+
# Build frontend + CLI binary
|
|
42
|
+
bun run build
|
|
43
|
+
|
|
44
|
+
# Output: dist/ppm (compiled binary)
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
#### Run
|
|
48
|
+
```bash
|
|
49
|
+
# Run directly from source (development)
|
|
50
|
+
bun run start
|
|
51
|
+
|
|
52
|
+
# Or use compiled binary
|
|
53
|
+
./dist/ppm start
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
### Option 2: Pre-built Binary (Production)
|
|
59
|
+
|
|
60
|
+
#### Download
|
|
61
|
+
```bash
|
|
62
|
+
# Download latest release from GitHub Releases
|
|
63
|
+
wget https://github.com/hienlh/ppm/releases/download/v2.0/ppm-macos-x64
|
|
64
|
+
chmod +x ppm-macos-x64
|
|
65
|
+
|
|
66
|
+
# Or for Linux
|
|
67
|
+
wget https://github.com/hienlh/ppm/releases/download/v2.0/ppm-linux-x64
|
|
68
|
+
chmod +x ppm-linux-x64
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
#### Run
|
|
72
|
+
```bash
|
|
73
|
+
# Copy to PATH for global access
|
|
74
|
+
sudo cp ppm-macos-x64 /usr/local/bin/ppm
|
|
75
|
+
|
|
76
|
+
# Verify installation
|
|
77
|
+
ppm --version
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Configuration
|
|
83
|
+
|
|
84
|
+
### Initial Setup
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
# Generate config and scan for git repositories
|
|
88
|
+
ppm init
|
|
89
|
+
|
|
90
|
+
# Output: ~/.ppm/ppm.db (SQLite database)
|
|
91
|
+
# Auto-generates auth token
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Dev vs Production Config
|
|
95
|
+
|
|
96
|
+
Config is stored in **SQLite** databases:
|
|
97
|
+
|
|
98
|
+
- **Production:** `~/.ppm/ppm.db` — port **8080** (default)
|
|
99
|
+
- **Development:** `~/.ppm/ppm.dev.db` — port **8081**
|
|
100
|
+
|
|
101
|
+
`bun dev:server` automatically uses the dev database. On a new machine, run `ppm init` then `ppm config set port 8081` for dev.
|
|
102
|
+
|
|
103
|
+
### Config Structure (SQLite)
|
|
104
|
+
|
|
105
|
+
Config is stored in the `config` table as key-value pairs. Equivalent settings:
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
port = 8080
|
|
109
|
+
host = 0.0.0.0
|
|
110
|
+
auth.enabled = true
|
|
111
|
+
auth.token = "auto-generated-random-token"
|
|
112
|
+
providers.default = "claude-agent-sdk"
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Projects are stored in a separate `projects` table with `name` and `path` columns.
|
|
116
|
+
|
|
117
|
+
### Customize Configuration
|
|
118
|
+
|
|
119
|
+
#### Change Port
|
|
120
|
+
```bash
|
|
121
|
+
# Edit ppm.yaml manually
|
|
122
|
+
ppm config set port 3000
|
|
123
|
+
|
|
124
|
+
# Or start with custom port (CLI flag)
|
|
125
|
+
ppm start --port 3000
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
#### Add/Remove Projects
|
|
129
|
+
```bash
|
|
130
|
+
# Add project
|
|
131
|
+
ppm projects add my-project /path/to/my-project
|
|
132
|
+
|
|
133
|
+
# List projects
|
|
134
|
+
ppm projects list
|
|
135
|
+
|
|
136
|
+
# Remove project
|
|
137
|
+
ppm projects remove my-project
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
#### Set AI Provider
|
|
141
|
+
```bash
|
|
142
|
+
# Use mock provider (for testing)
|
|
143
|
+
ppm config set providers.default mock
|
|
144
|
+
|
|
145
|
+
# Switch back to SDK (default)
|
|
146
|
+
ppm config set providers.default claude-agent-sdk
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
#### Change Authentication Token
|
|
150
|
+
```bash
|
|
151
|
+
# Generate new random token
|
|
152
|
+
ppm config set auth.token "$(openssl rand -hex 32)"
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## Running the Server
|
|
158
|
+
|
|
159
|
+
### Foreground Mode (Development)
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
ppm start
|
|
163
|
+
|
|
164
|
+
# Output:
|
|
165
|
+
# PPM server listening on http://localhost:8080
|
|
166
|
+
# Token: <token from config>
|
|
167
|
+
# Projects: 2
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
Server runs in foreground. Press `Ctrl+C` to stop.
|
|
171
|
+
|
|
172
|
+
### Daemon Mode (Production)
|
|
173
|
+
|
|
174
|
+
**Daemon is now the default** — `ppm start` runs in background. Use `--foreground/-f` to run with logs visible (for debugging).
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
# Start as background daemon (default)
|
|
178
|
+
ppm start
|
|
179
|
+
|
|
180
|
+
# Start with public URL via Cloudflare Quick Tunnel (v2+)
|
|
181
|
+
ppm start --share
|
|
182
|
+
|
|
183
|
+
# Start in foreground (debugging, shows logs)
|
|
184
|
+
ppm start --foreground
|
|
185
|
+
|
|
186
|
+
# Server status stored in ~/.ppm/status.json
|
|
187
|
+
cat ~/.ppm/status.json
|
|
188
|
+
|
|
189
|
+
# Check if running
|
|
190
|
+
ps aux | grep ppm
|
|
191
|
+
|
|
192
|
+
# Stop daemon
|
|
193
|
+
ppm stop
|
|
194
|
+
|
|
195
|
+
# Graceful shutdown: SIGTERM sent, tunnel stopped, cleanup files removed
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
**Status File Format (v2+):**
|
|
199
|
+
```json
|
|
200
|
+
{
|
|
201
|
+
"pid": 12345,
|
|
202
|
+
"port": 8080,
|
|
203
|
+
"host": "0.0.0.0",
|
|
204
|
+
"shareUrl": "https://abc-123.trycloudflare.com"
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
**Backward Compatibility:** If `~/.ppm/status.json` doesn't exist, `ppm stop` falls back to reading `~/.ppm/ppm.pid`.
|
|
209
|
+
|
|
210
|
+
### Public URL Sharing via Cloudflare Tunnel (v2+)
|
|
211
|
+
|
|
212
|
+
**Feature:** `ppm start --share` creates a temporary public URL for your local PPM instance via Cloudflare Quick Tunnel.
|
|
213
|
+
|
|
214
|
+
**How It Works:**
|
|
215
|
+
1. `ppm start --share` (or `-s`) spawns a background daemon
|
|
216
|
+
2. Parent process downloads cloudflared binary to `~/.ppm/bin/` if missing (shows download progress)
|
|
217
|
+
3. Daemon spawns cloudflared tunnel process
|
|
218
|
+
4. Tunnel URL extracted from stderr (e.g., `https://abc-123.trycloudflare.com`)
|
|
219
|
+
5. URL saved to `~/.ppm/status.json` for easy access
|
|
220
|
+
6. Parent displays: "Share: https://abc-123.trycloudflare.com"
|
|
221
|
+
|
|
222
|
+
**Requirements:**
|
|
223
|
+
- Internet connectivity (tunnel uses Cloudflare's infrastructure)
|
|
224
|
+
- ~15 MB disk space for cloudflared binary (downloaded once, cached)
|
|
225
|
+
|
|
226
|
+
**Security Warning:**
|
|
227
|
+
If `auth.enabled` is false, PPM displays warning:
|
|
228
|
+
```
|
|
229
|
+
⚠ Warning: auth is disabled — your IDE is publicly accessible!
|
|
230
|
+
Enable auth: run 'ppm config set auth.enabled true' or restart without --share.
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
Recommended: Always enable auth before using `--share`.
|
|
234
|
+
|
|
235
|
+
**Example:**
|
|
236
|
+
```bash
|
|
237
|
+
# Share with auth enabled
|
|
238
|
+
ppm start --share # Safe: public URL, but auth required
|
|
239
|
+
|
|
240
|
+
# Share without auth (not recommended)
|
|
241
|
+
ppm start --share # Warning: anyone can access your IDE
|
|
242
|
+
|
|
243
|
+
# Disable sharing
|
|
244
|
+
ppm stop # Tunnel process stopped automatically
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
**Cleanup:**
|
|
248
|
+
- `ppm stop` gracefully shuts down the tunnel
|
|
249
|
+
- Cloudflared process killed via SIGTERM
|
|
250
|
+
- No dangling tunnels left behind
|
|
251
|
+
|
|
252
|
+
### Via systemd (Linux)
|
|
253
|
+
|
|
254
|
+
Create `/etc/systemd/system/ppm.service`:
|
|
255
|
+
|
|
256
|
+
```ini
|
|
257
|
+
[Unit]
|
|
258
|
+
Description=PPM Web IDE Server
|
|
259
|
+
After=network.target
|
|
260
|
+
|
|
261
|
+
[Service]
|
|
262
|
+
Type=simple
|
|
263
|
+
User=<username>
|
|
264
|
+
WorkingDirectory=/home/<username>
|
|
265
|
+
ExecStart=/usr/local/bin/ppm start
|
|
266
|
+
Restart=always
|
|
267
|
+
RestartSec=10
|
|
268
|
+
|
|
269
|
+
[Install]
|
|
270
|
+
WantedBy=multi-user.target
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
Then:
|
|
274
|
+
```bash
|
|
275
|
+
sudo systemctl daemon-reload
|
|
276
|
+
sudo systemctl enable ppm
|
|
277
|
+
sudo systemctl start ppm
|
|
278
|
+
|
|
279
|
+
# Check status
|
|
280
|
+
sudo systemctl status ppm
|
|
281
|
+
|
|
282
|
+
# View logs
|
|
283
|
+
sudo journalctl -u ppm -f
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### Via launchd (macOS)
|
|
287
|
+
|
|
288
|
+
Create `~/Library/LaunchAgents/com.ppm.server.plist`:
|
|
289
|
+
|
|
290
|
+
```xml
|
|
291
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
292
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
293
|
+
<plist version="1.0">
|
|
294
|
+
<dict>
|
|
295
|
+
<key>Label</key>
|
|
296
|
+
<string>com.ppm.server</string>
|
|
297
|
+
<key>ProgramArguments</key>
|
|
298
|
+
<array>
|
|
299
|
+
<string>/usr/local/bin/ppm</string>
|
|
300
|
+
<string>start</string>
|
|
301
|
+
</array>
|
|
302
|
+
<key>RunAtLoad</key>
|
|
303
|
+
<true/>
|
|
304
|
+
<key>KeepAlive</key>
|
|
305
|
+
<true/>
|
|
306
|
+
<key>StandardOutPath</key>
|
|
307
|
+
<string>/tmp/ppm.log</string>
|
|
308
|
+
<key>StandardErrorPath</key>
|
|
309
|
+
<string>/tmp/ppm-error.log</string>
|
|
310
|
+
</dict>
|
|
311
|
+
</plist>
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
Then:
|
|
315
|
+
```bash
|
|
316
|
+
launchctl load ~/Library/LaunchAgents/com.ppm.server.plist
|
|
317
|
+
launchctl status com.ppm.server
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
---
|
|
321
|
+
|
|
322
|
+
## Environment Variables
|
|
323
|
+
|
|
324
|
+
### Optional Configuration via ENV
|
|
325
|
+
|
|
326
|
+
Instead of `ppm.yaml`, configure via environment variables:
|
|
327
|
+
|
|
328
|
+
```bash
|
|
329
|
+
export PPM_PORT=8080
|
|
330
|
+
export PPM_HOST=0.0.0.0
|
|
331
|
+
export PPM_AUTH_TOKEN="my-secure-token"
|
|
332
|
+
export PPM_DEFAULT_PROVIDER="claude-agent-sdk"
|
|
333
|
+
export PPM_DB_PATH="/etc/ppm/ppm.db" # Custom database location
|
|
334
|
+
|
|
335
|
+
ppm start
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
### For Claude Integration
|
|
339
|
+
|
|
340
|
+
If using Claude Agent SDK:
|
|
341
|
+
```bash
|
|
342
|
+
export ANTHROPIC_API_KEY="sk-ant-..." # Your Anthropic API key
|
|
343
|
+
ppm start
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
**Note:** On Windows, SDK uses CLI fallback (`claude` binary) for Bun subprocess pipe buffering issues. Ensure `claude` is in PATH.
|
|
347
|
+
|
|
348
|
+
---
|
|
349
|
+
|
|
350
|
+
## Build & Deployment Commands
|
|
351
|
+
|
|
352
|
+
### Full Build Pipeline
|
|
353
|
+
|
|
354
|
+
```bash
|
|
355
|
+
# 1. Install dependencies
|
|
356
|
+
bun install
|
|
357
|
+
|
|
358
|
+
# 2. Type check
|
|
359
|
+
bun run typecheck
|
|
360
|
+
|
|
361
|
+
# 3. Build frontend
|
|
362
|
+
bun run build:web
|
|
363
|
+
|
|
364
|
+
# 4. Compile CLI binary (single executable)
|
|
365
|
+
bun run build
|
|
366
|
+
|
|
367
|
+
# Output: dist/ppm (~50-150 MB depending on platform)
|
|
368
|
+
|
|
369
|
+
# 5. Test (optional, currently partial coverage)
|
|
370
|
+
bun test
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
### Output Artifacts
|
|
374
|
+
|
|
375
|
+
After `bun run build`:
|
|
376
|
+
|
|
377
|
+
```
|
|
378
|
+
dist/
|
|
379
|
+
├── ppm # Compiled CLI binary (executable)
|
|
380
|
+
└── web/ # Frontend assets (embedded in binary)
|
|
381
|
+
├── index.html
|
|
382
|
+
├── assets/
|
|
383
|
+
│ ├── index-*.js # Main JS bundle
|
|
384
|
+
│ ├── index-*.css # Tailwind styles
|
|
385
|
+
│ └── ... # Other chunks
|
|
386
|
+
└── manifest.json # PWA manifest
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
### Size Optimization
|
|
390
|
+
|
|
391
|
+
```bash
|
|
392
|
+
# Check bundle size before/after
|
|
393
|
+
bun run build:web
|
|
394
|
+
du -sh dist/web/assets/
|
|
395
|
+
|
|
396
|
+
# Typical sizes:
|
|
397
|
+
# - JS bundles: 200-300 KB gzipped
|
|
398
|
+
# - CSS: 100-150 KB gzipped
|
|
399
|
+
# - Total frontend: 400-500 KB gzipped
|
|
400
|
+
# - CLI binary: 80-120 MB (includes runtime)
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
---
|
|
404
|
+
|
|
405
|
+
## First-Time Setup Checklist
|
|
406
|
+
|
|
407
|
+
```bash
|
|
408
|
+
# 1. Install Bun
|
|
409
|
+
curl -fsSL https://bun.sh/install | bash
|
|
410
|
+
source ~/.bashrc # or ~/.zshrc
|
|
411
|
+
|
|
412
|
+
# 2. Clone/build PPM
|
|
413
|
+
git clone https://github.com/hienlh/ppm.git
|
|
414
|
+
cd ppm
|
|
415
|
+
bun install
|
|
416
|
+
bun run build
|
|
417
|
+
|
|
418
|
+
# 3. Initialize config
|
|
419
|
+
./dist/ppm init
|
|
420
|
+
# Follow prompts to add projects
|
|
421
|
+
|
|
422
|
+
# 4. Start server
|
|
423
|
+
./dist/ppm start
|
|
424
|
+
# Output: http://localhost:8080 + token
|
|
425
|
+
|
|
426
|
+
# 5. Open browser
|
|
427
|
+
# Navigate to http://localhost:8080
|
|
428
|
+
# Enter token from step 4
|
|
429
|
+
# Select project and start using
|
|
430
|
+
|
|
431
|
+
# 6. Verify functionality
|
|
432
|
+
# - Browse files in file explorer
|
|
433
|
+
# - Open terminal and run commands
|
|
434
|
+
# - Chat with Claude (requires ANTHROPIC_API_KEY)
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
---
|
|
438
|
+
|
|
439
|
+
## Troubleshooting
|
|
440
|
+
|
|
441
|
+
### Port Already in Use
|
|
442
|
+
|
|
443
|
+
```bash
|
|
444
|
+
# Check what's using port 8080
|
|
445
|
+
lsof -i :8080
|
|
446
|
+
# Kill process
|
|
447
|
+
kill -9 <PID>
|
|
448
|
+
|
|
449
|
+
# Or use different port
|
|
450
|
+
ppm start --port 3000
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
### Permission Denied (File Operations)
|
|
454
|
+
|
|
455
|
+
```bash
|
|
456
|
+
# Ensure PPM has read/write access to project directory
|
|
457
|
+
chmod -R u+rw /path/to/project
|
|
458
|
+
|
|
459
|
+
# Or run PPM with appropriate user
|
|
460
|
+
sudo -u <username> ppm start
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
### Git Commands Failing
|
|
464
|
+
|
|
465
|
+
```bash
|
|
466
|
+
# Verify git is installed
|
|
467
|
+
git --version
|
|
468
|
+
|
|
469
|
+
# Verify project is git repository
|
|
470
|
+
cd /path/to/project
|
|
471
|
+
git status
|
|
472
|
+
|
|
473
|
+
# If not a repo
|
|
474
|
+
git init
|
|
475
|
+
```
|
|
476
|
+
|
|
477
|
+
### Terminal Not Working
|
|
478
|
+
|
|
479
|
+
```bash
|
|
480
|
+
# Verify shell is available
|
|
481
|
+
which bash zsh
|
|
482
|
+
|
|
483
|
+
# Check PTY support (Linux/macOS only)
|
|
484
|
+
# Windows may require WSL or special configuration
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
### Chat/Claude Not Responding
|
|
488
|
+
|
|
489
|
+
```bash
|
|
490
|
+
# Check API key is set
|
|
491
|
+
echo $ANTHROPIC_API_KEY
|
|
492
|
+
|
|
493
|
+
# Verify network connectivity
|
|
494
|
+
curl https://api.anthropic.com
|
|
495
|
+
|
|
496
|
+
# Check provider is working
|
|
497
|
+
ppm chat send "test message" 2>&1
|
|
498
|
+
```
|
|
499
|
+
|
|
500
|
+
### Server Won't Start
|
|
501
|
+
|
|
502
|
+
```bash
|
|
503
|
+
# Check status (v2+)
|
|
504
|
+
cat ~/.ppm/status.json
|
|
505
|
+
|
|
506
|
+
# Verify server is running
|
|
507
|
+
ps aux | grep ppm
|
|
508
|
+
|
|
509
|
+
# View logs (foreground mode only)
|
|
510
|
+
ppm start --foreground # Shows real-time logs
|
|
511
|
+
|
|
512
|
+
# Verify config is valid YAML
|
|
513
|
+
ppm config get port
|
|
514
|
+
|
|
515
|
+
# Clear cache and restart
|
|
516
|
+
rm -rf ~/.ppm/cache
|
|
517
|
+
ppm start
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
**Note:** Daemon mode doesn't write to a log file by default. Use `ppm start --foreground` to see logs for debugging, or set up systemd with log redirection (see "Via systemd" section above).
|
|
521
|
+
|
|
522
|
+
---
|
|
523
|
+
|
|
524
|
+
## Security Checklist
|
|
525
|
+
|
|
526
|
+
### Before Production Deployment
|
|
527
|
+
|
|
528
|
+
- [ ] Change default auth token: `ppm config set auth.token "$(openssl rand -hex 32)"`
|
|
529
|
+
- [ ] Verify only necessary projects are in `ppm.yaml`
|
|
530
|
+
- [ ] Set appropriate file permissions: `chmod 600 ~/.ppm/ppm.db`
|
|
531
|
+
- [ ] Keep Bun updated: `bun upgrade`
|
|
532
|
+
- [ ] Keep dependencies updated: `bun update`
|
|
533
|
+
- [ ] Review firewall rules (localhost only recommended)
|
|
534
|
+
- [ ] Disable password-less sudo if running as daemon
|
|
535
|
+
- [ ] Use HTTPS if exposing to network (via reverse proxy, e.g., nginx)
|
|
536
|
+
- [ ] Regularly backup `ppm.yaml` and project data
|
|
537
|
+
|
|
538
|
+
### Network Exposure (Not Recommended)
|
|
539
|
+
|
|
540
|
+
If you must expose to network:
|
|
541
|
+
|
|
542
|
+
```nginx
|
|
543
|
+
# nginx reverse proxy with SSL
|
|
544
|
+
upstream ppm {
|
|
545
|
+
server localhost:8080;
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
server {
|
|
549
|
+
listen 443 ssl http2;
|
|
550
|
+
server_name ppm.example.com;
|
|
551
|
+
|
|
552
|
+
ssl_certificate /etc/letsencrypt/live/ppm.example.com/fullchain.pem;
|
|
553
|
+
ssl_certificate_key /etc/letsencrypt/live/ppm.example.com/privkey.pem;
|
|
554
|
+
|
|
555
|
+
location / {
|
|
556
|
+
proxy_pass http://ppm;
|
|
557
|
+
proxy_http_version 1.1;
|
|
558
|
+
proxy_set_header Upgrade $http_upgrade;
|
|
559
|
+
proxy_set_header Connection "upgrade";
|
|
560
|
+
proxy_set_header Host $host;
|
|
561
|
+
proxy_set_header X-Real-IP $remote_addr;
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
```
|
|
565
|
+
|
|
566
|
+
Then access via `https://ppm.example.com` with SSL certificate.
|
|
567
|
+
|
|
568
|
+
---
|
|
569
|
+
|
|
570
|
+
## Upgrade Instructions
|
|
571
|
+
|
|
572
|
+
### From v1 to v2
|
|
573
|
+
|
|
574
|
+
```bash
|
|
575
|
+
# 1. Backup existing config
|
|
576
|
+
cp ~/.ppm/ppm.db ~/.ppm/ppm.db.backup
|
|
577
|
+
|
|
578
|
+
# 2. Stop running server
|
|
579
|
+
ppm stop
|
|
580
|
+
# Or Ctrl+C if foreground
|
|
581
|
+
|
|
582
|
+
# 3. Download/build v2 binary
|
|
583
|
+
# (See "Installation" section above)
|
|
584
|
+
|
|
585
|
+
# 4. Verify new binary works
|
|
586
|
+
./dist/ppm --version
|
|
587
|
+
# Should output: v2.0.0
|
|
588
|
+
|
|
589
|
+
# 5. Start new version
|
|
590
|
+
./dist/ppm start
|
|
591
|
+
|
|
592
|
+
# 6. Test in browser
|
|
593
|
+
# All projects and auth token should carry over
|
|
594
|
+
```
|
|
595
|
+
|
|
596
|
+
### Rollback to v1 (If Needed)
|
|
597
|
+
|
|
598
|
+
```bash
|
|
599
|
+
# 1. Stop v2 server
|
|
600
|
+
ppm stop
|
|
601
|
+
|
|
602
|
+
# 2. Switch back to v1 binary
|
|
603
|
+
# cp path/to/v1/ppm ./ppm-v1
|
|
604
|
+
# ./ppm-v1 start
|
|
605
|
+
|
|
606
|
+
# 3. Restore backup if config changed
|
|
607
|
+
# cp ~/.ppm/ppm.db.backup ~/.ppm/ppm.db
|
|
608
|
+
```
|
|
609
|
+
|
|
610
|
+
---
|
|
611
|
+
|
|
612
|
+
## Performance Tuning
|
|
613
|
+
|
|
614
|
+
### Increase File Descriptor Limit (Linux)
|
|
615
|
+
|
|
616
|
+
```bash
|
|
617
|
+
# Check current limit
|
|
618
|
+
ulimit -n
|
|
619
|
+
|
|
620
|
+
# Increase to 4096 (temporary)
|
|
621
|
+
ulimit -n 4096
|
|
622
|
+
|
|
623
|
+
# Permanent: edit /etc/security/limits.conf
|
|
624
|
+
# Add: * soft nofile 4096
|
|
625
|
+
# * hard nofile 4096
|
|
626
|
+
```
|
|
627
|
+
|
|
628
|
+
### Memory Management
|
|
629
|
+
|
|
630
|
+
```bash
|
|
631
|
+
# Monitor memory usage
|
|
632
|
+
# Linux
|
|
633
|
+
ps aux | grep ppm
|
|
634
|
+
free -h
|
|
635
|
+
|
|
636
|
+
# macOS
|
|
637
|
+
ps aux | grep ppm
|
|
638
|
+
vm_stat | grep page
|
|
639
|
+
|
|
640
|
+
# If using too much memory:
|
|
641
|
+
# 1. Reduce number of open projects
|
|
642
|
+
# 2. Clear browser cache
|
|
643
|
+
# 3. Restart server
|
|
644
|
+
```
|
|
645
|
+
|
|
646
|
+
### Network Latency
|
|
647
|
+
|
|
648
|
+
```bash
|
|
649
|
+
# Test WebSocket latency
|
|
650
|
+
# From browser console:
|
|
651
|
+
console.time('ws');
|
|
652
|
+
ws.send({type: 'message', content: 'ping'});
|
|
653
|
+
// Measure response time
|
|
654
|
+
```
|
|
655
|
+
|
|
656
|
+
---
|
|
657
|
+
|
|
658
|
+
## Monitoring
|
|
659
|
+
|
|
660
|
+
### Health Check Endpoint
|
|
661
|
+
|
|
662
|
+
```bash
|
|
663
|
+
# Health check (no auth required)
|
|
664
|
+
curl http://localhost:8080/api/health
|
|
665
|
+
|
|
666
|
+
# Output: { ok: true, data: { status: "healthy" } }
|
|
667
|
+
```
|
|
668
|
+
|
|
669
|
+
### Activity Logging
|
|
670
|
+
|
|
671
|
+
PPM logs to stdout in foreground mode. In daemon mode, configure:
|
|
672
|
+
|
|
673
|
+
```yaml
|
|
674
|
+
# ppm.yaml
|
|
675
|
+
logging:
|
|
676
|
+
level: info # debug, info, warn, error
|
|
677
|
+
file: ~/.ppm/server.log
|
|
678
|
+
rotation: daily
|
|
679
|
+
retention: 7 # days
|
|
680
|
+
```
|
|
681
|
+
|
|
682
|
+
### Metrics Collection
|
|
683
|
+
|
|
684
|
+
For monitoring integrations (Prometheus, DataDog):
|
|
685
|
+
|
|
686
|
+
```bash
|
|
687
|
+
# Future: /api/metrics endpoint
|
|
688
|
+
# Currently not implemented; planned for v2.1
|
|
689
|
+
```
|
|
690
|
+
|
|
691
|
+
---
|
|
692
|
+
|
|
693
|
+
## Support & Troubleshooting
|
|
694
|
+
|
|
695
|
+
### Getting Help
|
|
696
|
+
|
|
697
|
+
1. **GitHub Issues:** https://github.com/hienlh/ppm/issues
|
|
698
|
+
2. **Logs:** Run `ppm start --foreground` to see real-time logs; check `~/.ppm/status.json` for daemon status
|
|
699
|
+
3. **Configuration:** Validate `ppm.yaml` syntax
|
|
700
|
+
4. **Dependencies:** Ensure Bun, Git, Node are installed and up-to-date
|
|
701
|
+
5. **Tunnel Issues:** Check `~/.ppm/bin/cloudflared` exists; re-download if corrupted
|
|
702
|
+
|