@hienlh/ppm 0.18.11 → 0.18.13

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.
Files changed (571) hide show
  1. package/AGENTS.md +17 -5
  2. package/CHANGELOG.md +27 -0
  3. package/CLAUDE.md +3 -0
  4. package/README.md +87 -29
  5. package/assets/skills/ppm/SKILL.md +1 -1
  6. package/assets/skills/ppm/references/http-api.md +19 -1
  7. package/dist/web/assets/{adaptive-context-menu-DGCKKeTy.js → adaptive-context-menu-CbgPYQmj.js} +1 -1
  8. package/dist/web/assets/{ai-resource-editor-BOHHTTe7.js → ai-resource-editor-unM2HNmg.js} +1 -1
  9. package/dist/web/assets/{ai-settings-section-BigC_nZR.js → ai-settings-section-CdktdrwF.js} +1 -1
  10. package/dist/web/assets/{angular-html-BYPaydvh.js → angular-html-DcpbdcNG.js} +1 -1
  11. package/dist/web/assets/{angular-ts-Bb4AMKlk.js → angular-ts-Bv_WIk34.js} +1 -1
  12. package/dist/web/assets/api-client-BogqsFna.js +1 -0
  13. package/dist/web/assets/{api-settings-Bd3M4YpI.js → api-settings-BdCtex9i.js} +1 -1
  14. package/dist/web/assets/api-settings-DfXViPKz.js +1 -0
  15. package/dist/web/assets/{api-themes-Cpx419SL.js → api-themes-pRRoLvgD.js} +1 -1
  16. package/dist/web/assets/{apl-DB2VjFCS.js → apl-D5_lLszu.js} +1 -1
  17. package/dist/web/assets/architecture-PBZL5I3N-BzFm9ELu.js +1 -0
  18. package/dist/web/assets/{astro-BeoJdVpk.js → astro-CBHwddYL.js} +1 -1
  19. package/dist/web/assets/{audio-preview-BgFuTn-0.js → audio-preview-BD1iDovf.js} +1 -1
  20. package/dist/web/assets/{blade-Cf2q1sPf.js → blade-DGe1d2Pq.js} +1 -1
  21. package/dist/web/assets/{bsl-W1kOaNpu.js → bsl-2lyAzRJA.js} +1 -1
  22. package/dist/web/assets/{button-5zTrkEoN.js → button-2WCAS8dI.js} +1 -1
  23. package/dist/web/assets/{cairo-BoAZFcje.js → cairo-DjzZeJrq.js} +1 -1
  24. package/dist/web/assets/chat-tab-DzK8LGti.js +15 -0
  25. package/dist/web/assets/{cobol-B0Nm7RXj.js → cobol-cC3XIuAJ.js} +1 -1
  26. package/dist/web/assets/code-editor-CuMfPN9X.js +10 -0
  27. package/dist/web/assets/{coffee-BakMn3on.js → coffee-4eGboVoU.js} +1 -1
  28. package/dist/web/assets/{conflict-editor-BUs5k9q_.js → conflict-editor-DdJag4QK.js} +1 -1
  29. package/dist/web/assets/{context-menu-Bq92km4s.js → context-menu-BO1c9jKy.js} +1 -1
  30. package/dist/web/assets/{cpp-BRAJQHK2.js → cpp-DF9_G-OU.js} +1 -1
  31. package/dist/web/assets/{crystal-kqqO3zkK.js → crystal-OavZlzcm.js} +1 -1
  32. package/dist/web/assets/{csv-preview-ByoDgLAZ.js → csv-preview-DnXwouF3.js} +1 -1
  33. package/dist/web/assets/{data-grid-overlay-editor-Brkf9z41.js → data-grid-overlay-editor-B9Gpjm3l.js} +1 -1
  34. package/dist/web/assets/{database-viewer-Btc3h8Yu.js → database-viewer-Dk8oGyZx.js} +1 -1
  35. package/dist/web/assets/{dialog-DwtGlowE.js → dialog-B-l2ZxVm.js} +1 -1
  36. package/dist/web/assets/{diff-viewer-CZaDnR4w.js → diff-viewer-eaUBjLCH.js} +1 -1
  37. package/dist/web/assets/{docx-preview-DAD_vg59.js → docx-preview-DAdHPlhZ.js} +1 -1
  38. package/dist/web/assets/{edge-Cq1ZKZuE.js → edge-TzYh8OlN.js} +1 -1
  39. package/dist/web/assets/{edit-diff-preview-B_VE7ppQ.js → edit-diff-preview-DlwP3UIU.js} +1 -1
  40. package/dist/web/assets/{elixir-BM_JoJRk.js → elixir-Cy3RhKKH.js} +1 -1
  41. package/dist/web/assets/{elm-Dw7oO08Y.js → elm-BTBZdweK.js} +1 -1
  42. package/dist/web/assets/{erb-CfKOGAfk.js → erb-dv1mI0y4.js} +1 -1
  43. package/dist/web/assets/{erlang-DlDmGVeE.js → erlang-DjeiDrkl.js} +1 -1
  44. package/dist/web/assets/{esm-DGAP0GFh.js → esm-FRwvcesu.js} +1 -1
  45. package/dist/web/assets/explorer-body-DkCkSVrN.js +2 -0
  46. package/dist/web/assets/explorer-window-content-MsnTVngu.js +1 -0
  47. package/dist/web/assets/{extension-store-Cpfh2vMm.js → extension-store-DUaZINyC.js} +1 -1
  48. package/dist/web/assets/{extension-webview-B2OnjuCu.js → extension-webview-W0qRfaAU.js} +1 -1
  49. package/dist/web/assets/{file-store-aOERIEo-.js → file-store-yReVbR8q.js} +1 -1
  50. package/dist/web/assets/{fortran-fixed-form-XnAhQWxS.js → fortran-fixed-form-BCH9DAIJ.js} +1 -1
  51. package/dist/web/assets/{fsharp-CdNvy0PG.js → fsharp-C93NYKYD.js} +1 -1
  52. package/dist/web/assets/{gdresource-DxuG5i8i.js → gdresource-BcIEE2eX.js} +1 -1
  53. package/dist/web/assets/{git-commit-3lMonsur.js → git-commit-BVjlXEy8.js} +1 -1
  54. package/dist/web/assets/{git-log-panel-Co0PBPHC.js → git-log-panel-2_4HuP47.js} +1 -1
  55. package/dist/web/assets/{git-rebase-N8Z9kIMf.js → git-rebase-Bj_21B1V.js} +1 -1
  56. package/dist/web/assets/gitGraph-HDMCJU4V-B72vcb2r.js +1 -0
  57. package/dist/web/assets/glide-data-grid-B0IY6n_Q.js +138 -0
  58. package/dist/web/assets/{glimmer-js-Dp9OXiib.js → glimmer-js-C20yj4Zv.js} +1 -1
  59. package/dist/web/assets/{glimmer-ts-CDVKBcDj.js → glimmer-ts-ipbYC7kh.js} +1 -1
  60. package/dist/web/assets/{glsl-DPJxI4us.js → glsl-Dovazu3t.js} +1 -1
  61. package/dist/web/assets/{graphql-BrFhaQQl.js → graphql-DpMlM7hC.js} +1 -1
  62. package/dist/web/assets/{group-chat-tab-rOd8J8GC.js → group-chat-tab-DRLDHOp6.js} +1 -1
  63. package/dist/web/assets/{hack-BzXbDMlA.js → hack-gc7LCBuV.js} +1 -1
  64. package/dist/web/assets/{haml-CPpkX0s5.js → haml-vtlFm9gm.js} +1 -1
  65. package/dist/web/assets/{handlebars-BqrApy52.js → handlebars-DGKhpCji.js} +1 -1
  66. package/dist/web/assets/{html-DmjUl-OA.js → html-DvfhQbXb.js} +1 -1
  67. package/dist/web/assets/{html-derivative-Cnd6XFR5.js → html-derivative-C3oTSSCN.js} +1 -1
  68. package/dist/web/assets/{http-DMLWYun2.js → http-SG6zLTo7.js} +1 -1
  69. package/dist/web/assets/{hurl-CKkCVxbj.js → hurl-BWXsYlqW.js} +1 -1
  70. package/dist/web/assets/{hxml-CAx19TtQ.js → hxml-DUdMzaoh.js} +1 -1
  71. package/dist/web/assets/{image-preview-DHUoylQ1.js → image-preview-DxgFOV1T.js} +1 -1
  72. package/dist/web/assets/index-CBn4SOoT.js +52 -0
  73. package/dist/web/assets/index-DWpNR3nB.css +2 -0
  74. package/dist/web/assets/info-3K5VOQVL-3irPxRK_.js +1 -0
  75. package/dist/web/assets/{input-DcEk7mA3.js → input-DuAF-Stj.js} +1 -1
  76. package/dist/web/assets/{jinja-BmB9YN9l.js → jinja-955w9RKM.js} +1 -1
  77. package/dist/web/assets/{jison-BaVsKKpw.js → jison-WWfqPo50.js} +1 -1
  78. package/dist/web/assets/{julia-BgVBLveX.js → julia-BFrfnaNl.js} +1 -1
  79. package/dist/web/assets/{just-C2ENIbl9.js → just-BrZdyR_I.js} +1 -1
  80. package/dist/web/assets/{keybindings-store-BGIyqXHI.js → keybindings-store-0Wqfa7Qp.js} +1 -1
  81. package/dist/web/assets/keybindings-store-d54pv2NK.js +1 -0
  82. package/dist/web/assets/{latex-BiDIWxKL.js → latex-CwtPPASD.js} +1 -1
  83. package/dist/web/assets/{liquid-NxpapreE.js → liquid-CYZuvDDd.js} +1 -1
  84. package/dist/web/assets/{lua-DVepQvwH.js → lua-BV095ZyY.js} +1 -1
  85. package/dist/web/assets/markdown-renderer-BTS8ifdu.js +1 -0
  86. package/dist/web/assets/{markdown-renderer-DlcDhgrF.js → markdown-renderer-CnRcKK3d.js} +3 -3
  87. package/dist/web/assets/{marko-CJ2606Xl.js → marko-CNeljZ1C.js} +1 -1
  88. package/dist/web/assets/{mdc-D2bjqclE.js → mdc-JfGapShy.js} +1 -1
  89. package/dist/web/assets/{media-url-H17XJF-I.js → media-url-Bm4PsduE.js} +1 -1
  90. package/dist/web/assets/{mobile-bottom-sheet-g-r2hCFa.js → mobile-bottom-sheet-M5iZDX7y.js} +1 -1
  91. package/dist/web/assets/mobile-explorer-sheet-BqK2-WuN.js +1 -0
  92. package/dist/web/assets/{nextflow-BtJwUbfF.js → nextflow-DD5C8nqX.js} +1 -1
  93. package/dist/web/assets/{nginx-j4gyIhHE.js → nginx-Ca7B__x_.js} +1 -1
  94. package/dist/web/assets/{nim-ClH_gjP5.js → nim-B8FogsDw.js} +1 -1
  95. package/dist/web/assets/notification-store-Yvy1I8gd.js +1 -0
  96. package/dist/web/assets/{number-overlay-editor-C1EqJnWq.js → number-overlay-editor-DG9xJwEG.js} +1 -1
  97. package/dist/web/assets/{overview-panel-vTeeJYVZ.js → overview-panel-s53bnl0q.js} +1 -1
  98. package/dist/web/assets/packet-RMMSAZCW-Z5jWjFCV.js +1 -0
  99. package/dist/web/assets/{panel-store-BSnkjgHt.js → panel-store-B4rijFKN.js} +1 -1
  100. package/dist/web/assets/{pdf-preview-CqFGRY0Z.js → pdf-preview-DYt3aBzM.js} +1 -1
  101. package/dist/web/assets/{perl-C9H7X7CT.js → perl-BR78hS8R.js} +1 -1
  102. package/dist/web/assets/{php-Bx2U-cQ_.js → php-DXBOMC9z.js} +1 -1
  103. package/dist/web/assets/pie-UPGHQEXC-Bq7UMi8P.js +1 -0
  104. package/dist/web/assets/{postgres-viewer-DHwcQucn.js → postgres-viewer-BvoWSuoZ.js} +3 -3
  105. package/dist/web/assets/{process-table-BGRJNlpn.js → process-table-BYwKigiD.js} +1 -1
  106. package/dist/web/assets/{project-store--nvQiy75.js → project-store-BuY7rxn_.js} +1 -1
  107. package/dist/web/assets/{pug-Cw74sKsE.js → pug-CvTwVVKV.js} +1 -1
  108. package/dist/web/assets/{qml-BXD94Eqz.js → qml-CPSoZ1-B.js} +1 -1
  109. package/dist/web/assets/radar-KQ55EAFF-BLo4BOTD.js +1 -0
  110. package/dist/web/assets/{razor-DZ0-Ge0S.js → razor-BUA1YKtF.js} +1 -1
  111. package/dist/web/assets/{rst-Dtdh0QUj.js → rst-BJsq7ISz.js} +1 -1
  112. package/dist/web/assets/{ruby-BC51BW2Q.js → ruby-DSDMeYf5.js} +1 -1
  113. package/dist/web/assets/{run-in-terminal-Sd3KyjN4.js → run-in-terminal-C9xpskFn.js} +1 -1
  114. package/dist/web/assets/{sas-BN8i4qOU.js → sas-B1nJOjbN.js} +1 -1
  115. package/dist/web/assets/{scroll-area-0gljZ6lF.js → scroll-area-DBcG1fQo.js} +1 -1
  116. package/dist/web/assets/{scss-H-QtA7Rz.js → scss-BZFyRiQn.js} +1 -1
  117. package/dist/web/assets/{send-to-chat-u6m8l-rH.js → send-to-chat-BIg70MUZ.js} +1 -1
  118. package/dist/web/assets/{settings-store-CHY6Kzin.js → settings-store-GV5pkkke.js} +2 -2
  119. package/dist/web/assets/{settings-tab-IY6K1MiZ.js → settings-tab-BePvIcjd.js} +1 -1
  120. package/dist/web/assets/settings-tab-Br-lJSPa.js +1 -0
  121. package/dist/web/assets/{shaderlab-CalNsj_x.js → shaderlab-laINRXBo.js} +1 -1
  122. package/dist/web/assets/{shellsession-BFrcoR8x.js → shellsession-BpOOvWVR.js} +1 -1
  123. package/dist/web/assets/{soy-CNbku7vP.js → soy-BW4d91Sa.js} +1 -1
  124. package/dist/web/assets/{sparql-BN_orcVp.js → sparql-BsvvyoHn.js} +1 -1
  125. package/dist/web/assets/{sql-query-editor-C6pC3I8l.js → sql-query-editor-qQce5QJ6.js} +1 -1
  126. package/dist/web/assets/{sqlite-viewer-DTr5PzUb.js → sqlite-viewer-yhc0YNvu.js} +1 -1
  127. package/dist/web/assets/{stata-C6a5Ijzq.js → stata-K-dZInUt.js} +1 -1
  128. package/dist/web/assets/{surrealql-ClplI_HY.js → surrealql-CpNp2sgf.js} +1 -1
  129. package/dist/web/assets/{svelte-DNm-UNXB.js → svelte-BG6iBA8R.js} +1 -1
  130. package/dist/web/assets/{switch-DKvKya9y.js → switch-_NcrktLe.js} +1 -1
  131. package/dist/web/assets/system-monitor-body-D8Z5QXBB.js +2 -0
  132. package/dist/web/assets/system-monitor-tab-BclYXFTe.js +1 -0
  133. package/dist/web/assets/{system-monitor-window-content-BUqRsPK2.js → system-monitor-window-content-CaOhD0AU.js} +1 -1
  134. package/dist/web/assets/{tab-host-window-content-BnqGPu8a.js → tab-host-window-content-f_Rc5rJK.js} +1 -1
  135. package/dist/web/assets/{tab-store-CJuJRapl.js → tab-store-tFnyPmm4.js} +1 -1
  136. package/dist/web/assets/team-member-sheet-QDHoYCs0.js +2 -0
  137. package/dist/web/assets/{team-member-window-content-T4Q5JI-G.js → team-member-window-content-B1jkKkDi.js} +1 -1
  138. package/dist/web/assets/{templ-CSdqVobu.js → templ-gxNKXmt3.js} +1 -1
  139. package/dist/web/assets/{terminal-tab-Bb2rZegQ.js → terminal-tab-UvwM0sty.js} +3 -3
  140. package/dist/web/assets/{tex-DzSJ4kcZ.js → tex-C0ON27g5.js} +1 -1
  141. package/dist/web/assets/{tool-cards-lhqhrDTT.js → tool-cards-jB7GT-wj.js} +4 -4
  142. package/dist/web/assets/treemap-KZPCXAKY-dyrE6SW2.js +1 -0
  143. package/dist/web/assets/{ts-tags-C28w3bTg.js → ts-tags-BX_CTVgQ.js} +1 -1
  144. package/dist/web/assets/{twig-i5jY3QXB.js → twig-CwL7XnU0.js} +1 -1
  145. package/dist/web/assets/{use-blob-url-Dsq9OjTh.js → use-blob-url-DcRcjNTE.js} +1 -1
  146. package/dist/web/assets/use-coarse-long-press-BmI_GVW5.js +1 -0
  147. package/dist/web/assets/{use-monaco-theme-BZvlsoBv.js → use-monaco-theme--9tOOkDA.js} +1 -1
  148. package/dist/web/assets/{use-open-team-member-DkiEjFYE.js → use-open-team-member-1hRsHLKg.js} +1 -1
  149. package/dist/web/assets/{use-websocket-B8R50f7f.js → use-websocket-rxJLbFqy.js} +1 -1
  150. package/dist/web/assets/{vendor-mermaid-By4AVvJY.js → vendor-mermaid-CHTa6D69.js} +1 -1
  151. package/dist/web/assets/video-preview-DMhnf2Gi.js +1 -0
  152. package/dist/web/assets/{vue-Ceyet_lv.js → vue-Bykm6wSS.js} +1 -1
  153. package/dist/web/assets/{vue-html-GuU7g_hg.js → vue-html-CETdK_iV.js} +1 -1
  154. package/dist/web/assets/{vue-vine-CxXoaJr2.js → vue-vine-DiJb6fO5.js} +1 -1
  155. package/dist/web/assets/{window-store-CsEW6jiE.js → window-store-CQ1lghvv.js} +1 -1
  156. package/dist/web/assets/{xml-CbqOVhkP.js → xml-BNw8J5YW.js} +1 -1
  157. package/dist/web/assets/{xsl-KfAmCauy.js → xsl-CsG9L31b.js} +1 -1
  158. package/dist/web/index.html +46 -45
  159. package/dist/web/sw.js +1 -1
  160. package/docs/architecture/ai-chat-and-providers.md +309 -0
  161. package/docs/architecture/data-and-storage.md +356 -0
  162. package/docs/architecture/extensions.md +496 -0
  163. package/docs/architecture/integrations.md +214 -0
  164. package/docs/architecture/workspace-and-ui.md +391 -0
  165. package/docs/claude-agent-sdk-reference.md +1 -1
  166. package/docs/code-patterns.md +361 -0
  167. package/docs/code-standards.md +8 -358
  168. package/docs/codebase-subsystems.md +364 -0
  169. package/docs/codebase-summary.md +34 -379
  170. package/docs/deployment-guide.md +280 -490
  171. package/docs/design-guidelines.md +1 -1
  172. package/docs/lessons-learned.md +27 -10
  173. package/docs/project-changelog.md +18 -806
  174. package/docs/project-overview-pdr.md +117 -111
  175. package/docs/project-roadmap.md +89 -133
  176. package/docs/system-architecture.md +77 -1826
  177. package/package.json +2 -2
  178. package/src/cli/commands/autostart.ts +2 -2
  179. package/src/cli/commands/config-cmd.ts +12 -3
  180. package/src/cli/commands/status.ts +3 -2
  181. package/src/cli/commands/stop.ts +32 -4
  182. package/src/server/index.ts +17 -3
  183. package/src/server/routes/chat-unread.ts +36 -0
  184. package/src/server/routes/named-tunnel.ts +132 -0
  185. package/src/server/routes/tunnel.ts +13 -0
  186. package/src/server/ws/chat.ts +5 -2
  187. package/src/services/autostart-register.ts +47 -29
  188. package/src/services/cloud.service.ts +26 -1
  189. package/src/services/config-secret-keys.ts +48 -0
  190. package/src/services/config.service.ts +1 -1
  191. package/src/services/db.service.ts +62 -12
  192. package/src/services/extension-rpc-handlers.ts +9 -1
  193. package/src/services/file-watcher/watch-tree.ts +67 -33
  194. package/src/services/file-watcher.service.ts +28 -10
  195. package/src/services/fs-credential-path-guard.ts +103 -0
  196. package/src/services/fs-path-guard.service.ts +14 -66
  197. package/src/services/named-tunnel/cloudflare-dns-api.ts +40 -0
  198. package/src/services/named-tunnel/cloudflare-zone-api.ts +28 -0
  199. package/src/services/named-tunnel/cloudflared-cert.ts +95 -0
  200. package/src/services/named-tunnel/cloudflared-exec.ts +50 -0
  201. package/src/services/named-tunnel/cloudflared-login-helpers.ts +98 -0
  202. package/src/services/named-tunnel/cloudflared-login.service.ts +182 -0
  203. package/src/services/named-tunnel/hostname-rules.ts +58 -0
  204. package/src/services/named-tunnel/login-output-parser.ts +36 -0
  205. package/src/services/named-tunnel/named-tunnel-args.ts +110 -0
  206. package/src/services/named-tunnel/named-tunnel-config.ts +67 -0
  207. package/src/services/named-tunnel/named-tunnel-probe-state.ts +95 -0
  208. package/src/services/named-tunnel/named-tunnel-readiness.ts +59 -0
  209. package/src/services/named-tunnel/named-tunnel-runtime.ts +42 -0
  210. package/src/services/named-tunnel/named-tunnel-setup-confirm.ts +98 -0
  211. package/src/services/named-tunnel/named-tunnel-setup.service.ts +191 -0
  212. package/src/services/supervisor-state.ts +67 -2
  213. package/src/services/supervisor.ts +454 -157
  214. package/src/services/tunnel-registry-parse.ts +27 -0
  215. package/src/services/tunnel-registry.service.ts +2 -15
  216. package/src/services/tunnel.service.ts +12 -3
  217. package/src/types/config.ts +31 -0
  218. package/src/web/app.tsx +5 -0
  219. package/src/web/components/chat/chat-history-bar.tsx +95 -98
  220. package/src/web/components/chat/chat-toolbar-overflow-menu.tsx +57 -0
  221. package/src/web/components/chat/session-debug-dialog.tsx +35 -27
  222. package/src/web/components/layout/cloud-share-named-tunnel-row.tsx +111 -0
  223. package/src/web/components/layout/cloud-share-popover.tsx +56 -14
  224. package/src/web/components/shared/connection-lost-overlay.tsx +44 -5
  225. package/src/web/components/tunnels/named-tunnel/hostname-validation.ts +14 -0
  226. package/src/web/components/tunnels/named-tunnel/named-tunnel-copy.ts +96 -0
  227. package/src/web/components/tunnels/named-tunnel/named-tunnel-hostname-field.tsx +51 -0
  228. package/src/web/components/tunnels/named-tunnel/named-tunnel-login-step.tsx +105 -0
  229. package/src/web/components/tunnels/named-tunnel/named-tunnel-section.tsx +159 -0
  230. package/src/web/components/tunnels/named-tunnel/named-tunnel-setup-content.tsx +197 -0
  231. package/src/web/components/tunnels/named-tunnel/named-tunnel-setup-popup.tsx +57 -0
  232. package/src/web/components/tunnels/named-tunnel/named-tunnel-step-reducer.ts +191 -0
  233. package/src/web/components/tunnels/named-tunnel/use-named-tunnel-setup.ts +212 -0
  234. package/src/web/components/tunnels/tunnel-manager-tab.tsx +4 -0
  235. package/src/web/hooks/use-global-events.ts +3 -1
  236. package/src/web/lib/api-named-tunnel.ts +54 -0
  237. package/src/web/lib/last-known-local-url.ts +23 -0
  238. package/src/web/stores/notification-store.ts +20 -1
  239. package/.spike/cdp-client.ts +0 -116
  240. package/.spike/cleanup-ppm-workspace.mjs +0 -44
  241. package/.spike/group-protected-probe.ts +0 -21
  242. package/.spike/pip-eval.ts +0 -17
  243. package/.spike/pip-page-helpers.js +0 -119
  244. package/.spike/pip-results-editor-glue.json +0 -105
  245. package/.spike/pip-results-editor.json +0 -158
  246. package/.spike/pip-results-input-isolation.json +0 -28
  247. package/.spike/pip-results-key-probe.json +0 -58
  248. package/.spike/pip-results-listener-survival.json +0 -98
  249. package/.spike/pip-results-listeners.json +0 -36
  250. package/.spike/pip-results-pagehide.json +0 -92
  251. package/.spike/pip-results-resize.json +0 -104
  252. package/.spike/pip-results-terminal-debug.json +0 -99
  253. package/.spike/pip-results-terminal-v2.json +0 -191
  254. package/.spike/pip-results-terminal.json +0 -220
  255. package/.spike/pip-results-xterm-trace.json +0 -73
  256. package/.spike/pip-spike-common.ts +0 -83
  257. package/.spike/pip-spike-editor-glue.ts +0 -82
  258. package/.spike/pip-spike-editor.ts +0 -129
  259. package/.spike/pip-spike-input-isolation.ts +0 -38
  260. package/.spike/pip-spike-key-probe.ts +0 -34
  261. package/.spike/pip-spike-listener-survival.ts +0 -54
  262. package/.spike/pip-spike-listeners.ts +0 -19
  263. package/.spike/pip-spike-pagehide.ts +0 -59
  264. package/.spike/pip-spike-resize.ts +0 -42
  265. package/.spike/pip-spike-setup.ts +0 -63
  266. package/.spike/pip-spike-terminal-debug.ts +0 -81
  267. package/.spike/pip-spike-terminal-v2.ts +0 -139
  268. package/.spike/pip-spike-terminal.ts +0 -169
  269. package/.spike/pip-spike-xterm-trace.ts +0 -36
  270. package/.spike/probe-drag-memo-error.mjs +0 -67
  271. package/.spike/read-dev-db.ts +0 -15
  272. package/.spike/s.err +0 -63
  273. package/.spike/scratch-editor-target.ts +0 -7
  274. package/.spike/smoke-unified-chrome-pip.mjs +0 -353
  275. package/.spike/tunnel.err +0 -63
  276. package/.spike/vite-restart.err +0 -663
  277. package/.spike/w.err +0 -571
  278. package/dist/web/assets/api-client-DTZEgjBQ.js +0 -1
  279. package/dist/web/assets/api-settings-kd1j4iR8.js +0 -1
  280. package/dist/web/assets/architecture-PBZL5I3N-8dCMT9r7.js +0 -1
  281. package/dist/web/assets/chat-tab-E3bf_V8X.js +0 -15
  282. package/dist/web/assets/code-editor-BUlM2gXk.js +0 -10
  283. package/dist/web/assets/explorer-body-9aBmyVpZ.js +0 -2
  284. package/dist/web/assets/explorer-window-content-DRtqoSPA.js +0 -1
  285. package/dist/web/assets/gitGraph-HDMCJU4V-2e_8dfbs.js +0 -1
  286. package/dist/web/assets/glide-data-grid-C4_zIneN.js +0 -138
  287. package/dist/web/assets/index-BImUaigO.js +0 -52
  288. package/dist/web/assets/index-CSfi6DSU.css +0 -2
  289. package/dist/web/assets/info-3K5VOQVL-BZi1Gha1.js +0 -1
  290. package/dist/web/assets/keybindings-store-CzV2sPls.js +0 -1
  291. package/dist/web/assets/markdown-renderer-CcbR33VG.js +0 -1
  292. package/dist/web/assets/mobile-explorer-sheet-SIwQXlwA.js +0 -1
  293. package/dist/web/assets/notification-store-DV5QtUTg.js +0 -1
  294. package/dist/web/assets/packet-RMMSAZCW-o5htEcin.js +0 -1
  295. package/dist/web/assets/pie-UPGHQEXC-BXAIFSAD.js +0 -1
  296. package/dist/web/assets/radar-KQ55EAFF-Dbt2Aebl.js +0 -1
  297. package/dist/web/assets/settings-tab-Dic6TKkU.js +0 -1
  298. package/dist/web/assets/system-monitor-body-iwGiCns9.js +0 -2
  299. package/dist/web/assets/system-monitor-tab-DdXQhEel.js +0 -1
  300. package/dist/web/assets/team-member-sheet-LkAFSCvb.js +0 -2
  301. package/dist/web/assets/treemap-KZPCXAKY-DUbnl9dz.js +0 -1
  302. package/dist/web/assets/video-preview-m0-3p7QZ.js +0 -1
  303. /package/dist/web/assets/{abap-C6nB04tn.js → abap-DGlrX_8G.js} +0 -0
  304. /package/dist/web/assets/{actionscript-3-Vx4rw2sC.js → actionscript-3-CUqRtUJE.js} +0 -0
  305. /package/dist/web/assets/{ada-Ccd8vM20.js → ada-CY3Spa33.js} +0 -0
  306. /package/dist/web/assets/{andromeeda-DnBX5xMg.js → andromeeda-Lxs2TJn7.js} +0 -0
  307. /package/dist/web/assets/{apache-B-9_sx0g.js → apache-DfxgGdgM.js} +0 -0
  308. /package/dist/web/assets/{apex-_wPVBYoL.js → apex-QVDF1dnI.js} +0 -0
  309. /package/dist/web/assets/{api-client-aQb5hHE5.js → api-client-oY1tC3tM.js} +0 -0
  310. /package/dist/web/assets/{applescript-CcvD-qr0.js → applescript-pwJ8QXh-.js} +0 -0
  311. /package/dist/web/assets/{apply-theme-BeLRfsSu.js → apply-theme-B_bMVL6a.js} +0 -0
  312. /package/dist/web/assets/{ara-C40Ztoms.js → ara-mPjeX5YX.js} +0 -0
  313. /package/dist/web/assets/{asciidoc-CybYkJV4.js → asciidoc-Bf7LsDkI.js} +0 -0
  314. /package/dist/web/assets/{asm-9eOKwzR0.js → asm-rRKC1OUx.js} +0 -0
  315. /package/dist/web/assets/{aurora-x-B5ZH4t7t.js → aurora-x-DwQr0DkG.js} +0 -0
  316. /package/dist/web/assets/{awk-Dqilob-2.js → awk-Bpt768fN.js} +0 -0
  317. /package/dist/web/assets/{ayu-dark-CPgRhf5r.js → ayu-dark-D9lwQHMs.js} +0 -0
  318. /package/dist/web/assets/{ayu-light-Do06Q52f.js → ayu-light-B4-ptrU5.js} +0 -0
  319. /package/dist/web/assets/{ayu-mirage-_BhxcrxY.js → ayu-mirage-DAyRzH5Q.js} +0 -0
  320. /package/dist/web/assets/{ballerina-DDwK54QW.js → ballerina-Cgdpj1HC.js} +0 -0
  321. /package/dist/web/assets/{bat-BGyGlzGk.js → bat-4FrN36S2.js} +0 -0
  322. /package/dist/web/assets/{beancount-CRWBdapI.js → beancount-DkcxQER3.js} +0 -0
  323. /package/dist/web/assets/{berry-DbSFn2gO.js → berry-Dnuut-Ml.js} +0 -0
  324. /package/dist/web/assets/{bibtex-QpsV9gm9.js → bibtex-CCDwmbuA.js} +0 -0
  325. /package/dist/web/assets/{bicep-CxS8CUve.js → bicep-BC0ryoGM.js} +0 -0
  326. /package/dist/web/assets/{bird2-CuZhQzYR.js → bird2-C50V_A-0.js} +0 -0
  327. /package/dist/web/assets/{c-9bnDqE3g.js → c-Ddorhq0U.js} +0 -0
  328. /package/dist/web/assets/{c3-JMZTrOhA.js → c3-DdIf5r9E.js} +0 -0
  329. /package/dist/web/assets/{cadence-DsDNayJS.js → cadence-s9pd1Wng.js} +0 -0
  330. /package/dist/web/assets/{can-open-in-ppm-BJfpynya.js → can-open-in-ppm-C6hZV1OP.js} +0 -0
  331. /package/dist/web/assets/{catppuccin-frappe-DYIKXXBe.js → catppuccin-frappe-CzJNTyu-.js} +0 -0
  332. /package/dist/web/assets/{catppuccin-latte-IYYOnUJ8.js → catppuccin-latte-BNpt-m7s.js} +0 -0
  333. /package/dist/web/assets/{catppuccin-macchiato-BrJ_7mfS.js → catppuccin-macchiato-FYGkfsJ5.js} +0 -0
  334. /package/dist/web/assets/{catppuccin-mocha-gzSu7v7-.js → catppuccin-mocha-it2g5D1q.js} +0 -0
  335. /package/dist/web/assets/{clarity-DLzsC0Hb.js → clarity-BVFBTjMe.js} +0 -0
  336. /package/dist/web/assets/{clipboard-7fw0Shic.js → clipboard-BWznymz7.js} +0 -0
  337. /package/dist/web/assets/{clojure-DS1BvoTt.js → clojure-BSYvXMI8.js} +0 -0
  338. /package/dist/web/assets/{cmake-CDvsJwYp.js → cmake-DGEqH-Np.js} +0 -0
  339. /package/dist/web/assets/{codeowners-BjsYiflJ.js → codeowners-D8FCOxWg.js} +0 -0
  340. /package/dist/web/assets/{codeql-CG-7ARat.js → codeql-COV0eluG.js} +0 -0
  341. /package/dist/web/assets/{common-lisp-DSO1Lbh9.js → common-lisp-xHnZUlgt.js} +0 -0
  342. /package/dist/web/assets/{coq-DYdh3oP_.js → coq-Cs_2i3Xg.js} +0 -0
  343. /package/dist/web/assets/{csharp-DxEBz5s0.js → csharp-B1ONB4PT.js} +0 -0
  344. /package/dist/web/assets/{css-dal3Q-8C.js → css-BgGQbvrZ.js} +0 -0
  345. /package/dist/web/assets/{csv-CpqjMGiA.js → csv-CNHmQBzs.js} +0 -0
  346. /package/dist/web/assets/{csv-parser-3umBA4NY.js → csv-parser-DWR24J17.js} +0 -0
  347. /package/dist/web/assets/{cue-DinoJ_5k.js → cue-ZXAKzwIy.js} +0 -0
  348. /package/dist/web/assets/{cypher-DzxqmkUW.js → cypher-4PL5bmT5.js} +0 -0
  349. /package/dist/web/assets/{d-BxNwJuEC.js → d-CEsV3RT2.js} +0 -0
  350. /package/dist/web/assets/{dark-plus-Clmv3V-0.js → dark-plus-NtFnYSDz.js} +0 -0
  351. /package/dist/web/assets/{dart-BWVtXD35.js → dart-CKHn4mDf.js} +0 -0
  352. /package/dist/web/assets/{data-grid-types-B4n51Fck.js → data-grid-types-CxU8oo-j.js} +0 -0
  353. /package/dist/web/assets/{dax-DsImuWgJ.js → dax-Cmkj1I_M.js} +0 -0
  354. /package/dist/web/assets/{desktop-B0jJuG2r.js → desktop-DJLalvPQ.js} +0 -0
  355. /package/dist/web/assets/{diff-CWqAAxoE.js → diff-BnS2wpj6.js} +0 -0
  356. /package/dist/web/assets/{dist-C0eNNfbt.js → dist-CuIdRyUB.js} +0 -0
  357. /package/dist/web/assets/{dist-B-EXdSYE.js → dist-uYjs3Wv6.js} +0 -0
  358. /package/dist/web/assets/{docker-CYFCJdIL.js → docker-CovNy7ml.js} +0 -0
  359. /package/dist/web/assets/{dotenv-CKDUjURg.js → dotenv-Gh4w3I6B.js} +0 -0
  360. /package/dist/web/assets/{dracula-CSoPspHE.js → dracula-NF0tAHXl.js} +0 -0
  361. /package/dist/web/assets/{dracula-soft-BuFjw5L1.js → dracula-soft-Cj_qBurK.js} +0 -0
  362. /package/dist/web/assets/{dream-maker-B6PdDRZu.js → dream-maker-CRuZPcl7.js} +0 -0
  363. /package/dist/web/assets/{emacs-lisp-CMcXvD0G.js → emacs-lisp-BACmC9qj.js} +0 -0
  364. /package/dist/web/assets/{everforest-dark-cU8-wYzi.js → everforest-dark-Dd9av4QG.js} +0 -0
  365. /package/dist/web/assets/{everforest-light-KhorllqK.js → everforest-light-C-jsss-B.js} +0 -0
  366. /package/dist/web/assets/{external-link-B8BynhvY.js → external-link-B6Hl0U4X.js} +0 -0
  367. /package/dist/web/assets/{fennel-BCELZK87.js → fennel-BJA9XnL8.js} +0 -0
  368. /package/dist/web/assets/{file-exclamation-point-CZ4DiR75.js → file-exclamation-point-JzhTU2TX.js} +0 -0
  369. /package/dist/web/assets/{fish-BQc0y_jy.js → fish-CKlhNSc2.js} +0 -0
  370. /package/dist/web/assets/{fluent-BTINnwF6.js → fluent-wfglRk5D.js} +0 -0
  371. /package/dist/web/assets/{folder-symlink-B8XrtvQK.js → folder-symlink-Dx1hOk8X.js} +0 -0
  372. /package/dist/web/assets/{format-bytes-WVcFxJuT.js → format-bytes-utwHMTry.js} +0 -0
  373. /package/dist/web/assets/{fortran-free-form-BQim9wDz.js → fortran-free-form-BlXCdid3.js} +0 -0
  374. /package/dist/web/assets/{gdscript-03w5u8un.js → gdscript-BwAVG6Et.js} +0 -0
  375. /package/dist/web/assets/{gdshader-Dp2daNzU.js → gdshader-DPc_T7ib.js} +0 -0
  376. /package/dist/web/assets/{genie-CoNcjPiD.js → genie-B-zZSLCX.js} +0 -0
  377. /package/dist/web/assets/{gherkin-NrPOSPQL.js → gherkin-CJ0ajpGs.js} +0 -0
  378. /package/dist/web/assets/{github-dark-z4RE9ZqA.js → github-dark-Dz8ZkzSP.js} +0 -0
  379. /package/dist/web/assets/{github-dark-default-DOKw-1cI.js → github-dark-default-CNUYo_kp.js} +0 -0
  380. /package/dist/web/assets/{github-dark-dimmed-DJRNMkEA.js → github-dark-dimmed-241z_Ycx.js} +0 -0
  381. /package/dist/web/assets/{github-dark-high-contrast-Bj7jJ_Gs.js → github-dark-high-contrast-7r6yZZYH.js} +0 -0
  382. /package/dist/web/assets/{github-light-B4k_yMFu.js → github-light-C8gmZn-D.js} +0 -0
  383. /package/dist/web/assets/{github-light-default-BHc-Uzhs.js → github-light-default-GAEgq1eA.js} +0 -0
  384. /package/dist/web/assets/{github-light-high-contrast-CHisIywL.js → github-light-high-contrast-3z91352E.js} +0 -0
  385. /package/dist/web/assets/{gleam-CfbypZ4q.js → gleam-C7vxW5zd.js} +0 -0
  386. /package/dist/web/assets/{gn-YoAjyhJa.js → gn-CyJIXwHP.js} +0 -0
  387. /package/dist/web/assets/{gnuplot-xVkc1f1c.js → gnuplot-CqLbGgPd.js} +0 -0
  388. /package/dist/web/assets/{go-GPCwP3Gu.js → go-DdDcK9aX.js} +0 -0
  389. /package/dist/web/assets/{groovy-Crh4Yww9.js → groovy-UYHggEqH.js} +0 -0
  390. /package/dist/web/assets/{gruvbox-dark-hard-BluUFuDS.js → gruvbox-dark-hard-B4ierkJn.js} +0 -0
  391. /package/dist/web/assets/{gruvbox-dark-medium-Cxk1FWQp.js → gruvbox-dark-medium-DYwkDSZ6.js} +0 -0
  392. /package/dist/web/assets/{gruvbox-dark-soft-CHXMiFmj.js → gruvbox-dark-soft-CVL4P-Lz.js} +0 -0
  393. /package/dist/web/assets/{gruvbox-light-hard-B6eKPjAD.js → gruvbox-light-hard-BJ0LewUZ.js} +0 -0
  394. /package/dist/web/assets/{gruvbox-light-medium-pDwMm1ut.js → gruvbox-light-medium-CaqqjeGJ.js} +0 -0
  395. /package/dist/web/assets/{gruvbox-light-soft-Cxu6kHqK.js → gruvbox-light-soft-ByKMoVNr.js} +0 -0
  396. /package/dist/web/assets/{haskell-C6JKHjbK.js → haskell-BilYRVPp.js} +0 -0
  397. /package/dist/web/assets/{haxe-BuBNdF0a.js → haxe-Brs9Bj1s.js} +0 -0
  398. /package/dist/web/assets/{hcl-DZpDdGj2.js → hcl-ClrZpol-.js} +0 -0
  399. /package/dist/web/assets/{hjson-CBkhYRuo.js → hjson-9PvHnYMX.js} +0 -0
  400. /package/dist/web/assets/{hlsl-C5nMxnp9.js → hlsl-BbBk4vqV.js} +0 -0
  401. /package/dist/web/assets/{horizon-VAFvA6R6.js → horizon-E5Py0cny.js} +0 -0
  402. /package/dist/web/assets/{horizon-bright-BC0xn7T3.js → horizon-bright-DVCsNGEk.js} +0 -0
  403. /package/dist/web/assets/{houston-BxrUivmz.js → houston-JdFEax9Y.js} +0 -0
  404. /package/dist/web/assets/{hy-DLtOXoaH.js → hy-W_W3tLKT.js} +0 -0
  405. /package/dist/web/assets/{image-gallery-Gnf7TdCR.js → image-gallery-5IURd6db.js} +0 -0
  406. /package/dist/web/assets/{imba-BdpFXM2W.js → imba-CfAqJz7T.js} +0 -0
  407. /package/dist/web/assets/{ini-BInJO_T0.js → ini-C_3gvKWs.js} +0 -0
  408. /package/dist/web/assets/{java-Dxuddnkb.js → java-CKqtXZ-j.js} +0 -0
  409. /package/dist/web/assets/{javascript-CVamJfLY.js → javascript-C7gSEfae.js} +0 -0
  410. /package/dist/web/assets/{json-BLZ0ozYk.js → json-BoN6e11T.js} +0 -0
  411. /package/dist/web/assets/{json5-BnXzmMKs.js → json5-CgE7C8HW.js} +0 -0
  412. /package/dist/web/assets/{jsonc-CSgkSga7.js → jsonc-DjyoattY.js} +0 -0
  413. /package/dist/web/assets/{jsonl-CY5W2nF2.js → jsonl-lI82wGSw.js} +0 -0
  414. /package/dist/web/assets/{jsonnet-CEJYH3sF.js → jsonnet-CszEI8va.js} +0 -0
  415. /package/dist/web/assets/{jssm-CsJc7Uhk.js → jssm-CZXDlszb.js} +0 -0
  416. /package/dist/web/assets/{jsx-jCiRaHU7.js → jsx-BeRz0eEz.js} +0 -0
  417. /package/dist/web/assets/{kanagawa-dragon-DfoA_GxX.js → kanagawa-dragon-BOmnUiyd.js} +0 -0
  418. /package/dist/web/assets/{kanagawa-lotus-BOLYJpWd.js → kanagawa-lotus-ffU_P5w-.js} +0 -0
  419. /package/dist/web/assets/{kanagawa-wave-DfKlbT1G.js → kanagawa-wave-DKTJZrMu.js} +0 -0
  420. /package/dist/web/assets/{kdl-CmssIFTi.js → kdl-BWECJveH.js} +0 -0
  421. /package/dist/web/assets/{kotlin-BRsNgp6x.js → kotlin-DpVwBCSt.js} +0 -0
  422. /package/dist/web/assets/{kusto-T8X9jUab.js → kusto-BgVqjUZA.js} +0 -0
  423. /package/dist/web/assets/{laserwave-DkJMVJ8Z.js → laserwave-CEVCi8em.js} +0 -0
  424. /package/dist/web/assets/{lean-C65KGVPq.js → lean-CGyfRhLJ.js} +0 -0
  425. /package/dist/web/assets/{less-exIPdDlf.js → less-B0_H10Ku.js} +0 -0
  426. /package/dist/web/assets/{lib-mC1NZfuw.js → lib-hrC3bruJ.js} +0 -0
  427. /package/dist/web/assets/{libesm-DSutUtl1.js → libesm-DVpFmwJu.js} +0 -0
  428. /package/dist/web/assets/{light-plus-DiHUXAZt.js → light-plus-DqzMqPID.js} +0 -0
  429. /package/dist/web/assets/{llvm-CJBnEzFM.js → llvm-9ucnfNiF.js} +0 -0
  430. /package/dist/web/assets/{loader-circle-gSPVxfvH.js → loader-circle-Dpqcv0eS.js} +0 -0
  431. /package/dist/web/assets/{lock-Did-87UV.js → lock-DldbT31x.js} +0 -0
  432. /package/dist/web/assets/{log-DxMyUMuP.js → log-m6A2dOSj.js} +0 -0
  433. /package/dist/web/assets/{logo-CC9NKzca.js → logo-ByPcsC9P.js} +0 -0
  434. /package/dist/web/assets/{luau-Bw10I6zf.js → luau-DFCo8nBn.js} +0 -0
  435. /package/dist/web/assets/{make-C_6M90m6.js → make-C90w3MeA.js} +0 -0
  436. /package/dist/web/assets/{markdown-bR9_R-LF.js → markdown-DT0uywZG.js} +0 -0
  437. /package/dist/web/assets/{material-theme-BUx2Qujn.js → material-theme-BVUO93tJ.js} +0 -0
  438. /package/dist/web/assets/{material-theme-darker-CRJrPgKm.js → material-theme-darker-xXgGDwnF.js} +0 -0
  439. /package/dist/web/assets/{material-theme-lighter-CUAYppPa.js → material-theme-lighter-BjStPzWB.js} +0 -0
  440. /package/dist/web/assets/{material-theme-ocean-DuINF1fg.js → material-theme-ocean-wFmSiKjy.js} +0 -0
  441. /package/dist/web/assets/{material-theme-palenight-W6_icGCj.js → material-theme-palenight-e-0CtRoe.js} +0 -0
  442. /package/dist/web/assets/{matlab-rfqn_b3z.js → matlab-BNaNQAUH.js} +0 -0
  443. /package/dist/web/assets/{mdx-Bh1B_YOJ.js → mdx-DfpVWAqO.js} +0 -0
  444. /package/dist/web/assets/{mermaid-Dxf6Ya2k.js → mermaid-Bpq7wFCP.js} +0 -0
  445. /package/dist/web/assets/{min-dark-CivZ2L0h.js → min-dark-CL2Y0WH6.js} +0 -0
  446. /package/dist/web/assets/{min-light-B1Ykqtma.js → min-light-DOgr_IdP.js} +0 -0
  447. /package/dist/web/assets/{mipsasm-DynHaM0d.js → mipsasm-C9ie2zlB.js} +0 -0
  448. /package/dist/web/assets/{mojo-Clw5PbGH.js → mojo-Md2A2sJy.js} +0 -0
  449. /package/dist/web/assets/{monitor-Dv8vn_6O.js → monitor-4vWfqzuN.js} +0 -0
  450. /package/dist/web/assets/{monokai-DFIooFZT.js → monokai-nbXIEySB.js} +0 -0
  451. /package/dist/web/assets/{moonbit-DnBSZWGM.js → moonbit-CJ-T-s4A.js} +0 -0
  452. /package/dist/web/assets/{move-CCcL2PfL.js → move-DwEehLIK.js} +0 -0
  453. /package/dist/web/assets/{narrat-BDarg5Lk.js → narrat-CuF4sIKr.js} +0 -0
  454. /package/dist/web/assets/{nextflow-groovy-DrZOeCNW.js → nextflow-groovy-1dYhfPfq.js} +0 -0
  455. /package/dist/web/assets/{night-owl-BnZZCK7v.js → night-owl-gZS5mfzY.js} +0 -0
  456. /package/dist/web/assets/{night-owl-light-CEwBsVHS.js → night-owl-light-DDAster5.js} +0 -0
  457. /package/dist/web/assets/{nix-amCzOPMR.js → nix-BlbEYs2c.js} +0 -0
  458. /package/dist/web/assets/{nord-BIs2BC6q.js → nord-BRiPb8Vy.js} +0 -0
  459. /package/dist/web/assets/{nushell-Y02fo4yw.js → nushell-DgWicB1i.js} +0 -0
  460. /package/dist/web/assets/{objective-c-7xOZtWW1.js → objective-c-D8mPZ42Y.js} +0 -0
  461. /package/dist/web/assets/{objective-cpp-eVtjUvVB.js → objective-cpp-B0pNXzuj.js} +0 -0
  462. /package/dist/web/assets/{ocaml-Bi6ZwqG4.js → ocaml-lQd7aK5d.js} +0 -0
  463. /package/dist/web/assets/{odin-8xf1Y0S9.js → odin-CxtIOBjm.js} +0 -0
  464. /package/dist/web/assets/{one-dark-pro-hVv-_y_b.js → one-dark-pro-T_UFnWfe.js} +0 -0
  465. /package/dist/web/assets/{one-light-CJJ3MtHt.js → one-light-LBVqwyV-.js} +0 -0
  466. /package/dist/web/assets/{openscad-B2HcywLk.js → openscad-C5dnS6J7.js} +0 -0
  467. /package/dist/web/assets/{pascal-C7fllV_7.js → pascal-CmWCWQML.js} +0 -0
  468. /package/dist/web/assets/{pkl-qvLC1IWP.js → pkl-BWWOtDQk.js} +0 -0
  469. /package/dist/web/assets/{plastic-BT1wHZv2.js → plastic-ekhupckF.js} +0 -0
  470. /package/dist/web/assets/{play-4MZi1Axp.js → play-CpCAoQRZ.js} +0 -0
  471. /package/dist/web/assets/{plsql-1MsmdmJD.js → plsql-BPsDHXx4.js} +0 -0
  472. /package/dist/web/assets/{plus-BhMZqFsN.js → plus-BR0qewJI.js} +0 -0
  473. /package/dist/web/assets/{po-BigskytD.js → po-BX2FiuW2.js} +0 -0
  474. /package/dist/web/assets/{poimandres-DuklniF7.js → poimandres-DzXOdZcN.js} +0 -0
  475. /package/dist/web/assets/{polar-e2pjN_sp.js → polar-DDRXgJzG.js} +0 -0
  476. /package/dist/web/assets/{portal-container-context-Cm5HipFr.js → portal-container-context-a399Hd9F.js} +0 -0
  477. /package/dist/web/assets/{postcss-DtAeYjWw.js → postcss-BHW6XBhx.js} +0 -0
  478. /package/dist/web/assets/{powerquery-Cr2PtehI.js → powerquery-B89c2NBb.js} +0 -0
  479. /package/dist/web/assets/{powershell-BxFTGLJ4.js → powershell-Dvxrd3Tu.js} +0 -0
  480. /package/dist/web/assets/{prisma-COWJiwdZ.js → prisma-lMK8EFLU.js} +0 -0
  481. /package/dist/web/assets/{prolog-DFvGKRx6.js → prolog-D0YrtMG4.js} +0 -0
  482. /package/dist/web/assets/{proto-CcK80lFt.js → proto-J0mM25aw.js} +0 -0
  483. /package/dist/web/assets/{puppet-BF60bZ4F.js → puppet-CUT0xkhh.js} +0 -0
  484. /package/dist/web/assets/{purescript-zL_69MzU.js → purescript-CoJWSGRp.js} +0 -0
  485. /package/dist/web/assets/{python-CIwKhfb_.js → python-BBrmuz6P.js} +0 -0
  486. /package/dist/web/assets/{qmldir-CXNe04Lo.js → qmldir-CUtzs4Q7.js} +0 -0
  487. /package/dist/web/assets/{qss-C8lAWe6G.js → qss-Dm1RZ8aL.js} +0 -0
  488. /package/dist/web/assets/{r-CL5ZVL3_.js → r-BGP7qZTe.js} +0 -0
  489. /package/dist/web/assets/{racket-BBfh0uh0.js → racket-K_6U1lqJ.js} +0 -0
  490. /package/dist/web/assets/{raku-o6E8R5Q3.js → raku-bNSiZeW_.js} +0 -0
  491. /package/dist/web/assets/{react-CBTnT4sY.js → react-X4jUntEf.js} +0 -0
  492. /package/dist/web/assets/{red-GomRF2Xp.js → red-uVeIEF0f.js} +0 -0
  493. /package/dist/web/assets/{refresh-cw-B06yaBrW.js → refresh-cw-B9iv7csb.js} +0 -0
  494. /package/dist/web/assets/{reg-_ffDIvx9.js → reg-DSm9GWjh.js} +0 -0
  495. /package/dist/web/assets/{regexp-Bl5sF65W.js → regexp-CljRm_j_.js} +0 -0
  496. /package/dist/web/assets/{rel-DgMdqDuj.js → rel-d3JcopZg.js} +0 -0
  497. /package/dist/web/assets/{resolve-theme-CRt_7wpd.js → resolve-theme-DLKmm-lE.js} +0 -0
  498. /package/dist/web/assets/{riscv-8b3-Ye4X.js → riscv-CJmaELjT.js} +0 -0
  499. /package/dist/web/assets/{ron-DrmU1KHP.js → ron-D0g9B1rW.js} +0 -0
  500. /package/dist/web/assets/{rose-pine-C_-E2tF1.js → rose-pine-DOrD2BSH.js} +0 -0
  501. /package/dist/web/assets/{rose-pine-dawn-DEfhNlFH.js → rose-pine-dawn-CzZQ-LCF.js} +0 -0
  502. /package/dist/web/assets/{rose-pine-moon-BdvX3gdn.js → rose-pine-moon-CdmsYp7C.js} +0 -0
  503. /package/dist/web/assets/{rosmsg-B6GhGpd5.js → rosmsg-CmDth6pO.js} +0 -0
  504. /package/dist/web/assets/{rotate-ccw-COXu_9oj.js → rotate-ccw-DnuPzJRE.js} +0 -0
  505. /package/dist/web/assets/{rust-DmC97M1-.js → rust-DGdP6jiR.js} +0 -0
  506. /package/dist/web/assets/{sass-B0tJOHLM.js → sass-Dkgt2FKZ.js} +0 -0
  507. /package/dist/web/assets/{save-CtIGOjmx.js → save-DxonD4y1.js} +0 -0
  508. /package/dist/web/assets/{scala-n8zaFOXv.js → scala-BQLTON6C.js} +0 -0
  509. /package/dist/web/assets/{scheme-BKD9ztBU.js → scheme-DKlxUGCi.js} +0 -0
  510. /package/dist/web/assets/{sdbl-D8gB5-rS.js → sdbl-C3iZJQeZ.js} +0 -0
  511. /package/dist/web/assets/{send-BlyNJAzy.js → send-B-t5Mz26.js} +0 -0
  512. /package/dist/web/assets/{shallow-DYo6goJ4.js → shallow-jwPzEunk.js} +0 -0
  513. /package/dist/web/assets/{shellscript-BfXlf_Ao.js → shellscript-BRu-ZQAx.js} +0 -0
  514. /package/dist/web/assets/{shield-check-B0iGUiOK.js → shield-check-CdTiK1j2.js} +0 -0
  515. /package/dist/web/assets/{shield-off-BNLWBhcq.js → shield-off-DuetkXKM.js} +0 -0
  516. /package/dist/web/assets/{slack-dark-CylEddse.js → slack-dark-qkm_u2zz.js} +0 -0
  517. /package/dist/web/assets/{slack-ochin-w8wg8vuC.js → slack-ochin-BP8_8e4m.js} +0 -0
  518. /package/dist/web/assets/{smalltalk-hiAXA64u.js → smalltalk-Bnz4gt07.js} +0 -0
  519. /package/dist/web/assets/{snazzy-light-BwlV3Xty.js → snazzy-light-fbPZg5io.js} +0 -0
  520. /package/dist/web/assets/{solarized-dark-vmNGdykz.js → solarized-dark-CM0vTRoi.js} +0 -0
  521. /package/dist/web/assets/{solarized-light-DGv_0JXq.js → solarized-light-C4_W9mvs.js} +0 -0
  522. /package/dist/web/assets/{solidity-Y7QSH0B1.js → solidity-Bz6v1PoD.js} +0 -0
  523. /package/dist/web/assets/{splunk-BtgpLjHi.js → splunk-DyNxu-0i.js} +0 -0
  524. /package/dist/web/assets/{sql-CRHYhOia.js → sql-DXRL1gw1.js} +0 -0
  525. /package/dist/web/assets/{ssh-config-DOqSs3au.js → ssh-config-2z1QHuOG.js} +0 -0
  526. /package/dist/web/assets/{stylus-crCAEaBT.js → stylus-D4I-VaeY.js} +0 -0
  527. /package/dist/web/assets/{swift-eE3rT7TC.js → swift-C_2G-tIc.js} +0 -0
  528. /package/dist/web/assets/{synthwave-84-BWy14LBX.js → synthwave-84-osBjChRP.js} +0 -0
  529. /package/dist/web/assets/{system-verilog-DC0-DZM4.js → system-verilog-zQP2qPNU.js} +0 -0
  530. /package/dist/web/assets/{systemd-to5p6N8I.js → systemd-UGfjRSBM.js} +0 -0
  531. /package/dist/web/assets/{table-Bbc783ko.js → table-FLU8ei8b.js} +0 -0
  532. /package/dist/web/assets/{talonscript-DoTcU8wm.js → talonscript-C1XrFPwo.js} +0 -0
  533. /package/dist/web/assets/{tasl-cNZvUs95.js → tasl-B5raVn43.js} +0 -0
  534. /package/dist/web/assets/{tcl-mZE8sZH8.js → tcl-3-vbeMIc.js} +0 -0
  535. /package/dist/web/assets/{terraform-CqHPpIfu.js → terraform-a8VXZDm9.js} +0 -0
  536. /package/dist/web/assets/{text-wrap-CBT4Gxtg.js → text-wrap-B05VGRa-.js} +0 -0
  537. /package/dist/web/assets/{tokyo-night-Tp2rTIZd.js → tokyo-night-4SRhf-Hz.js} +0 -0
  538. /package/dist/web/assets/{toml-CU_vscgn.js → toml-B4N0i8wT.js} +0 -0
  539. /package/dist/web/assets/{trash-2-Bk4yYlck.js → trash-2-CTXlTflF.js} +0 -0
  540. /package/dist/web/assets/{triangle-alert-B8EYecpe.js → triangle-alert-BRq0VAfd.js} +0 -0
  541. /package/dist/web/assets/{tsv-ik7iFB9D.js → tsv-DA5k9Lvw.js} +0 -0
  542. /package/dist/web/assets/{tsx-BMvvMKiv.js → tsx-D9SZ8owC.js} +0 -0
  543. /package/dist/web/assets/{turtle-DBqKCq9o.js → turtle-BTHTvyY_.js} +0 -0
  544. /package/dist/web/assets/{typescript-DXJDmMZZ.js → typescript-DYzV9p5L.js} +0 -0
  545. /package/dist/web/assets/{typespec-CBseCMtZ.js → typespec-BC15eh7F.js} +0 -0
  546. /package/dist/web/assets/{typst-4oY25U9y.js → typst-BJUqzA6D.js} +0 -0
  547. /package/dist/web/assets/{use-is-mobile-D1weanbj.js → use-is-mobile-DFWViA4S.js} +0 -0
  548. /package/dist/web/assets/{utils-BNRH507E.js → utils-C9OjCrou.js} +0 -0
  549. /package/dist/web/assets/{v-BXaZ_1oy.js → v-50Lps6oA.js} +0 -0
  550. /package/dist/web/assets/{vala-BImWJE7z.js → vala-8wiUvvrD.js} +0 -0
  551. /package/dist/web/assets/{vb-CLfj2_sy.js → vb-BlgPLt6B.js} +0 -0
  552. /package/dist/web/assets/{vendor-xterm-_yyu5n32.js → vendor-xterm-BZOrwF_F.js} +0 -0
  553. /package/dist/web/assets/{verilog-BWa8Ed2b.js → verilog-CD9pVW5p.js} +0 -0
  554. /package/dist/web/assets/{vesper-BGj1cg6m.js → vesper-BrivW4PT.js} +0 -0
  555. /package/dist/web/assets/{vhdl-mByK7mlx.js → vhdl-Bunxfa7N.js} +0 -0
  556. /package/dist/web/assets/{viml-CugmlW5g.js → viml-DndUb2qM.js} +0 -0
  557. /package/dist/web/assets/{vitesse-black-vPdpy9TL.js → vitesse-black-BurZSkxW.js} +0 -0
  558. /package/dist/web/assets/{vitesse-dark-BuQK3dUh.js → vitesse-dark-8UShspzC.js} +0 -0
  559. /package/dist/web/assets/{vitesse-light-B3nz1XL9.js → vitesse-light-DghCAZ90.js} +0 -0
  560. /package/dist/web/assets/{vyper-DH_GTIHG.js → vyper-b-Clr-8u.js} +0 -0
  561. /package/dist/web/assets/{wasm-DfVbVJlW.js → wasm-C5v2T06Y.js} +0 -0
  562. /package/dist/web/assets/{wasm-C-LF9GjX.js → wasm-CpcKStkw.js} +0 -0
  563. /package/dist/web/assets/{wenyan-CzQkHyHx.js → wenyan-Dz2srLZR.js} +0 -0
  564. /package/dist/web/assets/{wgsl-Du_M1DW9.js → wgsl-CeD1-dRb.js} +0 -0
  565. /package/dist/web/assets/{wikitext-BWN_w5S7.js → wikitext-CyeS-9FH.js} +0 -0
  566. /package/dist/web/assets/{wit-BR13v5HD.js → wit-Kr-q-qBQ.js} +0 -0
  567. /package/dist/web/assets/{wolfram-BoXxp_Xl.js → wolfram-BKm8bmln.js} +0 -0
  568. /package/dist/web/assets/{x-nhriOX9o.js → x-YDu4m2Iq.js} +0 -0
  569. /package/dist/web/assets/{yaml-DpR_EF-d.js → yaml-2XSxomjM.js} +0 -0
  570. /package/dist/web/assets/{zenscript-C-EdUtUd.js → zenscript-CKIS34vf.js} +0 -0
  571. /package/dist/web/assets/{zig-BD4eA5nU.js → zig-DdHGNllX.js} +0 -0
@@ -1,813 +1,25 @@
1
1
  # PPM Project Changelog
2
2
 
3
- All notable changes to PPM are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/).
3
+ **The changelog lives at [`../CHANGELOG.md`](../CHANGELOG.md).** That file is the one the release
4
+ process updates (see the release steps in `CLAUDE.md` and `deployment-guide.md`), and the one
5
+ published with each npm release.
4
6
 
5
- **Current Version:** v0.14.8
6
- **Last Updated:** 2026-06-21
7
+ This file previously held a second, hand-maintained copy. It fell six versions behind — its last
8
+ entry was v0.13.0 while releases had reached v0.18.x — and it still carried an "Unreleased" section
9
+ listing features that had long since shipped. A changelog that disagrees with the real one is worse
10
+ than no changelog, so the duplicate is gone rather than being repaired.
7
11
 
8
- ---
12
+ The old entries remain in git history if you need them:
9
13
 
10
- ## [0.13.0] — 2026-04-21 — PPM Export Skill
14
+ ```bash
15
+ git log --follow -p -- docs/project-changelog.md
16
+ ```
11
17
 
12
- ### Added
13
- - **`ppm export skill`** — self-describe for external AI. Installs a Claude Code skill at `~/.claude/skills/ppm/` (or `<project>/.claude/skills/ppm/` with `--scope project`, or custom `--output <dir>`) so external AI agents can autonomously control PPM via its CLI, HTTP API, and SQLite config DB. Skill package contains `SKILL.md` + `references/{cli-reference,http-api,db-schema,common-tasks}.md`.
14
- - **Build-time generators** (`scripts/generate-ppm-skill.ts` + `scripts/lib/`): walk the Commander tree for CLI reference and regex-scan `src/server/index.ts` + `src/server/routes/*.ts` for HTTP API reference. Zero-side-effect static introspection.
15
- - **Runtime generator** (`src/services/skill-export/generate-db-schema.ts`): opens `~/.ppm/ppm.db` readonly via `bun:sqlite` and emits markdown tables per PRAGMA table_info.
16
- - **Re-install safety**: existing skill files renamed to `<name>.bak-<YYYYMMDDHHmm>` before overwrite; never destructive.
17
- - **`buildProgram()` export** in `src/index.ts` — the assembled Commander tree without `.parse()`, enabling build-time doc tools.
18
+ ## Where to look
18
19
 
19
- ### Changed
20
- - `scripts/generate-ppm-guide.ts` → `scripts/generate-ppm-skill.ts`; `assets/skills/ppm-guide/` → `assets/skills/ppm/`; `generate:guide` npm script → `generate:skill`.
21
-
22
- ---
23
-
24
- ## [Unreleased] Chat Live Task Tracker, Scheduled Agents, Resource Monitor, Lazy-Load File Tree + Palette Index, Session Tagging, File Compare, Draft Messages, Jira Debug Session Redesign, Frontend Memory Optimization, Git-Graph Enhancements, Command Palette Filter Chips, Custom Project Avatars
25
-
26
- ### Added
27
- - **Native Group-Chat Engine** — Multi-agent shared-channel group chat. A leader agent + members split work, discuss over a shared message bus (sequential @mention-driven turns), and converge to a single final answer, rendered as a team chat.
28
- - Data model (schema v35): `chat_groups`, `chat_group_members`, `chat_group_messages` (single-table bus keyed by `kind` + JSON `data`, monotonic `seq` for stable ordering).
29
- - Provider-agnostic turn engine with windowed context + PPM-side naive rolling summary; four termination conditions (leader `DONE:`, max-turns=40, budget cap=$5.0, external Stop) — always emits exactly one `final`.
30
- - Option A+ transcript archive: member session JSONLs are copied to `~/.ppm/teams/<group>/transcripts/` and the raw files deleted (copy verified before delete) to keep `~/.claude/projects` clean; "view full" reads from the archive.
31
- - REST `/api/group-chat` (CRUD, feed, message, stop/resume, transcript) + WS `/ws/project/:name/group/:groupId` (live bus stream + reconnect buffer, detached loop).
32
- - Stop pauses the group mid-turn (cooperative cancel); Resume re-spawns fresh member sessions and re-enters the loop seeded from the durable bus (works even after archive).
33
- - **Custom Project Avatars** — Set any project's avatar to an uploaded image
34
- - Upload via desktop right-click menu on project (switcher/bar) or mobile long-press (bottom-sheet) → "Change Image"
35
- - Client-side resizing: canvas center-crop to square, downscale to 128×128 webp 0.85 quality, max 10MB
36
- - Storage: content-addressed at `~/.ppm/avatars/<sha256>.webp` for deduplication across projects
37
- - Endpoints: `POST /api/projects/:name/image` (upload), `GET /api/projects/:name/image` (stream with immutable cache), `DELETE /api/projects/:name/image` (remove)
38
- - Auth: Token in URL query param enables `<img>` loads when auth enabled; path-traversal protected
39
- - Rendering: Shared `ProjectAvatar` component displays custom image or fallback to color+initials everywhere (switcher, mobile-nav, bottom-sheet)
40
- - Lifecycle: Preserved across project rename, cleaned up on project delete, override initialed avatar in all UIs
41
- - Tests: 9 new route tests in `tests/unit/routes/projects-routes.test.ts`; all 27 pass, typecheck clean
42
- - Service: `avatar-storage.service.ts` handles SHA256 dedup + disk ops; `resize-image.ts` performs client-side crop/scale
43
-
44
- - **Chat Live Task Tracker** — Real-time monitoring of Claude's Task* tool execution within chat
45
- - Backend: `TaskStatusAggregatorService` (`src/services/task-status-aggregator.ts`) — rebuilds task state from session JSONL with `aggregateTasks(messages): TaskItem[]`
46
- - Backend: New endpoint `GET /api/project/:projectName/chat/sessions/:id/tasks` — returns current tasks (immune to FE pagination); reuses session JSONL path resolution + parsing
47
- - Frontend: `task-tracker.tsx` component — pinned, collapsible tracker above chat scroll area (collapsed by default); auto-hides when all tasks done/stopped
48
- - Frontend: `use-tasks.ts` hook — fetches endpoint on Task events (TaskCreate/TaskUpdate/TaskStop), manages fetch gating
49
- - Tool cards: TaskCreate/TaskUpdate/TaskStop now render human-readable summaries (subject + status badge) instead of raw JSON
50
-
51
- ### Added
52
- - **Scheduled Agents (cron scheduler)** — periodically wake Claude sessions to work unattended
53
- - SQLite v31: `schedules` + `schedule_runs` tables; per-job cron expr, project, prompt, permission mode, budgets (max_turns/timeout_ms), snapshot `provider_id`
54
- - `scheduler-core.ts` (tick 60s, refcounted concurrency guard, skipped-run rows) + `scheduler-runner.ts` (1 persistent session per job, resume-or-create, 32KB head+tail output buffer, wall-clock timeout via `abortQuery`, session rotation at >80% context, Telegram summary via `notificationService.broadcast` offline-gate) + `scheduler-db.service.ts` (helpers, orphan cleanup >2h, 30-day run prune at boot)
55
- - CLI: `ppm schedule add|list|rm|enable|disable|run-now|runs` (run-now bypasses guard with `wasRunning` warning)
56
- - REST: `/api/schedules` CRUD + `/:id/run-now` + `/:id/runs` (cron + numeric budget validation)
57
- - Settings UI: "Scheduled Agents" section — mobile-first (bottom-sheet form, adaptive long-press menu, 44px targets), 10s visibility-gated polling, run history with status pills
58
- - SDK contract (additive): `done` ChatEvent now carries `costUsd`; `SendMessageOpts` accepts per-call `maxTurns`
59
- - 34 tests (db/runner/core/routes) + `tests/README.md` Docker bun workflow
60
- - **Command Palette Filter Chips** — Filter palette results by type with toggle chips
61
- - Chips appear above results when 2+ groups are available (Actions, Files, Database, Filesystem)
62
- - Each chip shows group label, icon, and live result count for the current query
63
- - Toggling a chip includes/excludes that group; multiple chips can be active simultaneously
64
- - Chips hidden when only one group has results (no filtering value)
65
- - Mobile-friendly: 44px touch targets, horizontally scrollable chip row
66
- - Files: `command-palette-filter-chips.tsx` (new presentational component), `command-palette.tsx` (filter state + `availableGroups` + `groupCounts` + `displayItems` logic)
67
-
68
-
69
- - **System Resource Monitor** — Real-time process monitoring with SSE streaming, sidebar status bar, and dedicated System Monitor tab
70
- - Backend: `ResourceMonitorService` polls `ps` command every 3s, builds process tree from PPM root PID, categorizes processes (server/terminal/ai-tool/build/unknown), maintains 30-min ring buffer (600 snapshots)
71
- - Backend: SSE streaming route at `GET /api/system/resources/stream` with client count cap (max 5), manual reconnect with exponential backoff
72
- - Backend: JSON snapshot endpoint at `GET /api/system/resources` + history endpoint at `GET /api/system/resources/history`
73
- - Backend: Cross-platform support (`ps` on macOS/Linux, graceful skip on Windows native)
74
- - Frontend: `useResourceMonitor()` hook provides shared EventSource with ref-counted singleton pattern, auto-reconnect, history ring buffer
75
- - Frontend: Compact resource status bar in sidebar footer showing CPU%/RAM/process count with color-coded CPU thresholds (green <50%, yellow 50-80%, red >80%)
76
- - Frontend: Full System Monitor tab with grouped processes, collapsible rows, individual process details, canvas-based sparklines (last 200 data points = ~10min)
77
- - Frontend: Chat session status badges (streaming/idle) pulled from streaming store
78
- - Frontend: Mobile-responsive layout with compact sparklines, touch-friendly collapsible groups
79
- - Auth: Token in URL query param for SSE EventSource (standard fetch credentials for auth)
80
- - Tests: Integration + unit tests for service, routes, hook, and components
81
-
82
- **Technical Details:**
83
- - **Files Created:**
84
- - `src/services/resource-monitor.service.ts` — Process polling, categorization, ring buffer
85
- - `src/server/routes/resources.ts` — SSE + JSON endpoints, client count tracking
86
- - `src/web/hooks/use-resource-monitor.ts` — EventSource hook with singleton ref counting
87
- - `src/web/components/system/resource-status-bar.tsx` — Compact status bar widget
88
- - `src/web/components/system/system-monitor-tab.tsx` — Full monitoring dashboard
89
- - `src/web/components/system/sparkline-canvas.tsx` — Canvas-based sparkline renderer
90
- - `tests/integration/resource-monitor.test.ts` — Service integration tests
91
- - `tests/integration/resources-route.test.ts` — Route integration tests
92
- - `tests/integration/use-resource-monitor.test.ts` — Hook integration tests
93
- - **Files Modified:**
94
- - `src/server/index.ts` — Mount resources route
95
- - `src/web/components/layout/tab-content.tsx` — Lazy-load system-monitor tab
96
- - `src/web/stores/tab-store.ts` — Add "system-monitor" TabType
97
- - `src/web/components/layout/sidebar.tsx` — Add ResourceStatusBar to footer
98
- - **Type Changes:**
99
- - New: `ProcessEntry` = { pid, ppid, cpu, ramMB, command }
100
- - New: `ResourceGroup` = { type, label, cpu, ramMB, processes[] }
101
- - New: `ResourceSnapshot` = { timestamp, server, total, groups[] }
102
- - **Breaking Changes:** None (additive feature)
103
- - **Performance:** ~50KB ring buffer (negligible), 3s polling lazy-started, SSE capped at 5 concurrent clients
104
-
105
- ### Added (continued)
106
- - **Draft Messages** — Auto-save chat input as drafts per session
107
- - Database: Schema v26 migration creates `chat_drafts` table with (project_path, session_id, content, attachments, updated_at) composite key
108
- - Service: `DraftService` with get/upsert/delete/deleteOrphaned CRUD operations; 50KB content cap with silent truncation
109
- - API: GET/PUT/DELETE `/chat/drafts/:sessionId` endpoints for draft persistence
110
- - Hook: `useDraft()` with debounced 1s save, attachment tracking, draft loading + clearing
111
- - UI: `onContentChange` callback in message-input.tsx triggers draft auto-save when user types
112
- - Session routing: Drafts stored per session + special `__new__` draft for unsaved sessions
113
- - Orphan cleanup: `deleteOrphaned()` removes drafts whose sessions no longer exist
114
-
115
- - **File Compare** — Side-by-side diff viewer for comparing two files or file versions
116
- - Four triggers: (1) tab right-click "Select for Compare" / "Compare with Selected", (2) file tree right-click (same), (3) command palette "Compare Files...", (4) keyboard shortcut `Mod+Alt+D`
117
- - Reuses existing `DiffViewer` component + `git-diff` tab type + `/files/compare` API — no new backend endpoints
118
- - Supports dirty buffer content: unsaved editor changes captured at select-time
119
- - New zustand store `useCompareStore` persists selection across reload (strips dirty content >500KB to keep localStorage fast)
120
- - Auto-clears selection on project switch via store subscription
121
- - New keybinding action `compare-files` with customizable default `Mod+Alt+D` in Settings > Keybindings
122
-
123
- - **Lazy-Load File Tree + Palette Index** — Instant project opening on large codebases
124
- - Backend: `GET /api/project/:name/files/list?path=<rel>` for 1-level directory listing with gitignore decoration
125
- - Backend: `GET /api/project/:name/files/index` for flat full-project index (cached, watcher-invalidated)
126
- - Filter model: hardcoded defaults ⊂ global config ⊂ per-project override (VS Code style)
127
- - Settings API: `GET/PATCH /api/settings/files` for global `files.exclude` / `files.searchExclude` / `files.useIgnoreFiles`
128
- - Project settings: `GET/PATCH /api/project/:name/settings` for per-project override (schema v21: projects.settings JSON)
129
- - Frontend: File store refactored to lazy-load with AbortController pool; tree auto-expands root only, children load on-demand
130
- - Command palette + chat file-picker switched from tree-flattening to `fileIndex` for instant search
131
- - New Settings section: **Files & Search** — global + active-project-scoped settings, glob list editor, `useIgnoreFiles` toggle
132
- - Gitignored files decorated grey in tree (when `useIgnoreFiles=true`)
133
- - `/api/project/:name/files/tree` marked @deprecated (still functional)
134
-
135
- - **Session Tagging** — Per-project tags for organizing chat sessions
136
- - Database: schema v20 migration creates `project_tags` table with id, project_path, name, color, sort_order; adds `tag_id` FK to `session_metadata`
137
- - Tag service: `tag.service.ts` with CRUD helpers (create, read, update, delete, bulk assign), session tag enrichment, tag counting
138
- - API routes: `tag-routes.ts` with GET/POST/PATCH/DELETE endpoints for tag CRUD, default tag management
139
- - Session tag assignment: PATCH/DELETE endpoints on chat routes, bulk assign endpoint for multi-session tagging
140
- - Auto-tag new sessions: New sessions auto-assigned to project's default tag if configured
141
- - UI: Color dots on session rows (8x8px circles showing tag color), tag filter chip bar above session list with count badges
142
- - Filter bar: "All" chip plus one per tag, client-side filtering integrated with search (AND logic)
143
- - Tag management: Settings panel (tag-settings-section.tsx) with create/edit/delete/reorder UI, drag-to-reorder on desktop, up/down arrows on mobile
144
- - Context menu: Right-click session → "Set Tag" submenu with tag list, current tag has checkmark, "Remove tag" option
145
- - Keyboard shortcuts: Keys 1-4 quickly assign top 4 project tags when history panel open and session focused
146
- - Bulk operations: Select multiple sessions → floating action bar with tag assignment and bulk endpoint
147
- - Responsive: Mobile-first design (44x44px touch targets), horizontal chip scroll, bottom sheet context menu, touch-friendly tag management
148
-
149
- ### Technical Details
150
- - **Database:**
151
- - Migration v20: Creates `project_tags(id, project_path, name, color, sort_order, created_at)` with UNIQUE(project_path, name)
152
- - Alters `session_metadata` to add `tag_id INTEGER REFERENCES project_tags(id) ON DELETE SET NULL`
153
- - Alters `projects` to add `default_tag_id INTEGER REFERENCES project_tags(id) ON DELETE SET NULL`
154
- - Seeds 4 default tags per project on migration and on new project creation
155
- - **Files Created:**
156
- - `src/services/tag.service.ts` — Tag CRUD helpers, session tag enrichment, bulk operations (~150 lines)
157
- - `src/server/routes/tag-routes.ts` — Tag API endpoints (GET/POST/PATCH/DELETE project tags, default tag) (~100 lines)
158
- - `src/web/components/settings/tag-settings-section.tsx` — Tag management UI with CRUD, reorder, default toggle (~170 lines)
159
- - `src/web/components/chat/session-context-menu.tsx` — Extracted context menu content (optional, ~80 lines)
160
- - `src/web/components/chat/session-bulk-actions.tsx` — Bulk action bar (optional, ~60 lines)
161
- - **Files Modified:**
162
- - `src/services/db.service.ts` — Schema v20 migration, bump CURRENT_SCHEMA_VERSION
163
- - `src/services/project.service.ts` — Call seedDefaultTags() on project add
164
- - `src/types/chat.ts` — Add ProjectTag interface, tag field to SessionInfo
165
- - `src/server/routes/chat.ts` — Session tag endpoints (PATCH/DELETE single, PATCH bulk), tag enrichment in GET /sessions, auto-tag on POST /sessions
166
- - `src/web/components/chat/chat-history-bar.tsx` — Tag filter chip bar, color dots per session, context menu wrapper, keyboard shortcuts, bulk select mode
167
- - `src/web/components/chat/session-picker.tsx` — Color dots per session
168
- - `src/web/components/chat/chat-welcome.tsx` — Color dots per recent session
169
- - `src/web/components/settings/settings-tab.tsx` — Register TagSettingsSection
170
- - **Type Changes:**
171
- - New: `ProjectTag` = { id, projectPath, name, color, sortOrder }
172
- - New: `ChatWsServerMessage` variants for tag updates (future)
173
- - Updated: `SessionInfo` includes `tag?: { id, name, color } | null`
174
- - **API Changes:**
175
- - GET `/projects/:path/tags` → `{ tags: ProjectTag[], counts: Record<number, number> }`
176
- - POST `/projects/:path/tags` → create tag
177
- - PATCH `/projects/:path/tags/:id` → update tag (name, color, sortOrder)
178
- - DELETE `/projects/:path/tags/:id` → delete tag
179
- - PATCH `/projects/:path/default-tag` → set project default tag
180
- - PATCH `/chat/sessions/:id/tag` → assign tag to session
181
- - DELETE `/chat/sessions/:id/tag` → remove tag from session
182
- - PATCH `/chat/sessions/bulk-tag` → bulk assign tag to multiple sessions (limit 100 per request)
183
- - **Breaking Changes:** None (additive feature, backward compatible)
184
- - **Test Coverage:** Integration tests for tag CRUD, session enrichment, API validation (100+ tests)
185
-
186
- ---
187
-
188
- ## [0.11.11] — 2026-04-19
189
-
190
- ### Added
191
- - **Real-Time Bash Output Streaming** — Stream bash tool output in chat UI while commands run
192
- - Backend service `BashOutputSpy` monitors bash process via `/proc/PID/fd/1` (Linux/WSL2) and `lsof` (macOS); graceful no-op on native Windows
193
- - Cross-platform PID discovery using `pgrep -fn` (Linux + macOS)
194
- - File polling at 100ms intervals captures output lines as they're written
195
- - New WebSocket message type: `bash_output` with `{ toolUseId, content, lineCount }`
196
- - Frontend hook `useChat` buffers partial output per toolUseId in ref (no excessive re-renders)
197
- - ToolCard component auto-expands when streaming and displays line count indicator with animated spinner
198
- - StreamingBashOutput component with auto-scroll-to-bottom (respects user scroll position)
199
- - Display truncated to last 200 lines for performance; 500KB frontend memory cap
200
- - Partial output cleared on `tool_result` or session cleanup; no buffering in reconnect history
201
-
202
- ### Technical Details
203
- - **Files Created:**
204
- - `src/services/bash-output-spy.ts` — Cross-platform process monitoring with line-buffering
205
- - **Files Modified:**
206
- - `src/types/api.ts` — Added `bash_output` to `ChatWsServerMessage` union
207
- - `src/server/ws/chat.ts` — Wire spy start/stop into tool_use/tool_result event loop
208
- - `src/web/hooks/use-chat.ts` — Buffer partial output per toolUseId, expose via ref
209
- - `src/web/components/chat/message-list.tsx` — Thread bashPartialOutput to ToolCard
210
- - `src/web/components/chat/tool-cards.tsx` — Render StreamingBashOutput component, auto-expand on streaming
211
- - **Type Changes:**
212
- - New: `ChatWsServerMessage` variant = `{ type: "bash_output"; toolUseId: string; content: string; lineCount: number }`
213
- - Hook return type extended with `bashPartialOutput: RefObject<Map<string, { content: string; lineCount: number }>>`
214
- - **Breaking Changes:** None (additive feature, backward compatible)
215
-
216
- ---
217
-
218
- ## [Unreleased] — Jira Debug Session Redesign + Frontend Memory Optimization + Git-Graph Stash Management, Rebase, Conflict Resolution + Worktree CRUD
219
-
220
- ### Added
221
- - **Jira Debug Session Redesign** — Direct Claude session debug replacing bot_task flow with concurrency queue
222
- - Replaced bot_task-based debug with direct `chatService.sendMessage()` calls (simpler, faster)
223
- - Concurrency queue: max 2 concurrent sessions globally, max 1 per project (prevents resource exhaustion)
224
- - Manual "Start Debug" button with editable prompt in results panel (override watcher template)
225
- - Unread tracking: `read_at` column on `jira_watch_results`, unread badge count in UI
226
- - WS toast notifications on debug completion (`jira:debug_complete` event)
227
- - Prompt override support for custom debug instructions per result
228
- - Result status flow: pending → queued → running → done/failed
229
- - Timeout protection: 10-minute abort-on-timeout with graceful cleanup
230
- - AI summary capture: last assistant text (max 500 chars) stored in result
231
- - Database schema v19: added `read_at` (nullable timestamp), `triggered_by` ("auto"|"manual")
232
- - New service: `JiraDebugSessionService` with queue management + concurrency limits
233
- - New component: `JiraDebugPromptDialog` for manual prompt override UI
234
- - API: `POST /api/jira/results/:id/debug` to trigger debug (with optional prompt)
235
-
236
- - **Jira Watcher Auto-Debug (v0.9.86+)** — Poll Jira Cloud per-project, auto-debug matched tickets
237
- - Jira Cloud REST API integration (search, get issue, transitions, metadata discovery)
238
- - Per-project config (base URL, email, AES-256 token encryption)
239
- - JQL-based watchers with two modes: debug (queue session) and notify-only (Telegram notification)
240
- - Configurable poll intervals (30s–60m per watcher, interval clamping)
241
- - Rate limit aware (tracks Jira API quota, auto-backoff 429 responses)
242
- - Result tracking (pending/queued/running/done/failed status, AI summary persistence)
243
- - Prompt templating ({issue_key}, {summary}, {description}, {status}, {priority} substitution)
244
- - Soft deletes (preserve result history, don't lose tracking)
245
- - Frontend filter builder UI (projects, issue types, priorities, statuses, custom JQL)
246
- - CLI commands: `ppm jira config {set,show,remove,test}`, `ppm jira watch {add,list,enable,disable,remove,test,pull}`
247
- - API routes: /api/jira/config/*, /api/jira/{watchers,results,search,ticket,metadata}
248
- - 3 SQLite tables (v18): jira_config, jira_watchers, jira_watch_results
249
- - 44 tests (integration + unit, JQL builder, result sync, credential encryption, rate limiting)
250
-
251
- - **Frontend Memory & Performance Optimizations** — Reduce re-renders, lazy-load heavy components, code splitting
252
- - **useShallow pattern:** All destructured Zustand store calls now use `useShallow` (36 usage sites) to prevent re-renders on object mutations
253
- - **React.memo wrapping:** 10 heavy components memoized (CodeEditor, MessageBubble, ProjectBar, ProjectAvatar, TerminalTab, PanelLayout, Sidebar, StatusBar, StatusBarEntry, TabBar, TreeNode)
254
- - **Lazy loading:** MarkdownRenderer lazy-loaded from 3 sites, CodeMirror on-demand in postgres-viewer
255
- - **Dynamic import:** Mermaid loaded on-demand in markdown-code-block (only when needed)
256
- - **Code splitting:** 5 vendor chunks in vite.config.ts (monaco, mermaid, xterm, markdown, ui libraries) for better caching
257
- - **Chat pagination:** Message history limited to 50 per page with load-more button
258
- - **Message cap:** Team activity capped at 500 messages to prevent unbounded growth
259
-
260
- ### Added (Git-Graph)
261
- - **Git Stash Management** — Toolbar popover for interactive stash operations
262
- - List all stashes with index, hash (abbreviated), and message
263
- - Apply/Pop/Drop actions per stash via context menu or action buttons
264
- - "Stash Changes" button in main toolbar to stash uncommitted work
265
- - Stash list persisted in RepoInfo and refreshed on uncommitted status updates
266
- - Keyboard shortcuts for quick access to stash operations
267
-
268
- - **Interactive Rebase** — Branch context menu + commit history actions
269
- - "Rebase current branch onto..." option in commit context menu
270
- - Confirmation dialog shows branch selection and target commit
271
- - Rebase state detection and progress tracking (e.g., "3/5" for interactive rebase)
272
- - Continue/Skip/Abort controls in merge state banner during rebase
273
-
274
- - **Merge/Rebase/Cherry-Pick Conflict Detection** — Visual conflict indicators
275
- - Detects merge state from .git sentinel files (MERGE_HEAD, REBASE_MERGE, CHERRY_PICK_HEAD)
276
- - Parses git status UU/AA/DD/AU/UA/DU/UD codes for unmerged entries
277
- - Conflicted files displayed in "Conflicts" section in uncommitted status
278
- - Conflict state banner shows merge state type + progress + action buttons (Continue/Skip/Abort)
279
- - Auto-detects merge state only when conflicts exist (performance optimization)
280
-
281
- - **Inline Conflict Resolution Editor** — New conflict-editor tab type with Monaco
282
- - Dedicated `conflict-editor` tab type for visual conflict resolution
283
- - Monaco-based editor with syntax highlighting per file type (JS/TS/Python/etc.)
284
- - Conflict regions visually highlighted: green for current, blue for incoming, gray for markers
285
- - Accept buttons: Accept Current / Accept Incoming / Accept Both (with proper merging)
286
- - Conflict counter in header: "N conflicts remaining" → "All conflicts resolved" on completion
287
- - Automatic file save after each resolution; conflict count updates in real-time
288
- - Parses 3-way conflict markers (<<<<<<, =======, >>>>>>>) and extracts labels (HEAD/branch names)
289
-
290
- - **Worktree Management** — Full CRUD with project integration
291
- - Worktree toolbar popover listing all worktrees (with path, branch, HEAD status)
292
- - Create worktree from commit context menu ("Create Worktree Here...")
293
- - Remove, prune, and auto-lock operations per worktree
294
- - Current worktree highlighted with badge and active background
295
- - Auto-add unregistered worktrees as projects via confirmation dialog
296
- - Branch-already-exists dialog offers force-replace option for branch conflicts
297
- - Project switcher integration: switch to worktree branches directly
298
-
299
- - **Bundled Extensions Support** — Auto-discover extensions from packages/ext-* directories
300
- - PPM discovers bundled extensions (e.g., ext-git-graph) without manual installation
301
- - Bundled extensions available out-of-the-box with all PPM instances
302
- - `ppm ext list` shows "Source" column (bundled/user) for transparency
303
- - Bundled extension removal protection: prevents accidental deletion, suggests `ppm ext disable` instead
304
- - User-installed extensions override bundled with same ID (user takes precedence)
305
- - Extension paths tracked separately for bundled vs node_modules locations
306
-
307
- - **Git-Graph UI Improvements** — 7 UX refinements + comprehensive git workflow
308
- - Branch context menu: right-click for checkout/merge/rebase/delete/create operations
309
- - Double-click checkout: branch labels double-click to switch branches instantly
310
- - Toast notifications: replaced blocked alert() with inline webview toast elements
311
- - SVG icons: replaced Unicode symbols (↻⬇🔍⚙🌲📁) with inline Lucide SVG icons
312
- - Auto-fetch enhancement: added 10-second interval option to dropdown
313
- - Uncommitted polling: 5-second status refresh to detect working tree changes
314
- - Interactive UI elements: resizable graph column, branch filter dropdown, tree/list view toggle
315
- - Git actions: stage/unstage files, commit from webview, stash/reset/clean operations
316
- - Path traversal validation for security (assertSafePath in RPC handlers)
317
- - Fallback guards for all tab type handling (unknown tab types safely ignored)
318
-
319
- - **Extension Error Reporting & Logging** — Silent failure debugging & user feedback
320
- - Activation error tracking: Map stores `extId → error message` in ExtensionService
321
- - Error toasts on command failure: "Extension command failed: {error}" displays in UI
322
- - Timeout UX improved: Fallback UI shows activation error + "Retry" button for quick recovery
323
- - Breadcrumb logging with tags for debugging: `[ExtService]`, `[ExtHost]`, `[ExtWS]`, `[ext-git-graph]`
324
- - Console logs track: activation start/success, command routing, failures with context
325
- - Activation errors included in `contributions:update` message sent to browser on WS connect
326
-
327
- - **Faithful SVG Graph Rendering** — Port of vscode-git-graph algorithm with deterministic layout
328
- - Single SVG model with continuous branch paths using Bézier curves
329
- - Deterministic lane assignment algorithm with greedy color reuse
330
- - Proper HEAD/stash node rendering (hollow circle for HEAD, nested circles for stash)
331
- - Shadow lines for visual depth and branch continuity
332
- - Mobile SVG alignment: gridY matches 44px CSS row height
333
- - XSS security fix: escHtml applied to parent hashes and file status in detail panel
334
- - Regex ordering fix in formatCommitMessage for proper URL/mention detection
335
- - Removed dot alignment bug that forced rows to 29px
336
-
337
- ### Technical Details
338
-
339
- **Stash/Rebase/Conflict/Worktree Implementation:**
340
- - **Files Created:**
341
- - `src/web/components/editor/conflict-editor.tsx` — Monaco-based conflict resolution editor with visual highlighting, accept buttons, real-time conflict counter, auto-save on resolution
342
-
343
- - **Files Modified:**
344
- - `packages/ext-git-graph/src/extension.ts` — Added stash parsing, merge state detection (merge/rebase/cherry-pick), conflict file opening, worktree CRUD operations, branch context menu rebase action
345
- - `packages/ext-git-graph/src/types.ts` — Added Stash interface, MergeState interface (type, progress, message), FileChange status "U" for unmerged, Worktree interface, updated UncommittedData with conflicted field
346
- - `packages/ext-git-graph/src/webview-html.ts` — Added stash popover UI, rebase context menu item, conflict section in uncommitted panel, merge state banner with Continue/Skip/Abort, worktree popover with CRUD UI
347
- - `src/web/stores/tab-store.ts` — Added "conflict-editor" as valid TabType
348
- - `src/web/stores/panel-utils.ts` — Added conflict-editor case to deriveTabId() for metadata-driven tab ID generation
349
- - `src/web/components/layout/editor-panel.tsx` — Lazy-imported ConflictEditor component with fallback
350
- - `src/web/components/layout/tab-content.tsx` — Lazy-imported ConflictEditor component with fallback
351
- - `src/web/components/layout/mobile-nav.tsx` — Added conflict-editor icon (conflict/warning icon)
352
- - `src/web/components/layout/tab-bar.tsx` — Added conflict-editor icon (conflict/warning icon)
353
-
354
- - **Services Modified:**
355
- - `src/services/extension-manifest.ts` — Added discoverBundledManifests() to scan packages/ext-* dirs
356
- - `src/services/extension.service.ts` — Added extensionPaths Map, bundledIds Set, isBundled() method; updated discover()/activate()/remove() to handle bundled extensions
357
- - `src/cli/commands/ext-cmd.ts` — Added "Source" column to `ppm ext list`, calls discover() to populate bundled info
358
- - `src/services/extension-rpc-handlers.ts` — Allow git operations in all registered project paths (not just CWD), improved path validation
359
- - `src/services/extension-host-worker.ts` — Enhanced error logging, localHandlers check, disposed flag fix for polling race conditions
360
-
361
- - **Type Changes:**
362
- - New: `Stash` = { index, hash, message }
363
- - New: `MergeState` = { type: "merge" | "rebase" | "cherry-pick", progress?, message? }
364
- - New: `Worktree` = { path, branch, head, isMain, isDetached, locked, lockReason?, prunable }
365
- - Updated: `FileChange.status` now includes "U" for unmerged/conflicted entries (was "A" | "M" | "D" | "R" | "C")
366
- - Updated: `UncommittedData` now includes `conflicted: FileChange[]` and optional `mergeState: MergeState`
367
- - Updated: `RepoInfo` now includes `stashes: Stash[]` and `currentBranch: string`
368
- - Updated: `TabType` now includes "conflict-editor"
369
-
370
- - **Git State Detection:**
371
- - Merge state determined by .git sentinel files: MERGE_HEAD (merge), rebase-merge/ (interactive rebase), CHERRY_PICK_HEAD (cherry-pick)
372
- - Progress tracked: "3/5" format from rebase-merge/msgnum and rebase-merge/end
373
- - Conflict detection: UU/AA/DD/AU/UA/DU/UD git status codes parsed as unmerged entries
374
- - Only detects merge state when conflicts exist (perf optimization)
375
-
376
- - **Conflict Resolution Flow:**
377
- - User clicks conflicted file → opens conflict-editor tab
378
- - Component parses conflict markers (<<<<<<, =======, >>>>>>>) from file content
379
- - Displays visual highlighting + Accept buttons above each conflict region
380
- - Resolution applies edit via Monaco, saves file automatically, updates conflict counter
381
- - Conflict count reflects real-time resolution progress
382
-
383
- - **Security:** Path validation ensures extensions can only operate on registered project paths
384
- - **Breaking Changes:** None (backward compatible)
385
- - **Test Coverage:** All changes maintain test suite passing
386
-
387
- ---
388
-
389
- ## [0.9.72] — 2026-04-09
390
-
391
- ### Added
392
- - **Account Selection Pre-flight Loop** — Intelligent account fallback during token refresh
393
- - AccountSelector.next() now accepts excludeIds Set to skip previously failed accounts
394
- - Pre-flight token refresh loop tries all accounts before final failure (was linear before)
395
- - New AccountSelector.onPreflightFail() method handles preflight failure with 1-5min backoff
396
- - Status updates streamed to UI as blockquotes during routing/refreshing/switching phases
397
- - Cumulative penalty: preflight failures counted with rate-limit and auth-error retries
398
-
399
- ### Technical Details
400
- - **Files Modified:**
401
- - `src/providers/claude-agent-sdk.ts` — Pre-flight loop with excludeIds exclusion set
402
- - `src/services/account-selector.service.ts` — excludeIds parameter, onPreflightFail() method
403
- - `src/types/chat.ts` — New status_update ChatEvent type
404
- - `src/web/components/chat/message-list.tsx` — Render status_update as blockquote
405
- - **Type Changes:** status_update event = { type: "status_update", phase: "routing" | "refreshing" | "switching", message, accountLabel? }
406
- - **Breaking Changes:** None (backward compatible)
407
-
408
- ---
409
-
410
- ## [0.9.11] — 2026-04-07
411
-
412
- ### Added
413
- - **PPMBot Coordinator Redesign** — Transform from direct AI chat executor to intelligent team leader delegating to subagents
414
- - Single persistent coordinator session per Telegram chat in `~/.ppm/bot/` workspace
415
- - Decision framework: Answer directly if no project context needed; delegate for file access, project-specific tasks
416
- - Delegation via bash: `ppm bot delegate --chat <id> --project <name> --prompt "<enriched>"` creates task
417
- - Background task poller (5s interval) executes pending tasks in isolation
418
- - Each task execution: Creates fresh PPM session in target project, runs async generator, captures result summary
419
- - Abort/timeout handling: AbortController-based task cancellation, 900s default timeout
420
- - UI: Settings panel displays delegated tasks with auto-refresh
421
- - CLI expansion: `ppm bot` commands for delegation, project management, session control, status queries
422
- - Telegram commands reduced: 3 public (/start, /help, /status) + 1 hidden (/restart)
423
- - Coordinator identity: `~/.ppm/bot/coordinator.md` replaces per-session identity, loaded via XML context block
424
- - Cross-provider support: Coordinator identity works with any provider (Claude SDK, Cursor, etc.)
425
-
426
- ### Technical Details
427
- - **Database Migration (v14):**
428
- - `bot_tasks` — taskId, chatId, projectName, projectPath, prompt, status, resultSummary, resultFull, error, timeoutMs, createdAt, startedAt, completedAt
429
- - Indexes: `idx_bot_tasks_status`, `idx_bot_tasks_chat` for fast polling + history queries
430
- - **Files Created:**
431
- - `src/services/ppmbot/ppmbot-delegation.ts` — executeDelegation() function with task lifecycle management
432
- - **Files Modified:**
433
- - `src/services/ppmbot/ppmbot-service.ts` — Task poller loop, lifecycle management (start/stop)
434
- - `src/services/ppmbot/ppmbot-session.ts` — PPMBotSessionManager with coordinator session cache
435
- - `src/services/db.service.ts` — Schema v14 migration, bot_tasks CRUD functions
436
- - `src/cli/commands/bot-cmd.ts` — Expanded with delegation, project, session, status, help commands
437
- - `src/server/routes/settings.ts` — Bot tasks endpoints for UI refresh
438
- - `src/web/components/settings/ppmbot-settings-section.tsx` — Delegated tasks panel with auto-refresh
439
- - **Type Changes:**
440
- - New: `BotTask`, `BotTaskStatus` ("pending" | "running" | "completed" | "failed" | "timeout")
441
- - New: `PPMBotCommand` with chatId, messageId, userId
442
- - **API Changes:** New endpoints for bot task management
443
- - **Breaking Changes:** None (coordinator coexists with legacy ClawBot; migration transparent)
444
-
445
- ### Key Design Principles
446
- - **Coordinator per chat** — Single session manages delegation, not direct chat
447
- - **Project isolation** — Each delegated task spawns fresh isolated session
448
- - **CLI-driven delegation** — Coordinator calls bash `ppm bot` commands (bash-safe tools only)
449
- - **Background execution** — Task polling decoupled from message handler
450
- - **Result capture** — Store both summary (notification) and full output (detailed review)
451
-
452
- ---
453
-
454
- ## [0.9.10] — 2026-04-06
455
-
456
- ### Added
457
- - **Supervisor Always Alive Feature** — Distinguish between soft stop (server shutdown) and full shutdown (supervisor shutdown)
458
- - `ppm stop` now performs SOFT STOP: kills server only, supervisor remains alive with Cloud WS + tunnel connectivity
459
- - `ppm stop --kill` or `ppm down` performs FULL SHUTDOWN: kills everything (old `ppm stop` behavior)
460
- - Supervisor now has new `stopped` state (in addition to running, paused, upgrading)
461
- - When stopped, minimal HTML page served on the port (503 status on /api/health)
462
- - `ppm start` detects existing supervisor and handles resume/upgrade scenarios
463
- - Autostart now uses `__supervise__` instead of `__serve__` for consistency
464
- - Cloud WS has new commands: `start`, `shutdown` (stop is now soft stop, separate from shutdown)
465
- - Supervisor has uncaughtException/unhandledRejection handlers (never crashes)
466
- - Supervisor logic modularized into 3 files: supervisor.ts (orchestrator), supervisor-state.ts (state machine), supervisor-stopped-page.ts (503 page)
467
-
468
- ### Technical Details
469
- - **Files Created:**
470
- - `src/services/supervisor-state.ts` — State machine, IPC command file handling
471
- - `src/services/supervisor-stopped-page.ts` — Minimal 503 HTML response
472
- - Enhanced `src/services/supervisor.ts` — Orchestrator with stopped state support
473
- - **Files Modified:**
474
- - `src/cli/commands/stop.ts` — Added --kill flag, soft stop default, ppm down alias
475
- - `src/cli/commands/start.ts` — Resume detection for existing supervisor
476
- - `src/cli/autostart-generator.ts` — Uses __supervise__ entry point
477
- - Cloud WS endpoints updated with new commands
478
- - **Type Changes:** SupervisorState = "running" | "paused" | "stopped" | "upgrading"
479
- - **API Changes:** GET /api/health returns 503 when server stopped (supervisor still running)
480
- - **Breaking Changes:** None (backward compatible, graceful fallback)
481
-
482
- ---
483
-
484
- ## [0.9.10] — 2026-04-06
485
-
486
- ### Added
487
- - **ClawBot Telegram Integration** — Telegram bot service layer for AI-powered messaging
488
- - Telegram long-polling: receive messages via polling (no webhooks needed for self-hosted)
489
- - Session routing: chatID → PPM session mapping with per-user thread isolation
490
- - Memory system: SQLite FTS5 for persistent conversation history + recall with decay/supersede
491
- - Response streaming: ChatEvent → progressive Telegram message editing (1s throttle)
492
- - Message formatting: Markdown → Telegram HTML with 4096-character chunking
493
- - Pairing system: Code-based device pairing for security (owner approves in web UI)
494
- - Message queue: Handle concurrent Telegram messages without race conditions
495
- - Settings UI: Enable/disable, paired devices, default project, system prompt, display toggles, debounce config
496
- - Chat history: [Claw] prefix sessions with robot icon for easy identification
497
- - Cross-project memory: Auto-detect project name mentions → include that project's memories in context
498
-
499
- ### Technical Details
500
- - **Database Migration (v13):**
501
- - `clawbot_sessions` — chatID, sessionID, pairedAt, lastUsed
502
- - `clawbot_memories` — sessionID, content, role, created, decay_factor (FTS5)
503
- - `clawbot_paired_chats` — chatID, pairingCode, approvedAt, approvedBy
504
- - **Files Created:**
505
- - `src/services/clawbot/clawbot.service.ts` — Main orchestrator
506
- - `src/services/clawbot/clawbot-telegram.ts` — Telegram API polling
507
- - `src/services/clawbot/clawbot-session.ts` — Session mapping
508
- - `src/services/clawbot/clawbot-memory.ts` — FTS5 memory CRUD + hybrid extraction (AI + regex)
509
- - `src/services/clawbot/clawbot-formatter.ts` — Markdown → Telegram HTML
510
- - `src/services/clawbot/clawbot-streamer.ts` — ChatEvent → progressive message edits
511
- - `src/types/clawbot.ts` — Type definitions
512
- - `src/web/components/settings/clawbot-settings-section.tsx` — Settings UI
513
- - **Files Modified:**
514
- - `src/services/db.service.ts` — Schema v13 migration
515
- - `src/types/config.ts` — ClawBotConfig interface
516
- - `src/server/index.ts` — ClawBot poller startup
517
- - `src/server/routes/settings.ts` — ClawBot settings endpoints (GET/PUT)
518
- - `src/web/components/settings/settings-tab.tsx` — ClawBot category
519
- - `src/web/components/chat/chat-history-bar.tsx` — [Claw] prefix + icon tagging
520
-
521
- ### Key Design Principles
522
- - **Long-polling over webhooks** — Simpler self-hosted setup, no public URL required
523
- - **bypassPermissions by default** — Headless bot, no manual tool approvals needed
524
- - **Hybrid memory extraction** — AI extraction (primary) + regex fallback (fallback)
525
- - **Progressive message editing** — 1s throttle balances UX with Telegram rate limits
526
- - **Message debouncing** — 2s default, configurable per session
527
- - **Pairing-based security** — Replace allowlists with owner-approved pairing codes
528
-
529
- ---
530
-
531
- ## [0.9.9] — 2026-04-04
532
-
533
- ### Added
534
- - **Agent Teams (experimental)** — Toggle in Settings > AI to enable multi-agent collaboration
535
- - Passes `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` to SDK subprocess when enabled
536
- - Adds `TeamCreate`, `TeamDelete`, `SendMessage`, `TaskCreate`, `TaskUpdate`, `TaskList`, `TaskGet` to allowed tools
537
- - Switch UI with warning about experimental status and ~7x token cost
538
- - Default: off. Requires Claude Code v2.1.32+
539
- - **Agent Team UI — Real-time Monitoring** — Visual collaboration dashboard for active teams
540
- - Backend: REST endpoints (`GET /api/teams`, `GET /api/teams/:name`, `DELETE /api/teams/:name`) + fs.watch inbox monitor via chat WebSocket
541
- - Real-time inbox events: `team_detected`, `team_inbox`, `team_updated` streamed to chat clients
542
- - Frontend: Team activity button on chat input (Users icon with unread pulse dot)
543
- - Desktop popover / Mobile drawer showing members (with status badges) + message timeline
544
- - Settings UI: Team list in AI Settings with delete confirmation (only for inactive teams)
545
- - Architecture: Type-safe types (`src/types/team.ts`), extracted team-inbox-watcher module, zero new type errors
546
- - Mobile-first: Responsive popover/drawer, touch-friendly delete actions
547
-
548
- ---
549
-
550
- ## [0.9.2] — 2026-04-04
551
-
552
- ### Added
553
- - **File Download Feature** — Single-file and folder-as-zip downloads with short-lived tokens
554
- - Download tokens: one-time, 30s TTL, non-reusable
555
- - Backend: POST `/files/download/token` for token generation, GET `/files/raw?download=true&dl_token=X` for file downloads, GET `/files/download/zip?path=X` for folder zips
556
- - Frontend: Download context menu in file tree, download button in editor toolbar
557
- - Security: Tokens scoped to download paths only, path traversal protection maintained
558
- - Performance: Streaming via Bun.file() and archiver, no RAM buffering for large files
559
- - Testing: 30 integration tests covering auth, streaming, path traversal, zip integrity
560
-
561
- ### Technical Details
562
- - **Files Created:**
563
- - `src/services/download-token.service.ts` — In-memory token store with TTL cleanup
564
- - `src/server/routes/file-download.ts` — Download endpoints (token + zip)
565
- - `src/web/lib/file-download.ts` — Download utilities (single file + folder)
566
- - `tests/integration/file-download.test.ts` — Integration tests
567
- - **Files Modified:**
568
- - `src/server/middleware/auth.ts` — Added dl_token fallback for downloads
569
- - `src/server/routes/files.ts` — Added ?download=true mode
570
- - `src/server/routes/project-scoped.ts` — Registered download routes
571
- - `src/web/components/explorer/file-tree.tsx` — Added download context menu item
572
- - `src/web/components/editor/editor-toolbar.tsx` — Added download button
573
- - `src/web/components/editor/code-editor.tsx` — Passed filePath/projectName to toolbar
574
- - `src/server/helpers/error-status.ts` — Extracted shared error helper
575
- - **Dependencies:**
576
- - `archiver` — Streaming zip library (well-maintained, ~500KB)
577
-
578
- ---
579
-
580
- ## [0.9.0] — 2026-04-03
581
-
582
- ### Added
583
- - **Extension System (Phase 1-6)** — VSCode-compatible npm extensions with Bun Worker isolation, RPC protocol, @ppm/vscode-compat API shim, UI components (TreeView, WebviewPanel, StatusBar, QuickPick, InputBox), WS bridge, ext-database demo extension, Extension Manager UI, CLI support
584
- - **Multi-Provider AI** — ProviderInterface, CliProvider base, CursorCliProvider with NDJSON streaming, provider selector UI
585
- - **MCP Server Management** — REST API CRUD, SQLite storage, Settings UI, auto-import from ~/.claude.json, SDK integration
586
- - **ext-database extension** — Connection tree with color dots/badges/actions, table viewer webview with data grid/inline editing/pagination/SQL panel, add connection via QuickPick+InputBox flow
587
-
588
- ### Technical Details
589
- - Extension architecture: npm packages isolated in Bun Workers, communicate via RPC, manifest-driven contribution points (commands, views, menus, configuration)
590
- - Multi-provider: Tier 1 (Claude Agent SDK, full agentic), Tier 2 (Cursor CLI, agentic via own tool system)
591
- - MCP: Servers passed to SDK as `mcpServers`, tools auto-allowed via `mcp__*` wildcard
592
-
593
- ---
594
-
595
- ## [0.8.77] — 2026-04-01
596
-
597
- ### Added
598
- - **Deterministic Tab URLs + Backend Workspace Sync**
599
- - Tab IDs now deterministic ({type}:{identifier}) instead of random (tab-xxxx)
600
- - URL format changed: `/project/{name}/{tabType}/{identifier}` (e.g., `/project/ppm/editor/src/index.ts`)
601
- - New `workspace_state` database table (schema v10) persists tab layout per project
602
- - GET/PUT `/api/project/:name/workspace` endpoints for server-side persistence
603
- - Frontend syncs workspace layout to server with 1.5s debounce
604
- - Deep linking from URL auto-creates tabs if missing
605
- - Latest-wins conflict resolution: server timestamp > client localStorage
606
- - Tab ID patterns standardized: `editor:path`, `chat:provider/sessionId`, `terminal:index`, etc.
607
- - Migration from random IDs to deterministic IDs on first load
608
-
609
- ### Technical Details
610
- - **Files Created:**
611
- - `src/server/routes/workspace.ts` — Workspace GET/PUT endpoints
612
- - `src/web/hooks/use-workspace-sync.ts` — Server sync orchestration with debounce
613
- - **Files Modified:**
614
- - `src/services/db.service.ts` — Added workspace_state table (schema v10), helper functions
615
- - `src/web/stores/panel-utils.ts` — Deterministic tab ID derivation logic
616
- - `src/web/hooks/use-url-sync.ts` — URL parsing/building with new format
617
- - `src/web/stores/panel-store.ts` — Load workspace from server on project switch
618
- - `src/web/stores/tab-store.ts` — Tab interface updated with metadata
619
- - **Breaking Changes:** URLs changed; old `/project/{name}/tab/{id}` URLs redirected or ignored (fallback to project root)
620
- - **Migration:** Client-side: old random tab IDs migrated to deterministic format on first load
621
-
622
- ### Benefits
623
- - **Shareable deep links** — URLs point to specific files/chats (e.g., `/project/ppm/editor/src/index.ts`)
624
- - **Cross-device persistence** — Workspace layout saved on server, restored on any device
625
- - **URL-driven navigation** — Paste URL to recreate workspace state
626
- - **Conflict-free sync** — Latest timestamp wins; no manual merge dialogs
627
-
628
- ---
629
-
630
- ## [0.8.63] — 2026-03-28
631
-
632
- ### Added
633
- - **MCP Server Management** — Configure Model Context Protocol servers via Settings UI
634
- - REST API: GET/POST/PUT/DELETE `/api/settings/mcp`, plus import endpoints
635
- - Storage: SQLite `mcp_servers` table (name, transport, config JSON)
636
- - UI: Settings tab with server list, add/edit dialog, delete action
637
- - Auto-import: Reads `~/.claude.json` on first access (skips existing/invalid)
638
- - Validation: Name (alphanumeric, max 50 chars) + transport-specific config checks
639
- - SDK integration: Servers passed to `query()` as `mcpServers`, tools auto-allowed via `mcp__*` wildcard
640
-
641
- ### Technical Details
642
- - **Files Created:**
643
- - `src/types/mcp.ts` — McpServerConfig types, validation functions
644
- - `src/services/mcp-config.service.ts` — CRUD service + bulk import
645
- - `src/server/routes/mcp.ts` — REST API endpoints
646
- - `src/web/lib/api-mcp.ts` — Frontend API client
647
- - `src/web/components/settings/mcp-settings-section.tsx` — Settings UI
648
- - `src/web/components/settings/mcp-server-dialog.tsx` — Add/Edit dialog
649
- - **Files Modified:**
650
- - `src/services/db.service.ts` — Schema v8 migration (mcp_servers table)
651
- - `src/server/index.ts` — Route registration
652
- - `src/providers/claude-agent-sdk.ts` — mcpServers + mcp__* allowedTools
653
- - `src/web/components/settings/settings-tab.tsx` — MCP category added
654
-
655
- ---
656
-
657
- ## [0.8.62] — 2026-03-26
658
-
659
- ### Added
660
- - **Cmd+Shift+V shortcut** — Command palette entry for voice input
661
- - **Voice input** — Web Speech API integration for chat
662
-
663
- ---
664
-
665
- ## [0.8.61] — 2026-03-26 (Beta)
666
-
667
- ### Added
668
- - **Multi-Provider Architecture** — Generic AI provider system supporting Claude (SDK-based) and CLI-spawning providers
669
- - `AIProvider` interface with optional capability methods (`abortQuery?`, `getMessages?`, `listSessionsByDir?`)
670
- - `CliProvider` abstract base class for CLI-spawning providers (Cursor, Codex, Gemini)
671
- - `CursorCliProvider` implementation — spawns `cursor-agent` with NDJSON streaming
672
- - NDJSON line parser utility for TCP packet boundary handling
673
- - Cursor event mapper — normalizes Cursor NDJSON → standard ChatEvent union
674
- - Cursor history reader — loads sessions from `~/.cursor/chats/` SQLite DAG
675
- - Provider selector UI component — users can choose provider when creating chat
676
- - Async provider bootstrap — checks binary availability, registers only if available
677
- - Workspace trust auto-retry — detects trust prompts, retries with `--trust` flag
678
- - Process lifecycle management — SIGTERM → SIGKILL escalation, orphan cleanup
679
-
680
- ### Technical Details
681
- - **Files Created:**
682
- - `src/utils/ndjson-line-parser.ts` — NDJSON streaming parser
683
- - `src/providers/cli-provider-base.ts` — Abstract CliProvider base class
684
- - `src/providers/cursor-cli/cursor-provider.ts` — CursorCliProvider
685
- - `src/providers/cursor-cli/cursor-event-mapper.ts` — Event mapping
686
- - `src/providers/cursor-cli/cursor-history.ts` — SQLite history reader
687
- - `src/web/components/chat/provider-selector.tsx` — Provider selection UI
688
- - `tests/unit/ndjson-line-parser.test.ts` — Parser tests
689
- - `tests/unit/cursor-event-mapper.test.ts` — Mapper tests
690
- - `tests/integration/cursor-provider.test.ts` — Integration tests
691
- - `tests/integration/chat-service-multi-provider.test.ts` — Service tests
692
- - **Files Modified:**
693
- - `src/types/chat.ts` — Added optional capability methods to AIProvider, added `system` event type
694
- - `src/types/config.ts` — Added `"cli"` type, `cli_command` field to AIProviderConfig
695
- - `src/providers/registry.ts` — Added async `bootstrapProviders()` for conditional registration
696
- - `src/server/ws/chat.ts` — Removed `as any` casts, use optional chaining for capabilities
697
- - `src/services/chat.service.ts` — Use optional methods instead of duck-typing
698
- - `src/web/components/chat/session-picker.tsx` — Integrated provider selector
699
- - **Breaking Changes:** None (backward compatible, all tests passing)
700
- - **Architecture:** All phases complete (6/6), 555 tests passing
701
-
702
- ### Benefits
703
- - Extensible foundation for Codex, Gemini, and future providers (~100-150 lines each)
704
- - No more `as any` casts for provider methods — type-safe optional capability pattern
705
- - CLI providers can override session history reading (e.g., Cursor SQLite DAG)
706
- - Graceful degradation — missing CLI binary doesn't crash, logs info, skips provider
707
-
708
- ---
709
-
710
- ## [0.8.55] — 2026-03-26
711
-
712
- ### Added
713
- - **Streaming Input Migration** — Persistent AsyncGenerator session model for chat
714
- - Provider maintains long-lived streaming input per session (not per message)
715
- - Follow-up messages push into existing generator instead of abort-and-replace
716
- - Single streaming loop decoupled from WebSocket message handler
717
- - Message priority support (`now`/`next`/`later`) for intelligent message ordering
718
- - Image attachment support in message sending
719
- - Session state persistence across FE disconnections (5-minute cleanup timeout)
720
- - Event buffering on reconnect: clients receive buffered turn events after reconnection
721
- - Phase transitions: `idle` → `initializing` → `connecting` → `thinking`/`streaming` → `idle`
722
-
723
- ### Technical Details
724
- - **Provider Layer** (`src/providers/claude-agent-sdk.ts`): Maintains streaming session per sessionId
725
- - **WebSocket Handler** (`src/server/ws/chat.ts`):
726
- - `runStreamLoop()` executes independently (detached from WS scope)
727
- - `activeSessions` map persists session state across FE disconnections
728
- - `startSessionConsumer()` pattern replaces per-message `runStreamLoop()` calls
729
- - Event buffering (turnEvents array, max 10k events) for reconnect sync
730
- - Per-client ping intervals (15s keepalive)
731
- - **Types** (`src/types/api.ts`, `src/types/chat.ts`):
732
- - `ChatWsClientMessage` extended with `priority?: string` and optional `images`
733
- - `SessionPhase` = "initializing" | "connecting" | "thinking" | "streaming" | "idle"
734
- - `SessionEntry` tracks clients, abort handle, phase, pending approvals, buffered events
735
- - **Frontend** (`src/web/components/chat/message-input.tsx`): PriorityToggle component (visible during streaming)
736
- - **Benefits**:
737
- - No SDK subprocess restarts between messages (faster context preservation)
738
- - Tool approvals integrated into streaming (no query restart)
739
- - Message buffering prevents loss on FE reconnection
740
- - Cleaner architecture: BE owns Claude connection, FE disconnect ≠ abort
741
-
742
- ---
743
-
744
- ## [0.8.54] — 2026-03-25
745
-
746
- ### Added
747
- - **Auto-upgrade feature** — Full implementation with supervisor, API, CLI, and UI components
748
- - Supervisor checks npm registry every 15 minutes for new versions
749
- - UI banner displays when new version available with one-click upgrade button
750
- - `ppm upgrade` CLI command for headless systems (with `--check` flag to preview)
751
- - Self-replace mechanism: supervisor spawns new supervisor from updated code, waits for health, then exits old
752
- - Self-replace eliminates OS autostart dependency — upgrade works even on headless/containerized systems
753
- - GET `/api/upgrade/status` returns current version, available version, install method (npm/bun/binary)
754
- - POST `/api/upgrade/apply` installs new version and signals supervisor for restart
755
- - Compiled binary installs gracefully rejected with clear message (future: GitHub releases support)
756
- - Config option: `autoUpgrade` setting (default: true) allows opt-out
757
- - All upgrade routes require authentication
758
-
759
- ### Technical Details
760
- - **Services**: `src/services/upgrade.service.ts` handles version checking, semver comparison, install method detection, and installation
761
- - **Supervisor**: Enhanced with 15-minute version check timer, available version tracking in status.json, SIGUSR1-triggered self-replace
762
- - **API Routes**: `src/server/routes/upgrade.ts` with status and apply endpoints
763
- - **CLI**: `src/cli/commands/upgrade.ts` with interactive upgrade and check-only mode
764
- - **UI**: `src/web/components/layout/upgrade-banner.tsx` fixed-position banner with dismiss/upgrade buttons, polling every 60s
765
- - Install method detection: `isCompiledBinary()` → binary, `process.execPath.includes("bun")` → bun, else → npm
766
- - Semver comparison: lightweight string split (no external lib)
767
- - Self-replace implementation: saves `process.argv`, spawns new supervisor, polls status.json for new PID, waits up to 30s
768
-
769
- ---
770
-
771
- ## [0.8.53] — 2026-03-18
772
-
773
- ### Fixed
774
- - Keybindings: prevent command palette false trigger during IME composition
775
-
776
- ---
777
-
778
- ## [0.8.52] — 2026-03-15
779
-
780
- ### Added
781
- - Process supervisor with auto-restart and tunnel resilience
782
- - Supervisor spawns and monitors server + tunnel processes
783
- - Auto-restart on crash with exponential backoff
784
- - Health checks every 30 seconds
785
- - Cloudflare tunnel auto-reconnect on failure
786
- - Status file (~/.ppm/status.json) tracks PID, port, URL
787
-
788
- ---
789
-
790
- ## [0.7.x — v0.8.52] — Prior Releases
791
-
792
- Multi-account credential management, usage tracking, mobile UX optimization, Cloudflare tunnel integration, push notifications, terminal output streaming.
793
-
794
- ---
795
-
796
- ## Categories
797
-
798
- - **Added** — New features
799
- - **Fixed** — Bug fixes
800
- - **Changed** — Behavioral changes
801
- - **Deprecated** — Features marked for removal
802
- - **Removed** — Removed features
803
- - **Security** — Security vulnerability fixes
804
-
805
- ---
806
-
807
- ## Version Scheme
808
-
809
- PPM uses semantic versioning: MAJOR.MINOR.PATCH
810
-
811
- - MAJOR: Breaking changes to API/CLI/config format
812
- - MINOR: New features (backward compatible)
813
- - PATCH: Bug fixes and small improvements
20
+ | Question | Source |
21
+ |---|---|
22
+ | What changed in a release? | [`CHANGELOG.md`](../CHANGELOG.md) |
23
+ | What is shipped vs still open? | [`project-roadmap.md`](project-roadmap.md) |
24
+ | Why was something built this way? | [`project-overview-pdr.md`](project-overview-pdr.md) |
25
+ | What trap already cost us time? | [`lessons-learned.md`](lessons-learned.md) |