@scemoon/cdh 1.0.10-beta.1 → 1.0.10-beta.2

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 (788) hide show
  1. package/ai-dlc-skill/SKILL.md +106 -0
  2. package/ai-dlc-skill/architecture/project-structure.md +78 -0
  3. package/ai-dlc-skill/brownfield/README.md +36 -0
  4. package/ai-dlc-skill/brownfield/entry.md +45 -0
  5. package/ai-dlc-skill/brownfield/generate-context.sh +64 -0
  6. package/ai-dlc-skill/brownfield/scripts/deps.sh +27 -0
  7. package/ai-dlc-skill/brownfield/scripts/discover.sh +34 -0
  8. package/ai-dlc-skill/brownfield/scripts/extract-api.sh +45 -0
  9. package/ai-dlc-skill/components/backend.md +47 -0
  10. package/ai-dlc-skill/components/desktop.md +63 -0
  11. package/ai-dlc-skill/components/mya.md +219 -0
  12. package/ai-dlc-skill/components/native.md +73 -0
  13. package/ai-dlc-skill/components/tta.md +235 -0
  14. package/ai-dlc-skill/components/web.md +77 -0
  15. package/ai-dlc-skill/components/wxa.md +219 -0
  16. package/ai-dlc-skill/contracts/README.md +25 -0
  17. package/ai-dlc-skill/core/adaptive-flow.md +107 -0
  18. package/ai-dlc-skill/core/security.md +29 -0
  19. package/ai-dlc-skill/core/task-registry.md +153 -0
  20. package/ai-dlc-skill/cross-tool/README.md +20 -0
  21. package/ai-dlc-skill/cross-tool/cline/export.sh +38 -0
  22. package/ai-dlc-skill/cross-tool/copilot/export.sh +41 -0
  23. package/ai-dlc-skill/cross-tool/cursor/export.sh +53 -0
  24. package/ai-dlc-skill/cross-tool/onecode/export.sh +27 -0
  25. package/ai-dlc-skill/cross-tool/opencode/export.sh +38 -0
  26. package/ai-dlc-skill/phases/debug/entry.md +48 -0
  27. package/ai-dlc-skill/phases/debug/lifecycle.md +284 -0
  28. package/ai-dlc-skill/phases/deliver/entry.md +35 -0
  29. package/ai-dlc-skill/phases/deliver/lifecycle.md +185 -0
  30. package/ai-dlc-skill/phases/deliver/prompt.md +54 -0
  31. package/ai-dlc-skill/phases/deliver/rules.md +61 -0
  32. package/ai-dlc-skill/phases/plan/design_system/accessibility.md +268 -0
  33. package/ai-dlc-skill/phases/plan/design_system/atomic_design.md +341 -0
  34. package/ai-dlc-skill/phases/plan/design_system/component_spec.md +398 -0
  35. package/ai-dlc-skill/phases/plan/design_system/design_tokens.md +190 -0
  36. package/ai-dlc-skill/phases/plan/design_system/iconography.md +299 -0
  37. package/ai-dlc-skill/phases/plan/design_system/platform_ui/desktop.md +318 -0
  38. package/ai-dlc-skill/phases/plan/design_system/platform_ui/mya.md +354 -0
  39. package/ai-dlc-skill/phases/plan/design_system/platform_ui/native.md +328 -0
  40. package/ai-dlc-skill/phases/plan/design_system/platform_ui/tta.md +394 -0
  41. package/ai-dlc-skill/phases/plan/design_system/platform_ui/web.md +287 -0
  42. package/ai-dlc-skill/phases/plan/design_system/platform_ui/wxa.md +374 -0
  43. package/ai-dlc-skill/phases/plan/design_system/theme_system.md +318 -0
  44. package/ai-dlc-skill/phases/plan/entry.md +33 -0
  45. package/ai-dlc-skill/phases/plan/lifecycle.md +260 -0
  46. package/ai-dlc-skill/phases/plan/prompt.md +75 -0
  47. package/ai-dlc-skill/phases/plan/rules.md +60 -0
  48. package/ai-dlc-skill/phases/understand/entry.md +36 -0
  49. package/ai-dlc-skill/phases/understand/lifecycle.md +184 -0
  50. package/ai-dlc-skill/phases/understand/prompt.md +58 -0
  51. package/ai-dlc-skill/phases/understand/rules.md +49 -0
  52. package/ai-dlc-skill/phases/verify/config/base_url.md +65 -0
  53. package/ai-dlc-skill/phases/verify/entry.md +59 -0
  54. package/ai-dlc-skill/phases/verify/gates/browser_e2e.md +96 -0
  55. package/ai-dlc-skill/phases/verify/lifecycle.md +217 -0
  56. package/ai-dlc-skill/phases/verify/prompt.md +73 -0
  57. package/ai-dlc-skill/phases/verify/rules.md +91 -0
  58. package/ai-dlc-skill/phases/verify/runners/playwright_local.md +103 -0
  59. package/ai-dlc-skill/practices/bdd.md +119 -0
  60. package/ai-dlc-skill/practices/sdd.md +84 -0
  61. package/ai-dlc-skill/practices/tdd.md +128 -0
  62. package/ai-dlc-skill/providers/README.md +114 -0
  63. package/ai-dlc-skill/providers/aliyun/SKILL.md +204 -0
  64. package/ai-dlc-skill/providers/aliyun/api/rest-api.md +214 -0
  65. package/ai-dlc-skill/providers/aliyun/api/sdk.md +307 -0
  66. package/ai-dlc-skill/providers/aliyun/best-practices/database-design.md +363 -0
  67. package/ai-dlc-skill/providers/aliyun/best-practices/function-design.md +424 -0
  68. package/ai-dlc-skill/providers/aliyun/best-practices/troubleshooting.md +258 -0
  69. package/ai-dlc-skill/providers/aliyun/cli/database.md +263 -0
  70. package/ai-dlc-skill/providers/aliyun/cli/functions.md +263 -0
  71. package/ai-dlc-skill/providers/aliyun/cli/hosting.md +226 -0
  72. package/ai-dlc-skill/providers/aliyun/cli/setup.md +235 -0
  73. package/ai-dlc-skill/providers/aliyun/cli/storage.md +315 -0
  74. package/ai-dlc-skill/providers/aliyun/deployment.yaml +66 -0
  75. package/ai-dlc-skill/providers/aliyun/integration/ci-cd.md +288 -0
  76. package/ai-dlc-skill/providers/aliyun/preview.yaml +84 -0
  77. package/ai-dlc-skill/providers/aliyun/provider.yaml +160 -0
  78. package/ai-dlc-skill/providers/aliyun/security/authentication.md +254 -0
  79. package/ai-dlc-skill/providers/aliyun/services/cdn-hosting.md +220 -0
  80. package/ai-dlc-skill/providers/aliyun/services/database.md +319 -0
  81. package/ai-dlc-skill/providers/aliyun/services/function-compute.md +273 -0
  82. package/ai-dlc-skill/providers/aliyun/services/overview.md +163 -0
  83. package/ai-dlc-skill/providers/aliyun/services/serverless-app-engine.md +266 -0
  84. package/ai-dlc-skill/providers/aliyun/services/storage.md +269 -0
  85. package/ai-dlc-skill/providers/tcb/SKILL.md +208 -0
  86. package/ai-dlc-skill/providers/tcb/api/rest-api.md +338 -0
  87. package/ai-dlc-skill/providers/tcb/api/sdk.md +288 -0
  88. package/ai-dlc-skill/providers/tcb/best-practices/database-design.md +452 -0
  89. package/ai-dlc-skill/providers/tcb/best-practices/function-design.md +502 -0
  90. package/ai-dlc-skill/providers/tcb/best-practices/troubleshooting.md +462 -0
  91. package/ai-dlc-skill/providers/tcb/cli/cls.md +133 -0
  92. package/ai-dlc-skill/providers/tcb/cli/database.md +230 -0
  93. package/ai-dlc-skill/providers/tcb/cli/env.md +207 -0
  94. package/ai-dlc-skill/providers/tcb/cli/functions.md +276 -0
  95. package/ai-dlc-skill/providers/tcb/cli/hosting.md +219 -0
  96. package/ai-dlc-skill/providers/tcb/cli/setup.md +218 -0
  97. package/ai-dlc-skill/providers/tcb/cli/storage.md +233 -0
  98. package/ai-dlc-skill/providers/tcb/deployment.yaml +111 -0
  99. package/ai-dlc-skill/providers/tcb/integration/ci-cd.md +309 -0
  100. package/ai-dlc-skill/providers/tcb/integration/mcp-server.md +371 -0
  101. package/ai-dlc-skill/providers/tcb/preview.yaml +83 -0
  102. package/ai-dlc-skill/providers/tcb/provider.yaml +172 -0
  103. package/ai-dlc-skill/providers/tcb/security/authentication.md +241 -0
  104. package/ai-dlc-skill/providers/tcb/services/cloud-database.md +299 -0
  105. package/ai-dlc-skill/providers/tcb/services/cloud-functions.md +265 -0
  106. package/ai-dlc-skill/providers/tcb/services/cloud-hosting.md +264 -0
  107. package/ai-dlc-skill/providers/tcb/services/cloud-run.md +285 -0
  108. package/ai-dlc-skill/providers/tcb/services/cloud-storage.md +245 -0
  109. package/ai-dlc-skill/providers/tcb/services/overview.md +174 -0
  110. package/ai-dlc-skill/pybdd/README.md +41 -0
  111. package/ai-dlc-skill/pybdd/conftest.py +17 -0
  112. package/ai-dlc-skill/pybdd/example/auth/login.feature +32 -0
  113. package/ai-dlc-skill/pybdd/pytest.ini +5 -0
  114. package/ai-dlc-skill/pybdd/steps/.gitkeep +1 -0
  115. package/ai-dlc-skill/pybdd/steps/test_example_steps.py +65 -0
  116. package/ai-dlc-skill/requirements.md +140 -0
  117. package/ai-dlc-skill/skill.yaml +135 -0
  118. package/ai-dlc-skill/templates/brownfield/context.md +78 -0
  119. package/ai-dlc-skill/templates/integration/CHANGELOG.md +41 -0
  120. package/ai-dlc-skill/templates/integration/asyncapi.yaml +43 -0
  121. package/ai-dlc-skill/templates/integration/contract-diff.md +63 -0
  122. package/ai-dlc-skill/templates/integration/contract-spec.md +49 -0
  123. package/ai-dlc-skill/templates/integration/openapi.yaml +18 -0
  124. package/ai-dlc-skill/templates/integration/runtime-contract.yaml +36 -0
  125. package/ai-dlc-skill/templates/plan/design.md +49 -0
  126. package/ai-dlc-skill/templates/plan/task-list.md +32 -0
  127. package/ai-dlc-skill/templates/project/README.md +126 -0
  128. package/ai-dlc-skill/templates/project/template.md +119 -0
  129. package/ai-dlc-skill/templates/understand/feature.feature +30 -0
  130. package/ai-dlc-skill/templates/understand/intent.md +29 -0
  131. package/ai-dlc-skill/templates/understand/spec-delta.md +47 -0
  132. package/ai-dlc-skill/templates/verify/test-unit.py +27 -0
  133. package/ai-dlc-skill/walkthrough/collect.sh +50 -0
  134. package/ai-dlc-skill/walkthrough/template.md +54 -0
  135. package/cdh/__init__.py +0 -0
  136. package/cdh/__main__.py +4 -0
  137. package/cdh/__pycache__/__init__.cpython-314.pyc +0 -0
  138. package/cdh/__pycache__/cli.cpython-314.pyc +0 -0
  139. package/cdh/__pycache__/cli_logging.cpython-314.pyc +0 -0
  140. package/cdh/__pycache__/config.cpython-314.pyc +0 -0
  141. package/cdh/__pycache__/project_loader.cpython-314.pyc +0 -0
  142. package/cdh/__pycache__/scaffold.cpython-314.pyc +0 -0
  143. package/cdh/__pycache__/session_store.cpython-314.pyc +0 -0
  144. package/cdh/cdh_session_aggregator.py +258 -0
  145. package/cdh/cli.py +3000 -0
  146. package/cdh/cli_logging.py +45 -0
  147. package/cdh/config.py +28 -0
  148. package/cdh/event_loop/__init__.py +7 -0
  149. package/cdh/event_loop/bus.py +123 -0
  150. package/cdh/event_loop/events.py +25 -0
  151. package/cdh/event_loop/runner.py +28 -0
  152. package/cdh/event_loop/scheduler.py +158 -0
  153. package/cdh/generators/__init__.py +35 -0
  154. package/cdh/generators/_runtime.py +176 -0
  155. package/cdh/generators/ada/MANIFEST.toml +14 -0
  156. package/cdh/generators/ada/template.ads.tmpl +7 -0
  157. package/cdh/generators/bash/MANIFEST.toml +14 -0
  158. package/cdh/generators/bash/template.sh.tmpl +16 -0
  159. package/cdh/generators/builtin_index.json +590 -0
  160. package/cdh/generators/c/MANIFEST.toml +14 -0
  161. package/cdh/generators/c/template.h.tmpl +20 -0
  162. package/cdh/generators/cli.py +379 -0
  163. package/cdh/generators/clojure/MANIFEST.toml +14 -0
  164. package/cdh/generators/clojure/template.clj.tmpl +13 -0
  165. package/cdh/generators/cobol/MANIFEST.toml +14 -0
  166. package/cdh/generators/cobol/template.cbl.tmpl +14 -0
  167. package/cdh/generators/cpp/MANIFEST.toml +14 -0
  168. package/cdh/generators/cpp/template.hpp.tmpl +32 -0
  169. package/cdh/generators/crystal/MANIFEST.toml +14 -0
  170. package/cdh/generators/crystal/template.cr.tmpl +11 -0
  171. package/cdh/generators/csharp/MANIFEST.toml +23 -0
  172. package/cdh/generators/csharp/template.cs.tmpl +14 -0
  173. package/cdh/generators/cython/MANIFEST.toml +14 -0
  174. package/cdh/generators/cython/template.pyx.tmpl +17 -0
  175. package/cdh/generators/d/MANIFEST.toml +14 -0
  176. package/cdh/generators/d/template.d.tmpl +24 -0
  177. package/cdh/generators/dart/MANIFEST.toml +17 -0
  178. package/cdh/generators/dart/template.dart.tmpl +27 -0
  179. package/cdh/generators/elixir/MANIFEST.toml +17 -0
  180. package/cdh/generators/elixir/template.ex.tmpl +27 -0
  181. package/cdh/generators/elm/MANIFEST.toml +14 -0
  182. package/cdh/generators/elm/template.elm.tmpl +20 -0
  183. package/cdh/generators/erlang/MANIFEST.toml +14 -0
  184. package/cdh/generators/erlang/template.erl.tmpl +18 -0
  185. package/cdh/generators/fortran/MANIFEST.toml +14 -0
  186. package/cdh/generators/fortran/template.f90.tmpl +24 -0
  187. package/cdh/generators/fsharp/MANIFEST.toml +14 -0
  188. package/cdh/generators/fsharp/template.fs.tmpl +17 -0
  189. package/cdh/generators/go/MANIFEST.toml +18 -0
  190. package/cdh/generators/go/imports.go.tmpl +3 -0
  191. package/cdh/generators/go/template.go.tmpl +9 -0
  192. package/cdh/generators/graphql-schema/MANIFEST.toml +18 -0
  193. package/cdh/generators/graphql-schema/template.graphqls.tmpl +12 -0
  194. package/cdh/generators/groovy/MANIFEST.toml +14 -0
  195. package/cdh/generators/groovy/template.groovy.tmpl +28 -0
  196. package/cdh/generators/hack/MANIFEST.toml +14 -0
  197. package/cdh/generators/hack/template.hh.tmpl +24 -0
  198. package/cdh/generators/haskell/MANIFEST.toml +14 -0
  199. package/cdh/generators/haskell/template.hs.tmpl +20 -0
  200. package/cdh/generators/haxe/MANIFEST.toml +14 -0
  201. package/cdh/generators/haxe/template.hx.tmpl +20 -0
  202. package/cdh/generators/idris/MANIFEST.toml +14 -0
  203. package/cdh/generators/idris/template.idr.tmpl +22 -0
  204. package/cdh/generators/java/MANIFEST.toml +18 -0
  205. package/cdh/generators/java/template.java.tmpl +13 -0
  206. package/cdh/generators/julia/MANIFEST.toml +14 -0
  207. package/cdh/generators/julia/template.jl.tmpl +27 -0
  208. package/cdh/generators/kotlin/MANIFEST.toml +18 -0
  209. package/cdh/generators/kotlin/template.kt.tmpl +12 -0
  210. package/cdh/generators/lua/MANIFEST.toml +14 -0
  211. package/cdh/generators/lua/template.lua.tmpl +27 -0
  212. package/cdh/generators/matlab/MANIFEST.toml +14 -0
  213. package/cdh/generators/matlab/template.m.tmpl +26 -0
  214. package/cdh/generators/nim/MANIFEST.toml +14 -0
  215. package/cdh/generators/nim/template.nim.tmpl +12 -0
  216. package/cdh/generators/nix/MANIFEST.toml +14 -0
  217. package/cdh/generators/nix/template.nix.tmpl +8 -0
  218. package/cdh/generators/objective-c/MANIFEST.toml +14 -0
  219. package/cdh/generators/objective-c/template.m.tmpl +31 -0
  220. package/cdh/generators/ocaml/MANIFEST.toml +14 -0
  221. package/cdh/generators/ocaml/template.ml.tmpl +13 -0
  222. package/cdh/generators/pascal/MANIFEST.toml +14 -0
  223. package/cdh/generators/pascal/template.pas.tmpl +5 -0
  224. package/cdh/generators/perl/MANIFEST.toml +14 -0
  225. package/cdh/generators/perl/template.pm.tmpl +27 -0
  226. package/cdh/generators/php/MANIFEST.toml +17 -0
  227. package/cdh/generators/php/template.php.tmpl +31 -0
  228. package/cdh/generators/powershell/MANIFEST.toml +14 -0
  229. package/cdh/generators/powershell/template.ps1.tmpl +20 -0
  230. package/cdh/generators/protobuf/MANIFEST.toml +18 -0
  231. package/cdh/generators/protobuf/template.proto.tmpl +13 -0
  232. package/cdh/generators/python/MANIFEST.toml +18 -0
  233. package/cdh/generators/python/template.py.tmpl +12 -0
  234. package/cdh/generators/r/MANIFEST.toml +14 -0
  235. package/cdh/generators/r/template.R.tmpl +29 -0
  236. package/cdh/generators/racket/MANIFEST.toml +14 -0
  237. package/cdh/generators/racket/template.rkt.tmpl +15 -0
  238. package/cdh/generators/registry.py +211 -0
  239. package/cdh/generators/ruby/MANIFEST.toml +17 -0
  240. package/cdh/generators/ruby/template.rb.tmpl +27 -0
  241. package/cdh/generators/rust/MANIFEST.toml +18 -0
  242. package/cdh/generators/rust/template.rs.tmpl +16 -0
  243. package/cdh/generators/scala/MANIFEST.toml +20 -0
  244. package/cdh/generators/scala/template.scala.tmpl +13 -0
  245. package/cdh/generators/scheme/MANIFEST.toml +14 -0
  246. package/cdh/generators/scheme/template.scm.tmpl +16 -0
  247. package/cdh/generators/solidity/MANIFEST.toml +14 -0
  248. package/cdh/generators/solidity/template.sol.tmpl +24 -0
  249. package/cdh/generators/swift/MANIFEST.toml +18 -0
  250. package/cdh/generators/swift/template.swift.tmpl +10 -0
  251. package/cdh/generators/typescript/MANIFEST.toml +18 -0
  252. package/cdh/generators/typescript/template.ts.tmpl +7 -0
  253. package/cdh/generators/version.py +214 -0
  254. package/cdh/generators/zig/MANIFEST.toml +14 -0
  255. package/cdh/generators/zig/template.zig.tmpl +20 -0
  256. package/cdh/logging.py +314 -0
  257. package/cdh/optimizer/__init__.py +7 -0
  258. package/cdh/optimizer/loop.py +201 -0
  259. package/cdh/optimizer/mutation.py +85 -0
  260. package/cdh/optimizer/reward.py +51 -0
  261. package/cdh/optimizer/tracker.py +118 -0
  262. package/cdh/project_loader.py +1022 -0
  263. package/cdh/rules/patterns.yaml +132 -0
  264. package/cdh/rules/spectral.yaml +301 -0
  265. package/cdh/scaffold.py +1436 -0
  266. package/cdh/session_store.py +221 -0
  267. package/cdh/state_schema.py +127 -0
  268. package/cdh/tools/__init__.py +57 -0
  269. package/cdh/tools/cls_search.py +406 -0
  270. package/cdh/tools/contract_diff.py +644 -0
  271. package/cdh/tools/deploy_stack.py +590 -0
  272. package/cdh/tools/generate_shared.py +300 -0
  273. package/cdh/tools/iac_gen.py +224 -0
  274. package/cdh/tools/otel_export.py +125 -0
  275. package/cdh/tools/pattern_detect.py +451 -0
  276. package/cdh/tools/retrofit_labels.py +505 -0
  277. package/cdh/trace/__init__.py +101 -0
  278. package/cdh/trace/__pycache__/__init__.cpython-314.pyc +0 -0
  279. package/cdh/trace/dashboard/__init__.py +61 -0
  280. package/cdh/trace/dashboard/api.py +1032 -0
  281. package/cdh/trace/dashboard/app.html +1321 -0
  282. package/cdh/trace/dashboard/server.py +310 -0
  283. package/cdh/trace/otel_exporter.py +462 -0
  284. package/cdh/trace/otel_tracer.py +281 -0
  285. package/cdh/tui.py +1084 -0
  286. package/cdh/validators/__init__.py +16 -0
  287. package/cdh/validators/__pycache__/__init__.cpython-314.pyc +0 -0
  288. package/cdh/validators/__pycache__/bdd.cpython-314.pyc +0 -0
  289. package/cdh/validators/__pycache__/dag.cpython-314.pyc +0 -0
  290. package/cdh/validators/__pycache__/ears.cpython-314.pyc +0 -0
  291. package/cdh/validators/__pycache__/fr_namespace.cpython-314.pyc +0 -0
  292. package/cdh/validators/bdd.py +144 -0
  293. package/cdh/validators/dag.py +179 -0
  294. package/cdh/validators/ears.py +452 -0
  295. package/cdh/validators/fr_namespace.py +143 -0
  296. package/cdh/validators/spectral.py +475 -0
  297. package/cdh/verification/__init__.py +3 -0
  298. package/cdh/verification/aggregation.py +53 -0
  299. package/cdh/verification/gates/__init__.py +5 -0
  300. package/cdh/verification/gates/base.py +18 -0
  301. package/cdh/verification/gates/lint_gate.py +37 -0
  302. package/cdh/verification/gates/test_gate.py +41 -0
  303. package/cdh/verification/loop.py +93 -0
  304. package/cdh/verification/policy.py +24 -0
  305. package/onecode/__init__.py +1 -0
  306. package/onecode/__main__.py +4 -0
  307. package/onecode/__pycache__/__init__.cpython-314.pyc +0 -0
  308. package/onecode/__pycache__/cli.cpython-314.pyc +0 -0
  309. package/onecode/__pycache__/commands.cpython-314.pyc +0 -0
  310. package/onecode/__pycache__/config.cpython-314.pyc +0 -0
  311. package/onecode/__pycache__/config_screen.cpython-314.pyc +0 -0
  312. package/onecode/__pycache__/migrate.cpython-314.pyc +0 -0
  313. package/onecode/agent/__init__.py +0 -0
  314. package/onecode/agent/__pycache__/__init__.cpython-314.pyc +0 -0
  315. package/onecode/agent/__pycache__/cdh_loader.cpython-314.pyc +0 -0
  316. package/onecode/agent/__pycache__/checkpoint.cpython-314.pyc +0 -0
  317. package/onecode/agent/__pycache__/context.cpython-314.pyc +0 -0
  318. package/onecode/agent/__pycache__/engine.cpython-314.pyc +0 -0
  319. package/onecode/agent/__pycache__/hooks.cpython-314.pyc +0 -0
  320. package/onecode/agent/__pycache__/onecode_agent_acp.cpython-314.pyc +0 -0
  321. package/onecode/agent/__pycache__/permissions.cpython-314.pyc +0 -0
  322. package/onecode/agent/__pycache__/permissions_store.cpython-314.pyc +0 -0
  323. package/onecode/agent/__pycache__/project_doc.cpython-314.pyc +0 -0
  324. package/onecode/agent/__pycache__/session.cpython-314.pyc +0 -0
  325. package/onecode/agent/__pycache__/turn_record.cpython-314.pyc +0 -0
  326. package/onecode/agent/agents/__init__.py +29 -0
  327. package/onecode/agent/agents/__pycache__/__init__.cpython-314.pyc +0 -0
  328. package/onecode/agent/agents/__pycache__/types.cpython-314.pyc +0 -0
  329. package/onecode/agent/agents/prompts/build-agent.md +50 -0
  330. package/onecode/agent/agents/prompts/compaction-instructions.md +12 -0
  331. package/onecode/agent/agents/prompts/explore-agent.md +42 -0
  332. package/onecode/agent/agents/prompts/plan-agent.md +44 -0
  333. package/onecode/agent/agents/prompts/plan-gate-hard.md +4 -0
  334. package/onecode/agent/agents/prompts/plan-gate-soft.md +3 -0
  335. package/onecode/agent/agents/prompts/solo-agent.md +57 -0
  336. package/onecode/agent/agents/prompts/subagent-constraints.md +10 -0
  337. package/onecode/agent/agents/prompts/summary-instructions.md +7 -0
  338. package/onecode/agent/agents/prompts/title-instructions.md +3 -0
  339. package/onecode/agent/agents/prompts/tool-descriptions.md +129 -0
  340. package/onecode/agent/agents/types.py +786 -0
  341. package/onecode/agent/attachments.py +112 -0
  342. package/onecode/agent/cdh_loader.py +3 -0
  343. package/onecode/agent/checkpoint.py +285 -0
  344. package/onecode/agent/context.py +465 -0
  345. package/onecode/agent/engine.py +3567 -0
  346. package/onecode/agent/event_bridge.py +75 -0
  347. package/onecode/agent/hooks.py +86 -0
  348. package/onecode/agent/onecode_agent_acp.py +2993 -0
  349. package/onecode/agent/permissions.py +150 -0
  350. package/onecode/agent/permissions_store.py +73 -0
  351. package/onecode/agent/project_doc.py +19 -0
  352. package/onecode/agent/question_detect.py +230 -0
  353. package/onecode/agent/session.py +3 -0
  354. package/onecode/agent/snapshot.py +144 -0
  355. package/onecode/agent/tools/__init__.py +17 -0
  356. package/onecode/agent/tools/__pycache__/__init__.cpython-314.pyc +0 -0
  357. package/onecode/agent/tools/__pycache__/agent_tools.cpython-314.pyc +0 -0
  358. package/onecode/agent/tools/__pycache__/apply_patch_tool.cpython-314.pyc +0 -0
  359. package/onecode/agent/tools/__pycache__/bash_tool.cpython-314.pyc +0 -0
  360. package/onecode/agent/tools/__pycache__/communication_tools.cpython-314.pyc +0 -0
  361. package/onecode/agent/tools/__pycache__/config_tool.cpython-314.pyc +0 -0
  362. package/onecode/agent/tools/__pycache__/cron_tools.cpython-314.pyc +0 -0
  363. package/onecode/agent/tools/__pycache__/errors.cpython-314.pyc +0 -0
  364. package/onecode/agent/tools/__pycache__/file_ops.cpython-314.pyc +0 -0
  365. package/onecode/agent/tools/__pycache__/file_tools.cpython-314.pyc +0 -0
  366. package/onecode/agent/tools/__pycache__/git_tools.cpython-314.pyc +0 -0
  367. package/onecode/agent/tools/__pycache__/lsp_tools.cpython-314.pyc +0 -0
  368. package/onecode/agent/tools/__pycache__/mcp_tools.cpython-314.pyc +0 -0
  369. package/onecode/agent/tools/__pycache__/permission_handler.cpython-314.pyc +0 -0
  370. package/onecode/agent/tools/__pycache__/permissions.cpython-314.pyc +0 -0
  371. package/onecode/agent/tools/__pycache__/protocol.cpython-314.pyc +0 -0
  372. package/onecode/agent/tools/__pycache__/registry.cpython-314.pyc +0 -0
  373. package/onecode/agent/tools/__pycache__/sandbox.cpython-314.pyc +0 -0
  374. package/onecode/agent/tools/__pycache__/schema_validation.cpython-314.pyc +0 -0
  375. package/onecode/agent/tools/__pycache__/skill_tools.cpython-314.pyc +0 -0
  376. package/onecode/agent/tools/__pycache__/todo_tools.cpython-314.pyc +0 -0
  377. package/onecode/agent/tools/__pycache__/web_tools.cpython-314.pyc +0 -0
  378. package/onecode/agent/tools/agent_tools.py +128 -0
  379. package/onecode/agent/tools/apply_patch_tool.py +138 -0
  380. package/onecode/agent/tools/bash_tool.py +121 -0
  381. package/onecode/agent/tools/communication_tools.py +154 -0
  382. package/onecode/agent/tools/config_tool.py +130 -0
  383. package/onecode/agent/tools/cron_tools.py +178 -0
  384. package/onecode/agent/tools/errors.py +17 -0
  385. package/onecode/agent/tools/file_ops.py +221 -0
  386. package/onecode/agent/tools/file_tools.py +225 -0
  387. package/onecode/agent/tools/git_tools.py +88 -0
  388. package/onecode/agent/tools/lsp_tools.py +404 -0
  389. package/onecode/agent/tools/mcp_tools.py +211 -0
  390. package/onecode/agent/tools/permission_handler.py +46 -0
  391. package/onecode/agent/tools/permissions.py +77 -0
  392. package/onecode/agent/tools/protocol.py +20 -0
  393. package/onecode/agent/tools/registry.py +210 -0
  394. package/onecode/agent/tools/sandbox.py +460 -0
  395. package/onecode/agent/tools/schema_validation.py +100 -0
  396. package/onecode/agent/tools/skill_tools.py +52 -0
  397. package/onecode/agent/tools/todo_tools.py +208 -0
  398. package/onecode/agent/tools/web_tools.py +530 -0
  399. package/onecode/agent/turn_record.py +28 -0
  400. package/onecode/builtin_skills/agent-browser/SKILL.md +212 -0
  401. package/onecode/builtin_skills/agent-browser/skill.yaml +8 -0
  402. package/onecode/builtin_skills/cloudbase/SKILL.md +162 -0
  403. package/onecode/builtin_skills/cloudbase/skill.yaml +7 -0
  404. package/onecode/builtin_skills/git/SKILL.md +64 -0
  405. package/onecode/builtin_skills/git/skill.yaml +7 -0
  406. package/onecode/builtin_skills/shell/SKILL.md +58 -0
  407. package/onecode/builtin_skills/shell/skill.yaml +8 -0
  408. package/onecode/builtin_skills/skill-creator/SKILL.md +106 -0
  409. package/onecode/builtin_skills/skill-creator/skill.yaml +8 -0
  410. package/onecode/cli.py +1325 -0
  411. package/onecode/codebase/__init__.py +69 -0
  412. package/onecode/codebase/__pycache__/__init__.cpython-314.pyc +0 -0
  413. package/onecode/codebase/__pycache__/chunker.cpython-314.pyc +0 -0
  414. package/onecode/codebase/__pycache__/indexer.cpython-314.pyc +0 -0
  415. package/onecode/codebase/__pycache__/retriever.cpython-314.pyc +0 -0
  416. package/onecode/codebase/__pycache__/storage.cpython-314.pyc +0 -0
  417. package/onecode/codebase/__pycache__/tools.cpython-314.pyc +0 -0
  418. package/onecode/codebase/chunker.py +125 -0
  419. package/onecode/codebase/indexer.py +154 -0
  420. package/onecode/codebase/retriever.py +240 -0
  421. package/onecode/codebase/storage.py +153 -0
  422. package/onecode/codebase/tools.py +59 -0
  423. package/onecode/commands.py +918 -0
  424. package/onecode/config.py +539 -0
  425. package/onecode/config_screen.py +486 -0
  426. package/onecode/cron/__init__.py +3 -0
  427. package/onecode/lsp/__init__.py +3 -0
  428. package/onecode/mcp/__init__.py +11 -0
  429. package/onecode/mcp/__pycache__/__init__.cpython-314.pyc +0 -0
  430. package/onecode/mcp/__pycache__/client.cpython-314.pyc +0 -0
  431. package/onecode/mcp/__pycache__/cloudbase.cpython-314.pyc +0 -0
  432. package/onecode/mcp/__pycache__/config.cpython-314.pyc +0 -0
  433. package/onecode/mcp/__pycache__/manager.cpython-314.pyc +0 -0
  434. package/onecode/mcp/__pycache__/oauth.cpython-314.pyc +0 -0
  435. package/onecode/mcp/client.py +305 -0
  436. package/onecode/mcp/cloudbase.py +188 -0
  437. package/onecode/mcp/config.py +363 -0
  438. package/onecode/mcp/manager.py +603 -0
  439. package/onecode/mcp/oauth.py +199 -0
  440. package/onecode/memory/__init__.py +106 -0
  441. package/onecode/memory/__pycache__/__init__.cpython-314.pyc +0 -0
  442. package/onecode/memory/__pycache__/backend.cpython-314.pyc +0 -0
  443. package/onecode/memory/__pycache__/pyramid.cpython-314.pyc +0 -0
  444. package/onecode/memory/__pycache__/recall.cpython-314.pyc +0 -0
  445. package/onecode/memory/backend.py +179 -0
  446. package/onecode/memory/pyramid.py +145 -0
  447. package/onecode/memory/recall.py +322 -0
  448. package/onecode/migrate.py +122 -0
  449. package/onecode/models/__init__.py +4 -0
  450. package/onecode/models/__pycache__/__init__.cpython-314.pyc +0 -0
  451. package/onecode/models/__pycache__/errors.cpython-314.pyc +0 -0
  452. package/onecode/models/__pycache__/messages.cpython-314.pyc +0 -0
  453. package/onecode/models/__pycache__/ollama_manager.cpython-314.pyc +0 -0
  454. package/onecode/models/__pycache__/provider.cpython-314.pyc +0 -0
  455. package/onecode/models/__pycache__/registry.cpython-314.pyc +0 -0
  456. package/onecode/models/errors.py +104 -0
  457. package/onecode/models/messages.py +750 -0
  458. package/onecode/models/ollama_manager.py +167 -0
  459. package/onecode/models/provider.py +730 -0
  460. package/onecode/models/providers/__init__.py +17 -0
  461. package/onecode/models/providers/__pycache__/__init__.cpython-314.pyc +0 -0
  462. package/onecode/models/providers/__pycache__/anthropic_provider.cpython-314.pyc +0 -0
  463. package/onecode/models/providers/__pycache__/deepseek_provider.cpython-314.pyc +0 -0
  464. package/onecode/models/providers/__pycache__/glm_provider.cpython-314.pyc +0 -0
  465. package/onecode/models/providers/__pycache__/minimax_provider.cpython-314.pyc +0 -0
  466. package/onecode/models/providers/__pycache__/minimaxi_provider.cpython-314.pyc +0 -0
  467. package/onecode/models/providers/__pycache__/ollama_provider.cpython-314.pyc +0 -0
  468. package/onecode/models/providers/__pycache__/openai_provider.cpython-314.pyc +0 -0
  469. package/onecode/models/providers/anthropic_provider.py +286 -0
  470. package/onecode/models/providers/deepseek_provider.py +221 -0
  471. package/onecode/models/providers/glm_provider.py +219 -0
  472. package/onecode/models/providers/minimax_provider.py +182 -0
  473. package/onecode/models/providers/minimaxi_provider.py +426 -0
  474. package/onecode/models/providers/ollama_provider.py +183 -0
  475. package/onecode/models/providers/openai_provider.py +234 -0
  476. package/onecode/models/registry.py +349 -0
  477. package/onecode/server/__init__.py +3 -0
  478. package/onecode/server/app.py +251 -0
  479. package/onecode/skills/__init__.py +11 -0
  480. package/onecode/skills/__pycache__/__init__.cpython-314.pyc +0 -0
  481. package/onecode/skills/__pycache__/argument_substitution.cpython-314.pyc +0 -0
  482. package/onecode/skills/__pycache__/bootstrap.cpython-314.pyc +0 -0
  483. package/onecode/skills/__pycache__/create.cpython-314.pyc +0 -0
  484. package/onecode/skills/__pycache__/frontmatter.cpython-314.pyc +0 -0
  485. package/onecode/skills/__pycache__/loader.cpython-314.pyc +0 -0
  486. package/onecode/skills/__pycache__/model.cpython-314.pyc +0 -0
  487. package/onecode/skills/argument_substitution.py +38 -0
  488. package/onecode/skills/bootstrap.py +37 -0
  489. package/onecode/skills/create.py +56 -0
  490. package/onecode/skills/frontmatter.py +33 -0
  491. package/onecode/skills/loader.py +215 -0
  492. package/onecode/skills/manager.py +75 -0
  493. package/onecode/skills/model.py +43 -0
  494. package/onecode/storage/__init__.py +0 -0
  495. package/onecode/storage/activity.py +63 -0
  496. package/onecode/storage/project.py +54 -0
  497. package/onecode/storage/session.py +112 -0
  498. package/onecode/tasks/__init__.py +26 -0
  499. package/onecode/tasks/manager.py +232 -0
  500. package/onecode/tasks/models.py +240 -0
  501. package/onecode/trace/__init__.py +0 -0
  502. package/onecode/trace/tracer.py +173 -0
  503. package/onecode/utils/__init__.py +0 -0
  504. package/onecode/utils/helpers.py +20 -0
  505. package/onecode/verification/__init__.py +5 -0
  506. package/onecode/verification/__pycache__/__init__.cpython-314.pyc +0 -0
  507. package/onecode/verification/__pycache__/aggregation.cpython-314.pyc +0 -0
  508. package/onecode/verification/__pycache__/loop.cpython-314.pyc +0 -0
  509. package/onecode/verification/__pycache__/policy.cpython-314.pyc +0 -0
  510. package/onecode/verification/aggregation.py +53 -0
  511. package/onecode/verification/gates/__init__.py +6 -0
  512. package/onecode/verification/gates/__pycache__/__init__.cpython-314.pyc +0 -0
  513. package/onecode/verification/gates/__pycache__/base.cpython-314.pyc +0 -0
  514. package/onecode/verification/gates/__pycache__/lint_gate.cpython-314.pyc +0 -0
  515. package/onecode/verification/gates/__pycache__/test_gate.cpython-314.pyc +0 -0
  516. package/onecode/verification/gates/__pycache__/type_gate.cpython-314.pyc +0 -0
  517. package/onecode/verification/gates/base.py +20 -0
  518. package/onecode/verification/gates/lint_gate.py +45 -0
  519. package/onecode/verification/gates/test_gate.py +62 -0
  520. package/onecode/verification/gates/type_gate.py +46 -0
  521. package/onecode/verification/loop.py +95 -0
  522. package/onecode/verification/policy.py +29 -0
  523. package/package.json +2 -9
  524. package/pyproject.toml +84 -0
  525. package/tui/__init__.py +46 -0
  526. package/tui/__main__.py +4 -0
  527. package/tui/__pycache__/__init__.cpython-314.pyc +0 -0
  528. package/tui/__pycache__/_loop.cpython-314.pyc +0 -0
  529. package/tui/__pycache__/_path_fuzzy_search.cpython-314.pyc +0 -0
  530. package/tui/__pycache__/_path_match.cpython-314.pyc +0 -0
  531. package/tui/__pycache__/agent.cpython-314.pyc +0 -0
  532. package/tui/__pycache__/agent_schema.cpython-314.pyc +0 -0
  533. package/tui/__pycache__/agents.cpython-314.pyc +0 -0
  534. package/tui/__pycache__/answer.cpython-314.pyc +0 -0
  535. package/tui/__pycache__/app.cpython-314.pyc +0 -0
  536. package/tui/__pycache__/atomic.cpython-314.pyc +0 -0
  537. package/tui/__pycache__/complete.cpython-314.pyc +0 -0
  538. package/tui/__pycache__/constants.cpython-314.pyc +0 -0
  539. package/tui/__pycache__/conversation_markdown.cpython-314.pyc +0 -0
  540. package/tui/__pycache__/db.cpython-314.pyc +0 -0
  541. package/tui/__pycache__/dec.cpython-314.pyc +0 -0
  542. package/tui/__pycache__/directory.cpython-314.pyc +0 -0
  543. package/tui/__pycache__/directory_watcher.cpython-314.pyc +0 -0
  544. package/tui/__pycache__/format_path.cpython-314.pyc +0 -0
  545. package/tui/__pycache__/fuzzy.cpython-314.pyc +0 -0
  546. package/tui/__pycache__/fuzzy_index.cpython-314.pyc +0 -0
  547. package/tui/__pycache__/history.cpython-314.pyc +0 -0
  548. package/tui/__pycache__/jsonrpc.cpython-314.pyc +0 -0
  549. package/tui/__pycache__/menus.cpython-314.pyc +0 -0
  550. package/tui/__pycache__/message_log.cpython-314.pyc +0 -0
  551. package/tui/__pycache__/messages.cpython-314.pyc +0 -0
  552. package/tui/__pycache__/path_complete.cpython-314.pyc +0 -0
  553. package/tui/__pycache__/path_filter.cpython-314.pyc +0 -0
  554. package/tui/__pycache__/paths.cpython-314.pyc +0 -0
  555. package/tui/__pycache__/pill.cpython-314.pyc +0 -0
  556. package/tui/__pycache__/platform_commands.cpython-314.pyc +0 -0
  557. package/tui/__pycache__/protocol.cpython-314.pyc +0 -0
  558. package/tui/__pycache__/session_tracker.cpython-314.pyc +0 -0
  559. package/tui/__pycache__/settings.cpython-314.pyc +0 -0
  560. package/tui/__pycache__/settings_schema.cpython-314.pyc +0 -0
  561. package/tui/__pycache__/shell.cpython-314.pyc +0 -0
  562. package/tui/__pycache__/shell_read.cpython-314.pyc +0 -0
  563. package/tui/__pycache__/slash_command.cpython-314.pyc +0 -0
  564. package/tui/__pycache__/version.cpython-314.pyc +0 -0
  565. package/tui/_loop.py +86 -0
  566. package/tui/_path_fuzzy_search.py +48 -0
  567. package/tui/_path_match.py +141 -0
  568. package/tui/about.py +95 -0
  569. package/tui/acp/__pycache__/agent.cpython-314.pyc +0 -0
  570. package/tui/acp/__pycache__/api.cpython-314.pyc +0 -0
  571. package/tui/acp/__pycache__/encode_tool_call_id.cpython-314.pyc +0 -0
  572. package/tui/acp/__pycache__/event_tap.cpython-314.pyc +0 -0
  573. package/tui/acp/__pycache__/messages.cpython-314.pyc +0 -0
  574. package/tui/acp/__pycache__/prompt.cpython-314.pyc +0 -0
  575. package/tui/acp/__pycache__/protocol.cpython-314.pyc +0 -0
  576. package/tui/acp/agent.py +1212 -0
  577. package/tui/acp/api.py +79 -0
  578. package/tui/acp/encode_tool_call_id.py +12 -0
  579. package/tui/acp/event_tap.py +107 -0
  580. package/tui/acp/messages.py +222 -0
  581. package/tui/acp/prompt.py +53 -0
  582. package/tui/acp/protocol.py +551 -0
  583. package/tui/agent.py +70 -0
  584. package/tui/agent_schema.py +76 -0
  585. package/tui/agents.py +46 -0
  586. package/tui/ansi/__init__.py +1 -0
  587. package/tui/ansi/__pycache__/__init__.cpython-314.pyc +0 -0
  588. package/tui/ansi/__pycache__/_ansi.cpython-314.pyc +0 -0
  589. package/tui/ansi/__pycache__/_ansi_colors.cpython-314.pyc +0 -0
  590. package/tui/ansi/__pycache__/_control_codes.cpython-314.pyc +0 -0
  591. package/tui/ansi/__pycache__/_keys.cpython-314.pyc +0 -0
  592. package/tui/ansi/__pycache__/_sgr_styles.cpython-314.pyc +0 -0
  593. package/tui/ansi/__pycache__/_stream_parser.cpython-314.pyc +0 -0
  594. package/tui/ansi/_ansi.py +1689 -0
  595. package/tui/ansi/_ansi_colors.py +264 -0
  596. package/tui/ansi/_control_codes.py +37 -0
  597. package/tui/ansi/_keys.py +251 -0
  598. package/tui/ansi/_sgr_styles.py +64 -0
  599. package/tui/ansi/_stream_parser.py +418 -0
  600. package/tui/answer.py +12 -0
  601. package/tui/app.py +1204 -0
  602. package/tui/atomic.py +37 -0
  603. package/tui/cli.py +208 -0
  604. package/tui/code_analyze.py +27 -0
  605. package/tui/complete.py +38 -0
  606. package/tui/constants.py +61 -0
  607. package/tui/conversation_markdown.py +30 -0
  608. package/tui/danger.py +372 -0
  609. package/tui/data/agents/ampcode.com.toml +52 -0
  610. package/tui/data/agents/augmentcode.com.toml +41 -0
  611. package/tui/data/agents/cdh.cloud-dev-harness.toml +23 -0
  612. package/tui/data/agents/claude.com.toml +42 -0
  613. package/tui/data/agents/copilot.github.com.toml +29 -0
  614. package/tui/data/agents/crowai.dev.toml +36 -0
  615. package/tui/data/agents/cursor.com.toml +38 -0
  616. package/tui/data/agents/deepagents.langchain.com +34 -0
  617. package/tui/data/agents/docker.com.toml +60 -0
  618. package/tui/data/agents/geminicli.com.toml +28 -0
  619. package/tui/data/agents/goose.ai.toml +52 -0
  620. package/tui/data/agents/inference.huggingface.co.toml +41 -0
  621. package/tui/data/agents/kimi.com.toml +35 -0
  622. package/tui/data/agents/kiro.dev.toml +43 -0
  623. package/tui/data/agents/onecode.dev.toml +22 -0
  624. package/tui/data/agents/openai.com.toml +53 -0
  625. package/tui/data/agents/openclaw.ai.toml +37 -0
  626. package/tui/data/agents/opencode.ai.toml +39 -0
  627. package/tui/data/agents/openhands.dev.toml +46 -0
  628. package/tui/data/agents/stakpak.dev.toml +62 -0
  629. package/tui/data/agents/vibe.mistral.ai.toml +31 -0
  630. package/tui/data/agents/vtcode.dev.toml +63 -0
  631. package/tui/data/images/frog.png +0 -0
  632. package/tui/data/sounds/question.wav +0 -0
  633. package/tui/data/sounds/turn-over.wav +0 -0
  634. package/tui/db.py +213 -0
  635. package/tui/dec.py +332 -0
  636. package/tui/diff_utils.py +131 -0
  637. package/tui/directory.py +234 -0
  638. package/tui/directory_suggester.py +93 -0
  639. package/tui/directory_watcher.py +231 -0
  640. package/tui/format_path.py +25 -0
  641. package/tui/fuzzy.py +140 -0
  642. package/tui/fuzzy_index.py +275 -0
  643. package/tui/gist.py +33 -0
  644. package/tui/history.py +138 -0
  645. package/tui/jsonrpc.py +599 -0
  646. package/tui/menus.py +14 -0
  647. package/tui/message_log.py +69 -0
  648. package/tui/messages.py +144 -0
  649. package/tui/option_content.py +51 -0
  650. package/tui/os.py +0 -0
  651. package/tui/path_complete.py +217 -0
  652. package/tui/path_filter.py +124 -0
  653. package/tui/paths.py +87 -0
  654. package/tui/pill.py +23 -0
  655. package/tui/platform_commands.py +52 -0
  656. package/tui/prompt/__pycache__/extract.cpython-314.pyc +0 -0
  657. package/tui/prompt/__pycache__/resource.cpython-314.pyc +0 -0
  658. package/tui/prompt/extract.py +19 -0
  659. package/tui/prompt/resource.py +68 -0
  660. package/tui/protocol.py +28 -0
  661. package/tui/screens/__init__.py +0 -0
  662. package/tui/screens/__pycache__/__init__.cpython-314.pyc +0 -0
  663. package/tui/screens/__pycache__/diff_screen.cpython-314.pyc +0 -0
  664. package/tui/screens/__pycache__/main.cpython-314.pyc +0 -0
  665. package/tui/screens/__pycache__/sessions.cpython-314.pyc +0 -0
  666. package/tui/screens/action_modal.py +94 -0
  667. package/tui/screens/agent_modal.py +175 -0
  668. package/tui/screens/command_edit_modal.py +74 -0
  669. package/tui/screens/diff_explorer_screen.py +419 -0
  670. package/tui/screens/diff_screen.py +84 -0
  671. package/tui/screens/ide_screen.py +461 -0
  672. package/tui/screens/main.py +397 -0
  673. package/tui/screens/main.tcss +662 -0
  674. package/tui/screens/permissions.py +404 -0
  675. package/tui/screens/permissions.tcss +72 -0
  676. package/tui/screens/projects.tcss +84 -0
  677. package/tui/screens/projects_app.py +341 -0
  678. package/tui/screens/projects_screen.py +277 -0
  679. package/tui/screens/session_resume_modal.py +172 -0
  680. package/tui/screens/session_resume_modal.tcss +35 -0
  681. package/tui/screens/sessions.py +168 -0
  682. package/tui/screens/sessions.tcss +119 -0
  683. package/tui/screens/settings.py +293 -0
  684. package/tui/screens/settings.tcss +113 -0
  685. package/tui/screens/store.py +502 -0
  686. package/tui/screens/store.tcss +274 -0
  687. package/tui/screens/tool_content_screen.py +59 -0
  688. package/tui/screens/trace.py +317 -0
  689. package/tui/session_tracker.py +123 -0
  690. package/tui/settings.py +353 -0
  691. package/tui/settings_schema.py +467 -0
  692. package/tui/shell.py +304 -0
  693. package/tui/shell_read.py +42 -0
  694. package/tui/slash_command.py +34 -0
  695. package/tui/tui.tcss +246 -0
  696. package/tui/twitter.py +38 -0
  697. package/tui/version.py +80 -0
  698. package/tui/visuals/__init__.py +0 -0
  699. package/tui/visuals/__pycache__/__init__.cpython-314.pyc +0 -0
  700. package/tui/visuals/__pycache__/columns.cpython-314.pyc +0 -0
  701. package/tui/visuals/columns.py +272 -0
  702. package/tui/widgets/__init__.py +0 -0
  703. package/tui/widgets/__pycache__/__init__.cpython-314.pyc +0 -0
  704. package/tui/widgets/__pycache__/agent_response.cpython-314.pyc +0 -0
  705. package/tui/widgets/__pycache__/agent_thought.cpython-314.pyc +0 -0
  706. package/tui/widgets/__pycache__/aidlc.cpython-314.pyc +0 -0
  707. package/tui/widgets/__pycache__/ask_user.cpython-314.pyc +0 -0
  708. package/tui/widgets/__pycache__/condensed_path.cpython-314.pyc +0 -0
  709. package/tui/widgets/__pycache__/context_stats.cpython-314.pyc +0 -0
  710. package/tui/widgets/__pycache__/conversation.cpython-314.pyc +0 -0
  711. package/tui/widgets/__pycache__/diff_view.cpython-314.pyc +0 -0
  712. package/tui/widgets/__pycache__/edit_field.cpython-314.pyc +0 -0
  713. package/tui/widgets/__pycache__/flash.cpython-314.pyc +0 -0
  714. package/tui/widgets/__pycache__/future_text.cpython-314.pyc +0 -0
  715. package/tui/widgets/__pycache__/grid_select.cpython-314.pyc +0 -0
  716. package/tui/widgets/__pycache__/highlighted_textarea.cpython-314.pyc +0 -0
  717. package/tui/widgets/__pycache__/load_more.cpython-314.pyc +0 -0
  718. package/tui/widgets/__pycache__/menu.cpython-314.pyc +0 -0
  719. package/tui/widgets/__pycache__/modified_files.cpython-314.pyc +0 -0
  720. package/tui/widgets/__pycache__/non_selectable_label.cpython-314.pyc +0 -0
  721. package/tui/widgets/__pycache__/note.cpython-314.pyc +0 -0
  722. package/tui/widgets/__pycache__/path_search.cpython-314.pyc +0 -0
  723. package/tui/widgets/__pycache__/pending_prompts.cpython-314.pyc +0 -0
  724. package/tui/widgets/__pycache__/plan.cpython-314.pyc +0 -0
  725. package/tui/widgets/__pycache__/project_directory_tree.cpython-314.pyc +0 -0
  726. package/tui/widgets/__pycache__/prompt.cpython-314.pyc +0 -0
  727. package/tui/widgets/__pycache__/question.cpython-314.pyc +0 -0
  728. package/tui/widgets/__pycache__/session_grid_select.cpython-314.pyc +0 -0
  729. package/tui/widgets/__pycache__/session_summary.cpython-314.pyc +0 -0
  730. package/tui/widgets/__pycache__/session_tabs.cpython-314.pyc +0 -0
  731. package/tui/widgets/__pycache__/shell_terminal.cpython-314.pyc +0 -0
  732. package/tui/widgets/__pycache__/side_bar.cpython-314.pyc +0 -0
  733. package/tui/widgets/__pycache__/slash_complete.cpython-314.pyc +0 -0
  734. package/tui/widgets/__pycache__/strike_text.cpython-314.pyc +0 -0
  735. package/tui/widgets/__pycache__/terminal.cpython-314.pyc +0 -0
  736. package/tui/widgets/__pycache__/throbber.cpython-314.pyc +0 -0
  737. package/tui/widgets/__pycache__/tool_call.cpython-314.pyc +0 -0
  738. package/tui/widgets/__pycache__/user_input.cpython-314.pyc +0 -0
  739. package/tui/widgets/acp_content.py +70 -0
  740. package/tui/widgets/agent_response.py +76 -0
  741. package/tui/widgets/agent_thought.py +167 -0
  742. package/tui/widgets/aidlc.py +334 -0
  743. package/tui/widgets/ask_user.py +604 -0
  744. package/tui/widgets/command_pane.py +223 -0
  745. package/tui/widgets/condensed_path.py +115 -0
  746. package/tui/widgets/context_stats.py +66 -0
  747. package/tui/widgets/conversation.py +3234 -0
  748. package/tui/widgets/danger_warning.py +65 -0
  749. package/tui/widgets/diff_view.py +69 -0
  750. package/tui/widgets/directory_input.py +8 -0
  751. package/tui/widgets/edit_field.py +206 -0
  752. package/tui/widgets/flash.py +81 -0
  753. package/tui/widgets/future_text.py +126 -0
  754. package/tui/widgets/grid_select.py +234 -0
  755. package/tui/widgets/highlighted_textarea.py +183 -0
  756. package/tui/widgets/load_more.py +24 -0
  757. package/tui/widgets/mandelbrot.py +294 -0
  758. package/tui/widgets/markdown_note.py +13 -0
  759. package/tui/widgets/menu.py +147 -0
  760. package/tui/widgets/model_status.py +230 -0
  761. package/tui/widgets/modified_files.py +315 -0
  762. package/tui/widgets/non_selectable_label.py +5 -0
  763. package/tui/widgets/note.py +18 -0
  764. package/tui/widgets/path_search.py +492 -0
  765. package/tui/widgets/pending_prompts.py +36 -0
  766. package/tui/widgets/plan.py +285 -0
  767. package/tui/widgets/project_directory_tree.py +102 -0
  768. package/tui/widgets/project_grid_select.py +68 -0
  769. package/tui/widgets/project_summary.py +33 -0
  770. package/tui/widgets/prompt.py +935 -0
  771. package/tui/widgets/question.py +360 -0
  772. package/tui/widgets/session_grid_select.py +230 -0
  773. package/tui/widgets/session_summary.py +115 -0
  774. package/tui/widgets/session_tabs.py +194 -0
  775. package/tui/widgets/shell_result.py +35 -0
  776. package/tui/widgets/shell_terminal.py +40 -0
  777. package/tui/widgets/side_bar.py +124 -0
  778. package/tui/widgets/slash_complete.py +235 -0
  779. package/tui/widgets/strike_text.py +70 -0
  780. package/tui/widgets/subagent.py +287 -0
  781. package/tui/widgets/subagent_screen.py +715 -0
  782. package/tui/widgets/terminal.py +576 -0
  783. package/tui/widgets/terminal_tool.py +360 -0
  784. package/tui/widgets/throbber.py +100 -0
  785. package/tui/widgets/tool_call.py +432 -0
  786. package/tui/widgets/user_input.py +23 -0
  787. package/tui/widgets/version.py +5 -0
  788. package/tui/widgets/welcome.py +31 -0
@@ -0,0 +1,918 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ from tui import platform_commands
6
+
7
+ if TYPE_CHECKING:
8
+ from tui.widgets.conversation import Conversation
9
+
10
+
11
+ _KNOWN_PROVIDERS = {
12
+ "anthropic": ["claude-3-opus", "claude-3-sonnet", "claude-3-haiku"],
13
+ "openai": ["gpt-4o", "gpt-4-turbo", "gpt-4o-mini"],
14
+ "deepseek": ["deepseek-chat", "deepseek-reasoner"],
15
+ "minimax": ["MiniMax-M2.7", "MiniMax-M2.5"],
16
+ "minimaxi": ["MiniMax-M2.7", "MiniMax-M2.5", "MiniMax-M3"],
17
+ "glm": ["glm-4-plus", "glm-4-flash"],
18
+ "ollama": [],
19
+ }
20
+
21
+
22
+ # ── small helpers ──────────────────────────────────────────────────────
23
+
24
+
25
+ def _load_cfg():
26
+ from onecode.config import load_config
27
+ return load_config()
28
+
29
+
30
+ def _save_cfg(cfg):
31
+ from onecode.config import save_config
32
+ save_config(cfg)
33
+
34
+
35
+ def _post_note(conversation, text):
36
+ from tui.widgets.markdown_note import MarkdownNote
37
+ return conversation.post(MarkdownNote(text))
38
+
39
+
40
+ async def _post(conversation, text):
41
+ await _post_note(conversation, text)
42
+
43
+
44
+ # ── status: one-shot snapshot of every onecode: setting ───────────────
45
+
46
+
47
+ async def _status(conversation: "Conversation", parameters: str) -> None:
48
+ """Render a single capability panel: provider, model, mode, skills, MCP."""
49
+ cfg = _load_cfg()
50
+ from onecode.skills.loader import SkillLoader
51
+ from onecode.mcp.manager import MCPManager
52
+
53
+ skills = SkillLoader().get_all()
54
+ enabled_skills = sorted(n for n, s in skills.items() if s.enabled)
55
+ disabled_skills = sorted(n for n, s in skills.items() if not s.enabled)
56
+
57
+ servers = MCPManager().list()
58
+ enabled_mcps = sorted(s["name"] for s in servers if s.get("enabled", True))
59
+ disabled_mcps = sorted(s["name"] for s in servers if not s.get("enabled", True))
60
+
61
+ lines = [
62
+ "**onecode — current state**\n",
63
+ f"- **provider**: `{cfg.default_provider}`",
64
+ f"- **model**: `{cfg.default_model}`",
65
+ f"- **mode**: `{cfg.default_mode}` (build | plan | solo)",
66
+ f"- **log level**: `{cfg.log_level}`",
67
+ f"- **skills**: {len(enabled_skills)} enabled, {len(disabled_skills)} disabled",
68
+ ]
69
+ if enabled_skills:
70
+ lines.append(f" - enabled: {', '.join(f'`{n}`' for n in enabled_skills)}")
71
+ if disabled_skills:
72
+ lines.append(f" - disabled: {', '.join(f'`{n}`' for n in disabled_skills)}")
73
+ lines.append(f"- **mcp servers**: {len(enabled_mcps)} enabled, {len(disabled_mcps)} disabled")
74
+ if enabled_mcps:
75
+ lines.append(f" - enabled: {', '.join(f'`{n}`' for n in enabled_mcps)}")
76
+ if disabled_mcps:
77
+ lines.append(f" - disabled: {', '.join(f'`{n}`' for n in disabled_mcps)}")
78
+
79
+ lines += [
80
+ "\n**What can I do here?**",
81
+ "- `/onecode:config` — open the TUI config editor",
82
+ "- `/onecode:provider [set <name|n>]` — show / change LLM provider",
83
+ "- `/onecode:model [set <name|n>]` — show / change LLM model",
84
+ "- `/onecode:skill list|enable|disable|add|remove [name]`",
85
+ "- `/onecode:mcp list|enable|disable|add|remove [name|url]`",
86
+ "- `/onecode:compact` — immediately compact context",
87
+ "- `/onecode:help` — show this overview",
88
+ ]
89
+ await _post(conversation, "\n".join(lines))
90
+
91
+
92
+ # ── provider ───────────────────────────────────────────────────────────
93
+
94
+
95
+ async def _provider(conversation: "Conversation", parameters: str) -> None:
96
+ cfg = _load_cfg()
97
+ args = parameters.strip().split()
98
+ sub = args[0].lower() if args else ""
99
+
100
+ if sub in ("", "show", "list"):
101
+ registered = sorted(_KNOWN_PROVIDERS.keys())
102
+ lines = [
103
+ "**LLM Provider**\n",
104
+ f"- current: `{cfg.default_provider}`",
105
+ f"- available ({len(registered)}):",
106
+ ]
107
+ for i, name in enumerate(registered, 1):
108
+ marker = " ← active" if name == cfg.default_provider else ""
109
+ models = _KNOWN_PROVIDERS[name]
110
+ model_hint = f" models: {', '.join(models)}" if models else " models: (any local)"
111
+ lines.append(f" `{i}) {name}`{marker}{model_hint}")
112
+ lines += [
113
+ "\n**How to switch**",
114
+ "- `/onecode:provider set <name>` — e.g. `set minimaxi`",
115
+ "- `/onecode:provider set <n>` — by number from the list above",
116
+ "\n*Tip:* the provider change applies to new sessions; the current session keeps the active model until you start a new conversation.",
117
+ ]
118
+ await _post(conversation, "\n".join(lines))
119
+ return
120
+
121
+ if sub == "set":
122
+ if len(args) < 2:
123
+ conversation.notify("Usage: /onecode:provider set <name|n>", title="/onecode:provider", severity="error")
124
+ return
125
+ target = args[1].strip()
126
+ registered = sorted(_KNOWN_PROVIDERS.keys())
127
+ if target.isdigit():
128
+ idx = int(target)
129
+ if 1 <= idx <= len(registered):
130
+ target = registered[idx - 1]
131
+ if target not in registered:
132
+ conversation.notify(
133
+ f"Unknown provider '{target}'. Use /onecode:provider to list available ones.",
134
+ title="/onecode:provider",
135
+ severity="error",
136
+ )
137
+ return
138
+ cfg.default_provider = target
139
+ _save_cfg(cfg)
140
+ try:
141
+ conversation.app.settings.set("provider", target)
142
+ except Exception:
143
+ pass
144
+ conversation.flash(f"onecode provider set to [b]{target}")
145
+ await _status(conversation, "")
146
+ return
147
+
148
+ await _post(conversation, _HELP_PROVIDER)
149
+
150
+
151
+ _HELP_PROVIDER = (
152
+ "**/onecode:provider** — show / switch the LLM provider\n\n"
153
+ "**Sub-commands**\n"
154
+ "- `(none)` or `show` — list registered providers with current marker\n"
155
+ "- `set <name>` — switch provider (name or list-number)\n\n"
156
+ "**Examples**\n"
157
+ "- `/onecode:provider` — show the picker\n"
158
+ "- `/onecode:provider set minimaxi` — switch by name\n"
159
+ "- `/onecode:provider set 3` — switch by list number"
160
+ )
161
+
162
+
163
+ # ── model ──────────────────────────────────────────────────────────────
164
+
165
+
166
+ async def _model(conversation: "Conversation", parameters: str) -> None:
167
+ cfg = _load_cfg()
168
+ args = parameters.strip().split()
169
+ sub = args[0].lower() if args else ""
170
+
171
+ provider = cfg.default_provider
172
+ known = _KNOWN_PROVIDERS.get(provider, [])
173
+
174
+ if sub in ("", "show", "list"):
175
+ lines = [
176
+ "**LLM Model**\n",
177
+ f"- provider: `{provider}`",
178
+ f"- current: `{cfg.default_model}`",
179
+ ]
180
+ if known:
181
+ lines.append(f"- known models for `{provider}` ({len(known)}):")
182
+ for i, name in enumerate(known, 1):
183
+ marker = " ← active" if name == cfg.default_model else ""
184
+ lines.append(f" `{i}) {name}`{marker}")
185
+ else:
186
+ lines.append("- *(no preset list — type any model name)*")
187
+ lines += [
188
+ "\n**How to switch**",
189
+ "- `/onecode:model set <name>` — e.g. `set MiniMax-M2.7`",
190
+ "- `/onecode:model set <n>` — by number from the list above",
191
+ "- `/onecode:model set <any-string>` — for providers without a preset",
192
+ "\n*Tip:* changing the model mid-session does not retroactively update the active request; new turns will use the new model.",
193
+ ]
194
+ await _post(conversation, "\n".join(lines))
195
+ return
196
+
197
+ if sub == "set":
198
+ if len(args) < 2:
199
+ conversation.notify("Usage: /onecode:model set <name|n>", title="/onecode:model", severity="error")
200
+ return
201
+ target = args[1].strip()
202
+ if target.isdigit() and known:
203
+ idx = int(target)
204
+ if 1 <= idx <= len(known):
205
+ target = known[idx - 1]
206
+ if not target:
207
+ conversation.notify("Model name required", title="/onecode:model", severity="error")
208
+ return
209
+ cfg.default_model = target
210
+ _save_cfg(cfg)
211
+ try:
212
+ conversation.app.settings.set("model", target)
213
+ except Exception:
214
+ pass
215
+ conversation.flash(f"onecode model set to [b]{target}")
216
+ await _status(conversation, "")
217
+ return
218
+
219
+ await _post(conversation, _HELP_MODEL)
220
+
221
+
222
+ _HELP_MODEL = (
223
+ "**/onecode:model** — show / switch the LLM model\n\n"
224
+ "**Sub-commands**\n"
225
+ "- `(none)` or `show` — list known models for the current provider\n"
226
+ "- `set <name>` — switch model (name or list-number)\n\n"
227
+ "**Examples**\n"
228
+ "- `/onecode:model` — show the picker for the current provider\n"
229
+ "- `/onecode:model set MiniMax-M2.7` — switch by name\n"
230
+ "- `/onecode:model set 1` — switch by list number"
231
+ )
232
+
233
+
234
+ # ── skill ──────────────────────────────────────────────────────────────
235
+
236
+
237
+ async def _skill(conversation: "Conversation", parameters: str) -> None:
238
+ from onecode.skills.manager import SkillManager
239
+ from onecode.skills.loader import SkillLoader
240
+ from onecode.skills.create import create_skill_scaffold
241
+
242
+ parts = parameters.strip().split()
243
+ sub = parts[0].lower() if parts else ""
244
+ rest = " ".join(parts[1:]) if len(parts) > 1 else ""
245
+
246
+ if sub in ("", "list", "show"):
247
+ skills = SkillLoader().get_all()
248
+ if not skills:
249
+ await _post(conversation, "**Skills**\n\n_No skills installed._\n\nUse `/onecode:skill add <name>` to scaffold a new one.")
250
+ return
251
+ lines = ["**Skills**\n"]
252
+ names = sorted(skills.keys())
253
+ for i, name in enumerate(names, 1):
254
+ s = skills[name]
255
+ marker = "✓" if s.enabled else "✗"
256
+ desc = s.description or "(no description)"
257
+ lines.append(f"- `{i}) {marker}` **{name}** — {desc}")
258
+ lines += [
259
+ "\n**How to manage**",
260
+ "- `/onecode:skill enable <name|n>` — turn on",
261
+ "- `/onecode:skill disable <name|n>` — turn off",
262
+ "- `/onecode:skill add <name>` — scaffold a new skill",
263
+ "- `/onecode:skill remove <name|n>` — delete a skill",
264
+ ]
265
+ await _post(conversation, "\n".join(lines))
266
+ return
267
+
268
+ if sub == "enable" or sub == "disable":
269
+ if not rest.strip():
270
+ conversation.notify(f"Usage: /onecode:skill {sub} <name|n>", title=f"/onecode:skill {sub}", severity="error")
271
+ return
272
+ target = _resolve_indexed_name(conversation, rest.strip(), SkillLoader().get_all(), sub)
273
+ if target is None:
274
+ return
275
+ mgr = SkillManager()
276
+ mgr.enable(target, sub == "enable")
277
+ conversation.flash(f"skill [b]{target}[/b] {sub}d")
278
+ await _skill(conversation, "list")
279
+ return
280
+
281
+ if sub == "add":
282
+ name = rest.strip()
283
+ if not name:
284
+ conversation.notify("Usage: /onecode:skill add <name>", title="/onecode:skill add", severity="error")
285
+ return
286
+ mgr = SkillManager()
287
+ if mgr.get(name):
288
+ conversation.notify(f"Skill '{name}' already exists", title="/onecode:skill add", severity="error")
289
+ return
290
+ err = create_skill_scaffold(mgr.skills_dir, name, f"A skill for {name}")
291
+ if err:
292
+ conversation.notify(f"Error: {err}", title="/onecode:skill add", severity="error")
293
+ return
294
+ await _post(
295
+ conversation,
296
+ f"**Skill '{name}' created**\n\n"
297
+ f"- location: `{mgr.skills_dir / name}`\n"
298
+ f"- edit `SKILL.md` to add instructions\n"
299
+ f"- then `/onecode:skill list` to confirm it shows up",
300
+ )
301
+ return
302
+
303
+ if sub == "remove":
304
+ if not rest.strip():
305
+ conversation.notify("Usage: /onecode:skill remove <name|n>", title="/onecode:skill remove", severity="error")
306
+ return
307
+ target = _resolve_indexed_name(conversation, rest.strip(), SkillLoader().get_all(), sub)
308
+ if target is None:
309
+ return
310
+ SkillManager().remove(target)
311
+ conversation.flash(f"skill [b]{target}[/b] removed")
312
+ await _skill(conversation, "list")
313
+ return
314
+
315
+ if sub == "create":
316
+ name = rest.strip()
317
+ if not name:
318
+ conversation.notify("Usage: /onecode:skill create <name>", title="/onecode:skill create", severity="error")
319
+ return
320
+ from onecode.skills.model import Skill as SkillModel
321
+ valid, err_msg = SkillModel.validate_name(name)
322
+ if not valid:
323
+ conversation.notify(f"Invalid name: {err_msg}", title="/onecode:skill create", severity="error")
324
+ return
325
+ mgr = SkillManager()
326
+ if mgr.get(name):
327
+ conversation.notify(f"Skill '{name}' already exists", title="/onecode:skill create", severity="error")
328
+ return
329
+ err = create_skill_scaffold(mgr.skills_dir, name, f"A skill for {name}")
330
+ if err:
331
+ conversation.notify(f"Error: {err}", title="/onecode:skill create", severity="error")
332
+ return
333
+ await _post(
334
+ conversation,
335
+ f"**Skill '{name}' created**\n\n"
336
+ f"- location: `{mgr.skills_dir / name}`\n"
337
+ f"- edit `SKILL.md` to add instructions\n"
338
+ f"- then `/onecode:skill list` to confirm",
339
+ )
340
+ return
341
+
342
+ if sub in ("search", "find"):
343
+ keyword = rest.strip()
344
+ if not keyword:
345
+ conversation.notify("Usage: /onecode:skill search <keyword>", title="/onecode:skill search", severity="error")
346
+ return
347
+ results = SkillLoader().search(keyword)
348
+ if not results:
349
+ await _post(conversation, f"**Skill Search: `{keyword}`**\n\n_No matches found._")
350
+ return
351
+ lines = [f"**Skill Search: `{keyword}`**\n"]
352
+ for i, s in enumerate(results, 1):
353
+ marker = "✓" if s.enabled else "✗"
354
+ desc = s.description or "(no description)"
355
+ lines.append(f"- `{i}) {marker}` **{s.name}** — {desc}")
356
+ lines.append(f"\n{len(results)} match(es)")
357
+ await _post(conversation, "\n".join(lines))
358
+ return
359
+
360
+ await _post(conversation, _HELP_SKILL)
361
+
362
+
363
+ _HELP_SKILL = (
364
+ "**/onecode:skill** — manage installed skills\n\n"
365
+ "**Sub-commands**\n"
366
+ "- `(none)` or `list` — show all skills with status\n"
367
+ "- `create <name>` — scaffold a new skill\n"
368
+ "- `search <keyword>` — search skills by keyword\n"
369
+ "- `enable <name|n>` — turn a skill on\n"
370
+ "- `disable <name|n>` — turn a skill off\n"
371
+ "- `add <name>` — scaffold a new skill (alias for create)\n"
372
+ "- `remove <name|n>` — delete a skill\n\n"
373
+ "**Examples**\n"
374
+ "- `/onecode:skill` — list\n"
375
+ "- `/onecode:skill create my-skill` — scaffold a new skill\n"
376
+ "- `/onecode:skill search browser` — find browser-related skills\n"
377
+ "- `/onecode:skill enable 2` — enable the skill at index 2"
378
+ )
379
+
380
+
381
+ # ── mcp ────────────────────────────────────────────────────────────────
382
+
383
+
384
+ async def _mcp(conversation: "Conversation", parameters: str) -> None:
385
+ from onecode.mcp.manager import MCPManager
386
+
387
+ parts = parameters.strip().split()
388
+ sub = parts[0].lower() if parts else ""
389
+ rest = " ".join(parts[1:]) if len(parts) > 1 else ""
390
+
391
+ if sub in ("", "list", "show"):
392
+ servers = MCPManager().list()
393
+ if not servers:
394
+ await _post(
395
+ conversation,
396
+ "**MCP Servers**\n\n_None configured._\n\n"
397
+ "Use `/onecode:mcp add <name> <url>` for an SSE server, "
398
+ "`/onecode:mcp add <name> --type stdio --command <cmd>` for stdio, or "
399
+ "`/onecode:mcp add <name> --type http --url <url>` for HTTP.",
400
+ )
401
+ return
402
+ lines = ["**MCP Servers**\n"]
403
+ for i, s in enumerate(servers, 1):
404
+ name = s.get("name", "?")
405
+ transport = s.get("transport", "sse")
406
+ enabled = s.get("enabled", True)
407
+ marker = "✓" if enabled else "✗"
408
+ if transport == "sse":
409
+ lines.append(f"- `{i}) {marker}` **{name}** (SSE) — `{s.get('url', '')}`")
410
+ elif transport == "http":
411
+ url = s.get("url", "")
412
+ headers = s.get("headers", {})
413
+ line = f"- `{i}) {marker}` **{name}** (HTTP) — `{url}`"
414
+ if headers:
415
+ line += f" headers: {', '.join(headers.keys())}"
416
+ lines.append(line)
417
+ else:
418
+ cmd = s.get("command", "")
419
+ cmd_args = " ".join(s.get("args") or [])
420
+ env = s.get("env", {})
421
+ line = f"- `{i}) {marker}` **{name}** (stdio) — `{cmd} {cmd_args}`".rstrip()
422
+ if env:
423
+ line += f" env: {', '.join(env.keys())}"
424
+ lines.append(line)
425
+ lines += [
426
+ "\n**How to manage**",
427
+ "- `/onecode:mcp enable <name|n>`",
428
+ "- `/onecode:mcp disable <name|n>`",
429
+ "- `/onecode:mcp remove <name|n>`",
430
+ ]
431
+ await _post(conversation, "\n".join(lines))
432
+ return
433
+
434
+ if sub == "enable" or sub == "disable":
435
+ if not rest.strip():
436
+ conversation.notify(f"Usage: /onecode:mcp {sub} <name|n>", title=f"/onecode:mcp {sub}", severity="error")
437
+ return
438
+ mgr = MCPManager()
439
+ target = _resolve_indexed_name(conversation, rest.strip(), {s["name"]: s for s in mgr.list()}, sub)
440
+ if target is None:
441
+ return
442
+ err = mgr.enable(target, sub == "enable")
443
+ if err:
444
+ conversation.notify(f"Error: {err}", title=f"/onecode:mcp {sub}", severity="error")
445
+ return
446
+ conversation.flash(f"mcp server [b]{target}[/b] {sub}d")
447
+ await _mcp(conversation, "list")
448
+ return
449
+
450
+ if sub == "add":
451
+ parts_shlex = rest.split()
452
+ if len(parts_shlex) < 2:
453
+ await _post(
454
+ conversation,
455
+ "**/onecode:mcp add** — register a new MCP server\n\n"
456
+ "- **SSE** (default): `/onecode:mcp add <name> <url>`\n"
457
+ "- **stdio**: `/onecode:mcp add <name> --type stdio --command <cmd> --args a,b --env K=V`\n"
458
+ "- **HTTP**: `/onecode:mcp add <name> --type http --url <url> --headers K=V`",
459
+ )
460
+ return
461
+ name = parts_shlex[0]
462
+ pos_url = parts_shlex[1] if not parts_shlex[1].startswith("--") else ""
463
+
464
+ transport = "sse"
465
+ command = ""
466
+ cmd_args = []
467
+ env_dict = {}
468
+ headers_dict = {}
469
+ explicit_url = ""
470
+
471
+ i = 1
472
+ while i < len(parts_shlex):
473
+ tok = parts_shlex[i]
474
+ if tok == "--type" and i + 1 < len(parts_shlex):
475
+ transport = parts_shlex[i + 1]
476
+ i += 2
477
+ elif tok == "--command" and i + 1 < len(parts_shlex):
478
+ command = parts_shlex[i + 1]
479
+ i += 2
480
+ elif tok == "--args" and i + 1 < len(parts_shlex):
481
+ cmd_args = [a.strip() for a in parts_shlex[i + 1].split(",")]
482
+ i += 2
483
+ elif tok == "--env" and i + 1 < len(parts_shlex):
484
+ for pair in parts_shlex[i + 1].split(","):
485
+ if "=" in pair:
486
+ k, _, v = pair.partition("=")
487
+ env_dict[k.strip()] = v.strip()
488
+ i += 2
489
+ elif tok == "--url" and i + 1 < len(parts_shlex):
490
+ explicit_url = parts_shlex[i + 1]
491
+ i += 2
492
+ elif tok == "--headers" and i + 1 < len(parts_shlex):
493
+ for pair in parts_shlex[i + 1].split(","):
494
+ if "=" in pair:
495
+ k, _, v = pair.partition("=")
496
+ headers_dict[k.strip()] = v.strip()
497
+ i += 2
498
+ else:
499
+ i += 1
500
+
501
+ mgr = MCPManager()
502
+ if mgr.get(name):
503
+ conversation.notify(f"MCP server '{name}' already exists", title="/onecode:mcp add", severity="error")
504
+ return
505
+
506
+ final_url = explicit_url or pos_url
507
+
508
+ if transport == "http":
509
+ if not final_url:
510
+ conversation.notify("Error: --url required for http transport", title="/onecode:mcp add", severity="error")
511
+ return
512
+ mgr.add_http(name, final_url, headers=headers_dict)
513
+ await _post(conversation, f"**MCP Server '{name}' added**\n\n- transport: HTTP\n- URL: `{final_url}`\n\nUse `/onecode:mcp list` to confirm.")
514
+ elif transport == "stdio":
515
+ if not command:
516
+ conversation.notify("Error: --command required for stdio transport", title="/onecode:mcp add", severity="error")
517
+ return
518
+ mgr.add_stdio(name, command, args=cmd_args, env=env_dict)
519
+ await _post(conversation, f"**MCP Server '{name}' added**\n\n- transport: stdio\n- command: `{command}`\n\nUse `/onecode:mcp list` to confirm.")
520
+ else:
521
+ if not final_url:
522
+ conversation.notify("Error: URL is required for SSE transport", title="/onecode:mcp add", severity="error")
523
+ return
524
+ mgr.add(name, final_url, transport="sse")
525
+ await _post(conversation, f"**MCP Server '{name}' added**\n\n- transport: SSE\n- URL: `{final_url}`\n\nUse `/onecode:mcp list` to confirm.")
526
+ return
527
+
528
+ if sub == "remove":
529
+ if not rest.strip():
530
+ conversation.notify("Usage: /onecode:mcp remove <name|n>", title="/onecode:mcp remove", severity="error")
531
+ return
532
+ mgr = MCPManager()
533
+ target = _resolve_indexed_name(conversation, rest.strip(), {s["name"]: s for s in mgr.list()}, sub)
534
+ if target is None:
535
+ return
536
+ mgr.remove(target)
537
+ conversation.flash(f"mcp server [b]{target}[/b] removed")
538
+ await _mcp(conversation, "list")
539
+ return
540
+
541
+ await _post(conversation, _HELP_MCP)
542
+
543
+
544
+ _HELP_MCP = (
545
+ "**/onecode:mcp** — manage MCP (Model Context Protocol) servers\n\n"
546
+ "**Sub-commands**\n"
547
+ "- `(none)` or `list` — show configured servers\n"
548
+ "- `add <name> <url>` — add an SSE server (default)\n"
549
+ "- `add <name> --type stdio --command <cmd> [--args a,b] [--env K=V]` — stdio\n"
550
+ "- `add <name> --type http --url <url> [--headers K=V]` — HTTP\n"
551
+ "- `enable <name|n>` / `disable <name|n>`\n"
552
+ "- `remove <name|n>`\n\n"
553
+ "**Examples**\n"
554
+ "- `/onecode:mcp` — list servers\n"
555
+ "- `/onecode:mcp add my-server https://example.com/mcp` — SSE\n"
556
+ "- `/onecode:mcp add cloudbase --type stdio --command npx --args @cloudbase/cloudbase-mcp@latest --env TENCENTCLOUD_SECRETID=xxx,TENCENTCLOUD_SECRETKEY=xxx` — stdio\n"
557
+ "- `/onecode:mcp add cloudbase --type http --url https://tcb-api.cloud.tencent.com/mcp/v1?env_id=xxx --headers X-TencentCloud-SecretId=xxx` — HTTP\n"
558
+ "- `/onecode:mcp disable 1` — disable the first server in the list"
559
+ )
560
+
561
+
562
+ # ── helpers ────────────────────────────────────────────────────────────
563
+
564
+
565
+ def _resolve_indexed_name(conversation, raw, items, sub_label):
566
+ """Accept either a literal name or a 1-based index from the most recent list.
567
+
568
+ ``items`` is either a ``dict[name, ...]`` (skills) or already indexed
569
+ by name (MCP). Returns the resolved name or ``None`` after notifying
570
+ the user on error.
571
+ """
572
+ raw = (raw or "").strip()
573
+ if not raw:
574
+ return None
575
+ keys = list(items.keys())
576
+ if raw.isdigit():
577
+ idx = int(raw)
578
+ if 1 <= idx <= len(keys):
579
+ return keys[idx - 1]
580
+ conversation.notify(
581
+ f"Index {idx} out of range (1..{len(keys)}). Run `/onecode:{sub_label}` first to see numbers.",
582
+ title=f"/onecode:{sub_label}",
583
+ severity="error",
584
+ )
585
+ return None
586
+ if raw in items:
587
+ return raw
588
+ conversation.notify(
589
+ f"Unknown name '{raw}'. Run `/onecode:{sub_label}` first to see available names.",
590
+ title=f"/onecode:{sub_label}",
591
+ severity="error",
592
+ )
593
+ return None
594
+
595
+
596
+ # ── compact ─────────────────────────────────────────────────────────────
597
+
598
+
599
+ async def _compact(conversation: "Conversation", parameters: str) -> None:
600
+ """Immediately compact the agent context to reduce token usage."""
601
+ agent = conversation.agent
602
+ if agent is None:
603
+ conversation.notify("No active agent session", title="/onecode:compact", severity="error")
604
+ return
605
+ if not hasattr(agent, "compact"):
606
+ conversation.notify("Agent does not support context compaction", title="/onecode:compact", severity="error")
607
+ return
608
+ try:
609
+ result = await agent.compact()
610
+ if result is None:
611
+ conversation.notify("Compaction not available", title="/onecode:compact", severity="error")
612
+ return
613
+ await _post(
614
+ conversation,
615
+ f"**Context Compacted**\n"
616
+ f"- level: `{result.get('level', 'unknown')}`\n"
617
+ f"- tokens: `{result.get('tokens_before', 0)}` → `{result.get('tokens_after', 0)}`",
618
+ )
619
+ except Exception as e:
620
+ conversation.notify(f"Compaction failed: {e}", title="/onecode:compact", severity="error")
621
+
622
+
623
+ # ── config ─────────────────────────────────────────────────────────────
624
+
625
+
626
+ def _mask_api_key(v: str | None) -> str:
627
+ if not v:
628
+ return "(not set)"
629
+ if v.startswith("${") and v.endswith("}"):
630
+ return f"{v} (env ref)"
631
+ if len(v) <= 4:
632
+ return "***"
633
+ return v[:4] + "***" + v[-4:]
634
+
635
+
636
+ async def _config(conversation: "Conversation", parameters: str) -> None:
637
+ cfg = _load_cfg()
638
+ parts = parameters.strip().split()
639
+ sub = parts[0].lower() if parts else ""
640
+ rest = " ".join(parts[1:]) if len(parts) > 1 else ""
641
+
642
+ if sub in ("", "tui", "screen", "edit"):
643
+ conversation.app.push_screen("config")
644
+ return
645
+
646
+ if sub == "list":
647
+ import yaml
648
+ from onecode.config import _dataclass_to_dict
649
+ raw = _dataclass_to_dict(cfg)
650
+ for pid, pcfg in raw.get("providers", {}).items():
651
+ if pcfg.get("api_key"):
652
+ pcfg["api_key"] = _mask_api_key(pcfg["api_key"])
653
+ await _post(conversation, "**onecode config**\n\n```yaml\n" + yaml.dump(raw, default_flow_style=False) + "```")
654
+ return
655
+
656
+ if sub == "mode":
657
+ mode_parts = rest.strip().split()
658
+ mode_sub = mode_parts[0].lower() if mode_parts else ""
659
+ if mode_sub == "get" or mode_sub == "":
660
+ await _post(conversation, f"**mode** = `{cfg.default_mode}` (build | plan | solo)")
661
+ return
662
+ if mode_sub == "set":
663
+ if len(mode_parts) < 2:
664
+ conversation.notify("Usage: /onecode:config mode set <build|plan|solo>", title="/onecode:config mode set", severity="error")
665
+ return
666
+ value = mode_parts[1]
667
+ if value not in ("build", "plan", "solo"):
668
+ conversation.notify("Mode must be one of: build, plan, solo", title="/onecode:config mode set", severity="error")
669
+ return
670
+ cfg.default_mode = value
671
+ _save_cfg(cfg)
672
+ conversation.flash(f"onecode mode set to [b]{value}")
673
+ return
674
+ await _post(conversation, _HELP_CONFIG)
675
+ return
676
+
677
+ if sub == "model":
678
+ model_parts = rest.strip().split()
679
+ model_sub = model_parts[0].lower() if model_parts else ""
680
+ if model_sub == "get" or model_sub == "":
681
+ await _post(conversation, f"**model** = `{cfg.default_model}`")
682
+ return
683
+ if model_sub == "set":
684
+ if len(model_parts) < 2:
685
+ conversation.notify("Usage: /onecode:config model set <model-name>", title="/onecode:config model set", severity="error")
686
+ return
687
+ value = model_parts[1]
688
+ cfg.default_model = value
689
+ _save_cfg(cfg)
690
+ conversation.flash(f"onecode model set to [b]{value}")
691
+ return
692
+ await _post(conversation, _HELP_CONFIG)
693
+ return
694
+
695
+ if sub == "provider":
696
+ prov_parts = rest.strip().split()
697
+ prov_sub = prov_parts[0].lower() if prov_parts else ""
698
+ prov_rest = " ".join(prov_parts[1:]) if len(prov_parts) > 1 else ""
699
+
700
+ if prov_sub in ("", "get"):
701
+ await _post(conversation, f"**provider** = `{cfg.default_provider}`")
702
+ return
703
+
704
+ if prov_sub == "set":
705
+ if not prov_rest:
706
+ conversation.notify("Usage: /onecode:config provider set <name>", title="/onecode:config provider set", severity="error")
707
+ return
708
+ cfg.default_provider = prov_rest
709
+ _save_cfg(cfg)
710
+ conversation.flash(f"onecode provider set to [b]{prov_rest}")
711
+ return
712
+
713
+ if prov_sub == "list":
714
+ from onecode.models.provider import ProviderRegistry
715
+ from onecode.models.registry import ModelRegistry
716
+ try:
717
+ from onecode.models import providers as _ # noqa: F401
718
+ except ImportError:
719
+ pass
720
+ try:
721
+ ModelRegistry.initialize()
722
+ except Exception:
723
+ pass
724
+ registered = sorted(ProviderRegistry.list())
725
+ current = cfg.default_provider
726
+ lines = [f"**Available providers** ({len(registered)}):\n"]
727
+ for i, name in enumerate(registered, 1):
728
+ marker = " ← active" if name == current else ""
729
+ try:
730
+ models = ModelRegistry.list_by_provider(name)
731
+ except Exception:
732
+ models = []
733
+ if models:
734
+ model_names = sorted({m.id for m in models})
735
+ shown = ", ".join(model_names[:5])
736
+ if len(model_names) > 5:
737
+ shown += f", … (+{len(model_names) - 5})"
738
+ model_hint = f" models: {shown}"
739
+ else:
740
+ model_hint = " models: (any local)"
741
+ lines.append(f" `{i}) {name}`{marker}{model_hint}")
742
+ lines.append("\n*Switch with: `/onecode:config provider set <name>`*")
743
+ await _post(conversation, "\n".join(lines))
744
+ return
745
+
746
+ if prov_sub in ("api-key", "apikey", "key"):
747
+ key_parts = prov_rest.strip().split()
748
+ key_sub = key_parts[0].lower() if key_parts else ""
749
+ key_rest = " ".join(key_parts[1:]) if len(key_parts) > 1 else ""
750
+
751
+ if key_sub == "get":
752
+ if not key_rest:
753
+ conversation.notify("Usage: /onecode:config provider api-key get <provider>", title="/onecode:config provider api-key get", severity="error")
754
+ return
755
+ pcfg = cfg.providers.get(key_rest)
756
+ if pcfg:
757
+ await _post(conversation, f"**{key_rest} api-key** = `{_mask_api_key(pcfg.api_key)}`")
758
+ else:
759
+ await _post(conversation, f"**{key_rest} api-key** = `(not configured)`")
760
+ return
761
+
762
+ if key_sub == "set":
763
+ if len(key_parts) < 3:
764
+ conversation.notify("Usage: /onecode:config provider api-key set <provider> <key>", title="/onecode:config provider api-key set", severity="error")
765
+ return
766
+ provider_id = key_parts[1]
767
+ key_value = key_parts[2]
768
+ if provider_id not in cfg.providers:
769
+ from onecode.config import ProviderConfig
770
+ cfg.providers[provider_id] = ProviderConfig()
771
+ cfg.providers[provider_id].api_key = key_value
772
+ _save_cfg(cfg)
773
+ conversation.flash(f"onecode {provider_id} api-key set")
774
+ return
775
+
776
+ await _post(conversation, _HELP_CONFIG)
777
+ return
778
+
779
+ if prov_sub == "endpoint":
780
+ ep_parts = prov_rest.strip().split()
781
+ ep_sub = ep_parts[0].lower() if ep_parts else ""
782
+ ep_rest = " ".join(ep_parts[1:]) if len(ep_parts) > 1 else ""
783
+
784
+ if ep_sub == "get":
785
+ if not ep_rest:
786
+ conversation.notify("Usage: /onecode:config provider endpoint get <provider>", title="/onecode:config provider endpoint get", severity="error")
787
+ return
788
+ pcfg = cfg.providers.get(ep_rest)
789
+ if pcfg:
790
+ ep = pcfg.endpoint or "(default)"
791
+ await _post(conversation, f"**{ep_rest} endpoint** = `{ep}`")
792
+ else:
793
+ await _post(conversation, f"**{ep_rest} endpoint** = `(not configured)`")
794
+ return
795
+
796
+ if ep_sub == "set":
797
+ if len(ep_parts) < 3:
798
+ conversation.notify("Usage: /onecode:config provider endpoint set <provider> <url>", title="/onecode:config provider endpoint set", severity="error")
799
+ return
800
+ provider_id = ep_parts[1]
801
+ ep_value = ep_parts[2]
802
+ if provider_id not in cfg.providers:
803
+ from onecode.config import ProviderConfig
804
+ cfg.providers[provider_id] = ProviderConfig()
805
+ cfg.providers[provider_id].endpoint = ep_value
806
+ _save_cfg(cfg)
807
+ conversation.flash(f"onecode {provider_id} endpoint set")
808
+ return
809
+
810
+ await _post(conversation, _HELP_CONFIG)
811
+ return
812
+
813
+ await _post(conversation, _HELP_CONFIG)
814
+ return
815
+
816
+ if sub == "log-level":
817
+ ll_parts = rest.strip().split()
818
+ ll_sub = ll_parts[0].lower() if ll_parts else ""
819
+ if ll_sub == "get" or ll_sub == "":
820
+ await _post(conversation, f"**log-level** = `{cfg.log_level}` (debug | info | warn | error)")
821
+ return
822
+ if ll_sub == "set":
823
+ if len(ll_parts) < 2:
824
+ conversation.notify("Usage: /onecode:config log-level set <debug|info|warn|error>", title="/onecode:config log-level set", severity="error")
825
+ return
826
+ value = ll_parts[1]
827
+ if value not in ("debug", "info", "warn", "error"):
828
+ conversation.notify("Log level must be one of: debug, info, warn, error", title="/onecode:config log-level set", severity="error")
829
+ return
830
+ cfg.log_level = value
831
+ _save_cfg(cfg)
832
+ conversation.flash(f"onecode log-level set to [b]{value}")
833
+ return
834
+ await _post(conversation, _HELP_CONFIG)
835
+ return
836
+
837
+ await _post(conversation, _HELP_CONFIG)
838
+
839
+
840
+ _HELP_CONFIG = (
841
+ "**/onecode:config** — manage onecode configuration\n\n"
842
+ "**Sub-commands**\n"
843
+ "- `(none)` or `tui` — open the TUI config editor\n"
844
+ "- `list` — show full YAML configuration (api-key masked)\n"
845
+ "- `mode get|set <build|plan|solo>`\n"
846
+ "- `model get|set <model-name>`\n"
847
+ "- `provider get|set <name>` — get/set default provider\n"
848
+ "- `provider list` — list all available providers\n"
849
+ "- `provider api-key get|set <provider> <key>` — manage provider api-key\n"
850
+ "- `provider endpoint get|set <provider> <url>` — manage provider endpoint\n"
851
+ "- `log-level get|set <debug|info|warn|error>`\n\n"
852
+ "**Examples**\n"
853
+ "- `/onecode:config` — open config editor\n"
854
+ "- `/onecode:config list` — show full config\n"
855
+ "- `/onecode:config mode set solo`\n"
856
+ "- `/onecode:config provider api-key set openai sk-xxx`\n"
857
+ "- `/onecode:config provider endpoint set openai https://api.openai.com/v1`"
858
+ )
859
+
860
+
861
+ # ── registration ──────────────────────────────────────────────────────
862
+
863
+
864
+ def register_commands() -> None:
865
+ """Register the slash commands exposed to the TUI prompt.
866
+
867
+ The help text intentionally covers both **what** the command does and
868
+ **how** to invoke it (sub-command + index syntax), so the
869
+ autocomplete panel is self-documenting.
870
+ """
871
+ platform_commands.register(
872
+ "help",
873
+ "Show onecode: command overview and current state",
874
+ _status,
875
+ "(no args)",
876
+ )
877
+ platform_commands.register(
878
+ "status",
879
+ "Show current provider, model, mode, skills, and MCP servers",
880
+ _status,
881
+ "(no args)",
882
+ )
883
+ platform_commands.register(
884
+ "provider",
885
+ "Show / switch the LLM provider (current + numbered list)",
886
+ _provider,
887
+ "[set <name|n>]",
888
+ )
889
+ platform_commands.register(
890
+ "model",
891
+ "Show / switch the LLM model for the current provider",
892
+ _model,
893
+ "[set <name|n>]",
894
+ )
895
+ platform_commands.register(
896
+ "skill",
897
+ "Manage skills: list, create, search, enable, disable, add, remove (accepts name or list number)",
898
+ _skill,
899
+ "list|create|search|enable|disable|add|remove [name|n]",
900
+ )
901
+ platform_commands.register(
902
+ "mcp",
903
+ "Manage MCP servers: list, add, enable, disable, remove (accepts name or list number)",
904
+ _mcp,
905
+ "list|add|enable|disable|remove [name|n]",
906
+ )
907
+ platform_commands.register(
908
+ "compact",
909
+ "Immediately compact context to reduce token usage",
910
+ _compact,
911
+ "(no args)",
912
+ )
913
+ platform_commands.register(
914
+ "config",
915
+ "Open config editor TUI, or manage mode/model/provider/api-key/endpoint/log-level",
916
+ _config,
917
+ "mode|model|provider|log-level [get|set <v>]",
918
+ )