authsome 0.3.0__tar.gz → 0.3.1__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 (300) hide show
  1. authsome-0.3.1/.github/release-please-manifest.json +3 -0
  2. {authsome-0.3.0 → authsome-0.3.1}/CHANGELOG.md +13 -0
  3. {authsome-0.3.0 → authsome-0.3.1}/PKG-INFO +1 -1
  4. authsome-0.3.1/docs/internal/cli-design-review.md +253 -0
  5. {authsome-0.3.0 → authsome-0.3.1}/docs/internal/manual-testing.md +18 -12
  6. {authsome-0.3.0 → authsome-0.3.1}/docs/site/reference/cli.mdx +82 -43
  7. {authsome-0.3.0 → authsome-0.3.1}/pyproject.toml +1 -1
  8. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/cli/context.py +6 -0
  9. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/cli/main.py +94 -30
  10. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/server/routes/health.py +1 -2
  11. authsome-0.3.0/.github/release-please-manifest.json +0 -3
  12. {authsome-0.3.0 → authsome-0.3.1}/.claude-plugin/marketplace.json +0 -0
  13. {authsome-0.3.0 → authsome-0.3.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  14. {authsome-0.3.0 → authsome-0.3.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  15. {authsome-0.3.0 → authsome-0.3.1}/.github/dependabot.yml +0 -0
  16. {authsome-0.3.0 → authsome-0.3.1}/.github/pull_request_template.md +0 -0
  17. {authsome-0.3.0 → authsome-0.3.1}/.github/release-please-config.json +0 -0
  18. {authsome-0.3.0 → authsome-0.3.1}/.github/workflows/pr-title.yml +0 -0
  19. {authsome-0.3.0 → authsome-0.3.1}/.github/workflows/publish-rc.yml +0 -0
  20. {authsome-0.3.0 → authsome-0.3.1}/.github/workflows/publish.yml +0 -0
  21. {authsome-0.3.0 → authsome-0.3.1}/.github/workflows/release-please.yml +0 -0
  22. {authsome-0.3.0 → authsome-0.3.1}/.github/workflows/test.yml +0 -0
  23. {authsome-0.3.0 → authsome-0.3.1}/.gitignore +0 -0
  24. {authsome-0.3.0 → authsome-0.3.1}/.pre-commit-config.yaml +0 -0
  25. {authsome-0.3.0 → authsome-0.3.1}/AGENTS.md +0 -0
  26. {authsome-0.3.0 → authsome-0.3.1}/CLAUDE.md +0 -0
  27. {authsome-0.3.0 → authsome-0.3.1}/CONTRIBUTING.md +0 -0
  28. {authsome-0.3.0 → authsome-0.3.1}/LICENSE +0 -0
  29. {authsome-0.3.0 → authsome-0.3.1}/README.md +0 -0
  30. {authsome-0.3.0 → authsome-0.3.1}/assets/authsome-how-it-works-dark.svg +0 -0
  31. {authsome-0.3.0 → authsome-0.3.1}/assets/authsome-how-it-works-light.svg +0 -0
  32. {authsome-0.3.0 → authsome-0.3.1}/assets/authsome-logo-dark.svg +0 -0
  33. {authsome-0.3.0 → authsome-0.3.1}/assets/authsome-logo-light.svg +0 -0
  34. {authsome-0.3.0 → authsome-0.3.1}/docs/UBIQUITOUS_LANGUAGE.md +0 -0
  35. {authsome-0.3.0 → authsome-0.3.1}/docs/adr/0001-provider-client-record-server-scope.md +0 -0
  36. {authsome-0.3.0 → authsome-0.3.1}/docs/adr/0002-server-registered-identities.md +0 -0
  37. {authsome-0.3.0 → authsome-0.3.1}/docs/internal/authsome-design.md +0 -0
  38. {authsome-0.3.0 → authsome-0.3.1}/docs/register-provider.md +0 -0
  39. {authsome-0.3.0 → authsome-0.3.1}/docs/site/README.md +0 -0
  40. {authsome-0.3.0 → authsome-0.3.1}/docs/site/changelog.mdx +0 -0
  41. {authsome-0.3.0 → authsome-0.3.1}/docs/site/compared.mdx +0 -0
  42. {authsome-0.3.0 → authsome-0.3.1}/docs/site/concepts/architecture.mdx +0 -0
  43. {authsome-0.3.0 → authsome-0.3.1}/docs/site/concepts/credential-storage.mdx +0 -0
  44. {authsome-0.3.0 → authsome-0.3.1}/docs/site/concepts/profiles-vs-connections.mdx +0 -0
  45. {authsome-0.3.0 → authsome-0.3.1}/docs/site/concepts/provider-registry.mdx +0 -0
  46. {authsome-0.3.0 → authsome-0.3.1}/docs/site/concepts/proxy-injection.mdx +0 -0
  47. {authsome-0.3.0 → authsome-0.3.1}/docs/site/concepts/the-daemon.mdx +0 -0
  48. {authsome-0.3.0 → authsome-0.3.1}/docs/site/docs.json +0 -0
  49. {authsome-0.3.0 → authsome-0.3.1}/docs/site/favicon.svg +0 -0
  50. {authsome-0.3.0 → authsome-0.3.1}/docs/site/guides/custom-providers.mdx +0 -0
  51. {authsome-0.3.0 → authsome-0.3.1}/docs/site/guides/headless-device-code.mdx +0 -0
  52. {authsome-0.3.0 → authsome-0.3.1}/docs/site/guides/login-with-oauth.mdx +0 -0
  53. {authsome-0.3.0 → authsome-0.3.1}/docs/site/guides/multiple-connections.mdx +0 -0
  54. {authsome-0.3.0 → authsome-0.3.1}/docs/site/guides/profiles.mdx +0 -0
  55. {authsome-0.3.0 → authsome-0.3.1}/docs/site/guides/run-agents-with-proxy.mdx +0 -0
  56. {authsome-0.3.0 → authsome-0.3.1}/docs/site/guides/use-api-keys.mdx +0 -0
  57. {authsome-0.3.0 → authsome-0.3.1}/docs/site/index.mdx +0 -0
  58. {authsome-0.3.0 → authsome-0.3.1}/docs/site/installation.mdx +0 -0
  59. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/agents/anthropic-sdk.mdx +0 -0
  60. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/agents/claude-code.mdx +0 -0
  61. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/agents/codex.mdx +0 -0
  62. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/agents/cowork.mdx +0 -0
  63. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/agents/cursor.mdx +0 -0
  64. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/agents/index.mdx +0 -0
  65. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/agents/langchain.mdx +0 -0
  66. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/agents/llamaindex.mdx +0 -0
  67. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/agents/nanoclaw.mdx +0 -0
  68. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/agents/openai-agents-sdk.mdx +0 -0
  69. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/agents/opencode.mdx +0 -0
  70. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/agents/python.mdx +0 -0
  71. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/api-key/ahrefs.mdx +0 -0
  72. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/api-key/apollo.mdx +0 -0
  73. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/api-key/ashby.mdx +0 -0
  74. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/api-key/beehiiv.mdx +0 -0
  75. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/api-key/brevo.mdx +0 -0
  76. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/api-key/buffer.mdx +0 -0
  77. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/api-key/calendly.mdx +0 -0
  78. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/api-key/clearbit.mdx +0 -0
  79. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/api-key/dub.mdx +0 -0
  80. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/api-key/g2.mdx +0 -0
  81. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/api-key/hunter.mdx +0 -0
  82. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/api-key/index.mdx +0 -0
  83. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/api-key/instantly.mdx +0 -0
  84. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/api-key/intercom.mdx +0 -0
  85. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/api-key/keywords-everywhere.mdx +0 -0
  86. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/api-key/klaviyo.mdx +0 -0
  87. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/api-key/lemlist.mdx +0 -0
  88. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/api-key/livestorm.mdx +0 -0
  89. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/api-key/mailchimp.mdx +0 -0
  90. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/api-key/mention-me.mdx +0 -0
  91. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/api-key/openai.mdx +0 -0
  92. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/api-key/optimizely.mdx +0 -0
  93. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/api-key/postmark.mdx +0 -0
  94. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/api-key/resend.mdx +0 -0
  95. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/api-key/rewardful.mdx +0 -0
  96. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/api-key/savvycal.mdx +0 -0
  97. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/api-key/semrush.mdx +0 -0
  98. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/api-key/sendgrid.mdx +0 -0
  99. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/api-key/tolt.mdx +0 -0
  100. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/api-key/typeform.mdx +0 -0
  101. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/api-key/wistia.mdx +0 -0
  102. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/api-key/zapier.mdx +0 -0
  103. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/oauth/atlassian.mdx +0 -0
  104. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/oauth/discord.mdx +0 -0
  105. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/oauth/github.mdx +0 -0
  106. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/oauth/gitlab.mdx +0 -0
  107. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/oauth/google.mdx +0 -0
  108. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/oauth/hubspot.mdx +0 -0
  109. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/oauth/index.mdx +0 -0
  110. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/oauth/klaviyo-oauth.mdx +0 -0
  111. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/oauth/linear.mdx +0 -0
  112. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/oauth/microsoft.mdx +0 -0
  113. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/oauth/notion-dcr.mdx +0 -0
  114. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/oauth/notion.mdx +0 -0
  115. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/oauth/postiz.mdx +0 -0
  116. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/oauth/slack.mdx +0 -0
  117. {authsome-0.3.0 → authsome-0.3.1}/docs/site/integrations/oauth/x.mdx +0 -0
  118. {authsome-0.3.0 → authsome-0.3.1}/docs/site/logo/dark.svg +0 -0
  119. {authsome-0.3.0 → authsome-0.3.1}/docs/site/logo/light.svg +0 -0
  120. {authsome-0.3.0 → authsome-0.3.1}/docs/site/quickstart.mdx +0 -0
  121. {authsome-0.3.0 → authsome-0.3.1}/docs/site/reference/audit-log.mdx +0 -0
  122. {authsome-0.3.0 → authsome-0.3.1}/docs/site/reference/bundled-providers.mdx +0 -0
  123. {authsome-0.3.0 → authsome-0.3.1}/docs/site/reference/daemon-api.mdx +0 -0
  124. {authsome-0.3.0 → authsome-0.3.1}/docs/site/reference/environment-variables.mdx +0 -0
  125. {authsome-0.3.0 → authsome-0.3.1}/docs/site/reference/file-layout.mdx +0 -0
  126. {authsome-0.3.0 → authsome-0.3.1}/docs/site/reference/provider-schema.mdx +0 -0
  127. {authsome-0.3.0 → authsome-0.3.1}/docs/site/reference/python-library.mdx +0 -0
  128. {authsome-0.3.0 → authsome-0.3.1}/docs/site/roadmap.mdx +0 -0
  129. {authsome-0.3.0 → authsome-0.3.1}/docs/site/security/daemon-trust-boundary.mdx +0 -0
  130. {authsome-0.3.0 → authsome-0.3.1}/docs/site/security/disclosure.mdx +0 -0
  131. {authsome-0.3.0 → authsome-0.3.1}/docs/site/security/encryption.mdx +0 -0
  132. {authsome-0.3.0 → authsome-0.3.1}/docs/site/security/hosted-deployment.mdx +0 -0
  133. {authsome-0.3.0 → authsome-0.3.1}/docs/site/security/threat-model.mdx +0 -0
  134. {authsome-0.3.0 → authsome-0.3.1}/docs/site/snippets/masked-input-note.mdx +0 -0
  135. {authsome-0.3.0 → authsome-0.3.1}/docs/site/snippets/multi-connections-cta.mdx +0 -0
  136. {authsome-0.3.0 → authsome-0.3.1}/docs/site/snippets/whats-next-apikey.mdx +0 -0
  137. {authsome-0.3.0 → authsome-0.3.1}/docs/site/snippets/whats-next-oauth.mdx +0 -0
  138. {authsome-0.3.0 → authsome-0.3.1}/docs/site/troubleshooting/daemon-issues.mdx +0 -0
  139. {authsome-0.3.0 → authsome-0.3.1}/docs/site/troubleshooting/doctor.mdx +0 -0
  140. {authsome-0.3.0 → authsome-0.3.1}/docs/site/troubleshooting/oauth-callbacks.mdx +0 -0
  141. {authsome-0.3.0 → authsome-0.3.1}/docs/site/troubleshooting/proxy-networking.mdx +0 -0
  142. {authsome-0.3.0 → authsome-0.3.1}/docs/site/troubleshooting/token-refresh.mdx +0 -0
  143. {authsome-0.3.0 → authsome-0.3.1}/skills/authsome/SKILL.md +0 -0
  144. {authsome-0.3.0 → authsome-0.3.1}/skills/authsome/evals/evals.json +0 -0
  145. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/__init__.py +0 -0
  146. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/audit/__init__.py +0 -0
  147. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/__init__.py +0 -0
  148. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/__init__.py +0 -0
  149. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/ahrefs.json +0 -0
  150. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/apollo.json +0 -0
  151. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/ashby.json +0 -0
  152. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/atlassian.json +0 -0
  153. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/beehiiv.json +0 -0
  154. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/brevo.json +0 -0
  155. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/buffer.json +0 -0
  156. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/calendly.json +0 -0
  157. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/clearbit.json +0 -0
  158. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/discord.json +0 -0
  159. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/dub.json +0 -0
  160. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/g2.json +0 -0
  161. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/github.json +0 -0
  162. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/gitlab.json +0 -0
  163. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/google.json +0 -0
  164. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/hubspot.json +0 -0
  165. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/hunter.json +0 -0
  166. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/instantly.json +0 -0
  167. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/intercom.json +0 -0
  168. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/keywords-everywhere.json +0 -0
  169. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/klaviyo-oauth.json +0 -0
  170. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/klaviyo.json +0 -0
  171. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/lemlist.json +0 -0
  172. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/linear.json +0 -0
  173. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/livestorm.json +0 -0
  174. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/mailchimp.json +0 -0
  175. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/mention-me.json +0 -0
  176. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/microsoft.json +0 -0
  177. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/notion.json +0 -0
  178. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/notion_dcr.json +0 -0
  179. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/openai.json +0 -0
  180. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/optimizely.json +0 -0
  181. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/postiz.json +0 -0
  182. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/postmark.json +0 -0
  183. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/resend.json +0 -0
  184. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/rewardful.json +0 -0
  185. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/savvycal.json +0 -0
  186. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/semrush.json +0 -0
  187. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/sendgrid.json +0 -0
  188. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/slack.json +0 -0
  189. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/tolt.json +0 -0
  190. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/typeform.json +0 -0
  191. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/wistia.json +0 -0
  192. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/x.json +0 -0
  193. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/bundled_providers/zapier.json +0 -0
  194. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/flows/__init__.py +0 -0
  195. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/flows/api_key.py +0 -0
  196. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/flows/base.py +0 -0
  197. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/flows/dcr_pkce.py +0 -0
  198. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/flows/device_code.py +0 -0
  199. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/flows/pkce.py +0 -0
  200. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/input_provider.py +0 -0
  201. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/models/__init__.py +0 -0
  202. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/models/config.py +0 -0
  203. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/models/connection.py +0 -0
  204. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/models/enums.py +0 -0
  205. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/models/provider.py +0 -0
  206. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/service.py +0 -0
  207. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/sessions.py +0 -0
  208. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/auth/utils.py +0 -0
  209. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/cli/__init__.py +0 -0
  210. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/cli/client.py +0 -0
  211. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/cli/client_config.py +0 -0
  212. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/cli/daemon_control.py +0 -0
  213. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/cli/helpers.py +0 -0
  214. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/errors.py +0 -0
  215. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/identity/__init__.py +0 -0
  216. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/identity/keys.py +0 -0
  217. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/identity/proof.py +0 -0
  218. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/identity/registry.py +0 -0
  219. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/paths.py +0 -0
  220. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/proxy/__init__.py +0 -0
  221. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/proxy/certs.py +0 -0
  222. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/proxy/router.py +0 -0
  223. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/proxy/runner.py +0 -0
  224. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/proxy/server.py +0 -0
  225. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/py.typed +0 -0
  226. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/server/__init__.py +0 -0
  227. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/server/app.py +0 -0
  228. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/server/daemon.py +0 -0
  229. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/server/dependencies.py +0 -0
  230. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/server/routes/__init__.py +0 -0
  231. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/server/routes/_deps.py +0 -0
  232. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/server/routes/auth.py +0 -0
  233. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/server/routes/connections.py +0 -0
  234. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/server/routes/identities.py +0 -0
  235. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/server/routes/providers.py +0 -0
  236. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/server/routes/proxy.py +0 -0
  237. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/server/routes/ui.py +0 -0
  238. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/server/schemas.py +0 -0
  239. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/server/ui/__init__.py +0 -0
  240. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/server/ui/pages.py +0 -0
  241. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/server/ui/web_theme.py +0 -0
  242. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/server/ui_sessions.py +0 -0
  243. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/server/urls.py +0 -0
  244. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/store/__init__.py +0 -0
  245. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/store/interfaces.py +0 -0
  246. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/store/local.py +0 -0
  247. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/ui/__init__.py +0 -0
  248. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/ui/static/app.js +0 -0
  249. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/ui/static/style.css +0 -0
  250. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/ui/templates/_app_detail_shell.html +0 -0
  251. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/ui/templates/_layout.html +0 -0
  252. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/ui/templates/app_detail_apikey.html +0 -0
  253. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/ui/templates/app_detail_disconnected.html +0 -0
  254. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/ui/templates/app_detail_oauth.html +0 -0
  255. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/ui/templates/connections.html +0 -0
  256. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/ui/templates/overview.html +0 -0
  257. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/utils.py +0 -0
  258. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/vault/__init__.py +0 -0
  259. {authsome-0.3.0 → authsome-0.3.1}/src/authsome/vault/crypto.py +0 -0
  260. {authsome-0.3.0 → authsome-0.3.1}/tests/__init__.py +0 -0
  261. {authsome-0.3.0 → authsome-0.3.1}/tests/auth/__init__.py +0 -0
  262. {authsome-0.3.0 → authsome-0.3.1}/tests/auth/test_flows.py +0 -0
  263. {authsome-0.3.0 → authsome-0.3.1}/tests/auth/test_models.py +0 -0
  264. {authsome-0.3.0 → authsome-0.3.1}/tests/auth/test_service.py +0 -0
  265. {authsome-0.3.0 → authsome-0.3.1}/tests/auth/test_service_provider_clients.py +0 -0
  266. {authsome-0.3.0 → authsome-0.3.1}/tests/auth/test_url_template.py +0 -0
  267. {authsome-0.3.0 → authsome-0.3.1}/tests/cli/__init__.py +0 -0
  268. {authsome-0.3.0 → authsome-0.3.1}/tests/cli/conftest.py +0 -0
  269. {authsome-0.3.0 → authsome-0.3.1}/tests/cli/test_client_signing.py +0 -0
  270. {authsome-0.3.0 → authsome-0.3.1}/tests/cli/test_daemon.py +0 -0
  271. {authsome-0.3.0 → authsome-0.3.1}/tests/cli/test_doctor.py +0 -0
  272. {authsome-0.3.0 → authsome-0.3.1}/tests/cli/test_get.py +0 -0
  273. {authsome-0.3.0 → authsome-0.3.1}/tests/cli/test_helpers.py +0 -0
  274. {authsome-0.3.0 → authsome-0.3.1}/tests/cli/test_identity.py +0 -0
  275. {authsome-0.3.0 → authsome-0.3.1}/tests/cli/test_import_env.py +0 -0
  276. {authsome-0.3.0 → authsome-0.3.1}/tests/cli/test_init.py +0 -0
  277. {authsome-0.3.0 → authsome-0.3.1}/tests/cli/test_list.py +0 -0
  278. {authsome-0.3.0 → authsome-0.3.1}/tests/cli/test_login.py +0 -0
  279. {authsome-0.3.0 → authsome-0.3.1}/tests/cli/test_logout.py +0 -0
  280. {authsome-0.3.0 → authsome-0.3.1}/tests/cli/test_register.py +0 -0
  281. {authsome-0.3.0 → authsome-0.3.1}/tests/cli/test_revoke.py +0 -0
  282. {authsome-0.3.0 → authsome-0.3.1}/tests/cli/test_ui.py +0 -0
  283. {authsome-0.3.0 → authsome-0.3.1}/tests/cli/test_whoami.py +0 -0
  284. {authsome-0.3.0 → authsome-0.3.1}/tests/common/__init__.py +0 -0
  285. {authsome-0.3.0 → authsome-0.3.1}/tests/common/test_audit.py +0 -0
  286. {authsome-0.3.0 → authsome-0.3.1}/tests/common/test_errors.py +0 -0
  287. {authsome-0.3.0 → authsome-0.3.1}/tests/common/test_logging.py +0 -0
  288. {authsome-0.3.0 → authsome-0.3.1}/tests/common/test_utils.py +0 -0
  289. {authsome-0.3.0 → authsome-0.3.1}/tests/conftest.py +0 -0
  290. {authsome-0.3.0 → authsome-0.3.1}/tests/identity/test_identity.py +0 -0
  291. {authsome-0.3.0 → authsome-0.3.1}/tests/identity/test_proof.py +0 -0
  292. {authsome-0.3.0 → authsome-0.3.1}/tests/proxy/__init__.py +0 -0
  293. {authsome-0.3.0 → authsome-0.3.1}/tests/proxy/test_proxy.py +0 -0
  294. {authsome-0.3.0 → authsome-0.3.1}/tests/server/test_auth_sessions.py +0 -0
  295. {authsome-0.3.0 → authsome-0.3.1}/tests/server/test_pop_auth.py +0 -0
  296. {authsome-0.3.0 → authsome-0.3.1}/tests/server/test_provider_operation_policy.py +0 -0
  297. {authsome-0.3.0 → authsome-0.3.1}/tests/server/test_ui_sessions.py +0 -0
  298. {authsome-0.3.0 → authsome-0.3.1}/tests/vault/__init__.py +0 -0
  299. {authsome-0.3.0 → authsome-0.3.1}/tests/vault/test_crypto.py +0 -0
  300. {authsome-0.3.0 → authsome-0.3.1}/uv.lock +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.3.1"
3
+ }
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.3.1](https://github.com/agentrhq/authsome/compare/authsome-v0.3.0...authsome-v0.3.1) (2026-05-17)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **cli:** resolve three CLI bugs and improve audit log command ([3b990e3](https://github.com/agentrhq/authsome/commit/3b990e3cae998d9ccaccb421b5cb577c2bb89de3))
9
+ * **cli:** resolve three CLI bugs, improve audit log, and sync docs ([dd9cad3](https://github.com/agentrhq/authsome/commit/dd9cad326cb2817826eb8e5b8bb42f5f3df8e2a2))
10
+
11
+
12
+ ### Documentation
13
+
14
+ * **cli:** sync reference and manual-testing guide with 0.3.0 implementation ([bdf659f](https://github.com/agentrhq/authsome/commit/bdf659ffffc0a0c2100cc21508daec042161656e))
15
+
3
16
  ## [0.3.0](https://github.com/agentrhq/authsome/compare/authsome-v0.2.4...authsome-v0.3.0) (2026-05-15)
4
17
 
5
18
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: authsome
3
- Version: 0.3.0
3
+ Version: 0.3.1
4
4
  Summary: A portable local authentication library for AI agents and developer tools
5
5
  Author-email: Manoj Bajaj <manojbajaj95@gmail.com>
6
6
  License-Expression: MIT
@@ -0,0 +1,253 @@
1
+ # CLI Design Review — authsome 0.3.0
2
+
3
+ _Generated: 2026-05-17_
4
+ _Scope: audit of the CLI surface against (1) published docs, (2) implementation, (3) industry conventions (clig.dev, gh, stripe, fly, kubectl)._
5
+
6
+ ---
7
+
8
+ ## Summary
9
+
10
+ Three categories of issues:
11
+
12
+ 1. **Docs vs. implementation gaps** — documented behavior that the code no longer matches.
13
+ 2. **Implementation bugs** — the code is broken relative to stated intent.
14
+ 3. **Design gaps vs. industry conventions** — opportunities to align with well-established patterns.
15
+
16
+ ---
17
+
18
+ ## 1. Docs vs. Implementation Gaps
19
+
20
+ ### 1a. Exit code table is completely wrong
21
+
22
+ **`docs/site/reference/cli.mdx` says:**
23
+
24
+ | Code | Meaning |
25
+ |------|---------|
26
+ | 2 | Invalid usage |
27
+ | 3 | Provider not found |
28
+ | 4 | Authentication failed |
29
+ | 5 | Credential missing |
30
+ | 6 | Refresh failed |
31
+ | 7 | Store unavailable |
32
+ | 8 | User cancelled credential entry |
33
+
34
+ **`src/authsome/utils.py:format_error_code` actually does:**
35
+
36
+ | Code | Exception(s) |
37
+ |------|------|
38
+ | 1 | Generic / unrecognized |
39
+ | 2 | `AuthenticationFailedError`, `InputCancelledError` |
40
+ | 3 | `ConnectionNotFoundError` |
41
+ | 4 | `ProviderNotFoundError`, `OperationNotAllowedError` |
42
+ | 5 | `CredentialMissingError`, `TokenExpiredError`, `RefreshFailedError` |
43
+ | 6 | `ConnectionAlreadyExistsError` |
44
+ | 7 | `ProviderAlreadyRegisteredError`, `FileExistsError` |
45
+ | 8 | `EndpointUnreachableError` |
46
+ | 9 | `DaemonUnavailableError` |
47
+
48
+ Every code from 2 onwards maps to a different error than documented. Scripts checking exit codes against the published table will behave incorrectly. The table in the docs needs a full replacement.
49
+
50
+ ---
51
+
52
+ ### 1b. `set-default` is a top-level command, not `connection set-default`
53
+
54
+ Docs say: `uvx authsome connection set-default <provider> <connection>`
55
+ CLI binary exposes: `authsome set-default <provider> <connection>` at the root
56
+
57
+ The `connection` namespace documented does not exist. Running `authsome connection set-default` raises an error.
58
+
59
+ ---
60
+
61
+ ### 1c. `doctor` check names have changed
62
+
63
+ Docs and manual-testing guide mention checks named `config`, `providers`, `vault`.
64
+ Current implementation returns: `spec_version`, `identity`, `providers`, `connections`, `vault`, `integrity`.
65
+ `config` is gone. Three new checks are present and undocumented.
66
+
67
+ ---
68
+
69
+ ### 1d. `--log-file` default path is wrong in docs
70
+
71
+ Docs say default: `~/.authsome/logs/authsome.log`.
72
+ `--help` output shows: `~/.authsome/client/logs/authsome.log`.
73
+
74
+ ---
75
+
76
+ ### 1e. `profile` command exists but is not documented
77
+
78
+ `authsome profile` with subcommands `create` and `use` appears in the CLI but is absent from `docs/site/reference/cli.mdx`.
79
+
80
+ ---
81
+
82
+ ### 1f. `export` has a `shell` format not documented
83
+
84
+ `authsome export --format` accepts `env`, `json`, and `shell`.
85
+ The CLI reference documents only `env` and `json`.
86
+
87
+ ---
88
+
89
+ ### 1g. `daemon logs` subcommand — docs show `-n 100`, actual flag is different
90
+
91
+ Docs say `authsome daemon logs [-n 100]`. Actual `authsome log` (client log command) uses `-n / --lines COUNT`.
92
+ These are two different commands (`daemon logs` tails the daemon log; `log` tails the client audit log) — the distinction and both flags need clear documentation.
93
+
94
+ ---
95
+
96
+ ## 2. Implementation Bugs
97
+
98
+ ### 2a. `doctor` renders `spec_version` as FAIL on every healthy system
99
+
100
+ **Location:** `src/authsome/cli/main.py:930`, `src/authsome/server/routes/health.py:32`
101
+
102
+ The server stores the spec version number as the value:
103
+ ```python
104
+ checks["spec_version"] = str(current_spec_version()) # → "3"
105
+ ```
106
+
107
+ The CLI checks `val == "ok"` for every key, so `"3" != "ok"` always renders `FAIL` even on a healthy install.
108
+
109
+ **Fix (server side):** Return `"ok"` for a passing check; surface the version number in a separate key (e.g., `spec_version_number: "3"`).
110
+ **Fix (CLI side):** Treat `spec_version` as a special case that passes when the value is a numeric string.
111
+
112
+ ---
113
+
114
+ ### 2b. `--force` on `register` does not skip the confirmation prompt
115
+
116
+ **Location:** `src/authsome/cli/main.py:698–733`
117
+
118
+ The confirmation prompt checks only `yes` flag, not `force`. Running `authsome register --force` still prompts interactively; piping no input causes a generic failure (exit 1, no useful message).
119
+
120
+ The `--force` flag is forwarded only to the server for the duplicate-override check. The client prompt is never bypassed.
121
+
122
+ **Current state:** `--force` and `--yes` have different, non-overlapping effects. A full "force overwrite silently" requires `--force --yes`.
123
+ **Fix:** Either document the split explicitly in both `--help` and docs, or make `--force` imply `--yes` (the more ergonomic convention — `docker rm -f` and `git push --force` do not prompt).
124
+
125
+ ---
126
+
127
+ ### 2c. `--quiet` silences ALL output, including primary data
128
+
129
+ **Location:** `src/authsome/cli/context.py:52–54`
130
+
131
+ `echo()` returns immediately when `quiet=True`. This means `authsome --quiet list` produces zero output — the provider table is suppressed alongside any informational banners.
132
+
133
+ **Industry convention (clig.dev, gh):** `--quiet` suppresses status messages, progress indicators, and banners. It does NOT suppress the primary result (data rows, IDs, URLs). Errors always print to stderr regardless of `--quiet`.
134
+
135
+ **Fix:** Split `echo()` into a data path (`emit()`) and an info path (`note()`). Apply `quiet` suppression only to `note()`.
136
+
137
+ ---
138
+
139
+ ### 2d. `daemon stop` reports stopped but daemon immediately restarts
140
+
141
+ `authsome daemon stop` outputs "Daemon stopped." and exits 0, but a subsequent `authsome daemon status` shows `running: true` within milliseconds. The guide test for `running: false` after stop cannot pass.
142
+
143
+ Whether this is supervision auto-restart or a race in the status check is not confirmed, but the CLI output creates a misleading state. Either the daemon should indicate it will restart, or the stop command should wait for the process to actually stop before returning.
144
+
145
+ ---
146
+
147
+ ## 3. Design Gaps vs. Industry Conventions
148
+
149
+ ### 3a. `inspect` and `get` serve overlapping purposes
150
+
151
+ Current situation:
152
+ - `authsome get <provider>` — returns connection metadata; secrets redacted; accepts `--field`, `--show-secret`, `--json`
153
+ - `authsome inspect <provider>` — returns full provider definition + connection summary as JSON (always)
154
+
155
+ This creates confusion: users must know that `get` is for connection state and `inspect` is for provider config. The `--json` flag on `inspect` is redundant because `inspect` always outputs JSON.
156
+
157
+ **Convention (kubectl, docker, gh):**
158
+ - `describe` / `inspect` — human-readable detail combining metadata and context
159
+ - `get` — scriptable, machine-readable fetch
160
+
161
+ **Recommendation:** Make `inspect` human-readable (like `kubectl describe`) and `get` the JSON-native scriptable path. Or merge into a single `show <provider>` command that defaults to human-readable and accepts `--json`. Either way, the two commands should not both exist at the same conceptual level without a clear, documented distinction.
162
+
163
+ ---
164
+
165
+ ### 3b. `--force` and `--yes` semantics need to follow convention
166
+
167
+ Industry standard (clig.dev, `gh`, `fly`):
168
+ - `--yes` / `-y`: skip interactive confirmation prompts
169
+ - `--force` / `-f`: override a safety constraint the tool would otherwise refuse
170
+
171
+ Currently, `register --force` means "server-side overwrite" and `register --yes` means "skip client prompt" — this is a valid split, but it's not what most users expect when they reach for `--force`. The `--help` text for `--force` says "Force overwrite if provider exists" which implies the prompt is also skipped.
172
+
173
+ **Recommendation:** `--force` should imply `--yes` (skips the prompt AND forces the overwrite). If the server-side distinction must be preserved, document it explicitly or rename the server-side flag to `--overwrite` internally.
174
+
175
+ ---
176
+
177
+ ### 3c. `set-default` should be under a command group
178
+
179
+ `authsome set-default <provider> <connection>` at the top level is an outlier. It's a CRUD operation on a connection property, and the docs already (correctly) document it as `connection set-default`.
180
+
181
+ **Convention (gh, kubectl, fly):** CRUD on a sub-resource belongs under a noun group. `kubectl label node`, `gh repo set-default`, `fly machine update` all group the resource type first.
182
+
183
+ **Recommendation:** Implement `authsome connection set-default` as documented (or `authsome connection default <provider> <connection>` for a simpler form). Remove or alias the flat `set-default`.
184
+
185
+ ---
186
+
187
+ ### 3d. Exit code range is too wide
188
+
189
+ The current scheme uses codes 1–9. `sysexits.h` reserves 64–78 for application errors; POSIX reserves 126–128+ for shell-level errors. Codes 1–9 are in the safe application range, but:
190
+
191
+ - Code 2 is used for `AuthenticationFailedError` — but shells and Click both use 2 for "usage error / bad arguments". This clash means a usage error and an authentication failure are indistinguishable.
192
+ - `gh` uses only 0, 1, 2, 4 and documents them clearly.
193
+
194
+ **Recommendation:** Reserve 2 strictly for argument/usage errors (Click's default). Shift application errors to 3–9 (or adopt `sysexits.h` 64+ for a cleaner split). Update the docs table to match.
195
+
196
+ ---
197
+
198
+ ### 3e. `--json` is redundant on `inspect` and missing on `daemon status`
199
+
200
+ - `inspect` always outputs JSON regardless of `--json` flag. The flag is a no-op but appears in `--help`, misleading users.
201
+ - `daemon status` always outputs JSON. There is no human-readable plain-text mode for `daemon status`.
202
+
203
+ **Recommendation:**
204
+ - `inspect` should have a human-readable default and use `--json` to switch to machine output (like every other command).
205
+ - `daemon status` should follow the same pattern — plain text summary by default, `--json` for structured output.
206
+
207
+ ---
208
+
209
+ ### 3f. `remove` help text doesn't mention bundled providers
210
+
211
+ `authsome remove --help` says "Permanently uninstall the specified custom PROVIDER definition."
212
+ The CLI reference says `remove` also "resets to bundled" when used on a bundled provider.
213
+
214
+ If the behavior differs for bundled vs. custom providers, the `--help` text should say so. Users who accidentally run `authsome remove github` should know whether they're deleting something permanently or just resetting to defaults.
215
+
216
+ ---
217
+
218
+ ## Recommended Priority Order
219
+
220
+ | Priority | Item | Effort |
221
+ |----------|------|--------|
222
+ | P0 | Fix `doctor` `spec_version: FAIL` rendering bug | Small |
223
+ | P0 | Fix exit code documentation table | Small |
224
+ | P1 | Fix `--quiet` — stop suppressing data output | Medium |
225
+ | P1 | Fix `--force` on `register` — imply `--yes` or document split | Small |
226
+ | P1 | Add `connection set-default` subgroup (or alias to match docs) | Small |
227
+ | P1 | Document `profile` command, `shell` export format, corrected `--log-file` path | Small |
228
+ | P2 | Resolve `inspect` vs `get` overlap — pick a clear model | Medium |
229
+ | P2 | Add human-readable default to `inspect` and `daemon status` | Medium |
230
+ | P2 | Fix `daemon stop` — wait for actual stop before returning | Medium |
231
+ | P2 | Fix exit code 2 clash with Click usage errors | Small |
232
+ | P3 | Update manual-testing.md to match current check names and exit codes | Small |
233
+
234
+ ---
235
+
236
+ ## Correct Exit Code Table (matches `format_error_code` as-is)
237
+
238
+ Replace the table in `docs/site/reference/cli.mdx`:
239
+
240
+ | Code | Meaning | Error class |
241
+ |------|---------|-------------|
242
+ | 0 | Success | — |
243
+ | 1 | Unexpected failure | Unclassified exceptions |
244
+ | 2 | Authentication failed or input cancelled | `AuthenticationFailedError`, `InputCancelledError` |
245
+ | 3 | Connection not found | `ConnectionNotFoundError` |
246
+ | 4 | Provider not found or operation not allowed | `ProviderNotFoundError`, `OperationNotAllowedError` |
247
+ | 5 | Credential missing or token expired | `CredentialMissingError`, `TokenExpiredError`, `RefreshFailedError` |
248
+ | 6 | Connection already exists | `ConnectionAlreadyExistsError` |
249
+ | 7 | Provider already registered | `ProviderAlreadyRegisteredError` |
250
+ | 8 | Endpoint unreachable | `EndpointUnreachableError` |
251
+ | 9 | Daemon unavailable | `DaemonUnavailableError` |
252
+
253
+ Note: Click argument validation errors (missing required argument, unknown option) produce exit code 2 via Click's own mechanism — this overlaps with `AuthenticationFailedError`. Consider shifting application codes up by one (3 → authentication, 4 → connection not found, …) to cleanly reserve 2 for usage errors.
@@ -32,13 +32,13 @@ uv run authsome whoami --json
32
32
  uv run authsome doctor
33
33
  ```
34
34
 
35
- **Expected:** Exit code `0`; `OK` printed for `config`, `providers`, `vault`.
35
+ **Expected:** Exit code `0`; `OK` printed for `spec_version`, `identity`, `providers`, `connections`, `vault`, `integrity`.
36
36
 
37
37
  ```bash
38
38
  uv run authsome doctor --json
39
39
  ```
40
40
 
41
- **Expected:** `{"status": "ready", "checks": {"config": "ok", ...}}`.
41
+ **Expected:** `{"status": "ready", "checks": {"spec_version": "ok", "identity": "ok", "providers": "ok", "connections": "ok", "vault": "ok", "integrity": "ok"}}`.
42
42
 
43
43
  ---
44
44
 
@@ -220,26 +220,32 @@ uv run authsome run --quiet curl -s https://api.resend.com/domains
220
220
  uv run authsome log
221
221
  ```
222
222
 
223
- **Expected:** Recent audit entries as newline-delimited JSON objects with `timestamp`, `event`, `provider`, `status`.
223
+ **Expected:** Human-readable table of recent audit entries with columns `Timestamp`, `Event`, `Provider`, `Status`. Shows "No audit entries found." if empty.
224
224
 
225
225
  ```bash
226
226
  uv run authsome log -n 5
227
227
  ```
228
228
 
229
- **Expected:** Last 5 entries only.
229
+ **Expected:** Last 5 entries only (same table format).
230
230
 
231
231
  ```bash
232
232
  uv run authsome log -n 5 --json
233
233
  ```
234
234
 
235
- **Expected:** Same entries as a JSON array.
235
+ **Expected:** JSON object with `log_file` path and `entries` array of parsed audit event objects, each with `timestamp`, `event`, `provider`, `status`.
236
+
237
+ ```bash
238
+ uv run authsome log --raw -n 10
239
+ ```
240
+
241
+ **Expected:** Last 10 lines of the raw client debug log (loguru format).
236
242
 
237
243
  ---
238
244
 
239
245
  ## 11. Connection Management
240
246
 
241
247
  ```bash
242
- uv run authsome connection set-default github default
248
+ uv run authsome set-default github default
243
249
  ```
244
250
 
245
251
  **Expected:** Confirmation that `default` is now the default connection for `github`.
@@ -279,11 +285,11 @@ uv run authsome list | grep test-custom
279
285
  **Expected:** Listed under `custom` source, `not_connected`.
280
286
 
281
287
  ```bash
282
- # Register again to test --force
288
+ # Register again to test --force (overwrites without prompting)
283
289
  uv run authsome register /tmp/test-provider.json --force
284
290
  ```
285
291
 
286
- **Expected:** Overwrites existing without prompting for overwrite confirmation.
292
+ **Expected:** Registers immediately, no confirmation prompt, no error.
287
293
 
288
294
  ```bash
289
295
  uv run authsome remove test-custom
@@ -372,19 +378,19 @@ uv run authsome --verbose get github
372
378
  uv run authsome login doesnotexist 2>&1; echo "exit: $?"
373
379
  ```
374
380
 
375
- **Expected:** `ProviderNotFoundError`, exit code `3`.
381
+ **Expected:** `ProviderNotFoundError`, exit code `4`.
376
382
 
377
383
  ```bash
378
384
  uv run authsome inspect doesnotexist 2>&1; echo "exit: $?"
379
385
  ```
380
386
 
381
- **Expected:** `ProviderNotFoundError`, exit code `3`.
387
+ **Expected:** `ProviderNotFoundError`, exit code `4`.
382
388
 
383
389
  ```bash
384
390
  uv run authsome logout doesnotexist 2>&1; echo "exit: $?"
385
391
  ```
386
392
 
387
- **Expected:** `ProviderNotFoundError`, exit code `3`.
393
+ **Expected:** `ProviderNotFoundError`, exit code `4`.
388
394
 
389
395
  ```bash
390
396
  # Missing required argument
@@ -399,7 +405,7 @@ uv run authsome logout resend
399
405
  uv run authsome get resend 2>&1; echo "exit: $?"
400
406
  ```
401
407
 
402
- **Expected:** Non-zero exit; message indicates no connection found.
408
+ **Expected:** `ConnectionNotFoundError`, exit code `3`.
403
409
 
404
410
  ---
405
411
 
@@ -9,22 +9,23 @@ All commands support `--json` for machine-readable output, `--quiet` to suppress
9
9
 
10
10
  | Command | Description |
11
11
  |---------|-------------|
12
- | `whoami` | Show home directory and encryption mode. |
13
- | `doctor` | Run health checks on directory layout and encryption. |
12
+ | `whoami` | Show local identity context and encryption mode. |
13
+ | `doctor` | Run health checks on identity, providers, vault, and store integrity. |
14
14
  | `list` | List all providers (bundled and custom) and their connection states. |
15
15
  | `inspect <provider>` | Show the full provider definition and any connections. |
16
16
  | `login <provider>` | Authenticate with a provider using its configured flow. |
17
17
  | `get <provider>` | Get connection metadata (secrets redacted by default). |
18
- | `export <provider>` | Export credentials in `env` or `json` format. |
18
+ | `export <provider>` | Export credentials in `env`, `shell`, or `json` format. |
19
19
  | `run -- <cmd>` | Run a subprocess behind the local auth proxy. |
20
20
  | `scan` | Discover provider API keys in env files and the current environment. |
21
21
  | `logout <provider>` | Log out of a connection and remove local state. |
22
22
  | `revoke <provider>` | Reset all connections and client secrets for the provider. |
23
23
  | `remove <provider>` | Uninstall a custom provider or reset a bundled one. |
24
24
  | `register <path>` | Register a custom provider from a JSON file. |
25
- | `connection set-default <provider> <connection>` | Set the default connection for a provider. |
25
+ | `set-default <provider> <connection>` | Set the default connection for a provider. |
26
+ | `profile` | Manage local profiles backed by identity keys. |
26
27
  | `ui` | Open the dashboard in the browser. |
27
- | `log` | View the audit log. |
28
+ | `log` | View structured audit entries. |
28
29
  | `daemon <subcommand>` | Manage the local daemon: `serve`, `start`, `stop`, `restart`, `status`, `logs`. |
29
30
 
30
31
  ## Global flags
@@ -32,32 +33,42 @@ All commands support `--json` for machine-readable output, `--quiet` to suppress
32
33
  | Flag | Description |
33
34
  |------|-------------|
34
35
  | `--json` | Output in machine-readable JSON. |
35
- | `--quiet` | Suppress non-essential output. |
36
+ | `--quiet` | Suppress non-essential output (banners, status messages). Primary data rows always print. |
36
37
  | `--no-color` | Disable ANSI colors. |
37
38
  | `-v`, `--version` | Print the authsome version. |
38
39
  | `--verbose` | Enable DEBUG logging to stderr. |
39
- | `--log-file <path>` | Path for the rotating log file. Pass `""` to disable. Default: `~/.authsome/logs/authsome.log`. |
40
+ | `--log-file <path>` | Path for the rotating client debug log file. Pass `""` to disable. Default: `~/.authsome/client/logs/authsome.log`. |
40
41
 
41
42
  ## Command details
42
43
 
43
44
  ### `whoami` / `doctor`
44
45
 
45
46
  ```bash
46
- uvx authsome whoami # show home directory and encryption mode
47
+ uvx authsome whoami # show identity context and encryption mode
47
48
  uvx authsome doctor # run health checks
49
+ uvx authsome doctor --json # structured output for monitoring
48
50
  ```
49
51
 
50
- `doctor` exits with `0` if all checks pass and a non-zero code otherwise. Use `--json` for structured output suitable for monitoring.
52
+ `doctor` runs six checks and exits `0` when all pass:
53
+
54
+ | Check | What it verifies |
55
+ |-------|-----------------|
56
+ | `spec_version` | Server spec version is compatible |
57
+ | `identity` | Active identity key is present and readable |
58
+ | `providers` | Provider registry loads without error |
59
+ | `connections` | Connection store is accessible |
60
+ | `vault` | Vault roundtrip (put / get / delete) succeeds |
61
+ | `integrity` | Store integrity check passes |
51
62
 
52
63
  ### `list` / `inspect`
53
64
 
54
65
  ```bash
55
66
  uvx authsome list # all providers + connection states
56
- uvx authsome inspect github # full provider definition
57
- uvx authsome inspect github --json # same, as JSON
67
+ uvx authsome list --json # machine-readable, bundled + custom arrays
68
+ uvx authsome inspect github # full provider definition + connections as JSON
58
69
  ```
59
70
 
60
- `list` shows three states per provider. `available`, `configured`, `connected`. See [Credential storage](/concepts/credential-storage#the-three-states) for the state model.
71
+ `--quiet` suppresses the summary header (`Providers: N total, N connected`) but always prints the table.
61
72
 
62
73
  ### `login`
63
74
 
@@ -71,7 +82,7 @@ uvx authsome login <provider> [OPTIONS]
71
82
  | `--connection <name>` | Connection name. Default: `default`. |
72
83
  | `--scopes <s1,s2>` | Comma-separated scopes to request. |
73
84
  | `--base-url <url>` | Override the base URL for multi-tenant providers. |
74
- | `--force` | Overwrite an existing connection. |
85
+ | `--force` | Overwrite an existing connection without prompting. |
75
86
 
76
87
  Examples:
77
88
 
@@ -84,7 +95,7 @@ uvx authsome login github --base-url https://github.acme.com # GitHub Enterpri
84
95
  ```
85
96
 
86
97
  <Warning>
87
- Sensitive values. `client_secret`, API keys, are never accepted as command-line arguments. Authsome collects them through the secure browser bridge or, on headless machines, through masked terminal input.
98
+ Sensitive values `client_secret`, API keys are never accepted as command-line arguments. Authsome collects them through the secure browser bridge or, on headless machines, through masked terminal input.
88
99
  </Warning>
89
100
 
90
101
  ### `get`
@@ -96,7 +107,7 @@ uvx authsome get <provider> [OPTIONS]
96
107
  | Option | Description |
97
108
  |--------|-------------|
98
109
  | `--connection <name>` | Connection name. Default: `default`. |
99
- | `--field <field>` | Return only a specific field. |
110
+ | `--field <field>` | Return only the value of a specific field. |
100
111
  | `--show-secret` | Reveal encrypted secret values in output. |
101
112
 
102
113
  ```bash
@@ -114,14 +125,15 @@ uvx authsome export <provider> [OPTIONS]
114
125
  | Option | Description |
115
126
  |--------|-------------|
116
127
  | `--connection <name>` | Connection name. Default: `default`. |
117
- | `--format <fmt>` | Output format: `env` (default) or `json`. |
128
+ | `--format <fmt>` | Output format: `env` (default), `shell`, or `json`. |
118
129
 
119
130
  ```bash
120
- uvx authsome export github --format env # KEY=value lines
121
- uvx authsome export openai --format json # JSON object
131
+ uvx authsome export github --format env # KEY=value lines
132
+ uvx authsome export github --format shell # export KEY=value (sourceable)
133
+ uvx authsome export openai --format json # JSON object
122
134
  ```
123
135
 
124
- Only the `access_token` (OAuth2) or `api_key` (API-key) is exported. Refresh tokens are never exposed, authsome handles refresh transparently.
136
+ Only the `access_token` (OAuth2) or `api_key` (API-key) is exported. Refresh tokens are never exposed authsome handles refresh transparently.
125
137
 
126
138
  ### `run`
127
139
 
@@ -170,18 +182,27 @@ uvx authsome scan --import --connection ci # import into a named connection
170
182
 
171
183
  `scan` does not support `--quiet`. Use `--json` for headless contexts.
172
184
 
173
- ### `connection set-default`
185
+ ### `set-default`
174
186
 
175
187
  ```bash
176
- uvx authsome connection set-default <provider> <connection>
188
+ uvx authsome set-default <provider> <connection>
177
189
  ```
178
190
 
179
191
  Sets the default connection for a provider. The proxy and library calls use the default unless an explicit `--connection` flag is passed.
180
192
 
181
193
  ```bash
182
- uvx authsome connection set-default github work
194
+ uvx authsome set-default github work
183
195
  ```
184
196
 
197
+ ### `profile`
198
+
199
+ ```bash
200
+ uvx authsome profile create # create a new local profile keypair
201
+ uvx authsome profile use # switch the active local profile
202
+ ```
203
+
204
+ Profiles are backed by Ed25519 identity keys at `~/.authsome/identities/`. Each profile has its own credential namespace in the vault. See [Profiles vs Connections](/concepts/profiles-vs-connections) for the distinction.
205
+
185
206
  ### `ui`
186
207
 
187
208
  ```bash
@@ -205,7 +226,7 @@ uvx authsome daemon logs [-n 100]
205
226
 
206
227
  - `serve` runs the daemon in the foreground (blocks the terminal).
207
228
  - `start` / `stop` / `restart` manage a background daemon.
208
- - `status` prints PID, base URL, and uptime.
229
+ - `status` prints health, PID file path, and log file path as JSON.
209
230
  - `logs` tails the daemon log file.
210
231
 
211
232
  ### `logout` / `revoke` / `remove`
@@ -214,7 +235,7 @@ uvx authsome daemon logs [-n 100]
214
235
  |---------|-------------|-----------------|
215
236
  | `logout` | Removes the connection record | Not contacted |
216
237
  | `revoke` | Removes all connections + client credentials | Calls revocation endpoint where supported |
217
- | `remove` | Removes the provider entirely (custom) or resets to bundled (bundled) | Not contacted |
238
+ | `remove` | Removes the provider entirely (custom) or resets to bundled default (bundled) | Not contacted |
218
239
 
219
240
  ```bash
220
241
  uvx authsome logout github --connection work
@@ -225,35 +246,53 @@ uvx authsome remove acmecrm
225
246
  ### `register`
226
247
 
227
248
  ```bash
228
- uvx authsome register <path/to/provider.json> [--yes] [--force]
249
+ uvx authsome register <path/to/provider.json> [OPTIONS]
229
250
  ```
230
251
 
231
- Validates the JSON, copies it into `~/.authsome/providers/`, and confirms the new provider appears in `authsome list`. Use `--yes` to skip the confirmation prompt in scripts, and `--force` to overwrite an existing provider with the same name.
252
+ | Option | Description |
253
+ |--------|-------------|
254
+ | `--force` | Overwrite an existing provider with the same name without prompting. |
255
+ | `--yes` | Skip the confirmation prompt (without forcing an overwrite). |
256
+
257
+ Validates the JSON, copies it into `~/.authsome/providers/`, and confirms the new provider appears in `authsome list`.
258
+
259
+ ```bash
260
+ uvx authsome register ./acme.json # prompt before registering
261
+ uvx authsome register ./acme.json --force # overwrite existing, no prompt
262
+ uvx authsome register ./acme.json --yes # skip prompt, fail if already exists
263
+ ```
232
264
 
233
265
  See [Custom providers](/guides/custom-providers) for full templates.
234
266
 
235
267
  ### `log`
236
268
 
237
269
  ```bash
238
- uvx authsome log # last 50 audit entries
239
- uvx authsome log -n 200 # last 200
240
- uvx authsome log --json # one JSON object per line, parsed
270
+ uvx authsome log # last 50 structured audit entries
271
+ uvx authsome log -n 200 # last 200 entries
272
+ uvx authsome log --json # entries as a parsed JSON array
273
+ uvx authsome log --raw # raw client debug log (loguru format)
274
+ uvx authsome log --raw -n 20 # last 20 lines of the client debug log
241
275
  ```
242
276
 
243
- Reads from `~/.authsome/audit.log`. Each entry records actions like `login`, `logout`, `revoke`, `export`, and `get --show-secret`.
277
+ Reads from `~/.authsome/server/logs/authsome.log` (the server-side structured audit log). Each entry records actions like `login`, `logout`, `revoke`, `export`, and `get --show-secret`, with fields: `timestamp`, `event`, `provider`, `connection`, `identity`, `status`.
278
+
279
+ The `--raw` flag switches to the client-side debug log at `~/.authsome/client/logs/authsome.log` (loguru format, DEBUG level).
244
280
 
245
281
  ## Exit codes
246
282
 
247
- | Code | Meaning |
248
- |------|---------|
249
- | `0` | Success |
250
- | `1` | Generic failure |
251
- | `2` | Invalid usage |
252
- | `3` | Provider not found |
253
- | `4` | Authentication failed |
254
- | `5` | Credential missing |
255
- | `6` | Refresh failed |
256
- | `7` | Store unavailable |
257
- | `8` | User cancelled credential entry |
258
-
259
- When `--json` is passed and a command fails, the structured output includes an `error` and `message` key on stderr-friendly format.
283
+ | Code | Meaning | Error class |
284
+ |------|---------|-------------|
285
+ | `0` | Success | — |
286
+ | `1` | Unexpected failure | Unclassified exceptions |
287
+ | `2` | Authentication failed or input cancelled | `AuthenticationFailedError`, `InputCancelledError` |
288
+ | `3` | Connection not found | `ConnectionNotFoundError` |
289
+ | `4` | Provider not found or operation not allowed | `ProviderNotFoundError`, `OperationNotAllowedError` |
290
+ | `5` | Credential missing or token expired | `CredentialMissingError`, `TokenExpiredError`, `RefreshFailedError` |
291
+ | `6` | Connection already exists | `ConnectionAlreadyExistsError` |
292
+ | `7` | Provider already registered | `ProviderAlreadyRegisteredError` |
293
+ | `8` | Endpoint unreachable | `EndpointUnreachableError` |
294
+ | `9` | Daemon unavailable | `DaemonUnavailableError` |
295
+
296
+ Note: Click argument validation errors (missing required argument, unknown option) also produce exit code `2` via Click's own mechanism.
297
+
298
+ When `--json` is passed and a command fails, the structured output includes `"error"` and `"message"` keys.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "authsome"
7
- version = "0.3.0"
7
+ version = "0.3.1"
8
8
  description = "A portable local authentication library for AI agents and developer tools"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -56,6 +56,12 @@ class ContextObj:
56
56
  color = None
57
57
  click.secho(message, err=err, fg=color, nl=nl)
58
58
 
59
+ def emit(self, message: str, color: str | None = None, nl: bool = True) -> None:
60
+ """Print primary data output. Never suppressed by --quiet; respects --no-color."""
61
+ if self.no_color:
62
+ color = None
63
+ click.secho(message, fg=color, nl=nl)
64
+
59
65
 
60
66
  pass_ctx = click.make_pass_decorator(ContextObj)
61
67