briar-cli 1.1.45__tar.gz → 1.1.47__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.
- {briar_cli-1.1.45 → briar_cli-1.1.47}/.gitignore +3 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/PKG-INFO +71 -29
- {briar_cli-1.1.45 → briar_cli-1.1.47}/README.md +69 -28
- {briar_cli-1.1.45 → briar_cli-1.1.47}/pyproject.toml +2 -1
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/cli.py +79 -1
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/commands/__init__.py +8 -0
- briar_cli-1.1.47/src/briar/commands/completion.py +32 -0
- briar_cli-1.1.47/src/briar/commands/config.py +37 -0
- briar_cli-1.1.47/src/briar/commands/doctor.py +25 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/commands/extract.py +32 -6
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/commands/iac.py +2 -1
- briar_cli-1.1.47/src/briar/commands/init.py +66 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/commands/journal.py +2 -2
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/commands/runbook.py +6 -6
- briar_cli-1.1.47/src/briar/completion.py +121 -0
- briar_cli-1.1.47/src/briar/completion_templates/bash.tmpl +16 -0
- briar_cli-1.1.47/src/briar/completion_templates/bash_subcommand.tmpl +9 -0
- briar_cli-1.1.47/src/briar/completion_templates/inner.tmpl +1 -0
- briar_cli-1.1.47/src/briar/completion_templates/leaf.tmpl +1 -0
- briar_cli-1.1.47/src/briar/completion_templates/zsh.tmpl +14 -0
- briar_cli-1.1.47/src/briar/completion_templates/zsh_subcommand.tmpl +9 -0
- briar_cli-1.1.47/src/briar/config.py +283 -0
- briar_cli-1.1.47/src/briar/doctor.py +111 -0
- briar_cli-1.1.47/src/briar/extract/canonical.py +251 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/runbook/executor.py +6 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/_composer.py +24 -1
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/sources/base.py +11 -12
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/sources/jira.py +3 -9
- briar_cli-1.1.47/src/briar/infer.py +79 -0
- briar_cli-1.1.47/src/briar/init_templates/briar_toml.tmpl +17 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/logging.py +41 -4
- briar_cli-1.1.47/src/briar/update_check.py +98 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/conftest.py +11 -1
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_extract_jira_real.py +4 -1
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_local_commands_real.py +2 -2
- briar_cli-1.1.47/tests/unit/commands/test_init.py +55 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_journal_params.py +2 -2
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_scaffold_implementation_params.py +4 -2
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_scaffold_pr_fixes_params.py +2 -1
- briar_cli-1.1.47/tests/unit/extract/test_canonical.py +112 -0
- briar_cli-1.1.47/tests/unit/extract/test_legacy_flag_notice.py +54 -0
- briar_cli-1.1.47/tests/unit/iac/test_scaffold_shared_filters.py +57 -0
- briar_cli-1.1.47/tests/unit/test_cli_meta.py +53 -0
- briar_cli-1.1.47/tests/unit/test_completion.py +54 -0
- briar_cli-1.1.47/tests/unit/test_config.py +154 -0
- briar_cli-1.1.47/tests/unit/test_doctor.py +72 -0
- briar_cli-1.1.47/tests/unit/test_infer.py +84 -0
- briar_cli-1.1.47/tests/unit/test_update_check.py +65 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/LICENSE +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/agents/README.md +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/examples/all_features.yaml +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/examples/multi_company.env.example +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/examples/multi_company.yaml +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/examples/simple-single-repo.yaml +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/__main__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/_http_retry.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/_registry.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/agent/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/agent/_enums.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/agent/_llm.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/agent/_llms/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/agent/_llms/anthropic_llm.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/agent/_llms/bedrock.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/agent/_llms/gemini.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/agent/_llms/openai_llm.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/agent/runner.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/agent/tools.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/auth/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/auth/_acquirer.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/auth/_acquirers/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/auth/_acquirers/aws_sso.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/auth/_acquirers/aws_static.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/auth/_acquirers/bitbucket.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/auth/_acquirers/fireflies.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/auth/_acquirers/github_device.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/auth/_acquirers/github_pat.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/auth/_acquirers/jira_session.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/auth/_acquirers/jira_token.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/auth/_acquirers/linear.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/auth/_prompt.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/commands/_enums.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/commands/agent.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/commands/auth.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/commands/base.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/commands/context.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/commands/dashboard.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/commands/plan.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/commands/secrets.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/commands/telemetry.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/commands/version.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/credentials/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/credentials/_aws.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/credentials/_bootstrap.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/credentials/_bootstraps/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/credentials/_bootstraps/envfile.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/credentials/_paths.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/credentials/_store.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/credentials/aws_secrets.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/credentials/envfile.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/credentials/ssm.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/credentials/vault.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/dashboard/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/dashboard/collectors.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/dashboard/server.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/dashboard/templates/_macros.html +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/dashboard/templates/index.html +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/decorators.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/env_vars.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/error_policy.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/errors.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_cloud.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_clouds/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_clouds/aws.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_clouds/azure.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_clouds/gcp.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_gh.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_meeting.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_meetings/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_meetings/fireflies.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_provider.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_providers/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_providers/bitbucket.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_providers/github.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_time_util.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_tracker.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_trackers/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_trackers/_jira_auth.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_trackers/bitbucket.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_trackers/github_issues.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_trackers/jira.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_trackers/linear.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_user_filter.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/active_tickets.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/active_work.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/aws_infra.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/aws_services/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/aws_services/base.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/aws_services/ecs.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/aws_services/lambda_.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/aws_services/logs.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/aws_services/rds.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/aws_services/sqs.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/aws_services/tagging.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/base.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/ci_health.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/claude_md.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/code_hotspots.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/code_scanning.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/codebase_conventions.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/commit_message_quality.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/composer.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/defect_hotspots.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/dependency_health.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/github_deployments.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/language_detectors/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/meeting_context.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/meeting_digest.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/pr_archaeology.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/pr_hygiene.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/pr_review_context.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/release_cadence.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/repo_governance.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/revert_signals.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/review_nits.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/reviewer_profile.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/stale_prs.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/test_discipline.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/ticket_archaeology.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/ticket_context.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/todo_density.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/formatting/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/formatting/base.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/formatting/csv.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/formatting/json.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/formatting/quiet.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/formatting/table.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/formatting/yaml.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/config_file.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/models.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/runbook/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/runbook/models.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/runbook/scheduler.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/_knowledge.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/archetypes/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/archetypes/base.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/archetypes/engineer.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/archetypes/pr_ci_fixer.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/archetypes/pr_conflict_resolver.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/archetypes/pr_fixer.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/archetypes/triager.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/base.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/implementation.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/pr_fixes.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/rules/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/rules/ai_prefix_on_comments.md +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/rules/base.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/rules/commit_as_human.md +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/rules/minimum_correct_fix.md +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/rules/no_force_push.md +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/rules/no_new_pr_creation.md +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/rules/no_workflow_file_edits.md +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/rules/read_all_comments_first.md +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/rules/skip_approved_green_prs.md +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/shapes/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/sources/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/sources/aws.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/sources/bitbucket.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/sources/github.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/sources/sentry.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/triggers/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/triggers/base.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/triggers/bitbucket_webhook.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/triggers/github_webhook.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/triggers/manual.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/triggers/schedule_cron.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/journal/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/journal/_journal.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/journal/_render.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/journal/models.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/journal/sinks/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/journal/sinks/base.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/journal/sinks/file.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/journal/store/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/journal/store/base.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/journal/store/file.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/log_context.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/mcp/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/mcp/_errors.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/mcp/_manager.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/mcp/_tool.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/mcp/defaults.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/messaging/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/messaging/_jira_creds.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/messaging/_writer.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/messaging/bitbucket_pr_comment.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/messaging/github_pr_comment.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/messaging/jira_comment.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/messaging/jira_transition.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/messaging/slack_channel.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/messaging/telegram_chat.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/notify/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/notify/_sink.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/notify/email.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/notify/pagerduty.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/notify/slack.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/notify/telegram.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/pagination.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/plan/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/plan/_board.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/plan/_boards/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/plan/_boards/github_project.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/plan/_boards/jira_board.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/plan/_enums.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/plan/_json_utils.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/plan/_models.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/plan/_replan.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/plan/_selector.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/plan/_status.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/plan/_store.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/plan/_synthesize.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/plan/_writeback.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/storage/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/storage/_models.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/storage/base.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/storage/file.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/storage/postgres.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/telemetry/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/telemetry/_config.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/telemetry/_scrubber.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/telemetry/_sinks/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/telemetry/_sinks/base.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/telemetry/_sinks/file.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/telemetry/_sinks/noop.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/telemetry/_sinks/sentry.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/conftest.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/mcp_echo_server.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_acquirer_real.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_agent_loop_real.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_auth_login_real.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_cli_extract_real.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_cli_smoke_subprocess.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_extract_aws_real.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_extract_github_real.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_llm_real.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_mcp_live_real.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_messaging_bitbucket_real.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_messaging_github_inline_real.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_messaging_jira_real.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_messaging_real.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_notify_real.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_plan_llm_real.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_registry_contract.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_tracker_real.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/test_abstractions.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/test_dashboard.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/test_extract.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/test_extract_meetings.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/test_formatting.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/test_journal.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/test_knowledge_splicer.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/test_log_context.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/test_plan.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/test_plan_run.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/test_rules_registry.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/test_scaffold.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/test_scheduler.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/test_smart_scheduler.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/test_user_filter.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/agent/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/agent/conftest.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/agent/test_anthropic_llm.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/agent/test_bedrock_llm.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/agent/test_gemini_llm.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/agent/test_llm_registry.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/agent/test_openai_llm.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/agent/test_runner_loop.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/agent/test_runner_mcp.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/agent/test_tools.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/auth/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/auth/test_aws_sso.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/auth/test_aws_static.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/auth/test_github_device.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/auth/test_jira_session.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/auth/test_prompt.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_agent_cmd.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_agent_mcp_defaults.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_agent_params.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_auth.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_auth_cmd.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_auth_params.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_cli.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_cmd_creds.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_context.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_context_params.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_dashboard_cmd.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_dashboard_params.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_extract.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_extract_params.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_journal.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_plan_cmd.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_plan_params.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_plan_run_params.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_runbook.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_runbook_params.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_scaffold.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_secrets.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_secrets_params.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_telemetry_cmd.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_telemetry_params.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/credentials/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/credentials/test_envfile.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/dashboard/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/dashboard/test_log_collectors.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/dashboard/test_server.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/dashboard/test_server_render.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_active_work.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_aws_infra.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_aws_services.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_ci_health.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_claude_md.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_cloud_aws.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_cloud_azure.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_cloud_gcp.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_cloud_registry.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_code_hotspots.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_code_scanning.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_commit_message_quality.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_composer_inventory.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_defect_hotspots.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_dependency_health.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_gh_facade.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_github_deployments.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_meeting_context_gaps.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_pr_archaeology_gaps.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_pr_hygiene.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_provider_bitbucket.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_provider_github.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_release_cadence.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_repo_governance.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_revert_signals.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_review_nits.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_reviewer_profile.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_stale_prs.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_test_discipline.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_ticket_archaeology.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_ticket_context.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_todo_density.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_tracker_bitbucket.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_tracker_github_issues.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_tracker_jira.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_tracker_linear.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_user_filter_branches.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/iac/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/iac/test_every_parser.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/iac/test_mcp_schema.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/iac/test_runbook_executor.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/iac/test_runbook_scheduler.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/journal/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/journal/test_facade.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/mcp/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/mcp/test_mcp_aws_env_bridge.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/mcp/test_mcp_tool.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/messaging/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/messaging/test_bitbucket_pr_comment.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/messaging/test_github_pr_comment.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/messaging/test_jira_comment.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/messaging/test_jira_transition.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/messaging/test_slack_channel.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/messaging/test_telegram_chat.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/messaging/test_writer_helpers.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/notify/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/notify/test_email.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/notify/test_pagerduty.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/notify/test_slack_and_telegram.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/plan/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/plan/test_board_github_project.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/plan/test_board_jira.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/plan/test_board_registry.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/plan/test_models.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/plan/test_plan_helpers_edges.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/plan/test_selector_branches.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/plan/test_status.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/plan/test_writeback_branches.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/storage/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/storage/test_backends.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/telemetry/__init__.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/telemetry/test_command_span.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/telemetry/test_config.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/telemetry/test_scrubber.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/test_decorators.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/test_env_vars.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/test_error_policy.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/test_errors.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/test_file_tool_sandbox.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/test_formatting.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/test_http_retry.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/test_log_context.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/test_pagination.py +0 -0
- {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/test_runner_dispatch.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: briar-cli
|
|
3
|
-
Version: 1.1.
|
|
3
|
+
Version: 1.1.47
|
|
4
4
|
Summary: Terminal client for the Briar agent-orchestration API.
|
|
5
5
|
Project-URL: Homepage, https://usebriar.com
|
|
6
6
|
Project-URL: Source, https://github.com/iklobato/briar
|
|
@@ -61,6 +61,7 @@ Requires-Dist: azure-mgmt-subscription<4,>=3.1; extra == 'azure'
|
|
|
61
61
|
Provides-Extra: dev
|
|
62
62
|
Requires-Dist: black<26,>=25; extra == 'dev'
|
|
63
63
|
Requires-Dist: mypy<2,>=1.13; extra == 'dev'
|
|
64
|
+
Requires-Dist: ruff<1,>=0.6; extra == 'dev'
|
|
64
65
|
Provides-Extra: gcp
|
|
65
66
|
Requires-Dist: google-api-python-client<3,>=2.100; extra == 'gcp'
|
|
66
67
|
Requires-Dist: google-auth<3,>=2.20; extra == 'gcp'
|
|
@@ -129,7 +130,7 @@ export ANTHROPIC_API_KEY=sk-ant-... # LLM key comes from the environment
|
|
|
129
130
|
# 2. Mine a repo's PR history into a knowledge blob
|
|
130
131
|
briar extract --company acme \
|
|
131
132
|
--include pr-archaeology \
|
|
132
|
-
--
|
|
133
|
+
--repo acme-co/acme-app --max 50
|
|
133
134
|
|
|
134
135
|
# 3. Read it back
|
|
135
136
|
briar context get knowledge:acme
|
|
@@ -137,6 +138,41 @@ briar context get knowledge:acme
|
|
|
137
138
|
|
|
138
139
|
> **Telemetry:** `briar` ships with opt-out error/usage analytics (Sentry). No prompts, file contents, ticket keys, repo names, paths, or secret values ever leave the machine. Turn it off any time with `briar telemetry off`, `BRIAR_TELEMETRY=off`, or `DO_NOT_TRACK=1`.
|
|
139
140
|
|
|
141
|
+
### Less typing: shared flags, project config, inference
|
|
142
|
+
|
|
143
|
+
briar resolves every flag through one chain — **CLI flag > env var > project config > built-in default** — so the stable values move off the command line:
|
|
144
|
+
|
|
145
|
+
```toml
|
|
146
|
+
# .briar.toml (or [tool.briar] in pyproject.toml), searched upward from cwd
|
|
147
|
+
company = "acme"
|
|
148
|
+
store = "postgres"
|
|
149
|
+
|
|
150
|
+
[repo]
|
|
151
|
+
owner = "acme-co"
|
|
152
|
+
repo = "acme-app"
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
With that file present, and inside the git checkout, the same extract is just:
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
briar extract --include pr-archaeology # company + repo come from config/git
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
- **Canonical extractor flags.** One shared knob per concept — `--repo`, `--since-days`, `--max`, `--top-n`, `--sample`, `--authors-allow/-block`, `--assignees-allow/-block` — applies to every extractor selected with `--include`. The old per-extractor flags (`--pr-repo`, `--risk-since-days`, …) still work but are hidden from `-h`; run `briar extract --advanced-help` to see them.
|
|
162
|
+
- **Inference.** `--owner`/`--repo` are read from the git `origin` remote when neither the flag nor config supplies them.
|
|
163
|
+
- A per-extractor override always wins over the shared flag when both are given.
|
|
164
|
+
|
|
165
|
+
Helpers for the config + setup loop:
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
briar init # write a starter .briar.toml (repo inferred from git)
|
|
169
|
+
briar config show # see each setting's resolved value AND its source
|
|
170
|
+
briar doctor # check config, git, credentials, store (CI-usable exit code)
|
|
171
|
+
eval "$(briar completion bash)" # tab-completion (also: zsh)
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Other niceties: `briar --version`, quiet-by-default logs (logs to stderr, `--verbose` for DEBUG), and a once-a-day "new version available" nudge (opt out with `BRIAR_NO_UPDATE_CHECK=1` / `DO_NOT_TRACK=1`).
|
|
175
|
+
|
|
140
176
|
---
|
|
141
177
|
|
|
142
178
|
## What you can do
|
|
@@ -147,8 +183,8 @@ briar context get knowledge:acme
|
|
|
147
183
|
# PRs + AWS infra in one shot, filtered to your team
|
|
148
184
|
briar extract --company acme \
|
|
149
185
|
--include pr-archaeology --include aws-infra \
|
|
150
|
-
--
|
|
151
|
-
--
|
|
186
|
+
--repo acme-co/acme-app \
|
|
187
|
+
--authors-allow alice --authors-allow bob \
|
|
152
188
|
--aws-extract-region us-east-1 \
|
|
153
189
|
--aws-extract-service ecs --aws-extract-service rds
|
|
154
190
|
|
|
@@ -161,12 +197,11 @@ FIREFLIES_ACME_API_KEY=ff_xxx briar extract --company acme \
|
|
|
161
197
|
--include meeting-digest --meeting-since-days 14 \
|
|
162
198
|
--meeting-attendee-allow alice@acme.com
|
|
163
199
|
|
|
164
|
-
# Code-quality signal from git history + the repo-host API
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
--include
|
|
168
|
-
--include review-nits --
|
|
169
|
-
--include ci-health --cihealth-repo acme-co/acme-app
|
|
200
|
+
# Code-quality signal from git history + the repo-host API.
|
|
201
|
+
# One --repo feeds every selected extractor.
|
|
202
|
+
briar extract --company acme --repo acme-co/acme-app \
|
|
203
|
+
--include defect-hotspots --include pr-hygiene \
|
|
204
|
+
--include review-nits --include ci-health
|
|
170
205
|
```
|
|
171
206
|
|
|
172
207
|
**Code-quality extractors** (all `--provider github|bitbucket`): `defect-hotspots`
|
|
@@ -181,8 +216,8 @@ briar extract --company acme \
|
|
|
181
216
|
```bash
|
|
182
217
|
# Merge a knowledge index into CLAUDE.md; full detail lands in
|
|
183
218
|
# .briar/knowledge/<company>.md for the agent to read when relevant.
|
|
184
|
-
briar extract --company acme --
|
|
185
|
-
--
|
|
219
|
+
briar extract --company acme --repo acme-co/acme-app \
|
|
220
|
+
--include defect-hotspots --include ci-health \
|
|
186
221
|
--merge-claude-md
|
|
187
222
|
```
|
|
188
223
|
|
|
@@ -254,33 +289,40 @@ Plus `briar context` (local knowledge blobs), `briar dashboard` (read-only HTML
|
|
|
254
289
|
### Repeatable flags — fan out across repos, projects, services
|
|
255
290
|
|
|
256
291
|
Most list-style flags accept multiple occurrences: repeat the flag, once
|
|
257
|
-
per value (there's no comma form — `--
|
|
258
|
-
|
|
292
|
+
per value (there's no comma form — `--repo a,b` is one repo named `a,b`).
|
|
293
|
+
The canonical `--repo` feeds every extractor selected with `--include`.
|
|
259
294
|
|
|
260
295
|
```bash
|
|
261
|
-
# Mine several repos, keep the team's PRs, drop the bots
|
|
262
|
-
# --
|
|
296
|
+
# Mine several repos, keep the team's PRs, drop the bots — one --repo,
|
|
297
|
+
# every selected extractor. --max applies per repo; author allow/block
|
|
298
|
+
# compose as allow ∩ ¬block.
|
|
263
299
|
briar extract --company acme \
|
|
264
|
-
--include pr-archaeology --include
|
|
265
|
-
--
|
|
266
|
-
--
|
|
267
|
-
--
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
# Scaffold a triage flow from two sources, filtered by author + assignee.
|
|
272
|
-
# Each tracker source carries its own repeatable *-authors/assignees-*.
|
|
300
|
+
--include pr-archaeology --include defect-hotspots \
|
|
301
|
+
--repo acme-co/web --repo acme-co/api --repo acme-co/mobile \
|
|
302
|
+
--max 75 \
|
|
303
|
+
--authors-block "dependabot[bot]" --authors-block "renovate[bot]"
|
|
304
|
+
|
|
305
|
+
# Scaffold a triage flow from two sources — one shared author/assignee
|
|
306
|
+
# filter applies to every --source.
|
|
273
307
|
briar scaffold implementation --prefix acme-triage \
|
|
274
308
|
--source github --source jira \
|
|
275
309
|
--owner acme-co --repo acme-app --github-secret-id <uuid> \
|
|
276
|
-
--
|
|
277
|
-
--
|
|
310
|
+
--authors-block "dependabot[bot]" \
|
|
311
|
+
--assignees-allow alice --assignees-allow bob \
|
|
278
312
|
--jira-project ACME --jira-project PLAT --jira-secret-id <uuid> \
|
|
279
313
|
--auth-mode pat
|
|
280
314
|
```
|
|
281
315
|
|
|
282
|
-
The same lists map onto runbook YAML as arrays — e.g. `
|
|
283
|
-
[acme-co/web, acme-co/api]`
|
|
316
|
+
The same lists map onto runbook YAML as arrays — e.g. `repo:
|
|
317
|
+
[acme-co/web, acme-co/api]` under an extractor's `args:`.
|
|
318
|
+
|
|
319
|
+
> **Divergent identifiers in one run.** Some extractors key off a tracker
|
|
320
|
+
> *project* (`active-tickets`, `ticket-archaeology`) rather than an
|
|
321
|
+
> `owner/repo` slug. When you run those alongside repo-based extractors in
|
|
322
|
+
> a single invocation and they need *different* values, reach for the
|
|
323
|
+
> per-extractor override flags (`--ticket-project`, `--pr-repo`, … — listed
|
|
324
|
+
> by `briar extract --advanced-help`), or split into two invocations. The
|
|
325
|
+
> runbook YAML models this cleanly: one `args:` block per extractor.
|
|
284
326
|
|
|
285
327
|
### Handy patterns
|
|
286
328
|
|
|
@@ -37,7 +37,7 @@ export ANTHROPIC_API_KEY=sk-ant-... # LLM key comes from the environment
|
|
|
37
37
|
# 2. Mine a repo's PR history into a knowledge blob
|
|
38
38
|
briar extract --company acme \
|
|
39
39
|
--include pr-archaeology \
|
|
40
|
-
--
|
|
40
|
+
--repo acme-co/acme-app --max 50
|
|
41
41
|
|
|
42
42
|
# 3. Read it back
|
|
43
43
|
briar context get knowledge:acme
|
|
@@ -45,6 +45,41 @@ briar context get knowledge:acme
|
|
|
45
45
|
|
|
46
46
|
> **Telemetry:** `briar` ships with opt-out error/usage analytics (Sentry). No prompts, file contents, ticket keys, repo names, paths, or secret values ever leave the machine. Turn it off any time with `briar telemetry off`, `BRIAR_TELEMETRY=off`, or `DO_NOT_TRACK=1`.
|
|
47
47
|
|
|
48
|
+
### Less typing: shared flags, project config, inference
|
|
49
|
+
|
|
50
|
+
briar resolves every flag through one chain — **CLI flag > env var > project config > built-in default** — so the stable values move off the command line:
|
|
51
|
+
|
|
52
|
+
```toml
|
|
53
|
+
# .briar.toml (or [tool.briar] in pyproject.toml), searched upward from cwd
|
|
54
|
+
company = "acme"
|
|
55
|
+
store = "postgres"
|
|
56
|
+
|
|
57
|
+
[repo]
|
|
58
|
+
owner = "acme-co"
|
|
59
|
+
repo = "acme-app"
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
With that file present, and inside the git checkout, the same extract is just:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
briar extract --include pr-archaeology # company + repo come from config/git
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
- **Canonical extractor flags.** One shared knob per concept — `--repo`, `--since-days`, `--max`, `--top-n`, `--sample`, `--authors-allow/-block`, `--assignees-allow/-block` — applies to every extractor selected with `--include`. The old per-extractor flags (`--pr-repo`, `--risk-since-days`, …) still work but are hidden from `-h`; run `briar extract --advanced-help` to see them.
|
|
69
|
+
- **Inference.** `--owner`/`--repo` are read from the git `origin` remote when neither the flag nor config supplies them.
|
|
70
|
+
- A per-extractor override always wins over the shared flag when both are given.
|
|
71
|
+
|
|
72
|
+
Helpers for the config + setup loop:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
briar init # write a starter .briar.toml (repo inferred from git)
|
|
76
|
+
briar config show # see each setting's resolved value AND its source
|
|
77
|
+
briar doctor # check config, git, credentials, store (CI-usable exit code)
|
|
78
|
+
eval "$(briar completion bash)" # tab-completion (also: zsh)
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Other niceties: `briar --version`, quiet-by-default logs (logs to stderr, `--verbose` for DEBUG), and a once-a-day "new version available" nudge (opt out with `BRIAR_NO_UPDATE_CHECK=1` / `DO_NOT_TRACK=1`).
|
|
82
|
+
|
|
48
83
|
---
|
|
49
84
|
|
|
50
85
|
## What you can do
|
|
@@ -55,8 +90,8 @@ briar context get knowledge:acme
|
|
|
55
90
|
# PRs + AWS infra in one shot, filtered to your team
|
|
56
91
|
briar extract --company acme \
|
|
57
92
|
--include pr-archaeology --include aws-infra \
|
|
58
|
-
--
|
|
59
|
-
--
|
|
93
|
+
--repo acme-co/acme-app \
|
|
94
|
+
--authors-allow alice --authors-allow bob \
|
|
60
95
|
--aws-extract-region us-east-1 \
|
|
61
96
|
--aws-extract-service ecs --aws-extract-service rds
|
|
62
97
|
|
|
@@ -69,12 +104,11 @@ FIREFLIES_ACME_API_KEY=ff_xxx briar extract --company acme \
|
|
|
69
104
|
--include meeting-digest --meeting-since-days 14 \
|
|
70
105
|
--meeting-attendee-allow alice@acme.com
|
|
71
106
|
|
|
72
|
-
# Code-quality signal from git history + the repo-host API
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
--include
|
|
76
|
-
--include review-nits --
|
|
77
|
-
--include ci-health --cihealth-repo acme-co/acme-app
|
|
107
|
+
# Code-quality signal from git history + the repo-host API.
|
|
108
|
+
# One --repo feeds every selected extractor.
|
|
109
|
+
briar extract --company acme --repo acme-co/acme-app \
|
|
110
|
+
--include defect-hotspots --include pr-hygiene \
|
|
111
|
+
--include review-nits --include ci-health
|
|
78
112
|
```
|
|
79
113
|
|
|
80
114
|
**Code-quality extractors** (all `--provider github|bitbucket`): `defect-hotspots`
|
|
@@ -89,8 +123,8 @@ briar extract --company acme \
|
|
|
89
123
|
```bash
|
|
90
124
|
# Merge a knowledge index into CLAUDE.md; full detail lands in
|
|
91
125
|
# .briar/knowledge/<company>.md for the agent to read when relevant.
|
|
92
|
-
briar extract --company acme --
|
|
93
|
-
--
|
|
126
|
+
briar extract --company acme --repo acme-co/acme-app \
|
|
127
|
+
--include defect-hotspots --include ci-health \
|
|
94
128
|
--merge-claude-md
|
|
95
129
|
```
|
|
96
130
|
|
|
@@ -162,33 +196,40 @@ Plus `briar context` (local knowledge blobs), `briar dashboard` (read-only HTML
|
|
|
162
196
|
### Repeatable flags — fan out across repos, projects, services
|
|
163
197
|
|
|
164
198
|
Most list-style flags accept multiple occurrences: repeat the flag, once
|
|
165
|
-
per value (there's no comma form — `--
|
|
166
|
-
|
|
199
|
+
per value (there's no comma form — `--repo a,b` is one repo named `a,b`).
|
|
200
|
+
The canonical `--repo` feeds every extractor selected with `--include`.
|
|
167
201
|
|
|
168
202
|
```bash
|
|
169
|
-
# Mine several repos, keep the team's PRs, drop the bots
|
|
170
|
-
# --
|
|
203
|
+
# Mine several repos, keep the team's PRs, drop the bots — one --repo,
|
|
204
|
+
# every selected extractor. --max applies per repo; author allow/block
|
|
205
|
+
# compose as allow ∩ ¬block.
|
|
171
206
|
briar extract --company acme \
|
|
172
|
-
--include pr-archaeology --include
|
|
173
|
-
--
|
|
174
|
-
--
|
|
175
|
-
--
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
# Scaffold a triage flow from two sources, filtered by author + assignee.
|
|
180
|
-
# Each tracker source carries its own repeatable *-authors/assignees-*.
|
|
207
|
+
--include pr-archaeology --include defect-hotspots \
|
|
208
|
+
--repo acme-co/web --repo acme-co/api --repo acme-co/mobile \
|
|
209
|
+
--max 75 \
|
|
210
|
+
--authors-block "dependabot[bot]" --authors-block "renovate[bot]"
|
|
211
|
+
|
|
212
|
+
# Scaffold a triage flow from two sources — one shared author/assignee
|
|
213
|
+
# filter applies to every --source.
|
|
181
214
|
briar scaffold implementation --prefix acme-triage \
|
|
182
215
|
--source github --source jira \
|
|
183
216
|
--owner acme-co --repo acme-app --github-secret-id <uuid> \
|
|
184
|
-
--
|
|
185
|
-
--
|
|
217
|
+
--authors-block "dependabot[bot]" \
|
|
218
|
+
--assignees-allow alice --assignees-allow bob \
|
|
186
219
|
--jira-project ACME --jira-project PLAT --jira-secret-id <uuid> \
|
|
187
220
|
--auth-mode pat
|
|
188
221
|
```
|
|
189
222
|
|
|
190
|
-
The same lists map onto runbook YAML as arrays — e.g. `
|
|
191
|
-
[acme-co/web, acme-co/api]`
|
|
223
|
+
The same lists map onto runbook YAML as arrays — e.g. `repo:
|
|
224
|
+
[acme-co/web, acme-co/api]` under an extractor's `args:`.
|
|
225
|
+
|
|
226
|
+
> **Divergent identifiers in one run.** Some extractors key off a tracker
|
|
227
|
+
> *project* (`active-tickets`, `ticket-archaeology`) rather than an
|
|
228
|
+
> `owner/repo` slug. When you run those alongside repo-based extractors in
|
|
229
|
+
> a single invocation and they need *different* values, reach for the
|
|
230
|
+
> per-extractor override flags (`--ticket-project`, `--pr-repo`, … — listed
|
|
231
|
+
> by `briar extract --advanced-help`), or split into two invocations. The
|
|
232
|
+
> runbook YAML models this cleanly: one `args:` block per extractor.
|
|
192
233
|
|
|
193
234
|
### Handy patterns
|
|
194
235
|
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "briar-cli"
|
|
7
|
-
version = "1.1.
|
|
7
|
+
version = "1.1.47"
|
|
8
8
|
description = "Terminal client for the Briar agent-orchestration API."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -59,6 +59,7 @@ test = [
|
|
|
59
59
|
dev = [
|
|
60
60
|
"black>=25,<26",
|
|
61
61
|
"mypy>=1.13,<2",
|
|
62
|
+
"ruff>=0.6,<1", # linter — same tool the quality hook + `make lint` use
|
|
62
63
|
]
|
|
63
64
|
# Adapter SDKs are opt-in extras so a base install stays minimal. Operators
|
|
64
65
|
# only install what they actually use. Each adapter's `is_available()`
|
|
@@ -10,6 +10,11 @@ from __future__ import annotations
|
|
|
10
10
|
|
|
11
11
|
import warnings
|
|
12
12
|
|
|
13
|
+
# E402 is expected here: the warnings filter below MUST run before any
|
|
14
|
+
# pydantic-importing module loads, so the rest of the imports follow it.
|
|
15
|
+
# ruff: noqa: E402
|
|
16
|
+
|
|
17
|
+
|
|
13
18
|
# pydantic's plugin loader scans installed packages for plugins at import
|
|
14
19
|
# time. When logfire is installed but its pinned opentelemetry-sdk symbol
|
|
15
20
|
# drifts (ReadableLogRecord was renamed upstream), the loader emits a
|
|
@@ -37,7 +42,7 @@ from briar.logging import env_verbose
|
|
|
37
42
|
# GLOBAL_FLAGS_WITH_VALUE: `--format yaml` / `--format=yaml`
|
|
38
43
|
# GLOBAL_BOOL_FLAGS: `--verbose` / `-v` (no value)
|
|
39
44
|
_GLOBAL_FLAGS_WITH_VALUE: Set[str] = {"--format"}
|
|
40
|
-
_GLOBAL_BOOL_FLAGS: Set[str] = {"--verbose", "-v"}
|
|
45
|
+
_GLOBAL_BOOL_FLAGS: Set[str] = {"--verbose", "-v", "--version", "-V"}
|
|
41
46
|
|
|
42
47
|
|
|
43
48
|
def _extract_global_flags(argv: List[str]) -> Tuple[Dict[str, str], Set[str], List[str]]:
|
|
@@ -94,6 +99,14 @@ def _build_parser(commands: Dict[str, Command]) -> argparse.ArgumentParser:
|
|
|
94
99
|
action="store_true",
|
|
95
100
|
help="enable DEBUG-level logging (also honours BRIAR_VERBOSE=1 env var)",
|
|
96
101
|
)
|
|
102
|
+
# `--version` is short-circuited in `main()` before any I/O; declared
|
|
103
|
+
# here so `briar --help` lists it.
|
|
104
|
+
parser.add_argument(
|
|
105
|
+
"--version",
|
|
106
|
+
"-V",
|
|
107
|
+
action="store_true",
|
|
108
|
+
help="print client version and exit",
|
|
109
|
+
)
|
|
97
110
|
sub = parser.add_subparsers(dest="command", required=True, metavar="COMMAND")
|
|
98
111
|
for name, cmd in commands.items():
|
|
99
112
|
sp = sub.add_parser(name, help=cmd.help)
|
|
@@ -101,6 +114,40 @@ def _build_parser(commands: Dict[str, Command]) -> argparse.ArgumentParser:
|
|
|
101
114
|
return parser
|
|
102
115
|
|
|
103
116
|
|
|
117
|
+
def _notify_update(log: logging.Logger) -> None:
|
|
118
|
+
"""Best-effort 'newer version available' notice on stderr. Throttled +
|
|
119
|
+
opt-out + swallow-on-error inside `update_check.maybe_notify`; the
|
|
120
|
+
extra guard here keeps even an import error from touching the exit."""
|
|
121
|
+
try:
|
|
122
|
+
from briar import __version__
|
|
123
|
+
from briar.update_check import maybe_notify
|
|
124
|
+
|
|
125
|
+
notice = maybe_notify(__version__)
|
|
126
|
+
if notice:
|
|
127
|
+
print(notice, file=sys.stderr)
|
|
128
|
+
except Exception: # noqa: BLE001 — an update nudge must never break the CLI
|
|
129
|
+
log.debug("update-check: notify failed", exc_info=True)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def _warn_legacy_flags(raw_argv: List[str], log: logging.Logger) -> None:
|
|
133
|
+
"""One consolidated stderr note when the command line uses a legacy
|
|
134
|
+
per-extractor / per-source flag that a canonical flag now covers.
|
|
135
|
+
|
|
136
|
+
A plain print, NOT a `warnings.warn` — the test suite runs with
|
|
137
|
+
`filterwarnings=error`, and this is user guidance, not a code smell."""
|
|
138
|
+
from briar.extract.canonical import legacy_flag_suggestions
|
|
139
|
+
|
|
140
|
+
suggestions = legacy_flag_suggestions(raw_argv)
|
|
141
|
+
if not suggestions:
|
|
142
|
+
return
|
|
143
|
+
pairs = ", ".join(f"{old} → {new}" for old, new in sorted(suggestions.items()))
|
|
144
|
+
print(
|
|
145
|
+
f"note: these flags are deprecated in favour of shared canonical flags: {pairs}. " "They still work; see `briar extract --advanced-help`.",
|
|
146
|
+
file=sys.stderr,
|
|
147
|
+
)
|
|
148
|
+
log.debug("legacy-flags: %s", pairs)
|
|
149
|
+
|
|
150
|
+
|
|
104
151
|
def _install_default_journal(log: logging.Logger) -> None:
|
|
105
152
|
"""Install the process-wide default journal. Honours
|
|
106
153
|
BRIAR_JOURNAL=off to disable entirely; otherwise wires the
|
|
@@ -141,6 +188,15 @@ def main(argv: Optional[List[str]] = None) -> int:
|
|
|
141
188
|
print(f"error: {exc}", file=sys.stderr)
|
|
142
189
|
return 1
|
|
143
190
|
|
|
191
|
+
# `--version` is pure metadata: print and exit before ANY logging,
|
|
192
|
+
# credential bootstrap, journal, or telemetry I/O — same contract as
|
|
193
|
+
# `-h`. Mirrors `briar version`, but as the conventional top-level flag.
|
|
194
|
+
if "--version" in flags or "-V" in flags:
|
|
195
|
+
from briar import __version__
|
|
196
|
+
|
|
197
|
+
print(f"briar-cli {__version__}")
|
|
198
|
+
return 0
|
|
199
|
+
|
|
144
200
|
# Configure logging before anything else so module imports that
|
|
145
201
|
# log at import-time still inherit the right level.
|
|
146
202
|
verbose = "--verbose" in flags or "-v" in flags or env_verbose()
|
|
@@ -197,6 +253,25 @@ def main(argv: Optional[List[str]] = None) -> int:
|
|
|
197
253
|
commands = CommandRegistry.build()
|
|
198
254
|
parser = _build_parser(commands)
|
|
199
255
|
|
|
256
|
+
# Fold project config (.briar.toml / [tool.briar]) + env into the
|
|
257
|
+
# parser defaults so a bare command inherits stable values (company,
|
|
258
|
+
# store, repo, model, …) and explicit flags still override. Skipped
|
|
259
|
+
# for help/usage so `briar -h` touches no config file.
|
|
260
|
+
if not metadata_only:
|
|
261
|
+
from briar.config import apply_config_defaults, load_project_config
|
|
262
|
+
|
|
263
|
+
satisfied = apply_config_defaults(parser, load_project_config())
|
|
264
|
+
if satisfied:
|
|
265
|
+
log.debug("config: satisfied defaults for %s", sorted(set(satisfied)))
|
|
266
|
+
|
|
267
|
+
# Below config in the precedence chain: infer --owner/--repo from
|
|
268
|
+
# the local git `origin` remote for whatever config didn't supply.
|
|
269
|
+
from briar.infer import apply_inference_defaults
|
|
270
|
+
|
|
271
|
+
inferred = apply_inference_defaults(parser, satisfied)
|
|
272
|
+
if inferred:
|
|
273
|
+
log.debug("infer: filled %s from git remote", sorted(set(inferred)))
|
|
274
|
+
|
|
200
275
|
normalised: List[str] = []
|
|
201
276
|
for flag, value in kv.items():
|
|
202
277
|
normalised.extend([flag, value])
|
|
@@ -205,6 +280,8 @@ def main(argv: Optional[List[str]] = None) -> int:
|
|
|
205
280
|
args = parser.parse_args(normalised)
|
|
206
281
|
log.debug("dispatching command=%s args=%r", args.command, vars(args))
|
|
207
282
|
|
|
283
|
+
_warn_legacy_flags(raw_argv, log)
|
|
284
|
+
|
|
208
285
|
# Wrap dispatch in a telemetry span so duration + outcome land
|
|
209
286
|
# in one place. The span captures uncaught exceptions, scrubs
|
|
210
287
|
# them, and ships an error event — then re-raises into the
|
|
@@ -214,6 +291,7 @@ def main(argv: Optional[List[str]] = None) -> int:
|
|
|
214
291
|
try:
|
|
215
292
|
with telemetry.command_span(args.command, args):
|
|
216
293
|
rc = commands[args.command].run(args)
|
|
294
|
+
_notify_update(log)
|
|
217
295
|
return rc
|
|
218
296
|
except CliError as exc:
|
|
219
297
|
log.error("command %s failed: %s", args.command, exc)
|
|
@@ -11,10 +11,14 @@ from typing import Dict, List, Type
|
|
|
11
11
|
from briar.commands.agent import CommandAgent
|
|
12
12
|
from briar.commands.auth import CommandAuth
|
|
13
13
|
from briar.commands.base import Command, confirm
|
|
14
|
+
from briar.commands.completion import CommandCompletion
|
|
15
|
+
from briar.commands.config import CommandConfig
|
|
14
16
|
from briar.commands.context import ContextCommand
|
|
15
17
|
from briar.commands.dashboard import CommandDashboard
|
|
18
|
+
from briar.commands.doctor import CommandDoctor
|
|
16
19
|
from briar.commands.extract import CommandExtract
|
|
17
20
|
from briar.commands.iac import CommandScaffold
|
|
21
|
+
from briar.commands.init import CommandInit
|
|
18
22
|
from briar.commands.journal import CommandJournal
|
|
19
23
|
from briar.commands.plan import CommandPlan
|
|
20
24
|
from briar.commands.runbook import CommandRunbook
|
|
@@ -40,6 +44,10 @@ class CommandRegistry:
|
|
|
40
44
|
CommandJournal,
|
|
41
45
|
CommandTelemetry,
|
|
42
46
|
CommandVersion,
|
|
47
|
+
CommandCompletion,
|
|
48
|
+
CommandInit,
|
|
49
|
+
CommandConfig,
|
|
50
|
+
CommandDoctor,
|
|
43
51
|
]
|
|
44
52
|
|
|
45
53
|
@classmethod
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"""`briar completion <shell>` — print a shell-completion script.
|
|
2
|
+
|
|
3
|
+
Dependency-free: the script bakes in the command/subcommand/flag names by
|
|
4
|
+
introspecting the parser at generation time. See `briar.completion`."""
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
import argparse
|
|
9
|
+
|
|
10
|
+
from briar.commands.base import Command
|
|
11
|
+
from briar.completion import SUPPORTED_SHELLS, render
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class CommandCompletion(Command):
|
|
15
|
+
name = "completion"
|
|
16
|
+
help = "Print a shell-completion script (bash/zsh)."
|
|
17
|
+
|
|
18
|
+
def add_arguments(self, parser: argparse.ArgumentParser) -> None:
|
|
19
|
+
parser.add_argument(
|
|
20
|
+
"shell",
|
|
21
|
+
choices=list(SUPPORTED_SHELLS),
|
|
22
|
+
help='Shell to emit completion for. Install with: eval "$(briar completion bash)"',
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
def run(self, args: argparse.Namespace) -> int:
|
|
26
|
+
from briar.commands import CommandRegistry
|
|
27
|
+
|
|
28
|
+
# Introspect the full registry minus this command (completing
|
|
29
|
+
# `briar completion` itself adds nothing useful).
|
|
30
|
+
commands = {name: cmd for name, cmd in CommandRegistry.build().items() if name != self.name}
|
|
31
|
+
print(render(args.shell, commands))
|
|
32
|
+
return 0
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"""`briar config show` — inspect the resolved project configuration.
|
|
2
|
+
|
|
3
|
+
Makes the precedence chain (CLI > env > .briar.toml > git inference >
|
|
4
|
+
default) debuggable: every setting's effective value and where it came
|
|
5
|
+
from. The table goes to stdout (honours `--format`); the config-file path
|
|
6
|
+
is a status line on stderr."""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import argparse
|
|
11
|
+
import sys
|
|
12
|
+
|
|
13
|
+
from briar.commands.base import Subcommand, SubcommandCommand
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class ConfigShowOp(Subcommand):
|
|
17
|
+
name = "show"
|
|
18
|
+
help = "Print each setting's resolved value and its source."
|
|
19
|
+
|
|
20
|
+
def run(self, command: "SubcommandCommand", args: argparse.Namespace) -> int:
|
|
21
|
+
from briar.config import find_config_file, resolve_with_source
|
|
22
|
+
from briar.formatting import render
|
|
23
|
+
|
|
24
|
+
path = find_config_file()
|
|
25
|
+
print(f"config file: {path if path else '(none found — using env / git / defaults)'}", file=sys.stderr)
|
|
26
|
+
rows = [{"setting": r.setting, "value": r.value, "source": r.source} for r in resolve_with_source()]
|
|
27
|
+
render(rows, args.format, ["setting", "value", "source"])
|
|
28
|
+
return 0
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class CommandConfig(SubcommandCommand):
|
|
32
|
+
name = "config"
|
|
33
|
+
help = "Inspect resolved project configuration (config show)."
|
|
34
|
+
|
|
35
|
+
dest = "config_op"
|
|
36
|
+
op_noun = "config op"
|
|
37
|
+
ops = {"show": ConfigShowOp()}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"""`briar doctor` — offline environment health check.
|
|
2
|
+
|
|
3
|
+
Prints a status line per check (python, config, git, credentials, store)
|
|
4
|
+
and exits non-zero only on a hard failure, so it is CI-usable."""
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
import argparse
|
|
9
|
+
|
|
10
|
+
from briar.commands._enums import ExitCode
|
|
11
|
+
from briar.commands.base import Command
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class CommandDoctor(Command):
|
|
15
|
+
name = "doctor"
|
|
16
|
+
help = "Check the local environment (config, git, credentials, store)."
|
|
17
|
+
|
|
18
|
+
def run(self, args: argparse.Namespace) -> int:
|
|
19
|
+
from briar.doctor import FAIL, run_checks, worst_status
|
|
20
|
+
from briar.formatting import render
|
|
21
|
+
|
|
22
|
+
checks = run_checks()
|
|
23
|
+
rows = [{"check": c.name, "status": c.status, "detail": c.detail} for c in checks]
|
|
24
|
+
render(rows, args.format, ["check", "status", "detail"])
|
|
25
|
+
return ExitCode.GENERAL_ERROR if worst_status(checks) == FAIL else ExitCode.OK
|