beakr-cli 0.3.2__tar.gz → 0.4.0__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 (506) hide show
  1. {beakr_cli-0.3.2 → beakr_cli-0.4.0}/.claude/commands/kb-audit.md +1 -1
  2. {beakr_cli-0.3.2 → beakr_cli-0.4.0}/.claude/commands/kb-write.md +4 -3
  3. beakr_cli-0.4.0/.claude/skills/beakr/SKILL.md +188 -0
  4. {beakr_cli-0.3.2 → beakr_cli-0.4.0}/.claude/skills/beakr/examples/answer-org-question.md +1 -1
  5. {beakr_cli-0.3.2 → beakr_cli-0.4.0}/.claude/skills/beakr/examples/write-decision-page.md +7 -14
  6. {beakr_cli-0.3.2 → beakr_cli-0.4.0}/.claude/skills/beakr/reference/auditing.md +2 -2
  7. {beakr_cli-0.3.2 → beakr_cli-0.4.0}/.claude/skills/beakr/reference/provenance.md +1 -1
  8. beakr_cli-0.4.0/.claude/skills/beakr/reference/research-workflow.md +64 -0
  9. beakr_cli-0.4.0/.claude/skills/beakr/reference/writing-pages.md +168 -0
  10. beakr_cli-0.4.0/.github/workflows/ci.yml +93 -0
  11. beakr_cli-0.4.0/.github/workflows/publish.yml +55 -0
  12. beakr_cli-0.4.0/CHANGELOG.md +1939 -0
  13. beakr_cli-0.4.0/LICENSE +201 -0
  14. beakr_cli-0.4.0/PKG-INFO +899 -0
  15. beakr_cli-0.4.0/README.md +862 -0
  16. beakr_cli-0.4.0/benchmarks/README.md +264 -0
  17. beakr_cli-0.4.0/benchmarks/beakr_bench/__init__.py +23 -0
  18. beakr_cli-0.4.0/benchmarks/beakr_bench/__main__.py +3 -0
  19. beakr_cli-0.4.0/benchmarks/beakr_bench/cases.py +149 -0
  20. beakr_cli-0.4.0/benchmarks/beakr_bench/cli.py +84 -0
  21. beakr_cli-0.4.0/benchmarks/beakr_bench/data/agent_onboarding.json +234 -0
  22. beakr_cli-0.4.0/benchmarks/beakr_bench/data/agent_onboarding_v2.json +139 -0
  23. beakr_cli-0.4.0/benchmarks/beakr_bench/data/compounding.json +64 -0
  24. beakr_cli-0.4.0/benchmarks/beakr_bench/data/corrections.json +45 -0
  25. beakr_cli-0.4.0/benchmarks/beakr_bench/data/cross_agent_handoff.json +199 -0
  26. beakr_cli-0.4.0/benchmarks/beakr_bench/data/false_completeness.json +45 -0
  27. beakr_cli-0.4.0/benchmarks/beakr_bench/dryrun.py +240 -0
  28. beakr_cli-0.4.0/benchmarks/beakr_bench/extract.py +105 -0
  29. beakr_cli-0.4.0/benchmarks/beakr_bench/judge.py +49 -0
  30. beakr_cli-0.4.0/benchmarks/beakr_bench/live_handoff.py +387 -0
  31. beakr_cli-0.4.0/benchmarks/beakr_bench/onboarding/__init__.py +39 -0
  32. beakr_cli-0.4.0/benchmarks/beakr_bench/onboarding/__main__.py +3 -0
  33. beakr_cli-0.4.0/benchmarks/beakr_bench/onboarding/agents.py +400 -0
  34. beakr_cli-0.4.0/benchmarks/beakr_bench/onboarding/cases.py +85 -0
  35. beakr_cli-0.4.0/benchmarks/beakr_bench/onboarding/cli.py +164 -0
  36. beakr_cli-0.4.0/benchmarks/beakr_bench/onboarding/cli_agents.py +372 -0
  37. beakr_cli-0.4.0/benchmarks/beakr_bench/onboarding/evidence.py +122 -0
  38. beakr_cli-0.4.0/benchmarks/beakr_bench/onboarding/harness.py +147 -0
  39. beakr_cli-0.4.0/benchmarks/beakr_bench/onboarding/report.py +172 -0
  40. beakr_cli-0.4.0/benchmarks/beakr_bench/report.py +125 -0
  41. beakr_cli-0.4.0/benchmarks/beakr_bench/rescore.py +242 -0
  42. beakr_cli-0.4.0/benchmarks/beakr_bench/runner.py +247 -0
  43. beakr_cli-0.4.0/benchmarks/beakr_bench/scoring.py +365 -0
  44. beakr_cli-0.4.0/benchmarks/run.py +13 -0
  45. beakr_cli-0.4.0/benchmarks/run_live_handoff.py +17 -0
  46. beakr_cli-0.4.0/benchmarks/run_onboarding.py +16 -0
  47. {beakr_cli-0.3.2 → beakr_cli-0.4.0}/install.sh +29 -19
  48. {beakr_cli-0.3.2 → beakr_cli-0.4.0}/pyproject.toml +39 -5
  49. beakr_cli-0.4.0/release/config.json +10 -0
  50. beakr_cli-0.4.0/release/released.json +4 -0
  51. beakr_cli-0.4.0/scripts/contract_compat.py +355 -0
  52. beakr_cli-0.4.0/scripts/generate_private_api.py +204 -0
  53. beakr_cli-0.4.0/scripts/prepare_release.py +554 -0
  54. beakr_cli-0.4.0/scripts/refresh_snapshots.py +387 -0
  55. beakr_cli-0.4.0/scripts/regen.sh +31 -0
  56. beakr_cli-0.4.0/scripts/sync_operations.py +61 -0
  57. beakr_cli-0.4.0/scripts/sync_tool_surface.py +52 -0
  58. {beakr_cli-0.3.2 → beakr_cli-0.4.0}/src/beakr_cli/__init__.py +1 -1
  59. beakr_cli-0.4.0/src/beakr_cli/_private_api/__init__.py +43 -0
  60. beakr_cli-0.4.0/src/beakr_cli/_private_api/_generated/__init__.py +8 -0
  61. beakr_cli-0.4.0/src/beakr_cli/_private_api/_generated/models.py +1796 -0
  62. beakr_cli-0.4.0/src/beakr_cli/_private_api/_generated/operations.py +2257 -0
  63. beakr_cli-0.4.0/src/beakr_cli/_private_api/client.py +90 -0
  64. beakr_cli-0.4.0/src/beakr_cli/_private_api/oauth.py +281 -0
  65. beakr_cli-0.4.0/src/beakr_cli/_private_api/operations.allowlist +95 -0
  66. beakr_cli-0.4.0/src/beakr_cli/_private_api/resources/__init__.py +52 -0
  67. beakr_cli-0.4.0/src/beakr_cli/_private_api/resources/auth.py +307 -0
  68. beakr_cli-0.4.0/src/beakr_cli/_private_api/resources/conversations.py +38 -0
  69. beakr_cli-0.4.0/src/beakr_cli/_private_api/resources/files.py +23 -0
  70. beakr_cli-0.4.0/src/beakr_cli/_private_api/resources/integrations.py +46 -0
  71. beakr_cli-0.4.0/src/beakr_cli/_private_api/resources/interviews.py +94 -0
  72. beakr_cli-0.4.0/src/beakr_cli/_private_api/resources/invitations.py +41 -0
  73. beakr_cli-0.4.0/src/beakr_cli/_private_api/resources/knowledge.py +133 -0
  74. beakr_cli-0.4.0/src/beakr_cli/_private_api/resources/memories.py +23 -0
  75. beakr_cli-0.4.0/src/beakr_cli/_private_api/resources/org_admin.py +133 -0
  76. beakr_cli-0.4.0/src/beakr_cli/_private_api/resources/outputs.py +85 -0
  77. beakr_cli-0.4.0/src/beakr_cli/_private_api/resources/profile.py +101 -0
  78. beakr_cli-0.4.0/src/beakr_cli/_private_api/resources/usage.py +78 -0
  79. beakr_cli-0.4.0/src/beakr_cli/_private_api/resources/workflows.py +170 -0
  80. beakr_cli-0.4.0/src/beakr_cli/agent_hooks.py +275 -0
  81. beakr_cli-0.4.0/src/beakr_cli/api_manifest.py +224 -0
  82. beakr_cli-0.4.0/src/beakr_cli/app_url.py +93 -0
  83. beakr_cli-0.4.0/src/beakr_cli/auth_status.py +48 -0
  84. beakr_cli-0.4.0/src/beakr_cli/capabilities.py +230 -0
  85. beakr_cli-0.4.0/src/beakr_cli/chatgpt_export.py +182 -0
  86. {beakr_cli-0.3.2 → beakr_cli-0.4.0}/src/beakr_cli/citations.py +62 -2
  87. beakr_cli-0.4.0/src/beakr_cli/cited_answer.py +202 -0
  88. beakr_cli-0.4.0/src/beakr_cli/codex_context.py +205 -0
  89. beakr_cli-0.4.0/src/beakr_cli/command_surface.py +223 -0
  90. beakr_cli-0.4.0/src/beakr_cli/commands/activity.py +121 -0
  91. beakr_cli-0.4.0/src/beakr_cli/commands/api.py +509 -0
  92. beakr_cli-0.4.0/src/beakr_cli/commands/auth.py +628 -0
  93. beakr_cli-0.4.0/src/beakr_cli/commands/auth_token.py +141 -0
  94. beakr_cli-0.4.0/src/beakr_cli/commands/codex_wrapper.py +131 -0
  95. beakr_cli-0.4.0/src/beakr_cli/commands/conversations.py +622 -0
  96. beakr_cli-0.4.0/src/beakr_cli/commands/doctor.py +272 -0
  97. beakr_cli-0.4.0/src/beakr_cli/commands/documents.py +92 -0
  98. beakr_cli-0.4.0/src/beakr_cli/commands/end_user_tokens.py +131 -0
  99. beakr_cli-0.4.0/src/beakr_cli/commands/external_users.py +206 -0
  100. beakr_cli-0.4.0/src/beakr_cli/commands/files.py +583 -0
  101. beakr_cli-0.4.0/src/beakr_cli/commands/hooks.py +297 -0
  102. {beakr_cli-0.3.2 → beakr_cli-0.4.0}/src/beakr_cli/commands/install.py +342 -84
  103. beakr_cli-0.4.0/src/beakr_cli/commands/integrations.py +362 -0
  104. beakr_cli-0.4.0/src/beakr_cli/commands/interview_links.py +272 -0
  105. beakr_cli-0.4.0/src/beakr_cli/commands/interviews.py +352 -0
  106. beakr_cli-0.4.0/src/beakr_cli/commands/jobs.py +156 -0
  107. beakr_cli-0.4.0/src/beakr_cli/commands/kb.py +1584 -0
  108. beakr_cli-0.4.0/src/beakr_cli/commands/kb_agent_review.py +245 -0
  109. beakr_cli-0.4.0/src/beakr_cli/commands/kb_cards.py +502 -0
  110. beakr_cli-0.4.0/src/beakr_cli/commands/kb_entities.py +187 -0
  111. beakr_cli-0.4.0/src/beakr_cli/commands/keys.py +255 -0
  112. beakr_cli-0.4.0/src/beakr_cli/commands/labels.py +317 -0
  113. beakr_cli-0.4.0/src/beakr_cli/commands/members.py +170 -0
  114. beakr_cli-0.4.0/src/beakr_cli/commands/memory.py +420 -0
  115. beakr_cli-0.4.0/src/beakr_cli/commands/memory_store.py +70 -0
  116. beakr_cli-0.4.0/src/beakr_cli/commands/model_refusals.py +92 -0
  117. beakr_cli-0.4.0/src/beakr_cli/commands/org.py +415 -0
  118. beakr_cli-0.4.0/src/beakr_cli/commands/outputs.py +203 -0
  119. beakr_cli-0.4.0/src/beakr_cli/commands/profile.py +335 -0
  120. beakr_cli-0.4.0/src/beakr_cli/commands/project_knowledge.py +263 -0
  121. beakr_cli-0.4.0/src/beakr_cli/commands/project_members.py +228 -0
  122. beakr_cli-0.4.0/src/beakr_cli/commands/project_profile.py +293 -0
  123. beakr_cli-0.4.0/src/beakr_cli/commands/projects.py +291 -0
  124. beakr_cli-0.4.0/src/beakr_cli/commands/runs.py +291 -0
  125. beakr_cli-0.4.0/src/beakr_cli/commands/skills.py +406 -0
  126. beakr_cli-0.4.0/src/beakr_cli/commands/usage.py +304 -0
  127. beakr_cli-0.4.0/src/beakr_cli/commands/workflows.py +305 -0
  128. {beakr_cli-0.3.2 → beakr_cli-0.4.0}/src/beakr_cli/commands/workspace.py +26 -40
  129. beakr_cli-0.4.0/src/beakr_cli/compact.py +334 -0
  130. beakr_cli-0.4.0/src/beakr_cli/compounding.py +786 -0
  131. beakr_cli-0.4.0/src/beakr_cli/config.py +119 -0
  132. beakr_cli-0.4.0/src/beakr_cli/data/agent_tool_surface.json +241 -0
  133. beakr_cli-0.4.0/src/beakr_cli/data/operations.json +6539 -0
  134. beakr_cli-0.4.0/src/beakr_cli/document_listing.py +109 -0
  135. beakr_cli-0.4.0/src/beakr_cli/errors.py +342 -0
  136. beakr_cli-0.4.0/src/beakr_cli/hook_queue.py +117 -0
  137. beakr_cli-0.4.0/src/beakr_cli/hook_runtime.py +69 -0
  138. beakr_cli-0.4.0/src/beakr_cli/main.py +503 -0
  139. beakr_cli-0.4.0/src/beakr_cli/mcp_call_shaping.py +174 -0
  140. beakr_cli-0.4.0/src/beakr_cli/mcp_errors.py +145 -0
  141. beakr_cli-0.4.0/src/beakr_cli/mcp_integration_results.py +304 -0
  142. beakr_cli-0.4.0/src/beakr_cli/mcp_knowledge_status.py +48 -0
  143. beakr_cli-0.4.0/src/beakr_cli/mcp_render.py +283 -0
  144. beakr_cli-0.4.0/src/beakr_cli/mcp_result.py +290 -0
  145. beakr_cli-0.4.0/src/beakr_cli/mcp_server.py +1189 -0
  146. beakr_cli-0.4.0/src/beakr_cli/mcp_tools_platform.py +932 -0
  147. beakr_cli-0.4.0/src/beakr_cli/output.py +261 -0
  148. beakr_cli-0.4.0/src/beakr_cli/project_binding.py +240 -0
  149. beakr_cli-0.4.0/src/beakr_cli/project_ref.py +104 -0
  150. beakr_cli-0.4.0/src/beakr_cli/prompts.py +91 -0
  151. beakr_cli-0.4.0/src/beakr_cli/proposal_accept.py +106 -0
  152. beakr_cli-0.4.0/src/beakr_cli/proposal_view.py +138 -0
  153. beakr_cli-0.4.0/src/beakr_cli/research_metadata.py +94 -0
  154. beakr_cli-0.4.0/src/beakr_cli/scope.py +55 -0
  155. beakr_cli-0.4.0/src/beakr_cli/sdk.py +137 -0
  156. beakr_cli-0.4.0/src/beakr_cli/skills_sync.py +525 -0
  157. beakr_cli-0.4.0/src/beakr_cli/source_listing.py +68 -0
  158. beakr_cli-0.4.0/src/beakr_cli/tool_surface.py +383 -0
  159. beakr_cli-0.4.0/src/beakr_cli/transcript_activity.py +253 -0
  160. beakr_cli-0.4.0/src/beakr_cli/transcripts.py +514 -0
  161. {beakr_cli-0.3.2 → beakr_cli-0.4.0}/src/beakr_cli/updates.py +98 -10
  162. beakr_cli-0.4.0/src/beakr_cli/wrong_api.py +87 -0
  163. beakr_cli-0.4.0/tests/_engine.py +165 -0
  164. beakr_cli-0.4.0/tests/benchmarks/conftest.py +10 -0
  165. beakr_cli-0.4.0/tests/benchmarks/fixtures/claude_code_stream.jsonl +6 -0
  166. beakr_cli-0.4.0/tests/benchmarks/fixtures/codex_exec.jsonl +8 -0
  167. beakr_cli-0.4.0/tests/benchmarks/test_cases_and_scoring.py +212 -0
  168. beakr_cli-0.4.0/tests/benchmarks/test_codex_benchmark_scoring_review.py +107 -0
  169. beakr_cli-0.4.0/tests/benchmarks/test_codex_onboarding_review.py +21 -0
  170. beakr_cli-0.4.0/tests/benchmarks/test_live_handoff.py +181 -0
  171. beakr_cli-0.4.0/tests/benchmarks/test_onboarding.py +552 -0
  172. beakr_cli-0.4.0/tests/benchmarks/test_onboarding_evidence.py +97 -0
  173. beakr_cli-0.4.0/tests/benchmarks/test_rescore.py +191 -0
  174. beakr_cli-0.4.0/tests/benchmarks/test_runner_dry_run.py +176 -0
  175. beakr_cli-0.4.0/tests/benchmarks/test_scoring_semantics.py +69 -0
  176. beakr_cli-0.4.0/tests/benchmarks/test_scoring_typography.py +41 -0
  177. beakr_cli-0.4.0/tests/benchmarks/test_scoring_v3.py +104 -0
  178. beakr_cli-0.4.0/tests/command_snapshots/cases.py +396 -0
  179. beakr_cli-0.4.0/tests/command_snapshots/replay.py +222 -0
  180. beakr_cli-0.4.0/tests/command_snapshots/runner.py +150 -0
  181. beakr_cli-0.4.0/tests/conftest.py +179 -0
  182. beakr_cli-0.4.0/tests/fixtures/engine_merge_bridge.py +40 -0
  183. beakr_cli-0.4.0/tests/fixtures/knowledge_door_results.json +4616 -0
  184. beakr_cli-0.4.0/tests/fixtures/recorded_api/delete__v1_artifacts_artifact_id.json +6 -0
  185. beakr_cli-0.4.0/tests/fixtures/recorded_api/delete__v1_conversations_conversation_id.json +6 -0
  186. beakr_cli-0.4.0/tests/fixtures/recorded_api/delete__v1_integrations_connector_id.json +9 -0
  187. beakr_cli-0.4.0/tests/fixtures/recorded_api/delete__v1_invitations_invitation_id.json +6 -0
  188. beakr_cli-0.4.0/tests/fixtures/recorded_api/delete__v1_me_api_keys_key_id.json +6 -0
  189. beakr_cli-0.4.0/tests/fixtures/recorded_api/delete__v1_me_memories_memory_id.json +6 -0
  190. beakr_cli-0.4.0/tests/fixtures/recorded_api/delete__v1_me_profile_claims_claim_id.json +6 -0
  191. beakr_cli-0.4.0/tests/fixtures/recorded_api/delete__v1_me_skills_library_skill_id.json +6 -0
  192. beakr_cli-0.4.0/tests/fixtures/recorded_api/delete__v1_organizations_org_id_credentials_kind_credential_id.json +6 -0
  193. beakr_cli-0.4.0/tests/fixtures/recorded_api/delete__v1_organizations_org_id_members_user_id.json +6 -0
  194. beakr_cli-0.4.0/tests/fixtures/recorded_api/delete__v1_projects_project_id.json +6 -0
  195. beakr_cli-0.4.0/tests/fixtures/recorded_api/delete__v1_projects_project_id_members_principal_type_principal_id.json +6 -0
  196. beakr_cli-0.4.0/tests/fixtures/recorded_api/delete__v1_skills_skill_id.json +6 -0
  197. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_artifacts--waiting.json +110 -0
  198. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_artifacts.json +110 -0
  199. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_artifacts_artifact_id.json +55 -0
  200. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_artifacts_artifact_id_versions.json +36 -0
  201. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_artifacts_versions_version_id_download_url.json +9 -0
  202. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_changes.json +40 -0
  203. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_conversations.json +99 -0
  204. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_conversations_conversation_id.json +90 -0
  205. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_conversations_conversation_id_freshness.json +36 -0
  206. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_conversations_search.json +50 -0
  207. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_conversations_settings.json +11 -0
  208. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_integrations.json +52 -0
  209. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_integrations_connector_id_coverage.json +37 -0
  210. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_integrations_connector_id_status.json +60 -0
  211. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_integrations_hosted_connectors_connector_id_scope.json +16 -0
  212. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_interview_requests.json +72 -0
  213. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_interview_sendables.json +86 -0
  214. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_interview_sessions.json +38 -0
  215. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_interview_sessions_session_id.json +42 -0
  216. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_invitations.json +34 -0
  217. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_jobs_job_id.json +48 -0
  218. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_knowledge_agent_review.json +25 -0
  219. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_knowledge_conflicts.json +75 -0
  220. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_knowledge_profiles_org.json +55 -0
  221. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_knowledge_profiles_project_project_id.json +55 -0
  222. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_knowledge_stats.json +11 -0
  223. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_knowledge_wiki_graph.json +26 -0
  224. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_knowledge_wiki_pages.json +54 -0
  225. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_knowledge_wiki_pages_by_title.json +43 -0
  226. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_knowledge_wiki_pages_page_id_backlinks.json +22 -0
  227. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_knowledge_wiki_pages_page_id_blame.json +19 -0
  228. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_knowledge_wiki_pages_page_id_revisions.json +41 -0
  229. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_knowledge_wiki_pages_page_id_section_provenance.json +49 -0
  230. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_knowledge_wiki_pages_page_id_sources.json +42 -0
  231. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_knowledge_wiki_proposals.json +54 -0
  232. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_knowledge_wiki_proposals_proposal_id.json +33 -0
  233. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_knowledge_wiki_search.json +36 -0
  234. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_knowledge_wiki_timeline.json +34 -0
  235. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_me.json +43 -0
  236. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_me_api_keys.json +47 -0
  237. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_me_api_keys_scopes.json +114 -0
  238. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_me_memories.json +56 -0
  239. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_me_profile.json +76 -0
  240. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_me_skills_proposals.json +48 -0
  241. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_me_threads.json +160 -0
  242. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_organizations_org_id.json +18 -0
  243. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_organizations_org_id_auth_policy.json +20 -0
  244. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_organizations_org_id_credentials.json +44 -0
  245. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_organizations_org_id_members.json +32 -0
  246. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_organizations_org_id_service_accounts.json +32 -0
  247. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_outputs_output_id.json +62 -0
  248. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_outputs_output_id_export_format.json +7 -0
  249. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_outputs_output_id_revisions.json +30 -0
  250. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_projects.json +75 -0
  251. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_projects_project_id.json +38 -0
  252. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_projects_project_id_knowledge_failed_files.json +30 -0
  253. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_projects_project_id_knowledge_summary.json +39 -0
  254. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_projects_project_id_members.json +32 -0
  255. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_projects_project_id_model_refusals_files.json +22 -0
  256. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_projects_project_id_model_refusals_summary.json +32 -0
  257. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_public_openapi_json.json +60 -0
  258. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_runs_run_id.json +28 -0
  259. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_runs_run_id_events.json +7 -0
  260. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_skills.json +68 -0
  261. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_skills_skill_id.json +34 -0
  262. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_skills_skill_id_bundle.json +16 -0
  263. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_trace_kind_item_id.json +74 -0
  264. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_uploads_upload_id.json +21 -0
  265. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_usage.json +37 -0
  266. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_workflows_configs.json +130 -0
  267. beakr_cli-0.4.0/tests/fixtures/recorded_api/get__v1_workflows_configs_config_id_runs.json +58 -0
  268. beakr_cli-0.4.0/tests/fixtures/recorded_api/patch__v1_me_profile.json +42 -0
  269. beakr_cli-0.4.0/tests/fixtures/recorded_api/patch__v1_me_profile_claims_claim_id.json +38 -0
  270. beakr_cli-0.4.0/tests/fixtures/recorded_api/patch__v1_organizations_org_id_members_user_id.json +16 -0
  271. beakr_cli-0.4.0/tests/fixtures/recorded_api/patch__v1_projects_project_id.json +38 -0
  272. beakr_cli-0.4.0/tests/fixtures/recorded_api/patch__v1_workflows_configs_config_id.json +65 -0
  273. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_artifacts_artifact_id_knowledge_approve.json +56 -0
  274. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_artifacts_download_url.json +19 -0
  275. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_compound.json +11 -0
  276. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_compound_cancel.json +11 -0
  277. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_context.json +19 -0
  278. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_conversations_import.json +16 -0
  279. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_integrations_connector_id_sync.json +26 -0
  280. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_integrations_provider_connect.json +12 -0
  281. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_interview_sendables.json +9 -0
  282. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_interview_sendables_maker.json +19 -0
  283. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_interview_sendables_sendable_id_links.json +12 -0
  284. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_invitations.json +18 -0
  285. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_knowledge_documents.json +46 -0
  286. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_knowledge_profiles.json +55 -0
  287. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_knowledge_research.json +42 -0
  288. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_knowledge_runs_run_undo.json +43 -0
  289. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_knowledge_wiki_command--cat.json +235 -0
  290. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_knowledge_wiki_command--cat_rev.json +53 -0
  291. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_knowledge_wiki_command.json +53 -0
  292. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_knowledge_wiki_proposals.json +31 -0
  293. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_knowledge_wiki_proposals_proposal_id_accept.json +17 -0
  294. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_knowledge_wiki_proposals_proposal_id_dismiss.json +10 -0
  295. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_knowledge_wiki_write--add_connection.json +22 -0
  296. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_knowledge_wiki_write--add_finding.json +22 -0
  297. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_knowledge_wiki_write--edit_rows.json +22 -0
  298. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_knowledge_wiki_write.json +22 -0
  299. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_me_skills_library_skill_id.json +10 -0
  300. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_me_skills_proposals_proposal_id_accept.json +31 -0
  301. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_me_skills_proposals_proposal_id_dismiss.json +10 -0
  302. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_organizations_org_id_service_accounts.json +13 -0
  303. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_organizations_org_id_service_accounts_account_id_disable.json +10 -0
  304. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_organizations_org_id_service_accounts_account_id_keys.json +22 -0
  305. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_projects.json +38 -0
  306. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_projects_project_id_invite.json +14 -0
  307. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_projects_project_id_knowledge_retry_failed.json +26 -0
  308. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_projects_project_id_members.json +16 -0
  309. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_runs.json +31 -0
  310. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_runs_run_id_cancel.json +6 -0
  311. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_skills.json +31 -0
  312. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_uploads.json +21 -0
  313. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_uploads_upload_id_complete.json +39 -0
  314. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_uploads_upload_id_parts.json +16 -0
  315. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_workflows_ai_generate.json +29 -0
  316. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_workflows_configs.json +65 -0
  317. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_workflows_configs_config_id_run.json +29 -0
  318. beakr_cli-0.4.0/tests/fixtures/recorded_api/post__v1_workflows_schedule_preview.json +16 -0
  319. beakr_cli-0.4.0/tests/fixtures/recorded_api/put__v1_knowledge_agent_review.json +21 -0
  320. beakr_cli-0.4.0/tests/fixtures/recorded_api/put__v1_knowledge_agent_review_projects_project_id.json +25 -0
  321. beakr_cli-0.4.0/tests/fixtures/recorded_api/put__v1_organizations_org_id_auth_policy.json +22 -0
  322. beakr_cli-0.4.0/tests/fixtures/recorded_api/put__v1_skills_skill_id_bundle.json +16 -0
  323. beakr_cli-0.4.0/tests/fixtures/transcripts/chatgpt_export/conversations.json +262 -0
  324. beakr_cli-0.4.0/tests/fixtures/transcripts/claude_code_beakr_reads.jsonl +6 -0
  325. beakr_cli-0.4.0/tests/fixtures/transcripts/claude_code_session.jsonl +10 -0
  326. beakr_cli-0.4.0/tests/fixtures/transcripts/codex_beakr_reads.jsonl +10 -0
  327. beakr_cli-0.4.0/tests/fixtures/transcripts/codex_legacy.jsonl +3 -0
  328. beakr_cli-0.4.0/tests/fixtures/transcripts/codex_rollout.jsonl +7 -0
  329. beakr_cli-0.4.0/tests/hook_keys.py +19 -0
  330. beakr_cli-0.4.0/tests/oauth_fake.py +209 -0
  331. beakr_cli-0.4.0/tests/sdk/__init__.py +0 -0
  332. beakr_cli-0.4.0/tests/sdk/conftest.py +65 -0
  333. beakr_cli-0.4.0/tests/sdk/test_dev_identity_origin_binding.py +181 -0
  334. beakr_cli-0.4.0/tests/sdk/test_private_binary_responses.py +11 -0
  335. beakr_cli-0.4.0/tests/sdk/test_private_conversation_search.py +48 -0
  336. beakr_cli-0.4.0/tests/sdk/test_private_integrations_usage_trace.py +101 -0
  337. beakr_cli-0.4.0/tests/sdk/test_private_oauth_login.py +204 -0
  338. beakr_cli-0.4.0/tests/sdk/test_private_org_auth_policy.py +54 -0
  339. beakr_cli-0.4.0/tests/sdk/test_private_parity_methods.py +120 -0
  340. beakr_cli-0.4.0/tests/sdk/test_private_resources.py +114 -0
  341. beakr_cli-0.4.0/tests/sdk/test_private_transport.py +17 -0
  342. beakr_cli-0.4.0/tests/sdk/test_token_store_origin_barrier.py +179 -0
  343. beakr_cli-0.4.0/tests/test_api_usage_errors_exit_cleanly.py +58 -0
  344. beakr_cli-0.4.0/tests/test_auth_cli.py +63 -0
  345. {beakr_cli-0.3.2 → beakr_cli-0.4.0}/tests/test_bundled_assets_vocabulary.py +4 -2
  346. beakr_cli-0.4.0/tests/test_chatgpt_export.py +120 -0
  347. {beakr_cli-0.3.2 → beakr_cli-0.4.0}/tests/test_citations.py +1 -3
  348. beakr_cli-0.4.0/tests/test_cli_agent_friction.py +337 -0
  349. beakr_cli-0.4.0/tests/test_cli_agent_review.py +221 -0
  350. beakr_cli-0.4.0/tests/test_cli_api_commands.py +552 -0
  351. beakr_cli-0.4.0/tests/test_cli_auth_login.py +363 -0
  352. beakr_cli-0.4.0/tests/test_cli_auth_token.py +254 -0
  353. beakr_cli-0.4.0/tests/test_cli_command_grammar.py +134 -0
  354. beakr_cli-0.4.0/tests/test_cli_contract_shaped_renderers.py +202 -0
  355. beakr_cli-0.4.0/tests/test_cli_conversation_full_text.py +110 -0
  356. beakr_cli-0.4.0/tests/test_cli_conversation_search.py +136 -0
  357. beakr_cli-0.4.0/tests/test_cli_core_surface.py +449 -0
  358. beakr_cli-0.4.0/tests/test_cli_doctor.py +112 -0
  359. beakr_cli-0.4.0/tests/test_cli_drafting.py +79 -0
  360. beakr_cli-0.4.0/tests/test_cli_e2e_followups.py +182 -0
  361. beakr_cli-0.4.0/tests/test_cli_external_users_by_user_id.py +80 -0
  362. beakr_cli-0.4.0/tests/test_cli_files.py +299 -0
  363. beakr_cli-0.4.0/tests/test_cli_hooks.py +182 -0
  364. beakr_cli-0.4.0/tests/test_cli_integrations_usage_trace.py +244 -0
  365. beakr_cli-0.4.0/tests/test_cli_json_everywhere.py +160 -0
  366. beakr_cli-0.4.0/tests/test_cli_kb_cards.py +619 -0
  367. beakr_cli-0.4.0/tests/test_cli_kb_ls_unscoped.py +39 -0
  368. beakr_cli-0.4.0/tests/test_cli_kb_propose_accept.py +107 -0
  369. beakr_cli-0.4.0/tests/test_cli_kb_read_and_proposals.py +680 -0
  370. beakr_cli-0.4.0/tests/test_cli_kb_search_notes.py +115 -0
  371. beakr_cli-0.4.0/tests/test_cli_key_lifetime_and_service_file.py +133 -0
  372. beakr_cli-0.4.0/tests/test_cli_keys_projects_members.py +420 -0
  373. beakr_cli-0.4.0/tests/test_cli_list_envelopes.py +117 -0
  374. beakr_cli-0.4.0/tests/test_cli_members_rm_reports_truthfully.py +208 -0
  375. beakr_cli-0.4.0/tests/test_cli_memory.py +619 -0
  376. beakr_cli-0.4.0/tests/test_cli_model_refusals.py +64 -0
  377. beakr_cli-0.4.0/tests/test_cli_not_provided.py +289 -0
  378. beakr_cli-0.4.0/tests/test_cli_org_admin.py +189 -0
  379. beakr_cli-0.4.0/tests/test_cli_output_and_exit_contract.py +330 -0
  380. beakr_cli-0.4.0/tests/test_cli_person_review.py +304 -0
  381. beakr_cli-0.4.0/tests/test_cli_platform_followups.py +254 -0
  382. beakr_cli-0.4.0/tests/test_cli_platform_parity.py +510 -0
  383. beakr_cli-0.4.0/tests/test_cli_profile.py +240 -0
  384. beakr_cli-0.4.0/tests/test_cli_project_knowledge.py +281 -0
  385. beakr_cli-0.4.0/tests/test_cli_project_profile.py +172 -0
  386. beakr_cli-0.4.0/tests/test_cli_prompt_guard.py +200 -0
  387. beakr_cli-0.4.0/tests/test_cli_proof_run_friction.py +139 -0
  388. beakr_cli-0.4.0/tests/test_cli_runs_workflows_outputs.py +610 -0
  389. beakr_cli-0.4.0/tests/test_cli_sdk_client.py +144 -0
  390. beakr_cli-0.4.0/tests/test_cli_secret_storage.py +81 -0
  391. beakr_cli-0.4.0/tests/test_cli_skills_ls.py +149 -0
  392. beakr_cli-0.4.0/tests/test_cli_swarm018.py +628 -0
  393. beakr_cli-0.4.0/tests/test_cli_trace_row.py +106 -0
  394. beakr_cli-0.4.0/tests/test_cli_uses_only_the_sdk.py +66 -0
  395. beakr_cli-0.4.0/tests/test_codex_capture_notice.py +186 -0
  396. beakr_cli-0.4.0/tests/test_codex_capture_notice_review.py +32 -0
  397. beakr_cli-0.4.0/tests/test_codex_cli_anonymous_review.py +21 -0
  398. beakr_cli-0.4.0/tests/test_codex_cli_ask_review.py +62 -0
  399. beakr_cli-0.4.0/tests/test_codex_cli_body_boolean_review.py +89 -0
  400. beakr_cli-0.4.0/tests/test_codex_cli_page_rendering_review.py +48 -0
  401. beakr_cli-0.4.0/tests/test_codex_compound_text_policy_review.py +75 -0
  402. beakr_cli-0.4.0/tests/test_codex_hook_project_consent_review.py +64 -0
  403. beakr_cli-0.4.0/tests/test_codex_imported_system_evidence_review.py +41 -0
  404. beakr_cli-0.4.0/tests/test_codex_mcp_project_pagination_review.py +62 -0
  405. beakr_cli-0.4.0/tests/test_codex_named_cli_acceptance.py +48 -0
  406. beakr_cli-0.4.0/tests/test_codex_overlay_path_review.py +67 -0
  407. beakr_cli-0.4.0/tests/test_codex_queued_capture_binding_review.py +48 -0
  408. beakr_cli-0.4.0/tests/test_codex_skill_inner_symlink_review.py +45 -0
  409. beakr_cli-0.4.0/tests/test_codex_trace_scopes_review.py +41 -0
  410. beakr_cli-0.4.0/tests/test_codex_wrapper_and_uninstall.py +144 -0
  411. beakr_cli-0.4.0/tests/test_command_snapshots.py +193 -0
  412. beakr_cli-0.4.0/tests/test_compact_lists_of_objects.py +68 -0
  413. beakr_cli-0.4.0/tests/test_compound_text_hold.py +136 -0
  414. beakr_cli-0.4.0/tests/test_config_permissions.py +95 -0
  415. beakr_cli-0.4.0/tests/test_conversation_base_index.py +176 -0
  416. beakr_cli-0.4.0/tests/test_document_listing_matches_engine.py +11 -0
  417. beakr_cli-0.4.0/tests/test_documents_mcp.py +55 -0
  418. beakr_cli-0.4.0/tests/test_engine_checkout_lookup.py +71 -0
  419. beakr_cli-0.4.0/tests/test_hook_capture_consent.py +202 -0
  420. beakr_cli-0.4.0/tests/test_hook_effective_org.py +151 -0
  421. beakr_cli-0.4.0/tests/test_hook_engine_reconciliation.py +146 -0
  422. beakr_cli-0.4.0/tests/test_hook_rewrites_and_identity.py +221 -0
  423. beakr_cli-0.4.0/tests/test_hook_run_pinned_org.py +136 -0
  424. beakr_cli-0.4.0/tests/test_import_payload_authorship.py +136 -0
  425. beakr_cli-0.4.0/tests/test_install_script.py +99 -0
  426. beakr_cli-0.4.0/tests/test_license_declarations.py +28 -0
  427. beakr_cli-0.4.0/tests/test_mcp_accept_reviewed.py +143 -0
  428. beakr_cli-0.4.0/tests/test_mcp_agent_attribution.py +80 -0
  429. beakr_cli-0.4.0/tests/test_mcp_call_shaping.py +296 -0
  430. beakr_cli-0.4.0/tests/test_mcp_cap_does_not_trust_upstream_flags.py +35 -0
  431. beakr_cli-0.4.0/tests/test_mcp_coverage_has_more.py +41 -0
  432. beakr_cli-0.4.0/tests/test_mcp_coverage_text.py +29 -0
  433. beakr_cli-0.4.0/tests/test_mcp_cut_hints_name_real_commands.py +55 -0
  434. beakr_cli-0.4.0/tests/test_mcp_discovery.py +338 -0
  435. beakr_cli-0.4.0/tests/test_mcp_document_listing_window.py +181 -0
  436. beakr_cli-0.4.0/tests/test_mcp_envelope_parity.py +270 -0
  437. beakr_cli-0.4.0/tests/test_mcp_integration_results_match_engine.py +29 -0
  438. beakr_cli-0.4.0/tests/test_mcp_integrations.py +212 -0
  439. beakr_cli-0.4.0/tests/test_mcp_knowledge_door_parity.py +116 -0
  440. beakr_cli-0.4.0/tests/test_mcp_knowledge_status_matches_engine.py +28 -0
  441. beakr_cli-0.4.0/tests/test_mcp_organization_line.py +69 -0
  442. beakr_cli-0.4.0/tests/test_mcp_platform_tools.py +354 -0
  443. beakr_cli-0.4.0/tests/test_mcp_project_restricted_credential.py +124 -0
  444. beakr_cli-0.4.0/tests/test_mcp_project_scope_refused.py +176 -0
  445. beakr_cli-0.4.0/tests/test_mcp_read_file.py +230 -0
  446. beakr_cli-0.4.0/tests/test_mcp_render.py +107 -0
  447. beakr_cli-0.4.0/tests/test_mcp_result_matches_engine.py +29 -0
  448. {beakr_cli-0.3.2 → beakr_cli-0.4.0}/tests/test_mcp_shared_vocabulary.py +21 -0
  449. {beakr_cli-0.3.2 → beakr_cli-0.4.0}/tests/test_mcp_source_rendering.py +5 -4
  450. beakr_cli-0.4.0/tests/test_mcp_tool_errors.py +115 -0
  451. {beakr_cli-0.3.2 → beakr_cli-0.4.0}/tests/test_packaging.py +13 -0
  452. beakr_cli-0.4.0/tests/test_personal_skill_sync_revision.py +97 -0
  453. beakr_cli-0.4.0/tests/test_pinned_project_schema.py +67 -0
  454. beakr_cli-0.4.0/tests/test_private_api_allowlist.py +275 -0
  455. beakr_cli-0.4.0/tests/test_private_api_coverage.py +180 -0
  456. beakr_cli-0.4.0/tests/test_project_binding_org.py +64 -0
  457. beakr_cli-0.4.0/tests/test_proposal_filed_by.py +144 -0
  458. beakr_cli-0.4.0/tests/test_queued_capture_binding.py +114 -0
  459. beakr_cli-0.4.0/tests/test_recipe_investor_update_skill.py +111 -0
  460. beakr_cli-0.4.0/tests/test_release_prep.py +383 -0
  461. beakr_cli-0.4.0/tests/test_research_hides_model_names.py +88 -0
  462. beakr_cli-0.4.0/tests/test_research_metadata.py +145 -0
  463. beakr_cli-0.4.0/tests/test_research_rendering.py +186 -0
  464. beakr_cli-0.4.0/tests/test_server_text_printed_literally.py +148 -0
  465. beakr_cli-0.4.0/tests/test_session_learning_classification.py +421 -0
  466. beakr_cli-0.4.0/tests/test_setup_auth.py +124 -0
  467. beakr_cli-0.4.0/tests/test_setup_mcp_registration.py +294 -0
  468. beakr_cli-0.4.0/tests/test_shell_completion.py +275 -0
  469. beakr_cli-0.4.0/tests/test_skill_cards_or_originals.py +24 -0
  470. beakr_cli-0.4.0/tests/test_skill_sync_links.py +103 -0
  471. beakr_cli-0.4.0/tests/test_skills_sync.py +188 -0
  472. beakr_cli-0.4.0/tests/test_skills_sync_containment.py +58 -0
  473. beakr_cli-0.4.0/tests/test_skills_sync_parked_shared.py +58 -0
  474. beakr_cli-0.4.0/tests/test_snapshots.py +100 -0
  475. beakr_cli-0.4.0/tests/test_table_cells_escaped.py +32 -0
  476. beakr_cli-0.4.0/tests/test_timeline_clip_recovery.py +44 -0
  477. beakr_cli-0.4.0/tests/test_tool_surface.py +100 -0
  478. beakr_cli-0.4.0/tests/test_transcript_activity.py +103 -0
  479. beakr_cli-0.4.0/tests/test_transcript_authorship.py +199 -0
  480. beakr_cli-0.4.0/tests/test_transcripts.py +80 -0
  481. {beakr_cli-0.3.2 → beakr_cli-0.4.0}/tests/test_updates.py +318 -9
  482. beakr_cli-0.4.0/tests/test_wrong_api_url.py +156 -0
  483. beakr_cli-0.4.0/tests/upload_routes.py +105 -0
  484. {beakr_cli-0.3.2 → beakr_cli-0.4.0}/uv.lock +612 -11
  485. beakr_cli-0.3.2/.claude/skills/beakr/SKILL.md +0 -134
  486. beakr_cli-0.3.2/.claude/skills/beakr/reference/research-workflow.md +0 -48
  487. beakr_cli-0.3.2/.claude/skills/beakr/reference/writing-pages.md +0 -84
  488. beakr_cli-0.3.2/.github/workflows/publish.yml +0 -29
  489. beakr_cli-0.3.2/LICENSE +0 -21
  490. beakr_cli-0.3.2/PKG-INFO +0 -293
  491. beakr_cli-0.3.2/README.md +0 -261
  492. beakr_cli-0.3.2/src/beakr_cli/client.py +0 -190
  493. beakr_cli-0.3.2/src/beakr_cli/commands/auth.py +0 -205
  494. beakr_cli-0.3.2/src/beakr_cli/commands/kb.py +0 -1018
  495. beakr_cli-0.3.2/src/beakr_cli/config.py +0 -41
  496. beakr_cli-0.3.2/src/beakr_cli/main.py +0 -302
  497. beakr_cli-0.3.2/src/beakr_cli/mcp_server.py +0 -909
  498. beakr_cli-0.3.2/src/beakr_cli/output.py +0 -91
  499. beakr_cli-0.3.2/tests/test_auth_cli.py +0 -23
  500. beakr_cli-0.3.2/tests/test_client.py +0 -45
  501. {beakr_cli-0.3.2 → beakr_cli-0.4.0}/.claude/commands/kb-research.md +0 -0
  502. {beakr_cli-0.3.2 → beakr_cli-0.4.0}/.claude/commands/kb-search.md +0 -0
  503. {beakr_cli-0.3.2 → beakr_cli-0.4.0}/.claude/skills/beakr/examples/research-topic.md +0 -0
  504. {beakr_cli-0.3.2 → beakr_cli-0.4.0}/.gitignore +0 -0
  505. {beakr_cli-0.3.2 → beakr_cli-0.4.0}/src/beakr_cli/commands/__init__.py +0 -0
  506. {beakr_cli-0.3.2 → beakr_cli-0.4.0}/tests/__init__.py +0 -0
@@ -33,4 +33,4 @@ If no specific focus is given, run a general health check. Pass a project's name
33
33
  - **Minor** -- style inconsistencies, missing Related Pages sections
34
34
  - **Recommendations** -- specific pages to create, merge, or reorganize
35
35
 
36
- Offer to stage fixes with `knowledge_base_write` (actions `edit_section`, `merge` for duplicates, `mv`, `new`) if the user approves. Never call `accept_proposal` unless the user explicitly asks.
36
+ Offer to stage fixes with `knowledge_base_write` (actions `edit_section`, `merge` for duplicates, `mv`, `new`) if the user approves. A `merge` moves only the duplicate sections its `merge_sections` names; the rest are archived with the duplicate. After an `mv`, links elsewhere keep resolving but still show the old title until a `find_replace` updates them. Never call `accept_proposal` unless the user explicitly asks.
@@ -12,8 +12,8 @@ Follow this procedure:
12
12
 
13
13
  5. **Write the content** following these conventions:
14
14
  - The page is `sections`: an ordered list of `{"title": ..., "body": ...}` objects. Beakr writes the `<!-- sec:ID -->` markers and IDs; do not author markers or pass `content`.
15
- - Put an inline citation token `{{key}}` immediately after every factual claim, table value, date, title, and relationship.
16
- - Give each token a record in that section's `citations`: `{"key": ..., "source_ref": ..., "stance": ...}` using the `source_ref` from a `knowledge_base` read for sources Beakr already has. For this conversation or a note, use a stable key with `source_type` `conversation`, `agent_note`, or `user_note`, plus `source_title` and `meta.excerpt`.
15
+ - Cite every factual claim, table value, date, title, and relationship right after it. For a source Beakr already has, write the readable reference a `knowledge_base` read printed, in parentheses (`(memo.pdf › p. 7)`); Beakr stores it as that citation. To set its stance, also list it in `citations` as `{"reference": ..., "stance": ...}` or with the read's `source_ref`.
16
+ - For this conversation or a note, put `{{conversation:<label>}}` after the claim and give it a record in that section's `citations` with the same `key`, `source_type` `conversation` (or `agent_note`, `user_note`), `source_title`, and `meta.excerpt`.
17
17
  - Set `stance` to `support`, `qualifies`, or `contradicts`.
18
18
  - Add `event_start`, `event_end`, and `date_precision` (day, month, quarter, year, approx) to dated decisions, meetings, milestones, launches, incidents, and other timeline-worthy sections.
19
19
  - Use `[[Page Title]]` for cross-references (check targets exist) and `[[Display Text|Page Title]]` when the text differs.
@@ -24,7 +24,8 @@ Follow this procedure:
24
24
  6. **Stage the proposal** with `knowledge_base_write`:
25
25
  - New page: action `new` with `title`, `page_type`, `summary` (one line on what the page is about), `parent`, `sections`, and `rationale`.
26
26
  - Existing page: action `edit_section` with `page`, `section_id`, `new_section_body`, `citations`, `edit_note`, and `rationale`. Read the page first; the new body replaces the whole section.
27
+ - An `edit_section` write prints the proposal's id and `content_hash`.
27
28
 
28
- 7. **Review.** Show the result with `show_proposal`. Call `accept_proposal` only when the user explicitly asks to apply it.
29
+ 7. **Review.** Show the result with `show_proposal`, which also names who filed it. Call `accept_proposal` only when the user explicitly asks to apply it, with the `content_hash` the user reviewed as `reviewed_hash`.
29
30
 
30
31
  Do NOT create stub pages. Every page should have substantive content.
@@ -0,0 +1,188 @@
1
+ ---
2
+ name: beakr
3
+ description: "Access your organization's knowledge base, research questions with citations, and manage knowledge base pages using Beakr's MCP tools. Use when the user asks about their organization, team, projects, people, decisions, or processes -- or wants to create/update knowledge base content."
4
+ ---
5
+
6
+ # Beakr Knowledge Base
7
+
8
+ Beakr is the team's organizational memory. Teams write decisions, processes, ownership, and dated events here so that 6 months later the answer to "why did we do X" is one search away instead of lost in Slack archives or tribal knowledge.
9
+
10
+ Use the Beakr MCP tools to search and read existing knowledge — and to add to it when the conversation produces something durable.
11
+
12
+ ## When to use
13
+
14
+ - User asks about their organization, team, people, decisions, or processes
15
+ - User wants to look something up ("What do we know about X?", "Who owns Y?")
16
+ - User wants to research a topic across documents and connected services
17
+ - User wants to create, update, or audit knowledge base pages
18
+ - **The conversation itself surfaces durable information worth capturing** (see "Proactive capture" below)
19
+
20
+ ## Proactive capture
21
+
22
+ You are not just a read interface. When the conversation produces something durable, **propose adding it — don't wait to be asked**.
23
+
24
+ **Capture when all of:**
25
+ - **Durable**: would still matter in 6 months
26
+ - **Shareable**: others would benefit, not just this user right now
27
+ - **Not already in Beakr**: check with `knowledge_base` command `sections` first
28
+ - **In scope**: the user can write to it (their personal project, or a team project they belong to — confirm with `list_projects`)
29
+
30
+ **Good candidates:**
31
+ - Decisions with rationale ("we chose X over Y because…")
32
+ - Named processes ("here's how we onboard a customer")
33
+ - Role / ownership assignments ("Alex owns billing")
34
+ - Dated events: launches, hires, fundraising rounds, incidents
35
+ - External relationships: investors, partners, key vendors
36
+ - Recurring questions you just answered
37
+
38
+ **Skip:**
39
+ - Debugging traces, transient state
40
+ - Information already in source code, git history, Linear/Jira tickets
41
+ - Hot takes, speculation, "thinking out loud"
42
+ - Anything the user clearly considers ephemeral
43
+
44
+ **Etiquette:**
45
+ - **Surface the suggestion before writing**: "This decision about X seems worth capturing — want me to propose it for your wiki?"
46
+ - Never auto-write. Always propose, always wait for explicit OK -- unless the write result says the user's auto-approve is on; then it is applied automatically, so do not ask them to approve it.
47
+ - One capture offer per significant thread — don't pepper the user.
48
+ - Cite the current session as a `conversation` source with `meta.excerpt` so it is traceable.
49
+
50
+ ## Tools
51
+
52
+ | Tool | When to use |
53
+ |------|-------------|
54
+ | `knowledge_base` | Every read over the wiki, chosen by `command`: `sections`, `grep`, `ls`, `cat`, `hover`, `links`, `references`, `timeline`, `rows` (every map card's Facts, Connections or Findings as one table), `provenance`, `blame`, `sources`, `log`, `diff`, `show`, `ontology`, `suggest_parent`, `diagnostics`, `completions`, `proposals`. |
55
+ | `knowledge_base_write` | Every change, chosen by `action`: `edit_section`, `add_fact`, `add_connection`, `add_finding`, `edit_rows`, `sort_table`, `new`, `edit`, `find_replace`, `mv`, `archive`, `merge`, `copy`, `page_type`. Stages a proposal, with two exceptions that apply at once: `sort_table` only reorders a table, and a project or org `page_type` the verifier accepts is active at once; a global one is refused. On a project-map card use the three `add_*` actions to add one row or one dated finding, and `edit_rows` to change, merge or delete rows (Facts, Connections or Findings). A card's table rows change only through these actions: an `edit_section` or `edit` that would change one is refused, and `find_replace` changes the text around the rows and reports the row matches it left for `edit_rows`. A write to one section or row prints its proposal's id and `content_hash`. |
56
+ | `documents` | Where available: `grep` and `read` over the original documents themselves, for exact wording a page does not carry. |
57
+ | `read_file` | The original document a citation points at. Pass the citation's readable reference (`memo.pdf › p. 7`), the `path › place` from a Sources line (`deals/acme/memo.pdf › p. 7`), or the file id. It reads files and canvases only: for a connected item (Slack, email, calendar, Jira) use its excerpt and open its url. Long files come back in pieces (`offset`). |
58
+ | `research` | When your client exposes it: one cited answer across the knowledge base, documents and connected services (Slack, Gmail, Calendar, Jira...). |
59
+ | `integrations` | Live reads of the user's connected services (Slack, Drive, Gmail, Jira, Notion, Benchling...), as the user, with the read-only tools Beakr's own agent uses: `command: list` names the tools you can call and their options, `describe` with `tool` gives one tool's schema, and `call` with `tool` runs it with its options in `arguments` (`connector_id` when a service is connected twice). A call ends with a Sources list whose `source_ref` a Knowledge write accepts as a citation. For what the organization already knows, the knowledge base comes first. |
60
+ | `show_proposal` / `accept_proposal` / `dismiss_proposal` | Review a staged proposal, which names who filed it ("filed by Dana Reyes via claude-code/2.1"); accept only when the user explicitly asks, passing the `content_hash` the write or `show_proposal` printed as `reviewed_hash`. A proposal that changed since it was shown is refused; one that changes a card's table rows is not accepted without the hash. Where the organization or project requires a person to accept what agents write, `accept_proposal` is refused (`person_review_required`) and nothing is applied; the hosted server's `show_proposal` says "Needs a person to accept". Tell the user it waits for them to accept in Beakr, and do not retry. |
61
+ | `list_projects` | Discover projects (including the personal one) to use as `scope`. |
62
+ | `get_profile`, `wiki_stats`, `wiki_graph` | Org/project profile, counts, and the most-connected pages. |
63
+ | `context` | The user's Beakr context for a project (its name or ID): profile, recent activity, relevant memories and skills. |
64
+ | `conversations_search` / `import_conversation` | Find past agent sessions and chats that answered something; import a session transcript. |
65
+ | `beakr_version` / `update_beakr` | Check for a newer Beakr release; update only when the user asks. |
66
+
67
+ Every tool is listed from the start; call it directly. Only a server started with `BEAKR_MCP_TOOLS=eager` lists a smaller set plus `discover_tools`, which adds the tools it finds. A tool missing on a self-hosted installation is one that installation does not provide.
68
+
69
+ Both `knowledge_base` tools take a `command`/`action`, a flat `arguments` object, and an optional `scope`:
70
+
71
+ ```
72
+ knowledge_base(command="sections", arguments={"query": "who owns billing"})
73
+ knowledge_base(command="cat", arguments={"page": "Billing", "section_id": "sec_owner"})
74
+ knowledge_base_write(action="edit_section", scope="Team Wiki", arguments={...})
75
+ ```
76
+
77
+ There is no `search` command. Use `sections` (semantic, start here) or `grep` (literal text).
78
+
79
+ ## Reading evidence
80
+
81
+ - **Start with `sections`.** Each hit shows the document passage (a verbatim excerpt) that supports it. Quote it directly; open the file only when the value you need is not in the excerpt.
82
+ - **Four ways to read, combined as the task needs.**
83
+
84
+ | Mode | Commands | Use it for | It cannot |
85
+ | --- | --- | --- | --- |
86
+ | File system | `ls`, `cat`, `grep`; `documents` grep and read for originals | browsing, reading a page, exact names and ids, the original document | rank or count by a fact's value |
87
+ | Graph | `links`, `hover`, `references`, `timeline` | a record's parties, instruments and documents, a chain, the order of events | "every" across records it does not reach |
88
+ | Database | `rows` (`beakr kb rows`); `query` (`beakr kb query`, where enabled: one SQL `SELECT`, or a JSON spec) for what rows cannot express | every, how many, latest, largest, compare, as-of, what connects to X; multi-step joins, custom aggregates, X and not Y | see what was never structured into a card's tables: confirm a count with `ls` or `grep` |
89
+ | Meaning | `sections`; `query` with `semantic` (`rank_fields_by`) for field names | something you can describe but cannot name | count or enumerate: it ranks and stops |
90
+
91
+ Find by meaning or in the database, walk the graph, confirm in the original. Do not extract the documents and grep them; every document, its date and matter are already indexed.
92
+ - **`rows` as a database.** Every row carries its entity (the card's title), entity_type (page type), the table, the field (attribute or relation), the value (or `to`), When and its sources. Filter (`table`, `page_type`, `entity` (one title, or several as a list, `a|b|c` or `^(a|b)$`; the reply names any title that matched no card), `to` for every connection involving a page, `connected_to` for cards linked to a page either way, `attribute`, `query`, `regex: true` for patterns, dates, `current_only`, `as_of` for each card's value on a date), sort (`order_by` any column, or `amount` and `date` for typed values; `descending`) and aggregate (`group_by` entity, entity_type, year or a column: counts, sums, min, max; `group_by: value` groups a category field's consolidated values and any other value by its text). `match` sets how `attribute` finds a field: `exact` (the name or an alias), `similar` (also names holding its words) or `meaning` (the default: also the closest name by meaning, where the rows index is on); the reply says which field it used. `view: fields` lists the field names cards actually use, and `field_id` picks one.
93
+ - **0 rows is not absence.** It means no scanned card states the fact under that name. Retry with the names the reply suggests or `view: fields`, then `sections` and the cited documents; never conclude a fact does not exist from an empty `rows`.
94
+ - **Results stay under about 6k tokens.** When `next` appears, page with it rather than re-querying.
95
+ - **Exact wording:** `sources {page}` lists every cited passage; `read_file` with a citation's reference, a file id or a path opens the original.
96
+
97
+ ## Find, then verify in the file
98
+
99
+ 1. **Find** with the knowledge base (`sections`, `rows`, `cat`). Each citation reads as the document and the place in it, in parentheses, naming the file by its drive path when it is known: `Base rent is $48,000 per year (deals/acme/memo.pdf › p. 7).` A cited message, email, event or comment is dated by its own time, and its url opens that item when the connector gives one. Each Sources line names where a cited document lives, every place cited in it, its `read_file` id and its `source_ref`: `- deals/acme/memo.pdf › p. 7, p. 9 · read_file <id> · source_ref <ref>`.
100
+ 2. **Follow** that `path › place` with `read_file` (`deals/acme/memo.pdf › p. 7`, `book.xlsx › sheet 2, B4:D9`); it returns the text around that place. When the files are on your local disk, open the path there directly. Where the `documents` tool is available, its `read` of a path in the wrong subfolder opens the one file of that name in the same record folder and says which path it opened, and a spreadsheet read ends with the first 50 rows of each sheet.
101
+ 3. **Verify** every decisive value (an amount, date, count, name) in the file before you rely on it. When the file and a card disagree, the file wins: say so, and cite the file by its reference.
102
+ - **Codex:** print only the result's text, and make one Knowledge call per exec cell.
103
+
104
+ ## Quick decision tree
105
+
106
+ ```
107
+ User asks a question about their org, a fact, a decision or a page
108
+ → knowledge_base sections {query}; quote the excerpt, or cat {page, section_id} on the best hit
109
+
110
+ User asks a broad question and research is available
111
+ → research(query=...)
112
+
113
+ User asks for the most recent or largest X
114
+ → knowledge_base rows {table: facts, page_type, attribute, order_by: when (or value), descending: true}; cat the top few, then their children for the executed documents
115
+
116
+ User asks for every X involving a party, client or instrument
117
+ → knowledge_base rows {table: connections, to: <page>} or links {page, page_type, relation}
118
+
119
+ User asks how many X, or for counts per group
120
+ → knowledge_base ls {page_type} (the whole population, paged), then check each; rows {..., group_by} for counts and totals per group
121
+
122
+ User asks everything about one record
123
+ → knowledge_base hover {page}, ls {parent: <page>}, links {page, direction: out}, timeline {page}
124
+
125
+ User needs the exact wording or a value the excerpt lacks
126
+ → read_file {path: "<path> › <place>"} from the Sources line (or the citation's reference)
127
+
128
+ User wants an exact name, ID, or phrase
129
+ → knowledge_base grep {query}
130
+
131
+ User wants to browse pages
132
+ → knowledge_base ls {parent?, page_type?, sort_by?}
133
+
134
+ User wants to know what happened when
135
+ → knowledge_base timeline {timeline_query?, start_date?, end_date?}
136
+
137
+ User wants to verify sources for a claim
138
+ → knowledge_base provenance {page} or blame {page}
139
+
140
+ User wants to create/update a page
141
+ → One specific thing (person, organization, product, system, model, study, decision, event) is a card: run ontology first and use the most specific card type, then add_fact / add_connection / add_finding with evidence. Topic, overview and index pages tie cards together and need no card shape. See [reference/writing-pages.md](reference/writing-pages.md)
142
+
143
+ You established something the organization will want again (after a cited answer)
144
+ → propose it: add_fact {page, attribute, value, evidence} for a sourced value (reuse the attribute names rows view: fields lists); add_connection {page, relation, to, evidence} on the more specific card; add_finding {page, date, kind, text, evidence} for your conclusion. An out-of-date value gets a newer dated row, not a deletion.
145
+
146
+ User wants to audit knowledge base quality
147
+ → See [reference/auditing.md](reference/auditing.md)
148
+ ```
149
+
150
+ ## Scoping
151
+
152
+ - `knowledge_base` and `knowledge_base_write` take `scope`: a project name or ID. Omit it on reads to search everything the user can see.
153
+ - A `scope` that names no project the user can read is refused with the closest names (`scope_not_found`, or `scope_ambiguous` when several share the name); it is never widened to everything. Retry with a name or ID `list_projects` printed.
154
+ - `research`, `documents`, `read_file`, `wiki_stats` and `wiki_graph` take `project`. Pass the project's ID from `list_projects` to work on every server; the local CLI server (`beakr mcp`) also accepts its name and refuses one that names no readable project as `scope` is refused. On `read_file` it opens only a file in that project.
155
+ - The personal project is a project like any other: `list_projects` reports it with type `personal`. Pass its name or ID as the scope.
156
+
157
+ ## Citing sources
158
+
159
+ Always cite sources when presenting information from the knowledge base:
160
+ - Cite with the readable reference a result prints, in parentheses: `(tax-memo.docx › p. 7)`, `(#deals › message 2026-03-04 14:02 UTC)`, `(ENG-12)`, `(Page Title › Section)`; to people, link it when it has a url
161
+ - In writes, cite with that readable reference as `reference` (or a read's `source_ref`), and only this conversation (`conversation` with `meta.excerpt`), files the user uploaded, a web page (its http(s) URL, title and the quoted passage), or sources Knowledge already cites; anything else is refused `citation_not_citeable`
162
+ - Include the page title so the user can find it
163
+ - `research` answers cite the same way, with a Sources list per document -- keep the references when you present them
164
+ - An excerpt marked `(paraphrase)`, `(human asserted)`, or `(unverified)` is not a checked quote; open the source before relying on it
165
+ - For claims that need verification, use `provenance` to show supporting/contradicting sources
166
+ - When writing pages, see [reference/writing-pages.md](reference/writing-pages.md) for citation records
167
+
168
+ ## Page references
169
+
170
+ `page` accepts any of:
171
+ - Title (e.g., `"API Design"`)
172
+ - Slug (e.g., `api-design`)
173
+ - UUID
174
+ - Wiki citation key from a read (e.g., `wiki:8f3a0c21`)
175
+
176
+ ## Advanced workflows
177
+
178
+ - **Deep research**: See [reference/research-workflow.md](reference/research-workflow.md)
179
+ - **Cards or originals**: read cards first; compute from the original files when the answer needs math, exact values or a disputed source. See [reference/research-workflow.md](reference/research-workflow.md#cards-or-the-original-files)
180
+ - **Writing pages**: See [reference/writing-pages.md](reference/writing-pages.md)
181
+ - **Auditing quality**: See [reference/auditing.md](reference/auditing.md)
182
+ - **Understanding provenance**: See [reference/provenance.md](reference/provenance.md)
183
+
184
+ ## Examples
185
+
186
+ - [examples/answer-org-question.md](examples/answer-org-question.md) -- Answering "Who owns onboarding?"
187
+ - [examples/research-topic.md](examples/research-topic.md) -- Deep research on a topic
188
+ - [examples/write-decision-page.md](examples/write-decision-page.md) -- Creating a decision record
@@ -12,7 +12,7 @@ Call `research` with the question:
12
12
  research(query="who owns the onboarding flow")
13
13
  ```
14
14
 
15
- The response returns a cited answer mentioning Sarah Chen [1] and the pages it drew on.
15
+ The response returns a cited answer mentioning Sarah Chen (Onboarding › Owner) and the pages it drew on.
16
16
 
17
17
  ### Step 2: Verify if needed
18
18
  If the user wants more detail, find the exact section and read just that:
@@ -23,7 +23,7 @@ Suggested parent: "API Architecture".
23
23
  research(query="internal API architecture GraphQL REST", project="<platform project id>")
24
24
  knowledge_base(command="sources", arguments={"page": "API Architecture"})
25
25
  ```
26
- Note each source's citation key and `source_ref`.
26
+ Note the readable reference each source is cited by (`api-decision.docx › p. 2`).
27
27
 
28
28
  ### Step 4: Stage the page
29
29
 
@@ -40,18 +40,14 @@ knowledge_base_write(
40
40
  "sections": [
41
41
  {
42
42
  "title": "Summary",
43
- "body": "The engineering team decided to migrate the internal API from REST to GraphQL, effective Q2 2026 {{gdrive:api-decision-doc}}. The public API remains REST {{gdrive:api-decision-doc}}.",
44
- "citations": [
45
- {"key": "gdrive:api-decision-doc", "source_ref": "beakr-source:v1:...", "stance": "support"}
46
- ]
43
+ "body": "The engineering team decided to migrate the internal API from REST to GraphQL, effective Q2 2026 (api-decision.docx › p. 1). The public API remains REST (api-decision.docx › p. 1)."
47
44
  },
48
45
  {
49
46
  "title": "Decision",
50
- "body": "**Decision maker:** Sarah Chen (CTO) {{gdrive:api-decision-doc}}\n\nAdopt GraphQL for internal service communication using Apollo Federation {{gdrive:api-decision-doc}}. It reduces over-fetching by 60% based on traffic analysis {{conversation:graphql-traffic}}.",
47
+ "body": "**Decision maker:** Sarah Chen (CTO) (api-decision.docx › p. 1)\n\nAdopt GraphQL for internal service communication using Apollo Federation (api-decision.docx › p. 2). It reduces over-fetching by 60% based on traffic analysis {{conversation:graphql-traffic}}.",
51
48
  "event_start": "2026-03-15",
52
49
  "date_precision": "day",
53
50
  "citations": [
54
- {"key": "gdrive:api-decision-doc", "source_ref": "beakr-source:v1:...", "stance": "support"},
55
51
  {
56
52
  "key": "conversation:graphql-traffic",
57
53
  "source_type": "conversation",
@@ -63,10 +59,7 @@ knowledge_base_write(
63
59
  },
64
60
  {
65
61
  "title": "Alternatives considered",
66
- "body": "1. **Keep REST, add OpenAPI codegen** -- lower migration cost but doesn't solve over-fetching {{gdrive:api-decision-doc}}\n2. **gRPC** -- better performance but weaker tooling for our stack {{gdrive:api-decision-doc}}",
67
- "citations": [
68
- {"key": "gdrive:api-decision-doc", "source_ref": "beakr-source:v1:...", "stance": "support"}
69
- ]
62
+ "body": "1. **Keep REST, add OpenAPI codegen** -- lower migration cost but doesn't solve over-fetching (api-decision.docx › p. 2)\n2. **gRPC** -- better performance but weaker tooling for our stack (api-decision.docx › p. 2)"
70
63
  },
71
64
  {
72
65
  "title": "Related Pages",
@@ -81,11 +74,11 @@ knowledge_base_write(
81
74
  ```
82
75
  show_proposal(proposal_id="...")
83
76
  ```
84
- Call `accept_proposal` only after the user explicitly says to apply it.
77
+ Call `accept_proposal` only after the user explicitly says to apply it, passing the `content_hash` the write and `show_proposal` printed as `reviewed_hash`. If it is refused with `person_review_required`, the project needs a person to accept it: the user does that in Beakr.
85
78
 
86
79
  ## Key points
87
80
  - Use the `decision` page type; include the date (`event_start` + `date_precision`), decision maker, and alternatives
88
81
  - `sections` is a list of `{title, body}`; Beakr adds the section markers
89
- - Put an inline `{{key}}` token after every factual claim, and a matching citation record in that section
90
- - Reuse `source_ref` for sources Beakr already has; cite this conversation with `source_type: "conversation"` and `meta.excerpt`
82
+ - Cite every factual claim inline: a source Beakr already has by the readable reference a read printed, in parentheses (Beakr stores it as that citation); this conversation as `{{conversation:<label>}}` with a matching `conversation` record in that section
83
+ - A record in `citations` can also cite a source Beakr has by `reference` or `source_ref`
91
84
  - Link related pages with `[[Page Title]]`
@@ -24,7 +24,7 @@ Use `links {page}` or `references {page}` to inspect a specific page's neighborh
24
24
  ### 4. Spot structural issues
25
25
 
26
26
  From `ls` results, look for:
27
- - Duplicate or near-duplicate page titles (fix with `merge`, not `archive`)
27
+ - Duplicate or near-duplicate page titles (fix with `merge` and its `merge_sections`, not `archive`)
28
28
  - Deeply nested hierarchies (more than 3 levels is usually too deep)
29
29
  - Pages without a parent (use `suggest_parent {page}` to find a home)
30
30
  - Pages that look like stubs
@@ -51,4 +51,4 @@ Organize by severity:
51
51
  - **Minor** -- style inconsistencies, missing Related Pages sections
52
52
  - **Recommendations** -- specific pages to create, merge, or reorganize
53
53
 
54
- Offer to stage fixes with `knowledge_base_write` (`edit_section`, `merge`, `mv`, `new`) if the user approves.
54
+ Offer to stage fixes with `knowledge_base_write` (`edit_section`, `merge`, `mv`, `new`) if the user approves. See [writing-pages.md](writing-pages.md#renaming-merging-and-replacing-text) for what `merge` carries and what `mv` leaves.
@@ -12,7 +12,7 @@ knowledge_base(command="blame", arguments={"page": "API Design"})
12
12
  ```
13
13
 
14
14
  ### sources
15
- The source documents behind a page, each with the other pages that draw on it. Also accepts a source title or citation token as `page` to get that one document's entry.
15
+ The source documents behind a page, each with the other pages that draw on it. Also accepts a source title (a cited file's name) as `page` to get that one document's entry.
16
16
 
17
17
  ```
18
18
  knowledge_base(command="sources", arguments={"page": "API Design"})
@@ -0,0 +1,64 @@
1
+ # Deep Research Workflow
2
+
3
+ Use this workflow when the user needs a thorough, multi-source analysis of a topic.
4
+
5
+ ## Procedure
6
+
7
+ ### 1. Discover the landscape
8
+
9
+ Call `list_projects` to understand the org structure, and `wiki_stats` (with `project` when one is clearly relevant) to know where knowledge lives.
10
+
11
+ ### 2. Broad wiki search
12
+
13
+ Run `knowledge_base` command `sections` with 2-3 phrasings -- it is semantic, so natural language works. Each hit carries the verbatim document passage that supports it: quote that rather than opening the file. Use `grep` for exact names, IDs, or phrases; if a literal `grep` misses, the wording may differ, so retry with `sections` rather than concluding the knowledge base lacks it. For "every X", counts and superlatives, list the population with `ls` (by `page_type`) or `rows` instead of extracting and grepping the documents.
14
+
15
+ ### 3. Ask the researcher (when available)
16
+
17
+ If your client exposes `research`, call it with the question. It searches the wiki, documents, and connected services and returns a cited answer. Treat it as a starting map, not the final word.
18
+
19
+ ### 4. Deep read
20
+
21
+ Read the top hits with `cat`, narrowest first: `section_id` from the hit, or `outline: true` to see a page's sections. Read whole pages only when you need material the hit did not point at. Pay attention to:
22
+ - `[[links]]`, Path, Children, and "Linked from" in the output -- follow those edges
23
+ - Page type (`decision` pages carry different weight than `research_note`)
24
+
25
+ ### 5. Trace provenance
26
+
27
+ For key claims, use `provenance {page}` to see which sources support, contradict, or qualify each section, and `sources {page}` to see what fed the page.
28
+
29
+ ### 6. Follow the graph and history
30
+
31
+ Use `links {page}` or `references {page}` on central pages to find related pages you missed. Use `timeline {timeline_query}` for how events unfolded, and `log {page}` only when the question is about change over time.
32
+
33
+ ### 7. Check for conflicts
34
+
35
+ Look for citations with stance `contradicts` or `qualifies`. These are the most valuable findings -- they show where evidence disagrees.
36
+
37
+ ### 8. Synthesize
38
+
39
+ Write up findings organized by theme, not by page. Include:
40
+ - Key findings with page citations (title)
41
+ - Areas of agreement across sources
42
+ - Contradictions or open questions
43
+ - Gaps -- what the knowledge base does NOT cover
44
+ - Temporal context -- when information was written, whether it may be stale
45
+
46
+ ### 9. Recommend
47
+
48
+ If research reveals gaps or stale pages, suggest specific knowledge base updates.
49
+
50
+ ## Cards or the original files
51
+
52
+ Cards and pages are summaries written from the files a team uploaded. They tell you what is known, who owns it and where it came from, and they are the right first read. They are not the data. Go back to the original file when the answer depends on the file itself:
53
+
54
+ - **You need to compute.** Totals, averages, a re-fit, a recount, a comparison across rows: the card gives you at most the numbers someone chose to write down. Compute from the source table, not from figures copied into prose.
55
+ - **You need exact wording or a value.** A quote, a dose, a threshold, a date, a cell in a table.
56
+ - **The card is not enough.** It is marked partial or incomplete, its `coverage` says results were cut off, it lacks the field you need, or two sources disagree (`contradicts` / `qualifies`) and you have to see which is right.
57
+
58
+ How to get there:
59
+
60
+ 1. Find the file the claim rests on: `sources {page}` or `provenance {page}` list the cited files with their `source_ref` and file id.
61
+ 2. Read its text with the `read_file` tool (`artifact_id`, then `offset` to page through), or download the file itself for analysis: `beakr files download <artifact_id>` or `beakr.files.download(...)` in the SDK.
62
+ 3. Compute locally from the downloaded file (spreadsheet, CSV, PDF tables) and keep the calculation reproducible: say what you computed and from which rows.
63
+
64
+ Then record what you learned so the next agent does not redo it: add it as a finding (`knowledge_base_write` with `action: add_finding`, or `beakr kb add-finding`) citing the original file's `source_ref`, and say in the finding that the value was computed from the file, not copied from a card. If the card itself is wrong or stale, propose an edit to it with the same citation instead.
@@ -0,0 +1,168 @@
1
+ # Writing Knowledge Base Pages
2
+
3
+ Use this workflow when the user wants to create or update a page. Every change goes through `knowledge_base_write`, which stages a **proposal**; nothing is written until the user asks you to `accept_proposal`, unless the write result says the user's auto-approve is on. Two actions apply at once instead: `sort_table`, which only reorders a table, and a project or org `page_type` the verifier accepts (a global one is refused).
4
+
5
+ ## Before writing
6
+
7
+ 1. **Check for duplicates.** Search with `knowledge_base` command `sections` (and `grep` for exact names). If a page exists on this topic, read it with `cat` and update it instead of creating a new one.
8
+
9
+ 2. **Pick the project.** Use `list_projects` and pass the project's name or ID as `scope`. Never guess: a page title or filename is not a scope.
10
+
11
+ 3. **Find the right parent.** Use `suggest_parent` with `title` (and your draft as `content`) for a page you are about to create, or `ls {parent}` to walk the hierarchy. If unsure, ask the user.
12
+
13
+ 4. **Choose the page type: cards first.** Every project is a map of cards. One specific thing (a person, organization, product, system, model, study, decision, event) is a **card**. Before your first `new`, run `ontology` and pick the most specific card type the project has. If none fits, propose one with `page_type` rather than writing a topic. Name the card plainly (`AlphaFold`, not `DeepMind - AlphaFold`), give it a Description of 2 to 8 sentences (what it is, why it matters here, its status: its identity, not a list of facts), and grow it with `add_fact` / `add_connection` / `add_finding`, each with evidence. Common types:
14
+
15
+ | Type | When to use |
16
+ |------|-------------|
17
+ | `person` | One person. |
18
+ | `organization` | One company, team or department. |
19
+ | `product`, `system`, ... | One product, system, model, study or other specific thing: use the most specific card type `ontology` lists. |
20
+ | `decision` | One decision, with its rationale and date. |
21
+ | `topic` | A theme, concept or field that ties several cards together (`Protein structure prediction`), never one specific system or product. Not a card; needs no card shape. |
22
+ | `overview` | Index/section pages that tie a section together. Not a card. |
23
+ | `research_note` | Ephemeral analysis, not canonical knowledge. |
24
+
25
+ One-off messages and meetings are not cards: what they established goes on the cards of the things involved. An analysis across several cards is its own page, linked from each card with an `add_finding`.
26
+
27
+ A card in two calls, a `new` and then a dated fact:
28
+
29
+ ```
30
+ knowledge_base_write(
31
+ action="new",
32
+ scope="Research",
33
+ arguments={
34
+ "title": "AlphaFold",
35
+ "page_type": "system",
36
+ "summary": "DeepMind's protein-structure prediction model.",
37
+ "sections": [{"title": "Description", "body": "AlphaFold predicts a protein's 3D structure from its amino-acid sequence (alphafold-paper.pdf › p. 1)."}],
38
+ "rationale": "A system the team cites often.",
39
+ },
40
+ )
41
+ knowledge_base_write(
42
+ action="add_fact",
43
+ scope="Research",
44
+ arguments={
45
+ "page": "AlphaFold",
46
+ "attribute": "Release",
47
+ "value": "AlphaFold 2 code released as open source",
48
+ "when": "2021-07",
49
+ "evidence": "(alphafold-paper.pdf › p. 1)",
50
+ "rationale": "Release date from the paper.",
51
+ },
52
+ )
53
+ ```
54
+
55
+ `when` is when the value held in the world (`YYYY-MM-DD`, `YYYY-MM`, `YYYY-Qn` or `YYYY`), never when it was recorded.
56
+
57
+ ## Adding to a project-map card
58
+
59
+ A map card has a Description, a Facts table (`| Attribute | Value | When | Evidence |`), a Connections table (`| Relation | To | When | Evidence |`) and dated Findings. Nuance stays in the value's own words. Add to it one row at a time; each is merged into the live card, so never resend a whole table. Its Facts, Connections and Findings rows are protected: they change only through `add_fact`, `add_connection`, `add_finding`, `edit_rows` and `sort_table`. An `edit_section` or `edit` that would change a row is refused; a `find_replace` changes the text outside the tables and reports the row matches it left for `edit_rows`. `edit_rows` takes `table` `facts`, `connections` or `findings` (a finding is named by its `date` and `text`):
60
+
61
+ ```
62
+ knowledge_base_write(
63
+ action="add_fact",
64
+ scope="AMR surveillance",
65
+ arguments={
66
+ "page": "FR25-1187",
67
+ "attribute": "Cluster",
68
+ "value": "CLX-21 under SOP r7",
69
+ "when": "2026-06-02",
70
+ "evidence": "{{conversation:2026-10-06-clusters}}",
71
+ "citations": [{"key": "conversation:2026-10-06-clusters", "source_type": "conversation", "source_title": "Session on AMR clusters", "stance": "support", "meta": {"excerpt": "..."}}],
72
+ "rationale": "Re-clustering under SOP r7 moved the isolate.",
73
+ },
74
+ )
75
+ ```
76
+
77
+ For a source Beakr already has, `evidence` is the readable reference a read printed (`"evidence": "memo.pdf › p. 7"`); Beakr stores it as that citation. A `{{conversation:...}}` token is only for this conversation or a note, with its record in `citations` as above. A value written another way than the row already on the card (`2026-06-02` or `June 2, 2026`, `48,000` or `48000`) joins that row, and the result says so.
78
+
79
+ Pass `rows=[{...}, ...]` to add several rows in one call; each item inherits the call's `evidence` and `when`. `sort_table` with `table` and `order_by` (e.g. `"attribute, when desc"`) orders a table and keeps it sorted on every later write. `add_connection` takes `relation` (a short verb phrase carrying any detail), `to` (the other page's title) and `when?`. `add_finding` takes `date`, `kind` (result, lesson, decision, question, correction), `text`, and optional `about`, `finding_scope` and `supersedes`: use it for a conclusion you reached, which is not a fact a source states. Keep attribute names stable so rows line up; a new value under the same attribute sits beside the old one as its history, and which one answers a question is decided by its `when` and the scope written in its value. Outside a project map these actions are refused on pages that are not cards; use `edit_section` there.
80
+
81
+ ### Keeping a card clean
82
+
83
+ To change rows already on a card, use `edit_rows`: `old_rows` names each row as the card shows it (`{attribute, value}` or `{relation, to}`), and `rows` gives what replaces them, at the same place in the table:
84
+
85
+ ```
86
+ knowledge_base_write(
87
+ action="edit_rows",
88
+ scope="AMR surveillance",
89
+ arguments={
90
+ "page": "FRP-SOP-0412",
91
+ "table": "facts",
92
+ "old_rows": [{"attribute": "Effective date", "value": "2026-06-11"},
93
+ {"attribute": "Date effective", "value": "2026-06-11"}],
94
+ "rows": [{"attribute": "Effective date", "value": "2026-06-11"}],
95
+ "rationale": "One date recorded under two attribute names.",
96
+ },
97
+ )
98
+ ```
99
+
100
+ A new row that gives no `evidence` keeps every citation of the rows it replaces (and their `when`, when they agree), so merging is one call. Deleting rows outright, or leaving a replaced row's citation off, needs a `reason`. Rows that say the same thing become one row; values for different scopes, versions or times stay separate rows with the scope in the value; a row cited `contradicts` stays. Use `add_finding` only for what a row cannot hold: a conclusion or a longer explanation. A document whose versions people track by name gets a card per version under its own card.
101
+
102
+ ## Updating an existing page (preferred)
103
+
104
+ Use `edit_section` to change one section without touching the rest of the page. Read the page first (`cat {page, outline: true}`) to get section IDs. `new_section_body` replaces that section's entire body.
105
+
106
+ ```
107
+ knowledge_base_write(
108
+ action="edit_section",
109
+ scope="Platform",
110
+ arguments={
111
+ "page": "API Architecture",
112
+ "section_id": "sec_auth",
113
+ "new_section_body": "Internal services authenticate with mTLS {{conversation:2026-09-16-auth}}.",
114
+ "citations": [
115
+ {
116
+ "key": "conversation:2026-09-16-auth",
117
+ "source_type": "conversation",
118
+ "source_title": "Claude Code session on service auth",
119
+ "stance": "support",
120
+ "meta": {"excerpt": "We agreed to move internal services to mTLS."}
121
+ }
122
+ ],
123
+ "edit_note": "Record the move to mTLS",
124
+ "rationale": "Decision made in this session; the page still described JWT."
125
+ }
126
+ )
127
+ ```
128
+
129
+ To add a section, pass a new `section_id` plus `section_title` (and `after` to position it). For several changes at once, use `edit` with `patches`.
130
+
131
+ ## Renaming, merging and replacing text
132
+
133
+ - **`mv`** renames a page. The result names the final title (`Title (1)` when the one asked for was taken) and lists the pages whose `[[links]]` still show the old title. Those links keep resolving to the renamed page; their text changes only if you stage a `find_replace` for it.
134
+ - **`merge`** folds a duplicate (`page`) into the page to keep (`canonical`), carrying its titles over as aliases so links keep resolving. Pass `merge_sections`, the ordered list the survivor leads with (`["canonical:sec_overview", "duplicate:sec_findings"]`): only the duplicate sections it names are moved across, whole with their citations; an unnamed duplicate section is archived with the duplicate and reported in `sections_left_behind`. Read every duplicate section before leaving one out.
135
+ - **`find_replace`** replaces text across pages; on a map card it skips the Facts, Connections and Findings rows and reports them, so change those with `edit_rows`.
136
+
137
+ ## Creating a page
138
+
139
+ Use `new` with `title`, `page_type`, `summary`, `parent`, `rationale`, and `sections`.
140
+
141
+ `sections` is the page: an ordered list of `{title, body}` objects. **Beakr writes the `<!-- sec:ID -->` markers and section IDs for you** -- do not author markers and do not pass `content`.
142
+
143
+ Each section can also carry:
144
+ - `citations`: records for the sources its body cites (see below)
145
+ - `event_start`, `event_end`, `date_precision` (day, month, quarter, year, approx) for dated decisions, meetings, launches, incidents, and other timeline-worthy sections. `date_precision` is required whenever `event_start` is set.
146
+
147
+ ## Citations
148
+
149
+ Cite every factual claim, table value, date, title, and relationship inline, right after it:
150
+
151
+ - **A source Beakr already has:** write the readable reference a `knowledge_base` read printed for it, in parentheses, as the read did: `The rate is 21 percent (tax-memo.txt › p. 7).`, `(#deals › message 2026-03-04 14:02 UTC)`, `(ENG-12)`, `(Page Title › Section)`. Beakr stores it as that citation; a reference to something you may not cite is refused (`citation_not_citeable`). You can also list it in `citations` as `{"reference": "memo.pdf › p. 7", "stance": "support"}` or with the `source_ref` from its Sources line.
152
+ - **A web page you read:** write its title and URL in parentheses after the claim, `(About Google DeepMind — https://deepmind.google/about/)`, or give the section's `citations` a record `{"source_type": "web", "url": "https://deepmind.google/about/", "source_title": "About Google DeepMind", "meta": {"excerpt": "the passage you rely on"}, "stance": "support"}`; to cite it inline by a name of your own, add `"key": "web:deepmind-about"` and write `{{web:deepmind-about}}` after the claim. Only `http` and `https` URLs are accepted. Beakr stores the citation as you give it and never opens the page, so quote the passage you relied on. A markdown link, `[text](https://...)`, stays a link, not a citation.
153
+ - **This conversation, or a note** (cited for the first time): put `{{conversation:<label>}}` after the claim and give it a record in that section's `citations` with the same `key`, `source_type` `conversation` (or `agent_note`, `user_note`), a `source_title`, and `meta.excerpt` (or `meta.content` / `meta.text`). The key must start with its own source type.
154
+
155
+ Set `stance` to `support`, `qualifies`, or `contradicts`. It defaults to `support`, and that default is itself a claim about the evidence. A token with no citation record is stored as a bare pointer that can never be verified.
156
+
157
+ ## Content conventions
158
+
159
+ - Use `[[Page Title]]` to link other pages; `[[Display Text|Page Title]]` when the text differs. Check targets exist first.
160
+ - `summary` is a one-line description of what the page is about, never a note about your edit (that is `edit_note`).
161
+ - Include a "Related Pages" section with links to connected pages.
162
+ - Be specific: name WHO made decisions, WHEN things happened, WHY.
163
+ - Use tables for structured data, code blocks for config/commands.
164
+ - Do not create stub pages -- every page should have substantive content.
165
+
166
+ ## After proposing
167
+
168
+ A write to one section or card row (`edit_section`, `add_fact`, `add_connection`, `add_finding`, `edit_rows`) prints its proposal's id and `content_hash`. Show the user what you staged with `show_proposal`, which prints the hash again and who filed the proposal. Call `accept_proposal` only when the user explicitly asks to apply that proposal, with that hash as `reviewed_hash`: the accept then applies exactly what was shown, and a proposal that changed in between is refused (`proposal_changed`; show it again). Take the hash from the read the user reviewed, never from a fresh read made just before accepting. A proposal that changes a card's table rows is not accepted without it; it stays acceptable when the table is re-sorted or other rows change, and only a change to a row it edits supersedes it. Where the organization or project requires a person to accept what agents write, `accept_proposal` is refused (`person_review_required`) and nothing is applied, and auto-approve does not apply either: tell the user the proposal waits for them to accept in Beakr, and do not retry. `knowledge_base` command `proposals` lists pending proposals by default; `status` also takes `accepted`, `dismissed`, `superseded` (each with the reason it can no longer apply) and `resolved`, and a page that stops short names the `offset` that continues it; a proposed page does not exist in `ls`, `cat`, or search until accepted.