@scemoon/cdh 1.0.6 → 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (550) hide show
  1. package/package.json +2 -2
  2. package/ai-dlc-skill/SKILL.md +0 -77
  3. package/ai-dlc-skill/agents/deliver-agent.md +0 -24
  4. package/ai-dlc-skill/agents/master.md +0 -50
  5. package/ai-dlc-skill/agents/plan-agent.md +0 -23
  6. package/ai-dlc-skill/agents/understand-agent.md +0 -23
  7. package/ai-dlc-skill/agents/verify-agent.md +0 -27
  8. package/ai-dlc-skill/architecture/project-structure.md +0 -78
  9. package/ai-dlc-skill/brownfield/README.md +0 -30
  10. package/ai-dlc-skill/brownfield/generate-context.sh +0 -64
  11. package/ai-dlc-skill/brownfield/scripts/deps.sh +0 -27
  12. package/ai-dlc-skill/brownfield/scripts/discover.sh +0 -34
  13. package/ai-dlc-skill/brownfield/scripts/extract-api.sh +0 -45
  14. package/ai-dlc-skill/components/backend.md +0 -34
  15. package/ai-dlc-skill/components/desktop.md +0 -30
  16. package/ai-dlc-skill/components/mya.md +0 -29
  17. package/ai-dlc-skill/components/native.md +0 -30
  18. package/ai-dlc-skill/components/tta.md +0 -29
  19. package/ai-dlc-skill/components/web.md +0 -31
  20. package/ai-dlc-skill/components/wxa.md +0 -29
  21. package/ai-dlc-skill/contracts/README.md +0 -25
  22. package/ai-dlc-skill/core/adaptive-flow.md +0 -36
  23. package/ai-dlc-skill/core/security.md +0 -29
  24. package/ai-dlc-skill/cross-tool/cline/export.sh +0 -31
  25. package/ai-dlc-skill/cross-tool/copilot/export.sh +0 -47
  26. package/ai-dlc-skill/cross-tool/cursor/export.sh +0 -32
  27. package/ai-dlc-skill/cross-tool/export.sh +0 -22
  28. package/ai-dlc-skill/cross-tool/onecode/config.yaml.tpl +0 -17
  29. package/ai-dlc-skill/cross-tool/onecode/export-skills.sh +0 -35
  30. package/ai-dlc-skill/cross-tool/onecode/export.sh +0 -54
  31. package/ai-dlc-skill/phases/deliver/entry.md +0 -26
  32. package/ai-dlc-skill/phases/deliver/lifecycle.md +0 -185
  33. package/ai-dlc-skill/phases/deliver/prompt.md +0 -40
  34. package/ai-dlc-skill/phases/deliver/rules.md +0 -61
  35. package/ai-dlc-skill/phases/plan/entry.md +0 -25
  36. package/ai-dlc-skill/phases/plan/lifecycle.md +0 -204
  37. package/ai-dlc-skill/phases/plan/prompt.md +0 -38
  38. package/ai-dlc-skill/phases/plan/rules.md +0 -25
  39. package/ai-dlc-skill/phases/understand/entry.md +0 -26
  40. package/ai-dlc-skill/phases/understand/lifecycle.md +0 -184
  41. package/ai-dlc-skill/phases/understand/prompt.md +0 -41
  42. package/ai-dlc-skill/phases/understand/rules.md +0 -37
  43. package/ai-dlc-skill/phases/verify/entry.md +0 -26
  44. package/ai-dlc-skill/phases/verify/lifecycle.md +0 -192
  45. package/ai-dlc-skill/phases/verify/prompt.md +0 -43
  46. package/ai-dlc-skill/phases/verify/rules.md +0 -73
  47. package/ai-dlc-skill/practices/bdd.md +0 -91
  48. package/ai-dlc-skill/practices/sdd.md +0 -84
  49. package/ai-dlc-skill/practices/tdd.md +0 -95
  50. package/ai-dlc-skill/providers/README.md +0 -114
  51. package/ai-dlc-skill/providers/aliyun/deployment.yaml +0 -66
  52. package/ai-dlc-skill/providers/aliyun/preview.yaml +0 -84
  53. package/ai-dlc-skill/providers/aliyun/provider.yaml +0 -160
  54. package/ai-dlc-skill/providers/tcb/deployment.yaml +0 -69
  55. package/ai-dlc-skill/providers/tcb/preview.yaml +0 -83
  56. package/ai-dlc-skill/providers/tcb/provider.yaml +0 -172
  57. package/ai-dlc-skill/requirements.md +0 -140
  58. package/ai-dlc-skill/skill.yaml +0 -147
  59. package/ai-dlc-skill/templates/integration/CHANGELOG.md +0 -41
  60. package/ai-dlc-skill/templates/integration/asyncapi.yaml +0 -43
  61. package/ai-dlc-skill/templates/integration/contract-diff.md +0 -63
  62. package/ai-dlc-skill/templates/integration/contract-spec.md +0 -49
  63. package/ai-dlc-skill/templates/integration/openapi.yaml +0 -18
  64. package/ai-dlc-skill/templates/integration/runtime-contract.yaml +0 -36
  65. package/ai-dlc-skill/templates/plan/design.md +0 -49
  66. package/ai-dlc-skill/templates/plan/task-list.md +0 -32
  67. package/ai-dlc-skill/templates/project/README.md +0 -126
  68. package/ai-dlc-skill/templates/project/template.md +0 -119
  69. package/ai-dlc-skill/templates/understand/feature.feature +0 -23
  70. package/ai-dlc-skill/templates/understand/intent.md +0 -29
  71. package/ai-dlc-skill/templates/understand/spec-delta.md +0 -47
  72. package/ai-dlc-skill/templates/verify/test-unit.py +0 -27
  73. package/ai-dlc-skill/walkthrough/collect.sh +0 -50
  74. package/ai-dlc-skill/walkthrough/template.md +0 -54
  75. package/ai-dlc-skill/workflows/ai-dlc.yaml +0 -110
  76. package/ai-dlc-skill/workflows/deployment.yaml +0 -199
  77. package/cdh/__init__.py +0 -0
  78. package/cdh/__main__.py +0 -4
  79. package/cdh/__pycache__/__init__.cpython-314.pyc +0 -0
  80. package/cdh/__pycache__/cdh_mcp_injector.cpython-314.pyc +0 -0
  81. package/cdh/__pycache__/cdh_mcp_loader.cpython-314.pyc +0 -0
  82. package/cdh/__pycache__/cdh_mcp_manager.cpython-314.pyc +0 -0
  83. package/cdh/__pycache__/cdh_session_aggregator.cpython-314.pyc +0 -0
  84. package/cdh/__pycache__/cdh_skill_loader.cpython-314.pyc +0 -0
  85. package/cdh/__pycache__/cdh_skill_manager.cpython-314.pyc +0 -0
  86. package/cdh/__pycache__/cli.cpython-313.pyc +0 -0
  87. package/cdh/__pycache__/cli.cpython-314.pyc +0 -0
  88. package/cdh/__pycache__/scaffold.cpython-314.pyc +0 -0
  89. package/cdh/cdh_mcp_injector.py +0 -115
  90. package/cdh/cdh_mcp_loader.py +0 -67
  91. package/cdh/cdh_mcp_manager.py +0 -73
  92. package/cdh/cdh_session_aggregator.py +0 -258
  93. package/cdh/cdh_skill_manager.py +0 -105
  94. package/cdh/cli.py +0 -807
  95. package/cdh/scaffold.py +0 -728
  96. package/onecode/__init__.py +0 -1
  97. package/onecode/__main__.py +0 -4
  98. package/onecode/__pycache__/__init__.cpython-314.pyc +0 -0
  99. package/onecode/__pycache__/cli.cpython-314.pyc +0 -0
  100. package/onecode/__pycache__/commands.cpython-314.pyc +0 -0
  101. package/onecode/__pycache__/config.cpython-314.pyc +0 -0
  102. package/onecode/__pycache__/config_screen.cpython-314.pyc +0 -0
  103. package/onecode/__pycache__/migrate.cpython-314.pyc +0 -0
  104. package/onecode/agent/__init__.py +0 -0
  105. package/onecode/agent/__pycache__/__init__.cpython-314.pyc +0 -0
  106. package/onecode/agent/__pycache__/cdh_loader.cpython-314.pyc +0 -0
  107. package/onecode/agent/__pycache__/context.cpython-314.pyc +0 -0
  108. package/onecode/agent/__pycache__/engine.cpython-314.pyc +0 -0
  109. package/onecode/agent/__pycache__/hooks.cpython-314.pyc +0 -0
  110. package/onecode/agent/__pycache__/onecode_agent_acp.cpython-314.pyc +0 -0
  111. package/onecode/agent/__pycache__/permissions.cpython-314.pyc +0 -0
  112. package/onecode/agent/__pycache__/permissions_store.cpython-314.pyc +0 -0
  113. package/onecode/agent/__pycache__/project_doc.cpython-314.pyc +0 -0
  114. package/onecode/agent/__pycache__/session.cpython-314.pyc +0 -0
  115. package/onecode/agent/agents/__init__.py +0 -29
  116. package/onecode/agent/agents/__pycache__/__init__.cpython-314.pyc +0 -0
  117. package/onecode/agent/agents/__pycache__/types.cpython-314.pyc +0 -0
  118. package/onecode/agent/agents/types.py +0 -589
  119. package/onecode/agent/attachments.py +0 -112
  120. package/onecode/agent/cdh_loader.py +0 -267
  121. package/onecode/agent/context.py +0 -343
  122. package/onecode/agent/engine.py +0 -2700
  123. package/onecode/agent/hooks.py +0 -86
  124. package/onecode/agent/onecode_agent_acp.py +0 -2743
  125. package/onecode/agent/onecode_agent_acp.py.bak +0 -2447
  126. package/onecode/agent/permissions.py +0 -150
  127. package/onecode/agent/permissions_store.py +0 -62
  128. package/onecode/agent/project_doc.py +0 -19
  129. package/onecode/agent/session.py +0 -195
  130. package/onecode/agent/snapshot.py +0 -144
  131. package/onecode/agent/tools/__init__.py +0 -17
  132. package/onecode/agent/tools/__pycache__/__init__.cpython-314.pyc +0 -0
  133. package/onecode/agent/tools/__pycache__/agent_tools.cpython-314.pyc +0 -0
  134. package/onecode/agent/tools/__pycache__/apply_patch_tool.cpython-314.pyc +0 -0
  135. package/onecode/agent/tools/__pycache__/bash_tool.cpython-314.pyc +0 -0
  136. package/onecode/agent/tools/__pycache__/communication_tools.cpython-314.pyc +0 -0
  137. package/onecode/agent/tools/__pycache__/config_tool.cpython-314.pyc +0 -0
  138. package/onecode/agent/tools/__pycache__/cron_tools.cpython-314.pyc +0 -0
  139. package/onecode/agent/tools/__pycache__/errors.cpython-314.pyc +0 -0
  140. package/onecode/agent/tools/__pycache__/file_ops.cpython-314.pyc +0 -0
  141. package/onecode/agent/tools/__pycache__/file_tools.cpython-314.pyc +0 -0
  142. package/onecode/agent/tools/__pycache__/git_tools.cpython-314.pyc +0 -0
  143. package/onecode/agent/tools/__pycache__/lsp_tools.cpython-314.pyc +0 -0
  144. package/onecode/agent/tools/__pycache__/mcp_tools.cpython-314.pyc +0 -0
  145. package/onecode/agent/tools/__pycache__/permission_handler.cpython-314.pyc +0 -0
  146. package/onecode/agent/tools/__pycache__/permissions.cpython-314.pyc +0 -0
  147. package/onecode/agent/tools/__pycache__/protocol.cpython-314.pyc +0 -0
  148. package/onecode/agent/tools/__pycache__/registry.cpython-314.pyc +0 -0
  149. package/onecode/agent/tools/__pycache__/sandbox.cpython-314.pyc +0 -0
  150. package/onecode/agent/tools/__pycache__/schema_validation.cpython-314.pyc +0 -0
  151. package/onecode/agent/tools/__pycache__/skill_tools.cpython-314.pyc +0 -0
  152. package/onecode/agent/tools/__pycache__/todo_tools.cpython-314.pyc +0 -0
  153. package/onecode/agent/tools/__pycache__/web_tools.cpython-314.pyc +0 -0
  154. package/onecode/agent/tools/agent_tools.py +0 -132
  155. package/onecode/agent/tools/apply_patch_tool.py +0 -138
  156. package/onecode/agent/tools/bash_tool.py +0 -111
  157. package/onecode/agent/tools/communication_tools.py +0 -148
  158. package/onecode/agent/tools/config_tool.py +0 -130
  159. package/onecode/agent/tools/cron_tools.py +0 -178
  160. package/onecode/agent/tools/errors.py +0 -17
  161. package/onecode/agent/tools/file_ops.py +0 -221
  162. package/onecode/agent/tools/file_tools.py +0 -225
  163. package/onecode/agent/tools/git_tools.py +0 -88
  164. package/onecode/agent/tools/lsp_tools.py +0 -404
  165. package/onecode/agent/tools/mcp_tools.py +0 -127
  166. package/onecode/agent/tools/permission_handler.py +0 -46
  167. package/onecode/agent/tools/permissions.py +0 -77
  168. package/onecode/agent/tools/protocol.py +0 -20
  169. package/onecode/agent/tools/registry.py +0 -201
  170. package/onecode/agent/tools/sandbox.py +0 -358
  171. package/onecode/agent/tools/schema_validation.py +0 -100
  172. package/onecode/agent/tools/skill_tools.py +0 -52
  173. package/onecode/agent/tools/todo_tools.py +0 -207
  174. package/onecode/agent/tools/web_tools.py +0 -169
  175. package/onecode/builtin_skills/agent-browser/SKILL.md +0 -212
  176. package/onecode/builtin_skills/agent-browser/skill.yaml +0 -8
  177. package/onecode/builtin_skills/git/SKILL.md +0 -64
  178. package/onecode/builtin_skills/git/skill.yaml +0 -7
  179. package/onecode/builtin_skills/shell/SKILL.md +0 -58
  180. package/onecode/builtin_skills/shell/skill.yaml +0 -8
  181. package/onecode/builtin_skills/skill-creator/SKILL.md +0 -106
  182. package/onecode/builtin_skills/skill-creator/skill.yaml +0 -8
  183. package/onecode/cli.py +0 -935
  184. package/onecode/cloud/__init__.py +0 -0
  185. package/onecode/cloud/base.py +0 -20
  186. package/onecode/codebase/__init__.py +0 -69
  187. package/onecode/codebase/__pycache__/__init__.cpython-314.pyc +0 -0
  188. package/onecode/codebase/__pycache__/chunker.cpython-314.pyc +0 -0
  189. package/onecode/codebase/__pycache__/indexer.cpython-314.pyc +0 -0
  190. package/onecode/codebase/__pycache__/retriever.cpython-314.pyc +0 -0
  191. package/onecode/codebase/__pycache__/storage.cpython-314.pyc +0 -0
  192. package/onecode/codebase/__pycache__/tools.cpython-314.pyc +0 -0
  193. package/onecode/codebase/chunker.py +0 -125
  194. package/onecode/codebase/indexer.py +0 -149
  195. package/onecode/codebase/retriever.py +0 -203
  196. package/onecode/codebase/storage.py +0 -131
  197. package/onecode/codebase/tools.py +0 -59
  198. package/onecode/commands.py +0 -596
  199. package/onecode/config.py +0 -314
  200. package/onecode/config_screen.py +0 -600
  201. package/onecode/cron/__init__.py +0 -3
  202. package/onecode/lsp/__init__.py +0 -3
  203. package/onecode/mcp/__init__.py +0 -4
  204. package/onecode/mcp/__pycache__/__init__.cpython-314.pyc +0 -0
  205. package/onecode/mcp/__pycache__/client.cpython-314.pyc +0 -0
  206. package/onecode/mcp/__pycache__/manager.cpython-314.pyc +0 -0
  207. package/onecode/mcp/client.py +0 -193
  208. package/onecode/mcp/manager.py +0 -190
  209. package/onecode/memory/__init__.py +0 -49
  210. package/onecode/memory/__pycache__/__init__.cpython-314.pyc +0 -0
  211. package/onecode/memory/__pycache__/backend.cpython-314.pyc +0 -0
  212. package/onecode/memory/__pycache__/offload.cpython-314.pyc +0 -0
  213. package/onecode/memory/__pycache__/pyramid.cpython-314.pyc +0 -0
  214. package/onecode/memory/__pycache__/recall.cpython-314.pyc +0 -0
  215. package/onecode/memory/__pycache__/symbolic.cpython-314.pyc +0 -0
  216. package/onecode/memory/backend.py +0 -159
  217. package/onecode/memory/pyramid.py +0 -133
  218. package/onecode/memory/recall.py +0 -203
  219. package/onecode/migrate.py +0 -122
  220. package/onecode/models/__init__.py +0 -4
  221. package/onecode/models/__pycache__/__init__.cpython-314.pyc +0 -0
  222. package/onecode/models/__pycache__/errors.cpython-314.pyc +0 -0
  223. package/onecode/models/__pycache__/messages.cpython-314.pyc +0 -0
  224. package/onecode/models/__pycache__/provider.cpython-314.pyc +0 -0
  225. package/onecode/models/__pycache__/registry.cpython-314.pyc +0 -0
  226. package/onecode/models/errors.py +0 -104
  227. package/onecode/models/messages.py +0 -739
  228. package/onecode/models/provider.py +0 -699
  229. package/onecode/models/providers/__init__.py +0 -17
  230. package/onecode/models/providers/__pycache__/__init__.cpython-314.pyc +0 -0
  231. package/onecode/models/providers/__pycache__/anthropic_provider.cpython-314.pyc +0 -0
  232. package/onecode/models/providers/__pycache__/deepseek_provider.cpython-314.pyc +0 -0
  233. package/onecode/models/providers/__pycache__/glm_provider.cpython-314.pyc +0 -0
  234. package/onecode/models/providers/__pycache__/minimax_provider.cpython-314.pyc +0 -0
  235. package/onecode/models/providers/__pycache__/minimaxi_provider.cpython-314.pyc +0 -0
  236. package/onecode/models/providers/__pycache__/ollama_provider.cpython-314.pyc +0 -0
  237. package/onecode/models/providers/__pycache__/openai_provider.cpython-314.pyc +0 -0
  238. package/onecode/models/providers/anthropic_provider.py +0 -273
  239. package/onecode/models/providers/deepseek_provider.py +0 -212
  240. package/onecode/models/providers/glm_provider.py +0 -195
  241. package/onecode/models/providers/minimax_provider.py +0 -158
  242. package/onecode/models/providers/minimaxi_provider.py +0 -417
  243. package/onecode/models/providers/ollama_provider.py +0 -100
  244. package/onecode/models/providers/openai_provider.py +0 -237
  245. package/onecode/models/registry.py +0 -212
  246. package/onecode/server/__init__.py +0 -3
  247. package/onecode/server/app.py +0 -224
  248. package/onecode/skills/__init__.py +0 -11
  249. package/onecode/skills/__pycache__/__init__.cpython-314.pyc +0 -0
  250. package/onecode/skills/__pycache__/argument_substitution.cpython-314.pyc +0 -0
  251. package/onecode/skills/__pycache__/bootstrap.cpython-314.pyc +0 -0
  252. package/onecode/skills/__pycache__/create.cpython-314.pyc +0 -0
  253. package/onecode/skills/__pycache__/frontmatter.cpython-314.pyc +0 -0
  254. package/onecode/skills/__pycache__/loader.cpython-314.pyc +0 -0
  255. package/onecode/skills/__pycache__/manager.cpython-314.pyc +0 -0
  256. package/onecode/skills/__pycache__/model.cpython-314.pyc +0 -0
  257. package/onecode/skills/argument_substitution.py +0 -38
  258. package/onecode/skills/bootstrap.py +0 -124
  259. package/onecode/skills/create.py +0 -56
  260. package/onecode/skills/frontmatter.py +0 -33
  261. package/onecode/skills/loader.py +0 -139
  262. package/onecode/skills/manager.py +0 -75
  263. package/onecode/skills/model.py +0 -43
  264. package/onecode/storage/__init__.py +0 -0
  265. package/onecode/storage/activity.py +0 -63
  266. package/onecode/storage/project.py +0 -54
  267. package/onecode/storage/session.py +0 -112
  268. package/onecode/tasks/__init__.py +0 -26
  269. package/onecode/tasks/manager.py +0 -232
  270. package/onecode/tasks/models.py +0 -240
  271. package/onecode/trace/__init__.py +0 -0
  272. package/onecode/trace/tracer.py +0 -173
  273. package/onecode/utils/__init__.py +0 -0
  274. package/onecode/utils/helpers.py +0 -20
  275. package/pyproject.toml +0 -74
  276. package/tui/__init__.py +0 -46
  277. package/tui/__main__.py +0 -4
  278. package/tui/__pycache__/__init__.cpython-314.pyc +0 -0
  279. package/tui/__pycache__/_loop.cpython-314.pyc +0 -0
  280. package/tui/__pycache__/_path_fuzzy_search.cpython-314.pyc +0 -0
  281. package/tui/__pycache__/_path_match.cpython-314.pyc +0 -0
  282. package/tui/__pycache__/about.cpython-314.pyc +0 -0
  283. package/tui/__pycache__/agent.cpython-314.pyc +0 -0
  284. package/tui/__pycache__/agent_schema.cpython-314.pyc +0 -0
  285. package/tui/__pycache__/agents.cpython-314.pyc +0 -0
  286. package/tui/__pycache__/answer.cpython-314.pyc +0 -0
  287. package/tui/__pycache__/app.cpython-313.pyc +0 -0
  288. package/tui/__pycache__/app.cpython-314.pyc +0 -0
  289. package/tui/__pycache__/atomic.cpython-314.pyc +0 -0
  290. package/tui/__pycache__/complete.cpython-314.pyc +0 -0
  291. package/tui/__pycache__/constants.cpython-314.pyc +0 -0
  292. package/tui/__pycache__/conversation_markdown.cpython-314.pyc +0 -0
  293. package/tui/__pycache__/danger.cpython-314.pyc +0 -0
  294. package/tui/__pycache__/db.cpython-314.pyc +0 -0
  295. package/tui/__pycache__/dec.cpython-314.pyc +0 -0
  296. package/tui/__pycache__/directory.cpython-314.pyc +0 -0
  297. package/tui/__pycache__/directory_suggester.cpython-314.pyc +0 -0
  298. package/tui/__pycache__/directory_watcher.cpython-314.pyc +0 -0
  299. package/tui/__pycache__/format_path.cpython-314.pyc +0 -0
  300. package/tui/__pycache__/fuzzy.cpython-314.pyc +0 -0
  301. package/tui/__pycache__/fuzzy_index.cpython-314.pyc +0 -0
  302. package/tui/__pycache__/history.cpython-314.pyc +0 -0
  303. package/tui/__pycache__/jsonrpc.cpython-314.pyc +0 -0
  304. package/tui/__pycache__/menus.cpython-314.pyc +0 -0
  305. package/tui/__pycache__/message_log.cpython-314.pyc +0 -0
  306. package/tui/__pycache__/messages.cpython-314.pyc +0 -0
  307. package/tui/__pycache__/path_complete.cpython-314.pyc +0 -0
  308. package/tui/__pycache__/path_filter.cpython-314.pyc +0 -0
  309. package/tui/__pycache__/paths.cpython-314.pyc +0 -0
  310. package/tui/__pycache__/pill.cpython-314.pyc +0 -0
  311. package/tui/__pycache__/platform_commands.cpython-314.pyc +0 -0
  312. package/tui/__pycache__/protocol.cpython-314.pyc +0 -0
  313. package/tui/__pycache__/session_tracker.cpython-314.pyc +0 -0
  314. package/tui/__pycache__/settings.cpython-314.pyc +0 -0
  315. package/tui/__pycache__/settings_schema.cpython-314.pyc +0 -0
  316. package/tui/__pycache__/shell.cpython-314.pyc +0 -0
  317. package/tui/__pycache__/shell_read.cpython-314.pyc +0 -0
  318. package/tui/__pycache__/slash_command.cpython-314.pyc +0 -0
  319. package/tui/__pycache__/version.cpython-314.pyc +0 -0
  320. package/tui/_loop.py +0 -86
  321. package/tui/_path_fuzzy_search.py +0 -48
  322. package/tui/_path_match.py +0 -141
  323. package/tui/about.py +0 -95
  324. package/tui/acp/__pycache__/agent.cpython-314.pyc +0 -0
  325. package/tui/acp/__pycache__/api.cpython-314.pyc +0 -0
  326. package/tui/acp/__pycache__/encode_tool_call_id.cpython-314.pyc +0 -0
  327. package/tui/acp/__pycache__/messages.cpython-314.pyc +0 -0
  328. package/tui/acp/__pycache__/prompt.cpython-314.pyc +0 -0
  329. package/tui/acp/__pycache__/protocol.cpython-314.pyc +0 -0
  330. package/tui/acp/agent.py +0 -1002
  331. package/tui/acp/api.py +0 -73
  332. package/tui/acp/encode_tool_call_id.py +0 -12
  333. package/tui/acp/messages.py +0 -203
  334. package/tui/acp/prompt.py +0 -53
  335. package/tui/acp/protocol.py +0 -499
  336. package/tui/agent.py +0 -70
  337. package/tui/agent_schema.py +0 -76
  338. package/tui/agents.py +0 -46
  339. package/tui/ansi/__init__.py +0 -1
  340. package/tui/ansi/__pycache__/__init__.cpython-314.pyc +0 -0
  341. package/tui/ansi/__pycache__/_ansi.cpython-314.pyc +0 -0
  342. package/tui/ansi/__pycache__/_ansi_colors.cpython-314.pyc +0 -0
  343. package/tui/ansi/__pycache__/_control_codes.cpython-314.pyc +0 -0
  344. package/tui/ansi/__pycache__/_keys.cpython-314.pyc +0 -0
  345. package/tui/ansi/__pycache__/_sgr_styles.cpython-314.pyc +0 -0
  346. package/tui/ansi/__pycache__/_stream_parser.cpython-314.pyc +0 -0
  347. package/tui/ansi/_ansi.py +0 -1689
  348. package/tui/ansi/_ansi_colors.py +0 -264
  349. package/tui/ansi/_control_codes.py +0 -37
  350. package/tui/ansi/_keys.py +0 -251
  351. package/tui/ansi/_sgr_styles.py +0 -64
  352. package/tui/ansi/_stream_parser.py +0 -418
  353. package/tui/answer.py +0 -12
  354. package/tui/app.py +0 -1266
  355. package/tui/atomic.py +0 -37
  356. package/tui/cli.py +0 -313
  357. package/tui/code_analyze.py +0 -27
  358. package/tui/complete.py +0 -38
  359. package/tui/constants.py +0 -61
  360. package/tui/conversation_markdown.py +0 -30
  361. package/tui/danger.py +0 -372
  362. package/tui/data/agents/ampcode.com.toml +0 -52
  363. package/tui/data/agents/augmentcode.com.toml +0 -41
  364. package/tui/data/agents/cdh.cloud-dev-harness.toml +0 -23
  365. package/tui/data/agents/claude.com.toml +0 -41
  366. package/tui/data/agents/copilot.github.com.toml +0 -29
  367. package/tui/data/agents/crowai.dev.toml +0 -36
  368. package/tui/data/agents/cursor.com.toml +0 -38
  369. package/tui/data/agents/deepagents.langchain.com +0 -34
  370. package/tui/data/agents/docker.com.toml +0 -60
  371. package/tui/data/agents/geminicli.com.toml +0 -28
  372. package/tui/data/agents/goose.ai.toml +0 -52
  373. package/tui/data/agents/inference.huggingface.co.toml +0 -41
  374. package/tui/data/agents/kimi.com.toml +0 -35
  375. package/tui/data/agents/kiro.dev.toml +0 -43
  376. package/tui/data/agents/onecode.dev.toml +0 -22
  377. package/tui/data/agents/openai.com.toml +0 -53
  378. package/tui/data/agents/openclaw.ai.toml +0 -37
  379. package/tui/data/agents/opencode.ai.toml +0 -39
  380. package/tui/data/agents/openhands.dev.toml +0 -46
  381. package/tui/data/agents/stakpak.dev.toml +0 -62
  382. package/tui/data/agents/vibe.mistral.ai.toml +0 -31
  383. package/tui/data/agents/vtcode.dev.toml +0 -63
  384. package/tui/data/images/frog.png +0 -0
  385. package/tui/data/sounds/question.wav +0 -0
  386. package/tui/data/sounds/turn-over.wav +0 -0
  387. package/tui/db.py +0 -213
  388. package/tui/dec.py +0 -332
  389. package/tui/directory.py +0 -234
  390. package/tui/directory_suggester.py +0 -93
  391. package/tui/directory_watcher.py +0 -231
  392. package/tui/format_path.py +0 -25
  393. package/tui/fuzzy.py +0 -140
  394. package/tui/fuzzy_index.py +0 -275
  395. package/tui/gist.py +0 -33
  396. package/tui/history.py +0 -138
  397. package/tui/jsonrpc.py +0 -578
  398. package/tui/menus.py +0 -14
  399. package/tui/message_log.py +0 -69
  400. package/tui/messages.py +0 -144
  401. package/tui/option_content.py +0 -51
  402. package/tui/os.py +0 -0
  403. package/tui/path_complete.py +0 -217
  404. package/tui/path_filter.py +0 -124
  405. package/tui/paths.py +0 -87
  406. package/tui/pill.py +0 -23
  407. package/tui/platform_commands.py +0 -52
  408. package/tui/prompt/__pycache__/extract.cpython-314.pyc +0 -0
  409. package/tui/prompt/__pycache__/resource.cpython-314.pyc +0 -0
  410. package/tui/prompt/extract.py +0 -19
  411. package/tui/prompt/resource.py +0 -68
  412. package/tui/protocol.py +0 -28
  413. package/tui/screens/__init__.py +0 -0
  414. package/tui/screens/__pycache__/__init__.cpython-314.pyc +0 -0
  415. package/tui/screens/__pycache__/agent_modal.cpython-314.pyc +0 -0
  416. package/tui/screens/__pycache__/component_picker.cpython-314.pyc +0 -0
  417. package/tui/screens/__pycache__/diff_screen.cpython-314.pyc +0 -0
  418. package/tui/screens/__pycache__/log.cpython-314.pyc +0 -0
  419. package/tui/screens/__pycache__/main.cpython-313.pyc +0 -0
  420. package/tui/screens/__pycache__/main.cpython-314.pyc +0 -0
  421. package/tui/screens/__pycache__/permissions.cpython-314.pyc +0 -0
  422. package/tui/screens/__pycache__/projects_app.cpython-314.pyc +0 -0
  423. package/tui/screens/__pycache__/projects_screen.cpython-314.pyc +0 -0
  424. package/tui/screens/__pycache__/sessions.cpython-314.pyc +0 -0
  425. package/tui/screens/__pycache__/store.cpython-314.pyc +0 -0
  426. package/tui/screens/__pycache__/tool_content_screen.cpython-314.pyc +0 -0
  427. package/tui/screens/action_modal.py +0 -94
  428. package/tui/screens/agent_modal.py +0 -175
  429. package/tui/screens/command_edit_modal.py +0 -74
  430. package/tui/screens/component_picker.py +0 -168
  431. package/tui/screens/diff_screen.py +0 -84
  432. package/tui/screens/log.py +0 -553
  433. package/tui/screens/main.py +0 -385
  434. package/tui/screens/main.tcss +0 -655
  435. package/tui/screens/permissions.py +0 -404
  436. package/tui/screens/permissions.tcss +0 -72
  437. package/tui/screens/projects.tcss +0 -80
  438. package/tui/screens/projects_app.py +0 -347
  439. package/tui/screens/projects_screen.py +0 -284
  440. package/tui/screens/session_resume_modal.py +0 -172
  441. package/tui/screens/session_resume_modal.tcss +0 -35
  442. package/tui/screens/sessions.py +0 -164
  443. package/tui/screens/sessions.tcss +0 -119
  444. package/tui/screens/settings.py +0 -254
  445. package/tui/screens/settings.tcss +0 -101
  446. package/tui/screens/store.py +0 -500
  447. package/tui/screens/store.tcss +0 -274
  448. package/tui/screens/tool_content_screen.py +0 -59
  449. package/tui/session_tracker.py +0 -123
  450. package/tui/settings.py +0 -353
  451. package/tui/settings_schema.py +0 -431
  452. package/tui/shell.py +0 -304
  453. package/tui/shell_read.py +0 -42
  454. package/tui/slash_command.py +0 -34
  455. package/tui/tui.tcss +0 -246
  456. package/tui/twitter.py +0 -38
  457. package/tui/version.py +0 -80
  458. package/tui/visuals/__init__.py +0 -0
  459. package/tui/visuals/__pycache__/__init__.cpython-314.pyc +0 -0
  460. package/tui/visuals/__pycache__/columns.cpython-314.pyc +0 -0
  461. package/tui/visuals/columns.py +0 -272
  462. package/tui/widgets/__init__.py +0 -0
  463. package/tui/widgets/__pycache__/__init__.cpython-314.pyc +0 -0
  464. package/tui/widgets/__pycache__/acp_content.cpython-314.pyc +0 -0
  465. package/tui/widgets/__pycache__/agent_response.cpython-314.pyc +0 -0
  466. package/tui/widgets/__pycache__/agent_thought.cpython-314.pyc +0 -0
  467. package/tui/widgets/__pycache__/ask_user.cpython-314.pyc +0 -0
  468. package/tui/widgets/__pycache__/condensed_path.cpython-314.pyc +0 -0
  469. package/tui/widgets/__pycache__/context_stats.cpython-314.pyc +0 -0
  470. package/tui/widgets/__pycache__/conversation.cpython-314.pyc +0 -0
  471. package/tui/widgets/__pycache__/diff_view.cpython-314.pyc +0 -0
  472. package/tui/widgets/__pycache__/directory_input.cpython-314.pyc +0 -0
  473. package/tui/widgets/__pycache__/flash.cpython-314.pyc +0 -0
  474. package/tui/widgets/__pycache__/future_text.cpython-314.pyc +0 -0
  475. package/tui/widgets/__pycache__/grid_select.cpython-314.pyc +0 -0
  476. package/tui/widgets/__pycache__/highlighted_textarea.cpython-314.pyc +0 -0
  477. package/tui/widgets/__pycache__/load_more.cpython-314.pyc +0 -0
  478. package/tui/widgets/__pycache__/mandelbrot.cpython-314.pyc +0 -0
  479. package/tui/widgets/__pycache__/markdown_note.cpython-314.pyc +0 -0
  480. package/tui/widgets/__pycache__/menu.cpython-314.pyc +0 -0
  481. package/tui/widgets/__pycache__/modified_files.cpython-314.pyc +0 -0
  482. package/tui/widgets/__pycache__/non_selectable_label.cpython-314.pyc +0 -0
  483. package/tui/widgets/__pycache__/note.cpython-314.pyc +0 -0
  484. package/tui/widgets/__pycache__/path_search.cpython-314.pyc +0 -0
  485. package/tui/widgets/__pycache__/plan.cpython-314.pyc +0 -0
  486. package/tui/widgets/__pycache__/project_directory_tree.cpython-314.pyc +0 -0
  487. package/tui/widgets/__pycache__/project_grid_select.cpython-314.pyc +0 -0
  488. package/tui/widgets/__pycache__/project_summary.cpython-314.pyc +0 -0
  489. package/tui/widgets/__pycache__/prompt.cpython-314.pyc +0 -0
  490. package/tui/widgets/__pycache__/question.cpython-314.pyc +0 -0
  491. package/tui/widgets/__pycache__/session_grid_select.cpython-314.pyc +0 -0
  492. package/tui/widgets/__pycache__/session_summary.cpython-314.pyc +0 -0
  493. package/tui/widgets/__pycache__/session_tabs.cpython-314.pyc +0 -0
  494. package/tui/widgets/__pycache__/shell_result.cpython-314.pyc +0 -0
  495. package/tui/widgets/__pycache__/shell_terminal.cpython-314.pyc +0 -0
  496. package/tui/widgets/__pycache__/side_bar.cpython-314.pyc +0 -0
  497. package/tui/widgets/__pycache__/slash_complete.cpython-314.pyc +0 -0
  498. package/tui/widgets/__pycache__/strike_text.cpython-314.pyc +0 -0
  499. package/tui/widgets/__pycache__/subagent.cpython-314.pyc +0 -0
  500. package/tui/widgets/__pycache__/subagent_screen.cpython-314.pyc +0 -0
  501. package/tui/widgets/__pycache__/terminal.cpython-314.pyc +0 -0
  502. package/tui/widgets/__pycache__/throbber.cpython-314.pyc +0 -0
  503. package/tui/widgets/__pycache__/tool_call.cpython-314.pyc +0 -0
  504. package/tui/widgets/__pycache__/user_input.cpython-314.pyc +0 -0
  505. package/tui/widgets/acp_content.py +0 -70
  506. package/tui/widgets/agent_response.py +0 -76
  507. package/tui/widgets/agent_thought.py +0 -167
  508. package/tui/widgets/ask_user.py +0 -264
  509. package/tui/widgets/command_pane.py +0 -223
  510. package/tui/widgets/condensed_path.py +0 -115
  511. package/tui/widgets/context_stats.py +0 -66
  512. package/tui/widgets/conversation.py +0 -2641
  513. package/tui/widgets/danger_warning.py +0 -65
  514. package/tui/widgets/diff_view.py +0 -69
  515. package/tui/widgets/directory_input.py +0 -8
  516. package/tui/widgets/flash.py +0 -81
  517. package/tui/widgets/future_text.py +0 -126
  518. package/tui/widgets/grid_select.py +0 -234
  519. package/tui/widgets/highlighted_textarea.py +0 -180
  520. package/tui/widgets/load_more.py +0 -24
  521. package/tui/widgets/mandelbrot.py +0 -294
  522. package/tui/widgets/markdown_note.py +0 -13
  523. package/tui/widgets/menu.py +0 -147
  524. package/tui/widgets/modified_files.py +0 -306
  525. package/tui/widgets/non_selectable_label.py +0 -5
  526. package/tui/widgets/note.py +0 -18
  527. package/tui/widgets/path_search.py +0 -492
  528. package/tui/widgets/plan.py +0 -285
  529. package/tui/widgets/project_directory_tree.py +0 -102
  530. package/tui/widgets/project_grid_select.py +0 -64
  531. package/tui/widgets/project_summary.py +0 -33
  532. package/tui/widgets/prompt.py +0 -795
  533. package/tui/widgets/question.py +0 -360
  534. package/tui/widgets/session_grid_select.py +0 -230
  535. package/tui/widgets/session_summary.py +0 -115
  536. package/tui/widgets/session_tabs.py +0 -188
  537. package/tui/widgets/shell_result.py +0 -35
  538. package/tui/widgets/shell_terminal.py +0 -40
  539. package/tui/widgets/side_bar.py +0 -124
  540. package/tui/widgets/slash_complete.py +0 -235
  541. package/tui/widgets/strike_text.py +0 -70
  542. package/tui/widgets/subagent.py +0 -287
  543. package/tui/widgets/subagent_screen.py +0 -709
  544. package/tui/widgets/terminal.py +0 -576
  545. package/tui/widgets/terminal_tool.py +0 -360
  546. package/tui/widgets/throbber.py +0 -100
  547. package/tui/widgets/tool_call.py +0 -398
  548. package/tui/widgets/user_input.py +0 -23
  549. package/tui/widgets/version.py +0 -5
  550. package/tui/widgets/welcome.py +0 -31
package/onecode/cli.py DELETED
@@ -1,935 +0,0 @@
1
- import click
2
- import logging
3
- from logging.handlers import TimedRotatingFileHandler
4
- from pathlib import Path
5
-
6
- from onecode.config import load_config, save_config
7
-
8
- LOG_DIR = Path.home() / ".onecode" / "logs"
9
- LOG_FILE = LOG_DIR / "onecode.log"
10
- LOG_BACKUP_COUNT = 7 # keep 7 days of history
11
-
12
- _VALID_LOG_LEVELS = {"DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"}
13
-
14
-
15
- def setup_logging(log_level: str = "INFO") -> logging.Logger:
16
- """Configure root logging to write to a daily-rotated ``cdh.log`` file.
17
-
18
- The active log is always ``~/.cdh/logs/cdh.log``; at midnight it is
19
- rolled to ``cdh.log.YYYY-MM-DD`` and a fresh file is started. Up to
20
- :data:`LOG_BACKUP_COUNT` days of history are retained.
21
-
22
- Returns the root logger so callers can attach additional handlers (e.g.
23
- a console handler) without re-running ``basicConfig``.
24
- """
25
- LOG_DIR.mkdir(parents=True, exist_ok=True)
26
- level = log_level.upper()
27
- if level not in _VALID_LOG_LEVELS:
28
- level = "INFO"
29
- numeric_level = getattr(logging, level)
30
-
31
- handler = TimedRotatingFileHandler(
32
- LOG_FILE,
33
- when="midnight",
34
- interval=1,
35
- backupCount=LOG_BACKUP_COUNT,
36
- encoding="utf-8",
37
- utc=False,
38
- )
39
- handler.suffix = "%Y-%m-%d"
40
- handler.setFormatter(
41
- logging.Formatter("%(asctime)s [%(name)s] %(levelname)s: %(message)s")
42
- )
43
-
44
- root = logging.getLogger()
45
- root.setLevel(numeric_level)
46
- # Avoid stacking handlers if setup_logging() is called twice (e.g. by
47
- # tests importing both the CLI and a sub-process entry point).
48
- for h in list(root.handlers):
49
- if isinstance(h, TimedRotatingFileHandler) and getattr(h, "baseFilename", "") == str(LOG_FILE):
50
- root.removeHandler(h)
51
- root.addHandler(handler)
52
-
53
- # Silence chatty third-party loggers; keep the rest at the requested level.
54
- logging.getLogger("httpx").setLevel(logging.WARNING)
55
- logging.getLogger("httpcore").setLevel(logging.WARNING)
56
- # Engine / provider / adapter loggers — leave at the requested level
57
- # (do NOT cap the entire ``onecode`` namespace at WARNING any more, that
58
- # was the bug which kept ``cdh.log`` empty).
59
- return root
60
-
61
-
62
- @click.group()
63
- @click.option(
64
- "--log-level",
65
- type=click.Choice(sorted(_VALID_LOG_LEVELS), case_sensitive=False),
66
- default="INFO",
67
- show_default=True,
68
- envvar="CDH_LOG_LEVEL",
69
- help="Root logger verbosity. Defaults to INFO; daily-rotated to ~/.cdh/logs/cdh.log.",
70
- )
71
- def cli(log_level: str):
72
- """CDH Agent CLI - Cloud Dev Harness Agent commands."""
73
- setup_logging(log_level)
74
-
75
-
76
- @cli.group(invoke_without_command=True)
77
- def config():
78
- """Manage CDH configuration (mode, model, provider, cloud, skill, mcp)."""
79
- pass
80
-
81
-
82
- # --- config mode sub-command ---
83
-
84
- @config.group("mode")
85
- def config_mode():
86
- """Manage default agent mode (build, plan, solo)."""
87
- pass
88
-
89
-
90
- @config_mode.command("get")
91
- def config_mode_get():
92
- """Show current mode."""
93
- cfg = load_config()
94
- click.echo(f"mode = {cfg.default_mode} (build | plan | solo)")
95
-
96
-
97
- @config_mode.command("set")
98
- @click.argument("value", default="build")
99
- def config_mode_set(value):
100
- """Set default agent mode."""
101
- cfg = load_config()
102
- cfg.default_mode = value
103
- save_config(cfg)
104
- click.echo(f"mode = {value}")
105
-
106
-
107
- # --- config model sub-command ---
108
-
109
- @config.group("model")
110
- def config_model():
111
- """Manage default LLM model."""
112
- pass
113
-
114
-
115
- @config_model.command("get")
116
- def config_model_get():
117
- """Show current model."""
118
- cfg = load_config()
119
- click.echo(f"model = {cfg.default_model}")
120
-
121
-
122
- @config_model.command("set")
123
- @click.argument("value")
124
- def config_model_set(value):
125
- """Set default LLM model."""
126
- cfg = load_config()
127
- cfg.default_model = value
128
- save_config(cfg)
129
- click.echo(f"model = {value}")
130
-
131
-
132
- # --- config provider sub-command ---
133
-
134
- @config.group("provider")
135
- def config_provider():
136
- """Manage default LLM provider."""
137
- pass
138
-
139
-
140
- @config_provider.command("get")
141
- def config_provider_get():
142
- """Show current provider."""
143
- cfg = load_config()
144
- click.echo(f"provider = {cfg.default_provider}")
145
-
146
-
147
- @config_provider.command("set")
148
- @click.argument("value")
149
- def config_provider_set(value):
150
- """Set default LLM provider."""
151
- cfg = load_config()
152
- cfg.default_provider = value
153
- save_config(cfg)
154
- click.echo(f"provider = {value}")
155
-
156
-
157
- # --- config log-level sub-command ---
158
-
159
- @config.group("log-level")
160
- def config_log_level():
161
- """Manage log level."""
162
- pass
163
-
164
-
165
- @config_log_level.command("get")
166
- def config_log_level_get():
167
- """Show current log level."""
168
- cfg = load_config()
169
- click.echo(f"log-level = {cfg.log_level} (debug | info | warn | error)")
170
-
171
-
172
- @config_log_level.command("set")
173
- @click.argument("value", default="info")
174
- def config_log_level_set(value):
175
- """Set log level."""
176
- cfg = load_config()
177
- cfg.log_level = value
178
- save_config(cfg)
179
- click.echo(f"log-level = {value}")
180
-
181
-
182
- # --- config list ---
183
-
184
- @config.command("list")
185
- def config_list():
186
- """Show full YAML configuration."""
187
- cfg = load_config()
188
- import yaml
189
- from onecode.config import _dataclass_to_dict
190
- click.echo(yaml.dump(_dataclass_to_dict(cfg), default_flow_style=False))
191
-
192
-
193
- @cli.group(invoke_without_command=True)
194
- def skill():
195
- """Manage CDH skills (list, add, remove).
196
-
197
- \b
198
- Skills are instruction sets that extend the agent's capabilities.
199
- Use `cdh skill list` to see available skills.
200
- """
201
- pass
202
-
203
-
204
- @skill.command("list")
205
- def skill_list():
206
- """List all skills."""
207
- from onecode.skills.loader import SkillLoader
208
-
209
- loader = SkillLoader()
210
- skills = loader.get_all()
211
-
212
- if not skills:
213
- click.echo("No skills found.")
214
- return
215
-
216
- click.echo("Skills:")
217
- for s in skills.values():
218
- status = "[enabled]" if s.enabled else "[disabled]"
219
- click.echo(f" {status} {s.name}")
220
- if s.description:
221
- click.echo(f" {s.description}")
222
- click.echo(f"\nTotal: {len(skills)} skill(s)")
223
-
224
-
225
- @skill.command("add")
226
- @click.argument("path", type=click.Path(exists=True, file_okay=True, dir_okay=True, path_type=Path))
227
- def skill_add(path):
228
- """Install a skill from a local path.
229
-
230
- \b
231
- The path should contain a skill.yaml and SKILL.md file.
232
-
233
- \b
234
- Example:
235
- cdh skill add /path/to/my-skill
236
- """
237
- from onecode.skills.manager import SkillManager
238
-
239
- skill_path = Path(path)
240
- if skill_path.is_file():
241
- skill_path = skill_path.parent
242
-
243
- mgr = SkillManager()
244
- err = mgr.install(skill_path)
245
- if err:
246
- click.echo(f"Error: {err}")
247
- else:
248
- click.echo(f"Skill installed from {skill_path}")
249
-
250
-
251
- @skill.command("remove")
252
- @click.argument("name")
253
- def skill_remove(name):
254
- """Remove an installed skill by name."""
255
- from onecode.skills.manager import SkillManager
256
-
257
- mgr = SkillManager()
258
- err = mgr.remove(name)
259
- if err:
260
- click.echo(f"Error: {err}")
261
- else:
262
- click.echo(f"Skill '{name}' removed.")
263
-
264
-
265
- @skill.command("enable")
266
- @click.argument("name")
267
- def skill_enable(name):
268
- """Enable a skill by name."""
269
- _toggle_skill(name, enabled=True)
270
-
271
-
272
- @skill.command("disable")
273
- @click.argument("name")
274
- def skill_disable(name):
275
- """Disable a skill by name."""
276
- _toggle_skill(name, enabled=False)
277
-
278
-
279
- @skill.command("create")
280
- @click.argument("name")
281
- @click.option("--description", "-d", default="", help="Skill description")
282
- def skill_create(name, description):
283
- """Create a new skill scaffold.
284
-
285
- \b
286
- Creates SKILL.md and skill.yaml in ~/.onecode/skills/<name>/.
287
- Edit the generated SKILL.md to add your instructions.
288
-
289
- \b
290
- Example:
291
- cdh skill create my-skill -d "My custom skill"
292
- """
293
- from onecode.skills.create import create_skill_scaffold
294
- from onecode.skills.manager import SkillManager
295
- from onecode.skills.model import Skill as SkillModel
296
-
297
- valid, err = SkillModel.validate_name(name)
298
- if not valid:
299
- click.echo(f"Error: Invalid skill name: {err}")
300
- return
301
- if description:
302
- valid, err = SkillModel.validate_description(description)
303
- if not valid:
304
- click.echo(f"Error: Invalid description: {err}")
305
- return
306
-
307
- mgr = SkillManager()
308
- err = create_skill_scaffold(mgr.skills_dir, name, description or f"A skill for {name}")
309
- if err:
310
- click.echo(f"Error: {err}")
311
- else:
312
- click.echo(f"Skill '{name}' created at {mgr.skills_dir / name}")
313
- click.echo(f" Edit {mgr.skills_dir / name / 'SKILL.md'} to add instructions.")
314
-
315
-
316
- @skill.command("search")
317
- @click.argument("keyword")
318
- def skill_search(keyword):
319
- """Search installed skills by keyword.
320
-
321
- Matches against name, description, triggers, and phases.
322
- Case-insensitive.
323
-
324
- \b
325
- Example:
326
- cdh skill search browser
327
- """
328
- from onecode.skills.loader import SkillLoader
329
-
330
- loader = SkillLoader()
331
- results = loader.search(keyword)
332
-
333
- if not results:
334
- click.echo(f"No skills found matching '{keyword}'.")
335
- return
336
-
337
- click.echo(f"Skills matching '{keyword}':")
338
- for s in results:
339
- status = "[enabled]" if s.enabled else "[disabled]"
340
- click.echo(f" {status} {s.name}")
341
- if s.description:
342
- click.echo(f" {s.description}")
343
- click.echo(f"\nTotal: {len(results)} match(es)")
344
-
345
-
346
- def _toggle_skill(name: str, enabled: bool):
347
- import yaml
348
- from onecode.skills.loader import SkillLoader
349
-
350
- loader = SkillLoader()
351
- skill = loader.get(name)
352
- if not skill or not skill.path:
353
- click.echo(f"Skill '{name}' not found.")
354
- return
355
-
356
- skill_yaml = skill.path / "skill.yaml"
357
- if not skill_yaml.exists():
358
- click.echo(f"No skill.yaml found at {skill.path}")
359
- return
360
-
361
- data = yaml.safe_load(skill_yaml.read_text()) or {}
362
- data["enabled"] = enabled
363
- skill_yaml.write_text(yaml.dump(data, default_flow_style=False))
364
- loader.invalidate_cache()
365
- status = "enabled" if enabled else "disabled"
366
- click.echo(f"Skill '{name}' {status}.")
367
-
368
-
369
- @config.group("skill")
370
- def config_skill():
371
- """Manage CDH skills (alias for cdh skill)."""
372
- pass
373
-
374
-
375
- @config_skill.command("list")
376
- def config_skill_list():
377
- """List all skills."""
378
- from onecode.skills.loader import SkillLoader
379
-
380
- loader = SkillLoader()
381
- skills = loader.get_all()
382
-
383
- if not skills:
384
- click.echo("No skills found.")
385
- return
386
-
387
- click.echo("Skills:")
388
- for s in skills.values():
389
- status = "[enabled]" if s.enabled else "[disabled]"
390
- click.echo(f" {status} {s.name}")
391
- if s.description:
392
- click.echo(f" {s.description}")
393
- click.echo(f"\nTotal: {len(skills)} skill(s)")
394
-
395
-
396
- @config_skill.command("add")
397
- @click.argument("path", type=click.Path(exists=True, file_okay=True, dir_okay=True, path_type=Path))
398
- def config_skill_add(path):
399
- """Install a skill from a local path."""
400
- from onecode.skills.manager import SkillManager
401
-
402
- skill_path = Path(path)
403
- if skill_path.is_file():
404
- skill_path = skill_path.parent
405
-
406
- mgr = SkillManager()
407
- err = mgr.install(skill_path)
408
- if err:
409
- click.echo(f"Error: {err}")
410
- else:
411
- click.echo(f"Skill installed from {skill_path}")
412
-
413
-
414
- @config_skill.command("remove")
415
- @click.argument("name")
416
- def config_skill_remove(name):
417
- """Remove an installed skill by name."""
418
- from onecode.skills.manager import SkillManager
419
-
420
- mgr = SkillManager()
421
- err = mgr.remove(name)
422
- if err:
423
- click.echo(f"Error: {err}")
424
- else:
425
- click.echo(f"Skill '{name}' removed.")
426
-
427
-
428
- @config_skill.command("enable")
429
- @click.argument("name")
430
- def config_skill_enable(name):
431
- """Enable a skill by name."""
432
- _toggle_skill(name, enabled=True)
433
-
434
-
435
- @config_skill.command("disable")
436
- @click.argument("name")
437
- def config_skill_disable(name):
438
- """Disable a skill by name."""
439
- _toggle_skill(name, enabled=False)
440
-
441
-
442
- @config_skill.command("create")
443
- @click.argument("name")
444
- @click.option("--description", "-d", default="", help="Skill description")
445
- def config_skill_create(name, description):
446
- """Create a new skill scaffold (alias for cdh skill create)."""
447
- from onecode.skills.create import create_skill_scaffold
448
- from onecode.skills.manager import SkillManager
449
- from onecode.skills.model import Skill as SkillModel
450
-
451
- valid, err = SkillModel.validate_name(name)
452
- if not valid:
453
- click.echo(f"Error: Invalid skill name: {err}")
454
- return
455
- if description:
456
- valid, err = SkillModel.validate_description(description)
457
- if not valid:
458
- click.echo(f"Error: Invalid description: {err}")
459
- return
460
-
461
- mgr = SkillManager()
462
- err = create_skill_scaffold(mgr.skills_dir, name, description or f"A skill for {name}")
463
- if err:
464
- click.echo(f"Error: {err}")
465
- else:
466
- click.echo(f"Skill '{name}' created at {mgr.skills_dir / name}")
467
- click.echo(f" Edit {mgr.skills_dir / name / 'SKILL.md'} to add instructions.")
468
-
469
-
470
- @config_skill.command("search")
471
- @click.argument("keyword")
472
- def config_skill_search(keyword):
473
- """Search installed skills by keyword (alias for cdh skill search)."""
474
- from onecode.skills.loader import SkillLoader
475
-
476
- loader = SkillLoader()
477
- results = loader.search(keyword)
478
-
479
- if not results:
480
- click.echo(f"No skills found matching '{keyword}'.")
481
- return
482
-
483
- click.echo(f"Skills matching '{keyword}':")
484
- for s in results:
485
- status = "[enabled]" if s.enabled else "[disabled]"
486
- click.echo(f" {status} {s.name}")
487
- if s.description:
488
- click.echo(f" {s.description}")
489
- click.echo(f"\nTotal: {len(results)} match(es)")
490
-
491
-
492
- @cli.group(invoke_without_command=True)
493
- def mcp():
494
- """Manage MCP (Model Context Protocol) servers.
495
-
496
- \b
497
- MCP servers expose tools and resources to the agent.
498
- Use `cdh mcp list` to see configured servers.
499
- """
500
- pass
501
-
502
-
503
- @mcp.command("list")
504
- def mcp_list():
505
- """List all configured MCP servers."""
506
- from onecode.mcp.manager import MCPManager
507
-
508
- mgr = MCPManager()
509
- servers = mgr.list()
510
-
511
- if not servers:
512
- click.echo("No MCP servers configured. Use `cdh mcp add <name> <url>` to add one.")
513
- return
514
-
515
- click.echo("Configured MCP servers:")
516
- for s in servers:
517
- name = s.get("name", "unknown")
518
- transport = s.get("transport", "sse")
519
- enabled = s.get("enabled", True)
520
- status = "[enabled]" if enabled else "[disabled]"
521
- if transport == "sse":
522
- url = s.get("url", "")
523
- click.echo(f" {status} {name} (SSE)")
524
- if url:
525
- click.echo(f" URL: {url}")
526
- else:
527
- cmd = s.get("command", "")
528
- args = " ".join(s.get("args", []))
529
- click.echo(f" {status} {name} (stdio)")
530
- if cmd:
531
- click.echo(f" Command: {cmd} {args}")
532
- click.echo(f"\nTotal: {len(servers)} server(s)")
533
-
534
-
535
- @mcp.command("add")
536
- @click.argument("name")
537
- @click.argument("url")
538
- @click.option("--type", "transport", default="sse", help="Transport type: sse or stdio")
539
- @click.option("--command", help="Command for stdio transport")
540
- @click.option("--args", help="Arguments for stdio transport (comma-separated)")
541
- def mcp_add(name, url, transport, command, args):
542
- """Add an MCP server configuration.
543
-
544
- \b
545
- For SSE transport (default):
546
- cdh mcp add my-server https://example.com/mcp
547
-
548
- \b
549
- For stdio transport:
550
- cdh mcp add my-server --type stdio --command npx --args "server-name"
551
- """
552
- from onecode.mcp.manager import MCPManager
553
-
554
- mgr = MCPManager()
555
- if mgr.get(name):
556
- click.echo(f"Error: MCP server '{name}' already exists")
557
- return
558
-
559
- if transport == "stdio":
560
- if not command:
561
- click.echo("Error: --command required for stdio transport")
562
- return
563
- cmd_args = [a.strip() for a in args.split(",")] if args else []
564
- mgr.add_stdio(name, command, cmd_args)
565
- click.echo(f"MCP server '{name}' added (stdio)")
566
- else:
567
- mgr.add(name, url, transport="sse")
568
- click.echo(f"MCP server '{name}' added (SSE) at {url}")
569
-
570
-
571
- @mcp.command("remove")
572
- @click.argument("name")
573
- def mcp_remove(name):
574
- """Remove an MCP server configuration."""
575
- from onecode.mcp.manager import MCPManager
576
-
577
- mgr = MCPManager()
578
- err = mgr.remove(name)
579
- if err:
580
- click.echo(f"Error: MCP server '{name}' not found")
581
- else:
582
- click.echo(f"MCP server '{name}' removed.")
583
-
584
-
585
- @mcp.command("enable")
586
- @click.argument("name")
587
- def mcp_enable(name):
588
- """Enable an MCP server."""
589
- from onecode.mcp.manager import MCPManager
590
-
591
- mgr = MCPManager()
592
- err = mgr.enable(name, True)
593
- if err:
594
- click.echo(f"Error: {err}")
595
- else:
596
- click.echo(f"MCP server '{name}' enabled.")
597
-
598
-
599
- @mcp.command("disable")
600
- @click.argument("name")
601
- def mcp_disable(name):
602
- """Disable an MCP server."""
603
- from onecode.mcp.manager import MCPManager
604
-
605
- mgr = MCPManager()
606
- err = mgr.enable(name, False)
607
- if err:
608
- click.echo(f"Error: {err}")
609
- else:
610
- click.echo(f"MCP server '{name}' disabled.")
611
-
612
-
613
- @config.group("mcp")
614
- def config_mcp():
615
- """Manage MCP servers (alias for cdh mcp)."""
616
- pass
617
-
618
-
619
- @config_mcp.command("list")
620
- def config_mcp_list():
621
- """List all configured MCP servers."""
622
- from onecode.mcp.manager import MCPManager
623
-
624
- mgr = MCPManager()
625
- servers = mgr.list()
626
-
627
- if not servers:
628
- click.echo("No MCP servers configured. Use `cdh mcp add <name> <url>` to add one.")
629
- return
630
-
631
- click.echo("Configured MCP servers:")
632
- for s in servers:
633
- name = s.get("name", "unknown")
634
- transport = s.get("transport", "sse")
635
- enabled = s.get("enabled", True)
636
- status = "[enabled]" if enabled else "[disabled]"
637
- if transport == "sse":
638
- url = s.get("url", "")
639
- click.echo(f" {status} {name} (SSE)")
640
- if url:
641
- click.echo(f" URL: {url}")
642
- else:
643
- cmd = s.get("command", "")
644
- args = " ".join(s.get("args", []))
645
- click.echo(f" {status} {name} (stdio)")
646
- if cmd:
647
- click.echo(f" Command: {cmd} {args}")
648
- click.echo(f"\nTotal: {len(servers)} server(s)")
649
-
650
-
651
- @config_mcp.command("add")
652
- @click.argument("name")
653
- @click.argument("url")
654
- @click.option("--type", "transport", default="sse", help="Transport type: sse or stdio")
655
- @click.option("--command", help="Command for stdio transport")
656
- @click.option("--args", help="Arguments for stdio transport (comma-separated)")
657
- def config_mcp_add(name, url, transport, command, args):
658
- """Add an MCP server configuration."""
659
- from onecode.mcp.manager import MCPManager
660
-
661
- mgr = MCPManager()
662
- if mgr.get(name):
663
- click.echo(f"Error: MCP server '{name}' already exists")
664
- return
665
-
666
- if transport == "stdio":
667
- if not command:
668
- click.echo("Error: --command required for stdio transport")
669
- return
670
- cmd_args = [a.strip() for a in args.split(",")] if args else []
671
- mgr.add_stdio(name, command, cmd_args)
672
- click.echo(f"MCP server '{name}' added (stdio)")
673
- else:
674
- mgr.add(name, url, transport="sse")
675
- click.echo(f"MCP server '{name}' added (SSE) at {url}")
676
-
677
-
678
- @config_mcp.command("remove")
679
- @click.argument("name")
680
- def config_mcp_remove(name):
681
- """Remove an MCP server configuration."""
682
- from onecode.mcp.manager import MCPManager
683
-
684
- mgr = MCPManager()
685
- err = mgr.remove(name)
686
- if err:
687
- click.echo(f"Error: MCP server '{name}' not found")
688
- else:
689
- click.echo(f"MCP server '{name}' removed.")
690
-
691
-
692
- @config_mcp.command("enable")
693
- @click.argument("name")
694
- def config_mcp_enable(name):
695
- """Enable an MCP server."""
696
- from onecode.mcp.manager import MCPManager
697
-
698
- mgr = MCPManager()
699
- err = mgr.enable(name, True)
700
- if err:
701
- click.echo(f"Error: {err}")
702
- else:
703
- click.echo(f"MCP server '{name}' enabled.")
704
-
705
-
706
- @config_mcp.command("disable")
707
- @click.argument("name")
708
- def config_mcp_disable(name):
709
- """Disable an MCP server."""
710
- from onecode.mcp.manager import MCPManager
711
-
712
- mgr = MCPManager()
713
- err = mgr.enable(name, False)
714
- if err:
715
- click.echo(f"Error: {err}")
716
- else:
717
- click.echo(f"MCP server '{name}' disabled.")
718
-
719
-
720
- @cli.group(invoke_without_command=True)
721
- def codebase():
722
- """Manage codebase index and search.
723
-
724
- \b
725
- The codebase index enables semantic and keyword search over project files.
726
- Use `cdh codebase index` to build or update the index, then the agent
727
- can automatically retrieve relevant code when answering questions.
728
- """
729
- pass
730
-
731
-
732
- @codebase.command("index")
733
- @click.option("--force", is_flag=True, help="Rebuild index from scratch")
734
- @click.option("--path", default=".", help="Project directory", show_default=True)
735
- def codebase_index(force: bool, path: str):
736
- """Index project files for codebase search."""
737
- import asyncio
738
- from onecode.codebase import CodebaseEngine
739
-
740
- project_dir = Path(path).resolve()
741
- if not project_dir.is_dir():
742
- click.echo(f"Error: {path} is not a valid directory")
743
- return
744
-
745
- cfg = load_config()
746
- engine = CodebaseEngine(project_dir, cfg.codebase)
747
- result = asyncio.run(engine.ensure_indexed(force=force))
748
-
749
- click.echo(
750
- f"Indexed {project_dir.name}: "
751
- f"{result.indexed_files} files, "
752
- f"{result.total_chunks} chunks"
753
- f"{' (forced rebuild)' if force else ''}"
754
- )
755
- if result.failed_files:
756
- click.echo(f" Failed: {result.failed_files}")
757
- for err in result.errors[:5]:
758
- click.echo(f" {err}")
759
-
760
-
761
- @codebase.command("status")
762
- @click.option("--path", default=".", help="Project directory", show_default=True)
763
- def codebase_status(path: str):
764
- """Show codebase index status."""
765
- from onecode.codebase import CodebaseStorage
766
-
767
- project_dir = Path(path).resolve()
768
- if not project_dir.is_dir():
769
- click.echo(f"Error: {path} is not a valid directory")
770
- return
771
-
772
- storage = CodebaseStorage(project_dir)
773
- chunk_count = storage.chunk_count()
774
- file_count = storage.file_count()
775
-
776
- click.echo(f"Codebase index for {project_dir.name}:")
777
- click.echo(f" Files: {file_count}")
778
- click.echo(f" Chunks: {chunk_count}")
779
- if chunk_count == 0:
780
- click.echo(" (not indexed yet — run `cdh codebase index`)")
781
-
782
-
783
- @codebase.command("search")
784
- @click.argument("query")
785
- @click.option("--top-k", default=5, help="Number of results", show_default=True)
786
- @click.option("--path", default=".", help="Project directory", show_default=True)
787
- def codebase_search(query: str, top_k: int, path: str):
788
- """Search indexed codebase."""
789
- import asyncio
790
- from onecode.codebase import CodebaseEngine
791
-
792
- project_dir = Path(path).resolve()
793
- if not project_dir.is_dir():
794
- click.echo(f"Error: {path} is not a valid directory")
795
- return
796
-
797
- cfg = load_config()
798
- engine = CodebaseEngine(project_dir, cfg.codebase)
799
- chunks = asyncio.run(engine.retrieve(query, top_k=top_k))
800
-
801
- if not chunks:
802
- click.echo("No results found.")
803
- return
804
-
805
- click.echo(f"Top {len(chunks)} results for: {query}\n")
806
- for i, c in enumerate(chunks, 1):
807
- click.echo(f"[{i}] {c.file_path}:{c.start_line}-{c.end_line}")
808
- click.echo("```")
809
- click.echo(c.content[:300])
810
- if len(c.content) > 300:
811
- click.echo("...")
812
- click.echo("```")
813
- click.echo()
814
-
815
-
816
- @codebase.command("reindex")
817
- @click.option("--path", default=".", help="Project directory", show_default=True)
818
- def codebase_reindex(path: str):
819
- """Force rebuild the codebase index (alias for index --force)."""
820
- import asyncio
821
- from onecode.codebase import CodebaseEngine
822
-
823
- project_dir = Path(path).resolve()
824
- if not project_dir.is_dir():
825
- click.echo(f"Error: {path} is not a valid directory")
826
- return
827
-
828
- cfg = load_config()
829
- engine = CodebaseEngine(project_dir, cfg.codebase)
830
- result = asyncio.run(engine.ensure_indexed(force=True))
831
-
832
- click.echo(
833
- f"Reindexed {project_dir.name}: "
834
- f"{result.indexed_files} files, "
835
- f"{result.total_chunks} chunks"
836
- )
837
-
838
-
839
- @cli.group()
840
- def memory():
841
- """Manage long-term memory.
842
-
843
- \b
844
- Memory stores conversation history with BM25 keyword recall.
845
- Use `cdh memory status` to view memory usage and `cdh memory clear` to reset.
846
- """
847
- pass
848
-
849
-
850
- @memory.command("status")
851
- def memory_status():
852
- """Show memory usage statistics."""
853
- from onecode.memory.backend import MemoryBackend
854
-
855
- backend = MemoryBackend()
856
- counts = backend.count_by_layer()
857
- total = sum(counts.values())
858
- click.echo(f"Total entries: {total}")
859
- for layer, count in counts.items():
860
- click.echo(f" {layer}: {count}")
861
- if total == 0:
862
- click.echo(" (no memories stored yet)")
863
-
864
-
865
- @memory.command("clear")
866
- @click.option("--layer", default=None, help="Layer to clear (default: all layers)")
867
- def memory_clear(layer: str):
868
- """Clear memory entries."""
869
- from onecode.memory import AgentMemory
870
- from onecode.memory.pyramid import MemoryLayer
871
-
872
- am = AgentMemory()
873
- if layer:
874
- layers_to_clear = [l for l in MemoryLayer if l.value == layer]
875
- else:
876
- layers_to_clear = list(MemoryLayer)
877
- removed = 0
878
- for l in layers_to_clear:
879
- entries = am.pyramid.list_by_layer(l)
880
- for e in entries:
881
- am.pyramid._layers[l].remove(e)
882
- am.backend.delete_entry(e.id)
883
- removed += 1
884
- click.echo(f"Cleared {removed} memory entries.")
885
-
886
-
887
- @memory.command("count")
888
- @click.option("--layer", default=None, help="Layer to count (default: all layers)")
889
- def memory_count(layer: str):
890
- """Count memory entries."""
891
- from onecode.memory.backend import MemoryBackend
892
-
893
- backend = MemoryBackend()
894
- counts = backend.count_by_layer()
895
- if layer:
896
- click.echo(f"Entries in {layer}: {counts.get(layer, 0)}")
897
- else:
898
- total = sum(counts.values())
899
- click.echo(f"Total entries: {total}")
900
- for ly, count in sorted(counts.items()):
901
- click.echo(f" {ly}: {count}")
902
-
903
-
904
- @cli.command()
905
- @click.argument("command", required=False)
906
- @click.option("--list", "list_commands", is_flag=True, help="List all available commands")
907
- def help_cmd(command, list_commands):
908
- """Show help for commands."""
909
- if list_commands:
910
- click.echo("Available commands:")
911
- for name, cmd in cli.commands.items():
912
- click.echo(f" {name:15} {cmd.help or ''}")
913
- elif command:
914
- cmd = cli.commands.get(command)
915
- if cmd:
916
- click.echo(cmd.get_help(click.Context(cmd)))
917
- else:
918
- click.echo(f"Unknown command: {command}")
919
- else:
920
- click.echo(cli.get_help(click.Context(cli)))
921
-
922
-
923
- @cli.command()
924
- def version():
925
- """Show version info."""
926
- from onecode import __version__
927
- click.echo(f"onecode {__version__}")
928
-
929
-
930
- def main():
931
- cli()
932
-
933
-
934
- if __name__ == "__main__":
935
- main()