@scemoon/cdh 1.0.6 → 1.0.8

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