overcode 0.5.7__tar.gz → 0.5.8__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 (257) hide show
  1. {overcode-0.5.7/src/overcode.egg-info → overcode-0.5.8}/PKG-INFO +3 -1
  2. {overcode-0.5.7 → overcode-0.5.8}/README.md +2 -0
  3. {overcode-0.5.7 → overcode-0.5.8}/docs/README.md +1 -0
  4. {overcode-0.5.7 → overcode-0.5.8}/docs/cli-reference.md +120 -0
  5. {overcode-0.5.7 → overcode-0.5.8}/docs/configuration.md +60 -5
  6. {overcode-0.5.7 → overcode-0.5.8}/docs/design/README.md +7 -0
  7. overcode-0.5.8/docs/design/background-shell-classification.md +103 -0
  8. {overcode-0.5.7 → overcode-0.5.8}/docs/design/opencode-stats-reader-performance.md +44 -1
  9. {overcode-0.5.7 → overcode-0.5.8}/docs/design/scaling-audit-2026-09-22.md +14 -0
  10. overcode-0.5.8/docs/release-notes-0.5.8.md +8 -0
  11. overcode-0.5.8/docs/skill-profiles.md +117 -0
  12. {overcode-0.5.7 → overcode-0.5.8}/docs/tui-guide.md +5 -0
  13. {overcode-0.5.7 → overcode-0.5.8}/pyproject.toml +3 -1
  14. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/backends/base.py +6 -0
  15. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/backends/claude_code.py +7 -0
  16. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/backends/opencode.py +21 -4
  17. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/backends/opencode2_stats.py +36 -12
  18. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/backends/opencode_stats.py +126 -12
  19. overcode-0.5.8/src/overcode/bundled_skills.py +155 -0
  20. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/cli/__init__.py +3 -0
  21. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/cli/_shared.py +1 -1
  22. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/cli/activity.py +4 -6
  23. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/cli/agent.py +46 -2
  24. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/cli/config.py +0 -1
  25. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/cli/doctor.py +11 -0
  26. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/cli/jobs.py +3 -0
  27. overcode-0.5.8/src/overcode/cli/keys.py +178 -0
  28. overcode-0.5.8/src/overcode/cli/lifecycle.py +168 -0
  29. overcode-0.5.8/src/overcode/cli/skill_profiles.py +299 -0
  30. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/cli/view.py +4 -4
  31. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/command_palette.py +47 -4
  32. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/config.py +1 -0
  33. overcode-0.5.8/src/overcode/data/keymaps/default.yaml +10 -0
  34. overcode-0.5.8/src/overcode/data/keymaps/vscode.yaml +83 -0
  35. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/history_reader.py +16 -1
  36. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/hook_handler.py +97 -1
  37. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/hook_status_detector.py +142 -1
  38. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/journey.py +116 -17
  39. overcode-0.5.8/src/overcode/keymap.py +672 -0
  40. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/launcher.py +99 -2
  41. overcode-0.5.8/src/overcode/lifecycle.py +494 -0
  42. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/monitor_daemon.py +41 -14
  43. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/monitor_daemon_state.py +1 -0
  44. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/overagent.py +19 -2
  45. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/session_manager.py +14 -5
  46. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/settings.py +5 -1
  47. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/sister_poller.py +1 -0
  48. overcode-0.5.8/src/overcode/skill_library.py +593 -0
  49. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/ssh_provisioner.py +11 -5
  50. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/stats_reader.py +64 -0
  51. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/status_constants.py +29 -2
  52. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/status_patterns.py +24 -3
  53. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/summary_columns.py +147 -6
  54. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tmux_manager.py +20 -0
  55. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tmux_utils.py +6 -1
  56. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/transcript_index.py +9 -0
  57. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui.py +189 -13
  58. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_actions/input.py +10 -4
  59. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_actions/mentor.py +3 -2
  60. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_actions/overagent.py +3 -2
  61. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_actions/session.py +74 -0
  62. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_actions/view.py +28 -0
  63. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_actions/view_control.py +2 -1
  64. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_logic.py +46 -0
  65. overcode-0.5.8/src/overcode/tui_theme.py +260 -0
  66. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_widgets/__init__.py +2 -0
  67. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_widgets/command_bar.py +32 -6
  68. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_widgets/command_palette.py +42 -15
  69. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_widgets/daemon_status_bar.py +11 -2
  70. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_widgets/fullscreen_preview.py +4 -0
  71. overcode-0.5.8/src/overcode/tui_widgets/help_overlay.py +450 -0
  72. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_widgets/new_agent_defaults_modal.py +21 -3
  73. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_widgets/new_agent_modal.py +27 -1
  74. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_widgets/session_summary.py +39 -2
  75. overcode-0.5.8/src/overcode/tui_widgets/skills_modal.py +318 -0
  76. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_widgets/summary_prompt_lab.py +20 -8
  77. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/web_api.py +1 -0
  78. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/web_control_api.py +48 -0
  79. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/web_server.py +6 -0
  80. {overcode-0.5.7 → overcode-0.5.8/src/overcode.egg-info}/PKG-INFO +3 -1
  81. {overcode-0.5.7 → overcode-0.5.8}/src/overcode.egg-info/SOURCES.txt +13 -0
  82. overcode-0.5.7/src/overcode/bundled_skills.py +0 -287
  83. overcode-0.5.7/src/overcode/tui_widgets/help_overlay.py +0 -243
  84. {overcode-0.5.7 → overcode-0.5.8}/LICENSE +0 -0
  85. {overcode-0.5.7 → overcode-0.5.8}/MANIFEST.in +0 -0
  86. {overcode-0.5.7 → overcode-0.5.8}/docs/advanced-features.md +0 -0
  87. {overcode-0.5.7 → overcode-0.5.8}/docs/architecture.md +0 -0
  88. {overcode-0.5.7 → overcode-0.5.8}/docs/backends.md +0 -0
  89. {overcode-0.5.7 → overcode-0.5.8}/docs/claude-session-files.md +0 -0
  90. {overcode-0.5.7 → overcode-0.5.8}/docs/design/483-484/00_overview.md +0 -0
  91. {overcode-0.5.7 → overcode-0.5.8}/docs/design/483-484/01_usage_log.md +0 -0
  92. {overcode-0.5.7 → overcode-0.5.8}/docs/design/483-484/02_learning_journey.md +0 -0
  93. {overcode-0.5.7 → overcode-0.5.8}/docs/design/483-484/03_overagent.md +0 -0
  94. {overcode-0.5.7 → overcode-0.5.8}/docs/design/483-484/04_phasing_and_questions.md +0 -0
  95. {overcode-0.5.7 → overcode-0.5.8}/docs/design/acp-agent-integration-analysis.md +0 -0
  96. {overcode-0.5.7 → overcode-0.5.8}/docs/design/agent-agnostic-backends-opencode.md +0 -0
  97. {overcode-0.5.7 → overcode-0.5.8}/docs/design/agent-backend-hermes.md +0 -0
  98. {overcode-0.5.7 → overcode-0.5.8}/docs/design/agent-backends-codex-grok.md +0 -0
  99. {overcode-0.5.7 → overcode-0.5.8}/docs/design/bakeoffs/README.md +0 -0
  100. {overcode-0.5.7 → overcode-0.5.8}/docs/design/bakeoffs/SYNTHESIS.md +0 -0
  101. {overcode-0.5.7 → overcode-0.5.8}/docs/design/bakeoffs/candidates.md +0 -0
  102. {overcode-0.5.7 → overcode-0.5.8}/docs/design/bakeoffs/overcode-vs-bernstein.md +0 -0
  103. {overcode-0.5.7 → overcode-0.5.8}/docs/design/bakeoffs/overcode-vs-bobbit.md +0 -0
  104. {overcode-0.5.7 → overcode-0.5.8}/docs/design/bakeoffs/overcode-vs-ccmanager.md +0 -0
  105. {overcode-0.5.7 → overcode-0.5.8}/docs/design/bakeoffs/overcode-vs-claude-squad.md +0 -0
  106. {overcode-0.5.7 → overcode-0.5.8}/docs/design/bakeoffs/overcode-vs-cmux.md +0 -0
  107. {overcode-0.5.7 → overcode-0.5.8}/docs/design/bakeoffs/overcode-vs-composio.md +0 -0
  108. {overcode-0.5.7 → overcode-0.5.8}/docs/design/bakeoffs/overcode-vs-dmux.md +0 -0
  109. {overcode-0.5.7 → overcode-0.5.8}/docs/design/bakeoffs/overcode-vs-gastown.md +0 -0
  110. {overcode-0.5.7 → overcode-0.5.8}/docs/design/bakeoffs/overcode-vs-kagan.md +0 -0
  111. {overcode-0.5.7 → overcode-0.5.8}/docs/design/bakeoffs/overcode-vs-orca.md +0 -0
  112. {overcode-0.5.7 → overcode-0.5.8}/docs/design/bakeoffs/overcode-vs-superset.md +0 -0
  113. {overcode-0.5.7 → overcode-0.5.8}/docs/design/bakeoffs/overcode-vs-vibe-kanban.md +0 -0
  114. {overcode-0.5.7 → overcode-0.5.8}/docs/design/bakeoffs/zellij-vs-tmux.md +0 -0
  115. {overcode-0.5.7 → overcode-0.5.8}/docs/design/e2e-devcontainer-testing.md +0 -0
  116. {overcode-0.5.7 → overcode-0.5.8}/docs/design/model-alias-resolution.md +0 -0
  117. {overcode-0.5.7 → overcode-0.5.8}/docs/getting-started.md +0 -0
  118. {overcode-0.5.7 → overcode-0.5.8}/docs/release-notes-0.3.0.md +0 -0
  119. {overcode-0.5.7 → overcode-0.5.8}/docs/release-notes-0.4.2.md +0 -0
  120. {overcode-0.5.7 → overcode-0.5.8}/docs/release-notes-0.5.1.md +0 -0
  121. {overcode-0.5.7 → overcode-0.5.8}/docs/release-notes-0.5.2.md +0 -0
  122. {overcode-0.5.7 → overcode-0.5.8}/docs/release-notes-0.5.3.md +0 -0
  123. {overcode-0.5.7 → overcode-0.5.8}/docs/release-notes-0.5.4.md +0 -0
  124. {overcode-0.5.7 → overcode-0.5.8}/docs/release-notes-0.5.5.md +0 -0
  125. {overcode-0.5.7 → overcode-0.5.8}/docs/release-notes-0.5.6.md +0 -0
  126. {overcode-0.5.7 → overcode-0.5.8}/docs/release-notes-0.5.7.md +0 -0
  127. {overcode-0.5.7 → overcode-0.5.8}/docs/tui-refactoring-plan.md +0 -0
  128. {overcode-0.5.7 → overcode-0.5.8}/docs/ux-performance-analysis-2026-03-09.md +0 -0
  129. {overcode-0.5.7 → overcode-0.5.8}/docs/wrappers.md +0 -0
  130. {overcode-0.5.7 → overcode-0.5.8}/setup.cfg +0 -0
  131. {overcode-0.5.7 → overcode-0.5.8}/setup.py +0 -0
  132. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/__init__.py +0 -0
  133. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/activity_log.py +0 -0
  134. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/agent_scanner.py +0 -0
  135. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/backends/__init__.py +0 -0
  136. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/backends/codex.py +0 -0
  137. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/backends/codex_stats.py +0 -0
  138. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/backends/grok.py +0 -0
  139. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/backends/grok_stats.py +0 -0
  140. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/backends/hermes.py +0 -0
  141. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/backends/hermes_stats.py +0 -0
  142. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/backends/opencode2.py +0 -0
  143. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/backends/opencode2_patterns.py +0 -0
  144. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/backends/opencode2_plugin_install.py +0 -0
  145. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/backends/overagent.py +0 -0
  146. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/backends/shell.py +0 -0
  147. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/claude_config.py +0 -0
  148. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/claude_pid.py +0 -0
  149. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/cli/__main__.py +0 -0
  150. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/cli/budget.py +0 -0
  151. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/cli/daemon.py +0 -0
  152. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/cli/focal.py +0 -0
  153. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/cli/hooks.py +0 -0
  154. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/cli/models.py +0 -0
  155. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/cli/monitoring.py +0 -0
  156. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/cli/parallelism.py +0 -0
  157. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/cli/perms.py +0 -0
  158. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/cli/sister.py +0 -0
  159. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/cli/skills.py +0 -0
  160. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/cli/split.py +0 -0
  161. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/cli/tags.py +0 -0
  162. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/cli/wrappers.py +0 -0
  163. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/daemon_claude_skill.md +0 -0
  164. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/daemon_logging.py +0 -0
  165. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/daemon_utils.py +0 -0
  166. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/data/model_metadata.json +0 -0
  167. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/data_export.py +0 -0
  168. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/dependency_check.py +0 -0
  169. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/doctor.py +0 -0
  170. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/duration.py +0 -0
  171. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/entrypoint.py +0 -0
  172. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/exceptions.py +0 -0
  173. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/follow_mode.py +0 -0
  174. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/hermes_plugin/__init__.py +0 -0
  175. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/hermes_plugin/plugin.yaml +0 -0
  176. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/implementations.py +0 -0
  177. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/interfaces.py +0 -0
  178. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/job_launcher.py +0 -0
  179. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/job_manager.py +0 -0
  180. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/logging_config.py +0 -0
  181. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/mentor.py +0 -0
  182. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/mocks.py +0 -0
  183. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/model_metadata.py +0 -0
  184. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/monitor_daemon_core.py +0 -0
  185. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/notifier.py +0 -0
  186. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/opencode_plugin/overcode-telemetry-v2/index.js +0 -0
  187. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/opencode_plugin/overcode-telemetry-v2/overcode-telemetry-core.mjs +0 -0
  188. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/opencode_plugin/overcode-telemetry-v2/tui.js +0 -0
  189. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/opencode_plugin/overcode-telemetry.js +0 -0
  190. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/pane_capture_gate.py +0 -0
  191. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/pid_utils.py +0 -0
  192. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/presence_logger.py +0 -0
  193. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/pricing.py +0 -0
  194. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/process_resources.py +0 -0
  195. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/prompt_lab.py +0 -0
  196. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/protocols.py +0 -0
  197. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/sandbox_detect.py +0 -0
  198. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/sister_controller.py +0 -0
  199. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/spawn.py +0 -0
  200. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/standing_instructions.py +0 -0
  201. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/stat_gate.py +0 -0
  202. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/status_detector.py +0 -0
  203. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/status_detector_factory.py +0 -0
  204. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/status_history.py +0 -0
  205. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/summarizer_client.py +0 -0
  206. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/summarizer_component.py +0 -0
  207. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/summarizer_prompts.py +0 -0
  208. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/summary_groups.py +0 -0
  209. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/supervisor_daemon.py +0 -0
  210. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/supervisor_daemon_core.py +0 -0
  211. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/supervisor_layout.sh +0 -0
  212. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/testing/__init__.py +0 -0
  213. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/testing/renderer.py +0 -0
  214. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/testing/tmux_driver.py +0 -0
  215. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/testing/tui_eye.py +0 -0
  216. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/testing/tui_eye_skill.md +0 -0
  217. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/time_context.py +0 -0
  218. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui.tcss +0 -0
  219. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_actions/__init__.py +0 -0
  220. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_actions/activity.py +0 -0
  221. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_actions/daemon.py +0 -0
  222. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_actions/navigation.py +0 -0
  223. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_helpers.py +0 -0
  224. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_render.py +0 -0
  225. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_widgets/agent_select_modal.py +0 -0
  226. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_widgets/column_header.py +0 -0
  227. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_widgets/daemon_panel.py +0 -0
  228. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_widgets/dialog_style.py +0 -0
  229. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_widgets/instruction_history_modal.py +0 -0
  230. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_widgets/job_summary.py +0 -0
  231. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_widgets/journey_panel.py +0 -0
  232. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_widgets/jump_modal.py +0 -0
  233. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_widgets/modal_base.py +0 -0
  234. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_widgets/passthru_config_modal.py +0 -0
  235. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_widgets/preview_pane.py +0 -0
  236. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_widgets/rename_agent_modal.py +0 -0
  237. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_widgets/sister_selection_modal.py +0 -0
  238. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_widgets/status_timeline.py +0 -0
  239. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_widgets/summary_config_modal.py +0 -0
  240. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_widgets/tmux_config_modal.py +0 -0
  241. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/tui_widgets/tui_log_panel.py +0 -0
  242. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/usage_analytics.py +0 -0
  243. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/usage_monitor.py +0 -0
  244. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/view_control.py +0 -0
  245. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/web/__init__.py +0 -0
  246. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/web/templates/analytics.html +0 -0
  247. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/web/templates/dashboard.html +0 -0
  248. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/web_chartjs.py +0 -0
  249. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/web_server_runner.py +0 -0
  250. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/web_templates.py +0 -0
  251. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/worker_guard.py +0 -0
  252. {overcode-0.5.7 → overcode-0.5.8}/src/overcode/wrapper.py +0 -0
  253. {overcode-0.5.7 → overcode-0.5.8}/src/overcode.egg-info/dependency_links.txt +0 -0
  254. {overcode-0.5.7 → overcode-0.5.8}/src/overcode.egg-info/entry_points.txt +0 -0
  255. {overcode-0.5.7 → overcode-0.5.8}/src/overcode.egg-info/requires.txt +0 -0
  256. {overcode-0.5.7 → overcode-0.5.8}/src/overcode.egg-info/top_level.txt +0 -0
  257. {overcode-0.5.7 → overcode-0.5.8}/tests/test_e2e_multi_agent_jokes.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: overcode
3
- Version: 0.5.7
3
+ Version: 0.5.8
4
4
  Summary: A supervisor for managing multiple Claude Code instances in tmux
5
5
  Author: Mike Bond
6
6
  Project-URL: Homepage, https://github.com/mkb23/overcode
@@ -111,6 +111,7 @@ The TUI displays all agents with live status updates, showing:
111
111
  - **Agent hierarchy** - parent/child delegation with follow mode and reporting
112
112
  - **Cost budgets** - per-agent spending limits with automatic enforcement
113
113
  - **Sleep mode** - pause agents and exclude them from stats
114
+ - **Shutdown and revive**: `overcode shutdown` stops agents, jobs, daemons and tmux sessions and keeps the agent records. After a reboot, `overcode revive --all` brings the agents back with their conversations.
114
115
 
115
116
  ### Supervisor Daemon
116
117
  An optional Claude-powered orchestrator that:
@@ -168,6 +169,7 @@ Aggregate agents from multiple machines into one dashboard:
168
169
  | `q` | Quit (or detach in tmux split) |
169
170
 
170
171
  See the [TUI Guide](docs/tui-guide.md) for all keyboard shortcuts.
172
+ Every key can be remapped, and a `vscode` preset avoids the keys VSCode's terminal swallows: `overcode keys --use vscode` (see [Configuration → Keybindings](docs/configuration.md#keybindings)).
171
173
 
172
174
  ## Documentation
173
175
 
@@ -69,6 +69,7 @@ The TUI displays all agents with live status updates, showing:
69
69
  - **Agent hierarchy** - parent/child delegation with follow mode and reporting
70
70
  - **Cost budgets** - per-agent spending limits with automatic enforcement
71
71
  - **Sleep mode** - pause agents and exclude them from stats
72
+ - **Shutdown and revive**: `overcode shutdown` stops agents, jobs, daemons and tmux sessions and keeps the agent records. After a reboot, `overcode revive --all` brings the agents back with their conversations.
72
73
 
73
74
  ### Supervisor Daemon
74
75
  An optional Claude-powered orchestrator that:
@@ -126,6 +127,7 @@ Aggregate agents from multiple machines into one dashboard:
126
127
  | `q` | Quit (or detach in tmux split) |
127
128
 
128
129
  See the [TUI Guide](docs/tui-guide.md) for all keyboard shortcuts.
130
+ Every key can be remapped, and a `vscode` preset avoids the keys VSCode's terminal swallows: `overcode keys --use vscode` (see [Configuration → Keybindings](docs/configuration.md#keybindings)).
129
131
 
130
132
  ## Documentation
131
133
 
@@ -11,6 +11,7 @@ Welcome to the overcode documentation. Overcode is a TUI supervisor for managing
11
11
  | [CLI Reference](cli-reference.md) | Complete reference for all commands and options |
12
12
  | [Configuration](configuration.md) | Config file, environment variables, and presets |
13
13
  | [Advanced Features](advanced-features.md) | Sleep mode, remote monitoring, and more |
14
+ | [Skill Profiles](skill-profiles.md) | Named sets of skills switched on per agent, instead of always on |
14
15
  | [Agent Backends](backends.md) | Running opencode/Codex/Grok agents; support matrix and flag mapping |
15
16
  | [Claude Session Files](claude-session-files.md) | How token counting and cost estimation works internally |
16
17
 
@@ -20,6 +20,7 @@ overcode launch --name <name> [options]
20
20
  | `--skip-permissions` | | Auto-deny permission prompts |
21
21
  | `--bypass-permissions` | | Bypass all permission checks (dangerous) |
22
22
  | `--parent` | | Name of parent agent (auto-detected if launched from within an agent) |
23
+ | `--no-parent` | | Launch top-level instead of as the calling agent's child. Only the overagent may use it from inside an agent, for agents you will drive yourself (a guard against accidents, not a sandbox) |
23
24
  | `--follow` | `-f` | Stream child output, block until report or timeout |
24
25
  | `--on-stuck` | | Policy when child stops without reporting: `wait` (default), `fail`, `timeout:DURATION` |
25
26
  | `--oversight-timeout` | | Shorthand for `--on-stuck timeout:DURATION` (e.g., `5m`, `1h`, `30s`) |
@@ -29,6 +30,7 @@ overcode launch --name <name> [options]
29
30
  | `--budget` | `-b` | Cost budget in USD (deducted from parent if parent has budget) |
30
31
  | `--wrapper` | `-w` | Wrapper script: path or name from `~/.overcode/wrappers/` (e.g., `devcontainer`) |
31
32
  | `--no-inherit` | | Don't inherit settings from the parent agent (see below) |
33
+ | `--skills` | | Skill profile to switch on; `none` for none. Default: the parent's, then the folder's pinned profile. See [Skill Profiles](skill-profiles.md) |
32
34
  | `--session` | | Tmux session name (default: `agents`) |
33
35
 
34
36
  **Parent settings inheritance (#433):** when launched from within an agent (or with `--parent`), the child inherits the parent's `provider`, `model`, `wrapper`, agent-teams setting, and permission mode for any of those not given explicitly. Resolution order is: explicit flag > parent setting > `new_agent_defaults` in `~/.overcode/config.yaml` > built-in default. So a parent pinned to Bedrock spawns Bedrock children unless told otherwise. Use `--no-inherit` to skip the parent and resolve from config defaults only.
@@ -107,6 +109,85 @@ overcode kill <agent-name> [--no-cascade] [--session <session>]
107
109
 
108
110
  By default, killing a parent also kills all its descendants (deepest-first).
109
111
 
112
+ ### `overcode restart`
113
+
114
+ Restart an agent with the same launch configuration, resuming its conversation.
115
+
116
+ ```bash
117
+ overcode restart <agent-name> [--fresh] [--model <model>] [--session <session>]
118
+ ```
119
+
120
+ | Option | Description |
121
+ |--------|-------------|
122
+ | `--fresh` | Start a new conversation instead of resuming |
123
+ | `--model`, `-m` | Relaunch on this model (kept for later restarts) |
124
+
125
+ If the agent's tmux window is gone (it was killed, or the machine rebooted),
126
+ `restart` revives it in a new window instead.
127
+
128
+ ### `overcode revive`
129
+
130
+ Bring back agents whose tmux window is gone, for example after a reboot.
131
+
132
+ ```bash
133
+ overcode revive <agent-name> [--fresh] [--dry-run]
134
+ overcode revive --all [--all-sessions] [--fresh] [--dry-run]
135
+ ```
136
+
137
+ | Option | Description |
138
+ |--------|-------------|
139
+ | `--all`, `-a` | Revive every dead agent, parents before children |
140
+ | `--all-sessions` | With `--all`: every overcode tmux session, not just this one |
141
+ | `--fresh` | Start new conversations instead of resuming |
142
+ | `--dry-run`, `-n` | List what would be revived, change nothing |
143
+
144
+ Each agent is relaunched in a new window with its full launch context. It
145
+ resumes its previous conversation when one is recorded and its backend can
146
+ resume. Otherwise it starts fresh, and the output gives the reason. Done
147
+ children and children that filed a report are skipped. The monitor daemon is
148
+ started if it isn't running. In the TUI, the command palette has the same
149
+ action: **Revive all dead agents**.
150
+
151
+ ### `overcode shutdown`
152
+
153
+ Stop everything overcode is running.
154
+
155
+ ```bash
156
+ overcode shutdown [--dry-run] [--yes] [--force] [--keep-jobs] [--all] [--timeout <s>]
157
+ ```
158
+
159
+ | Option | Description |
160
+ |--------|-------------|
161
+ | `--dry-run`, `-n` | List what would be stopped, change nothing |
162
+ | `--yes`, `-y` | Skip the confirmation (the plan is printed first otherwise) |
163
+ | `--force` | Kill agent windows without a graceful exit |
164
+ | `--keep-jobs` | Leave the `jobs` tmux session running |
165
+ | `--all`, `--all-sessions` | Every overcode tmux session, not just this one |
166
+ | `--timeout` | Seconds to wait for agents to exit before killing their windows (default 10) |
167
+
168
+ Steps run in this order:
169
+
170
+ 1. The supervisor daemon.
171
+ 2. Agents, children first. Each gets its backend's exit keys, then its window is killed.
172
+ 3. The `jobs` tmux session.
173
+ 4. The monitor daemon, the web server, the presence logger, and any legacy PID files.
174
+ 5. overcode's tmux sessions: the agents session, `oc-view-*`, the `overcode` split layout and the supervisor controller.
175
+
176
+ Agent records are kept, so `overcode revive --all` brings the agents back
177
+ later with their conversations. The shared pieces (the split and controller
178
+ sessions, the presence logger) are left alone while another overcode tmux
179
+ session is still running.
180
+
181
+ The tmux session you run the command from is killed last. An agent that runs
182
+ `shutdown` itself is not exited, and its window closes with that session.
183
+
184
+ In the TUI, the command palette has **Shut down overcode**. Run it twice to
185
+ confirm, and the TUI exits at the end. A web server with
186
+ `web.allow_control: true` also takes `POST /api/shutdown`. Its default body
187
+ stops only the supervisor, the monitor and the web server, and agents keep
188
+ running. `{"scope": "all"}` does the full shutdown, and `"dry_run": true`
189
+ returns the plan instead.
190
+
110
191
  ### `overcode rename`
111
192
 
112
193
  Rename an agent, keeping its conversation, status history and costs.
@@ -441,6 +522,29 @@ overcode supervisor-daemon watch [--session <session>]
441
522
 
442
523
  ---
443
524
 
525
+ ## Skill Profile Commands
526
+
527
+ See [Skill Profiles](skill-profiles.md) for the whole picture.
528
+
529
+ | Command | What it does |
530
+ |---------|--------------|
531
+ | `overcode skills list` | The library, each CLI's always-on skills, profiles and pinned folders |
532
+ | `overcode skills profile set <name> <skill>...` | Create a profile or replace its skills |
533
+ | `overcode skills profile add\|remove <name> <skill>...` | Change a profile's skills |
534
+ | `overcode skills profile show <name>` | What a profile adds and hides for each CLI |
535
+ | `overcode skills profile list` / `delete <name>` | List or delete profiles |
536
+ | `overcode skills profile emoji <name> [emoji]` | The emoji the PRF column shows for a profile; no emoji goes back to the default 🎒 |
537
+ | `overcode skills pin <profile> [dir]` / `unpin [dir]` | New agents in a folder (and below) get this profile |
538
+ | `overcode skills library add\|remove <path>` | Read library skills from another folder too |
539
+ | `overcode skills adopt <skill>...` | Move always-on personal skills into the library |
540
+
541
+ ```bash
542
+ overcode skills library add ~/Code/team-skills
543
+ overcode skills profile set research shirka dataviz
544
+ overcode skills pin research ~/Code/papers
545
+ overcode launch -n reader -d ~/Code/papers # gets 'research'
546
+ ```
547
+
444
548
  ## Wrapper Commands
445
549
 
446
550
  ### `overcode wrappers list`
@@ -504,6 +608,22 @@ overcode config path
504
608
 
505
609
  ---
506
610
 
611
+ ## Key Commands
612
+
613
+ ### `overcode keys`
614
+
615
+ Show the TUI's effective keys, grouped like the command palette, with where each comes from: `default` (in code), the preset's name, or `override` (your config). See [Configuration → Keybindings](configuration.md#keybindings).
616
+
617
+ ```bash
618
+ overcode keys # every scope
619
+ overcode keys --scope command_palette
620
+ overcode keys --preset vscode # preview a preset (with your overrides)
621
+ overcode keys --conflicts # warnings only: unknown actions, duplicate keys, swallowed keys, shadowed passthru keys
622
+ overcode keys --use vscode # switch preset (writes keys.preset to config.yaml)
623
+ overcode keys --presets # list presets
624
+ overcode keys --all --json # include palette commands with no key; machine-readable
625
+ ```
626
+
507
627
  ## Activity Commands
508
628
 
509
629
  What the [usage log](configuration.md#usage-log) has recorded about how you
@@ -110,7 +110,6 @@ sisters:
110
110
  # Overrides built-in defaults shown in the "Available Skills" (ASK) column
111
111
  skill_emoji:
112
112
  overcode: 🐙 # Default: 🐙 (built-in)
113
- delegating-to-agents: 👥 # Default: 👥 (built-in)
114
113
  claude-api: 🔌 # Default: 🔌 (built-in)
115
114
  simplify: ✨ # Default: ✨ (built-in)
116
115
  shirka: 🔬 # Custom skill example
@@ -163,8 +162,11 @@ new_agent_defaults:
163
162
  provider: web # "web" (Claude.ai OAuth) or "bedrock" (AWS)
164
163
  wrapper: "" # Wrapper script name or path (e.g., "devcontainer")
165
164
  backend: claude-code # claude-code | opencode | opencode2 | codex | grok — see docs/backends.md
165
+ skill_profile: research # Skill profile when neither parent nor folder sets one — see docs/skill-profiles.md
166
166
  ```
167
167
 
168
+ Skill profiles, the skill library and folder pins live under a `skills:` key; see [Skill Profiles](skill-profiles.md).
169
+
168
170
  These apply to agents created via both the CLI (`overcode launch`) and the TUI (`n` key). CLI flags override config defaults, and for child agents the parent's settings take precedence over config defaults (#433): explicit flag > parent setting > config default > built-in default. Use `--no-inherit` to skip the parent.
169
171
 
170
172
  Setting `wrapper: devcontainer` makes all new agents launch inside a Docker container by default. See the [Wrappers Guide](wrappers.md) for details.
@@ -205,7 +207,7 @@ exact footprint and the `overcode hooks uninstall-backend` cleanup commands.
205
207
 
206
208
  By default, a handful of TUI hotkeys are forwarded straight to the focused agent's Claude Code session rather than being handled by overcode: `Enter`, `Esc`, `1`–`5` (for numbered prompts), and `Ctrl+O`.
207
209
 
208
- You can toggle these on and off from inside the TUI with `Ctrl+K`, which saves your choices to `config.yaml`. For more advanced customization — remapping a slot to send a different key, or adding fully new passthru keys — edit `~/.overcode/config.yaml` directly:
210
+ You can toggle these on and off from inside the TUI with `Ctrl+K` (`^` under the vscode [key preset](#keybindings)), which saves your choices to `config.yaml`. For more advanced customization — remapping a slot to send a different key, or adding fully new passthru keys — edit `~/.overcode/config.yaml` directly:
209
211
 
210
212
  ```yaml
211
213
  passthru_keys:
@@ -229,6 +231,60 @@ passthru_keys:
229
231
 
230
232
  Only deltas from the defaults are written — a fresh config keeps the section empty. Disabled slots show `☐` in the modal; remapped slots show their target in yellow.
231
233
 
234
+ ## Keybindings
235
+
236
+ Every TUI key can be changed under `keys:` in `~/.overcode/config.yaml` (#510):
237
+
238
+ ```yaml
239
+ keys:
240
+ preset: vscode # default | vscode
241
+ overrides: # main-screen actions
242
+ jump_to_agent: [ctrl+j, J] # action -> one key or a list
243
+ toggle_monochrome: null # unbind
244
+ reverse_sort: R # palette-only commands can be bound too
245
+ scopes: # keys inside widgets
246
+ command_palette:
247
+ cursor_down: [down, ctrl+n]
248
+ command_bar:
249
+ toggle_expand: ctrl+l
250
+ ```
251
+
252
+ - **Layers.** The default keys are the ones in code (`SupervisorTUI.BINDINGS` plus each widget's own list). A preset is a delta on top of them, and `overrides` / `scopes` are a delta on top of the preset. Each entry names an action and gives its *complete* key list, replacing what the layer below bound.
253
+ - **Action names** are the palette's: `overcode view actions` lists them, and `overcode keys` shows every scope's actions with their current keys.
254
+ - **Key names** are Textual's (`ctrl+p`, `question_mark`, `pagedown`, `J` for shift+j). Characters (`?`, `@`, `|`), caret (`^P`) and tmux (`C-p`, `M-j`) spellings are accepted too.
255
+ - **Scopes:** `app` (the main screen, which `overrides` sets), `command_bar`, `command_palette`, `fullscreen_preview`, `summary_prompt_lab`.
256
+ - **Problems are warnings, never crashes:** an unknown action or scope, a key bound twice in one scope, a key the preset avoids, a typing key bound inside a text field, or a key that shadows a [passthru key](#passthru-keys). The TUI mentions them at startup; `overcode keys --conflicts` lists them.
257
+
258
+ ```bash
259
+ overcode keys # effective keys, grouped, with source (default / preset / override)
260
+ overcode keys --preset vscode # what a preset would give you (with your overrides)
261
+ overcode keys --conflicts # only the warnings
262
+ overcode keys --use vscode # switch preset (writes keys.preset)
263
+ overcode keys --presets # list presets
264
+ ```
265
+
266
+ The palette's **Key preset** command switches preset and rebinds the running TUI immediately. The help overlay (`h`), the palette and the footer always show the keys in effect.
267
+
268
+ ### VSCode preset
269
+
270
+ VSCode's integrated terminal runs some keys as VSCode commands instead of passing them to the program (`terminal.integrated.commandsToSkipShell`). On Linux/Windows that takes `Ctrl+P` (Quick Open), `Ctrl+K` (chord prefix), `Ctrl+G` (recent directory), `Ctrl+E`, `Ctrl+J` and `Ctrl+F`; on every OS it takes `Ctrl+Space`, ``Ctrl+` ``, `Ctrl+Tab`, `Ctrl+Q` and `F1`. On macOS most workbench shortcuts use Cmd, so the Ctrl keys get through there, but they still clash with VSCode habits. The `vscode` preset moves off all of them:
271
+
272
+ | Action | Default | vscode |
273
+ |---|---|---|
274
+ | Jump to agent | `Ctrl+P` | `Space` |
275
+ | Rename agent | `Ctrl+N` | `N` |
276
+ | Send Ctrl+O to agent | `Ctrl+O` | `v` |
277
+ | Passthru keys… | `Ctrl+K` | `^` |
278
+ | Cycle focal repo | `Ctrl+R` | `@` |
279
+ | Enhanced context | `Ctrl+T` | `+` |
280
+ | Tmux toggle key… | `Ctrl+G` | `\|` |
281
+ | Command bar: multi-line | `Ctrl+E` | `Ctrl+L` |
282
+ | Palette: next / previous | `↓` `Ctrl+N` `Ctrl+J` / `↑` `Ctrl+P` `Ctrl+K` | `↓` / `↑` |
283
+
284
+ It also recommends a tmux pane toggle key other than `Ctrl+Space` (`Tab`, the default); your `tmux.toggle_key` is never changed for you. `overcode doctor` suggests the preset when it sees `TERM_PROGRAM=vscode`.
285
+
286
+ The alternative is to keep the default keys and let VSCode pass them through: add the command with a `-` prefix to `terminal.integrated.commandsToSkipShell` (e.g. `"-workbench.action.quickOpen"` for `Ctrl+P`), set `terminal.integrated.allowChords` to `false` for `Ctrl+K`, or set `terminal.integrated.sendKeybindingsToShell` to `true`.
287
+
232
288
  ## Standing Instruction Presets
233
289
 
234
290
  Presets are saved in `~/.overcode/presets.json`. View available presets:
@@ -616,8 +672,7 @@ Overcode displays emoticons for available skills in the TUI's "Available Skills"
616
672
 
617
673
  | Skill | Default Emoji | Purpose |
618
674
  |-------|:-------------:|---------|
619
- | `overcode` | 🐙 | Overcode CLI commands reference |
620
- | `delegating-to-agents` | 👥 | Parallel agent delegation |
675
+ | `overcode` | 🐙 | Running and managing agents through overcode |
621
676
  | `claude-api` | 🔌 | Claude API/SDK development |
622
677
  | `simplify` | ✨ | Code quality review |
623
678
  | `commit` | 📦 | Git commit creation |
@@ -639,7 +694,7 @@ skill_emoji:
639
694
  ```
640
695
 
641
696
  Emoticons appear in:
642
- - TUI "Available Skills" (ASK) column when viewing agents with `--full` detail
697
+ - TUI "Available Skills" (ASK) column when viewing agents with `--full` detail. Hover an agent's emoji cell (skills, PRF, tools, wrapper, status detail) to see what each emoji stands for.
643
698
  - Skill selection dialogs
644
699
  - Agent summary outputs
645
700
 
@@ -12,6 +12,13 @@ This directory contains technical design documents, architecture analysis, and i
12
12
  - **Audience:** Contributors, architects, anyone considering remote agent monitoring integration
13
13
  - **Key Finding:** ACP covers ~25-30% of overcode features; recommend hybrid model (sister protocol for control, ACP for observability)
14
14
 
15
+ ### Background Shell Classification (proposal)
16
+ - **File:** `background-shell-classification.md`
17
+ - **Status:** Proposal / Not implemented
18
+ - **Date:** October 2026
19
+ - **Summary:** Telling an agent's background shells apart: services (never finish, don't wake the agent), batch work (finishes and wakes it) and watchers (fire on a condition; stuck once their target has ended). Proposes reading live shells from the process table, a rules → runtime signals → target liveness → cached LLM classifier pipeline, and `overcode jobs wait` so watchers can't outlive their target. Issue #515; builds on #507.
20
+ - **Audience:** Contributors
21
+
15
22
  ### Model Alias Resolution (proposal)
16
23
  - **File:** `model-alias-resolution.md`
17
24
  - **Status:** Proposal / Not implemented
@@ -0,0 +1,103 @@
1
+ # Background shells: services, batch work and watchers
2
+
3
+ - **Status:** Proposal / Not implemented
4
+ - **Date:** October 2026
5
+ - **Issue:** [#515](https://github.com/mkb23/overcode/issues/515)
6
+ - **Builds on:** #507 (the status model where yellow means "idle at the prompt, but work in flight elsewhere will wake it")
7
+
8
+ ## Problem
9
+
10
+ Since #507, an agent sitting at the prompt while it has background shells running shows **yellow** with a `bg_task` badge ("background shell or task running"). The evidence is Claude Code's status bar (`· N shells ·`), because no hook fires when a background shell exits. Live-verified on Claude Code 2.1.286: a background Bash's PreToolUse and PostToolUse land about 70 ms apart, and its completion arrives later only as a fresh UserPromptSubmit.
11
+
12
+ That badge treats every background shell the same, but they mean very different things for the question yellow answers: *will this agent pick itself back up without you?*
13
+
14
+ | Kind | Examples | Finishes? | Wakes the agent? | What overcode should show |
15
+ |---|---|---|---|---|
16
+ | **Service** | dev servers, `npm start`, `vite`, `uvicorn`, `serve --forever`, `tail -f` | Never, by design | No | A neutral "server up" badge. Not work in flight: an agent whose only background shell is a service is effectively idle. |
17
+ | **Batch** | builds, test suites, benchmarks, data jobs | Yes | Yes, when it ends | Yellow, as today |
18
+ | **Watcher** | `until … \| grep -q …; do sleep N; done`, `overcode follow X`, `gh run watch N`, `sleep N && check` | When its condition comes true | Yes, when it fires | Yellow while its target is alive. **Stuck** when the target has ended and the watcher is still polling. |
19
+
20
+ ### The case that prompted this
21
+
22
+ An agent stayed yellow for about 6h40m. Its only background shell was a hand-rolled wait loop:
23
+
24
+ ```sh
25
+ until overcode jobs tail <job> -n 40 | grep -qE 'expected marker|Error|Traceback'; do sleep 3; done
26
+ ```
27
+
28
+ The job it watched had never started (see *Related bug*). The job's pane showed only a shell parse error, which matches none of those words, so the loop polled every 3 s indefinitely. The agent looked busy the whole time, and nothing pointed at the dead watcher.
29
+
30
+ ## Design
31
+
32
+ ### 1. Know which shells are alive, and what they run
33
+
34
+ The status-bar count says *how many* shells are running, never *which*. The process table says both. On macOS and Linux, each Claude Code background shell is a child of the agent CLI's process:
35
+
36
+ ```
37
+ claude --session-id … ← the agent (pid known to overcode)
38
+ └─ /bin/zsh -c source …/shell-snapshots/… && eval '<command>' …
39
+ └─ sleep 3 ← a poll loop's current iteration
40
+ ```
41
+
42
+ overcode already tracks the agent's pid for CPU and memory sampling (`process_resources.py`). Listing its children, and parsing the `eval '<command>'` back out, gives the live shells with their commands and ages. It can also be joined to the PreToolUse that launched each one (`tool_input.command`, `description`, `run_in_background`) by command text. This replaces the status-bar count as the source of truth, with the count kept as a fallback where the process walk isn't available (e.g. agents inside containers).
43
+
44
+ ### 2. Classify each shell
45
+
46
+ Cheapest signal first. Each later step runs only when the earlier ones are inconclusive.
47
+
48
+ 1. **Rules on the command and description.** Claude's `description` field is often explicit ("Start dev server", "Wait for CI").
49
+ - **Service:** `serve`, `start`, `dev`, `--watch`, `--forever`, `tail -f`, `docker compose up`, a `--port` flag with no terminating step.
50
+ - **Watcher:** `until`/`while` loops around `sleep`, `overcode follow`, `overcode jobs tail` inside a loop, `gh run watch`, `gh pr checks --watch`, `kubectl wait`.
51
+ - **Batch:** everything else.
52
+ 2. **Runtime behaviour**, from the same process walk:
53
+ - A **listening socket** under the shell (`lsof -a -p <pids> -iTCP -sTCP:LISTEN`) means service.
54
+ - A **recurring `sleep` child**, a new pid every few seconds, means a poll loop.
55
+ - **CPU time increasing** means it's doing work. Near-zero CPU for a long time, outside a poll loop, means it's waiting on something.
56
+ - **Output growing**: Claude writes each background shell's output to a task file. Growth means alive and producing.
57
+ 3. **Target liveness, for watchers.** Extract the target from the command and check it:
58
+ - `overcode follow X` / `overcode jobs tail X` → the agent or job's state
59
+ - `gh run watch N` → the run's state
60
+ - `kubectl wait …` → leave as unknown
61
+
62
+ A watcher whose target has ended (or never started) but is still polling is **stuck**. That would have flagged the case above within seconds of the job failing.
63
+ 4. **An LLM classifier for whatever is still ambiguous.** Use the summarizer path that already exists, prompted with the command, description, age and runtime signals, returning `service | batch | watcher` plus a target if it's a watcher. Cache the result per command hash, so each distinct command is classified once.
64
+
65
+ ### 3. What the person sees
66
+
67
+ - **DTL badges** split the current `bg_task`:
68
+ - ⚙️ batch (yellow, wakes the agent)
69
+ - 👀 watcher (yellow)
70
+ - 🖥 service (neutral: doesn't make the agent yellow on its own)
71
+ - ⚠️ stuck watcher
72
+ - **Colour:**
73
+ - services alone don't hold an agent yellow;
74
+ - batch and live watchers do;
75
+ - a stuck watcher shows a warning, and possibly escalates to red with "watcher stuck: target ended" (open question).
76
+ - **Hover** on DTL lists each shell: command, kind, age, CPU, and for watchers what they're watching and whether it's still alive.
77
+
78
+ ### 4. Prevention
79
+
80
+ Detection catches stuck watchers; better tools stop agents writing them.
81
+
82
+ - **Add `overcode jobs wait <job> [--until REGEX] [--timeout D]`.** It exits 0 when the pattern appears, and non-zero when the job ends or fails first, or the timeout passes. It never outlives its target. A watcher written this way can't get stuck, and its target is explicit.
83
+ - **The overcode skill** already tells agents to run servers as `overcode bash` jobs (visible in the jobs list and monitor bar) rather than Claude background shells. It should also steer agents to `jobs wait` / `follow` instead of hand-rolled loops. Then Claude's own background shells are mostly batch and watcher work, which is the easy part to classify.
84
+
85
+ ## Related bug
86
+
87
+ `job_launcher.py` builds the job's tmux command as one line:
88
+
89
+ ```python
90
+ f"echo '│ Command: {command}' && " # raw command inside single quotes
91
+ …
92
+ f"eval '{escaped_cmd}'; " # this one is escaped
93
+ ```
94
+
95
+ A job command containing a single quote (e.g. `…; echo 'done'`) breaks the quoting of the whole line. The job never runs, `overcode jobs _complete` never fires, and with unlucky contents, fragments of the command run unquoted in the header. The job name and directory are interpolated the same way. **Fix:** build the header lines with `shlex.quote`. This is independent of the rest of this design and worth fixing first.
96
+
97
+ ## Open questions
98
+
99
+ 1. Should a service alone keep an agent yellow? Proposed: **no**. Show it, but the agent is idle.
100
+ 2. Should a stuck watcher turn the agent red, or only add a warning badge?
101
+ 3. Should overcode ever kill a stuck watcher itself? Proposed: **no**. Flag it, and let the person or the agent decide.
102
+ 4. Where should the process walk run: in the daemon's per-tick resource sampling (where the pid is already known) or in a slower housekeeping pass? Shells change rarely, so every 10–30 s is probably enough.
103
+ 5. Containers and remote sisters: the process walk only sees local processes. Fall back to the status-bar count there.
@@ -230,8 +230,51 @@ lock, and the worst race is one duplicated parse.
230
230
  - The Claude backend's `read_window_token_usage` re-parses JSONL at the
231
231
  same 1 Hz cadence with no cache. It has not been reported as a problem.
232
232
 
233
+ ## Follow-up: the burn rate reuses the stats scan (#517)
234
+
235
+ At fleet scale the per-scan cost was no longer the issue; the number of
236
+ scans was. The status bar's burn rate asks every agent for its window usage
237
+ once a second, and each answer was a full scan. The TUI's stats sweep scans
238
+ again every 5 s. That is six scans per agent per 5 s. A 23-agent fleet
239
+ profiled at ~37% CPU, with `_scan_messages` in 76% of samples.
240
+
241
+ #517 proposed memoizing both `get_stats` and `get_window_token_usage` for
242
+ 60 s. It was not merged, for the same reason as #476's patch. The token,
243
+ cost and context columns have a 5 s freshness contract, and the TUI's
244
+ own 5 s sweep (not the daemon's 60 s sync) is what keeps them there. A
245
+ 60 s cache would have let them go up to a minute stale. Bucketing `since`
246
+ to 60 s also summed up to 59 s of turns that had already left the window.
247
+
248
+ What shipped instead:
249
+
250
+ - `get_stats` is never cached. Its scan, which it runs anyway, now also
251
+ builds a `WindowIndex`: the assistant turns' token usage, sorted by
252
+ `time_created`, with suffix sums. The scan publishes it under (store,
253
+ table, conversation ids).
254
+ - `get_window_token_usage` reuses a published index younger than
255
+ `WINDOW_INDEX_MAX_AGE_SECONDS` (10 s, inside the burn rate's 5-30 s
256
+ contract), else scans and publishes one itself. The index answers any
257
+ `since` exactly with a bisect, so the per-second sliding window costs
258
+ nothing extra and there is no bucketing error.
259
+ - Indexes are immutable and shared by v1 and v2 (the table is in the key).
260
+ The store is bounded at 256 entries, and expired entries are evicted
261
+ first.
262
+
263
+ At the TUI's cadence on the 2.3 GB generated store, 23 agents:
264
+
265
+ | owned ids per agent | before | after |
266
+ |---|---|---|
267
+ | 1 | 24-33 ms/s | 9-10 ms/s |
268
+ | 3 | 74-101 ms/s | 17-22 ms/s |
269
+ | 8 | 101-152 ms/s | 24-34 ms/s |
270
+
271
+ (The ranges span opencode and opencode2.) What remains is `get_stats` every
272
+ 5 s, which the columns' contract requires, plus a connection and session-row
273
+ lookup per window call. Tests: `TestWindowIndexReuse`, `TestWindowIndex` and
274
+ `TestWindowIndexStore` in `tests/unit/test_opencode_scan_cost.py`.
275
+
233
276
  ## References
234
277
 
235
- - Issue #476
278
+ - Issues #476, #517
236
279
  - `scripts/make_opencode_store.py`, `scripts/bench_opencode_scan.py`
237
280
  - `docs/design/agent-agnostic-backends-opencode.md` (the reader's origin)
@@ -587,6 +587,20 @@ Return early when the probe is disabled, cap the buffer, and prune the preferenc
587
587
  5. **Count tmux commands, then cut them at source.** Persistent RealTmux in the daemon and web tier; one `list-panes -F` for pids and pane activity per sync; capture only panes whose activity changed, 40 lines for enrichment (R7, R9, R11).
588
588
  6. **Log status changes, not samples.** A history row on change plus a periodic keepalive, byte-based hook-log rotation with truncated inputs, presence tail-reads (R10, R12, R13).
589
589
 
590
+ ## Follow-up (2026-10-06): R15-R18 were not in the fix programme
591
+
592
+ The fix programme above covered R1-R14, which shipped in 0.5.5. R15-R18 were
593
+ never scheduled, and the scale tier only built Claude fleets, so nothing
594
+ budgeted the other backends. A user then hit the opencode burn-rate rescan at
595
+ 37% CPU (#517, fixed). Since then:
596
+
597
+ - `scripts/bench_backends.py` and `tests/scale/test_backend_budgets.py` budget
598
+ the opencode, opencode2, codex, grok and hermes readers at the TUI's cadence.
599
+ - R15 is tracked in #524 (codex), #525 (grok), #526 (opencode row cache) and
600
+ #527 (hermes). Each issue has a strict xfail budget.
601
+ - R16-R18 were re-checked against main and are tracked in #528: 3 fixed
602
+ incidentally, 9 partly fixed, 7 open.
603
+
590
604
  ## What history says
591
605
 
592
606
  100 prior incidents were mined from git history, GitHub issues and PRs, `AUDIT.md` and the March 2026 UX performance analysis, each checked against current source. Most still-open ones added a cache or cap to one call site and left its siblings alone; the tiered capture from #161 was silently lost and only rediscovered in 0.5.4.
@@ -0,0 +1,8 @@
1
+ # Overcode 0.5.8 Release Notes
2
+
3
+ - **Agents show their own model and effort.** Another Claude in the same repo (the IDE, a terminal, an agent in another overcode session) could become an agent's conversation, and `/clear` could move an agent back to the one it left. The agent's hooks now decide.
4
+ - **Skill profiles (#499).** Named sets of skills per agent, edited with `W`. `delegating-to-agents` is merged into one rewritten `overcode` skill (`overcode skills install` to update).
5
+ - **Status colours (#507).** Background shells and subagents show yellow, not red. A re-prompt after an interrupt or an answered permission shows the right colour. Restarting the TUI no longer rings every red agent's bell.
6
+ - **`restart` keeps the agent's model (#505)**, and `restart --model` changes it. Light mode, bulk revive, `shutdown` and configurable keys (#508–#510).
7
+ - **PR column reads Claude Code's own PR link (#489).** A JOB column per agent (#463), and clicking a row switches the pane to it.
8
+ - **Fixes:** multi-line launch prompts submit; no emoji too new for VS Code's terminal (#504); the overagent can launch top-level agents.
@@ -0,0 +1,117 @@
1
+ # Skill Profiles
2
+
3
+ Agent CLIs treat installed skills as **always on**. Anything in `~/.claude/skills` is offered to every Claude Code session, and opencode reads the same folder (plus `~/.agents/skills`). So installing a skill for one project switches it on everywhere, in more than one tool.
4
+
5
+ Skill profiles turn that around:
6
+
7
+ - **The library** holds skills that are *installed but off*. No agent CLI looks there by itself.
8
+ - **A profile** is a named list of skills, such as `research` or `ios`.
9
+ - **Launching an agent with a profile** switches its skills on *for that agent only*. Your other personal skills are hidden for that session.
10
+ - **A folder can be pinned** to a profile, so new agents started there get it by default.
11
+
12
+ Nothing is written into your project folders or into `~/.claude`. When the agent ends, its skills go with it.
13
+
14
+ Supported backends: **Claude Code** and **opencode**. Other backends launch as normal and ignore the profile.
15
+
16
+ ## The library
17
+
18
+ Library skills come from:
19
+
20
+ 1. `~/.overcode/skills/`: copy skill folders (each with a `SKILL.md`) in here.
21
+ 2. Any folders you add, such as skill or plugin repos checked out in your code root:
22
+
23
+ ```bash
24
+ overcode skills library add ~/Code/team-skills
25
+ ```
26
+
27
+ overcode searches these folders for `SKILL.md` files. It skips hidden folders and `node_modules`, and goes no more than 6 levels deep. Repos stay where you keep them, and `git pull` updates every profile that uses them. If two folders have a skill with the same name, the first one wins; `overcode skills list` warns about it.
28
+
29
+ Don't add a folder that an agent CLI already reads, like `~/.claude/skills` or `~/.agents/skills`. Its skills would be always on regardless of profiles, and `overcode skills` warns if you do.
30
+
31
+ To move always-on skills into the library (it asks first):
32
+
33
+ ```bash
34
+ overcode skills adopt shirka pdf
35
+ ```
36
+
37
+ ## Profiles
38
+
39
+ ```bash
40
+ overcode skills profile set research shirka dataviz # create or replace
41
+ overcode skills profile add research pdf
42
+ overcode skills profile remove research dataviz
43
+ overcode skills profile show research # what it adds and hides
44
+ overcode skills profile list
45
+ overcode skills profile delete research
46
+ ```
47
+
48
+ A profile can name a skill by its frontmatter `name` or its folder name.
49
+
50
+ In the TUI, press **`W`** (or choose *Skill profiles…* in the `/` palette):
51
+
52
+ - The dialog lists every skill, with the ones agents use most at the top, and a checkbox for the selected profile.
53
+ - `space` switches the highlighted skill on or off, `← →` changes profile, `n` makes a new one, and `D D` deletes it.
54
+ - `p` pins the profile to the focused agent's folder.
55
+ - Always-on skills show which CLIs load them (`on: Claude+opencode`) and are marked *hidden* when the profile leaves them out.
56
+
57
+ ## Which profile an agent gets
58
+
59
+ The first of these that applies:
60
+
61
+ 1. `overcode launch --skills <profile>`, or the **Skills** field in the new-agent dialog (`n`). `--skills none` means no profile.
62
+ 2. The parent agent's profile, for child agents (skip it with `--no-inherit`).
63
+ 3. The profile pinned to the folder, or its nearest pinned parent folder:
64
+
65
+ ```bash
66
+ overcode skills pin research ~/Code/papers # default: the current folder
67
+ overcode skills unpin ~/Code/papers
68
+ ```
69
+
70
+ Pins live in `~/.overcode/config.yaml`, not in the folder.
71
+ 4. `new_agent_defaults.skill_profile` in config, or the *Skill profile* row in the `G` dialog.
72
+
73
+ An agent without a profile launches exactly as before, with nothing hidden.
74
+
75
+ The profile is recorded on the agent and applied again on every restart, so edits to a profile take effect the next time an agent starts. The **PRF** column shows each agent's profile as one emoji; hover it to see the profile's name and skills. Pick a profile's emoji with `overcode skills profile emoji <name> <emoji>` (🎒 until you do).
76
+
77
+ ## What happens at launch
78
+
79
+ overcode builds `~/.overcode/skill-profiles/<profile>/`, a folder of links to the profile's library skills, and then:
80
+
81
+ | | Profile skills added | Other personal skills hidden |
82
+ |---|---|---|
83
+ | **Claude Code** | `--plugin-dir <profile folder>`. The skills appear as `<profile>:<skill>` | `skillOverrides: {"<skill>": "off"}` in the launch `--settings` |
84
+ | **opencode** | `OPENCODE_CONFIG_DIR=<profile folder>`, alongside `~/.config/opencode` | `"skill": {"<skill>": "deny"}` in `OPENCODE_PERMISSION`, which removes them from the list the model sees |
85
+
86
+ What counts as a *personal* skill for each CLI:
87
+
88
+ - **Claude Code:** `~/.claude/skills/<name>/`.
89
+ - **opencode:** everything under `~/.claude/skills`, `~/.agents/skills` and `~/.config/opencode/skill(s)`, including skills synced from claude.ai.
90
+
91
+ A project's own skills (its `.claude/skills` or `.opencode/skill`) and each CLI's built-in skills are never hidden.
92
+
93
+ A profile skill that the CLI already loads as a personal skill is left as it is: not linked a second time, and not hidden.
94
+
95
+ ## Config
96
+
97
+ ```yaml
98
+ # ~/.overcode/config.yaml
99
+ skills:
100
+ library_paths:
101
+ - ~/Code/team-skills
102
+ profiles:
103
+ research: [shirka, dataviz]
104
+ ios: [swift-helper]
105
+ folders:
106
+ ~/Code/papers: research
107
+ profile_emoji: # what the PRF column shows
108
+ research: 🔬
109
+ new_agent_defaults:
110
+ skill_profile: research
111
+ ```
112
+
113
+ ## Limits
114
+
115
+ - **Wrappers** (e.g. devcontainer): the profile folder links to paths on the host, so a container only sees them if those paths are mounted.
116
+ - **Codex, Grok, Hermes:** not supported yet. The launch goes ahead without the profile.
117
+ - **Remote launches** on a sister use that machine's own config.