@scemoon/cdh 1.0.5 → 1.0.7

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