crow-cli 0.1.40__tar.gz → 0.1.41__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.
- crow_cli-0.1.41/.env.example +2 -0
- crow_cli-0.1.41/.github/workflows/build-binaries.yml +101 -0
- crow_cli-0.1.41/.github/workflows/publish-crow-cli.yml +42 -0
- crow_cli-0.1.41/.python-version +1 -0
- crow_cli-0.1.41/AGENTS.md +30 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41}/PKG-INFO +1 -1
- crow_cli-0.1.41/PLAN.md +187 -0
- crow_cli-0.1.41/PYINSTALLER_BUILD.md +112 -0
- crow_cli-0.1.41/TERMINAL_STACK.md +120 -0
- crow_cli-0.1.41/TODO.md +74 -0
- crow_cli-0.1.41/agent.json +39 -0
- crow_cli-0.1.41/crow-cli.spec +95 -0
- crow_cli-0.1.41/dev-crow-2.yaml +17 -0
- crow_cli-0.1.41/docs/CNAME +2 -0
- crow_cli-0.1.41/docs/crow-cli-docs/getting-started/installation.md +32 -0
- crow_cli-0.1.41/docs/crow-cli-docs/getting-started/quickstart.md +63 -0
- crow_cli-0.1.41/docs/crow-cli-docs/index.md +58 -0
- crow_cli-0.1.41/docs/crow-cli-docs/memory-tool-design.md +294 -0
- crow_cli-0.1.41/docs/crow-cli-docs/myst.yml +19 -0
- crow_cli-0.1.41/docs/crow-cli-docs/styles/purple.css +118 -0
- crow_cli-0.1.41/docs/crow-logo.svg +19 -0
- crow_cli-0.1.41/docs/get-llamacpp-working.md +1112 -0
- crow_cli-0.1.41/docs/getting-started/installation.md +32 -0
- crow_cli-0.1.41/docs/getting-started/quickstart.md +57 -0
- crow_cli-0.1.41/docs/icon.ico +0 -0
- crow_cli-0.1.41/docs/img/crow-icon-purple.svg +51 -0
- crow_cli-0.1.41/docs/img/crow-logo-crop.png +0 -0
- crow_cli-0.1.41/docs/img/icon.svg +9 -0
- crow_cli-0.1.41/docs/img/whiteboard_capture.png +0 -0
- crow_cli-0.1.41/docs/index.html +715 -0
- crow_cli-0.1.41/docs/index.md +40 -0
- crow_cli-0.1.41/docs/journal/03May2026.md +8 -0
- crow_cli-0.1.41/docs/journal/19Feb2026.md +46 -0
- crow_cli-0.1.41/docs/journal/20Feb2026.md +15 -0
- crow_cli-0.1.41/docs/journal/22Feb2026.md +91 -0
- crow_cli-0.1.41/docs/journal/29Aug2026.md +7 -0
- crow_cli-0.1.41/docs/llm-wiki.md +75 -0
- crow_cli-0.1.41/docs/myst.yml +19 -0
- crow_cli-0.1.41/docs/styles/purple.css +118 -0
- crow_cli-0.1.41/examples/mc_escher_loop.py +49 -0
- crow_cli-0.1.41/examples/quick_test.py +75 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41}/pyproject.toml +1 -19
- crow_cli-0.1.41/run_tests.sh +5 -0
- crow_cli-0.1.41/sandbox/agent-client/.python-version +1 -0
- crow_cli-0.1.41/sandbox/agent-client/README.md +309 -0
- crow_cli-0.1.41/sandbox/agent-client/SUCCESS.md +90 -0
- crow_cli-0.1.41/sandbox/agent-client/TODO.md +50 -0
- crow_cli-0.1.41/sandbox/agent-client/agent_client.py +867 -0
- crow_cli-0.1.41/sandbox/agent-client/echo_agent.py +85 -0
- crow_cli-0.1.41/sandbox/agent-client/fire_up_echo.py +71 -0
- crow_cli-0.1.41/sandbox/agent-client/fire_up_simple.py +58 -0
- crow_cli-0.1.41/sandbox/agent-client/main.py +6 -0
- crow_cli-0.1.41/sandbox/agent-client/pyproject.toml +11 -0
- crow_cli-0.1.41/sandbox/agent-client/run_bridge.py +79 -0
- crow_cli-0.1.41/sandbox/agent-client/simple_agent.py +111 -0
- crow_cli-0.1.41/sandbox/agent-client/stdio_to_ws.py +220 -0
- crow_cli-0.1.41/sandbox/agent-client/test_acp_ws_client.py +64 -0
- crow_cli-0.1.41/sandbox/agent-client/test_agent_client.py +74 -0
- crow_cli-0.1.41/sandbox/agent-client/test_bridge.py +48 -0
- crow_cli-0.1.41/sandbox/agent-client/test_bridge_and_client.py +193 -0
- crow_cli-0.1.41/sandbox/agent-client/test_bridge_direct.py +92 -0
- crow_cli-0.1.41/sandbox/agent-client/test_client.py +261 -0
- crow_cli-0.1.41/sandbox/agent-client/test_date_terminal.py +277 -0
- crow_cli-0.1.41/sandbox/agent-client/test_echo_agent.py +51 -0
- crow_cli-0.1.41/sandbox/agent-client/test_fs_terminal.py +78 -0
- crow_cli-0.1.41/sandbox/agent-client/test_http_multisession.py +151 -0
- crow_cli-0.1.41/sandbox/agent-client/test_raw_stdio.py +137 -0
- crow_cli-0.1.41/sandbox/agent-client/test_simple.py +133 -0
- crow_cli-0.1.41/sandbox/agent-client/test_ws_client.py +94 -0
- crow_cli-0.1.41/sandbox/agent-client/two_sessions_same_question.py +113 -0
- crow_cli-0.1.41/sandbox/agent-client/uv.lock +333 -0
- crow_cli-0.1.41/sandbox/async-react/.python-version +1 -0
- crow_cli-0.1.41/sandbox/async-react/README.md +3 -0
- crow_cli-0.1.41/sandbox/async-react/db_integrity_test.py +328 -0
- crow_cli-0.1.41/sandbox/async-react/e2e_tool_integrity.py +409 -0
- crow_cli-0.1.41/sandbox/async-react/persistence_integrity_test.py +599 -0
- crow_cli-0.1.41/sandbox/async-react/pyproject.toml +15 -0
- crow_cli-0.1.41/sandbox/async-react/streaming_async_react.py +255 -0
- crow_cli-0.1.41/sandbox/async-react/streaming_async_react_with_cancellation.py +405 -0
- crow_cli-0.1.41/sandbox/async-react/test_usage.py +161 -0
- crow_cli-0.1.41/sandbox/async-react/tool_call_integrity_test.py +287 -0
- crow_cli-0.1.41/sandbox/async-react/uv.lock +1646 -0
- crow_cli-0.1.41/sandbox/crow-acp-learning/agent.py +125 -0
- crow_cli-0.1.41/sandbox/crow-acp-learning/client.py +211 -0
- crow_cli-0.1.41/sandbox/crow-acp-learning/duet.py +43 -0
- crow_cli-0.1.41/sandbox/crow-acp-learning/echo_agent.py +418 -0
- crow_cli-0.1.41/sandbox/crow-acp-learning/fire_up_echo.py +75 -0
- crow_cli-0.1.41/sandbox/crow-acp-learning/gemini.py +394 -0
- crow_cli-0.1.41/sandbox/crow-acp-learning/pyproject.toml +10 -0
- crow_cli-0.1.41/sandbox/crow-acp-learning/terminal_agent.py +342 -0
- crow_cli-0.1.41/sandbox/crow-acp-learning/test_acp.py +89 -0
- crow_cli-0.1.41/sandbox/crow-acp-learning/uv.lock +299 -0
- crow_cli-0.1.41/sandbox/crow-test/.python-version +1 -0
- crow_cli-0.1.41/sandbox/crow-test/graph.png +0 -0
- crow_cli-0.1.41/sandbox/crow-test/graph.py +25 -0
- crow_cli-0.1.41/sandbox/crow-test/main.py +6 -0
- crow_cli-0.1.41/sandbox/crow-test/pyproject.toml +12 -0
- crow_cli-0.1.41/sandbox/crow-test/uv.lock +1658 -0
- crow_cli-0.1.41/sandbox/dirtree/.python-version +1 -0
- crow_cli-0.1.41/sandbox/dirtree/main.py +6 -0
- crow_cli-0.1.41/sandbox/dirtree/pyproject.toml +10 -0
- crow_cli-0.1.41/sandbox/dirtree/uv.lock +212 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/00-architecture-overview.md +495 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/01-parallel-tool-calling.md +220 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/02-toad-integration.md +321 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/03-session-persistence.md +468 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/04-cancellation-and-state.md +436 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/05-loop-detection.md +681 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/06-finish-tool.md +685 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/07-python-repl.md +701 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/08-system-prompt-skills.md +631 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/09-session-continuity-and-compaction.md +216 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/AGENTS_OLD.md +1427 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/ARCHITECTURE.md +288 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/CANCELLATION_IMPLEMENTATION.md +361 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/CANCELLATION_SANDBOX_COMPARISON.md +266 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/CANCELLATION_SUMMARY.md +207 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/CRITICAL_CLARIFICATIONS.md +506 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/CROW_SDK_ANALYSIS.md +642 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/EXTENSION_DISCUSSION.md +133 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/IMPLEMENTATION_PLAN.md +903 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/IMPLEMENTATION_SUMMARY.md +160 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/IMPLEMENTATION_SUMMARY_ACP_SESSIONS.md +192 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/INSTRUCTIONS_FOR_KIMI.md +106 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/PROJECT_VISION.md +3 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/PROMPT.md +148 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/PULSE_CHECK.md +512 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/REPL_GUIDE.md +148 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/TABLE_SCHEMA.md +53 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/THOUGHTS.md +25 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/check_acp_agent.py +11 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/conversation-wrapper-analysis.md +493 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/crow-agent-good-stuff.md +5442 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/crow_agent_example.py +113 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/crow_inspect.py +223 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/database.py +207 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/essays/00-file-editor-semantics-and-fastmcp.md +495 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/essays/01-mcp-server-package-structure.md +248 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/essays/02-hooks-realization-and-agent-core.md +420 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/essays/03-where-we-are-now-and-whats-next.md +498 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/essays/04-acp-mcp-configuration.md +228 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/essays/04-hooks-as-first-class-citizens.md +318 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/essays/05-hook-design-analysis.md +461 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/essays/05-python-sdk-that-emerged.md +460 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/essays/06-acp-native-sessions.md +225 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/essays/07-extension-api-design.md +308 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/essays/08-flask-extension-pattern-with-context-variables.md +380 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/essays/09-git-commit-violation-last-testament.md +146 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/essays/10-monorepo-refactor-to-avoid-cyclic-dependencies.md +342 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/essays/11-acp-terminal-tool-swapping.md +233 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/essays/12-hook-based-architecture-and-the-frameworkless-framework.md +1100 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/essays/13-acp-terminal-architecture.md +656 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/essays/14-terminal-mcp-implementation.md +1116 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/essays/15-terminal-mcp-complete.md +324 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/essays/16-fractal-filesystem-sandbox-parallel-tool-calling.md +56 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/essays/17-composition-over-inheritance-extension-design.md +279 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/essays/18-self-injection-the-god-mode-pattern.md +458 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/essays/19-pluggy-the-missing-piece.md +422 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/essays/20-terminal-tool-failure-bug-report.md +145 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/essays/21-callback-architecture-multi-agent-bridges.md +404 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/essays/22-the-agent-was-always-here.md +432 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/essays/23-cancellation-solid-plan.md +166 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/essays/24-async-tool-hanging-debug-thoughts.md +153 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/essays/25-acp-client-terminal-integration.md +272 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/essays/26-graceful-cancellation-streaming.md +819 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/essays/llms-txt-and-agent-skills.md +334 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/fire_up_echo.py +148 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/kernel_kernel.py +182 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/merging-agents-guide.md +440 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/plans/acp-tool-enhancements.md +464 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/quick_test.py +69 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/research-findings.md +479 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/search.py +95 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/simple_crow_agent.py +154 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/streaming_async_react.py +225 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/streaming_async_react_with_db.py +280 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/streaming_react.py +201 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/terminal_demo.py +283 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/test_client_caps.py +151 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/test_crow_e2e.py +62 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/test_terminal_client.py +267 -0
- crow_cli-0.1.41/sandbox/docs/ancestors/zai_tool_integration.py +115 -0
- crow_cli-0.1.41/sandbox/fastmcp-test/.gitignore +10 -0
- crow_cli-0.1.41/sandbox/fastmcp-test/.python-version +1 -0
- crow_cli-0.1.41/sandbox/fastmcp-test/client.py +38 -0
- crow_cli-0.1.41/sandbox/fastmcp-test/docs/essays/00-fractal-filesystem-sandbox-parallel-tool-calling.md +56 -0
- crow_cli-0.1.41/sandbox/fastmcp-test/pyproject.toml +20 -0
- crow_cli-0.1.41/sandbox/fastmcp-test/src/fastmcp_test/__init__.py +4 -0
- crow_cli-0.1.41/sandbox/fastmcp-test/src/fastmcp_test/server/__init__.py +3 -0
- crow_cli-0.1.41/sandbox/fastmcp-test/src/fastmcp_test/server/main.py +17 -0
- crow_cli-0.1.41/sandbox/fastmcp-test/src/fastmcp_test/tool/__init__.py +3 -0
- crow_cli-0.1.41/sandbox/fastmcp-test/src/fastmcp_test/tool/main.py +7 -0
- crow_cli-0.1.41/sandbox/fastmcp-test/uv.lock +1401 -0
- crow_cli-0.1.41/sandbox/lancedb-testing/.gitignore +4 -0
- crow_cli-0.1.41/sandbox/lancedb-testing/.python-version +1 -0
- crow_cli-0.1.41/sandbox/lancedb-testing/README.md +38 -0
- crow_cli-0.1.41/sandbox/lancedb-testing/bench_colpali.py +141 -0
- crow_cli-0.1.41/sandbox/lancedb-testing/bench_dual_model.py +78 -0
- crow_cli-0.1.41/sandbox/lancedb-testing/bench_latency.py +182 -0
- crow_cli-0.1.41/sandbox/lancedb-testing/lancedb_session.py +120 -0
- crow_cli-0.1.41/sandbox/lancedb-testing/load_crow_db.py +162 -0
- crow_cli-0.1.41/sandbox/lancedb-testing/main.py +31 -0
- crow_cli-0.1.41/sandbox/lancedb-testing/multivector.py +82 -0
- crow_cli-0.1.41/sandbox/lancedb-testing/pyproject.toml +15 -0
- crow_cli-0.1.41/sandbox/lancedb-testing/uv.lock +2090 -0
- crow_cli-0.1.41/sandbox/langfuse-test/.python-version +1 -0
- crow_cli-0.1.41/sandbox/langfuse-test/README.md +45 -0
- crow_cli-0.1.41/sandbox/langfuse-test/explore.py +280 -0
- crow_cli-0.1.41/sandbox/langfuse-test/main.py +22 -0
- crow_cli-0.1.41/sandbox/langfuse-test/pyproject.toml +11 -0
- crow_cli-0.1.41/sandbox/langfuse-test/uv.lock +536 -0
- crow_cli-0.1.41/sandbox/litellm-dashscope/.python-version +1 -0
- crow_cli-0.1.41/sandbox/litellm-dashscope/main.py +6 -0
- crow_cli-0.1.41/sandbox/litellm-dashscope/pyproject.toml +14 -0
- crow_cli-0.1.41/sandbox/litellm-dashscope/test_all_models_reasoning.py +176 -0
- crow_cli-0.1.41/sandbox/litellm-dashscope/test_fix_correctness.py +421 -0
- crow_cli-0.1.41/sandbox/litellm-dashscope/test_llamacpp_reasoning.py +298 -0
- crow_cli-0.1.41/sandbox/litellm-dashscope/test_rc_empty.py +142 -0
- crow_cli-0.1.41/sandbox/litellm-dashscope/test_reasoning_tool_transition.py +354 -0
- crow_cli-0.1.41/sandbox/litellm-dashscope/test_reasoning_transition.py +339 -0
- crow_cli-0.1.41/sandbox/litellm-dashscope/uv.lock +1654 -0
- crow_cli-0.1.41/sandbox/litellm-proxy/.python-version +1 -0
- crow_cli-0.1.41/sandbox/litellm-proxy/config.yaml +6 -0
- crow_cli-0.1.41/sandbox/litellm-proxy/main.py +6 -0
- crow_cli-0.1.41/sandbox/litellm-proxy/pyproject.toml +9 -0
- crow_cli-0.1.41/sandbox/litellm-proxy/uv.lock +2368 -0
- crow_cli-0.1.41/sandbox/murder-architecture.md +18 -0
- crow_cli-0.1.41/sandbox/pathlib-test/.python-version +1 -0
- crow_cli-0.1.41/sandbox/pathlib-test/main.py +6 -0
- crow_cli-0.1.41/sandbox/pathlib-test/pyproject.toml +9 -0
- crow_cli-0.1.41/sandbox/pathlib-test/src/pathlib_test/test.py +3 -0
- crow_cli-0.1.41/sandbox/pathlib-test/uv.lock +199 -0
- crow_cli-0.1.41/sandbox/pyinstaller-async-test/.python-version +1 -0
- crow_cli-0.1.41/sandbox/pyinstaller-async-test/main.py +92 -0
- crow_cli-0.1.41/sandbox/pyinstaller-async-test/pyproject.toml +11 -0
- crow_cli-0.1.41/sandbox/pyinstaller-async-test/test.spec +42 -0
- crow_cli-0.1.41/sandbox/pyinstaller-async-test/uv.lock +116 -0
- crow_cli-0.1.41/sandbox/repl-agent/.crow/compose.yaml +25 -0
- crow_cli-0.1.41/sandbox/repl-agent/.crow/config.yaml +34 -0
- crow_cli-0.1.41/sandbox/repl-agent/.crow/litellm/config.yaml +29 -0
- crow_cli-0.1.41/sandbox/repl-agent/.crow/searxng/settings.yml +2799 -0
- crow_cli-0.1.41/sandbox/repl-agent/.gitignore +1 -0
- crow_cli-0.1.41/sandbox/repl-agent/.python-version +1 -0
- crow_cli-0.1.41/sandbox/repl-agent/AGENT_CLIENT_INTEGRATION.md +309 -0
- crow_cli-0.1.41/sandbox/repl-agent/README.md +393 -0
- crow_cli-0.1.41/sandbox/repl-agent/client.py +338 -0
- crow_cli-0.1.41/sandbox/repl-agent/compact_agent.py +31 -0
- crow_cli-0.1.41/sandbox/repl-agent/compact_e2e_test.py +88 -0
- crow_cli-0.1.41/sandbox/repl-agent/compact_fixtures/case_01_system_user_only.json +20 -0
- crow_cli-0.1.41/sandbox/repl-agent/compact_fixtures/case_02_reasoning_only.json +25 -0
- crow_cli-0.1.41/sandbox/repl-agent/compact_fixtures/case_03_content_only.json +25 -0
- crow_cli-0.1.41/sandbox/repl-agent/compact_fixtures/case_04_unexecuted_tools.json +43 -0
- crow_cli-0.1.41/sandbox/repl-agent/compact_fixtures/case_05_mid_conversation_all_responded.json +81 -0
- crow_cli-0.1.41/sandbox/repl-agent/compact_fixtures/case_06_partial_tool_responses.json +76 -0
- crow_cli-0.1.41/sandbox/repl-agent/compact_fixtures/case_07_complete_turn.json +91 -0
- crow_cli-0.1.41/sandbox/repl-agent/compact_fixtures/case_08_reasoning_ending.json +91 -0
- crow_cli-0.1.41/sandbox/repl-agent/compact_fixtures/case_09_content_ending.json +91 -0
- crow_cli-0.1.41/sandbox/repl-agent/compact_fixtures/chubby_full_conversation.jsonl +9 -0
- crow_cli-0.1.41/sandbox/repl-agent/docs/AGENT_CLIENT_PLAN.md +341 -0
- crow_cli-0.1.41/sandbox/repl-agent/docs/COMPACT_AND_SCHEMA_REWRITE.md +158 -0
- crow_cli-0.1.41/sandbox/repl-agent/docs/STRATEGIC_PIVOT.md +254 -0
- crow_cli-0.1.41/sandbox/repl-agent/generate_compact_fixtures.py +149 -0
- crow_cli-0.1.41/sandbox/repl-agent/iterative_refinement.py +295 -0
- crow_cli-0.1.41/sandbox/repl-agent/iterative_refinement_agent.py +768 -0
- crow_cli-0.1.41/sandbox/repl-agent/iterative_refinement_mcp.py +54 -0
- crow_cli-0.1.41/sandbox/repl-agent/main.py +46 -0
- crow_cli-0.1.41/sandbox/repl-agent/multi_compact.py +37 -0
- crow_cli-0.1.41/sandbox/repl-agent/orchestrator.py +275 -0
- crow_cli-0.1.41/sandbox/repl-agent/pyproject.toml +18 -0
- crow_cli-0.1.41/sandbox/repl-agent/run_iterative_refinement_agent.py +87 -0
- crow_cli-0.1.41/sandbox/repl-agent/run_repl_clients.py +73 -0
- crow_cli-0.1.41/sandbox/repl-agent/scratch_db.py +41 -0
- crow_cli-0.1.41/sandbox/repl-agent/task_description.yaml +7 -0
- crow_cli-0.1.41/sandbox/repl-agent/test_compact_fixtures.py +156 -0
- crow_cli-0.1.41/sandbox/repl-agent/test_compact_one.py +112 -0
- crow_cli-0.1.41/sandbox/repl-agent/test_compact_real.py +348 -0
- crow_cli-0.1.41/sandbox/repl-agent/test_compact_run.py +146 -0
- crow_cli-0.1.41/sandbox/repl-agent/test_drift_instrumentation.py +131 -0
- crow_cli-0.1.41/sandbox/repl-agent/test_hook.py +40 -0
- crow_cli-0.1.41/sandbox/repl-agent/test_iterative_refinement.py +256 -0
- crow_cli-0.1.41/sandbox/repl-agent/test_multi_compact_client.py +175 -0
- crow_cli-0.1.41/sandbox/repl-agent/test_refinement_agent.py +242 -0
- crow_cli-0.1.41/sandbox/repl-agent/test_repl_client.py +124 -0
- crow_cli-0.1.41/sandbox/repl-agent/uv.lock +1568 -0
- crow_cli-0.1.41/sandbox/textual-term-toy/bridge.py +116 -0
- crow_cli-0.1.41/sandbox/textual-term-toy/harness/index.html +21 -0
- crow_cli-0.1.41/sandbox/textual-term-toy/harness/main.js +32 -0
- crow_cli-0.1.41/sandbox/textual-term-toy/pyproject.toml +14 -0
- crow_cli-0.1.41/sandbox/textual-term-toy/sample.md +202 -0
- crow_cli-0.1.41/sandbox/textual-term-toy/toy.py +320 -0
- crow_cli-0.1.41/sandbox/textual-term-toy/uv.lock +276 -0
- crow_cli-0.1.41/sandbox/yaml-configs/.python-version +1 -0
- crow_cli-0.1.41/sandbox/yaml-configs/main.py +6 -0
- crow_cli-0.1.41/sandbox/yaml-configs/pyproject.toml +7 -0
- crow_cli-0.1.41/scripts/consolidate_history.py +262 -0
- crow_cli-0.1.41/scripts/e2e_compact_live.py +222 -0
- crow_cli-0.1.41/scripts/e2e_image_store_live.py +177 -0
- crow_cli-0.1.41/scripts/e2e_memory_live.py +216 -0
- crow_cli-0.1.41/scripts/e2e_postgres_live.py +204 -0
- crow_cli-0.1.41/scripts/mcp_ram_repro.py +149 -0
- crow_cli-0.1.41/scripts/merge_live_into_migrated.py +95 -0
- crow_cli-0.1.41/scripts/migrate_taskmaster.py +224 -0
- crow_cli-0.1.41/scripts/migrate_v5.py +191 -0
- crow_cli-0.1.41/scripts/migrate_v6.py +192 -0
- crow_cli-0.1.41/src/crow_cli/mcp/server/README.md +0 -0
- crow_cli-0.1.41/src/crow_cli/mcp/task/__init__.py +0 -0
- crow_cli-0.1.41/src/crow_cli/mcp/terminal/README.md +0 -0
- crow_cli-0.1.41/src/crow_cli/mcp/vision/__init__.py +0 -0
- crow_cli-0.1.41/src/crow_cli/mcp/web_fetch/README.md +0 -0
- crow_cli-0.1.41/src/crow_cli/mcp/write/README.md +0 -0
- crow_cli-0.1.41/src/crow_cli/mcp/write/__init__.py +0 -0
- crow_cli-0.1.41/src/crow_cli/tui/os.py +0 -0
- crow_cli-0.1.41/tests/__init__.py +1 -0
- crow_cli-0.1.41/tests/analyze_payload_cache_invalidation.py +242 -0
- crow_cli-0.1.41/tests/analyze_payload_deep.py +317 -0
- crow_cli-0.1.41/tests/conftest.py +334 -0
- crow_cli-0.1.41/tests/e2e/test_react_live.py +79 -0
- crow_cli-0.1.41/tests/e2e/test_session_update_transmission.py +262 -0
- crow_cli-0.1.41/tests/e2e/test_task_high_priority_preemption.py +264 -0
- crow_cli-0.1.41/tests/e2e/test_task_mcp_launch.py +351 -0
- crow_cli-0.1.41/tests/e2e/test_task_race_regression.py +284 -0
- crow_cli-0.1.41/tests/integration/test_acp_http.py +75 -0
- crow_cli-0.1.41/tests/integration/test_agent_init.py +65 -0
- crow_cli-0.1.41/tests/integration/test_auth_validation.py +290 -0
- crow_cli-0.1.41/tests/integration/test_react_loop_cancel_integrity.py +321 -0
- crow_cli-0.1.41/tests/integration/test_react_loop_delegation_hold.py +211 -0
- crow_cli-0.1.41/tests/integration/test_react_loop_tool_round.py +584 -0
- crow_cli-0.1.41/tests/integration/test_reasoning_effort_react_loop.py +97 -0
- crow_cli-0.1.41/tests/integration/test_slash_commands.py +148 -0
- crow_cli-0.1.41/tests/mcp/integration/test_server_stdio.py +88 -0
- crow_cli-0.1.41/tests/mcp/test_edit.py +401 -0
- crow_cli-0.1.41/tests/mcp/test_memory.py +167 -0
- crow_cli-0.1.41/tests/mcp/test_memory_store.py +160 -0
- crow_cli-0.1.41/tests/mcp/test_memtrim.py +123 -0
- crow_cli-0.1.41/tests/mcp/test_read.py +97 -0
- crow_cli-0.1.41/tests/mcp/test_server.py +53 -0
- crow_cli-0.1.41/tests/mcp/test_task_tool.py +108 -0
- crow_cli-0.1.41/tests/mcp/test_terminal.py +36 -0
- crow_cli-0.1.41/tests/mcp/test_vision.py +43 -0
- crow_cli-0.1.41/tests/mcp/test_web_fetch.py +62 -0
- crow_cli-0.1.41/tests/mcp/test_web_search.py +51 -0
- crow_cli-0.1.41/tests/mcp/test_write.py +35 -0
- crow_cli-0.1.41/tests/memory/test_db.py +53 -0
- crow_cli-0.1.41/tests/memory/test_image_store.py +136 -0
- crow_cli-0.1.41/tests/memory/test_migrate_taskmaster.py +231 -0
- crow_cli-0.1.41/tests/memory/test_migrate_v5.py +159 -0
- crow_cli-0.1.41/tests/memory/test_migrate_v6.py +116 -0
- crow_cli-0.1.41/tests/memory/test_session_mcp_servers.py +154 -0
- crow_cli-0.1.41/tests/memory/test_session_tabs.py +69 -0
- crow_cli-0.1.41/tests/memory/test_store.py +267 -0
- crow_cli-0.1.41/tests/memory/test_task_state.py +255 -0
- crow_cli-0.1.41/tests/unit/test_agent_store.py +60 -0
- crow_cli-0.1.41/tests/unit/test_cli_fork_flags.py +38 -0
- crow_cli-0.1.41/tests/unit/test_cli_telemetry.py +135 -0
- crow_cli-0.1.41/tests/unit/test_client_terminal.py +189 -0
- crow_cli-0.1.41/tests/unit/test_compact.py +197 -0
- crow_cli-0.1.41/tests/unit/test_compact_last_messages_list_content.json +213 -0
- crow_cli-0.1.41/tests/unit/test_compact_last_messages_list_content.py +34 -0
- crow_cli-0.1.41/tests/unit/test_configure.py +61 -0
- crow_cli-0.1.41/tests/unit/test_fork.py +218 -0
- crow_cli-0.1.41/tests/unit/test_init_postgres.py +133 -0
- crow_cli-0.1.41/tests/unit/test_init_rustfs.py +59 -0
- crow_cli-0.1.41/tests/unit/test_json_repair.py +196 -0
- crow_cli-0.1.41/tests/unit/test_mcp_client.py +105 -0
- crow_cli-0.1.41/tests/unit/test_model_override.py +137 -0
- crow_cli-0.1.41/tests/unit/test_model_routing.py +331 -0
- crow_cli-0.1.41/tests/unit/test_per_model_compact_threshold.py +106 -0
- crow_cli-0.1.41/tests/unit/test_prompt.py +280 -0
- crow_cli-0.1.41/tests/unit/test_react.py +424 -0
- crow_cli-0.1.41/tests/unit/test_reasoning_effort.py +417 -0
- crow_cli-0.1.41/tests/unit/test_request_logging.py +82 -0
- crow_cli-0.1.41/tests/unit/test_session.py +56 -0
- crow_cli-0.1.41/tests/unit/test_session_mcp_servers_wiring.py +191 -0
- crow_cli-0.1.41/tests/unit/test_stream_processing.py +337 -0
- crow_cli-0.1.41/tests/unit/test_subagent_parse_servers.py +55 -0
- crow_cli-0.1.41/tests/unit/test_system_prompt_skills.py +79 -0
- crow_cli-0.1.41/tests/unit/test_task_tool_schema.py +203 -0
- crow_cli-0.1.41/tests/unit/test_usage_update.py +40 -0
- crow_cli-0.1.41/tests/unit/test_uv_project_enforcement.py +119 -0
- crow_cli-0.1.41/tests/unit/test_version.py +19 -0
- crow_cli-0.1.41/tests/unit/tui/__init__.py +0 -0
- crow_cli-0.1.41/tests/unit/tui/test_agent_terminal.py +170 -0
- crow_cli-0.1.41/tests/unit/tui/test_ansi_resize.py +142 -0
- crow_cli-0.1.41/tests/unit/tui/test_editor_screen.py +195 -0
- crow_cli-0.1.41/tests/unit/tui/test_editor_terminal.py +95 -0
- crow_cli-0.1.41/uv.lock +3395 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41}/.gitignore +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41}/LICENSE.md +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41}/README.md +0 -0
- {crow_cli-0.1.40/crow_cli/mcp/editor → crow_cli-0.1.41/sandbox/crow-acp-learning}/README.md +0 -0
- {crow_cli-0.1.40/crow_cli/mcp/read → crow_cli-0.1.41/sandbox/crow-test}/README.md +0 -0
- {crow_cli-0.1.40/crow_cli/mcp/server → crow_cli-0.1.41/sandbox/dirtree}/README.md +0 -0
- {crow_cli-0.1.40/crow_cli/mcp/terminal → crow_cli-0.1.41/sandbox/fastmcp-test}/README.md +0 -0
- {crow_cli-0.1.40/crow_cli/mcp/web_fetch → crow_cli-0.1.41/sandbox/litellm-dashscope}/README.md +0 -0
- {crow_cli-0.1.40/crow_cli/mcp/write → crow_cli-0.1.41/sandbox/litellm-proxy}/README.md +0 -0
- /crow_cli-0.1.40/crow_cli/cli/__init__.py → /crow_cli-0.1.41/sandbox/pathlib-test/README.md +0 -0
- /crow_cli-0.1.40/crow_cli/client/__init__.py → /crow_cli-0.1.41/sandbox/yaml-configs/README.md +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/__init__.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/agent/__init__.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/agent/compact.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/agent/context.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/agent/hooks.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/agent/llm.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/agent/logger.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/agent/main.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/agent/mcp_client.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/agent/memory.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/agent/model_routing.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/agent/prompt.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/agent/react.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/agent/session.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/agent/slash.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/agent/tools.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/agent_runner.py +0 -0
- {crow_cli-0.1.40/crow_cli/mcp/editor → crow_cli-0.1.41/src/crow_cli/cli}/__init__.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/cli/init_cmd.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/cli/install.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/cli/main.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/cli/tui_cmd.py +0 -0
- {crow_cli-0.1.40/crow_cli/mcp/memory → crow_cli-0.1.41/src/crow_cli/client}/__init__.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/client/main.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/client/subagent.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/client/terminal.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/config/__init__.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/config/config.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/config/default/__init__.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/config/default/defaults.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/config/default/searxng_settings.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/__init__.py +0 -0
- /crow_cli-0.1.40/crow_cli/mcp/read/__init__.py → /crow_cli-0.1.41/src/crow_cli/mcp/editor/README.md +0 -0
- {crow_cli-0.1.40/crow_cli/mcp/task → crow_cli-0.1.41/src/crow_cli/mcp/editor}/__init__.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/editor/main.py +0 -0
- {crow_cli-0.1.40/crow_cli/mcp/vision → crow_cli-0.1.41/src/crow_cli/mcp/memory}/__init__.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/memory/client.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/memory/main.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/memory/store.py +0 -0
- /crow_cli-0.1.40/crow_cli/mcp/write/__init__.py → /crow_cli-0.1.41/src/crow_cli/mcp/read/README.md +0 -0
- /crow_cli-0.1.40/crow_cli/tui/os.py → /crow_cli-0.1.41/src/crow_cli/mcp/read/__init__.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/read/main.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/server/__init__.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/server/app.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/server/logger.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/server/main.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/server/memtrim.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/task/main.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/terminal/__init__.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/terminal/backend.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/terminal/constants.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/terminal/logging_config.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/terminal/main.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/terminal/metadata.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/terminal/session.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/vision/client.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/vision/main.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/web_fetch/__init__.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/web_fetch/main.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/web_search/README.md +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/web_search/__init__.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/web_search/main.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/write/main.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/memory/__init__.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/memory/db.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/memory/fts.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/memory/ids.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/memory/image_store.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/memory/messages.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/memory/models.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/memory/reads.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/memory/session_tabs.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/memory/writes.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/NOTICE +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/__init__.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/_loop.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/_path_fuzzy_search.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/_path_match.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/acp/agent.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/acp/api.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/acp/encode_tool_call_id.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/acp/messages.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/acp/prompt.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/acp/protocol.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/agent.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/agent_schema.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/agent_terminal.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/agents.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/ansi/__init__.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/ansi/_ansi.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/ansi/_ansi_colors.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/ansi/_control_codes.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/ansi/_keys.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/ansi/_sgr_styles.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/ansi/_stream_parser.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/answer.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/app.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/atomic.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/code_analyze.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/complete.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/constants.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/conversation_markdown.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/danger.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/data/agents/crowai.dev.toml +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/data/images/crow.png +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/data/images/frog.png +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/data/sounds/question.wav +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/data/sounds/turn-over.wav +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/db.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/dec.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/directory.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/directory_suggester.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/directory_watcher.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/format_path.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/fuzzy.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/fuzzy_index.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/history.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/jsonrpc.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/mcp.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/menus.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/messages.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/option_content.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/path_complete.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/path_filter.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/paths.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/pill.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/prompt/extract.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/prompt/resource.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/protocol.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/action_modal.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/agent_modal.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/command_edit_modal.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/editor.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/editor.tcss +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/history.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/history.tcss +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/main.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/main.tcss +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/permissions.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/permissions.tcss +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/session_resume_modal.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/session_resume_modal.tcss +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/sessions.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/sessions.tcss +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/settings.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/settings.tcss +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/store.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/store.tcss +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/session_list.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/session_tracker.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/settings.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/settings_schema.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/shell.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/shell_read.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/slash_command.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/themes.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/tui.tcss +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/visuals/columns.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/acp_content.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/agent_response.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/agent_thought.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/command_pane.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/condensed_path.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/conversation.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/danger_warning.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/diff_view.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/directory_input.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/editor_terminal.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/flash.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/future_text.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/grid_select.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/highlighted_textarea.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/mandelbrot.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/markdown_note.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/menu.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/non_selectable_label.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/note.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/path_search.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/plan.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/project_directory_tree.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/prompt.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/question.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/session_grid_select.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/session_summary.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/session_tabs.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/shell_result.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/shell_terminal.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/side_bar.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/slash_complete.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/strike_text.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/terminal.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/terminal_tool.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/throbber.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/tool_call.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/user_input.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/version.py +0 -0
- {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/welcome.py +0 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
name: Build Binaries
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "v*" # Trigger on version tags like v0.1.13
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
build:
|
|
10
|
+
name: Build ${{ matrix.os }}
|
|
11
|
+
runs-on: ${{ matrix.os }}
|
|
12
|
+
strategy:
|
|
13
|
+
matrix:
|
|
14
|
+
os:
|
|
15
|
+
[
|
|
16
|
+
ubuntu-22.04,
|
|
17
|
+
macos-15-intel,
|
|
18
|
+
macos-latest,
|
|
19
|
+
windows-latest,
|
|
20
|
+
ubuntu-24.04-arm,
|
|
21
|
+
]
|
|
22
|
+
include:
|
|
23
|
+
- os: ubuntu-22.04
|
|
24
|
+
target: linux-x86_64
|
|
25
|
+
archive_name: crow-cli-linux-x86_64.tar.gz
|
|
26
|
+
- os: macos-15-intel
|
|
27
|
+
target: darwin-x86_64
|
|
28
|
+
archive_name: crow-cli-darwin-x86_64.tar.gz
|
|
29
|
+
- os: macos-latest
|
|
30
|
+
target: darwin-aarch64
|
|
31
|
+
archive_name: crow-cli-darwin-aarch64.tar.gz
|
|
32
|
+
- os: windows-latest
|
|
33
|
+
target: windows-x86_64
|
|
34
|
+
archive_name: crow-cli-windows-x86_64.zip
|
|
35
|
+
- os: ubuntu-24.04-arm
|
|
36
|
+
target: linux-aarch64
|
|
37
|
+
archive_name: crow-cli-linux-aarch64.tar.gz
|
|
38
|
+
|
|
39
|
+
steps:
|
|
40
|
+
- name: Checkout
|
|
41
|
+
uses: actions/checkout@v4
|
|
42
|
+
|
|
43
|
+
- name: Install uv
|
|
44
|
+
uses: astral-sh/setup-uv@v5
|
|
45
|
+
with:
|
|
46
|
+
enable-cache: true
|
|
47
|
+
|
|
48
|
+
- name: Set up Python
|
|
49
|
+
uses: actions/setup-python@v5
|
|
50
|
+
with:
|
|
51
|
+
python-version-file: "pyproject.toml"
|
|
52
|
+
|
|
53
|
+
- name: Install dependencies
|
|
54
|
+
run: |
|
|
55
|
+
uv pip install --system pyinstaller
|
|
56
|
+
|
|
57
|
+
- name: Build with PyInstaller
|
|
58
|
+
run: |
|
|
59
|
+
uv run pyinstaller crow-cli.spec --noconfirm
|
|
60
|
+
|
|
61
|
+
- name: Create archive
|
|
62
|
+
shell: bash
|
|
63
|
+
run: |
|
|
64
|
+
cd dist
|
|
65
|
+
if [ "${{ runner.os }}" == "Windows" ]; then
|
|
66
|
+
7z a -tzip ${{ matrix.archive_name }} crow-cli.exe
|
|
67
|
+
else
|
|
68
|
+
tar -czvf ${{ matrix.archive_name }} crow-cli
|
|
69
|
+
fi
|
|
70
|
+
|
|
71
|
+
- name: Upload artifact
|
|
72
|
+
uses: actions/upload-artifact@v4
|
|
73
|
+
with:
|
|
74
|
+
name: crow-cli-${{ matrix.target }}
|
|
75
|
+
path: ${{ matrix.archive_name }}
|
|
76
|
+
retention-days: 30
|
|
77
|
+
|
|
78
|
+
release:
|
|
79
|
+
name: Create Release
|
|
80
|
+
needs: build
|
|
81
|
+
runs-on: ubuntu-latest
|
|
82
|
+
if: startsWith(github.ref, 'refs/tags/')
|
|
83
|
+
permissions:
|
|
84
|
+
contents: write
|
|
85
|
+
|
|
86
|
+
steps:
|
|
87
|
+
- name: Download all artifacts
|
|
88
|
+
uses: actions/download-artifact@v4
|
|
89
|
+
with:
|
|
90
|
+
pattern: crow-cli-*
|
|
91
|
+
merge-multiple: true
|
|
92
|
+
|
|
93
|
+
- name: Create Release
|
|
94
|
+
uses: softprops/action-gh-release@v1
|
|
95
|
+
with:
|
|
96
|
+
files: |
|
|
97
|
+
crow-cli-*.tar.gz
|
|
98
|
+
crow-cli-*.zip
|
|
99
|
+
draft: false
|
|
100
|
+
prerelease: false
|
|
101
|
+
generate_release_notes: true
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
name: Publish crow-cli to PyPI
|
|
2
|
+
|
|
3
|
+
# Manual-only publish of the single package in this repo. Idempotent: a
|
|
4
|
+
# version already live on PyPI is skipped, so a failed run can simply be
|
|
5
|
+
# re-dispatched.
|
|
6
|
+
on:
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
publish:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
environment:
|
|
13
|
+
name: pypi
|
|
14
|
+
url: https://pypi.org/p/crow-cli
|
|
15
|
+
permissions:
|
|
16
|
+
id-token: write # Required for trusted publishing
|
|
17
|
+
contents: read
|
|
18
|
+
|
|
19
|
+
steps:
|
|
20
|
+
- name: Checkout
|
|
21
|
+
uses: actions/checkout@v4
|
|
22
|
+
|
|
23
|
+
- name: Install uv
|
|
24
|
+
uses: astral-sh/setup-uv@v5
|
|
25
|
+
with:
|
|
26
|
+
enable-cache: true
|
|
27
|
+
|
|
28
|
+
- name: Set up Python
|
|
29
|
+
uses: actions/setup-python@v5
|
|
30
|
+
with:
|
|
31
|
+
python-version-file: "pyproject.toml"
|
|
32
|
+
|
|
33
|
+
- name: Build and publish (skip if already on PyPI)
|
|
34
|
+
run: |
|
|
35
|
+
set -euo pipefail
|
|
36
|
+
VERSION=$(grep -m1 '^version' pyproject.toml | sed -E 's/.*"(.*)".*/\1/')
|
|
37
|
+
if curl -fsS "https://pypi.org/pypi/crow-cli/$VERSION/json" -o /dev/null; then
|
|
38
|
+
echo "crow-cli $VERSION is already on PyPI — skipping publish"
|
|
39
|
+
else
|
|
40
|
+
uv build
|
|
41
|
+
uv publish
|
|
42
|
+
fi
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.14
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# RULES
|
|
2
|
+
|
|
3
|
+
- Never mention the user's emotional state. I'm here to work, NOT be psychoanalyzed by a machine.
|
|
4
|
+
|
|
5
|
+
# TUI TERMINAL KNOWLEDGE (verified, don't re-derive)
|
|
6
|
+
|
|
7
|
+
- ANSI emulator resize semantics ARE the product: alternate-screen buffers
|
|
8
|
+
must resize like pyte/real terminals (truncate columns on width shrink,
|
|
9
|
+
top-trim/pad on height change, 1:1 grid rows <-> buffer lines, clamp
|
|
10
|
+
cursor) — folding stale wide lines breaks CUP row addressing = garble.
|
|
11
|
+
Scrollback (normal) screen keeps folding. Oracle test: pyte dev dep.
|
|
12
|
+
- Two terminal pathways by mandate: `tui/agent_terminal.py::AgentTerminal`
|
|
13
|
+
(headless PTY + raw byte capture) backs the ACP terminal tool; the
|
|
14
|
+
human-facing emulator (TerminalTool/EditorTerminal) is separate. A
|
|
15
|
+
suspended conversation has window size 0 — never size a PTY from it.
|
|
16
|
+
- Textual gotchas: `Widget.screen` is a Textual property (name pyte
|
|
17
|
+
screens `pyte_screen`); `Strip` API is cell-based in Textual 8
|
|
18
|
+
(`crop_extend(0, w, None)`, `adjust_cell_length`); Textual 8.2.x breaks
|
|
19
|
+
on rich>=15 (uses Style internals rich dropped) — pin rich<15.
|
|
20
|
+
- pyte color values are "default", ANSI names, or 6-char hex strings for
|
|
21
|
+
BOTH 256-color and truecolor — never numeric palette indices (an
|
|
22
|
+
all-digit hex like "281733" is truecolor).
|
|
23
|
+
- A TUI only sends DIFFS: any fresh out-of-process terminal client
|
|
24
|
+
(riotermjs, reconnect) sees a blank/stale screen unless the child is
|
|
25
|
+
forced to full-repaint (winsize nudge: set cols-1 then cols).
|
|
26
|
+
- sandbox/textual-term-toy: the terminal-in-a-column experiment + the
|
|
27
|
+
riotermjs browser harness (bridge.py = PTY<->websocket; harness/ = page
|
|
28
|
+
with importmap to ~/src/riotermjs dist). How to view the TUI in a
|
|
29
|
+
browser: run bridge.py + `python -m http.server --directory harness`,
|
|
30
|
+
open the page, screenshot via playwright-cli.
|
crow_cli-0.1.41/PLAN.md
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# PLAN — open files in helix inside a terminal tab
|
|
2
|
+
|
|
3
|
+
## **DO NOT ASK USER FOR FEEDBACK — THIS IS THE USER FEEDBACK.**
|
|
4
|
+
## **DO NOT ASK USER FOR NEXT STEPS — THESE ARE THE NEXT STEPS.**
|
|
5
|
+
|
|
6
|
+
### The unlock (user, 30Aug2026)
|
|
7
|
+
Clicking a file in the TUI's project explorer must open **helix editing that
|
|
8
|
+
file inside a new session tab**, where the tab body is a **real terminal
|
|
9
|
+
emulator running the `hx` process**. NOT a fullscreen takeover of the TUI,
|
|
10
|
+
NOT an external editor — a terminal-shaped emulator *inside* the tab, as
|
|
11
|
+
pass-through as possible ("open the space for helix to fill like a good TUI
|
|
12
|
+
app"). `:wq!` (helix quitting) closes the tab. The tab model becomes generic:
|
|
13
|
+
`SessionTab: AcpClientChat | Terminal | Editor` (decoupled from session-id).
|
|
14
|
+
The `!command` fire-and-get-text-back shell stays as-is for now — do NOT
|
|
15
|
+
revolutionize the chat interface this sprint.
|
|
16
|
+
|
|
17
|
+
### Reuse, don't hand-roll
|
|
18
|
+
- `widgets/terminal_tool.py::TerminalTool(Terminal)` already does the full PTY
|
|
19
|
+
dance (openpty, subprocess, read loop, `write_stdin`, `resize_pty`,
|
|
20
|
+
`wait_for_exit`, `kill`). EditorTerminal subclasses it.
|
|
21
|
+
- Tabs are Textual **modes**: `CrowApp.new_session_screen(get_screen, title)`
|
|
22
|
+
registers a mode + screen and tracks it in `SessionTracker`; the
|
|
23
|
+
`SessionsTabs` widget renders tabs from `session_tracker` (it reads
|
|
24
|
+
`app.session_tracker` + `app.current_mode`, so it works on ANY screen).
|
|
25
|
+
- `SessionClose` message + `MainScreen.on_session_close` already implement
|
|
26
|
+
"switch to neighbour, close tracker entry, remove mode".
|
|
27
|
+
|
|
28
|
+
### Build/test gate
|
|
29
|
+
`uv --project . run pytest tests/unit -q` after each step (there is no TUI
|
|
30
|
+
test dir yet — create `tests/unit/tui/`). Live smoke in tmux session
|
|
31
|
+
`crowtui-test` (NEVER touch other sessions / the user's live rio windows;
|
|
32
|
+
this agent is itself a crow-cli instance — do not kill crow processes).
|
|
33
|
+
Commit when green, `Session-Id: terrific-heron-of-splendid-greatness` trailer.
|
|
34
|
+
|
|
35
|
+
## Steps
|
|
36
|
+
|
|
37
|
+
> STATUS (30Aug2026): steps 1–7 DONE. Steps 1–6 committed (a52e3d41,
|
|
38
|
+
> 296a568c, 3d8597e5); step 7 (slice 2) committed this segment. Live smoke
|
|
39
|
+
> green end-to-end: file click → helix renders inside the tab in the chat's
|
|
40
|
+
> column with the sidebar visible, keys pass through, `:wq!` writes & closes
|
|
41
|
+
> the tab; the tab `✕` affordance closes an editor tab gracefully (sends
|
|
42
|
+
> `:wq!\r`, helix exits, no orphan process) and a chat tab directly. Full
|
|
43
|
+
> gate green: 518 passed (unit + integration + e2e + memory).
|
|
44
|
+
>
|
|
45
|
+
> Root-cause fix landed in 3d8597e5: the child PTY was never made the
|
|
46
|
+
> controlling terminal, so helix read /dev/tty size from the OUTER terminal
|
|
47
|
+
> (187 cols) and never got SIGWINCH — that, not the ANSI state, caused the
|
|
48
|
+
> blank/garbled editor. Fixed via preexec setsid()+TIOCSCTTY + pre-spawn
|
|
49
|
+
> PTY sizing.
|
|
50
|
+
>
|
|
51
|
+
> Slice-2 notes: programmatic keys to helix must end in `\r` (TERMINAL_KEY_MAP
|
|
52
|
+
> maps `enter`→`\r`, and helix ignores `\n`). `kill()` now kills the whole
|
|
53
|
+
> process group (os.killpg) and `EditorTerminal.on_unmount` calls it, so a
|
|
54
|
+
> closed tab never leaks `sh`/`hx`.
|
|
55
|
+
|
|
56
|
+
1. ✅ **`tui/widgets/editor_terminal.py::EditorTerminal(TerminalTool)`**
|
|
57
|
+
- Pure pass-through `on_key`: forward EVERY key incl. `escape` immediately
|
|
58
|
+
(no double-tap-to-blur — helix needs ESC). `event.prevent_default();
|
|
59
|
+
event.stop()` then `state.key_event_to_stdin` → `write_process_stdin`.
|
|
60
|
+
- Override `update_size` to also `resize_pty(self._shell_fd, w, h)` so
|
|
61
|
+
helix redraws on tab/window resize (TerminalTool only sizes once).
|
|
62
|
+
- Post `Exited(return_code)` Message when the process exits.
|
|
63
|
+
- CSS: fill the tab (`width:100%; height:1fr;`), no border/`-success` noise.
|
|
64
|
+
- Verify: headless run_test with a trivial program (`cat`/`printf`) →
|
|
65
|
+
output lands in the buffer; ESC/key bytes reach stdin; Exited fires.
|
|
66
|
+
|
|
67
|
+
2. ✅ **`tui/screens/editor.py::EditorScreen(Screen)` + `editor.tcss`**
|
|
68
|
+
- compose: `SessionsTabs()`, `EditorTerminal`, `Footer()`.
|
|
69
|
+
- on_mount: `terminal.start(w,h)` with the `hx <path>` command, focus it.
|
|
70
|
+
- Handle `EditorTerminal.Exited` → post `SessionClose(self.id)` (tab closes
|
|
71
|
+
when helix quits). Reuse the close semantics of MainScreen.on_session_close.
|
|
72
|
+
- Session-nav bindings (`ctrl+[` / `ctrl+]`) so you can leave the tab;
|
|
73
|
+
a `ctrl+q` binding → `quit_editor()` sends `:wq!\r` to stdin.
|
|
74
|
+
- Verify: headless test opens EditorScreen with a quick-exit command →
|
|
75
|
+
mounts, focuses terminal, closes on exit.
|
|
76
|
+
|
|
77
|
+
3. ✅ **Generic tab model** — `session_tracker.SessionDetails` gains
|
|
78
|
+
`kind: Literal["chat","editor"]="chat"`; thread through
|
|
79
|
+
`SessionTracker.new_session(title, kind)` and
|
|
80
|
+
`CrowApp.new_session_screen(get_screen, title, kind)`. SessionsTabs may
|
|
81
|
+
render an editor glyph by kind (keep minimal).
|
|
82
|
+
- Verify: existing unit tests green; kind defaults to chat.
|
|
83
|
+
|
|
84
|
+
4. ✅ **`CrowApp.open_file_in_editor(path)`** — build `Command(editor.command,
|
|
85
|
+
[str(path)], env, cwd=project)` and `new_session_screen(get_screen,
|
|
86
|
+
title=f"hx {path.name}", kind="editor")`. Editor command from settings key
|
|
87
|
+
`editor.command` (default `hx`) — add to `settings_schema.py` SCHEMA.
|
|
88
|
+
- Verify: headless — call it, assert a new editor mode/screen exists.
|
|
89
|
+
|
|
90
|
+
5. ✅ **Rewire the explorer click** — `MainScreen.on_project_directory_tree_selected`
|
|
91
|
+
→ `self.app.open_file_in_editor(data.path)` (instead of
|
|
92
|
+
`insert_path_into_prompt`). `@file` path-insert via path_search is unchanged.
|
|
93
|
+
- Verify: simulate `DirectoryTree.FileSelected` → open_file_in_editor called.
|
|
94
|
+
|
|
95
|
+
6. ✅ **Live smoke (tmux `crowtui-test`)** — launch TUI, open a file from the
|
|
96
|
+
explorer, confirm helix renders inside the tab, keys pass through, `:wq!`
|
|
97
|
+
closes the tab and returns to chat. Capture frames to verify rendering.
|
|
98
|
+
|
|
99
|
+
7. ✅ **(slice 2) tab `x` close affordance** — every tab label renders a
|
|
100
|
+
trailing `✕` (`session_tabs.CLOSE_GLYPH`); `SessionLabel.on_click`
|
|
101
|
+
hit-tests `offset.x >= content_region.width` and posts
|
|
102
|
+
`messages.SessionRequestClose(mode)`. `CrowApp.on_session_request_close`
|
|
103
|
+
is graceful for editor tabs (sends `:wq!\r` — `\r`, not `\n` — and lets
|
|
104
|
+
the resulting Exited→SessionClose cascade remove the tab) and direct for
|
|
105
|
+
chat tabs. `terminal_tool.kill()` kills the process group and
|
|
106
|
+
`EditorTerminal.on_unmount` calls it, so closing never orphans `sh`/`hx`.
|
|
107
|
+
- Verify: unit `test_x_affordance_gracefully_closes_editor_tab` (asserts
|
|
108
|
+
the editor received `:wq!` and the tab closes on exit) + live tmux
|
|
109
|
+
smoke (click `✕` → helix exits, no orphan). Both green.
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
# PLAN — mature the ANSI emulator + editor tab = chat page
|
|
114
|
+
|
|
115
|
+
## **DO NOT ASK USER FOR FEEDBACK — THIS IS THE USER FEEDBACK.**
|
|
116
|
+
## **DO NOT ASK USER FOR NEXT STEPS — THESE ARE THE NEXT STEPS.**
|
|
117
|
+
|
|
118
|
+
### The unlock (user, this segment)
|
|
119
|
+
Two user reports with screenshots:
|
|
120
|
+
1. **Editor tab must be the SAME page as the chat page** — "they're really
|
|
121
|
+
the same page… align completely". Chat: tab bar INSIDE the right column
|
|
122
|
+
(right of sidebar, top of the Conversation widget). Editor: tab bar
|
|
123
|
+
full-width ABOVE the sidebar. Fix = move `SessionsTabs()` inside
|
|
124
|
+
`#editor-body` and mirror Conversation's column CSS exactly.
|
|
125
|
+
2. **Holding `down` in helix garbles the display** — jumbled line numbers,
|
|
126
|
+
statusline fragments scattered at the right edge, scroll dead.
|
|
127
|
+
|
|
128
|
+
### Research done (verified, don't redo)
|
|
129
|
+
- **pyte oracle**: our `TerminalState` matches pyte with 0 mismatches at
|
|
130
|
+
fixed size (120×40, 100 downs) AND under the app's real resize sequence
|
|
131
|
+
(headless 150×50 and user's 187×50). Core emulation is CORRECT.
|
|
132
|
+
- **The divergence is resize semantics**: our `TerminalState.update_size` →
|
|
133
|
+
`_reflow()` FOLDS stale wide lines on width shrink; pyte `Screen.resize`
|
|
134
|
+
TRUNCATES columns at the right and deletes rows from the TOP on height
|
|
135
|
+
shrink. Folded stale alt-screen lines break CUP row addressing
|
|
136
|
+
(fold-index ≠ row-index) → exactly the garble the user saw.
|
|
137
|
+
- **Copied notes from mitosch/textual-terminal** (the project doing exactly
|
|
138
|
+
this — pyte inside a Textual widget): `on_resize` sets ncol/nrow from the
|
|
139
|
+
widget size, tells the PTY via set_size, and calls `screen.resize(nrow,
|
|
140
|
+
ncol)` — real-terminal semantics, NO folding, NO buffer wipes. Renders by
|
|
141
|
+
iterating `screen.buffer[y][x]` Char cells; mouse toggled by sniffing
|
|
142
|
+
DECSET 1000h/l (we already do the equivalent). Also noted:
|
|
143
|
+
par-term-emu-tui-rust (Textual widget over Rust core) as the mature/perf
|
|
144
|
+
option; neovim :terminal uses libvterm and still has resize-drift bugs.
|
|
145
|
+
- Widget mitigation (`update_size` wipes alt buffer on alt+size change)
|
|
146
|
+
exists but is a lossy band-aid; the state itself must be grid-faithful.
|
|
147
|
+
|
|
148
|
+
## Steps
|
|
149
|
+
|
|
150
|
+
1. ✅ **pyte-semantics resize in `tui/ansi/_ansi.py::TerminalState.update_size`**
|
|
151
|
+
- Alternate screen: width shrink → TRUNCATE every line at the new width
|
|
152
|
+
(never fold — grid rows must stay 1:1 with buffer lines); height
|
|
153
|
+
shrink → delete rows from the TOP; height grow → pad blank rows at the
|
|
154
|
+
bottom; clamp the cursor; rebuild fold index; mark all lines updated.
|
|
155
|
+
- Scrollback (normal) screen: keep the existing fold/reflow behavior
|
|
156
|
+
(presentation wrapping is a chat feature).
|
|
157
|
+
- Fix the `width is None` bug (compared `previous_width != width` with
|
|
158
|
+
`width=None` → spurious reflow).
|
|
159
|
+
- `widgets/terminal.py::update_size`: pass `self._height` (not the raw
|
|
160
|
+
arg) to `state.update_size`; drop the lossy alt-buffer wipe — with
|
|
161
|
+
grid-faithful resize the truncated content is exactly what a real
|
|
162
|
+
terminal shows until the program's SIGWINCH repaint lands.
|
|
163
|
+
- Verify: `tests/unit/tui/test_ansi_resize.py` — pyte-oracle regression
|
|
164
|
+
(helix-shaped paint → shrink → repaint, 0 mismatches), CUP addressing
|
|
165
|
+
after shrink lands on the right row, scrollback still folds.
|
|
166
|
+
|
|
167
|
+
2. ✅ **Editor tab = chat page** — `screens/editor.py` compose: move
|
|
168
|
+
`SessionsTabs()` inside `#editor-body` (above EditorTerminal);
|
|
169
|
+
`editor.tcss`: `#editor-body` gets Conversation's chrome (`padding-left:
|
|
170
|
+
1`, `&.-column { max-width: 100; background: black 7%; }`) and
|
|
171
|
+
`_apply_column_width` toggles `-column` exactly like MainScreen's
|
|
172
|
+
`watch_column`. Verify: unit test asserts SessionsTabs is a descendant of
|
|
173
|
+
#editor-body; live smoke compares both tabs' tab bars.
|
|
174
|
+
|
|
175
|
+
3. ✅ **Gate + live smoke** — `pytest tests/unit -q`, full gate, tmux
|
|
176
|
+
`crowtui-test`: open file in helix, hold down (100 downs via SGR keys or
|
|
177
|
+
repeated sends), resize the window, verify no garble; compare chat vs
|
|
178
|
+
editor tab bar placement via capture-pane.
|
|
179
|
+
|
|
180
|
+
4. ✅ **Commit** (Session-Id trailer) + PLAN/TODO status updates.
|
|
181
|
+
|
|
182
|
+
## Deferred (still open, not this sprint)
|
|
183
|
+
- TUI image attachments as ACP image content (previous PLAN, steps preserved
|
|
184
|
+
in TODO.md item).
|
|
185
|
+
- TUI ACP-client migration onto the official `acp` SDK (TODO.md item).
|
|
186
|
+
- `!command` shell UX improvements (reveal/scroll lag) — fire-and-forget is
|
|
187
|
+
acceptable for now per user.
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# PyInstaller Binary Build Setup
|
|
2
|
+
|
|
3
|
+
## ✅ What's Been Created
|
|
4
|
+
|
|
5
|
+
### 1. GitHub Workflow: `.github/workflows/build-binaries.yml`
|
|
6
|
+
|
|
7
|
+
Builds crow-cli binaries for:
|
|
8
|
+
- **Linux x86_64** (ubuntu-22.04)
|
|
9
|
+
- **macOS x86_64** (macos-13)
|
|
10
|
+
- **macOS ARM64** (macos-latest - Apple Silicon)
|
|
11
|
+
|
|
12
|
+
**Trigger:** Push version tags (e.g., `v0.1.13`)
|
|
13
|
+
|
|
14
|
+
**Output:** Creates GitHub release with attached archives:
|
|
15
|
+
- `crow-cli-linux-x86_64.tar.gz`
|
|
16
|
+
- `crow-cli-darwin-x86_64.tar.gz`
|
|
17
|
+
- `crow-cli-darwin-aarch64.tar.gz`
|
|
18
|
+
|
|
19
|
+
### 2. PyInstaller Spec File: `crow-cli.spec`
|
|
20
|
+
|
|
21
|
+
Configured with:
|
|
22
|
+
- **Metadata copying** for all packages using `importlib.metadata` (fastmcp, agent-client-protocol, typer, rich, openai, etc.)
|
|
23
|
+
- **Hidden imports** for dynamic imports (coolname.data, etc.)
|
|
24
|
+
- **Data files** included (config.yaml, system_prompt.jinja2, settings.yml, etc.)
|
|
25
|
+
- **One-file executable** with UPX compression
|
|
26
|
+
|
|
27
|
+
### 3. Dependencies: `pyproject.toml`
|
|
28
|
+
|
|
29
|
+
Added `pyinstaller>=6.0.0` to dev dependency group
|
|
30
|
+
|
|
31
|
+
## 🧪 Local Testing
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
cd crow-cli
|
|
35
|
+
uv --project . pip install pyinstaller
|
|
36
|
+
uv --project . run pyinstaller crow-cli.spec --noconfirm
|
|
37
|
+
dist/crow-cli --help
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## 🚀 Usage
|
|
41
|
+
|
|
42
|
+
### To trigger a build:
|
|
43
|
+
|
|
44
|
+
1. Commit and push the workflow:
|
|
45
|
+
```bash
|
|
46
|
+
git add .github/workflows/build-binaries.yml
|
|
47
|
+
git add crow-cli.spec
|
|
48
|
+
git add pyproject.toml
|
|
49
|
+
git commit -m "Add PyInstaller binary build workflow"
|
|
50
|
+
git push
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
2. Create a test tag:
|
|
54
|
+
```bash
|
|
55
|
+
git tag v0.1.13-test
|
|
56
|
+
git push origin v0.1.13-test
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
3. GitHub Actions will build all platforms and create a release
|
|
60
|
+
|
|
61
|
+
### To update the ACP Registry:
|
|
62
|
+
|
|
63
|
+
After binaries are built, update `agent.json`:
|
|
64
|
+
|
|
65
|
+
```json
|
|
66
|
+
{
|
|
67
|
+
"distribution": {
|
|
68
|
+
"uvx": {...},
|
|
69
|
+
"binary": {
|
|
70
|
+
"darwin-aarch64": {
|
|
71
|
+
"archive": "https://github.com/crow-cli/crow-cli/releases/download/v0.1.13/crow-cli-darwin-aarch64.tar.gz",
|
|
72
|
+
"cmd": "./crow-cli",
|
|
73
|
+
"args": ["acp"]
|
|
74
|
+
},
|
|
75
|
+
"darwin-x86_64": {...},
|
|
76
|
+
"linux-x86_64": {...}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Then submit PR to [agentclientprotocol/registry](https://github.com/agentclientprotocol/registry)
|
|
83
|
+
|
|
84
|
+
## ⚠️ Known Issues & Solutions
|
|
85
|
+
|
|
86
|
+
### Package Metadata Errors
|
|
87
|
+
If you see `importlib.metadata.PackageNotFoundError`, add the package to the `copy_metadata()` calls in the spec file:
|
|
88
|
+
|
|
89
|
+
```python
|
|
90
|
+
datas=[
|
|
91
|
+
...
|
|
92
|
+
] + copy_metadata('packagename')
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Missing Module Errors
|
|
96
|
+
If you see `ModuleNotFoundError` for submodules, add to `hiddenimports`:
|
|
97
|
+
|
|
98
|
+
```python
|
|
99
|
+
hiddenimports=[
|
|
100
|
+
'packagename.submodule',
|
|
101
|
+
...
|
|
102
|
+
]
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Build Size
|
|
106
|
+
Current Linux build: ~80MB (compressed with UPX)
|
|
107
|
+
|
|
108
|
+
## 📝 Notes
|
|
109
|
+
|
|
110
|
+
- The spec file handles all metadata copying, so no command-line flags needed
|
|
111
|
+
- macOS builds use different runners for Intel (macos-13) vs Apple Silicon (macos-latest)
|
|
112
|
+
- Artifacts are retained for 30 days, but releases are permanent
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# Terminal Stack — crow spaceship edition
|
|
2
|
+
|
|
3
|
+
The dev terminal stack on this box, documented 2026-08-29. Everything is
|
|
4
|
+
installed without sudo (user-local), and rio is built from source — which
|
|
5
|
+
is the whole point, see below.
|
|
6
|
+
|
|
7
|
+
## Rio terminal (built from source — `~/src/rio`, v0.5.26)
|
|
8
|
+
|
|
9
|
+
Installed at `~/.cargo/bin/rio`. Config: `~/.config/rio/config.toml`
|
|
10
|
+
(shades-of-dracula crow flavor — chrome accents are Dracula purple
|
|
11
|
+
`#BD93F9`, matching `src/crow_cli/tui/themes.py`; ANSI yellow stays
|
|
12
|
+
yellow for program output). Font: DejaVu Sans Mono 12px, deliberately
|
|
13
|
+
NOT a Nerd Font (won the bake-off against Lilex; tested against Zed).
|
|
14
|
+
All prompt/tool symbols in this stack are DejaVu-safe.
|
|
15
|
+
|
|
16
|
+
### What building from source buys
|
|
17
|
+
|
|
18
|
+
The default Linux build uses the native Vulkan backend. Two cargo
|
|
19
|
+
features are off by default and only reachable with a source build
|
|
20
|
+
(`frontends/rioterm/Cargo.toml`):
|
|
21
|
+
|
|
22
|
+
1. **`wgpu` — RetroArch shader filters.** The librashader filter chain
|
|
23
|
+
(https://rioterm.com/docs/features/retroarch-shaders) only runs on
|
|
24
|
+
the wgpu backend. Post-processing for the whole terminal: built-in
|
|
25
|
+
`newpixiecrt`, or any `.slangp` from libretro/slang-shaders (CRT,
|
|
26
|
+
bloom, scanlines — the spaceship-cockpit look).
|
|
27
|
+
2. **`audio` — real audio bell** via cpal (`handle_audio_bell` in
|
|
28
|
+
`frontends/rioterm/src/application.rs`).
|
|
29
|
+
|
|
30
|
+
Also available in config regardless of build: `[renderer] strategy =
|
|
31
|
+
"Game"` (continuous game-loop rendering) vs the default event-based.
|
|
32
|
+
|
|
33
|
+
### Rebuild with shaders enabled
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
cd ~/src/rio
|
|
37
|
+
cargo install --path frontends/rioterm --features wgpu,audio --force
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Then in `~/.config/rio/config.toml`:
|
|
41
|
+
|
|
42
|
+
```toml
|
|
43
|
+
[renderer]
|
|
44
|
+
backend = "Webgpu"
|
|
45
|
+
filters = ["newpixiecrt"] # or a path to any .slangp
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Note: wgpu-on-Linux translates through to Vulkan (slightly heavier than
|
|
49
|
+
the native backend); filters cost some GPU. If `filters` is set but the
|
|
50
|
+
backend is native Vulkan, rio accepts the config and silently skips the
|
|
51
|
+
chain — you must set `backend = "Webgpu"`.
|
|
52
|
+
|
|
53
|
+
Being upstream-from-source also means we can patch rio itself when the
|
|
54
|
+
zellji integration (below) needs something rio doesn't do yet.
|
|
55
|
+
|
|
56
|
+
## Shell stack (bash 5.2 — no shell switch, bash gets the upgrades)
|
|
57
|
+
|
|
58
|
+
All user-local; `~/.bashrc` is the spaceship (original at `~/.bashrc.bak`).
|
|
59
|
+
|
|
60
|
+
| Tool | What it does | Lives at |
|
|
61
|
+
|---|---|---|
|
|
62
|
+
| **starship** | prompt — git/lang/duration, Dracula palette | `~/.local/bin/starship`, config `~/.config/starship.toml` |
|
|
63
|
+
| **ble.sh** | readline replacement: syntax highlighting, autosuggestions, menu completion | `~/.local/share/ble-nightly/`, config `~/.blerc` |
|
|
64
|
+
| **eza** | ls with git status + tree | `~/.local/bin/eza` |
|
|
65
|
+
| **bat** | cat with syntax highlighting | `~/.local/bin/bat` |
|
|
66
|
+
| **zoxide** | `z foo` frecency directory jumps (`zi` interactive) | `~/.local/bin/zoxide` |
|
|
67
|
+
| **fzf** | Ctrl-R fuzzy history, Ctrl-T files, Alt-C dirs (fd-backed) | `~/.local/bin/fzf` + `~/.local/share/fzf/*.bash` |
|
|
68
|
+
| **delta** | git diff pager (wire via `git config --global core.pager delta` when wanted) | `~/.local/bin/delta` |
|
|
69
|
+
| **fd / rg** | already present via cargo | `~/.cargo/bin` |
|
|
70
|
+
| **hx** | helix editor, `$EDITOR` | system |
|
|
71
|
+
|
|
72
|
+
Update paths: starship re-runs its installer; ble.sh = re-download the
|
|
73
|
+
nightly tarball (`ble.sh/releases/download/nightly/ble-nightly.tar.xz`
|
|
74
|
+
→ extract to `~/.local/share`, no gawk/make needed for the prebuilt
|
|
75
|
+
tarball); the rest are GitHub-release binaries (x86_64).
|
|
76
|
+
|
|
77
|
+
### `CROW_TERMINAL` — machine-driven PTY convention
|
|
78
|
+
|
|
79
|
+
The MCP terminal tool (`mcp/terminal/backend.py`) spawns interactive
|
|
80
|
+
bash in a PTY and owns the prompt via a JSON-in-PS1 protocol
|
|
81
|
+
(`###PS1JSON###` markers, exit code in `$__crow_ec`). It sets
|
|
82
|
+
`CROW_TERMINAL=1` in the child env. Prompt frameworks must respect it:
|
|
83
|
+
|
|
84
|
+
- **starship / ble.sh**: stay OFF under `CROW_TERMINAL` (they re-render
|
|
85
|
+
PS1 / take over line editing and clobber the protocol).
|
|
86
|
+
- **PROMPT_COMMAND hooks** (zoxide, fnm, ...): fine — the backend
|
|
87
|
+
captures `$?` into `$__crow_ec` before any hook runs.
|
|
88
|
+
|
|
89
|
+
Any future shell decoration in `~/.bashrc` must keep the gate.
|
|
90
|
+
|
|
91
|
+
### bashrc load order (matters)
|
|
92
|
+
|
|
93
|
+
1. interactive guard → 2. ble.sh `--attach=none` (first) → 3. history →
|
|
94
|
+
4. env (hx, LESS_TERMCAP, GCC_COLORS) → 5. toolchain PATH blocks
|
|
95
|
+
(cargo/fnm/bun/juliaup) → 6. aliases (eza/bat/git) → 7. fzf bindings →
|
|
96
|
+
8. bash-completion → 9. `starship init` + `zoxide init` → 10.
|
|
97
|
+
`ble-attach` (LAST — ble.sh takes over line editing).
|
|
98
|
+
|
|
99
|
+
## The zellji vision (why this is documented in crow-cli)
|
|
100
|
+
|
|
101
|
+
Goal: crow-cli grows into the glue of a full terminal IDE, replacing
|
|
102
|
+
the pile of bash scripts in https://github.com/josephschmitt/zide
|
|
103
|
+
(zellij layouts + `zide-pick` yazi wrapper + `zide-edit` editor
|
|
104
|
+
launcher) with Python.
|
|
105
|
+
|
|
106
|
+
- **zellij** = window/pane manager (the "IDE frame")
|
|
107
|
+
- **yazi** = filesystem pane
|
|
108
|
+
- **helix** (`hx`) = editor pane
|
|
109
|
+
- **crow-cli TUI** = the agent pane AND the orchestrator: spawns the
|
|
110
|
+
layout, routes "open file" events from yazi into helix, drives the
|
|
111
|
+
agent — i.e. `crow-cli ide` instead of `zide` + `zide-pick` +
|
|
112
|
+
`zide-edit`.
|
|
113
|
+
|
|
114
|
+
Stepping stones: crow-cli already speaks ACP to its own agent and has
|
|
115
|
+
a TUI that drives it; the zide behaviors to absorb are (1) layout
|
|
116
|
+
launch with working-dir propagation, (2) filepicker → editor IPC
|
|
117
|
+
(zide uses zellij's pipe/message), (3) pane auto-resize for the picker.
|
|
118
|
+
Rio-from-source is the display layer: if the IDE glue needs something
|
|
119
|
+
from the terminal (keycodes, shader states, notifications), we patch
|
|
120
|
+
rio rather than work around it.
|