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.
- newcode-0.2.1/PKG-INFO +147 -0
- newcode-0.2.1/README.md +105 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/event_stream_handler.py +1 -1
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/colors_menu.py +2 -2
- {newcode-0.1.16 → newcode-0.2.1}/newcode/config.py +15 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/messaging/rich_renderer.py +33 -21
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/agent_tools.py +2 -2
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/browser/__init__.py +1 -1
- {newcode-0.1.16 → newcode-0.2.1}/pyproject.toml +1 -1
- newcode-0.1.16/PKG-INFO +0 -153
- newcode-0.1.16/README.md +0 -111
- {newcode-0.1.16 → newcode-0.2.1}/.gitignore +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/LICENSE +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/__init__.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/__main__.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/__init__.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_c_reviewer.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_code_agent.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_code_reviewer.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_cpp_reviewer.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_creator_agent.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_golang_reviewer.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_javascript_reviewer.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_manager.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_pack_leader.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_planning.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_python_programmer.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_python_reviewer.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_qa_browser.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_qa_expert.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_scheduler.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_security_auditor.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_terminal_qa.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/agent_typescript_reviewer.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/base_agent.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/json_agent.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/pack/__init__.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/pack/bloodhound.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/pack/husky.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/pack/retriever.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/pack/shepherd.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/pack/terrier.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/pack/watchdog.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/prompt_reviewer.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/agents/subagent_stream_handler.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/api/__init__.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/api/app.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/api/main.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/api/pty_manager.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/api/routers/__init__.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/api/routers/agents.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/api/routers/commands.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/api/routers/config.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/api/routers/sessions.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/api/templates/terminal.html +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/api/websocket.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/callbacks.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/chatgpt_codex_client.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/claude_cache_client.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/cli_runner.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/__init__.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/add_model_menu.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/agent_menu.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/attachments.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/autosave_menu.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/clipboard.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/command_handler.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/command_registry.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/config_commands.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/core_commands.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/diff_menu.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/file_path_completion.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/load_context_completion.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/__init__.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/base.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/catalog_server_installer.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/custom_server_form.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/custom_server_installer.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/edit_command.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/handler.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/help_command.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/install_command.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/install_menu.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/list_command.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/logs_command.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/remove_command.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/restart_command.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/search_command.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/start_all_command.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/start_command.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/status_command.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/stop_all_command.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/stop_command.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/test_command.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/utils.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp/wizard_utils.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/mcp_completion.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/model_picker_completion.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/model_settings_menu.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/motd.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/onboarding_slides.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/onboarding_wizard.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/pin_command_completion.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/prompt_toolkit_completion.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/session_commands.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/skills_completion.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/uc_menu.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/utils.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/command_line/wiggum_state.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/error_logging.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/gemini_code_assist.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/gemini_model.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/hook_engine/README.md +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/hook_engine/__init__.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/hook_engine/aliases.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/hook_engine/engine.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/hook_engine/executor.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/hook_engine/matcher.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/hook_engine/models.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/hook_engine/registry.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/hook_engine/validator.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/http_utils.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/keymap.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/main.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/__init__.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/async_lifecycle.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/blocking_startup.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/captured_stdio_server.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/circuit_breaker.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/config_wizard.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/dashboard.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/error_isolation.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/examples/retry_example.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/health_monitor.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/managed_server.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/manager.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/mcp_logs.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/registry.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/retry_manager.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/server_registry_catalog.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/status_tracker.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_/system_tools.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_prompts/__init__.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/mcp_prompts/hook_creator.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/messaging/__init__.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/messaging/bus.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/messaging/commands.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/messaging/markdown_patches.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/messaging/message_queue.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/messaging/messages.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/messaging/queue_console.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/messaging/renderers.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/messaging/spinner/__init__.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/messaging/spinner/console_spinner.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/messaging/spinner/spinner_base.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/messaging/subagent_console.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/model_factory.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/model_switching.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/model_utils.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/models.json +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/models_dev_api.json +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/models_dev_parser.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/__init__.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/agent_skills/__init__.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/agent_skills/config.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/agent_skills/discovery.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/agent_skills/downloader.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/agent_skills/installer.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/agent_skills/metadata.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/agent_skills/prompt_builder.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/agent_skills/register_callbacks.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/agent_skills/remote_catalog.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/agent_skills/skill_catalog.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/agent_skills/skills_install_menu.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/agent_skills/skills_menu.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/antigravity_oauth/__init__.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/antigravity_oauth/accounts.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/antigravity_oauth/antigravity_model.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/antigravity_oauth/config.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/antigravity_oauth/constants.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/antigravity_oauth/oauth.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/antigravity_oauth/register_callbacks.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/antigravity_oauth/storage.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/antigravity_oauth/test_plugin.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/antigravity_oauth/token.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/antigravity_oauth/transport.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/antigravity_oauth/utils.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/chatgpt_oauth/__init__.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/chatgpt_oauth/config.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/chatgpt_oauth/oauth_flow.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/chatgpt_oauth/register_callbacks.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/chatgpt_oauth/test_plugin.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/chatgpt_oauth/utils.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/claude_code_hooks/__init__.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/claude_code_hooks/config.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/claude_code_hooks/register_callbacks.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/claude_code_oauth/README.md +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/claude_code_oauth/SETUP.md +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/claude_code_oauth/__init__.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/claude_code_oauth/config.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/claude_code_oauth/register_callbacks.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/claude_code_oauth/test_plugin.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/claude_code_oauth/utils.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/customizable_commands/__init__.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/customizable_commands/register_callbacks.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/example_custom_command/README.md +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/example_custom_command/register_callbacks.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/file_permission_handler/__init__.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/file_permission_handler/register_callbacks.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/frontend_emitter/__init__.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/frontend_emitter/emitter.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/frontend_emitter/register_callbacks.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/hook_creator/__init__.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/hook_creator/register_callbacks.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/hook_manager/__init__.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/hook_manager/config.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/hook_manager/hooks_menu.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/hook_manager/register_callbacks.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/oauth_puppy_html.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/scheduler/__init__.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/scheduler/register_callbacks.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/scheduler/scheduler_menu.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/scheduler/scheduler_wizard.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/shell_safety/__init__.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/shell_safety/agent_shell_safety.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/shell_safety/command_cache.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/shell_safety/register_callbacks.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/synthetic_status/__init__.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/synthetic_status/register_callbacks.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/synthetic_status/status_api.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/universal_constructor/__init__.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/universal_constructor/models.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/universal_constructor/register_callbacks.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/universal_constructor/registry.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/plugins/universal_constructor/sandbox.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/prompts/antigravity_system_prompt.md +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/pydantic_patches.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/reopenable_async_client.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/round_robin_model.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/scheduler/__init__.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/scheduler/__main__.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/scheduler/cli.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/scheduler/config.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/scheduler/daemon.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/scheduler/executor.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/scheduler/platform.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/scheduler/platform_unix.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/scheduler/platform_win.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/session_storage.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/status_display.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/summarization_agent.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/terminal_utils.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/__init__.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/ask_user_question/__init__.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/ask_user_question/constants.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/ask_user_question/demo_tui.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/ask_user_question/handler.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/ask_user_question/models.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/ask_user_question/registration.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/ask_user_question/renderers.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/ask_user_question/terminal_ui.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/ask_user_question/theme.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/ask_user_question/tui_loop.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/browser/browser_control.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/browser/browser_interactions.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/browser/browser_locators.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/browser/browser_manager.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/browser/browser_navigation.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/browser/browser_screenshot.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/browser/browser_scripts.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/browser/browser_workflows.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/browser/chromium_terminal_manager.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/browser/terminal_command_tools.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/browser/terminal_screenshot_tools.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/browser/terminal_tools.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/command_runner.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/common.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/display.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/file_modifications.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/file_operations.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/scheduler_tools.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/skills_tools.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/subagent_context.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/tools_content.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/tools/universal_constructor.py +0 -0
- {newcode-0.1.16 → newcode-0.2.1}/newcode/uvx_detection.py +0 -0
- {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).
|
newcode-0.2.1/README.md
ADDED
|
@@ -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}]
|
|
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}]
|
|
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}]
|
|
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
|
-
|
|
184
|
-
|
|
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 (
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
)
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
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(
|
|
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}]
|
|
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.
|
|
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}]
|
|
28
|
+
return f"[{color}]╭──[/{color}] [bold]{text.upper()}[/bold] [{color}]───[/{color}]"
|
|
29
29
|
|
|
30
30
|
|
|
31
31
|
__all__ = [
|
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.
|