keboola-cli 0.99.1__tar.gz → 0.100.2__tar.gz

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 (672) hide show
  1. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/CLAUDE.md +107 -30
  2. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/CONTRIBUTING.md +166 -5
  3. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/Makefile +18 -2
  4. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/PKG-INFO +18 -11
  5. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/README.md +16 -9
  6. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/pyproject.toml +4 -2
  7. keboola_cli-0.100.2/scripts/check_cli_spec.py +1477 -0
  8. keboola_cli-0.100.2/scripts/cli_spec_baseline.json +731 -0
  9. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/file_size_baseline.json +3 -3
  10. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/hatch_build.py +1 -1
  11. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/post-edit-quality.sh +18 -0
  12. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/pre-commit +5 -0
  13. keboola_cli-0.100.2/scripts/release_latest.py +279 -0
  14. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/sync_version.py +26 -0
  15. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/auto_update.py +178 -24
  16. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/changelog.py +81 -0
  17. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/cli.py +2 -1
  18. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/configs.py +17 -0
  19. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/merge_requests.py +15 -4
  20. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/misc.py +3 -2
  21. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/queue.py +3 -1
  22. keboola_cli-0.100.2/src/keboola_agent_cli/commands/_all_projects.py +45 -0
  23. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_config_clone_cmd.py +2 -7
  24. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_config_oauth.py +2 -6
  25. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_config_trash_cmd.py +3 -3
  26. keboola_cli-0.100.2/src/keboola_agent_cli/commands/_config_variables_render.py +114 -0
  27. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_data_app_git.py +4 -19
  28. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_data_app_password.py +8 -7
  29. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_data_app_runtime.py +5 -25
  30. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_flow_triggers.py +2 -1
  31. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_helpers.py +17 -0
  32. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_merge_request_common.py +2 -1
  33. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_project_create.py +2 -0
  34. keboola_cli-0.100.2/src/keboola_agent_cli/commands/_project_pin.py +79 -0
  35. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_semantic_layer_helpers.py +8 -7
  36. keboola_cli-0.100.2/src/keboola_agent_cli/commands/_storage_delete.py +187 -0
  37. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_storage_describe.py +6 -7
  38. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_storage_jobs.py +2 -7
  39. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_storage_snapshots.py +2 -1
  40. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/agent.py +4 -4
  41. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/auth.py +6 -1
  42. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/billing.py +3 -0
  43. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/branch.py +11 -19
  44. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/component.py +15 -12
  45. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/config.py +32 -153
  46. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/context.py +91 -34
  47. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/data_app.py +12 -48
  48. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/dev_portal.py +19 -17
  49. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/docs.py +2 -6
  50. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/doctor.py +2 -0
  51. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/encrypt.py +2 -5
  52. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/feature.py +2 -1
  53. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/flow.py +14 -8
  54. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/http_client.py +6 -1
  55. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/init.py +20 -7
  56. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/job.py +8 -25
  57. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/kai.py +7 -6
  58. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/lineage.py +2 -1
  59. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/notification.py +8 -4
  60. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/org.py +4 -5
  61. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/project.py +44 -95
  62. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/schedule.py +7 -1
  63. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/search.py +5 -1
  64. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/serve.py +19 -2
  65. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/sharing.py +10 -4
  66. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/storage.py +52 -189
  67. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/stream.py +2 -1
  68. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/sync.py +8 -15
  69. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/token.py +2 -1
  70. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/transformation.py +4 -3
  71. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/version.py +36 -6
  72. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/workspace.py +38 -39
  73. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/config_store.py +20 -7
  74. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/constants.py +24 -2
  75. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/data_science_client.py +2 -1
  76. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/lib.py +2 -1
  77. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/models.py +4 -0
  78. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/output.py +126 -11
  79. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/permissions.py +12 -9
  80. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/agent_runner.py +11 -5
  81. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/app.py +3 -0
  82. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/dependencies.py +128 -1
  83. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/route_permissions.py +4 -1
  84. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/configs.py +5 -1
  85. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/data_apps.py +18 -16
  86. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/jobs.py +4 -0
  87. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/schedules.py +15 -13
  88. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/workspaces.py +30 -10
  89. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_auth_registration.py +2 -0
  90. keboola_cli-0.100.2/src/keboola_agent_cli/services/_storage_tables.py +99 -0
  91. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_sync_clone.py +21 -1
  92. keboola_cli-0.100.2/src/keboola_agent_cli/services/_sync_project_guard.py +136 -0
  93. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_sync_workspace.py +6 -2
  94. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/auth_service.py +68 -22
  95. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/base.py +113 -32
  96. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/data_app_service.py +1 -1
  97. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/flow_service.py +9 -13
  98. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/job_idempotency_store.py +61 -3
  99. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/job_service.py +10 -3
  100. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/merge_request_service.py +52 -6
  101. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/org_service.py +9 -3
  102. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/project_service.py +50 -12
  103. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/storage_service.py +21 -29
  104. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/stream_service.py +16 -4
  105. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/sync_service.py +4 -48
  106. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/version_service.py +608 -154
  107. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/workspace_service.py +39 -5
  108. keboola_cli-0.100.2/src/keboola_agent_cli/update_notice.py +181 -0
  109. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/update_runner.py +139 -13
  110. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/conftest.py +11 -0
  111. keboola_cli-0.100.2/tests/snapshots/human_output/branch_merge_warning.txt +10 -0
  112. keboola_cli-0.100.2/tests/snapshots/human_output/config_detail_api_error.txt +6 -0
  113. keboola_cli-0.100.2/tests/snapshots/human_output/config_detail_panel.txt +19 -0
  114. keboola_cli-0.100.2/tests/snapshots/human_output/config_list_fanout_failure.txt +7 -0
  115. keboola_cli-0.100.2/tests/snapshots/human_output/config_list_table.txt +10 -0
  116. keboola_cli-0.100.2/tests/snapshots/human_output/project_remove_success.txt +6 -0
  117. keboola_cli-0.100.2/tests/test_all_projects_and_warnings.py +355 -0
  118. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_api_call_counts.py +1 -1
  119. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_auth_service.py +264 -0
  120. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_auto_update.py +39 -40
  121. keboola_cli-0.100.2/tests/test_branch_zero.py +439 -0
  122. keboola_cli-0.100.2/tests/test_check_cli_spec.py +471 -0
  123. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_cli.py +213 -2
  124. keboola_cli-0.100.2/tests/test_cli_contract.py +117 -0
  125. keboola_cli-0.100.2/tests/test_cli_human_snapshots.py +166 -0
  126. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_client.py +19 -0
  127. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_component_sync_action.py +67 -0
  128. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_store.py +49 -4
  129. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_data_app_service.py +27 -0
  130. keboola_cli-0.100.2/tests/test_doc_examples.py +178 -0
  131. keboola_cli-0.100.2/tests/test_error_forwarding.py +349 -0
  132. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_flow_cli.py +20 -0
  133. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_flow_service.py +32 -0
  134. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_frozen_dist.py +3 -0
  135. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_http_client_cmd.py +31 -1
  136. keboola_cli-0.100.2/tests/test_install_script.py +237 -0
  137. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_job_idempotency_store.py +133 -0
  138. keboola_cli-0.100.2/tests/test_major_gate.py +799 -0
  139. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_merge_request_client.py +23 -0
  140. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_merge_request_service.py +80 -0
  141. keboola_cli-0.100.2/tests/test_migration_page.py +75 -0
  142. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_org_service.py +47 -0
  143. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_permissions.py +23 -0
  144. keboola_cli-0.100.2/tests/test_pinned_installs.py +172 -0
  145. keboola_cli-0.100.2/tests/test_release_latest.py +460 -0
  146. keboola_cli-0.100.2/tests/test_release_workflow_major.py +249 -0
  147. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_search_cli.py +25 -1
  148. keboola_cli-0.100.2/tests/test_serve_extras_hint.py +36 -0
  149. keboola_cli-0.100.2/tests/test_server_active_project.py +125 -0
  150. keboola_cli-0.100.2/tests/test_server_dry_run_guard.py +431 -0
  151. keboola_cli-0.100.2/tests/test_server_production_branch.py +246 -0
  152. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_server_route_permissions.py +81 -13
  153. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_server_router_calls.py +261 -0
  154. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_services.py +30 -1
  155. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_storage_delete.py +178 -6
  156. keboola_cli-0.100.2/tests/test_sync_project_guard.py +367 -0
  157. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_version_script.py +101 -29
  158. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_workspaces.py +4 -2
  159. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_update_runner.py +203 -1
  160. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_variables_cli.py +49 -0
  161. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_version_service.py +165 -190
  162. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_workspace_gc.py +202 -0
  163. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/README.md +2 -1
  164. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/components/CommandPalette.tsx +3 -2
  165. keboola_cli-0.100.2/web/frontend/src/lib/branch.test.ts +40 -0
  166. keboola_cli-0.100.2/web/frontend/src/lib/branch.ts +18 -0
  167. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Configs.tsx +9 -7
  168. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/DataApps.tsx +3 -2
  169. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Flows.tsx +3 -2
  170. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/LocalAi.tsx +2 -1
  171. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Schedules.tsx +2 -1
  172. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Storage.tsx +8 -9
  173. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Streams.tsx +5 -4
  174. keboola_cli-0.100.2/web/frontend/src/pages/jobsShared.test.ts +21 -0
  175. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/jobsShared.tsx +14 -13
  176. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/whatsnew.ts +12 -0
  177. keboola_cli-0.99.1/src/keboola_agent_cli/services/_storage_tables.py +0 -51
  178. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/.gitignore +0 -0
  179. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/LICENSE +0 -0
  180. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/examples/README.md +0 -0
  181. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/examples/storage_tui/README.md +0 -0
  182. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/formal/sync/README.md +0 -0
  183. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/plugins/kbagent/.claude-plugin/CLAUDE.md +0 -0
  184. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/plugins/kbagent/skills/kbagent-cicd-migration/scripts/migrate_cicd.py +0 -0
  185. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/plugins/kbagent/skills/kbagent-promotion-pipeline/scripts/generate_promotion_pipeline.py +0 -0
  186. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/check_command_sync.py +0 -0
  187. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/check_error_codes.py +0 -0
  188. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/check_file_size.py +0 -0
  189. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/check_release_scope.py +0 -0
  190. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/check_sentinel_guards.py +0 -0
  191. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/check_version_gates.py +0 -0
  192. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/check_wheel_ui.py +0 -0
  193. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/debug_linkedby_type.sh +0 -0
  194. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/gen_command_reference.py +0 -0
  195. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/gen_endpoint_reference.py +0 -0
  196. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/gen_release_notes.py +0 -0
  197. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/generate_changelog.py +0 -0
  198. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/generate_skill.py +0 -0
  199. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/lineage_deep.py +0 -0
  200. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/web-dev.sh +0 -0
  201. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/__init__.py +0 -0
  202. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/__main__.py +0 -0
  203. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/ai_client.py +0 -0
  204. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/auth/__init__.py +0 -0
  205. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/auth/auth_client.py +0 -0
  206. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/auth/device.py +0 -0
  207. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/auth/environment.py +0 -0
  208. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/auth/models.py +0 -0
  209. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/auth/pkce.py +0 -0
  210. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/auth/sentinel.py +0 -0
  211. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/auth/state_store.py +0 -0
  212. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/auth/token_provider.py +0 -0
  213. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/auth/totp.py +0 -0
  214. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/__init__.py +0 -0
  215. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/_client.py +0 -0
  216. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/_core.py +0 -0
  217. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/_s3_multipart.py +0 -0
  218. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/_transfer.py +0 -0
  219. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/billing.py +0 -0
  220. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/branches.py +0 -0
  221. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/editor.py +0 -0
  222. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/notifications.py +0 -0
  223. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/query.py +0 -0
  224. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/storage_files.py +0 -0
  225. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/storage_tables.py +0 -0
  226. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/stream.py +0 -0
  227. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/tokens.py +0 -0
  228. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/triggers.py +0 -0
  229. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/workspaces.py +0 -0
  230. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/__init__.py +0 -0
  231. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_auth_picker.py +0 -0
  232. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_checkbox_select.py +0 -0
  233. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_lineage_build_output.py +0 -0
  234. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_lineage_tree.py +0 -0
  235. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_merge_request_render.py +0 -0
  236. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_merge_request_writes.py +0 -0
  237. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_metadata_input.py +0 -0
  238. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_progress.py +0 -0
  239. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_project_ref.py +0 -0
  240. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_semantic_layer_crud.py +0 -0
  241. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_semantic_layer_reference_data.py +0 -0
  242. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_semantic_layer_scope.py +0 -0
  243. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_storage_table_detail.py +0 -0
  244. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_storage_tables_render.py +0 -0
  245. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_sync_clone_render.py +0 -0
  246. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_sync_push_render.py +0 -0
  247. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_url_copy.py +0 -0
  248. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/changelog.py +0 -0
  249. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/config_state.py +0 -0
  250. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/merge_request.py +0 -0
  251. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/permissions.py +0 -0
  252. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/repl.py +0 -0
  253. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/semantic_layer.py +0 -0
  254. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/dev_portal_client.py +0 -0
  255. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/effective_branch.py +0 -0
  256. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/errors.py +0 -0
  257. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/frozen_dist.py +0 -0
  258. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/http_base.py +0 -0
  259. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/json_utils.py +0 -0
  260. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/manage_client.py +0 -0
  261. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/metastore_client.py +0 -0
  262. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/project_ref.py +0 -0
  263. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/py.typed +0 -0
  264. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/resources/__init__.py +0 -0
  265. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/resources/flow/__init__.py +0 -0
  266. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/resources/flow/conditional-flow-schema.json +0 -0
  267. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/resources/flow/conditional_flow_examples.jsonl +0 -0
  268. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/resources/flow/flow-schema.json +0 -0
  269. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/resources/flow/legacy_flow_examples.jsonl +0 -0
  270. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/result_models.py +0 -0
  271. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/scheduler_client.py +0 -0
  272. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/__init__.py +0 -0
  273. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/_serve_command_map.py +0 -0
  274. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/agents_store.py +0 -0
  275. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/auth.py +0 -0
  276. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/pricing.py +0 -0
  277. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/__init__.py +0 -0
  278. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/agents.py +0 -0
  279. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/ai_chat.py +0 -0
  280. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/auth.py +0 -0
  281. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/billing.py +0 -0
  282. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/branches.py +0 -0
  283. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/components.py +0 -0
  284. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/dev_portal.py +0 -0
  285. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/docs.py +0 -0
  286. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/encrypt.py +0 -0
  287. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/feature.py +0 -0
  288. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/flows.py +0 -0
  289. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/health.py +0 -0
  290. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/kai.py +0 -0
  291. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/lineage.py +0 -0
  292. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/members.py +0 -0
  293. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/merge_requests.py +0 -0
  294. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/notifications.py +0 -0
  295. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/org.py +0 -0
  296. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/permissions.py +0 -0
  297. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/projects.py +0 -0
  298. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/search.py +0 -0
  299. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/semantic_layer.py +0 -0
  300. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/sharing.py +0 -0
  301. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/storage.py +0 -0
  302. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/stream.py +0 -0
  303. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/token.py +0 -0
  304. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/transformation.py +0 -0
  305. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/run_broadcaster.py +0 -0
  306. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/sse.py +0 -0
  307. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/__init__.py +0 -0
  308. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_column_descriptions.py +0 -0
  309. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_config_clone.py +0 -0
  310. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_config_set_guard.py +0 -0
  311. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_config_trash.py +0 -0
  312. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_data_app_bodies.py +0 -0
  313. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_data_app_password.py +0 -0
  314. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_describe_batch_input.py +0 -0
  315. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_encryption.py +0 -0
  316. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_lineage_ai.py +0 -0
  317. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_lineage_er.py +0 -0
  318. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_lineage_mermaid.py +0 -0
  319. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_lineage_paths.py +0 -0
  320. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_lineage_trace.py +0 -0
  321. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_semantic_layer_cascade.py +0 -0
  322. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_semantic_layer_crud.py +0 -0
  323. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_semantic_layer_fqn.py +0 -0
  324. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_semantic_layer_internals.py +0 -0
  325. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_semantic_layer_lookup.py +0 -0
  326. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_semantic_layer_reference_data.py +0 -0
  327. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_semantic_layer_scope.py +0 -0
  328. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_storage_downloads.py +0 -0
  329. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_storage_jobs.py +0 -0
  330. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_sync_baseline.py +0 -0
  331. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_sync_bindings.py +0 -0
  332. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_sync_branch.py +0 -0
  333. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_sync_bulk.py +0 -0
  334. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_sync_clone_warnings.py +0 -0
  335. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_sync_data_app.py +0 -0
  336. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_sync_models.py +0 -0
  337. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_sync_push_ops.py +0 -0
  338. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_sync_stale.py +0 -0
  339. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_sync_storage.py +0 -0
  340. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_sync_writeback.py +0 -0
  341. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_table_detail.py +0 -0
  342. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_token_last_used.py +0 -0
  343. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_transformation_ops.py +0 -0
  344. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_workspace_load_plan.py +0 -0
  345. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/agent_service.py +0 -0
  346. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/billing_service.py +0 -0
  347. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/branch_service.py +0 -0
  348. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/component_service.py +0 -0
  349. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/config_service.py +0 -0
  350. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/data_app_git_service.py +0 -0
  351. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/deep_lineage_service.py +0 -0
  352. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/dev_portal_service.py +0 -0
  353. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/docs_service.py +0 -0
  354. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/doctor_service.py +0 -0
  355. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/encrypt_service.py +0 -0
  356. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/feature_service.py +0 -0
  357. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/flow_validation.py +0 -0
  358. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/http_forwarder_service.py +0 -0
  359. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/kai_service.py +0 -0
  360. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/lineage_service.py +0 -0
  361. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/member_service.py +0 -0
  362. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/notification_service.py +0 -0
  363. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/repo_validate_service.py +0 -0
  364. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/schedule_service.py +0 -0
  365. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/search_service.py +0 -0
  366. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/semantic_layer_service.py +0 -0
  367. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/sharing_service.py +0 -0
  368. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/snapshot_service.py +0 -0
  369. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/table_usage.py +0 -0
  370. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/token_service.py +0 -0
  371. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/transformation_service.py +0 -0
  372. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/variables_service.py +0 -0
  373. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/stream_client.py +0 -0
  374. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/sync/__init__.py +0 -0
  375. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/sync/branch_mapping.py +0 -0
  376. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/sync/branch_registry.py +0 -0
  377. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/sync/branch_scope.py +0 -0
  378. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/sync/clone.py +0 -0
  379. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/sync/code_extraction.py +0 -0
  380. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/sync/config_format.py +0 -0
  381. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/sync/diff_engine.py +0 -0
  382. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/sync/git_utils.py +0 -0
  383. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/sync/manifest.py +0 -0
  384. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/sync/naming.py +0 -0
  385. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/sync/secrets.py +0 -0
  386. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/sync/sql_split.py +0 -0
  387. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/telemetry.py +0 -0
  388. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/yaml_input.py +0 -0
  389. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/__init__.py +0 -0
  390. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/helpers.py +0 -0
  391. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_agent_cli.py +0 -0
  392. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_agent_prompt.py +0 -0
  393. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_agent_prompt_helper.py +0 -0
  394. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_agent_runner.py +0 -0
  395. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_agent_service.py +0 -0
  396. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_agent_tombstone.py +0 -0
  397. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_agents_store_events.py +0 -0
  398. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_ai_client.py +0 -0
  399. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_auth_client.py +0 -0
  400. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_auth_device.py +0 -0
  401. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_auth_environment.py +0 -0
  402. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_auth_models.py +0 -0
  403. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_auth_picker.py +0 -0
  404. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_auth_pkce.py +0 -0
  405. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_auth_register_projects.py +0 -0
  406. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_auth_sentinel.py +0 -0
  407. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_auth_sentinel_guards.py +0 -0
  408. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_auth_state_store.py +0 -0
  409. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_auth_totp.py +0 -0
  410. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_base_service.py +0 -0
  411. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_billing_cli.py +0 -0
  412. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_billing_client.py +0 -0
  413. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_billing_service.py +0 -0
  414. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_branch_metadata_cli.py +0 -0
  415. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_branch_metadata_service.py +0 -0
  416. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_branch_registry.py +0 -0
  417. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_branch_service.py +0 -0
  418. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_build_hook.py +0 -0
  419. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_changelog_check.py +0 -0
  420. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_changelog_render.py +0 -0
  421. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_check_command_sync.py +0 -0
  422. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_check_file_size.py +0 -0
  423. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_check_release_scope.py +0 -0
  424. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_check_sentinel_guards.py +0 -0
  425. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_check_version_gates.py +0 -0
  426. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_checkbox_select.py +0 -0
  427. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_choice_enums.py +0 -0
  428. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_cli_auth.py +0 -0
  429. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_client_device_enrollment.py +0 -0
  430. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_client_token_events.py +0 -0
  431. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_component_cli.py +0 -0
  432. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_component_service.py +0 -0
  433. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_clone_cli.py +0 -0
  434. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_clone_service.py +0 -0
  435. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_create_cli.py +0 -0
  436. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_create_service.py +0 -0
  437. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_encryption.py +0 -0
  438. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_examples.py +0 -0
  439. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_metadata.py +0 -0
  440. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_rename.py +0 -0
  441. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_rename_cli.py +0 -0
  442. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_resolution.py +0 -0
  443. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_row_cli.py +0 -0
  444. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_row_service.py +0 -0
  445. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_search.py +0 -0
  446. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_search_cli.py +0 -0
  447. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_set_default_bucket.py +0 -0
  448. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_set_guard.py +0 -0
  449. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_state.py +0 -0
  450. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_trash.py +0 -0
  451. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_update.py +0 -0
  452. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_data_app_cli.py +0 -0
  453. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_data_app_git_repo.py +0 -0
  454. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_data_app_password.py +0 -0
  455. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_data_app_plain_env_keys.py +0 -0
  456. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_data_app_secrets_cli.py +0 -0
  457. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_data_app_secrets_service.py +0 -0
  458. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_data_app_validate_repo_service.py +0 -0
  459. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_deep_lineage_ai.py +0 -0
  460. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_deep_lineage_service.py +0 -0
  461. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_dev_portal_cli.py +0 -0
  462. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_dev_portal_client.py +0 -0
  463. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_dev_portal_service.py +0 -0
  464. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_docs_cli.py +0 -0
  465. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_doctor_service.py +0 -0
  466. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_e2e.py +0 -0
  467. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_e2e_auth.py +0 -0
  468. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_e2e_config_dir_mode.py +0 -0
  469. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_e2e_lineage_deep.py +0 -0
  470. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_effective_branch.py +0 -0
  471. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_encrypt_cli.py +0 -0
  472. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_encrypt_service.py +0 -0
  473. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_encryption.py +0 -0
  474. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_errors.py +0 -0
  475. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_feature_cli.py +0 -0
  476. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_feature_service.py +0 -0
  477. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_file_locking.py +0 -0
  478. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_flow_examples.py +0 -0
  479. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_flow_validation.py +0 -0
  480. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_gen_command_reference.py +0 -0
  481. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_gen_endpoint_reference.py +0 -0
  482. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_gen_release_notes.py +0 -0
  483. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_generate_promotion_pipeline.py +0 -0
  484. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_helpers.py +0 -0
  485. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_http_base.py +0 -0
  486. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_http_base_auth.py +0 -0
  487. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_http_forwarder_service.py +0 -0
  488. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_integration.py +0 -0
  489. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_job_options.py +0 -0
  490. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_json_utils.py +0 -0
  491. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_kai_cli.py +0 -0
  492. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_kai_service.py +0 -0
  493. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_lib.py +0 -0
  494. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_lib_device_enrollment.py +0 -0
  495. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_license_consistency.py +0 -0
  496. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_lineage_service.py +0 -0
  497. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_lineage_view.py +0 -0
  498. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_local_ai_chat.py +0 -0
  499. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_manage_client.py +0 -0
  500. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_manage_token_bulk.py +0 -0
  501. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_manage_token_cli.py +0 -0
  502. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_mcp_migration_recipe.py +0 -0
  503. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_member_cli.py +0 -0
  504. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_member_service.py +0 -0
  505. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_merge_request_cli.py +0 -0
  506. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_metastore_client.py +0 -0
  507. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_migrate_cicd.py +0 -0
  508. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_models.py +0 -0
  509. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_normalize_script.py +0 -0
  510. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_notification_cli.py +0 -0
  511. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_notification_client.py +0 -0
  512. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_notification_service.py +0 -0
  513. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_output.py +0 -0
  514. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_partial_failure_exit_code.py +0 -0
  515. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_permissions_cli.py +0 -0
  516. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_pricing.py +0 -0
  517. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_project_create_cli.py +0 -0
  518. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_project_edit.py +0 -0
  519. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_project_edit_cli.py +0 -0
  520. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_project_info_cli.py +0 -0
  521. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_project_info_service.py +0 -0
  522. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_project_ref.py +0 -0
  523. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_project_token_stdin_no_leak.py +0 -0
  524. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_release_kbagent_ai_kit_sync.py +0 -0
  525. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_repl.py +0 -0
  526. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_result_models.py +0 -0
  527. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_run_broadcaster.py +0 -0
  528. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_s3_multipart.py +0 -0
  529. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_schedule_cli.py +0 -0
  530. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_schedule_service.py +0 -0
  531. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_scheduler_client.py +0 -0
  532. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_search_service.py +0 -0
  533. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_semantic_layer_cli.py +0 -0
  534. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_semantic_layer_schema.py +0 -0
  535. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_semantic_layer_scope.py +0 -0
  536. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_semantic_layer_scope_cli.py +0 -0
  537. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_semantic_layer_service.py +0 -0
  538. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_serve_banner_encoding.py +0 -0
  539. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_serve_conversation_id.py +0 -0
  540. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_serve_telemetry.py +0 -0
  541. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_serve_ui.py +0 -0
  542. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_server_auth.py +0 -0
  543. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_server_permissions.py +0 -0
  544. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_server_project_ref.py +0 -0
  545. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_server_semantic_layer_routes_e2e.py +0 -0
  546. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_server_smoke.py +0 -0
  547. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sharing_cli.py +0 -0
  548. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sharing_service.py +0 -0
  549. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_skill_frontmatter.py +0 -0
  550. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sql_split.py +0 -0
  551. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_storage_clone.py +0 -0
  552. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_storage_create_table.py +0 -0
  553. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_storage_describe_cli.py +0 -0
  554. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_storage_describe_service.py +0 -0
  555. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_storage_empty_definition.py +0 -0
  556. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_storage_export_filters.py +0 -0
  557. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_storage_files.py +0 -0
  558. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_storage_import_jobs.py +0 -0
  559. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_storage_snapshots.py +0 -0
  560. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_storage_swap.py +0 -0
  561. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_storage_table_definition.py +0 -0
  562. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_storage_tables.py +0 -0
  563. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_storage_truncate.py +0 -0
  564. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_storage_write.py +0 -0
  565. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_stream_cli.py +0 -0
  566. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_stream_client.py +0 -0
  567. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_stream_service.py +0 -0
  568. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_adopted_files.py +0 -0
  569. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_baseline_stamping.py +0 -0
  570. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_branch_mapping.py +0 -0
  571. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_branch_scope.py +0 -0
  572. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_cli.py +0 -0
  573. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_cli_behavior.py +0 -0
  574. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_clone.py +0 -0
  575. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_clone_links.py +0 -0
  576. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_code_extraction.py +0 -0
  577. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_config_format.py +0 -0
  578. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_data_app_type.py +0 -0
  579. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_diff_engine.py +0 -0
  580. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_e2e.py +0 -0
  581. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_encrypt.py +0 -0
  582. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_force_pull_baseline.py +0 -0
  583. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_formal_counterexamples.py +0 -0
  584. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_manifest.py +0 -0
  585. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_naming.py +0 -0
  586. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_plaintext_audit.py +0 -0
  587. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_pull_companion_files.py +0 -0
  588. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_push_encrypt_first.py +0 -0
  589. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_push_script_guard.py +0 -0
  590. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_reconcile.py +0 -0
  591. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_secrets.py +0 -0
  592. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_service.py +0 -0
  593. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_storage_jobs.py +0 -0
  594. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_table_usage.py +0 -0
  595. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_telemetry.py +0 -0
  596. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_token_cli.py +0 -0
  597. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_token_provider.py +0 -0
  598. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_token_service.py +0 -0
  599. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_transfer_progress.py +0 -0
  600. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_transformation_cli.py +0 -0
  601. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_transformation_ops.py +0 -0
  602. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_triggers_client.py +0 -0
  603. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_url_copy.py +0 -0
  604. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_variables_service.py +0 -0
  605. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_workspace_cli.py +0 -0
  606. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_workspace_service.py +0 -0
  607. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_workspace_sql_helper.py +0 -0
  608. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_yaml_input.py +0 -0
  609. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/index.html +0 -0
  610. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/package-lock.json +0 -0
  611. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/package.json +0 -0
  612. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/postcss.config.js +0 -0
  613. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/App.tsx +0 -0
  614. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/api/client.test.ts +0 -0
  615. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/api/client.ts +0 -0
  616. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/changelogNotes.test.ts +0 -0
  617. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/changelogNotes.ts +0 -0
  618. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/components/AgentRunView.tsx +0 -0
  619. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/components/ConfirmModal.tsx +0 -0
  620. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/components/DetailTabs.tsx +0 -0
  621. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/components/Drawer.tsx +0 -0
  622. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/components/Empty.tsx +0 -0
  623. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/components/JsonView.tsx +0 -0
  624. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/components/KeyValueGrid.tsx +0 -0
  625. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/components/ManageTokenModal.tsx +0 -0
  626. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/components/PillList.tsx +0 -0
  627. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/components/RawDetail.tsx +0 -0
  628. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/components/SessionExpiredBanner.tsx +0 -0
  629. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/components/Table.tsx +0 -0
  630. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/components/WhatsNew.tsx +0 -0
  631. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/config/credits.test.ts +0 -0
  632. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/config/credits.ts +0 -0
  633. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/index.css +0 -0
  634. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/layout/Shell.tsx +0 -0
  635. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/layout/Sidebar.tsx +0 -0
  636. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/layout/StatusBar.tsx +0 -0
  637. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/layout/TopBar.tsx +0 -0
  638. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/lib/time.test.ts +0 -0
  639. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/lib/time.ts +0 -0
  640. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/main.tsx +0 -0
  641. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Agents.tsx +0 -0
  642. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Branches.tsx +0 -0
  643. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Changelog.tsx +0 -0
  644. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Components.tsx +0 -0
  645. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Dashboard.tsx +0 -0
  646. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Doctor.tsx +0 -0
  647. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Encrypt.tsx +0 -0
  648. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Jobs.tsx +0 -0
  649. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/JobsAll.tsx +0 -0
  650. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Lineage.tsx +0 -0
  651. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Members.tsx +0 -0
  652. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Org.tsx +0 -0
  653. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Projects.tsx +0 -0
  654. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Search.tsx +0 -0
  655. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/SemanticLayer.tsx +0 -0
  656. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/SemanticLayerDialogs.tsx +0 -0
  657. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Sharing.tsx +0 -0
  658. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Tokens.tsx +0 -0
  659. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/TokensAll.tsx +0 -0
  660. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Workspaces.tsx +0 -0
  661. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/storageSel.test.ts +0 -0
  662. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/tokensShared.test.ts +0 -0
  663. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/tokensShared.tsx +0 -0
  664. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/router.test.ts +0 -0
  665. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/router.ts +0 -0
  666. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/state.tsx +0 -0
  667. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/theme.tsx +0 -0
  668. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/types.ts +0 -0
  669. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/useHashSelection.ts +0 -0
  670. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/tailwind.config.ts +0 -0
  671. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/tsconfig.json +0 -0
  672. {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/vite.config.ts +0 -0
@@ -206,7 +206,7 @@ from that branch -- the branch temporarily *is* the release PR.
206
206
  Beta and release-candidate versions follow **PEP 440**: `0.44.0b1`, `0.44.0rc1`, ... -- **not** the SemVer `-beta.1` form (hatchling + uv require PEP 440 syntax in `pyproject.toml`). Three independent gates keep stable users safe from accidentally landing on a beta:
207
207
 
208
208
  1. **PEP 440 pre-release suffix.** pip / uv default to **skipping** pre-releases unless told otherwise (`--pre` for pip, `--prerelease=allow` for uv).
209
- 2. **GitHub Release `prerelease: true` flag.** The auto-update startup hook calls `/releases/latest`, which GitHub defines as "the most recent non-prerelease, non-draft release". Marking the release `--prerelease` makes it invisible to the auto-update path.
209
+ 2. **GitHub Release `prerelease: true` flag.** The auto-update startup hook reads `/releases/latest`, which never names a release marked `prerelease`; when it reads the release list, it skips every release marked `prerelease` (and every PEP 440 pre-release version) unless `--beta` is given. Marking the release `--prerelease` makes it invisible to the auto-update path.
210
210
  3. **Tag-pinned install URL.** When `--beta` opts into a pre-release, the install command appends `@v<version>` to the git+ source URL so uv pulls the **exact commit** the tag points to. Without this, uv would resolve the default branch (`main`) and -- if the beta lives on a feature branch -- silently install the stale main HEAD even though the version fetcher advertised the beta tag.
211
211
 
212
212
  **Author workflow (release a beta from a feature branch):**
@@ -237,7 +237,7 @@ When the beta cooks long enough, merge the PR (stable squash) and ship `0.44.0`
237
237
  - Per-shell: `export KBAGENT_INCLUDE_PRERELEASE=1` -- every `kbagent update` / `kbagent version` in that shell treats betas as installable.
238
238
  - **No persistent setting.** Each beta install is an active choice; never a forgotten "I once typed --beta six months ago" foot-gun.
239
239
 
240
- The startup auto-update hook is **never** affected by `--beta` / env opt-in -- it always uses `/releases/latest` (stable channel). Beta installs only come from explicit `kbagent update --beta`.
240
+ The startup auto-update hook is **never** affected by `--beta` / env opt-in -- it uses the stable channel only. Beta installs only come from explicit `kbagent update --beta`.
241
241
 
242
242
  Full author checklist: see `CONTRIBUTING.md` > "Releasing a beta (pre-release) version".
243
243
 
@@ -253,9 +253,9 @@ Full author checklist: see `CONTRIBUTING.md` > "Releasing a beta (pre-release) v
253
253
 
254
254
  4. **Dual output**: every command supports `--json` for structured output and Rich formatting for human-readable output. Use `OutputFormatter.output(data, human_formatter)`.
255
255
 
256
- 5. **Error handling**: commands catch `KeboolaApiError` and `ConfigError`, map them to the appropriate exit code, and output structured errors in JSON mode.
256
+ 5. **Error handling**: commands catch `KeboolaApiError` and `ConfigError`, map them to the appropriate exit code, and output structured errors in JSON mode. Report a `KeboolaApiError` with `emit_api_error(formatter, exc)` (`commands/_helpers.py`), which keeps its `retryable` and `details`. `tests/test_error_forwarding.py` fails on a handler that drops them.
257
257
 
258
- 6. **Exit codes**: 0=success, 1=general error, 2=usage error, 3=auth error, 4=network error, 5=config error.
258
+ 6. **Exit codes**: 0=success, 1=general error, 2=usage error, 3=auth error, 4=network error, 5=config error, 6=permission denied, 7=job timed out and cancelled (`JOB_TIMEOUT_TERMINATED`), 130=interrupted.
259
259
 
260
260
  7. **Token masking**: tokens are never printed in full. Use `mask_token()` from `errors.py`.
261
261
 
@@ -319,6 +319,8 @@ Full author checklist: see `CONTRIBUTING.md` > "Releasing a beta (pre-release) v
319
319
  test's `NOT_AN_ALIAS` list; an option with any other name (like
320
320
  `sync clone --target`) needs that decision by hand.
321
321
 
322
+ 21. **The CLI interface spec is binding.** Every change to the command-line interface or the `kbagent serve` REST API follows [`docs/cli-interface-spec.md`](docs/cli-interface-spec.md); `make cli-spec-check` enforces the rules that a machine can check.
323
+
322
324
  ## Claude Code Plugin
323
325
 
324
326
  The plugin lives here in `plugins/kbagent/` and is **published through `keboola/ai-kit`**. It exposes: a CLI (`kbagent`), three skills (`kbagent`, `kbagent-cicd-migration`, `kbagent-promotion-pipeline`), three slash commands (`/kbagent:setup`, `/keboola`, `/kbagent:review`), and two specialist subagents (`keboola-expert`, `kbagent-pr-reviewer`). All are namespaced under `kbagent:`. `/kbagent:setup` is the documented one-command first-run path (install CLI -> connect project -> `doctor`); it runs in the main context and spawns no subagent.
@@ -334,7 +336,7 @@ The plugin lives here in `plugins/kbagent/` and is **published through `keboola/
334
336
 
335
337
  **The sync mechanism** is the `ai-kit-marketplace` job in `.github/workflows/release-kbagent.yml`: on every stable tag it rewrites the kbagent entry's `version` + `source.ref` in ai-kit and opens a PR there (a PR, not a push -- ai-kit's evals must see it). It needs `secrets.AI_KIT_TOKEN` in the `release` environment. No-op safe: an entry already at this version opens nothing.
336
338
 
337
- **`.claude-plugin/marketplace.json` in this repo is a DEPRECATED SHIM.** Do not delete it and do not remove its `kbagent` entry: existing installs from `keboola-agent-cli` resolve updates through it, and `scripts/sync_version.py` + `make version-check` still keep its `version` in lock-step with `pyproject.toml`. Its entry `description` carries the migration notice users see in `/plugin` listings. Plan: keep for ~3 releases, then drop the entry and leave a `renames` tombstone. `renames` cannot redirect across marketplaces, so the migration is necessarily a manual two-line user action -- which is why the notice lives in the description.
339
+ **`.claude-plugin/marketplace.json` in this repo is a DEPRECATED SHIM.** Do not delete it and do not remove its `kbagent` entry: existing installs from `keboola-agent-cli` resolve updates through it, and `scripts/sync_version.py` + `make version-check` still keep its `version` in lock-step with `pyproject.toml`. Its entry `description` carries the migration notice users see in `/plugin` listings. Plan: keep for ~3 releases, then drop the entry and leave a `renames` tombstone. `renames` cannot redirect across marketplaces, so the migration is necessarily a manual two-line user action -- which is why the notice lives in the description. Its relative `source` follows the default branch, so it must be pinned to the last 0.x tag before 1.x documents reach `main` (`CONTRIBUTING.md` > "Releasing a new major version"); for a 1.x version `scripts/sync_version.py` refuses an unpinned shim and never changes the version of a pinned one.
338
340
 
339
341
  **Update rules** -- see `CONTRIBUTING.md` > "Documentation changes (mandatory!)", "Plugin synchronization map", and "Releasing a new version" for the binding checklists. Coding convention #17 above is the short version. Do **not** maintain a parallel update list here -- it always drifts.
340
342
 
@@ -397,6 +399,12 @@ kbagent auth login-password --email EMAIL (--password PASSWORD | --password-stdi
397
399
  kbagent auth status [--stack URL|alias]
398
400
  kbagent auth logout [--stack URL|alias] [--remove-projects] [--yes]
399
401
  kbagent auth register-projects [--stack URL|alias] [--all] [--project-id ID ...] [--alias ID=ALIAS ...] [--yes]
402
+ # auth stack (CLI-32): without --stack every auth command (and serve's /auth/* without ?stack=) takes the
403
+ # stack of KBAGENT_PROJECT > active project > sole registered project > CONFIG_ERROR naming --stack,
404
+ # KBAGENT_PROJECT and `project use`. Before, only the active project. With --stack given,
405
+ # KBAGENT_PROJECT is not read. A KBAGENT_PROJECT that names no registered project is CONFIG_ERROR in
406
+ # status/logout and is skipped with a `warnings` entry in login/login-password/register-projects.
407
+ # Version gate lives in gotchas.md.
400
408
  # auth login-password (0.84.0+): the deliberate unattended exception to auth login's "needs a human at
401
409
  # a browser" rule -- email + password (+ TOTP if the account has MFA) grant, no browser, safe to run
402
410
  # from a CI secret-backed workflow step. Prefer --password-stdin (or KBC_LOGIN_PASSWORD) over
@@ -511,13 +519,19 @@ kbagent project add --project NAME --url URL [--token-stdin | --token-file PATH
511
519
  kbagent project list
512
520
  kbagent project remove --project NAME
513
521
  kbagent project edit --project NAME [--url URL] [--token-stdin | --token-file PATH [--keep-token-file] | --token-env NAME | --token TOKEN] [--new-alias NEW]
514
- kbagent project status [--project NAME]
522
+ kbagent project status [--project NAME | --all-projects]
515
523
  kbagent project refresh --project ALIAS [--dry-run] [--force] [--yes] [--token-description DESC] [--token-expires-in N]
516
524
  kbagent project refresh --all [--dry-run] [--force] [--yes] [--token-description DESC] [--token-expires-in N]
517
525
  kbagent project description-get --project NAME
518
526
  kbagent project description-set --project NAME [--text STR | --file PATH | --stdin]
519
527
  kbagent project use ALIAS
520
528
  kbagent project current
529
+ # Active project (CLI-32): `project remove` (and DELETE /projects/{alias}, bulk-delete, `auth logout
530
+ # --remove-projects`) CLEARS the active project instead of moving it to the next alias; `init --project`
531
+ # that leaves it out clears it too. Results carry `active_project_cleared` / `active_project_set`
532
+ # (project use/add, org setup, auth registration, project create). `project current` adds
533
+ # `resolved_alias` + `resolved_source` (env|active_project|sole|none). Existing keys and the `pin`
534
+ # source value are unchanged. Version gate lives in gotchas.md.
521
535
  kbagent project info --project NAME
522
536
  kbagent project invite --project ALIAS --email EMAIL --role admin|guest|readOnly|share [--reason TEXT] [--dry-run]
523
537
  kbagent project invite --from-csv FILE [--default-role ROLE] [--workers N] [--dry-run]
@@ -527,9 +541,9 @@ kbagent project invitation-cancel --project ALIAS --email EMAIL [--invitation-id
527
541
  kbagent project member-remove --project ALIAS --email EMAIL [--yes]
528
542
  kbagent project member-set-role --project ALIAS --email EMAIL --role admin|guest|readOnly|share
529
543
 
530
- kbagent config list [--project NAME] [--component-type TYPE] [--component-id ID] [--branch ID] [--include-rows]
544
+ kbagent config list [--project NAME | --all-projects] [--component-type TYPE] [--component-id ID] [--branch ID] [--include-rows]
531
545
  kbagent config detail --project NAME [--project NAME ...] --component-id ID [--config-id ID] [--branch ID] [--with-state]
532
- kbagent config search --query PATTERN [--project NAME] [--component-type TYPE] [--ignore-case] [--regex] [--branch ID]
546
+ kbagent config search --query PATTERN [--project NAME | --all-projects] [--component-type TYPE] [--ignore-case] [--regex] [--branch ID]
533
547
  kbagent config update --project NAME --component-id ID --config-id ID [--name N] [--description D] [--configuration JSON|@file|-] [--configuration-file PATH] [--set PATH=VALUE ...] [--merge] [--change-description TEXT] [--dry-run] [--branch ID] [--allow-plaintext-on-encrypt-failure]
534
548
  kbagent config set-default-bucket --project NAME --component-id ID --config-id ID (--bucket BUCKET_ID | --clear) [--dry-run] [--branch ID]
535
549
  kbagent config rename --project NAME --component-id ID --config-id ID --name "New Name" [--branch ID] [--directory DIR]
@@ -584,7 +598,11 @@ kbagent config clone --project P --component-id ID --config-id ID --name NAME [-
584
598
  # how you discover what to gather. Storage bucket/table IDs are copied VERBATIM, never remapped
585
599
  # (`sync clone` is the command that remaps).
586
600
 
587
- kbagent search QUERY [--project NAME] [--type table|bucket|config|flow|data-app|transformation] [--search-type textual|config-based] [--regex] [--scope PATH ...] [--limit N]
601
+ # --all-projects (CLI-36): on the 18 fan-out reads that read all projects without --project; until 1.0.0 the
602
+ # same as an omitted --project, with --project USAGE_ERROR (exit 2). --json envelopes gain an optional
603
+ # top-level `warnings` list ({code, message, ...}), not the same as `data.warnings`. Details and version
604
+ # gate in gotchas.md.
605
+ kbagent search QUERY [--project NAME | --all-projects] [--type table|bucket|config|flow|data-app|transformation] [--search-type textual|config-based] [--regex] [--scope PATH ...] [--limit N]
588
606
  # --regex (0.67.0+): opt-in regex mode (mode=regex). Case-insensitive whole-term match on ENTITY NAMES
589
607
  # only ('report' != 'monthly_report'; use '.*report.*'). Textual only -- error with --search-type
590
608
  # config-based. Regex does NOT match column names, so matched_columns is always empty under --regex.
@@ -594,7 +612,7 @@ kbagent search QUERY [--project NAME] [--type table|bucket|config|flow|data-app|
594
612
  # "is this referenced anywhere" miss a table spelled DCFAmount in one config and DCFAMOUNT in
595
613
  # another). `kbagent config search --query` stays case-sensitive by default (it has --ignore-case).
596
614
 
597
- kbagent job list [--project NAME] [--component-id ID] [--config-id ID] [--status STATUS] [--limit N] [--offset N] [--sort-by startTime|endTime|createdTime|durationSeconds|id] [--sort-order asc|desc]
615
+ kbagent job list [--project NAME | --all-projects] [--component-id ID] [--config-id ID] [--status STATUS] [--limit N] [--offset N] [--sort-by startTime|endTime|createdTime|durationSeconds|id] [--sort-order asc|desc]
598
616
  # job list (0.90.1+, #675): without --project the multi-project fan-out is merged GLOBALLY by
599
617
  # --sort-by/--sort-order (default startTime desc), missing values last in both directions,
600
618
  # deterministic (project_alias, id) tiebreak. Before 0.90.1 rows came back grouped alias-then-id,
@@ -603,10 +621,16 @@ kbagent job list [--project NAME] [--component-id ID] [--config-id ID] [--status
603
621
  kbagent job detail --project NAME --job-id ID [--log-tail-lines N]
604
622
  kbagent job run --project NAME --component-id ID --config-id ID [--row-id ID ...] [--wait] [--timeout N] [--branch ID] [--mode run|debug] [--variable-values-id ID] [--no-variables] [--poll-strategy exponential|fixed] [--log-tail-lines N] [--idempotency-key KEY] [--force-rerun]
605
623
  kbagent job terminate --project NAME (--job-id ID [--job-id ID ...] | --status any|created|waiting|processing [--component-id ID] [--config-id ID] [--branch ID] [--limit N]) [--dry-run] [--yes]
606
-
607
- kbagent storage buckets [--project NAME] [--branch ID]
624
+ # job terminate --status --branch 0 (CLI-21): matches only jobs whose branchId is the default branch
625
+ # ID (read from GET /v2/storage/dev-branches). Before, it matched no job. Version gate in gotchas.md.
626
+ # job run --idempotency-key: a pending entry is recorded BEFORE the create. A definite failure (4xx,
627
+ # refused connection, connect timeout) removes it; an unknown outcome (read timeout, 5xx, exhausted
628
+ # retries) keeps it, because the job may exist. A replay that finds the pending entry exits 1 (INVALID_ARGUMENT, HTTP 400 over serve) and
629
+ # creates nothing; check `job list`, then `--force-rerun`. Version gate lives in gotchas.md.
630
+
631
+ kbagent storage buckets [--project NAME | --all-projects] [--branch ID]
608
632
  kbagent storage bucket-detail --project NAME --bucket-id ID [--branch ID]
609
- kbagent storage tables [--project NAME ...] [--bucket-id ID] [--branch ID] [--include-usage]
633
+ kbagent storage tables [--project NAME ... | --all-projects] [--bucket-id ID] [--branch ID] [--include-usage]
610
634
  kbagent storage table-detail --project NAME --table-id ID [--branch ID]
611
635
  # table-detail (0.88.0+, #621): also returns the raw Storage API `definition`. On BigQuery
612
636
  # that object (timePartitioning / rangePartitioning / clustering / requirePartitionFilter /
@@ -666,6 +690,13 @@ kbagent storage delete-table --project NAME --table-id ID [--table-id ...] [--fo
666
690
  kbagent storage truncate-table --project NAME --table-id ID [--table-id ...] [--dry-run] [--yes] [--branch ID]
667
691
  kbagent storage delete-column --project NAME --table-id ID --column COL [--column ...] [--force] [--dry-run] [--yes] [--branch ID]
668
692
  kbagent storage delete-bucket --project NAME --bucket-id ID [--bucket-id ...] [--force] [--dry-run] [--yes] [--branch ID]
693
+ # delete-bucket / file-delete (CLI-30): both read --yes. Without it they ask on a terminal (stdin and
694
+ # stderr are a terminal, --json off). --json, --dry-run and a session without a terminal never ask.
695
+ # A declined prompt exits 0 and deletes nothing. delete-bucket --force cascade-deletes tables only:
696
+ # a shared bucket (`sharing` set in the bucket detail) is never deleted, also not with --force or
697
+ # over REST (DELETE /storage/buckets/{project}?force=true). It gets a failed[] entry that names
698
+ # `kbagent sharing unshare --project ALIAS --bucket-id ID`, the other buckets are still processed,
699
+ # and the run exits 1. Version gate lives in gotchas.md.
669
700
  kbagent storage swap-tables --project NAME --table-id ID --target-table-id ID --branch ID [--dry-run] [--yes] [--timeout SECONDS]
670
701
  # --timeout SECONDS on create-table and swap-tables (since 0.99.0, #713): both halves
671
702
  # of the repartition path move real data yet used to inherit the 60s metadata-job
@@ -677,6 +708,11 @@ kbagent storage swap-tables --project NAME --table-id ID --target-table-id ID --
677
708
  # `storage table-detail`). Never re-run: a repeated swap swaps the tables back,
678
709
  # a repeated --source-table-id create starts a second copy.
679
710
  kbagent storage clone-table --project NAME --table-id ID --branch ID [--dry-run]
711
+ # --branch 0 / --source-branch-id 0 (CLI-21): swap-tables --branch 0 swaps on the default branch ID it
712
+ # reads first (was: exit 5 "requires a branch"); clone-table --branch 0 is INVALID_ARGUMENT, exit 2, no
713
+ # API call (HTTP 400 over serve; the target must be a dev branch); create-table --source-branch-id 0
714
+ # omits source.branchId in a production request and sends the default branch ID in a dev-branch
715
+ # request (was: source.branchId 0). Version gate in gotchas.md.
680
716
  kbagent storage snapshot-create --project NAME --table-id ID [--description D] [--branch ID]
681
717
  kbagent storage snapshots --project NAME --table-id ID [--limit N] [--branch ID]
682
718
  kbagent storage snapshot-detail --project NAME --snapshot-id ID
@@ -745,17 +781,17 @@ kbagent lineage show --load PATH [--upstream NODE] [--downstream NODE] [--column
745
781
  kbagent lineage info --load PATH
746
782
  kbagent lineage server --load PATH [--port N] [--host HOST]
747
783
 
748
- kbagent sharing list [--project NAME]
784
+ kbagent sharing list [--project NAME | --all-projects]
749
785
  kbagent sharing share --project ALIAS --bucket-id ID --type TYPE [--target-project-ids IDs] [--target-users EMAILS]
750
786
  kbagent sharing unshare --project ALIAS --bucket-id ID
751
787
  kbagent sharing link --project ALIAS --source-project-id ID --bucket-id ID [--name NAME] [--stage in|out]
752
788
  kbagent sharing unlink --project ALIAS --bucket-id ID
753
- kbagent sharing edges [--project NAME]
789
+ kbagent sharing edges [--project NAME | --all-projects]
754
790
 
755
791
  kbagent org setup --org-id ID --url URL [--dry-run] [--yes] [--token-description PREFIX] [--refresh]
756
792
  kbagent org setup --project-ids 1,2,3 --url URL [--dry-run] [--yes] [--token-description PREFIX] [--refresh]
757
793
 
758
- kbagent billing credits [--project ALIAS ...]
794
+ kbagent billing credits [--project ALIAS ... | --all-projects]
759
795
  # billing credits (0.84.2+, issue #594 secondary ask): read-only PAYG credit balance, fanned out
760
796
  # across all registered projects in parallel by default (--project repeatable narrows). A project
761
797
  # without the `pay-as-you-go` owner.features flag never touches the billing host (NXDOMAIN on some
@@ -841,6 +877,12 @@ kbagent token refresh --project NAME --token-id ID [--yes]
841
877
  # the handlers of scope PUT, models, items/{kind} (per-kind leaf key), import, promote
842
878
  # and build check `<key> --scope organization` (FLAG_ESCALATIONS) for a typed OR an
843
879
  # inherited organization scope, like the CLI.
880
+ # `config variables-set --replace` is destructive-class (FLAG_ESCALATIONS); the CLI and
881
+ # PUT /configs/.../variables with `replace: true` both check it. `token refresh` and
882
+ # `workspace password` are destructive-class (the old secret stops working).
883
+ # `http get/post/patch/delete` (group callback, key `http.<verb>`) and `search` (top-level
884
+ # guarded set in cli.py) check the caller's own policy and --deny-* flags before any
885
+ # request. Version gate lives in gotchas.md (no `(since vNEXT)` on `# ` lines).
844
886
  # `GET /permissions/show` (serve, since 0.99.0) reports the EFFECTIVE policy (persisted block
845
887
  # merged with the daemon's --deny-* flags); read-only by design -- no REST route can widen
846
888
  # the policy that constrains it, so `permissions set|reset` stay terminal actions on the host.
@@ -856,7 +898,7 @@ kbagent permissions check OPERATION
856
898
  # are kept as inert tombstones (never run, flagged by `agent list`, FAIL in `doctor`) --
857
899
  # recreate them as `--type cli_command`.
858
900
 
859
- kbagent branch list [--project NAME]
901
+ kbagent branch list [--project NAME | --all-projects]
860
902
  kbagent branch create --project ALIAS --name "..." [--description "..."]
861
903
  kbagent branch use --project ALIAS --branch ID
862
904
  # branch use: every command that then picks a branch names it -- `Target:` on stderr, `targets` in
@@ -920,7 +962,10 @@ kbagent merge-request resolve --component-id C --config-id I (--take ours|theirs
920
962
  # Errors: a project without the feature answers FEATURE_NOT_ENABLED (exit 5) from every command whose
921
963
  # target was resolved implicitly, reads included -- two wordings, missing feature vs SOX project. A
922
964
  # scoped Storage token 403s (ACCESS_DENIED) on everything but `list`. `MR_MERGE_CONFLICT` /
923
- # `MR_NOT_READY_TO_MERGE` (exit 1; the latter retryable) come from the merge 409; a truncated conflict
965
+ # `MR_NOT_READY_TO_MERGE` (exit 1; the latter retryable) come from the merge 409. After
966
+ # MR_NOT_READY_TO_MERGE, `merge` reads the MR: state `published` (an earlier call merged it) answers
967
+ # status "already_merged", exit 0. The four state-change PUTs are never repeated by the HTTP layer.
968
+ # Version gate lives in gotchas.md. A truncated conflict
924
969
  # list in the error carries `details.api_error_params_truncated: true` -- run `conflicts` for the full set.
925
970
  # `merge` blocks for up to 10 minutes (no --wait/--timeout). Every result may carry `warnings[]`
926
971
  # (post-merge cleanup failures, a dropped --change-description on a delete resolution). A merge whose
@@ -942,7 +987,7 @@ kbagent workspace create --project ALIAS [--name NAME] [--backend TYPE] [--ui] [
942
987
  # dropped Snowflake/BigQuery provisioning in 2026-03 (the UI uses SQL Editor sessions), so the
943
988
  # green job attaches no Storage workspace. Not a race -- do not retry; use headless. Version
944
989
  # gate for this entry lives in gotchas.md (these `# ` lines parse as ATX headings).
945
- kbagent workspace list [--project NAME ...] [--orphaned] [--branch ID] [--qs-compatible]
990
+ kbagent workspace list [--project NAME ... | --all-projects] [--orphaned] [--branch ID] [--qs-compatible]
946
991
  kbagent workspace detail --project ALIAS --workspace-id ID [--branch ID]
947
992
  kbagent workspace delete --project ALIAS --workspace-id ID
948
993
  kbagent workspace password --project ALIAS --workspace-id ID
@@ -975,10 +1020,14 @@ kbagent workspace query --project ALIAS --workspace-id ID --file query.sql
975
1020
  # query: default reads results inline via Query Service `GET .../results` (fast, JSON columns+rows),
976
1021
  # capped at --limit rows (default 500); pass --full for the complete CSV export (slower, uncapped).
977
1022
  # Each statement carries structured columns+rows + a synthesized csv_data (back-compat) since 0.59.0.
978
- kbagent workspace gc [--project NAME ...] [--dry-run] [--yes]
1023
+ kbagent workspace gc (--project NAME ... | --all-projects) [--dry-run] [--yes]
1024
+ # gc (CLI-28): needs --project or --all-projects (neither or both = USAGE_ERROR, exit 2), also over
1025
+ # REST (`project=` or `all_projects=true`, else HTTP 400 INVALID_ARGUMENT). A project whose sandbox
1026
+ # configs cannot be listed goes to errors[] and nothing is deleted there. A NOT_FOUND listing counts as
1027
+ # "no sandbox configs" only when the branch component listing confirms it. Version gate lives in gotchas.md.
979
1028
  kbagent workspace from-transformation --project ALIAS --component-id ID --config-id ID [--row-id ID]
980
1029
 
981
- kbagent data-app list [--project NAME ...] [--branch ID]
1030
+ kbagent data-app list [--project NAME ... | --all-projects] [--branch ID]
982
1031
  kbagent data-app detail --project NAME --app-id ID [--branch ID]
983
1032
  kbagent data-app create --project ALIAS --name NAME --slug SLUG (--git-repo URL | --use-managed-git-repo) [--description STR | --description-file PATH] [--git-branch main] [--git-public/--no-git-public] [--git-username USER] [--git-pat-env VAR | --git-pat-file PATH | --git-pat-encrypted KBC::Project...] [--auth password|public] [--size tiny|small|medium|large] [--auto-suspend SECONDS] [--type python-js|python|streamlit|r|...] [--workspace/--no-workspace] [--branch ID] [--no-deploy] [--wait] [--timeout SECONDS] [--keep-on-failure] [--dry-run] [--copy] [--reveal]
984
1033
  # --workspace / --no-workspace (0.87.0+): DEFAULT ON. Writes runtime.workspace.enabled=true --
@@ -1043,7 +1092,7 @@ kbagent data-app git-credentials --project NAME --app-id ID
1043
1092
  kbagent data-app git-credentials-create --project NAME --app-id ID --type ssh_key|http_token --permissions readOnly|readWrite [--public-key KEY | --public-key-file PATH] [--name LABEL] [--yes]
1044
1093
  # git-repo introspects the deployed-from git repo (sandboxes-service /apps/{id}/git-repo); it returns 409 "no Git repository configured" until the app has been DEPLOYED at least once (git config syncs Storage->DS record at deploy). git-credentials* manage credentials for a MANAGED repo only; apps from `data-app create --git-repo` are external => git-credentials-create returns 409. http_token mints a ONE-TIME secret (shown once); credentials endpoints need an admin storage token.
1045
1094
 
1046
- kbagent component list [--project NAME] [--type TYPE] [--query QUERY]
1095
+ kbagent component list [--project NAME | --all-projects] [--type TYPE] [--query QUERY]
1047
1096
  kbagent component detail --component-id ID [--project NAME]
1048
1097
  # component detail (since 0.90.0): the AI Service indexes the PUBLIC catalog only, so a private/
1049
1098
  # deprecated component the project can run (keboola.mcp-server-tool, keboola.data-apps) 404'd
@@ -1135,8 +1184,12 @@ kbagent sync push --project ALIAS [--all-projects] [--dry-run] [--force] [--allo
1135
1184
  # with SYNC_LEGACY_BOUNDARY telling you to pull first; genuine edits push normally.
1136
1185
  # sync diff/push (0.89.0+, #649): local side read from exactly ONE tree (target branch subtree, else main/); entries tracked on another branch's tree are excluded from the changeset and reported under orphaned[] + summary.orphaned (reasons + reconcile hints); fix with sync pull. Adopt-by-id is branch-aware.
1137
1186
  # Ignored components (since 0.91.0, #689): keboola.mcp-server-tool joins keboola.sandboxes on ALWAYS_IGNORED_COMPONENTS (the MCP server's auto-created empty mcp-workspace-<hex> configs); the manifest field ignoredComponents (.keboola/manifest.json) is now LIVE and unions with the hardcoded set, honored by pull/diff/push. pull drops manifest entries + local dirs for a newly-ignored component, reported with action "ignored" (distinct from "removed" = deleted on remote); diff filters the local side too, so a stale dir for an ignored component can never classify as DELETED -- closes the delete-dir-then-push trap that used to destroy production keboola.mcp-server-tool configs.
1187
+ # sync pull/diff/push refuse a directory of another project (CLI-31): the manifest project.id and apiHost must
1188
+ # match the --project project (also --all-projects), else CONFIG_ERROR (exit 5) naming both project IDs, before
1189
+ # any API call. A project without a stored project_id costs one token verification call. Copy configs between
1190
+ # projects with `sync clone`. Version gate lives in gotchas.md (no `(since vNEXT)` on `# ` lines).
1138
1191
  kbagent sync clone --source DIR --target ALIAS --target-dir DIR [--bucket-map FILE] [--variable-values FILE] [--instance-rename FILE] [--no-create-buckets] [--dry-run] [--branch ID]
1139
- # `sync clone` (0.63.0+) copies a reference synced tree into a fresh target project + parameterizes it: applies bucket_map / variable_values / instance_rename overrides (JSON/YAML files), then pushes so every config CREATEs fresh -- keboola.flow and keboola.orchestrator task configIds (and configRowIds), schedule targets, and transformation variable and shared-code links are remapped reference->ULID by push Phase C/D (`link_remaps` counts each kind; a link it cannot set is an `errors[]` entry, and a failed PUT is sent again by the next push). Schedules are never activated and data apps never deployed: `warnings[]` (also on --dry-run, human mode prints them) lists those, copied `KBC::` values the target cannot decrypt, and tasks that run a config not in the tree. Only the run that creates the configs reports them; a re-run returns `warnings: []`. Idempotent: re-run with an existing --target-dir reports no_changes. Fails fast if the target already contains the reference's configs (clone needs a fresh target). Override files must be flat {id: scalar} mappings (0.89.0+): a nested mapping/list/null value is rejected with CONFIG_ERROR naming the key + actual type, instead of being silently stringified into a bogus ID. `--branch` is optional on a fresh clone. It defaults to the target's production branch, resolved from the API like `sync init`. Pass it only to target a dev branch of the target. Clone recreates the reference tree's storage buckets in the target from the `storage/buckets.json` pull export BY DEFAULT -- `--no-create-buckets` skips it. Idempotent: an existing bucket is skipped, a per-bucket failure is collected in `bucket_errors`, a linked (shared) bucket is linked to the same source as in the reference (listed in `linked_buckets`; the source's sharing settings decide, a refused link lands in `bucket_errors`). Only the buckets are created, never their tables or data (the export carries no table data). Version gate in gotchas.md.
1192
+ # `sync clone` (0.63.0+) copies a reference synced tree into a fresh target project + parameterizes it: applies bucket_map / variable_values / instance_rename overrides (JSON/YAML files), then pushes so every config CREATEs fresh -- keboola.flow and keboola.orchestrator task configIds (and configRowIds), schedule targets, and transformation variable and shared-code links are remapped reference->ULID by push Phase C/D (`link_remaps` counts each kind; a link it cannot set is an `errors[]` entry, and a failed PUT is sent again by the next push). Schedules are never activated and data apps never deployed: `warnings[]` (also on --dry-run, human mode prints them) lists those, copied `KBC::` values the target cannot decrypt, and tasks that run a config not in the tree. Only the run that creates the configs reports them; a re-run returns `warnings: []`. Idempotent: re-run with an existing --target-dir reports no_changes. Fails fast if the target already contains the reference's configs (clone needs a fresh target). Override files must be flat {id: scalar} mappings (0.89.0+): a nested mapping/list/null value is rejected with CONFIG_ERROR naming the key + actual type, instead of being silently stringified into a bogus ID. `--branch` is optional on a fresh clone. It defaults to the target's production branch, resolved from the API like `sync init`. An active branch set with `branch use` on the target wins over production. Pass `--branch` only to target a dev branch of the target. Clone recreates the reference tree's storage buckets in the target from the `storage/buckets.json` pull export BY DEFAULT -- `--no-create-buckets` skips it. Idempotent: an existing bucket is skipped, a per-bucket failure is collected in `bucket_errors`, a linked (shared) bucket is linked to the same source as in the reference (listed in `linked_buckets`; the source's sharing settings decide, a refused link lands in `bucket_errors`). Only the buckets are created, never their tables or data (the export carries no table data). Version gate in gotchas.md.
1140
1193
  kbagent sync branch-link --project ALIAS (--branch-id ID | --branch-name NAME) [--directory DIR]
1141
1194
  kbagent sync branch-unlink [--directory DIR]
1142
1195
  kbagent sync branch-status [--directory DIR]
@@ -1275,14 +1328,14 @@ kbagent http delete PATH [--timeout SECONDS]
1275
1328
 
1276
1329
  kbagent agent list
1277
1330
  kbagent agent show TASK_ID
1278
- kbagent agent create --name NAME [--description D] [--cron CRON] [--manual] [--enabled/--disabled] (--type ai_agent --cli CLI --prompt P [--extra-arg ARG ...] [--timeout SECONDS] | --type cli_command --argv ARG [--argv ARG ...] [--timeout SECONDS] | --from-file PATH|@path|-) [--trigger-task-id ID --trigger-on success|error|always]
1331
+ kbagent agent create --name NAME [--description D] [--cron CRON] [--manual] [--enabled/--disabled] (--type ai_agent --cli CLI --prompt P [--extra-arg ARG ...] [--timeout SECONDS] | --type cli_command --argv ARG [--argv ARG ...] [--timeout SECONDS] | --from-file JSON|@path|-) [--trigger-task-id ID --trigger-on success|error|always]
1279
1332
  kbagent agent update TASK_ID [--name N] [--description D] [--cron C] [--enabled/--disabled] [--manual/--auto] [--clear-trigger] [--trigger-task-id ID --trigger-on success|error|always]
1280
1333
  kbagent agent delete TASK_ID [--yes]
1281
1334
  kbagent agent run TASK_ID [--stream] [--runtime-prompt TEXT | --runtime-input JSON|@file|-]
1282
1335
  kbagent agent runs TASK_ID [--limit N]
1283
1336
  kbagent agent run-detail TASK_ID RUN_ID
1284
1337
  kbagent agent run-events TASK_ID RUN_ID
1285
- kbagent agent test (--type ai_agent --cli CLI --prompt P | --type cli_command --argv ARG ... | --from-file PATH) [--name N] [--stream] [--timeout SECONDS]
1338
+ kbagent agent test (--type ai_agent --cli CLI --prompt P | --type cli_command --argv ARG ... | --from-file JSON|@path|-) [--name N] [--stream] [--timeout SECONDS]
1286
1339
  kbagent agent cron-preview --cron "0 6 * * 1" [--count N]
1287
1340
  kbagent agent prompt-improve --goal "..." [--draft "..."] [--cli claude|codex|gemini] [--project ALIAS] [--extra-arg X ...] [--stream/--no-stream]
1288
1341
  # `agent` reads/writes <config_dir>/agents.json directly (offline-first, no
@@ -1322,7 +1375,7 @@ kbagent docs query "QUESTION" [--project NAME]
1322
1375
  # (0.73.0+) Documentation Q&A via the AI Service (server-side RAG). Unlike kai ask it does NOT
1323
1376
  # see project data; works with any token. --json emits {query, text, source_urls}.
1324
1377
 
1325
- kbagent flow list [--project NAME] [--branch ID] [--with-schedules]
1378
+ kbagent flow list [--project NAME | --all-projects] [--branch ID] [--with-schedules]
1326
1379
  kbagent flow detail --project NAME --flow-id ID [--branch ID]
1327
1380
  kbagent flow schema [--full [--project NAME]]
1328
1381
  kbagent flow examples [--component-id keboola.flow|keboola.orchestrator]
@@ -1330,6 +1383,9 @@ kbagent flow validate --file @flow.yaml|- [--project NAME]
1330
1383
  kbagent flow new --project NAME --name NAME [--description D] [--file @path.yaml|-|JSON] [--branch ID]
1331
1384
  kbagent flow update --project NAME --flow-id ID [--name N] [--description D] [--file @path.yaml|-|JSON] [--branch ID]
1332
1385
  kbagent flow delete --project NAME --flow-id ID [--branch ID] [--yes]
1386
+ # flow delete: the same locate-first soft delete as `config delete` -- a flow already in the trash
1387
+ # answers status "already_in_trash", exit 0, and no second DELETE (it would purge). Version gate
1388
+ # lives in gotchas.md.
1333
1389
  kbagent flow schedule --project NAME --flow-id ID --cron "0 6 * * *" [--timezone TZ] [--disabled] [--branch ID]
1334
1390
  kbagent flow schedule-remove --project NAME --flow-id ID [--branch ID] [--yes]
1335
1391
  kbagent flow triggers --project NAME --flow-id ID [--branch ID]
@@ -1372,11 +1428,11 @@ kbagent flow triggers --project NAME --flow-id ID [--branch ID]
1372
1428
  # flow schedule-remove deregisters from the service before deleting each config.
1373
1429
  # Execute a flow with: kbagent job run --project NAME --component-id keboola.flow --config-id ID
1374
1430
 
1375
- kbagent schedule list [--project NAME ...] [--enabled-only] [--branch ID]
1431
+ kbagent schedule list [--project NAME ... | --all-projects] [--enabled-only] [--branch ID]
1376
1432
  kbagent schedule detail --project NAME --schedule-id ID [--branch ID]
1377
- kbagent schedule find [--cron-window START-END] [--not-run-since DAYS] [--project NAME ...] [--branch ID]
1433
+ kbagent schedule find [--cron-window START-END] [--not-run-since DAYS] [--project NAME ... | --all-projects] [--branch ID]
1378
1434
 
1379
- kbagent notification list [--project NAME ...] [--event NAME] [--component-id ID] [--config-id ID]
1435
+ kbagent notification list [--project NAME ... | --all-projects] [--event NAME] [--component-id ID] [--config-id ID]
1380
1436
  kbagent notification detail --project NAME --subscription-id ID
1381
1437
  kbagent notification create --project ALIAS --event NAME --channel email|webhook --address ADDR [--component-id ID] [--config-id ID] [--branch ID] [--expires-at TS]
1382
1438
  kbagent notification delete --project ALIAS --subscription-id ID [--yes]
@@ -1425,7 +1481,20 @@ kbagent doctor
1425
1481
  # each as `--type cli_command` using the map in docs/mcp-migration.md.
1426
1482
  # `doctor` has no `--fix` since 0.85.0 -- it only ever installed keboola-mcp-server.
1427
1483
  kbagent version [--beta]
1428
- kbagent update [--beta]
1484
+ kbagent update [--beta] [--major]
1485
+ # Major gate (CLI-40, #791 section 4.3): the updater (startup hook, `update`, `version`) reads
1486
+ # /releases/latest (the list /releases?per_page=100 only for --beta or when latest names a higher
1487
+ # major) plus /releases/tags/v<N+1>.0.0 at most once per 24 h, and stays on the running major. It installs the next major only at M
1488
+ # (published_at of the GitHub release v<N+1>.0.0 + 28 days, "now" = the GitHub Date header) or
1489
+ # with `update --major`; `--beta` alone never crosses. A crossing always goes through the deferred
1490
+ # helper (update_runner.py; /bin/sh + pgrep on POSIX, PowerShell on Windows): the command finishes
1491
+ # on the old major, no re-exec, a running `serve` holds it (helper gives up after 900 s). While
1492
+ # v<N+1>.0.0 exists the DEPRECATED_VERSION notice shows: stderr once per 24 h and every run in the
1493
+ # last 72 h before M; always in version/update/doctor/context; under --json a top-level warnings[]
1494
+ # entry on every run (update_notice.py keeps it at module level, output.py adds it to both
1495
+ # envelopes). Cache keys next_major_version/_release_id/_published_at, checked_at,
1496
+ # notice_shown_at; a cached latest_version of a higher major is ignored; `version --beta` no
1497
+ # longer writes the cache. Version gate lives in gotchas.md.
1429
1498
  # `--beta` (or env `KBAGENT_INCLUDE_PRERELEASE=1`) opts into pre-release versions
1430
1499
  # (PEP 440 betas/rc, e.g. 0.43.0b1). Default (no flag) is stable-only -- auto-update
1431
1500
  # startup hook never silently lands on a beta.
@@ -1449,6 +1518,14 @@ kbagent update [--beta]
1449
1518
  kbagent changelog [--limit N] [--full]
1450
1519
  # Default shows first sentences: every BREAKING note of a version, plus its first other notes until at least two show; --full / -v expands every note.
1451
1520
  kbagent serve [--host HOST] [--port PORT] [--ui] [--ui-dist PATH] [--reload] [--log-level LVL] [--cors-origin ORIGIN] [--config-dir DIR] [--no-banner]
1521
+ # serve dry_run (CLI-33): a POST/PUT/PATCH/DELETE route answers HTTP 422 (HTTP_ERROR) when the
1522
+ # request sends `dry_run` in the query string or as a top-level JSON body key, and the route does
1523
+ # not declare it there. Before, the route ignored it and ran the real write.
1524
+ # A false value (false/0/no/off/f/n in any case, or JSON false/0) is ignored and the real write runs.
1525
+ # Any other value (true, null, an unknown string) is refused.
1526
+ # One app-level dependency does this: reject_undeclared_dry_run in server/dependencies.py.
1527
+ # Not checked: GET routes, nested keys, multipart upload bodies, and a body above 1 MiB (or without
1528
+ # Content-Length) on a route that has no body parameter. Version gate lives in gotchas.md.
1452
1529
  # `--config-dir` on serve (since 0.91.0, #679): `serve` is the only subcommand with a --config-dir of
1453
1530
  # its own, and most specific wins -- `serve --config-dir X` beats a root `kbagent --config-dir Y`,
1454
1531
  # which in turn beats KBAGENT_CONFIG_DIR / the .kbagent walk-up / global. Passing both is NOT an
@@ -51,7 +51,7 @@ def storage_create_bucket(ctx, project, stage, name):
51
51
  try:
52
52
  result = service.create_bucket(alias=project, stage=stage, name=name)
53
53
  except KeboolaApiError as exc:
54
- formatter.error(message=exc.message, error_code=exc.error_code)
54
+ emit_api_error(formatter, exc) # keeps code, message, retryable, details
55
55
  raise typer.Exit(code=map_error_to_exit_code(exc)) from None
56
56
  formatter.output(result) if formatter.json_mode else ...
57
57
 
@@ -91,7 +91,7 @@ Never print raw text that breaks JSON parsing. Always check `formatter.json_mode
91
91
  ### Error handling
92
92
 
93
93
  - Commands catch `KeboolaApiError` and `ConfigError`, map to exit codes
94
- - Exit codes: 0=success, 1=general, 2=usage, 3=auth, 4=network, 5=config, 6=permission denied
94
+ - Exit codes: 0=success, 1=general, 2=usage, 3=auth, 4=network, 5=config, 6=permission denied, 7=job timed out and cancelled, 130=interrupted
95
95
  - Multi-project operations accumulate errors -- one project failing doesn't stop others
96
96
  - Use `raise typer.Exit(code=N) from None` to suppress traceback in CLI
97
97
 
@@ -355,6 +355,7 @@ When adding a new command (e.g., `kbagent storage create-foo`), you must update
355
355
  - [ ] **Permission registration** in `permissions.py` (`OPERATION_REGISTRY` dict)
356
356
  - [ ] **Branch choice** through `resolve_branch()` in `effective_branch.py` when the command takes `--branch` or uses the active branch -- never read `ProjectConfig.active_branch_id` directly. The function reports the branch (`Target:` line, `targets` in `--json`); `tests/test_effective_branch.py` fails on a new direct read.
357
357
  - [ ] **`--project` naming a NEW alias** -- every `--project` option also takes a project ID, translated to the alias before the command runs (`commands/_project_ref.py`, CLI-22). A command whose `--project` is not a registry lookup (a new alias like `project add`, an offline filter like `lineage show`) must be added to `NO_LOOKUP_COMMANDS` there, and an option with another name that takes an existing alias (like `config clone --target-project`) to `ALIAS_OPTIONS`. `tests/test_project_ref.py` fails on a new option whose flag contains `project`, `alias` or `stack` until it is in `ALIAS_OPTIONS` or in the test's `NOT_AN_ALIAS` list (with a reason); an option with any other name needs this decision by hand.
358
+ - [ ] **CLI interface spec** -- the command, its options, help, output, exit codes and its REST route follow [`docs/cli-interface-spec.md`](docs/cli-interface-spec.md). Run `make cli-spec-check`: a new violation of a blocking rule fails it, and each failure line links to the rule. The rules marked "review" in the spec are checked by the reviewer.
358
359
  - [ ] **Service wiring** in `cli.py` if adding a new service class
359
360
  - [ ] **HTTP API endpoint** in `src/keboola_agent_cli/server/routers/<group>.py` -- `kbagent serve` exposes the CLI as a REST API so external applications (Web UI, scheduled AI agents, Slack bots, Streamlit dashboards, CI pipelines) can call the platform without forking CLI subprocesses. The current convention is **1:1**: every command in a group has a matching endpoint in that group's router (e.g. `commands/flow.py` has 8 commands, `server/routers/flows.py` has 8 routes). If you add a new command, add the corresponding route. **Skip allowed** only for genuinely terminal-only commands (interactive prompts, Rich-rendered output that has no useful JSON shape, `doctor`/`init`/`update`-style infrastructure that manages kbagent itself rather than Keboola). Document any skip in the PR description with a one-line reason so reviewers don't flag it.
360
361
 
@@ -377,6 +378,7 @@ done** until every box below is ticked.
377
378
 
378
379
  - [ ] **`SKILL.md` decision table** -- run `make skill-gen` and commit the diff. **Do NOT edit the table by hand** -- the markers will be overwritten on the next `make skill-gen`. The pre-commit hook auto-regenerates and stages this file.
379
380
  - [ ] **`plugin.json` version** -- bumped via `make version-sync` from `pyproject.toml`. The pre-commit hook auto-stages this file; you should never edit it by hand.
381
+ - [ ] **`docs/cli-manifest.json`** -- the command manifest (commands, options, help texts). Run `make cli-manifest` and commit the diff; `make cli-spec-check` fails while the file differs from the live tree.
380
382
 
381
383
  #### Plugin (`plugins/kbagent/`) -- HAND-MAINTAINED, NO CI CHECK
382
384
 
@@ -618,6 +620,10 @@ catch you** if you skip them; they are the manual safety net for the
618
620
  silent-drift risks summarized in the
619
621
  [Plugin synchronization map](#plugin-synchronization-map) above.
620
622
 
623
+ > **Releasing a new major version (1.0.0)?** Walk this checklist as usual, and
624
+ > also follow [Releasing a new major version](#releasing-a-new-major-version)
625
+ > below: the GitHub "latest" flag, PyPI and the old-major fixes follow extra rules.
626
+
621
627
  > **Want to ship a beta first?** You can. PEP 440 pre-release versions
622
628
  > (`0.43.0b1`, `0.43.0rc1`) are fully supported by `kbagent update --beta`
623
629
  > since v0.42.0. The startup auto-update hook never silently lands on a
@@ -651,6 +657,8 @@ silent-drift risks summarized in the
651
657
  A leftover `(since vNEXT)` ships agents a gate no installed version can
652
658
  ever satisfy -- strictly worse than no gate, because they then refuse a
653
659
  command the user has. The release PR is the only place it can be fixed.
660
+ When a replaced placeholder is inside a command or option help string,
661
+ also run `make cli-manifest` and commit `docs/cli-manifest.json`.
654
662
 
655
663
  **This is now CI-enforced.** The `check` job runs the same check on any PR
656
664
  that RAISES `pyproject.toml`'s version, so a missed placeholder is a red
@@ -795,8 +803,10 @@ users safe from accidentally landing on a beta:
795
803
  **skipping** pre-releases unless the resolver is told otherwise (`--pre`
796
804
  for pip, `--prerelease=allow` for uv).
797
805
  2. **GitHub Release `prerelease: true` flag.** The auto-update startup
798
- hook calls `GET /releases/latest`, which GitHub explicitly defines as
799
- "the most recent non-prerelease, non-draft release". Marking the release
806
+ hook reads `GET /releases/latest`, which never names a release marked
807
+ `prerelease`; the release list is read only with `--beta` or when the
808
+ latest release is of a higher major, and then pre-releases are skipped
809
+ unless `--beta` is given. Marking the release
800
810
  `--prerelease` makes it invisible to the auto-update path.
801
811
 
802
812
  **Workflow:**
@@ -853,10 +863,124 @@ each invocation has to opt in. This is deliberate: betas should always be
853
863
  an active choice, never a forgotten "I once typed --beta six months ago"
854
864
  foot-gun.
855
865
 
866
+ ### Releasing a new major version
867
+
868
+ These rules apply to 1.0.0 and to every later major. What users see and how to
869
+ stay on 0.x is in [docs/migrate-to-1.0.md](docs/migrate-to-1.0.md); the
870
+ maintainer rehearsal before T0 is
871
+ [docs/release-1.0-rehearsal.md](docs/release-1.0-rehearsal.md).
872
+
873
+ - **T0** is the `published_at` of the GitHub release `v<N>.0.0`.
874
+ - **M** is T0 + 28 days (28 x 86,400 seconds, UTC).
875
+ - Until M, `releases/latest` names the newest release of the previous major.
876
+ Clients older than the 0.x release with the major gate (0.100.0) follow
877
+ `releases/latest`, so they stay on 0.x until M. From M, the newest release
878
+ of the new major is latest.
879
+
880
+ **What the automation does.** `scripts/release_latest.py` holds the rules; the
881
+ workflows only call it. It reads `published_at` from the GitHub API, and "now"
882
+ is the `Date` header of the GitHub response, the same clock the clients use.
883
+
884
+ | Release | Before T0 | From T0 to M | From M |
885
+ |---|---|---|---|
886
+ | 0.x (stable) | `make_latest: true` | `make_latest: true` | `make_latest: false` |
887
+ | 1.x (stable), `v1.0.0` included | n/a | `make_latest: false` | `make_latest: true` |
888
+ | any pre-release | `make_latest: false` | `make_latest: false` | `make_latest: false` |
889
+
890
+ - `release-kbagent.yml` sets `make_latest` explicitly on every release, never
891
+ the GitHub default (which marks every new stable release as latest). The
892
+ `github-release` job decides it right before it publishes, and the "Fill
893
+ release notes" step sends the same value again with `gh release edit
894
+ --latest=<value>`. A version lower than the current latest never gets
895
+ `true`, so a re-run of an older tag does not take the flag back.
896
+ - `promote-major.yml` runs every hour (minute 17) from the default branch. At
897
+ M it marks the newest stable release of the new major as latest (`gh release
898
+ edit <tag> --latest`). Before T0 and before M it does nothing. It is
899
+ idempotent, and it also corrects a release that was decided before M but
900
+ published after M. Run it by hand with `gh workflow run promote-major.yml`.
901
+ - For `v<N>.0.0` (output `MAJOR_START`), the `pypi` job publishes only after
902
+ `github-release` succeeded, so PyPI never names a new major before T0
903
+ exists. For every other tag, `pypi` waits for `github-release` too, but a
904
+ failed `github-release` does not stop it.
905
+ - A tag of an old major after T0 (output `OLD_LINE`: `v<N+1>.0.0` is
906
+ published) skips the `homebrew` and `ai-kit-marketplace` jobs, because both
907
+ hold one version and would move back to the old major. Chocolatey, winget,
908
+ apt/rpm and PyPI keep every version, so they still publish it.
909
+ `test-install` installs the exact tagged version with apt and dnf.
910
+ - `install.sh` and the PowerShell block of `README.md` take the version from
911
+ PyPI (`info.version`, the highest stable version), not from the
912
+ `releases/latest` redirect, so new installs get the new major from T0.
913
+
914
+ **Steps for the maintainer.**
915
+
916
+ 1. **Before the first 1.0.0 change merges to `main`**, in this order:
917
+ 1. Make sure `main` has the workflow changes above (`release-kbagent.yml`,
918
+ `promote-major.yml`, `scripts/release_latest.py`) and no install from
919
+ git without a release tag (`tests/test_pinned_installs.py` checks it).
920
+ A tag runs the workflow file of the tagged commit, so `release/0.N`
921
+ must start from a commit that has them. `install.sh` on `main` must
922
+ install any stable release of both majors, because it installs what
923
+ PyPI names: 0.x until T0, the new major from T0.
924
+ `tests/test_install_script.py` runs its install paths with a 0.x and a
925
+ 1.x version; keep both.
926
+ 2. Find the last 0.x release (stable tag only):
927
+ `git fetch --tags origin`, then
928
+ `git tag --list 'v0.*' --sort=-v:refname | grep -E '^v0\.[0-9]+\.[0-9]+$' | head -n 1`.
929
+ N is its minor version (`v0.105.2` gives `release/0.105`). If that tag
930
+ is older than the changes of step 1.1, release one more 0.x version
931
+ from `main` first (a normal release PR) and use its tag.
932
+ 3. Create `release/0.N` from the commit of that tag:
933
+ `git push origin 'v0.N.x^{commit}:refs/heads/release/0.N'`.
934
+ CI runs on `release/0.N` only when its `ci.yml` and `frontend.yml` have
935
+ the `release/[0-9]+.[0-9]+` triggers. If that tag is older than the
936
+ triggers, the first PR into `release/0.N` adds them.
937
+ 4. Pin the deprecated marketplace shim in a PR to `main`, and merge it
938
+ before the first 1.0.0 change. Its relative `source` follows the
939
+ default branch, so it would serve 1.x plugin documents to 0.x installs.
940
+ In `.claude-plugin/marketplace.json`, replace the `kbagent` entry's
941
+ `"source": "./plugins/kbagent"` with
942
+ `{"source": "git-subdir", "url": "https://github.com/keboola/cli.git", "path": "plugins/kbagent", "ref": "v0.N.x"}`
943
+ (the shape the ai-kit marketplace uses; `v0.N.x` is the tag of step
944
+ 1.2) and set its `version` to `0.N.x`. `scripts/sync_version.py` keeps
945
+ the version of a pinned entry as it is, and for a version of major 1 or
946
+ higher it fails while the source is still relative. So the 1.0.0
947
+ release PR cannot pass `make version-sync`, `make version-check` or the
948
+ release `gate` with an unpinned shim. When a later 0.N.x release
949
+ changes the plugin documents, set `ref` and `version` on `main` to that
950
+ release in the same way.
951
+ 5. Walk the rehearsal in [docs/release-1.0-rehearsal.md](docs/release-1.0-rehearsal.md).
952
+ 2. **T0 − 14 days or earlier:** the 0.x release with the major gate (0.100.0)
953
+ must be published by now, at least 14 days before T0.
954
+ Check that `promote-major` runs on `main` and prints `tag=` (nothing to do).
955
+ 3. **T0:** open the 1.0.0 release PR as usual (steps 1-15 above), merge it,
956
+ and push the tag `v1.0.0`. Do not create the GitHub release by hand, not
957
+ even as a draft: publishing a draft sets a new `published_at`. Never delete
958
+ or re-publish `v1.0.0`: a release with a new `published_at` restarts the
959
+ 28 days. Edit it in place if something must change. Then check:
960
+ - `gh api repos/keboola/cli/releases/latest --jq .tag_name` still names 0.x.
961
+ - `gh release view v1.0.0` shows the release, and the releases page does
962
+ not mark it "Latest".
963
+ - PyPI has 1.0.0 only after the GitHub release exists.
964
+ 4. **From T0 to M:**
965
+ - 1.x releases come from `main` as usual and get `make_latest: false`.
966
+ - 0.N.x fixes come from `release/0.N`: a release PR against that branch,
967
+ then a tag on its merge commit. Add the same changelog entry to `main`
968
+ too, because `make changelog-check` audits every published release.
969
+ Homebrew and ai-kit skip these tags; they stay `make_latest: true`.
970
+ 5. **M:** `promote-major` marks the newest 1.x release as latest within one
971
+ hour. Check it with `gh api repos/keboola/cli/releases/latest --jq .tag_name`.
972
+ 6. **After M:** a 0.N.x tag still publishes, with `make_latest: false`. Stop
973
+ 0.N.x releases unless a fix is critical.
974
+
975
+ To delete the shim later instead of keeping it pinned, also remove
976
+ `.claude-plugin/marketplace.json` from `make version-check` and from the
977
+ "SKILL.md + version drift" step of the release `gate`: both give the path to
978
+ `git diff`, which fails on a path that does not exist.
979
+
856
980
  ## Running CI Locally
857
981
 
858
982
  ```bash
859
- make check # CI parity: lint + format + typecheck + skill + version + command-sync + endpoints + changelog + error-codes + sentinel-guards + test
983
+ make check # CI parity: lint + format + typecheck + skill + version + command-sync + cli-spec + endpoints + changelog + error-codes + sentinel-guards + test
860
984
  make lint # Just the ruff linter
861
985
  make format # Auto-format code
862
986
  make typecheck # Static type check (Astral `ty`)
@@ -864,6 +988,11 @@ make audit # Audit locked dependencies for known vulnerabilities (u
864
988
  make test # Just the test suite (no coverage)
865
989
  make test-cov # Test suite + informational coverage report (term-missing)
866
990
  make command-sync-check # Verify every CLI command is registered + documented
991
+ make cli-spec-rules # Check the CLI spec rules vs the baseline and docs/cli-manifest.json (in make check)
992
+ make cli-spec-check # cli-spec-rules plus the contract test files of the spec
993
+ make cli-manifest # Regenerate docs/cli-manifest.json after a command, option or help change
994
+ make cli-spec-baseline # Re-record scripts/cli_spec_baseline.json after a fix (it may only shrink)
995
+ make cli-spec-report # Per-command inventory: category, --project shape, safety flags, violated rules
867
996
  make endpoints-check # Verify docs/web-server-endpoints.md matches the live FastAPI app
868
997
  make endpoints-gen # Regenerate it after adding a serve route
869
998
  make check-sentinel-guards # Verify no kbc-session:// sentinel path is unguarded
@@ -936,6 +1065,38 @@ can do) also fires for a stale feature branch whose base has since been
936
1065
  released; arming there would tell a contributor to delete a placeholder the
937
1066
  process requires them to write.
938
1067
 
1068
+ **CLI spec gate** (`scripts/check_cli_spec.py`, `make cli-spec-check`): walks
1069
+ the live command tree, the serve routes and the source of `commands/`, and
1070
+ checks them against the rules of the CLI interface spec (#791). Existing
1071
+ violations are listed in `scripts/cli_spec_baseline.json`, which has a
1072
+ `blocking` flag per rule. A new violation of a blocking rule fails, and so
1073
+ does a baseline entry that is no longer a violation: after a fix, run
1074
+ `make cli-spec-baseline` and commit the shorter file. A permanent, reviewed
1075
+ exception goes into `exceptions` with a reason. Renaming or moving a function
1076
+ or command that is in the baseline gives a `new` line for the new name and a
1077
+ `stale` line for the old one; run `make cli-spec-baseline` and commit the
1078
+ result.
1079
+
1080
+ On a pull request CI also compares the baseline with the base branch, for
1081
+ every blocking rule. It fails when a rule has more `violations` entries than
1082
+ on the base branch (entries are counted per rule, so a renamed command, a
1083
+ hidden alias that keeps the old name, or a function moved to another file is
1084
+ no growth), when a rule of the base branch is missing or no longer blocking,
1085
+ and when a subject was added to `exceptions`. A new exception passes only when
1086
+ a reviewer has checked the exception and its reason and added the label
1087
+ `cli-spec-exception` to the pull request; re-run the CI job after adding the
1088
+ label. Known limits: the count lets one fixed entry be swapped for a new
1089
+ violation of the same rule elsewhere, and the ratchet is keyed by subject, so
1090
+ a second violation of the same rule inside a function or command that is
1091
+ already in the baseline passes.
1092
+ `make check` runs the rules (`make cli-spec-rules`); `make cli-spec-check`
1093
+ also runs the contract test files.
1094
+ The same step fails when `docs/cli-manifest.json` differs from the live tree
1095
+ (`make cli-manifest`). The contract cases of the spec are in
1096
+ `tests/test_cli_contract.py`, and the human output of one command per shared
1097
+ renderer is pinned by `tests/test_cli_human_snapshots.py`; record an intended
1098
+ renderer change with `KBAGENT_UPDATE_SNAPSHOTS=1` and commit the snapshot diff.
1099
+
939
1100
  **Command-sync silent-drift gate** (`scripts/check_command_sync.py`): treats the
940
1101
  live Typer command tree as the single source of truth and fails if any command
941
1102
  is missing from `permissions.py` `OPERATION_REGISTRY`, `CLAUDE.md`