stcode 0.0.1a0__tar.gz → 0.0.1a1__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.
- {stcode-0.0.1a0 → stcode-0.0.1a1}/CLAUDE.md +1 -1
- {stcode-0.0.1a0 → stcode-0.0.1a1}/Dockerfile +1 -1
- {stcode-0.0.1a0 → stcode-0.0.1a1}/PKG-INFO +2 -2
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/architecture/harness.md +1 -1
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/getting-started/installation.md +3 -2
- {stcode-0.0.1a0 → stcode-0.0.1a1}/pyproject.toml +2 -2
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/harness/tools/search.py +6 -6
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/core/harness_test.py +22 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/uv.lock +13 -8
- {stcode-0.0.1a0 → stcode-0.0.1a1}/.dockerignore +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/.gitignore +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/LICENSE +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/README.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/architecture/agent-loop.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/architecture/cli.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/architecture/configuration.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/architecture/daemon.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/architecture/index.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/architecture/mcp.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/architecture/providers.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/architecture/session.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/architecture/supervisor.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/architecture/team.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/architecture/tracing.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/contributing/releasing.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/contributing/testing.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/contributing/workflow.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/decisions/0001-tool-search.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/decisions/0002-file-and-image-input.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/decisions/0003-what-the-tui-owns.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/decisions/0004-what-a-remote-client-may-change.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/decisions/0005-an-agent-is-a-config-file.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/decisions/0006-cli-and-core-are-separate-programs.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/decisions/0007-cli-layers.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/decisions/index.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/getting-started/configuration.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/getting-started/quickstart.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/guide/approval-modes.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/guide/mcp.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/guide/repl.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/guide/sessions.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/guide/shapes.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/guide/skills.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/guide/tools.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/guide/tracing.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/guide/tui.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/index.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/sdk/custom-tools.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/sdk/daemon-protocol.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/sdk/embedding.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/sdk/streaming.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/teams/roles.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/teams/setup.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/docs/teams/workflow.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/examples/agents/ba.toml +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/examples/agents/backend-dev.toml +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/examples/agents/devops.toml +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/examples/agents/frontend-dev.toml +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/mkdocs.yml +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/pytest.ini +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/__init__.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/__init__.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/bootstrap.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/labels.py +0 -0
- {stcode-0.0.1a0/stcode/cli/ui/screens/chat → stcode-0.0.1a1/stcode/cli/logic}/__init__.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/logic/commands.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/logic/completion.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/logic/connection.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/logic/requests.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/logic/sessions.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/logic/settings.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/logic/state.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/logic/workspace.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/main.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/models.py +0 -0
- {stcode-0.0.1a0/stcode/cli/ui/screens → stcode-0.0.1a1/stcode/cli/services}/__init__.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/services/client.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/services/launcher.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/services/paths.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/services/preferences.py +0 -0
- {stcode-0.0.1a0/stcode/cli/ui/components → stcode-0.0.1a1/stcode/cli/ui}/__init__.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/ui/app.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/ui/app.tcss +0 -0
- {stcode-0.0.1a0/stcode/cli/ui → stcode-0.0.1a1/stcode/cli/ui/components}/__init__.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/ui/components/banner.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/ui/components/cards.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/ui/components/prompt.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/ui/components/status.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/ui/components/transcript/__init__.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/ui/components/transcript/entries.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/ui/components/transcript/formatting.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/ui/components/transcript/view.py +0 -0
- {stcode-0.0.1a0/stcode/cli/services → stcode-0.0.1a1/stcode/cli/ui/screens}/__init__.py +0 -0
- {stcode-0.0.1a0/stcode/cli/logic → stcode-0.0.1a1/stcode/cli/ui/screens/chat}/__init__.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/ui/screens/chat/chat.tcss +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/ui/screens/chat/presenter.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/ui/screens/chat/screen.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/ui/screens/connect.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/ui/screens/connect.tcss +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/ui/screens/dialog.tcss +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/ui/screens/sessions.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/ui/screens/settings.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/ui/screens/settings.tcss +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/ui/screens/trust.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/cli/ui/theme.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/__main__.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/agent/__init__.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/agent/agent.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/agent/events.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/agent/supervisor.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/agent/task.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/common/__init__.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/common/compat.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/common/ids.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/common/tools.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/common/trace.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/common/truncate.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/configs.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/daemon/__init__.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/daemon/autonomy.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/daemon/main.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/daemon/protocol.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/daemon/runner.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/daemon/server.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/daemon/workspace.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/harness/__init__.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/harness/approvals.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/harness/context.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/harness/errors.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/harness/harness.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/harness/mcp.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/harness/outputs.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/harness/prompts/__init__.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/harness/prompts/execute.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/harness/prompts/plan.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/harness/prompts/sections.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/harness/skills/__init__.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/harness/skills/loader.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/harness/tools/__init__.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/harness/tools/base.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/harness/tools/files.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/harness/tools/interact.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/harness/tools/registry.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/harness/tools/repl.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/harness/tools/schema.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/harness/tools/shell.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/harness/tools/skill.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/harness/tools/todo.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/harness/tools/web.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/providers/__init__.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/providers/anthropic_claude.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/providers/base.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/providers/gateway.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/providers/google_gemini.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/providers/openai_gpt.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/providers/registry.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/providers/types.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/repl/__init__.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/repl/_worker.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/repl/client.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/session/__init__.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/session/session.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/team/__init__.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/team/mailbox.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode/core/team/tools.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/stcode.example.toml +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/cli/architecture_test.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/cli/labels_test.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/cli/logic/completion_test.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/cli/logic/connection_test.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/cli/logic/sessions_test.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/cli/logic/workflows_test.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/cli/main_test.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/cli/services/launcher_test.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/cli/services/preferences_test.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/cli/ui/components/prompt_test.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/cli/ui/components/transcript_test.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/cli/ui/theme_test.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/conftest.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/core/agent_test.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/core/common_test.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/core/configs_test.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/core/daemon_main_test.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/core/daemon_test.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/core/providers_test.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/core/repl_test.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/core/session_test.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/core/team_test.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/core/trace_test.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/core/workspace_discovery_test.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/driving.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/fakes.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/fixtures/workspace/.agents/skills/db-migrations/SKILL.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/fixtures/workspace/.agents/skills/release-notes/SKILL.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/fixtures/workspace/AGENTS.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/fixtures/workspace/README.md +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/fixtures/workspace/config.toml +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/fixtures/workspace/mcp_server.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/fixtures/workspace/src/app.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/fixtures/workspace/src/util.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/integration/conftest.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/integration/conversation_test.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/integration/trace_live_test.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/integration/tui_test.py +0 -0
- {stcode-0.0.1a0 → stcode-0.0.1a1}/tests/integration/workspace_test.py +0 -0
|
@@ -187,7 +187,7 @@ Seven. Each exists because violating it produced a specific, known failure.
|
|
|
187
187
|
| Schemas | `pydantic` v2 | Signature → JSON Schema for free |
|
|
188
188
|
| CLI | `typer` | |
|
|
189
189
|
| Config | `tomllib` (read) + `tomli-w` (write) | Stdlib is read-only; the UI writes config back |
|
|
190
|
-
| Search | `ripgrep` (pip wheel), `fd` (optional) | The wheel
|
|
190
|
+
| Search | `ripgrep-bin` (pip wheel), `fd` (optional) | The wheel installs `rg` without a Rust build on common platforms |
|
|
191
191
|
| Tool schemas | `docstring-parser` | Signature + `Args:` → JSON Schema, described once |
|
|
192
192
|
| MCP | `mcp` (official SDK) | We adapt it; we never reimplement the protocol |
|
|
193
193
|
| Tracing | Direct HTTP JSON with `httpx` | Langfuse and Phoenix; no tracing SDK |
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
FROM python:3.12-slim
|
|
22
22
|
|
|
23
23
|
# git is not optional here: every role clones from /team/repo.git before writing code.
|
|
24
|
-
# ripgrep
|
|
24
|
+
# ripgrep-bin supplies rg with the package, so it is not installed twice.
|
|
25
25
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
26
26
|
git ca-certificates \
|
|
27
27
|
&& rm -rf /var/lib/apt/lists/*
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: stcode
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.1a1
|
|
4
4
|
Summary: A coding agent that lives in a daemon, and a UI that is a client of it.
|
|
5
5
|
Project-URL: Homepage, https://ming-doan.github.io/stcode/
|
|
6
6
|
Project-URL: Documentation, https://ming-doan.github.io/stcode/docs/
|
|
@@ -30,7 +30,7 @@ Requires-Dist: mcp>=2.1.1
|
|
|
30
30
|
Requires-Dist: openai>=3.0.0
|
|
31
31
|
Requires-Dist: pydantic>=2.13.4
|
|
32
32
|
Requires-Dist: python-dotenv>=1.2.3
|
|
33
|
-
Requires-Dist: ripgrep>=15.
|
|
33
|
+
Requires-Dist: ripgrep-bin>=15.2.0
|
|
34
34
|
Requires-Dist: textual>=8.2.8
|
|
35
35
|
Requires-Dist: tomli-w>=1.2.0
|
|
36
36
|
Requires-Dist: tomli>=2.0.1; python_version < '3.11'
|
|
@@ -118,7 +118,7 @@ tool. A call may narrow what it claims, never widen it.
|
|
|
118
118
|
| `bash` | `bash(command, timeout=120, background=False, cwd="", description="")` | **each call is a fresh process**, and the docstring says so |
|
|
119
119
|
| `bash_output` | `bash_output(shell_id, kill=False)` | drains a background shell, new output only |
|
|
120
120
|
| `glob` | `glob(pattern, path=".")` | `fd`, falling back to `rg --files`, then `pathlib` |
|
|
121
|
-
| `grep` | `grep(pattern, path=".", ...)` | ripgrep
|
|
121
|
+
| `grep` | `grep(pattern, path=".", ...)` | ripgrep, installed through `ripgrep-bin` |
|
|
122
122
|
| `ls` | `ls(path)` | `.gitignore`-aware |
|
|
123
123
|
| `todo_write` | `todo_write(items)` | not a real tool — a device to keep the plan in context. Keep it |
|
|
124
124
|
| `ask_user_question` | `ask_user_question(question, options=None, header="", multi_select=False)` | fails clearly with no user attached, rather than hanging |
|
|
@@ -26,8 +26,9 @@ pip install stcode
|
|
|
26
26
|
stcode --version
|
|
27
27
|
```
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
Search is included through `ripgrep-bin`, which supplies prebuilt binaries for
|
|
30
|
+
common Linux and macOS systems. You do not need a separate ripgrep installation
|
|
31
|
+
or a Rust compiler on those platforms.
|
|
31
32
|
|
|
32
33
|
## Run from source
|
|
33
34
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "stcode"
|
|
3
|
-
version = "0.0.
|
|
3
|
+
version = "0.0.1a1"
|
|
4
4
|
description = "A coding agent that lives in a daemon, and a UI that is a client of it."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.10"
|
|
@@ -30,7 +30,7 @@ dependencies = [
|
|
|
30
30
|
"openai>=3.0.0",
|
|
31
31
|
"pydantic>=2.13.4",
|
|
32
32
|
"python-dotenv>=1.2.3",
|
|
33
|
-
"ripgrep>=15.
|
|
33
|
+
"ripgrep-bin>=15.2.0",
|
|
34
34
|
"textual>=8.2.8",
|
|
35
35
|
"tomli>=2.0.1; python_version < '3.11'",
|
|
36
36
|
"tomli-w>=1.2.0",
|
|
@@ -6,9 +6,9 @@ semantics, binary detection, encoding recovery and PCRE2 are each a project's wo
|
|
|
6
6
|
edge cases, and a Python reimplementation gets them wrong in ways that surface as an
|
|
7
7
|
agent confidently reporting a symbol does not exist.
|
|
8
8
|
|
|
9
|
-
`ripgrep`
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
`ripgrep-bin` supplies `rg` in the environment's scripts directory, with prebuilt
|
|
10
|
+
wheels for common platforms. `fd` is optional, so `glob` degrades to `rg --files`,
|
|
11
|
+
then to `pathlib`.
|
|
12
12
|
"""
|
|
13
13
|
|
|
14
14
|
from __future__ import annotations
|
|
@@ -71,7 +71,7 @@ async def run_capture(
|
|
|
71
71
|
def find_binary(name: str) -> str | None:
|
|
72
72
|
"""Locate a helper binary on PATH, or next to the interpreter.
|
|
73
73
|
|
|
74
|
-
The second half is what makes
|
|
74
|
+
The second half is what makes ripgrep-bin work: a wheel-installed binary
|
|
75
75
|
lands beside `python` in the virtualenv, which is on PATH when it is activated and
|
|
76
76
|
not when something invokes `.venv/bin/python` directly.
|
|
77
77
|
"""
|
|
@@ -211,8 +211,8 @@ async def grep(
|
|
|
211
211
|
raise ToolError(f"{target} does not exist.")
|
|
212
212
|
if not _have("rg"):
|
|
213
213
|
raise ToolError(
|
|
214
|
-
"ripgrep (`rg`) could not be found
|
|
215
|
-
"
|
|
214
|
+
"ripgrep (`rg`) could not be found. Reinstall stcode's ripgrep-bin "
|
|
215
|
+
"dependency (`pip install --force-reinstall ripgrep-bin`), or put `rg` on PATH."
|
|
216
216
|
)
|
|
217
217
|
|
|
218
218
|
argv = [find_binary("rg") or "rg", "--no-messages"]
|
|
@@ -357,6 +357,28 @@ def test_grep_reports_no_matches_without_erroring(rt: Runtime[HarnessContext], r
|
|
|
357
357
|
assert not result.is_error and "No matches" in result.content
|
|
358
358
|
|
|
359
359
|
|
|
360
|
+
def test_bundled_search_works_without_a_system_binary_or_activated_environment(
|
|
361
|
+
rt: Runtime[HarnessContext], run: Any, monkeypatch: pytest.MonkeyPatch
|
|
362
|
+
) -> None:
|
|
363
|
+
root = rt.context.cwd
|
|
364
|
+
subprocess.run(["git", "init", "-q", str(root)], check=True)
|
|
365
|
+
(root / ".gitignore").write_text("ignored.py\n", encoding="utf-8")
|
|
366
|
+
(root / "café.py").write_text("message = 'héllo'\n", encoding="utf-8")
|
|
367
|
+
(root / "ignored.py").write_text("message = 'héllo'\n", encoding="utf-8")
|
|
368
|
+
(root / "other.txt").write_text("héllo\n", encoding="utf-8")
|
|
369
|
+
# Invoking a virtualenv's Python directly does not activate its scripts directory.
|
|
370
|
+
monkeypatch.setenv("PATH", "")
|
|
371
|
+
|
|
372
|
+
hits = run(grep.invoke({"pattern": "héllo", "type": "py", "output_mode": "content"}, rt))
|
|
373
|
+
assert not hits.is_error
|
|
374
|
+
assert "café.py:1:message = 'héllo'" in hits.content
|
|
375
|
+
assert "ignored.py" not in hits.content and "other.txt" not in hits.content
|
|
376
|
+
|
|
377
|
+
files = run(glob.invoke({"pattern": "**/*.py"}, rt))
|
|
378
|
+
assert not files.is_error
|
|
379
|
+
assert "café.py" in files.content and "other.txt" not in files.content
|
|
380
|
+
|
|
381
|
+
|
|
360
382
|
def test_ls_marks_directories_and_skips_noise(rt: Runtime[HarnessContext], run: Any) -> None:
|
|
361
383
|
(rt.context.cwd / "src").mkdir()
|
|
362
384
|
(rt.context.cwd / "__pycache__").mkdir()
|
|
@@ -2952,13 +2952,18 @@ wheels = [
|
|
|
2952
2952
|
]
|
|
2953
2953
|
|
|
2954
2954
|
[[package]]
|
|
2955
|
-
name = "ripgrep"
|
|
2956
|
-
version = "15.
|
|
2955
|
+
name = "ripgrep-bin"
|
|
2956
|
+
version = "15.2.0"
|
|
2957
2957
|
source = { registry = "https://pypi.org/simple" }
|
|
2958
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
2958
|
+
sdist = { url = "https://files.pythonhosted.org/packages/d7/be/305c3f0b1a2a69e74635d974c687db245c4f27a978ba46740f8699daec08/ripgrep_bin-15.2.0.tar.gz", hash = "sha256:692e26e280c68cbbbb4efe7d1e2e37ffa74a5cef50c8910eac053da1b309d414", size = 488682, upload-time = "2026-07-16T00:50:36.157Z" }
|
|
2959
2959
|
wheels = [
|
|
2960
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
2961
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
2960
|
+
{ url = "https://files.pythonhosted.org/packages/ae/83/7c7a7a2ec8f9d1e87a62300805c42189ec9256610a7635e7860a9ff1909e/ripgrep_bin-15.2.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:cdb262a09ca747526ec9fb3a9a4f5400cfe0923bcce4e436ef3d1930365b45bc", size = 2130077, upload-time = "2026-07-16T00:50:22.634Z" },
|
|
2961
|
+
{ url = "https://files.pythonhosted.org/packages/00/2e/21879548e11236f7fabe4daa08e7c8397e7ccd3543979806834497032626/ripgrep_bin-15.2.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c3f669ef5bba3a62d826bfecc81b228c849bc2f7206befe2bc2eed89b3baffaf", size = 2092467, upload-time = "2026-07-16T00:50:24.792Z" },
|
|
2962
|
+
{ url = "https://files.pythonhosted.org/packages/81/e1/6f849937cedc3c5a7ab8e1c2472a8ca5f9cb54d6aa2f9baeb1b5398bdb48/ripgrep_bin-15.2.0-py3-none-manylinux_2_28_aarch64.musllinux_1_2_aarch64.whl", hash = "sha256:969e2639ffe692f33fc94e9a197921c16f85f3e16247e20e1dde554cc6f264ba", size = 2071927, upload-time = "2026-07-16T00:50:26.512Z" },
|
|
2963
|
+
{ url = "https://files.pythonhosted.org/packages/39/41/71cf0d754d5422a2700fd8cd656d653655b1c6f50dc3281f182ee70eaab3/ripgrep_bin-15.2.0-py3-none-manylinux_2_28_x86_64.musllinux_1_2_x86_64.whl", hash = "sha256:d9a21aed0ce8b7e40eea1737b37bc8f10b4794afa755269d28512b1007c3ea7f", size = 2308745, upload-time = "2026-07-16T00:50:28.633Z" },
|
|
2964
|
+
{ url = "https://files.pythonhosted.org/packages/f0/39/3f0d53c7febee5ae8d702a17f7eb67ff09c61e0810c219b4b369e064003f/ripgrep_bin-15.2.0-py3-none-manylinux_2_31_riscv64.musllinux_1_2_riscv64.whl", hash = "sha256:78c827b26b396b17a6a07cdbdd001513af6c5f884bc85d994ad0fc4218dca78a", size = 2323944, upload-time = "2026-07-16T00:50:30.575Z" },
|
|
2965
|
+
{ url = "https://files.pythonhosted.org/packages/4e/eb/6e5a8f52c8568f018bc5e2f5f467ec99703023e3430690e507b586c40ada/ripgrep_bin-15.2.0-py3-none-win_amd64.whl", hash = "sha256:f56ddf23f1a53cb61c2b3a72d136f98e271c28e3cb06a4fa2ee06b6304f1a5c9", size = 2124440, upload-time = "2026-07-16T00:50:32.388Z" },
|
|
2966
|
+
{ url = "https://files.pythonhosted.org/packages/66/53/4c5e6463a6b3f5f2bba6a9afda2428003727cb8233383557cfe4f0bc8526/ripgrep_bin-15.2.0-py3-none-win_arm64.whl", hash = "sha256:0fed6501a518cb28641301361210d51b9351cbc867302f9f41978f8b64cb0eb1", size = 2014362, upload-time = "2026-07-16T00:50:34.449Z" },
|
|
2962
2967
|
]
|
|
2963
2968
|
|
|
2964
2969
|
[[package]]
|
|
@@ -3284,7 +3289,7 @@ wheels = [
|
|
|
3284
3289
|
|
|
3285
3290
|
[[package]]
|
|
3286
3291
|
name = "stcode"
|
|
3287
|
-
version = "0.0.
|
|
3292
|
+
version = "0.0.1a1"
|
|
3288
3293
|
source = { editable = "." }
|
|
3289
3294
|
dependencies = [
|
|
3290
3295
|
{ name = "anthropic" },
|
|
@@ -3296,7 +3301,7 @@ dependencies = [
|
|
|
3296
3301
|
{ name = "openai" },
|
|
3297
3302
|
{ name = "pydantic" },
|
|
3298
3303
|
{ name = "python-dotenv" },
|
|
3299
|
-
{ name = "ripgrep" },
|
|
3304
|
+
{ name = "ripgrep-bin" },
|
|
3300
3305
|
{ name = "textual" },
|
|
3301
3306
|
{ name = "tomli", marker = "python_full_version < '3.11'" },
|
|
3302
3307
|
{ name = "tomli-w" },
|
|
@@ -3328,7 +3333,7 @@ requires-dist = [
|
|
|
3328
3333
|
{ name = "openai", specifier = ">=3.0.0" },
|
|
3329
3334
|
{ name = "pydantic", specifier = ">=2.13.4" },
|
|
3330
3335
|
{ name = "python-dotenv", specifier = ">=1.2.3" },
|
|
3331
|
-
{ name = "ripgrep", specifier = ">=15.
|
|
3336
|
+
{ name = "ripgrep-bin", specifier = ">=15.2.0" },
|
|
3332
3337
|
{ name = "textual", specifier = ">=8.2.8" },
|
|
3333
3338
|
{ name = "tomli", marker = "python_full_version < '3.11'", specifier = ">=2.0.1" },
|
|
3334
3339
|
{ name = "tomli-w", specifier = ">=1.2.0" },
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
{stcode-0.0.1a0 → stcode-0.0.1a1}/tests/fixtures/workspace/.agents/skills/db-migrations/SKILL.md
RENAMED
|
File without changes
|
{stcode-0.0.1a0 → stcode-0.0.1a1}/tests/fixtures/workspace/.agents/skills/release-notes/SKILL.md
RENAMED
|
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
|