@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
@@ -1,38 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import re
4
-
5
-
6
- _PATH_RE = re.compile(r'\$path')
7
- _ARG_RE = re.compile(r'\$(\d+)')
8
- _ARGS_RE = re.compile(r'\$ARGUMENTS')
9
-
10
-
11
- def substitute_arguments(content: str, arguments: list[str] | None = None) -> str:
12
- """Substitute positional arguments in skill content.
13
-
14
- Supports:
15
- $path -> first argument
16
- $0, $1, $2 -> positional arguments
17
- $ARGUMENTS -> all arguments joined by space
18
- """
19
- args = arguments or []
20
- text = content
21
-
22
- # $path -> first argument
23
- if args:
24
- text = _PATH_RE.sub(args[0], text)
25
- else:
26
- text = _PATH_RE.sub("", text)
27
-
28
- # $0, $1, $2...
29
- def _replace_arg(m: re.Match) -> str:
30
- idx = int(m.group(1))
31
- return args[idx] if idx < len(args) else ""
32
-
33
- text = _ARG_RE.sub(_replace_arg, text)
34
-
35
- # $ARGUMENTS -> all joined
36
- text = _ARGS_RE.sub(" ".join(args), text)
37
-
38
- return text
@@ -1,124 +0,0 @@
1
- """onecode bootstrap — ensures ai-dlc-skill is installed in the cdh platform pool.
2
-
3
- Called at onecode startup (or cdh launch) to sync the ai-dlc-skill version
4
- from the repository source (ai-dlc-skill/) to ~/.cdh/skills/ai-dlc-skill/.
5
- """
6
-
7
- from __future__ import annotations
8
-
9
- import logging
10
- from pathlib import Path
11
- from typing import Optional
12
-
13
- import yaml
14
-
15
- from cdh.cdh_skill_manager import CdhSkillManager
16
-
17
- logger = logging.getLogger("onecode.skills.bootstrap")
18
-
19
- SKILL_SOURCE_NAME = "ai-dlc-skill"
20
- DEFAULT_VERSION = "4.0.0"
21
-
22
-
23
- def get_source_skill_dir(workspace_root: Path) -> Optional[Path]:
24
- """Walk up from workspace_root to find ai-dlc-skill/ directory."""
25
- current = workspace_root.resolve()
26
- # Check current directory
27
- candidate = current / SKILL_SOURCE_NAME
28
- if candidate.is_dir() and (candidate / "skill.yaml").exists():
29
- return candidate
30
- # Check parent (if in a subdirectory)
31
- candidate = current.parent / SKILL_SOURCE_NAME
32
- if candidate.is_dir() and (candidate / "skill.yaml").exists():
33
- return candidate
34
- # Check git root
35
- try:
36
- git_root = next(
37
- p for p in current.parents if (p / ".git").exists()
38
- )
39
- candidate = git_root / SKILL_SOURCE_NAME
40
- if candidate.is_dir() and (candidate / "skill.yaml").exists():
41
- return candidate
42
- except StopIteration:
43
- pass
44
- return None
45
-
46
-
47
- def get_source_version(source_dir: Path) -> str:
48
- """Read metadata.version from source skill.yaml."""
49
- try:
50
- skill_yaml = source_dir / "skill.yaml"
51
- data = yaml.safe_load(skill_yaml.read_text(encoding="utf-8")) or {}
52
- return data.get("metadata", {}).get("version", DEFAULT_VERSION)
53
- except Exception:
54
- return DEFAULT_VERSION
55
-
56
-
57
- def ensure_onecode_default_skills() -> None:
58
- """Install built-in skills (git, shell) to ~/.onecode/skills/ on first run."""
59
- from onecode.config import ONECODE_DIR
60
-
61
- target_dir = ONECODE_DIR / "skills"
62
- target_dir.mkdir(parents=True, exist_ok=True)
63
-
64
- builtin_root = Path(__file__).resolve().parent.parent / "builtin_skills"
65
- if not builtin_root.exists():
66
- return
67
-
68
- mgr = CdhSkillManager(skills_dir=target_dir)
69
-
70
- for d in sorted(builtin_root.iterdir()):
71
- if not d.is_dir():
72
- continue
73
- if not (d / "skill.yaml").exists():
74
- continue
75
- name = d.name
76
- if mgr.get_installed_version(name) is not None:
77
- continue
78
- err = mgr.install(d)
79
- if err:
80
- logger.warning("default skill %s install failed: %s", name, err)
81
- else:
82
- logger.info("default skill %s installed \u2192 %s/%s", name, target_dir, name)
83
-
84
-
85
- def ensure_ai_dlc_skill(workspace_root: Path | None = None) -> None:
86
- """Bootstrap ai-dlc-skill into cdh platform pool.
87
-
88
- Compares source version with installed version. If missing or outdated,
89
- installs via CdhSkillManager. Return value: None (logs warnings on failure).
90
- """
91
- root = workspace_root or Path.cwd()
92
- mgr = CdhSkillManager()
93
-
94
- # Check if already installed and up-to-date
95
- installed_version = mgr.get_installed_version(SKILL_SOURCE_NAME)
96
-
97
- # Find source directory
98
- source_dir = get_source_skill_dir(root)
99
- if source_dir is None:
100
- if installed_version is None:
101
- logger.warning(
102
- "ai-dlc-skill source not found at %s/ai-dlc-skill/ and not installed; "
103
- "install from repository root to enable AI-DLC methodology.",
104
- root,
105
- )
106
- return
107
-
108
- source_version = get_source_version(source_dir)
109
-
110
- if installed_version == source_version:
111
- logger.debug("ai-dlc-skill v%s is current, skipping install.", source_version)
112
- return
113
-
114
- # Install or update
115
- err = mgr.install(source_dir)
116
- if err:
117
- logger.warning("ai-dlc-skill install failed: %s", err)
118
- else:
119
- logger.info(
120
- "ai-dlc-skill installed v%s → %s/%s",
121
- source_version,
122
- mgr.skills_dir,
123
- SKILL_SOURCE_NAME,
124
- )
@@ -1,56 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from pathlib import Path
4
- from typing import Optional
5
-
6
- import yaml
7
-
8
-
9
- SKILL_TEMPLATE = """---
10
- name: {name}
11
- description: {description}
12
- enabled: true
13
- ---
14
-
15
- # {name} Skill
16
-
17
- ## Description
18
- {description}
19
-
20
- ## Usage
21
- When the user asks about {name}, follow these instructions:
22
-
23
- ## Guidelines
24
- - Follow the project conventions
25
- - Use appropriate tools
26
- """
27
-
28
-
29
- def create_skill_scaffold(
30
- skills_dir: Path,
31
- name: str,
32
- description: str = "",
33
- ) -> Optional[str]:
34
- """Create a new skill directory with SKILL.md and skill.yaml.
35
-
36
- Returns error message or None on success.
37
- """
38
- skill_path = skills_dir / name
39
- if skill_path.exists():
40
- return f"Skill '{name}' already exists at {skill_path}"
41
-
42
- skill_path.mkdir(parents=True, exist_ok=True)
43
-
44
- skill_md = skill_path / "SKILL.md"
45
- skill_md.write_text(
46
- SKILL_TEMPLATE.format(name=name, description=description or f"A skill for {name}"),
47
- encoding="utf-8",
48
- )
49
-
50
- skill_yaml = skill_path / "skill.yaml"
51
- skill_yaml.write_text(
52
- yaml.dump({"name": name, "description": description, "enabled": True}, default_flow_style=False),
53
- encoding="utf-8",
54
- )
55
-
56
- return None
@@ -1,33 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import re
4
- from typing import Any
5
-
6
- import yaml
7
-
8
-
9
- _FRONTMATTER_RE = re.compile(
10
- r'^---\s*\n(.*?)\n---\s*\n?',
11
- re.DOTALL,
12
- )
13
-
14
-
15
- def parse_frontmatter(text: str) -> tuple[dict[str, Any], str]:
16
- """Parse YAML frontmatter from markdown text.
17
-
18
- Returns (frontmatter_dict, body_text). If no frontmatter,
19
- frontmatter_dict is empty and body_text is the full text.
20
- """
21
- match = _FRONTMATTER_RE.match(text)
22
- if not match:
23
- return {}, text
24
-
25
- yaml_block = match.group(1)
26
- body = text[match.end():]
27
-
28
- try:
29
- frontmatter = yaml.safe_load(yaml_block) or {}
30
- except yaml.YAMLError:
31
- frontmatter = {}
32
-
33
- return frontmatter, body
@@ -1,139 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from pathlib import Path
4
- from typing import Optional
5
-
6
- import yaml
7
-
8
- from onecode.skills.frontmatter import parse_frontmatter
9
- from onecode.skills.model import Skill
10
-
11
- from onecode.config import ONECODE_DIR
12
-
13
-
14
- USER_SKILLS_DIR = ONECODE_DIR / "skills"
15
-
16
-
17
- class SkillLoader:
18
- def __init__(self, workspace_root: Path | None = None):
19
- self._workspace_root = workspace_root or Path.cwd()
20
- self._cache: dict[str, Skill] | None = None
21
-
22
- def _get_search_dirs(self) -> list[tuple[str, Path]]:
23
- dirs = []
24
- if USER_SKILLS_DIR.exists():
25
- dirs.append(("onecode", USER_SKILLS_DIR))
26
- return dirs
27
-
28
- def _discover(self) -> dict[str, Skill]:
29
- if self._cache is not None:
30
- return self._cache
31
-
32
- skills: dict[str, Skill] = {}
33
- seen_names: set[str] = set()
34
-
35
- for source, skills_dir in self._get_search_dirs():
36
- if not skills_dir.exists():
37
- continue
38
- try:
39
- for d in sorted(skills_dir.iterdir()):
40
- if not d.is_dir():
41
- continue
42
- skill_md = d / "SKILL.md"
43
- if not skill_md.exists():
44
- continue
45
-
46
- content = skill_md.read_text(encoding="utf-8")
47
- cfg = {}
48
- skill_yaml = d / "skill.yaml"
49
- if skill_yaml.exists():
50
- try:
51
- cfg = yaml.safe_load(skill_yaml.read_text(encoding="utf-8")) or {}
52
- except Exception:
53
- cfg = {}
54
-
55
- frontmatter, body = parse_frontmatter(content)
56
-
57
- raw_name = frontmatter.get("name") or cfg.get("name") or d.name
58
- name = raw_name.lower()
59
-
60
- valid, err = Skill.validate_name(name)
61
- if not valid:
62
- continue
63
-
64
- desc = frontmatter.get("description") or cfg.get("description", "")
65
-
66
- skill = Skill(
67
- name=name,
68
- description=desc,
69
- path=d,
70
- enabled=frontmatter.get("enabled", cfg.get("enabled", True)),
71
- allowed_tools=frontmatter.get("allowed_tools") or cfg.get("allowed_tools", []),
72
- arguments=frontmatter.get("arguments") or cfg.get("arguments", []),
73
- triggers=frontmatter.get("triggers") or cfg.get("triggers", []),
74
- phases=frontmatter.get("phases") or cfg.get("phases", []),
75
- content=body if body else content,
76
- license=frontmatter.get("license") or cfg.get("license", ""),
77
- compatibility=frontmatter.get("compatibility") or cfg.get("compatibility", ""),
78
- metadata=frontmatter.get("metadata") or cfg.get("metadata", {}),
79
- )
80
-
81
- if name not in seen_names:
82
- skills[name] = skill
83
- seen_names.add(name)
84
-
85
- except Exception:
86
- continue
87
-
88
- self._cache = skills
89
- return skills
90
-
91
- def get_all(self) -> dict[str, Skill]:
92
- return self._discover()
93
-
94
- def get(self, name: str) -> Optional[Skill]:
95
- return self._discover().get(name.lower())
96
-
97
- def get_enabled(self) -> list[Skill]:
98
- return [s for s in self._discover().values() if s.enabled]
99
-
100
- def get_by_source(self, source_prefix: str) -> list[Skill]:
101
- return [
102
- s for s in self._discover().values()
103
- if s.path and str(s.path).startswith(source_prefix)
104
- ]
105
-
106
- def search(self, keyword: str) -> list[Skill]:
107
- kw = keyword.lower()
108
- results: list[tuple[Skill, int]] = []
109
-
110
- for skill in self._discover().values():
111
- score = 0
112
- name_lower = skill.name.lower()
113
- desc_lower = skill.description.lower()
114
-
115
- if kw == name_lower:
116
- score += 100
117
- elif kw in name_lower:
118
- score += 50
119
- if kw in desc_lower:
120
- score += 30
121
- if desc_lower.startswith(kw):
122
- score += 10
123
- for trigger in skill.triggers:
124
- if kw in trigger.lower():
125
- score += 20
126
- break
127
- for phase in skill.phases:
128
- if kw in phase.lower():
129
- score += 10
130
- break
131
-
132
- if score > 0:
133
- results.append((skill, score))
134
-
135
- results.sort(key=lambda x: x[1], reverse=True)
136
- return [s for s, _ in results]
137
-
138
- def invalidate_cache(self) -> None:
139
- self._cache = None
@@ -1,75 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from pathlib import Path
4
- from typing import Optional
5
-
6
- import yaml
7
-
8
- from onecode.config import ONECODE_DIR
9
-
10
-
11
- class SkillManager:
12
- def __init__(self):
13
- self.skills_dir = ONECODE_DIR / "skills"
14
- self.skills_dir.mkdir(parents=True, exist_ok=True)
15
- self._skills: dict[str, dict] = {}
16
-
17
- def install(self, path: Path) -> Optional[str]:
18
- skill_yaml = path / "skill.yaml"
19
- if not skill_yaml.exists():
20
- return "skill.yaml not found"
21
- data = yaml.safe_load(skill_yaml.read_text())
22
- name = data.get("name", path.name)
23
- target = self.skills_dir / name
24
- target.mkdir(parents=True, exist_ok=True)
25
- for src in path.iterdir():
26
- (target / src.name).write_bytes(src.read_bytes())
27
- self._skills[name] = data
28
- return None
29
-
30
- def list(self) -> list[dict]:
31
- result = []
32
- for d in self.skills_dir.iterdir():
33
- if d.is_dir():
34
- config_path = d / "skill.yaml"
35
- if config_path.exists():
36
- data = yaml.safe_load(config_path.read_text()) or {}
37
- data["name"] = data.get("name", d.name)
38
- data["enabled"] = data.get("enabled", True)
39
- result.append(data)
40
- return result
41
-
42
- def enable(self, name: str, enabled: bool = True):
43
- config_path = self.skills_dir / name / "skill.yaml"
44
- if config_path.exists():
45
- data = yaml.safe_load(config_path.read_text()) or {}
46
- data["enabled"] = enabled
47
- config_path.write_text(yaml.dump(data, default_flow_style=False))
48
-
49
- def remove(self, name: str) -> Optional[str]:
50
- """Remove a skill by name.
51
-
52
- Returns error message or None on success.
53
- """
54
- skill_path = self.skills_dir / name
55
- if not skill_path.exists():
56
- return f"Skill '{name}' not found"
57
- if not skill_path.is_dir():
58
- return f"'{name}' is not a skill directory"
59
- import shutil
60
- shutil.rmtree(skill_path)
61
- self._skills.pop(name, None)
62
- return None
63
-
64
- def get(self, name: str) -> Optional[dict]:
65
- """Get a skill by name."""
66
- if name in self._skills:
67
- return self._skills[name]
68
- skill_path = self.skills_dir / name / "skill.yaml"
69
- if skill_path.exists():
70
- data = yaml.safe_load(skill_path.read_text()) or {}
71
- data["name"] = data.get("name", name)
72
- data["enabled"] = data.get("enabled", True)
73
- self._skills[name] = data
74
- return data
75
- return None
@@ -1,43 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import re
4
- from dataclasses import dataclass, field
5
- from pathlib import Path
6
- from typing import Any
7
-
8
-
9
- SKILL_NAME_RE = re.compile(r"^[a-z0-9]+(-[a-z0-9]+)*$")
10
-
11
-
12
- @dataclass
13
- class Skill:
14
- name: str
15
- description: str = ""
16
- path: Path | None = None
17
- enabled: bool = True
18
- allowed_tools: list[str] = field(default_factory=list)
19
- arguments: list[dict[str, Any]] = field(default_factory=list)
20
- triggers: list[str] = field(default_factory=list)
21
- phases: list[str] = field(default_factory=list)
22
- content: str = ""
23
- license: str = ""
24
- compatibility: str = ""
25
- metadata: dict[str, str] = field(default_factory=dict)
26
-
27
- @classmethod
28
- def validate_name(cls, name: str) -> tuple[bool, str]:
29
- if not name:
30
- return False, "name is required"
31
- if len(name) < 1 or len(name) > 64:
32
- return False, "name must be 1-64 characters"
33
- if not SKILL_NAME_RE.match(name):
34
- return False, "name must be lowercase alphanumeric with single hyphens, cannot start/end with hyphen or have consecutive hyphens"
35
- return True, ""
36
-
37
- @classmethod
38
- def validate_description(cls, desc: str) -> tuple[bool, str]:
39
- if not desc:
40
- return False, "description is required"
41
- if len(desc) > 1024:
42
- return False, "description must be 1-1024 characters"
43
- return True, ""
File without changes
@@ -1,63 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import uuid
4
- from datetime import datetime, timezone
5
- from pathlib import Path
6
- from typing import Optional
7
-
8
- from sqlalchemy import Column, String, DateTime, JSON, create_engine
9
- from sqlalchemy.orm import declarative_base, sessionmaker
10
-
11
- from onecode.config import ONECODE_DIR
12
-
13
- Base = declarative_base()
14
-
15
-
16
- class ActivityRecord(Base):
17
- __tablename__ = "activities"
18
-
19
- id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
20
- event_type = Column(String(50), nullable=False)
21
- project = Column(String(255), default="")
22
- session = Column(String(36), default="")
23
- details = Column(JSON, default=dict)
24
- created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc))
25
-
26
-
27
- class ActivityRecorder:
28
- def __init__(self, db_path: Optional[Path] = None):
29
- if db_path is None:
30
- db_path = ONECODE_DIR / "sessions" / "cdh.db"
31
- db_path.parent.mkdir(parents=True, exist_ok=True)
32
- self.engine = create_engine(f"sqlite:///{db_path}")
33
- Base.metadata.create_all(self.engine)
34
- self.Session = sessionmaker(bind=self.engine)
35
-
36
- def record(self, event_type: str, project: str = "", session: str = "", details: Optional[dict] = None) -> str:
37
- with self.Session() as s:
38
- record = ActivityRecord(
39
- event_type=event_type,
40
- project=project,
41
- session=session,
42
- details=details or {},
43
- )
44
- s.add(record)
45
- s.commit()
46
- s.refresh(record)
47
- return record.id
48
-
49
- def list_activities(self, project: str = "", limit: int = 50) -> list[ActivityRecord]:
50
- with self.Session() as s:
51
- q = s.query(ActivityRecord).order_by(ActivityRecord.created_at.desc())
52
- if project:
53
- q = q.filter_by(project=project)
54
- return q.limit(limit).all()
55
-
56
- def list_by_session(self, session_id: str) -> list[ActivityRecord]:
57
- with self.Session() as s:
58
- return (
59
- s.query(ActivityRecord)
60
- .filter_by(session=session_id)
61
- .order_by(ActivityRecord.created_at.desc())
62
- .all()
63
- )
@@ -1,54 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from pathlib import Path
4
- from typing import Optional
5
-
6
- import yaml
7
-
8
-
9
- class ProjectConfig:
10
- def __init__(self, root: Path):
11
- self.root = root
12
- self.config_path = root / "cdh.project.yaml"
13
- self._data: dict = {}
14
- if self.config_path.exists():
15
- self._data = yaml.safe_load(self.config_path.read_text()) or {}
16
-
17
- def save(self):
18
- self.config_path.write_text(yaml.dump(self._data, default_flow_style=False))
19
-
20
- def get(self, key: str, default=None):
21
- return self._data.get(key, default)
22
-
23
- def set(self, key: str, value):
24
- self._data[key] = value
25
-
26
- @staticmethod
27
- def create(name: str, path: Optional[Path] = None) -> ProjectConfig:
28
- if path is None:
29
- path = Path.cwd() / name
30
- path.mkdir(parents=True, exist_ok=True)
31
- config = ProjectConfig(path)
32
- config._data = {"name": name, "version": "0.1.0"}
33
- config.save()
34
- return config
35
-
36
- def tree(self, depth: int = 3) -> str:
37
- lines = []
38
- self._render_tree(self.root, "", depth, lines)
39
- return "\n".join(lines)
40
-
41
- def _render_tree(self, path: Path, prefix: str, depth: int, lines: list):
42
- if depth < 0:
43
- return
44
- entries = sorted(
45
- [e for e in path.iterdir() if not e.name.startswith(".") and e.name != "__pycache__"],
46
- key=lambda e: (not e.is_dir(), e.name),
47
- )
48
- for i, entry in enumerate(entries):
49
- is_last = i == len(entries) - 1
50
- connector = "└── " if is_last else "├── "
51
- lines.append(f"{prefix}{connector}{entry.name}{'/' if entry.is_dir() else ''}")
52
- if entry.is_dir():
53
- ext = " " if is_last else "│ "
54
- self._render_tree(entry, prefix + ext, depth - 1, lines)