newcode 0.1.16__tar.gz → 0.2.1__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 (288) hide show
  1. newcode-0.2.1/PKG-INFO +147 -0
  2. newcode-0.2.1/README.md +105 -0
  3. {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/event_stream_handler.py +1 -1
  4. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/colors_menu.py +2 -2
  5. {newcode-0.1.16 → newcode-0.2.1}/newcode/config.py +15 -0
  6. {newcode-0.1.16 → newcode-0.2.1}/newcode/messaging/rich_renderer.py +33 -21
  7. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/agent_tools.py +2 -2
  8. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/browser/__init__.py +1 -1
  9. {newcode-0.1.16 → newcode-0.2.1}/pyproject.toml +1 -1
  10. newcode-0.1.16/PKG-INFO +0 -153
  11. newcode-0.1.16/README.md +0 -111
  12. {newcode-0.1.16 → newcode-0.2.1}/.gitignore +0 -0
  13. {newcode-0.1.16 → newcode-0.2.1}/LICENSE +0 -0
  14. {newcode-0.1.16 → newcode-0.2.1}/newcode/__init__.py +0 -0
  15. {newcode-0.1.16 → newcode-0.2.1}/newcode/__main__.py +0 -0
  16. {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/__init__.py +0 -0
  17. {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_c_reviewer.py +0 -0
  18. {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_code_agent.py +0 -0
  19. {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_code_reviewer.py +0 -0
  20. {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_cpp_reviewer.py +0 -0
  21. {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_creator_agent.py +0 -0
  22. {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_golang_reviewer.py +0 -0
  23. {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_javascript_reviewer.py +0 -0
  24. {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_manager.py +0 -0
  25. {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_pack_leader.py +0 -0
  26. {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_planning.py +0 -0
  27. {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_python_programmer.py +0 -0
  28. {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_python_reviewer.py +0 -0
  29. {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_qa_browser.py +0 -0
  30. {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_qa_expert.py +0 -0
  31. {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_scheduler.py +0 -0
  32. {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_security_auditor.py +0 -0
  33. {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_terminal_qa.py +0 -0
  34. {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_typescript_reviewer.py +0 -0
  35. {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/base_agent.py +0 -0
  36. {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/json_agent.py +0 -0
  37. {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/pack/__init__.py +0 -0
  38. {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/pack/bloodhound.py +0 -0
  39. {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/pack/husky.py +0 -0
  40. {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/pack/retriever.py +0 -0
  41. {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/pack/shepherd.py +0 -0
  42. {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/pack/terrier.py +0 -0
  43. {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/pack/watchdog.py +0 -0
  44. {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/prompt_reviewer.py +0 -0
  45. {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/subagent_stream_handler.py +0 -0
  46. {newcode-0.1.16 → newcode-0.2.1}/newcode/api/__init__.py +0 -0
  47. {newcode-0.1.16 → newcode-0.2.1}/newcode/api/app.py +0 -0
  48. {newcode-0.1.16 → newcode-0.2.1}/newcode/api/main.py +0 -0
  49. {newcode-0.1.16 → newcode-0.2.1}/newcode/api/pty_manager.py +0 -0
  50. {newcode-0.1.16 → newcode-0.2.1}/newcode/api/routers/__init__.py +0 -0
  51. {newcode-0.1.16 → newcode-0.2.1}/newcode/api/routers/agents.py +0 -0
  52. {newcode-0.1.16 → newcode-0.2.1}/newcode/api/routers/commands.py +0 -0
  53. {newcode-0.1.16 → newcode-0.2.1}/newcode/api/routers/config.py +0 -0
  54. {newcode-0.1.16 → newcode-0.2.1}/newcode/api/routers/sessions.py +0 -0
  55. {newcode-0.1.16 → newcode-0.2.1}/newcode/api/templates/terminal.html +0 -0
  56. {newcode-0.1.16 → newcode-0.2.1}/newcode/api/websocket.py +0 -0
  57. {newcode-0.1.16 → newcode-0.2.1}/newcode/callbacks.py +0 -0
  58. {newcode-0.1.16 → newcode-0.2.1}/newcode/chatgpt_codex_client.py +0 -0
  59. {newcode-0.1.16 → newcode-0.2.1}/newcode/claude_cache_client.py +0 -0
  60. {newcode-0.1.16 → newcode-0.2.1}/newcode/cli_runner.py +0 -0
  61. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/__init__.py +0 -0
  62. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/add_model_menu.py +0 -0
  63. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/agent_menu.py +0 -0
  64. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/attachments.py +0 -0
  65. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/autosave_menu.py +0 -0
  66. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/clipboard.py +0 -0
  67. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/command_handler.py +0 -0
  68. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/command_registry.py +0 -0
  69. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/config_commands.py +0 -0
  70. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/core_commands.py +0 -0
  71. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/diff_menu.py +0 -0
  72. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/file_path_completion.py +0 -0
  73. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/load_context_completion.py +0 -0
  74. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/__init__.py +0 -0
  75. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/base.py +0 -0
  76. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/catalog_server_installer.py +0 -0
  77. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/custom_server_form.py +0 -0
  78. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/custom_server_installer.py +0 -0
  79. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/edit_command.py +0 -0
  80. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/handler.py +0 -0
  81. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/help_command.py +0 -0
  82. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/install_command.py +0 -0
  83. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/install_menu.py +0 -0
  84. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/list_command.py +0 -0
  85. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/logs_command.py +0 -0
  86. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/remove_command.py +0 -0
  87. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/restart_command.py +0 -0
  88. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/search_command.py +0 -0
  89. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/start_all_command.py +0 -0
  90. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/start_command.py +0 -0
  91. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/status_command.py +0 -0
  92. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/stop_all_command.py +0 -0
  93. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/stop_command.py +0 -0
  94. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/test_command.py +0 -0
  95. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/utils.py +0 -0
  96. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/wizard_utils.py +0 -0
  97. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp_completion.py +0 -0
  98. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/model_picker_completion.py +0 -0
  99. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/model_settings_menu.py +0 -0
  100. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/motd.py +0 -0
  101. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/onboarding_slides.py +0 -0
  102. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/onboarding_wizard.py +0 -0
  103. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/pin_command_completion.py +0 -0
  104. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/prompt_toolkit_completion.py +0 -0
  105. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/session_commands.py +0 -0
  106. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/skills_completion.py +0 -0
  107. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/uc_menu.py +0 -0
  108. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/utils.py +0 -0
  109. {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/wiggum_state.py +0 -0
  110. {newcode-0.1.16 → newcode-0.2.1}/newcode/error_logging.py +0 -0
  111. {newcode-0.1.16 → newcode-0.2.1}/newcode/gemini_code_assist.py +0 -0
  112. {newcode-0.1.16 → newcode-0.2.1}/newcode/gemini_model.py +0 -0
  113. {newcode-0.1.16 → newcode-0.2.1}/newcode/hook_engine/README.md +0 -0
  114. {newcode-0.1.16 → newcode-0.2.1}/newcode/hook_engine/__init__.py +0 -0
  115. {newcode-0.1.16 → newcode-0.2.1}/newcode/hook_engine/aliases.py +0 -0
  116. {newcode-0.1.16 → newcode-0.2.1}/newcode/hook_engine/engine.py +0 -0
  117. {newcode-0.1.16 → newcode-0.2.1}/newcode/hook_engine/executor.py +0 -0
  118. {newcode-0.1.16 → newcode-0.2.1}/newcode/hook_engine/matcher.py +0 -0
  119. {newcode-0.1.16 → newcode-0.2.1}/newcode/hook_engine/models.py +0 -0
  120. {newcode-0.1.16 → newcode-0.2.1}/newcode/hook_engine/registry.py +0 -0
  121. {newcode-0.1.16 → newcode-0.2.1}/newcode/hook_engine/validator.py +0 -0
  122. {newcode-0.1.16 → newcode-0.2.1}/newcode/http_utils.py +0 -0
  123. {newcode-0.1.16 → newcode-0.2.1}/newcode/keymap.py +0 -0
  124. {newcode-0.1.16 → newcode-0.2.1}/newcode/main.py +0 -0
  125. {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/__init__.py +0 -0
  126. {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/async_lifecycle.py +0 -0
  127. {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/blocking_startup.py +0 -0
  128. {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/captured_stdio_server.py +0 -0
  129. {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/circuit_breaker.py +0 -0
  130. {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/config_wizard.py +0 -0
  131. {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/dashboard.py +0 -0
  132. {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/error_isolation.py +0 -0
  133. {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/examples/retry_example.py +0 -0
  134. {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/health_monitor.py +0 -0
  135. {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/managed_server.py +0 -0
  136. {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/manager.py +0 -0
  137. {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/mcp_logs.py +0 -0
  138. {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/registry.py +0 -0
  139. {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/retry_manager.py +0 -0
  140. {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/server_registry_catalog.py +0 -0
  141. {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/status_tracker.py +0 -0
  142. {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/system_tools.py +0 -0
  143. {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_prompts/__init__.py +0 -0
  144. {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_prompts/hook_creator.py +0 -0
  145. {newcode-0.1.16 → newcode-0.2.1}/newcode/messaging/__init__.py +0 -0
  146. {newcode-0.1.16 → newcode-0.2.1}/newcode/messaging/bus.py +0 -0
  147. {newcode-0.1.16 → newcode-0.2.1}/newcode/messaging/commands.py +0 -0
  148. {newcode-0.1.16 → newcode-0.2.1}/newcode/messaging/markdown_patches.py +0 -0
  149. {newcode-0.1.16 → newcode-0.2.1}/newcode/messaging/message_queue.py +0 -0
  150. {newcode-0.1.16 → newcode-0.2.1}/newcode/messaging/messages.py +0 -0
  151. {newcode-0.1.16 → newcode-0.2.1}/newcode/messaging/queue_console.py +0 -0
  152. {newcode-0.1.16 → newcode-0.2.1}/newcode/messaging/renderers.py +0 -0
  153. {newcode-0.1.16 → newcode-0.2.1}/newcode/messaging/spinner/__init__.py +0 -0
  154. {newcode-0.1.16 → newcode-0.2.1}/newcode/messaging/spinner/console_spinner.py +0 -0
  155. {newcode-0.1.16 → newcode-0.2.1}/newcode/messaging/spinner/spinner_base.py +0 -0
  156. {newcode-0.1.16 → newcode-0.2.1}/newcode/messaging/subagent_console.py +0 -0
  157. {newcode-0.1.16 → newcode-0.2.1}/newcode/model_factory.py +0 -0
  158. {newcode-0.1.16 → newcode-0.2.1}/newcode/model_switching.py +0 -0
  159. {newcode-0.1.16 → newcode-0.2.1}/newcode/model_utils.py +0 -0
  160. {newcode-0.1.16 → newcode-0.2.1}/newcode/models.json +0 -0
  161. {newcode-0.1.16 → newcode-0.2.1}/newcode/models_dev_api.json +0 -0
  162. {newcode-0.1.16 → newcode-0.2.1}/newcode/models_dev_parser.py +0 -0
  163. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/__init__.py +0 -0
  164. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/agent_skills/__init__.py +0 -0
  165. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/agent_skills/config.py +0 -0
  166. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/agent_skills/discovery.py +0 -0
  167. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/agent_skills/downloader.py +0 -0
  168. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/agent_skills/installer.py +0 -0
  169. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/agent_skills/metadata.py +0 -0
  170. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/agent_skills/prompt_builder.py +0 -0
  171. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/agent_skills/register_callbacks.py +0 -0
  172. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/agent_skills/remote_catalog.py +0 -0
  173. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/agent_skills/skill_catalog.py +0 -0
  174. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/agent_skills/skills_install_menu.py +0 -0
  175. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/agent_skills/skills_menu.py +0 -0
  176. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/antigravity_oauth/__init__.py +0 -0
  177. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/antigravity_oauth/accounts.py +0 -0
  178. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/antigravity_oauth/antigravity_model.py +0 -0
  179. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/antigravity_oauth/config.py +0 -0
  180. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/antigravity_oauth/constants.py +0 -0
  181. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/antigravity_oauth/oauth.py +0 -0
  182. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/antigravity_oauth/register_callbacks.py +0 -0
  183. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/antigravity_oauth/storage.py +0 -0
  184. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/antigravity_oauth/test_plugin.py +0 -0
  185. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/antigravity_oauth/token.py +0 -0
  186. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/antigravity_oauth/transport.py +0 -0
  187. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/antigravity_oauth/utils.py +0 -0
  188. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/chatgpt_oauth/__init__.py +0 -0
  189. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/chatgpt_oauth/config.py +0 -0
  190. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/chatgpt_oauth/oauth_flow.py +0 -0
  191. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/chatgpt_oauth/register_callbacks.py +0 -0
  192. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/chatgpt_oauth/test_plugin.py +0 -0
  193. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/chatgpt_oauth/utils.py +0 -0
  194. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/claude_code_hooks/__init__.py +0 -0
  195. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/claude_code_hooks/config.py +0 -0
  196. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/claude_code_hooks/register_callbacks.py +0 -0
  197. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/claude_code_oauth/README.md +0 -0
  198. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/claude_code_oauth/SETUP.md +0 -0
  199. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/claude_code_oauth/__init__.py +0 -0
  200. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/claude_code_oauth/config.py +0 -0
  201. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/claude_code_oauth/register_callbacks.py +0 -0
  202. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/claude_code_oauth/test_plugin.py +0 -0
  203. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
  204. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/claude_code_oauth/utils.py +0 -0
  205. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/customizable_commands/__init__.py +0 -0
  206. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/customizable_commands/register_callbacks.py +0 -0
  207. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/example_custom_command/README.md +0 -0
  208. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/example_custom_command/register_callbacks.py +0 -0
  209. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/file_permission_handler/__init__.py +0 -0
  210. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/file_permission_handler/register_callbacks.py +0 -0
  211. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/frontend_emitter/__init__.py +0 -0
  212. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/frontend_emitter/emitter.py +0 -0
  213. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/frontend_emitter/register_callbacks.py +0 -0
  214. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/hook_creator/__init__.py +0 -0
  215. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/hook_creator/register_callbacks.py +0 -0
  216. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/hook_manager/__init__.py +0 -0
  217. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/hook_manager/config.py +0 -0
  218. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/hook_manager/hooks_menu.py +0 -0
  219. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/hook_manager/register_callbacks.py +0 -0
  220. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/oauth_puppy_html.py +0 -0
  221. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/scheduler/__init__.py +0 -0
  222. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/scheduler/register_callbacks.py +0 -0
  223. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/scheduler/scheduler_menu.py +0 -0
  224. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/scheduler/scheduler_wizard.py +0 -0
  225. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/shell_safety/__init__.py +0 -0
  226. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/shell_safety/agent_shell_safety.py +0 -0
  227. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/shell_safety/command_cache.py +0 -0
  228. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/shell_safety/register_callbacks.py +0 -0
  229. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/synthetic_status/__init__.py +0 -0
  230. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/synthetic_status/register_callbacks.py +0 -0
  231. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/synthetic_status/status_api.py +0 -0
  232. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/universal_constructor/__init__.py +0 -0
  233. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/universal_constructor/models.py +0 -0
  234. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/universal_constructor/register_callbacks.py +0 -0
  235. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/universal_constructor/registry.py +0 -0
  236. {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/universal_constructor/sandbox.py +0 -0
  237. {newcode-0.1.16 → newcode-0.2.1}/newcode/prompts/antigravity_system_prompt.md +0 -0
  238. {newcode-0.1.16 → newcode-0.2.1}/newcode/pydantic_patches.py +0 -0
  239. {newcode-0.1.16 → newcode-0.2.1}/newcode/reopenable_async_client.py +0 -0
  240. {newcode-0.1.16 → newcode-0.2.1}/newcode/round_robin_model.py +0 -0
  241. {newcode-0.1.16 → newcode-0.2.1}/newcode/scheduler/__init__.py +0 -0
  242. {newcode-0.1.16 → newcode-0.2.1}/newcode/scheduler/__main__.py +0 -0
  243. {newcode-0.1.16 → newcode-0.2.1}/newcode/scheduler/cli.py +0 -0
  244. {newcode-0.1.16 → newcode-0.2.1}/newcode/scheduler/config.py +0 -0
  245. {newcode-0.1.16 → newcode-0.2.1}/newcode/scheduler/daemon.py +0 -0
  246. {newcode-0.1.16 → newcode-0.2.1}/newcode/scheduler/executor.py +0 -0
  247. {newcode-0.1.16 → newcode-0.2.1}/newcode/scheduler/platform.py +0 -0
  248. {newcode-0.1.16 → newcode-0.2.1}/newcode/scheduler/platform_unix.py +0 -0
  249. {newcode-0.1.16 → newcode-0.2.1}/newcode/scheduler/platform_win.py +0 -0
  250. {newcode-0.1.16 → newcode-0.2.1}/newcode/session_storage.py +0 -0
  251. {newcode-0.1.16 → newcode-0.2.1}/newcode/status_display.py +0 -0
  252. {newcode-0.1.16 → newcode-0.2.1}/newcode/summarization_agent.py +0 -0
  253. {newcode-0.1.16 → newcode-0.2.1}/newcode/terminal_utils.py +0 -0
  254. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/__init__.py +0 -0
  255. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/ask_user_question/__init__.py +0 -0
  256. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/ask_user_question/constants.py +0 -0
  257. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/ask_user_question/demo_tui.py +0 -0
  258. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/ask_user_question/handler.py +0 -0
  259. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/ask_user_question/models.py +0 -0
  260. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/ask_user_question/registration.py +0 -0
  261. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/ask_user_question/renderers.py +0 -0
  262. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/ask_user_question/terminal_ui.py +0 -0
  263. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/ask_user_question/theme.py +0 -0
  264. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/ask_user_question/tui_loop.py +0 -0
  265. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/browser/browser_control.py +0 -0
  266. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/browser/browser_interactions.py +0 -0
  267. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/browser/browser_locators.py +0 -0
  268. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/browser/browser_manager.py +0 -0
  269. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/browser/browser_navigation.py +0 -0
  270. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/browser/browser_screenshot.py +0 -0
  271. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/browser/browser_scripts.py +0 -0
  272. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/browser/browser_workflows.py +0 -0
  273. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/browser/chromium_terminal_manager.py +0 -0
  274. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/browser/terminal_command_tools.py +0 -0
  275. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/browser/terminal_screenshot_tools.py +0 -0
  276. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/browser/terminal_tools.py +0 -0
  277. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/command_runner.py +0 -0
  278. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/common.py +0 -0
  279. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/display.py +0 -0
  280. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/file_modifications.py +0 -0
  281. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/file_operations.py +0 -0
  282. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/scheduler_tools.py +0 -0
  283. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/skills_tools.py +0 -0
  284. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/subagent_context.py +0 -0
  285. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/tools_content.py +0 -0
  286. {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/universal_constructor.py +0 -0
  287. {newcode-0.1.16 → newcode-0.2.1}/newcode/uvx_detection.py +0 -0
  288. {newcode-0.1.16 → newcode-0.2.1}/newcode/version_checker.py +0 -0
newcode-0.2.1/PKG-INFO ADDED
@@ -0,0 +1,147 @@
1
+ Metadata-Version: 2.4
2
+ Name: newcode
3
+ Version: 0.2.1
4
+ Summary: AI-powered code generation agent platform
5
+ Project-URL: repository, https://github.com/janfeddersen-wq/new_code
6
+ Project-URL: HomePage, https://github.com/janfeddersen-wq/new_code
7
+ Project-URL: Upstream, https://github.com/mpfaffenberger/code_puppy
8
+ Author: Jan Feddersen, Michael Pfaffenberger (original code-puppy author)
9
+ License: MIT
10
+ License-File: LICENSE
11
+ Classifier: License :: OSI Approved :: MIT License
12
+ Classifier: Operating System :: OS Independent
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Programming Language :: Python :: 3.13
17
+ Classifier: Topic :: Software Development :: Code Generators
18
+ Requires-Python: <3.14,>=3.11
19
+ Requires-Dist: anthropic==0.79.0
20
+ Requires-Dist: dbos>=2.11.0
21
+ Requires-Dist: fastapi>=0.109.0
22
+ Requires-Dist: httpx[http2]>=0.24.1
23
+ Requires-Dist: json-repair>=0.46.2
24
+ Requires-Dist: mcp>=1.9.4
25
+ Requires-Dist: openai>=1.99.1
26
+ Requires-Dist: pillow>=10.0.0
27
+ Requires-Dist: playwright>=1.40.0
28
+ Requires-Dist: prompt-toolkit>=3.0.52
29
+ Requires-Dist: pydantic-ai-slim[anthropic,mcp,openai]==1.56.0
30
+ Requires-Dist: pydantic>=2.4.0
31
+ Requires-Dist: python-dotenv>=1.0.0
32
+ Requires-Dist: rapidfuzz>=3.13.0
33
+ Requires-Dist: requests>=2.28.0
34
+ Requires-Dist: rich>=13.4.2
35
+ Requires-Dist: ripgrep==14.1.0
36
+ Requires-Dist: tenacity>=8.2.0
37
+ Requires-Dist: termflow-md>=0.1.8
38
+ Requires-Dist: typer>=0.12.0
39
+ Requires-Dist: uvicorn[standard]>=0.27.0
40
+ Requires-Dist: websockets>=12.0
41
+ Description-Content-Type: text/markdown
42
+
43
+ # NewCode
44
+
45
+ **NewCode** is an open-source, terminal-first AI coding agent for generating, editing, and reviewing code directly from your CLI.
46
+
47
+ It is maintained as a fork of [code-puppy](https://github.com/mpfaffenberger/code_puppy), with a more professional default UX and workflow-focused agent setup.
48
+
49
+ ## Why NewCode
50
+
51
+ NewCode is designed for practical software workflows in the terminal: inspect files, make edits, run commands, and iterate quickly with AI assistance.
52
+
53
+ ## Features
54
+
55
+ - Multi-provider model support (including OpenAI, Anthropic, Gemini, Cerebras, and compatible OpenAI-style endpoints)
56
+ - Terminal-first coding workflow (read/search/edit/delete files and run commands)
57
+ - Built-in agent system with a default coding agent and optional specialist workflows
58
+ - MCP (Model Context Protocol) integration and server management
59
+ - Interactive command-driven UX for model, agent, and settings management
60
+ - Session autosave/restore and scheduler utilities
61
+ - Plugin/callback extensibility hooks
62
+
63
+ ## Quick start
64
+
65
+ ### 1) Install
66
+
67
+ ```bash
68
+ pip install newcode
69
+ ```
70
+
71
+ Or with [uv](https://docs.astral.sh/uv/):
72
+
73
+ ```bash
74
+ uv pip install newcode
75
+ ```
76
+
77
+ ### 2) Launch
78
+
79
+ ```bash
80
+ newcode
81
+ ```
82
+
83
+ Short alias:
84
+
85
+ ```bash
86
+ nc
87
+ ```
88
+
89
+ On first run, NewCode starts onboarding to help configure API keys and defaults.
90
+
91
+ ### 3) First useful commands
92
+
93
+ ```bash
94
+ /config # Show current configuration
95
+ /model # Select or switch model
96
+ /agent # Select or switch agent
97
+ /scheduler # Manage scheduled tasks
98
+ /colors # Customize terminal UI colors
99
+ /api # Manage built-in API server (start|stop|status)
100
+ ```
101
+
102
+ ## Requirements
103
+
104
+ - Python `>=3.11,<3.14`
105
+ - At least one provider/API key for a supported model backend
106
+
107
+ ## Configuration
108
+
109
+ NewCode uses a legacy-compatible config filename: `puppy.cfg`.
110
+
111
+ - Default path: `~/.newcode/puppy.cfg`
112
+ - With XDG variables: `$XDG_CONFIG_HOME/newcode/puppy.cfg`
113
+
114
+ ## Development
115
+
116
+ ```bash
117
+ git clone https://github.com/janfeddersen-wq/new_code.git
118
+ cd new_code
119
+ uv pip install -e ".[dev]"
120
+ ```
121
+
122
+ ## Testing
123
+
124
+ Run the test suite:
125
+
126
+ ```bash
127
+ uv run pytest tests/ -v
128
+ ```
129
+
130
+ Run linting and formatting checks:
131
+
132
+ ```bash
133
+ ruff check .
134
+ ruff format --check .
135
+ ```
136
+
137
+ ## Contributing
138
+
139
+ Contributions are welcome.
140
+
141
+ - Open an issue to discuss bugs, ideas, or improvements.
142
+ - Submit a pull request with a clear scope and rationale.
143
+ - Keep changes focused and include tests when applicable.
144
+
145
+ ## License
146
+
147
+ MIT — see [LICENSE](LICENSE).
@@ -0,0 +1,105 @@
1
+ # NewCode
2
+
3
+ **NewCode** is an open-source, terminal-first AI coding agent for generating, editing, and reviewing code directly from your CLI.
4
+
5
+ It is maintained as a fork of [code-puppy](https://github.com/mpfaffenberger/code_puppy), with a more professional default UX and workflow-focused agent setup.
6
+
7
+ ## Why NewCode
8
+
9
+ NewCode is designed for practical software workflows in the terminal: inspect files, make edits, run commands, and iterate quickly with AI assistance.
10
+
11
+ ## Features
12
+
13
+ - Multi-provider model support (including OpenAI, Anthropic, Gemini, Cerebras, and compatible OpenAI-style endpoints)
14
+ - Terminal-first coding workflow (read/search/edit/delete files and run commands)
15
+ - Built-in agent system with a default coding agent and optional specialist workflows
16
+ - MCP (Model Context Protocol) integration and server management
17
+ - Interactive command-driven UX for model, agent, and settings management
18
+ - Session autosave/restore and scheduler utilities
19
+ - Plugin/callback extensibility hooks
20
+
21
+ ## Quick start
22
+
23
+ ### 1) Install
24
+
25
+ ```bash
26
+ pip install newcode
27
+ ```
28
+
29
+ Or with [uv](https://docs.astral.sh/uv/):
30
+
31
+ ```bash
32
+ uv pip install newcode
33
+ ```
34
+
35
+ ### 2) Launch
36
+
37
+ ```bash
38
+ newcode
39
+ ```
40
+
41
+ Short alias:
42
+
43
+ ```bash
44
+ nc
45
+ ```
46
+
47
+ On first run, NewCode starts onboarding to help configure API keys and defaults.
48
+
49
+ ### 3) First useful commands
50
+
51
+ ```bash
52
+ /config # Show current configuration
53
+ /model # Select or switch model
54
+ /agent # Select or switch agent
55
+ /scheduler # Manage scheduled tasks
56
+ /colors # Customize terminal UI colors
57
+ /api # Manage built-in API server (start|stop|status)
58
+ ```
59
+
60
+ ## Requirements
61
+
62
+ - Python `>=3.11,<3.14`
63
+ - At least one provider/API key for a supported model backend
64
+
65
+ ## Configuration
66
+
67
+ NewCode uses a legacy-compatible config filename: `puppy.cfg`.
68
+
69
+ - Default path: `~/.newcode/puppy.cfg`
70
+ - With XDG variables: `$XDG_CONFIG_HOME/newcode/puppy.cfg`
71
+
72
+ ## Development
73
+
74
+ ```bash
75
+ git clone https://github.com/janfeddersen-wq/new_code.git
76
+ cd new_code
77
+ uv pip install -e ".[dev]"
78
+ ```
79
+
80
+ ## Testing
81
+
82
+ Run the test suite:
83
+
84
+ ```bash
85
+ uv run pytest tests/ -v
86
+ ```
87
+
88
+ Run linting and formatting checks:
89
+
90
+ ```bash
91
+ ruff check .
92
+ ruff format --check .
93
+ ```
94
+
95
+ ## Contributing
96
+
97
+ Contributions are welcome.
98
+
99
+ - Open an issue to discuss bugs, ideas, or improvements.
100
+ - Submit a pull request with a clear scope and rationale.
101
+ - Keep changes focused and include tests when applicable.
102
+
103
+ ## License
104
+
105
+ MIT — see [LICENSE](LICENSE).
@@ -139,7 +139,7 @@ async def event_stream_handler(
139
139
  thinking_color = get_banner_color("thinking")
140
140
  console.print(
141
141
  Text.from_markup(
142
- f"[{thinking_color}]───[/{thinking_color}] [bold]THINKING[/bold] [{thinking_color}]───[/{thinking_color}]"
142
+ f"[{thinking_color}]╭──[/{thinking_color}] [bold]THINKING[/bold] [{thinking_color}]───[/{thinking_color}]"
143
143
  ),
144
144
  )
145
145
  did_stream_anything = True
@@ -419,7 +419,7 @@ def _get_preview_text_for_prompt_toolkit(config: ColorConfiguration) -> ANSI:
419
419
 
420
420
  # Print the banner with its configured color (left-border style)
421
421
  icon_str = f" {icon}" if icon else ""
422
- banner_text = f"[{color}]───[/{color}] [bold]{display_name.upper()}[/bold] [{color}]───[/{color}]{icon_str}"
422
+ banner_text = f"[{color}]╭──[/{color}] [bold]{display_name.upper()}[/bold] [{color}]───[/{color}]{icon_str}"
423
423
  console.print(banner_text)
424
424
 
425
425
  # Print sample content (dimmed)
@@ -504,7 +504,7 @@ def _get_single_banner_preview(config: ColorConfiguration) -> ANSI:
504
504
 
505
505
  # Show the banner large (left-border style)
506
506
  icon_str = f" {icon}" if icon else ""
507
- banner_text = f"[{color}]───[/{color}] [bold]{display_name.upper()}[/bold] [{color}]───[/{color}]{icon_str}"
507
+ banner_text = f"[{color}]╭──[/{color}] [bold]{display_name.upper()}[/bold] [{color}]───[/{color}]{icon_str}"
508
508
  console.print(banner_text)
509
509
  console.print()
510
510
 
@@ -314,6 +314,7 @@ def get_config_keys():
314
314
  default_keys.append("diff_deletion_color")
315
315
  default_keys.append("suppress_thinking_messages")
316
316
  default_keys.append("suppress_informational_messages")
317
+ default_keys.append("debug")
317
318
 
318
319
  config = configparser.ConfigParser()
319
320
  config.read(CONFIG_FILE)
@@ -1648,6 +1649,20 @@ def get_suppress_informational_messages() -> bool:
1648
1649
  return False
1649
1650
 
1650
1651
 
1652
+ def get_debug() -> bool:
1653
+ """Check whether debug mode is enabled.
1654
+
1655
+ Defaults to False. When True, enables verbose output such as
1656
+ showing full sub-agent prompts without truncation.
1657
+ """
1658
+ true_vals = {"1", "true", "yes", "on"}
1659
+ cfg_val = get_value("debug")
1660
+ if cfg_val is not None:
1661
+ if str(cfg_val).strip().lower() in true_vals:
1662
+ return True
1663
+ return False
1664
+
1665
+
1651
1666
  def set_suppress_informational_messages(enabled: bool):
1652
1667
  """Sets the suppress_informational_messages configuration value.
1653
1668
 
@@ -169,20 +169,20 @@ class RichConsoleRenderer:
169
169
 
170
170
  return get_banner_color(banner_name)
171
171
 
172
- def _format_banner(self, banner_name: str, text: str) -> str:
172
+ def _format_banner(self, banner_name: str, text: str, corner: bool = True) -> str:
173
173
  """Format a banner with colored dashes and bold capitalized text.
174
174
 
175
175
  Args:
176
176
  banner_name: The banner identifier
177
177
  text: The banner text
178
+ corner: If True use ╭── leading edge, otherwise ───
178
179
 
179
180
  Returns:
180
181
  Rich markup string for the banner
181
182
  """
182
183
  color = self._get_banner_color(banner_name)
183
- return (
184
- f"[{color}]───[/{color}] [bold]{text.upper()}[/bold] [{color}]───[/{color}]"
185
- )
184
+ lead = "╭──" if corner else "───"
185
+ return f"[{color}]{lead}[/{color}] [bold]{text.upper()}[/bold] [{color}]───[/{color}]"
186
186
 
187
187
  def _should_suppress_subagent_output(self) -> bool:
188
188
  """Check if sub-agent output should be suppressed.
@@ -531,9 +531,9 @@ class RichConsoleRenderer:
531
531
  render_dir_tree(root_key, 0)
532
532
 
533
533
  # Summary
534
- self._console.print(f"{bar}[bold cyan]Summary:[/bold cyan]")
534
+ self._console.print(f"{bar} [bold cyan]Summary:[/bold cyan]")
535
535
  self._console.print(
536
- f"{bar}[blue]{msg.dir_count} directories[/blue], "
536
+ f"{bar} [blue]{msg.dir_count} directories[/blue], "
537
537
  f"[green]{msg.file_count} files[/green] "
538
538
  f"[dim]({self._format_size(msg.total_size)} total)[/dim]"
539
539
  )
@@ -666,19 +666,23 @@ class RichConsoleRenderer:
666
666
  banner = self._format_banner("edit_file", "EDIT FILE")
667
667
  self._console.print(f"\n{banner}")
668
668
 
669
+ # Compute line counts for the summary
670
+ stats_suffix = ""
671
+ if msg.diff_lines:
672
+ added = sum(1 for line in msg.diff_lines if line.type == "add")
673
+ removed = sum(1 for line in msg.diff_lines if line.type == "remove")
674
+ stats_suffix = f" ([green]+{added}[/green] / [red]-{removed}[/red])"
675
+
669
676
  self._console.print(
670
677
  f"{bar} [{op_color}]{msg.operation.upper()}[/{op_color}] "
671
- f"[bold cyan]{msg.path}[/bold cyan]"
678
+ f"[bold cyan]{msg.path}[/bold cyan]{stats_suffix}"
672
679
  )
673
680
 
674
681
  if not msg.diff_lines:
675
682
  return
676
683
 
677
- # Compact mode: show only line counts, skip diff content
684
+ # Compact mode: show only line counts (already shown inline), skip diff content
678
685
  if not get_show_diffs():
679
- added = sum(1 for line in msg.diff_lines if line.type == "add")
680
- removed = sum(1 for line in msg.diff_lines if line.type == "remove")
681
- self._console.print(f"{bar} [dim](+{added} / -{removed})[/dim]")
682
686
  return
683
687
 
684
688
  # Reconstruct unified diff text from diff_lines for format_diff_with_colors
@@ -778,7 +782,7 @@ class RichConsoleRenderer:
778
782
  def _render_agent_response(self, msg: AgentResponseMessage) -> None:
779
783
  """Render agent response with header and markdown formatting."""
780
784
  # Header
781
- banner = self._format_banner("agent_response", "AGENT RESPONSE")
785
+ banner = self._format_banner("agent_response", "AGENT RESPONSE", corner=False)
782
786
  self._console.print(f"\n{banner}")
783
787
 
784
788
  # Content (markdown or plain)
@@ -810,22 +814,30 @@ class RichConsoleRenderer:
810
814
  )
811
815
 
812
816
  # Session ID
813
- self._console.print(f"{bar}[dim]Session:[/dim] [bold]{msg.session_id}[/bold]")
817
+ self._console.print(f"{bar} [dim]Session:[/dim] [bold]{msg.session_id}[/bold]")
814
818
 
815
- # Prompt (truncated if too long, rendered as markdown)
816
- prompt_display = (
817
- msg.prompt[:200] + "..." if len(msg.prompt) > 200 else msg.prompt
818
- )
819
- self._console.print(f"{bar}[dim]Prompt:[/dim]")
820
- md_prompt = Markdown(prompt_display)
821
- self._console.print(md_prompt)
819
+ # Prompt (show full in debug mode, truncated otherwise)
820
+ from newcode.config import get_debug
821
+
822
+ if get_debug():
823
+ prompt_display = msg.prompt
824
+ else:
825
+ prompt_display = (
826
+ msg.prompt[:200] + "..." if len(msg.prompt) > 200 else msg.prompt
827
+ )
828
+ self._console.print(f"{bar} [dim]Prompt:[/dim]")
829
+ for prompt_line in prompt_display.split("\n"):
830
+ escaped = prompt_line.replace("[", "\\[")
831
+ self._console.print(f"{bar} [dim]{escaped}[/dim]")
822
832
 
823
833
  def _render_subagent_response(self, msg: SubAgentResponseMessage) -> None:
824
834
  """Render sub-agent response with markdown formatting."""
825
835
  # Response header
826
836
  color = self._get_banner_color("subagent_response")
827
837
  bar = self._bar(color)
828
- banner = self._format_banner("subagent_response", "AGENT RESPONSE")
838
+ banner = self._format_banner(
839
+ "subagent_response", "AGENT RESPONSE", corner=False
840
+ )
829
841
  self._console.print(f"\n{banner} [bold cyan]{msg.agent_name}[/bold cyan]")
830
842
 
831
843
  # Render response as markdown
@@ -254,7 +254,7 @@ def register_list_agents(agent):
254
254
  list_agents_color = get_banner_color("list_agents")
255
255
  emit_info(
256
256
  Text.from_markup(
257
- f"\n[{list_agents_color}]───[/{list_agents_color}] [bold]LIST AGENTS[/bold] [{list_agents_color}]───[/{list_agents_color}]"
257
+ f"\n[{list_agents_color}]╭──[/{list_agents_color}] [bold]LIST AGENTS[/bold] [{list_agents_color}]───[/{list_agents_color}]"
258
258
  ),
259
259
  message_group=group_id,
260
260
  )
@@ -473,7 +473,7 @@ def register_invoke_agent(agent):
473
473
  instructions = agent_config.get_full_system_prompt()
474
474
 
475
475
  # Add AGENTS.md content to subagents
476
- puppy_rules = agent_config.load_puppy_rules()
476
+ puppy_rules = agent_config.load_agent_rules()
477
477
  if puppy_rules:
478
478
  instructions += f"\n\n{puppy_rules}"
479
479
 
@@ -25,7 +25,7 @@ def format_terminal_banner(text: str) -> str:
25
25
  Rich markup formatted string
26
26
  """
27
27
  color = get_banner_color("terminal_tool")
28
- return f"[{color}]───[/{color}] [bold]{text.upper()}[/bold] [{color}]───[/{color}]"
28
+ return f"[{color}]╭──[/{color}] [bold]{text.upper()}[/bold] [{color}]───[/{color}]"
29
29
 
30
30
 
31
31
  __all__ = [
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "newcode"
7
- version = "0.1.16"
7
+ version = "0.2.1"
8
8
  description = "AI-powered code generation agent platform"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11,<3.14"
newcode-0.1.16/PKG-INFO DELETED
@@ -1,153 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: newcode
3
- Version: 0.1.16
4
- Summary: AI-powered code generation agent platform
5
- Project-URL: repository, https://github.com/janfeddersen-wq/new_code
6
- Project-URL: HomePage, https://github.com/janfeddersen-wq/new_code
7
- Project-URL: Upstream, https://github.com/mpfaffenberger/code_puppy
8
- Author: Jan Feddersen, Michael Pfaffenberger (original code-puppy author)
9
- License: MIT
10
- License-File: LICENSE
11
- Classifier: License :: OSI Approved :: MIT License
12
- Classifier: Operating System :: OS Independent
13
- Classifier: Programming Language :: Python :: 3
14
- Classifier: Programming Language :: Python :: 3.11
15
- Classifier: Programming Language :: Python :: 3.12
16
- Classifier: Programming Language :: Python :: 3.13
17
- Classifier: Topic :: Software Development :: Code Generators
18
- Requires-Python: <3.14,>=3.11
19
- Requires-Dist: anthropic==0.79.0
20
- Requires-Dist: dbos>=2.11.0
21
- Requires-Dist: fastapi>=0.109.0
22
- Requires-Dist: httpx[http2]>=0.24.1
23
- Requires-Dist: json-repair>=0.46.2
24
- Requires-Dist: mcp>=1.9.4
25
- Requires-Dist: openai>=1.99.1
26
- Requires-Dist: pillow>=10.0.0
27
- Requires-Dist: playwright>=1.40.0
28
- Requires-Dist: prompt-toolkit>=3.0.52
29
- Requires-Dist: pydantic-ai-slim[anthropic,mcp,openai]==1.56.0
30
- Requires-Dist: pydantic>=2.4.0
31
- Requires-Dist: python-dotenv>=1.0.0
32
- Requires-Dist: rapidfuzz>=3.13.0
33
- Requires-Dist: requests>=2.28.0
34
- Requires-Dist: rich>=13.4.2
35
- Requires-Dist: ripgrep==14.1.0
36
- Requires-Dist: tenacity>=8.2.0
37
- Requires-Dist: termflow-md>=0.1.8
38
- Requires-Dist: typer>=0.12.0
39
- Requires-Dist: uvicorn[standard]>=0.27.0
40
- Requires-Dist: websockets>=12.0
41
- Description-Content-Type: text/markdown
42
-
43
- # NewCode
44
-
45
- An AI-powered code generation and modification agent for the terminal.
46
-
47
- NewCode is a fork of [code-puppy](https://github.com/mpfaffenberger/newcode) by Michael Pfaffenberger, customized for the fedstew workflow. We wanted a clean, professional CLI agent with opinionated defaults, streamlined prompts, and a focus on practical code generation without the playful branding.
48
-
49
- ## What changed from code-puppy
50
-
51
- - Removed all dog/puppy-themed branding and emojis in favor of a clean, professional interface
52
- - Renamed "Pack" multi-agent system to use functional names (Orchestrator, Tracker, Executor, Reviewer, etc.)
53
- - Rewrote all agent system prompts for clarity and professionalism
54
- - Increased output validation retries from 3 to 10 for more robust model interactions
55
- - Updated configuration keys and display names throughout
56
- - Published to PyPI as `newcode` instead of `code-puppy`
57
-
58
- ## Installation
59
-
60
- ```bash
61
- pip install newcode
62
- ```
63
-
64
- Or with [uv](https://docs.astral.sh/uv/):
65
-
66
- ```bash
67
- uv pip install newcode
68
- ```
69
-
70
- ## Quick Start
71
-
72
- ```bash
73
- # Run the agent
74
- newcode
75
-
76
- # Or use the short alias
77
- nc
78
- ```
79
-
80
- On first run, you'll be guided through a setup wizard to configure your API keys and preferences.
81
-
82
- ## Requirements
83
-
84
- - Python 3.11 - 3.13
85
- - An API key for at least one supported provider (OpenAI, Anthropic, Cerebras, Google Gemini, etc.)
86
-
87
- ## Features
88
-
89
- - Multi-model support: OpenAI, Anthropic Claude, Google Gemini, Cerebras, and more
90
- - Multi-agent workflows with specialized agents (Orchestrator, Tracker, Executor, Reviewer, QA Checker, Workspace Manager, Merger)
91
- - File operations: read, write, edit, delete with diff previews and permission prompts
92
- - Shell command execution with safety controls
93
- - Browser-based terminal via built-in API server
94
- - Scheduled task execution with a background daemon
95
- - Plugin system with lifecycle callbacks and event-based hooks
96
- - Interactive TUI menus for configuration, model selection, and task management
97
- - Session auto-save and restore
98
- - MCP (Model Context Protocol) server support
99
-
100
- ## Configuration
101
-
102
- Configuration is stored in `~/.config/newcode/puppy.cfg` (XDG-compliant paths). The setup wizard handles initial configuration. You can also use CLI commands:
103
-
104
- ```bash
105
- # Inside the agent REPL:
106
- /config # Show current configuration
107
- /model # Switch models
108
- /agent # Switch agents
109
- /scheduler # Manage scheduled tasks
110
- /colors # Customize terminal colors
111
- ```
112
-
113
- ## Agents
114
-
115
- | Agent | Purpose |
116
- |-------|---------|
117
- | Code Agent | General-purpose code generation and modification (default) |
118
- | Orchestrator | Multi-agent workflow coordination |
119
- | Tracker | Code search and navigation |
120
- | Executor | Shell command execution |
121
- | Reviewer | Code review and quality checks |
122
- | QA Checker | Testing and validation |
123
- | Workspace Manager | File system operations |
124
- | Merger | Result integration |
125
- | Python Reviewer | Python-specific code review |
126
- | QA Expert | Testing strategy and quality assurance |
127
- | Security Auditor | Security analysis |
128
-
129
- ## Development
130
-
131
- ```bash
132
- # Clone the repo
133
- git clone https://github.com/janfeddersen-wq/new_code.git
134
- cd new_code
135
-
136
- # Install with dev dependencies
137
- uv pip install -e ".[dev]"
138
-
139
- # Run tests
140
- uv run pytest tests/ -v
141
-
142
- # Lint
143
- ruff check .
144
- ruff format --check .
145
- ```
146
-
147
- ## Credits
148
-
149
- This project is a fork of [code-puppy](https://github.com/mpfaffenberger/newcode) by [Michael Pfaffenberger](https://github.com/mpfaffenberger), licensed under the MIT License. We are grateful for the original work and the open-source foundation it provides.
150
-
151
- ## License
152
-
153
- MIT License - see [LICENSE](LICENSE) for details.