affinity-sdk 2.0.3__tar.gz → 2.0.5__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 (719) hide show
  1. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/.github/workflows/plugin-build.yml +2 -0
  2. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/.github/workflows/plugin-release.yml +2 -0
  3. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/.github/workflows/release.yml +2 -0
  4. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/CHANGELOG.md +232 -1
  5. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/PKG-INFO +42 -37
  6. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/README.md +41 -36
  7. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/VERSIONING.md +21 -10
  8. affinity_sdk-2.0.5/affinity/cli/async_utils.py +44 -0
  9. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/commands/company_cmds.py +7 -2
  10. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/commands/config_cmds.py +29 -4
  11. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/commands/field_cmds.py +120 -13
  12. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/commands/file_url_cmd.py +1 -1
  13. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/commands/interaction_cmds.py +3 -1
  14. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/commands/list_cmds.py +181 -28
  15. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/commands/note_cmds.py +3 -1
  16. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/commands/opportunity_cmds.py +4 -2
  17. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/commands/person_cmds.py +16 -3
  18. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/commands/query_cmd.py +188 -118
  19. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/commands/reminder_cmds.py +3 -1
  20. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/confirm.py +32 -6
  21. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/context.py +59 -35
  22. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/entity_search.py +5 -1
  23. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/field_utils.py +62 -17
  24. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/help_json.py +3 -1
  25. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/interaction_utils.py +26 -13
  26. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/query/aggregates.py +54 -15
  27. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/query/cursor.py +45 -13
  28. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/query/executor.py +385 -371
  29. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/query/models.py +3 -0
  30. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/query/output.py +285 -37
  31. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/render.py +1 -1
  32. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/results.py +4 -0
  33. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/runner.py +3 -0
  34. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/client.py +37 -4
  35. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/clients/http.py +50 -9
  36. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/compare.py +17 -7
  37. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/models/entities.py +65 -7
  38. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/models/pagination.py +53 -47
  39. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/models/types.py +13 -1
  40. affinity_sdk-2.0.5/affinity/services/_batch_interactions.py +92 -0
  41. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/services/_field_updates.py +12 -4
  42. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/services/_org_reads.py +73 -1
  43. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/services/companies.py +103 -42
  44. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/services/lists.py +118 -56
  45. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/services/opportunities.py +47 -24
  46. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/services/org.py +20 -1
  47. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/services/persons.py +122 -31
  48. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/services/reminders.py +26 -5
  49. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/services/tasks.py +10 -8
  50. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/services/v1_only.py +22 -15
  51. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/services/webhooks.py +14 -1
  52. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/cli-development-guide.md +3 -1
  53. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/cli/commands.md +248 -73
  54. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/cli/index.md +16 -8
  55. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/cli/scripting.md +2 -1
  56. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/examples.md +3 -3
  57. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/glossary.md +6 -6
  58. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/guides/affinity-official-mcp-comparison.md +2 -3
  59. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/guides/api-versions-and-routing.md +13 -8
  60. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/guides/api-versions.md +18 -5
  61. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/guides/authentication.md +16 -7
  62. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/guides/claude-code-plugins.md +10 -4
  63. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/guides/configuration.md +5 -3
  64. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/guides/debugging-hooks.md +3 -0
  65. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/guides/errors-and-retries.md +1 -1
  66. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/guides/field-types-and-values.md +4 -1
  67. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/guides/field-values.md +36 -0
  68. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/guides/filtering.md +5 -1
  69. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/guides/pagination.md +3 -0
  70. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/guides/performance.md +1 -1
  71. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/guides/query-command.md +6 -3
  72. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/guides/sync-vs-async.md +4 -0
  73. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/index.md +16 -2
  74. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/reference/services/companies.md +23 -0
  75. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/reference/services/persons.md +9 -0
  76. affinity_sdk-2.0.5/docs/public/reference/services/transcripts.md +3 -0
  77. affinity_sdk-2.0.5/docs/public/reference/services/v1/auth.md +5 -0
  78. affinity_sdk-2.0.5/docs/public/reference/services/v1/field-values.md +8 -0
  79. affinity_sdk-2.0.5/docs/public/reference/services/v1/fields.md +6 -0
  80. affinity_sdk-2.0.5/docs/public/reference/services/v1/interactions.md +7 -0
  81. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.claude-plugin/plugin.json +1 -1
  82. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.claude-plugin/skills/pipeline-history/SKILL.md +4 -2
  83. affinity_sdk-2.0.5/mcp/.mcp-bash/VERSION +1 -0
  84. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/core.sh +3 -0
  85. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/runtime.sh +4 -1
  86. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/tools.sh +3 -1
  87. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/tools_policy.sh +48 -11
  88. affinity_sdk-2.0.5/mcp/.mcp-bash/vendor.json +1 -0
  89. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.registry/commands.generated.json +12 -47
  90. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.registry/mcp-commands.json +1 -5
  91. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/CHANGELOG.md +62 -1
  92. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/COMPATIBILITY +16 -2
  93. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/Makefile +3 -0
  94. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/README.md +12 -9
  95. affinity_sdk-2.0.5/mcp/VERSION +1 -0
  96. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/lib/cache.sh +26 -4
  97. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/lib/cli-gateway.sh +7 -5
  98. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/lib/common.sh +23 -52
  99. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/mcp-bash.lock +2 -2
  100. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/resources/data-model/data-model.md +11 -8
  101. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/server.d/env.sh +3 -2
  102. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/server.d/requirements.json +1 -1
  103. affinity_sdk-2.0.5/mcp/server.d/server.meta.json +12 -0
  104. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/tools/execute-read-command/tool.sh +9 -8
  105. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/tools/execute-write-command/tool.sh +41 -22
  106. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/tools/query/tool.meta.json +1 -1
  107. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/tools/query/tool.sh +24 -17
  108. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/xaffinity-mcp.sh +11 -6
  109. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mkdocs.yml +8 -8
  110. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/plugins/affinity-sdk/.claude-plugin/plugin.json +1 -1
  111. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/plugins/affinity-sdk/.claude-plugin/skills/affinity-python-sdk/SKILL.md +2 -1
  112. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/plugins/affinity-sdk/.claude-plugin/skills/affinity-python-sdk/references/services.md +33 -1
  113. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/plugins/xaffinity-cli/.claude-plugin/plugin.json +1 -1
  114. affinity_sdk-2.0.5/plugins/xaffinity-cli/hooks/guard-env-read.sh +53 -0
  115. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/plugins/xaffinity-cli/hooks/pre-xaffinity.sh +2 -2
  116. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/plugins/xaffinity-cli/hooks/session-setup.sh +7 -2
  117. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/SKILL.md +5 -5
  118. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/files-and-writes.md +1 -1
  119. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/filtering.md +5 -1
  120. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/history-and-activity.md +4 -0
  121. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/setup.md +11 -6
  122. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/pyproject.toml +1 -1
  123. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/cli/test_company_create_dedup.py +9 -9
  124. affinity_sdk-2.0.5/tests/cowork/cassettes/company-lists-status.cassette.json +410 -0
  125. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/cowork/cassettes/hook-blocks-without-key.cassette.json +68 -68
  126. affinity_sdk-2.0.5/tests/cowork/cassettes/no-key-skill-path.cassette.json +423 -0
  127. affinity_sdk-2.0.5/tests/cowork/cassettes/status-history.cassette.json +469 -0
  128. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_api_key_resolution.py +95 -15
  129. affinity_sdk-2.0.5/tests/test_cli_commands_must_fix.py +308 -0
  130. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_company_get.py +10 -10
  131. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_context_coverage.py +6 -6
  132. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_entity_ls_server_filter.py +1 -0
  133. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_entry_field.py +10 -10
  134. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_error_rendering.py +4 -4
  135. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_field_history_bulk.py +16 -0
  136. affinity_sdk-2.0.5/tests/test_cli_field_history_deleted_options.py +126 -0
  137. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_field_utils.py +29 -29
  138. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_file_url.py +30 -30
  139. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_files_ls.py +16 -16
  140. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_files_read.py +35 -35
  141. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_help_json.py +8 -0
  142. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_interaction_utils.py +29 -13
  143. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_list_expand_interactions.py +58 -17
  144. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_list_export_server_filter.py +33 -0
  145. affinity_sdk-2.0.5/tests/test_cli_page_size_validation.py +45 -0
  146. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_person_get.py +2 -0
  147. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_query_executor.py +25 -218
  148. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_query_expand_interactions.py +5 -3
  149. affinity_sdk-2.0.5/tests/test_cli_query_must_fix.py +1170 -0
  150. affinity_sdk-2.0.5/tests/test_cli_query_review_fixes.py +1167 -0
  151. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_resolve_url_parsing.py +4 -4
  152. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_session_setup_hook.py +59 -0
  153. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_unreplied.py +22 -3
  154. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_write_ops.py +9 -9
  155. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_companies_create_dedup.py +18 -18
  156. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_duplicates_connections.py +3 -3
  157. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_exceptions_coverage.py +18 -18
  158. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_file_list_batch.py +4 -11
  159. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_files_upload_returning_files.py +18 -18
  160. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_interaction_date_validation.py +6 -4
  161. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_list_entries_server_filter.py +41 -0
  162. affinity_sdk-2.0.5/tests/test_mcp_must_fix.py +478 -0
  163. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_reminder_list_batch.py +22 -2
  164. affinity_sdk-2.0.5/tests/test_review_fixes_sdk_cli.py +997 -0
  165. affinity_sdk-2.0.5/tests/test_sdk_must_fix.py +655 -0
  166. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_search_v2.py +2 -2
  167. affinity_sdk-2.0.5/tests/test_services_batch_get_interaction_dates.py +126 -0
  168. affinity_sdk-2.0.5/tests/test_services_entity_list_entries.py +130 -0
  169. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_services_field_value_changes.py +9 -0
  170. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_services_lists_additional_coverage.py +6 -6
  171. affinity_sdk-2.0.5/tests/test_services_pages_cursor_guard.py +180 -0
  172. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/unit/test_exceptions.py +8 -8
  173. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tools/generate_mcp_command_registry.py +20 -0
  174. affinity_sdk-2.0.3/docs/public/reference/services/v1/auth.md +0 -3
  175. affinity_sdk-2.0.3/docs/public/reference/services/v1/field-values.md +0 -3
  176. affinity_sdk-2.0.3/docs/public/reference/services/v1/fields.md +0 -3
  177. affinity_sdk-2.0.3/docs/public/reference/services/v1/interactions.md +0 -3
  178. affinity_sdk-2.0.3/mcp/.mcp-bash/VERSION +0 -1
  179. affinity_sdk-2.0.3/mcp/.mcp-bash/vendor.json +0 -1
  180. affinity_sdk-2.0.3/mcp/VERSION +0 -1
  181. affinity_sdk-2.0.3/mcp/server.d/server.meta.json +0 -12
  182. affinity_sdk-2.0.3/plugins/xaffinity-cli/hooks/guard-env-read.sh +0 -33
  183. affinity_sdk-2.0.3/tests/cowork/cassettes/company-lists-status.cassette.json +0 -410
  184. affinity_sdk-2.0.3/tests/cowork/cassettes/no-key-skill-path.cassette.json +0 -417
  185. affinity_sdk-2.0.3/tests/cowork/cassettes/status-history.cassette.json +0 -492
  186. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/.claude-plugin/marketplace.json +0 -0
  187. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/.cursor/rules/test-data-privacy.mdc +0 -0
  188. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/.editorconfig +0 -0
  189. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/.env.example +0 -0
  190. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/.gitattributes +0 -0
  191. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/.github/CODEOWNERS +0 -0
  192. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  193. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  194. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/.github/PULL_REQUEST_TEMPLATE/cli_command.md +0 -0
  195. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/.github/PULL_REQUEST_TEMPLATE/release.md +0 -0
  196. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/.github/dependabot.yml +0 -0
  197. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/.github/labels.yml +0 -0
  198. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/.github/mcp-release-install-footer.md +0 -0
  199. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/.github/pull_request_template.md +0 -0
  200. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/.github/release-install-footer.md +0 -0
  201. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/.github/workflows/ci.yml +0 -0
  202. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/.github/workflows/cowork-replay.yml +0 -0
  203. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/.github/workflows/docs.yml +0 -0
  204. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/.github/workflows/labels.yml +0 -0
  205. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/.github/workflows/linkcheck.yml +0 -0
  206. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/.github/workflows/openapi-validation.yml +0 -0
  207. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/.github/workflows/release-detect.yml +0 -0
  208. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/.github/workflows/version-check.yml +0 -0
  209. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/.gitignore +0 -0
  210. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/.pre-commit-config.yaml +0 -0
  211. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/AGENTS.md +0 -0
  212. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/CODE_OF_CONDUCT.md +0 -0
  213. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/CONTRIBUTING.md +0 -0
  214. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/LICENSE +0 -0
  215. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/SECURITY.md +0 -0
  216. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/__init__.py +0 -0
  217. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/_filtering/__init__.py +0 -0
  218. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/_filtering/dates.py +0 -0
  219. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/_filtering/filter_text.py +0 -0
  220. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/_filtering/pushdown.py +0 -0
  221. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/_filtering/search.py +0 -0
  222. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/_filtering/where.py +0 -0
  223. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/_internal/__init__.py +0 -0
  224. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/_internal/keyfile.py +0 -0
  225. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/api_versions.py +0 -0
  226. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/__init__.py +0 -0
  227. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/__main__.py +0 -0
  228. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/_update_worker.py +0 -0
  229. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/click_compat.py +0 -0
  230. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/commands/__init__.py +0 -0
  231. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/commands/_entity_field.py +0 -0
  232. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/commands/_entity_files_dump.py +0 -0
  233. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/commands/_entity_files_read.py +0 -0
  234. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/commands/_entity_files_upload.py +0 -0
  235. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/commands/_list_entry_fields.py +0 -0
  236. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/commands/_org_reads.py +0 -0
  237. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/commands/_search_common.py +0 -0
  238. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/commands/_v1_parsing.py +0 -0
  239. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/commands/completion_cmd.py +0 -0
  240. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/commands/discovery_cmds.py +0 -0
  241. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/commands/entry_cmds.py +0 -0
  242. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/commands/file_cmds.py +0 -0
  243. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/commands/org_cmds.py +0 -0
  244. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/commands/org_read_cmds.py +0 -0
  245. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/commands/relationship_strength_cmds.py +0 -0
  246. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/commands/resolve_url_cmd.py +0 -0
  247. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/commands/session_cmds.py +0 -0
  248. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/commands/task_cmds.py +0 -0
  249. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/commands/transcript_cmds.py +0 -0
  250. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/commands/version_cmd.py +0 -0
  251. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/commands/webhook_cmds.py +0 -0
  252. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/commands/whoami_cmd.py +0 -0
  253. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/config.py +0 -0
  254. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/constants.py +0 -0
  255. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/csv_utils.py +0 -0
  256. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/date_utils.py +0 -0
  257. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/decorators.py +0 -0
  258. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/errors.py +0 -0
  259. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/formatters.py +0 -0
  260. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/list_search.py +0 -0
  261. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/logging.py +0 -0
  262. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/main.py +0 -0
  263. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/mcp_limits.py +0 -0
  264. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/options.py +0 -0
  265. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/paths.py +0 -0
  266. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/progress.py +0 -0
  267. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/query/__init__.py +0 -0
  268. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/query/dates.py +0 -0
  269. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/query/exceptions.py +0 -0
  270. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/query/filter_text.py +0 -0
  271. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/query/filters.py +0 -0
  272. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/query/parser.py +0 -0
  273. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/query/planner.py +0 -0
  274. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/query/progress.py +0 -0
  275. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/query/pushdown.py +0 -0
  276. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/query/schema.py +0 -0
  277. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/resolve.py +0 -0
  278. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/resolvers.py +0 -0
  279. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/serialization.py +0 -0
  280. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/session_cache.py +0 -0
  281. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/types.py +0 -0
  282. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/cli/update_check.py +0 -0
  283. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/clients/__init__.py +0 -0
  284. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/clients/pipeline.py +0 -0
  285. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/criteria.py +0 -0
  286. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/downloads.py +0 -0
  287. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/exceptions.py +0 -0
  288. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/field_resolve_utils.py +0 -0
  289. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/field_resolver.py +0 -0
  290. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/filters.py +0 -0
  291. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/hooks.py +0 -0
  292. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/inbound_webhooks.py +0 -0
  293. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/models/__init__.py +0 -0
  294. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/models/discovery.py +0 -0
  295. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/models/interactions_v2.py +0 -0
  296. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/models/org.py +0 -0
  297. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/models/rate_limit_snapshot.py +0 -0
  298. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/models/relationships_v2.py +0 -0
  299. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/models/search.py +0 -0
  300. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/models/secondary.py +0 -0
  301. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/models/transcripts.py +0 -0
  302. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/policies.py +0 -0
  303. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/progress.py +0 -0
  304. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/py.typed +0 -0
  305. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/services/__init__.py +0 -0
  306. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/services/_discovery.py +0 -0
  307. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/services/_dropdown_options.py +0 -0
  308. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/services/_field_listing.py +0 -0
  309. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/services/_note_html.py +0 -0
  310. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/services/_search.py +0 -0
  311. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/services/_single_field.py +0 -0
  312. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/services/_v2_filters.py +0 -0
  313. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/services/rate_limits.py +0 -0
  314. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/services/search.py +0 -0
  315. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/services/transcripts.py +0 -0
  316. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/affinity/types.py +0 -0
  317. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/codecov.yml +0 -0
  318. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/ai-integrations/index.md +0 -0
  319. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/changelog.md +0 -0
  320. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/cli-reference.md +0 -0
  321. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/getting-started.md +0 -0
  322. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/guides/csv-export.md +0 -0
  323. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/guides/datetime-handling.md +0 -0
  324. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/guides/ids-and-types.md +0 -0
  325. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/guides/migrating-to-2.md +0 -0
  326. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/guides/models.md +0 -0
  327. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/guides/opportunity-associations.md +0 -0
  328. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/guides/rate-limits.md +0 -0
  329. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/guides/webhooks.md +0 -0
  330. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/mcp/index.md +0 -0
  331. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/reference/api-coverage.md +0 -0
  332. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/reference/client.md +0 -0
  333. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/reference/exceptions.md +0 -0
  334. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/reference/filters.md +0 -0
  335. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/reference/models.md +0 -0
  336. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/reference/query-language.md +0 -0
  337. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/reference/services/lists.md +0 -0
  338. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/reference/services/opportunities.md +0 -0
  339. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/reference/services/reminders.md +0 -0
  340. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/reference/services/tasks.md +0 -0
  341. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/reference/services/teams-users.md +0 -0
  342. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/reference/services/v1/files.md +0 -0
  343. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/reference/services/v1/notes.md +0 -0
  344. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/reference/services/v1/relationships.md +0 -0
  345. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/reference/services/webhooks.md +0 -0
  346. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/reference/types.md +0 -0
  347. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/docs/public/troubleshooting.md +0 -0
  348. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/examples/advanced_usage.py +0 -0
  349. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/examples/async_lifecycle.py +0 -0
  350. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/examples/basic_usage.py +0 -0
  351. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/examples/filter_builder.py +0 -0
  352. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/examples/hooks_debugging.py +0 -0
  353. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/examples/list_management.py +0 -0
  354. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/examples/resolve_helpers.py +0 -0
  355. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/examples/task_polling.py +0 -0
  356. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.claude-plugin/.gitignore +0 -0
  357. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.claude-plugin/skills/affinity-mcp-workflows/SKILL.md +0 -0
  358. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.claude-plugin/skills/query-language/SKILL.md +0 -0
  359. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.claude-plugin/skills/query-language/references/filter-operators.md +0 -0
  360. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.claude-plugin/skills/query-language/references/include-expand.md +0 -0
  361. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.claude-plugin/skills/query-language/references/output-formats.md +0 -0
  362. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.claude-plugin/skills/query-language/references/quantifiers.md +0 -0
  363. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.claude-plugin/xaffinity-mcp.sh +0 -0
  364. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.gitignore +0 -0
  365. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/bin/mcp-bash +0 -0
  366. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/handlers/completion.sh +0 -0
  367. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/handlers/lifecycle.sh +0 -0
  368. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/handlers/logging.sh +0 -0
  369. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/handlers/ping.sh +0 -0
  370. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/handlers/prompts.sh +0 -0
  371. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/handlers/resources.sh +0 -0
  372. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/handlers/roots.sh +0 -0
  373. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/handlers/tools.sh +0 -0
  374. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/auth.sh +0 -0
  375. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/capabilities.sh +0 -0
  376. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/cli/common.sh +0 -0
  377. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/cli/health.sh +0 -0
  378. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/completion.sh +0 -0
  379. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/elicitation.sh +0 -0
  380. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/file_read.sh +0 -0
  381. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/handler_helpers.sh +0 -0
  382. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/hash.sh +0 -0
  383. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/ids.sh +0 -0
  384. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/io.sh +0 -0
  385. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/json.sh +0 -0
  386. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/lock.sh +0 -0
  387. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/logging.sh +0 -0
  388. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/meta_env.sh +0 -0
  389. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/paginate.sh +0 -0
  390. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/path.sh +0 -0
  391. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/policy.sh +0 -0
  392. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/progress-passthrough.sh +0 -0
  393. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/progress.sh +0 -0
  394. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/prompts.sh +0 -0
  395. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/registry.sh +0 -0
  396. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/require.sh +0 -0
  397. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/resource_content.sh +0 -0
  398. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/resource_match.sh +0 -0
  399. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/resource_providers.sh +0 -0
  400. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/resources.sh +0 -0
  401. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/roots.sh +0 -0
  402. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/rpc.sh +0 -0
  403. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/spec.sh +0 -0
  404. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/timeout.sh +0 -0
  405. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/ui-templates.sh +0 -0
  406. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/ui.sh +0 -0
  407. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/uri.sh +0 -0
  408. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/lib/validate.sh +0 -0
  409. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/providers/echo.sh +0 -0
  410. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/providers/file.sh +0 -0
  411. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/providers/git.sh +0 -0
  412. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/providers/https.sh +0 -0
  413. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/providers/ui.sh +0 -0
  414. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/sdk/tool-error.sh +0 -0
  415. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/sdk/tool-sdk.sh +0 -0
  416. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.mcp-bash/sdk/ui-sdk.sh +0 -0
  417. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.registry/prompts.json +0 -0
  418. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.registry/resource-templates.json +0 -0
  419. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.registry/resources.json +0 -0
  420. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/.registry/ui-resources.json +0 -0
  421. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/completions/entity-name.sh +0 -0
  422. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/completions/list-name.sh +0 -0
  423. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/completions/status-value.sh +0 -0
  424. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/docs/DEBUGGING.md +0 -0
  425. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/icon.svg +0 -0
  426. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/lib/cli-detect.sh +0 -0
  427. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/lib/entity-types.sh +0 -0
  428. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/lib/field-resolution.sh +0 -0
  429. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/mcp-publisher.lock +0 -0
  430. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/mcpb.conf +0 -0
  431. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/prompts/change-status/change-status.completion.sh +0 -0
  432. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/prompts/change-status/change-status.meta.json +0 -0
  433. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/prompts/change-status/change-status.txt +0 -0
  434. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/prompts/interaction-brief/interaction-brief.meta.json +0 -0
  435. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/prompts/interaction-brief/interaction-brief.txt +0 -0
  436. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/prompts/log-call/log-call.meta.json +0 -0
  437. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/prompts/log-call/log-call.txt +0 -0
  438. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/prompts/log-interaction-and-update-workflow/log-interaction-and-update-workflow.meta.json +0 -0
  439. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/prompts/log-interaction-and-update-workflow/log-interaction-and-update-workflow.txt +0 -0
  440. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/prompts/log-message/log-message.meta.json +0 -0
  441. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/prompts/log-message/log-message.txt +0 -0
  442. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/prompts/pipeline-review/pipeline-review.completion.sh +0 -0
  443. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/prompts/pipeline-review/pipeline-review.meta.json +0 -0
  444. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/prompts/pipeline-review/pipeline-review.txt +0 -0
  445. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/prompts/prepare-briefing/prepare-briefing.meta.json +0 -0
  446. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/prompts/prepare-briefing/prepare-briefing.txt +0 -0
  447. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/prompts/warm-intro/warm-intro.meta.json +0 -0
  448. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/prompts/warm-intro/warm-intro.txt +0 -0
  449. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/providers/xaffinity.sh +0 -0
  450. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/resources/data-model/data-model.meta.json +0 -0
  451. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/resources/field-catalogs/field-catalogs.meta.json +0 -0
  452. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/resources/field-catalogs/field-catalogs.sh +0 -0
  453. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/resources/interaction-enums/interaction-enums.json +0 -0
  454. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/resources/interaction-enums/interaction-enums.meta.json +0 -0
  455. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/resources/me/me.meta.json +0 -0
  456. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/resources/me/me.sh +0 -0
  457. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/resources/me-person-id/me-person-id.meta.json +0 -0
  458. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/resources/me-person-id/me-person-id.sh +0 -0
  459. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/resources/query-guide/query-guide.meta.json +0 -0
  460. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/resources/query-guide/query-guide.sh +0 -0
  461. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/resources/saved-views/saved-views.meta.json +0 -0
  462. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/resources/saved-views/saved-views.sh +0 -0
  463. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/resources/workflow-config/workflow-config.meta.json +0 -0
  464. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/resources/workflow-config/workflow-config.sh +0 -0
  465. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/resources/workflows-guide/workflows-guide.meta.json +0 -0
  466. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/resources/workflows-guide/workflows-guide.sh +0 -0
  467. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/resources/xaffinity-field-catalogs.completion.sh +0 -0
  468. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/resources/xaffinity-saved-views.completion.sh +0 -0
  469. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/resources/xaffinity-workflow-config.completion.sh +0 -0
  470. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/server.d/health-checks.sh +0 -0
  471. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/server.d/policy.sh +0 -0
  472. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/server.json +0 -0
  473. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/test/README.md +0 -0
  474. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/test/run.sh +0 -0
  475. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/test/test_env_update_check.sh +0 -0
  476. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/test-progress.sh +0 -0
  477. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/tools/discover-commands/tool.meta.json +0 -0
  478. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/tools/discover-commands/tool.sh +0 -0
  479. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/tools/execute-read-command/tool.meta.json +0 -0
  480. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/tools/execute-write-command/tool.meta.json +0 -0
  481. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/tools/get-entity-dossier/tool.meta.json +0 -0
  482. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/tools/get-entity-dossier/tool.sh +0 -0
  483. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/tools/get-file-url/tool.meta.json +0 -0
  484. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/tools/get-file-url/tool.sh +0 -0
  485. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/tools/read-xaffinity-resource/tool.meta.json +0 -0
  486. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/tools/read-xaffinity-resource/tool.sh +0 -0
  487. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/user-config.json +0 -0
  488. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/mcp/xaffinity-mcp-env.sh +0 -0
  489. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/plugins/xaffinity-cli/hooks/hooks.json +0 -0
  490. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/interactions.md +0 -0
  491. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/query-guide.md +0 -0
  492. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/cli/query/test_cursor.py +0 -0
  493. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/cli/test_company_ls_filter_rejection.py +0 -0
  494. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/cli/test_formatters.py +0 -0
  495. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/cli/test_output_formats_integration.py +0 -0
  496. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/cli/test_person_create_dedup.py +0 -0
  497. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/cli/test_person_ls_filter_rejection.py +0 -0
  498. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/cli/test_query_filter_rejection.py +0 -0
  499. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/cli/test_query_list_entry_relationships.py +0 -0
  500. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/cli/test_query_list_export_parity.py +0 -0
  501. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/cli/test_query_output_flattening.py +0 -0
  502. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/cli/test_query_output_truncation.py +0 -0
  503. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/cli/test_query_unreplied.py +0 -0
  504. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/conftest.py +0 -0
  505. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/cowork/.cowork-redact.json +0 -0
  506. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/cowork/README.md +0 -0
  507. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/cowork/fixtures/workdir-key/README.txt +0 -0
  508. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/cowork/fixtures/workdir-key/xaffinity-test-key +0 -0
  509. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/cowork/fixtures/workdir-nokey/README.txt +0 -0
  510. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/cowork/image/Dockerfile +0 -0
  511. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/cowork/image/fakeaff/build_fixtures.py +0 -0
  512. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/cowork/image/fakeaff/fixtures.json +0 -0
  513. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/cowork/image/fakeaff/server.py +0 -0
  514. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/cowork/image/xaffinity-wrapper.sh +0 -0
  515. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/cowork/privacy-allow.txt +0 -0
  516. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/cowork/record.sh +0 -0
  517. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/cowork/scenarios/company-lists-status.yaml +0 -0
  518. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/cowork/scenarios/hook-blocks-without-key.yaml +0 -0
  519. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/cowork/scenarios/no-key-skill-path.yaml +0 -0
  520. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/cowork/scenarios/status-history.yaml +0 -0
  521. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/cowork/sessions/no-key.yaml +0 -0
  522. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/cowork/sessions/with-key.yaml +0 -0
  523. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/field_write_mocks.py +0 -0
  524. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/fixtures/openapi/mini_openapi.json +0 -0
  525. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/fixtures/webhooks/field_value_updated.json +0 -0
  526. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/fixtures/webhooks/list_entry_created.json +0 -0
  527. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/fixtures/webhooks/organization_created.json +0 -0
  528. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/fixtures/webhooks/organization_merged.json +0 -0
  529. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/fixtures/webhooks/person_created.json +0 -0
  530. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/fixtures/webhooks/unknown_event.json +0 -0
  531. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/integration/README.md +0 -0
  532. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/integration/conftest.py +0 -0
  533. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/integration/setup_query_parity_data.py +0 -0
  534. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/integration/test_cli_writes.py +0 -0
  535. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/integration/test_query_parity_integration.py +0 -0
  536. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/integration/test_sdk_reads.py +0 -0
  537. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/integration/test_sdk_writes.py +0 -0
  538. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/integration/test_sdk_writes_runner.py +0 -0
  539. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/mcp/__init__.py +0 -0
  540. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/mcp/test_query_cursor.py +0 -0
  541. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/skill-evals/xaffinity-cli-usage-evals/evals.json +0 -0
  542. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/spec_guard.py +0 -0
  543. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_affinity_client_wrapper_additional_coverage.py +0 -0
  544. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_api_coverage.py +0 -0
  545. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_api_key_file_formats.py +0 -0
  546. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_api_version.py +0 -0
  547. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_api_version_per_operation.py +0 -0
  548. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_async_file_download_streaming.py +0 -0
  549. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_batch_get.py +0 -0
  550. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_api_version.py +0 -0
  551. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_column_limiting.py +0 -0
  552. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_command_context.py +0 -0
  553. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_company_cmds_coverage.py +0 -0
  554. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_config_cmds.py +0 -0
  555. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_csv_export.py +0 -0
  556. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_date_params.py +0 -0
  557. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_date_utils.py +0 -0
  558. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_datetime_formatting.py +0 -0
  559. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_datetime_header_offsets.py +0 -0
  560. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_domain_linkification.py +0 -0
  561. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_dotenv_resolution.py +0 -0
  562. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_dropdown_field_writes.py +0 -0
  563. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_enriched_field_writes.py +0 -0
  564. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_entity_field_writes.py +0 -0
  565. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_entity_files_dump.py +0 -0
  566. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_entry_field_batch_writes.py +0 -0
  567. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_entry_field_multi_value_limits.py +0 -0
  568. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_error_hints.py +0 -0
  569. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_field_history.py +0 -0
  570. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_field_options_and_transcripts.py +0 -0
  571. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_field_utils_coverage.py +0 -0
  572. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_field_utils_set_phase.py +0 -0
  573. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_field_value_humanization.py +0 -0
  574. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_get_interaction_dates.py +0 -0
  575. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_interaction_date_chunking.py +0 -0
  576. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_json_safety.py +0 -0
  577. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_list_cmds_coverage.py +0 -0
  578. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_list_export_entity_scope.py +0 -0
  579. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_list_export_field_refresh.py +0 -0
  580. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_list_export_filter_safety.py +0 -0
  581. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_list_export_truncation_meta.py +0 -0
  582. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_missing_coverage.py +0 -0
  583. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_multi_value_truncation_warnings.py +0 -0
  584. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_no_network_commands.py +0 -0
  585. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_notes_writes.py +0 -0
  586. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_opportunity_cmds.py +0 -0
  587. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_opportunity_cmds_coverage.py +0 -0
  588. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_org.py +0 -0
  589. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_pager_logic.py +0 -0
  590. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_person_cmds_coverage.py +0 -0
  591. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_plugin_manifest.py +0 -0
  592. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_pre_xaffinity_hook.py +0 -0
  593. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_progress_manager.py +0 -0
  594. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_query_aggregates.py +0 -0
  595. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_query_cmd.py +0 -0
  596. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_query_cmd_coverage.py +0 -0
  597. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_query_dates.py +0 -0
  598. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_query_filters.py +0 -0
  599. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_query_integration.py +0 -0
  600. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_query_parser.py +0 -0
  601. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_query_planner.py +0 -0
  602. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_query_safety.py +0 -0
  603. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_query_schema.py +0 -0
  604. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_query_server_filter.py +0 -0
  605. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_rate_limit_rendering.py +0 -0
  606. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_rate_limit_throttle.py +0 -0
  607. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_reminders.py +0 -0
  608. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_render_coverage.py +0 -0
  609. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_resolve_coverage.py +0 -0
  610. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_result_summary.py +0 -0
  611. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_safe_field_writes.py +0 -0
  612. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_search.py +0 -0
  613. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_serialization.py +0 -0
  614. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_session_cache.py +0 -0
  615. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_set_phase_atomicity.py +0 -0
  616. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_types.py +0 -0
  617. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_update_check.py +0 -0
  618. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_v1_only_cmds.py +0 -0
  619. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_v1_parsing.py +0 -0
  620. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_cli_webhooks.py +0 -0
  621. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_client.py +0 -0
  622. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_companies_filter_rejection.py +0 -0
  623. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_compare.py +0 -0
  624. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_env_helpers.py +0 -0
  625. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_field_resolver.py +0 -0
  626. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_field_service_caching.py +0 -0
  627. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_field_types_c4.py +0 -0
  628. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_field_value_type.py +0 -0
  629. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_field_values_get_value.py +0 -0
  630. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_file_batch_get.py +0 -0
  631. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_file_download_streaming.py +0 -0
  632. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_file_upload_helpers_and_validation.py +0 -0
  633. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_files_v2.py +0 -0
  634. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_filters.py +0 -0
  635. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_generate_mcp_command_registry.py +0 -0
  636. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_get_fields_filter_includes.py +0 -0
  637. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_get_fields_pagination.py +0 -0
  638. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_get_first.py +0 -0
  639. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_hidden_field_values.py +0 -0
  640. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_hooks.py +0 -0
  641. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_http_client_additional_coverage.py +0 -0
  642. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_http_client_remaining_coverage.py +0 -0
  643. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_inbound_webhooks.py +0 -0
  644. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_integration_smoke.py +0 -0
  645. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_interactions_and_files_regressions.py +0 -0
  646. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_isodatetime.py +0 -0
  647. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_list_entry_membership_and_opportunities.py +0 -0
  648. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_list_term.py +0 -0
  649. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_lists_v2_writes.py +0 -0
  650. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_mcp_bundle_env_and_completions.py +0 -0
  651. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_mcp_cli_version_check.py +0 -0
  652. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_mcp_entity_dossier.py +0 -0
  653. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_mcp_gateway_limits.py +0 -0
  654. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_mcp_history_bulk_gateway.py +0 -0
  655. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_mcp_limits.py +0 -0
  656. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_mcp_query_cli_error.py +0 -0
  657. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_mcp_read_truncation.py +0 -0
  658. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_mcp_resource_scripts.py +0 -0
  659. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_models.py +0 -0
  660. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_models_v2_2026_fields.py +0 -0
  661. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_multi_value_limits.py +0 -0
  662. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_new_features.py +0 -0
  663. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_notes_v2.py +0 -0
  664. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_notes_v2_writes.py +0 -0
  665. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_opportunities_filter_rejection.py +0 -0
  666. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_org_reads.py +0 -0
  667. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_pagination_iterators.py +0 -0
  668. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_persons_create_dedup.py +0 -0
  669. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_persons_filter_rejection.py +0 -0
  670. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_public_api.py +0 -0
  671. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_query_pushdown.py +0 -0
  672. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_rate_limit_v2.py +0 -0
  673. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_raw_pipeline_hook_events.py +0 -0
  674. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_readonly_factory.py +0 -0
  675. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_reminders_v2.py +0 -0
  676. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_requirements_additional.py +0 -0
  677. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_sdk_interaction_dates.py +0 -0
  678. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_search.py +0 -0
  679. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_service_get_parameter_combinations.py +0 -0
  680. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_services_companies_coverage_gaps.py +0 -0
  681. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_services_dropdown_options.py +0 -0
  682. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_services_entity_field_updates.py +0 -0
  683. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_services_list_entries_filter_paths.py +0 -0
  684. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_services_lists_coverage_gaps.py +0 -0
  685. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_services_opportunities_additional_coverage.py +0 -0
  686. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_services_opportunities_coverage_gaps.py +0 -0
  687. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_services_opportunities_tasks_additional_coverage.py +0 -0
  688. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_services_persons_companies_additional_coverage.py +0 -0
  689. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_services_rate_limits_coverage_gaps.py +0 -0
  690. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_services_v1_only_async.py +0 -0
  691. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_services_v1_only_coverage_gaps.py +0 -0
  692. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_single_field_v2.py +0 -0
  693. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_small_modules_coverage.py +0 -0
  694. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_spec_guard.py +0 -0
  695. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_teams_users_feedback.py +0 -0
  696. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_transport_and_readonly_mode.py +0 -0
  697. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_v1_association_parsing.py +0 -0
  698. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_v1_only_services_additional_coverage.py +0 -0
  699. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_v1_only_services_more_coverage.py +0 -0
  700. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_v2_request_bodies.py +0 -0
  701. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_validate_openapi_tool.py +0 -0
  702. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/test_webhooks_v2.py +0 -0
  703. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tests/unit/__init__.py +0 -0
  704. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tools/__init__.py +0 -0
  705. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tools/api_coverage.json +0 -0
  706. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tools/api_coverage.py +0 -0
  707. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tools/api_coverage_v1_snapshot.json +0 -0
  708. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tools/check_cli_patterns.py +0 -0
  709. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tools/generate_release_notes.py +0 -0
  710. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tools/generate_requirements_mapping.py +0 -0
  711. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tools/openapi_snapshots/2024-01-01.json +0 -0
  712. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tools/openapi_snapshots/2026-07-15.json +0 -0
  713. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tools/openapi_snapshots/2026-09-17.json +0 -0
  714. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tools/search_golden.py +0 -0
  715. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tools/sync_mcp_bundle_env.py +0 -0
  716. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tools/sync_mcp_registry.py +0 -0
  717. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tools/sync_mcp_version.py +0 -0
  718. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tools/validate_mcp_registry_metadata.py +0 -0
  719. {affinity_sdk-2.0.3 → affinity_sdk-2.0.5}/tools/validate_openapi_models.py +0 -0
@@ -84,6 +84,8 @@ jobs:
84
84
  - name: Build MCPB bundle
85
85
  run: |
86
86
  cd mcp
87
+ # mcp-bash refuses to load server.d/policy.sh from group/other-writable paths
88
+ chmod -R go-w .
87
89
  mcp-bash bundle --output dist --verbose
88
90
  ls -la dist/*.mcpb
89
91
  echo "MCPB bundle created"
@@ -106,6 +106,8 @@ jobs:
106
106
  - name: Build MCPB bundle
107
107
  run: |
108
108
  cd mcp
109
+ # mcp-bash refuses to load server.d/policy.sh from group/other-writable paths
110
+ chmod -R go-w .
109
111
  mcp-bash bundle --output dist --verbose
110
112
  ls -la dist/*.mcpb
111
113
 
@@ -221,6 +221,8 @@ jobs:
221
221
  - name: Build MCPB bundle
222
222
  run: |
223
223
  cd mcp
224
+ # mcp-bash refuses to load server.d/policy.sh from group/other-writable paths
225
+ chmod -R go-w .
224
226
  mcp-bash bundle --output dist --verbose
225
227
  ls -la dist/*.mcpb
226
228
 
@@ -5,7 +5,238 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
- ## [Unreleased]
8
+ ## [2.0.5] - 2026-10-14
9
+
10
+ **Exception to semantic versioning** (as 2.0.2–2.0.4): two fixes change what a call returns or
11
+ what the CLI prints. Each is marked **Behavior change**.
12
+
13
+ ### Changed
14
+
15
+ - **Behavior change. CLI: deleted dropdown options in `field history` and `field history-bulk`
16
+ (`--json`).** Affinity sends an option deleted since as its bare text ("Reach Out") and a live
17
+ one as `{id, text, rank, color}`; the CLI passed both through, so one field's history mixed
18
+ strings and objects. A deleted option is now `{"id": null, "text": "Reach Out", "deleted":
19
+ true}`, so every dropdown value has a `text`. Text fields keep their string values; live
20
+ options are unchanged. When a value is plain text the CLI reads the field's metadata (one call)
21
+ to tell a dropdown from a text field (`history-bulk --list-id` already has it). Table and CSV
22
+ output show the text, as before.
23
+ - **Behavior change. SDK: `on_error="skip"` leaves failed records out of
24
+ `AsyncReminderService.list_batch` and `AsyncFileService.list_batch`.** A failed request used
25
+ to leave its ids in the result with empty or partial lists, which looked like "no reminders" /
26
+ "no files"; one failed reminders request (50 ids) silently hid them all. They are now absent
27
+ from the result, as with every other `on_error="skip"` method: a requested id with no key
28
+ failed.
29
+ - SDK: `field_value_changes.iter_all()` reads 10,000 changes per call by default (was 100), the
30
+ V1 maximum: a 16,000-change history takes 3 calls instead of 161 (paging ends on an empty
31
+ page). Pass `page_size` for smaller
32
+ pages.
33
+ - SDK: `AsyncCompanyService.batch_get` / `AsyncPersonService.batch_get` with
34
+ `with_interaction_dates` and `field_ids` / `field_types` read the fields in one call per 100
35
+ ids and the dates in one V1 call per record: about N + N/100 calls instead of 2N. Results are
36
+ the same. Under `on_error="skip"` a failed fields call falls back to one read per id of it.
37
+
38
+ ### Added
39
+
40
+ - CLI: `list export --filter`, `company ls --filter` and `person ls --filter` report how the
41
+ filter was split in `meta.serverFilter` (`--json`): `pushed` (conditions Affinity's search
42
+ applied), `local` (checked only locally, with reasons) and, on `list export` when the search
43
+ was refused or turned off, `fallback` (why: refused, the list's fields unreadable, or
44
+ `XAFFINITY_QUERY_SERVER_FILTER=0`; the whole filter then ran locally). `list export
45
+ --dry-run` shows it as `data.serverFilter`. A `--cursor` resume doesn't report it.
46
+ Like `query --include-meta`, but always present with `--json`.
47
+ - SDK: `persons.get_list_entries()` takes `limit` and `cursor` (it returned only the first page).
48
+
49
+ ### Fixed
50
+
51
+ - SDK: `companies.get_list_entries()` and `persons.get_list_entries()` set each entry's
52
+ `entity_id` and `entity_type` (`ORGANIZATION` / `PERSON`); the endpoint doesn't send them, so
53
+ they were `None`. `entity` stays `None` there. A `cursor` from another company's or person's
54
+ entries raises `ValueError` instead of labelling its entries with the wrong record. CLI:
55
+ `company get --expand list-entries` and `person get --expand list-entries` (`--json`) now
56
+ show each entry's `entityId` and `entityType` (1 company, 0 person).
57
+ - SDK: the `ListEntry` docstring said it always contains the entity; it says where `entity` is
58
+ filled.
59
+ - Docs: filtered-run cursors start with `xsearch2:` (the CLI page, filtering guide, CLI skill
60
+ and MCP data model said `xsearch1:`). The `field changes` docs say a deleted dropdown option is
61
+ `{"referenceType": "deleted-entity", "displayValue": ...}`. The companies and persons pages
62
+ say what reading interaction dates for many records costs, and the companies page and
63
+ `batch_get` docstring point to the relationship-intelligence fields for last / next meeting
64
+ dates.
65
+
66
+ ## [2.0.4] - 2026-10-14
67
+
68
+ **Exception to semantic versioning** (the maintainer's call, as 2.0.2 and 2.0.3): which API key
69
+ the CLI uses changes when a key flag and a key environment variable are both set. The
70
+ `### Changed` entry says how. Some fixes below also change what a call returns or raises,
71
+ or a CLI exit code; each is marked **Behavior change**.
72
+
73
+ ### Changed
74
+
75
+ - **CLI: `--api-key-file` and `--api-key-stdin` win over the environment.** A key named on the
76
+ command line is used even when `AFFINITY_API_KEY`, `AFFINITY_API_KEY_FILE` or
77
+ `AFFINITY_API_KEY_COMMAND` is set, and the CLI warns that those are ignored (the file is not
78
+ read and the command is not run). Before, an environment key silently replaced the flag's key,
79
+ so a stale `export` could send reads and writes to another workspace. To keep using the
80
+ environment key, drop the flag. The SDK and the MCP server (which passes no key flag) are
81
+ unchanged.
82
+
83
+ ### Fixed
84
+
85
+ - `config check-key` reports `source: "flag"` (and a `pattern` repeating the flag) when
86
+ `--api-key-file` or `--api-key-stdin` is given, as commands now use that key first. It
87
+ doesn't read stdin; a missing or empty key file counts as not configured.
88
+ - The missing-API-key error no longer says `config setup-key` saves to the system keychain: it
89
+ writes a config file, or a `.env` file with `--scope project`.
90
+ - Docs: one API-key resolution order across the README, guides, CLI page, MCP README and CLI
91
+ skill (there is no `--api-key` CLI flag).
92
+ - Docs: the README coverage table, routing guide, glossary and errors guide describe 2.0's
93
+ routing (company and person field values, `notes.get`, transcripts, teams, semantic search
94
+ and connections are V2); `api-versions.md` lists every call that sends a minimum version;
95
+ beta endpoints need no opt-in.
96
+ - Docs: the CLI command page documents `files ls`/`read`/`download` on persons, companies and
97
+ opportunities (not the old `files dump`), `relationship-strength ls` (not `get`),
98
+ `opportunity field`, `list entry get`, `file-url` and `config update-check`; the CLI page says
99
+ which list commands return a bare `data` array.
100
+ - Docs: the official-MCP comparison lists this project's transcript, meeting, team, user,
101
+ duplicate and connection reads; `VERSIONING.md` describes 2.x and its patch-release
102
+ exceptions; the MCP README asks for Python 3.10+.
103
+ - Docs: the docs home page introduces the project and links configuration, migration, API
104
+ versions, the query command and webhooks; a Transcripts reference page; the reference nav no
105
+ longer files V2 services under "V1 endpoints"; the `Affinity`/`AsyncAffinity` docstrings and
106
+ the sync/async table list every service; the field-values guide starts with the V2
107
+ company/person/list-entry methods; the plugins page covers all three plugins.
108
+ - Docs and `file-url` help: examples use placeholder ids and names.
109
+ - **Behavior change. SDK: an empty id list returns an empty page.** `list(ids=[])` on companies,
110
+ persons, opportunities, webhooks, teams, users and reminders used to omit the filter and return
111
+ the whole collection; it now returns no rows without calling the API. `limit=0` (or less) raises
112
+ `ValueError` where it used to be dropped silently (companies, persons, opportunities, a
113
+ company's lists and list entries, saved-view entries).
114
+ - **Behavior change. SDK: field writes.** A `bool` value raises `TypeError` (Affinity has no
115
+ boolean field type; it was sent as malformed text). Datetimes are sent as whole-second UTC with
116
+ `Z`, like every other write; a naive datetime is taken as UTC.
117
+ - **Behavior change. SDK: delete results.** A delete whose response has no `success` key (an empty
118
+ body) returns `True`; only an explicit `"success": false` returns `False`.
119
+ - SDK: `get_all_pages` raises `AffinityError` when it stops at `max_pages` with pages left,
120
+ instead of returning (and caching) a cut-off result.
121
+ - SDK: company and person merges raise `AffinityError` when the response has no `taskUrl`,
122
+ instead of returning an empty URL.
123
+ - SDK: the sync client rejects an `async` hook with `ConfigurationError` at construction; under
124
+ `hook_error_policy="swallow"` it was logged and never ran.
125
+ - SDK: followed pagination URLs must match the exact host and port of the V1 or V2 base URL.
126
+ - SDK: the response cache key includes the per-call API version sent.
127
+ - SDK: `tasks.wait` no longer sleeps past its `timeout`.
128
+ - SDK: `lists.resolve` no longer remembers a name it didn't find, so a list created later is found.
129
+ - SDK: `lists.get_size` is shared by every list service on a client and dropped when an entry is
130
+ added or removed, an opportunity is created or deleted, or a person or company is deleted.
131
+ - SDK: paging stops when a cursor repeats, when a page says more follow but gives no cursor, or
132
+ after 1,000 empty pages in a row (with a `RuntimeWarning`), instead of looping. This covers the
133
+ page iterators (`iter()`, `all()`) and the `pages()` generators of companies, persons,
134
+ opportunities, lists, saved views and list entries (filtered reads included), sync and async.
135
+ - SDK: association paging tolerates `"pagination": null`.
136
+ - SDK filters: `in`, `has_any` and `has_all` compare values the way `=` does, so `score in [5, 6]`
137
+ matches the number 5.
138
+ - SDK models: `FieldId(True)`, `FieldValueType(True)` and fractional floats for open enums raise
139
+ `ValueError`; a fractional float no longer replaces a known enum member for the rest of the
140
+ process. `FieldValues.get` accepts bare-digit ids (`123`, `"123"`). Person and opportunity
141
+ company ids also read `companyIds` and `current_organization_ids`; `Location` reads
142
+ `streetAddress`; V2 list entries pick the entity model from `type`.
143
+ - **CLI `query`: resuming a cut-off result no longer skips rows.** The resume cursor jumped to
144
+ the next API page, losing the rest of the current page and every fetched row that didn't fit in
145
+ `--max-output-bytes`. A cut-off result, with its included records, is now cached and the
146
+ cursor resumes from it without API calls; each page's `included` holds only the records related
147
+ to that page's rows, also when `select` leaves out `id` (TOON pages hold as many rows as fit,
148
+ with matching counts; related records that can't be matched to rows are cut to the budget and
149
+ counted in `includedOmitted`). A cursor needs the same `--max-records` as the first run; a cursor from an
150
+ earlier version is refused as not matching the query (cursors expire after an hour).
151
+ - **Behavior change. CLI `query`: errors are no longer read as "no data".** A rate-limit, server or
152
+ auth error while fetching related records (for `include`, relationship filters, or an id
153
+ lookup, or `include: interactions`), an expansion (`interactionDates`, `unreplied`, person
154
+ names) or a list's field definitions (when the query uses a list field) fails the query. Before,
155
+ the record silently had no related records, an id-only stub or an empty expansion, so `none`,
156
+ `all` and `_count eq 0` filters could match wrongly. Only a deleted or merged record counts as
157
+ empty.
158
+ - **Behavior change. CLI `query`: `--max-records`.** When results are cut at it, a warning says
159
+ so and `meta.truncated` is set, on every path (before, the cut was silent); with `orderBy` or
160
+ an aggregate the cut comes after sorting and aggregating (also when the query has no `where`), so counts, sums, groups and top-N use
161
+ every match. Before, they were computed on the first 10,000.
162
+ - **Behavior change. CLI `query`: Ctrl+C exits 130** (exit 0 before). Rows that already went
163
+ through the query's filter, sort and aggregate are printed; when one of those hadn't run yet, no
164
+ rows are printed (before, unfiltered rows were) and the error type is `interrupted`. On Python
165
+ 3.10, Ctrl+C prints no rows (it still exits 130); Python 3.11+ prints them.
166
+ - **Behavior change. CLI `query`:** a `listName` that matches more than one list, or none, is a
167
+ validation error (exit 2) asking for the list id; before, the last list with that name was
168
+ used. An include's `list:` name that matches several lists fails (exit 2,
169
+ `ambiguous_resolution`) and one that matches none is not found (exit 4); before, the scope was
170
+ dropped. `min`/`max` over objects,
171
+ lists, or a mix of numbers and text is a validation error instead of a crash or a silent pick.
172
+ - CLI `query`: with `orderBy` or `limit`, `include` (and an `expand` the sort doesn't read) runs
173
+ on the rows kept after sorting, limiting and `--max-records`, not on every match, so a top-N
174
+ query makes one call per kept row.
175
+ - CLI `query`: an Affinity error exits with the CLI's documented code (3 auth, 4 not found, 5
176
+ rate limit or server error) and its usual error envelope, instead of exit 1 with "Query
177
+ execution failed".
178
+ - CLI `query`: CSV output with `--max-output-bytes` cuts on whole records (a note with a line
179
+ break could be split), has every row's columns, honors `--csv-bom` and can be resumed; JSONL
180
+ resume no longer skips rows whose data contains `"truncated"`. A row larger than
181
+ `--max-output-bytes` is printed whole (JSON too, which exited 1 partway through paging) instead
182
+ of giving an empty page whose cursor repeats.
183
+ - CLI `query`: `include` options are applied: `list`, `where`, `limit` and `days` on a
184
+ `listEntries` include, and `limit` and `days` on an `interactions` include. Before, they were
185
+ ignored, so related opportunities came from every list and interactions used the default 90-day
186
+ window and 100-record limit.
187
+ - CLI `query`: a relationship filter on `interactions` (`interactions._count`,
188
+ `exists`/`all`/`none`) no longer hangs when the query has at least as many records as the
189
+ concurrency limit (10).
190
+ - CLI `query`: when fetching related records for a `listEntries` include fails, the other fetches
191
+ are stopped instead of continuing to call the API and printing "Task exception was never
192
+ retrieved".
193
+ - CLI `query --output toon`: a cut-off page, its `cursor:` line included, stays within
194
+ `--max-output-bytes` (if the cursor alone, about 500 bytes, doesn't fit, one row is shown).
195
+ - **Behavior change. CLI `query --output csv`:** without `--max-output-bytes`, execution warnings
196
+ (the `--max-records` cut, multi-value fields cut off) go to stderr as with the other formats,
197
+ and the CSV has the same shape as with a budget: columns in `select` order (first-seen order
198
+ without `select`; they were sorted alphabetically), selected `fields.*` and expanded
199
+ `interactionDates` flattened into columns, and every record ending with CRLF.
200
+ - CLI `query`: `groupBy` on object values (such as a location) works; formula fields filter and
201
+ sort as numbers.
202
+ - **Behavior change. CLI: a delete Affinity reports as failed exits 1** (`api_error`) instead of
203
+ printing `"success": false` with exit 0.
204
+ - **Behavior change. CLI `field history-bulk`:** when every entry fails it exits with the usual
205
+ code for that error (3 auth, 4 not found, 5 rate limit or server; 1 for mixed errors), and 3 on
206
+ any auth error (all exited 0). Partial failures still exit 0 with warnings and now set
207
+ `meta.truncated` with `truncationReason: "partialFailure"`.
208
+ - **Behavior change. CLI `list export` expansions:** a failed interaction, opportunity or
209
+ unreplied-message lookup fails the export under the default `--expand-on-error raise` (it was
210
+ left empty silently), and warns under `skip`, keeping the entry's other expansions. An auth
211
+ error during any expansion fails the export; a deleted opportunity is left out. With `--csv`
212
+ these warnings, and the export's other warnings (such as "Filtering locally"), are printed to
213
+ stderr; they were dropped.
214
+ - **Behavior change. CLI `--page-size` below 1** is a usage error (exit 2) on `company`,
215
+ `person`, `opportunity`, `list`, `note`, `interaction` and `reminder ls`, `list export` and
216
+ `files download`. With the SDK's new `limit` check it was an `internal_error` (exit 1) on most
217
+ of them, and `note ls` and `interaction ls` accepted it. `--help --json` (and the MCP command
218
+ registry) reports such range-checked options, including `search --max-results` and
219
+ `files ls --max-results`, as `int`; they were `string`.
220
+ - **Behavior change. CLI field writes:** `true`/`false` anywhere in a `--set-json` value (including
221
+ list items and object values) is refused before any write (exit 2, `validation_error`);
222
+ Affinity has no boolean field type. A text field no longer stores `true` as `"true"`.
223
+ - CLI `list entry field --unset-value` exits 1 when Affinity reports the delete failed, instead of
224
+ reporting the value as deleted. When an `--unset-value` or `--append` step fails after something
225
+ was already changed, the error is `partial_write` naming every field written and value removed;
226
+ a step that timed out or lost the connection is named as "may or may not have been applied"
227
+ (`details.uncertain`), and alone it is a `network_error` that says re-running is safe; `field delete` clears its caches only after a confirmed delete.
228
+ - CLI: answering "n" to a confirmation under `--json` prints an error envelope (type `aborted`),
229
+ still exit 1, instead of an empty stdout.
230
+ - CLI `list ls --type`: warns when the first page has no list of that type but more pages exist.
231
+
232
+ ### Plugins
233
+
234
+ - **CLI plugin**: 2.0.2 → 2.0.3 — skill: the API-key resolution order (key flags first) and
235
+ where `config setup-key` stores the key. Installs pin the CLI version the plugin was written
236
+ for (`XAFFINITY_CLI_SPEC` overrides it); the Read hook also guards the CLI's `config.toml`;
237
+ the skill names the `partialFailure` truncation reason; the file download example uses `--out`
238
+ (there is no `--output-dir`).
239
+ - **SDK plugin**: 2.0.3 → 2.0.4 — skill: the duplicate-company example uses a placeholder name.
9
240
 
10
241
  ## [2.0.3] - 2026-10-13
11
242
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: affinity-sdk
3
- Version: 2.0.3
3
+ Version: 2.0.5
4
4
  Summary: A modern, strongly-typed Python SDK for the Affinity CRM API
5
5
  Project-URL: Homepage, https://github.com/yaniv-golan/affinity-sdk
6
6
  Project-URL: Documentation, https://yaniv-golan.github.io/affinity-sdk/latest/
@@ -106,7 +106,7 @@ For a detailed comparison, see [Affinity SDK vs. Official MCP](https://yaniv-gol
106
106
 
107
107
  ## Features
108
108
 
109
- - **Complete API coverage** - Full V1 + V2 support with smart routing
109
+ - **Broad API coverage** - V1 and V2, routed per operation (6 V2 operations still planned)
110
110
  - **CLI included** - Scriptable command-line interface for automation
111
111
  - **Strong typing** - Full Pydantic V2 models with typed ID classes
112
112
  - **No magic numbers** - Comprehensive enums for all API constants
@@ -539,45 +539,50 @@ from affinity.types import (
539
539
 
540
540
  ## API Coverage
541
541
 
542
- Which Affinity API version offers each feature, and which one the SDK uses. Affinity has been
543
- adding V2 endpoints through 2026; the SDK still uses V1 where V1 was the only option, and moving
544
- those to V2 is planned.
545
-
546
- | Feature | V2 | V1 | SDK uses |
547
- |---------|:--:|:--:|:---:|
548
- | Companies (read) | ✅ | ✅ | V2 |
549
- | Companies (write) | Fields only (no create/delete) | ✅ | V1 |
550
- | Persons (read) | ✅ | ✅ | V2 |
551
- | Persons (write) | Create, delete, fields | ✅ | V1 |
552
- | Company/person merges | ✅ | ❌ | V2 |
553
- | Opportunities (read) | ✅ | ✅ | V2 |
554
- | Opportunities (write) | Update/delete | ✅ | V1 |
555
- | Lists (read) | ✅ | ✅ | V2 |
556
- | Lists (write) | Create | ✅ | V1 |
557
- | List Entries (read) | ✅ | ✅ | V2 |
558
- | List Entries (write) | Create | ✅ | V1 |
559
- | Field Values (read) | ✅ | ✅ | V2 |
560
- | Field Values (write) | ✅ | ✅ | V2 (list entries), V1 (companies/persons) |
561
- | Notes | ✅ | ✅ | V1 reads; V2 writes |
562
- | Reminders | ✅ | ✅ | V2 (V1 for type changes, and when V2 refuses a non-owner) |
563
- | Webhooks | ✅ | ✅ | V2 |
564
- | Interactions | Read-only | ✅ | V1 |
565
- | Entity Files | Read-only | ✅ | V1 |
566
- | Relationship Strengths | ✅ | ✅ | V1 |
567
-
568
- V2-only features the SDK does not wrap yet include semantic search, transcripts, duplicate
569
- suggestions, coworker/investor connections and teams.
542
+ Which Affinity API the SDK uses for each feature. The SDK uses V2 wherever V2 can do the job and
543
+ V1 where it can't. The [API coverage](https://yaniv-golan.github.io/affinity-sdk/latest/reference/api-coverage/)
544
+ page lists every operation and the SDK call that sends it.
545
+
546
+ | Feature | SDK uses |
547
+ |---------|:---:|
548
+ | Companies, persons, opportunities (read, search) | V2 |
549
+ | Companies, persons (create, update, delete) | V1 (V2 has no create/update; person create/delete are planned) |
550
+ | Opportunities (create, update, delete) | V1 (V2 update/delete are planned) |
551
+ | Company/person merges | V2 |
552
+ | Lists, list entries (read) | V2 |
553
+ | Lists (create) | V2 (V1 when `owner_id` or `additional_permissions` is set) |
554
+ | List entries (add, delete) | V1 (V2 add is planned) |
555
+ | Field values (read and write, on companies, persons and list entries) | V2 |
556
+ | Fields (create, delete); the `field_values` service | V1 |
557
+ | Notes | V2, except `notes.list()` for one entity (V1) |
558
+ | Reminders | V2 (V1 for type changes, and when V2 refuses a non-owner) |
559
+ | Webhooks | V2 |
560
+ | Interactions | V2 reads by type (emails, meetings, calls, chat messages); V1 `list`/`get` and writes |
561
+ | Entity files | V1 list, get and upload; V2 feed and download URL |
562
+ | Relationship strengths | V1 `relationships.get`; V2 `list_relationships` on companies/persons |
563
+ | Transcripts, teams, users, semantic search, duplicate suggestions, coworker/investor connections | V2 |
564
+
565
+ Still planned (Affinity documents them, but the API didn't serve them when tested): V2 person
566
+ create/delete, opportunity update/delete, list-entry create, and transcript delete.
570
567
 
571
568
  ## Authentication
572
569
 
573
- The SDK resolves the API key through the following chain (first non-empty value wins):
570
+ The SDK and CLI resolve the API key through the following chain (first non-empty value wins):
574
571
 
575
- 1. **Explicit constructor arg** — `Affinity(api_key="…")` or `--api-key` CLI flag
572
+ 1. **The key you pass explicitly** — `Affinity(api_key="…")` in the SDK; `--api-key-file <path>`
573
+ or `--api-key-stdin` in the CLI (the CLI has no `--api-key` flag)
576
574
  2. **`AFFINITY_API_KEY`** — standard environment variable
577
575
  3. **`AFFINITY_API_KEY_FILE`** — path to a file containing the key (12-factor / Docker secrets convention)
578
576
  4. **`AFFINITY_API_KEY_COMMAND`** — shell command whose stdout is the key (credential-helper convention)
579
- 5. **`--api-key-file <path>`** or **`--api-key-stdin`** — CLI flags
580
- 6. **`xaffinity config setup-key`** — saved to the system keychain
577
+ 5. **User config file** — `api_key` in `config.toml`, written by `xaffinity config setup-key --scope user`
578
+ (file mode `0600` on Unix; `xaffinity config path` prints the location). CLI only.
579
+
580
+ The SDK uses steps 1–4; step 5 is CLI only. When the CLI uses a key flag while
581
+ `AFFINITY_API_KEY`, `AFFINITY_API_KEY_FILE` or `AFFINITY_API_KEY_COMMAND` is also set, it warns
582
+ that those are ignored (the file is not read and the command is not run). With `load_dotenv=True` (SDK) or `--dotenv` (CLI),
583
+ a `.env` file is loaded into the environment before step 2, so its `AFFINITY_API_KEY` counts as
584
+ step 2. That is how a key saved by `xaffinity config setup-key --scope project` (a `.env` in the
585
+ current directory) is used: run commands with `--dotenv`.
581
586
 
582
587
  Empty string is treated as unset at every step (safe against stale `export AFFINITY_API_KEY=` lines).
583
588
 
@@ -651,7 +656,7 @@ client = Affinity(
651
656
  # Affinity V2 API version (default: your API key's default version)
652
657
  # affinity_api_version="2026-09-17", # or "current"; CLI: --api-version / AFFINITY_API_VERSION
653
658
 
654
- # Hooks (DX-008)
659
+ # Hooks
655
660
  # on_event=lambda event: print(event.type),
656
661
  # on_request=lambda req: print(req.method, req.url),
657
662
  # on_response=lambda resp: print(resp.status_code, resp.request.url),
@@ -712,7 +717,7 @@ asyncio.run(main())
712
717
 
713
718
  Async support mirrors the sync client surface area (including the V1 services like notes and files).
714
719
 
715
- See `docs/public/guides/sync-vs-async.md` for more details.
720
+ See [Sync vs async](https://yaniv-golan.github.io/affinity-sdk/latest/guides/sync-vs-async/) for more details.
716
721
 
717
722
  If you don't use `async with`, make sure to `await client.close()` (e.g., in a `finally`) to avoid leaking connections.
718
723
 
@@ -742,7 +747,7 @@ MIT License - see [LICENSE](LICENSE) for details.
742
747
 
743
748
  ## Contributing
744
749
 
745
- Contributions welcome! Please read our contributing guidelines first.
750
+ Contributions welcome! Please read the [contributing guidelines](https://github.com/yaniv-golan/affinity-sdk/blob/main/CONTRIBUTING.md) first.
746
751
 
747
752
  ## Links
748
753
 
@@ -45,7 +45,7 @@ For a detailed comparison, see [Affinity SDK vs. Official MCP](https://yaniv-gol
45
45
 
46
46
  ## Features
47
47
 
48
- - **Complete API coverage** - Full V1 + V2 support with smart routing
48
+ - **Broad API coverage** - V1 and V2, routed per operation (6 V2 operations still planned)
49
49
  - **CLI included** - Scriptable command-line interface for automation
50
50
  - **Strong typing** - Full Pydantic V2 models with typed ID classes
51
51
  - **No magic numbers** - Comprehensive enums for all API constants
@@ -478,45 +478,50 @@ from affinity.types import (
478
478
 
479
479
  ## API Coverage
480
480
 
481
- Which Affinity API version offers each feature, and which one the SDK uses. Affinity has been
482
- adding V2 endpoints through 2026; the SDK still uses V1 where V1 was the only option, and moving
483
- those to V2 is planned.
484
-
485
- | Feature | V2 | V1 | SDK uses |
486
- |---------|:--:|:--:|:---:|
487
- | Companies (read) | ✅ | ✅ | V2 |
488
- | Companies (write) | Fields only (no create/delete) | ✅ | V1 |
489
- | Persons (read) | ✅ | ✅ | V2 |
490
- | Persons (write) | Create, delete, fields | ✅ | V1 |
491
- | Company/person merges | ✅ | ❌ | V2 |
492
- | Opportunities (read) | ✅ | ✅ | V2 |
493
- | Opportunities (write) | Update/delete | ✅ | V1 |
494
- | Lists (read) | ✅ | ✅ | V2 |
495
- | Lists (write) | Create | ✅ | V1 |
496
- | List Entries (read) | ✅ | ✅ | V2 |
497
- | List Entries (write) | Create | ✅ | V1 |
498
- | Field Values (read) | ✅ | ✅ | V2 |
499
- | Field Values (write) | ✅ | ✅ | V2 (list entries), V1 (companies/persons) |
500
- | Notes | ✅ | ✅ | V1 reads; V2 writes |
501
- | Reminders | ✅ | ✅ | V2 (V1 for type changes, and when V2 refuses a non-owner) |
502
- | Webhooks | ✅ | ✅ | V2 |
503
- | Interactions | Read-only | ✅ | V1 |
504
- | Entity Files | Read-only | ✅ | V1 |
505
- | Relationship Strengths | ✅ | ✅ | V1 |
506
-
507
- V2-only features the SDK does not wrap yet include semantic search, transcripts, duplicate
508
- suggestions, coworker/investor connections and teams.
481
+ Which Affinity API the SDK uses for each feature. The SDK uses V2 wherever V2 can do the job and
482
+ V1 where it can't. The [API coverage](https://yaniv-golan.github.io/affinity-sdk/latest/reference/api-coverage/)
483
+ page lists every operation and the SDK call that sends it.
484
+
485
+ | Feature | SDK uses |
486
+ |---------|:---:|
487
+ | Companies, persons, opportunities (read, search) | V2 |
488
+ | Companies, persons (create, update, delete) | V1 (V2 has no create/update; person create/delete are planned) |
489
+ | Opportunities (create, update, delete) | V1 (V2 update/delete are planned) |
490
+ | Company/person merges | V2 |
491
+ | Lists, list entries (read) | V2 |
492
+ | Lists (create) | V2 (V1 when `owner_id` or `additional_permissions` is set) |
493
+ | List entries (add, delete) | V1 (V2 add is planned) |
494
+ | Field values (read and write, on companies, persons and list entries) | V2 |
495
+ | Fields (create, delete); the `field_values` service | V1 |
496
+ | Notes | V2, except `notes.list()` for one entity (V1) |
497
+ | Reminders | V2 (V1 for type changes, and when V2 refuses a non-owner) |
498
+ | Webhooks | V2 |
499
+ | Interactions | V2 reads by type (emails, meetings, calls, chat messages); V1 `list`/`get` and writes |
500
+ | Entity files | V1 list, get and upload; V2 feed and download URL |
501
+ | Relationship strengths | V1 `relationships.get`; V2 `list_relationships` on companies/persons |
502
+ | Transcripts, teams, users, semantic search, duplicate suggestions, coworker/investor connections | V2 |
503
+
504
+ Still planned (Affinity documents them, but the API didn't serve them when tested): V2 person
505
+ create/delete, opportunity update/delete, list-entry create, and transcript delete.
509
506
 
510
507
  ## Authentication
511
508
 
512
- The SDK resolves the API key through the following chain (first non-empty value wins):
509
+ The SDK and CLI resolve the API key through the following chain (first non-empty value wins):
513
510
 
514
- 1. **Explicit constructor arg** — `Affinity(api_key="…")` or `--api-key` CLI flag
511
+ 1. **The key you pass explicitly** — `Affinity(api_key="…")` in the SDK; `--api-key-file <path>`
512
+ or `--api-key-stdin` in the CLI (the CLI has no `--api-key` flag)
515
513
  2. **`AFFINITY_API_KEY`** — standard environment variable
516
514
  3. **`AFFINITY_API_KEY_FILE`** — path to a file containing the key (12-factor / Docker secrets convention)
517
515
  4. **`AFFINITY_API_KEY_COMMAND`** — shell command whose stdout is the key (credential-helper convention)
518
- 5. **`--api-key-file <path>`** or **`--api-key-stdin`** — CLI flags
519
- 6. **`xaffinity config setup-key`** — saved to the system keychain
516
+ 5. **User config file** — `api_key` in `config.toml`, written by `xaffinity config setup-key --scope user`
517
+ (file mode `0600` on Unix; `xaffinity config path` prints the location). CLI only.
518
+
519
+ The SDK uses steps 1–4; step 5 is CLI only. When the CLI uses a key flag while
520
+ `AFFINITY_API_KEY`, `AFFINITY_API_KEY_FILE` or `AFFINITY_API_KEY_COMMAND` is also set, it warns
521
+ that those are ignored (the file is not read and the command is not run). With `load_dotenv=True` (SDK) or `--dotenv` (CLI),
522
+ a `.env` file is loaded into the environment before step 2, so its `AFFINITY_API_KEY` counts as
523
+ step 2. That is how a key saved by `xaffinity config setup-key --scope project` (a `.env` in the
524
+ current directory) is used: run commands with `--dotenv`.
520
525
 
521
526
  Empty string is treated as unset at every step (safe against stale `export AFFINITY_API_KEY=` lines).
522
527
 
@@ -590,7 +595,7 @@ client = Affinity(
590
595
  # Affinity V2 API version (default: your API key's default version)
591
596
  # affinity_api_version="2026-09-17", # or "current"; CLI: --api-version / AFFINITY_API_VERSION
592
597
 
593
- # Hooks (DX-008)
598
+ # Hooks
594
599
  # on_event=lambda event: print(event.type),
595
600
  # on_request=lambda req: print(req.method, req.url),
596
601
  # on_response=lambda resp: print(resp.status_code, resp.request.url),
@@ -651,7 +656,7 @@ asyncio.run(main())
651
656
 
652
657
  Async support mirrors the sync client surface area (including the V1 services like notes and files).
653
658
 
654
- See `docs/public/guides/sync-vs-async.md` for more details.
659
+ See [Sync vs async](https://yaniv-golan.github.io/affinity-sdk/latest/guides/sync-vs-async/) for more details.
655
660
 
656
661
  If you don't use `async with`, make sure to `await client.close()` (e.g., in a `finally`) to avoid leaking connections.
657
662
 
@@ -681,7 +686,7 @@ MIT License - see [LICENSE](LICENSE) for details.
681
686
 
682
687
  ## Contributing
683
688
 
684
- Contributions welcome! Please read our contributing guidelines first.
689
+ Contributions welcome! Please read the [contributing guidelines](https://github.com/yaniv-golan/affinity-sdk/blob/main/CONTRIBUTING.md) first.
685
690
 
686
691
  ## Links
687
692
 
@@ -1,6 +1,6 @@
1
1
  # Versioning Policy
2
2
 
3
- This document defines how versions are managed across the affinity-api-x repository.
3
+ This document defines how versions are managed across the affinity-sdk repository.
4
4
 
5
5
  ## Overview
6
6
 
@@ -81,15 +81,16 @@ have valid JSON but does not enforce version sync.
81
81
  - Plugin cache invalidation is based on git commit hash, not version number,
82
82
  so version bumps are for human traceability, not distribution mechanics
83
83
 
84
- ## Since 1.0 (Current State)
84
+ ## Current State (2.x)
85
85
 
86
- **The SDK has been at 1.x since 1.0.0**, so the rules above apply: a breaking change to the
87
- public SDK or CLI means a MAJOR bump, and PATCH releases stay backwards-compatible.
86
+ The SDK and CLI are at 2.x. The rules above are the default: a breaking change to the public
87
+ SDK or CLI means a MAJOR bump.
88
88
 
89
- - An exception (a breaking change shipped in a MINOR) is a deliberate decision, never a default.
90
- The CHANGELOG entry must say it is an exception and why, and the release's Highlights must
91
- carry a **Breaking:** line with a migration hint. Example: 1.20 removes
92
- `get_fields(field_types=)`, which the API never supported.
89
+ - **Exceptions in 2.x:** the maintainer may ship a breaking change in a 2.0.x PATCH instead of a
90
+ new MAJOR (2.0.1, 2.0.2 and 2.0.3 did). This is the maintainer's decision for each release,
91
+ never a default. The CHANGELOG entry must open with **Exception to semantic versioning**,
92
+ say why, and list exactly what changes and how to migrate.
93
+ - MCP and the plugins whose content changed are bumped to the same version in that release.
93
94
  - MCP must track CLI minor version for compatibility
94
95
 
95
96
  ## CLI Changes That Affect MCP
@@ -117,7 +118,7 @@ The release detection workflow compares the current version in version files aga
117
118
  1. **After CI passes** on `main`, the release detection workflow runs
118
119
  2. It reads the SDK version from `pyproject.toml` and MCP version from `mcp/VERSION`
119
120
  3. It checks if release tags exist:
120
- - SDK: checks for `v{version}` tag (e.g., `v0.9.2`)
121
+ - SDK: checks for `v{version}` tag (e.g., `v2.0.3`)
121
122
  - MCP: checks for `mcp-v{version}` tag (e.g., `mcp-v1.7.6`)
122
123
  4. If no tag exists for the current version, it triggers the release workflow via `workflow_dispatch` API
123
124
 
@@ -140,6 +141,16 @@ This approach is robust regardless of how many commits are pushed together, squa
140
141
 
141
142
  SDK releases include MCPB bundles (built from the same commit) for convenience, so users don't need to find separate MCP releases.
142
143
 
144
+ **CLI pin in the CLI plugin.** The xaffinity-cli plugin installs an exact CLI version
145
+ (`affinity-sdk[cli]==X.Y.Z` in `hooks/session-setup.sh`, `hooks/pre-xaffinity.sh` and the skill's
146
+ install lines). It always equals `pyproject.toml`'s version, and
147
+ `tests/test_cli_session_setup_hook.py` fails until it does. So the version bump in step 1 also
148
+ updates the pin. That is a plugin content change, so it bumps the CLI plugin's patch version.
149
+ Plugin users get the new pin as soon as `main` is pushed, while PyPI gets the version only when
150
+ the release workflow finishes. In between, a fresh install asks pip for a version that doesn't
151
+ exist yet and fails. Machines with the CLI already installed are not affected. Don't push
152
+ anything else on top of a version bump until the release workflow is green.
153
+
143
154
  ### MCP Release
144
155
 
145
156
  1. Update `mcp/VERSION`
@@ -260,7 +271,7 @@ the release notes lack context.
260
271
  ## Release Checklist
261
272
 
262
273
  ### SDK Release
263
- - [ ] Version bumped in `pyproject.toml`
274
+ - [ ] Version bumped in `pyproject.toml`, and the CLI plugin's install pin with it (bump the CLI plugin patch version)
264
275
  - [ ] If plugin content also changed: plugin versions bumped in their `plugin.json` files
265
276
  - [ ] Pre-commit ran
266
277
  - [ ] `CHANGELOG.md` updated with `### Highlights` and categorized changes
@@ -0,0 +1,44 @@
1
+ """Asyncio helpers for the CLI."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import asyncio
6
+ from collections.abc import Awaitable
7
+ from typing import TypeVar
8
+
9
+ T = TypeVar("T")
10
+
11
+
12
+ async def gather_or_raise(*aws: Awaitable[T]) -> list[T]:
13
+ """Run awaitables concurrently and return their results in order, like ``asyncio.gather``.
14
+
15
+ On the first error the others are cancelled, every task is awaited, and that error is raised.
16
+ Plain ``gather`` leaves the rest running, and their later errors show up as "Task exception
17
+ was never retrieved" on stderr.
18
+ """
19
+ tasks = [asyncio.ensure_future(aw) for aw in aws]
20
+ if not tasks:
21
+ return []
22
+ try:
23
+ await asyncio.wait(tasks, return_when=asyncio.FIRST_EXCEPTION)
24
+ except BaseException:
25
+ # This coroutine was cancelled (e.g. Ctrl+C): stop the tasks too
26
+ for task in tasks:
27
+ task.cancel()
28
+ await asyncio.gather(*tasks, return_exceptions=True)
29
+ raise
30
+ pending = [task for task in tasks if not task.done()]
31
+ for task in pending:
32
+ task.cancel()
33
+ if pending:
34
+ await asyncio.gather(*pending, return_exceptions=True)
35
+ first_error: BaseException | None = None
36
+ for task in tasks:
37
+ if task.cancelled():
38
+ continue
39
+ error = task.exception() # retrieving it keeps asyncio from reporting it
40
+ if error is not None and first_error is None:
41
+ first_error = error
42
+ if first_error is not None:
43
+ raise first_error
44
+ return [task.result() for task in tasks]