briar-cli 1.1.43__tar.gz → 1.1.45__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 (421) hide show
  1. {briar_cli-1.1.43 → briar_cli-1.1.45}/PKG-INFO +20 -1
  2. {briar_cli-1.1.43 → briar_cli-1.1.45}/README.md +19 -0
  3. {briar_cli-1.1.43 → briar_cli-1.1.45}/pyproject.toml +1 -1
  4. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/commands/extract.py +51 -0
  5. briar_cli-1.1.45/src/briar/extract/claude_md.py +78 -0
  6. briar_cli-1.1.45/tests/unit/extract/test_claude_md.py +153 -0
  7. {briar_cli-1.1.43 → briar_cli-1.1.45}/.gitignore +0 -0
  8. {briar_cli-1.1.43 → briar_cli-1.1.45}/LICENSE +0 -0
  9. {briar_cli-1.1.43 → briar_cli-1.1.45}/agents/README.md +0 -0
  10. {briar_cli-1.1.43 → briar_cli-1.1.45}/examples/all_features.yaml +0 -0
  11. {briar_cli-1.1.43 → briar_cli-1.1.45}/examples/multi_company.env.example +0 -0
  12. {briar_cli-1.1.43 → briar_cli-1.1.45}/examples/multi_company.yaml +0 -0
  13. {briar_cli-1.1.43 → briar_cli-1.1.45}/examples/simple-single-repo.yaml +0 -0
  14. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/__init__.py +0 -0
  15. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/__main__.py +0 -0
  16. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/_http_retry.py +0 -0
  17. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/_registry.py +0 -0
  18. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/agent/__init__.py +0 -0
  19. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/agent/_enums.py +0 -0
  20. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/agent/_llm.py +0 -0
  21. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/agent/_llms/__init__.py +0 -0
  22. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/agent/_llms/anthropic_llm.py +0 -0
  23. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/agent/_llms/bedrock.py +0 -0
  24. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/agent/_llms/gemini.py +0 -0
  25. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/agent/_llms/openai_llm.py +0 -0
  26. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/agent/runner.py +0 -0
  27. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/agent/tools.py +0 -0
  28. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/auth/__init__.py +0 -0
  29. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/auth/_acquirer.py +0 -0
  30. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/auth/_acquirers/__init__.py +0 -0
  31. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/auth/_acquirers/aws_sso.py +0 -0
  32. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/auth/_acquirers/aws_static.py +0 -0
  33. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/auth/_acquirers/bitbucket.py +0 -0
  34. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/auth/_acquirers/fireflies.py +0 -0
  35. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/auth/_acquirers/github_device.py +0 -0
  36. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/auth/_acquirers/github_pat.py +0 -0
  37. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/auth/_acquirers/jira_session.py +0 -0
  38. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/auth/_acquirers/jira_token.py +0 -0
  39. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/auth/_acquirers/linear.py +0 -0
  40. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/auth/_prompt.py +0 -0
  41. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/cli.py +0 -0
  42. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/commands/__init__.py +0 -0
  43. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/commands/_enums.py +0 -0
  44. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/commands/agent.py +0 -0
  45. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/commands/auth.py +0 -0
  46. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/commands/base.py +0 -0
  47. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/commands/context.py +0 -0
  48. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/commands/dashboard.py +0 -0
  49. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/commands/iac.py +0 -0
  50. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/commands/journal.py +0 -0
  51. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/commands/plan.py +0 -0
  52. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/commands/runbook.py +0 -0
  53. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/commands/secrets.py +0 -0
  54. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/commands/telemetry.py +0 -0
  55. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/commands/version.py +0 -0
  56. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/credentials/__init__.py +0 -0
  57. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/credentials/_aws.py +0 -0
  58. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/credentials/_bootstrap.py +0 -0
  59. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/credentials/_bootstraps/__init__.py +0 -0
  60. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/credentials/_bootstraps/envfile.py +0 -0
  61. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/credentials/_paths.py +0 -0
  62. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/credentials/_store.py +0 -0
  63. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/credentials/aws_secrets.py +0 -0
  64. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/credentials/envfile.py +0 -0
  65. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/credentials/ssm.py +0 -0
  66. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/credentials/vault.py +0 -0
  67. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/dashboard/__init__.py +0 -0
  68. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/dashboard/collectors.py +0 -0
  69. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/dashboard/server.py +0 -0
  70. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/dashboard/templates/_macros.html +0 -0
  71. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/dashboard/templates/index.html +0 -0
  72. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/decorators.py +0 -0
  73. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/env_vars.py +0 -0
  74. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/error_policy.py +0 -0
  75. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/errors.py +0 -0
  76. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/__init__.py +0 -0
  77. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_cloud.py +0 -0
  78. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_clouds/__init__.py +0 -0
  79. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_clouds/aws.py +0 -0
  80. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_clouds/azure.py +0 -0
  81. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_clouds/gcp.py +0 -0
  82. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_gh.py +0 -0
  83. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_meeting.py +0 -0
  84. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_meetings/__init__.py +0 -0
  85. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_meetings/fireflies.py +0 -0
  86. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_provider.py +0 -0
  87. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_providers/__init__.py +0 -0
  88. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_providers/bitbucket.py +0 -0
  89. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_providers/github.py +0 -0
  90. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_time_util.py +0 -0
  91. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_tracker.py +0 -0
  92. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_trackers/__init__.py +0 -0
  93. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_trackers/_jira_auth.py +0 -0
  94. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_trackers/bitbucket.py +0 -0
  95. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_trackers/github_issues.py +0 -0
  96. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_trackers/jira.py +0 -0
  97. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_trackers/linear.py +0 -0
  98. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_user_filter.py +0 -0
  99. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/active_tickets.py +0 -0
  100. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/active_work.py +0 -0
  101. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/aws_infra.py +0 -0
  102. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/aws_services/__init__.py +0 -0
  103. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/aws_services/base.py +0 -0
  104. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/aws_services/ecs.py +0 -0
  105. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/aws_services/lambda_.py +0 -0
  106. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/aws_services/logs.py +0 -0
  107. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/aws_services/rds.py +0 -0
  108. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/aws_services/sqs.py +0 -0
  109. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/aws_services/tagging.py +0 -0
  110. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/base.py +0 -0
  111. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/ci_health.py +0 -0
  112. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/code_hotspots.py +0 -0
  113. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/code_scanning.py +0 -0
  114. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/codebase_conventions.py +0 -0
  115. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/commit_message_quality.py +0 -0
  116. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/composer.py +0 -0
  117. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/defect_hotspots.py +0 -0
  118. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/dependency_health.py +0 -0
  119. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/github_deployments.py +0 -0
  120. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/language_detectors/__init__.py +0 -0
  121. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/meeting_context.py +0 -0
  122. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/meeting_digest.py +0 -0
  123. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/pr_archaeology.py +0 -0
  124. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/pr_hygiene.py +0 -0
  125. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/pr_review_context.py +0 -0
  126. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/release_cadence.py +0 -0
  127. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/repo_governance.py +0 -0
  128. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/revert_signals.py +0 -0
  129. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/review_nits.py +0 -0
  130. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/reviewer_profile.py +0 -0
  131. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/stale_prs.py +0 -0
  132. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/test_discipline.py +0 -0
  133. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/ticket_archaeology.py +0 -0
  134. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/ticket_context.py +0 -0
  135. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/todo_density.py +0 -0
  136. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/formatting/__init__.py +0 -0
  137. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/formatting/base.py +0 -0
  138. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/formatting/csv.py +0 -0
  139. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/formatting/json.py +0 -0
  140. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/formatting/quiet.py +0 -0
  141. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/formatting/table.py +0 -0
  142. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/formatting/yaml.py +0 -0
  143. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/__init__.py +0 -0
  144. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/config_file.py +0 -0
  145. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/models.py +0 -0
  146. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/runbook/__init__.py +0 -0
  147. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/runbook/executor.py +0 -0
  148. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/runbook/models.py +0 -0
  149. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/runbook/scheduler.py +0 -0
  150. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/__init__.py +0 -0
  151. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/_composer.py +0 -0
  152. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/_knowledge.py +0 -0
  153. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/archetypes/__init__.py +0 -0
  154. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/archetypes/base.py +0 -0
  155. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/archetypes/engineer.py +0 -0
  156. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/archetypes/pr_ci_fixer.py +0 -0
  157. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/archetypes/pr_conflict_resolver.py +0 -0
  158. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/archetypes/pr_fixer.py +0 -0
  159. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/archetypes/triager.py +0 -0
  160. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/base.py +0 -0
  161. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/implementation.py +0 -0
  162. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/pr_fixes.py +0 -0
  163. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/rules/__init__.py +0 -0
  164. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/rules/ai_prefix_on_comments.md +0 -0
  165. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/rules/base.py +0 -0
  166. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/rules/commit_as_human.md +0 -0
  167. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/rules/minimum_correct_fix.md +0 -0
  168. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/rules/no_force_push.md +0 -0
  169. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/rules/no_new_pr_creation.md +0 -0
  170. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/rules/no_workflow_file_edits.md +0 -0
  171. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/rules/read_all_comments_first.md +0 -0
  172. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/rules/skip_approved_green_prs.md +0 -0
  173. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/shapes/__init__.py +0 -0
  174. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/sources/__init__.py +0 -0
  175. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/sources/aws.py +0 -0
  176. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/sources/base.py +0 -0
  177. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/sources/bitbucket.py +0 -0
  178. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/sources/github.py +0 -0
  179. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/sources/jira.py +0 -0
  180. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/sources/sentry.py +0 -0
  181. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/triggers/__init__.py +0 -0
  182. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/triggers/base.py +0 -0
  183. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/triggers/bitbucket_webhook.py +0 -0
  184. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/triggers/github_webhook.py +0 -0
  185. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/triggers/manual.py +0 -0
  186. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/triggers/schedule_cron.py +0 -0
  187. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/journal/__init__.py +0 -0
  188. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/journal/_journal.py +0 -0
  189. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/journal/_render.py +0 -0
  190. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/journal/models.py +0 -0
  191. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/journal/sinks/__init__.py +0 -0
  192. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/journal/sinks/base.py +0 -0
  193. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/journal/sinks/file.py +0 -0
  194. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/journal/store/__init__.py +0 -0
  195. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/journal/store/base.py +0 -0
  196. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/journal/store/file.py +0 -0
  197. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/log_context.py +0 -0
  198. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/logging.py +0 -0
  199. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/mcp/__init__.py +0 -0
  200. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/mcp/_errors.py +0 -0
  201. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/mcp/_manager.py +0 -0
  202. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/mcp/_tool.py +0 -0
  203. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/mcp/defaults.py +0 -0
  204. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/messaging/__init__.py +0 -0
  205. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/messaging/_jira_creds.py +0 -0
  206. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/messaging/_writer.py +0 -0
  207. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/messaging/bitbucket_pr_comment.py +0 -0
  208. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/messaging/github_pr_comment.py +0 -0
  209. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/messaging/jira_comment.py +0 -0
  210. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/messaging/jira_transition.py +0 -0
  211. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/messaging/slack_channel.py +0 -0
  212. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/messaging/telegram_chat.py +0 -0
  213. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/notify/__init__.py +0 -0
  214. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/notify/_sink.py +0 -0
  215. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/notify/email.py +0 -0
  216. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/notify/pagerduty.py +0 -0
  217. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/notify/slack.py +0 -0
  218. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/notify/telegram.py +0 -0
  219. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/pagination.py +0 -0
  220. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/plan/__init__.py +0 -0
  221. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/plan/_board.py +0 -0
  222. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/plan/_boards/__init__.py +0 -0
  223. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/plan/_boards/github_project.py +0 -0
  224. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/plan/_boards/jira_board.py +0 -0
  225. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/plan/_enums.py +0 -0
  226. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/plan/_json_utils.py +0 -0
  227. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/plan/_models.py +0 -0
  228. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/plan/_replan.py +0 -0
  229. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/plan/_selector.py +0 -0
  230. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/plan/_status.py +0 -0
  231. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/plan/_store.py +0 -0
  232. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/plan/_synthesize.py +0 -0
  233. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/plan/_writeback.py +0 -0
  234. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/storage/__init__.py +0 -0
  235. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/storage/_models.py +0 -0
  236. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/storage/base.py +0 -0
  237. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/storage/file.py +0 -0
  238. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/storage/postgres.py +0 -0
  239. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/telemetry/__init__.py +0 -0
  240. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/telemetry/_config.py +0 -0
  241. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/telemetry/_scrubber.py +0 -0
  242. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/telemetry/_sinks/__init__.py +0 -0
  243. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/telemetry/_sinks/base.py +0 -0
  244. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/telemetry/_sinks/file.py +0 -0
  245. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/telemetry/_sinks/noop.py +0 -0
  246. {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/telemetry/_sinks/sentry.py +0 -0
  247. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/__init__.py +0 -0
  248. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/conftest.py +0 -0
  249. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/__init__.py +0 -0
  250. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/conftest.py +0 -0
  251. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/mcp_echo_server.py +0 -0
  252. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_acquirer_real.py +0 -0
  253. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_agent_loop_real.py +0 -0
  254. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_auth_login_real.py +0 -0
  255. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_cli_extract_real.py +0 -0
  256. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_cli_smoke_subprocess.py +0 -0
  257. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_extract_aws_real.py +0 -0
  258. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_extract_github_real.py +0 -0
  259. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_extract_jira_real.py +0 -0
  260. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_llm_real.py +0 -0
  261. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_local_commands_real.py +0 -0
  262. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_mcp_live_real.py +0 -0
  263. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_messaging_bitbucket_real.py +0 -0
  264. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_messaging_github_inline_real.py +0 -0
  265. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_messaging_jira_real.py +0 -0
  266. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_messaging_real.py +0 -0
  267. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_notify_real.py +0 -0
  268. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_plan_llm_real.py +0 -0
  269. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_registry_contract.py +0 -0
  270. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_tracker_real.py +0 -0
  271. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/test_abstractions.py +0 -0
  272. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/test_dashboard.py +0 -0
  273. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/test_extract.py +0 -0
  274. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/test_extract_meetings.py +0 -0
  275. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/test_formatting.py +0 -0
  276. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/test_journal.py +0 -0
  277. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/test_knowledge_splicer.py +0 -0
  278. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/test_log_context.py +0 -0
  279. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/test_plan.py +0 -0
  280. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/test_plan_run.py +0 -0
  281. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/test_rules_registry.py +0 -0
  282. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/test_scaffold.py +0 -0
  283. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/test_scheduler.py +0 -0
  284. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/test_smart_scheduler.py +0 -0
  285. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/test_user_filter.py +0 -0
  286. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/__init__.py +0 -0
  287. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/agent/__init__.py +0 -0
  288. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/agent/conftest.py +0 -0
  289. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/agent/test_anthropic_llm.py +0 -0
  290. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/agent/test_bedrock_llm.py +0 -0
  291. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/agent/test_gemini_llm.py +0 -0
  292. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/agent/test_llm_registry.py +0 -0
  293. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/agent/test_openai_llm.py +0 -0
  294. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/agent/test_runner_loop.py +0 -0
  295. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/agent/test_runner_mcp.py +0 -0
  296. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/agent/test_tools.py +0 -0
  297. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/auth/__init__.py +0 -0
  298. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/auth/test_aws_sso.py +0 -0
  299. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/auth/test_aws_static.py +0 -0
  300. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/auth/test_github_device.py +0 -0
  301. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/auth/test_jira_session.py +0 -0
  302. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/auth/test_prompt.py +0 -0
  303. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/__init__.py +0 -0
  304. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_agent_cmd.py +0 -0
  305. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_agent_mcp_defaults.py +0 -0
  306. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_agent_params.py +0 -0
  307. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_auth.py +0 -0
  308. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_auth_cmd.py +0 -0
  309. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_auth_params.py +0 -0
  310. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_cli.py +0 -0
  311. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_cmd_creds.py +0 -0
  312. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_context.py +0 -0
  313. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_context_params.py +0 -0
  314. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_dashboard_cmd.py +0 -0
  315. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_dashboard_params.py +0 -0
  316. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_extract.py +0 -0
  317. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_extract_params.py +0 -0
  318. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_journal.py +0 -0
  319. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_journal_params.py +0 -0
  320. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_plan_cmd.py +0 -0
  321. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_plan_params.py +0 -0
  322. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_plan_run_params.py +0 -0
  323. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_runbook.py +0 -0
  324. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_runbook_params.py +0 -0
  325. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_scaffold.py +0 -0
  326. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_scaffold_implementation_params.py +0 -0
  327. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_scaffold_pr_fixes_params.py +0 -0
  328. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_secrets.py +0 -0
  329. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_secrets_params.py +0 -0
  330. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_telemetry_cmd.py +0 -0
  331. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_telemetry_params.py +0 -0
  332. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/credentials/__init__.py +0 -0
  333. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/credentials/test_envfile.py +0 -0
  334. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/dashboard/__init__.py +0 -0
  335. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/dashboard/test_log_collectors.py +0 -0
  336. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/dashboard/test_server.py +0 -0
  337. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/dashboard/test_server_render.py +0 -0
  338. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/__init__.py +0 -0
  339. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_active_work.py +0 -0
  340. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_aws_infra.py +0 -0
  341. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_aws_services.py +0 -0
  342. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_ci_health.py +0 -0
  343. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_cloud_aws.py +0 -0
  344. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_cloud_azure.py +0 -0
  345. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_cloud_gcp.py +0 -0
  346. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_cloud_registry.py +0 -0
  347. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_code_hotspots.py +0 -0
  348. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_code_scanning.py +0 -0
  349. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_commit_message_quality.py +0 -0
  350. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_composer_inventory.py +0 -0
  351. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_defect_hotspots.py +0 -0
  352. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_dependency_health.py +0 -0
  353. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_gh_facade.py +0 -0
  354. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_github_deployments.py +0 -0
  355. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_meeting_context_gaps.py +0 -0
  356. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_pr_archaeology_gaps.py +0 -0
  357. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_pr_hygiene.py +0 -0
  358. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_provider_bitbucket.py +0 -0
  359. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_provider_github.py +0 -0
  360. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_release_cadence.py +0 -0
  361. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_repo_governance.py +0 -0
  362. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_revert_signals.py +0 -0
  363. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_review_nits.py +0 -0
  364. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_reviewer_profile.py +0 -0
  365. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_stale_prs.py +0 -0
  366. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_test_discipline.py +0 -0
  367. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_ticket_archaeology.py +0 -0
  368. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_ticket_context.py +0 -0
  369. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_todo_density.py +0 -0
  370. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_tracker_bitbucket.py +0 -0
  371. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_tracker_github_issues.py +0 -0
  372. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_tracker_jira.py +0 -0
  373. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_tracker_linear.py +0 -0
  374. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_user_filter_branches.py +0 -0
  375. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/iac/__init__.py +0 -0
  376. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/iac/test_every_parser.py +0 -0
  377. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/iac/test_mcp_schema.py +0 -0
  378. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/iac/test_runbook_executor.py +0 -0
  379. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/iac/test_runbook_scheduler.py +0 -0
  380. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/journal/__init__.py +0 -0
  381. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/journal/test_facade.py +0 -0
  382. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/mcp/__init__.py +0 -0
  383. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/mcp/test_mcp_aws_env_bridge.py +0 -0
  384. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/mcp/test_mcp_tool.py +0 -0
  385. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/messaging/__init__.py +0 -0
  386. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/messaging/test_bitbucket_pr_comment.py +0 -0
  387. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/messaging/test_github_pr_comment.py +0 -0
  388. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/messaging/test_jira_comment.py +0 -0
  389. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/messaging/test_jira_transition.py +0 -0
  390. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/messaging/test_slack_channel.py +0 -0
  391. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/messaging/test_telegram_chat.py +0 -0
  392. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/messaging/test_writer_helpers.py +0 -0
  393. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/notify/__init__.py +0 -0
  394. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/notify/test_email.py +0 -0
  395. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/notify/test_pagerduty.py +0 -0
  396. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/notify/test_slack_and_telegram.py +0 -0
  397. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/plan/__init__.py +0 -0
  398. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/plan/test_board_github_project.py +0 -0
  399. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/plan/test_board_jira.py +0 -0
  400. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/plan/test_board_registry.py +0 -0
  401. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/plan/test_models.py +0 -0
  402. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/plan/test_plan_helpers_edges.py +0 -0
  403. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/plan/test_selector_branches.py +0 -0
  404. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/plan/test_status.py +0 -0
  405. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/plan/test_writeback_branches.py +0 -0
  406. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/storage/__init__.py +0 -0
  407. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/storage/test_backends.py +0 -0
  408. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/telemetry/__init__.py +0 -0
  409. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/telemetry/test_command_span.py +0 -0
  410. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/telemetry/test_config.py +0 -0
  411. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/telemetry/test_scrubber.py +0 -0
  412. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/test_decorators.py +0 -0
  413. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/test_env_vars.py +0 -0
  414. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/test_error_policy.py +0 -0
  415. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/test_errors.py +0 -0
  416. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/test_file_tool_sandbox.py +0 -0
  417. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/test_formatting.py +0 -0
  418. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/test_http_retry.py +0 -0
  419. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/test_log_context.py +0 -0
  420. {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/test_pagination.py +0 -0
  421. {briar_cli-1.1.43 → briar_cli-1.1.45}/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.43
3
+ Version: 1.1.45
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
@@ -176,6 +176,25 @@ briar extract --company acme \
176
176
  `code-scanning`, `repo-governance`, `test-discipline`, `release-cadence`,
177
177
  `todo-density`. See [`agents/extract.md`](agents/extract.md).
178
178
 
179
+ #### Feed the knowledge to Claude Code — on demand
180
+
181
+ ```bash
182
+ # Merge a knowledge index into CLAUDE.md; full detail lands in
183
+ # .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 \
186
+ --merge-claude-md
187
+ ```
188
+
189
+ `--merge-claude-md` writes the full bundle to `.briar/knowledge/<company>.md`
190
+ and splices a short, marker-bounded index — section titles plus a pointer to
191
+ that file — into `CLAUDE.md` (override with `--claude-md-path`). Because
192
+ `CLAUDE.md` is auto-loaded into every Claude Code session but the detail file
193
+ is not, the knowledge stays available **on demand** without paying a
194
+ per-session context cost: the agent reads the detail file only when a task
195
+ touches one of the listed topics. Re-runs replace just briar's block, leaving
196
+ your hand-written `CLAUDE.md` untouched.
197
+
179
198
  ### `briar runbook serve` — scheduled extraction, in-process
180
199
 
181
200
  Describe every company + task in one YAML and let `briar` run the schedule forever — no cron, no external job runner.
@@ -84,6 +84,25 @@ briar extract --company acme \
84
84
  `code-scanning`, `repo-governance`, `test-discipline`, `release-cadence`,
85
85
  `todo-density`. See [`agents/extract.md`](agents/extract.md).
86
86
 
87
+ #### Feed the knowledge to Claude Code — on demand
88
+
89
+ ```bash
90
+ # Merge a knowledge index into CLAUDE.md; full detail lands in
91
+ # .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 \
94
+ --merge-claude-md
95
+ ```
96
+
97
+ `--merge-claude-md` writes the full bundle to `.briar/knowledge/<company>.md`
98
+ and splices a short, marker-bounded index — section titles plus a pointer to
99
+ that file — into `CLAUDE.md` (override with `--claude-md-path`). Because
100
+ `CLAUDE.md` is auto-loaded into every Claude Code session but the detail file
101
+ is not, the knowledge stays available **on demand** without paying a
102
+ per-session context cost: the agent reads the detail file only when a task
103
+ touches one of the listed topics. Re-runs replace just briar's block, leaving
104
+ your hand-written `CLAUDE.md` untouched.
105
+
87
106
  ### `briar runbook serve` — scheduled extraction, in-process
88
107
 
89
108
  Describe every company + task in one YAML and let `briar` run the schedule forever — no cron, no external job runner.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "briar-cli"
7
- version = "1.1.43"
7
+ version = "1.1.45"
8
8
  description = "Terminal client for the Briar agent-orchestration API."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -4,6 +4,7 @@ result to a local markdown file."""
4
4
  from __future__ import annotations
5
5
 
6
6
  import argparse
7
+ from datetime import datetime, timezone
7
8
  from pathlib import Path
8
9
  from typing import List
9
10
 
@@ -11,9 +12,22 @@ from briar.commands.base import Command
11
12
  from briar.errors import CliError
12
13
  from briar.extract import EXTRACTORS
13
14
  from briar.extract.base import ExtractedSection
15
+ from briar.extract.claude_md import ClaudeMdMerger
14
16
  from briar.extract.composer import render_json, render_markdown
15
17
  from briar.storage import KNOWLEDGE_STORE_NAMES, make_store
16
18
 
19
+ _CLAUDE_MD_DETAIL_ROOT = Path(".briar/knowledge")
20
+
21
+
22
+ def _company_slug(company: str) -> str:
23
+ """Filesystem-safe stem for the detail file. Non-alphanumeric runs
24
+ collapse to a single dash so ``Acme Inc.`` and ``acme-inc`` don't
25
+ fight over the same path."""
26
+ slug = "".join(char if char.isalnum() else "-" for char in company.lower())
27
+ while "--" in slug:
28
+ slug = slug.replace("--", "-")
29
+ return slug.strip("-") or "knowledge"
30
+
17
31
 
18
32
  class CommandExtract(Command):
19
33
  name = "extract"
@@ -41,6 +55,16 @@ class CommandExtract(Command):
41
55
  parser.add_argument("--blob-name", default="", help="Storage blob name (default: knowledge:<company>)")
42
56
  parser.add_argument("--root", default="./knowledge", help="Local file root (only used when --storage=file)")
43
57
  parser.add_argument("--out-json", default="", help="Parallel JSON output path (empty = skip)")
58
+ parser.add_argument(
59
+ "--merge-claude-md",
60
+ action="store_true",
61
+ help="Also merge a knowledge index into CLAUDE.md so Claude Code " "sessions can read the full detail on demand",
62
+ )
63
+ parser.add_argument(
64
+ "--claude-md-path",
65
+ default="./CLAUDE.md",
66
+ help="CLAUDE.md to merge the knowledge index into (only used with --merge-claude-md)",
67
+ )
44
68
  for ext in EXTRACTORS.values():
45
69
  ext.add_arguments(parser)
46
70
 
@@ -76,4 +100,31 @@ class CommandExtract(Command):
76
100
  json_path.write_text(render_json(company=args.company, sections=sections))
77
101
  print(f"wrote {json_path}")
78
102
 
103
+ if args.merge_claude_md:
104
+ self._merge_claude_md(args, sections)
105
+
79
106
  return 0
107
+
108
+ def _merge_claude_md(self, args: argparse.Namespace, sections: List[ExtractedSection]) -> None:
109
+ """Write the full bundle to a local detail file and splice a
110
+ short pointer index into CLAUDE.md.
111
+
112
+ The detail file is always written to the local filesystem (under
113
+ the cwd) regardless of ``--storage``: the on-demand reference in
114
+ CLAUDE.md only resolves for a session running from the project
115
+ root, so a postgres-backed run still needs the local copy here."""
116
+ detail_path = _CLAUDE_MD_DETAIL_ROOT / f"{_company_slug(args.company)}.md"
117
+ detail_path.parent.mkdir(parents=True, exist_ok=True)
118
+ detail_path.write_text(render_markdown(company=args.company, sections=sections))
119
+
120
+ block = ClaudeMdMerger.index_block(
121
+ company=args.company,
122
+ detail_path=detail_path.as_posix(),
123
+ sections=sections,
124
+ when=datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%MZ"),
125
+ )
126
+ claude_md = Path(args.claude_md_path)
127
+ existing = claude_md.read_text() if claude_md.exists() else ""
128
+ claude_md.parent.mkdir(parents=True, exist_ok=True)
129
+ claude_md.write_text(ClaudeMdMerger.merge(existing=existing, block=block))
130
+ print(f"merged knowledge index into {claude_md} (detail: {detail_path})")
@@ -0,0 +1,78 @@
1
+ """Merge an extracted knowledge bundle into a project's ``CLAUDE.md`` so
2
+ Claude Code sessions can load the detail ON DEMAND.
3
+
4
+ ``CLAUDE.md`` is auto-loaded into *every* session, so anything placed
5
+ there is a permanent per-session context cost. We therefore keep only a
6
+ short index in ``CLAUDE.md`` — the section titles plus a pointer to the
7
+ full detail file — and let the agent ``Read`` that file when a task
8
+ actually needs it. The index lives inside a managed marker block so a
9
+ re-run replaces just Briar's block and never disturbs hand-written
10
+ content around it.
11
+
12
+ Pure string composition only — no filesystem access. The command at the
13
+ edge owns reading/writing the files and stamps the timestamp, which
14
+ keeps this module trivially testable."""
15
+
16
+ from __future__ import annotations
17
+
18
+ from typing import List
19
+
20
+ from briar.extract.base import ExtractedSection
21
+
22
+ BEGIN_MARKER = "<!-- BEGIN briar-knowledge -->"
23
+ END_MARKER = "<!-- END briar-knowledge -->"
24
+
25
+
26
+ class ClaudeMdMerger:
27
+ """Render and splice Briar's managed knowledge-index block."""
28
+
29
+ @classmethod
30
+ def index_block(
31
+ cls,
32
+ *,
33
+ company: str,
34
+ detail_path: str,
35
+ sections: List[ExtractedSection],
36
+ when: str,
37
+ ) -> str:
38
+ """The short block that lives inside ``CLAUDE.md``: a pointer to
39
+ the full detail file plus the list of topics it covers, so a
40
+ session knows when reading it is worthwhile.
41
+
42
+ Follows Claude Code's CLAUDE.md conventions: a plain imperative
43
+ instruction and bullet topics (not italic prose), kept lean
44
+ because CLAUDE.md is auto-loaded into every session. The
45
+ provenance line is a block-level HTML comment — Claude Code
46
+ strips those before injecting the file into context, so it costs
47
+ zero tokens yet stays visible to humans reading the file on
48
+ disk."""
49
+ lines: List[str] = [
50
+ BEGIN_MARKER,
51
+ (f"<!-- extracted {when}; managed by `briar extract --merge-claude-md` — " "edits between these markers are overwritten on re-run -->"),
52
+ f"## Project knowledge — {company} (Briar)",
53
+ "",
54
+ f"Read `{detail_path}` when a task touches any of these topics:",
55
+ "",
56
+ ]
57
+ lines.extend(f"- {section.title}" for section in sections)
58
+ lines.append(END_MARKER)
59
+ return "\n".join(lines)
60
+
61
+ @classmethod
62
+ def merge(cls, *, existing: str, block: str) -> str:
63
+ """Return ``CLAUDE.md`` content with Briar's block inserted or
64
+ replaced. Everything outside the markers is preserved verbatim.
65
+
66
+ A well-formed existing block (both markers, in order) is replaced
67
+ in place. Otherwise the block is appended, separated from prior
68
+ content by a blank line. A stray/malformed marker pair is treated
69
+ as absent rather than guessed at — we never delete content we
70
+ can't bound."""
71
+ start = existing.find(BEGIN_MARKER)
72
+ end = existing.find(END_MARKER)
73
+ if start != -1 and end > start:
74
+ end += len(END_MARKER)
75
+ return existing[:start] + block + existing[end:]
76
+ if existing.strip():
77
+ return f"{existing.rstrip()}\n\n{block}\n"
78
+ return f"{block}\n"
@@ -0,0 +1,153 @@
1
+ """Tests for the CLAUDE.md knowledge-index merge.
2
+
3
+ The merger is pure string composition; the command-level test exercises
4
+ the file I/O (detail file written locally, index spliced into CLAUDE.md)
5
+ and the non-destructive marker-block behaviour."""
6
+
7
+ from __future__ import annotations
8
+
9
+ import argparse
10
+ import os
11
+ import unittest
12
+ from pathlib import Path
13
+ from tempfile import TemporaryDirectory
14
+
15
+ from briar.commands.extract import CommandExtract, _company_slug
16
+ from briar.extract.base import ExtractedSection
17
+ from briar.extract.claude_md import BEGIN_MARKER, END_MARKER, ClaudeMdMerger
18
+
19
+ _SECTIONS = [
20
+ ExtractedSection(title="CI health", body="pass rate 92%"),
21
+ ExtractedSection(title="PR hygiene", body="median 84 LOC"),
22
+ ]
23
+
24
+
25
+ class IndexBlockTests(unittest.TestCase):
26
+ def _block(self) -> str:
27
+ return ClaudeMdMerger.index_block(
28
+ company="Acme",
29
+ detail_path=".briar/knowledge/acme.md",
30
+ sections=_SECTIONS,
31
+ when="2026-06-18T13:00Z",
32
+ )
33
+
34
+ def test_block_is_marker_bounded(self) -> None:
35
+ block = self._block()
36
+ self.assertTrue(block.startswith(BEGIN_MARKER))
37
+ self.assertTrue(block.rstrip().endswith(END_MARKER))
38
+
39
+ def test_block_points_at_detail_with_imperative_instruction(self) -> None:
40
+ block = self._block()
41
+ self.assertIn("Read `.briar/knowledge/acme.md` when", block)
42
+ self.assertIn("- CI health", block)
43
+ self.assertIn("- PR hygiene", block)
44
+
45
+ def test_block_uses_plain_bullets_not_italic_prose(self) -> None:
46
+ # CLAUDE.md convention favours imperative bullets over italic prose.
47
+ block = self._block()
48
+ self.assertNotIn("_Extracted", block)
49
+ self.assertNotIn("on demand_", block)
50
+
51
+ def test_timestamp_lives_in_a_stripped_html_comment(self) -> None:
52
+ # Claude Code strips block-level HTML comments before injecting
53
+ # CLAUDE.md into context, so provenance costs zero tokens. The
54
+ # timestamp must therefore sit inside a comment, never bare text.
55
+ for line in self._block().splitlines():
56
+ if "2026-06-18T13:00Z" in line:
57
+ self.assertTrue(line.strip().startswith("<!--"))
58
+ self.assertTrue(line.strip().endswith("-->"))
59
+ break
60
+ else:
61
+ self.fail("timestamp not present in block")
62
+
63
+ def test_block_omits_section_bodies(self) -> None:
64
+ # Index stays light: titles only, never the detail bodies.
65
+ block = self._block()
66
+ self.assertNotIn("pass rate 92%", block)
67
+
68
+
69
+ class MergeTests(unittest.TestCase):
70
+ def setUp(self) -> None:
71
+ self.block = ClaudeMdMerger.index_block(
72
+ company="Acme",
73
+ detail_path=".briar/knowledge/acme.md",
74
+ sections=_SECTIONS,
75
+ when="2026-06-18T13:00Z",
76
+ )
77
+
78
+ def test_append_into_existing_preserves_handwritten_content(self) -> None:
79
+ existing = "# My project\n\nHand-written rules.\n"
80
+ merged = ClaudeMdMerger.merge(existing=existing, block=self.block)
81
+ self.assertIn("Hand-written rules.", merged)
82
+ self.assertIn(BEGIN_MARKER, merged)
83
+
84
+ def test_empty_existing_yields_just_the_block(self) -> None:
85
+ merged = ClaudeMdMerger.merge(existing="", block=self.block)
86
+ self.assertEqual(merged.strip(), self.block.strip())
87
+
88
+ def test_rerun_replaces_block_without_duplicating(self) -> None:
89
+ first = ClaudeMdMerger.merge(existing="# Top\n", block=self.block)
90
+ fresh = ClaudeMdMerger.index_block(
91
+ company="Acme",
92
+ detail_path=".briar/knowledge/acme.md",
93
+ sections=[ExtractedSection(title="Stale PRs", body="3 idle")],
94
+ when="2026-06-19T09:00Z",
95
+ )
96
+ second = ClaudeMdMerger.merge(existing=first, block=fresh)
97
+ self.assertEqual(second.count(BEGIN_MARKER), 1)
98
+ self.assertEqual(second.count(END_MARKER), 1)
99
+ self.assertIn("- Stale PRs", second)
100
+ self.assertNotIn("- CI health", second)
101
+ self.assertIn("# Top", second)
102
+
103
+ def test_malformed_markers_are_not_treated_as_a_block(self) -> None:
104
+ # END before BEGIN must not delete the content between them.
105
+ existing = f"keep-a\n{END_MARKER}\nkeep-b\n{BEGIN_MARKER}\nkeep-c\n"
106
+ merged = ClaudeMdMerger.merge(existing=existing, block=self.block)
107
+ self.assertIn("keep-a", merged)
108
+ self.assertIn("keep-b", merged)
109
+ self.assertIn("keep-c", merged)
110
+
111
+
112
+ class CompanySlugTests(unittest.TestCase):
113
+ def test_spaces_and_punctuation_collapse_to_single_dash(self) -> None:
114
+ self.assertEqual(_company_slug("Acme Inc."), "acme-inc")
115
+
116
+ def test_empty_falls_back(self) -> None:
117
+ self.assertEqual(_company_slug("!!!"), "knowledge")
118
+
119
+
120
+ class MergeCommandIoTests(unittest.TestCase):
121
+ def setUp(self) -> None:
122
+ self._prev_cwd = os.getcwd()
123
+ self._tmp = TemporaryDirectory()
124
+ os.chdir(self._tmp.name)
125
+
126
+ def tearDown(self) -> None:
127
+ os.chdir(self._prev_cwd)
128
+ self._tmp.cleanup()
129
+
130
+ def _args(self) -> argparse.Namespace:
131
+ return argparse.Namespace(company="Acme Inc.", claude_md_path="./CLAUDE.md")
132
+
133
+ def test_writes_detail_file_and_merges_index(self) -> None:
134
+ CommandExtract()._merge_claude_md(self._args(), _SECTIONS)
135
+
136
+ detail = Path(".briar/knowledge/acme-inc.md")
137
+ self.assertTrue(detail.exists())
138
+ self.assertIn("pass rate 92%", detail.read_text())
139
+
140
+ claude_md = Path("./CLAUDE.md").read_text()
141
+ self.assertIn(BEGIN_MARKER, claude_md)
142
+ self.assertIn(".briar/knowledge/acme-inc.md", claude_md)
143
+
144
+ def test_merge_keeps_existing_claude_md(self) -> None:
145
+ Path("./CLAUDE.md").write_text("# Existing\n\nkeep me\n")
146
+ CommandExtract()._merge_claude_md(self._args(), _SECTIONS)
147
+ claude_md = Path("./CLAUDE.md").read_text()
148
+ self.assertIn("keep me", claude_md)
149
+ self.assertEqual(claude_md.count(BEGIN_MARKER), 1)
150
+
151
+
152
+ if __name__ == "__main__":
153
+ unittest.main()
File without changes
File without changes
File without changes
File without changes