@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.
Files changed (550) hide show
  1. package/package.json +2 -2
  2. package/ai-dlc-skill/SKILL.md +0 -77
  3. package/ai-dlc-skill/agents/deliver-agent.md +0 -24
  4. package/ai-dlc-skill/agents/master.md +0 -50
  5. package/ai-dlc-skill/agents/plan-agent.md +0 -23
  6. package/ai-dlc-skill/agents/understand-agent.md +0 -23
  7. package/ai-dlc-skill/agents/verify-agent.md +0 -27
  8. package/ai-dlc-skill/architecture/project-structure.md +0 -78
  9. package/ai-dlc-skill/brownfield/README.md +0 -30
  10. package/ai-dlc-skill/brownfield/generate-context.sh +0 -64
  11. package/ai-dlc-skill/brownfield/scripts/deps.sh +0 -27
  12. package/ai-dlc-skill/brownfield/scripts/discover.sh +0 -34
  13. package/ai-dlc-skill/brownfield/scripts/extract-api.sh +0 -45
  14. package/ai-dlc-skill/components/backend.md +0 -34
  15. package/ai-dlc-skill/components/desktop.md +0 -30
  16. package/ai-dlc-skill/components/mya.md +0 -29
  17. package/ai-dlc-skill/components/native.md +0 -30
  18. package/ai-dlc-skill/components/tta.md +0 -29
  19. package/ai-dlc-skill/components/web.md +0 -31
  20. package/ai-dlc-skill/components/wxa.md +0 -29
  21. package/ai-dlc-skill/contracts/README.md +0 -25
  22. package/ai-dlc-skill/core/adaptive-flow.md +0 -36
  23. package/ai-dlc-skill/core/security.md +0 -29
  24. package/ai-dlc-skill/cross-tool/cline/export.sh +0 -31
  25. package/ai-dlc-skill/cross-tool/copilot/export.sh +0 -47
  26. package/ai-dlc-skill/cross-tool/cursor/export.sh +0 -32
  27. package/ai-dlc-skill/cross-tool/export.sh +0 -22
  28. package/ai-dlc-skill/cross-tool/onecode/config.yaml.tpl +0 -17
  29. package/ai-dlc-skill/cross-tool/onecode/export-skills.sh +0 -35
  30. package/ai-dlc-skill/cross-tool/onecode/export.sh +0 -54
  31. package/ai-dlc-skill/phases/deliver/entry.md +0 -26
  32. package/ai-dlc-skill/phases/deliver/lifecycle.md +0 -185
  33. package/ai-dlc-skill/phases/deliver/prompt.md +0 -40
  34. package/ai-dlc-skill/phases/deliver/rules.md +0 -61
  35. package/ai-dlc-skill/phases/plan/entry.md +0 -25
  36. package/ai-dlc-skill/phases/plan/lifecycle.md +0 -204
  37. package/ai-dlc-skill/phases/plan/prompt.md +0 -38
  38. package/ai-dlc-skill/phases/plan/rules.md +0 -25
  39. package/ai-dlc-skill/phases/understand/entry.md +0 -26
  40. package/ai-dlc-skill/phases/understand/lifecycle.md +0 -184
  41. package/ai-dlc-skill/phases/understand/prompt.md +0 -41
  42. package/ai-dlc-skill/phases/understand/rules.md +0 -37
  43. package/ai-dlc-skill/phases/verify/entry.md +0 -26
  44. package/ai-dlc-skill/phases/verify/lifecycle.md +0 -192
  45. package/ai-dlc-skill/phases/verify/prompt.md +0 -43
  46. package/ai-dlc-skill/phases/verify/rules.md +0 -73
  47. package/ai-dlc-skill/practices/bdd.md +0 -91
  48. package/ai-dlc-skill/practices/sdd.md +0 -84
  49. package/ai-dlc-skill/practices/tdd.md +0 -95
  50. package/ai-dlc-skill/providers/README.md +0 -114
  51. package/ai-dlc-skill/providers/aliyun/deployment.yaml +0 -66
  52. package/ai-dlc-skill/providers/aliyun/preview.yaml +0 -84
  53. package/ai-dlc-skill/providers/aliyun/provider.yaml +0 -160
  54. package/ai-dlc-skill/providers/tcb/deployment.yaml +0 -69
  55. package/ai-dlc-skill/providers/tcb/preview.yaml +0 -83
  56. package/ai-dlc-skill/providers/tcb/provider.yaml +0 -172
  57. package/ai-dlc-skill/requirements.md +0 -140
  58. package/ai-dlc-skill/skill.yaml +0 -147
  59. package/ai-dlc-skill/templates/integration/CHANGELOG.md +0 -41
  60. package/ai-dlc-skill/templates/integration/asyncapi.yaml +0 -43
  61. package/ai-dlc-skill/templates/integration/contract-diff.md +0 -63
  62. package/ai-dlc-skill/templates/integration/contract-spec.md +0 -49
  63. package/ai-dlc-skill/templates/integration/openapi.yaml +0 -18
  64. package/ai-dlc-skill/templates/integration/runtime-contract.yaml +0 -36
  65. package/ai-dlc-skill/templates/plan/design.md +0 -49
  66. package/ai-dlc-skill/templates/plan/task-list.md +0 -32
  67. package/ai-dlc-skill/templates/project/README.md +0 -126
  68. package/ai-dlc-skill/templates/project/template.md +0 -119
  69. package/ai-dlc-skill/templates/understand/feature.feature +0 -23
  70. package/ai-dlc-skill/templates/understand/intent.md +0 -29
  71. package/ai-dlc-skill/templates/understand/spec-delta.md +0 -47
  72. package/ai-dlc-skill/templates/verify/test-unit.py +0 -27
  73. package/ai-dlc-skill/walkthrough/collect.sh +0 -50
  74. package/ai-dlc-skill/walkthrough/template.md +0 -54
  75. package/ai-dlc-skill/workflows/ai-dlc.yaml +0 -110
  76. package/ai-dlc-skill/workflows/deployment.yaml +0 -199
  77. package/cdh/__init__.py +0 -0
  78. package/cdh/__main__.py +0 -4
  79. package/cdh/__pycache__/__init__.cpython-314.pyc +0 -0
  80. package/cdh/__pycache__/cdh_mcp_injector.cpython-314.pyc +0 -0
  81. package/cdh/__pycache__/cdh_mcp_loader.cpython-314.pyc +0 -0
  82. package/cdh/__pycache__/cdh_mcp_manager.cpython-314.pyc +0 -0
  83. package/cdh/__pycache__/cdh_session_aggregator.cpython-314.pyc +0 -0
  84. package/cdh/__pycache__/cdh_skill_loader.cpython-314.pyc +0 -0
  85. package/cdh/__pycache__/cdh_skill_manager.cpython-314.pyc +0 -0
  86. package/cdh/__pycache__/cli.cpython-313.pyc +0 -0
  87. package/cdh/__pycache__/cli.cpython-314.pyc +0 -0
  88. package/cdh/__pycache__/scaffold.cpython-314.pyc +0 -0
  89. package/cdh/cdh_mcp_injector.py +0 -115
  90. package/cdh/cdh_mcp_loader.py +0 -67
  91. package/cdh/cdh_mcp_manager.py +0 -73
  92. package/cdh/cdh_session_aggregator.py +0 -258
  93. package/cdh/cdh_skill_manager.py +0 -105
  94. package/cdh/cli.py +0 -807
  95. package/cdh/scaffold.py +0 -728
  96. package/onecode/__init__.py +0 -1
  97. package/onecode/__main__.py +0 -4
  98. package/onecode/__pycache__/__init__.cpython-314.pyc +0 -0
  99. package/onecode/__pycache__/cli.cpython-314.pyc +0 -0
  100. package/onecode/__pycache__/commands.cpython-314.pyc +0 -0
  101. package/onecode/__pycache__/config.cpython-314.pyc +0 -0
  102. package/onecode/__pycache__/config_screen.cpython-314.pyc +0 -0
  103. package/onecode/__pycache__/migrate.cpython-314.pyc +0 -0
  104. package/onecode/agent/__init__.py +0 -0
  105. package/onecode/agent/__pycache__/__init__.cpython-314.pyc +0 -0
  106. package/onecode/agent/__pycache__/cdh_loader.cpython-314.pyc +0 -0
  107. package/onecode/agent/__pycache__/context.cpython-314.pyc +0 -0
  108. package/onecode/agent/__pycache__/engine.cpython-314.pyc +0 -0
  109. package/onecode/agent/__pycache__/hooks.cpython-314.pyc +0 -0
  110. package/onecode/agent/__pycache__/onecode_agent_acp.cpython-314.pyc +0 -0
  111. package/onecode/agent/__pycache__/permissions.cpython-314.pyc +0 -0
  112. package/onecode/agent/__pycache__/permissions_store.cpython-314.pyc +0 -0
  113. package/onecode/agent/__pycache__/project_doc.cpython-314.pyc +0 -0
  114. package/onecode/agent/__pycache__/session.cpython-314.pyc +0 -0
  115. package/onecode/agent/agents/__init__.py +0 -29
  116. package/onecode/agent/agents/__pycache__/__init__.cpython-314.pyc +0 -0
  117. package/onecode/agent/agents/__pycache__/types.cpython-314.pyc +0 -0
  118. package/onecode/agent/agents/types.py +0 -589
  119. package/onecode/agent/attachments.py +0 -112
  120. package/onecode/agent/cdh_loader.py +0 -267
  121. package/onecode/agent/context.py +0 -343
  122. package/onecode/agent/engine.py +0 -2700
  123. package/onecode/agent/hooks.py +0 -86
  124. package/onecode/agent/onecode_agent_acp.py +0 -2743
  125. package/onecode/agent/onecode_agent_acp.py.bak +0 -2447
  126. package/onecode/agent/permissions.py +0 -150
  127. package/onecode/agent/permissions_store.py +0 -62
  128. package/onecode/agent/project_doc.py +0 -19
  129. package/onecode/agent/session.py +0 -195
  130. package/onecode/agent/snapshot.py +0 -144
  131. package/onecode/agent/tools/__init__.py +0 -17
  132. package/onecode/agent/tools/__pycache__/__init__.cpython-314.pyc +0 -0
  133. package/onecode/agent/tools/__pycache__/agent_tools.cpython-314.pyc +0 -0
  134. package/onecode/agent/tools/__pycache__/apply_patch_tool.cpython-314.pyc +0 -0
  135. package/onecode/agent/tools/__pycache__/bash_tool.cpython-314.pyc +0 -0
  136. package/onecode/agent/tools/__pycache__/communication_tools.cpython-314.pyc +0 -0
  137. package/onecode/agent/tools/__pycache__/config_tool.cpython-314.pyc +0 -0
  138. package/onecode/agent/tools/__pycache__/cron_tools.cpython-314.pyc +0 -0
  139. package/onecode/agent/tools/__pycache__/errors.cpython-314.pyc +0 -0
  140. package/onecode/agent/tools/__pycache__/file_ops.cpython-314.pyc +0 -0
  141. package/onecode/agent/tools/__pycache__/file_tools.cpython-314.pyc +0 -0
  142. package/onecode/agent/tools/__pycache__/git_tools.cpython-314.pyc +0 -0
  143. package/onecode/agent/tools/__pycache__/lsp_tools.cpython-314.pyc +0 -0
  144. package/onecode/agent/tools/__pycache__/mcp_tools.cpython-314.pyc +0 -0
  145. package/onecode/agent/tools/__pycache__/permission_handler.cpython-314.pyc +0 -0
  146. package/onecode/agent/tools/__pycache__/permissions.cpython-314.pyc +0 -0
  147. package/onecode/agent/tools/__pycache__/protocol.cpython-314.pyc +0 -0
  148. package/onecode/agent/tools/__pycache__/registry.cpython-314.pyc +0 -0
  149. package/onecode/agent/tools/__pycache__/sandbox.cpython-314.pyc +0 -0
  150. package/onecode/agent/tools/__pycache__/schema_validation.cpython-314.pyc +0 -0
  151. package/onecode/agent/tools/__pycache__/skill_tools.cpython-314.pyc +0 -0
  152. package/onecode/agent/tools/__pycache__/todo_tools.cpython-314.pyc +0 -0
  153. package/onecode/agent/tools/__pycache__/web_tools.cpython-314.pyc +0 -0
  154. package/onecode/agent/tools/agent_tools.py +0 -132
  155. package/onecode/agent/tools/apply_patch_tool.py +0 -138
  156. package/onecode/agent/tools/bash_tool.py +0 -111
  157. package/onecode/agent/tools/communication_tools.py +0 -148
  158. package/onecode/agent/tools/config_tool.py +0 -130
  159. package/onecode/agent/tools/cron_tools.py +0 -178
  160. package/onecode/agent/tools/errors.py +0 -17
  161. package/onecode/agent/tools/file_ops.py +0 -221
  162. package/onecode/agent/tools/file_tools.py +0 -225
  163. package/onecode/agent/tools/git_tools.py +0 -88
  164. package/onecode/agent/tools/lsp_tools.py +0 -404
  165. package/onecode/agent/tools/mcp_tools.py +0 -127
  166. package/onecode/agent/tools/permission_handler.py +0 -46
  167. package/onecode/agent/tools/permissions.py +0 -77
  168. package/onecode/agent/tools/protocol.py +0 -20
  169. package/onecode/agent/tools/registry.py +0 -201
  170. package/onecode/agent/tools/sandbox.py +0 -358
  171. package/onecode/agent/tools/schema_validation.py +0 -100
  172. package/onecode/agent/tools/skill_tools.py +0 -52
  173. package/onecode/agent/tools/todo_tools.py +0 -207
  174. package/onecode/agent/tools/web_tools.py +0 -169
  175. package/onecode/builtin_skills/agent-browser/SKILL.md +0 -212
  176. package/onecode/builtin_skills/agent-browser/skill.yaml +0 -8
  177. package/onecode/builtin_skills/git/SKILL.md +0 -64
  178. package/onecode/builtin_skills/git/skill.yaml +0 -7
  179. package/onecode/builtin_skills/shell/SKILL.md +0 -58
  180. package/onecode/builtin_skills/shell/skill.yaml +0 -8
  181. package/onecode/builtin_skills/skill-creator/SKILL.md +0 -106
  182. package/onecode/builtin_skills/skill-creator/skill.yaml +0 -8
  183. package/onecode/cli.py +0 -935
  184. package/onecode/cloud/__init__.py +0 -0
  185. package/onecode/cloud/base.py +0 -20
  186. package/onecode/codebase/__init__.py +0 -69
  187. package/onecode/codebase/__pycache__/__init__.cpython-314.pyc +0 -0
  188. package/onecode/codebase/__pycache__/chunker.cpython-314.pyc +0 -0
  189. package/onecode/codebase/__pycache__/indexer.cpython-314.pyc +0 -0
  190. package/onecode/codebase/__pycache__/retriever.cpython-314.pyc +0 -0
  191. package/onecode/codebase/__pycache__/storage.cpython-314.pyc +0 -0
  192. package/onecode/codebase/__pycache__/tools.cpython-314.pyc +0 -0
  193. package/onecode/codebase/chunker.py +0 -125
  194. package/onecode/codebase/indexer.py +0 -149
  195. package/onecode/codebase/retriever.py +0 -203
  196. package/onecode/codebase/storage.py +0 -131
  197. package/onecode/codebase/tools.py +0 -59
  198. package/onecode/commands.py +0 -596
  199. package/onecode/config.py +0 -314
  200. package/onecode/config_screen.py +0 -600
  201. package/onecode/cron/__init__.py +0 -3
  202. package/onecode/lsp/__init__.py +0 -3
  203. package/onecode/mcp/__init__.py +0 -4
  204. package/onecode/mcp/__pycache__/__init__.cpython-314.pyc +0 -0
  205. package/onecode/mcp/__pycache__/client.cpython-314.pyc +0 -0
  206. package/onecode/mcp/__pycache__/manager.cpython-314.pyc +0 -0
  207. package/onecode/mcp/client.py +0 -193
  208. package/onecode/mcp/manager.py +0 -190
  209. package/onecode/memory/__init__.py +0 -49
  210. package/onecode/memory/__pycache__/__init__.cpython-314.pyc +0 -0
  211. package/onecode/memory/__pycache__/backend.cpython-314.pyc +0 -0
  212. package/onecode/memory/__pycache__/offload.cpython-314.pyc +0 -0
  213. package/onecode/memory/__pycache__/pyramid.cpython-314.pyc +0 -0
  214. package/onecode/memory/__pycache__/recall.cpython-314.pyc +0 -0
  215. package/onecode/memory/__pycache__/symbolic.cpython-314.pyc +0 -0
  216. package/onecode/memory/backend.py +0 -159
  217. package/onecode/memory/pyramid.py +0 -133
  218. package/onecode/memory/recall.py +0 -203
  219. package/onecode/migrate.py +0 -122
  220. package/onecode/models/__init__.py +0 -4
  221. package/onecode/models/__pycache__/__init__.cpython-314.pyc +0 -0
  222. package/onecode/models/__pycache__/errors.cpython-314.pyc +0 -0
  223. package/onecode/models/__pycache__/messages.cpython-314.pyc +0 -0
  224. package/onecode/models/__pycache__/provider.cpython-314.pyc +0 -0
  225. package/onecode/models/__pycache__/registry.cpython-314.pyc +0 -0
  226. package/onecode/models/errors.py +0 -104
  227. package/onecode/models/messages.py +0 -739
  228. package/onecode/models/provider.py +0 -699
  229. package/onecode/models/providers/__init__.py +0 -17
  230. package/onecode/models/providers/__pycache__/__init__.cpython-314.pyc +0 -0
  231. package/onecode/models/providers/__pycache__/anthropic_provider.cpython-314.pyc +0 -0
  232. package/onecode/models/providers/__pycache__/deepseek_provider.cpython-314.pyc +0 -0
  233. package/onecode/models/providers/__pycache__/glm_provider.cpython-314.pyc +0 -0
  234. package/onecode/models/providers/__pycache__/minimax_provider.cpython-314.pyc +0 -0
  235. package/onecode/models/providers/__pycache__/minimaxi_provider.cpython-314.pyc +0 -0
  236. package/onecode/models/providers/__pycache__/ollama_provider.cpython-314.pyc +0 -0
  237. package/onecode/models/providers/__pycache__/openai_provider.cpython-314.pyc +0 -0
  238. package/onecode/models/providers/anthropic_provider.py +0 -273
  239. package/onecode/models/providers/deepseek_provider.py +0 -212
  240. package/onecode/models/providers/glm_provider.py +0 -195
  241. package/onecode/models/providers/minimax_provider.py +0 -158
  242. package/onecode/models/providers/minimaxi_provider.py +0 -417
  243. package/onecode/models/providers/ollama_provider.py +0 -100
  244. package/onecode/models/providers/openai_provider.py +0 -237
  245. package/onecode/models/registry.py +0 -212
  246. package/onecode/server/__init__.py +0 -3
  247. package/onecode/server/app.py +0 -224
  248. package/onecode/skills/__init__.py +0 -11
  249. package/onecode/skills/__pycache__/__init__.cpython-314.pyc +0 -0
  250. package/onecode/skills/__pycache__/argument_substitution.cpython-314.pyc +0 -0
  251. package/onecode/skills/__pycache__/bootstrap.cpython-314.pyc +0 -0
  252. package/onecode/skills/__pycache__/create.cpython-314.pyc +0 -0
  253. package/onecode/skills/__pycache__/frontmatter.cpython-314.pyc +0 -0
  254. package/onecode/skills/__pycache__/loader.cpython-314.pyc +0 -0
  255. package/onecode/skills/__pycache__/manager.cpython-314.pyc +0 -0
  256. package/onecode/skills/__pycache__/model.cpython-314.pyc +0 -0
  257. package/onecode/skills/argument_substitution.py +0 -38
  258. package/onecode/skills/bootstrap.py +0 -124
  259. package/onecode/skills/create.py +0 -56
  260. package/onecode/skills/frontmatter.py +0 -33
  261. package/onecode/skills/loader.py +0 -139
  262. package/onecode/skills/manager.py +0 -75
  263. package/onecode/skills/model.py +0 -43
  264. package/onecode/storage/__init__.py +0 -0
  265. package/onecode/storage/activity.py +0 -63
  266. package/onecode/storage/project.py +0 -54
  267. package/onecode/storage/session.py +0 -112
  268. package/onecode/tasks/__init__.py +0 -26
  269. package/onecode/tasks/manager.py +0 -232
  270. package/onecode/tasks/models.py +0 -240
  271. package/onecode/trace/__init__.py +0 -0
  272. package/onecode/trace/tracer.py +0 -173
  273. package/onecode/utils/__init__.py +0 -0
  274. package/onecode/utils/helpers.py +0 -20
  275. package/pyproject.toml +0 -74
  276. package/tui/__init__.py +0 -46
  277. package/tui/__main__.py +0 -4
  278. package/tui/__pycache__/__init__.cpython-314.pyc +0 -0
  279. package/tui/__pycache__/_loop.cpython-314.pyc +0 -0
  280. package/tui/__pycache__/_path_fuzzy_search.cpython-314.pyc +0 -0
  281. package/tui/__pycache__/_path_match.cpython-314.pyc +0 -0
  282. package/tui/__pycache__/about.cpython-314.pyc +0 -0
  283. package/tui/__pycache__/agent.cpython-314.pyc +0 -0
  284. package/tui/__pycache__/agent_schema.cpython-314.pyc +0 -0
  285. package/tui/__pycache__/agents.cpython-314.pyc +0 -0
  286. package/tui/__pycache__/answer.cpython-314.pyc +0 -0
  287. package/tui/__pycache__/app.cpython-313.pyc +0 -0
  288. package/tui/__pycache__/app.cpython-314.pyc +0 -0
  289. package/tui/__pycache__/atomic.cpython-314.pyc +0 -0
  290. package/tui/__pycache__/complete.cpython-314.pyc +0 -0
  291. package/tui/__pycache__/constants.cpython-314.pyc +0 -0
  292. package/tui/__pycache__/conversation_markdown.cpython-314.pyc +0 -0
  293. package/tui/__pycache__/danger.cpython-314.pyc +0 -0
  294. package/tui/__pycache__/db.cpython-314.pyc +0 -0
  295. package/tui/__pycache__/dec.cpython-314.pyc +0 -0
  296. package/tui/__pycache__/directory.cpython-314.pyc +0 -0
  297. package/tui/__pycache__/directory_suggester.cpython-314.pyc +0 -0
  298. package/tui/__pycache__/directory_watcher.cpython-314.pyc +0 -0
  299. package/tui/__pycache__/format_path.cpython-314.pyc +0 -0
  300. package/tui/__pycache__/fuzzy.cpython-314.pyc +0 -0
  301. package/tui/__pycache__/fuzzy_index.cpython-314.pyc +0 -0
  302. package/tui/__pycache__/history.cpython-314.pyc +0 -0
  303. package/tui/__pycache__/jsonrpc.cpython-314.pyc +0 -0
  304. package/tui/__pycache__/menus.cpython-314.pyc +0 -0
  305. package/tui/__pycache__/message_log.cpython-314.pyc +0 -0
  306. package/tui/__pycache__/messages.cpython-314.pyc +0 -0
  307. package/tui/__pycache__/path_complete.cpython-314.pyc +0 -0
  308. package/tui/__pycache__/path_filter.cpython-314.pyc +0 -0
  309. package/tui/__pycache__/paths.cpython-314.pyc +0 -0
  310. package/tui/__pycache__/pill.cpython-314.pyc +0 -0
  311. package/tui/__pycache__/platform_commands.cpython-314.pyc +0 -0
  312. package/tui/__pycache__/protocol.cpython-314.pyc +0 -0
  313. package/tui/__pycache__/session_tracker.cpython-314.pyc +0 -0
  314. package/tui/__pycache__/settings.cpython-314.pyc +0 -0
  315. package/tui/__pycache__/settings_schema.cpython-314.pyc +0 -0
  316. package/tui/__pycache__/shell.cpython-314.pyc +0 -0
  317. package/tui/__pycache__/shell_read.cpython-314.pyc +0 -0
  318. package/tui/__pycache__/slash_command.cpython-314.pyc +0 -0
  319. package/tui/__pycache__/version.cpython-314.pyc +0 -0
  320. package/tui/_loop.py +0 -86
  321. package/tui/_path_fuzzy_search.py +0 -48
  322. package/tui/_path_match.py +0 -141
  323. package/tui/about.py +0 -95
  324. package/tui/acp/__pycache__/agent.cpython-314.pyc +0 -0
  325. package/tui/acp/__pycache__/api.cpython-314.pyc +0 -0
  326. package/tui/acp/__pycache__/encode_tool_call_id.cpython-314.pyc +0 -0
  327. package/tui/acp/__pycache__/messages.cpython-314.pyc +0 -0
  328. package/tui/acp/__pycache__/prompt.cpython-314.pyc +0 -0
  329. package/tui/acp/__pycache__/protocol.cpython-314.pyc +0 -0
  330. package/tui/acp/agent.py +0 -1002
  331. package/tui/acp/api.py +0 -73
  332. package/tui/acp/encode_tool_call_id.py +0 -12
  333. package/tui/acp/messages.py +0 -203
  334. package/tui/acp/prompt.py +0 -53
  335. package/tui/acp/protocol.py +0 -499
  336. package/tui/agent.py +0 -70
  337. package/tui/agent_schema.py +0 -76
  338. package/tui/agents.py +0 -46
  339. package/tui/ansi/__init__.py +0 -1
  340. package/tui/ansi/__pycache__/__init__.cpython-314.pyc +0 -0
  341. package/tui/ansi/__pycache__/_ansi.cpython-314.pyc +0 -0
  342. package/tui/ansi/__pycache__/_ansi_colors.cpython-314.pyc +0 -0
  343. package/tui/ansi/__pycache__/_control_codes.cpython-314.pyc +0 -0
  344. package/tui/ansi/__pycache__/_keys.cpython-314.pyc +0 -0
  345. package/tui/ansi/__pycache__/_sgr_styles.cpython-314.pyc +0 -0
  346. package/tui/ansi/__pycache__/_stream_parser.cpython-314.pyc +0 -0
  347. package/tui/ansi/_ansi.py +0 -1689
  348. package/tui/ansi/_ansi_colors.py +0 -264
  349. package/tui/ansi/_control_codes.py +0 -37
  350. package/tui/ansi/_keys.py +0 -251
  351. package/tui/ansi/_sgr_styles.py +0 -64
  352. package/tui/ansi/_stream_parser.py +0 -418
  353. package/tui/answer.py +0 -12
  354. package/tui/app.py +0 -1266
  355. package/tui/atomic.py +0 -37
  356. package/tui/cli.py +0 -313
  357. package/tui/code_analyze.py +0 -27
  358. package/tui/complete.py +0 -38
  359. package/tui/constants.py +0 -61
  360. package/tui/conversation_markdown.py +0 -30
  361. package/tui/danger.py +0 -372
  362. package/tui/data/agents/ampcode.com.toml +0 -52
  363. package/tui/data/agents/augmentcode.com.toml +0 -41
  364. package/tui/data/agents/cdh.cloud-dev-harness.toml +0 -23
  365. package/tui/data/agents/claude.com.toml +0 -41
  366. package/tui/data/agents/copilot.github.com.toml +0 -29
  367. package/tui/data/agents/crowai.dev.toml +0 -36
  368. package/tui/data/agents/cursor.com.toml +0 -38
  369. package/tui/data/agents/deepagents.langchain.com +0 -34
  370. package/tui/data/agents/docker.com.toml +0 -60
  371. package/tui/data/agents/geminicli.com.toml +0 -28
  372. package/tui/data/agents/goose.ai.toml +0 -52
  373. package/tui/data/agents/inference.huggingface.co.toml +0 -41
  374. package/tui/data/agents/kimi.com.toml +0 -35
  375. package/tui/data/agents/kiro.dev.toml +0 -43
  376. package/tui/data/agents/onecode.dev.toml +0 -22
  377. package/tui/data/agents/openai.com.toml +0 -53
  378. package/tui/data/agents/openclaw.ai.toml +0 -37
  379. package/tui/data/agents/opencode.ai.toml +0 -39
  380. package/tui/data/agents/openhands.dev.toml +0 -46
  381. package/tui/data/agents/stakpak.dev.toml +0 -62
  382. package/tui/data/agents/vibe.mistral.ai.toml +0 -31
  383. package/tui/data/agents/vtcode.dev.toml +0 -63
  384. package/tui/data/images/frog.png +0 -0
  385. package/tui/data/sounds/question.wav +0 -0
  386. package/tui/data/sounds/turn-over.wav +0 -0
  387. package/tui/db.py +0 -213
  388. package/tui/dec.py +0 -332
  389. package/tui/directory.py +0 -234
  390. package/tui/directory_suggester.py +0 -93
  391. package/tui/directory_watcher.py +0 -231
  392. package/tui/format_path.py +0 -25
  393. package/tui/fuzzy.py +0 -140
  394. package/tui/fuzzy_index.py +0 -275
  395. package/tui/gist.py +0 -33
  396. package/tui/history.py +0 -138
  397. package/tui/jsonrpc.py +0 -578
  398. package/tui/menus.py +0 -14
  399. package/tui/message_log.py +0 -69
  400. package/tui/messages.py +0 -144
  401. package/tui/option_content.py +0 -51
  402. package/tui/os.py +0 -0
  403. package/tui/path_complete.py +0 -217
  404. package/tui/path_filter.py +0 -124
  405. package/tui/paths.py +0 -87
  406. package/tui/pill.py +0 -23
  407. package/tui/platform_commands.py +0 -52
  408. package/tui/prompt/__pycache__/extract.cpython-314.pyc +0 -0
  409. package/tui/prompt/__pycache__/resource.cpython-314.pyc +0 -0
  410. package/tui/prompt/extract.py +0 -19
  411. package/tui/prompt/resource.py +0 -68
  412. package/tui/protocol.py +0 -28
  413. package/tui/screens/__init__.py +0 -0
  414. package/tui/screens/__pycache__/__init__.cpython-314.pyc +0 -0
  415. package/tui/screens/__pycache__/agent_modal.cpython-314.pyc +0 -0
  416. package/tui/screens/__pycache__/component_picker.cpython-314.pyc +0 -0
  417. package/tui/screens/__pycache__/diff_screen.cpython-314.pyc +0 -0
  418. package/tui/screens/__pycache__/log.cpython-314.pyc +0 -0
  419. package/tui/screens/__pycache__/main.cpython-313.pyc +0 -0
  420. package/tui/screens/__pycache__/main.cpython-314.pyc +0 -0
  421. package/tui/screens/__pycache__/permissions.cpython-314.pyc +0 -0
  422. package/tui/screens/__pycache__/projects_app.cpython-314.pyc +0 -0
  423. package/tui/screens/__pycache__/projects_screen.cpython-314.pyc +0 -0
  424. package/tui/screens/__pycache__/sessions.cpython-314.pyc +0 -0
  425. package/tui/screens/__pycache__/store.cpython-314.pyc +0 -0
  426. package/tui/screens/__pycache__/tool_content_screen.cpython-314.pyc +0 -0
  427. package/tui/screens/action_modal.py +0 -94
  428. package/tui/screens/agent_modal.py +0 -175
  429. package/tui/screens/command_edit_modal.py +0 -74
  430. package/tui/screens/component_picker.py +0 -168
  431. package/tui/screens/diff_screen.py +0 -84
  432. package/tui/screens/log.py +0 -553
  433. package/tui/screens/main.py +0 -385
  434. package/tui/screens/main.tcss +0 -655
  435. package/tui/screens/permissions.py +0 -404
  436. package/tui/screens/permissions.tcss +0 -72
  437. package/tui/screens/projects.tcss +0 -80
  438. package/tui/screens/projects_app.py +0 -347
  439. package/tui/screens/projects_screen.py +0 -284
  440. package/tui/screens/session_resume_modal.py +0 -172
  441. package/tui/screens/session_resume_modal.tcss +0 -35
  442. package/tui/screens/sessions.py +0 -164
  443. package/tui/screens/sessions.tcss +0 -119
  444. package/tui/screens/settings.py +0 -254
  445. package/tui/screens/settings.tcss +0 -101
  446. package/tui/screens/store.py +0 -500
  447. package/tui/screens/store.tcss +0 -274
  448. package/tui/screens/tool_content_screen.py +0 -59
  449. package/tui/session_tracker.py +0 -123
  450. package/tui/settings.py +0 -353
  451. package/tui/settings_schema.py +0 -431
  452. package/tui/shell.py +0 -304
  453. package/tui/shell_read.py +0 -42
  454. package/tui/slash_command.py +0 -34
  455. package/tui/tui.tcss +0 -246
  456. package/tui/twitter.py +0 -38
  457. package/tui/version.py +0 -80
  458. package/tui/visuals/__init__.py +0 -0
  459. package/tui/visuals/__pycache__/__init__.cpython-314.pyc +0 -0
  460. package/tui/visuals/__pycache__/columns.cpython-314.pyc +0 -0
  461. package/tui/visuals/columns.py +0 -272
  462. package/tui/widgets/__init__.py +0 -0
  463. package/tui/widgets/__pycache__/__init__.cpython-314.pyc +0 -0
  464. package/tui/widgets/__pycache__/acp_content.cpython-314.pyc +0 -0
  465. package/tui/widgets/__pycache__/agent_response.cpython-314.pyc +0 -0
  466. package/tui/widgets/__pycache__/agent_thought.cpython-314.pyc +0 -0
  467. package/tui/widgets/__pycache__/ask_user.cpython-314.pyc +0 -0
  468. package/tui/widgets/__pycache__/condensed_path.cpython-314.pyc +0 -0
  469. package/tui/widgets/__pycache__/context_stats.cpython-314.pyc +0 -0
  470. package/tui/widgets/__pycache__/conversation.cpython-314.pyc +0 -0
  471. package/tui/widgets/__pycache__/diff_view.cpython-314.pyc +0 -0
  472. package/tui/widgets/__pycache__/directory_input.cpython-314.pyc +0 -0
  473. package/tui/widgets/__pycache__/flash.cpython-314.pyc +0 -0
  474. package/tui/widgets/__pycache__/future_text.cpython-314.pyc +0 -0
  475. package/tui/widgets/__pycache__/grid_select.cpython-314.pyc +0 -0
  476. package/tui/widgets/__pycache__/highlighted_textarea.cpython-314.pyc +0 -0
  477. package/tui/widgets/__pycache__/load_more.cpython-314.pyc +0 -0
  478. package/tui/widgets/__pycache__/mandelbrot.cpython-314.pyc +0 -0
  479. package/tui/widgets/__pycache__/markdown_note.cpython-314.pyc +0 -0
  480. package/tui/widgets/__pycache__/menu.cpython-314.pyc +0 -0
  481. package/tui/widgets/__pycache__/modified_files.cpython-314.pyc +0 -0
  482. package/tui/widgets/__pycache__/non_selectable_label.cpython-314.pyc +0 -0
  483. package/tui/widgets/__pycache__/note.cpython-314.pyc +0 -0
  484. package/tui/widgets/__pycache__/path_search.cpython-314.pyc +0 -0
  485. package/tui/widgets/__pycache__/plan.cpython-314.pyc +0 -0
  486. package/tui/widgets/__pycache__/project_directory_tree.cpython-314.pyc +0 -0
  487. package/tui/widgets/__pycache__/project_grid_select.cpython-314.pyc +0 -0
  488. package/tui/widgets/__pycache__/project_summary.cpython-314.pyc +0 -0
  489. package/tui/widgets/__pycache__/prompt.cpython-314.pyc +0 -0
  490. package/tui/widgets/__pycache__/question.cpython-314.pyc +0 -0
  491. package/tui/widgets/__pycache__/session_grid_select.cpython-314.pyc +0 -0
  492. package/tui/widgets/__pycache__/session_summary.cpython-314.pyc +0 -0
  493. package/tui/widgets/__pycache__/session_tabs.cpython-314.pyc +0 -0
  494. package/tui/widgets/__pycache__/shell_result.cpython-314.pyc +0 -0
  495. package/tui/widgets/__pycache__/shell_terminal.cpython-314.pyc +0 -0
  496. package/tui/widgets/__pycache__/side_bar.cpython-314.pyc +0 -0
  497. package/tui/widgets/__pycache__/slash_complete.cpython-314.pyc +0 -0
  498. package/tui/widgets/__pycache__/strike_text.cpython-314.pyc +0 -0
  499. package/tui/widgets/__pycache__/subagent.cpython-314.pyc +0 -0
  500. package/tui/widgets/__pycache__/subagent_screen.cpython-314.pyc +0 -0
  501. package/tui/widgets/__pycache__/terminal.cpython-314.pyc +0 -0
  502. package/tui/widgets/__pycache__/throbber.cpython-314.pyc +0 -0
  503. package/tui/widgets/__pycache__/tool_call.cpython-314.pyc +0 -0
  504. package/tui/widgets/__pycache__/user_input.cpython-314.pyc +0 -0
  505. package/tui/widgets/acp_content.py +0 -70
  506. package/tui/widgets/agent_response.py +0 -76
  507. package/tui/widgets/agent_thought.py +0 -167
  508. package/tui/widgets/ask_user.py +0 -264
  509. package/tui/widgets/command_pane.py +0 -223
  510. package/tui/widgets/condensed_path.py +0 -115
  511. package/tui/widgets/context_stats.py +0 -66
  512. package/tui/widgets/conversation.py +0 -2641
  513. package/tui/widgets/danger_warning.py +0 -65
  514. package/tui/widgets/diff_view.py +0 -69
  515. package/tui/widgets/directory_input.py +0 -8
  516. package/tui/widgets/flash.py +0 -81
  517. package/tui/widgets/future_text.py +0 -126
  518. package/tui/widgets/grid_select.py +0 -234
  519. package/tui/widgets/highlighted_textarea.py +0 -180
  520. package/tui/widgets/load_more.py +0 -24
  521. package/tui/widgets/mandelbrot.py +0 -294
  522. package/tui/widgets/markdown_note.py +0 -13
  523. package/tui/widgets/menu.py +0 -147
  524. package/tui/widgets/modified_files.py +0 -306
  525. package/tui/widgets/non_selectable_label.py +0 -5
  526. package/tui/widgets/note.py +0 -18
  527. package/tui/widgets/path_search.py +0 -492
  528. package/tui/widgets/plan.py +0 -285
  529. package/tui/widgets/project_directory_tree.py +0 -102
  530. package/tui/widgets/project_grid_select.py +0 -64
  531. package/tui/widgets/project_summary.py +0 -33
  532. package/tui/widgets/prompt.py +0 -795
  533. package/tui/widgets/question.py +0 -360
  534. package/tui/widgets/session_grid_select.py +0 -230
  535. package/tui/widgets/session_summary.py +0 -115
  536. package/tui/widgets/session_tabs.py +0 -188
  537. package/tui/widgets/shell_result.py +0 -35
  538. package/tui/widgets/shell_terminal.py +0 -40
  539. package/tui/widgets/side_bar.py +0 -124
  540. package/tui/widgets/slash_complete.py +0 -235
  541. package/tui/widgets/strike_text.py +0 -70
  542. package/tui/widgets/subagent.py +0 -287
  543. package/tui/widgets/subagent_screen.py +0 -709
  544. package/tui/widgets/terminal.py +0 -576
  545. package/tui/widgets/terminal_tool.py +0 -360
  546. package/tui/widgets/throbber.py +0 -100
  547. package/tui/widgets/tool_call.py +0 -398
  548. package/tui/widgets/user_input.py +0 -23
  549. package/tui/widgets/version.py +0 -5
  550. 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()