@scemoon/cdh 1.0.9 → 1.0.10-beta.1

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 (786) hide show
  1. package/package.json +9 -2
  2. package/ai-dlc-skill/SKILL.md +0 -106
  3. package/ai-dlc-skill/architecture/project-structure.md +0 -78
  4. package/ai-dlc-skill/brownfield/README.md +0 -36
  5. package/ai-dlc-skill/brownfield/entry.md +0 -45
  6. package/ai-dlc-skill/brownfield/generate-context.sh +0 -64
  7. package/ai-dlc-skill/brownfield/scripts/deps.sh +0 -27
  8. package/ai-dlc-skill/brownfield/scripts/discover.sh +0 -34
  9. package/ai-dlc-skill/brownfield/scripts/extract-api.sh +0 -45
  10. package/ai-dlc-skill/components/backend.md +0 -47
  11. package/ai-dlc-skill/components/desktop.md +0 -63
  12. package/ai-dlc-skill/components/mya.md +0 -219
  13. package/ai-dlc-skill/components/native.md +0 -73
  14. package/ai-dlc-skill/components/tta.md +0 -235
  15. package/ai-dlc-skill/components/web.md +0 -77
  16. package/ai-dlc-skill/components/wxa.md +0 -219
  17. package/ai-dlc-skill/contracts/README.md +0 -25
  18. package/ai-dlc-skill/core/adaptive-flow.md +0 -107
  19. package/ai-dlc-skill/core/security.md +0 -29
  20. package/ai-dlc-skill/core/task-registry.md +0 -153
  21. package/ai-dlc-skill/cross-tool/README.md +0 -20
  22. package/ai-dlc-skill/cross-tool/cline/export.sh +0 -38
  23. package/ai-dlc-skill/cross-tool/copilot/export.sh +0 -41
  24. package/ai-dlc-skill/cross-tool/cursor/export.sh +0 -53
  25. package/ai-dlc-skill/cross-tool/onecode/export.sh +0 -27
  26. package/ai-dlc-skill/cross-tool/opencode/export.sh +0 -38
  27. package/ai-dlc-skill/phases/debug/entry.md +0 -48
  28. package/ai-dlc-skill/phases/debug/lifecycle.md +0 -284
  29. package/ai-dlc-skill/phases/deliver/entry.md +0 -35
  30. package/ai-dlc-skill/phases/deliver/lifecycle.md +0 -185
  31. package/ai-dlc-skill/phases/deliver/prompt.md +0 -54
  32. package/ai-dlc-skill/phases/deliver/rules.md +0 -61
  33. package/ai-dlc-skill/phases/plan/design_system/accessibility.md +0 -268
  34. package/ai-dlc-skill/phases/plan/design_system/atomic_design.md +0 -341
  35. package/ai-dlc-skill/phases/plan/design_system/component_spec.md +0 -398
  36. package/ai-dlc-skill/phases/plan/design_system/design_tokens.md +0 -190
  37. package/ai-dlc-skill/phases/plan/design_system/iconography.md +0 -299
  38. package/ai-dlc-skill/phases/plan/design_system/platform_ui/desktop.md +0 -318
  39. package/ai-dlc-skill/phases/plan/design_system/platform_ui/mya.md +0 -354
  40. package/ai-dlc-skill/phases/plan/design_system/platform_ui/native.md +0 -328
  41. package/ai-dlc-skill/phases/plan/design_system/platform_ui/tta.md +0 -394
  42. package/ai-dlc-skill/phases/plan/design_system/platform_ui/web.md +0 -287
  43. package/ai-dlc-skill/phases/plan/design_system/platform_ui/wxa.md +0 -374
  44. package/ai-dlc-skill/phases/plan/design_system/theme_system.md +0 -318
  45. package/ai-dlc-skill/phases/plan/entry.md +0 -33
  46. package/ai-dlc-skill/phases/plan/lifecycle.md +0 -260
  47. package/ai-dlc-skill/phases/plan/prompt.md +0 -75
  48. package/ai-dlc-skill/phases/plan/rules.md +0 -60
  49. package/ai-dlc-skill/phases/understand/entry.md +0 -36
  50. package/ai-dlc-skill/phases/understand/lifecycle.md +0 -184
  51. package/ai-dlc-skill/phases/understand/prompt.md +0 -58
  52. package/ai-dlc-skill/phases/understand/rules.md +0 -49
  53. package/ai-dlc-skill/phases/verify/config/base_url.md +0 -65
  54. package/ai-dlc-skill/phases/verify/entry.md +0 -59
  55. package/ai-dlc-skill/phases/verify/gates/browser_e2e.md +0 -96
  56. package/ai-dlc-skill/phases/verify/lifecycle.md +0 -217
  57. package/ai-dlc-skill/phases/verify/prompt.md +0 -73
  58. package/ai-dlc-skill/phases/verify/rules.md +0 -91
  59. package/ai-dlc-skill/phases/verify/runners/playwright_local.md +0 -103
  60. package/ai-dlc-skill/practices/bdd.md +0 -119
  61. package/ai-dlc-skill/practices/sdd.md +0 -84
  62. package/ai-dlc-skill/practices/tdd.md +0 -128
  63. package/ai-dlc-skill/providers/README.md +0 -114
  64. package/ai-dlc-skill/providers/aliyun/SKILL.md +0 -204
  65. package/ai-dlc-skill/providers/aliyun/api/rest-api.md +0 -214
  66. package/ai-dlc-skill/providers/aliyun/api/sdk.md +0 -307
  67. package/ai-dlc-skill/providers/aliyun/best-practices/database-design.md +0 -363
  68. package/ai-dlc-skill/providers/aliyun/best-practices/function-design.md +0 -424
  69. package/ai-dlc-skill/providers/aliyun/best-practices/troubleshooting.md +0 -258
  70. package/ai-dlc-skill/providers/aliyun/cli/database.md +0 -263
  71. package/ai-dlc-skill/providers/aliyun/cli/functions.md +0 -263
  72. package/ai-dlc-skill/providers/aliyun/cli/hosting.md +0 -226
  73. package/ai-dlc-skill/providers/aliyun/cli/setup.md +0 -235
  74. package/ai-dlc-skill/providers/aliyun/cli/storage.md +0 -315
  75. package/ai-dlc-skill/providers/aliyun/deployment.yaml +0 -66
  76. package/ai-dlc-skill/providers/aliyun/integration/ci-cd.md +0 -288
  77. package/ai-dlc-skill/providers/aliyun/preview.yaml +0 -84
  78. package/ai-dlc-skill/providers/aliyun/provider.yaml +0 -160
  79. package/ai-dlc-skill/providers/aliyun/security/authentication.md +0 -254
  80. package/ai-dlc-skill/providers/aliyun/services/cdn-hosting.md +0 -220
  81. package/ai-dlc-skill/providers/aliyun/services/database.md +0 -319
  82. package/ai-dlc-skill/providers/aliyun/services/function-compute.md +0 -273
  83. package/ai-dlc-skill/providers/aliyun/services/overview.md +0 -163
  84. package/ai-dlc-skill/providers/aliyun/services/serverless-app-engine.md +0 -266
  85. package/ai-dlc-skill/providers/aliyun/services/storage.md +0 -269
  86. package/ai-dlc-skill/providers/tcb/SKILL.md +0 -208
  87. package/ai-dlc-skill/providers/tcb/api/rest-api.md +0 -338
  88. package/ai-dlc-skill/providers/tcb/api/sdk.md +0 -288
  89. package/ai-dlc-skill/providers/tcb/best-practices/database-design.md +0 -452
  90. package/ai-dlc-skill/providers/tcb/best-practices/function-design.md +0 -502
  91. package/ai-dlc-skill/providers/tcb/best-practices/troubleshooting.md +0 -462
  92. package/ai-dlc-skill/providers/tcb/cli/cls.md +0 -133
  93. package/ai-dlc-skill/providers/tcb/cli/database.md +0 -230
  94. package/ai-dlc-skill/providers/tcb/cli/env.md +0 -207
  95. package/ai-dlc-skill/providers/tcb/cli/functions.md +0 -276
  96. package/ai-dlc-skill/providers/tcb/cli/hosting.md +0 -219
  97. package/ai-dlc-skill/providers/tcb/cli/setup.md +0 -218
  98. package/ai-dlc-skill/providers/tcb/cli/storage.md +0 -233
  99. package/ai-dlc-skill/providers/tcb/deployment.yaml +0 -111
  100. package/ai-dlc-skill/providers/tcb/integration/ci-cd.md +0 -309
  101. package/ai-dlc-skill/providers/tcb/integration/mcp-server.md +0 -371
  102. package/ai-dlc-skill/providers/tcb/preview.yaml +0 -83
  103. package/ai-dlc-skill/providers/tcb/provider.yaml +0 -172
  104. package/ai-dlc-skill/providers/tcb/security/authentication.md +0 -241
  105. package/ai-dlc-skill/providers/tcb/services/cloud-database.md +0 -299
  106. package/ai-dlc-skill/providers/tcb/services/cloud-functions.md +0 -265
  107. package/ai-dlc-skill/providers/tcb/services/cloud-hosting.md +0 -264
  108. package/ai-dlc-skill/providers/tcb/services/cloud-run.md +0 -285
  109. package/ai-dlc-skill/providers/tcb/services/cloud-storage.md +0 -245
  110. package/ai-dlc-skill/providers/tcb/services/overview.md +0 -174
  111. package/ai-dlc-skill/pybdd/README.md +0 -41
  112. package/ai-dlc-skill/pybdd/conftest.py +0 -17
  113. package/ai-dlc-skill/pybdd/example/auth/login.feature +0 -32
  114. package/ai-dlc-skill/pybdd/pytest.ini +0 -5
  115. package/ai-dlc-skill/pybdd/steps/.gitkeep +0 -1
  116. package/ai-dlc-skill/pybdd/steps/test_example_steps.py +0 -65
  117. package/ai-dlc-skill/requirements.md +0 -140
  118. package/ai-dlc-skill/skill.yaml +0 -135
  119. package/ai-dlc-skill/templates/brownfield/context.md +0 -78
  120. package/ai-dlc-skill/templates/integration/CHANGELOG.md +0 -41
  121. package/ai-dlc-skill/templates/integration/asyncapi.yaml +0 -43
  122. package/ai-dlc-skill/templates/integration/contract-diff.md +0 -63
  123. package/ai-dlc-skill/templates/integration/contract-spec.md +0 -49
  124. package/ai-dlc-skill/templates/integration/openapi.yaml +0 -18
  125. package/ai-dlc-skill/templates/integration/runtime-contract.yaml +0 -36
  126. package/ai-dlc-skill/templates/plan/design.md +0 -49
  127. package/ai-dlc-skill/templates/plan/task-list.md +0 -32
  128. package/ai-dlc-skill/templates/project/README.md +0 -126
  129. package/ai-dlc-skill/templates/project/template.md +0 -119
  130. package/ai-dlc-skill/templates/understand/feature.feature +0 -30
  131. package/ai-dlc-skill/templates/understand/intent.md +0 -29
  132. package/ai-dlc-skill/templates/understand/spec-delta.md +0 -47
  133. package/ai-dlc-skill/templates/verify/test-unit.py +0 -27
  134. package/ai-dlc-skill/walkthrough/collect.sh +0 -50
  135. package/ai-dlc-skill/walkthrough/template.md +0 -54
  136. package/cdh/__init__.py +0 -0
  137. package/cdh/__main__.py +0 -4
  138. package/cdh/__pycache__/__init__.cpython-314.pyc +0 -0
  139. package/cdh/__pycache__/cli.cpython-314.pyc +0 -0
  140. package/cdh/__pycache__/cli_logging.cpython-314.pyc +0 -0
  141. package/cdh/__pycache__/config.cpython-314.pyc +0 -0
  142. package/cdh/__pycache__/project_loader.cpython-314.pyc +0 -0
  143. package/cdh/__pycache__/scaffold.cpython-314.pyc +0 -0
  144. package/cdh/__pycache__/session_store.cpython-314.pyc +0 -0
  145. package/cdh/cdh_session_aggregator.py +0 -258
  146. package/cdh/cli.py +0 -3000
  147. package/cdh/cli_logging.py +0 -45
  148. package/cdh/config.py +0 -28
  149. package/cdh/event_loop/__init__.py +0 -7
  150. package/cdh/event_loop/bus.py +0 -123
  151. package/cdh/event_loop/events.py +0 -25
  152. package/cdh/event_loop/runner.py +0 -28
  153. package/cdh/event_loop/scheduler.py +0 -158
  154. package/cdh/generators/__init__.py +0 -35
  155. package/cdh/generators/_runtime.py +0 -176
  156. package/cdh/generators/ada/MANIFEST.toml +0 -14
  157. package/cdh/generators/ada/template.ads.tmpl +0 -7
  158. package/cdh/generators/bash/MANIFEST.toml +0 -14
  159. package/cdh/generators/bash/template.sh.tmpl +0 -16
  160. package/cdh/generators/builtin_index.json +0 -590
  161. package/cdh/generators/c/MANIFEST.toml +0 -14
  162. package/cdh/generators/c/template.h.tmpl +0 -20
  163. package/cdh/generators/cli.py +0 -379
  164. package/cdh/generators/clojure/MANIFEST.toml +0 -14
  165. package/cdh/generators/clojure/template.clj.tmpl +0 -13
  166. package/cdh/generators/cobol/MANIFEST.toml +0 -14
  167. package/cdh/generators/cobol/template.cbl.tmpl +0 -14
  168. package/cdh/generators/cpp/MANIFEST.toml +0 -14
  169. package/cdh/generators/cpp/template.hpp.tmpl +0 -32
  170. package/cdh/generators/crystal/MANIFEST.toml +0 -14
  171. package/cdh/generators/crystal/template.cr.tmpl +0 -11
  172. package/cdh/generators/csharp/MANIFEST.toml +0 -23
  173. package/cdh/generators/csharp/template.cs.tmpl +0 -14
  174. package/cdh/generators/cython/MANIFEST.toml +0 -14
  175. package/cdh/generators/cython/template.pyx.tmpl +0 -17
  176. package/cdh/generators/d/MANIFEST.toml +0 -14
  177. package/cdh/generators/d/template.d.tmpl +0 -24
  178. package/cdh/generators/dart/MANIFEST.toml +0 -17
  179. package/cdh/generators/dart/template.dart.tmpl +0 -27
  180. package/cdh/generators/elixir/MANIFEST.toml +0 -17
  181. package/cdh/generators/elixir/template.ex.tmpl +0 -27
  182. package/cdh/generators/elm/MANIFEST.toml +0 -14
  183. package/cdh/generators/elm/template.elm.tmpl +0 -20
  184. package/cdh/generators/erlang/MANIFEST.toml +0 -14
  185. package/cdh/generators/erlang/template.erl.tmpl +0 -18
  186. package/cdh/generators/fortran/MANIFEST.toml +0 -14
  187. package/cdh/generators/fortran/template.f90.tmpl +0 -24
  188. package/cdh/generators/fsharp/MANIFEST.toml +0 -14
  189. package/cdh/generators/fsharp/template.fs.tmpl +0 -17
  190. package/cdh/generators/go/MANIFEST.toml +0 -18
  191. package/cdh/generators/go/imports.go.tmpl +0 -3
  192. package/cdh/generators/go/template.go.tmpl +0 -9
  193. package/cdh/generators/graphql-schema/MANIFEST.toml +0 -18
  194. package/cdh/generators/graphql-schema/template.graphqls.tmpl +0 -12
  195. package/cdh/generators/groovy/MANIFEST.toml +0 -14
  196. package/cdh/generators/groovy/template.groovy.tmpl +0 -28
  197. package/cdh/generators/hack/MANIFEST.toml +0 -14
  198. package/cdh/generators/hack/template.hh.tmpl +0 -24
  199. package/cdh/generators/haskell/MANIFEST.toml +0 -14
  200. package/cdh/generators/haskell/template.hs.tmpl +0 -20
  201. package/cdh/generators/haxe/MANIFEST.toml +0 -14
  202. package/cdh/generators/haxe/template.hx.tmpl +0 -20
  203. package/cdh/generators/idris/MANIFEST.toml +0 -14
  204. package/cdh/generators/idris/template.idr.tmpl +0 -22
  205. package/cdh/generators/java/MANIFEST.toml +0 -18
  206. package/cdh/generators/java/template.java.tmpl +0 -13
  207. package/cdh/generators/julia/MANIFEST.toml +0 -14
  208. package/cdh/generators/julia/template.jl.tmpl +0 -27
  209. package/cdh/generators/kotlin/MANIFEST.toml +0 -18
  210. package/cdh/generators/kotlin/template.kt.tmpl +0 -12
  211. package/cdh/generators/lua/MANIFEST.toml +0 -14
  212. package/cdh/generators/lua/template.lua.tmpl +0 -27
  213. package/cdh/generators/matlab/MANIFEST.toml +0 -14
  214. package/cdh/generators/matlab/template.m.tmpl +0 -26
  215. package/cdh/generators/nim/MANIFEST.toml +0 -14
  216. package/cdh/generators/nim/template.nim.tmpl +0 -12
  217. package/cdh/generators/nix/MANIFEST.toml +0 -14
  218. package/cdh/generators/nix/template.nix.tmpl +0 -8
  219. package/cdh/generators/objective-c/MANIFEST.toml +0 -14
  220. package/cdh/generators/objective-c/template.m.tmpl +0 -31
  221. package/cdh/generators/ocaml/MANIFEST.toml +0 -14
  222. package/cdh/generators/ocaml/template.ml.tmpl +0 -13
  223. package/cdh/generators/pascal/MANIFEST.toml +0 -14
  224. package/cdh/generators/pascal/template.pas.tmpl +0 -5
  225. package/cdh/generators/perl/MANIFEST.toml +0 -14
  226. package/cdh/generators/perl/template.pm.tmpl +0 -27
  227. package/cdh/generators/php/MANIFEST.toml +0 -17
  228. package/cdh/generators/php/template.php.tmpl +0 -31
  229. package/cdh/generators/powershell/MANIFEST.toml +0 -14
  230. package/cdh/generators/powershell/template.ps1.tmpl +0 -20
  231. package/cdh/generators/protobuf/MANIFEST.toml +0 -18
  232. package/cdh/generators/protobuf/template.proto.tmpl +0 -13
  233. package/cdh/generators/python/MANIFEST.toml +0 -18
  234. package/cdh/generators/python/template.py.tmpl +0 -12
  235. package/cdh/generators/r/MANIFEST.toml +0 -14
  236. package/cdh/generators/r/template.R.tmpl +0 -29
  237. package/cdh/generators/racket/MANIFEST.toml +0 -14
  238. package/cdh/generators/racket/template.rkt.tmpl +0 -15
  239. package/cdh/generators/registry.py +0 -211
  240. package/cdh/generators/ruby/MANIFEST.toml +0 -17
  241. package/cdh/generators/ruby/template.rb.tmpl +0 -27
  242. package/cdh/generators/rust/MANIFEST.toml +0 -18
  243. package/cdh/generators/rust/template.rs.tmpl +0 -16
  244. package/cdh/generators/scala/MANIFEST.toml +0 -20
  245. package/cdh/generators/scala/template.scala.tmpl +0 -13
  246. package/cdh/generators/scheme/MANIFEST.toml +0 -14
  247. package/cdh/generators/scheme/template.scm.tmpl +0 -16
  248. package/cdh/generators/solidity/MANIFEST.toml +0 -14
  249. package/cdh/generators/solidity/template.sol.tmpl +0 -24
  250. package/cdh/generators/swift/MANIFEST.toml +0 -18
  251. package/cdh/generators/swift/template.swift.tmpl +0 -10
  252. package/cdh/generators/typescript/MANIFEST.toml +0 -18
  253. package/cdh/generators/typescript/template.ts.tmpl +0 -7
  254. package/cdh/generators/version.py +0 -214
  255. package/cdh/generators/zig/MANIFEST.toml +0 -14
  256. package/cdh/generators/zig/template.zig.tmpl +0 -20
  257. package/cdh/logging.py +0 -314
  258. package/cdh/optimizer/__init__.py +0 -7
  259. package/cdh/optimizer/loop.py +0 -201
  260. package/cdh/optimizer/mutation.py +0 -85
  261. package/cdh/optimizer/reward.py +0 -51
  262. package/cdh/optimizer/tracker.py +0 -118
  263. package/cdh/project_loader.py +0 -1022
  264. package/cdh/rules/patterns.yaml +0 -132
  265. package/cdh/rules/spectral.yaml +0 -301
  266. package/cdh/scaffold.py +0 -1436
  267. package/cdh/session_store.py +0 -221
  268. package/cdh/state_schema.py +0 -127
  269. package/cdh/tools/__init__.py +0 -57
  270. package/cdh/tools/cls_search.py +0 -406
  271. package/cdh/tools/contract_diff.py +0 -644
  272. package/cdh/tools/deploy_stack.py +0 -590
  273. package/cdh/tools/generate_shared.py +0 -300
  274. package/cdh/tools/iac_gen.py +0 -224
  275. package/cdh/tools/otel_export.py +0 -125
  276. package/cdh/tools/pattern_detect.py +0 -451
  277. package/cdh/tools/retrofit_labels.py +0 -505
  278. package/cdh/trace/__init__.py +0 -101
  279. package/cdh/trace/__pycache__/__init__.cpython-314.pyc +0 -0
  280. package/cdh/trace/dashboard/__init__.py +0 -61
  281. package/cdh/trace/dashboard/api.py +0 -1032
  282. package/cdh/trace/dashboard/app.html +0 -1321
  283. package/cdh/trace/dashboard/server.py +0 -310
  284. package/cdh/trace/otel_exporter.py +0 -462
  285. package/cdh/trace/otel_tracer.py +0 -281
  286. package/cdh/tui.py +0 -1084
  287. package/cdh/validators/__init__.py +0 -16
  288. package/cdh/validators/__pycache__/__init__.cpython-314.pyc +0 -0
  289. package/cdh/validators/__pycache__/bdd.cpython-314.pyc +0 -0
  290. package/cdh/validators/__pycache__/dag.cpython-314.pyc +0 -0
  291. package/cdh/validators/__pycache__/ears.cpython-314.pyc +0 -0
  292. package/cdh/validators/__pycache__/fr_namespace.cpython-314.pyc +0 -0
  293. package/cdh/validators/bdd.py +0 -144
  294. package/cdh/validators/dag.py +0 -179
  295. package/cdh/validators/ears.py +0 -452
  296. package/cdh/validators/fr_namespace.py +0 -143
  297. package/cdh/validators/spectral.py +0 -475
  298. package/cdh/verification/__init__.py +0 -3
  299. package/cdh/verification/aggregation.py +0 -53
  300. package/cdh/verification/gates/__init__.py +0 -5
  301. package/cdh/verification/gates/base.py +0 -18
  302. package/cdh/verification/gates/lint_gate.py +0 -37
  303. package/cdh/verification/gates/test_gate.py +0 -41
  304. package/cdh/verification/loop.py +0 -93
  305. package/cdh/verification/policy.py +0 -24
  306. package/onecode/__init__.py +0 -1
  307. package/onecode/__main__.py +0 -4
  308. package/onecode/__pycache__/__init__.cpython-314.pyc +0 -0
  309. package/onecode/__pycache__/cli.cpython-314.pyc +0 -0
  310. package/onecode/__pycache__/commands.cpython-314.pyc +0 -0
  311. package/onecode/__pycache__/config.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 +0 -29
  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 +0 -50
  330. package/onecode/agent/agents/prompts/compaction-instructions.md +0 -12
  331. package/onecode/agent/agents/prompts/explore-agent.md +0 -42
  332. package/onecode/agent/agents/prompts/plan-agent.md +0 -44
  333. package/onecode/agent/agents/prompts/plan-gate-hard.md +0 -4
  334. package/onecode/agent/agents/prompts/plan-gate-soft.md +0 -3
  335. package/onecode/agent/agents/prompts/solo-agent.md +0 -57
  336. package/onecode/agent/agents/prompts/subagent-constraints.md +0 -10
  337. package/onecode/agent/agents/prompts/summary-instructions.md +0 -7
  338. package/onecode/agent/agents/prompts/title-instructions.md +0 -3
  339. package/onecode/agent/agents/prompts/tool-descriptions.md +0 -129
  340. package/onecode/agent/agents/types.py +0 -786
  341. package/onecode/agent/attachments.py +0 -112
  342. package/onecode/agent/cdh_loader.py +0 -3
  343. package/onecode/agent/checkpoint.py +0 -285
  344. package/onecode/agent/context.py +0 -465
  345. package/onecode/agent/engine.py +0 -3547
  346. package/onecode/agent/event_bridge.py +0 -75
  347. package/onecode/agent/hooks.py +0 -86
  348. package/onecode/agent/onecode_agent_acp.py +0 -2993
  349. package/onecode/agent/permissions.py +0 -150
  350. package/onecode/agent/permissions_store.py +0 -73
  351. package/onecode/agent/project_doc.py +0 -19
  352. package/onecode/agent/question_detect.py +0 -230
  353. package/onecode/agent/session.py +0 -3
  354. package/onecode/agent/snapshot.py +0 -144
  355. package/onecode/agent/tools/__init__.py +0 -17
  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 +0 -128
  379. package/onecode/agent/tools/apply_patch_tool.py +0 -138
  380. package/onecode/agent/tools/bash_tool.py +0 -121
  381. package/onecode/agent/tools/communication_tools.py +0 -154
  382. package/onecode/agent/tools/config_tool.py +0 -130
  383. package/onecode/agent/tools/cron_tools.py +0 -178
  384. package/onecode/agent/tools/errors.py +0 -17
  385. package/onecode/agent/tools/file_ops.py +0 -221
  386. package/onecode/agent/tools/file_tools.py +0 -225
  387. package/onecode/agent/tools/git_tools.py +0 -88
  388. package/onecode/agent/tools/lsp_tools.py +0 -404
  389. package/onecode/agent/tools/mcp_tools.py +0 -211
  390. package/onecode/agent/tools/permission_handler.py +0 -46
  391. package/onecode/agent/tools/permissions.py +0 -77
  392. package/onecode/agent/tools/protocol.py +0 -20
  393. package/onecode/agent/tools/registry.py +0 -210
  394. package/onecode/agent/tools/sandbox.py +0 -460
  395. package/onecode/agent/tools/schema_validation.py +0 -100
  396. package/onecode/agent/tools/skill_tools.py +0 -52
  397. package/onecode/agent/tools/todo_tools.py +0 -208
  398. package/onecode/agent/tools/web_tools.py +0 -530
  399. package/onecode/agent/turn_record.py +0 -28
  400. package/onecode/builtin_skills/agent-browser/SKILL.md +0 -212
  401. package/onecode/builtin_skills/agent-browser/skill.yaml +0 -8
  402. package/onecode/builtin_skills/cloudbase/SKILL.md +0 -162
  403. package/onecode/builtin_skills/cloudbase/skill.yaml +0 -7
  404. package/onecode/builtin_skills/git/SKILL.md +0 -64
  405. package/onecode/builtin_skills/git/skill.yaml +0 -7
  406. package/onecode/builtin_skills/shell/SKILL.md +0 -58
  407. package/onecode/builtin_skills/shell/skill.yaml +0 -8
  408. package/onecode/builtin_skills/skill-creator/SKILL.md +0 -106
  409. package/onecode/builtin_skills/skill-creator/skill.yaml +0 -8
  410. package/onecode/cli.py +0 -1325
  411. package/onecode/codebase/__init__.py +0 -69
  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 +0 -125
  419. package/onecode/codebase/indexer.py +0 -154
  420. package/onecode/codebase/retriever.py +0 -240
  421. package/onecode/codebase/storage.py +0 -153
  422. package/onecode/codebase/tools.py +0 -59
  423. package/onecode/commands.py +0 -673
  424. package/onecode/config.py +0 -539
  425. package/onecode/config_screen.py +0 -486
  426. package/onecode/cron/__init__.py +0 -3
  427. package/onecode/lsp/__init__.py +0 -3
  428. package/onecode/mcp/__init__.py +0 -11
  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 +0 -305
  436. package/onecode/mcp/cloudbase.py +0 -188
  437. package/onecode/mcp/config.py +0 -363
  438. package/onecode/mcp/manager.py +0 -603
  439. package/onecode/mcp/oauth.py +0 -199
  440. package/onecode/memory/__init__.py +0 -106
  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 +0 -179
  446. package/onecode/memory/pyramid.py +0 -145
  447. package/onecode/memory/recall.py +0 -322
  448. package/onecode/migrate.py +0 -122
  449. package/onecode/models/__init__.py +0 -4
  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 +0 -104
  457. package/onecode/models/messages.py +0 -750
  458. package/onecode/models/ollama_manager.py +0 -167
  459. package/onecode/models/provider.py +0 -730
  460. package/onecode/models/providers/__init__.py +0 -17
  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 +0 -286
  470. package/onecode/models/providers/deepseek_provider.py +0 -221
  471. package/onecode/models/providers/glm_provider.py +0 -219
  472. package/onecode/models/providers/minimax_provider.py +0 -182
  473. package/onecode/models/providers/minimaxi_provider.py +0 -426
  474. package/onecode/models/providers/ollama_provider.py +0 -183
  475. package/onecode/models/providers/openai_provider.py +0 -234
  476. package/onecode/models/registry.py +0 -349
  477. package/onecode/server/__init__.py +0 -3
  478. package/onecode/server/app.py +0 -251
  479. package/onecode/skills/__init__.py +0 -11
  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 +0 -38
  488. package/onecode/skills/bootstrap.py +0 -37
  489. package/onecode/skills/create.py +0 -56
  490. package/onecode/skills/frontmatter.py +0 -33
  491. package/onecode/skills/loader.py +0 -215
  492. package/onecode/skills/manager.py +0 -75
  493. package/onecode/skills/model.py +0 -43
  494. package/onecode/storage/__init__.py +0 -0
  495. package/onecode/storage/activity.py +0 -63
  496. package/onecode/storage/project.py +0 -54
  497. package/onecode/storage/session.py +0 -112
  498. package/onecode/tasks/__init__.py +0 -26
  499. package/onecode/tasks/manager.py +0 -232
  500. package/onecode/tasks/models.py +0 -240
  501. package/onecode/trace/__init__.py +0 -0
  502. package/onecode/trace/tracer.py +0 -173
  503. package/onecode/utils/__init__.py +0 -0
  504. package/onecode/utils/helpers.py +0 -20
  505. package/onecode/verification/__init__.py +0 -5
  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 +0 -53
  511. package/onecode/verification/gates/__init__.py +0 -6
  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 +0 -20
  518. package/onecode/verification/gates/lint_gate.py +0 -45
  519. package/onecode/verification/gates/test_gate.py +0 -62
  520. package/onecode/verification/gates/type_gate.py +0 -46
  521. package/onecode/verification/loop.py +0 -95
  522. package/onecode/verification/policy.py +0 -29
  523. package/pyproject.toml +0 -84
  524. package/tui/__init__.py +0 -46
  525. package/tui/__main__.py +0 -4
  526. package/tui/__pycache__/__init__.cpython-314.pyc +0 -0
  527. package/tui/__pycache__/_loop.cpython-314.pyc +0 -0
  528. package/tui/__pycache__/_path_fuzzy_search.cpython-314.pyc +0 -0
  529. package/tui/__pycache__/_path_match.cpython-314.pyc +0 -0
  530. package/tui/__pycache__/agent.cpython-314.pyc +0 -0
  531. package/tui/__pycache__/agent_schema.cpython-314.pyc +0 -0
  532. package/tui/__pycache__/agents.cpython-314.pyc +0 -0
  533. package/tui/__pycache__/answer.cpython-314.pyc +0 -0
  534. package/tui/__pycache__/app.cpython-314.pyc +0 -0
  535. package/tui/__pycache__/atomic.cpython-314.pyc +0 -0
  536. package/tui/__pycache__/complete.cpython-314.pyc +0 -0
  537. package/tui/__pycache__/constants.cpython-314.pyc +0 -0
  538. package/tui/__pycache__/conversation_markdown.cpython-314.pyc +0 -0
  539. package/tui/__pycache__/db.cpython-314.pyc +0 -0
  540. package/tui/__pycache__/dec.cpython-314.pyc +0 -0
  541. package/tui/__pycache__/directory.cpython-314.pyc +0 -0
  542. package/tui/__pycache__/directory_watcher.cpython-314.pyc +0 -0
  543. package/tui/__pycache__/format_path.cpython-314.pyc +0 -0
  544. package/tui/__pycache__/fuzzy.cpython-314.pyc +0 -0
  545. package/tui/__pycache__/fuzzy_index.cpython-314.pyc +0 -0
  546. package/tui/__pycache__/history.cpython-314.pyc +0 -0
  547. package/tui/__pycache__/jsonrpc.cpython-314.pyc +0 -0
  548. package/tui/__pycache__/menus.cpython-314.pyc +0 -0
  549. package/tui/__pycache__/message_log.cpython-314.pyc +0 -0
  550. package/tui/__pycache__/messages.cpython-314.pyc +0 -0
  551. package/tui/__pycache__/path_complete.cpython-314.pyc +0 -0
  552. package/tui/__pycache__/path_filter.cpython-314.pyc +0 -0
  553. package/tui/__pycache__/paths.cpython-314.pyc +0 -0
  554. package/tui/__pycache__/pill.cpython-314.pyc +0 -0
  555. package/tui/__pycache__/platform_commands.cpython-314.pyc +0 -0
  556. package/tui/__pycache__/protocol.cpython-314.pyc +0 -0
  557. package/tui/__pycache__/session_tracker.cpython-314.pyc +0 -0
  558. package/tui/__pycache__/settings.cpython-314.pyc +0 -0
  559. package/tui/__pycache__/settings_schema.cpython-314.pyc +0 -0
  560. package/tui/__pycache__/shell.cpython-314.pyc +0 -0
  561. package/tui/__pycache__/shell_read.cpython-314.pyc +0 -0
  562. package/tui/__pycache__/slash_command.cpython-314.pyc +0 -0
  563. package/tui/__pycache__/version.cpython-314.pyc +0 -0
  564. package/tui/_loop.py +0 -86
  565. package/tui/_path_fuzzy_search.py +0 -48
  566. package/tui/_path_match.py +0 -141
  567. package/tui/about.py +0 -95
  568. package/tui/acp/__pycache__/agent.cpython-314.pyc +0 -0
  569. package/tui/acp/__pycache__/api.cpython-314.pyc +0 -0
  570. package/tui/acp/__pycache__/encode_tool_call_id.cpython-314.pyc +0 -0
  571. package/tui/acp/__pycache__/event_tap.cpython-314.pyc +0 -0
  572. package/tui/acp/__pycache__/messages.cpython-314.pyc +0 -0
  573. package/tui/acp/__pycache__/prompt.cpython-314.pyc +0 -0
  574. package/tui/acp/__pycache__/protocol.cpython-314.pyc +0 -0
  575. package/tui/acp/agent.py +0 -1212
  576. package/tui/acp/api.py +0 -79
  577. package/tui/acp/encode_tool_call_id.py +0 -12
  578. package/tui/acp/event_tap.py +0 -107
  579. package/tui/acp/messages.py +0 -222
  580. package/tui/acp/prompt.py +0 -53
  581. package/tui/acp/protocol.py +0 -551
  582. package/tui/agent.py +0 -70
  583. package/tui/agent_schema.py +0 -76
  584. package/tui/agents.py +0 -46
  585. package/tui/ansi/__init__.py +0 -1
  586. package/tui/ansi/__pycache__/__init__.cpython-314.pyc +0 -0
  587. package/tui/ansi/__pycache__/_ansi.cpython-314.pyc +0 -0
  588. package/tui/ansi/__pycache__/_ansi_colors.cpython-314.pyc +0 -0
  589. package/tui/ansi/__pycache__/_control_codes.cpython-314.pyc +0 -0
  590. package/tui/ansi/__pycache__/_keys.cpython-314.pyc +0 -0
  591. package/tui/ansi/__pycache__/_sgr_styles.cpython-314.pyc +0 -0
  592. package/tui/ansi/__pycache__/_stream_parser.cpython-314.pyc +0 -0
  593. package/tui/ansi/_ansi.py +0 -1689
  594. package/tui/ansi/_ansi_colors.py +0 -264
  595. package/tui/ansi/_control_codes.py +0 -37
  596. package/tui/ansi/_keys.py +0 -251
  597. package/tui/ansi/_sgr_styles.py +0 -64
  598. package/tui/ansi/_stream_parser.py +0 -418
  599. package/tui/answer.py +0 -12
  600. package/tui/app.py +0 -1195
  601. package/tui/atomic.py +0 -37
  602. package/tui/cli.py +0 -208
  603. package/tui/code_analyze.py +0 -27
  604. package/tui/complete.py +0 -38
  605. package/tui/constants.py +0 -61
  606. package/tui/conversation_markdown.py +0 -30
  607. package/tui/danger.py +0 -372
  608. package/tui/data/agents/ampcode.com.toml +0 -52
  609. package/tui/data/agents/augmentcode.com.toml +0 -41
  610. package/tui/data/agents/cdh.cloud-dev-harness.toml +0 -23
  611. package/tui/data/agents/claude.com.toml +0 -42
  612. package/tui/data/agents/copilot.github.com.toml +0 -29
  613. package/tui/data/agents/crowai.dev.toml +0 -36
  614. package/tui/data/agents/cursor.com.toml +0 -38
  615. package/tui/data/agents/deepagents.langchain.com +0 -34
  616. package/tui/data/agents/docker.com.toml +0 -60
  617. package/tui/data/agents/geminicli.com.toml +0 -28
  618. package/tui/data/agents/goose.ai.toml +0 -52
  619. package/tui/data/agents/inference.huggingface.co.toml +0 -41
  620. package/tui/data/agents/kimi.com.toml +0 -35
  621. package/tui/data/agents/kiro.dev.toml +0 -43
  622. package/tui/data/agents/onecode.dev.toml +0 -22
  623. package/tui/data/agents/openai.com.toml +0 -53
  624. package/tui/data/agents/openclaw.ai.toml +0 -37
  625. package/tui/data/agents/opencode.ai.toml +0 -39
  626. package/tui/data/agents/openhands.dev.toml +0 -46
  627. package/tui/data/agents/stakpak.dev.toml +0 -62
  628. package/tui/data/agents/vibe.mistral.ai.toml +0 -31
  629. package/tui/data/agents/vtcode.dev.toml +0 -63
  630. package/tui/data/images/frog.png +0 -0
  631. package/tui/data/sounds/question.wav +0 -0
  632. package/tui/data/sounds/turn-over.wav +0 -0
  633. package/tui/db.py +0 -213
  634. package/tui/dec.py +0 -332
  635. package/tui/diff_utils.py +0 -131
  636. package/tui/directory.py +0 -234
  637. package/tui/directory_suggester.py +0 -93
  638. package/tui/directory_watcher.py +0 -231
  639. package/tui/format_path.py +0 -25
  640. package/tui/fuzzy.py +0 -140
  641. package/tui/fuzzy_index.py +0 -275
  642. package/tui/gist.py +0 -33
  643. package/tui/history.py +0 -138
  644. package/tui/jsonrpc.py +0 -599
  645. package/tui/menus.py +0 -14
  646. package/tui/message_log.py +0 -69
  647. package/tui/messages.py +0 -144
  648. package/tui/option_content.py +0 -51
  649. package/tui/os.py +0 -0
  650. package/tui/path_complete.py +0 -217
  651. package/tui/path_filter.py +0 -124
  652. package/tui/paths.py +0 -87
  653. package/tui/pill.py +0 -23
  654. package/tui/platform_commands.py +0 -52
  655. package/tui/prompt/__pycache__/extract.cpython-314.pyc +0 -0
  656. package/tui/prompt/__pycache__/resource.cpython-314.pyc +0 -0
  657. package/tui/prompt/extract.py +0 -19
  658. package/tui/prompt/resource.py +0 -68
  659. package/tui/protocol.py +0 -28
  660. package/tui/screens/__init__.py +0 -0
  661. package/tui/screens/__pycache__/__init__.cpython-314.pyc +0 -0
  662. package/tui/screens/__pycache__/diff_screen.cpython-314.pyc +0 -0
  663. package/tui/screens/__pycache__/main.cpython-314.pyc +0 -0
  664. package/tui/screens/__pycache__/sessions.cpython-314.pyc +0 -0
  665. package/tui/screens/action_modal.py +0 -94
  666. package/tui/screens/agent_modal.py +0 -175
  667. package/tui/screens/command_edit_modal.py +0 -74
  668. package/tui/screens/diff_explorer_screen.py +0 -419
  669. package/tui/screens/diff_screen.py +0 -84
  670. package/tui/screens/ide_screen.py +0 -461
  671. package/tui/screens/main.py +0 -397
  672. package/tui/screens/main.tcss +0 -662
  673. package/tui/screens/permissions.py +0 -404
  674. package/tui/screens/permissions.tcss +0 -72
  675. package/tui/screens/projects.tcss +0 -84
  676. package/tui/screens/projects_app.py +0 -341
  677. package/tui/screens/projects_screen.py +0 -277
  678. package/tui/screens/session_resume_modal.py +0 -172
  679. package/tui/screens/session_resume_modal.tcss +0 -35
  680. package/tui/screens/sessions.py +0 -171
  681. package/tui/screens/sessions.tcss +0 -119
  682. package/tui/screens/settings.py +0 -293
  683. package/tui/screens/settings.tcss +0 -113
  684. package/tui/screens/store.py +0 -502
  685. package/tui/screens/store.tcss +0 -274
  686. package/tui/screens/tool_content_screen.py +0 -59
  687. package/tui/screens/trace.py +0 -317
  688. package/tui/session_tracker.py +0 -123
  689. package/tui/settings.py +0 -353
  690. package/tui/settings_schema.py +0 -467
  691. package/tui/shell.py +0 -304
  692. package/tui/shell_read.py +0 -42
  693. package/tui/slash_command.py +0 -34
  694. package/tui/tui.tcss +0 -246
  695. package/tui/twitter.py +0 -38
  696. package/tui/version.py +0 -80
  697. package/tui/visuals/__init__.py +0 -0
  698. package/tui/visuals/__pycache__/__init__.cpython-314.pyc +0 -0
  699. package/tui/visuals/__pycache__/columns.cpython-314.pyc +0 -0
  700. package/tui/visuals/columns.py +0 -272
  701. package/tui/widgets/__init__.py +0 -0
  702. package/tui/widgets/__pycache__/__init__.cpython-314.pyc +0 -0
  703. package/tui/widgets/__pycache__/agent_response.cpython-314.pyc +0 -0
  704. package/tui/widgets/__pycache__/agent_thought.cpython-314.pyc +0 -0
  705. package/tui/widgets/__pycache__/aidlc.cpython-314.pyc +0 -0
  706. package/tui/widgets/__pycache__/ask_user.cpython-314.pyc +0 -0
  707. package/tui/widgets/__pycache__/condensed_path.cpython-314.pyc +0 -0
  708. package/tui/widgets/__pycache__/context_stats.cpython-314.pyc +0 -0
  709. package/tui/widgets/__pycache__/conversation.cpython-314.pyc +0 -0
  710. package/tui/widgets/__pycache__/diff_view.cpython-314.pyc +0 -0
  711. package/tui/widgets/__pycache__/flash.cpython-314.pyc +0 -0
  712. package/tui/widgets/__pycache__/future_text.cpython-314.pyc +0 -0
  713. package/tui/widgets/__pycache__/grid_select.cpython-314.pyc +0 -0
  714. package/tui/widgets/__pycache__/highlighted_textarea.cpython-314.pyc +0 -0
  715. package/tui/widgets/__pycache__/load_more.cpython-314.pyc +0 -0
  716. package/tui/widgets/__pycache__/menu.cpython-314.pyc +0 -0
  717. package/tui/widgets/__pycache__/modified_files.cpython-314.pyc +0 -0
  718. package/tui/widgets/__pycache__/non_selectable_label.cpython-314.pyc +0 -0
  719. package/tui/widgets/__pycache__/note.cpython-314.pyc +0 -0
  720. package/tui/widgets/__pycache__/path_search.cpython-314.pyc +0 -0
  721. package/tui/widgets/__pycache__/pending_prompts.cpython-314.pyc +0 -0
  722. package/tui/widgets/__pycache__/plan.cpython-314.pyc +0 -0
  723. package/tui/widgets/__pycache__/project_directory_tree.cpython-314.pyc +0 -0
  724. package/tui/widgets/__pycache__/prompt.cpython-314.pyc +0 -0
  725. package/tui/widgets/__pycache__/question.cpython-314.pyc +0 -0
  726. package/tui/widgets/__pycache__/session_grid_select.cpython-314.pyc +0 -0
  727. package/tui/widgets/__pycache__/session_summary.cpython-314.pyc +0 -0
  728. package/tui/widgets/__pycache__/session_tabs.cpython-314.pyc +0 -0
  729. package/tui/widgets/__pycache__/shell_terminal.cpython-314.pyc +0 -0
  730. package/tui/widgets/__pycache__/side_bar.cpython-314.pyc +0 -0
  731. package/tui/widgets/__pycache__/slash_complete.cpython-314.pyc +0 -0
  732. package/tui/widgets/__pycache__/strike_text.cpython-314.pyc +0 -0
  733. package/tui/widgets/__pycache__/terminal.cpython-314.pyc +0 -0
  734. package/tui/widgets/__pycache__/throbber.cpython-314.pyc +0 -0
  735. package/tui/widgets/__pycache__/tool_call.cpython-314.pyc +0 -0
  736. package/tui/widgets/__pycache__/user_input.cpython-314.pyc +0 -0
  737. package/tui/widgets/acp_content.py +0 -70
  738. package/tui/widgets/agent_response.py +0 -76
  739. package/tui/widgets/agent_thought.py +0 -167
  740. package/tui/widgets/aidlc.py +0 -334
  741. package/tui/widgets/ask_user.py +0 -604
  742. package/tui/widgets/command_pane.py +0 -223
  743. package/tui/widgets/condensed_path.py +0 -115
  744. package/tui/widgets/context_stats.py +0 -66
  745. package/tui/widgets/conversation.py +0 -3235
  746. package/tui/widgets/danger_warning.py +0 -65
  747. package/tui/widgets/diff_view.py +0 -69
  748. package/tui/widgets/directory_input.py +0 -8
  749. package/tui/widgets/edit_field.py +0 -206
  750. package/tui/widgets/flash.py +0 -81
  751. package/tui/widgets/future_text.py +0 -126
  752. package/tui/widgets/grid_select.py +0 -234
  753. package/tui/widgets/highlighted_textarea.py +0 -183
  754. package/tui/widgets/load_more.py +0 -24
  755. package/tui/widgets/mandelbrot.py +0 -294
  756. package/tui/widgets/markdown_note.py +0 -13
  757. package/tui/widgets/menu.py +0 -147
  758. package/tui/widgets/model_status.py +0 -230
  759. package/tui/widgets/modified_files.py +0 -315
  760. package/tui/widgets/non_selectable_label.py +0 -5
  761. package/tui/widgets/note.py +0 -18
  762. package/tui/widgets/path_search.py +0 -492
  763. package/tui/widgets/pending_prompts.py +0 -36
  764. package/tui/widgets/plan.py +0 -285
  765. package/tui/widgets/project_directory_tree.py +0 -102
  766. package/tui/widgets/project_grid_select.py +0 -68
  767. package/tui/widgets/project_summary.py +0 -33
  768. package/tui/widgets/prompt.py +0 -935
  769. package/tui/widgets/question.py +0 -360
  770. package/tui/widgets/session_grid_select.py +0 -230
  771. package/tui/widgets/session_summary.py +0 -115
  772. package/tui/widgets/session_tabs.py +0 -194
  773. package/tui/widgets/shell_result.py +0 -35
  774. package/tui/widgets/shell_terminal.py +0 -40
  775. package/tui/widgets/side_bar.py +0 -124
  776. package/tui/widgets/slash_complete.py +0 -235
  777. package/tui/widgets/strike_text.py +0 -70
  778. package/tui/widgets/subagent.py +0 -287
  779. package/tui/widgets/subagent_screen.py +0 -715
  780. package/tui/widgets/terminal.py +0 -576
  781. package/tui/widgets/terminal_tool.py +0 -360
  782. package/tui/widgets/throbber.py +0 -100
  783. package/tui/widgets/tool_call.py +0 -432
  784. package/tui/widgets/user_input.py +0 -23
  785. package/tui/widgets/version.py +0 -5
  786. package/tui/widgets/welcome.py +0 -31
package/cdh/tui.py DELETED
@@ -1,1084 +0,0 @@
1
- """AIDLC dashboard TUI.
2
-
3
- Renders an at-a-glance dashboard of AIDLC project health using a 2x3
4
- grid of rich widgets:
5
-
6
- * ProgressWidget - current phase + progress bar
7
- * GateWidget - quality gate pass/fail/warn status
8
- * SpecQualityWidget - EARS / FR / BDD / DAG counts and pass rates
9
- * ToolsStatusWidget - installed vs stub tools
10
- * FRCoverageWidget - FR -> BDD coverage percentage
11
- * DeploymentStatusWidget - preview / staging / production env status
12
-
13
- Supports:
14
- - Auto-detect .cdh/ directory (walks up from cwd).
15
- - Plain-text console rendering (the default).
16
- - --watch / --interval N to refresh every N seconds (Ctrl-C to stop).
17
- - --export PATH to save a single-shot snapshot as Markdown (or HTML if
18
- the suffix is .html) without entering watch mode.
19
-
20
- If the `rich` library is unavailable, falls back to plain ANSI escape
21
- codes so the dashboard still renders in a colour-capable terminal.
22
-
23
- The dashboard never raises on missing data: every widget gracefully
24
- handles a project that has not been initialised, or a partial project
25
- mid-iteration. Missing widgets render as a grey "no data" panel.
26
- """
27
-
28
- from __future__ import annotations
29
-
30
- import io
31
- import json
32
- import os
33
- import re
34
- import sys
35
- import time
36
- from dataclasses import dataclass, field
37
- from pathlib import Path
38
- from typing import Any, Callable, Iterable, Optional
39
-
40
- try:
41
- from rich.console import Console
42
- from rich.panel import Panel
43
- from rich.table import Table
44
- from rich.text import Text
45
- from rich.progress import (
46
- BarColumn,
47
- Progress,
48
- TextColumn,
49
- SpinnerColumn,
50
- TimeElapsedColumn,
51
- )
52
-
53
- _HAVE_RICH = True
54
- except Exception: # pragma: no cover - rich is optional
55
- Console = None # type: ignore[assignment]
56
- Panel = None # type: ignore[assignment]
57
- Table = None # type: ignore[assignment]
58
- Text = None # type: ignore[assignment]
59
- Progress = None # type: ignore[assignment]
60
- BarColumn = None # type: ignore[assignment]
61
- TextColumn = None # type: ignore[assignment]
62
- SpinnerColumn = None # type: ignore[assignment]
63
- TimeElapsedColumn = None # type: ignore[assignment]
64
- _HAVE_RICH = False
65
-
66
-
67
- from cdh.project_loader import CdhProjectLoader
68
-
69
- _PHASE_SEQUENCE = CdhProjectLoader._PHASE_SEQUENCE
70
-
71
-
72
- # ---------------------------------------------------------------------------
73
- # ANSI fallback helpers
74
- # ---------------------------------------------------------------------------
75
-
76
- _ANSI_RESET = "\x1b[0m"
77
- _ANSI_COLORS = {
78
- "red": "\x1b[31m",
79
- "green": "\x1b[32m",
80
- "yellow": "\x1b[33m",
81
- "blue": "\x1b[34m",
82
- "magenta": "\x1b[35m",
83
- "cyan": "\x1b[36m",
84
- "white": "\x1b[37m",
85
- "grey": "\x1b[90m",
86
- "bold": "\x1b[1m",
87
- "dim": "\x1b[2m",
88
- }
89
-
90
-
91
- def _ansi(text: str, *styles: str) -> str:
92
- if not sys.stdout.isatty():
93
- return text
94
- prefix = "".join(_ANSI_COLORS.get(s, "") for s in styles)
95
- if not prefix:
96
- return text
97
- return f"{prefix}{text}{_ANSI_RESET}"
98
-
99
-
100
- def _supports_color() -> bool:
101
- if os.environ.get("NO_COLOR"):
102
- return False
103
- return bool(sys.stdout.isatty())
104
-
105
-
106
- # ---------------------------------------------------------------------------
107
- # Data sources
108
- # ---------------------------------------------------------------------------
109
-
110
-
111
- def _walk_up_parents(workspace_root: Path) -> Iterable[Path]:
112
- current = workspace_root.resolve()
113
- yield current
114
- try:
115
- git_root = next(
116
- (
117
- p
118
- for p in current.parents
119
- if (p / ".git").exists() or (p / ".hg").exists()
120
- ),
121
- None,
122
- )
123
- if git_root:
124
- yield git_root
125
- except StopIteration:
126
- pass
127
-
128
-
129
- def find_cdh_dir(workspace_root: Path) -> Optional[Path]:
130
- """Walk up from workspace_root looking for a .cdh/ directory."""
131
- for parent in _walk_up_parents(workspace_root):
132
- candidate = parent / ".cdh"
133
- if candidate.is_dir():
134
- return candidate
135
- return None
136
-
137
-
138
- def _read_state(cdh_dir: Optional[Path]) -> dict:
139
- if cdh_dir is None:
140
- return {}
141
- state_path = cdh_dir / "state.json"
142
- if not state_path.exists():
143
- return {}
144
- try:
145
- return json.loads(state_path.read_text(encoding="utf-8"))
146
- except Exception:
147
- return {}
148
-
149
-
150
- def _read_config(cdh_dir: Optional[Path]) -> dict:
151
- if cdh_dir is None:
152
- return {}
153
- yaml_path = cdh_dir / "config.yaml"
154
- if yaml_path.exists():
155
- try:
156
- import yaml # type: ignore
157
-
158
- return yaml.safe_load(yaml_path.read_text(encoding="utf-8")) or {}
159
- except Exception:
160
- pass
161
- json_path = cdh_dir / "config.json"
162
- if json_path.exists():
163
- try:
164
- return json.loads(json_path.read_text(encoding="utf-8"))
165
- except Exception:
166
- return {}
167
- return {}
168
-
169
-
170
- def _read_project_yaml(project_root: Optional[Path]) -> dict:
171
- if project_root is None:
172
- return {}
173
- p = project_root / "aidlc" / "project.yaml"
174
- if not p.exists():
175
- return {}
176
- try:
177
- import yaml # type: ignore
178
-
179
- return yaml.safe_load(p.read_text(encoding="utf-8")) or {}
180
- except Exception:
181
- return {}
182
-
183
-
184
- # ---------------------------------------------------------------------------
185
- # Widget result dataclasses
186
- # ---------------------------------------------------------------------------
187
-
188
-
189
- @dataclass
190
- class WidgetResult:
191
- """Lightweight value object returned by each widget's collect().
192
-
193
- Attributes:
194
- title: widget heading shown in the panel border.
195
- summary: short single-line headline (e.g. "3 / 5 passed").
196
- rows: list of (label, value, status) tuples; status is one of
197
- ``"pass"``, ``"warn"``, ``"fail"``, or ``"info"``.
198
- progress: optional 0.0..1.0 for widgets that have a progress bar.
199
- message: optional free-form note (shown as a footer line).
200
- """
201
-
202
- title: str
203
- summary: str = ""
204
- rows: list[tuple[str, str, str]] = field(default_factory=list)
205
- progress: Optional[float] = None
206
- message: Optional[str] = None
207
-
208
- def is_empty(self) -> bool:
209
- return not self.summary and not self.rows and self.progress is None
210
-
211
-
212
- # ---------------------------------------------------------------------------
213
- # Widgets
214
- # ---------------------------------------------------------------------------
215
-
216
-
217
- class ProgressWidget:
218
- """Current AI-DLC phase with progress bar."""
219
-
220
- title = "Phase Progress"
221
-
222
- def collect(self, project_root: Optional[Path], cdh_dir: Optional[Path]) -> WidgetResult:
223
- state = _read_state(cdh_dir)
224
- current = state.get("current_phase", "")
225
- completed = state.get("completed_phases", []) or []
226
-
227
- if not current:
228
- return WidgetResult(
229
- title=self.title,
230
- summary="No phase recorded",
231
- message="Run `cdh aidlc phase <init|understand|plan|verify|deliver>`.",
232
- )
233
-
234
- try:
235
- idx = _PHASE_SEQUENCE.index(current)
236
- except ValueError:
237
- idx = -1
238
-
239
- total = len(_PHASE_SEQUENCE)
240
- progress = (idx + 1) / total if idx >= 0 else 0.0
241
-
242
- rows: list[tuple[str, str, str]] = []
243
- for i, phase in enumerate(_PHASE_SEQUENCE):
244
- if phase in completed:
245
- status = "pass"
246
- marker = "done"
247
- elif i == idx:
248
- status = "info"
249
- marker = "current"
250
- elif i < idx:
251
- status = "pass"
252
- marker = "skipped"
253
- else:
254
- status = "info"
255
- marker = "pending"
256
- rows.append((phase, marker, status))
257
-
258
- return WidgetResult(
259
- title=self.title,
260
- summary=f"{current} ({idx + 1}/{total})",
261
- rows=rows,
262
- progress=progress,
263
- )
264
-
265
-
266
- class GateWidget:
267
- """Quality gate status (pass / fail / warn) with icons."""
268
-
269
- title = "Quality Gates"
270
-
271
- _ICONS = {"pass": "[OK]", "fail": "[X]", "warn": "[!]", "info": "[ ]"}
272
-
273
- def collect(self, project_root: Optional[Path], cdh_dir: Optional[Path]) -> WidgetResult:
274
- state = _read_state(cdh_dir)
275
- gates: dict[str, dict] = state.get("gate_results", {}) or {}
276
-
277
- if not gates:
278
- return WidgetResult(
279
- title=self.title,
280
- summary="No gates recorded yet",
281
- message="Use `cdh aidlc gate <name> --status passed|failed`.",
282
- )
283
-
284
- passed = sum(1 for g in gates.values() if g.get("status") == "passed")
285
- failed = sum(1 for g in gates.values() if g.get("status") == "failed")
286
- warned = sum(1 for g in gates.values() if g.get("status") not in ("passed", "failed"))
287
-
288
- rows: list[tuple[str, str, str]] = []
289
- for name, g in sorted(gates.items()):
290
- status = g.get("status", "warn")
291
- s = status if status in ("pass", "fail", "warn") else "warn"
292
- rows.append((name, status, s))
293
-
294
- summary = f"{passed} passed, {failed} failed, {warned} warn"
295
-
296
- if failed:
297
- msg = "Some gates failed - review before advancing."
298
- elif warned:
299
- msg = "All gates passed but some have warnings."
300
- else:
301
- msg = "All gates passed."
302
-
303
- return WidgetResult(
304
- title=self.title,
305
- summary=summary,
306
- rows=rows,
307
- message=msg,
308
- )
309
-
310
-
311
- class SpecQualityWidget:
312
- """EARS / FR / BDD / DAG counts and pass rates."""
313
-
314
- title = "Spec Quality"
315
-
316
- def collect(self, project_root: Optional[Path], cdh_dir: Optional[Path]) -> WidgetResult:
317
- from cdh.validators import (
318
- run_bdd_check,
319
- run_dag_check,
320
- run_ears_check,
321
- run_fr_check,
322
- )
323
-
324
- if project_root is None:
325
- return WidgetResult(
326
- title=self.title,
327
- summary="No project root",
328
- message="Run from inside an AIDLC project.",
329
- )
330
-
331
- runners: list[tuple[str, str, Callable[[Path], dict]]] = [
332
- ("EARS", "ears", run_ears_check),
333
- ("FR", "fr", run_fr_check),
334
- ("BDD", "bdd", run_bdd_check),
335
- ("DAG", "dag", run_dag_check),
336
- ]
337
-
338
- rows: list[tuple[str, str, str]] = []
339
- total_pass = 0
340
- total_checks = 0
341
-
342
- for label, key, runner in runners:
343
- try:
344
- result = runner(project_root)
345
- except Exception as e:
346
- rows.append((label, f"error: {e}", "warn"))
347
- continue
348
-
349
- checks = result.get("checks", []) or []
350
- passed = sum(1 for c in checks if c.get("status") == "pass")
351
- failed = sum(1 for c in checks if c.get("status") == "fail")
352
- warned = sum(1 for c in checks if c.get("status") == "warn")
353
-
354
- overall = "pass" if result.get("passed") else "fail"
355
- value = f"{passed}P / {warned}W / {failed}F"
356
- rows.append((label, value, overall))
357
-
358
- total_pass += passed
359
- total_checks += len(checks)
360
-
361
- pass_rate = (total_pass / total_checks * 100.0) if total_checks else 0.0
362
- summary = f"{total_pass}/{total_checks} checks pass ({pass_rate:.0f}%)"
363
-
364
- return WidgetResult(
365
- title=self.title,
366
- summary=summary,
367
- rows=rows,
368
- progress=(pass_rate / 100.0) if total_checks else None,
369
- )
370
-
371
-
372
- class ToolsStatusWidget:
373
- """Installed vs stub AIDLC tools."""
374
-
375
- title = "AIDLC Tools"
376
-
377
- def collect(self, project_root: Optional[Path], cdh_dir: Optional[Path]) -> WidgetResult:
378
- from cdh.tools import tools_status as _tools_status
379
-
380
- if project_root is None:
381
- return WidgetResult(
382
- title=self.title,
383
- summary="No project root",
384
- )
385
-
386
- try:
387
- result = _tools_status(project_root)
388
- except Exception as e:
389
- return WidgetResult(
390
- title=self.title,
391
- summary="error",
392
- message=str(e),
393
- )
394
-
395
- if not result:
396
- return WidgetResult(
397
- title=self.title,
398
- summary="No tools defined",
399
- )
400
-
401
- rows: list[tuple[str, str, str]] = []
402
- installed = stub = missing = 0
403
- for name, status in sorted(result.items()):
404
- short = name.replace(".py", "")
405
- if status == "installed":
406
- installed += 1
407
- rows.append((short, "installed", "pass"))
408
- elif status == "stub":
409
- stub += 1
410
- rows.append((short, "stub", "warn"))
411
- else:
412
- missing += 1
413
- rows.append((short, status, "fail"))
414
-
415
- total = installed + stub + missing
416
- progress = installed / total if total else 0.0
417
- summary = f"{installed} installed, {stub} stub, {missing} missing"
418
-
419
- msg = None
420
- if stub or missing:
421
- msg = "Run `cdh aidlc tools install` to replace stubs."
422
-
423
- return WidgetResult(
424
- title=self.title,
425
- summary=summary,
426
- rows=rows,
427
- progress=progress,
428
- message=msg,
429
- )
430
-
431
-
432
- class FRCoverageWidget:
433
- """FR -> BDD coverage percentage."""
434
-
435
- title = "FR Coverage"
436
-
437
- _FR_RE = re.compile(r"\b([A-Z]{2,8})-FR-(\d{3})\b")
438
-
439
- def collect(self, project_root: Optional[Path], cdh_dir: Optional[Path]) -> WidgetResult:
440
- if project_root is None:
441
- return WidgetResult(
442
- title=self.title,
443
- summary="No project root",
444
- )
445
-
446
- spec_frs: set[str] = set()
447
- spec_dir = project_root / "aidlc" / "openspec" / "changes"
448
- if spec_dir.exists():
449
- for f in spec_dir.rglob("spec-delta.md"):
450
- try:
451
- text = f.read_text(encoding="utf-8")
452
- except Exception:
453
- continue
454
- for m in self._FR_RE.finditer(text):
455
- spec_frs.add(f"{m.group(1)}-FR-{m.group(2)}")
456
-
457
- feature_frs: set[str] = set()
458
- for f in project_root.rglob("*.feature"):
459
- try:
460
- text = f.read_text(encoding="utf-8")
461
- except Exception:
462
- continue
463
- for m in self._FR_RE.finditer(text):
464
- feature_frs.add(f"{m.group(1)}-FR-{m.group(2)}")
465
-
466
- if not spec_frs and not feature_frs:
467
- return WidgetResult(
468
- title=self.title,
469
- summary="No FR references found",
470
- message="Add FR ids to spec-delta.md and feature files.",
471
- )
472
-
473
- if not spec_frs:
474
- covered = 0
475
- total = len(feature_frs)
476
- progress = 0.0
477
- else:
478
- covered = len(spec_frs & feature_frs)
479
- total = len(spec_frs)
480
- progress = covered / total if total else 0.0
481
-
482
- uncovered = sorted(spec_frs - feature_frs)
483
- rows: list[tuple[str, str, str]] = []
484
- rows.append(("spec FRs", str(len(spec_frs)), "info"))
485
- rows.append(("feature FRs", str(len(feature_frs)), "info"))
486
- rows.append(("covered", str(covered), "pass"))
487
-
488
- if uncovered:
489
- rows.append(("uncovered", ", ".join(uncovered[:5]) + (
490
- f" (+{len(uncovered) - 5})" if len(uncovered) > 5 else ""
491
- ), "warn"))
492
-
493
- summary = f"{covered}/{total} FRs covered ({progress * 100:.0f}%)"
494
-
495
- return WidgetResult(
496
- title=self.title,
497
- summary=summary,
498
- rows=rows,
499
- progress=progress,
500
- )
501
-
502
-
503
- class DeploymentStatusWidget:
504
- """Preview / staging / production environment status."""
505
-
506
- title = "Deployment"
507
-
508
- _ENVS = ("preview", "staging", "production")
509
-
510
- def collect(self, project_root: Optional[Path], cdh_dir: Optional[Path]) -> WidgetResult:
511
- if project_root is None:
512
- return WidgetResult(
513
- title=self.title,
514
- summary="No project root",
515
- )
516
-
517
- project_yaml = _read_project_yaml(project_root)
518
- provider = (
519
- project_yaml.get("stack", {}).get("cross_cutting", {}).get("provider")
520
- or project_yaml.get("provider")
521
- or "tcb"
522
- )
523
-
524
- rows: list[tuple[str, str, str]] = []
525
- any_defined = False
526
-
527
- for env in self._ENVS:
528
- file1 = project_root / "aidlc" / "providers" / provider / f"{env}.yaml"
529
- file2 = project_root / "aidlc" / "providers" / provider / "deployment.yaml"
530
-
531
- defined = False
532
- config_summary = "not configured"
533
- status = "warn"
534
- for f in (file1, file2):
535
- if not f.exists():
536
- continue
537
- defined = True
538
- try:
539
- import yaml # type: ignore
540
-
541
- data = yaml.safe_load(f.read_text(encoding="utf-8")) or {}
542
- except Exception:
543
- data = {}
544
-
545
- envs_block = data.get("environments", {}) if isinstance(data, dict) else {}
546
- env_cfg = envs_block.get(env) if isinstance(envs_block, dict) else None
547
-
548
- if env == "preview" and isinstance(data, dict) and "preview" in data:
549
- env_cfg = data.get("preview")
550
- if env_cfg is None and isinstance(data, dict) and env in data:
551
- env_cfg = data.get(env)
552
-
553
- if env_cfg is not None:
554
- orch = (
555
- env_cfg.get("orchestrator")
556
- if isinstance(env_cfg, dict)
557
- else None
558
- ) or "deploy_stack"
559
- ttl = env_cfg.get("ttl") if isinstance(env_cfg, dict) else None
560
- pre = env_cfg.get("pre_conditions") if isinstance(env_cfg, dict) else None
561
- bits = [f"orch={orch}"]
562
- if ttl:
563
- bits.append(f"ttl={ttl}")
564
- if pre:
565
- bits.append(f"pre={','.join(pre)}")
566
- config_summary = " ".join(bits)
567
- status = "pass"
568
- else:
569
- config_summary = "no env entry"
570
- status = "warn"
571
-
572
- if not defined:
573
- rows.append((env, "no config", "warn"))
574
- else:
575
- rows.append((env, config_summary, status))
576
- any_defined = True
577
-
578
- summary = (
579
- f"{provider}: {sum(1 for _, _, s in rows if s == 'pass')}/{len(rows)} envs configured"
580
- )
581
-
582
- msg = None
583
- if not any_defined:
584
- msg = (
585
- "Run `cdh aidlc project init --with-ci` to scaffold provider "
586
- "configs, or `cdh aidlc config provider <name>` to generate them."
587
- )
588
-
589
- return WidgetResult(
590
- title=self.title,
591
- summary=summary,
592
- rows=rows,
593
- message=msg,
594
- )
595
-
596
-
597
- # ---------------------------------------------------------------------------
598
- # Dashboard renderer
599
- # ---------------------------------------------------------------------------
600
-
601
-
602
- _ALL_WIDGETS: list[type] = [
603
- ProgressWidget,
604
- GateWidget,
605
- SpecQualityWidget,
606
- ToolsStatusWidget,
607
- FRCoverageWidget,
608
- DeploymentStatusWidget,
609
- ]
610
-
611
-
612
- @dataclass
613
- class DashboardSnapshot:
614
- project_root: Optional[Path]
615
- cdh_dir: Optional[Path]
616
- project_name: str
617
- widgets: list[tuple[str, WidgetResult]]
618
-
619
-
620
- def collect_snapshot(
621
- workspace_root: Path,
622
- widgets: Optional[list[type]] = None,
623
- ) -> DashboardSnapshot:
624
- """Run every widget's collect() and return a DashboardSnapshot."""
625
- cdh_dir = find_cdh_dir(workspace_root)
626
- project_root = cdh_dir.parent if cdh_dir else workspace_root
627
-
628
- cfg = _read_config(cdh_dir)
629
- name = cfg.get("name") or (project_root.name if project_root else workspace_root.name)
630
-
631
- chosen = widgets or _ALL_WIDGETS
632
- out: list[tuple[str, WidgetResult]] = []
633
- for wcls in chosen:
634
- try:
635
- w = wcls()
636
- res = w.collect(project_root, cdh_dir)
637
- except Exception as e: # pragma: no cover - safety net
638
- res = WidgetResult(
639
- title=wcls.title,
640
- summary="error",
641
- message=str(e),
642
- )
643
- out.append((wcls.title, res))
644
-
645
- return DashboardSnapshot(
646
- project_root=project_root,
647
- cdh_dir=cdh_dir,
648
- project_name=name,
649
- widgets=out,
650
- )
651
-
652
-
653
- # ---------------------------------------------------------------------------
654
- # Rich rendering
655
- # ---------------------------------------------------------------------------
656
-
657
-
658
- _STATUS_STYLES = {
659
- "pass": ("green", "OK"),
660
- "fail": ("red", "X"),
661
- "warn": ("yellow", "!"),
662
- "info": ("blue", "-"),
663
- }
664
-
665
-
666
- def _render_widget_rich(console: Console, result: WidgetResult) -> Panel:
667
- if result.is_empty():
668
- body = Text("no data", style="dim")
669
- else:
670
- lines: list[Any] = []
671
- if result.summary:
672
- lines.append(Text(result.summary, style="bold"))
673
-
674
- if result.progress is not None:
675
- pct = max(0.0, min(1.0, result.progress))
676
- bar_width = 24
677
- filled = int(round(bar_width * pct))
678
- bar = "█" * filled + "░" * (bar_width - filled)
679
- pct_text = f"{pct * 100:5.1f}%"
680
- lines.append(Text(f" [{bar}] {pct_text}", style="cyan"))
681
-
682
- if result.rows:
683
- table = Table(
684
- show_header=False,
685
- show_edge=False,
686
- box=None,
687
- padding=(0, 1),
688
- )
689
- table.add_column(justify="left", style="bold", no_wrap=True)
690
- table.add_column(justify="left")
691
- table.add_column(justify="left", width=4)
692
- for label, value, status in result.rows:
693
- colour, icon = _STATUS_STYLES.get(status, ("white", "?"))
694
- table.add_row(
695
- Text(label, style="white"),
696
- Text(str(value), style="white"),
697
- Text(icon, style=colour),
698
- )
699
- lines.append(table)
700
-
701
- if result.message:
702
- lines.append(Text(result.message, style="dim italic"))
703
-
704
- if len(lines) == 1:
705
- body = lines[0]
706
- else:
707
- from rich.console import Group
708
-
709
- body = Group(*lines)
710
-
711
- border_style = "cyan"
712
- if any(s == "fail" for _, _, s in result.rows):
713
- border_style = "red"
714
- elif any(s == "warn" for _, _, s in result.rows):
715
- border_style = "yellow"
716
-
717
- return Panel(
718
- body,
719
- title=f"[bold]{result.title}[/bold]",
720
- border_style=border_style,
721
- padding=(0, 1),
722
- expand=True,
723
- )
724
-
725
-
726
- def _render_widget_plain(result: WidgetResult, width: int = 36) -> str:
727
- color = _supports_color()
728
- inner_w = max(10, width - 4)
729
-
730
- title = result.title
731
- header = f"┤ {title} ├"
732
- bar = "─" * max(1, width - len(header) - 1)
733
- top = f"┌─{header}{bar}┐"
734
-
735
- lines: list[str] = []
736
- if result.summary:
737
- lines.append(_fit(result.summary, inner_w, color, "bold"))
738
- if result.progress is not None:
739
- pct = max(0.0, min(1.0, result.progress))
740
- bar_w = max(8, inner_w - 10)
741
- filled = int(round(bar_w * pct))
742
- bar_str = "█" * filled + "░" * (bar_w - filled)
743
- line = f"[{bar_str}] {pct * 100:5.1f}%"
744
- lines.append(_fit(line, inner_w, color, "cyan"))
745
-
746
- for label, value, status in result.rows:
747
- _, icon = _STATUS_STYLES.get(status, ("white", "?"))
748
- icon_styled = _ansi(icon, {"pass": "green", "fail": "red", "warn": "yellow"}.get(status, "white")) if color else icon
749
- text = f"{icon_styled} {label}: {value}"
750
- # Truncate cleanly to inner_w
751
- text = _truncate(text, inner_w)
752
- lines.append(text)
753
-
754
- if result.message:
755
- lines.append(_fit(result.message, inner_w, color, dim_style="dim"))
756
-
757
- if not lines:
758
- lines.append(_fit("no data", inner_w, color, "dim"))
759
-
760
- body_lines = [f"│ {ln.ljust(inner_w)} │" for ln in lines]
761
- bottom = f"└{'─' * (width - 2)}┘"
762
- return "\n".join([top, *body_lines, bottom])
763
-
764
-
765
- def _fit(text: str, width: int, color: bool, style: str = "") -> str:
766
- if len(text) > width:
767
- text = text[: max(0, width - 1)] + "…"
768
- return _ansi(text, style) if color and style else text
769
-
770
-
771
- def _truncate(text: str, width: int) -> str:
772
- if len(text) > width:
773
- return text[: max(0, width - 1)] + "…"
774
- return text
775
-
776
-
777
- # ---------------------------------------------------------------------------
778
- # Public entry points
779
- # ---------------------------------------------------------------------------
780
-
781
-
782
- def render_console(snapshot: DashboardSnapshot) -> str:
783
- """Render the snapshot to a string suitable for the terminal.
784
-
785
- Uses rich if available; otherwise falls back to plain ANSI text.
786
- """
787
- if _HAVE_RICH:
788
- buf = io.StringIO()
789
- console = Console(file=buf, width=Console().width, force_terminal=False, color_system=None)
790
- _render_to_console(console, snapshot)
791
- return buf.getvalue()
792
-
793
- return _render_plain(snapshot)
794
-
795
-
796
- def _render_to_console(console: Console, snapshot: DashboardSnapshot) -> None:
797
- from rich.columns import Columns
798
-
799
- console.rule(f"[bold cyan]AIDLC Dashboard[/bold cyan] - {snapshot.project_name}")
800
- console.print(
801
- f"[dim]project:[/dim] {snapshot.project_root} "
802
- f"[dim].cdh/:[/dim] {snapshot.cdh_dir or '(none)'}"
803
- )
804
-
805
- pairs: list[Panel] = []
806
- for _, result in snapshot.widgets:
807
- pairs.append(_render_widget_rich(console, result))
808
-
809
- # 2 columns x 3 rows
810
- for i in range(0, len(pairs), 2):
811
- row = pairs[i : i + 2]
812
- if len(row) == 1:
813
- console.print(row[0])
814
- else:
815
- console.print(Columns(row, equal=True, expand=True))
816
-
817
-
818
- def _render_plain(snapshot: DashboardSnapshot) -> str:
819
- width = 80
820
- if _HAVE_RICH:
821
- try:
822
- width = max(80, Console().width)
823
- except Exception:
824
- width = 80
825
-
826
- widget_w = (width // 2) - 2
827
- out: list[str] = []
828
- out.append("=" * width)
829
- out.append(f"AIDLC Dashboard - {snapshot.project_name}".center(width))
830
- out.append("=" * width)
831
- out.append(f"project: {snapshot.project_root} .cdh/: {snapshot.cdh_dir or '(none)'}")
832
- out.append("")
833
-
834
- rendered = [_render_widget_plain(r, width=widget_w) for _, r in snapshot.widgets]
835
- for i in range(0, len(rendered), 2):
836
- left = rendered[i].splitlines()
837
- right = rendered[i + 1].splitlines() if i + 1 < len(rendered) else [""]
838
- max_h = max(len(left), len(right))
839
- while len(left) < max_h:
840
- left.append(" " * widget_w)
841
- while len(right) < max_h:
842
- right.append(" " * widget_w)
843
- for a, b in zip(left, right):
844
- out.append(f"{a} {b}")
845
- out.append("")
846
-
847
- out.append(f"generated: {time.strftime('%Y-%m-%d %H:%M:%S')}")
848
- return "\n".join(out)
849
-
850
-
851
- def render_markdown(snapshot: DashboardSnapshot) -> str:
852
- """Render the snapshot as a Markdown report."""
853
- lines: list[str] = []
854
- lines.append(f"# AIDLC Dashboard - {snapshot.project_name}")
855
- lines.append("")
856
- lines.append(f"- **Project root**: `{snapshot.project_root}`")
857
- lines.append(f"- **.cdh/**: `{snapshot.cdh_dir or '(none)'}`")
858
- lines.append(f"- **Generated**: {time.strftime('%Y-%m-%d %H:%M:%S')}")
859
- lines.append("")
860
-
861
- for _, r in snapshot.widgets:
862
- lines.append(f"## {r.title}")
863
- lines.append("")
864
- if r.summary:
865
- lines.append(f"**{r.summary}**")
866
- lines.append("")
867
- if r.progress is not None:
868
- pct = r.progress * 100
869
- lines.append(f"- Progress: `{pct:.1f}%`")
870
- if r.rows:
871
- lines.append("")
872
- lines.append("| Item | Value | Status |")
873
- lines.append("|------|-------|--------|")
874
- for label, value, status in r.rows:
875
- _, icon = _STATUS_STYLES.get(status, ("white", "?"))
876
- lines.append(f"| {label} | {value} | {icon} |")
877
- if r.message:
878
- lines.append("")
879
- lines.append(f"> {r.message}")
880
- lines.append("")
881
-
882
- return "\n".join(lines)
883
-
884
-
885
- def render_html(snapshot: DashboardSnapshot) -> str:
886
- """Render the snapshot as a self-contained HTML report."""
887
- rows_html: list[str] = []
888
- for _, r in snapshot.widgets:
889
- body_rows = "".join(
890
- f"<tr><td>{_html_escape(label)}</td><td>{_html_escape(value)}</td>"
891
- f"<td class='{status}'>{_html_escape(_STATUS_STYLES.get(status, ('', '?'))[1])}</td></tr>"
892
- for label, value, status in r.rows
893
- )
894
- progress_html = ""
895
- if r.progress is not None:
896
- pct = r.progress * 100
897
- progress_html = (
898
- f"<div class='progress'><div class='bar' style='width:{pct:.1f}%'></div>"
899
- f"<span>{pct:.1f}%</span></div>"
900
- )
901
- msg_html = f"<p class='msg'>{_html_escape(r.message)}</p>" if r.message else ""
902
- rows_html.append(
903
- f"""
904
- <section class='widget'>
905
- <h2>{_html_escape(r.title)}</h2>
906
- <p class='summary'><strong>{_html_escape(r.summary)}</strong></p>
907
- {progress_html}
908
- <table>
909
- <thead><tr><th>Item</th><th>Value</th><th>Status</th></tr></thead>
910
- <tbody>{body_rows}</tbody>
911
- </table>
912
- {msg_html}
913
- </section>
914
- """
915
- )
916
-
917
- return f"""<!doctype html>
918
- <html lang="en">
919
- <head>
920
- <meta charset="utf-8">
921
- <title>AIDLC Dashboard - {_html_escape(snapshot.project_name)}</title>
922
- <style>
923
- body {{ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
924
- margin: 2rem; color: #222; }}
925
- h1 {{ border-bottom: 2px solid #0aa; padding-bottom: .3rem; }}
926
- .grid {{ display: grid; grid-template-columns: repeat(2, 1fr); gap: 1rem; }}
927
- .widget {{ border: 1px solid #ddd; border-radius: 8px; padding: 1rem;
928
- background: #fafafa; }}
929
- .summary {{ margin: 0 0 .5rem 0; }}
930
- table {{ border-collapse: collapse; width: 100%; }}
931
- th, td {{ text-align: left; padding: .25rem .5rem; border-bottom: 1px solid #eee; }}
932
- .pass {{ color: #0a0; }}
933
- .fail {{ color: #c00; }}
934
- .warn {{ color: #c80; }}
935
- .info {{ color: #06c; }}
936
- .progress {{ background:#eee; border-radius:4px; height:14px; position:relative;
937
- margin-bottom:.5rem; }}
938
- .progress .bar {{ background:#0aa; height:100%; border-radius:4px; }}
939
- .progress span {{ position:absolute; right:.5rem; top:0; font-size:.75rem; }}
940
- .msg {{ color:#666; font-style:italic; }}
941
- </style>
942
- </head>
943
- <body>
944
- <h1>AIDLC Dashboard - {_html_escape(snapshot.project_name)}</h1>
945
- <p><strong>Project root:</strong> <code>{_html_escape(str(snapshot.project_root))}</code><br>
946
- <strong>.cdh/:</strong> <code>{_html_escape(str(snapshot.cdh_dir) if snapshot.cdh_dir else '(none)')}</code><br>
947
- <strong>Generated:</strong> {time.strftime('%Y-%m-%d %H:%M:%S')}</p>
948
- <div class='grid'>
949
- {''.join(rows_html)}
950
- </div>
951
- </body>
952
- </html>
953
- """
954
-
955
-
956
- def _html_escape(text: str) -> str:
957
- return (
958
- str(text)
959
- .replace("&", "&amp;")
960
- .replace("<", "&lt;")
961
- .replace(">", "&gt;")
962
- .replace('"', "&quot;")
963
- )
964
-
965
-
966
- # ---------------------------------------------------------------------------
967
- # CLI driver
968
- # ---------------------------------------------------------------------------
969
-
970
-
971
- def run_dashboard(
972
- workspace_root: Optional[Path] = None,
973
- *,
974
- watch: bool = False,
975
- interval: float = 2.0,
976
- export_path: Optional[Path] = None,
977
- ) -> int:
978
- """Render the dashboard once, repeatedly (watch), or export to a file.
979
-
980
- Args:
981
- workspace_root: Path to scan for .cdh/. Defaults to cwd.
982
- watch: If True, re-render every ``interval`` seconds.
983
- interval: Seconds between refreshes in watch mode.
984
- export_path: If given, write a snapshot (Markdown or HTML) and
985
- exit without entering watch mode.
986
-
987
- Returns:
988
- Process exit code (0 on success, 2 on missing project root when
989
- explicitly required, 1 on export errors).
990
- """
991
- ws = (workspace_root or Path.cwd()).expanduser().resolve()
992
-
993
- if export_path is not None:
994
- snap = collect_snapshot(ws)
995
- suffix = export_path.suffix.lower()
996
- try:
997
- export_path.parent.mkdir(parents=True, exist_ok=True)
998
- if suffix in (".html", ".htm"):
999
- export_path.write_text(render_html(snap), encoding="utf-8")
1000
- else:
1001
- export_path.write_text(render_markdown(snap), encoding="utf-8")
1002
- except Exception as e:
1003
- print(f"Failed to export dashboard: {e}", file=sys.stderr)
1004
- return 1
1005
- print(f"Wrote dashboard snapshot to {export_path}")
1006
- return 0
1007
-
1008
- if not watch:
1009
- snap = collect_snapshot(ws)
1010
- print(render_console(snap))
1011
- return 0
1012
-
1013
- # Watch mode
1014
- if _HAVE_RICH:
1015
- return _run_watch_rich(ws, interval)
1016
- return _run_watch_plain(ws, interval)
1017
-
1018
-
1019
- def _run_watch_plain(workspace_root: Path, interval: float) -> int:
1020
- """Plain (no-rich) watch loop with screen clears."""
1021
- try:
1022
- while True:
1023
- snap = collect_snapshot(workspace_root)
1024
- sys.stdout.write("\x1b[2J\x1b[H")
1025
- sys.stdout.write(render_console(snap))
1026
- sys.stdout.flush()
1027
- time.sleep(interval)
1028
- except KeyboardInterrupt:
1029
- print("\nwatch stopped")
1030
- return 0
1031
-
1032
-
1033
- def _run_watch_rich(workspace_root: Path, interval: float) -> int:
1034
- """Rich-powered watch loop using Live for clean refreshes."""
1035
- from rich.live import Live
1036
-
1037
- progress = Progress(
1038
- SpinnerColumn(),
1039
- TextColumn("[progress.description]{task.description}"),
1040
- BarColumn(),
1041
- TextColumn("{task.completed}/{task.total}"),
1042
- TimeElapsedColumn(),
1043
- transient=True,
1044
- )
1045
- task_id = progress.add_task("Refreshing dashboard...", total=None)
1046
-
1047
- def _make_layout() -> Any:
1048
- snap = collect_snapshot(workspace_root)
1049
- return _build_rich_group(snap, progress)
1050
-
1051
- try:
1052
- with Live(_make_layout(), refresh_per_second=4, screen=True) as live:
1053
- while True:
1054
- progress.update(task_id, description="Refreshing dashboard...")
1055
- live.update(_make_layout())
1056
- time.sleep(interval)
1057
- except KeyboardInterrupt:
1058
- return 0
1059
-
1060
-
1061
- def _build_rich_group(snapshot: DashboardSnapshot, progress: Progress) -> Any:
1062
- from rich.columns import Columns
1063
- from rich.console import Group
1064
-
1065
- header_parts: list[Any] = [
1066
- Text(f"AIDLC Dashboard - {snapshot.project_name}", style="bold cyan"),
1067
- Text(
1068
- f"project: {snapshot.project_root} .cdh/: {snapshot.cdh_dir or '(none)'}",
1069
- style="dim",
1070
- ),
1071
- progress,
1072
- "",
1073
- ]
1074
-
1075
- pairs: list[Panel] = []
1076
- for _, result in snapshot.widgets:
1077
- pairs.append(_render_widget_rich(Console(record=True), result))
1078
-
1079
- body_parts: list[Any] = []
1080
- for i in range(0, len(pairs), 2):
1081
- row = pairs[i : i + 2]
1082
- body_parts.append(Columns(row, equal=True, expand=True))
1083
-
1084
- return Group(*header_parts, *body_parts)