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.
- {briar_cli-1.1.43 → briar_cli-1.1.45}/PKG-INFO +20 -1
- {briar_cli-1.1.43 → briar_cli-1.1.45}/README.md +19 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/pyproject.toml +1 -1
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/commands/extract.py +51 -0
- briar_cli-1.1.45/src/briar/extract/claude_md.py +78 -0
- briar_cli-1.1.45/tests/unit/extract/test_claude_md.py +153 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/.gitignore +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/LICENSE +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/agents/README.md +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/examples/all_features.yaml +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/examples/multi_company.env.example +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/examples/multi_company.yaml +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/examples/simple-single-repo.yaml +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/__main__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/_http_retry.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/_registry.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/agent/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/agent/_enums.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/agent/_llm.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/agent/_llms/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/agent/_llms/anthropic_llm.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/agent/_llms/bedrock.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/agent/_llms/gemini.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/agent/_llms/openai_llm.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/agent/runner.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/agent/tools.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/auth/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/auth/_acquirer.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/auth/_acquirers/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/auth/_acquirers/aws_sso.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/auth/_acquirers/aws_static.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/auth/_acquirers/bitbucket.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/auth/_acquirers/fireflies.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/auth/_acquirers/github_device.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/auth/_acquirers/github_pat.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/auth/_acquirers/jira_session.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/auth/_acquirers/jira_token.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/auth/_acquirers/linear.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/auth/_prompt.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/cli.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/commands/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/commands/_enums.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/commands/agent.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/commands/auth.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/commands/base.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/commands/context.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/commands/dashboard.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/commands/iac.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/commands/journal.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/commands/plan.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/commands/runbook.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/commands/secrets.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/commands/telemetry.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/commands/version.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/credentials/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/credentials/_aws.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/credentials/_bootstrap.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/credentials/_bootstraps/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/credentials/_bootstraps/envfile.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/credentials/_paths.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/credentials/_store.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/credentials/aws_secrets.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/credentials/envfile.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/credentials/ssm.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/credentials/vault.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/dashboard/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/dashboard/collectors.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/dashboard/server.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/dashboard/templates/_macros.html +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/dashboard/templates/index.html +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/decorators.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/env_vars.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/error_policy.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/errors.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_cloud.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_clouds/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_clouds/aws.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_clouds/azure.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_clouds/gcp.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_gh.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_meeting.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_meetings/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_meetings/fireflies.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_provider.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_providers/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_providers/bitbucket.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_providers/github.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_time_util.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_tracker.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_trackers/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_trackers/_jira_auth.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_trackers/bitbucket.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_trackers/github_issues.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_trackers/jira.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_trackers/linear.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/_user_filter.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/active_tickets.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/active_work.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/aws_infra.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/aws_services/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/aws_services/base.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/aws_services/ecs.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/aws_services/lambda_.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/aws_services/logs.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/aws_services/rds.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/aws_services/sqs.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/aws_services/tagging.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/base.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/ci_health.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/code_hotspots.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/code_scanning.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/codebase_conventions.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/commit_message_quality.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/composer.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/defect_hotspots.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/dependency_health.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/github_deployments.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/language_detectors/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/meeting_context.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/meeting_digest.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/pr_archaeology.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/pr_hygiene.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/pr_review_context.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/release_cadence.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/repo_governance.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/revert_signals.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/review_nits.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/reviewer_profile.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/stale_prs.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/test_discipline.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/ticket_archaeology.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/ticket_context.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/extract/todo_density.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/formatting/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/formatting/base.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/formatting/csv.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/formatting/json.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/formatting/quiet.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/formatting/table.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/formatting/yaml.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/config_file.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/models.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/runbook/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/runbook/executor.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/runbook/models.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/runbook/scheduler.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/_composer.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/_knowledge.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/archetypes/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/archetypes/base.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/archetypes/engineer.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/archetypes/pr_ci_fixer.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/archetypes/pr_conflict_resolver.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/archetypes/pr_fixer.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/archetypes/triager.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/base.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/implementation.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/pr_fixes.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/rules/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/rules/ai_prefix_on_comments.md +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/rules/base.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/rules/commit_as_human.md +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/rules/minimum_correct_fix.md +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/rules/no_force_push.md +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/rules/no_new_pr_creation.md +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/rules/no_workflow_file_edits.md +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/rules/read_all_comments_first.md +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/rules/skip_approved_green_prs.md +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/shapes/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/sources/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/sources/aws.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/sources/base.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/sources/bitbucket.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/sources/github.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/sources/jira.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/sources/sentry.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/triggers/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/triggers/base.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/triggers/bitbucket_webhook.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/triggers/github_webhook.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/triggers/manual.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/iac/scaffold/triggers/schedule_cron.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/journal/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/journal/_journal.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/journal/_render.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/journal/models.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/journal/sinks/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/journal/sinks/base.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/journal/sinks/file.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/journal/store/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/journal/store/base.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/journal/store/file.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/log_context.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/logging.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/mcp/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/mcp/_errors.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/mcp/_manager.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/mcp/_tool.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/mcp/defaults.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/messaging/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/messaging/_jira_creds.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/messaging/_writer.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/messaging/bitbucket_pr_comment.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/messaging/github_pr_comment.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/messaging/jira_comment.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/messaging/jira_transition.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/messaging/slack_channel.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/messaging/telegram_chat.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/notify/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/notify/_sink.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/notify/email.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/notify/pagerduty.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/notify/slack.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/notify/telegram.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/pagination.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/plan/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/plan/_board.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/plan/_boards/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/plan/_boards/github_project.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/plan/_boards/jira_board.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/plan/_enums.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/plan/_json_utils.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/plan/_models.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/plan/_replan.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/plan/_selector.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/plan/_status.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/plan/_store.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/plan/_synthesize.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/plan/_writeback.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/storage/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/storage/_models.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/storage/base.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/storage/file.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/storage/postgres.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/telemetry/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/telemetry/_config.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/telemetry/_scrubber.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/telemetry/_sinks/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/telemetry/_sinks/base.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/telemetry/_sinks/file.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/telemetry/_sinks/noop.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/src/briar/telemetry/_sinks/sentry.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/conftest.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/conftest.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/mcp_echo_server.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_acquirer_real.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_agent_loop_real.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_auth_login_real.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_cli_extract_real.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_cli_smoke_subprocess.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_extract_aws_real.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_extract_github_real.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_extract_jira_real.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_llm_real.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_local_commands_real.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_mcp_live_real.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_messaging_bitbucket_real.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_messaging_github_inline_real.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_messaging_jira_real.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_messaging_real.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_notify_real.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_plan_llm_real.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_registry_contract.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/integration/test_tracker_real.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/test_abstractions.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/test_dashboard.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/test_extract.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/test_extract_meetings.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/test_formatting.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/test_journal.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/test_knowledge_splicer.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/test_log_context.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/test_plan.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/test_plan_run.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/test_rules_registry.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/test_scaffold.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/test_scheduler.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/test_smart_scheduler.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/test_user_filter.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/agent/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/agent/conftest.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/agent/test_anthropic_llm.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/agent/test_bedrock_llm.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/agent/test_gemini_llm.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/agent/test_llm_registry.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/agent/test_openai_llm.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/agent/test_runner_loop.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/agent/test_runner_mcp.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/agent/test_tools.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/auth/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/auth/test_aws_sso.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/auth/test_aws_static.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/auth/test_github_device.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/auth/test_jira_session.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/auth/test_prompt.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_agent_cmd.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_agent_mcp_defaults.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_agent_params.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_auth.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_auth_cmd.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_auth_params.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_cli.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_cmd_creds.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_context.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_context_params.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_dashboard_cmd.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_dashboard_params.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_extract.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_extract_params.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_journal.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_journal_params.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_plan_cmd.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_plan_params.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_plan_run_params.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_runbook.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_runbook_params.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_scaffold.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_scaffold_implementation_params.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_scaffold_pr_fixes_params.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_secrets.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_secrets_params.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_telemetry_cmd.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/commands/test_telemetry_params.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/credentials/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/credentials/test_envfile.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/dashboard/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/dashboard/test_log_collectors.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/dashboard/test_server.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/dashboard/test_server_render.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_active_work.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_aws_infra.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_aws_services.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_ci_health.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_cloud_aws.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_cloud_azure.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_cloud_gcp.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_cloud_registry.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_code_hotspots.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_code_scanning.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_commit_message_quality.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_composer_inventory.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_defect_hotspots.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_dependency_health.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_gh_facade.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_github_deployments.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_meeting_context_gaps.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_pr_archaeology_gaps.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_pr_hygiene.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_provider_bitbucket.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_provider_github.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_release_cadence.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_repo_governance.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_revert_signals.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_review_nits.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_reviewer_profile.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_stale_prs.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_test_discipline.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_ticket_archaeology.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_ticket_context.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_todo_density.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_tracker_bitbucket.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_tracker_github_issues.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_tracker_jira.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_tracker_linear.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/extract/test_user_filter_branches.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/iac/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/iac/test_every_parser.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/iac/test_mcp_schema.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/iac/test_runbook_executor.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/iac/test_runbook_scheduler.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/journal/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/journal/test_facade.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/mcp/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/mcp/test_mcp_aws_env_bridge.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/mcp/test_mcp_tool.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/messaging/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/messaging/test_bitbucket_pr_comment.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/messaging/test_github_pr_comment.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/messaging/test_jira_comment.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/messaging/test_jira_transition.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/messaging/test_slack_channel.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/messaging/test_telegram_chat.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/messaging/test_writer_helpers.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/notify/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/notify/test_email.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/notify/test_pagerduty.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/notify/test_slack_and_telegram.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/plan/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/plan/test_board_github_project.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/plan/test_board_jira.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/plan/test_board_registry.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/plan/test_models.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/plan/test_plan_helpers_edges.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/plan/test_selector_branches.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/plan/test_status.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/plan/test_writeback_branches.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/storage/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/storage/test_backends.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/telemetry/__init__.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/telemetry/test_command_span.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/telemetry/test_config.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/telemetry/test_scrubber.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/test_decorators.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/test_env_vars.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/test_error_policy.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/test_errors.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/test_file_tool_sandbox.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/test_formatting.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/test_http_retry.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/test_log_context.py +0 -0
- {briar_cli-1.1.43 → briar_cli-1.1.45}/tests/unit/test_pagination.py +0 -0
- {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.
|
|
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,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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|