@scemoon/cdh 1.0.5 → 1.0.7
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.
- package/package.json +2 -2
- package/run.js +68 -14
- package/ai-dlc-skill/SKILL.md +0 -77
- package/ai-dlc-skill/agents/deliver-agent.md +0 -24
- package/ai-dlc-skill/agents/master.md +0 -50
- package/ai-dlc-skill/agents/plan-agent.md +0 -23
- package/ai-dlc-skill/agents/understand-agent.md +0 -23
- package/ai-dlc-skill/agents/verify-agent.md +0 -27
- package/ai-dlc-skill/architecture/project-structure.md +0 -78
- package/ai-dlc-skill/brownfield/README.md +0 -30
- package/ai-dlc-skill/brownfield/generate-context.sh +0 -64
- package/ai-dlc-skill/brownfield/scripts/deps.sh +0 -27
- package/ai-dlc-skill/brownfield/scripts/discover.sh +0 -34
- package/ai-dlc-skill/brownfield/scripts/extract-api.sh +0 -45
- package/ai-dlc-skill/components/backend.md +0 -34
- package/ai-dlc-skill/components/desktop.md +0 -30
- package/ai-dlc-skill/components/mya.md +0 -29
- package/ai-dlc-skill/components/native.md +0 -30
- package/ai-dlc-skill/components/tta.md +0 -29
- package/ai-dlc-skill/components/web.md +0 -31
- package/ai-dlc-skill/components/wxa.md +0 -29
- package/ai-dlc-skill/contracts/README.md +0 -25
- package/ai-dlc-skill/core/adaptive-flow.md +0 -36
- package/ai-dlc-skill/core/security.md +0 -29
- package/ai-dlc-skill/cross-tool/cline/export.sh +0 -31
- package/ai-dlc-skill/cross-tool/copilot/export.sh +0 -47
- package/ai-dlc-skill/cross-tool/cursor/export.sh +0 -32
- package/ai-dlc-skill/cross-tool/export.sh +0 -22
- package/ai-dlc-skill/cross-tool/onecode/config.yaml.tpl +0 -17
- package/ai-dlc-skill/cross-tool/onecode/export-skills.sh +0 -35
- package/ai-dlc-skill/cross-tool/onecode/export.sh +0 -54
- package/ai-dlc-skill/phases/deliver/entry.md +0 -26
- package/ai-dlc-skill/phases/deliver/lifecycle.md +0 -185
- package/ai-dlc-skill/phases/deliver/prompt.md +0 -40
- package/ai-dlc-skill/phases/deliver/rules.md +0 -61
- package/ai-dlc-skill/phases/plan/entry.md +0 -25
- package/ai-dlc-skill/phases/plan/lifecycle.md +0 -204
- package/ai-dlc-skill/phases/plan/prompt.md +0 -38
- package/ai-dlc-skill/phases/plan/rules.md +0 -25
- package/ai-dlc-skill/phases/understand/entry.md +0 -26
- package/ai-dlc-skill/phases/understand/lifecycle.md +0 -184
- package/ai-dlc-skill/phases/understand/prompt.md +0 -41
- package/ai-dlc-skill/phases/understand/rules.md +0 -37
- package/ai-dlc-skill/phases/verify/entry.md +0 -26
- package/ai-dlc-skill/phases/verify/lifecycle.md +0 -192
- package/ai-dlc-skill/phases/verify/prompt.md +0 -43
- package/ai-dlc-skill/phases/verify/rules.md +0 -73
- package/ai-dlc-skill/practices/bdd.md +0 -91
- package/ai-dlc-skill/practices/sdd.md +0 -84
- package/ai-dlc-skill/practices/tdd.md +0 -95
- package/ai-dlc-skill/providers/README.md +0 -114
- package/ai-dlc-skill/providers/aliyun/deployment.yaml +0 -66
- package/ai-dlc-skill/providers/aliyun/preview.yaml +0 -84
- package/ai-dlc-skill/providers/aliyun/provider.yaml +0 -160
- package/ai-dlc-skill/providers/tcb/deployment.yaml +0 -69
- package/ai-dlc-skill/providers/tcb/preview.yaml +0 -83
- package/ai-dlc-skill/providers/tcb/provider.yaml +0 -172
- package/ai-dlc-skill/requirements.md +0 -140
- package/ai-dlc-skill/skill.yaml +0 -147
- package/ai-dlc-skill/templates/integration/CHANGELOG.md +0 -41
- package/ai-dlc-skill/templates/integration/asyncapi.yaml +0 -43
- package/ai-dlc-skill/templates/integration/contract-diff.md +0 -63
- package/ai-dlc-skill/templates/integration/contract-spec.md +0 -49
- package/ai-dlc-skill/templates/integration/openapi.yaml +0 -18
- package/ai-dlc-skill/templates/integration/runtime-contract.yaml +0 -36
- package/ai-dlc-skill/templates/plan/design.md +0 -49
- package/ai-dlc-skill/templates/plan/task-list.md +0 -32
- package/ai-dlc-skill/templates/project/README.md +0 -126
- package/ai-dlc-skill/templates/project/template.md +0 -119
- package/ai-dlc-skill/templates/understand/feature.feature +0 -23
- package/ai-dlc-skill/templates/understand/intent.md +0 -29
- package/ai-dlc-skill/templates/understand/spec-delta.md +0 -47
- package/ai-dlc-skill/templates/verify/test-unit.py +0 -27
- package/ai-dlc-skill/walkthrough/collect.sh +0 -50
- package/ai-dlc-skill/walkthrough/template.md +0 -54
- package/ai-dlc-skill/workflows/ai-dlc.yaml +0 -110
- package/ai-dlc-skill/workflows/deployment.yaml +0 -199
- package/cdh/__init__.py +0 -0
- package/cdh/__main__.py +0 -4
- package/cdh/__pycache__/__init__.cpython-314.pyc +0 -0
- package/cdh/__pycache__/cdh_mcp_injector.cpython-314.pyc +0 -0
- package/cdh/__pycache__/cdh_mcp_loader.cpython-314.pyc +0 -0
- package/cdh/__pycache__/cdh_mcp_manager.cpython-314.pyc +0 -0
- package/cdh/__pycache__/cdh_session_aggregator.cpython-314.pyc +0 -0
- package/cdh/__pycache__/cdh_skill_loader.cpython-314.pyc +0 -0
- package/cdh/__pycache__/cdh_skill_manager.cpython-314.pyc +0 -0
- package/cdh/__pycache__/cli.cpython-313.pyc +0 -0
- package/cdh/__pycache__/cli.cpython-314.pyc +0 -0
- package/cdh/__pycache__/scaffold.cpython-314.pyc +0 -0
- package/cdh/cdh_mcp_injector.py +0 -115
- package/cdh/cdh_mcp_loader.py +0 -67
- package/cdh/cdh_mcp_manager.py +0 -73
- package/cdh/cdh_session_aggregator.py +0 -258
- package/cdh/cdh_skill_manager.py +0 -105
- package/cdh/cli.py +0 -758
- package/cdh/scaffold.py +0 -728
- package/onecode/__init__.py +0 -1
- package/onecode/__main__.py +0 -4
- package/onecode/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/__pycache__/cli.cpython-314.pyc +0 -0
- package/onecode/__pycache__/commands.cpython-314.pyc +0 -0
- package/onecode/__pycache__/config.cpython-314.pyc +0 -0
- package/onecode/__pycache__/config_screen.cpython-314.pyc +0 -0
- package/onecode/__pycache__/migrate.cpython-314.pyc +0 -0
- package/onecode/agent/__init__.py +0 -0
- package/onecode/agent/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/cdh_loader.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/context.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/engine.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/hooks.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/onecode_agent_acp.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/permissions.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/permissions_store.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/project_doc.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/session.cpython-314.pyc +0 -0
- package/onecode/agent/agents/__init__.py +0 -29
- package/onecode/agent/agents/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/agent/agents/__pycache__/types.cpython-314.pyc +0 -0
- package/onecode/agent/agents/types.py +0 -589
- package/onecode/agent/attachments.py +0 -112
- package/onecode/agent/cdh_loader.py +0 -267
- package/onecode/agent/context.py +0 -343
- package/onecode/agent/engine.py +0 -2700
- package/onecode/agent/hooks.py +0 -86
- package/onecode/agent/onecode_agent_acp.py +0 -2743
- package/onecode/agent/onecode_agent_acp.py.bak +0 -2447
- package/onecode/agent/permissions.py +0 -150
- package/onecode/agent/permissions_store.py +0 -62
- package/onecode/agent/project_doc.py +0 -19
- package/onecode/agent/session.py +0 -195
- package/onecode/agent/snapshot.py +0 -144
- package/onecode/agent/tools/__init__.py +0 -17
- package/onecode/agent/tools/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/agent_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/apply_patch_tool.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/bash_tool.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/communication_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/config_tool.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/cron_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/errors.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/file_ops.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/file_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/git_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/lsp_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/mcp_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/permission_handler.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/permissions.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/protocol.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/registry.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/sandbox.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/schema_validation.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/skill_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/todo_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/web_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/agent_tools.py +0 -132
- package/onecode/agent/tools/apply_patch_tool.py +0 -138
- package/onecode/agent/tools/bash_tool.py +0 -111
- package/onecode/agent/tools/communication_tools.py +0 -148
- package/onecode/agent/tools/config_tool.py +0 -130
- package/onecode/agent/tools/cron_tools.py +0 -178
- package/onecode/agent/tools/errors.py +0 -17
- package/onecode/agent/tools/file_ops.py +0 -221
- package/onecode/agent/tools/file_tools.py +0 -225
- package/onecode/agent/tools/git_tools.py +0 -88
- package/onecode/agent/tools/lsp_tools.py +0 -404
- package/onecode/agent/tools/mcp_tools.py +0 -127
- package/onecode/agent/tools/permission_handler.py +0 -46
- package/onecode/agent/tools/permissions.py +0 -77
- package/onecode/agent/tools/protocol.py +0 -20
- package/onecode/agent/tools/registry.py +0 -201
- package/onecode/agent/tools/sandbox.py +0 -358
- package/onecode/agent/tools/schema_validation.py +0 -100
- package/onecode/agent/tools/skill_tools.py +0 -52
- package/onecode/agent/tools/todo_tools.py +0 -207
- package/onecode/agent/tools/web_tools.py +0 -169
- package/onecode/builtin_skills/agent-browser/SKILL.md +0 -212
- package/onecode/builtin_skills/agent-browser/skill.yaml +0 -8
- package/onecode/builtin_skills/git/SKILL.md +0 -64
- package/onecode/builtin_skills/git/skill.yaml +0 -7
- package/onecode/builtin_skills/shell/SKILL.md +0 -58
- package/onecode/builtin_skills/shell/skill.yaml +0 -8
- package/onecode/builtin_skills/skill-creator/SKILL.md +0 -106
- package/onecode/builtin_skills/skill-creator/skill.yaml +0 -8
- package/onecode/cli.py +0 -935
- package/onecode/cloud/__init__.py +0 -0
- package/onecode/cloud/base.py +0 -20
- package/onecode/codebase/__init__.py +0 -69
- package/onecode/codebase/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/codebase/__pycache__/chunker.cpython-314.pyc +0 -0
- package/onecode/codebase/__pycache__/indexer.cpython-314.pyc +0 -0
- package/onecode/codebase/__pycache__/retriever.cpython-314.pyc +0 -0
- package/onecode/codebase/__pycache__/storage.cpython-314.pyc +0 -0
- package/onecode/codebase/__pycache__/tools.cpython-314.pyc +0 -0
- package/onecode/codebase/chunker.py +0 -125
- package/onecode/codebase/indexer.py +0 -149
- package/onecode/codebase/retriever.py +0 -203
- package/onecode/codebase/storage.py +0 -131
- package/onecode/codebase/tools.py +0 -59
- package/onecode/commands.py +0 -596
- package/onecode/config.py +0 -314
- package/onecode/config_screen.py +0 -600
- package/onecode/cron/__init__.py +0 -3
- package/onecode/lsp/__init__.py +0 -3
- package/onecode/mcp/__init__.py +0 -4
- package/onecode/mcp/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/mcp/__pycache__/client.cpython-314.pyc +0 -0
- package/onecode/mcp/__pycache__/manager.cpython-314.pyc +0 -0
- package/onecode/mcp/client.py +0 -193
- package/onecode/mcp/manager.py +0 -190
- package/onecode/memory/__init__.py +0 -49
- package/onecode/memory/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/memory/__pycache__/backend.cpython-314.pyc +0 -0
- package/onecode/memory/__pycache__/offload.cpython-314.pyc +0 -0
- package/onecode/memory/__pycache__/pyramid.cpython-314.pyc +0 -0
- package/onecode/memory/__pycache__/recall.cpython-314.pyc +0 -0
- package/onecode/memory/__pycache__/symbolic.cpython-314.pyc +0 -0
- package/onecode/memory/backend.py +0 -159
- package/onecode/memory/pyramid.py +0 -133
- package/onecode/memory/recall.py +0 -203
- package/onecode/migrate.py +0 -122
- package/onecode/models/__init__.py +0 -4
- package/onecode/models/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/models/__pycache__/errors.cpython-314.pyc +0 -0
- package/onecode/models/__pycache__/messages.cpython-314.pyc +0 -0
- package/onecode/models/__pycache__/provider.cpython-314.pyc +0 -0
- package/onecode/models/__pycache__/registry.cpython-314.pyc +0 -0
- package/onecode/models/errors.py +0 -104
- package/onecode/models/messages.py +0 -739
- package/onecode/models/provider.py +0 -699
- package/onecode/models/providers/__init__.py +0 -17
- package/onecode/models/providers/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/models/providers/__pycache__/anthropic_provider.cpython-314.pyc +0 -0
- package/onecode/models/providers/__pycache__/deepseek_provider.cpython-314.pyc +0 -0
- package/onecode/models/providers/__pycache__/glm_provider.cpython-314.pyc +0 -0
- package/onecode/models/providers/__pycache__/minimax_provider.cpython-314.pyc +0 -0
- package/onecode/models/providers/__pycache__/minimaxi_provider.cpython-314.pyc +0 -0
- package/onecode/models/providers/__pycache__/ollama_provider.cpython-314.pyc +0 -0
- package/onecode/models/providers/__pycache__/openai_provider.cpython-314.pyc +0 -0
- package/onecode/models/providers/anthropic_provider.py +0 -273
- package/onecode/models/providers/deepseek_provider.py +0 -212
- package/onecode/models/providers/glm_provider.py +0 -195
- package/onecode/models/providers/minimax_provider.py +0 -158
- package/onecode/models/providers/minimaxi_provider.py +0 -417
- package/onecode/models/providers/ollama_provider.py +0 -100
- package/onecode/models/providers/openai_provider.py +0 -237
- package/onecode/models/registry.py +0 -212
- package/onecode/server/__init__.py +0 -3
- package/onecode/server/app.py +0 -224
- package/onecode/skills/__init__.py +0 -11
- package/onecode/skills/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/skills/__pycache__/argument_substitution.cpython-314.pyc +0 -0
- package/onecode/skills/__pycache__/bootstrap.cpython-314.pyc +0 -0
- package/onecode/skills/__pycache__/create.cpython-314.pyc +0 -0
- package/onecode/skills/__pycache__/frontmatter.cpython-314.pyc +0 -0
- package/onecode/skills/__pycache__/loader.cpython-314.pyc +0 -0
- package/onecode/skills/__pycache__/manager.cpython-314.pyc +0 -0
- package/onecode/skills/__pycache__/model.cpython-314.pyc +0 -0
- package/onecode/skills/argument_substitution.py +0 -38
- package/onecode/skills/bootstrap.py +0 -124
- package/onecode/skills/create.py +0 -56
- package/onecode/skills/frontmatter.py +0 -33
- package/onecode/skills/loader.py +0 -139
- package/onecode/skills/manager.py +0 -75
- package/onecode/skills/model.py +0 -43
- package/onecode/storage/__init__.py +0 -0
- package/onecode/storage/activity.py +0 -63
- package/onecode/storage/project.py +0 -54
- package/onecode/storage/session.py +0 -112
- package/onecode/tasks/__init__.py +0 -26
- package/onecode/tasks/manager.py +0 -232
- package/onecode/tasks/models.py +0 -240
- package/onecode/trace/__init__.py +0 -0
- package/onecode/trace/tracer.py +0 -173
- package/onecode/utils/__init__.py +0 -0
- package/onecode/utils/helpers.py +0 -20
- package/pyproject.toml +0 -74
- package/tui/__init__.py +0 -46
- package/tui/__main__.py +0 -4
- package/tui/__pycache__/__init__.cpython-314.pyc +0 -0
- package/tui/__pycache__/_loop.cpython-314.pyc +0 -0
- package/tui/__pycache__/_path_fuzzy_search.cpython-314.pyc +0 -0
- package/tui/__pycache__/_path_match.cpython-314.pyc +0 -0
- package/tui/__pycache__/about.cpython-314.pyc +0 -0
- package/tui/__pycache__/agent.cpython-314.pyc +0 -0
- package/tui/__pycache__/agent_schema.cpython-314.pyc +0 -0
- package/tui/__pycache__/agents.cpython-314.pyc +0 -0
- package/tui/__pycache__/answer.cpython-314.pyc +0 -0
- package/tui/__pycache__/app.cpython-313.pyc +0 -0
- package/tui/__pycache__/app.cpython-314.pyc +0 -0
- package/tui/__pycache__/atomic.cpython-314.pyc +0 -0
- package/tui/__pycache__/complete.cpython-314.pyc +0 -0
- package/tui/__pycache__/constants.cpython-314.pyc +0 -0
- package/tui/__pycache__/conversation_markdown.cpython-314.pyc +0 -0
- package/tui/__pycache__/danger.cpython-314.pyc +0 -0
- package/tui/__pycache__/db.cpython-314.pyc +0 -0
- package/tui/__pycache__/dec.cpython-314.pyc +0 -0
- package/tui/__pycache__/directory.cpython-314.pyc +0 -0
- package/tui/__pycache__/directory_suggester.cpython-314.pyc +0 -0
- package/tui/__pycache__/directory_watcher.cpython-314.pyc +0 -0
- package/tui/__pycache__/format_path.cpython-314.pyc +0 -0
- package/tui/__pycache__/fuzzy.cpython-314.pyc +0 -0
- package/tui/__pycache__/fuzzy_index.cpython-314.pyc +0 -0
- package/tui/__pycache__/history.cpython-314.pyc +0 -0
- package/tui/__pycache__/jsonrpc.cpython-314.pyc +0 -0
- package/tui/__pycache__/menus.cpython-314.pyc +0 -0
- package/tui/__pycache__/message_log.cpython-314.pyc +0 -0
- package/tui/__pycache__/messages.cpython-314.pyc +0 -0
- package/tui/__pycache__/path_complete.cpython-314.pyc +0 -0
- package/tui/__pycache__/path_filter.cpython-314.pyc +0 -0
- package/tui/__pycache__/paths.cpython-314.pyc +0 -0
- package/tui/__pycache__/pill.cpython-314.pyc +0 -0
- package/tui/__pycache__/platform_commands.cpython-314.pyc +0 -0
- package/tui/__pycache__/protocol.cpython-314.pyc +0 -0
- package/tui/__pycache__/session_tracker.cpython-314.pyc +0 -0
- package/tui/__pycache__/settings.cpython-314.pyc +0 -0
- package/tui/__pycache__/settings_schema.cpython-314.pyc +0 -0
- package/tui/__pycache__/shell.cpython-314.pyc +0 -0
- package/tui/__pycache__/shell_read.cpython-314.pyc +0 -0
- package/tui/__pycache__/slash_command.cpython-314.pyc +0 -0
- package/tui/__pycache__/version.cpython-314.pyc +0 -0
- package/tui/_loop.py +0 -86
- package/tui/_path_fuzzy_search.py +0 -48
- package/tui/_path_match.py +0 -141
- package/tui/about.py +0 -95
- package/tui/acp/__pycache__/agent.cpython-314.pyc +0 -0
- package/tui/acp/__pycache__/api.cpython-314.pyc +0 -0
- package/tui/acp/__pycache__/encode_tool_call_id.cpython-314.pyc +0 -0
- package/tui/acp/__pycache__/messages.cpython-314.pyc +0 -0
- package/tui/acp/__pycache__/prompt.cpython-314.pyc +0 -0
- package/tui/acp/__pycache__/protocol.cpython-314.pyc +0 -0
- package/tui/acp/agent.py +0 -1002
- package/tui/acp/api.py +0 -73
- package/tui/acp/encode_tool_call_id.py +0 -12
- package/tui/acp/messages.py +0 -203
- package/tui/acp/prompt.py +0 -53
- package/tui/acp/protocol.py +0 -499
- package/tui/agent.py +0 -70
- package/tui/agent_schema.py +0 -76
- package/tui/agents.py +0 -46
- package/tui/ansi/__init__.py +0 -1
- package/tui/ansi/__pycache__/__init__.cpython-314.pyc +0 -0
- package/tui/ansi/__pycache__/_ansi.cpython-314.pyc +0 -0
- package/tui/ansi/__pycache__/_ansi_colors.cpython-314.pyc +0 -0
- package/tui/ansi/__pycache__/_control_codes.cpython-314.pyc +0 -0
- package/tui/ansi/__pycache__/_keys.cpython-314.pyc +0 -0
- package/tui/ansi/__pycache__/_sgr_styles.cpython-314.pyc +0 -0
- package/tui/ansi/__pycache__/_stream_parser.cpython-314.pyc +0 -0
- package/tui/ansi/_ansi.py +0 -1689
- package/tui/ansi/_ansi_colors.py +0 -264
- package/tui/ansi/_control_codes.py +0 -37
- package/tui/ansi/_keys.py +0 -251
- package/tui/ansi/_sgr_styles.py +0 -64
- package/tui/ansi/_stream_parser.py +0 -418
- package/tui/answer.py +0 -12
- package/tui/app.py +0 -1266
- package/tui/atomic.py +0 -37
- package/tui/cli.py +0 -313
- package/tui/code_analyze.py +0 -27
- package/tui/complete.py +0 -38
- package/tui/constants.py +0 -61
- package/tui/conversation_markdown.py +0 -30
- package/tui/danger.py +0 -372
- package/tui/data/agents/ampcode.com.toml +0 -52
- package/tui/data/agents/augmentcode.com.toml +0 -41
- package/tui/data/agents/cdh.cloud-dev-harness.toml +0 -23
- package/tui/data/agents/claude.com.toml +0 -41
- package/tui/data/agents/copilot.github.com.toml +0 -29
- package/tui/data/agents/crowai.dev.toml +0 -36
- package/tui/data/agents/cursor.com.toml +0 -38
- package/tui/data/agents/deepagents.langchain.com +0 -34
- package/tui/data/agents/docker.com.toml +0 -60
- package/tui/data/agents/geminicli.com.toml +0 -28
- package/tui/data/agents/goose.ai.toml +0 -52
- package/tui/data/agents/inference.huggingface.co.toml +0 -41
- package/tui/data/agents/kimi.com.toml +0 -35
- package/tui/data/agents/kiro.dev.toml +0 -43
- package/tui/data/agents/onecode.dev.toml +0 -22
- package/tui/data/agents/openai.com.toml +0 -53
- package/tui/data/agents/openclaw.ai.toml +0 -37
- package/tui/data/agents/opencode.ai.toml +0 -39
- package/tui/data/agents/openhands.dev.toml +0 -46
- package/tui/data/agents/stakpak.dev.toml +0 -62
- package/tui/data/agents/vibe.mistral.ai.toml +0 -31
- package/tui/data/agents/vtcode.dev.toml +0 -63
- package/tui/data/images/frog.png +0 -0
- package/tui/data/sounds/question.wav +0 -0
- package/tui/data/sounds/turn-over.wav +0 -0
- package/tui/db.py +0 -213
- package/tui/dec.py +0 -332
- package/tui/directory.py +0 -234
- package/tui/directory_suggester.py +0 -93
- package/tui/directory_watcher.py +0 -231
- package/tui/format_path.py +0 -25
- package/tui/fuzzy.py +0 -140
- package/tui/fuzzy_index.py +0 -275
- package/tui/gist.py +0 -33
- package/tui/history.py +0 -138
- package/tui/jsonrpc.py +0 -578
- package/tui/menus.py +0 -14
- package/tui/message_log.py +0 -69
- package/tui/messages.py +0 -144
- package/tui/option_content.py +0 -51
- package/tui/os.py +0 -0
- package/tui/path_complete.py +0 -217
- package/tui/path_filter.py +0 -124
- package/tui/paths.py +0 -87
- package/tui/pill.py +0 -23
- package/tui/platform_commands.py +0 -52
- package/tui/prompt/__pycache__/extract.cpython-314.pyc +0 -0
- package/tui/prompt/__pycache__/resource.cpython-314.pyc +0 -0
- package/tui/prompt/extract.py +0 -19
- package/tui/prompt/resource.py +0 -68
- package/tui/protocol.py +0 -28
- package/tui/screens/__init__.py +0 -0
- package/tui/screens/__pycache__/__init__.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/agent_modal.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/component_picker.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/diff_screen.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/log.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/main.cpython-313.pyc +0 -0
- package/tui/screens/__pycache__/main.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/permissions.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/projects_app.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/projects_screen.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/sessions.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/store.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/tool_content_screen.cpython-314.pyc +0 -0
- package/tui/screens/action_modal.py +0 -94
- package/tui/screens/agent_modal.py +0 -175
- package/tui/screens/command_edit_modal.py +0 -74
- package/tui/screens/component_picker.py +0 -168
- package/tui/screens/diff_screen.py +0 -84
- package/tui/screens/log.py +0 -553
- package/tui/screens/main.py +0 -385
- package/tui/screens/main.tcss +0 -655
- package/tui/screens/permissions.py +0 -404
- package/tui/screens/permissions.tcss +0 -72
- package/tui/screens/projects.tcss +0 -80
- package/tui/screens/projects_app.py +0 -347
- package/tui/screens/projects_screen.py +0 -284
- package/tui/screens/session_resume_modal.py +0 -172
- package/tui/screens/session_resume_modal.tcss +0 -35
- package/tui/screens/sessions.py +0 -164
- package/tui/screens/sessions.tcss +0 -119
- package/tui/screens/settings.py +0 -254
- package/tui/screens/settings.tcss +0 -101
- package/tui/screens/store.py +0 -500
- package/tui/screens/store.tcss +0 -274
- package/tui/screens/tool_content_screen.py +0 -59
- package/tui/session_tracker.py +0 -123
- package/tui/settings.py +0 -353
- package/tui/settings_schema.py +0 -431
- package/tui/shell.py +0 -304
- package/tui/shell_read.py +0 -42
- package/tui/slash_command.py +0 -34
- package/tui/tui.tcss +0 -246
- package/tui/twitter.py +0 -38
- package/tui/version.py +0 -80
- package/tui/visuals/__init__.py +0 -0
- package/tui/visuals/__pycache__/__init__.cpython-314.pyc +0 -0
- package/tui/visuals/__pycache__/columns.cpython-314.pyc +0 -0
- package/tui/visuals/columns.py +0 -272
- package/tui/widgets/__init__.py +0 -0
- package/tui/widgets/__pycache__/__init__.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/acp_content.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/agent_response.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/agent_thought.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/ask_user.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/condensed_path.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/context_stats.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/conversation.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/diff_view.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/directory_input.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/flash.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/future_text.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/grid_select.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/highlighted_textarea.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/load_more.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/mandelbrot.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/markdown_note.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/menu.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/modified_files.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/non_selectable_label.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/note.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/path_search.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/plan.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/project_directory_tree.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/project_grid_select.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/project_summary.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/prompt.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/question.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/session_grid_select.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/session_summary.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/session_tabs.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/shell_result.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/shell_terminal.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/side_bar.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/slash_complete.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/strike_text.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/subagent.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/subagent_screen.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/terminal.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/throbber.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/tool_call.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/user_input.cpython-314.pyc +0 -0
- package/tui/widgets/acp_content.py +0 -70
- package/tui/widgets/agent_response.py +0 -76
- package/tui/widgets/agent_thought.py +0 -167
- package/tui/widgets/ask_user.py +0 -264
- package/tui/widgets/command_pane.py +0 -223
- package/tui/widgets/condensed_path.py +0 -115
- package/tui/widgets/context_stats.py +0 -66
- package/tui/widgets/conversation.py +0 -2641
- package/tui/widgets/danger_warning.py +0 -65
- package/tui/widgets/diff_view.py +0 -69
- package/tui/widgets/directory_input.py +0 -8
- package/tui/widgets/flash.py +0 -81
- package/tui/widgets/future_text.py +0 -126
- package/tui/widgets/grid_select.py +0 -234
- package/tui/widgets/highlighted_textarea.py +0 -180
- package/tui/widgets/load_more.py +0 -24
- package/tui/widgets/mandelbrot.py +0 -294
- package/tui/widgets/markdown_note.py +0 -13
- package/tui/widgets/menu.py +0 -147
- package/tui/widgets/modified_files.py +0 -306
- package/tui/widgets/non_selectable_label.py +0 -5
- package/tui/widgets/note.py +0 -18
- package/tui/widgets/path_search.py +0 -492
- package/tui/widgets/plan.py +0 -285
- package/tui/widgets/project_directory_tree.py +0 -102
- package/tui/widgets/project_grid_select.py +0 -64
- package/tui/widgets/project_summary.py +0 -33
- package/tui/widgets/prompt.py +0 -795
- package/tui/widgets/question.py +0 -360
- package/tui/widgets/session_grid_select.py +0 -230
- package/tui/widgets/session_summary.py +0 -115
- package/tui/widgets/session_tabs.py +0 -188
- package/tui/widgets/shell_result.py +0 -35
- package/tui/widgets/shell_terminal.py +0 -40
- package/tui/widgets/side_bar.py +0 -124
- package/tui/widgets/slash_complete.py +0 -235
- package/tui/widgets/strike_text.py +0 -70
- package/tui/widgets/subagent.py +0 -287
- package/tui/widgets/subagent_screen.py +0 -709
- package/tui/widgets/terminal.py +0 -576
- package/tui/widgets/terminal_tool.py +0 -360
- package/tui/widgets/throbber.py +0 -100
- package/tui/widgets/tool_call.py +0 -398
- package/tui/widgets/user_input.py +0 -23
- package/tui/widgets/version.py +0 -5
- package/tui/widgets/welcome.py +0 -31
package/tui/prompt/extract.py
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import re
|
|
2
|
-
from typing import Iterable
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
RE_MATCH_FILE_PROMPT = re.compile(r"@(\S+)|@\"(.*)\"")
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
def extract_paths_from_prompt(prompt: str) -> Iterable[tuple[str, int, int]]:
|
|
9
|
-
"""Find file syntax in prompts.
|
|
10
|
-
|
|
11
|
-
Args:
|
|
12
|
-
prompt: A line of prompt.
|
|
13
|
-
|
|
14
|
-
Yields:
|
|
15
|
-
A tuple of (PATH, START, END).
|
|
16
|
-
"""
|
|
17
|
-
for match in RE_MATCH_FILE_PROMPT.finditer(prompt):
|
|
18
|
-
path, quoted_path = match.groups()
|
|
19
|
-
yield (path or quoted_path, match.start(0), match.end(0))
|
package/tui/prompt/resource.py
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
from dataclasses import dataclass
|
|
2
|
-
import mimetypes
|
|
3
|
-
from pathlib import Path
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
@dataclass
|
|
7
|
-
class Resource:
|
|
8
|
-
root: Path
|
|
9
|
-
path: Path
|
|
10
|
-
mime_type: str
|
|
11
|
-
text: str | None
|
|
12
|
-
data: bytes | None
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
class ResourceError(Exception):
|
|
16
|
-
"""An error occurred reading a resource."""
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class ResourceNotRelative(ResourceError):
|
|
20
|
-
"""Attempted to read a resource, not in the project directory."""
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
class ResourceReadError(ResourceError):
|
|
24
|
-
"""Failed to read the resource."""
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
def load_resource(root: Path, path: Path) -> Resource:
|
|
28
|
-
"""Load a resource from the project directory.
|
|
29
|
-
|
|
30
|
-
Args:
|
|
31
|
-
root: The project root.
|
|
32
|
-
path: Relative path within project.
|
|
33
|
-
|
|
34
|
-
Returns:
|
|
35
|
-
A resource.
|
|
36
|
-
"""
|
|
37
|
-
resource_path = root / path
|
|
38
|
-
|
|
39
|
-
if not resource_path.is_relative_to(root):
|
|
40
|
-
raise ResourceNotRelative("Resource path is not relative to project root.")
|
|
41
|
-
|
|
42
|
-
mime_type, encoding = mimetypes.guess_file_type(resource_path)
|
|
43
|
-
if mime_type is None:
|
|
44
|
-
mime_type = "application/octet-stream"
|
|
45
|
-
|
|
46
|
-
data: bytes | None
|
|
47
|
-
text: str | None
|
|
48
|
-
|
|
49
|
-
try:
|
|
50
|
-
if encoding is not None:
|
|
51
|
-
data = resource_path.read_bytes()
|
|
52
|
-
text = None
|
|
53
|
-
else:
|
|
54
|
-
data = None
|
|
55
|
-
text = resource_path.read_text(encoding, errors="replace")
|
|
56
|
-
except FileNotFoundError:
|
|
57
|
-
raise ResourceReadError(f"File not found {str(path)!r}")
|
|
58
|
-
except Exception as error:
|
|
59
|
-
raise ResourceReadError(f"Failed to read {str(path)!r}; {error}")
|
|
60
|
-
|
|
61
|
-
resource = Resource(
|
|
62
|
-
root,
|
|
63
|
-
resource_path,
|
|
64
|
-
mime_type=mime_type,
|
|
65
|
-
text=text,
|
|
66
|
-
data=data,
|
|
67
|
-
)
|
|
68
|
-
return resource
|
package/tui/protocol.py
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
from typing import Protocol, runtime_checkable, Iterable
|
|
2
|
-
|
|
3
|
-
from textual.widget import Widget
|
|
4
|
-
|
|
5
|
-
from tui.menus import MenuItem
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
@runtime_checkable
|
|
9
|
-
class BlockProtocol(Protocol):
|
|
10
|
-
def block_cursor_up(self) -> Widget | None: ...
|
|
11
|
-
def block_cursor_down(self) -> Widget | None: ...
|
|
12
|
-
def get_cursor_block(self) -> Widget | None: ...
|
|
13
|
-
def block_cursor_clear(self) -> None: ...
|
|
14
|
-
def block_select(self, widget: Widget) -> None: ...
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
@runtime_checkable
|
|
18
|
-
class MenuProtocol(Protocol):
|
|
19
|
-
def get_block_menu(self) -> Iterable[MenuItem]: ...
|
|
20
|
-
def get_block_content(self, destination: str) -> str | None: ...
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
@runtime_checkable
|
|
24
|
-
class ExpandProtocol(Protocol):
|
|
25
|
-
def can_expand(self) -> bool: ...
|
|
26
|
-
def expand_block(self) -> None: ...
|
|
27
|
-
def collapse_block(self) -> None: ...
|
|
28
|
-
def is_block_expanded(self) -> bool: ...
|
package/tui/screens/__init__.py
DELETED
|
File without changes
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
import shutil
|
|
2
|
-
|
|
3
|
-
from textual.app import ComposeResult
|
|
4
|
-
from textual import on, work
|
|
5
|
-
from textual import containers
|
|
6
|
-
from textual import getters
|
|
7
|
-
from textual.content import Content
|
|
8
|
-
from textual.screen import ModalScreen
|
|
9
|
-
from textual import widgets
|
|
10
|
-
from textual.widget import Widget
|
|
11
|
-
|
|
12
|
-
from tui.app import A2TUIApp
|
|
13
|
-
from tui.widgets.command_pane import CommandPane
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
UV_INSTALL = "curl -LsSf https://astral.sh/uv/install.sh | sh"
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class ActionModal(ModalScreen):
|
|
20
|
-
"""Executes an action command."""
|
|
21
|
-
|
|
22
|
-
command_pane = getters.query_one(CommandPane)
|
|
23
|
-
ok_button = getters.query_one("#ok", widgets.Button)
|
|
24
|
-
|
|
25
|
-
app = getters.app(A2TUIApp)
|
|
26
|
-
|
|
27
|
-
BINDINGS = [("escape", "dismiss_modal", "Dismiss")]
|
|
28
|
-
|
|
29
|
-
def __init__(
|
|
30
|
-
self,
|
|
31
|
-
action: str,
|
|
32
|
-
agent: str,
|
|
33
|
-
title: str,
|
|
34
|
-
command: str,
|
|
35
|
-
*,
|
|
36
|
-
bootstrap_uv: bool = False,
|
|
37
|
-
name: str | None = None,
|
|
38
|
-
id: str | None = None,
|
|
39
|
-
classes: str | None = None,
|
|
40
|
-
) -> None:
|
|
41
|
-
self._action = action
|
|
42
|
-
self._agent = agent
|
|
43
|
-
self._title = title
|
|
44
|
-
self._command = command
|
|
45
|
-
self._bootstrap_uv = bootstrap_uv
|
|
46
|
-
super().__init__(name=name, id=id, classes=classes)
|
|
47
|
-
|
|
48
|
-
def get_loading_widget(self) -> Widget:
|
|
49
|
-
return widgets.LoadingIndicator()
|
|
50
|
-
|
|
51
|
-
def compose(self) -> ComposeResult:
|
|
52
|
-
with containers.VerticalGroup(id="container"):
|
|
53
|
-
yield CommandPane()
|
|
54
|
-
yield widgets.Button("OK", id="ok", disabled=True)
|
|
55
|
-
|
|
56
|
-
def enable_button(self) -> None:
|
|
57
|
-
self.ok_button.loading = False
|
|
58
|
-
self.ok_button.disabled = False
|
|
59
|
-
self.ok_button.focus()
|
|
60
|
-
|
|
61
|
-
@on(CommandPane.CommandComplete)
|
|
62
|
-
def on_command_complete(self, event: CommandPane.CommandComplete) -> None:
|
|
63
|
-
self.enable_button()
|
|
64
|
-
|
|
65
|
-
def on_mount(self) -> None:
|
|
66
|
-
self.ok_button.loading = True
|
|
67
|
-
self.command_pane.border_title = Content(self._title)
|
|
68
|
-
self.run_command()
|
|
69
|
-
|
|
70
|
-
@work()
|
|
71
|
-
async def run_command(self) -> None:
|
|
72
|
-
"""Write and execute the command."""
|
|
73
|
-
self.command_pane.anchor()
|
|
74
|
-
if self._bootstrap_uv and shutil.which("uv") is None:
|
|
75
|
-
# Bootstrap UV if required
|
|
76
|
-
await self.command_pane.write(f"$ {UV_INSTALL}\n")
|
|
77
|
-
await self.command_pane.execute(UV_INSTALL, final=False)
|
|
78
|
-
|
|
79
|
-
await self.command_pane.write(f"$ {self._command}\n")
|
|
80
|
-
action_task = self.command_pane.execute(self._command)
|
|
81
|
-
await action_task
|
|
82
|
-
self.app.capture_event(
|
|
83
|
-
"agent-action",
|
|
84
|
-
action=self._action,
|
|
85
|
-
agent=self._agent,
|
|
86
|
-
fail=self.command_pane.return_code != 0,
|
|
87
|
-
)
|
|
88
|
-
|
|
89
|
-
@on(widgets.Button.Pressed)
|
|
90
|
-
def on_button_pressed(self) -> None:
|
|
91
|
-
self.action_dismiss_modal()
|
|
92
|
-
|
|
93
|
-
def action_dismiss_modal(self) -> None:
|
|
94
|
-
self.dismiss(self.command_pane.return_code)
|
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
from typing import cast
|
|
2
|
-
|
|
3
|
-
from textual import on
|
|
4
|
-
from textual import getters
|
|
5
|
-
from textual.app import ComposeResult
|
|
6
|
-
|
|
7
|
-
from textual import work
|
|
8
|
-
from textual.content import Content
|
|
9
|
-
from textual.screen import ModalScreen
|
|
10
|
-
from textual import containers
|
|
11
|
-
from textual import widgets
|
|
12
|
-
from textual.reactive import var
|
|
13
|
-
|
|
14
|
-
import tui
|
|
15
|
-
from textual.binding import Binding
|
|
16
|
-
from tui.agent_schema import Action, Agent, OS, Command
|
|
17
|
-
from tui.app import A2TUIApp
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
class DescriptionContainer(containers.VerticalScroll):
|
|
21
|
-
def allow_focus(self) -> bool:
|
|
22
|
-
"""Focus only if it can be scrolled."""
|
|
23
|
-
return self.show_vertical_scrollbar
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
class AgentModal(ModalScreen):
|
|
27
|
-
AUTO_FOCUS = "Select#action-select"
|
|
28
|
-
|
|
29
|
-
BINDINGS = [
|
|
30
|
-
Binding("escape", "dismiss(None)", "Dismiss", show=False),
|
|
31
|
-
Binding("space", "dismiss('launch')", "Launch agent", priority=True),
|
|
32
|
-
]
|
|
33
|
-
|
|
34
|
-
action = var("")
|
|
35
|
-
|
|
36
|
-
app = getters.app(A2TUIApp)
|
|
37
|
-
action_select = getters.query_one("#action-select", widgets.Select)
|
|
38
|
-
launcher_checkbox = getters.query_one("#launcher-checkbox", widgets.Checkbox)
|
|
39
|
-
|
|
40
|
-
def __init__(self, agent: Agent) -> None:
|
|
41
|
-
self._agent = agent
|
|
42
|
-
super().__init__()
|
|
43
|
-
|
|
44
|
-
def compose(self) -> ComposeResult:
|
|
45
|
-
launcher_set = frozenset(
|
|
46
|
-
self.app.settings.get("launcher.agents", str).splitlines()
|
|
47
|
-
)
|
|
48
|
-
|
|
49
|
-
agent = self._agent
|
|
50
|
-
|
|
51
|
-
app = self.app
|
|
52
|
-
launcher_set = frozenset(app.settings.get("launcher.agents", str).splitlines())
|
|
53
|
-
agent = self._agent
|
|
54
|
-
actions = agent.get("actions", {})
|
|
55
|
-
|
|
56
|
-
script_os = cast(OS, tui.os)
|
|
57
|
-
if script_os not in actions:
|
|
58
|
-
script_os = "*"
|
|
59
|
-
|
|
60
|
-
commands: dict[Action, Command] = actions.get(cast(OS, script_os), {})
|
|
61
|
-
script_choices = [
|
|
62
|
-
(action["description"], name) for name, action in commands.items()
|
|
63
|
-
]
|
|
64
|
-
script_choices.append((f"Launch {agent['name']}", "__launch__"))
|
|
65
|
-
|
|
66
|
-
with containers.Vertical(id="container"):
|
|
67
|
-
with DescriptionContainer(id="description-container"):
|
|
68
|
-
yield widgets.Markdown(agent["help"], id="description")
|
|
69
|
-
with containers.VerticalGroup():
|
|
70
|
-
if "install_acp" in commands:
|
|
71
|
-
yield widgets.Static(
|
|
72
|
-
Content(
|
|
73
|
-
f"{agent['name']} requires an ACP adapter to work with A2TUI. Install from the actions list."
|
|
74
|
-
),
|
|
75
|
-
classes="acp-warning",
|
|
76
|
-
)
|
|
77
|
-
with containers.HorizontalGroup():
|
|
78
|
-
yield widgets.Checkbox(
|
|
79
|
-
"Show in launcher",
|
|
80
|
-
value=agent["identity"] in launcher_set,
|
|
81
|
-
id="launcher-checkbox",
|
|
82
|
-
)
|
|
83
|
-
yield widgets.Select(
|
|
84
|
-
script_choices,
|
|
85
|
-
prompt="Actions",
|
|
86
|
-
allow_blank=True,
|
|
87
|
-
id="action-select",
|
|
88
|
-
)
|
|
89
|
-
yield widgets.Button(
|
|
90
|
-
"Go", variant="primary", id="run-action", disabled=True
|
|
91
|
-
)
|
|
92
|
-
yield widgets.Footer()
|
|
93
|
-
|
|
94
|
-
def on_mount(self) -> None:
|
|
95
|
-
self.query_one("Footer").styles.animate("opacity", 1.0, duration=500 / 1000)
|
|
96
|
-
|
|
97
|
-
@on(widgets.Checkbox.Changed)
|
|
98
|
-
def on_checkbox_changed(self, event: widgets.Select.Changed) -> None:
|
|
99
|
-
launcher_agents = self.app.settings.get("launcher.agents", str).splitlines()
|
|
100
|
-
agent_identity = self._agent["identity"]
|
|
101
|
-
if agent_identity in launcher_agents:
|
|
102
|
-
launcher_agents.remove(agent_identity)
|
|
103
|
-
if event.value:
|
|
104
|
-
launcher_agents.insert(0, agent_identity)
|
|
105
|
-
self.app.settings.set("launcher.agents", "\n".join(launcher_agents))
|
|
106
|
-
|
|
107
|
-
@on(widgets.Select.Changed)
|
|
108
|
-
def on_select_changed(self, event: widgets.Select.Changed) -> None:
|
|
109
|
-
self.action = event.value if isinstance(event.value, str) else ""
|
|
110
|
-
|
|
111
|
-
@work
|
|
112
|
-
@on(widgets.Button.Pressed)
|
|
113
|
-
async def on_button_pressed(self) -> None:
|
|
114
|
-
agent = self._agent
|
|
115
|
-
action = self.action_select.value
|
|
116
|
-
|
|
117
|
-
assert isinstance(action, str)
|
|
118
|
-
if action == "__launch__":
|
|
119
|
-
self.dismiss("launch")
|
|
120
|
-
return
|
|
121
|
-
|
|
122
|
-
agent_actions = self._agent.get("actions", {})
|
|
123
|
-
|
|
124
|
-
if (commands := agent_actions.get(tui.os, None)) is None:
|
|
125
|
-
commands = agent_actions.get("*", None)
|
|
126
|
-
if commands is None:
|
|
127
|
-
self.notify(
|
|
128
|
-
"Action is not available on this platform",
|
|
129
|
-
title="Agent action",
|
|
130
|
-
severity="error",
|
|
131
|
-
)
|
|
132
|
-
return
|
|
133
|
-
command = commands[action]
|
|
134
|
-
|
|
135
|
-
from tui.screens.action_modal import ActionModal
|
|
136
|
-
from tui.screens.command_edit_modal import CommandEditModal
|
|
137
|
-
|
|
138
|
-
title = command["description"]
|
|
139
|
-
agent_id = self._agent["identity"]
|
|
140
|
-
action_command = command["command"]
|
|
141
|
-
bootstrap_uv = command.get("bootstrap_uv", False)
|
|
142
|
-
|
|
143
|
-
agent = self._agent
|
|
144
|
-
# Focus the select
|
|
145
|
-
# It's unlikely the user wants to re-run the action
|
|
146
|
-
self.action_select.focus()
|
|
147
|
-
|
|
148
|
-
action_command = await self.app.push_screen_wait(
|
|
149
|
-
CommandEditModal(action_command)
|
|
150
|
-
)
|
|
151
|
-
if action_command is None:
|
|
152
|
-
return
|
|
153
|
-
|
|
154
|
-
return_code = await self.app.push_screen_wait(
|
|
155
|
-
ActionModal(
|
|
156
|
-
action,
|
|
157
|
-
agent_id,
|
|
158
|
-
title,
|
|
159
|
-
action_command,
|
|
160
|
-
bootstrap_uv=bootstrap_uv,
|
|
161
|
-
)
|
|
162
|
-
)
|
|
163
|
-
if return_code == 0 and action in {"install", "install-acp"}:
|
|
164
|
-
# Add to launcher if we installed something
|
|
165
|
-
if not self.launcher_checkbox.value:
|
|
166
|
-
self.notify(
|
|
167
|
-
f"{agent['name']} has been added to your launcher",
|
|
168
|
-
title="Add agent",
|
|
169
|
-
severity="information",
|
|
170
|
-
)
|
|
171
|
-
self.launcher_checkbox.value = True
|
|
172
|
-
|
|
173
|
-
def watch_action(self, action: str) -> None:
|
|
174
|
-
go_button = self.query_one("#run-action", widgets.Button)
|
|
175
|
-
go_button.disabled = not action
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
from textual import on, work
|
|
2
|
-
from textual.app import ComposeResult
|
|
3
|
-
from textual.screen import ModalScreen
|
|
4
|
-
from textual import widgets
|
|
5
|
-
from textual import containers
|
|
6
|
-
from textual import getters
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class CommandEditModal(ModalScreen[str | None]):
|
|
10
|
-
BINDINGS = [
|
|
11
|
-
("ctrl+c", "copy", "Copy to clipboard"),
|
|
12
|
-
("escape", "dismiss", "Dismiss"),
|
|
13
|
-
]
|
|
14
|
-
AUTO_FOCUS = "Button"
|
|
15
|
-
|
|
16
|
-
text_area = getters.query_one(widgets.TextArea)
|
|
17
|
-
|
|
18
|
-
def __init__(
|
|
19
|
-
self,
|
|
20
|
-
command: str,
|
|
21
|
-
name: str | None = None,
|
|
22
|
-
id: str | None = None,
|
|
23
|
-
classes: str | None = None,
|
|
24
|
-
):
|
|
25
|
-
self.command = command
|
|
26
|
-
super().__init__(name=name, id=id, classes=classes)
|
|
27
|
-
|
|
28
|
-
def compose(self) -> ComposeResult:
|
|
29
|
-
with containers.VerticalGroup(id="container"):
|
|
30
|
-
with containers.Center():
|
|
31
|
-
yield widgets.Label(
|
|
32
|
-
"[b]Run command",
|
|
33
|
-
classes="instructions",
|
|
34
|
-
)
|
|
35
|
-
yield widgets.Static(
|
|
36
|
-
"A2TUI will run the following command (edit if you need to).",
|
|
37
|
-
classes="instructions",
|
|
38
|
-
)
|
|
39
|
-
yield widgets.TextArea(
|
|
40
|
-
self.command,
|
|
41
|
-
language="bash",
|
|
42
|
-
highlight_cursor_line=False,
|
|
43
|
-
soft_wrap=False,
|
|
44
|
-
)
|
|
45
|
-
with containers.HorizontalGroup(id="button-container"):
|
|
46
|
-
yield widgets.Button("OK", variant="primary", id="ok")
|
|
47
|
-
yield widgets.Button(
|
|
48
|
-
"Cancel", id="cancel", action="screen.dismiss(None)"
|
|
49
|
-
)
|
|
50
|
-
yield widgets.Footer()
|
|
51
|
-
|
|
52
|
-
@on(widgets.Button.Pressed, "#ok")
|
|
53
|
-
def on_ok_pressed(self, event: widgets.Button.Pressed) -> None:
|
|
54
|
-
self.dismiss(self.text_area.text)
|
|
55
|
-
|
|
56
|
-
@on(widgets.Button.Pressed, "#cancel")
|
|
57
|
-
def on_cancel_pressed(self, event: widgets.Button.Pressed) -> None:
|
|
58
|
-
self.dismiss(None)
|
|
59
|
-
|
|
60
|
-
def action_copy(self) -> None:
|
|
61
|
-
self.app.copy_to_clipboard(self.text_area.text)
|
|
62
|
-
self.notify("Command copied to clipboard", title="Copy")
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
if __name__ == "__main__":
|
|
66
|
-
from textual.app import App
|
|
67
|
-
|
|
68
|
-
class ModalApp(App):
|
|
69
|
-
@work
|
|
70
|
-
async def on_mount(self) -> None:
|
|
71
|
-
result = await self.push_screen_wait(CommandEditModal("ls -al"))
|
|
72
|
-
self.notify(str(result))
|
|
73
|
-
|
|
74
|
-
ModalApp().run()
|
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from typing import Optional
|
|
4
|
-
|
|
5
|
-
from textual import on
|
|
6
|
-
from textual.app import ComposeResult
|
|
7
|
-
from textual.binding import Binding
|
|
8
|
-
from textual.containers import Horizontal, Vertical, VerticalScroll
|
|
9
|
-
from textual.screen import ModalScreen
|
|
10
|
-
from textual.widgets import Button, Checkbox, Footer, Static
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class ComponentPickerScreen(ModalScreen[Optional[list[str]]]):
|
|
14
|
-
"""Modal screen for selecting application components.
|
|
15
|
-
|
|
16
|
-
Returns the list of selected component ids, or None if cancelled.
|
|
17
|
-
If ``allow_empty`` is False (default), confirming with no selection
|
|
18
|
-
shows a notification and does not dismiss the screen.
|
|
19
|
-
"""
|
|
20
|
-
|
|
21
|
-
BINDINGS = [
|
|
22
|
-
Binding("escape", "cancel", "Cancel", show=False),
|
|
23
|
-
]
|
|
24
|
-
|
|
25
|
-
CSS = """
|
|
26
|
-
ComponentPickerScreen {
|
|
27
|
-
align: center middle;
|
|
28
|
-
background: rgba(0, 0, 0, 0.7);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
#picker-dialog {
|
|
32
|
-
width: 78;
|
|
33
|
-
height: auto;
|
|
34
|
-
max-height: 90%;
|
|
35
|
-
background: $surface;
|
|
36
|
-
border: solid $border;
|
|
37
|
-
padding: 0 1;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
#picker-title {
|
|
41
|
-
height: 1;
|
|
42
|
-
background: $panel;
|
|
43
|
-
color: $text;
|
|
44
|
-
padding: 0 1;
|
|
45
|
-
text-style: bold;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
#picker-subtitle {
|
|
49
|
-
height: 1;
|
|
50
|
-
color: $text-muted;
|
|
51
|
-
padding: 0 1;
|
|
52
|
-
margin-bottom: 1;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
#picker-list {
|
|
56
|
-
height: auto;
|
|
57
|
-
max-height: 22;
|
|
58
|
-
padding: 0 1;
|
|
59
|
-
background: $surface;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
.component-row {
|
|
63
|
-
height: 2;
|
|
64
|
-
padding: 0 1;
|
|
65
|
-
background: $surface;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
.component-row Checkbox {
|
|
69
|
-
width: 1fr;
|
|
70
|
-
background: $surface;
|
|
71
|
-
color: $text;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
.component-row Checkbox > .toggle--button {
|
|
75
|
-
background: $panel;
|
|
76
|
-
color: $text-muted;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
.component-row Checkbox.-on > .toggle--button {
|
|
80
|
-
background: $primary;
|
|
81
|
-
color: $text;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
.component-row Checkbox > .toggle--label {
|
|
85
|
-
color: $text;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
Footer {
|
|
89
|
-
background: $panel;
|
|
90
|
-
color: $text-muted;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
#picker-buttons {
|
|
94
|
-
height: 3;
|
|
95
|
-
align: center middle;
|
|
96
|
-
background: $panel;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
#picker-buttons Button {
|
|
100
|
-
margin: 0 1;
|
|
101
|
-
background: $panel;
|
|
102
|
-
color: $text;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
#picker-buttons Button:hover {
|
|
106
|
-
background: $primary-darken-2;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
#picker-buttons #picker-confirm {
|
|
110
|
-
background: $primary-background;
|
|
111
|
-
color: $text;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
#picker-buttons #picker-confirm:hover {
|
|
115
|
-
background: $primary-darken-1;
|
|
116
|
-
}
|
|
117
|
-
"""
|
|
118
|
-
|
|
119
|
-
def __init__(
|
|
120
|
-
self,
|
|
121
|
-
title: str = "Select Application Components",
|
|
122
|
-
subtitle: str = "Choose the components for this project.",
|
|
123
|
-
allow_empty: bool = False,
|
|
124
|
-
) -> None:
|
|
125
|
-
super().__init__()
|
|
126
|
-
self._title_text = title
|
|
127
|
-
self._subtitle_text = subtitle
|
|
128
|
-
self._allow_empty = allow_empty
|
|
129
|
-
|
|
130
|
-
def compose(self) -> ComposeResult:
|
|
131
|
-
with Vertical(id="picker-dialog"):
|
|
132
|
-
yield Static(self._title_text, id="picker-title")
|
|
133
|
-
yield Static(self._subtitle_text, id="picker-subtitle")
|
|
134
|
-
with VerticalScroll(id="picker-list"):
|
|
135
|
-
from cdh.scaffold import COMPONENTS
|
|
136
|
-
|
|
137
|
-
for spec in COMPONENTS:
|
|
138
|
-
label = f"{spec.label} \u2014 {spec.description}"
|
|
139
|
-
yield Checkbox(label, id=f"comp-{spec.id}", classes="component-row")
|
|
140
|
-
with Horizontal(id="picker-buttons"):
|
|
141
|
-
yield Button("Cancel", id="picker-cancel")
|
|
142
|
-
yield Button("Confirm", id="picker-confirm", variant="primary")
|
|
143
|
-
yield Footer()
|
|
144
|
-
|
|
145
|
-
def action_cancel(self) -> None:
|
|
146
|
-
self.dismiss(None)
|
|
147
|
-
|
|
148
|
-
@on(Button.Pressed, "#picker-cancel")
|
|
149
|
-
def on_cancel(self) -> None:
|
|
150
|
-
self.dismiss(None)
|
|
151
|
-
|
|
152
|
-
@on(Button.Pressed, "#picker-confirm")
|
|
153
|
-
def on_confirm(self) -> None:
|
|
154
|
-
selected: list[str] = []
|
|
155
|
-
from cdh.scaffold import COMPONENTS
|
|
156
|
-
|
|
157
|
-
for spec in COMPONENTS:
|
|
158
|
-
cb = self.query_one(f"#comp-{spec.id}", Checkbox)
|
|
159
|
-
if cb.value:
|
|
160
|
-
selected.append(spec.id)
|
|
161
|
-
if not selected and not self._allow_empty:
|
|
162
|
-
self.notify(
|
|
163
|
-
"Select at least one application component",
|
|
164
|
-
title="No components selected",
|
|
165
|
-
severity="error",
|
|
166
|
-
)
|
|
167
|
-
return
|
|
168
|
-
self.dismiss(selected)
|