@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
@@ -1,644 +0,0 @@
1
- #!/usr/bin/env python3
2
- """contract_diff.py — Compare contract versions for backward compatibility.
3
-
4
- Supports OpenAPI 3.1 and AsyncAPI 3.0 contract formats.
5
- Outputs a contract-diff artifact and exits 0 if backward-compatible,
6
- 1 if breaking changes detected.
7
-
8
- Usage:
9
- contract_diff.py --base main --head HEAD [--project-root PATH] [--output json|markdown|summary] [--fail-on-breaking]
10
- """
11
-
12
- import argparse
13
- import json
14
- import sys
15
- import tempfile
16
- import subprocess
17
- from pathlib import Path
18
- from dataclasses import dataclass, field, asdict
19
- from typing import Any, Optional, List
20
- from enum import Enum
21
-
22
-
23
- class ChangeType(Enum):
24
- ADDED = "added"
25
- REMOVED = "removed"
26
- CHANGED = "changed"
27
-
28
-
29
- class ChangeSeverity(Enum):
30
- PATCH = "patch"
31
- MINOR = "minor"
32
- MAJOR = "major"
33
-
34
-
35
- @dataclass
36
- class Change:
37
- type: ChangeType
38
- severity: ChangeSeverity
39
- category: str
40
- location: str
41
- detail: str
42
- file: str = ""
43
- line: int = 0
44
- breaking: bool = False
45
- old_value: Optional[str] = None
46
- new_value: Optional[str] = None
47
-
48
- def to_dict(self) -> dict:
49
- d = asdict(self)
50
- d["type"] = self.type.value
51
- d["severity"] = self.severity.value
52
- return d
53
-
54
-
55
- @dataclass
56
- class DiffResult:
57
- breaking: bool = False
58
- changes: List[Change] = field(default_factory=list)
59
- file_count: int = 0
60
- version_bump: ChangeSeverity = ChangeSeverity.PATCH
61
- base_ref: str = ""
62
- head_ref: str = ""
63
- files_checked: list[str] = field(default_factory=list)
64
-
65
- def to_dict(self) -> dict:
66
- d = asdict(self)
67
- d["changes"] = [c.to_dict() for c in self.changes]
68
- d["version_bump"] = self.version_bump.value
69
- return d
70
-
71
-
72
- class YAMLLocationResolver:
73
- def __init__(self, content: str):
74
- self.lines = content.splitlines()
75
- self.line_map = self._build_line_map()
76
-
77
- def _build_line_map(self) -> dict[str, int]:
78
- mapping = {}
79
- path_stack = []
80
- for i, line in enumerate(self.lines, 1):
81
- stripped = line.lstrip()
82
- if not stripped or stripped.startswith("#"):
83
- continue
84
- indent = len(line) - len(stripped)
85
- key = stripped.split(":")[0].strip()
86
- if key and not key.startswith("-"):
87
- while path_stack and path_stack[-1][1] >= indent:
88
- path_stack.pop()
89
- path_stack.append((key, indent))
90
- path = ".".join(p[0] for p in path_stack)
91
- mapping[path] = i
92
- return mapping
93
-
94
- def get_line(self, path: str) -> int:
95
- return self.line_map.get(path, 0)
96
-
97
-
98
- def _load_yaml_with_lines(path: Path) -> tuple[dict, YAMLLocationResolver]:
99
- import yaml
100
- content = path.read_text(encoding="utf-8")
101
- data = yaml.safe_load(content) or {}
102
- return data, YAMLLocationResolver(content)
103
-
104
-
105
- def _load_yaml_from_string(content: str) -> dict:
106
- import yaml
107
- return yaml.safe_load(content) or {}
108
-
109
-
110
- def _find_contracts(project_root: Path) -> list[Path]:
111
- contracts_dir = project_root / "aidlc" / "contracts"
112
- result = []
113
- for sub in ["api", "events"]:
114
- d = contracts_dir / sub
115
- if d.exists():
116
- result.extend(sorted(d.glob("*.yaml")))
117
- return result
118
-
119
-
120
- def _get_yaml_line(resolver: Optional[YAMLLocationResolver], path: str) -> int:
121
- if resolver:
122
- return resolver.get_line(path)
123
- return 0
124
-
125
-
126
- def _compare_values(old: Any, new: Any, path: str) -> List[Change]:
127
- changes = []
128
- if old == new:
129
- return changes
130
-
131
- if isinstance(old, dict) and isinstance(new, dict):
132
- all_keys = set(old.keys()) | set(new.keys())
133
- for k in sorted(all_keys):
134
- subpath = f"{path}.{k}" if path else k
135
- if k not in old:
136
- changes.append(Change(ChangeType.ADDED, ChangeSeverity.MINOR, "property", subpath,
137
- f"Added property '{k}'", new_value=str(new[k])))
138
- elif k not in new:
139
- changes.append(Change(ChangeType.REMOVED, ChangeSeverity.MAJOR, "property", subpath,
140
- f"BREAKING: Removed property '{k}'", old_value=str(old[k]), breaking=True))
141
- else:
142
- changes.extend(_compare_values(old[k], new[k], subpath))
143
- elif isinstance(old, list) and isinstance(new, list):
144
- if len(old) != len(new) or any(o != n for o, n in zip(old, new)):
145
- changes.append(Change(ChangeType.CHANGED, ChangeSeverity.MINOR, "array", path,
146
- f"Array changed", old_value=str(old), new_value=str(new)))
147
- else:
148
- changes.append(Change(ChangeType.CHANGED, ChangeSeverity.PATCH, "value", path,
149
- f"Value changed", old_value=str(old), new_value=str(new)))
150
- return changes
151
-
152
-
153
- def _diff_openapi(base: dict, head: dict, base_resolver: Optional[YAMLLocationResolver],
154
- head_resolver: Optional[YAMLLocationResolver], file: str) -> List[Change]:
155
- changes = []
156
- base_paths = base.get("paths", {})
157
- head_paths = head.get("paths", {})
158
- all_paths = set(base_paths.keys()) | set(head_paths.keys())
159
-
160
- for p in sorted(all_paths):
161
- base_methods = base_paths.get(p, {})
162
- head_methods = head_paths.get(p, {})
163
-
164
- for method in sorted(set(base_methods.keys()) | set(head_methods.keys())):
165
- loc = f"paths.{p}.{method}"
166
- line = _get_yaml_line(head_resolver, loc) if head_resolver else 0
167
- base_loc = _get_yaml_line(base_resolver, loc) if base_resolver else 0
168
-
169
- if method not in base_methods:
170
- changes.append(Change(ChangeType.ADDED, ChangeSeverity.MINOR, "endpoint", f"{method.upper()} {p}",
171
- f"New endpoint: {method.upper()} {p}", file, line))
172
- continue
173
- if method not in head_methods:
174
- changes.append(Change(ChangeType.REMOVED, ChangeSeverity.MAJOR, "endpoint", f"{method.upper()} {p}",
175
- f"BREAKING: Removed {method.upper()} {p}", file, base_loc, breaking=True))
176
- continue
177
-
178
- b_op = base_methods[method]
179
- h_op = head_methods[method]
180
-
181
- b_params = {f"{p.get('in')}:{p.get('name')}": p for p in b_op.get("parameters", [])}
182
- h_params = {f"{p.get('in')}:{p.get('name')}": p for p in h_op.get("parameters", [])}
183
- all_params = set(b_params.keys()) | set(h_params.keys())
184
-
185
- for pk in sorted(all_params):
186
- param_loc = f"{loc}.parameters.{pk}"
187
- pline = _get_yaml_line(head_resolver, param_loc) if head_resolver else 0
188
- if pk not in b_params:
189
- changes.append(Change(ChangeType.ADDED, ChangeSeverity.MINOR, "parameter", f"{method.upper()} {p} {pk}",
190
- f"New parameter: {pk}", file, pline))
191
- elif pk not in h_params:
192
- changes.append(Change(ChangeType.REMOVED, ChangeSeverity.MAJOR, "parameter", f"{method.upper()} {p} {pk}",
193
- f"BREAKING: Removed parameter {pk}", file, pline, breaking=True))
194
- else:
195
- b_req = b_params[pk].get("required", False)
196
- h_req = h_params[pk].get("required", False)
197
- if not b_req and h_req:
198
- changes.append(Change(ChangeType.CHANGED, ChangeSeverity.MAJOR, "parameter", f"{method.upper()} {p} {pk}",
199
- f"BREAKING: Parameter {pk} became required", file, pline, breaking=True))
200
-
201
- b_resp = b_op.get("responses", {})
202
- h_resp = h_op.get("responses", {})
203
- for code in sorted(set(b_resp.keys()) | set(h_resp.keys())):
204
- resp_loc = f"{loc}.responses.{code}"
205
- rline = _get_yaml_line(head_resolver, resp_loc) if head_resolver else 0
206
- if code not in b_resp:
207
- changes.append(Change(ChangeType.ADDED, ChangeSeverity.MINOR, "response", f"{method.upper()} {p} {code}",
208
- f"New response status {code}", file, rline))
209
- elif code not in h_resp:
210
- changes.append(Change(ChangeType.REMOVED, ChangeSeverity.MAJOR, "response", f"{method.upper()} {p} {code}",
211
- f"BREAKING: Removed response status {code}", file, rline, breaking=True))
212
- else:
213
- b_content = b_resp[code].get("content", {})
214
- h_content = h_resp[code].get("content", {})
215
- for mt in sorted(set(b_content.keys()) | set(h_content.keys())):
216
- if mt not in b_content:
217
- changes.append(Change(ChangeType.ADDED, ChangeSeverity.MINOR, "response_content", f"{method.upper()} {p} {code} {mt}",
218
- f"New response media type {mt}", file, rline))
219
- elif mt not in h_content:
220
- changes.append(Change(ChangeType.REMOVED, ChangeSeverity.MAJOR, "response_content", f"{method.upper()} {p} {code} {mt}",
221
- f"BREAKING: Removed response media type {mt}", file, rline, breaking=True))
222
-
223
- b_req_body = b_op.get("requestBody", {})
224
- h_req_body = h_op.get("requestBody", {})
225
- if b_req_body and not h_req_body:
226
- changes.append(Change(ChangeType.REMOVED, ChangeSeverity.MAJOR, "request_body", f"{method.upper()} {p}",
227
- f"BREAKING: Removed request body", file, _get_yaml_line(base_resolver, f"{loc}.requestBody") or 0, breaking=True))
228
- elif not b_req_body and h_req_body:
229
- changes.append(Change(ChangeType.ADDED, ChangeSeverity.MINOR, "request_body", f"{method.upper()} {p}",
230
- f"New request body", file, _get_yaml_line(head_resolver, f"{loc}.requestBody") or 0))
231
- elif b_req_body and h_req_body:
232
- b_content = b_req_body.get("content", {})
233
- h_content = h_req_body.get("content", {})
234
- for mt in sorted(set(b_content.keys()) | set(h_content.keys())):
235
- if mt not in b_content:
236
- changes.append(Change(ChangeType.ADDED, ChangeSeverity.MINOR, "request_content", f"{method.upper()} {p} {mt}",
237
- f"New request media type {mt}", file, _get_yaml_line(head_resolver, f"{loc}.requestBody.content.{mt}") or 0))
238
- elif mt not in h_content:
239
- changes.append(Change(ChangeType.REMOVED, ChangeSeverity.MAJOR, "request_content", f"{method.upper()} {p} {mt}",
240
- f"BREAKING: Removed request media type {mt}", file, _get_yaml_line(base_resolver, f"{loc}.requestBody.content.{mt}") or 0, breaking=True))
241
-
242
- base_components = base.get("components", {}).get("schemas", {})
243
- head_components = head.get("components", {}).get("schemas", {})
244
- all_schemas = set(base_components.keys()) | set(head_components.keys())
245
-
246
- for sname in sorted(all_schemas):
247
- sloc = f"components.schemas.{sname}"
248
- line = _get_yaml_line(head_resolver, sloc) if head_resolver else 0
249
- if sname not in base_components:
250
- changes.append(Change(ChangeType.ADDED, ChangeSeverity.MINOR, "schema", sname,
251
- f"New schema: {sname}", file, line))
252
- elif sname not in head_components:
253
- changes.append(Change(ChangeType.REMOVED, ChangeSeverity.MAJOR, "schema", sname,
254
- f"BREAKING: Removed schema: {sname}", file, line, breaking=True))
255
- else:
256
- b_schema = base_components[sname]
257
- h_schema = head_components[sname]
258
-
259
- b_req = set(b_schema.get("required", []))
260
- h_req = set(h_schema.get("required", []))
261
- for f in sorted(h_req - b_req):
262
- changes.append(Change(ChangeType.CHANGED, ChangeSeverity.MAJOR, "schema_required", f"{sname}.required.{f}",
263
- f"BREAKING: Required field added to {sname}: '{f}'", file, line, breaking=True))
264
-
265
- b_props = b_schema.get("properties", {})
266
- h_props = h_schema.get("properties", {})
267
- for f in sorted(set(b_props.keys()) - set(h_props.keys())):
268
- changes.append(Change(ChangeType.REMOVED, ChangeSeverity.MAJOR, "schema_property", f"{sname}.properties.{f}",
269
- f"BREAKING: Field removed from {sname}: '{f}'", file, line, breaking=True))
270
-
271
- for f in sorted(set(h_props.keys()) - set(b_props.keys())):
272
- changes.append(Change(ChangeType.ADDED, ChangeSeverity.MINOR, "schema_property", f"{sname}.properties.{f}",
273
- f"New field added to {sname}: '{f}'", file, line))
274
-
275
- for f in sorted(set(b_props.keys()) & set(h_props.keys())):
276
- changes.extend(_compare_values(b_props[f], h_props[f], f"{sname}.properties.{f}"))
277
-
278
- b_enum = b_schema.get("enum")
279
- h_enum = h_schema.get("enum")
280
- if b_enum != h_enum:
281
- if h_enum and b_enum and set(b_enum).issubset(set(h_enum)):
282
- changes.append(Change(ChangeType.CHANGED, ChangeSeverity.MINOR, "schema_enum", f"{sname}.enum",
283
- f"Enum values added to {sname}", file, line))
284
- else:
285
- changes.append(Change(ChangeType.CHANGED, ChangeSeverity.MAJOR, "schema_enum", f"{sname}.enum",
286
- f"BREAKING: Enum values changed for {sname}", file, line, breaking=True))
287
-
288
- return changes
289
-
290
-
291
- def _get_yaml_line(resolver: Optional[YAMLLocationResolver], path: str) -> int:
292
- if resolver:
293
- return resolver.get_line(path)
294
- return 0
295
-
296
-
297
- def _diff_asyncapi(base: dict, head: dict, base_resolver: Optional[YAMLLocationResolver],
298
- head_resolver: Optional[YAMLLocationResolver], file: str) -> List[Change]:
299
- changes = []
300
- base_channels = base.get("channels", {})
301
- head_channels = head.get("channels", {})
302
- all_channels = set(base_channels.keys()) | set(head_channels.keys())
303
-
304
- for ch in sorted(all_channels):
305
- cloc = f"channels.{ch}"
306
- line = _get_yaml_line(head_resolver, cloc) if head_resolver else 0
307
- base_line = _get_yaml_line(base_resolver, cloc) if base_resolver else 0
308
-
309
- if ch not in base_channels:
310
- changes.append(Change(ChangeType.ADDED, ChangeSeverity.MINOR, "channel", ch,
311
- f"New channel: {ch}", file, line))
312
- elif ch not in head_channels:
313
- changes.append(Change(ChangeType.REMOVED, ChangeSeverity.MAJOR, "channel", ch,
314
- f"BREAKING: Removed channel: {ch}", file, base_line, breaking=True))
315
- else:
316
- b_ch = base_channels[ch]
317
- h_ch = head_channels[ch]
318
-
319
- b_ops = b_ch.get("operations", {})
320
- h_ops = h_ch.get("operations", {})
321
- all_ops = set(b_ops.keys()) | set(h_ops.keys())
322
-
323
- for op in sorted(all_ops):
324
- op_loc = f"{cloc}.operations.{op}"
325
- op_line = _get_yaml_line(head_resolver, op_loc) if head_resolver else 0
326
- b_op_line = _get_yaml_line(base_resolver, op_loc) if base_resolver else 0
327
-
328
- if op not in b_ops:
329
- changes.append(Change(ChangeType.ADDED, ChangeSeverity.MINOR, "operation", f"{ch}.{op}",
330
- f"New operation: {op} on {ch}", file, op_line))
331
- elif op not in h_ops:
332
- changes.append(Change(ChangeType.REMOVED, ChangeSeverity.MAJOR, "operation", f"{ch}.{op}",
333
- f"BREAKING: Removed operation {op} on {ch}", file, b_op_line, breaking=True))
334
- else:
335
- b_op = b_ops[op]
336
- h_op = h_ops[op]
337
-
338
- b_msg = b_op.get("message", {})
339
- h_msg = h_op.get("message", {})
340
-
341
- if b_msg.get("$ref") != h_msg.get("$ref"):
342
- if not b_msg.get("$ref"):
343
- changes.append(Change(ChangeType.ADDED, ChangeSeverity.MINOR, "message", f"{ch}.{op}.message",
344
- f"New message reference on {ch}.{op}", file, op_line))
345
- elif not h_msg.get("$ref"):
346
- changes.append(Change(ChangeType.REMOVED, ChangeSeverity.MAJOR, "message", f"{ch}.{op}.message",
347
- f"BREAKING: Removed message reference on {ch}.{op}", file, b_op_line, breaking=True))
348
- else:
349
- changes.append(Change(ChangeType.CHANGED, ChangeSeverity.MAJOR, "message", f"{ch}.{op}.message",
350
- f"BREAKING: Message reference changed on {ch}.{op}", file, op_line, breaking=True))
351
-
352
- b_bindings = b_op.get("bindings", {})
353
- h_bindings = h_op.get("bindings", {})
354
- all_bindings = set(b_bindings.keys()) | set(h_bindings.keys())
355
- for bnd in sorted(all_bindings):
356
- if bnd not in b_bindings:
357
- changes.append(Change(ChangeType.ADDED, ChangeSeverity.MINOR, "binding", f"{ch}.{op}.bindings.{bnd}",
358
- f"New binding {bnd} on {ch}.{op}", file, op_line))
359
- elif bnd not in h_bindings:
360
- changes.append(Change(ChangeType.REMOVED, ChangeSeverity.MAJOR, "binding", f"{ch}.{op}.bindings.{bnd}",
361
- f"BREAKING: Removed binding {bnd} on {ch}.{op}", file, op_line, breaking=True))
362
-
363
- b_ch_bindings = b_ch.get("bindings", {})
364
- h_ch_bindings = h_ch.get("bindings", {})
365
- all_ch_bindings = set(b_ch_bindings.keys()) | set(h_ch_bindings.keys())
366
- for bnd in sorted(all_ch_bindings):
367
- if bnd not in b_ch_bindings:
368
- changes.append(Change(ChangeType.ADDED, ChangeSeverity.MINOR, "channel_binding", f"{ch}.bindings.{bnd}",
369
- f"New channel binding {bnd} on {ch}", file, line))
370
- elif bnd not in h_ch_bindings:
371
- changes.append(Change(ChangeType.REMOVED, ChangeSeverity.MAJOR, "channel_binding", f"{ch}.bindings.{bnd}",
372
- f"BREAKING: Removed channel binding {bnd} on {ch}", file, base_line, breaking=True))
373
-
374
- b_messages = b_ch.get("messages", {})
375
- h_messages = h_ch.get("messages", {})
376
- all_msgs = set(b_messages.keys()) | set(h_messages.keys())
377
- for msg in sorted(all_msgs):
378
- msg_loc = f"{cloc}.messages.{msg}"
379
- msg_line = _get_yaml_line(head_resolver, msg_loc) if head_resolver else 0
380
- b_msg_line = _get_yaml_line(base_resolver, msg_loc) if base_resolver else 0
381
- if msg not in b_messages:
382
- changes.append(Change(ChangeType.ADDED, ChangeSeverity.MINOR, "message", f"{ch}.messages.{msg}",
383
- f"New message: {msg} on {ch}", file, msg_line))
384
- elif msg not in h_messages:
385
- changes.append(Change(ChangeType.REMOVED, ChangeSeverity.MAJOR, "message", f"{ch}.messages.{msg}",
386
- f"BREAKING: Removed message: {msg} on {ch}", file, b_msg_line, breaking=True))
387
-
388
- base_components = base.get("components", {}).get("schemas", {})
389
- head_components = head.get("components", {}).get("schemas", {})
390
- all_schemas = set(base_components.keys()) | set(head_components.keys())
391
-
392
- for sname in sorted(all_schemas):
393
- sloc = f"components.schemas.{sname}"
394
- line = _get_yaml_line(head_resolver, sloc) if head_resolver else 0
395
- if sname not in base_components:
396
- changes.append(Change(ChangeType.ADDED, ChangeSeverity.MINOR, "schema", sname,
397
- f"New schema: {sname}", file, line))
398
- elif sname not in head_components:
399
- changes.append(Change(ChangeType.REMOVED, ChangeSeverity.MAJOR, "schema", sname,
400
- f"BREAKING: Removed schema: {sname}", file, line, breaking=True))
401
- else:
402
- b_schema = base_components[sname]
403
- h_schema = head_components[sname]
404
-
405
- b_req = set(b_schema.get("required", []))
406
- h_req = set(h_schema.get("required", []))
407
- for f in sorted(h_req - b_req):
408
- changes.append(Change(ChangeType.CHANGED, ChangeSeverity.MAJOR, "schema_required", f"{sname}.required.{f}",
409
- f"BREAKING: Required field added to {sname}: '{f}'", file, line, breaking=True))
410
-
411
- b_props = b_schema.get("properties", {})
412
- h_props = h_schema.get("properties", {})
413
- for f in sorted(set(b_props.keys()) - set(h_props.keys())):
414
- changes.append(Change(ChangeType.REMOVED, ChangeSeverity.MAJOR, "schema_property", f"{sname}.properties.{f}",
415
- f"BREAKING: Field removed from {sname}: '{f}'", file, line, breaking=True))
416
-
417
- for f in sorted(set(h_props.keys()) - set(b_props.keys())):
418
- changes.append(Change(ChangeType.ADDED, ChangeSeverity.MINOR, "schema_property", f"{sname}.properties.{f}",
419
- f"New field added to {sname}: '{f}'", file, line))
420
-
421
- for f in sorted(set(b_props.keys()) & set(h_props.keys())):
422
- changes.extend(_compare_values(b_props[f], h_props[f], f"{sname}.properties.{f}"))
423
-
424
- b_enum = b_schema.get("enum")
425
- h_enum = h_schema.get("enum")
426
- if b_enum != h_enum:
427
- if h_enum and b_enum and set(b_enum).issubset(set(h_enum)):
428
- changes.append(Change(ChangeType.CHANGED, ChangeSeverity.MINOR, "schema_enum", f"{sname}.enum",
429
- f"Enum values added to {sname}", file, line))
430
- else:
431
- changes.append(Change(ChangeType.CHANGED, ChangeSeverity.MAJOR, "schema_enum", f"{sname}.enum",
432
- f"BREAKING: Enum values changed for {sname}", file, line, breaking=True))
433
-
434
- return changes
435
-
436
-
437
- def _calculate_version_bump(changes: List[Change]) -> ChangeSeverity:
438
- max_severity = ChangeSeverity.PATCH
439
- for c in changes:
440
- if c.breaking or c.severity == ChangeSeverity.MAJOR:
441
- return ChangeSeverity.MAJOR
442
- elif c.severity == ChangeSeverity.MINOR:
443
- max_severity = ChangeSeverity.MINOR
444
- return max_severity
445
-
446
-
447
- def diff(project_root: Path, base_ref: str = "main", head_ref: str = "HEAD") -> DiffResult:
448
- import subprocess
449
-
450
- contracts = _find_contracts(project_root)
451
- result = DiffResult(base_ref=base_ref, head_ref=head_ref, file_count=len(contracts))
452
- result.files_checked = [str(c.relative_to(project_root)) for c in contracts]
453
-
454
- for contract_file in contracts:
455
- rel = contract_file.relative_to(project_root)
456
- try:
457
- base_content = subprocess.run(
458
- ["git", "show", f"{base_ref}:{rel}"],
459
- capture_output=True, text=True, cwd=project_root,
460
- ).stdout
461
- except Exception as e:
462
- base_content = ""
463
- result.changes.append(Change(ChangeType.CHANGED, ChangeSeverity.PATCH, "git", str(rel),
464
- f"Warning: Could not read base ref {base_ref}:{rel}: {e}",
465
- str(rel), 0))
466
-
467
- try:
468
- head_content = subprocess.run(
469
- ["git", "show", f"{head_ref}:{rel}"],
470
- capture_output=True, text=True, cwd=project_root,
471
- ).stdout
472
- except Exception as e:
473
- try:
474
- head_content = contract_file.read_text(encoding="utf-8")
475
- except Exception as e2:
476
- head_content = ""
477
- result.changes.append(Change(ChangeType.CHANGED, ChangeSeverity.PATCH, "git", str(rel),
478
- f"Warning: Could not read head ref {head_ref}:{rel} or local file: {e2}",
479
- str(rel), 0))
480
-
481
- if not base_content.strip() and not head_content.strip():
482
- continue
483
-
484
- base_data = {}
485
- base_resolver = None
486
- if base_content.strip():
487
- with tempfile.NamedTemporaryFile(suffix=".yaml", mode="w", delete=False) as f:
488
- f.write(base_content)
489
- base_path = f.name
490
- try:
491
- base_data, base_resolver = _load_yaml_with_lines(Path(base_path))
492
- finally:
493
- Path(base_path).unlink(missing_ok=True)
494
-
495
- head_data, head_resolver = _load_yaml_with_lines(contract_file)
496
-
497
- if not base_data and not head_data:
498
- continue
499
-
500
- is_openapi = "openapi" in base_data or "openapi" in head_data
501
- if is_openapi:
502
- changes = _diff_openapi(base_data, head_data, base_resolver, head_resolver, str(rel))
503
- else:
504
- changes = _diff_asyncapi(base_data, head_data, base_resolver, head_resolver, str(rel))
505
-
506
- for c in changes:
507
- c.file = str(rel)
508
- if c.breaking:
509
- result.breaking = True
510
-
511
- result.changes.extend(changes)
512
-
513
- result.version_bump = _calculate_version_bump(result.changes)
514
- return result
515
-
516
-
517
- def write_diff_report(project_root: Path, result: DiffResult, change_id: str = "",
518
- output_format: str = "markdown") -> Path:
519
- change_dir = project_root / "aidlc" / "openspec" / "changes"
520
- if change_id:
521
- change_dir = change_dir / change_id
522
- else:
523
- changes_list = sorted(change_dir.iterdir()) if change_dir.exists() else []
524
- change_dir = change_dir / (changes_list[-1].name if changes_list else "latest")
525
- change_dir.mkdir(parents=True, exist_ok=True)
526
-
527
- if output_format == "json":
528
- output = change_dir / "contract-diff.json"
529
- output.write_text(json.dumps(result.to_dict(), indent=2), encoding="utf-8")
530
- elif output_format == "summary":
531
- output = change_dir / "contract-diff-summary.txt"
532
- breaking_count = sum(1 for c in result.changes if c.breaking)
533
- major_count = sum(1 for c in result.changes if c.severity == ChangeSeverity.MAJOR)
534
- minor_count = sum(1 for c in result.changes if c.severity == ChangeSeverity.MINOR)
535
- patch_count = sum(1 for c in result.changes if c.severity == ChangeSeverity.PATCH)
536
- lines = [
537
- "Contract Diff Summary",
538
- "=" * 40,
539
- f"Base ref: {result.base_ref}",
540
- f"Head ref: {result.head_ref}",
541
- f"Files checked: {result.file_count}",
542
- f"Total changes: {len(result.changes)}",
543
- f" Breaking (major): {breaking_count}",
544
- f" Minor: {minor_count}",
545
- f" Patch: {patch_count}",
546
- f"Recommended version bump: {result.version_bump.value.upper()}",
547
- f"Breaking changes detected: {'YES' if result.breaking else 'NO'}",
548
- ]
549
- output.write_text("\n".join(lines) + "\n", encoding="utf-8")
550
- else:
551
- output = change_dir / "contract-diff.md"
552
- lines = ["# Contract Diff", "", f"> Auto-generated by contract_diff.py",
553
- f"> Base: {result.base_ref} → Head: {result.head_ref}", "",
554
- "## Summary", "",
555
- f"| Field | Value |",
556
- f"|-------|-------|",
557
- f"| Breaking? | {'Yes' if result.breaking else 'No'} |",
558
- f"| Recommended version bump | {result.version_bump.value.upper()} |",
559
- f"| Files checked | {result.file_count} |",
560
- f"| Total changes | {len(result.changes)} |",
561
- ""]
562
-
563
- if result.changes:
564
- lines.append("## Changes")
565
- lines.append("")
566
- for c in result.changes:
567
- icon = "šŸ”“" if c.breaking else ("🟔" if c.severity == ChangeSeverity.MINOR else "🟢")
568
- lines.append(f"- {icon} **[{c.severity.value.upper()}]** [{c.type.value}] {c.detail}")
569
- lines.append(f" - File: `{c.file}`" + (f":{c.line}" if c.line else ""))
570
- lines.append(f" - Category: {c.category}")
571
- if c.old_value:
572
- lines.append(f" - Old: `{c.old_value}`")
573
- if c.new_value:
574
- lines.append(f" - New: `{c.new_value}`")
575
- lines.append("")
576
-
577
- if result.breaking:
578
- lines.append("## ⚠ BREAKING CHANGES DETECTED")
579
- lines.append("")
580
- lines.append("Human approval required before merging.")
581
- lines.append("")
582
-
583
- lines.append("---")
584
- lines.append(f"*Generated by contract_diff.py*")
585
-
586
- output.write_text("\n".join(lines) + "\n", encoding="utf-8")
587
-
588
- return output
589
-
590
-
591
- def main():
592
- parser = argparse.ArgumentParser(description="Compare contract versions")
593
- parser.add_argument("--base-ref", default="main", help="Base git ref (default: main)")
594
- parser.add_argument("--head-ref", default="HEAD", help="Head git ref (default: HEAD)")
595
- parser.add_argument("--project-root", default=".", help="Project root directory")
596
- parser.add_argument("--output", default="markdown", choices=["json", "markdown", "summary"],
597
- help="Output format (default: markdown)")
598
- parser.add_argument("--output-id", default="", help="Output change ID directory (optional)")
599
- parser.add_argument("--fail-on-breaking", action="store_true",
600
- help="Exit with code 1 if breaking changes detected (CI gate)")
601
- args = parser.parse_args()
602
-
603
- root = Path(args.project_root).resolve()
604
- result = diff(root, args.base_ref, args.head_ref)
605
-
606
- if result.changes:
607
- output_path = write_diff_report(root, result, args.output_id, args.output)
608
- print(f"Contract diff written to: {output_path.relative_to(root)}")
609
- else:
610
- print("No contract changes detected")
611
-
612
- breaking_count = sum(1 for c in result.changes if c.breaking)
613
- major_count = sum(1 for c in result.changes if c.severity == ChangeSeverity.MAJOR)
614
- minor_count = sum(1 for c in result.changes if c.severity == ChangeSeverity.MINOR)
615
- patch_count = sum(1 for c in result.changes if c.severity == ChangeSeverity.PATCH)
616
-
617
- print(f"\nSummary:")
618
- print(f" Files checked: {result.file_count}")
619
- print(f" Total changes: {len(result.changes)}")
620
- print(f" Breaking (major): {breaking_count}")
621
- print(f" Minor: {minor_count}")
622
- print(f" Patch: {patch_count}")
623
- print(f" Recommended version bump: {result.version_bump.value.upper()}")
624
-
625
- if result.changes:
626
- print("\nChanges:")
627
- for c in result.changes:
628
- icon = "BREAKING" if c.breaking else c.severity.value.upper()
629
- loc = f"{c.file}:{c.line}" if c.line else c.file
630
- print(f" [{icon}] {c.category}:{c.location} - {c.detail}")
631
-
632
- if result.breaking:
633
- print("\n⚠ Breaking changes detected — human approval required")
634
- if args.fail_on_breaking:
635
- sys.exit(1)
636
- else:
637
- sys.exit(1)
638
- else:
639
- print("\nāœ“ All contract changes are backward-compatible")
640
- sys.exit(0)
641
-
642
-
643
- if __name__ == "__main__":
644
- main()