@scemoon/cdh 1.0.6 → 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/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 -807
- 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/cdh/cli.py
DELETED
|
@@ -1,807 +0,0 @@
|
|
|
1
|
-
from pathlib import Path
|
|
2
|
-
from typing import Optional
|
|
3
|
-
|
|
4
|
-
import click
|
|
5
|
-
|
|
6
|
-
from cdh.scaffold import (
|
|
7
|
-
COMPONENTS,
|
|
8
|
-
CROSS_CUTTING,
|
|
9
|
-
add_component,
|
|
10
|
-
add_cross_cutting,
|
|
11
|
-
init_dlc_project,
|
|
12
|
-
scaffold_dlc_project,
|
|
13
|
-
)
|
|
14
|
-
from onecode.cli import cli as onecode_cli
|
|
15
|
-
from onecode.cli import setup_logging
|
|
16
|
-
from onecode.config import ensure_dirs, load_config, save_config
|
|
17
|
-
from onecode import __version__ as _VERSION
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
_CDH_DIR = Path.home() / ".cdh"
|
|
21
|
-
|
|
22
|
-
_COMMON_HELP = """
|
|
23
|
-
\b
|
|
24
|
-
Usage:
|
|
25
|
-
cdh Launch TUI (agent store)
|
|
26
|
-
cdh tui Launch TUI (agent store)
|
|
27
|
-
cdh onecode <sub> onecode CLI surface (config / codebase / skill / mcp / help)
|
|
28
|
-
cdh project Project management
|
|
29
|
-
cdh session list|load Session management
|
|
30
|
-
cdh uninstall Remove ~/.cdh/ global state
|
|
31
|
-
cdh version Show version information
|
|
32
|
-
|
|
33
|
-
\b
|
|
34
|
-
Paths:
|
|
35
|
-
Config ~/.cdh/onecode.config.yaml
|
|
36
|
-
Logs ~/.cdh/logs/
|
|
37
|
-
Projects ~/.cdh/projects/
|
|
38
|
-
"""
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
@click.group(
|
|
42
|
-
invoke_without_command=True,
|
|
43
|
-
cls=type(onecode_cli),
|
|
44
|
-
context_settings=dict(max_content_width=100),
|
|
45
|
-
short_help="Cloud Dev Harness - AI agent framework with TUI.",
|
|
46
|
-
epilog=_COMMON_HELP,
|
|
47
|
-
)
|
|
48
|
-
@click.version_option(version=_VERSION, prog_name="cdh")
|
|
49
|
-
@click.pass_context
|
|
50
|
-
def cli(ctx):
|
|
51
|
-
"""
|
|
52
|
-
CDH (Cloud Dev Harness) is an AI agent framework with LLM provider
|
|
53
|
-
integration, session management, and a Textual-based TUI.
|
|
54
|
-
|
|
55
|
-
Run without arguments to open the agent store, where you can pick
|
|
56
|
-
a launcher agent.
|
|
57
|
-
|
|
58
|
-
All onecode-specific commands live under `cdh onecode <sub>` — e.g.
|
|
59
|
-
`cdh onecode config`, `cdh onecode codebase`, `cdh onecode skill`.
|
|
60
|
-
"""
|
|
61
|
-
if ctx.invoked_subcommand is None:
|
|
62
|
-
ensure_dirs()
|
|
63
|
-
cfg = load_config()
|
|
64
|
-
setup_logging(cfg.log_level)
|
|
65
|
-
from tui.app import A2TUIApp
|
|
66
|
-
A2TUIApp().run()
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
# --- onecode sub-namespace ---
|
|
70
|
-
#
|
|
71
|
-
# `cdh onecode <sub>` exposes the onecode CLI surface under the cdh
|
|
72
|
-
# namespace. The onecode group owns the canonical subcommands
|
|
73
|
-
# (config / codebase / skill / mcp / help); running
|
|
74
|
-
# `cdh onecode config` with no subcommand opens the same interactive
|
|
75
|
-
# TUI editor as before, while `cdh onecode config <sub>` dispatches
|
|
76
|
-
# straight to the onecode implementation.
|
|
77
|
-
|
|
78
|
-
@cli.group(
|
|
79
|
-
"onecode",
|
|
80
|
-
invoke_without_command=True,
|
|
81
|
-
short_help="onecode CLI surface (config / codebase / skill / mcp / help)",
|
|
82
|
-
)
|
|
83
|
-
@click.pass_context
|
|
84
|
-
def onecode_group(ctx):
|
|
85
|
-
"""The onecode command surface.
|
|
86
|
-
|
|
87
|
-
onecode is the agent framework that powers the TUI. This group
|
|
88
|
-
exposes its full CLI: configuration, codebase indexing, skills,
|
|
89
|
-
MCP servers, and help.
|
|
90
|
-
|
|
91
|
-
\b
|
|
92
|
-
Sub-commands:
|
|
93
|
-
config Manage onecode configuration (mode, model, provider, log-level, list)
|
|
94
|
-
codebase Build, search, and inspect the onecode codebase index
|
|
95
|
-
skill Install, enable, disable, or remove onecode skills
|
|
96
|
-
mcp Configure MCP servers that onecode connects to at runtime
|
|
97
|
-
help Print the onecode help screen
|
|
98
|
-
version Print the onecode version string
|
|
99
|
-
|
|
100
|
-
\b
|
|
101
|
-
Examples:
|
|
102
|
-
cdh onecode config Open the onecode configuration editor
|
|
103
|
-
cdh onecode config model get Show the current default model
|
|
104
|
-
cdh onecode config list Dump the full YAML configuration
|
|
105
|
-
cdh onecode config provider set openai
|
|
106
|
-
cdh onecode codebase index Build the onecode codebase index
|
|
107
|
-
cdh onecode codebase search "auth flow"
|
|
108
|
-
cdh onecode skill list List installed onecode skills
|
|
109
|
-
cdh onecode skill add my-skill Scaffold a new onecode skill
|
|
110
|
-
cdh onecode mcp list List onecode MCP servers
|
|
111
|
-
cdh onecode mcp add my-server https://example.com/mcp
|
|
112
|
-
"""
|
|
113
|
-
if ctx.invoked_subcommand is None:
|
|
114
|
-
# No subcommand: show the onecode help screen (matches
|
|
115
|
-
# `onecode --help` so the user can browse what's available).
|
|
116
|
-
click.echo(onecode_cli.get_help(click.Context(onecode_cli)))
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
# Mount every onecode top-level command (codebase / skill / mcp /
|
|
120
|
-
# help / version) under `cdh onecode <sub>`. We deliberately skip
|
|
121
|
-
# `config` because the onecode CLI's bare `onecode config` only prints
|
|
122
|
-
# `--help`; the user-facing behaviour for `cdh onecode config` is to
|
|
123
|
-
# open the TUI editor, so we install our own config sub-group below.
|
|
124
|
-
_ONECODE_SKIP_AS_CDH_ONECODE = {"tui", "config"}
|
|
125
|
-
for _cmd_name in onecode_cli.commands:
|
|
126
|
-
if _cmd_name in _ONECODE_SKIP_AS_CDH_ONECODE:
|
|
127
|
-
continue
|
|
128
|
-
_cmd = onecode_cli.get_command(None, _cmd_name)
|
|
129
|
-
if _cmd is not None and _cmd_name not in onecode_group.commands:
|
|
130
|
-
onecode_group.add_command(_cmd)
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
# Override the onecode CLI's CDH-flavoured help text so users see
|
|
134
|
-
# onecode-centric descriptions when they run `cdh onecode --help` or
|
|
135
|
-
# `cdh help onecode`. The onecode CLI itself still ships its own copy
|
|
136
|
-
# (used by `onecode --help`); we don't mutate it.
|
|
137
|
-
|
|
138
|
-
_ONECODE_HELP_OVERRIDES: dict[str, tuple[str, str]] = {
|
|
139
|
-
"config": (
|
|
140
|
-
"Open the onecode configuration editor",
|
|
141
|
-
"Manage onecode configuration: agent mode, default model, LLM "
|
|
142
|
-
"provider, log level, skills, MCP servers. With no subcommand, "
|
|
143
|
-
"launches the interactive Textual editor.",
|
|
144
|
-
),
|
|
145
|
-
"codebase": (
|
|
146
|
-
"Manage the onecode codebase index",
|
|
147
|
-
"Build and query onecode's local codebase index. Used by the "
|
|
148
|
-
"agent to ground answers in the project's own source files. "
|
|
149
|
-
"Index stored at ~/.onecode/codebase/indexes/. "
|
|
150
|
-
"Sub-commands: index, reindex, status, search.",
|
|
151
|
-
),
|
|
152
|
-
"memory": (
|
|
153
|
-
"Manage onecode long-term memory",
|
|
154
|
-
"View and manage onecode's long-term conversation memory. "
|
|
155
|
-
"Memory stored at ~/.onecode/memory/ with BM25 recall. "
|
|
156
|
-
"Sub-commands: status, clear, count.",
|
|
157
|
-
),
|
|
158
|
-
"skill": (
|
|
159
|
-
"Manage onecode skills",
|
|
160
|
-
"Install, enable, disable, or remove onecode skills. Skills are "
|
|
161
|
-
"reusable instruction sets the agent loads on demand to extend "
|
|
162
|
-
"its behaviour. Sub-commands: list, add, remove, enable, disable.",
|
|
163
|
-
),
|
|
164
|
-
"mcp": (
|
|
165
|
-
"Manage onecode MCP servers",
|
|
166
|
-
"Configure Model Context Protocol servers that onecode connects "
|
|
167
|
-
"to at runtime to expose additional tools and resources. "
|
|
168
|
-
"Sub-commands: list, add, remove, enable, disable.",
|
|
169
|
-
),
|
|
170
|
-
"help": (
|
|
171
|
-
"Show onecode CLI help",
|
|
172
|
-
"Print the onecode CLI help screen with every available command.",
|
|
173
|
-
),
|
|
174
|
-
"version": (
|
|
175
|
-
"Show onecode version",
|
|
176
|
-
"Print the onecode version string.",
|
|
177
|
-
),
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
for _cmd_name, (_sh, _doc) in _ONECODE_HELP_OVERRIDES.items():
|
|
181
|
-
_mounted = onecode_group.commands.get(_cmd_name)
|
|
182
|
-
if _mounted is not None:
|
|
183
|
-
_mounted.short_help = _sh
|
|
184
|
-
_mounted.help = _doc
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
# `cdh onecode config` — wrapper around `onecode config` that opens the
|
|
188
|
-
# interactive TUI editor when invoked with no subcommand, and forwards
|
|
189
|
-
# every subcommand (mode / model / provider / skill / mcp / log-level /
|
|
190
|
-
# list) verbatim to onecode.
|
|
191
|
-
|
|
192
|
-
@onecode_group.group(
|
|
193
|
-
"config",
|
|
194
|
-
invoke_without_command=True,
|
|
195
|
-
short_help="Open the onecode configuration editor (or run `cdh onecode config <sub>`)",
|
|
196
|
-
)
|
|
197
|
-
@click.pass_context
|
|
198
|
-
def onecode_config(ctx):
|
|
199
|
-
"""Open the onecode configuration editor.
|
|
200
|
-
|
|
201
|
-
With a subcommand, get or set the corresponding onecode setting
|
|
202
|
-
directly from the shell. With no subcommand, launch the interactive
|
|
203
|
-
Textual editor for all onecode settings.
|
|
204
|
-
|
|
205
|
-
\b
|
|
206
|
-
Sub-commands:
|
|
207
|
-
mode Get or set onecode's default agent mode (build / plan / solo)
|
|
208
|
-
model Get or set onecode's default LLM model
|
|
209
|
-
provider Get or set onecode's default LLM provider
|
|
210
|
-
log-level Get or set onecode's root logger verbosity
|
|
211
|
-
skill Manage onecode skills (alias for `cdh onecode skill`)
|
|
212
|
-
mcp Manage onecode MCP servers (alias for `cdh onecode mcp`)
|
|
213
|
-
list Dump the full onecode YAML configuration
|
|
214
|
-
|
|
215
|
-
\b
|
|
216
|
-
Examples:
|
|
217
|
-
cdh onecode config Open the interactive editor
|
|
218
|
-
cdh onecode config model get Show the current default model
|
|
219
|
-
cdh onecode config provider set openai
|
|
220
|
-
cdh onecode config list Dump the full YAML configuration
|
|
221
|
-
"""
|
|
222
|
-
if ctx.invoked_subcommand is None:
|
|
223
|
-
from onecode.config_screen import main as config_main
|
|
224
|
-
config_main()
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
_onecode_config_group = onecode_cli.get_command(None, "config")
|
|
228
|
-
if _onecode_config_group is not None:
|
|
229
|
-
for _cfg_cmd in _onecode_config_group.commands.values():
|
|
230
|
-
if _cfg_cmd.name not in onecode_config.commands and _cfg_cmd.name != "tui":
|
|
231
|
-
onecode_config.add_command(_cfg_cmd)
|
|
232
|
-
# Override the sub-command help to be onecode-centric, not
|
|
233
|
-
# CDH-centric, since users reach these via
|
|
234
|
-
# `cdh onecode config <sub>`.
|
|
235
|
-
_sub_overrides = {
|
|
236
|
-
"mode": (
|
|
237
|
-
"Manage onecode agent mode",
|
|
238
|
-
"Get or set onecode's default agent mode "
|
|
239
|
-
"(build / plan / solo).",
|
|
240
|
-
),
|
|
241
|
-
"model": (
|
|
242
|
-
"Manage onecode's default LLM model",
|
|
243
|
-
"Get or set the default LLM model onecode uses when "
|
|
244
|
-
"starting a new agent session.",
|
|
245
|
-
),
|
|
246
|
-
"provider": (
|
|
247
|
-
"Manage onecode's default LLM provider",
|
|
248
|
-
"Get or set the default LLM provider onecode routes "
|
|
249
|
-
"chat-completions requests to.",
|
|
250
|
-
),
|
|
251
|
-
"log-level": (
|
|
252
|
-
"Manage onecode log level",
|
|
253
|
-
"Get or set onecode's root logger verbosity "
|
|
254
|
-
"(debug / info / warn / error).",
|
|
255
|
-
),
|
|
256
|
-
"skill": (
|
|
257
|
-
"Manage onecode skills (alias for `cdh onecode skill`)",
|
|
258
|
-
"Same skill-management surface as `cdh onecode skill`.",
|
|
259
|
-
),
|
|
260
|
-
"mcp": (
|
|
261
|
-
"Manage onecode MCP servers (alias for `cdh onecode mcp`)",
|
|
262
|
-
"Same MCP server surface as `cdh onecode mcp`.",
|
|
263
|
-
),
|
|
264
|
-
"list": (
|
|
265
|
-
"Show onecode's full YAML configuration",
|
|
266
|
-
"Print every onecode setting currently in effect, "
|
|
267
|
-
"as YAML.",
|
|
268
|
-
),
|
|
269
|
-
}
|
|
270
|
-
if _cfg_cmd.name in _sub_overrides:
|
|
271
|
-
_sh, _doc = _sub_overrides[_cfg_cmd.name]
|
|
272
|
-
_cfg_cmd.short_help = _sh
|
|
273
|
-
_cfg_cmd.help = _doc
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
# --- (removed) backward-compatible aliases ---
|
|
277
|
-
#
|
|
278
|
-
# Earlier versions exposed `cdh config` and `cdh codebase` at the top
|
|
279
|
-
# level. Those aliases were removed — use `cdh onecode config` and
|
|
280
|
-
# `cdh onecode codebase` instead. The behaviour is identical:
|
|
281
|
-
# - `cdh onecode config` (no subcommand) opens the same TUI editor.
|
|
282
|
-
# - `cdh onecode config <sub>` is the same as the old `cdh config <sub>`.
|
|
283
|
-
# - `cdh onecode codebase <sub>` is the same as the old `cdh codebase <sub>`.
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
# --- project command ---
|
|
287
|
-
|
|
288
|
-
def _get_projects():
|
|
289
|
-
projects_dir = _CDH_DIR / "projects"
|
|
290
|
-
projects_dir.mkdir(parents=True, exist_ok=True)
|
|
291
|
-
return sorted(list(projects_dir.glob("*.yaml")) + list(projects_dir.glob("*.json")))
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
def _load_project_by_name(name: str) -> Optional[tuple]:
|
|
295
|
-
projects_dir = _CDH_DIR / "projects"
|
|
296
|
-
for ext in ["yaml", "yml", "json"]:
|
|
297
|
-
pf = projects_dir / f"{name}.{ext}"
|
|
298
|
-
if pf.exists():
|
|
299
|
-
import yaml
|
|
300
|
-
proj_data = yaml.safe_load(pf.read_text()) if ext in ["yaml", "yml"] else __import__("json").loads(pf.read_text())
|
|
301
|
-
return name, proj_data.get("path", ".")
|
|
302
|
-
return None
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
def _interactive_select_project():
|
|
306
|
-
project_files = _get_projects()
|
|
307
|
-
if not project_files:
|
|
308
|
-
return None
|
|
309
|
-
click.echo("Projects:")
|
|
310
|
-
for i, pf in enumerate(project_files, 1):
|
|
311
|
-
click.echo(f" {i}) {pf.stem}")
|
|
312
|
-
choice = click.prompt("Select project", type=str, default="").strip().lower()
|
|
313
|
-
try:
|
|
314
|
-
idx = int(choice) - 1
|
|
315
|
-
if 0 <= idx < len(project_files):
|
|
316
|
-
return ("load", project_files[idx].stem)
|
|
317
|
-
except ValueError:
|
|
318
|
-
pass
|
|
319
|
-
return None
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
def _parse_component_selection(text: str, valid_ids: list[str]) -> list[str]:
|
|
323
|
-
"""Parse '1,2,5' / '1-3' / 'all' / 'web,backend' / '' into a list of ids.
|
|
324
|
-
|
|
325
|
-
Accepts either numeric tokens (positional, 1-based) or raw id names.
|
|
326
|
-
Returns an empty list if no valid tokens are found.
|
|
327
|
-
"""
|
|
328
|
-
text = text.strip().lower()
|
|
329
|
-
if not text:
|
|
330
|
-
return []
|
|
331
|
-
if text in ("all", "*"):
|
|
332
|
-
return list(valid_ids)
|
|
333
|
-
tokens = [t.strip() for t in text.replace(" ", "").split(",") if t.strip()]
|
|
334
|
-
selected: list[str] = []
|
|
335
|
-
for tok in tokens:
|
|
336
|
-
if tok in valid_ids:
|
|
337
|
-
if tok not in selected:
|
|
338
|
-
selected.append(tok)
|
|
339
|
-
continue
|
|
340
|
-
if "-" in tok:
|
|
341
|
-
try:
|
|
342
|
-
a, b = tok.split("-", 1)
|
|
343
|
-
lo, hi = int(a), int(b)
|
|
344
|
-
except ValueError:
|
|
345
|
-
continue
|
|
346
|
-
if lo > hi:
|
|
347
|
-
lo, hi = hi, lo
|
|
348
|
-
for i in range(lo, hi + 1):
|
|
349
|
-
if 1 <= i <= len(valid_ids) and valid_ids[i - 1] not in selected:
|
|
350
|
-
selected.append(valid_ids[i - 1])
|
|
351
|
-
else:
|
|
352
|
-
try:
|
|
353
|
-
idx = int(tok)
|
|
354
|
-
except ValueError:
|
|
355
|
-
continue
|
|
356
|
-
if 1 <= idx <= len(valid_ids) and valid_ids[idx - 1] not in selected:
|
|
357
|
-
selected.append(valid_ids[idx - 1])
|
|
358
|
-
return selected
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
def _prompt_components(
|
|
362
|
-
spec_label: str,
|
|
363
|
-
specs: tuple,
|
|
364
|
-
allow_empty: bool = False,
|
|
365
|
-
) -> list[str]:
|
|
366
|
-
"""Interactively prompt the user to choose from a list of specs.
|
|
367
|
-
|
|
368
|
-
Args:
|
|
369
|
-
spec_label: title describing what is being selected
|
|
370
|
-
(e.g. "application components").
|
|
371
|
-
specs: a tuple of ComponentSpec or CrossCutSpec.
|
|
372
|
-
allow_empty: if False, the user must select at least one and
|
|
373
|
-
the prompt will reject empty input.
|
|
374
|
-
|
|
375
|
-
Returns a list of selected spec ids. Raises click.Abort if the user
|
|
376
|
-
fails to provide a valid selection after the retry.
|
|
377
|
-
"""
|
|
378
|
-
valid_ids = [s.id for s in specs]
|
|
379
|
-
click.echo(f"Select {spec_label} for the project:")
|
|
380
|
-
for i, s in enumerate(specs, 1):
|
|
381
|
-
click.echo(f" {i}) {s.label:<22s} \u2014 {s.description}")
|
|
382
|
-
if allow_empty:
|
|
383
|
-
hint = "[optional, e.g. 1,2 or 'all' or <Enter> to skip]"
|
|
384
|
-
else:
|
|
385
|
-
hint = "[required, e.g. 1,2 or 'all']"
|
|
386
|
-
click.echo("")
|
|
387
|
-
prompt_text = f"{spec_label.capitalize()} {hint}: "
|
|
388
|
-
|
|
389
|
-
for attempt in range(2):
|
|
390
|
-
raw = click.prompt(prompt_text, default="", show_default=False)
|
|
391
|
-
selected = _parse_component_selection(raw, valid_ids)
|
|
392
|
-
if selected:
|
|
393
|
-
return selected
|
|
394
|
-
if allow_empty and not raw.strip():
|
|
395
|
-
return []
|
|
396
|
-
if attempt == 0:
|
|
397
|
-
if allow_empty:
|
|
398
|
-
click.echo(
|
|
399
|
-
"No valid selection parsed. Try again (or press Enter to skip)."
|
|
400
|
-
)
|
|
401
|
-
else:
|
|
402
|
-
click.echo(
|
|
403
|
-
"At least one selection is required. Try again."
|
|
404
|
-
)
|
|
405
|
-
raise click.Abort()
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
def _resolve_components_flag(components: Optional[str]) -> list[str]:
|
|
409
|
-
"""Resolve a --components flag value to a list of component ids.
|
|
410
|
-
|
|
411
|
-
Empty/None means the caller will run the interactive prompt.
|
|
412
|
-
'all' expands to every component id.
|
|
413
|
-
"""
|
|
414
|
-
if not components:
|
|
415
|
-
return []
|
|
416
|
-
valid_ids = [c.id for c in COMPONENTS]
|
|
417
|
-
selected = _parse_component_selection(components, valid_ids)
|
|
418
|
-
if not selected:
|
|
419
|
-
raise click.BadParameter(
|
|
420
|
-
f"No valid component ids in '{components}'. "
|
|
421
|
-
f"Valid ids: {', '.join(valid_ids)}."
|
|
422
|
-
)
|
|
423
|
-
return selected
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
def _load_project_record(name: str) -> Optional[dict]:
|
|
427
|
-
"""Read a project record from ~/.cdh/projects/{name}.{yaml,yml,json}."""
|
|
428
|
-
import yaml as _yaml
|
|
429
|
-
import json as _json
|
|
430
|
-
projects_dir = _CDH_DIR / "projects"
|
|
431
|
-
for ext in ("yaml", "yml", "json"):
|
|
432
|
-
pf = projects_dir / f"{name}.{ext}"
|
|
433
|
-
if pf.exists():
|
|
434
|
-
text = pf.read_text(encoding="utf-8")
|
|
435
|
-
if ext in ("yaml", "yml"):
|
|
436
|
-
return _yaml.safe_load(text) or {}
|
|
437
|
-
return _json.loads(text)
|
|
438
|
-
return None
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
@cli.command(short_help="Project management (TUI)")
|
|
442
|
-
@click.argument("action", type=click.Choice(["list", "show", "new", "init", "load", "select", "add-component", "add-cross-cutting"]), default="select")
|
|
443
|
-
@click.argument("name", required=False)
|
|
444
|
-
@click.argument("path", required=False, default=".")
|
|
445
|
-
@click.option("--components", default=None, help="Comma-separated component ids (e.g. 'web,backend') or 'all'. Skips the interactive prompt.")
|
|
446
|
-
@click.option("--component", "component_id", default=None, help="Component id for add-component (e.g. 'native').")
|
|
447
|
-
@click.option("--id", "cross_id", default=None, help="Cross-cutting id for add-cross-cutting (e.g. 'contracts').")
|
|
448
|
-
def project(action, name, path, components, component_id, cross_id):
|
|
449
|
-
"""Manage CDH projects.
|
|
450
|
-
|
|
451
|
-
\b
|
|
452
|
-
Without arguments, opens the project management TUI.
|
|
453
|
-
Use subcommands for quick CLI operations.
|
|
454
|
-
|
|
455
|
-
\b
|
|
456
|
-
Actions:
|
|
457
|
-
select Open project management TUI (default)
|
|
458
|
-
list List all projects
|
|
459
|
-
show <name> Show project details
|
|
460
|
-
new <name> [path] Create a new project (interactive component selection)
|
|
461
|
-
init [path] Initialize .cdh in an existing directory (interactive, allows empty)
|
|
462
|
-
load <name> Load a project (set as current)
|
|
463
|
-
add-component <name> Add an application component to an existing project
|
|
464
|
-
add-cross-cutting <name> Add a cross-cutting item to an existing project
|
|
465
|
-
"""
|
|
466
|
-
import yaml
|
|
467
|
-
projects_dir = _CDH_DIR / "projects"
|
|
468
|
-
projects_dir.mkdir(parents=True, exist_ok=True)
|
|
469
|
-
|
|
470
|
-
if action == "select":
|
|
471
|
-
from tui.screens.projects_app import main as projects_main
|
|
472
|
-
result = projects_main()
|
|
473
|
-
if result == "loaded":
|
|
474
|
-
from tui.app import A2TUIApp
|
|
475
|
-
A2TUIApp().run()
|
|
476
|
-
return
|
|
477
|
-
|
|
478
|
-
if action == "list":
|
|
479
|
-
project_files = sorted(list(projects_dir.glob("*.yaml")) + list(projects_dir.glob("*.json")))
|
|
480
|
-
if not project_files:
|
|
481
|
-
click.echo("No projects found.")
|
|
482
|
-
return
|
|
483
|
-
click.echo("Projects:")
|
|
484
|
-
for pf in project_files:
|
|
485
|
-
click.echo(f" {pf.stem}")
|
|
486
|
-
return
|
|
487
|
-
|
|
488
|
-
if action == "show":
|
|
489
|
-
if not name:
|
|
490
|
-
click.echo("Usage: cdh project show <name>")
|
|
491
|
-
return
|
|
492
|
-
for ext in ["yaml", "yml", "json"]:
|
|
493
|
-
pf = projects_dir / f"{name}.{ext}"
|
|
494
|
-
if pf.exists():
|
|
495
|
-
click.echo(pf.read_text())
|
|
496
|
-
return
|
|
497
|
-
click.echo(f"Project '{name}' not found.")
|
|
498
|
-
return
|
|
499
|
-
|
|
500
|
-
if action == "new":
|
|
501
|
-
from onecode.agent.cdh_loader import CdhProjectLoader
|
|
502
|
-
if not name:
|
|
503
|
-
name = click.prompt("Project name", default="").strip()
|
|
504
|
-
if not name:
|
|
505
|
-
click.echo("Project name is required.")
|
|
506
|
-
raise click.Abort()
|
|
507
|
-
ws = Path(path).expanduser().resolve()
|
|
508
|
-
project_file = projects_dir / f"{name}.yaml"
|
|
509
|
-
if project_file.exists():
|
|
510
|
-
click.echo(f"Error: project '{name}' already exists in the project list.")
|
|
511
|
-
raise click.Abort()
|
|
512
|
-
if components is not None:
|
|
513
|
-
selected_components = _resolve_components_flag(components)
|
|
514
|
-
else:
|
|
515
|
-
selected_components = _prompt_components(
|
|
516
|
-
"application components", COMPONENTS, allow_empty=False
|
|
517
|
-
)
|
|
518
|
-
try:
|
|
519
|
-
scaffold_dlc_project(ws, name, components=selected_components)
|
|
520
|
-
except (ValueError, RuntimeError) as e:
|
|
521
|
-
click.echo(f"Error: {str(e) or type(e).__name__}")
|
|
522
|
-
raise click.Abort()
|
|
523
|
-
CdhProjectLoader.init_project(ws, name)
|
|
524
|
-
proj_data = {"name": name, "path": str(ws), "description": ""}
|
|
525
|
-
project_file.write_text(yaml.dump(proj_data))
|
|
526
|
-
cfg = load_config()
|
|
527
|
-
cfg.current_project = name
|
|
528
|
-
cfg.current_project_path = str(ws)
|
|
529
|
-
save_config(cfg)
|
|
530
|
-
click.echo(
|
|
531
|
-
f"Created project '{name}' at {ws} "
|
|
532
|
-
f"(components: {', '.join(selected_components)})"
|
|
533
|
-
)
|
|
534
|
-
return
|
|
535
|
-
|
|
536
|
-
if action == "init":
|
|
537
|
-
from onecode.agent.cdh_loader import CdhProjectLoader
|
|
538
|
-
target = Path(name or ".").expanduser().resolve()
|
|
539
|
-
project_name = target.name
|
|
540
|
-
proj_file = projects_dir / f"{project_name}.yaml"
|
|
541
|
-
if proj_file.exists():
|
|
542
|
-
click.echo(f"Error: project '{project_name}' already exists in the project list.")
|
|
543
|
-
raise click.Abort()
|
|
544
|
-
if components is not None:
|
|
545
|
-
selected_components = _resolve_components_flag(components)
|
|
546
|
-
else:
|
|
547
|
-
selected_components = _prompt_components(
|
|
548
|
-
"application components", COMPONENTS, allow_empty=True
|
|
549
|
-
)
|
|
550
|
-
try:
|
|
551
|
-
init_dlc_project(target, project_name)
|
|
552
|
-
except (ValueError, RuntimeError) as e:
|
|
553
|
-
click.echo(f"Error: {str(e) or type(e).__name__}")
|
|
554
|
-
raise click.Abort()
|
|
555
|
-
for cid in selected_components:
|
|
556
|
-
try:
|
|
557
|
-
add_component(target, cid)
|
|
558
|
-
except (ValueError, FileNotFoundError) as e:
|
|
559
|
-
click.echo(f"Error: {str(e) or type(e).__name__}")
|
|
560
|
-
CdhProjectLoader.init_project(target, project_name)
|
|
561
|
-
proj_data = {"name": project_name, "path": str(target), "description": ""}
|
|
562
|
-
proj_file.write_text(yaml.dump(proj_data))
|
|
563
|
-
suffix = (
|
|
564
|
-
f" (components: {', '.join(selected_components)})"
|
|
565
|
-
if selected_components
|
|
566
|
-
else ""
|
|
567
|
-
)
|
|
568
|
-
click.echo(f"Initialized .cdh in {target}{suffix}")
|
|
569
|
-
return
|
|
570
|
-
|
|
571
|
-
if action == "add-component":
|
|
572
|
-
if not name:
|
|
573
|
-
click.echo("Usage: cdh project add-component <name> --component <id>")
|
|
574
|
-
return
|
|
575
|
-
if not component_id:
|
|
576
|
-
click.echo("Usage: cdh project add-component <name> --component <id>")
|
|
577
|
-
click.echo(f"Valid ids: {', '.join(c.id for c in COMPONENTS)}")
|
|
578
|
-
return
|
|
579
|
-
record = _load_project_record(name)
|
|
580
|
-
if record is None:
|
|
581
|
-
click.echo(f"Project '{name}' not found.")
|
|
582
|
-
return
|
|
583
|
-
ws = Path(record.get("path", ".")).expanduser().resolve()
|
|
584
|
-
try:
|
|
585
|
-
added = add_component(ws, component_id)
|
|
586
|
-
except (ValueError, FileNotFoundError) as e:
|
|
587
|
-
click.echo(f"Error: {str(e) or type(e).__name__}")
|
|
588
|
-
raise click.Abort()
|
|
589
|
-
if added:
|
|
590
|
-
click.echo(f"Added component '{component_id}' to '{name}'.")
|
|
591
|
-
else:
|
|
592
|
-
click.echo(f"Component '{component_id}' already present in '{name}'.")
|
|
593
|
-
return
|
|
594
|
-
|
|
595
|
-
if action == "add-cross-cutting":
|
|
596
|
-
if not name:
|
|
597
|
-
click.echo("Usage: cdh project add-cross-cutting <name> --id <id>")
|
|
598
|
-
return
|
|
599
|
-
if not cross_id:
|
|
600
|
-
click.echo("Usage: cdh project add-cross-cutting <name> --id <id>")
|
|
601
|
-
click.echo(f"Valid ids: {', '.join(c.id for c in CROSS_CUTTING)}")
|
|
602
|
-
return
|
|
603
|
-
record = _load_project_record(name)
|
|
604
|
-
if record is None:
|
|
605
|
-
click.echo(f"Project '{name}' not found.")
|
|
606
|
-
return
|
|
607
|
-
ws = Path(record.get("path", ".")).expanduser().resolve()
|
|
608
|
-
try:
|
|
609
|
-
added = add_cross_cutting(ws, cross_id)
|
|
610
|
-
except (ValueError, FileNotFoundError) as e:
|
|
611
|
-
click.echo(f"Error: {str(e) or type(e).__name__}")
|
|
612
|
-
raise click.Abort()
|
|
613
|
-
if added:
|
|
614
|
-
click.echo(f"Added cross-cutting '{cross_id}' to '{name}'.")
|
|
615
|
-
else:
|
|
616
|
-
click.echo(f"Cross-cutting '{cross_id}' already present in '{name}'.")
|
|
617
|
-
return
|
|
618
|
-
|
|
619
|
-
if action == "load":
|
|
620
|
-
if not name:
|
|
621
|
-
click.echo("Usage: cdh project load <name>")
|
|
622
|
-
return
|
|
623
|
-
for ext in ["yaml", "yml", "json"]:
|
|
624
|
-
pf = projects_dir / f"{name}.{ext}"
|
|
625
|
-
if pf.exists():
|
|
626
|
-
proj_data = yaml.safe_load(pf.read_text()) if ext in ["yaml", "yml"] else __import__("json").loads(pf.read_text())
|
|
627
|
-
cfg = load_config()
|
|
628
|
-
cfg.current_project = name
|
|
629
|
-
cfg.current_project_path = proj_data.get("path", ".")
|
|
630
|
-
save_config(cfg)
|
|
631
|
-
click.echo(f"Loaded project '{name}' (path: {cfg.current_project_path})")
|
|
632
|
-
return
|
|
633
|
-
click.echo(f"Project '{name}' not found.")
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
# --- session command ---
|
|
637
|
-
|
|
638
|
-
@cli.command(short_help="Session management")
|
|
639
|
-
@click.argument("action", type=click.Choice(["list", "load"]), default="list")
|
|
640
|
-
@click.argument("session_id", required=False, type=int)
|
|
641
|
-
def session(action, session_id):
|
|
642
|
-
"""Manage CDH sessions.
|
|
643
|
-
|
|
644
|
-
\b
|
|
645
|
-
Actions:
|
|
646
|
-
list List recent sessions
|
|
647
|
-
load <id> Load a session by ID
|
|
648
|
-
|
|
649
|
-
\b
|
|
650
|
-
Examples:
|
|
651
|
-
cdh session List recent sessions
|
|
652
|
-
cdh session list List recent sessions
|
|
653
|
-
cdh session load 5 Load session with ID 5
|
|
654
|
-
"""
|
|
655
|
-
import asyncio
|
|
656
|
-
from tui.db import DB
|
|
657
|
-
|
|
658
|
-
async def run():
|
|
659
|
-
db = DB()
|
|
660
|
-
if action == "list":
|
|
661
|
-
recent = await db.session_get_recent(max_results=20)
|
|
662
|
-
if not recent:
|
|
663
|
-
click.echo("No sessions found.")
|
|
664
|
-
return
|
|
665
|
-
click.echo("Recent sessions:")
|
|
666
|
-
for s in recent:
|
|
667
|
-
title = s.get("title", "Untitled") or "Untitled"
|
|
668
|
-
aid = s.get("agent_identity", "unknown")
|
|
669
|
-
sid = s.get("agent_session_id", "")[:8]
|
|
670
|
-
click.echo(f" session-{s['id']}: {title} ({aid[:30]}... {sid})")
|
|
671
|
-
elif action == "load":
|
|
672
|
-
if session_id is None:
|
|
673
|
-
click.echo("Usage: cdh session load <id>")
|
|
674
|
-
return
|
|
675
|
-
s = None
|
|
676
|
-
try:
|
|
677
|
-
s = await db.session_get(int(session_id))
|
|
678
|
-
except (ValueError, TypeError):
|
|
679
|
-
pass
|
|
680
|
-
if s is None:
|
|
681
|
-
s = await db.session_get_by_agent_session_id(session_id)
|
|
682
|
-
if s is None:
|
|
683
|
-
click.echo(f"Session {session_id} not found.")
|
|
684
|
-
return
|
|
685
|
-
click.echo(f"Session {session_id}:")
|
|
686
|
-
click.echo(f" Title: {s.get('title', 'Untitled')}")
|
|
687
|
-
click.echo(f" Agent: {s.get('agent_identity', 'unknown')}")
|
|
688
|
-
click.echo(f" Agent Session ID: {s.get('agent_session_id', 'N/A')}")
|
|
689
|
-
|
|
690
|
-
asyncio.run(run())
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
# --- help command ---
|
|
694
|
-
|
|
695
|
-
# --- tui command ---
|
|
696
|
-
|
|
697
|
-
@cli.command(short_help="Launch the TUI")
|
|
698
|
-
@click.option("--project-dir", "-d", default=".", help="Project directory")
|
|
699
|
-
@click.pass_context
|
|
700
|
-
def tui(ctx, project_dir):
|
|
701
|
-
"""Launch the CDH TUI (Textual User Interface).
|
|
702
|
-
|
|
703
|
-
By default opens the agent store, showing your configured launcher
|
|
704
|
-
agents. Pick an agent from the store to launch it.
|
|
705
|
-
"""
|
|
706
|
-
ensure_dirs()
|
|
707
|
-
cfg = load_config()
|
|
708
|
-
setup_logging(cfg.log_level)
|
|
709
|
-
|
|
710
|
-
ws = Path(project_dir).expanduser().resolve()
|
|
711
|
-
|
|
712
|
-
from tui.app import A2TUIApp
|
|
713
|
-
app = A2TUIApp(project_dir=str(ws))
|
|
714
|
-
app.run()
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
# --- help command ---
|
|
718
|
-
|
|
719
|
-
@cli.command(short_help="Show help for commands")
|
|
720
|
-
@click.argument("command", required=False)
|
|
721
|
-
def help_cmd(command):
|
|
722
|
-
"""Show help for cdh commands and usage information.
|
|
723
|
-
|
|
724
|
-
\b
|
|
725
|
-
Examples:
|
|
726
|
-
cdh help Show top-level help
|
|
727
|
-
cdh help onecode Show `cdh onecode` sub-commands
|
|
728
|
-
cdh help onecode config Show config sub-commands
|
|
729
|
-
"""
|
|
730
|
-
if command:
|
|
731
|
-
cmd = cli.commands.get(command)
|
|
732
|
-
if cmd:
|
|
733
|
-
click.echo(cmd.get_help(click.Context(cmd)))
|
|
734
|
-
else:
|
|
735
|
-
click.echo(f"Unknown command: {command}")
|
|
736
|
-
else:
|
|
737
|
-
click.echo(cli.get_help(click.Context(cli)))
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
# --- version command ---
|
|
741
|
-
|
|
742
|
-
@cli.command(short_help="Remove ~/.cdh/ global state")
|
|
743
|
-
def uninstall():
|
|
744
|
-
"""Remove CDH global state (~/.cdh/) and Python environment.
|
|
745
|
-
|
|
746
|
-
\b
|
|
747
|
-
After running this, uninstall the package itself:
|
|
748
|
-
pip uninstall cloud-dev-harness (if installed via pip)
|
|
749
|
-
pnpm remove -g @scemoon/cdh (if installed via pnpm)
|
|
750
|
-
npm uninstall -g @scemoon/cdh (if installed via npm)
|
|
751
|
-
|
|
752
|
-
\b
|
|
753
|
-
Also check your shell config (~/.zshrc, ~/.bashrc, etc.) for
|
|
754
|
-
PATH entries pointing to ~/.cdh/python/bin and remove them.
|
|
755
|
-
"""
|
|
756
|
-
import shutil
|
|
757
|
-
|
|
758
|
-
cdh_dir = Path.home() / ".cdh"
|
|
759
|
-
|
|
760
|
-
removed_anything = False
|
|
761
|
-
|
|
762
|
-
python_dir = cdh_dir / "python"
|
|
763
|
-
if python_dir.exists():
|
|
764
|
-
click.echo(f"Removing Python environment at {python_dir}...")
|
|
765
|
-
shutil.rmtree(python_dir, ignore_errors=True)
|
|
766
|
-
removed_anything = True
|
|
767
|
-
|
|
768
|
-
if cdh_dir.exists():
|
|
769
|
-
click.echo(f"Removing global state at {cdh_dir}...")
|
|
770
|
-
shutil.rmtree(cdh_dir, ignore_errors=True)
|
|
771
|
-
removed_anything = True
|
|
772
|
-
|
|
773
|
-
if not removed_anything:
|
|
774
|
-
click.echo("Nothing to remove (~/.cdh/ not found).")
|
|
775
|
-
else:
|
|
776
|
-
click.echo("")
|
|
777
|
-
click.echo("Cleanup complete. To finish uninstall:")
|
|
778
|
-
click.echo("")
|
|
779
|
-
click.echo(" 1. Remove the package:")
|
|
780
|
-
click.echo(" pip uninstall cloud-dev-harness")
|
|
781
|
-
click.echo(" # or: pnpm remove -g @scemoon/cdh")
|
|
782
|
-
click.echo(" # or: npm uninstall -g @scemoon/cdh")
|
|
783
|
-
click.echo("")
|
|
784
|
-
click.echo(" 2. Check your shell config (~/.zshrc, ~/.bashrc, etc.) for:")
|
|
785
|
-
click.echo(' export PATH="$HOME/.cdh/python/bin:$PATH"')
|
|
786
|
-
click.echo(" Remove this line if present.")
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
@cli.command(short_help="Show version info")
|
|
790
|
-
def version():
|
|
791
|
-
"""Show CDH version and build information."""
|
|
792
|
-
from onecode import __version__
|
|
793
|
-
click.echo(f"cdh version {__version__}")
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
# All onecode subcommands are reachable through `cdh onecode <sub>`
|
|
797
|
-
# (see the onecode_group defined above). The cdh top-level command
|
|
798
|
-
# surface is intentionally limited to: tui, onecode, project, session,
|
|
799
|
-
# help, and version.
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
def main():
|
|
803
|
-
cli()
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
if __name__ == "__main__":
|
|
807
|
-
main()
|