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.
Files changed (448) hide show
  1. {briar_cli-1.1.45 → briar_cli-1.1.47}/.gitignore +3 -0
  2. {briar_cli-1.1.45 → briar_cli-1.1.47}/PKG-INFO +71 -29
  3. {briar_cli-1.1.45 → briar_cli-1.1.47}/README.md +69 -28
  4. {briar_cli-1.1.45 → briar_cli-1.1.47}/pyproject.toml +2 -1
  5. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/cli.py +79 -1
  6. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/commands/__init__.py +8 -0
  7. briar_cli-1.1.47/src/briar/commands/completion.py +32 -0
  8. briar_cli-1.1.47/src/briar/commands/config.py +37 -0
  9. briar_cli-1.1.47/src/briar/commands/doctor.py +25 -0
  10. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/commands/extract.py +32 -6
  11. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/commands/iac.py +2 -1
  12. briar_cli-1.1.47/src/briar/commands/init.py +66 -0
  13. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/commands/journal.py +2 -2
  14. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/commands/runbook.py +6 -6
  15. briar_cli-1.1.47/src/briar/completion.py +121 -0
  16. briar_cli-1.1.47/src/briar/completion_templates/bash.tmpl +16 -0
  17. briar_cli-1.1.47/src/briar/completion_templates/bash_subcommand.tmpl +9 -0
  18. briar_cli-1.1.47/src/briar/completion_templates/inner.tmpl +1 -0
  19. briar_cli-1.1.47/src/briar/completion_templates/leaf.tmpl +1 -0
  20. briar_cli-1.1.47/src/briar/completion_templates/zsh.tmpl +14 -0
  21. briar_cli-1.1.47/src/briar/completion_templates/zsh_subcommand.tmpl +9 -0
  22. briar_cli-1.1.47/src/briar/config.py +283 -0
  23. briar_cli-1.1.47/src/briar/doctor.py +111 -0
  24. briar_cli-1.1.47/src/briar/extract/canonical.py +251 -0
  25. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/runbook/executor.py +6 -0
  26. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/_composer.py +24 -1
  27. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/sources/base.py +11 -12
  28. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/sources/jira.py +3 -9
  29. briar_cli-1.1.47/src/briar/infer.py +79 -0
  30. briar_cli-1.1.47/src/briar/init_templates/briar_toml.tmpl +17 -0
  31. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/logging.py +41 -4
  32. briar_cli-1.1.47/src/briar/update_check.py +98 -0
  33. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/conftest.py +11 -1
  34. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_extract_jira_real.py +4 -1
  35. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_local_commands_real.py +2 -2
  36. briar_cli-1.1.47/tests/unit/commands/test_init.py +55 -0
  37. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_journal_params.py +2 -2
  38. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_scaffold_implementation_params.py +4 -2
  39. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_scaffold_pr_fixes_params.py +2 -1
  40. briar_cli-1.1.47/tests/unit/extract/test_canonical.py +112 -0
  41. briar_cli-1.1.47/tests/unit/extract/test_legacy_flag_notice.py +54 -0
  42. briar_cli-1.1.47/tests/unit/iac/test_scaffold_shared_filters.py +57 -0
  43. briar_cli-1.1.47/tests/unit/test_cli_meta.py +53 -0
  44. briar_cli-1.1.47/tests/unit/test_completion.py +54 -0
  45. briar_cli-1.1.47/tests/unit/test_config.py +154 -0
  46. briar_cli-1.1.47/tests/unit/test_doctor.py +72 -0
  47. briar_cli-1.1.47/tests/unit/test_infer.py +84 -0
  48. briar_cli-1.1.47/tests/unit/test_update_check.py +65 -0
  49. {briar_cli-1.1.45 → briar_cli-1.1.47}/LICENSE +0 -0
  50. {briar_cli-1.1.45 → briar_cli-1.1.47}/agents/README.md +0 -0
  51. {briar_cli-1.1.45 → briar_cli-1.1.47}/examples/all_features.yaml +0 -0
  52. {briar_cli-1.1.45 → briar_cli-1.1.47}/examples/multi_company.env.example +0 -0
  53. {briar_cli-1.1.45 → briar_cli-1.1.47}/examples/multi_company.yaml +0 -0
  54. {briar_cli-1.1.45 → briar_cli-1.1.47}/examples/simple-single-repo.yaml +0 -0
  55. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/__init__.py +0 -0
  56. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/__main__.py +0 -0
  57. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/_http_retry.py +0 -0
  58. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/_registry.py +0 -0
  59. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/agent/__init__.py +0 -0
  60. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/agent/_enums.py +0 -0
  61. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/agent/_llm.py +0 -0
  62. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/agent/_llms/__init__.py +0 -0
  63. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/agent/_llms/anthropic_llm.py +0 -0
  64. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/agent/_llms/bedrock.py +0 -0
  65. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/agent/_llms/gemini.py +0 -0
  66. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/agent/_llms/openai_llm.py +0 -0
  67. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/agent/runner.py +0 -0
  68. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/agent/tools.py +0 -0
  69. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/auth/__init__.py +0 -0
  70. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/auth/_acquirer.py +0 -0
  71. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/auth/_acquirers/__init__.py +0 -0
  72. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/auth/_acquirers/aws_sso.py +0 -0
  73. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/auth/_acquirers/aws_static.py +0 -0
  74. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/auth/_acquirers/bitbucket.py +0 -0
  75. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/auth/_acquirers/fireflies.py +0 -0
  76. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/auth/_acquirers/github_device.py +0 -0
  77. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/auth/_acquirers/github_pat.py +0 -0
  78. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/auth/_acquirers/jira_session.py +0 -0
  79. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/auth/_acquirers/jira_token.py +0 -0
  80. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/auth/_acquirers/linear.py +0 -0
  81. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/auth/_prompt.py +0 -0
  82. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/commands/_enums.py +0 -0
  83. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/commands/agent.py +0 -0
  84. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/commands/auth.py +0 -0
  85. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/commands/base.py +0 -0
  86. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/commands/context.py +0 -0
  87. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/commands/dashboard.py +0 -0
  88. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/commands/plan.py +0 -0
  89. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/commands/secrets.py +0 -0
  90. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/commands/telemetry.py +0 -0
  91. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/commands/version.py +0 -0
  92. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/credentials/__init__.py +0 -0
  93. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/credentials/_aws.py +0 -0
  94. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/credentials/_bootstrap.py +0 -0
  95. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/credentials/_bootstraps/__init__.py +0 -0
  96. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/credentials/_bootstraps/envfile.py +0 -0
  97. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/credentials/_paths.py +0 -0
  98. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/credentials/_store.py +0 -0
  99. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/credentials/aws_secrets.py +0 -0
  100. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/credentials/envfile.py +0 -0
  101. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/credentials/ssm.py +0 -0
  102. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/credentials/vault.py +0 -0
  103. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/dashboard/__init__.py +0 -0
  104. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/dashboard/collectors.py +0 -0
  105. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/dashboard/server.py +0 -0
  106. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/dashboard/templates/_macros.html +0 -0
  107. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/dashboard/templates/index.html +0 -0
  108. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/decorators.py +0 -0
  109. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/env_vars.py +0 -0
  110. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/error_policy.py +0 -0
  111. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/errors.py +0 -0
  112. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/__init__.py +0 -0
  113. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_cloud.py +0 -0
  114. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_clouds/__init__.py +0 -0
  115. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_clouds/aws.py +0 -0
  116. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_clouds/azure.py +0 -0
  117. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_clouds/gcp.py +0 -0
  118. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_gh.py +0 -0
  119. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_meeting.py +0 -0
  120. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_meetings/__init__.py +0 -0
  121. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_meetings/fireflies.py +0 -0
  122. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_provider.py +0 -0
  123. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_providers/__init__.py +0 -0
  124. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_providers/bitbucket.py +0 -0
  125. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_providers/github.py +0 -0
  126. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_time_util.py +0 -0
  127. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_tracker.py +0 -0
  128. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_trackers/__init__.py +0 -0
  129. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_trackers/_jira_auth.py +0 -0
  130. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_trackers/bitbucket.py +0 -0
  131. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_trackers/github_issues.py +0 -0
  132. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_trackers/jira.py +0 -0
  133. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_trackers/linear.py +0 -0
  134. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/_user_filter.py +0 -0
  135. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/active_tickets.py +0 -0
  136. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/active_work.py +0 -0
  137. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/aws_infra.py +0 -0
  138. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/aws_services/__init__.py +0 -0
  139. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/aws_services/base.py +0 -0
  140. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/aws_services/ecs.py +0 -0
  141. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/aws_services/lambda_.py +0 -0
  142. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/aws_services/logs.py +0 -0
  143. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/aws_services/rds.py +0 -0
  144. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/aws_services/sqs.py +0 -0
  145. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/aws_services/tagging.py +0 -0
  146. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/base.py +0 -0
  147. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/ci_health.py +0 -0
  148. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/claude_md.py +0 -0
  149. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/code_hotspots.py +0 -0
  150. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/code_scanning.py +0 -0
  151. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/codebase_conventions.py +0 -0
  152. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/commit_message_quality.py +0 -0
  153. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/composer.py +0 -0
  154. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/defect_hotspots.py +0 -0
  155. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/dependency_health.py +0 -0
  156. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/github_deployments.py +0 -0
  157. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/language_detectors/__init__.py +0 -0
  158. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/meeting_context.py +0 -0
  159. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/meeting_digest.py +0 -0
  160. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/pr_archaeology.py +0 -0
  161. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/pr_hygiene.py +0 -0
  162. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/pr_review_context.py +0 -0
  163. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/release_cadence.py +0 -0
  164. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/repo_governance.py +0 -0
  165. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/revert_signals.py +0 -0
  166. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/review_nits.py +0 -0
  167. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/reviewer_profile.py +0 -0
  168. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/stale_prs.py +0 -0
  169. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/test_discipline.py +0 -0
  170. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/ticket_archaeology.py +0 -0
  171. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/ticket_context.py +0 -0
  172. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/extract/todo_density.py +0 -0
  173. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/formatting/__init__.py +0 -0
  174. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/formatting/base.py +0 -0
  175. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/formatting/csv.py +0 -0
  176. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/formatting/json.py +0 -0
  177. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/formatting/quiet.py +0 -0
  178. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/formatting/table.py +0 -0
  179. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/formatting/yaml.py +0 -0
  180. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/__init__.py +0 -0
  181. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/config_file.py +0 -0
  182. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/models.py +0 -0
  183. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/runbook/__init__.py +0 -0
  184. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/runbook/models.py +0 -0
  185. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/runbook/scheduler.py +0 -0
  186. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/__init__.py +0 -0
  187. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/_knowledge.py +0 -0
  188. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/archetypes/__init__.py +0 -0
  189. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/archetypes/base.py +0 -0
  190. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/archetypes/engineer.py +0 -0
  191. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/archetypes/pr_ci_fixer.py +0 -0
  192. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/archetypes/pr_conflict_resolver.py +0 -0
  193. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/archetypes/pr_fixer.py +0 -0
  194. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/archetypes/triager.py +0 -0
  195. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/base.py +0 -0
  196. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/implementation.py +0 -0
  197. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/pr_fixes.py +0 -0
  198. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/rules/__init__.py +0 -0
  199. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/rules/ai_prefix_on_comments.md +0 -0
  200. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/rules/base.py +0 -0
  201. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/rules/commit_as_human.md +0 -0
  202. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/rules/minimum_correct_fix.md +0 -0
  203. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/rules/no_force_push.md +0 -0
  204. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/rules/no_new_pr_creation.md +0 -0
  205. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/rules/no_workflow_file_edits.md +0 -0
  206. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/rules/read_all_comments_first.md +0 -0
  207. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/rules/skip_approved_green_prs.md +0 -0
  208. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/shapes/__init__.py +0 -0
  209. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/sources/__init__.py +0 -0
  210. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/sources/aws.py +0 -0
  211. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/sources/bitbucket.py +0 -0
  212. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/sources/github.py +0 -0
  213. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/sources/sentry.py +0 -0
  214. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/triggers/__init__.py +0 -0
  215. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/triggers/base.py +0 -0
  216. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/triggers/bitbucket_webhook.py +0 -0
  217. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/triggers/github_webhook.py +0 -0
  218. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/triggers/manual.py +0 -0
  219. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/iac/scaffold/triggers/schedule_cron.py +0 -0
  220. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/journal/__init__.py +0 -0
  221. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/journal/_journal.py +0 -0
  222. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/journal/_render.py +0 -0
  223. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/journal/models.py +0 -0
  224. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/journal/sinks/__init__.py +0 -0
  225. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/journal/sinks/base.py +0 -0
  226. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/journal/sinks/file.py +0 -0
  227. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/journal/store/__init__.py +0 -0
  228. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/journal/store/base.py +0 -0
  229. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/journal/store/file.py +0 -0
  230. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/log_context.py +0 -0
  231. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/mcp/__init__.py +0 -0
  232. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/mcp/_errors.py +0 -0
  233. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/mcp/_manager.py +0 -0
  234. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/mcp/_tool.py +0 -0
  235. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/mcp/defaults.py +0 -0
  236. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/messaging/__init__.py +0 -0
  237. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/messaging/_jira_creds.py +0 -0
  238. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/messaging/_writer.py +0 -0
  239. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/messaging/bitbucket_pr_comment.py +0 -0
  240. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/messaging/github_pr_comment.py +0 -0
  241. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/messaging/jira_comment.py +0 -0
  242. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/messaging/jira_transition.py +0 -0
  243. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/messaging/slack_channel.py +0 -0
  244. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/messaging/telegram_chat.py +0 -0
  245. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/notify/__init__.py +0 -0
  246. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/notify/_sink.py +0 -0
  247. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/notify/email.py +0 -0
  248. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/notify/pagerduty.py +0 -0
  249. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/notify/slack.py +0 -0
  250. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/notify/telegram.py +0 -0
  251. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/pagination.py +0 -0
  252. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/plan/__init__.py +0 -0
  253. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/plan/_board.py +0 -0
  254. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/plan/_boards/__init__.py +0 -0
  255. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/plan/_boards/github_project.py +0 -0
  256. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/plan/_boards/jira_board.py +0 -0
  257. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/plan/_enums.py +0 -0
  258. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/plan/_json_utils.py +0 -0
  259. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/plan/_models.py +0 -0
  260. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/plan/_replan.py +0 -0
  261. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/plan/_selector.py +0 -0
  262. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/plan/_status.py +0 -0
  263. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/plan/_store.py +0 -0
  264. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/plan/_synthesize.py +0 -0
  265. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/plan/_writeback.py +0 -0
  266. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/storage/__init__.py +0 -0
  267. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/storage/_models.py +0 -0
  268. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/storage/base.py +0 -0
  269. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/storage/file.py +0 -0
  270. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/storage/postgres.py +0 -0
  271. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/telemetry/__init__.py +0 -0
  272. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/telemetry/_config.py +0 -0
  273. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/telemetry/_scrubber.py +0 -0
  274. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/telemetry/_sinks/__init__.py +0 -0
  275. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/telemetry/_sinks/base.py +0 -0
  276. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/telemetry/_sinks/file.py +0 -0
  277. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/telemetry/_sinks/noop.py +0 -0
  278. {briar_cli-1.1.45 → briar_cli-1.1.47}/src/briar/telemetry/_sinks/sentry.py +0 -0
  279. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/__init__.py +0 -0
  280. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/__init__.py +0 -0
  281. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/conftest.py +0 -0
  282. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/mcp_echo_server.py +0 -0
  283. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_acquirer_real.py +0 -0
  284. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_agent_loop_real.py +0 -0
  285. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_auth_login_real.py +0 -0
  286. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_cli_extract_real.py +0 -0
  287. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_cli_smoke_subprocess.py +0 -0
  288. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_extract_aws_real.py +0 -0
  289. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_extract_github_real.py +0 -0
  290. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_llm_real.py +0 -0
  291. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_mcp_live_real.py +0 -0
  292. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_messaging_bitbucket_real.py +0 -0
  293. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_messaging_github_inline_real.py +0 -0
  294. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_messaging_jira_real.py +0 -0
  295. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_messaging_real.py +0 -0
  296. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_notify_real.py +0 -0
  297. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_plan_llm_real.py +0 -0
  298. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_registry_contract.py +0 -0
  299. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/integration/test_tracker_real.py +0 -0
  300. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/test_abstractions.py +0 -0
  301. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/test_dashboard.py +0 -0
  302. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/test_extract.py +0 -0
  303. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/test_extract_meetings.py +0 -0
  304. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/test_formatting.py +0 -0
  305. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/test_journal.py +0 -0
  306. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/test_knowledge_splicer.py +0 -0
  307. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/test_log_context.py +0 -0
  308. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/test_plan.py +0 -0
  309. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/test_plan_run.py +0 -0
  310. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/test_rules_registry.py +0 -0
  311. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/test_scaffold.py +0 -0
  312. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/test_scheduler.py +0 -0
  313. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/test_smart_scheduler.py +0 -0
  314. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/test_user_filter.py +0 -0
  315. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/__init__.py +0 -0
  316. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/agent/__init__.py +0 -0
  317. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/agent/conftest.py +0 -0
  318. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/agent/test_anthropic_llm.py +0 -0
  319. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/agent/test_bedrock_llm.py +0 -0
  320. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/agent/test_gemini_llm.py +0 -0
  321. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/agent/test_llm_registry.py +0 -0
  322. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/agent/test_openai_llm.py +0 -0
  323. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/agent/test_runner_loop.py +0 -0
  324. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/agent/test_runner_mcp.py +0 -0
  325. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/agent/test_tools.py +0 -0
  326. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/auth/__init__.py +0 -0
  327. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/auth/test_aws_sso.py +0 -0
  328. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/auth/test_aws_static.py +0 -0
  329. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/auth/test_github_device.py +0 -0
  330. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/auth/test_jira_session.py +0 -0
  331. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/auth/test_prompt.py +0 -0
  332. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/__init__.py +0 -0
  333. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_agent_cmd.py +0 -0
  334. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_agent_mcp_defaults.py +0 -0
  335. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_agent_params.py +0 -0
  336. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_auth.py +0 -0
  337. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_auth_cmd.py +0 -0
  338. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_auth_params.py +0 -0
  339. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_cli.py +0 -0
  340. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_cmd_creds.py +0 -0
  341. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_context.py +0 -0
  342. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_context_params.py +0 -0
  343. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_dashboard_cmd.py +0 -0
  344. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_dashboard_params.py +0 -0
  345. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_extract.py +0 -0
  346. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_extract_params.py +0 -0
  347. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_journal.py +0 -0
  348. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_plan_cmd.py +0 -0
  349. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_plan_params.py +0 -0
  350. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_plan_run_params.py +0 -0
  351. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_runbook.py +0 -0
  352. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_runbook_params.py +0 -0
  353. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_scaffold.py +0 -0
  354. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_secrets.py +0 -0
  355. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_secrets_params.py +0 -0
  356. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_telemetry_cmd.py +0 -0
  357. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/commands/test_telemetry_params.py +0 -0
  358. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/credentials/__init__.py +0 -0
  359. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/credentials/test_envfile.py +0 -0
  360. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/dashboard/__init__.py +0 -0
  361. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/dashboard/test_log_collectors.py +0 -0
  362. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/dashboard/test_server.py +0 -0
  363. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/dashboard/test_server_render.py +0 -0
  364. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/__init__.py +0 -0
  365. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_active_work.py +0 -0
  366. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_aws_infra.py +0 -0
  367. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_aws_services.py +0 -0
  368. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_ci_health.py +0 -0
  369. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_claude_md.py +0 -0
  370. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_cloud_aws.py +0 -0
  371. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_cloud_azure.py +0 -0
  372. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_cloud_gcp.py +0 -0
  373. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_cloud_registry.py +0 -0
  374. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_code_hotspots.py +0 -0
  375. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_code_scanning.py +0 -0
  376. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_commit_message_quality.py +0 -0
  377. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_composer_inventory.py +0 -0
  378. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_defect_hotspots.py +0 -0
  379. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_dependency_health.py +0 -0
  380. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_gh_facade.py +0 -0
  381. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_github_deployments.py +0 -0
  382. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_meeting_context_gaps.py +0 -0
  383. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_pr_archaeology_gaps.py +0 -0
  384. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_pr_hygiene.py +0 -0
  385. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_provider_bitbucket.py +0 -0
  386. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_provider_github.py +0 -0
  387. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_release_cadence.py +0 -0
  388. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_repo_governance.py +0 -0
  389. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_revert_signals.py +0 -0
  390. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_review_nits.py +0 -0
  391. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_reviewer_profile.py +0 -0
  392. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_stale_prs.py +0 -0
  393. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_test_discipline.py +0 -0
  394. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_ticket_archaeology.py +0 -0
  395. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_ticket_context.py +0 -0
  396. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_todo_density.py +0 -0
  397. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_tracker_bitbucket.py +0 -0
  398. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_tracker_github_issues.py +0 -0
  399. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_tracker_jira.py +0 -0
  400. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_tracker_linear.py +0 -0
  401. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/extract/test_user_filter_branches.py +0 -0
  402. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/iac/__init__.py +0 -0
  403. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/iac/test_every_parser.py +0 -0
  404. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/iac/test_mcp_schema.py +0 -0
  405. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/iac/test_runbook_executor.py +0 -0
  406. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/iac/test_runbook_scheduler.py +0 -0
  407. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/journal/__init__.py +0 -0
  408. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/journal/test_facade.py +0 -0
  409. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/mcp/__init__.py +0 -0
  410. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/mcp/test_mcp_aws_env_bridge.py +0 -0
  411. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/mcp/test_mcp_tool.py +0 -0
  412. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/messaging/__init__.py +0 -0
  413. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/messaging/test_bitbucket_pr_comment.py +0 -0
  414. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/messaging/test_github_pr_comment.py +0 -0
  415. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/messaging/test_jira_comment.py +0 -0
  416. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/messaging/test_jira_transition.py +0 -0
  417. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/messaging/test_slack_channel.py +0 -0
  418. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/messaging/test_telegram_chat.py +0 -0
  419. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/messaging/test_writer_helpers.py +0 -0
  420. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/notify/__init__.py +0 -0
  421. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/notify/test_email.py +0 -0
  422. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/notify/test_pagerduty.py +0 -0
  423. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/notify/test_slack_and_telegram.py +0 -0
  424. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/plan/__init__.py +0 -0
  425. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/plan/test_board_github_project.py +0 -0
  426. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/plan/test_board_jira.py +0 -0
  427. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/plan/test_board_registry.py +0 -0
  428. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/plan/test_models.py +0 -0
  429. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/plan/test_plan_helpers_edges.py +0 -0
  430. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/plan/test_selector_branches.py +0 -0
  431. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/plan/test_status.py +0 -0
  432. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/plan/test_writeback_branches.py +0 -0
  433. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/storage/__init__.py +0 -0
  434. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/storage/test_backends.py +0 -0
  435. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/telemetry/__init__.py +0 -0
  436. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/telemetry/test_command_span.py +0 -0
  437. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/telemetry/test_config.py +0 -0
  438. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/telemetry/test_scrubber.py +0 -0
  439. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/test_decorators.py +0 -0
  440. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/test_env_vars.py +0 -0
  441. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/test_error_policy.py +0 -0
  442. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/test_errors.py +0 -0
  443. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/test_file_tool_sandbox.py +0 -0
  444. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/test_formatting.py +0 -0
  445. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/test_http_retry.py +0 -0
  446. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/test_log_context.py +0 -0
  447. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/test_pagination.py +0 -0
  448. {briar_cli-1.1.45 → briar_cli-1.1.47}/tests/unit/test_runner_dispatch.py +0 -0
@@ -31,3 +31,6 @@ config.json
31
31
 
32
32
  # Real-company runbooks + planning docs — kept local, not for public repo
33
33
  runbooks/
34
+
35
+ # Local Claude Code workspace (worktrees, caches)
36
+ .claude/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: briar-cli
3
- Version: 1.1.45
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
- --pr-repo acme-co/acme-app --pr-max 50
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
- --pr-repo acme-co/acme-app \
151
- --pr-authors-allow alice --pr-authors-allow bob \
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
- briar extract --company acme \
166
- --include defect-hotspots --risk-repo acme-co/acme-app \
167
- --include pr-hygiene --prhygiene-repo acme-co/acme-app \
168
- --include review-nits --nits-repo acme-co/acme-app \
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 --include defect-hotspots --include ci-health \
185
- --risk-repo acme-co/acme-app --cihealth-repo acme-co/acme-app \
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 — `--pr-repo a,b` is one repo named
258
- `a,b`). Mix them to cover a whole fleet in a single command.
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, across two boards.
262
- # --pr-max applies per repo; author allow/block compose as allow ∩ ¬block.
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 active-tickets \
265
- --tracker jira \
266
- --pr-repo acme-co/web --pr-repo acme-co/api --pr-repo acme-co/mobile \
267
- --pr-max 75 \
268
- --pr-authors-block "dependabot[bot]" --pr-authors-block "renovate[bot]" \
269
- --ticket-project ACME --ticket-project PLAT
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
- --github-authors-block "dependabot[bot]" \
277
- --github-assignees-allow alice --github-assignees-allow bob \
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. `pr_repo:
283
- [acme-co/web, acme-co/api]` is two `--pr-repo` flags.
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
- --pr-repo acme-co/acme-app --pr-max 50
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
- --pr-repo acme-co/acme-app \
59
- --pr-authors-allow alice --pr-authors-allow bob \
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
- briar extract --company acme \
74
- --include defect-hotspots --risk-repo acme-co/acme-app \
75
- --include pr-hygiene --prhygiene-repo acme-co/acme-app \
76
- --include review-nits --nits-repo acme-co/acme-app \
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 --include defect-hotspots --include ci-health \
93
- --risk-repo acme-co/acme-app --cihealth-repo acme-co/acme-app \
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 — `--pr-repo a,b` is one repo named
166
- `a,b`). Mix them to cover a whole fleet in a single command.
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, across two boards.
170
- # --pr-max applies per repo; author allow/block compose as allow ∩ ¬block.
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 active-tickets \
173
- --tracker jira \
174
- --pr-repo acme-co/web --pr-repo acme-co/api --pr-repo acme-co/mobile \
175
- --pr-max 75 \
176
- --pr-authors-block "dependabot[bot]" --pr-authors-block "renovate[bot]" \
177
- --ticket-project ACME --ticket-project PLAT
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
- --github-authors-block "dependabot[bot]" \
185
- --github-assignees-allow alice --github-assignees-allow bob \
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. `pr_repo:
191
- [acme-co/web, acme-co/api]` is two `--pr-repo` flags.
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.45"
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