superqode 0.2.1__tar.gz → 0.2.3__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.
- {superqode-0.2.1 → superqode-0.2.3}/CHANGELOG.md +9 -2
- {superqode-0.2.1/src/superqode.egg-info → superqode-0.2.3}/PKG-INFO +22 -3
- {superqode-0.2.1 → superqode-0.2.3}/README.md +21 -2
- {superqode-0.2.1 → superqode-0.2.3}/pyproject.toml +1 -1
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/__init__.py +1 -1
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/app_main.py +37 -5
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/pure_mode.py +58 -6
- {superqode-0.2.1 → superqode-0.2.3/src/superqode.egg-info}/PKG-INFO +22 -3
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_harness_kernel.py +99 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_tui_smoke.py +86 -0
- {superqode-0.2.1 → superqode-0.2.3}/LICENSE +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/MANIFEST.in +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/examples/README.md +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/examples/byok-acp-team.yaml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/examples/harnesses/coding.yaml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/examples/harnesses/deepagents.yaml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/examples/harnesses/ds4.yaml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/examples/harnesses/gemma4.yaml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/examples/harnesses/google-adk.yaml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/examples/harnesses/local-recursive-dynamic.yaml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/examples/harnesses/no-tool.yaml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/examples/harnesses/omnigent-multi-agent.yaml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/examples/harnesses/openai-agents.yaml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/examples/harnesses/pydanticai.yaml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/examples/local-models-team.yaml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/examples/omnigent-multi-agent.agent.yaml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/examples/simple-team.yaml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/setup.cfg +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/a2a/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/a2a/client.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/a2a/presets.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/a2a/registry.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/a2a/server.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/a2a/skills.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/a2a/tools.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/a2a/types.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/a2a/workflows.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/acp/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/acp/client.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/acp/doctor.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/acp/permission_screen.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/acp/permission_store.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/acp/render.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/acp/session_store.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/acp/slash.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/acp/tool_call_context.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/acp/types.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/acp_discovery.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/auto_memory.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/command_safety.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/compaction.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/context_manager.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/edit_strategies.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/exec_policy.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/hooks.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/loop.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/loop_guard.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/network_policy.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/output_handler.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/parallel_compare.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/peer_agents.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/plan_mode.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/reminders.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/rubric.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/session_manager.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/structured_output.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/summarization.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/system_prompts.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/terminal_output_limits.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/text_tool_calls.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/tool_args.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/tool_tracking.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/utility_model.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent_output.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent_stream.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/acp_registry.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/client.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/agentpool.phil65.github.io.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/ampcode.com.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/augmentcode.com.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/autodev.github.io.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/blackbox.ai.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/bub.dev.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/cagent.dev.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/claude.com.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/cline.bot.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/codeassistant.dev.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/codex.openai.com.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/copilot.github.com.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/crow-ai.dev.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/cursor.com.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/factory.ai.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/fastagent.ai.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/fount.dev.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/geminicli.com.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/goose.block.xyz.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/hermes-agent.nousresearch.com.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/junie.jetbrains.com.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/kimi.moonshot.cn.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/kiro.dev.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/llmlingagent.dev.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/minioncode.dev.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/mistral-vibe.mistral.ai.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/openclaw.ai.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/opencode.ai.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/openhands.dev.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/pi.dev.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/poolside.ai.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/qoder.com.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/qwenlm.github.io.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/sigit.dev.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/stakpak.dev.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/stdiobus.dev.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/vtcode.dev.toml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/discovery.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/free_models.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/messaging.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/official_acp.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/persona.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/registry.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/schema.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/unified.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/app/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/app/constants.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/app/css.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/app/models.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/app/suggester.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/app/theme_bridge.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/app/widgets.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/app_enhanced.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/approval.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/atomic.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/auth/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/benchmarks.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/channels/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/channels/config.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/channels/discord.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/channels/service.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/channels/slack.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/channels/telegram.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/claude.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/codex.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/commands/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/commands/a2a.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/commands/acp.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/commands/agents.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/commands/auth.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/commands/config.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/commands/daemon.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/commands/local.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/commands/providers.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/commands/runtime.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/commands/serve.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/commands/sessions.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/config/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/config/loader.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/config/schema.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/core/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/danger.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/data/eval_fixtures/ci-dynamic-root-cause.log +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/data/eval_fixtures/ci-root-cause.log +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/data/eval_packs/local_dynamic_workflow_smoke.yaml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/data/eval_packs/local_recursive_smoke.yaml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/data/superqode-template.yaml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/design_system.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/dialogs/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/dialogs/base.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/dialogs/model.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/dialogs/provider.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/dialogs/runtime.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/diff_view.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/enterprise.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/evaluation/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/evaluation/adapters.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/evaluation/behaviors.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/evaluation/engine.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/evaluation/scenarios.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/execution/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/execution/linter.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/execution/modes.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/execution/resolver.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/execution/runner.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/file_explorer.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/file_viewer.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/flash.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/accelerator.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/agent_importer.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/approval_memory.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/backends/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/backends/base.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/backends/deepagents.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/backends/managed.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/backends/pydanticai.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/backends/registry.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/backends/runtime.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/compiler.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/context_handles.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/diagnostics.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/eval.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/events.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/explain.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/hooks.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/kernel.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/loader.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/mcp_bridge.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/model_policy.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/observability.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/omnigent_importer.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/optimize.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/output.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/permissions.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/registry.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/sandbox.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/spec.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/store.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/templates.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/testing.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/wizard.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/workflow.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/workflow_presets.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/headless.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/history.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/airplane.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/bench.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/build.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/code_index.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/data/model-packs/devstral.yaml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/data/model-packs/ds4.yaml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/data/model-packs/gemma4.yaml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/data/model-packs/glm.yaml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/data/model-packs/gpt-oss.yaml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/data/model-packs/minimax.yaml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/data/model-packs/qwen-coder.yaml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/data/model-packs/qwen3.yaml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/data/stack_matrix.yaml +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/doctor.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/engines.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/guardrails.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/hardware.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/inventory.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/labs.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/matrix.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/migrate.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/optimize.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/packs.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/repo.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/servers.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/setup.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/smoke.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/logging/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/logging/adapters.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/logging/formatter.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/logging/integration.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/logging/sinks.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/logging/unified_log.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/lsp/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/lsp/client.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/main.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/mcp/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/mcp/auth_storage.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/mcp/client.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/mcp/config.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/mcp/elicitation.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/mcp/harness_server.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/mcp/hf_auth.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/mcp/integration.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/mcp/oauth.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/mcp/oauth_callback.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/mcp/sampling.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/mcp/search.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/mcp/types.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/memory/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/memory/config.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/memory/providers.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/memory/types.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/notifications.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/permissions/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/permissions/rules.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/plan.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/plugins.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/project_trust.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/_builtin_profiles.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/acp_free_models.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/acp_models.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/acp_registry.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/apple_fm.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/catalog.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/connection_profiles.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/credentials.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/dynamic.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/env_introspect.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/free_inference.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/gateway/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/gateway/base.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/gateway/litellm_gateway.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/gateway/openresponses_gateway.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/gateway/synthetic.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/health.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/huggingface/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/huggingface/convert.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/huggingface/downloader.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/huggingface/endpoints.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/huggingface/fetch.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/huggingface/hub.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/huggingface/inference.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/huggingface/transformers_runner.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/live_models.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/local/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/local/_mlx_worker.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/local/base.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/local/context_probe.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/local/discovery.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/local/ds4.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/local/lmstudio.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/local/mlx.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/local/mlx_engine.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/local/mlx_tools.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/local/ollama.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/local/sglang.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/local/smoke.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/local/tgi.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/local/tool_support.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/local/vllm.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/manager.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/model_specs.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/models.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/models_dev.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/opencode_models.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/openresponses/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/openresponses/converters/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/openresponses/converters/messages.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/openresponses/converters/tools.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/openresponses/schema/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/openresponses/schema/models.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/openresponses/streaming/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/openresponses/streaming/parser.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/openresponses/tools/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/openresponses/tools/apply_patch.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/openresponses/tools/code_interpreter.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/openresponses/tools/file_search.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/openresponses/tools/mcp_adapter.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/profiles.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/recommendations.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/registry.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/usage.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/py.typed +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/rendering/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/rendering/html_export.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/rendering/markdown.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/rendering/transcript_export.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/runtime/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/runtime/adk.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/runtime/base.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/runtime/builtin.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/runtime/claude_agent_sdk.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/runtime/codex_sdk.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/runtime/errors.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/runtime/openai_agents.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/runtime/openai_sandbox.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/runtime/openai_session.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/runtime/pydanticai.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/runtime/registry.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/runtime/tool_bridge.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/runtime/tool_bridge_openai.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/runtime/tool_bridge_pydanticai.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/safety/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/safety/sandbox.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/safety/warnings.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/sandbox/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/sandbox/backends.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/sandbox/execution.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/sandbox/local_sandbox.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/search_registry.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/server/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/server/api.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/server/web.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/session/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/session/factory.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/session/persistence.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/session/share_artifacts.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/session/sharing.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/session/switchboard.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/session.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/sidebar.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/skillopt.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/skills.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/stream_view.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/styles/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tool_call.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/agent_tools.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/apply_patch.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/base.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/batch_tool.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/compact_tool.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/context_handle.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/context_tools.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/diagnostics.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/diff_utils.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/display.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/dynamic_workflow.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/edit_tools.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/enhanced_base.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/env_policy.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/file_tools.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/file_tracking.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/harness_agent_session.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/image_tools.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/lsp_tools.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/mcp_tools.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/monty_tool.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/network_tools.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/output_spill.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/peer_agent_tools.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/permissions.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/post_edit.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/question_tool.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/request_permissions_tool.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/search_tools.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/semantic_search.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/shell_session.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/shell_tools.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/skill_tools.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/spawn_harness.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/todo_tools.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/tool_search.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/validation.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/web_tools.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tui_integration.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tui_widgets/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tui_widgets/widgets/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tui_widgets/widgets/progress.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tui_widgets/widgets/tool_display.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/undo_manager.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/utils/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/utils/error_handling.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/utils/fuzzy.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/agent_store.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/agent_switcher.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/animation_manager.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/code_context.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/command_palette.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/connection_status.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/conversation_history.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/diff_indicator.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/enhanced_status_bar.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/enhanced_toast.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/file_browser.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/file_reference.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/leader_key.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/mode_switcher.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/model_picker.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/permission_preview.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/prompt.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/provider_connect.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/pty_shell.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/resizable_sidebar.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/response_changes.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/response_display.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/rewind_overlay.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/rich_tool_display.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/sidebar_panels.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/slash_commands.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/slash_complete.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/split_view.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/status_bar.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/superqode_display.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/theme_picker.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/thinking.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/thinking_display.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/throbber.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/toast.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/unified_output.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/workspace/__init__.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/workspace/artifacts.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/workspace/change_summary.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/workspace/coordinator.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/workspace/diff_tracker.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/workspace/git_guard.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/workspace/git_snapshot.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/workspace/manager.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/workspace/snapshot.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/workspace/watcher.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode/workspace/worktree.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode.egg-info/SOURCES.txt +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode.egg-info/dependency_links.txt +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode.egg-info/entry_points.txt +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode.egg-info/requires.txt +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/src/superqode.egg-info/top_level.txt +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_acp_client.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_acp_free_models.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_acp_parent_tool_linking.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_acp_permission_store.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_acp_registry.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_acp_render.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_acp_session_store.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_acp_slash.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_adaptive_compaction.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_agent_importer.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_agent_loop_harness.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_agent_memory.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_agents_md_compat.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_apply_patch.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_auth.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_bash_spill.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_benchmarks.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_change_summary.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_channels.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_cli_commands.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_cli_connect.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_cli_reference_coverage.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_command_safety.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_commands_runtime.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_compaction.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_config_loader.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_config_runtime.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_connect_setup.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_connection_profiles.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_context_handles.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_context_probe.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_context_remaining.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_create_skill_tool.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_deferred_tools.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_developer_workflow_docs.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_ds4_local_client.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_dynamic_workflow_tool.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_edit_line_number_strip.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_env_introspect.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_execution_resolver.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_final_parity_wave.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_free_models.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_harness_agent_session.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_harness_backends.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_harness_examples.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_harness_explain.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_harness_hooks.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_harness_mcp_server.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_harness_model_policy.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_harness_observability.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_harness_output.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_harness_permissions.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_harness_sandbox.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_harness_seesaw_dimensions.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_harness_spec.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_harness_store.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_harness_wizard.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_harness_workflow.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_headless.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_hf_fetch.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_hooks.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_linter_runner.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_litellm_gateway.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_live_models.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_local_airplane.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_local_build.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_local_code_index.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_local_labs.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_local_migrate.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_local_model_optimizations.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_local_packs.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_local_sandbox.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_local_search.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_local_servers.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_local_setup.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_local_smoke.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_local_stack.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_local_tool_support.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_login_api.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_loop_guard.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_managed_harness_backend.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_markdown_render.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_mcp.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_mcp_integration.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_mcp_live.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_mcp_oauth_generalized.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_mcp_tools_runtime.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_mcp_two_way.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_memory_recall.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_mlx_tools.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_model_profiles.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_model_specs.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_monty_tool.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_network_policy.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_ollama_client.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_omnigent_agent_session_smoke.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_omnigent_importer.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_openai_session.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_output_spill.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_parallel_compare.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_peer_agents.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_plugin_hook_wiring.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_plugins.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_policies_and_turndiff.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_post_edit_verify.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_project_trust.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_provider_catalog.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_provider_dynamic.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_provider_models.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_provider_recommendations.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_pure_mode_sessions.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_rate_limit_retry.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_read_tool_limits.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_reasoning_and_budget.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_recursive_eval_packs.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_runtime_adk.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_runtime_builtin.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_runtime_claude_agent_sdk.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_runtime_codex_sdk.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_runtime_dialog.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_runtime_openai_agents.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_runtime_openai_events.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_runtime_openai_hitl.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_runtime_openai_sandbox.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_runtime_protocol.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_runtime_pydanticai.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_sandbox_backends.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_sandbox_execution.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_search_roots.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_semantic_search.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_session_switchboard.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_shell_session.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_simple_login.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_simple_query_fastpath.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_skillopt.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_slash_runtime.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_spawn_harness_tool.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_steering_continue_reminders.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_synthetic_gateways.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_terminal_output_limits.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_theme_picker.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_todo_tools.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_tool_args_repair.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_tool_batch_safety.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_tool_bridge.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_tool_bridge_openai.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_tool_call_repair.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_tool_output_pruning.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_tool_tracking.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_tools.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_tui_change_summary.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_tui_chat_mode.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_tui_exit.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_tui_llamacpp_connect.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_tui_markdown_cleanup.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_tui_mlx_connect.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_tui_mounted.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_tui_tool_display.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_version.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_view_image.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_web_server_auth.py +0 -0
- {superqode-0.2.1 → superqode-0.2.3}/tests/test_workspace.py +0 -0
|
@@ -7,20 +7,27 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
-
## [0.2.
|
|
10
|
+
## [0.2.3] - 2026-06-24
|
|
11
11
|
|
|
12
12
|
### Added
|
|
13
13
|
|
|
14
14
|
- **TUI harness wizard** - Added a step-by-step `:harness wizard` flow for creating starter HarnessSpec files from the TUI, plus `:harness init` / flag shortcuts using the same wizard builder as the CLI.
|
|
15
15
|
- **TUI CLI parity** - Exposed the remaining CLI command surface in the TUI command list and routed unsupported subcommands through the CLI runner so CLI-only workflows can be launched from the TUI.
|
|
16
|
+
- **First harness documentation** - Documented the TUI and CLI wizard path for creating, loading, checking, and running a first HarnessSpec in a few steps.
|
|
16
17
|
|
|
17
18
|
### Fixed
|
|
18
19
|
|
|
19
20
|
- **Smoke script source checkout support** - Made the Omnigent agent-session smoke script import SuperQode reliably when run directly from a checkout.
|
|
21
|
+
- **Harness model routing** - Made `model_policy.primary` override the active TUI connection for harness runs while preserving valid Ollama model tags such as `*-mlx`.
|
|
22
|
+
- **Harness wizard defaults** - Made Enter-through defaults in the TUI wizard create a runnable Qwen local harness with an explicit `ollama/qwen3-coder` model policy.
|
|
23
|
+
- **Harness wizard final prompt** - Treated `yes`/`no` typed on the output-file step as the final load answer so the wizard no longer stores `yes` as a filename and loops back to the output prompt.
|
|
24
|
+
- **Harness wizard output paths** - Picked the next available default output path such as `harness-2.yaml` when `harness.yaml` already exists, preventing default runs from bouncing back to the output prompt.
|
|
25
|
+
- **Harness wizard loading** - Fixed the final “Load this harness now?” step so loaded harnesses remain visible after reconnect/disconnect state changes, and stale `SUPERQODE_HARNESS` paths no longer crash Pure Mode startup.
|
|
26
|
+
- **Harness streaming** - Forwarded builtin harness `model_delta` events through Pure Mode so TUI harness runs no longer report `chunks=0` when the model did stream content.
|
|
20
27
|
|
|
21
28
|
### Changed
|
|
22
29
|
|
|
23
|
-
- **Release metadata** - Bumped the package version and runtime `__version__` to `0.2.
|
|
30
|
+
- **Release metadata** - Bumped the package version and runtime `__version__` to `0.2.3`.
|
|
24
31
|
|
|
25
32
|
## [0.2.0] - 2026-06-23
|
|
26
33
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: superqode
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.3
|
|
4
4
|
Summary: SuperQode: harness engineering framework for coding agents, optimized for local and open models
|
|
5
5
|
Author-email: Shashi Jagtap <info@super-agentic.ai>
|
|
6
6
|
Maintainer-email: Shashi Jagtap <info@super-agentic.ai>
|
|
@@ -230,7 +230,7 @@ Inside the TUI, the local-first MVP path is:
|
|
|
230
230
|
| File | Purpose | Created by |
|
|
231
231
|
| --- | --- | --- |
|
|
232
232
|
| `superqode.yaml` | Project configuration: providers, endpoints, MCP, memory, defaults | `superqode config init` or `:init` |
|
|
233
|
-
| `harness.yaml` | Portable agent run contract | `superqode harness init ...` |
|
|
233
|
+
| `harness.yaml` | Portable agent run contract | `:harness wizard`, `superqode harness wizard`, or `superqode harness init ...` |
|
|
234
234
|
| `superqode.local.yaml` | Local-first HarnessSpec generated for this machine | `:local init` or `superqode local init --repo .` |
|
|
235
235
|
| `superqode.airplane.yaml` | Strict no-network HarnessSpec for offline local work | `:local airplane prepare` or `superqode local airplane prepare` |
|
|
236
236
|
|
|
@@ -242,7 +242,26 @@ superqode --print "inspect this repository and suggest the smallest next step"
|
|
|
242
242
|
|
|
243
243
|
### Your First Harness Run
|
|
244
244
|
|
|
245
|
-
A harness is the repeatable contract for how an agent run behaves.
|
|
245
|
+
A harness is the repeatable contract for how an agent run behaves. In the TUI, create and load your first harness without writing YAML:
|
|
246
|
+
|
|
247
|
+
```text
|
|
248
|
+
:connect local
|
|
249
|
+
:harness wizard
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
Press Enter through the defaults for a runnable local coding harness, choose an output file, and answer `yes` when asked whether to load it. If `harness.yaml` already exists, the wizard uses the next available path such as `harness-2.yaml`.
|
|
253
|
+
|
|
254
|
+
For the CLI path, start with the interactive wizard or the default coding template:
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
cd your-project
|
|
258
|
+
superqode harness wizard
|
|
259
|
+
superqode harness explain --spec harness.yaml
|
|
260
|
+
superqode harness doctor --spec harness.yaml
|
|
261
|
+
superqode harness run --spec harness.yaml --prompt "summarize the architecture"
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
Template shortcut:
|
|
246
265
|
|
|
247
266
|
```bash
|
|
248
267
|
cd your-project
|
|
@@ -102,7 +102,7 @@ Inside the TUI, the local-first MVP path is:
|
|
|
102
102
|
| File | Purpose | Created by |
|
|
103
103
|
| --- | --- | --- |
|
|
104
104
|
| `superqode.yaml` | Project configuration: providers, endpoints, MCP, memory, defaults | `superqode config init` or `:init` |
|
|
105
|
-
| `harness.yaml` | Portable agent run contract | `superqode harness init ...` |
|
|
105
|
+
| `harness.yaml` | Portable agent run contract | `:harness wizard`, `superqode harness wizard`, or `superqode harness init ...` |
|
|
106
106
|
| `superqode.local.yaml` | Local-first HarnessSpec generated for this machine | `:local init` or `superqode local init --repo .` |
|
|
107
107
|
| `superqode.airplane.yaml` | Strict no-network HarnessSpec for offline local work | `:local airplane prepare` or `superqode local airplane prepare` |
|
|
108
108
|
|
|
@@ -114,7 +114,26 @@ superqode --print "inspect this repository and suggest the smallest next step"
|
|
|
114
114
|
|
|
115
115
|
### Your First Harness Run
|
|
116
116
|
|
|
117
|
-
A harness is the repeatable contract for how an agent run behaves.
|
|
117
|
+
A harness is the repeatable contract for how an agent run behaves. In the TUI, create and load your first harness without writing YAML:
|
|
118
|
+
|
|
119
|
+
```text
|
|
120
|
+
:connect local
|
|
121
|
+
:harness wizard
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Press Enter through the defaults for a runnable local coding harness, choose an output file, and answer `yes` when asked whether to load it. If `harness.yaml` already exists, the wizard uses the next available path such as `harness-2.yaml`.
|
|
125
|
+
|
|
126
|
+
For the CLI path, start with the interactive wizard or the default coding template:
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
cd your-project
|
|
130
|
+
superqode harness wizard
|
|
131
|
+
superqode harness explain --spec harness.yaml
|
|
132
|
+
superqode harness doctor --spec harness.yaml
|
|
133
|
+
superqode harness run --spec harness.yaml --prompt "summarize the architecture"
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Template shortcut:
|
|
118
137
|
|
|
119
138
|
```bash
|
|
120
139
|
cd your-project
|
|
@@ -12007,7 +12007,7 @@ class SuperQodeApp(App):
|
|
|
12007
12007
|
"tool_call_format": "auto",
|
|
12008
12008
|
"workflow_preset": "single",
|
|
12009
12009
|
},
|
|
12010
|
-
"output":
|
|
12010
|
+
"output": self._default_harness_wizard_output(),
|
|
12011
12011
|
"load": True,
|
|
12012
12012
|
"force": False,
|
|
12013
12013
|
}
|
|
@@ -12042,7 +12042,11 @@ class SuperQodeApp(App):
|
|
|
12042
12042
|
answers["name"] = raw
|
|
12043
12043
|
self._harness_wizard_next(state, "starter")
|
|
12044
12044
|
elif step == "starter":
|
|
12045
|
-
starter = self._harness_wizard_choice(
|
|
12045
|
+
starter = self._harness_wizard_choice(
|
|
12046
|
+
raw,
|
|
12047
|
+
[key for key, _ in self._wizard_starters()],
|
|
12048
|
+
default=str(answers.get("starter") or "qwen-coding"),
|
|
12049
|
+
)
|
|
12046
12050
|
if starter is None:
|
|
12047
12051
|
log.add_error("Choose a starter by number or name.")
|
|
12048
12052
|
self._render_harness_wizard_step(log)
|
|
@@ -12126,6 +12130,11 @@ class SuperQodeApp(App):
|
|
|
12126
12130
|
answers["workflow_preset"] = choice
|
|
12127
12131
|
self._harness_wizard_next(state, "output")
|
|
12128
12132
|
elif step == "output":
|
|
12133
|
+
load_answer = self._parse_yes_no(raw) if raw else None
|
|
12134
|
+
if load_answer is not None:
|
|
12135
|
+
state["load"] = load_answer
|
|
12136
|
+
self._finish_harness_wizard_flow(log)
|
|
12137
|
+
return True
|
|
12129
12138
|
if raw:
|
|
12130
12139
|
state["output"] = raw
|
|
12131
12140
|
self._harness_wizard_next(state, "load")
|
|
@@ -12157,6 +12166,17 @@ class SuperQodeApp(App):
|
|
|
12157
12166
|
state.setdefault("history", []).append(state["step"])
|
|
12158
12167
|
state["step"] = next_step
|
|
12159
12168
|
|
|
12169
|
+
@staticmethod
|
|
12170
|
+
def _default_harness_wizard_output() -> str:
|
|
12171
|
+
base = Path("harness.yaml")
|
|
12172
|
+
if not base.exists():
|
|
12173
|
+
return str(base)
|
|
12174
|
+
for index in range(2, 1000):
|
|
12175
|
+
candidate = Path(f"harness-{index}.yaml")
|
|
12176
|
+
if not candidate.exists():
|
|
12177
|
+
return str(candidate)
|
|
12178
|
+
return "harness-new.yaml"
|
|
12179
|
+
|
|
12160
12180
|
@staticmethod
|
|
12161
12181
|
def _parse_yes_no(raw: str) -> bool | None:
|
|
12162
12182
|
lowered = raw.strip().lower()
|
|
@@ -12270,11 +12290,11 @@ class SuperQodeApp(App):
|
|
|
12270
12290
|
default = " (default)" if key == "single" else ""
|
|
12271
12291
|
t.append(f" {index}. {key:<22} {label}{default}\n", style=THEME["text"])
|
|
12272
12292
|
elif step == "output":
|
|
12273
|
-
t.append(" Step 9/
|
|
12293
|
+
t.append(" Step 9/10 Output file\n", style=f"bold {THEME['cyan']}")
|
|
12274
12294
|
t.append(f" Default: {state['output']}\n", style=THEME["muted"])
|
|
12275
12295
|
t.append(" Example: harness.yaml\n", style=THEME["text"])
|
|
12276
12296
|
elif step == "load":
|
|
12277
|
-
t.append("
|
|
12297
|
+
t.append(" Step 10/10 Load this harness now?\n", style=f"bold {THEME['cyan']}")
|
|
12278
12298
|
t.append(" Default: yes\n", style=THEME["muted"])
|
|
12279
12299
|
t.append(" Answer: yes or no\n", style=THEME["text"])
|
|
12280
12300
|
|
|
@@ -12289,7 +12309,10 @@ class SuperQodeApp(App):
|
|
|
12289
12309
|
load_after_write = bool(state.get("load", True))
|
|
12290
12310
|
|
|
12291
12311
|
if output.exists() and not state.get("force", False):
|
|
12292
|
-
|
|
12312
|
+
state["output"] = self._default_harness_wizard_output()
|
|
12313
|
+
log.add_error(
|
|
12314
|
+
f"{output} already exists. Suggested next available path: {state['output']}"
|
|
12315
|
+
)
|
|
12293
12316
|
state["step"] = "output"
|
|
12294
12317
|
self._render_harness_wizard_step(log)
|
|
12295
12318
|
return
|
|
@@ -14849,6 +14872,15 @@ class SuperQodeApp(App):
|
|
|
14849
14872
|
|
|
14850
14873
|
provider = self._pure_mode.session.provider
|
|
14851
14874
|
model = self._pure_mode.session.model
|
|
14875
|
+
if getattr(self._pure_mode, "harness_enabled", False) and hasattr(
|
|
14876
|
+
self._pure_mode, "_resolve_harness_route"
|
|
14877
|
+
):
|
|
14878
|
+
try:
|
|
14879
|
+
provider, model = self._pure_mode._resolve_harness_route()
|
|
14880
|
+
except Exception:
|
|
14881
|
+
# Let the run path raise the user-facing error with full context.
|
|
14882
|
+
provider = self._pure_mode.session.provider
|
|
14883
|
+
model = self._pure_mode.session.model
|
|
14852
14884
|
plan_mode_for_run = bool(getattr(self, "_active_plan_mode_for_current_message", False))
|
|
14853
14885
|
if plan_mode_for_run:
|
|
14854
14886
|
text = (
|
|
@@ -22,7 +22,11 @@ from .agent.system_prompts import SystemPromptLevel
|
|
|
22
22
|
from .agent.session_manager import SessionManager, SessionMetadata
|
|
23
23
|
from .tools.base import ToolRegistry, ToolResult
|
|
24
24
|
from .providers.gateway.litellm_gateway import LiteLLMGateway
|
|
25
|
-
from .providers.model_specs import
|
|
25
|
+
from .providers.model_specs import (
|
|
26
|
+
normalize_model_for_provider,
|
|
27
|
+
normalize_provider_id,
|
|
28
|
+
split_provider_model_ref,
|
|
29
|
+
)
|
|
26
30
|
from .providers.registry import PROVIDERS, ProviderTier, ProviderCategory
|
|
27
31
|
from .runtime import AgentRuntime, create_runtime, resolve_runtime_name
|
|
28
32
|
|
|
@@ -87,6 +91,8 @@ class PureMode:
|
|
|
87
91
|
path = os.getenv("SUPERQODE_HARNESS", "").strip()
|
|
88
92
|
if not path:
|
|
89
93
|
return
|
|
94
|
+
if not Path(path).expanduser().exists():
|
|
95
|
+
return
|
|
90
96
|
self.load_harness(path)
|
|
91
97
|
|
|
92
98
|
def load_harness(self, path: str | Path):
|
|
@@ -99,6 +105,7 @@ class PureMode:
|
|
|
99
105
|
self._harness_kernel = None
|
|
100
106
|
self._harness_session = None
|
|
101
107
|
self._harness_session_id = ""
|
|
108
|
+
self._sync_harness_session_fields()
|
|
102
109
|
return self._harness_spec
|
|
103
110
|
|
|
104
111
|
def set_harness(self, spec, *, path: str | Path | None = None) -> None:
|
|
@@ -108,6 +115,7 @@ class PureMode:
|
|
|
108
115
|
self._harness_kernel = None
|
|
109
116
|
self._harness_session = None
|
|
110
117
|
self._harness_session_id = ""
|
|
118
|
+
self._sync_harness_session_fields()
|
|
111
119
|
|
|
112
120
|
def clear_harness(self) -> None:
|
|
113
121
|
"""Return to direct runtime mode."""
|
|
@@ -116,11 +124,52 @@ class PureMode:
|
|
|
116
124
|
self._harness_kernel = None
|
|
117
125
|
self._harness_session = None
|
|
118
126
|
self._harness_session_id = ""
|
|
127
|
+
self.session.harness_name = ""
|
|
128
|
+
self.session.harness_path = ""
|
|
129
|
+
self.session.harness_flavor = ""
|
|
130
|
+
self.session.harness_runtime = ""
|
|
131
|
+
|
|
132
|
+
def _sync_harness_session_fields(self) -> None:
|
|
133
|
+
"""Mirror the loaded HarnessSpec into user-visible session status."""
|
|
134
|
+
if self._harness_spec is None:
|
|
135
|
+
self.session.harness_name = ""
|
|
136
|
+
self.session.harness_path = ""
|
|
137
|
+
self.session.harness_flavor = ""
|
|
138
|
+
self.session.harness_runtime = ""
|
|
139
|
+
return
|
|
140
|
+
self.session.harness_name = self._harness_spec.name
|
|
141
|
+
self.session.harness_path = self._harness_path
|
|
142
|
+
self.session.harness_flavor = self._harness_spec.flavor.value
|
|
143
|
+
self.session.harness_runtime = self._harness_spec.runtime.backend
|
|
119
144
|
|
|
120
145
|
@property
|
|
121
146
|
def harness_enabled(self) -> bool:
|
|
122
147
|
return self._harness_spec is not None
|
|
123
148
|
|
|
149
|
+
def _resolve_harness_route(self) -> tuple[str, str]:
|
|
150
|
+
"""Return the provider/model the active harness should run against."""
|
|
151
|
+
provider = self.session.provider
|
|
152
|
+
model = self.session.model
|
|
153
|
+
if self._harness_spec is None:
|
|
154
|
+
return provider, model
|
|
155
|
+
|
|
156
|
+
primary = str(getattr(self._harness_spec.model_policy, "primary", "") or "").strip()
|
|
157
|
+
configured_provider = str(
|
|
158
|
+
getattr(self._harness_spec.model_policy, "config", {}).get("provider") or ""
|
|
159
|
+
).strip()
|
|
160
|
+
if primary:
|
|
161
|
+
parsed = split_provider_model_ref(primary, default_provider=configured_provider)
|
|
162
|
+
provider = normalize_provider_id(parsed.provider or configured_provider or provider)
|
|
163
|
+
model = normalize_model_for_provider(provider, parsed.model or primary)
|
|
164
|
+
|
|
165
|
+
self._validate_harness_route(provider, model)
|
|
166
|
+
return provider, model
|
|
167
|
+
|
|
168
|
+
@staticmethod
|
|
169
|
+
def _validate_harness_route(provider: str, model: str) -> None:
|
|
170
|
+
"""Catch common local provider/model mismatches before streaming."""
|
|
171
|
+
return
|
|
172
|
+
|
|
124
173
|
def get_providers_for_picker(self) -> List[Dict[str, Any]]:
|
|
125
174
|
"""Get providers formatted for the TUI picker."""
|
|
126
175
|
providers = []
|
|
@@ -271,6 +320,7 @@ class PureMode:
|
|
|
271
320
|
self._harness_kernel = None
|
|
272
321
|
self._harness_session = None
|
|
273
322
|
self._harness_session_id = ""
|
|
323
|
+
self._sync_harness_session_fields()
|
|
274
324
|
|
|
275
325
|
def set_system_level(self, level: SystemPromptLevel):
|
|
276
326
|
"""Change the system prompt level."""
|
|
@@ -282,11 +332,12 @@ class PureMode:
|
|
|
282
332
|
async def run(self, prompt: str, plan_mode: Optional[bool] = None) -> AgentResponse:
|
|
283
333
|
"""Run a task in Pure Mode."""
|
|
284
334
|
if self._harness_spec is not None:
|
|
335
|
+
provider, model = self._resolve_harness_route()
|
|
285
336
|
session = await self._ensure_harness_session()
|
|
286
337
|
result = await session.prompt(
|
|
287
338
|
prompt,
|
|
288
|
-
provider=
|
|
289
|
-
model=
|
|
339
|
+
provider=provider,
|
|
340
|
+
model=model,
|
|
290
341
|
working_directory=self.session.working_directory,
|
|
291
342
|
runtime=self._harness_spec.runtime.backend,
|
|
292
343
|
)
|
|
@@ -336,15 +387,16 @@ class PureMode:
|
|
|
336
387
|
async def run_streaming(self, prompt: str, plan_mode: Optional[bool] = None):
|
|
337
388
|
"""Run a task with streaming output."""
|
|
338
389
|
if self._harness_spec is not None:
|
|
390
|
+
provider, model = self._resolve_harness_route()
|
|
339
391
|
session = await self._ensure_harness_session()
|
|
340
392
|
async for event in session.stream(
|
|
341
393
|
prompt,
|
|
342
|
-
provider=
|
|
343
|
-
model=
|
|
394
|
+
provider=provider,
|
|
395
|
+
model=model,
|
|
344
396
|
working_directory=self.session.working_directory,
|
|
345
397
|
runtime=self._harness_spec.runtime.backend,
|
|
346
398
|
):
|
|
347
|
-
if event.type
|
|
399
|
+
if event.type not in {"delta", "model_delta"}:
|
|
348
400
|
continue
|
|
349
401
|
chunk = str(event.data.get("text", ""))
|
|
350
402
|
if self.on_stream_chunk:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: superqode
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.3
|
|
4
4
|
Summary: SuperQode: harness engineering framework for coding agents, optimized for local and open models
|
|
5
5
|
Author-email: Shashi Jagtap <info@super-agentic.ai>
|
|
6
6
|
Maintainer-email: Shashi Jagtap <info@super-agentic.ai>
|
|
@@ -230,7 +230,7 @@ Inside the TUI, the local-first MVP path is:
|
|
|
230
230
|
| File | Purpose | Created by |
|
|
231
231
|
| --- | --- | --- |
|
|
232
232
|
| `superqode.yaml` | Project configuration: providers, endpoints, MCP, memory, defaults | `superqode config init` or `:init` |
|
|
233
|
-
| `harness.yaml` | Portable agent run contract | `superqode harness init ...` |
|
|
233
|
+
| `harness.yaml` | Portable agent run contract | `:harness wizard`, `superqode harness wizard`, or `superqode harness init ...` |
|
|
234
234
|
| `superqode.local.yaml` | Local-first HarnessSpec generated for this machine | `:local init` or `superqode local init --repo .` |
|
|
235
235
|
| `superqode.airplane.yaml` | Strict no-network HarnessSpec for offline local work | `:local airplane prepare` or `superqode local airplane prepare` |
|
|
236
236
|
|
|
@@ -242,7 +242,26 @@ superqode --print "inspect this repository and suggest the smallest next step"
|
|
|
242
242
|
|
|
243
243
|
### Your First Harness Run
|
|
244
244
|
|
|
245
|
-
A harness is the repeatable contract for how an agent run behaves.
|
|
245
|
+
A harness is the repeatable contract for how an agent run behaves. In the TUI, create and load your first harness without writing YAML:
|
|
246
|
+
|
|
247
|
+
```text
|
|
248
|
+
:connect local
|
|
249
|
+
:harness wizard
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
Press Enter through the defaults for a runnable local coding harness, choose an output file, and answer `yes` when asked whether to load it. If `harness.yaml` already exists, the wizard uses the next available path such as `harness-2.yaml`.
|
|
253
|
+
|
|
254
|
+
For the CLI path, start with the interactive wizard or the default coding template:
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
cd your-project
|
|
258
|
+
superqode harness wizard
|
|
259
|
+
superqode harness explain --spec harness.yaml
|
|
260
|
+
superqode harness doctor --spec harness.yaml
|
|
261
|
+
superqode harness run --spec harness.yaml --prompt "summarize the architecture"
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
Template shortcut:
|
|
246
265
|
|
|
247
266
|
```bash
|
|
248
267
|
cd your-project
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"""Tests for the minimal v2 HarnessKernel."""
|
|
2
2
|
|
|
3
|
+
from dataclasses import replace
|
|
3
4
|
from pathlib import Path
|
|
4
5
|
|
|
5
6
|
from pydantic import BaseModel
|
|
@@ -10,6 +11,7 @@ from superqode.harness import (
|
|
|
10
11
|
FileHarnessStore,
|
|
11
12
|
HarnessBackendResult,
|
|
12
13
|
HarnessFlavor,
|
|
14
|
+
ModelPolicySpec,
|
|
13
15
|
get_harness_template,
|
|
14
16
|
init_harness,
|
|
15
17
|
)
|
|
@@ -151,6 +153,16 @@ class FakeApprovalBackend(FakeBackend):
|
|
|
151
153
|
)
|
|
152
154
|
|
|
153
155
|
|
|
156
|
+
class FakeModelDeltaBackend:
|
|
157
|
+
async def stream(self, request):
|
|
158
|
+
from superqode.harness import HarnessEvent
|
|
159
|
+
|
|
160
|
+
yield HarnessEvent(type="model_request", data={"runtime": "fake"})
|
|
161
|
+
yield HarnessEvent(type="model_delta", data={"text": "hello"})
|
|
162
|
+
yield HarnessEvent(type="model_delta", data={"text": "-streamed"})
|
|
163
|
+
yield HarnessEvent(type="end", data={"runtime": "fake"})
|
|
164
|
+
|
|
165
|
+
|
|
154
166
|
@pytest.mark.asyncio
|
|
155
167
|
async def test_no_tool_kernel_runs_with_empty_registry(monkeypatch, tmp_path: Path):
|
|
156
168
|
backend = FakeBackend()
|
|
@@ -308,6 +320,93 @@ async def test_pure_mode_can_stream_through_harness_spec(monkeypatch, tmp_path:
|
|
|
308
320
|
assert status["harness"]["name"] == spec.name
|
|
309
321
|
|
|
310
322
|
|
|
323
|
+
@pytest.mark.asyncio
|
|
324
|
+
async def test_pure_mode_harness_primary_overrides_active_connection(monkeypatch, tmp_path: Path):
|
|
325
|
+
from superqode.pure_mode import PureMode
|
|
326
|
+
|
|
327
|
+
created = {}
|
|
328
|
+
|
|
329
|
+
def fake_create_runtime(name, **kwargs):
|
|
330
|
+
created["config"] = kwargs["config"]
|
|
331
|
+
return FakeRuntime(**kwargs)
|
|
332
|
+
|
|
333
|
+
monkeypatch.setattr("superqode.harness.backends.runtime.create_runtime", fake_create_runtime)
|
|
334
|
+
spec = replace(
|
|
335
|
+
get_harness_template("no-tool"),
|
|
336
|
+
model_policy=ModelPolicySpec(primary="mlx/qwen3.6:35b-mlx"),
|
|
337
|
+
)
|
|
338
|
+
pure = PureMode()
|
|
339
|
+
pure.set_harness(spec)
|
|
340
|
+
assert pure.connect("ollama", "qwen3.6:35b-a3b", working_directory=tmp_path)
|
|
341
|
+
|
|
342
|
+
chunks = [chunk async for chunk in pure.run_streaming("hello")]
|
|
343
|
+
|
|
344
|
+
assert "".join(chunks) == "hello-streamed"
|
|
345
|
+
assert created["config"].provider == "mlx"
|
|
346
|
+
assert created["config"].model == "qwen3.6:35b-mlx"
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
def test_pure_mode_harness_allows_ollama_mlx_tagged_model(tmp_path: Path):
|
|
350
|
+
from superqode.pure_mode import PureMode
|
|
351
|
+
|
|
352
|
+
pure = PureMode()
|
|
353
|
+
pure.set_harness(get_harness_template("no-tool"))
|
|
354
|
+
assert pure.connect("ollama", "qwen3.6:35b-mlx", working_directory=tmp_path)
|
|
355
|
+
|
|
356
|
+
provider, model = pure._resolve_harness_route()
|
|
357
|
+
|
|
358
|
+
assert provider == "ollama"
|
|
359
|
+
assert model == "qwen3.6:35b-mlx"
|
|
360
|
+
|
|
361
|
+
|
|
362
|
+
def test_pure_mode_set_harness_updates_visible_status(tmp_path: Path):
|
|
363
|
+
from superqode.pure_mode import PureMode
|
|
364
|
+
|
|
365
|
+
spec = get_harness_template("qwen-coding")
|
|
366
|
+
pure = PureMode()
|
|
367
|
+
pure.set_harness(spec, path=tmp_path / "harness.yaml")
|
|
368
|
+
|
|
369
|
+
status = pure.get_status()["harness"]
|
|
370
|
+
assert status["enabled"] is True
|
|
371
|
+
assert status["name"] == "qwen-coding"
|
|
372
|
+
assert status["path"].endswith("harness.yaml")
|
|
373
|
+
assert status["flavor"] == "coding"
|
|
374
|
+
assert status["runtime"] == "builtin"
|
|
375
|
+
|
|
376
|
+
|
|
377
|
+
def test_pure_mode_disconnect_preserves_loaded_harness_status(tmp_path: Path):
|
|
378
|
+
from superqode.pure_mode import PureMode
|
|
379
|
+
|
|
380
|
+
spec = get_harness_template("qwen-coding")
|
|
381
|
+
pure = PureMode()
|
|
382
|
+
pure.set_harness(spec, path=tmp_path / "harness.yaml")
|
|
383
|
+
assert pure.connect("ollama", "qwen3-coder", working_directory=tmp_path)
|
|
384
|
+
|
|
385
|
+
pure.disconnect()
|
|
386
|
+
|
|
387
|
+
status = pure.get_status()["harness"]
|
|
388
|
+
assert status["enabled"] is True
|
|
389
|
+
assert status["name"] == "qwen-coding"
|
|
390
|
+
assert status["path"].endswith("harness.yaml")
|
|
391
|
+
|
|
392
|
+
|
|
393
|
+
@pytest.mark.asyncio
|
|
394
|
+
async def test_pure_mode_harness_stream_forwards_model_delta_events(monkeypatch, tmp_path: Path):
|
|
395
|
+
from superqode.pure_mode import PureMode
|
|
396
|
+
|
|
397
|
+
monkeypatch.setattr(
|
|
398
|
+
"superqode.harness.kernel.create_harness_backend",
|
|
399
|
+
lambda name: FakeModelDeltaBackend(),
|
|
400
|
+
)
|
|
401
|
+
pure = PureMode()
|
|
402
|
+
pure.set_harness(get_harness_template("qwen-coding"), path=tmp_path / "harness.yaml")
|
|
403
|
+
assert pure.connect("ollama", "qwen3-coder", working_directory=tmp_path)
|
|
404
|
+
|
|
405
|
+
chunks = [chunk async for chunk in pure.run_streaming("hello")]
|
|
406
|
+
|
|
407
|
+
assert chunks == ["hello", "-streamed"]
|
|
408
|
+
|
|
409
|
+
|
|
311
410
|
@pytest.mark.asyncio
|
|
312
411
|
async def test_pure_mode_resumes_harness_approval(monkeypatch, tmp_path: Path):
|
|
313
412
|
from superqode.pure_mode import PureMode
|
|
@@ -1213,6 +1213,92 @@ def test_tui_harness_wizard_guided_steps_write_and_load_spec(tmp_path, monkeypat
|
|
|
1213
1213
|
assert app._pure_mode.harness_enabled
|
|
1214
1214
|
|
|
1215
1215
|
|
|
1216
|
+
def test_tui_harness_wizard_enter_defaults_create_runnable_spec(tmp_path, monkeypatch):
|
|
1217
|
+
monkeypatch.chdir(tmp_path)
|
|
1218
|
+
app = make_app()
|
|
1219
|
+
log = FakeLog()
|
|
1220
|
+
app._show_command_output = lambda target_log, content, clear_log=True: target_log.write(content)
|
|
1221
|
+
|
|
1222
|
+
app._harness_cmd("wizard", log)
|
|
1223
|
+
for _ in range(10):
|
|
1224
|
+
app._handle_harness_wizard_input("", log)
|
|
1225
|
+
|
|
1226
|
+
spec = load_harness_spec(tmp_path / "harness.yaml")
|
|
1227
|
+
assert spec.name == "my-harness"
|
|
1228
|
+
assert spec.metadata["template"] == "qwen-coding"
|
|
1229
|
+
assert spec.model_policy.primary == "ollama/qwen3-coder"
|
|
1230
|
+
assert spec.model_policy.pack == "qwen-coder"
|
|
1231
|
+
assert app._awaiting_harness_wizard is False
|
|
1232
|
+
assert app._pure_mode is not None
|
|
1233
|
+
assert app._pure_mode.harness_enabled
|
|
1234
|
+
|
|
1235
|
+
|
|
1236
|
+
def test_tui_harness_wizard_final_yes_loads_and_exits(tmp_path, monkeypatch):
|
|
1237
|
+
monkeypatch.chdir(tmp_path)
|
|
1238
|
+
app = make_app()
|
|
1239
|
+
log = FakeLog()
|
|
1240
|
+
app._show_command_output = lambda target_log, content, clear_log=True: target_log.write(content)
|
|
1241
|
+
|
|
1242
|
+
app._harness_cmd("wizard", log)
|
|
1243
|
+
for _ in range(9):
|
|
1244
|
+
app._handle_harness_wizard_input("", log)
|
|
1245
|
+
assert "Load this harness now" in render_plain(log.items[-1])
|
|
1246
|
+
|
|
1247
|
+
app._handle_harness_wizard_input("yes", log)
|
|
1248
|
+
|
|
1249
|
+
assert app._awaiting_harness_wizard is False
|
|
1250
|
+
assert app._harness_wizard_state is None
|
|
1251
|
+
assert app._pure_mode is not None
|
|
1252
|
+
status = app._pure_mode.get_status()["harness"]
|
|
1253
|
+
assert status["enabled"] is True
|
|
1254
|
+
assert status["name"] == "my-harness"
|
|
1255
|
+
assert status["path"].endswith("harness.yaml")
|
|
1256
|
+
rendered = "\n".join(render_plain(item) if not isinstance(item, str) else item for item in log.items)
|
|
1257
|
+
assert "Loaded harness my-harness" in rendered
|
|
1258
|
+
|
|
1259
|
+
|
|
1260
|
+
def test_tui_harness_wizard_yes_on_output_step_loads_default_path(tmp_path, monkeypatch):
|
|
1261
|
+
monkeypatch.chdir(tmp_path)
|
|
1262
|
+
app = make_app()
|
|
1263
|
+
log = FakeLog()
|
|
1264
|
+
app._show_command_output = lambda target_log, content, clear_log=True: target_log.write(content)
|
|
1265
|
+
|
|
1266
|
+
app._harness_cmd("wizard", log)
|
|
1267
|
+
for _ in range(8):
|
|
1268
|
+
app._handle_harness_wizard_input("", log)
|
|
1269
|
+
assert "Output file" in render_plain(log.items[-1])
|
|
1270
|
+
|
|
1271
|
+
app._handle_harness_wizard_input("yes", log)
|
|
1272
|
+
|
|
1273
|
+
assert (tmp_path / "harness.yaml").exists()
|
|
1274
|
+
assert not (tmp_path / "yes").exists()
|
|
1275
|
+
assert app._awaiting_harness_wizard is False
|
|
1276
|
+
assert app._harness_wizard_state is None
|
|
1277
|
+
assert app._pure_mode is not None
|
|
1278
|
+
status = app._pure_mode.get_status()["harness"]
|
|
1279
|
+
assert status["enabled"] is True
|
|
1280
|
+
assert status["path"].endswith("harness.yaml")
|
|
1281
|
+
|
|
1282
|
+
|
|
1283
|
+
def test_tui_harness_wizard_defaults_use_next_available_output(tmp_path, monkeypatch):
|
|
1284
|
+
monkeypatch.chdir(tmp_path)
|
|
1285
|
+
(tmp_path / "harness.yaml").write_text("existing: true\n")
|
|
1286
|
+
app = make_app()
|
|
1287
|
+
log = FakeLog()
|
|
1288
|
+
app._show_command_output = lambda target_log, content, clear_log=True: target_log.write(content)
|
|
1289
|
+
|
|
1290
|
+
app._harness_cmd("wizard", log)
|
|
1291
|
+
for _ in range(10):
|
|
1292
|
+
app._handle_harness_wizard_input("", log)
|
|
1293
|
+
|
|
1294
|
+
assert (tmp_path / "harness-2.yaml").exists()
|
|
1295
|
+
assert (tmp_path / "harness.yaml").read_text() == "existing: true\n"
|
|
1296
|
+
assert app._awaiting_harness_wizard is False
|
|
1297
|
+
status = app._pure_mode.get_status()["harness"]
|
|
1298
|
+
assert status["enabled"] is True
|
|
1299
|
+
assert status["path"].endswith("harness-2.yaml")
|
|
1300
|
+
|
|
1301
|
+
|
|
1216
1302
|
def test_tui_help_surfaces_developer_workflows():
|
|
1217
1303
|
app = make_app()
|
|
1218
1304
|
log = FakeLog()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|