@scemoon/cdh 1.0.6 → 1.0.8

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