pythinker-code 0.13.0__tar.gz → 0.15.0__tar.gz

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 (838) hide show
  1. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/PKG-INFO +160 -69
  2. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/README.md +159 -68
  3. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/pyproject.toml +13 -1
  4. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/CHANGELOG.md +21 -0
  5. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/acp/session.py +3 -0
  6. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/agents/default/agent.yaml +4 -0
  7. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/agents/default/code_reviewer.yaml +6 -0
  8. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/agents/default/debugger.yaml +2 -0
  9. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/agents/default/explore.yaml +1 -0
  10. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/agents/default/implementer.yaml +1 -0
  11. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/agents/default/plan.yaml +1 -0
  12. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/agents/default/review.yaml +6 -0
  13. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/agents/default/security_reviewer.yaml +2 -0
  14. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/agents/default/system.md +5 -1
  15. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/agents/default/verifier.yaml +1 -0
  16. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/agents/okabe/agent.yaml +2 -0
  17. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/background/__init__.py +2 -0
  18. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/background/manager.py +18 -0
  19. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/background/models.py +9 -0
  20. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/background/store.py +33 -0
  21. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/background/worker.py +25 -2
  22. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/cli/_lazy_group.py +2 -0
  23. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/cli/export.py +39 -0
  24. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/cli/plugin.py +130 -7
  25. pythinker_code-0.15.0/src/pythinker_code/cli/skill.py +105 -0
  26. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/config.py +51 -0
  27. pythinker_code-0.15.0/src/pythinker_code/execution_profiles.py +77 -0
  28. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/llm.py +10 -13
  29. pythinker_code-0.15.0/src/pythinker_code/native.py +63 -0
  30. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/skill/__init__.py +45 -0
  31. pythinker_code-0.15.0/src/pythinker_code/skill/lockfile.py +91 -0
  32. pythinker_code-0.15.0/src/pythinker_code/skills/check-impl-against-spec/SKILL.md +34 -0
  33. pythinker_code-0.15.0/src/pythinker_code/skills/create-pr/SKILL.md +33 -0
  34. pythinker_code-0.15.0/src/pythinker_code/skills/diagnose-ci-failures/SKILL.md +36 -0
  35. pythinker_code-0.15.0/src/pythinker_code/skills/fix-errors/SKILL.md +33 -0
  36. pythinker_code-0.15.0/src/pythinker_code/skills/implement-specs/SKILL.md +35 -0
  37. pythinker_code-0.15.0/src/pythinker_code/skills/pr-walkthrough/SKILL.md +34 -0
  38. pythinker_code-0.15.0/src/pythinker_code/skills/reproduce-bug-report/SKILL.md +37 -0
  39. pythinker_code-0.15.0/src/pythinker_code/skills/resolve-merge-conflicts/SKILL.md +34 -0
  40. pythinker_code-0.15.0/src/pythinker_code/skills/review-pr/SKILL.md +36 -0
  41. pythinker_code-0.15.0/src/pythinker_code/skills/spec-driven-implementation/SKILL.md +38 -0
  42. pythinker_code-0.15.0/src/pythinker_code/skills/write-product-spec/SKILL.md +38 -0
  43. pythinker_code-0.15.0/src/pythinker_code/skills/write-tech-spec/SKILL.md +39 -0
  44. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/soul/approval.py +8 -0
  45. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/soul/permission.py +14 -1
  46. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/soul/pythinkersoul.py +32 -5
  47. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/__init__.py +1 -1
  48. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/agent/__init__.py +199 -1
  49. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/agent/description.md +2 -0
  50. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/ask_user/__init__.py +23 -11
  51. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/background/__init__.py +246 -11
  52. pythinker_code-0.15.0/src/pythinker_code/tools/background/handoff.md +3 -0
  53. pythinker_code-0.15.0/src/pythinker_code/tools/background/input.md +3 -0
  54. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/file/read.md +1 -1
  55. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/file/read.py +3 -2
  56. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/file/utils.py +11 -3
  57. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/shell/__init__.py +35 -9
  58. pythinker_code-0.15.0/src/pythinker_code/tools/skill/__init__.py +54 -0
  59. pythinker_code-0.15.0/src/pythinker_code/tools/skill/description.md +3 -0
  60. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/utils.py +57 -4
  61. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/web/fetch.py +10 -0
  62. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/web/search.py +10 -0
  63. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/print/visualize.py +11 -2
  64. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/__init__.py +56 -7
  65. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/components/bash_execution.py +7 -13
  66. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/components/bordered_loader.py +2 -1
  67. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/components/diff.py +16 -4
  68. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/components/key_hints.py +4 -7
  69. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/components/markdown.py +89 -78
  70. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/components/render_utils.py +5 -3
  71. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/components/special_messages.py +6 -6
  72. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/components/tool_execution.py +38 -17
  73. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/console.py +14 -0
  74. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/design_system.py +7 -7
  75. pythinker_code-0.15.0/src/pythinker_code/ui/shell/glyphs.py +31 -0
  76. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/keyboard.py +7 -2
  77. pythinker_code-0.15.0/src/pythinker_code/ui/shell/keymap.py +179 -0
  78. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/mcp_status.py +19 -10
  79. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/model_picker.py +2 -2
  80. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/motion.py +47 -15
  81. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/prompt.py +231 -59
  82. pythinker_code-0.15.0/src/pythinker_code/ui/shell/render_constants.py +46 -0
  83. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/slash.py +91 -57
  84. pythinker_code-0.15.0/src/pythinker_code/ui/shell/spacing.py +75 -0
  85. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/spinner_words.py +5 -5
  86. pythinker_code-0.15.0/src/pythinker_code/ui/shell/tips.py +32 -0
  87. pythinker_code-0.15.0/src/pythinker_code/ui/shell/tool_renderers/_file_diff.py +126 -0
  88. pythinker_code-0.15.0/src/pythinker_code/ui/shell/tool_renderers/_render_utils.py +273 -0
  89. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/tool_renderers/agent.py +34 -36
  90. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/tool_renderers/ask_user.py +29 -21
  91. pythinker_code-0.15.0/src/pythinker_code/ui/shell/tool_renderers/background.py +198 -0
  92. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/tool_renderers/bash.py +33 -43
  93. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/tool_renderers/edit.py +71 -69
  94. pythinker_code-0.15.0/src/pythinker_code/ui/shell/tool_renderers/find.py +121 -0
  95. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/tool_renderers/generic.py +33 -7
  96. pythinker_code-0.15.0/src/pythinker_code/ui/shell/tool_renderers/grep.py +183 -0
  97. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/tool_renderers/plan.py +20 -20
  98. pythinker_code-0.15.0/src/pythinker_code/ui/shell/tool_renderers/read.py +128 -0
  99. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/tool_renderers/think.py +23 -18
  100. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/tool_renderers/todo.py +26 -24
  101. pythinker_code-0.15.0/src/pythinker_code/ui/shell/tool_renderers/web.py +220 -0
  102. pythinker_code-0.15.0/src/pythinker_code/ui/shell/tool_renderers/write.py +135 -0
  103. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/update.py +113 -47
  104. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/usage.py +1 -1
  105. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/visualize/_approval_panel.py +51 -25
  106. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/visualize/_blocks.py +92 -88
  107. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/visualize/_btw_panel.py +8 -6
  108. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/visualize/_dialog_shell.py +4 -3
  109. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/visualize/_interactive.py +17 -4
  110. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/visualize/_live_view.py +148 -22
  111. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/visualize/_question_panel.py +33 -16
  112. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/visualize/_worklog.py +11 -5
  113. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/theme.py +85 -72
  114. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/export.py +123 -11
  115. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/rich/columns.py +2 -1
  116. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/rich/diff_render.py +9 -4
  117. pythinker_code-0.15.0/src/pythinker_code/web/static/_headers +10 -0
  118. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/_baseUniq-GA9iHBCA.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/_baseUniq-FLikL5oP.js +1 -1
  119. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/arc-gZsnPwO2.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/arc-CH7aTkr9.js +1 -1
  120. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/architectureDiagram-VXUJARFQ-De9R8C4O.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/architectureDiagram-VXUJARFQ-DjjsbT9J.js +1 -1
  121. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/blockDiagram-VD42YOAC-Ba1pNYg1.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/blockDiagram-VD42YOAC-D00CC7dg.js +1 -1
  122. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/c4Diagram-YG6GDRKO-CfDxaCio.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/c4Diagram-YG6GDRKO-BZ8YW5l9.js +1 -1
  123. pythinker_code-0.15.0/src/pythinker_code/web/static/assets/channel-ChLkGicq.js +1 -0
  124. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/chunk-4BX2VUAB-BiC5GeSy.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/chunk-4BX2VUAB-CT51XVd2.js +1 -1
  125. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/chunk-55IACEB6-D6KcpRaK.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/chunk-55IACEB6-D9cOsagU.js +1 -1
  126. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/chunk-B4BG7PRW-DQT-M2Ri.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/chunk-B4BG7PRW-DLU0G-z9.js +1 -1
  127. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/chunk-DI55MBZ5-lBjGLMy9.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/chunk-DI55MBZ5-BoYyatMl.js +1 -1
  128. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/chunk-FMBD7UC4-CUCm6jYE.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/chunk-FMBD7UC4-BvtZuN5v.js +1 -1
  129. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/chunk-QN33PNHL-CpsKX8Gv.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/chunk-QN33PNHL-UzYfy8VX.js +1 -1
  130. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/chunk-QZHKN3VN-CtBe7xAX.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/chunk-QZHKN3VN-CkjMyo71.js +1 -1
  131. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/chunk-TZMSLE5B-B1HdUVbC.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/chunk-TZMSLE5B-FwTnUvW6.js +1 -1
  132. pythinker_code-0.15.0/src/pythinker_code/web/static/assets/classDiagram-2ON5EDUG-CVLXpajg.js +1 -0
  133. pythinker_code-0.15.0/src/pythinker_code/web/static/assets/classDiagram-v2-WZHVMYZB-CVLXpajg.js +1 -0
  134. pythinker_code-0.15.0/src/pythinker_code/web/static/assets/clone-Bb8bPI91.js +1 -0
  135. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/code-block-IT6T5CEO-Nauf-Dns.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/code-block-IT6T5CEO-DEzuAcDQ.js +1 -1
  136. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/cose-bilkent-S5V4N54A-BzwfIOkj.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/cose-bilkent-S5V4N54A-GsDbZVos.js +1 -1
  137. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/cytoscape.esm-DgYGkf8s.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/cytoscape.esm-CyvSsNDx.js +1 -1
  138. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/dagre-6UL2VRFP-CcObcdCu.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/dagre-6UL2VRFP-Cz8X-74N.js +1 -1
  139. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/diagram-PSM6KHXK-CnkBDMfa.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/diagram-PSM6KHXK-GfM-PGgf.js +1 -1
  140. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/diagram-QEK2KX5R-BytO-i_3.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/diagram-QEK2KX5R-C1ELKuDf.js +1 -1
  141. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/diagram-S2PKOQOG-bjqHpsrQ.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/diagram-S2PKOQOG-BnjnqEbK.js +1 -1
  142. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/erDiagram-Q2GNP2WA-CJQQtgOx.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/erDiagram-Q2GNP2WA-DhduFnCm.js +1 -1
  143. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/flowDiagram-NV44I4VS-CH8l9Ex2.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/flowDiagram-NV44I4VS-Cz66XZ8r.js +1 -1
  144. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/ganttDiagram-JELNMOA3-yzCc3Zgk.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/ganttDiagram-JELNMOA3-D2ZFH9bE.js +1 -1
  145. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/gitGraphDiagram-NY62KEGX-CLpNg80l.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/gitGraphDiagram-NY62KEGX-CjbNsL7k.js +1 -1
  146. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/graph-BKnezX3S.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/graph-DJoi1jP0.js +1 -1
  147. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/index-BWNhTxyw.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/index-B5iJX3GK.js +1 -1
  148. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/index-CaRChC6H.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/index-Cjy8jHlq.js +1 -1
  149. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/index-B_Fm5OEh.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/index-CwS0EXkr.js +2 -2
  150. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/infoDiagram-WHAUD3N6-FyO5FoYg.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/infoDiagram-WHAUD3N6-CY1rxXp5.js +1 -1
  151. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/journeyDiagram-XKPGCS4Q-D7Jn9SfT.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/journeyDiagram-XKPGCS4Q-CIoAb7p1.js +1 -1
  152. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/kanban-definition-3W4ZIXB7-wL8zlaLe.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/kanban-definition-3W4ZIXB7-Cv0RkQOy.js +1 -1
  153. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/layout-CCwuOGWj.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/layout-By6G60Po.js +1 -1
  154. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/linear-DgSlbeag.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/linear-B2R4zVv-.js +1 -1
  155. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-DsnP_6Ye.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-Bl-SdXa2.js +29 -29
  156. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/mermaid.core-CXHCA8HV.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/mermaid.core-DZmvwVNs.js +5 -5
  157. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/min-BRsY-oqe.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/min-ayt5ZU-J.js +1 -1
  158. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/mindmap-definition-VGOIOE7T-B64Ljx8w.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/mindmap-definition-VGOIOE7T-CBnIEP6L.js +1 -1
  159. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/pieDiagram-ADFJNKIX-C3ejBxx6.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/pieDiagram-ADFJNKIX-vMh5x4GJ.js +1 -1
  160. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/quadrantDiagram-AYHSOK5B-DRf2jFv5.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/quadrantDiagram-AYHSOK5B-ngAbPtkD.js +1 -1
  161. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/requirementDiagram-UZGBJVZJ-CSCNoh6-.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/requirementDiagram-UZGBJVZJ-C8VB4e1y.js +1 -1
  162. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/sankeyDiagram-TZEHDZUN-ichGSxO0.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/sankeyDiagram-TZEHDZUN-DO_AEX2X.js +1 -1
  163. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/sequenceDiagram-WL72ISMW-bIWhFPmb.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/sequenceDiagram-WL72ISMW-BhW0R8OX.js +1 -1
  164. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/stateDiagram-FKZM4ZOC-WxQjAvgp.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/stateDiagram-FKZM4ZOC-l1IzipMH.js +1 -1
  165. pythinker_code-0.15.0/src/pythinker_code/web/static/assets/stateDiagram-v2-4FDKWEC3-uNOmVN18.js +1 -0
  166. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/timeline-definition-IT6M3QCI-CrlTiAiF.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/timeline-definition-IT6M3QCI-VlHp4E46.js +1 -1
  167. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/treemap-KMMF4GRG-CWWhPD7D.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/treemap-KMMF4GRG-CD_xN-Le.js +1 -1
  168. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/xychartDiagram-PRI3JC2R-Bqs5RaDP.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/xychartDiagram-PRI3JC2R-DD9WyEHn.js +1 -1
  169. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/index.html +1 -1
  170. pythinker_code-0.15.0/src/pythinker_code/web/static/install.ps1 +110 -0
  171. pythinker_code-0.15.0/src/pythinker_code/web/static/install.sh +143 -0
  172. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/wire/types.py +19 -0
  173. pythinker_code-0.13.0/src/pythinker_code/native.py +0 -38
  174. pythinker_code-0.13.0/src/pythinker_code/ui/shell/keymap.py +0 -84
  175. pythinker_code-0.13.0/src/pythinker_code/ui/shell/tool_renderers/_render_utils.py +0 -174
  176. pythinker_code-0.13.0/src/pythinker_code/ui/shell/tool_renderers/background.py +0 -147
  177. pythinker_code-0.13.0/src/pythinker_code/ui/shell/tool_renderers/find.py +0 -87
  178. pythinker_code-0.13.0/src/pythinker_code/ui/shell/tool_renderers/grep.py +0 -101
  179. pythinker_code-0.13.0/src/pythinker_code/ui/shell/tool_renderers/read.py +0 -106
  180. pythinker_code-0.13.0/src/pythinker_code/ui/shell/tool_renderers/web.py +0 -139
  181. pythinker_code-0.13.0/src/pythinker_code/ui/shell/tool_renderers/write.py +0 -107
  182. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/channel-DqUWNFW2.js +0 -1
  183. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/classDiagram-2ON5EDUG-XRBRYS_C.js +0 -1
  184. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/classDiagram-v2-WZHVMYZB-XRBRYS_C.js +0 -1
  185. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/clone-CWCNc-WR.js +0 -1
  186. pythinker_code-0.13.0/src/pythinker_code/web/static/assets/stateDiagram-v2-4FDKWEC3-CuAJMEkh.js +0 -1
  187. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/LICENSE +0 -0
  188. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/NOTICE +0 -0
  189. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/__init__.py +0 -0
  190. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/__main__.py +0 -0
  191. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/acp/AGENTS.md +0 -0
  192. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/acp/__init__.py +0 -0
  193. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/acp/convert.py +0 -0
  194. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/acp/host.py +0 -0
  195. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/acp/mcp.py +0 -0
  196. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/acp/server.py +0 -0
  197. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/acp/tools.py +0 -0
  198. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/acp/types.py +0 -0
  199. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/acp/version.py +0 -0
  200. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/agents/default/coder.yaml +0 -0
  201. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/agentspec.py +0 -0
  202. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/app.py +0 -0
  203. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/approval_runtime/__init__.py +0 -0
  204. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/approval_runtime/models.py +0 -0
  205. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/approval_runtime/runtime.py +0 -0
  206. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/auth/__init__.py +0 -0
  207. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/auth/anthropic_direct.py +0 -0
  208. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/auth/deepseek.py +0 -0
  209. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/auth/github_feedback.py +0 -0
  210. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/auth/lm_studio.py +0 -0
  211. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/auth/minimax.py +0 -0
  212. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/auth/oauth.py +0 -0
  213. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/auth/ollama.py +0 -0
  214. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/auth/openai.py +0 -0
  215. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/auth/opencode_go.py +0 -0
  216. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/auth/openrouter.py +0 -0
  217. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/auth/platforms.py +0 -0
  218. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/background/agent_runner.py +0 -0
  219. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/background/ids.py +0 -0
  220. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/background/summary.py +0 -0
  221. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/cli/__init__.py +0 -0
  222. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/cli/__main__.py +0 -0
  223. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/cli/debug.py +0 -0
  224. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/cli/info.py +0 -0
  225. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/cli/mcp.py +0 -0
  226. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/cli/review.py +0 -0
  227. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/cli/secscan.py +0 -0
  228. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/cli/security_scan.py +0 -0
  229. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/cli/toad.py +0 -0
  230. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/cli/update.py +0 -0
  231. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/cli/vis.py +0 -0
  232. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/cli/web.py +0 -0
  233. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/constant.py +0 -0
  234. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/events.py +0 -0
  235. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/exception.py +0 -0
  236. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/extensions.py +0 -0
  237. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/file_restore.py +0 -0
  238. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/hooks/__init__.py +0 -0
  239. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/hooks/config.py +0 -0
  240. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/hooks/engine.py +0 -0
  241. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/hooks/events.py +0 -0
  242. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/hooks/runner.py +0 -0
  243. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/metadata.py +0 -0
  244. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/notifications/__init__.py +0 -0
  245. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/notifications/llm.py +0 -0
  246. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/notifications/manager.py +0 -0
  247. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/notifications/models.py +0 -0
  248. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/notifications/notifier.py +0 -0
  249. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/notifications/store.py +0 -0
  250. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/notifications/wire.py +0 -0
  251. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/plugin/__init__.py +0 -0
  252. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/plugin/manager.py +0 -0
  253. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/plugin/tool.py +0 -0
  254. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/prompt_templates.py +0 -0
  255. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/prompts/__init__.py +0 -0
  256. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/prompts/compact.md +0 -0
  257. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/prompts/init.md +0 -0
  258. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/py.typed +0 -0
  259. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/session.py +0 -0
  260. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/session_fork.py +0 -0
  261. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/session_state.py +0 -0
  262. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/share.py +0 -0
  263. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/skill/flow/__init__.py +0 -0
  264. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/skill/flow/d2.py +0 -0
  265. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/skill/flow/mermaid.py +0 -0
  266. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/skills/pythinker-code-help/SKILL.md +0 -0
  267. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/skills/skill-creator/SKILL.md +0 -0
  268. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/soul/__init__.py +0 -0
  269. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/soul/agent.py +0 -0
  270. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/soul/btw.py +0 -0
  271. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/soul/compaction.py +0 -0
  272. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/soul/context.py +0 -0
  273. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/soul/denwarenji.py +0 -0
  274. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/soul/dynamic_injection.py +0 -0
  275. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/soul/dynamic_injections/__init__.py +0 -0
  276. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/soul/dynamic_injections/auto_mode.py +0 -0
  277. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/soul/dynamic_injections/plan_mode.py +0 -0
  278. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/soul/message.py +0 -0
  279. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/soul/slash.py +0 -0
  280. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/soul/toolset.py +0 -0
  281. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/subagents/__init__.py +0 -0
  282. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/subagents/builder.py +0 -0
  283. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/subagents/core.py +0 -0
  284. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/subagents/discovery.py +0 -0
  285. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/subagents/git_context.py +0 -0
  286. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/subagents/models.py +0 -0
  287. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/subagents/output.py +0 -0
  288. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/subagents/registry.py +0 -0
  289. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/subagents/runner.py +0 -0
  290. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/subagents/store.py +0 -0
  291. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/telemetry/__init__.py +0 -0
  292. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/telemetry/config.py +0 -0
  293. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/telemetry/crash.py +0 -0
  294. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/telemetry/errors.py +0 -0
  295. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/telemetry/metrics.py +0 -0
  296. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/telemetry/otel.py +0 -0
  297. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/telemetry/sentry.py +0 -0
  298. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/telemetry/sink.py +0 -0
  299. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/AGENTS.md +0 -0
  300. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/ask_user/description.md +0 -0
  301. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/background/list.md +0 -0
  302. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/background/output.md +0 -0
  303. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/background/stop.md +0 -0
  304. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/display.py +0 -0
  305. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/dmail/__init__.py +0 -0
  306. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/dmail/dmail.md +0 -0
  307. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/file/__init__.py +0 -0
  308. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/file/glob.md +0 -0
  309. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/file/glob.py +0 -0
  310. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/file/grep.md +0 -0
  311. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/file/grep_local.py +0 -0
  312. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/file/plan_mode.py +0 -0
  313. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/file/read_media.md +0 -0
  314. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/file/read_media.py +0 -0
  315. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/file/replace.md +0 -0
  316. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/file/replace.py +0 -0
  317. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/file/write.md +0 -0
  318. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/file/write.py +0 -0
  319. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/plan/__init__.py +0 -0
  320. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/plan/description.md +0 -0
  321. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/plan/enter.py +0 -0
  322. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/plan/enter_description.md +0 -0
  323. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/plan/handoff.py +0 -0
  324. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/plan/heroes.py +0 -0
  325. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/shell/bash.md +0 -0
  326. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/shell/powershell.md +0 -0
  327. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/test.py +0 -0
  328. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/think/__init__.py +0 -0
  329. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/think/think.md +0 -0
  330. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/todo/__init__.py +0 -0
  331. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/todo/set_todo_list.md +0 -0
  332. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/web/__init__.py +0 -0
  333. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/web/fetch.md +0 -0
  334. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/web/search.md +0 -0
  335. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/__init__.py +0 -0
  336. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/acp/__init__.py +0 -0
  337. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/print/__init__.py +0 -0
  338. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/components/__init__.py +0 -0
  339. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/components/base.py +0 -0
  340. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/components/footer.py +0 -0
  341. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/components/messages.py +0 -0
  342. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/components/settings_list.py +0 -0
  343. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/debug.py +0 -0
  344. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/echo.py +0 -0
  345. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/export_import.py +0 -0
  346. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/oauth.py +0 -0
  347. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/placeholders.py +0 -0
  348. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/replay.py +0 -0
  349. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/selector.py +0 -0
  350. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/selectors/__init__.py +0 -0
  351. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/selectors/extension.py +0 -0
  352. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/selectors/oauth.py +0 -0
  353. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/selectors/settings.py +0 -0
  354. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/selectors/show_images.py +0 -0
  355. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/selectors/theme.py +0 -0
  356. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/selectors/thinking.py +0 -0
  357. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/session_picker.py +0 -0
  358. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/setup.py +0 -0
  359. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/startup.py +0 -0
  360. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/task_browser.py +0 -0
  361. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/tool_renderers/__init__.py +0 -0
  362. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/usage_adapters/__init__.py +0 -0
  363. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/usage_adapters/anthropic_admin.py +0 -0
  364. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/usage_adapters/base.py +0 -0
  365. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/usage_adapters/deepseek.py +0 -0
  366. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/usage_adapters/minimax.py +0 -0
  367. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/usage_adapters/openai_admin.py +0 -0
  368. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/usage_adapters/openai_chatgpt.py +0 -0
  369. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/usage_adapters/opencode_go.py +0 -0
  370. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/usage_adapters/openrouter.py +0 -0
  371. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/usage_adapters/pythinker.py +0 -0
  372. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/usage_adapters/pythinker_ai.py +0 -0
  373. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/usage_render.py +0 -0
  374. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/visualize/__init__.py +0 -0
  375. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/visualize/_activity_tree.py +0 -0
  376. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/visualize/_input_router.py +0 -0
  377. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/visualize/_transcript.py +0 -0
  378. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/tui_config.py +0 -0
  379. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/usage_ratelimit_cache.py +0 -0
  380. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/__init__.py +0 -0
  381. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/aiohttp.py +0 -0
  382. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/aioqueue.py +0 -0
  383. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/broadcast.py +0 -0
  384. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/changelog.py +0 -0
  385. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/clipboard.py +0 -0
  386. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/datetime.py +0 -0
  387. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/diff.py +0 -0
  388. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/editor.py +0 -0
  389. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/environment.py +0 -0
  390. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/envvar.py +0 -0
  391. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/file_filter.py +0 -0
  392. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/frontmatter.py +0 -0
  393. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/io.py +0 -0
  394. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/logging.py +0 -0
  395. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/media_tags.py +0 -0
  396. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/message.py +0 -0
  397. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/path.py +0 -0
  398. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/proctitle.py +0 -0
  399. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/proxy.py +0 -0
  400. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/pyinstaller.py +0 -0
  401. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/rich/__init__.py +0 -0
  402. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/rich/markdown.py +0 -0
  403. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/rich/markdown_sample.md +0 -0
  404. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/rich/markdown_sample_short.md +0 -0
  405. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/rich/syntax.py +0 -0
  406. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/sensitive.py +0 -0
  407. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/server.py +0 -0
  408. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/signals.py +0 -0
  409. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/slashcmd.py +0 -0
  410. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/string.py +0 -0
  411. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/subprocess_env.py +0 -0
  412. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/term.py +0 -0
  413. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/typing.py +0 -0
  414. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/vis/__init__.py +0 -0
  415. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/vis/api/__init__.py +0 -0
  416. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/vis/api/sessions.py +0 -0
  417. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/vis/api/statistics.py +0 -0
  418. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/vis/api/system.py +0 -0
  419. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/vis/app.py +0 -0
  420. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/vis/static/assets/highlighted-body-B3W2YXNL-CY1rtwrX.js +0 -0
  421. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/vis/static/assets/index-DSRInNnm.css +0 -0
  422. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/vis/static/assets/index-DgmTI2M_.js +0 -0
  423. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/vis/static/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  424. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/vis/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  425. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/vis/static/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  426. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/vis/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  427. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/vis/static/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  428. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/vis/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  429. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/vis/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  430. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/vis/static/index.html +0 -0
  431. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/__init__.py +0 -0
  432. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/api/__init__.py +0 -0
  433. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/api/config.py +0 -0
  434. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/api/open_in.py +0 -0
  435. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/api/sessions.py +0 -0
  436. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/app.py +0 -0
  437. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/auth.py +0 -0
  438. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/models.py +0 -0
  439. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/runner/__init__.py +0 -0
  440. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/runner/messages.py +0 -0
  441. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/runner/process.py +0 -0
  442. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/runner/worker.py +0 -0
  443. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  444. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  445. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  446. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  447. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  448. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  449. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  450. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  451. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  452. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  453. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  454. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  455. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  456. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  457. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  458. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  459. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  460. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  461. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  462. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  463. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  464. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  465. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  466. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  467. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  468. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  469. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  470. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  471. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  472. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  473. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  474. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  475. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  476. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  477. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  478. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  479. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  480. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  481. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  482. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  483. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  484. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  485. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  486. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  487. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  488. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  489. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  490. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  491. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  492. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  493. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  494. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  495. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  496. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  497. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  498. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  499. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  500. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  501. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  502. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/abap-BdImnpbu.js +0 -0
  503. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/actionscript-3-CfeIJUat.js +0 -0
  504. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/ada-bCR0ucgS.js +0 -0
  505. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/andromeeda-C-Jbm3Hp.js +0 -0
  506. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/angular-html-CU67Zn6k.js +0 -0
  507. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/angular-ts-BwZT4LLn.js +0 -0
  508. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/apache-Pmp26Uib.js +0 -0
  509. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/apex-D8_7TLub.js +0 -0
  510. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/apl-dKokRX4l.js +0 -0
  511. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/applescript-Co6uUVPk.js +0 -0
  512. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/ara-BRHolxvo.js +0 -0
  513. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/asciidoc-Dv7Oe6Be.js +0 -0
  514. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/asm-D_Q5rh1f.js +0 -0
  515. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/astro-CbQHKStN.js +0 -0
  516. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/aurora-x-D-2ljcwZ.js +0 -0
  517. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/awk-DMzUqQB5.js +0 -0
  518. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/ayu-dark-CmMr59Fi.js +0 -0
  519. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/ballerina-BFfxhgS-.js +0 -0
  520. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/bat-BkioyH1T.js +0 -0
  521. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/beancount-k_qm7-4y.js +0 -0
  522. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/berry-uYugtg8r.js +0 -0
  523. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/bibtex-CHM0blh-.js +0 -0
  524. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/bicep-Bmn6On1c.js +0 -0
  525. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/blade-D4QpJJKB.js +0 -0
  526. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/bsl-BO_Y6i37.js +0 -0
  527. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/c-BIGW1oBm.js +0 -0
  528. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/c3-VCDPK7BO.js +0 -0
  529. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/cadence-Bv_4Rxtq.js +0 -0
  530. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/cairo-KRGpt6FW.js +0 -0
  531. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/catppuccin-frappe-DFWUc33u.js +0 -0
  532. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/catppuccin-latte-C9dUb6Cb.js +0 -0
  533. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/catppuccin-macchiato-DQyhUUbL.js +0 -0
  534. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/catppuccin-mocha-D87Tk5Gz.js +0 -0
  535. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/clarity-D53aC0YG.js +0 -0
  536. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/clojure-P80f7IUj.js +0 -0
  537. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/cmake-D1j8_8rp.js +0 -0
  538. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/cobol-nwyudZeR.js +0 -0
  539. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/codeowners-Bp6g37R7.js +0 -0
  540. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/codeql-DsOJ9woJ.js +0 -0
  541. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/coffee-Ch7k5sss.js +0 -0
  542. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/common-lisp-Cg-RD9OK.js +0 -0
  543. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/coq-DkFqJrB1.js +0 -0
  544. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/cpp-CofmeUqb.js +0 -0
  545. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/crystal-tKQVLTB8.js +0 -0
  546. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/csharp-K5feNrxe.js +0 -0
  547. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/css-DPfMkruS.js +0 -0
  548. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/csv-fuZLfV_i.js +0 -0
  549. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/cue-D82EKSYY.js +0 -0
  550. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/cypher-COkxafJQ.js +0 -0
  551. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/d-85-TOEBH.js +0 -0
  552. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/dark-plus-C3mMm8J8.js +0 -0
  553. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/dart-CF10PKvl.js +0 -0
  554. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/dax-CEL-wOlO.js +0 -0
  555. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/defaultLocale-DX6XiGOO.js +0 -0
  556. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/desktop-BmXAJ9_W.js +0 -0
  557. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/diff-D97Zzqfu.js +0 -0
  558. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/docker-BcOcwvcX.js +0 -0
  559. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/dotenv-Da5cRb03.js +0 -0
  560. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/dracula-BzJJZx-M.js +0 -0
  561. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/dracula-soft-BXkSAIEj.js +0 -0
  562. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/dream-maker-BtqSS_iP.js +0 -0
  563. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/edge-BkV0erSs.js +0 -0
  564. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/elixir-CDX3lj18.js +0 -0
  565. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/elm-DbKCFpqz.js +0 -0
  566. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/emacs-lisp-C9XAeP06.js +0 -0
  567. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/erb-BOJIQeun.js +0 -0
  568. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/erlang-DsQrWhSR.js +0 -0
  569. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/everforest-dark-BgDCqdQA.js +0 -0
  570. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/everforest-light-C8M2exoo.js +0 -0
  571. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/fennel-BYunw83y.js +0 -0
  572. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/fish-BvzEVeQv.js +0 -0
  573. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/fluent-C4IJs8-o.js +0 -0
  574. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/fortran-fixed-form-CkoXwp7k.js +0 -0
  575. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/fortran-free-form-BxgE0vQu.js +0 -0
  576. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/fsharp-CXgrBDvD.js +0 -0
  577. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/gdresource-B7Tvp0Sc.js +0 -0
  578. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/gdscript-DTMYz4Jt.js +0 -0
  579. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/gdshader-DkwncUOv.js +0 -0
  580. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/genie-D0YGMca9.js +0 -0
  581. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/gherkin-DyxjwDmM.js +0 -0
  582. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/git-commit-F4YmCXRG.js +0 -0
  583. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/git-rebase-r7XF79zn.js +0 -0
  584. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/github-dark-DHJKELXO.js +0 -0
  585. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/github-dark-default-Cuk6v7N8.js +0 -0
  586. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/github-dark-dimmed-DH5Ifo-i.js +0 -0
  587. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/github-dark-high-contrast-E3gJ1_iC.js +0 -0
  588. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/github-light-DAi9KRSo.js +0 -0
  589. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/github-light-default-D7oLnXFd.js +0 -0
  590. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/github-light-high-contrast-BfjtVDDH.js +0 -0
  591. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/gleam-BspZqrRM.js +0 -0
  592. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/glimmer-js-Rg0-pVw9.js +0 -0
  593. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/glimmer-ts-U6CK756n.js +0 -0
  594. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/glsl-DplSGwfg.js +0 -0
  595. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/gn-n2N0HUVH.js +0 -0
  596. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/gnuplot-DdkO51Og.js +0 -0
  597. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/go-Dn2_MT6a.js +0 -0
  598. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/graphql-ChdNCCLP.js +0 -0
  599. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/groovy-gcz8RCvz.js +0 -0
  600. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/gruvbox-dark-hard-CFHQjOhq.js +0 -0
  601. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/gruvbox-dark-medium-GsRaNv29.js +0 -0
  602. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/gruvbox-dark-soft-CVdnzihN.js +0 -0
  603. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/gruvbox-light-hard-CH1njM8p.js +0 -0
  604. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/gruvbox-light-medium-DRw_LuNl.js +0 -0
  605. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/gruvbox-light-soft-hJgmCMqR.js +0 -0
  606. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/hack-CaT9iCJl.js +0 -0
  607. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/haml-B8DHNrY2.js +0 -0
  608. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/handlebars-BL8al0AC.js +0 -0
  609. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/haskell-Df6bDoY_.js +0 -0
  610. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/haxe-CzTSHFRz.js +0 -0
  611. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/hcl-BWvSN4gD.js +0 -0
  612. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/hjson-D5-asLiD.js +0 -0
  613. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/hlsl-D3lLCCz7.js +0 -0
  614. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/houston-DnULxvSX.js +0 -0
  615. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/html-GMplVEZG.js +0 -0
  616. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/html-derivative-BFtXZ54Q.js +0 -0
  617. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/http-jrhK8wxY.js +0 -0
  618. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/hurl-irOxFIW8.js +0 -0
  619. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/hxml-Bvhsp5Yf.js +0 -0
  620. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/hy-DFXneXwc.js +0 -0
  621. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/imba-DGztddWO.js +0 -0
  622. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/index-BpoLgcEt.js +0 -0
  623. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/index-CzV_vCfu.css +0 -0
  624. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/index-DI2oedCt.js +0 -0
  625. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/ini-BEwlwnbL.js +0 -0
  626. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/init-Gi6I4Gst.js +0 -0
  627. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  628. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  629. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  630. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  631. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  632. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  633. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  634. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/java-CylS5w8V.js +0 -0
  635. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/javascript-wDzz0qaB.js +0 -0
  636. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/jinja-4LBKfQ-Z.js +0 -0
  637. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/jison-wvAkD_A8.js +0 -0
  638. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/json-Cp-IABpG.js +0 -0
  639. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/json5-C9tS-k6U.js +0 -0
  640. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/jsonc-Des-eS-w.js +0 -0
  641. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/jsonl-DcaNXYhu.js +0 -0
  642. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/jsonnet-DFQXde-d.js +0 -0
  643. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/jssm-C2t-YnRu.js +0 -0
  644. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/jsx-g9-lgVsj.js +0 -0
  645. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/julia-CxzCAyBv.js +0 -0
  646. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/kanagawa-dragon-CkXjmgJE.js +0 -0
  647. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/kanagawa-lotus-CfQXZHmo.js +0 -0
  648. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/kanagawa-wave-DWedfzmr.js +0 -0
  649. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/katex-D2lIc1rk.css +0 -0
  650. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/kdl-DV7GczEv.js +0 -0
  651. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/kotlin-BdnUsdx6.js +0 -0
  652. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/kusto-DZf3V79B.js +0 -0
  653. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/laserwave-DUszq2jm.js +0 -0
  654. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/latex-B4uzh10-.js +0 -0
  655. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/lean-BZvkOJ9d.js +0 -0
  656. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/less-B1dDrJ26.js +0 -0
  657. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/light-plus-B7mTdjB0.js +0 -0
  658. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/liquid-DYVedYrR.js +0 -0
  659. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/llvm-BtvRca6l.js +0 -0
  660. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/log-2UxHyX5q.js +0 -0
  661. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/logo-BtOb2qkB.js +0 -0
  662. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/lua-BbnMAYS6.js +0 -0
  663. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/luau-C-HG3fhB.js +0 -0
  664. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/make-CHLpvVh8.js +0 -0
  665. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/markdown-Cvjx9yec.js +0 -0
  666. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/marko-DZsq8hO1.js +0 -0
  667. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/material-theme-D5KoaKCx.js +0 -0
  668. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/material-theme-darker-BfHTSMKl.js +0 -0
  669. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/material-theme-lighter-B0m2ddpp.js +0 -0
  670. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/material-theme-ocean-CyktbL80.js +0 -0
  671. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/material-theme-palenight-Csfq5Kiy.js +0 -0
  672. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/matlab-D7o27uSR.js +0 -0
  673. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/mdc-DUICxH0z.js +0 -0
  674. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/mdx-Cmh6b_Ma.js +0 -0
  675. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-B2P5VJ9v.css +0 -0
  676. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/mermaid-mWjccvbQ.js +0 -0
  677. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/min-dark-CafNBF8u.js +0 -0
  678. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/min-light-CTRr51gU.js +0 -0
  679. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/mipsasm-CKIfxQSi.js +0 -0
  680. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/mojo-B93PlW-d.js +0 -0
  681. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/monokai-D4h5O-jR.js +0 -0
  682. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/moonbit-Ba13S78F.js +0 -0
  683. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/move-Bu9oaDYs.js +0 -0
  684. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/narrat-DRg8JJMk.js +0 -0
  685. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/nextflow-BrzmwbiE.js +0 -0
  686. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/nginx-DknmC5AR.js +0 -0
  687. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/night-owl-C39BiMTA.js +0 -0
  688. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/nim-CVrawwO9.js +0 -0
  689. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/nix-CwoSXNpI.js +0 -0
  690. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/nord-Ddv68eIx.js +0 -0
  691. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/nushell-C-sUppwS.js +0 -0
  692. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/objective-c-DXmwc3jG.js +0 -0
  693. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/objective-cpp-CLxacb5B.js +0 -0
  694. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/ocaml-C0hk2d4L.js +0 -0
  695. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/one-dark-pro-DVMEJ2y_.js +0 -0
  696. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/one-light-PoHY5YXO.js +0 -0
  697. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/openscad-C4EeE6gA.js +0 -0
  698. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/ordinal-Cboi1Yqb.js +0 -0
  699. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/pascal-D93ZcfNL.js +0 -0
  700. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/perl-C0TMdlhV.js +0 -0
  701. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/php-CDn_0X-4.js +0 -0
  702. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/pkl-u5AG7uiY.js +0 -0
  703. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/plastic-3e1v2bzS.js +0 -0
  704. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/plsql-ChMvpjG-.js +0 -0
  705. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/po-BTJTHyun.js +0 -0
  706. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/poimandres-CS3Unz2-.js +0 -0
  707. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/polar-C0HS_06l.js +0 -0
  708. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/postcss-CXtECtnM.js +0 -0
  709. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/powerquery-CEu0bR-o.js +0 -0
  710. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/powershell-Dpen1YoG.js +0 -0
  711. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/prisma-Dd19v3D-.js +0 -0
  712. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/prolog-CbFg5uaA.js +0 -0
  713. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/proto-C7zT0LnQ.js +0 -0
  714. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/pug-CGlum2m_.js +0 -0
  715. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/puppet-BMWR74SV.js +0 -0
  716. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/purescript-CklMAg4u.js +0 -0
  717. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/python-B6aJPvgy.js +0 -0
  718. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/qml-3beO22l8.js +0 -0
  719. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/qmldir-C8lEn-DE.js +0 -0
  720. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/qss-IeuSbFQv.js +0 -0
  721. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/r-Dspwwk_N.js +0 -0
  722. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/racket-BqYA7rlc.js +0 -0
  723. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/raku-DXvB9xmW.js +0 -0
  724. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/razor-C1TweQQi.js +0 -0
  725. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/red-bN70gL4F.js +0 -0
  726. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/reg-C-SQnVFl.js +0 -0
  727. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/regexp-CDVJQ6XC.js +0 -0
  728. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/rel-C3B-1QV4.js +0 -0
  729. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/riscv-BM1_JUlF.js +0 -0
  730. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/rose-pine-dawn-DHQR4-dF.js +0 -0
  731. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/rose-pine-moon-D4_iv3hh.js +0 -0
  732. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/rose-pine-qdsjHGoJ.js +0 -0
  733. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/rosmsg-BJDFO7_C.js +0 -0
  734. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/rst-B0xPkSld.js +0 -0
  735. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/ruby-BvKwtOVI.js +0 -0
  736. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/rust-B1yitclQ.js +0 -0
  737. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/sas-cz2c8ADy.js +0 -0
  738. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/sass-Cj5Yp3dK.js +0 -0
  739. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/scala-C151Ov-r.js +0 -0
  740. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/scheme-C98Dy4si.js +0 -0
  741. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/scss-OYdSNvt2.js +0 -0
  742. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/sdbl-DVxCFoDh.js +0 -0
  743. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/shaderlab-Dg9Lc6iA.js +0 -0
  744. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/shellscript-Yzrsuije.js +0 -0
  745. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/shellsession-BADoaaVG.js +0 -0
  746. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/slack-dark-BthQWCQV.js +0 -0
  747. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/slack-ochin-DqwNpetd.js +0 -0
  748. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/smalltalk-BERRCDM3.js +0 -0
  749. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/snazzy-light-Bw305WKR.js +0 -0
  750. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/solarized-dark-DXbdFlpD.js +0 -0
  751. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/solarized-light-L9t79GZl.js +0 -0
  752. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/solidity-rGO070M0.js +0 -0
  753. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/soy-Brmx7dQM.js +0 -0
  754. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/sparql-rVzFXLq3.js +0 -0
  755. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/splunk-BtCnVYZw.js +0 -0
  756. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/sql-BLtJtn59.js +0 -0
  757. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/ssh-config-_ykCGR6B.js +0 -0
  758. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/stata-BH5u7GGu.js +0 -0
  759. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/stylus-BEDo0Tqx.js +0 -0
  760. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/svelte-zxCyuUbr.js +0 -0
  761. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/swift-Dg5xB15N.js +0 -0
  762. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/synthwave-84-CbfX1IO0.js +0 -0
  763. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/system-verilog-CnnmHF94.js +0 -0
  764. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/systemd-4A_iFExJ.js +0 -0
  765. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/talonscript-CkByrt1z.js +0 -0
  766. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/tasl-QIJgUcNo.js +0 -0
  767. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/tcl-dwOrl1Do.js +0 -0
  768. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/templ-W15q3VgB.js +0 -0
  769. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/terraform-BETggiCN.js +0 -0
  770. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/tex-CvyZ59Mk.js +0 -0
  771. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/tokyo-night-hegEt444.js +0 -0
  772. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/toml-vGWfd6FD.js +0 -0
  773. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/ts-tags-zn1MmPIZ.js +0 -0
  774. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/tsv-B_m7g4N7.js +0 -0
  775. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/tsx-COt5Ahok.js +0 -0
  776. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/turtle-BsS91CYL.js +0 -0
  777. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/twig-CO9l9SDP.js +0 -0
  778. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/typescript-BPQ3VLAy.js +0 -0
  779. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/typespec-BGHnOYBU.js +0 -0
  780. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/typst-DHCkPAjA.js +0 -0
  781. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/v-BcVCzyr7.js +0 -0
  782. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/vala-CsfeWuGM.js +0 -0
  783. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/vb-D17OF-Vu.js +0 -0
  784. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/verilog-BQ8w6xss.js +0 -0
  785. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/vesper-DU1UobuO.js +0 -0
  786. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/vhdl-CeAyd5Ju.js +0 -0
  787. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/viml-CJc9bBzg.js +0 -0
  788. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/vitesse-black-Bkuqu6BP.js +0 -0
  789. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/vitesse-dark-D0r3Knsf.js +0 -0
  790. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/vitesse-light-CVO1_9PV.js +0 -0
  791. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/vue-DN_0RTcg.js +0 -0
  792. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/vue-html-AaS7Mt5G.js +0 -0
  793. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/vue-vine-CQOfvN7w.js +0 -0
  794. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/vyper-CDx5xZoG.js +0 -0
  795. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/wasm-CG6Dc4jp.js +0 -0
  796. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/wasm-MzD3tlZU.js +0 -0
  797. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/wenyan-BV7otONQ.js +0 -0
  798. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/wgsl-Dx-B1_4e.js +0 -0
  799. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/wikitext-BhOHFoWU.js +0 -0
  800. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/wit-5i3qLPDT.js +0 -0
  801. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/wolfram-lXgVvXCa.js +0 -0
  802. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/xml-sdJ4AIDG.js +0 -0
  803. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/xsl-CtQFsRM5.js +0 -0
  804. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/yaml-Buea-lGh.js +0 -0
  805. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/zenscript-DVFEvuxE.js +0 -0
  806. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/zig-VOosw3JB.js +0 -0
  807. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/apple-touch-icon.png +0 -0
  808. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/arctecture.webp +0 -0
  809. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/bimi-logo.svg +0 -0
  810. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/favicon.ico +0 -0
  811. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/fonts/dm-sans-latin-ext.woff2 +0 -0
  812. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/fonts/dm-sans-latin.woff2 +0 -0
  813. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/fonts/instrument-sans-latin-ext.woff2 +0 -0
  814. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/fonts/instrument-sans-latin.woff2 +0 -0
  815. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/fonts/instrument-serif-latin-ext.woff2 +0 -0
  816. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/fonts/instrument-serif-latin.woff2 +0 -0
  817. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-italic-latin-ext.woff2 +0 -0
  818. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-italic-latin.woff2 +0 -0
  819. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-latin-ext.woff2 +0 -0
  820. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-latin.woff2 +0 -0
  821. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/fonts/roboto-latin-ext.woff2 +0 -0
  822. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/fonts/roboto-latin.woff2 +0 -0
  823. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/icon-192.png +0 -0
  824. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/icon-512.png +0 -0
  825. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/icon.svg +0 -0
  826. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/logo.png +0 -0
  827. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/pythinker_animated.svg +0 -0
  828. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/robots.txt +0 -0
  829. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/logo.png +0 -0
  830. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/store/__init__.py +0 -0
  831. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/web/store/sessions.py +0 -0
  832. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/wire/__init__.py +0 -0
  833. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/wire/file.py +0 -0
  834. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/wire/jsonrpc.py +0 -0
  835. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/wire/protocol.py +0 -0
  836. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/wire/root_hub.py +0 -0
  837. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/wire/serde.py +0 -0
  838. {pythinker_code-0.13.0 → pythinker_code-0.15.0}/src/pythinker_code/wire/server.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pythinker-code
3
- Version: 0.13.0
3
+ Version: 0.15.0
4
4
  Summary: Pythinker Code is your next CLI agent.
5
5
  Keywords: cli,agent,ai,coding-assistant,llm,claude,openai,terminal
6
6
  Author: Mohamed Elkholy
@@ -80,6 +80,7 @@ Description-Content-Type: text/markdown
80
80
  [![CI](https://img.shields.io/github/actions/workflow/status/mohamed-elkholy95/Pythinker-Code/ci-pythinker-cli.yml?branch=main&label=CI&style=for-the-badge&logo=githubactions&logoColor=white)](https://github.com/mohamed-elkholy95/Pythinker-Code/actions/workflows/ci-pythinker-cli.yml?query=branch%3Amain)
81
81
 
82
82
  [![Downloads](https://img.shields.io/pepy/dt/pythinker-code?cacheSeconds=300)](https://pepy.tech/projects/pythinker-code)
83
+ [![Installs](https://img.shields.io/endpoint?url=https://pythinker.com/api/installs/badge&cacheSeconds=300)](https://pythinker.com)
83
84
  [![Code style: Ruff](https://img.shields.io/badge/code%20style-ruff-f59e0b.svg?style=flat-square&logo=ruff&logoColor=white)](https://docs.astral.sh/ruff/)
84
85
  [![ACP ready](https://img.shields.io/badge/ACP-ready-7c3aed.svg?style=flat-square)](https://github.com/agentclientprotocol/agent-client-protocol)
85
86
  [![MCP tools](https://img.shields.io/badge/MCP-tools-0891b2.svg?style=flat-square)](https://modelcontextprotocol.io/)
@@ -97,7 +98,7 @@ Description-Content-Type: text/markdown
97
98
 
98
99
  <br /><br />
99
100
 
100
- <img src="https://raw.githubusercontent.com/mohamed-elkholy95/Pythinker-Code/main/docs/media/pythinker-code.gif" alt="Pythinker Code terminal demo" width="860">
101
+ <img src="https://raw.githubusercontent.com/mohamed-elkholy95/Pythinker-Code/main/docs/media/pythinker-cli.gif" alt="Pythinker Code terminal demo" width="860">
101
102
 
102
103
  </div>
103
104
 
@@ -115,15 +116,13 @@ It speaks the [**Agent Client Protocol (ACP)**](https://github.com/agentclientpr
115
116
 
116
117
  ---
117
118
 
118
- ## 🆕 What's New in 0.13.0
119
+ ## 🆕 What's New in 0.15.0
119
120
 
120
- - **Native installers for macOS and Linux.** `brew install mohamed-elkholy95/pythinker/pythinker-code` works on both macOS (Intel + Apple Silicon) and Linux brew installs. Debian/Ubuntu users get `pythinker-code_0.13.0_<arch>.deb`, Fedora/RHEL/openSUSE users get `pythinker-code-0.13.0.<arch>.rpm`, both built for `x86_64` and `aarch64`. Together with the Windows `PythinkerSetup-0.13.0.exe` shipped in 0.12.0, Pythinker now has a real native installer on every supported platform.
121
- - **Cross-OS `install-native.sh`.** `curl -fsSL .../install-native.sh | bash` auto-detects your OS + arch, verifies SHA-256, and lands `pythinker` at `~/.local/bin/`. The script is the no-package-manager fallback for containers and fresh VMs.
122
- - **Homebrew tap auto-publishes on every release.** A new tag-triggered workflow regenerates `Formula/pythinker-code.rb` (132 transitive deps enumerated automatically) and pushes it to [mohamed-elkholy95/homebrew-pythinker](https://github.com/mohamed-elkholy95/homebrew-pythinker). `brew upgrade pythinker-code` picks up new versions; no hand-curation per release.
123
- - **Frozen-binary fix for 0.12.0's installer.** The PyInstaller specs now bundle every `.md` / `.yaml` package data file (`prompts/`, `agents/`, `tools/*/description.md`, `skills/*/SKILL.md`). 0.12.0's Windows installer crashed on first prompt load — **upgrade to 0.13.0** to fix it.
124
- - **Legacy install paths deprecated.** The helper shell scripts (`install.sh`, `install.ps1`), `uvx`, `uv tool install`, `pipx install`, and bare `pip install` keep working but are now flagged as legacy. README Quick Start leads with the per-OS native installer table. Set `PYTHINKER_INSTALL_QUIET_DEPRECATION=1` to silence the deprecation banner in the helper scripts.
121
+ - **Native updater fixed for curl-bash installs.** `pythinker update` now recognizes PyInstaller-frozen `~/.local/bin/pythinker` binaries as native installs even when older onefile tarballs lack the `.pythinker-native` sentinel.
122
+ - **Unix native updates pull release archives directly.** On Linux and Apple Silicon macOS, `pythinker update` downloads the matching `pythinker-0.15.0-<target>.tar.gz`, verifies its `.sha256`, and replaces the current native binary instead of trying to run `pythinker -m pip install`.
123
+ - **Clearer fallback guidance.** Native update banners now point Unix users at the canonical `curl -fsSL https://pythinker.com/install.sh | bash -s -- --version 0.15.0` command, while Windows still points at the native setup executable.
125
124
 
126
- Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.13.0`, or use the native installer for your platform from the [Releases page](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest).
125
+ Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.15.0`, or use the native installer for your platform from the [Releases page](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest).
127
126
 
128
127
 
129
128
  ---
@@ -168,7 +167,7 @@ Manage stdio and HTTP MCP servers with `pythinker mcp`. OAuth-backed servers, pe
168
167
 
169
168
  ### 🤖 Subagents & Skills
170
169
 
171
- Delegate focused work to built-in subagents. Load reusable instructions via `/skill:<name>` and bundled prompt flows via `/flow:<name>`.
170
+ Delegate focused work to built-in subagents. Load reusable instructions via `/skill:<name>` and bundled prompt flows via `/flow:<name>`. Use `pythinker skill list`, `pythinker skill lock`, and `pythinker skill verify-lock` to inspect project skills and pin their hashes in `skills-lock.json`.
172
171
 
173
172
  </td>
174
173
  <td width="50%" valign="top">
@@ -213,94 +212,189 @@ matches your OS — no Python, Node, or `uv` prerequisite.
213
212
 
214
213
  | Platform | One-line install | Artifact |
215
214
  |---|---|---|
216
- | **🪟 Windows** | Download + double-click `PythinkerSetup-x.y.z.exe` | [Releases](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest) |
215
+ | **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | native `.exe` installer |
217
216
  | **🍎 macOS (Apple Silicon + Intel)** | `brew install mohamed-elkholy95/pythinker/pythinker-code` | Homebrew tap |
218
- | **🐧 Linux (Debian / Ubuntu)** | `sudo dpkg -i pythinker-code_x.y.z_amd64.deb` | [Releases](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest) |
219
- | **🐧 Linux (Fedora / RHEL / openSUSE)** | `sudo rpm -i pythinker-code-x.y.z.x86_64.rpm` | [Releases](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest) |
220
- | **🌐 macOS / Linux curl-bash** | `curl -fsSL https://raw.githubusercontent.com/mohamed-elkholy95/Pythinker-Code/main/scripts/install-native.sh \| bash` | tarball |
217
+ | **🐧 Linux (Debian / Ubuntu)** | `sudo dpkg -i pythinker-code_0.15.0_amd64.deb` | [Releases](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest) |
218
+ | **🐧 Linux (Fedora / RHEL)** | Download `pythinker-code-0.15.0.x86_64.rpm`, then `sudo dnf install ./pythinker-code-0.15.0.x86_64.rpm` | [Releases](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest) |
219
+ | **🐧 Linux (openSUSE)** | Download `pythinker-code-0.15.0.x86_64.rpm`, then `sudo zypper install ./pythinker-code-0.15.0.x86_64.rpm` | [Releases](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest) |
220
+ | **🌐 macOS / Linux — curl-bash** | `curl -fsSL https://pythinker.com/install.sh \| bash` | tarball |
221
+ | **🐍 Python fallback** (universal) | `pip install pythinker-code` | PyPI |
221
222
 
222
- > **Updates** Once installed, `pythinker update` checks the GitHub Releases
223
- > API, verifies the new artifact's SHA-256, and re-runs the installer for you.
224
- > Set `PYTHINKER_CLI_NO_AUTO_UPDATE=1` to disable the startup update check.
223
+ Every artifact ships with a matching `.sha256` file verify before install on
224
+ any platform with `sha256sum`, `shasum -a 256`, or `Get-FileHash`.
225
225
 
226
- > **Verifying downloads** Every artifact ships with a matching `.sha256`
227
- > file. Verify before installing with `sha256sum`, `shasum -a 256`, or
228
- > PowerShell's `Get-FileHash` (see platform sections below).
226
+ After install, on any OS:
229
227
 
230
- ### 🪟 Windows native installer — details
228
+ ```sh
229
+ pythinker --version # confirm install
230
+ pythinker login # (optional) authenticate a hosted provider
231
+ pythinker # start the interactive TUI
232
+ ```
233
+
234
+ > **In-app updates** — `pythinker update` queries the GitHub Releases API and
235
+ > re-runs the right installer for your build with SHA-256 verification. Set
236
+ > `PYTHINKER_CLI_NO_AUTO_UPDATE=1` to disable the proactive startup check.
237
+
238
+ ---
231
239
 
232
- `PythinkerSetup-x.y.z.exe` installs per-user to `%LOCALAPPDATA%\Programs\Pythinker`
233
- and adds `pythinker` to your user PATH (`HKCU\Environment`). No UAC prompt.
240
+ ### 🪟 Windows native installer
241
+
242
+ `PythinkerSetup-0.15.0.exe` is a signed* Inno Setup wizard. Installs per-user
243
+ into `%LOCALAPPDATA%\Programs\Pythinker`, registers `pythinker` on your user
244
+ PATH (`HKCU\Environment`), broadcasts `WM_SETTINGCHANGE` so new shells see
245
+ the change. **No UAC prompt.**
234
246
 
235
247
  ```powershell
236
- # 1. Verify the download
237
- Get-FileHash .\PythinkerSetup-x.y.z.exe -Algorithm SHA256
238
- Get-Content .\PythinkerSetup-x.y.z.exe.sha256
248
+ # One-line install (downloads the native .exe, verifies SHA-256, runs per-user)
249
+ irm https://pythinker.com/install.ps1 | iex
239
250
 
240
- # 2. Run the installer (double-click also works)
241
- .\PythinkerSetup-x.y.z.exe
251
+ # Or manually download the installer + checksum from the Releases page,
252
+ # verify with Get-FileHash, then run:
253
+ .\PythinkerSetup-0.15.0.exe
242
254
 
243
- # 3. Open a fresh PowerShell
255
+ # Open a fresh PowerShell
244
256
  pythinker --version
245
257
  ```
246
258
 
247
- **Per-machine install** (IT-managed boxes): `.\PythinkerSetup-x.y.z.exe /ALLUSERS`
248
- installs to `%ProgramFiles%\Pythinker` and writes to HKLM.
259
+ **Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.15.0.exe /ALLUSERS`
260
+ installs to `%ProgramFiles%\Pythinker` and writes PATH to HKLM (requires admin).
261
+
262
+ **Upgrade:** `pythinker update` from inside the running app — it downloads
263
+ the newest installer, verifies SHA-256, and re-runs it silently
264
+ (`/VERYSILENT /SUPPRESSMSGBOXES /NORESTART`).
249
265
 
250
- **Uninstall:** Apps & Features → *Pythinker Code* → Uninstall reverts both the
251
- files and the PATH edit.
266
+ **Uninstall:** Apps & Features → *Pythinker Code* → Uninstall reverts both
267
+ the files and the PATH edit.
252
268
 
253
- > 🛡 **First-launch SmartScreen warning** — until the Authenticode cert is in
254
- > CI, the installer ships unsigned and SmartScreen shows *"Windows protected
255
- > your PC."* Click **More info → Run anyway**. Use the published SHA-256 as
256
- > your integrity check.
269
+ > 🛡 **First-launch SmartScreen warning** — \*until the Authenticode cert is
270
+ > provisioned in CI, the installer ships unsigned and Windows shows
271
+ > *"Windows protected your PC."* Click **More info → Run anyway**. Use the
272
+ > published `.sha256` as your integrity check until signing comes online.
257
273
 
258
- ### 🍎 macOS — Homebrew
274
+ ---
275
+
276
+ ### 🍎 macOS — Homebrew tap
259
277
 
260
278
  ```sh
279
+ # 1. Install
261
280
  brew install mohamed-elkholy95/pythinker/pythinker-code
262
- brew upgrade pythinker-code # manual updates; brew packages don't auto-update
281
+
282
+ # 2. Verify
283
+ pythinker --version
284
+ which pythinker # -> /opt/homebrew/bin/pythinker (Apple Silicon)
285
+ # or /usr/local/bin/pythinker (Intel)
263
286
  ```
264
287
 
265
- Drops `pythinker` at `$(brew --prefix)/bin/pythinker`. Works on Apple Silicon
266
- and Intel; brew picks the right Python build for you.
288
+ Works on **Apple Silicon and Intel** — brew picks the right Python build for
289
+ you. The tap auto-publishes a fresh formula on every Pythinker release, so
290
+ `brew upgrade pythinker-code` always finds the latest version.
291
+
292
+ **Upgrade:** `brew upgrade pythinker-code` (Homebrew packages don't
293
+ auto-update; run this whenever you want the latest).
294
+
295
+ **Uninstall:** `brew uninstall pythinker-code && brew untap mohamed-elkholy95/pythinker`.
296
+
297
+ > The tap repo is [mohamed-elkholy95/homebrew-pythinker](https://github.com/mohamed-elkholy95/homebrew-pythinker)
298
+ > — auto-maintained, do not hand-edit.
299
+
300
+ ---
267
301
 
268
302
  ### 🐧 Linux — system packages
269
303
 
270
- Native packages are attached to every GitHub Release. Both `.deb` and `.rpm`
271
- are built for `x86_64` and `aarch64`:
304
+ Native `.deb` and `.rpm` packages for both `x86_64` and `aarch64` are
305
+ attached to every GitHub Release.
306
+
307
+ ```sh
308
+ # Debian / Ubuntu (x86_64)
309
+ sudo dpkg -i pythinker-code_0.15.0_amd64.deb
310
+ sudo apt-get install -f # only if dpkg reports missing deps
311
+
312
+ # Debian / Ubuntu (ARM64)
313
+ sudo dpkg -i pythinker-code_0.15.0_arm64.deb
314
+
315
+ # Fedora / RHEL / openSUSE (x86_64)
316
+ curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.15.0/pythinker-code-0.15.0.x86_64.rpm
317
+ curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.15.0/pythinker-code-0.15.0.x86_64.rpm.sha256
318
+ sha256sum -c pythinker-code-0.15.0.x86_64.rpm.sha256
319
+ # Fedora / RHEL:
320
+ sudo dnf install ./pythinker-code-0.15.0.x86_64.rpm
321
+ # openSUSE:
322
+ sudo zypper install ./pythinker-code-0.15.0.x86_64.rpm
323
+
324
+ # Fedora / RHEL (aarch64)
325
+ curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.15.0/pythinker-code-0.15.0.aarch64.rpm
326
+ curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.15.0/pythinker-code-0.15.0.aarch64.rpm.sha256
327
+ sha256sum -c pythinker-code-0.15.0.aarch64.rpm.sha256
328
+ sudo dnf install ./pythinker-code-0.15.0.aarch64.rpm
329
+ ```
330
+
331
+ Both packages drop a small `/usr/bin/pythinker` launcher that execs the real
332
+ binary under `/usr/lib/pythinker/`, so your `$PATH` stays tidy.
333
+
334
+ **Verify before install:**
272
335
 
273
336
  ```sh
274
- # Debian / Ubuntu
275
- sudo dpkg -i pythinker-code_x.y.z_amd64.deb
276
- # If apt complains about missing deps:
277
- sudo apt-get install -f
337
+ sha256sum -c pythinker-code_0.15.0_amd64.deb.sha256 # Debian/Ubuntu
338
+ sha256sum -c pythinker-code-0.15.0.x86_64.rpm.sha256 # Fedora/RHEL
339
+ ```
340
+
341
+ **Upgrade:** download the new `.deb`/`.rpm` from Releases and `dpkg -i` /
342
+ `dnf install` over it. Or run `pythinker update` from inside the running
343
+ app — it'll fetch the matching new package and prompt for sudo to install.
344
+
345
+ **Uninstall:**
278
346
 
279
- # Fedora / RHEL / openSUSE
280
- sudo rpm -i pythinker-code-x.y.z.x86_64.rpm
281
- # or:
282
- sudo dnf install ./pythinker-code-x.y.z.x86_64.rpm
347
+ ```sh
348
+ sudo dpkg -r pythinker-code # Debian/Ubuntu
349
+ sudo rpm -e pythinker-code # Fedora/RHEL
283
350
  ```
284
351
 
285
- Both packages drop `/usr/bin/pythinker` (a small launcher that execs the real
286
- binary under `/usr/lib/pythinker/`).
352
+ ---
287
353
 
288
354
  ### 🌐 macOS / Linux — curl-bash native installer
289
355
 
290
- For machines without a package manager (containers, fresh VMs), the
291
- [install-native.sh](./scripts/install-native.sh) helper downloads the right
292
- tarball for your OS + arch, verifies SHA-256, and installs to `~/.local/`.
356
+ For containers, fresh VMs, or any host without a system package manager.
357
+ The canonical `https://pythinker.com/install.sh` endpoint is backed by
358
+ [`scripts/install-native.sh`](./scripts/install-native.sh). It serves shell
359
+ script content directly, detects your OS + arch, downloads the matching
360
+ PyInstaller-frozen tarball, verifies its SHA-256, and lands the single binary
361
+ at `~/.local/bin/pythinker`.
293
362
 
294
363
  ```sh
295
- curl -fsSL https://raw.githubusercontent.com/mohamed-elkholy95/Pythinker-Code/main/scripts/install-native.sh | bash
364
+ # Latest release
365
+ curl -fsSL https://pythinker.com/install.sh | bash
296
366
 
297
- # Pin a specific version:
298
- curl -fsSL ...install-native.sh | bash -s -- --version 0.13.0
367
+ # Pin a specific version
368
+ curl -fsSL https://pythinker.com/install.sh | bash -s -- --version 0.15.0
369
+
370
+ # Custom prefix (defaults to $HOME/.local)
371
+ curl -fsSL https://pythinker.com/install.sh | bash -s -- --prefix /opt/pythinker
299
372
  ```
300
373
 
301
- The script lands the binary at `~/.local/share/pythinker/` and symlinks
302
- `~/.local/bin/pythinker`. It prints PATH guidance if `~/.local/bin` isn't on
303
- your `$PATH`.
374
+ Host `/install.sh` with:
375
+
376
+ ```http
377
+ Content-Type: text/x-shellscript; charset=utf-8
378
+ Cache-Control: public, max-age=300, s-maxage=900, stale-if-error=86400
379
+ ```
380
+
381
+ Use long immutable caching only for versioned release artifact URLs, for
382
+ example `Cache-Control: public, max-age=31536000, immutable` on fixed-tag
383
+ assets.
384
+
385
+ Supported targets:
386
+
387
+ | `uname -s / -m` | Tarball asset |
388
+ |---|---|
389
+ | Linux / x86_64 | `pythinker-0.15.0-x86_64-unknown-linux-gnu.tar.gz` |
390
+ | Linux / aarch64 | `pythinker-0.15.0-aarch64-unknown-linux-gnu.tar.gz` |
391
+ | Darwin / arm64 | `pythinker-0.15.0-aarch64-apple-darwin.tar.gz` |
392
+
393
+ The script prints PATH guidance if `~/.local/bin` isn't already on your
394
+ `$PATH`. Intel macOS users — use Homebrew or `pip install pythinker-code`;
395
+ no PyInstaller-built Intel Darwin binary is published.
396
+
397
+ **Uninstall:** `rm ~/.local/bin/pythinker`.
304
398
 
305
399
  ### 🛠 Power-user / legacy install paths
306
400
 
@@ -313,13 +407,10 @@ your `$PATH`.
313
407
  <summary>Legacy shell-script wrappers + uv / pipx</summary>
314
408
 
315
409
  ```sh
316
- # Legacy: uv-based shell-script wrappers (prints a deprecation banner on run)
317
- curl -fsSL https://raw.githubusercontent.com/mohamed-elkholy95/Pythinker-Code/main/scripts/install.sh | bash
318
- # Windows PowerShell wrapper:
319
- $installer = Join-Path $env:TEMP "pythinker-install.ps1"
320
- iwr -UseBasicParsing https://raw.githubusercontent.com/mohamed-elkholy95/Pythinker-Code/main/scripts/install.ps1 -OutFile $installer
321
- & $installer
322
- Remove-Item $installer
410
+ # Compatibility shim to the native installer
411
+ scripts/install.sh
412
+ # Windows PowerShell native installer bootstrap:
413
+ powershell -c "irm https://pythinker.com/install.ps1 | iex"
323
414
 
324
415
  # Legacy: one-off run via uvx
325
416
  uvx pythinker-code
@@ -15,6 +15,7 @@
15
15
  [![CI](https://img.shields.io/github/actions/workflow/status/mohamed-elkholy95/Pythinker-Code/ci-pythinker-cli.yml?branch=main&label=CI&style=for-the-badge&logo=githubactions&logoColor=white)](https://github.com/mohamed-elkholy95/Pythinker-Code/actions/workflows/ci-pythinker-cli.yml?query=branch%3Amain)
16
16
 
17
17
  [![Downloads](https://img.shields.io/pepy/dt/pythinker-code?cacheSeconds=300)](https://pepy.tech/projects/pythinker-code)
18
+ [![Installs](https://img.shields.io/endpoint?url=https://pythinker.com/api/installs/badge&cacheSeconds=300)](https://pythinker.com)
18
19
  [![Code style: Ruff](https://img.shields.io/badge/code%20style-ruff-f59e0b.svg?style=flat-square&logo=ruff&logoColor=white)](https://docs.astral.sh/ruff/)
19
20
  [![ACP ready](https://img.shields.io/badge/ACP-ready-7c3aed.svg?style=flat-square)](https://github.com/agentclientprotocol/agent-client-protocol)
20
21
  [![MCP tools](https://img.shields.io/badge/MCP-tools-0891b2.svg?style=flat-square)](https://modelcontextprotocol.io/)
@@ -32,7 +33,7 @@
32
33
 
33
34
  <br /><br />
34
35
 
35
- <img src="https://raw.githubusercontent.com/mohamed-elkholy95/Pythinker-Code/main/docs/media/pythinker-code.gif" alt="Pythinker Code terminal demo" width="860">
36
+ <img src="https://raw.githubusercontent.com/mohamed-elkholy95/Pythinker-Code/main/docs/media/pythinker-cli.gif" alt="Pythinker Code terminal demo" width="860">
36
37
 
37
38
  </div>
38
39
 
@@ -50,15 +51,13 @@ It speaks the [**Agent Client Protocol (ACP)**](https://github.com/agentclientpr
50
51
 
51
52
  ---
52
53
 
53
- ## 🆕 What's New in 0.13.0
54
+ ## 🆕 What's New in 0.15.0
54
55
 
55
- - **Native installers for macOS and Linux.** `brew install mohamed-elkholy95/pythinker/pythinker-code` works on both macOS (Intel + Apple Silicon) and Linux brew installs. Debian/Ubuntu users get `pythinker-code_0.13.0_<arch>.deb`, Fedora/RHEL/openSUSE users get `pythinker-code-0.13.0.<arch>.rpm`, both built for `x86_64` and `aarch64`. Together with the Windows `PythinkerSetup-0.13.0.exe` shipped in 0.12.0, Pythinker now has a real native installer on every supported platform.
56
- - **Cross-OS `install-native.sh`.** `curl -fsSL .../install-native.sh | bash` auto-detects your OS + arch, verifies SHA-256, and lands `pythinker` at `~/.local/bin/`. The script is the no-package-manager fallback for containers and fresh VMs.
57
- - **Homebrew tap auto-publishes on every release.** A new tag-triggered workflow regenerates `Formula/pythinker-code.rb` (132 transitive deps enumerated automatically) and pushes it to [mohamed-elkholy95/homebrew-pythinker](https://github.com/mohamed-elkholy95/homebrew-pythinker). `brew upgrade pythinker-code` picks up new versions; no hand-curation per release.
58
- - **Frozen-binary fix for 0.12.0's installer.** The PyInstaller specs now bundle every `.md` / `.yaml` package data file (`prompts/`, `agents/`, `tools/*/description.md`, `skills/*/SKILL.md`). 0.12.0's Windows installer crashed on first prompt load — **upgrade to 0.13.0** to fix it.
59
- - **Legacy install paths deprecated.** The helper shell scripts (`install.sh`, `install.ps1`), `uvx`, `uv tool install`, `pipx install`, and bare `pip install` keep working but are now flagged as legacy. README Quick Start leads with the per-OS native installer table. Set `PYTHINKER_INSTALL_QUIET_DEPRECATION=1` to silence the deprecation banner in the helper scripts.
56
+ - **Native updater fixed for curl-bash installs.** `pythinker update` now recognizes PyInstaller-frozen `~/.local/bin/pythinker` binaries as native installs even when older onefile tarballs lack the `.pythinker-native` sentinel.
57
+ - **Unix native updates pull release archives directly.** On Linux and Apple Silicon macOS, `pythinker update` downloads the matching `pythinker-0.15.0-<target>.tar.gz`, verifies its `.sha256`, and replaces the current native binary instead of trying to run `pythinker -m pip install`.
58
+ - **Clearer fallback guidance.** Native update banners now point Unix users at the canonical `curl -fsSL https://pythinker.com/install.sh | bash -s -- --version 0.15.0` command, while Windows still points at the native setup executable.
60
59
 
61
- Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.13.0`, or use the native installer for your platform from the [Releases page](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest).
60
+ Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.15.0`, or use the native installer for your platform from the [Releases page](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest).
62
61
 
63
62
 
64
63
  ---
@@ -103,7 +102,7 @@ Manage stdio and HTTP MCP servers with `pythinker mcp`. OAuth-backed servers, pe
103
102
 
104
103
  ### 🤖 Subagents & Skills
105
104
 
106
- Delegate focused work to built-in subagents. Load reusable instructions via `/skill:<name>` and bundled prompt flows via `/flow:<name>`.
105
+ Delegate focused work to built-in subagents. Load reusable instructions via `/skill:<name>` and bundled prompt flows via `/flow:<name>`. Use `pythinker skill list`, `pythinker skill lock`, and `pythinker skill verify-lock` to inspect project skills and pin their hashes in `skills-lock.json`.
107
106
 
108
107
  </td>
109
108
  <td width="50%" valign="top">
@@ -148,94 +147,189 @@ matches your OS — no Python, Node, or `uv` prerequisite.
148
147
 
149
148
  | Platform | One-line install | Artifact |
150
149
  |---|---|---|
151
- | **🪟 Windows** | Download + double-click `PythinkerSetup-x.y.z.exe` | [Releases](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest) |
150
+ | **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | native `.exe` installer |
152
151
  | **🍎 macOS (Apple Silicon + Intel)** | `brew install mohamed-elkholy95/pythinker/pythinker-code` | Homebrew tap |
153
- | **🐧 Linux (Debian / Ubuntu)** | `sudo dpkg -i pythinker-code_x.y.z_amd64.deb` | [Releases](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest) |
154
- | **🐧 Linux (Fedora / RHEL / openSUSE)** | `sudo rpm -i pythinker-code-x.y.z.x86_64.rpm` | [Releases](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest) |
155
- | **🌐 macOS / Linux curl-bash** | `curl -fsSL https://raw.githubusercontent.com/mohamed-elkholy95/Pythinker-Code/main/scripts/install-native.sh \| bash` | tarball |
152
+ | **🐧 Linux (Debian / Ubuntu)** | `sudo dpkg -i pythinker-code_0.15.0_amd64.deb` | [Releases](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest) |
153
+ | **🐧 Linux (Fedora / RHEL)** | Download `pythinker-code-0.15.0.x86_64.rpm`, then `sudo dnf install ./pythinker-code-0.15.0.x86_64.rpm` | [Releases](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest) |
154
+ | **🐧 Linux (openSUSE)** | Download `pythinker-code-0.15.0.x86_64.rpm`, then `sudo zypper install ./pythinker-code-0.15.0.x86_64.rpm` | [Releases](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest) |
155
+ | **🌐 macOS / Linux — curl-bash** | `curl -fsSL https://pythinker.com/install.sh \| bash` | tarball |
156
+ | **🐍 Python fallback** (universal) | `pip install pythinker-code` | PyPI |
156
157
 
157
- > **Updates** Once installed, `pythinker update` checks the GitHub Releases
158
- > API, verifies the new artifact's SHA-256, and re-runs the installer for you.
159
- > Set `PYTHINKER_CLI_NO_AUTO_UPDATE=1` to disable the startup update check.
158
+ Every artifact ships with a matching `.sha256` file verify before install on
159
+ any platform with `sha256sum`, `shasum -a 256`, or `Get-FileHash`.
160
160
 
161
- > **Verifying downloads** Every artifact ships with a matching `.sha256`
162
- > file. Verify before installing with `sha256sum`, `shasum -a 256`, or
163
- > PowerShell's `Get-FileHash` (see platform sections below).
161
+ After install, on any OS:
164
162
 
165
- ### 🪟 Windows native installer — details
163
+ ```sh
164
+ pythinker --version # confirm install
165
+ pythinker login # (optional) authenticate a hosted provider
166
+ pythinker # start the interactive TUI
167
+ ```
168
+
169
+ > **In-app updates** — `pythinker update` queries the GitHub Releases API and
170
+ > re-runs the right installer for your build with SHA-256 verification. Set
171
+ > `PYTHINKER_CLI_NO_AUTO_UPDATE=1` to disable the proactive startup check.
172
+
173
+ ---
166
174
 
167
- `PythinkerSetup-x.y.z.exe` installs per-user to `%LOCALAPPDATA%\Programs\Pythinker`
168
- and adds `pythinker` to your user PATH (`HKCU\Environment`). No UAC prompt.
175
+ ### 🪟 Windows native installer
176
+
177
+ `PythinkerSetup-0.15.0.exe` is a signed* Inno Setup wizard. Installs per-user
178
+ into `%LOCALAPPDATA%\Programs\Pythinker`, registers `pythinker` on your user
179
+ PATH (`HKCU\Environment`), broadcasts `WM_SETTINGCHANGE` so new shells see
180
+ the change. **No UAC prompt.**
169
181
 
170
182
  ```powershell
171
- # 1. Verify the download
172
- Get-FileHash .\PythinkerSetup-x.y.z.exe -Algorithm SHA256
173
- Get-Content .\PythinkerSetup-x.y.z.exe.sha256
183
+ # One-line install (downloads the native .exe, verifies SHA-256, runs per-user)
184
+ irm https://pythinker.com/install.ps1 | iex
174
185
 
175
- # 2. Run the installer (double-click also works)
176
- .\PythinkerSetup-x.y.z.exe
186
+ # Or manually download the installer + checksum from the Releases page,
187
+ # verify with Get-FileHash, then run:
188
+ .\PythinkerSetup-0.15.0.exe
177
189
 
178
- # 3. Open a fresh PowerShell
190
+ # Open a fresh PowerShell
179
191
  pythinker --version
180
192
  ```
181
193
 
182
- **Per-machine install** (IT-managed boxes): `.\PythinkerSetup-x.y.z.exe /ALLUSERS`
183
- installs to `%ProgramFiles%\Pythinker` and writes to HKLM.
194
+ **Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.15.0.exe /ALLUSERS`
195
+ installs to `%ProgramFiles%\Pythinker` and writes PATH to HKLM (requires admin).
196
+
197
+ **Upgrade:** `pythinker update` from inside the running app — it downloads
198
+ the newest installer, verifies SHA-256, and re-runs it silently
199
+ (`/VERYSILENT /SUPPRESSMSGBOXES /NORESTART`).
184
200
 
185
- **Uninstall:** Apps & Features → *Pythinker Code* → Uninstall reverts both the
186
- files and the PATH edit.
201
+ **Uninstall:** Apps & Features → *Pythinker Code* → Uninstall reverts both
202
+ the files and the PATH edit.
187
203
 
188
- > 🛡 **First-launch SmartScreen warning** — until the Authenticode cert is in
189
- > CI, the installer ships unsigned and SmartScreen shows *"Windows protected
190
- > your PC."* Click **More info → Run anyway**. Use the published SHA-256 as
191
- > your integrity check.
204
+ > 🛡 **First-launch SmartScreen warning** — \*until the Authenticode cert is
205
+ > provisioned in CI, the installer ships unsigned and Windows shows
206
+ > *"Windows protected your PC."* Click **More info → Run anyway**. Use the
207
+ > published `.sha256` as your integrity check until signing comes online.
192
208
 
193
- ### 🍎 macOS — Homebrew
209
+ ---
210
+
211
+ ### 🍎 macOS — Homebrew tap
194
212
 
195
213
  ```sh
214
+ # 1. Install
196
215
  brew install mohamed-elkholy95/pythinker/pythinker-code
197
- brew upgrade pythinker-code # manual updates; brew packages don't auto-update
216
+
217
+ # 2. Verify
218
+ pythinker --version
219
+ which pythinker # -> /opt/homebrew/bin/pythinker (Apple Silicon)
220
+ # or /usr/local/bin/pythinker (Intel)
198
221
  ```
199
222
 
200
- Drops `pythinker` at `$(brew --prefix)/bin/pythinker`. Works on Apple Silicon
201
- and Intel; brew picks the right Python build for you.
223
+ Works on **Apple Silicon and Intel** — brew picks the right Python build for
224
+ you. The tap auto-publishes a fresh formula on every Pythinker release, so
225
+ `brew upgrade pythinker-code` always finds the latest version.
226
+
227
+ **Upgrade:** `brew upgrade pythinker-code` (Homebrew packages don't
228
+ auto-update; run this whenever you want the latest).
229
+
230
+ **Uninstall:** `brew uninstall pythinker-code && brew untap mohamed-elkholy95/pythinker`.
231
+
232
+ > The tap repo is [mohamed-elkholy95/homebrew-pythinker](https://github.com/mohamed-elkholy95/homebrew-pythinker)
233
+ > — auto-maintained, do not hand-edit.
234
+
235
+ ---
202
236
 
203
237
  ### 🐧 Linux — system packages
204
238
 
205
- Native packages are attached to every GitHub Release. Both `.deb` and `.rpm`
206
- are built for `x86_64` and `aarch64`:
239
+ Native `.deb` and `.rpm` packages for both `x86_64` and `aarch64` are
240
+ attached to every GitHub Release.
241
+
242
+ ```sh
243
+ # Debian / Ubuntu (x86_64)
244
+ sudo dpkg -i pythinker-code_0.15.0_amd64.deb
245
+ sudo apt-get install -f # only if dpkg reports missing deps
246
+
247
+ # Debian / Ubuntu (ARM64)
248
+ sudo dpkg -i pythinker-code_0.15.0_arm64.deb
249
+
250
+ # Fedora / RHEL / openSUSE (x86_64)
251
+ curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.15.0/pythinker-code-0.15.0.x86_64.rpm
252
+ curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.15.0/pythinker-code-0.15.0.x86_64.rpm.sha256
253
+ sha256sum -c pythinker-code-0.15.0.x86_64.rpm.sha256
254
+ # Fedora / RHEL:
255
+ sudo dnf install ./pythinker-code-0.15.0.x86_64.rpm
256
+ # openSUSE:
257
+ sudo zypper install ./pythinker-code-0.15.0.x86_64.rpm
258
+
259
+ # Fedora / RHEL (aarch64)
260
+ curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.15.0/pythinker-code-0.15.0.aarch64.rpm
261
+ curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.15.0/pythinker-code-0.15.0.aarch64.rpm.sha256
262
+ sha256sum -c pythinker-code-0.15.0.aarch64.rpm.sha256
263
+ sudo dnf install ./pythinker-code-0.15.0.aarch64.rpm
264
+ ```
265
+
266
+ Both packages drop a small `/usr/bin/pythinker` launcher that execs the real
267
+ binary under `/usr/lib/pythinker/`, so your `$PATH` stays tidy.
268
+
269
+ **Verify before install:**
207
270
 
208
271
  ```sh
209
- # Debian / Ubuntu
210
- sudo dpkg -i pythinker-code_x.y.z_amd64.deb
211
- # If apt complains about missing deps:
212
- sudo apt-get install -f
272
+ sha256sum -c pythinker-code_0.15.0_amd64.deb.sha256 # Debian/Ubuntu
273
+ sha256sum -c pythinker-code-0.15.0.x86_64.rpm.sha256 # Fedora/RHEL
274
+ ```
275
+
276
+ **Upgrade:** download the new `.deb`/`.rpm` from Releases and `dpkg -i` /
277
+ `dnf install` over it. Or run `pythinker update` from inside the running
278
+ app — it'll fetch the matching new package and prompt for sudo to install.
279
+
280
+ **Uninstall:**
213
281
 
214
- # Fedora / RHEL / openSUSE
215
- sudo rpm -i pythinker-code-x.y.z.x86_64.rpm
216
- # or:
217
- sudo dnf install ./pythinker-code-x.y.z.x86_64.rpm
282
+ ```sh
283
+ sudo dpkg -r pythinker-code # Debian/Ubuntu
284
+ sudo rpm -e pythinker-code # Fedora/RHEL
218
285
  ```
219
286
 
220
- Both packages drop `/usr/bin/pythinker` (a small launcher that execs the real
221
- binary under `/usr/lib/pythinker/`).
287
+ ---
222
288
 
223
289
  ### 🌐 macOS / Linux — curl-bash native installer
224
290
 
225
- For machines without a package manager (containers, fresh VMs), the
226
- [install-native.sh](./scripts/install-native.sh) helper downloads the right
227
- tarball for your OS + arch, verifies SHA-256, and installs to `~/.local/`.
291
+ For containers, fresh VMs, or any host without a system package manager.
292
+ The canonical `https://pythinker.com/install.sh` endpoint is backed by
293
+ [`scripts/install-native.sh`](./scripts/install-native.sh). It serves shell
294
+ script content directly, detects your OS + arch, downloads the matching
295
+ PyInstaller-frozen tarball, verifies its SHA-256, and lands the single binary
296
+ at `~/.local/bin/pythinker`.
228
297
 
229
298
  ```sh
230
- curl -fsSL https://raw.githubusercontent.com/mohamed-elkholy95/Pythinker-Code/main/scripts/install-native.sh | bash
299
+ # Latest release
300
+ curl -fsSL https://pythinker.com/install.sh | bash
231
301
 
232
- # Pin a specific version:
233
- curl -fsSL ...install-native.sh | bash -s -- --version 0.13.0
302
+ # Pin a specific version
303
+ curl -fsSL https://pythinker.com/install.sh | bash -s -- --version 0.15.0
304
+
305
+ # Custom prefix (defaults to $HOME/.local)
306
+ curl -fsSL https://pythinker.com/install.sh | bash -s -- --prefix /opt/pythinker
234
307
  ```
235
308
 
236
- The script lands the binary at `~/.local/share/pythinker/` and symlinks
237
- `~/.local/bin/pythinker`. It prints PATH guidance if `~/.local/bin` isn't on
238
- your `$PATH`.
309
+ Host `/install.sh` with:
310
+
311
+ ```http
312
+ Content-Type: text/x-shellscript; charset=utf-8
313
+ Cache-Control: public, max-age=300, s-maxage=900, stale-if-error=86400
314
+ ```
315
+
316
+ Use long immutable caching only for versioned release artifact URLs, for
317
+ example `Cache-Control: public, max-age=31536000, immutable` on fixed-tag
318
+ assets.
319
+
320
+ Supported targets:
321
+
322
+ | `uname -s / -m` | Tarball asset |
323
+ |---|---|
324
+ | Linux / x86_64 | `pythinker-0.15.0-x86_64-unknown-linux-gnu.tar.gz` |
325
+ | Linux / aarch64 | `pythinker-0.15.0-aarch64-unknown-linux-gnu.tar.gz` |
326
+ | Darwin / arm64 | `pythinker-0.15.0-aarch64-apple-darwin.tar.gz` |
327
+
328
+ The script prints PATH guidance if `~/.local/bin` isn't already on your
329
+ `$PATH`. Intel macOS users — use Homebrew or `pip install pythinker-code`;
330
+ no PyInstaller-built Intel Darwin binary is published.
331
+
332
+ **Uninstall:** `rm ~/.local/bin/pythinker`.
239
333
 
240
334
  ### 🛠 Power-user / legacy install paths
241
335
 
@@ -248,13 +342,10 @@ your `$PATH`.
248
342
  <summary>Legacy shell-script wrappers + uv / pipx</summary>
249
343
 
250
344
  ```sh
251
- # Legacy: uv-based shell-script wrappers (prints a deprecation banner on run)
252
- curl -fsSL https://raw.githubusercontent.com/mohamed-elkholy95/Pythinker-Code/main/scripts/install.sh | bash
253
- # Windows PowerShell wrapper:
254
- $installer = Join-Path $env:TEMP "pythinker-install.ps1"
255
- iwr -UseBasicParsing https://raw.githubusercontent.com/mohamed-elkholy95/Pythinker-Code/main/scripts/install.ps1 -OutFile $installer
256
- & $installer
257
- Remove-Item $installer
345
+ # Compatibility shim to the native installer
346
+ scripts/install.sh
347
+ # Windows PowerShell native installer bootstrap:
348
+ powershell -c "irm https://pythinker.com/install.ps1 | iex"
258
349
 
259
350
  # Legacy: one-off run via uvx
260
351
  uvx pythinker-code