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.
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/CLAUDE.md +107 -30
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/CONTRIBUTING.md +166 -5
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/Makefile +18 -2
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/PKG-INFO +18 -11
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/README.md +16 -9
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/pyproject.toml +4 -2
- keboola_cli-0.100.2/scripts/check_cli_spec.py +1477 -0
- keboola_cli-0.100.2/scripts/cli_spec_baseline.json +731 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/file_size_baseline.json +3 -3
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/hatch_build.py +1 -1
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/post-edit-quality.sh +18 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/pre-commit +5 -0
- keboola_cli-0.100.2/scripts/release_latest.py +279 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/sync_version.py +26 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/auto_update.py +178 -24
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/changelog.py +81 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/cli.py +2 -1
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/configs.py +17 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/merge_requests.py +15 -4
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/misc.py +3 -2
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/queue.py +3 -1
- keboola_cli-0.100.2/src/keboola_agent_cli/commands/_all_projects.py +45 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_config_clone_cmd.py +2 -7
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_config_oauth.py +2 -6
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_config_trash_cmd.py +3 -3
- keboola_cli-0.100.2/src/keboola_agent_cli/commands/_config_variables_render.py +114 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_data_app_git.py +4 -19
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_data_app_password.py +8 -7
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_data_app_runtime.py +5 -25
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_flow_triggers.py +2 -1
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_helpers.py +17 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_merge_request_common.py +2 -1
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_project_create.py +2 -0
- keboola_cli-0.100.2/src/keboola_agent_cli/commands/_project_pin.py +79 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_semantic_layer_helpers.py +8 -7
- keboola_cli-0.100.2/src/keboola_agent_cli/commands/_storage_delete.py +187 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_storage_describe.py +6 -7
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_storage_jobs.py +2 -7
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_storage_snapshots.py +2 -1
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/agent.py +4 -4
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/auth.py +6 -1
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/billing.py +3 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/branch.py +11 -19
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/component.py +15 -12
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/config.py +32 -153
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/context.py +91 -34
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/data_app.py +12 -48
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/dev_portal.py +19 -17
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/docs.py +2 -6
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/doctor.py +2 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/encrypt.py +2 -5
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/feature.py +2 -1
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/flow.py +14 -8
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/http_client.py +6 -1
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/init.py +20 -7
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/job.py +8 -25
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/kai.py +7 -6
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/lineage.py +2 -1
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/notification.py +8 -4
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/org.py +4 -5
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/project.py +44 -95
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/schedule.py +7 -1
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/search.py +5 -1
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/serve.py +19 -2
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/sharing.py +10 -4
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/storage.py +52 -189
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/stream.py +2 -1
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/sync.py +8 -15
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/token.py +2 -1
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/transformation.py +4 -3
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/version.py +36 -6
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/workspace.py +38 -39
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/config_store.py +20 -7
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/constants.py +24 -2
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/data_science_client.py +2 -1
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/lib.py +2 -1
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/models.py +4 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/output.py +126 -11
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/permissions.py +12 -9
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/agent_runner.py +11 -5
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/app.py +3 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/dependencies.py +128 -1
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/route_permissions.py +4 -1
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/configs.py +5 -1
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/data_apps.py +18 -16
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/jobs.py +4 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/schedules.py +15 -13
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/workspaces.py +30 -10
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_auth_registration.py +2 -0
- keboola_cli-0.100.2/src/keboola_agent_cli/services/_storage_tables.py +99 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_sync_clone.py +21 -1
- keboola_cli-0.100.2/src/keboola_agent_cli/services/_sync_project_guard.py +136 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_sync_workspace.py +6 -2
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/auth_service.py +68 -22
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/base.py +113 -32
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/data_app_service.py +1 -1
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/flow_service.py +9 -13
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/job_idempotency_store.py +61 -3
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/job_service.py +10 -3
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/merge_request_service.py +52 -6
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/org_service.py +9 -3
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/project_service.py +50 -12
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/storage_service.py +21 -29
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/stream_service.py +16 -4
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/sync_service.py +4 -48
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/version_service.py +608 -154
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/workspace_service.py +39 -5
- keboola_cli-0.100.2/src/keboola_agent_cli/update_notice.py +181 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/update_runner.py +139 -13
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/conftest.py +11 -0
- keboola_cli-0.100.2/tests/snapshots/human_output/branch_merge_warning.txt +10 -0
- keboola_cli-0.100.2/tests/snapshots/human_output/config_detail_api_error.txt +6 -0
- keboola_cli-0.100.2/tests/snapshots/human_output/config_detail_panel.txt +19 -0
- keboola_cli-0.100.2/tests/snapshots/human_output/config_list_fanout_failure.txt +7 -0
- keboola_cli-0.100.2/tests/snapshots/human_output/config_list_table.txt +10 -0
- keboola_cli-0.100.2/tests/snapshots/human_output/project_remove_success.txt +6 -0
- keboola_cli-0.100.2/tests/test_all_projects_and_warnings.py +355 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_api_call_counts.py +1 -1
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_auth_service.py +264 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_auto_update.py +39 -40
- keboola_cli-0.100.2/tests/test_branch_zero.py +439 -0
- keboola_cli-0.100.2/tests/test_check_cli_spec.py +471 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_cli.py +213 -2
- keboola_cli-0.100.2/tests/test_cli_contract.py +117 -0
- keboola_cli-0.100.2/tests/test_cli_human_snapshots.py +166 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_client.py +19 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_component_sync_action.py +67 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_store.py +49 -4
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_data_app_service.py +27 -0
- keboola_cli-0.100.2/tests/test_doc_examples.py +178 -0
- keboola_cli-0.100.2/tests/test_error_forwarding.py +349 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_flow_cli.py +20 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_flow_service.py +32 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_frozen_dist.py +3 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_http_client_cmd.py +31 -1
- keboola_cli-0.100.2/tests/test_install_script.py +237 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_job_idempotency_store.py +133 -0
- keboola_cli-0.100.2/tests/test_major_gate.py +799 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_merge_request_client.py +23 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_merge_request_service.py +80 -0
- keboola_cli-0.100.2/tests/test_migration_page.py +75 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_org_service.py +47 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_permissions.py +23 -0
- keboola_cli-0.100.2/tests/test_pinned_installs.py +172 -0
- keboola_cli-0.100.2/tests/test_release_latest.py +460 -0
- keboola_cli-0.100.2/tests/test_release_workflow_major.py +249 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_search_cli.py +25 -1
- keboola_cli-0.100.2/tests/test_serve_extras_hint.py +36 -0
- keboola_cli-0.100.2/tests/test_server_active_project.py +125 -0
- keboola_cli-0.100.2/tests/test_server_dry_run_guard.py +431 -0
- keboola_cli-0.100.2/tests/test_server_production_branch.py +246 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_server_route_permissions.py +81 -13
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_server_router_calls.py +261 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_services.py +30 -1
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_storage_delete.py +178 -6
- keboola_cli-0.100.2/tests/test_sync_project_guard.py +367 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_version_script.py +101 -29
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_workspaces.py +4 -2
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_update_runner.py +203 -1
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_variables_cli.py +49 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_version_service.py +165 -190
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_workspace_gc.py +202 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/README.md +2 -1
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/components/CommandPalette.tsx +3 -2
- keboola_cli-0.100.2/web/frontend/src/lib/branch.test.ts +40 -0
- keboola_cli-0.100.2/web/frontend/src/lib/branch.ts +18 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Configs.tsx +9 -7
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/DataApps.tsx +3 -2
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Flows.tsx +3 -2
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/LocalAi.tsx +2 -1
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Schedules.tsx +2 -1
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Storage.tsx +8 -9
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Streams.tsx +5 -4
- keboola_cli-0.100.2/web/frontend/src/pages/jobsShared.test.ts +21 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/jobsShared.tsx +14 -13
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/whatsnew.ts +12 -0
- keboola_cli-0.99.1/src/keboola_agent_cli/services/_storage_tables.py +0 -51
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/.gitignore +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/LICENSE +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/examples/README.md +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/examples/storage_tui/README.md +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/formal/sync/README.md +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/plugins/kbagent/.claude-plugin/CLAUDE.md +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/plugins/kbagent/skills/kbagent-cicd-migration/scripts/migrate_cicd.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/plugins/kbagent/skills/kbagent-promotion-pipeline/scripts/generate_promotion_pipeline.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/check_command_sync.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/check_error_codes.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/check_file_size.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/check_release_scope.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/check_sentinel_guards.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/check_version_gates.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/check_wheel_ui.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/debug_linkedby_type.sh +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/gen_command_reference.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/gen_endpoint_reference.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/gen_release_notes.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/generate_changelog.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/generate_skill.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/lineage_deep.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/scripts/web-dev.sh +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/__init__.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/__main__.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/ai_client.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/auth/__init__.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/auth/auth_client.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/auth/device.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/auth/environment.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/auth/models.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/auth/pkce.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/auth/sentinel.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/auth/state_store.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/auth/token_provider.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/auth/totp.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/__init__.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/_client.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/_core.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/_s3_multipart.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/_transfer.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/billing.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/branches.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/editor.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/notifications.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/query.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/storage_files.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/storage_tables.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/stream.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/tokens.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/triggers.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/client/workspaces.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/__init__.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_auth_picker.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_checkbox_select.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_lineage_build_output.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_lineage_tree.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_merge_request_render.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_merge_request_writes.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_metadata_input.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_progress.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_project_ref.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_semantic_layer_crud.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_semantic_layer_reference_data.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_semantic_layer_scope.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_storage_table_detail.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_storage_tables_render.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_sync_clone_render.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_sync_push_render.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/_url_copy.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/changelog.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/config_state.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/merge_request.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/permissions.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/repl.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/commands/semantic_layer.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/dev_portal_client.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/effective_branch.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/errors.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/frozen_dist.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/http_base.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/json_utils.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/manage_client.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/metastore_client.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/project_ref.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/py.typed +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/resources/__init__.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/resources/flow/__init__.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/resources/flow/conditional-flow-schema.json +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/resources/flow/conditional_flow_examples.jsonl +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/resources/flow/flow-schema.json +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/resources/flow/legacy_flow_examples.jsonl +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/result_models.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/scheduler_client.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/__init__.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/_serve_command_map.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/agents_store.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/auth.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/pricing.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/__init__.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/agents.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/ai_chat.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/auth.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/billing.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/branches.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/components.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/dev_portal.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/docs.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/encrypt.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/feature.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/flows.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/health.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/kai.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/lineage.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/members.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/merge_requests.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/notifications.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/org.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/permissions.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/projects.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/search.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/semantic_layer.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/sharing.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/storage.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/stream.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/token.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/routers/transformation.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/run_broadcaster.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/server/sse.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/__init__.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_column_descriptions.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_config_clone.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_config_set_guard.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_config_trash.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_data_app_bodies.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_data_app_password.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_describe_batch_input.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_encryption.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_lineage_ai.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_lineage_er.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_lineage_mermaid.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_lineage_paths.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_lineage_trace.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_semantic_layer_cascade.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_semantic_layer_crud.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_semantic_layer_fqn.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_semantic_layer_internals.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_semantic_layer_lookup.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_semantic_layer_reference_data.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_semantic_layer_scope.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_storage_downloads.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_storage_jobs.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_sync_baseline.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_sync_bindings.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_sync_branch.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_sync_bulk.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_sync_clone_warnings.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_sync_data_app.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_sync_models.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_sync_push_ops.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_sync_stale.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_sync_storage.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_sync_writeback.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_table_detail.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_token_last_used.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_transformation_ops.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/_workspace_load_plan.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/agent_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/billing_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/branch_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/component_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/config_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/data_app_git_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/deep_lineage_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/dev_portal_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/docs_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/doctor_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/encrypt_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/feature_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/flow_validation.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/http_forwarder_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/kai_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/lineage_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/member_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/notification_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/repo_validate_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/schedule_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/search_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/semantic_layer_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/sharing_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/snapshot_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/table_usage.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/token_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/transformation_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/services/variables_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/stream_client.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/sync/__init__.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/sync/branch_mapping.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/sync/branch_registry.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/sync/branch_scope.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/sync/clone.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/sync/code_extraction.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/sync/config_format.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/sync/diff_engine.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/sync/git_utils.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/sync/manifest.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/sync/naming.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/sync/secrets.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/sync/sql_split.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/telemetry.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/src/keboola_agent_cli/yaml_input.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/__init__.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/helpers.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_agent_cli.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_agent_prompt.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_agent_prompt_helper.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_agent_runner.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_agent_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_agent_tombstone.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_agents_store_events.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_ai_client.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_auth_client.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_auth_device.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_auth_environment.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_auth_models.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_auth_picker.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_auth_pkce.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_auth_register_projects.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_auth_sentinel.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_auth_sentinel_guards.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_auth_state_store.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_auth_totp.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_base_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_billing_cli.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_billing_client.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_billing_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_branch_metadata_cli.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_branch_metadata_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_branch_registry.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_branch_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_build_hook.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_changelog_check.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_changelog_render.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_check_command_sync.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_check_file_size.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_check_release_scope.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_check_sentinel_guards.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_check_version_gates.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_checkbox_select.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_choice_enums.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_cli_auth.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_client_device_enrollment.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_client_token_events.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_component_cli.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_component_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_clone_cli.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_clone_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_create_cli.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_create_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_encryption.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_examples.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_metadata.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_rename.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_rename_cli.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_resolution.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_row_cli.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_row_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_search.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_search_cli.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_set_default_bucket.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_set_guard.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_state.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_trash.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_config_update.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_data_app_cli.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_data_app_git_repo.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_data_app_password.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_data_app_plain_env_keys.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_data_app_secrets_cli.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_data_app_secrets_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_data_app_validate_repo_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_deep_lineage_ai.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_deep_lineage_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_dev_portal_cli.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_dev_portal_client.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_dev_portal_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_docs_cli.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_doctor_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_e2e.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_e2e_auth.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_e2e_config_dir_mode.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_e2e_lineage_deep.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_effective_branch.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_encrypt_cli.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_encrypt_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_encryption.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_errors.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_feature_cli.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_feature_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_file_locking.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_flow_examples.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_flow_validation.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_gen_command_reference.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_gen_endpoint_reference.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_gen_release_notes.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_generate_promotion_pipeline.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_helpers.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_http_base.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_http_base_auth.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_http_forwarder_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_integration.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_job_options.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_json_utils.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_kai_cli.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_kai_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_lib.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_lib_device_enrollment.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_license_consistency.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_lineage_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_lineage_view.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_local_ai_chat.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_manage_client.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_manage_token_bulk.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_manage_token_cli.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_mcp_migration_recipe.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_member_cli.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_member_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_merge_request_cli.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_metastore_client.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_migrate_cicd.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_models.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_normalize_script.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_notification_cli.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_notification_client.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_notification_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_output.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_partial_failure_exit_code.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_permissions_cli.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_pricing.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_project_create_cli.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_project_edit.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_project_edit_cli.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_project_info_cli.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_project_info_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_project_ref.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_project_token_stdin_no_leak.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_release_kbagent_ai_kit_sync.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_repl.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_result_models.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_run_broadcaster.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_s3_multipart.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_schedule_cli.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_schedule_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_scheduler_client.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_search_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_semantic_layer_cli.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_semantic_layer_schema.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_semantic_layer_scope.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_semantic_layer_scope_cli.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_semantic_layer_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_serve_banner_encoding.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_serve_conversation_id.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_serve_telemetry.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_serve_ui.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_server_auth.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_server_permissions.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_server_project_ref.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_server_semantic_layer_routes_e2e.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_server_smoke.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sharing_cli.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sharing_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_skill_frontmatter.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sql_split.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_storage_clone.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_storage_create_table.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_storage_describe_cli.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_storage_describe_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_storage_empty_definition.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_storage_export_filters.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_storage_files.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_storage_import_jobs.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_storage_snapshots.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_storage_swap.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_storage_table_definition.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_storage_tables.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_storage_truncate.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_storage_write.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_stream_cli.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_stream_client.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_stream_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_adopted_files.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_baseline_stamping.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_branch_mapping.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_branch_scope.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_cli.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_cli_behavior.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_clone.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_clone_links.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_code_extraction.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_config_format.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_data_app_type.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_diff_engine.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_e2e.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_encrypt.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_force_pull_baseline.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_formal_counterexamples.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_manifest.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_naming.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_plaintext_audit.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_pull_companion_files.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_push_encrypt_first.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_push_script_guard.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_reconcile.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_secrets.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_sync_storage_jobs.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_table_usage.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_telemetry.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_token_cli.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_token_provider.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_token_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_transfer_progress.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_transformation_cli.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_transformation_ops.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_triggers_client.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_url_copy.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_variables_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_workspace_cli.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_workspace_service.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_workspace_sql_helper.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/tests/test_yaml_input.py +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/index.html +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/package-lock.json +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/package.json +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/postcss.config.js +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/App.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/api/client.test.ts +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/api/client.ts +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/changelogNotes.test.ts +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/changelogNotes.ts +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/components/AgentRunView.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/components/ConfirmModal.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/components/DetailTabs.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/components/Drawer.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/components/Empty.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/components/JsonView.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/components/KeyValueGrid.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/components/ManageTokenModal.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/components/PillList.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/components/RawDetail.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/components/SessionExpiredBanner.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/components/Table.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/components/WhatsNew.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/config/credits.test.ts +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/config/credits.ts +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/index.css +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/layout/Shell.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/layout/Sidebar.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/layout/StatusBar.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/layout/TopBar.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/lib/time.test.ts +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/lib/time.ts +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/main.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Agents.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Branches.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Changelog.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Components.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Dashboard.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Doctor.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Encrypt.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Jobs.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/JobsAll.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Lineage.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Members.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Org.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Projects.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Search.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/SemanticLayer.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/SemanticLayerDialogs.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Sharing.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Tokens.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/TokensAll.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/Workspaces.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/storageSel.test.ts +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/tokensShared.test.ts +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/pages/tokensShared.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/router.test.ts +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/router.ts +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/state.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/theme.tsx +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/types.ts +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/src/useHashSelection.ts +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/tailwind.config.ts +0 -0
- {keboola_cli-0.99.1 → keboola_cli-0.100.2}/web/frontend/tsconfig.json +0 -0
- {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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
799
|
-
|
|
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`
|